From 164140d9046a35b7c5892aa1519b8f3a2467d51b Mon Sep 17 00:00:00 2001 From: Rafal Harabien Date: Sat, 26 Mar 2011 21:41:49 +0000 Subject: [PATCH 001/317] Fix duplicated startup version string Patch by Thomas Faber See issue #6015 for more details. svn path=/trunk/; revision=51165 --- reactos/ntoskrnl/ex/init.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/reactos/ntoskrnl/ex/init.c b/reactos/ntoskrnl/ex/init.c index f614cf659e2..302d1fff48a 100644 --- a/reactos/ntoskrnl/ex/init.c +++ b/reactos/ntoskrnl/ex/init.c @@ -1410,10 +1410,13 @@ Phase1InitializationDiscard(IN PVOID Context) else { /* No version */ - *EndBuffer++ = ANSI_NULL; /* Null-terminate the string */ - --Remaining; + *EndBuffer = ANSI_NULL; /* Null-terminate the string */ } + /* Skip over the null-terminator to start a new string */ + ++EndBuffer; + --Remaining; + /* Build the version number */ StringBuffer = InitBuffer->VersionNumber; Status = RtlStringCbPrintfA(StringBuffer, From 7dfe6edff5f81349fdd4e6670f3857c0211a83b5 Mon Sep 17 00:00:00 2001 From: Olaf Siejka Date: Sat, 26 Mar 2011 23:36:56 +0000 Subject: [PATCH 002/317] [NTDLL] - Fix "entry point not found" harderror parameters. Patch by Thomas Faber See issue #5983 for more details. svn path=/trunk/; revision=51167 --- reactos/dll/ntdll/ldr/utils.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/reactos/dll/ntdll/ldr/utils.c b/reactos/dll/ntdll/ldr/utils.c index c9bb89bbb51..9ce0cbb9feb 100644 --- a/reactos/dll/ntdll/ldr/utils.c +++ b/reactos/dll/ntdll/ldr/utils.c @@ -1350,7 +1350,7 @@ RtlpRaiseImportNotFound(CHAR *FuncName, ULONG Ordinal, PUNICODE_STRING DllName) ULONG ErrorResponse; ULONG_PTR ErrorParameters[2]; ANSI_STRING ProcNameAnsi; - UNICODE_STRING ProcName; + ANSI_STRING DllNameAnsi; CHAR Buffer[8]; if (!FuncName) @@ -1360,16 +1360,16 @@ RtlpRaiseImportNotFound(CHAR *FuncName, ULONG Ordinal, PUNICODE_STRING DllName) } RtlInitAnsiString(&ProcNameAnsi, FuncName); - RtlAnsiStringToUnicodeString(&ProcName, &ProcNameAnsi, TRUE); - ErrorParameters[0] = (ULONG_PTR)&ProcName; - ErrorParameters[1] = (ULONG_PTR)DllName; + RtlUnicodeStringToAnsiString(&DllNameAnsi, DllName, TRUE); + ErrorParameters[0] = (ULONG_PTR)&ProcNameAnsi; + ErrorParameters[1] = (ULONG_PTR)&DllNameAnsi; NtRaiseHardError(STATUS_ENTRYPOINT_NOT_FOUND, 2, 3, ErrorParameters, OptionOk, &ErrorResponse); - RtlFreeUnicodeString(&ProcName); + RtlFreeAnsiString(&DllNameAnsi); } static NTSTATUS From 47d38c298964e7f213b7134fde9ef47b798b1481 Mon Sep 17 00:00:00 2001 From: Olaf Siejka Date: Sat, 26 Mar 2011 23:53:49 +0000 Subject: [PATCH 003/317] [RAPPS] - Add DoubleCommander to app list. Russian and Ukrainian translation by Igorko, Polish translation by me. [CMD] - Fix Russian translation of cmd. Patch by seven_ro. See bugreport no.#6043 svn path=/trunk/; revision=51168 --- .../rapps/rapps/doublecommander.txt | 21 + reactos/base/shell/cmd/lang/ru-RU.rc | 968 +++++++++--------- 2 files changed, 505 insertions(+), 484 deletions(-) create mode 100644 reactos/base/applications/rapps/rapps/doublecommander.txt diff --git a/reactos/base/applications/rapps/rapps/doublecommander.txt b/reactos/base/applications/rapps/rapps/doublecommander.txt new file mode 100644 index 00000000000..12169d2fd90 --- /dev/null +++ b/reactos/base/applications/rapps/rapps/doublecommander.txt @@ -0,0 +1,21 @@ +; UTF-8 + +[Section] +Name = Double Commander +Version = 0.4.5.2 beta +Licence = GPL +Description = Double Commander is an open source file manager with two panels side by side. You need 7-Zip or a similar Utility to extract it. +Size = 6.71MB +Category = 12 +URLSite = http://doublecmd.sourceforge.net/ +URLDownload = http://ignum.dl.sourceforge.net/project/doublecmd/DC%20for%20Windows%2032%20bit/Double%20Commander%200.4.5.2%20beta/doublecmd-0.4.5.2.i386-win32.zip +CDPath = none + +[Section.0415] +Description = Double Commander to menedżer plików, o otwartym źródle, z klasycznym układem dwóch paneli obok siebie. Do rozpakowania archiwum potrzebny jest 7-zip lub podobny program. + +[Section.0419] +Description = Double Commander - это открытый двухпанельный файловый менеджер. Вам нужен 7-Zip или подобная утилита для его распаковки. + +[Section.0422] +Description = Double Commander - це відкритий двопанельний файловий менеджер. Вам потрібен 7-Zip або подібна утиліта щоб розпакувати його. \ No newline at end of file diff --git a/reactos/base/shell/cmd/lang/ru-RU.rc b/reactos/base/shell/cmd/lang/ru-RU.rc index 97b3d4aef5b..c09389263fb 100644 --- a/reactos/base/shell/cmd/lang/ru-RU.rc +++ b/reactos/base/shell/cmd/lang/ru-RU.rc @@ -19,291 +19,291 @@ assoc .ext (print specific association)\n\ assoc .ext= (remove specific association)\n\ assoc .ext=FileType (add new association)\n" -STRING_ATTRIB_HELP, "Âûâîä è èçìåíåíèå àòðèáóòîâ ôàéëîâ.\n\n\ -ATTRIB [+R | -R] [+A | -A] [+S | -S] [+H | -H] ôàéë ...\n\ +STRING_ATTRIB_HELP, "Вывод и изменение атрибутов файлов.\n\n\ +ATTRIB [+R | -R] [+A | -A] [+S | -S] [+H | -H] файл ...\n\ [/S [/D]]\n\n\ - + Óñòàíîâêà àòðèáóòà.\n\ - - Ñíÿòèå àòðèáóòà.\n\ - R Àòðèáóò ""Òîëüêî ÷òåíèå"".\n\ - A Àòðèáóò ""Àðõèâíûé"".\n\ - S Àòðèáóò ""Ñèñòåìíûé"".\n\ - H Àòðèáóò ""Ñêðûòûé"".\n\ - /S Îáðàáîòêà ôàéëîâ ñ óêàçàííûìè èìåíàìè â òåêóùåé ïàïêå\n\ -è âî âñåõ åå ïîäïàïêàõ.\n\ - /D Îáðàáîòêà è ôàéëîâ, è ïàïîê.\n\n\ -ATTRIB áåç ïàðàìåòðîâ âûâîäèò àòðèáóòû âñåõ ôàéëîâ.\n" + + Установка атрибута.\n\ + - Снятие атрибута.\n\ + R Атрибут ""Только чтение"".\n\ + A Атрибут ""Архивный"".\n\ + S Атрибут ""Системный"".\n\ + H Атрибут ""Скрытый"".\n\ + /S Обработка файлов с указанными именами в текущей папке\n\ +и во всех ее подпапках.\n\ + /D Обработка и файлов, и папок.\n\n\ +ATTRIB без параметров выводит атрибуты всех файлов.\n" -STRING_ALIAS_HELP, "Âûâîä, óñòàíîâêà èëè óäàëåíèå ïñåâäîíèìîâ.\n\n\ -ALIAS [ïñåâäîíèì=[êîìàíäà]]\n\n\ - ïñåâäîíèì Íàèìåíîâàíèå ïñåâäîíèìà.\n\ - êîìàíäà Òåêñò, ïîäñòàâëÿåìûé âìåñòî ïñåâäîíèìà.\n\n\ -Âûâîä ñïèñêà âñåõ ïñåâäîíèìîâ:\n\ +STRING_ALIAS_HELP, "Вывод, установка или удаление псевдонимов.\n\n\ +ALIAS [псевдоним=[команда]]\n\n\ + псевдоним Наименование псевдонима.\n\ + команда Текст, подставляемый вместо псевдонима.\n\n\ +Вывод списка всех псевдонимов:\n\ ALIAS\n\n\ -Óñòàíîâêà èëè èçìåíåíèå ñóùåñòâóþùåãî ïñåâäîíèìà:\n\ +Установка или изменение существующего псевдонима:\n\ ALIAS da=dir a:\n\n\ -Óäàëåíèå ïñåâäîíèìà èç ñïèñêà:\n\ +Удаление псевдонима из списка:\n\ ALIAS da=" -STRING_BEEP_HELP, "Çâóêîâîé ñèãíàë.\n\nBEEP\n" +STRING_BEEP_HELP, "Звуковой сигнал.\n\nBEEP\n" -STRING_CALL_HELP, "Âûçîâ îäíîãî ïàêåòíîãî ôàéëà èç äðóãîãî.\n\n\ -CALL [äèñê:][ïóòü]èìÿ_ôàéëà [ïàðàìåòðû]\n\n\ - ïàðàìåòðû Íàáîð ïàðàìåòðîâ êîìàíäíîé ñòðîêè, íåîáõîäèìûõ\n\ - ïàêåòíîìó ôàéëó." +STRING_CALL_HELP, "Вызов одного пакетного файла из другого.\n\n\ +CALL [диск:][путь]имя_файла [параметры]\n\n\ + параметры Набор параметров командной строки, необходимых\n\ + пакетному файлу." -STRING_CD_HELP, "Âûâîä èìåíè ëèáî ñìåíà òåêóùåãî êàòàëîãà.\n\n\ -CHDIR [/D][äèñê:][ïóòü]\n\ +STRING_CD_HELP, "Вывод имени либо смена текущего каталога.\n\n\ +CHDIR [/D][диск:][путь]\n\ CHDIR[..|.]\n\ -CD [/D][äèñê:][ïóòü]\n\ +CD [/D][диск:][путь]\n\ CD[..|.]\n\n\ - .. îáîçíà÷àåò ðîäèòåëüñêèé êàòàëîã\n\ - . îáîçíà÷àåò òåêóùèé êàòàëîã\n\ - /D Îäíîâðåìåííàÿ ñìåíà òåêóùèõ äèñêà è êàòàëîãà.\n\n\ -Êîìàíäà CD äèñê: îòîáðàæàåò èìÿ òåêóùåãî êàòàëîãà óêàçàííîãî äèñêà.\n\ -Êîìàíäà CD áåç ïàðàìåòðîâ îòîáðàæàåò èìåíà òåêóùèõ äèñêà è êàòàëîãà.\n" + .. обозначает родительский каталог\n\ + . обозначает текущий каталог\n\ + /D Одновременная смена текущих диска и каталога.\n\n\ +Команда CD диск: отображает имя текущего каталога указанного диска.\n\ +Команда CD без параметров отображает имена текущих диска и каталога.\n" -STRING_CHCP_HELP, "Âûâîä èëè ñìåíà òåêóùåãî íîìåðà êîäîâîé ñòðàíèöû.\n\n\ +STRING_CHCP_HELP, "Вывод или смена текущего номера кодовой страницы.\n\n\ CHCP [nnn]\n\n\ - nnn Íîìåð êîäîâîé ñòðàíèöû.\n\n\ -Êîìàíäà CHCP áåç ïàðàìåòðà âûâîäèò òåêóùèé íîìåð êîäîâîé ñòðàíèöû.\n" + nnn Номер кодовой страницы.\n\n\ +Команда CHCP без параметра выводит текущий номер кодовой страницы.\n" -STRING_CHOICE_HELP, "Æäåò, ïîêà ïîëüçîâàòåëü íå âûáåðåò îäèí èç óêàçàííûõ â ñïèñêå ñèìâîëîâ.\n\n\ -CHOICE [/C[:]ñïèñîê_ñèìâîëîâ][/N][/S][/T[:]c,nn][òåêñò]\n\n\ - /C[:]ñïèñîê_ñèìâîëîâ Óêàçûâàåò äîïóñòèìûå ñèìâîëû. Ïî óìîë÷àíèþ ýòî YN.\n\ - /N Íå âûâîäèòü ñïèñîê ñèìâîëîâ è ? ïîñëå ïîäñêàçêè.\n\ - /S Òðàêòîâàòü ñèìâîëû êàê ÷óâñòâèòåëüíûå ê ðåãèñòðó.\n\ - /T[:]c,nn Ïî óìîë÷àíèþ âûáîð c ïî èñòå÷åíèè nn ñåêóíä.\n\ - text Ïîäñêàçêà.\n\n\ -ERRORLEVEL óñòàíàâëèâàåòñÿ ðàâíûì íîìåðó âûáðàííîãî ñèìâîëà.\n" +STRING_CHOICE_HELP, "Ждет, пока пользователь не выберет один из указанных в списке символов.\n\n\ +CHOICE [/C[:]список_символов][/N][/S][/T[:]c,nn][текст]\n\n\ + /C[:]список_символов Указывает допустимые символы. По умолчанию это YN.\n\ + /N Не выводить список символов и ? после подсказки.\n\ + /S Трактовать символы как чувствительные к регистру.\n\ + /T[:]c,nn По умолчанию выбор c по истечении nn секунд.\n\ + text Подсказка.\n\n\ +ERRORLEVEL устанавливается равным номеру выбранного символа.\n" -STRING_CLS_HELP, "Î÷èñòêà ýêðàíà.\n\nCLS\n" +STRING_CLS_HELP, "Очистка экрана.\n\nCLS\n" -STRING_CMD_HELP1, "\nÄîñòóïíûå âíóòðåííèå êîìàíäû:\n" +STRING_CMD_HELP1, "\nДоступные внутренние команды:\n" -STRING_CMD_HELP2, "\nÄîñòóïíûå âîçìîæíîñòè:" +STRING_CMD_HELP2, "\nДоступные возможности:" -STRING_CMD_HELP3," [ïñåâäîíèìû]" +STRING_CMD_HELP3," [псевдонимы]" -STRING_CMD_HELP4," [èñòîðèÿ]" +STRING_CMD_HELP4," [история]" -STRING_CMD_HELP5," [çàâåðøåíèå èìåí ôàéëîâ unix]" +STRING_CMD_HELP5," [завершение имен файлов unix]" -STRING_CMD_HELP6," [ñòåê äèðåêòîðèé]" +STRING_CMD_HELP6," [стек директорий]" -STRING_CMD_HELP7," [ïåðåíàïðàâëåíèå è piping]" +STRING_CMD_HELP7," [перенаправление и piping]" -STRING_CMD_HELP8, "Çàïóñê íîâîé êîïèè èíòåðïðåòàòîðà êîìàíä ReactOS.\n\n\ -CMD [/[C|K] êîìàíäà][/P][/Q][/T:bf]\n\n\ - /C êîìàíäà Âûïîëíåíèå óêàçàííîé êîìàíäû ñ ïîñëåäóþùèì çàâåðøåíèåì.\n\ - /K êîìàíäà Âûïîëíåíèå óêàçàííîé êîìàíäû áåç ïîñëåäóþùåãî çàâåðøåíèÿ.\n\ - /P CMD ñòàíîâèòñÿ ïåðìàíåíòíûì è çàïóñêàåò autoexec.bat\n\ - (ïðîöåññ íåìîæåò áûòü çàâåðøåí).\n\ - /T:öâ Âûáîð öâåòà òåêñòà/ôîíà (áîëåå ïîäðîáíî ñì. COLOR /?).\n" +STRING_CMD_HELP8, "Запуск новой копии интерпретатора команд ReactOS.\n\n\ +CMD [/[C|K] команда][/P][/Q][/T:bf]\n\n\ + /C команда Выполнение указанной команды с последующим завершением.\n\ + /K команда Выполнение указанной команды без последующего завершения.\n\ + /P CMD становится перманентным и запускает autoexec.bat\n\ + (процесс неможет быть завершен).\n\ + /T:цв Выбор цвета текста/фона (более подробно см. COLOR /?).\n" -STRING_COLOR_HELP1, "Óñòàíîâêà öâåòîâ ïî óìîë÷àíèþ äëÿ òåêñòà è ôîíà.\n\n\ -COLOR [öâåòà [/-F]] \n\n\ - öâåòà Àòðèáóòû öâåòîâ äëÿ òåêñòîâûõ îêîí\n\ - /-F Íå çàëèâàòü íåçàïîëíåííûå ìåñòà öâåòîì\n\n\ -Åñòü òðè ñïîñîáà îáîçíà÷àòü öâåòà:\n\ -1) ïî íàçâàíèþ íà àíãëèéñêîì ÿçûêå (òðåáóþòñÿ òîëüêî ïåðâûå òðè áóêâû öâåòà)\n\ -2) â âèäå äåñÿòè÷íûõ ÷èñåë (decimal on decimal)\n\ -3) äâà øåñòíàäöàòåðè÷íûõ ÷èñëà\n\n\ -Òàáëèöà öâåòîâ:\n\ -äåñ. øåñò.íàçâàíèå äåñ. øåñò.íàçâàíèå\n\ - 0 0 = ×åðíûé 8 8 = Ñåðûé\n\ - 1 1 = Ñèíèé 9 9 = Ñâåòëî-ñèíèé\n\ - 2 2 = Çåëåíûé 10 A = Ñâåòëî-çåëåíûé\n\ - 3 3 = Ãîëóáîé 11 B = Ñâåòëî-ãîëóáîé\n\ - 4 4 = Êðàñíûé 12 C = Ñâåòëî-êðàñíûé\n\ - 5 5 = Ëèëîâûé 13 D = Ñâåòëî-ëèëîâûé\n\ - 6 6 = Æåëòûé 14 E = Ñâåòëî-æåëòûé\n\ - 7 7 = Áåëûé 15 F = ßðêî-áåëûé\n" +STRING_COLOR_HELP1, "Установка цветов по умолчанию для текста и фона.\n\n\ +COLOR [цвета [/-F]] \n\n\ + цвета Атрибуты цветов для текстовых окон\n\ + /-F Не заливать незаполненные места цветом\n\n\ +Есть три способа обозначать цвета:\n\ +1) по названию на английском языке (требуются только первые три буквы цвета)\n\ +2) в виде десятичных чисел (decimal on decimal)\n\ +3) два шестнадцатеричных числа\n\n\ +Таблица цветов:\n\ +дес. шест.название дес. шест.название\n\ + 0 0 = Черный 8 8 = Серый\n\ + 1 1 = Синий 9 9 = Светло-синий\n\ + 2 2 = Зеленый 10 A = Светло-зеленый\n\ + 3 3 = Голубой 11 B = Светло-голубой\n\ + 4 4 = Красный 12 C = Светло-красный\n\ + 5 5 = Лиловый 13 D = Светло-лиловый\n\ + 6 6 = Желтый 14 E = Светло-желтый\n\ + 7 7 = Белый 15 F = Ярко-белый\n" -STRING_COPY_HELP1, "Ïåðåçàïèñàòü %s (Yes/No/All)? " +STRING_COPY_HELP1, "Перезаписать %s (Yes/No/All)? " -STRING_COPY_HELP2, "Êîïèðîâàíèå îäíîãî èëè íåñêîëüêèõ ôàéëîâ â äðóãîå ìåñòî.\n\n\ -COPY [/V][/Y|/-Y][/A|/B] èñòî÷íèê [/A|/B]\n\ - [+ èñòî÷íèê [/A|/B] [+ ...]] [ðåçóëüòàò [/A|/B]]\n\n\ - èñòî÷íèê Èìåíà îäíîãî èëè íåñêîëüêèõ êîïèðóåìûõ ôàéëîâ.\n\ - /A Ôàéë ÿâëÿåòñÿ òåêñòîâûì ôàéëîì ASCII.\n\ - /B Ôàéë ÿâëÿåòñÿ äâîè÷íûì ôàéëîì.\n\ - ðåçóëüòàò Êàòàëîã è/èëè èìÿ äëÿ êîíå÷íûõ ôàéëîâ.\n\ - /V Ïðîâåðêà ïðàâèëüíîñòè êîïèðîâàíèÿ ôàéëîâ.\n\ - /Y Ïîäàâëåíèå çàïðîñà ïîäòâåðæäåíèÿ íà ïåðåçàïèñü ñóùåñòâóþùåãî\n\ - ðåçóëüòèðóþùåãî ôàéëà.\n\ - /-Y Îáÿçàòåëüíûé çàïðîñ ïîäòâåðæäåíèÿ íà ïåðåçàïèñü ñóùåñòâóþùåãî\n\ - ðåçóëüòèðóþùåãî ôàéëà.\n\n\ -Êëþ÷ /Y ìîæíî óñòàíîâèòü ÷åðåç ïåðåìåííóþ ñðåäû COPYCMD.\n\ +STRING_COPY_HELP2, "Копирование одного или нескольких файлов в другое место.\n\n\ +COPY [/V][/Y|/-Y][/A|/B] источник [/A|/B]\n\ + [+ источник [/A|/B] [+ ...]] [результат [/A|/B]]\n\n\ + источник Имена одного или нескольких копируемых файлов.\n\ + /A Файл является текстовым файлом ASCII.\n\ + /B Файл является двоичным файлом.\n\ + результат Каталог и/или имя для конечных файлов.\n\ + /V Проверка правильности копирования файлов.\n\ + /Y Подавление запроса подтверждения на перезапись существующего\n\ + результирующего файла.\n\ + /-Y Обязательный запрос подтверждения на перезапись существующего\n\ + результирующего файла.\n\n\ +Ключ /Y можно установить через переменную среды COPYCMD.\n\ ...\n" -STRING_DATE_HELP1, "\nÂâåäèòå íîâóþ äàòó (ìì%cää%cãããã): " +STRING_DATE_HELP1, "\nВведите новую дату (мм%cдд%cгггг): " -STRING_DATE_HELP2, "\nÂâåäèòå íîâóþ äàòó (ää%cìì%cãããã): " +STRING_DATE_HELP2, "\nВведите новую дату (дд%cмм%cгггг): " -STRING_DATE_HELP3, "\nÂâåäèòå íîâóþ äàòó (ãããã%cìì%cää): " +STRING_DATE_HELP3, "\nВведите новую дату (гггг%cмм%cдд): " -STRING_DATE_HELP4, "Âûâîä èëè èçìåíåíèå äàòû.\n\n\ -DATE [/T][äàòà]\n\n\ - /T Íå çàïðàøèâàòü ââîä íîâîé äàòû\n\n\ -Êîìàíäà DATE áåç ïàðàìåòðîâ îòîáðàæàåò òåêóùóþ äàòó è çàïðàøèâàåò ââîä\n\ -íîâîé äàòû. Äëÿ ñîõðàíåíèÿ òåêóùåé äàòû íàæìèòå êëàâèøó ENTER.\n" +STRING_DATE_HELP4, "Вывод или изменение даты.\n\n\ +DATE [/T][дата]\n\n\ + /T Не запрашивать ввод новой даты\n\n\ +Команда DATE без параметров отображает текущую дату и запрашивает ввод\n\ +новой даты. Для сохранения текущей даты нажмите клавишу ENTER.\n" -STRING_DEL_HELP1, "Óäàëåíèå îäíîãî èëè íåñêîëüêèõ ôàéëîâ.\n\n\ -DEL [/N /P /T /Q /S /W /Y /Z /A[[:]àòðèáóòû]] èìåíà_ôàéëîâ ...\n\ -DELETE [/N /P /T /Q /S /W /Y /Z /A[[:]àòðèáóòû]] èìåíà_ôàéëîâ ...\n\ -ERASE [/N /P /T /Q /S /W /Y /Z /A[[:]àòðèáóòû]] èìåíà_ôàéëîâ ...\n\n\ - èìåíà_ôàéëîâ Èìåíà îäíîãî èëè íåñêîëüêèõ ôàéëîâ.\n\n\ - /N Íåâûïîëíÿòü íåïîñðåäñòâåííî îïåðàöèþ óäàëåíèÿ ôàéëà.\n\ - /P Çàïðîñ íà ïîäòâåðæäåíèå ïåðåä óäàëåíèåì êàæäîãî ôàéëà.\n\ - /T Ïîêàçûâàåò êîëè÷åñòâî óäàëåííûõ ôàéëîâ è îñâîáîäèâøåãîñÿ\n\ - äèñêîâîãî ïðîñòðàíñòâà.\n\ - /Q Îòêëþ÷åíèå çàïðîñà íà ïîäòâåðæäåíèå ïðè óäàëåíèè ôàéëîâ.\n\ - /W Ïåðåïèñàòü ôàéë ñëó÷àéíûìè äàííûìè ïåðåä óäàëåíèåì.\n\ - /Y Îòêëþ÷åíèå çàïðîñà íà ïîäòâåðæäåíèå ïðè óäàëåíèè ôàéëîâ\n\ - äàæå äëÿ ìàñêè *.*.\n\ - /F Ïðèíóäèòåëüíîå óäàëåíèå ôàéëîâ, äîñòóïíûõ òîëüêî äëÿ ÷òåíèÿ.\n\ - /S Óäàëÿòü ôàéë èç âñåõ ïîääèðåêòîðèé\n\ - /A Îòáîð ôàéëîâ äëÿ óäàëåíèÿ ïî àòðèáóòàì.\n\ - R Äîñòóïíûé òîëüêî äëÿ ÷òåíèÿ\n\ - S Ñèñòåìíûå ôàéëû\n\ - A Ôàéëû äëÿ àðõèâèðîâàíèÿ\n\ - H Ñêðûòûå ôàéëû\n\ - Ïðåôèêñ ""-"" èìååò çíà÷åíèå ÍÅ\n" +STRING_DEL_HELP1, "Удаление одного или нескольких файлов.\n\n\ +DEL [/N /P /T /Q /S /W /Y /Z /A[[:]атрибуты]] имена_файлов ...\n\ +DELETE [/N /P /T /Q /S /W /Y /Z /A[[:]атрибуты]] имена_файлов ...\n\ +ERASE [/N /P /T /Q /S /W /Y /Z /A[[:]атрибуты]] имена_файлов ...\n\n\ + имена_файлов Имена одного или нескольких файлов.\n\n\ + /N Невыполнять непосредственно операцию удаления файла.\n\ + /P Запрос на подтверждение перед удалением каждого файла.\n\ + /T Показывает количество удаленных файлов и освободившегося\n\ + дискового пространства.\n\ + /Q Отключение запроса на подтверждение при удалении файлов.\n\ + /W Переписать файл случайными данными перед удалением.\n\ + /Y Отключение запроса на подтверждение при удалении файлов\n\ + даже для маски *.*.\n\ + /F Принудительное удаление файлов, доступных только для чтения.\n\ + /S Удалять файл из всех поддиректорий\n\ + /A Отбор файлов для удаления по атрибутам.\n\ + R Доступный только для чтения\n\ + S Системные файлы\n\ + A Файлы для архивирования\n\ + H Скрытые файлы\n\ + Префикс ""-"" имеет значение НЕ\n" -STRING_DEL_HELP2, "Âñå ôàéëû â êàòàëîãå áóäóò óäàëåíû!\nÂû óâåðåíû (Y/N)?" -STRING_DEL_HELP3, " %lu ôàéë óäàëåí\n" -STRING_DEL_HELP4, " %lu ôàéëîâ óäàëåíî\n" +STRING_DEL_HELP2, "Все файлы в каталоге будут удалены!\nВы уверены (Y/N)?" +STRING_DEL_HELP3, " %lu файл удален\n" +STRING_DEL_HELP4, " %lu файлов удалено\n" -STRING_DELAY_HELP, "ïàóçà íà n ñåêóíä èëè ìèëëèñåêóíä\n\ +STRING_DELAY_HELP, "пауза на n секунд или миллисекунд\n\ DELAY [/m]n\n\n\ - /m óêàçûâàåò, ÷òî n îçíà÷àåò êîëè÷åñòâî ìèëëèñåêóíä\n\ - èíà÷å n îçíà÷àåò êîëè÷åñòâî ñåêóíä\n" + /m указывает, что n означает количество миллисекунд\n\ + иначе n означает количество секунд\n" -STRING_DIR_HELP1, "DIR [äèñê:][ïóòü][èìÿ_ôàéëà] [/A[[:]àòðèáóòû]] [/B] [/C] [/D] [/L] [/N]\n\ +STRING_DIR_HELP1, "DIR [диск:][путь][имя_файла] [/A[[:]атрибуты]] [/B] [/C] [/D] [/L] [/N]\n\ [/O[[:]sortorder]] [/P] [/Q] [/S] [/T[[:]timefield]] [/W] [/X] [/4]\n\n\ - [äèñê:][ïóòü][èìÿ_ôàéëà]\n\ - Äèñê, êàòàëîã è/èëè ôàéëû, êîòîðûå ñëåäóåò âêëþ÷èòü â ñïèñîê.\n\n\ - /A Âûâîä ôàéëîâ ñ óêàçàííûìè àòðèáóòàìè.\n\ - àòðèáóòû D Êàòàëîãè R Äîñòóïíûå òîëüêî äëÿ ÷òåíèÿ\n\ - H Ñêðûòûå ôàéëû A Ôàéëû äëÿ àðõèâèðîâàíèÿ\n\ - S Ñèñòåìíûå ôàéëû Ïðåôèêñ ""-"" èìååò çíà÷åíèå ÍÅ\n\ - /B Âûâîä òîëüêî èìåí ôàéëîâ.\n\ - /C Ïðèìåíåíèå ðàçäåëèòåëÿ ãðóïï ðàçðÿäîâ äëÿ âûâîäà ðàçìåðîâ ôàéëîâ\n\ - (ïî óìîë÷àíèþ). Äëÿ îòêëþ÷åíèÿ ýòîãî ðåæèìà ñëóæèò êëþ÷ /-C.\n\ - /D Âûâîä ñïèñêà â íåñêîëüêî ñòîëáöîâ ñ ñîðòèðîâêîé ïî ñòîëáöàì.\n\ - /L Èñïîëüçîâàíèå íèæíåãî ðåãèñòðà äëÿ èìåí ôàéëîâ.\n\ - /N Îòîáðàæåíèå èìåí ôàéëîâ â êðàéíåì ïðàâîì ñòîëáöå.\n\ - /O Ñîðòèðîâêà ñïèñêà îòîáðàæàåìûõ ôàéëîâ.\n\ - ïîðÿäîê N Ïî èìåíè (àëôàâèòíàÿ) S Ïî ðàçìåðó (ñïåðâà ìåíüøèå)\n\ - E Ïî ðàñøèðåíèþ (àëôàâèòíàÿ) D Ïî äàòå (ñïåðâà áîëåå ñòàðûå)\n\ - G Íà÷àòü ñïèñîê ñ êàòàëîãîâ Ïðåôèêñ ""-"" îáðàùàåò ïîðÿäîê\n\ - /P Ïàóçà ïîñëå çàïîëíåíèÿ êàæäîãî ýêðàíà.\n\ - /Q Âûâîä ñâåäåíèé î âëàäåëüöå ôàéëà.\n\ - /S Âûâîä ñïèñêà ôàéëîâ èç óêàçàííîãî êàòàëîãà è åãî ïîäêàòàëîãîâ.\n\ - /T Âûáîð ïîëÿ âðåìåíè äëÿ îòîáðàæåíèÿ è ñîðòèðîâêè\n\ - âðåìÿ C Ñîçäàíèå\n\ - A Ïîñëåäíåå èñïîëüçîâàíèå\n\ - W Ïîñëåäíåå èçìåíåíèå\n\ - /W Âûâîä ñïèñêà â íåñêîëüêî ñòîëáöîâ.\n\ - /X Îòîáðàæåíèå êîðîòêèõ èìåí äëÿ ôàéëîâ, ÷üè èìåíà íå ñîîòâåòñòâóþò\n\ - ñòàíäàðòó 8.3. Ôîðìàò àíàëîãè÷åí âûâîäó ñ êëþ÷îì /N, íî êîðîòêèå\n\ - èìåíà ôàéëîâ âûâîäÿòñÿ ñëåâà îò äëèííûõ. Åñëè êîðîòêîãî èìåíè ó\n\ - ôàéëà íåò, âìåñòî íåãî âûâîäÿòñÿ ïðîáåëû.\n\ - /4 Âûâîä íîìåðà ãîäà â ÷åòûðåõçíà÷íîì ôîðìàòå\n" + [диск:][путь][имя_файла]\n\ + Диск, каталог и/или файлы, которые следует включить в список.\n\n\ + /A Вывод файлов с указанными атрибутами.\n\ + атрибуты D Каталоги R Доступные только для чтения\n\ + H Скрытые файлы A Файлы для архивирования\n\ + S Системные файлы Префикс ""-"" имеет значение НЕ\n\ + /B Вывод только имен файлов.\n\ + /C Применение разделителя групп разрядов для вывода размеров файлов\n\ + (по умолчанию). Для отключения этого режима служит ключ /-C.\n\ + /D Вывод списка в несколько столбцов с сортировкой по столбцам.\n\ + /L Использование нижнего регистра для имен файлов.\n\ + /N Отображение имен файлов в крайнем правом столбце.\n\ + /O Сортировка списка отображаемых файлов.\n\ + порядок N По имени (алфавитная) S По размеру (сперва меньшие)\n\ + E По расширению (алфавитная) D По дате (сперва более старые)\n\ + G Начать список с каталогов Префикс ""-"" обращает порядок\n\ + /P Пауза после заполнения каждого экрана.\n\ + /Q Вывод сведений о владельце файла.\n\ + /S Вывод списка файлов из указанного каталога и его подкаталогов.\n\ + /T Выбор поля времени для отображения и сортировки\n\ + время C Создание\n\ + A Последнее использование\n\ + W Последнее изменение\n\ + /W Вывод списка в несколько столбцов.\n\ + /X Отображение коротких имен для файлов, чьи имена не соответствуют\n\ + стандарту 8.3. Формат аналогичен выводу с ключом /N, но короткие\n\ + имена файлов выводятся слева от длинных. Если короткого имени у\n\ + файла нет, вместо него выводятся пробелы.\n\ + /4 Вывод номера года в четырехзначном формате\n" -STRING_DIR_HELP2, " Òîì â óñòðîéñòâå %c èìååò ìåòêó %s\n" -STRING_DIR_HELP3, " Òîì â óñòðîéñòâå %c íå èìååò ìåòêè.\n" -STRING_DIR_HELP4, " Ñåðèéíûé íîìåð òîìà: %04X-%04X\n" -STRING_DIR_HELP5, "\n Âñåãî:\n%16i Ôàéë(îâ)% 14s áàéò\n" -STRING_DIR_HELP6, "%16i Dir(s)% 15s áàéò\n" -STRING_DIR_HELP7, "\n Êàòàëîã of %s\n\n" -STRING_DIR_HELP8, "%16i ôàéë(îâ)% 14s áàéò\n" +STRING_DIR_HELP2, " Том в устройстве %c имеет метку %s\n" +STRING_DIR_HELP3, " Том в устройстве %c не имеет метки.\n" +STRING_DIR_HELP4, " Серийный номер тома: %04X-%04X\n" +STRING_DIR_HELP5, "\n Всего:\n%16i Файл(ов)% 14s байт\n" +STRING_DIR_HELP6, "%16i Dir(s)% 15s байт\n" +STRING_DIR_HELP7, "\n Каталог of %s\n\n" +STRING_DIR_HELP8, "%16i файл(ов)% 14s байт\n" -STRING_DIRSTACK_HELP1, "Ñîõðàíÿåò òåêóùóþ äèðåêòîðèþ äëÿ èñïîëüçîâàíèÿ êîìàíäîé POPD, çàòåì\n\ -èçìåíÿåò åå íà óêàçàííóþ.\n\n\ +STRING_DIRSTACK_HELP1, "Сохраняет текущую директорию для использования командой POPD, затем\n\ +изменяет ее на указанную.\n\n\ PUSHD [path | ..]\n\n\ - path Óêàçûâàåò äèðåêòîðèþ, êîòîðóþ íàäî ñäåëàòü òåêóùåé\n" + path Указывает директорию, которую надо сделать текущей\n" -STRING_DIRSTACK_HELP2, "Èçìåíÿåò òåêóùóþ äèðåêòîðèþ íà òó, êîòîðàÿ ñîõðàíåíà êîìàíäîé PUSHD.\n\nPOPD" +STRING_DIRSTACK_HELP2, "Изменяет текущую директорию на ту, которая сохранена командой PUSHD.\n\nPOPD" -STRING_DIRSTACK_HELP3, "Ïå÷àòàåò ñîäåðæèìîå ñòåêà äèðåêòîðèé.\n\nDIRS" +STRING_DIRSTACK_HELP3, "Печатает содержимое стека директорий.\n\nDIRS" -STRING_DIRSTACK_HELP4, "Ñòåê äèðåêòîðèé ïóñò" +STRING_DIRSTACK_HELP4, "Стек директорий пуст" -STRING_ECHO_HELP1, "Âûäàåò ñîîáùåíèå áåç ïåðåâîäà ñòðîêè.\n\n\ +STRING_ECHO_HELP1, "Выдает сообщение без перевода строки.\n\n\ ECHOS message" -STRING_ECHO_HELP2, "Âûäàåò ñîîáùåíèå â ñòàíäàðòíûé êàíàë âûâîäà îøèáîê.\n\n\ +STRING_ECHO_HELP2, "Выдает сообщение в стандартный канал вывода ошибок.\n\n\ ECHOERR message\n\ - ECHOERR. ïå÷àòàåò ïóñòóþ ñòðîêó" + ECHOERR. печатает пустую строку" -STRING_ECHO_HELP3, "Ïå÷àòàåò ñîîáùåíèå â ñòàíäàðòíûé êàíàë âûâîäà îøèáîê áåç ïåðåâîäà ñòðîêè è âîçâðàòà êàðåòêè.\n\n\ +STRING_ECHO_HELP3, "Печатает сообщение в стандартный канал вывода ошибок без перевода строки и возврата каретки.\n\n\ ECHOSERR message" -STRING_ECHO_HELP4, "Âûâîä ñîîáùåíèé è ïåðåêëþ÷åíèå ðåæèìà îòîáðàæåíèÿ êîìàíä íà ýêðàíå.\n\n\ +STRING_ECHO_HELP4, "Вывод сообщений и переключение режима отображения команд на экране.\n\n\ ECHO [ON | OFF]\n\ - ECHO [ñîîáùåíèå]\n\ - ECHO. âûâîä ïóñòîé ñòðîêè\n\n\ -ECHO áåç ïàðàìåòðà âûâîäèò òåêóùèé ðåæèì îòîáðàæåíèÿ êîìàíä." + ECHO [сообщение]\n\ + ECHO. вывод пустой строки\n\n\ +ECHO без параметра выводит текущий режим отображения команд." STRING_ECHO_HELP5, "ECHO is %s\n" -STRING_EXIT_HELP, "Çàâåðøàåò èíòåðïðåòàòîð êîìàíä.\n\nEXIT\n" +STRING_EXIT_HELP, "Завершает интерпретатор команд.\n\nEXIT\n" -STRING_FOR_HELP1, "Çàïóñêàåò óêàçàííóþ êîìàíäó äëÿ êàæäîãî ôàéëà èç íàáîðà ôàéëîâ\n\n\ -FOR %ïåðåìåííàÿ IN (íàáîð) DO êîìàíäà [ïàðàìåòðû]\n\n\ - %ïåðåìåííàÿ Ïîäñòàâëÿåìûé ïàðàìåòð.\n\ - (íàáîð) Íàáîð èç îäíîãî èëè íåñêîëüêèõ ôàéëîâ.\n\ - Äîïóñêàåòñÿ èñïîëüçîâàíèå ïîäñòàíîâî÷íûõ çíàêîâ.\n\ - êîìàíäà Êîìàíäà, êîòîðóþ ñëåäóåò âûïîëíèòü äëÿ êàæäîãî ôàéëà.\n\ - ïàðàìåòðû Ïàðàìåòðû è êëþ÷è äëÿ óêàçàííîé êîìàíäû.\n\n\ - ïàêåòíûõ ôàéëàõ äëÿ êîìàíäû FOR èñïîëüçóåòñÿ çàïèñü\n\ -%%ïåðåìåííàÿ âìåñòî %ïåðåìåííàÿ.\n" +STRING_FOR_HELP1, "Запускает указанную команду для каждого файла из набора файлов\n\n\ +FOR %переменная IN (набор) DO команда [параметры]\n\n\ + %переменная Подставляемый параметр.\n\ + (набор) Набор из одного или нескольких файлов.\n\ + Допускается использование подстановочных знаков.\n\ + команда Команда, которую следует выполнить для каждого файла.\n\ + параметры Параметры и ключи для указанной команды.\n\n\ +В пакетных файлах для команды FOR используется запись\n\ +%%переменная вместо %переменная.\n" -STRING_FREE_HELP1, "\nÒîì äèñêà %s: %-11s\n\ - Ñåðèéíûé íîìåð: %s\n\ - %16s áàéò îáùåãî äèñêîâîãî ïðîñòðàíñòâà\n\ - %16s áàéò çàíÿòî\n\ - %16s áàéò ñâîáîäíî\n" +STRING_FREE_HELP1, "\nТом диска %s: %-11s\n\ + Серийный номер: %s\n\ + %16s байт общего дискового пространства\n\ + %16s байт занято\n\ + %16s байт свободно\n" -STRING_FREE_HELP2, "Âûâîäèò èíôîðìàöèþ î òîìå.\n\nFREE [drive: ...]\n" +STRING_FREE_HELP2, "Выводит информацию о томе.\n\nFREE [drive: ...]\n" -STRING_IF_HELP1, "Îïåðàòîð óñëîâíîãî âûïîëíåíèÿ êîìàíä â ïàêåòíîì ôàéëå.\n\n\ - IF [NOT] ERRORLEVEL ÷èñëî êîìàíäà\n\ - IF [NOT] ñòðîêà1==ñòðîêà2 êîìàíäà\n\ - IF [NOT] EXIST èìÿ_ôàéëà êîìàíäà\n\ - IF [NOT] DEFINED ïåðåìåííàÿ êîìàíäà\n\n\ - NOT Îáðàùàåò èñòèííîñòü óñëîâèÿ: èñòèííîå óñëîâèå\n\ - ñòàíîâèòñÿ ëîæíûì, à ëîæíîå - èñòèííûì.\n\ - ERRORLEVEL ÷èñëî Óñëîâèå ÿâëÿåòñÿ èñòèííûì, åñëè êîä âîçâðàòà ïîñëåäíåé\n\ - âûïîëíåííîé ïðîãðàììû íå ìåíüøå óêàçàííîãî ÷èñëà.\n\ - ñòðîêà1==ñòðîêà2 Ýòî óñëîâèå ÿâëÿåòñÿ èñòèííûì, åñëè óêàçàííûå ñòðîêè\n\ - ñîâïàäàþò.\n\ - EXIST èìÿ_ôàéëà Ýòî óñëîâèå ÿâëÿåòñÿ èñòèííûì, åñëè ôàéë ñ óêàçàííûì\n\ - èìåíåì ñóùåñòâóåò.\n\ -DEFINED ïåðåìåííàÿ Ýòî óñëîâèå ÿâëÿåòñÿ èñòèííûì, åñëè óêàçàííàÿ ïåðåìåííàÿ\n\ - çàäàíà\n\ - êîìàíäà Çàäàåò êîìàíäó, âûïîëíÿåìóþ ïðè èñòèííîñòè óñëîâèÿ.\n\ - Çà ýòîé êîìàíäîé ìîæåò ñëåäîâàòü êëþ÷åâîå ñëîâî ELSE,\n\ - ñëóæàùåå äëÿ óêàçàíèÿ êîìàíäû, êîòîðàÿ äîëæíà\n\ - âûïîëíÿòüñÿ â òîì ñëó÷àå, åñëè óñëîâèå ëîæíî.\n" +STRING_IF_HELP1, "Оператор условного выполнения команд в пакетном файле.\n\n\ + IF [NOT] ERRORLEVEL число команда\n\ + IF [NOT] строка1==строка2 команда\n\ + IF [NOT] EXIST имя_файла команда\n\ + IF [NOT] DEFINED переменная команда\n\n\ + NOT Обращает истинность условия: истинное условие\n\ + становится ложным, а ложное - истинным.\n\ + ERRORLEVEL число Условие является истинным, если код возврата последней\n\ + выполненной программы не меньше указанного числа.\n\ + строка1==строка2 Это условие является истинным, если указанные строки\n\ + совпадают.\n\ + EXIST имя_файла Это условие является истинным, если файл с указанным\n\ + именем существует.\n\ +DEFINED переменная Это условие является истинным, если указанная переменная\n\ + задана\n\ + команда Задает команду, выполняемую при истинности условия.\n\ + За этой командой может следовать ключевое слово ELSE,\n\ + служащее для указания команды, которая должна\n\ + выполняться в том случае, если условие ложно.\n" -STRING_GOTO_HELP1, "Ïåðåäà÷à óïðàâëåíèÿ ñîäåðæàùåé ìåòêó ñòðîêå ïàêåòíîãî ôàéëà.\n\n\ -GOTO ìåòêà\n\n\ - label Ñòðîêà ïàêåòíîãî ôàéëà, îôîðìëåííàÿ êàê ìåòêà.\n\n\ -Ìåòêà äîëæíà íàõîäèòüñÿ â îòäåëüíîé ñòðîêå è íà÷èíàòüñÿ ñ äâîåòî÷èÿ." +STRING_GOTO_HELP1, "Передача управления содержащей метку строке пакетного файла.\n\n\ +GOTO метка\n\n\ + label Строка пакетного файла, оформленная как метка.\n\n\ +Метка должна находиться в отдельной строке и начинаться с двоеточия." -STRING_LABEL_HELP1, "Ñîçäàíèå, èçìåíåíèå è óäàëåíèå ìåòîê òîìà.\n\nLABEL [äèñê:][ìåòêà]\n" +STRING_LABEL_HELP1, "Создание, изменение и удаление меток тома.\n\nLABEL [диск:][метка]\n" -STRING_LABEL_HELP2, "Òîì â óñòðîéñòâå %c èìååò ìåòêó %s\n" -STRING_LABEL_HELP3, "Òîì â óñòðîéñòâå %c: íå èìååò ìåòêè\n" -STRING_LABEL_HELP4, "Ñåðèéíûé íîìåð òîìà: %04X-%04X\n" -STRING_LABEL_HELP5, "Ìåòêà òîìà (11 áóêâ, ÂÂÎÄ äëÿ ïóñòîé ìåòêè)? " +STRING_LABEL_HELP2, "Том в устройстве %c имеет метку %s\n" +STRING_LABEL_HELP3, "Том в устройстве %c: не имеет метки\n" +STRING_LABEL_HELP4, "Серийный номер тома: %04X-%04X\n" +STRING_LABEL_HELP5, "Метка тома (11 букв, ВВОД для пустой метки)? " -STRING_LOCALE_HELP1, "Òåêóùåå âðåìÿ: " +STRING_LOCALE_HELP1, "Текущее время: " -STRING_MKDIR_HELP, "Ñîçäàíèå êàòàëîãà.\n\n\ -MKDIR [äèñê:]ïóòü\nMD [äèñê:]ïóòü" +STRING_MKDIR_HELP, "Создание каталога.\n\n\ +MKDIR [диск:]путь\nMD [диск:]путь" STRING_MKLINK_HELP, "Creates a filesystem link object.\n\n\ MKLINK [/D | /H | /J] linkname target\n\n\ @@ -312,167 +312,167 @@ MKLINK [/D | /H | /J] linkname target\n\n\ /J Create a directory junction.\n\n\ If neither /H or /J is specified, a symbolic link is created." -STRING_MEMMORY_HELP1, "Âûâîä îáúåìà ñèñòåìíîé ïàìÿòè.\n\nMEMORY" +STRING_MEMMORY_HELP1, "Вывод объема системной памяти.\n\nMEMORY" STRING_MEMMORY_HELP2, "\n %12s%% memory load.\n\n\ - %13s áàéò âñåãî ôèçè÷åñêîé ïàìÿòè.\n\ - %13s áàéò äîñòóïíî ôèçè÷åñêîé ïàìÿòè.\n\n\ - %13s áàéò âñåãî â ôàéëå ïîäêà÷êè.\n\ - %13s áàéò äîñòóïíî â ôàéëå ïîäêà÷êè.\n\n\ - %13s áàéò âñåãî âèðòóàëüíîé ïàìÿòè.\n\ - %13s áàéò äîñòóïíî âèðòóàëüíî ïàìÿòè.\n" + %13s байт всего физической памяти.\n\ + %13s байт доступно физической памяти.\n\n\ + %13s байт всего в файле подкачки.\n\ + %13s байт доступно в файле подкачки.\n\n\ + %13s байт всего виртуальной памяти.\n\ + %13s байт доступно виртуально памяти.\n" -STRING_MISC_HELP1, "Íàæìèòå êëàâèøó äëÿ ïðîäîëæåíèÿ...\n" +STRING_MISC_HELP1, "Нажмите клавишу для продолжения...\n" -STRING_MOVE_HELP1, "Ïåðåïèñàòü %s (Yes/No/All)? " +STRING_MOVE_HELP1, "Переписать %s (Yes/No/All)? " -STRING_MOVE_HELP2, "Ïåðåìåùåíèå ôàéëîâ è ïåðåèìåíîâàíèå ôàéëîâ è êàòàëîãîâ.\n\n\ -Ïåðåìåùåíèå îäíîãî èëè áîëåå ôàéëîâ:\n\ -MOVE [/N][äèñê:][ïóòü]èìÿ_ôàéëà1[,...] íàçíà÷åíèå\n\n\ -Ïåðåèìåíîâàíèå êàòàëîãà:\n\ -MOVE [/N][äèñê:][ïóòü]èìÿ_êàòàëîãà1 èìÿ_êàòàëîãà2\n\n\ - [äèñê:][ïóòü]èìÿ_ôàéëà1 Óêàçûâàåò ìåñòîïîëîæåíèå è èìÿ ôàéëà èëè ôàéëîâ\n\ - êîòîðûå íåîáõîäèìî ïåðåìåñòèòü.\n\ +STRING_MOVE_HELP2, "Перемещение файлов и переименование файлов и каталогов.\n\n\ +Перемещение одного или более файлов:\n\ +MOVE [/N][диск:][путь]имя_файла1[,...] назначение\n\n\ +Переименование каталога:\n\ +MOVE [/N][диск:][путь]имя_каталога1 имя_каталога2\n\n\ + [диск:][путь]имя_файла1 Указывает местоположение и имя файла или файлов\n\ + которые необходимо переместить.\n\ /N Nothing. Do everything but move files or directories.\n\n\ -Òåêóùèå îãðàíè÷åíèÿ:\n\ - - Íåâîçìîæíî ïåðåíîñèòü ôàéëû èëè ïàïêè ìåæäó ðàçíûìè ðàçäåëàìè.\n" +Текущие ограничения:\n\ + - Невозможно переносить файлы или папки между разными разделами.\n" -STRING_MSGBOX_HELP, "Âûâîä îêíà ñ ñîîáùåíèåì è âîçâðàò îòâåòà ïîëüçîâàòåëÿ\n\n\ -MSGBOX òèï ['çàãîëîâîê'] ïîäñêàçêà\n\n\ -òèï âûâîäèìûå êíîïêè\n\ - âîçìîæíûå çíà÷åíèÿ: OK, OKCANCEL,\n\ +STRING_MSGBOX_HELP, "Вывод окна с сообщением и возврат ответа пользователя\n\n\ +MSGBOX тип ['заголовок'] подсказка\n\n\ +тип выводимые кнопки\n\ + возможные значения: OK, OKCANCEL,\n\ YESNO, YESNOCANCEL\n\ -çàãîëîâîê çàãîëîâîê îêíà ñ ñîîáùåíèåì\n\ -ïîäñêàçêà âûâîäèìûé òåêñò ïîäñêàçêè\n\n\n\ -ERRORLEVEL óñòàíàâëèâàåòñÿ â ñîîòâåòñòâèè ñ íàæàòîé êíîïêîé:\n\n\ +заголовок заголовок окна с сообщением\n\ +подсказка выводимый текст подсказки\n\n\n\ +ERRORLEVEL устанавливается в соответствии с нажатой кнопкой:\n\n\ YES : 10 | NO : 11\n\ OK : 10 | CANCEL : 12\n" -STRING_PATH_HELP1, "Âûâîä èëè çàäàíèå ïóòè ïîèñêà èñïîëíÿåìûõ ôàéëîâ.\n\n\ -PATH [[äèñê:]ïóòü[;...]]\nPATH ;\n\n\ -Êîìàíäà PATH ; î÷èùàåò ïóòü ïîèñêà èñïîëüçóåìûõ ôàéëîâ, îãðàíè÷èâ åãî\n\ -òåêóùèì êàòàëîãîì.\n\ -Êîìàíäà PATH áåç ïàðàìåòðîâ îòîáðàæàåò òåêóùèé ïóòü ïîèñêà.\n" +STRING_PATH_HELP1, "Вывод или задание пути поиска исполняемых файлов.\n\n\ +PATH [[диск:]путь[;...]]\nPATH ;\n\n\ +Команда PATH ; очищает путь поиска используемых файлов, ограничив его\n\ +текущим каталогом.\n\ +Команда PATH без параметров отображает текущий путь поиска.\n" -STRING_PROMPT_HELP1, "Èçìåíåíèå ïðèãëàøåíèÿ êîìàíäíîé ñòðîêè.\n\n\ -PROMPT [òåêñò]\n\n\ - òåêñò Íîâîå ïðèãëàøåíèå êîìàíäíîé ñòðîêè.\n\n\ -Ïðèãëàøåíèå ìîæåò âêëþ÷àòü îáû÷íûå ñèìâîëû è ñëåäóþùèå êîäû:\n\n\ - $A & (àìïåðñàíä)\n\ - $B | (âåðòèêàëüíàÿ ÷åðòà)\n\ - $C ( (ëåâàÿ êðóãëàÿ ñêîáêà)\n\ - $D Òåêóùàÿ äàòà\n\ - $E ESC (ñèìâîë ASCII ñ êîäîì 27)\n\ - $F ) (ïðàâàÿ êðóãëàÿ ñêîáêà)\n\ - $G > (çíàê ""áîëüøå"")\n\ - $H BACKSPACE (óäàëåíèå ïðåäûäóùåãî ñèìâîëà)\n\ - $L < (çíàê ""ìåíüøå"")\n\ - $N Òåêóùèé äèñê\n\ - $P Òåêóùèå äèñê è êàòàëîã\n\ - $Q = (çíàê ðàâåíñòâà)\n\ - $T Òåêóùåå âðåìÿ\n\ - $V Íîìåð âåðñèè îïåðàöèîííîé ñèñòåìû\n\ - $_ Ïåðåâîä ñòðîêè\n\ - $$ $ (çíàê äîëëàðà)\n" +STRING_PROMPT_HELP1, "Изменение приглашения командной строки.\n\n\ +PROMPT [текст]\n\n\ + текст Новое приглашение командной строки.\n\n\ +Приглашение может включать обычные символы и следующие коды:\n\n\ + $A & (амперсанд)\n\ + $B | (вертикальная черта)\n\ + $C ( (левая круглая скобка)\n\ + $D Текущая дата\n\ + $E ESC (символ ASCII с кодом 27)\n\ + $F ) (правая круглая скобка)\n\ + $G > (знак ""больше"")\n\ + $H BACKSPACE (удаление предыдущего символа)\n\ + $L < (знак ""меньше"")\n\ + $N Текущий диск\n\ + $P Текущие диск и каталог\n\ + $Q = (знак равенства)\n\ + $T Текущее время\n\ + $V Номер версии операционной системы\n\ + $_ Перевод строки\n\ + $$ $ (знак доллара)\n" -STRING_PAUSE_HELP1, "Ïðèîñòàíîâêà âûïîëíåíèÿ ïàêåòíîãî ôàéëà è âûâîä ñîîáùåíèÿ:\n\ -'Äëÿ ïðîäîëæåíèÿ íàæìèòå ëþáóþ êëàâèøó...' èëè óêàçàííîå ñîîáùåíèå.\n\n\ -PAUSE [ñîîáùåíèå]" +STRING_PAUSE_HELP1, "Приостановка выполнения пакетного файла и вывод сообщения:\n\ +'Для продолжения нажмите любую клавишу...' или указанное сообщение.\n\n\ +PAUSE [сообщение]" STRING_PROMPT_HELP2, " $+ Displays the current depth of the directory stack" -STRING_PROMPT_HELP3, "\nPROMPT áåç ïàðàìåòðîâ óñòàíàâëèâàåò ïðèãëàøåíèå êîìàíäíîé ñòðîêè ïî óìîë÷àíèþ." +STRING_PROMPT_HELP3, "\nPROMPT без параметров устанавливает приглашение командной строки по умолчанию." -STRING_REM_HELP, "Ïîìåùåíèå êîììåíòàðèåâ â ïàêåòíûå ôàéëû.\n\nREM [êîììåíòàðèé]" +STRING_REM_HELP, "Помещение комментариев в пакетные файлы.\n\nREM [комментарий]" -STRING_RMDIR_HELP, "Óäàëåíèå êàòàëîãà.\n\n\ -RMDIR [äèñê:]ïóòü\nRD [äèñê:]ïóòü\n\ -/S Óäàëåíèå äåðåâà êàòàëîãîâ\n\ -/Q Îòêëþ÷åíèå çàïðîñà ïîäòâåðæäåíèÿ\n" -STRING_RMDIR_HELP2, "Êàòàëîã ïóñò!\n" +STRING_RMDIR_HELP, "Удаление каталога.\n\n\ +RMDIR [диск:]путь\nRD [диск:]путь\n\ +/S Удаление дерева каталогов\n\ +/Q Отключение запроса подтверждения\n" +STRING_RMDIR_HELP2, "Каталог пуст!\n" -STRING_REN_HELP1, "Ïåðåèìåíîâàíèå îäíîãî èëè íåñêîëüêèõ ôàéëîâ èëè êàòàëîãîâ.\n\n\ -RENAME [/E /N /P /Q /S /T] ñòàðîå_èìÿ ... íîâîå_èìÿ\n\ -REN [/E /N /P /Q /S /T] ñòàðîå_èìÿ ... íîâîå_èìÿ\n\n\ - /E Íå âûâîäèòü ñîîáùåíèÿ îá îøèáêàõ.\n\ +STRING_REN_HELP1, "Переименование одного или нескольких файлов или каталогов.\n\n\ +RENAME [/E /N /P /Q /S /T] старое_имя ... новое_имя\n\ +REN [/E /N /P /Q /S /T] старое_имя ... новое_имя\n\n\ + /E Не выводить сообщения об ошибках.\n\ /N Nothing.\n\ - /P Çàïðîñ ïîäòâåðæäåíèÿ ïåðåä ïåðåèìåíîâàíèåì.\n\ - (Íå ðåàëèçîâàíî â äàííûé ìîìåíò!)\n\ + /P Запрос подтверждения перед переименованием.\n\ + (Не реализовано в данный момент!)\n\ /Q Quiet.\n\ - /S Ïåðåèìåíîâûâàòü ïîäêàòàëîãè.\n\ - /T Âûâîä êîëè÷åñòâà ïåðåèìåíîâàííûõ ôàéëîâ.\n\n\ -Äëÿ êîíå÷íîãî ôàéëà íåëüçÿ óêàçàòü äðóãîé äèñê èëè êàòàëîã.\n\ -Äëÿ ýòîé öåëè ñëåäóåò èñïîëüçîâàòü êîìàíäó MOVE.\n" + /S Переименовывать подкаталоги.\n\ + /T Вывод количества переименованных файлов.\n\n\ +Для конечного файла нельзя указать другой диск или каталог.\n\ +Для этой цели следует использовать команду MOVE.\n" -STRING_REN_HELP2, " %lu ôàéë ïåðåèìåíîâàí\n" +STRING_REN_HELP2, " %lu файл переименован\n" -STRING_REN_HELP3, " %lu ôàéëîâ ïåðåèìåíîâàíî\n" +STRING_REN_HELP3, " %lu файлов переименовано\n" -STRING_SHIFT_HELP, "Èçìåíåíèå ñîäåðæèìîãî (ñäâèã) ïîäñòàâëÿåìûõ ïàðàìåòðîâ äëÿ ïàêåòíîãî ôàéëà.\n\n\ +STRING_SHIFT_HELP, "Изменение содержимого (сдвиг) подставляемых параметров для пакетного файла.\n\n\ SHIFT [DOWN]" -STRING_SCREEN_HELP, "Ïåðåìåùåíèå êóðñîðà è âûâîä òåêñòà\n\n\ -SCREEN ñòð êîë [òåêñò]\n\n\ - ñòð ñòðîêà, íà êîòîðóþ ñëåäóåò ïåðåìåñòèòü êóðñîð\n\ - êîë êîëîíêà, íà êîòîðóþ ñëåäóåò ïåðåìåñòèòü êóðñîð" +STRING_SCREEN_HELP, "Перемещение курсора и вывод текста\n\n\ +SCREEN стр кол [текст]\n\n\ + стр строка, на которую следует переместить курсор\n\ + кол колонка, на которую следует переместить курсор" -STRING_SET_HELP, "Âûâîä, çàäàíèå è óäàëåíèå ïåðåìåííûõ ñðåäû.\n\n\ -SET [ïåðåìåííàÿ[=][çíà÷åíèå]]\n\n\ - ïåðåìåííàÿ Èìÿ ïåðåìåííîé ñðåäû.\n\ - çíà÷åíèå Ñòðîêà ñèìâîëîâ, ïðèñâàèâàåìàÿ óêàçàííîé ïåðåìåííîé.\n\n\ -SET áåç ïàðàìåòðîâ âûâîäèò òåêóùèå çíà÷åíèÿ ïåðåìåííûõ ñðåäû.\n" +STRING_SET_HELP, "Вывод, задание и удаление переменных среды.\n\n\ +SET [переменная[=][значение]]\n\n\ + переменная Имя переменной среды.\n\ + значение Строка символов, присваиваемая указанной переменной.\n\n\ +SET без параметров выводит текущие значения переменных среды.\n" -STRING_START_HELP1, "Çàïóñê óêàçàííîé ïðîãðàììû èëè êîìàíäû.\n\n\ -START êîìàíäà\n\n\ - êîìàíäà Êîìàíäà èëè ïðîãðàììà äëÿ çàïóñêà.\n\n\ +STRING_START_HELP1, "Запуск указанной программы или команды.\n\n\ +START команда\n\n\ + команда Команда или программа для запуска.\n\n\ At the moment all commands are started asynchronously.\n" -STRING_TITLE_HELP, "Èçìåíåíèå çàãîëîâêà îêíà êîìàíäíîé ñòðîêè.\n\n\ -TITLE [ñòðîêà]\n\n\ -ñòðîêà Áóäóùèé çàãîëîâîê îêíà êîìàíäíîé ñòðîêè.\n" +STRING_TITLE_HELP, "Изменение заголовка окна командной строки.\n\n\ +TITLE [строка]\n\n\ +строка Будущий заголовок окна командной строки.\n" -STRING_TIME_HELP1, "Âûâîä èëè èçìåíåíèå âðåìåíè.\n\n\ -TIME [/T][âðåìÿ]\n\n\ - /T íå èçìåíÿòü âðåìÿ\n\n\ -TIME áåç ïàðàìåòðîâ âûâîäèò òåêóùåå âðåìÿ è çàïðàøèâàåò\n\ -íîâîå âðåìÿ. Íàæàòèå ENTER ñîõðàíèò òåêóùåå âðåìÿ.\n" +STRING_TIME_HELP1, "Вывод или изменение времени.\n\n\ +TIME [/T][время]\n\n\ + /T не изменять время\n\n\ +TIME без параметров выводит текущее время и запрашивает\n\ +новое время. Нажатие ENTER сохранит текущее время.\n" -STRING_TIME_HELP2, "Ââåäèòå íîâîå âðåìÿ: " +STRING_TIME_HELP2, "Введите новое время: " -STRING_TIMER_HELP1, "Ïðîøëî %d ìñåê\n" +STRING_TIMER_HELP1, "Прошло %d мсек\n" -STRING_TIMER_HELP2, "Ïðîøëî %02d%c%02d%c%02d%c%02d\n" +STRING_TIMER_HELP2, "Прошло %02d%c%02d%c%02d%c%02d\n" -STRING_TIMER_HELP3, "Ñåêóíäîìåð.\n\n\ +STRING_TIMER_HELP3, "Секундомер.\n\n\ TIMER [ON|OFF] [/S] [/n] [/Fn]\n\n\ - ON Âêëþ÷èòü ñåêóíäîìåð\n\ - OFF Âûêëþ÷èòü ñåêóíäîìåð\n\ - /S Ðàçíèöà âðåìåíè. Âîçâðàùàåò ðàçíèöó âðåìåíè\n\ - ñåêóíäîìåðà áåç èçìåíåíèÿ åãî çíà÷åíèÿ\n\ - /n Çàäàòü íîìåð ñåêóíäîìåðà.\n\ - Äîñòóïíûå íîìåðà - îò 0 äî 9\n\ - Çíà÷åíèå ïî óìîë÷àíèþ - 1\n\ - /Fn Ôîðìàò âûâîäà\n\ - n îäíî èç:\n\ - 0 ìèëëèñåêóíäû\n\ - 1 ÷÷%cìì%cññ%cää\n\n\ -Åñëè íè îäèí èç ïàðàìåòðîâ íå óêàçàí, êîìàíäà\n\ -ïåðåêëþ÷àåò ñîñòîÿíèå ñåêóíäîìåðà\n\n" + ON Включить секундомер\n\ + OFF Выключить секундомер\n\ + /S Разница времени. Возвращает разницу времени\n\ + секундомера без изменения его значения\n\ + /n Задать номер секундомера.\n\ + Доступные номера - от 0 до 9\n\ + Значение по умолчанию - 1\n\ + /Fn Формат вывода\n\ + n одно из:\n\ + 0 миллисекунды\n\ + 1 чч%cмм%cсс%cдд\n\n\ +Если ни один из параметров не указан, команда\n\ +переключает состояние секундомера\n\n" -STRING_TYPE_HELP1, "Âûâîä ñîäåðæèìîãî îäíîãî èëè íåñêîëüêèõ òåêñòîâûõ ôàéëîâ.\n\nTYPE [äèñê:][ïóòü]èìÿ ôàéëà \n\ - /P Ïîýêðàííûé âûâîä.\n" +STRING_TYPE_HELP1, "Вывод содержимого одного или нескольких текстовых файлов.\n\nTYPE [диск:][путь]имя файла \n\ + /P Поэкранный вывод.\n" STRING_VERIFY_HELP1, "This command is just a dummy!!\n\ -Âêëþ÷åíèå èëè îòêëþ÷åíèå ðåæèìà ïðîâåðêè ïðàâèëüíîñòè çàïèñè ôàéëîâ a\n\ -íà äèñê.\n\n\ +Включение или отключение режима проверки правильности записи файлов a\n\ +на диск.\n\n\ VERIFY [ON | OFF]\n\n\ -VERIFY áåç ïàðàìåòðà âûâîäèò òåêóùåå çíà÷åíèå ýòîé êîìàíäû.\n" +VERIFY без параметра выводит текущее значение этой команды.\n" STRING_VERIFY_HELP2, "VERIFY %s.\n" -STRING_VERIFY_HELP3, "Íåîáõîäèìî óêàçàòü ON èëè OFF." +STRING_VERIFY_HELP3, "Необходимо указать ON или OFF." -STRING_VERSION_HELP1, "Âûâîä âåðñèè\n\n\ +STRING_VERSION_HELP1, "Вывод версии\n\n\ VER [/C][/R][/W]\n\n\ /C Displays credits.\n\ /R Displays redistribution information.\n\ @@ -493,175 +493,175 @@ STRING_VERSION_HELP4, "\n This program is free software; you can redistribute it the Free Software Foundation; either version 2 of the License, or\n\ (at your option) any later version.\n" -STRING_VERSION_HELP5, "\nÏîñûëàéòå îò÷åòû îá îøèáêàõ íà .\n\ -Îáíîâëåíèÿ äîñòóïíû ïî àäðåñó: http://www.reactos.org/" +STRING_VERSION_HELP5, "\nПосылайте отчеты об ошибках на .\n\ +Обновления доступны по адресу: http://www.reactos.org/" -STRING_VERSION_HELP6, "\nFreeDOS-âåðñèÿ íàïèñàíà:\n" +STRING_VERSION_HELP6, "\nFreeDOS-версия написана:\n" -STRING_VERSION_HELP7, "\nReactOS-âåðñèÿ íàïèñàíà:\n" +STRING_VERSION_HELP7, "\nReactOS-версия написана:\n" -STRING_VOL_HELP1, " Òîì â óñòðîéñòâå %c èìååò ìåòêó %s\n" -STRING_VOL_HELP2, " Òîì â óñòðîéñòâå %c íå èìååò ìåòêè\n" -STRING_VOL_HELP3, " Ñåðèéíûé íîìåð òîìà: %04X-%04X\n" -STRING_VOL_HELP4, "Âûâîäèò ìåòêó òîìà è ñåðèéíûé íîìåð.\n\nVOL [äèñê:]" +STRING_VOL_HELP1, " Том в устройстве %c имеет метку %s\n" +STRING_VOL_HELP2, " Том в устройстве %c не имеет метки\n" +STRING_VOL_HELP3, " Серийный номер тома: %04X-%04X\n" +STRING_VOL_HELP4, "Выводит метку тома и серийный номер.\n\nVOL [диск:]" -STRING_WINDOW_HELP1, "Ìåíÿåò âèä îêíà êîíñîëè\n\n\ -WINDOW [/POS[=]left,top,øèðèíà,âûñîòà]\n\ - [MIN|MAX|RESTORE] ['çàãîëîâîê']\n\n\ -/POS óêàçûâàåò ðàçìåð è ïîëîæåíèå îêíà\n\ -MIN ñâîðà÷èâàåò îêíî\n\ -MAX ðàçâîðà÷èâàåò îêíî\n\ -RESTORE âîññòàíàâëèâàåò îêíî\n" +STRING_WINDOW_HELP1, "Меняет вид окна консоли\n\n\ +WINDOW [/POS[=]left,top,ширина,высота]\n\ + [MIN|MAX|RESTORE] ['заголовок']\n\n\ +/POS указывает размер и положение окна\n\ +MIN сворачивает окно\n\ +MAX разворачивает окно\n\ +RESTORE восстанавливает окно\n" -STRING_WINDOW_HELP2, "Ìåíÿåò âèä îêíà êîíñîëè\n\n\ -ACTIVATE 'window' [/POS[=]left,top,øèðèíà,âûñîòà]\n\ - [MIN|MAX|RESTORE] ['çàãîëîâîê']\n\n\ -window çàãîëîâîê îêíà, âèä êîòîðîãî ñëåäóåò ìåíÿòü\n\ -/POS óêàçûâàåò ðàçìåð è ïîëîæåíèå îêíà\n\ -MIN ñâîðà÷èâàåò îêíî\n\ -MAX ðàçâîðà÷èâàåò îêíî\n\ -RESTORE âîññòàíàâëèâàåò îêíî\n\ -çàãîëîâîê íîâûé çàãîëîâîê\n" +STRING_WINDOW_HELP2, "Меняет вид окна консоли\n\n\ +ACTIVATE 'window' [/POS[=]left,top,ширина,высота]\n\ + [MIN|MAX|RESTORE] ['заголовок']\n\n\ +window заголовок окна, вид которого следует менять\n\ +/POS указывает размер и положение окна\n\ +MIN сворачивает окно\n\ +MAX разворачивает окно\n\ +RESTORE восстанавливает окно\n\ +заголовок новый заголовок\n" -STRING_HELP1, "Ñïèñîê âñåõ äîñòóïíûõ êîìàíä ñ êîðîòêèì îïèñàíèåì\n\n\ - êîìàíäà /? Âûâîäèò ïîäðîáíóþ èíôîðìàöèþ î êîìàíäå\n\n\ -? Ñïèñîê âñåõ äîñòóïíûõ êîìàíä áåç îïèñàíèÿ.\n\ -ALIAS Âûâîä, óñòàíîâêà èëè óäàëåíèå ïñåâäîíèìîâ.\n\ -ATTRIB Âûâîä è èçìåíåíèå àòðèáóòîâ ôàéëîâ.\n\ -BEEP Çâóêîâîé ñèãíàë.\n\ -CALL Âûçîâ îäíîãî ïàêåòíîãî ôàéëà èç äðóãîãî.\n\ -CD Âûâîä èìåíè ëèáî ñìåíà òåêóùåãî êàòàëîãà.\n\ -CHCP Âûâîä èëè ñìåíà òåêóùåãî íîìåðà êîäîâîé ñòðàíèöû.\n\ -CHOICE Æäåò, ïîêà ïîëüçîâàòåëü íå âûáåðåò îäèí èç óêàçàííûõ â ñïèñêå ñèìâîëîâ.\n\ -CLS Î÷èñòêà ýêðàíà.\n\ -CMD Çàïóñê íîâîé êîïèè èíòåðïðåòàòîðà êîìàíä.\n\ -COLOR Óñòàíîâêà öâåòîâ ïî óìîë÷àíèþ äëÿ òåêñòà è ôîíà.\n\ -COPY Êîïèðîâàíèå îäíîãî èëè íåñêîëüêèõ ôàéëîâ â äðóãîå ìåñòî.\n\ -DATE Âûâîä èëè èçìåíåíèå äàòû.\n\ -DELETE Óäàëåíèå îäíîãî èëè íåñêîëüêèõ ôàéëîâ.\n\ -DIR Âûâîä ñïèñêà ôàéëîâ è ïîäêàòàëîãîâ êàòàëîãà.\n\ -ECHO Âûâîä ñîîáùåíèé è ïåðåêëþ÷åíèå ðåæèìà îòîáðàæåíèÿ êîìàíä íà ýêðàíå.\n\ -ERASE Óäàëåíèå îäíîãî èëè íåñêîëüêèõ ôàéëîâ.\n\ -EXIT Çàâåðøàåò èíòåðïðåòàòîð êîìàíä.\n\ -FOR Çàïóñêàåò óêàçàííóþ êîìàíäó äëÿ êàæäîãî ôàéëà èç íàáîðà ôàéëîâ.\n\ -FREE (Ñâîáîäíîå) äèñêîâîå ïðîñòðàíñòâî.\n\ -GOTO Ïåðåäà÷à óïðàâëåíèÿ ñîäåðæàùåé ìåòêó ñòðîêå ïàêåòíîãî ôàéëà\n\ -HELP Ïðåäîñòàâëÿåò ñïðàâî÷íóþ èíôîðìàöèþ î êîìàíäàõ ReactOS.\n\ -HISTORY Ñïèñîê çàïóùåííûõ êîìàíä\n\ -IF Îïåðàòîð óñëîâíîãî âûïîëíåíèÿ êîìàíä â ïàêåòíîì ôàéëå.\n\ -LABEL Ñîçäàíèå, èçìåíåíèå è óäàëåíèå ìåòîê òîìà.\n\ -MD Ñîçäàíèå êàòàëîãà.\n\ -MKDIR Ñîçäàíèå êàòàëîãà.\n\ +STRING_HELP1, "Список всех доступных команд с коротким описанием\n\n\ + команда /? Выводит подробную информацию о команде\n\n\ +? Список всех доступных команд без описания.\n\ +ALIAS Вывод, установка или удаление псевдонимов.\n\ +ATTRIB Вывод и изменение атрибутов файлов.\n\ +BEEP Звуковой сигнал.\n\ +CALL Вызов одного пакетного файла из другого.\n\ +CD Вывод имени либо смена текущего каталога.\n\ +CHCP Вывод или смена текущего номера кодовой страницы.\n\ +CHOICE Ждет, пока пользователь не выберет один из указанных в списке символов.\n\ +CLS Очистка экрана.\n\ +CMD Запуск новой копии интерпретатора команд.\n\ +COLOR Установка цветов по умолчанию для текста и фона.\n\ +COPY Копирование одного или нескольких файлов в другое место.\n\ +DATE Вывод или изменение даты.\n\ +DELETE Удаление одного или нескольких файлов.\n\ +DIR Вывод списка файлов и подкаталогов каталога.\n\ +ECHO Вывод сообщений и переключение режима отображения команд на экране.\n\ +ERASE Удаление одного или нескольких файлов.\n\ +EXIT Завершает интерпретатор команд.\n\ +FOR Запускает указанную команду для каждого файла из набора файлов.\n\ +FREE (Свободное) дисковое пространство.\n\ +GOTO Передача управления содержащей метку строке пакетного файла\n\ +HELP Предоставляет справочную информацию о командах ReactOS.\n\ +HISTORY Список запущенных команд\n\ +IF Оператор условного выполнения команд в пакетном файле.\n\ +LABEL Создание, изменение и удаление меток тома.\n\ +MD Создание каталога.\n\ +MKDIR Создание каталога.\n\ MKLINK Creates a filesystem link object.\n\ -MOVE Ïåðåìåùåíèå ôàéëîâ è ïåðåèìåíîâàíèå ôàéëîâ è êàòàëîãîâ\n\ -PATH Âûâîä èëè çàäàíèå ïóòè ïîèñêà èñïîëíÿåìûõ ôàéëîâ.\n\ -PAUSE Ïðèîñòàíîâêà âûïîëíåíèÿ ïàêåòíîãî ôàéëà.\n\ -POPD Âîñòòàíàâëèâàåò ïðåäûäóùåå çíà÷åíèå òåêóùåé äèðåêòîðèè ñîõðàíåííîå êîìàíäîé\n\ +MOVE Перемещение файлов и переименование файлов и каталогов\n\ +PATH Вывод или задание пути поиска исполняемых файлов.\n\ +PAUSE Приостановка выполнения пакетного файла.\n\ +POPD Восттанавливает предыдущее значение текущей директории сохраненное командой\n\ PUSHD.\n\ -PROMPT Èçìåíåíèå ïðèãëàøåíèÿ êîìàíäíîé ñòðîêè.\n\ -PUSHD Ñîõðàíÿåò òåêóùóþ äèðåêòîðèþ, à ïîòîì ìåíÿåò åå.\n\ -RD Óäàëåíèå êàòàëîãà.\n\ -REM Çàïèñûâàåò êîììåíòàðèè (çàìå÷åíèÿ) â ïàêåòíûõ ôàéëàõ.\n\ -REN Ïåðåèìåíîâàíèå îäíîãî èëè íåñêîëüêèõ ôàéëîâ èëè êàòàëîãîâ.\n\ -RENAME Ïåðåèìåíîâàíèå îäíîãî èëè íåñêîëüêèõ ôàéëîâ èëè êàòàëîãîâ.\n\ -RMDIR Óäàëåíèå êàòàëîãà.\n\ -SCREEN Ïåðåìåùåíèå êóðñîðà è âûâîä òåêñòà.\n\ -SET Âûâîä, çàäàíèå è óäàëåíèå ïåðåìåííûõ ñðåäû.\n\ -SHIFT Èçìåíåíèå ñîäåðæèìîãî (ñäâèã) ïîäñòàâëÿåìûõ ïàðàìåòðîâ äëÿ ïàêåòíîãî ôàéëà\n" -STRING_HELP2, "START Îòêðûâàåò îòäåëüíîå îêíî äëÿ çàïóñêà óêàçàííûõ êîìàíä èëè ïðîãðàìì.\n\ - Âûïîëíÿåò êîìàíäó.\n\ -TIME Âûâîä èëè èçìåíåíèå âðåìåíè.\n\ -TIMER Ñåêóíäîìåð.\n\ -TITLE Èçìåíåíèå çàãîëîâêà îêíà êîìàíäíîé ñòðîêè.\n\ -TYPE Âûâîä ñîäåðæèìîãî îäíîãî èëè íåñêîëüêèõ òåêñòîâûõ ôàéëîâ.\n\ -VER Âûâîä âåðñèè ÎÑ.\n\ -VERIFY Âêëþ÷åíèå èëè îòêëþ÷åíèå ðåæèìà ïðîâåðêè ïðàâèëüíîñòè çàïèñè ôàéëîâ\n\ - íà äèñê.\n\ -VOL Âûâîäèò ìåòêó òîìà è ñåðèéíûé íîìåð.\n" +PROMPT Изменение приглашения командной строки.\n\ +PUSHD Сохраняет текущую директорию, а потом меняет ее.\n\ +RD Удаление каталога.\n\ +REM Записывает комментарии (замечения) в пакетных файлах.\n\ +REN Переименование одного или нескольких файлов или каталогов.\n\ +RENAME Переименование одного или нескольких файлов или каталогов.\n\ +RMDIR Удаление каталога.\n\ +SCREEN Перемещение курсора и вывод текста.\n\ +SET Вывод, задание и удаление переменных среды.\n\ +SHIFT Изменение содержимого (сдвиг) подставляемых параметров для пакетного файла\n" +STRING_HELP2, "START Открывает отдельное окно для запуска указанных команд или программ.\n\ + Выполняет команду.\n\ +TIME Вывод или изменение времени.\n\ +TIMER Секундомер.\n\ +TITLE Изменение заголовка окна командной строки.\n\ +TYPE Вывод содержимого одного или нескольких текстовых файлов.\n\ +VER Вывод версии ОС.\n\ +VERIFY Включение или отключение режима проверки правильности записи файлов\n\ + на диск.\n\ +VOL Выводит метку тома и серийный номер.\n" STRING_CHOICE_OPTION, "YN" STRING_COPY_OPTION, "YNA" -STRING_ALIAS_ERROR, "Êîìàíäíàÿ ñòðîêà ñëèøêîì äëèííàÿ ïîñëå ðàçâåðòûâàíèÿ ïñåâäîíèìîâ!\n" +STRING_ALIAS_ERROR, "Командная строка слишком длинная после развертывания псевдонимов!\n" STRING_ASSOC_ERROR, "File association not found for extension %s\n" -STRING_BATCH_ERROR, "Îøèáêà îòêðûòèÿ êîìàíäíîãî ôàéëà\n" -STRING_CHCP_ERROR1, "Òåêóùàÿ êîäîâàÿ ñòðàíèöà: %u\n" -STRING_CHCP_ERROR4, "Îøèáî÷íàÿ êîäîâàÿ ñòðàíèöà\n" -STRING_CHOICE_ERROR, "Îøèáî÷íûé ïàðàìåòð. Îæèäàåòñÿ ôîðìàò: /C[:]ïàðàìåòðû" -STRING_CHOICE_ERROR_TXT, "Îøèáî÷íûé ïàðàìåòð. Îæèäàåòñÿ ôîðìàò: /T[:]c,nn" -STRING_CHOICE_ERROR_OPTION, "Îøèáî÷íûé ïàðàìåòð: %s" -STRING_MD_ERROR, "Ïîäêàòàëîã èëè ôàéë óæå ñóùåñòâóåò.\n" -STRING_MD_ERROR2, "Ïóòü ê íîâîìó êàòàëîãó íå ñóùåñòâóåò.\n" -STRING_CMD_ERROR1, "Íå ìîãó ïåðåíàïðàâèòü ââîä èç ôàéëà %s\n" -STRING_CMD_ERROR2, "Îøèáêà ñîçäàíèÿ âðåìåííîãî ôàéëà äëÿ pipe-äàííûõ\n" -STRING_CMD_ERROR3, "Íå ìîãó ïåðåíàïðàâèòü â ôàéë %s\n" -STRING_CMD_ERROR4, "Çàïóñê %s...\n" -STRING_CMD_ERROR5, "Çàïóñê cmdexit.bat...\n" -STRING_COLOR_ERROR1, "Îäèíàêîâûå öâåòà! (Öâåòà ôîíà è òåêñòà íå ìîãóò áûòü îäèíàêîâûìè)" -STRING_COLOR_ERROR2, "îøèáêà â óêàçàíèè öâåòà" -STRING_COLOR_ERROR3, "Öâåò %x\n" -STRING_COLOR_ERROR4, "Îäèíàêîâûå öâåòà!" -STRING_CONSOLE_ERROR, "Íåèçâåñòíàÿ îøèáêà: %d\n" -STRING_COPY_ERROR1, "Îøèáêà: Íåâîçìîæíî îòêðûòü èñòî÷íèê - %s!\n" -STRING_COPY_ERROR2, "Îøèáêà: Íåâîçìîæíî êîïèðîâàòü â ñåáÿ!\n" -STRING_COPY_ERROR3, "Îøèáêà çàïèñè!\n" -STRING_COPY_ERROR4, "Îøèáêà:  äàííûé ìîìåíò íå ðåàëèçîâàíî!\n" -STRING_DATE_ERROR, "Íåïðàâèëüíàÿ äàòà." -STRING_DEL_ERROR5, "Ôàéë %s áóäåò óäàëåí! " -STRING_DEL_ERROR6, "Âû óâåðåíû (Y/N)?" -STRING_DEL_ERROR7, "Óäàëåíèå: %s\n" -STRING_ERROR_ERROR1, "Íåèçâåñòíàÿ îøèáêà! Êîä îøèáêè: 0x%lx\n" -STRING_ERROR_ERROR2, "Ñèíòàêñè÷åñêàÿ îøèáêà" -STRING_FOR_ERROR1, "'in' îòñóòñòâóåò â êîìàíäå for." -STRING_FOR_ERROR2, "ñêîáîê íåîáíàðóæåíî." -STRING_FOR_ERROR3, "'do' îòñóòñâóåò." -STRING_FOR_ERROR4, "íåò êîìàíäû ïîñëå 'do'." -STRING_FREE_ERROR1, "Íåïðàâèëüíîå èìÿ äèñêà" -STRING_FREE_ERROR2, "íåîòìå÷åíî" -STRING_GOTO_ERROR1, "Íå îïðåäåëåíà ìåòêà äëÿ GOTO" -STRING_GOTO_ERROR2, "Ìåòêà '%s' íå íàéäåíà\n" +STRING_BATCH_ERROR, "Ошибка открытия командного файла\n" +STRING_CHCP_ERROR1, "Текущая кодовая страница: %u\n" +STRING_CHCP_ERROR4, "Ошибочная кодовая страница\n" +STRING_CHOICE_ERROR, "Ошибочный параметр. Ожидается формат: /C[:]параметры" +STRING_CHOICE_ERROR_TXT, "Ошибочный параметр. Ожидается формат: /T[:]c,nn" +STRING_CHOICE_ERROR_OPTION, "Ошибочный параметр: %s" +STRING_MD_ERROR, "Подкаталог или файл уже существует.\n" +STRING_MD_ERROR2, "Путь к новому каталогу не существует.\n" +STRING_CMD_ERROR1, "Не могу перенаправить ввод из файла %s\n" +STRING_CMD_ERROR2, "Ошибка создания временного файла для pipe-данных\n" +STRING_CMD_ERROR3, "Не могу перенаправить в файл %s\n" +STRING_CMD_ERROR4, "Запуск %s...\n" +STRING_CMD_ERROR5, "Запуск cmdexit.bat...\n" +STRING_COLOR_ERROR1, "Одинаковые цвета! (Цвета фона и текста не могут быть одинаковыми)" +STRING_COLOR_ERROR2, "ошибка в указании цвета" +STRING_COLOR_ERROR3, "Цвет %x\n" +STRING_COLOR_ERROR4, "Одинаковые цвета!" +STRING_CONSOLE_ERROR, "Неизвестная ошибка: %d\n" +STRING_COPY_ERROR1, "Ошибка: Невозможно открыть источник - %s!\n" +STRING_COPY_ERROR2, "Ошибка: Невозможно копировать в себя!\n" +STRING_COPY_ERROR3, "Ошибка записи!\n" +STRING_COPY_ERROR4, "Ошибка: В данный момент не реализовано!\n" +STRING_DATE_ERROR, "Неправильная дата." +STRING_DEL_ERROR5, "Файл %s будет удален! " +STRING_DEL_ERROR6, "Вы уверены (Y/N)?" +STRING_DEL_ERROR7, "Удаление: %s\n" +STRING_ERROR_ERROR1, "Неизвестная ошибка! Код ошибки: 0x%lx\n" +STRING_ERROR_ERROR2, "Синтаксическая ошибка" +STRING_FOR_ERROR1, "'in' отсутствует в команде for." +STRING_FOR_ERROR2, "скобок необнаружено." +STRING_FOR_ERROR3, "'do' отсутсвует." +STRING_FOR_ERROR4, "нет команды после 'do'." +STRING_FREE_ERROR1, "Неправильное имя диска" +STRING_FREE_ERROR2, "неотмечено" +STRING_GOTO_ERROR1, "Не определена метка для GOTO" +STRING_GOTO_ERROR2, "Метка '%s' не найдена\n" STRING_MOVE_ERROR1, "[OK]\n" -STRING_MOVE_ERROR2, "[Îøèáêà]\n" +STRING_MOVE_ERROR2, "[Ошибка]\n" -STRING_REN_ERROR1, "Âûïîëíåíèå MoveFile() áûëî íåóñïåøíûì. Îøèáêà: %lu\n" +STRING_REN_ERROR1, "Выполнение MoveFile() было неуспешным. Ошибка: %lu\n" -STRING_START_ERROR1, "Íà äàííûé ìîìåíò íåò ïîääåðæêè ïàêåòíûõ ôàéëîâ!" +STRING_START_ERROR1, "На данный момент нет поддержки пакетных файлов!" -STRING_TIME_ERROR1, "Íåïðàâèëüíîå âðåìÿ." +STRING_TIME_ERROR1, "Неправильное время." -STRING_TYPE_ERROR1, "Íåïðàâèëüíûé ïàðàìåòð '/%s'\n" +STRING_TYPE_ERROR1, "Неправильный параметр '/%s'\n" -STRING_WINDOW_ERROR1, "îêíî íå íàéäåíî" +STRING_WINDOW_ERROR1, "окно не найдено" -STRING_ERROR_PARAMETERF_ERROR, "Íåêîððåêòíûé ôîðìàò ïàðàìåòðà - %c\n" -STRING_ERROR_INVALID_SWITCH, "Íåâåðíûé ïàðàìåòð - /%c\n" -STRING_ERROR_TOO_MANY_PARAMETERS, "Ñëèøêîì ìíîãî ïàðàìåòðîâ - %s\n" -STRING_ERROR_PATH_NOT_FOUND, "Ïóòü íå íàéäåí\n" -STRING_ERROR_FILE_NOT_FOUND, "Ôàéë íå íàéäåí\n" -STRING_ERROR_REQ_PARAM_MISSING, "Îòñóòñòâóåò íåîáõîäèìûé ïàðàìåòð\n" -STRING_ERROR_INVALID_DRIVE, "Îøèáî÷íîå îïðåäåëåíèå äèñêà\n" -STRING_ERROR_INVALID_PARAM_FORMAT, "Îøèáî÷íûé ôîðìàò ïàðàìåòðà - %s\n" -STRING_ERROR_BADCOMMAND, "Íåïðàâèëüíàÿ êîìàíäà èëè íåâåðíîå èìÿ ôàéëà - %s\n" -STRING_ERROR_OUT_OF_MEMORY, "Íåõâàòêà ïàìÿòè.\n" -STRING_ERROR_CANNOTPIPE, "Îøèáêà! Íåâîçìîæíî èñïîëüçîâàòü pipe! Íåâîçìîæíî ñîçäàòü âðåìåííûé ôàéë!\n" -STRING_ERROR_D_PAUSEMSG, "Äëÿ ïðîäîëæåíèÿ íàæìèòå ëþáóþ êëàâèøó . . ." -STRING_ERROR_DRIVER_NOT_READY, "Óñòðîéñòâî íå ãîòîâî" +STRING_ERROR_PARAMETERF_ERROR, "Некорректный формат параметра - %c\n" +STRING_ERROR_INVALID_SWITCH, "Неверный параметр - /%c\n" +STRING_ERROR_TOO_MANY_PARAMETERS, "Слишком много параметров - %s\n" +STRING_ERROR_PATH_NOT_FOUND, "Путь не найден\n" +STRING_ERROR_FILE_NOT_FOUND, "Файл не найден\n" +STRING_ERROR_REQ_PARAM_MISSING, "Отсутствует необходимый параметр\n" +STRING_ERROR_INVALID_DRIVE, "Ошибочное определение диска\n" +STRING_ERROR_INVALID_PARAM_FORMAT, "Ошибочный формат параметра - %s\n" +STRING_ERROR_BADCOMMAND, "Неправильная команда или неверное имя файла - %s\n" +STRING_ERROR_OUT_OF_MEMORY, "Нехватка памяти.\n" +STRING_ERROR_CANNOTPIPE, "Ошибка! Невозможно использовать pipe! Невозможно создать временный файл!\n" +STRING_ERROR_D_PAUSEMSG, "Для продолжения нажмите любую клавишу . . ." +STRING_ERROR_DRIVER_NOT_READY, "Устройство не готово" -STRING_PATH_ERROR, "CMD: Íå â ñðåäå îêðóæåíèÿ '%s'\n" +STRING_PATH_ERROR, "CMD: Не в среде окружения '%s'\n" STRING_REACTOS_VERSION, "ReactOS Operating System [Version %s-%s]\n" -STRING_CMD_SHELLINFO, "\nÈíòåðïðåòàòîð êîìàíäíîé ñòðîêè ReactOS\nVersion %s %s" -STRING_VERSION_RUNVER, " çàïóùåí íà %s" -STRING_COPY_FILE , " %d ôàéë(îâ) ñêîïèðîâàíî\n" +STRING_CMD_SHELLINFO, "\nИнтерпретатор командной строки ReactOS\nVersion %s %s" +STRING_VERSION_RUNVER, " запущен на %s" +STRING_COPY_FILE , " %d файл(ов) скопировано\n" STRING_DELETE_WIPE, "wiped" -STRING_FOR_ERROR, "íåïðàâèëüíîå çàäàíèå ïåðåìåííîé." -STRING_SCREEN_COL, "íåïðàâèëüíîå çíà÷åíèå äëÿ êîë" -STRING_SCREEN_ROW, "íåïðàâèëüíîå çíà÷åíèå äëÿ ñòð" +STRING_FOR_ERROR, "неправильное задание переменной." +STRING_SCREEN_COL, "неправильное значение для кол" +STRING_SCREEN_ROW, "неправильное значение для стр" STRING_TIMER_TIME "Timer %d is %s: " STRING_MKLINK_CREATED_SYMBOLIC, "Symbolic link created for %s <<===>> %s\n" STRING_MKLINK_CREATED_HARD, "Hard link created for %s <<===>> %s\n" @@ -669,9 +669,9 @@ STRING_MKLINK_CREATED_JUNCTION, "Junction created for %s <<===>> %s\n" STRING_MORE, "More? " STRING_CANCEL_BATCH_FILE, "\r\nCtrl-Break pressed. Cancel batch file? (Yes/No/All) " -STRING_INVALID_OPERAND, "Íåâåðíûé îïåðàíä." -STRING_EXPECTED_CLOSE_PAREN, "Îæèäàåòñÿ ')'." -STRING_EXPECTED_NUMBER_OR_VARIABLE,"Îæèäàåòñÿ ÷èñëî èëè íàçâàíèå ïåðåìåííîé." -STRING_SYNTAX_COMMAND_INCORRECT, "Íåâåðíûé ñèíòàêñèñ êîìàíäû." +STRING_INVALID_OPERAND, "Неверный операнд." +STRING_EXPECTED_CLOSE_PAREN, "Ожидается ')'." +STRING_EXPECTED_NUMBER_OR_VARIABLE,"Ожидается число или название переменной." +STRING_SYNTAX_COMMAND_INCORRECT, "Неверный синтаксис команды." END From 8900f7d5d4c5e4d825fe1ec9074a841e6690e44e Mon Sep 17 00:00:00 2001 From: Rafal Harabien Date: Sun, 27 Mar 2011 01:12:25 +0000 Subject: [PATCH 004/317] [WIN32K] Rename IntResetMonitorSize to IntUpdateMonitorSize Use IntUpdateMonitorSize instead of setting monitor size manually when attaching monitor Change display device name from VIDEOx to DISPLAYx as it is in Windows (fixes user32:monitor winetest) [USER32] Return FALSE in EnumDisplayMonitors if EnumProc returned FALSE (fixes user32:monitor winetest) svn path=/trunk/; revision=51169 --- reactos/dll/win32/user32/misc/display.c | 22 +++++++++------- reactos/subsystems/win32/win32k/eng/device.c | 2 +- .../subsystems/win32/win32k/include/monitor.h | 2 +- .../subsystems/win32/win32k/ntuser/display.c | 2 +- .../subsystems/win32/win32k/ntuser/monitor.c | 26 ++++++------------- 5 files changed, 24 insertions(+), 30 deletions(-) diff --git a/reactos/dll/win32/user32/misc/display.c b/reactos/dll/win32/user32/misc/display.c index 196ff76d369..af430b3bbc1 100644 --- a/reactos/dll/win32/user32/misc/display.c +++ b/reactos/dll/win32/user32/misc/display.c @@ -116,6 +116,7 @@ EnumDisplayMonitors( HMONITOR *hMonitorList; LPRECT pRectList; HANDLE hHeap; + BOOL ret = FALSE; /* get list of monitors/rects */ iCount = NtUserEnumDisplayMonitors(hdc, lprcClip, NULL, NULL, 0); @@ -139,18 +140,15 @@ EnumDisplayMonitors( pRectList = HeapAlloc(hHeap, 0, sizeof (RECT) * iCount); if (pRectList == NULL) { - HeapFree(hHeap, 0, hMonitorList); SetLastError(ERROR_NOT_ENOUGH_MEMORY); - return FALSE; + goto cleanup; } iCount = NtUserEnumDisplayMonitors(hdc, lprcClip, hMonitorList, pRectList, iCount); if (iCount <= 0) { /* FIXME: SetLastError() */ - HeapFree(hHeap, 0, hMonitorList); - HeapFree(hHeap, 0, pRectList); - return FALSE; + goto cleanup; } /* enumerate list */ @@ -167,11 +165,17 @@ EnumDisplayMonitors( } if (!lpfnEnum(hMonitor, hMonitorDC, pMonitorRect, dwData)) - break; + goto cleanup; /* return FALSE */ } - HeapFree(hHeap, 0, hMonitorList); - HeapFree(hHeap, 0, pRectList); - return TRUE; + + ret = TRUE; + +cleanup: + if(hMonitorList) + HeapFree(hHeap, 0, hMonitorList); + if(pRectList) + HeapFree(hHeap, 0, pRectList); + return ret; } diff --git a/reactos/subsystems/win32/win32k/eng/device.c b/reactos/subsystems/win32/win32k/eng/device.c index 802bcf50e4f..b20ad072db2 100644 --- a/reactos/subsystems/win32/win32k/eng/device.c +++ b/reactos/subsystems/win32/win32k/eng/device.c @@ -90,7 +90,7 @@ EngpRegisterGraphicsDevice( pustrDeviceName->Length); /* Create a win device name (FIXME: virtual devices!) */ - swprintf(pGraphicsDevice->szWinDeviceName, L"\\\\.\\VIDEO%d", (int)giDevNum); + swprintf(pGraphicsDevice->szWinDeviceName, L"\\\\.\\DISPLAY%d", (int)giDevNum); /* Allocate a buffer for the strings */ cj = pustrDiplayDrivers->Length + pustrDescription->Length + sizeof(WCHAR); diff --git a/reactos/subsystems/win32/win32k/include/monitor.h b/reactos/subsystems/win32/win32k/include/monitor.h index 280864fb7cb..cc42f0d1edb 100644 --- a/reactos/subsystems/win32/win32k/include/monitor.h +++ b/reactos/subsystems/win32/win32k/include/monitor.h @@ -40,7 +40,7 @@ NTSTATUS CleanupMonitorImpl(VOID); NTSTATUS IntAttachMonitor(PDEVOBJ *pGdiDevice, ULONG DisplayNumber); NTSTATUS IntDetachMonitor(PDEVOBJ *pGdiDevice); -NTSTATUS IntResetMonitorSize(IN PDEVOBJ *pGdiDevice); +NTSTATUS IntUpdateMonitorSize(IN PDEVOBJ *pGdiDevice); PMONITOR FASTCALL UserGetMonitorObject(IN HMONITOR); PMONITOR FASTCALL IntGetPrimaryMonitor(VOID); diff --git a/reactos/subsystems/win32/win32k/ntuser/display.c b/reactos/subsystems/win32/win32k/ntuser/display.c index 98b93d5ddf7..76c0d25f315 100644 --- a/reactos/subsystems/win32/win32k/ntuser/display.c +++ b/reactos/subsystems/win32/win32k/ntuser/display.c @@ -766,7 +766,7 @@ UserChangeDisplaySettings( //IntvGetDeviceCaps(&PrimarySurface, &GdiHandleTable->DevCaps); /* Set new size of the monitor */ - IntResetMonitorSize(ppdev); + IntUpdateMonitorSize(ppdev); /* Remove all cursor clipping */ UserClipCursor(NULL); diff --git a/reactos/subsystems/win32/win32k/ntuser/monitor.c b/reactos/subsystems/win32/win32k/ntuser/monitor.c index 935be89cf12..83ea41a1b9b 100644 --- a/reactos/subsystems/win32/win32k/ntuser/monitor.c +++ b/reactos/subsystems/win32/win32k/ntuser/monitor.c @@ -157,17 +157,8 @@ IntAttachMonitor(IN PDEVOBJ *pGdiDevice, } Monitor->GdiDevice = pGdiDevice; - Monitor->rcMonitor.left = 0; - Monitor->rcMonitor.top = 0; - Monitor->rcMonitor.right = Monitor->rcMonitor.left + pGdiDevice->gdiinfo.ulHorzRes; - Monitor->rcMonitor.bottom = Monitor->rcMonitor.top + pGdiDevice->gdiinfo.ulVertRes; - Monitor->rcWork = Monitor->rcMonitor; Monitor->cWndStack = 0; - Monitor->hrgnMonitor = IntSysCreateRectRgnIndirect( &Monitor->rcMonitor ); - - IntGdiSetRegionOwner(Monitor->hrgnMonitor, GDI_OBJ_HMGR_PUBLIC); - if (gMonitorList == NULL) { DPRINT("Primary monitor is beeing attached\n"); @@ -184,6 +175,8 @@ IntAttachMonitor(IN PDEVOBJ *pGdiDevice, } Monitor->Prev = p; } + + IntUpdateMonitorSize(pGdiDevice); return STATUS_SUCCESS; } @@ -246,7 +239,7 @@ IntDetachMonitor(IN PDEVOBJ *pGdiDevice) return STATUS_SUCCESS; } -/* IntResetMonitorSize +/* IntUpdateMonitorSize * * Reset size of the monitor using atached device * @@ -259,7 +252,7 @@ IntDetachMonitor(IN PDEVOBJ *pGdiDevice) * Returns a NTSTATUS */ NTSTATUS -IntResetMonitorSize(IN PDEVOBJ *pGdiDevice) +IntUpdateMonitorSize(IN PDEVOBJ *pGdiDevice) { PMONITOR Monitor; @@ -701,13 +694,10 @@ NtUserGetMonitorInfo( /* fill device name */ if (MonitorInfo.cbSize == sizeof (MONITORINFOEXW)) { - WCHAR nul = L'\0'; - INT len = Monitor->DeviceName.Length; - if (len >= CCHDEVICENAME * sizeof (WCHAR)) - len = (CCHDEVICENAME - 1) * sizeof (WCHAR); - - memcpy(MonitorInfo.szDevice, Monitor->DeviceName.Buffer, len); - memcpy(MonitorInfo.szDevice + (len / sizeof (WCHAR)), &nul, sizeof (WCHAR)); + RtlStringCbCopyNW(MonitorInfo.szDevice, + sizeof(MonitorInfo.szDevice), + Monitor->DeviceName.Buffer, + Monitor->DeviceName.Length); } /* output data */ From 34bb47605692747a889bc652c87d34d1d1e9fc2d Mon Sep 17 00:00:00 2001 From: James Tabor Date: Sun, 27 Mar 2011 05:40:30 +0000 Subject: [PATCH 005/317] [GDI32] - Finish object attribute support. svn path=/trunk/; revision=51170 --- reactos/dll/win32/gdi32/misc/misc.c | 62 ++++++++++++++++++------- reactos/dll/win32/gdi32/objects/brush.c | 2 + reactos/dll/win32/gdi32/objects/pen.c | 24 +++++++++- 3 files changed, 70 insertions(+), 18 deletions(-) diff --git a/reactos/dll/win32/gdi32/misc/misc.c b/reactos/dll/win32/gdi32/misc/misc.c index 8fedb8fb820..25ff84253de 100644 --- a/reactos/dll/win32/gdi32/misc/misc.c +++ b/reactos/dll/win32/gdi32/misc/misc.c @@ -275,7 +275,7 @@ HGDIOBJ FASTCALL hGetPEBHandle(HANDLECACHETYPE Type, COLORREF cr) { - int Number; + int Number, Count, MaxNum, GdiType; HANDLE Lock; HGDIOBJ Handle = NULL; @@ -287,26 +287,54 @@ hGetPEBHandle(HANDLECACHETYPE Type, COLORREF cr) Number = GdiHandleCache->ulNumHandles[Type]; - if ( Number && Number <= CACHE_REGION_ENTRIES ) + if (Type == hctBrushHandle) { - if ( Type == hctRegionHandle) - { - PRGN_ATTR pRgn_Attr; - HGDIOBJ *hPtr; - hPtr = GdiHandleCache->Handle + CACHE_BRUSH_ENTRIES+CACHE_PEN_ENTRIES; - Handle = hPtr[Number - 1]; + Count = 0; + MaxNum = CACHE_BRUSH_ENTRIES; + GdiType = GDILoObjType_LO_BRUSH_TYPE; + } + else if (Type == hctPenHandle) + { + Count = CACHE_BRUSH_ENTRIES; + MaxNum = CACHE_PEN_ENTRIES; + GdiType = GDILoObjType_LO_PEN_TYPE; + } + else if (Type == hctRegionHandle) + { + Count = CACHE_BRUSH_ENTRIES+CACHE_PEN_ENTRIES; + MaxNum = CACHE_REGION_ENTRIES; + GdiType = GDILoObjType_LO_REGION_TYPE; + } + else // Font is not supported here. + { + return Handle; + } - if (GdiGetHandleUserData( Handle, GDI_OBJECT_TYPE_REGION, (PVOID) &pRgn_Attr)) - { - if (pRgn_Attr->AttrFlags & ATTR_CACHED) + if ( Number && Number <= MaxNum ) + { + PBRUSH_ATTR pBrush_Attr; + HGDIOBJ *hPtr; + hPtr = GdiHandleCache->Handle + Count; + Handle = hPtr[Number - 1]; + + if (GdiGetHandleUserData( Handle, GdiType, (PVOID) &pBrush_Attr)) + { + if (pBrush_Attr->AttrFlags & ATTR_CACHED) + { + DPRINT("Get Handle! Type %d Count %d PEB 0x%x\n", Type, GdiHandleCache->ulNumHandles[Type], NtCurrentTeb()->ProcessEnvironmentBlock); + pBrush_Attr->AttrFlags &= ~ATTR_CACHED; + hPtr[Number - 1] = NULL; + GdiHandleCache->ulNumHandles[Type]--; + if ( Type == hctBrushHandle ) // Handle only brush. + { + if ( pBrush_Attr->lbColor != cr ) { - DPRINT("Get Handle! Count %d PEB 0x%x\n", GdiHandleCache->ulNumHandles[Type], NtCurrentTeb()->ProcessEnvironmentBlock); - pRgn_Attr->AttrFlags &= ~ATTR_CACHED; - hPtr[Number - 1] = NULL; - GdiHandleCache->ulNumHandles[Type]--; + pBrush_Attr->lbColor = cr ; + pBrush_Attr->AttrFlags |= ATTR_NEW_COLOR; } - } - } + } + } + } } (void)InterlockedExchangePointer((PVOID*)&GdiHandleCache->ulLock, Lock); return Handle; diff --git a/reactos/dll/win32/gdi32/objects/brush.c b/reactos/dll/win32/gdi32/objects/brush.c index 185bed6c3fb..e1b7f2951e5 100644 --- a/reactos/dll/win32/gdi32/objects/brush.c +++ b/reactos/dll/win32/gdi32/objects/brush.c @@ -234,6 +234,8 @@ CreateBrushIndirect( break; case BS_SOLID: +/* hBrush = hGetPEBHandle(hctBrushHandle, LogBrush->lbColor); + if (!hBrush)*/ hBrush = NtGdiCreateSolidBrush(LogBrush->lbColor, 0); break; diff --git a/reactos/dll/win32/gdi32/objects/pen.c b/reactos/dll/win32/gdi32/objects/pen.c index 0a431c20049..dbbe0f2de2b 100644 --- a/reactos/dll/win32/gdi32/objects/pen.c +++ b/reactos/dll/win32/gdi32/objects/pen.c @@ -23,12 +23,34 @@ CreatePen( int nWidth, COLORREF crColor) { - /* FIXME Some part need be done in user mode */ +/* HPEN hPen; + PBRUSH_ATTR Pen_Attr; +*/ + if (nPenStyle < PS_SOLID) nPenStyle = PS_SOLID; if (nPenStyle > PS_DASHDOTDOT) { if (nPenStyle == PS_NULL) return GetStockObject(NULL_PEN); if (nPenStyle != PS_INSIDEFRAME) nPenStyle = PS_SOLID; } +#if 0 + hPen = hGetPEBHandle(hctPenHandle, nPenStyle); + if ( nWidth || nPenStyle || !hPen ) + { + return NtGdiCreatePen(nPenStyle, nWidth, crColor, NULL); + } + + if ((GdiGetHandleUserData( hPen, GDI_OBJECT_TYPE_PEN, (PVOID) &Pen_Attr)) && + ( Pen_Attr != NULL )) + { + if ( Pen_Attr->lbColor != crColor) + { + Pen_Attr->lbColor = crColor; + Pen_Attr->AttrFlags |= ATTR_NEW_COLOR; + } + return hPen; + } + DeleteObject(hPen); +#endif return NtGdiCreatePen(nPenStyle, nWidth, crColor, NULL); } From 828d04705abceafa449057ca35aa2d71332282ae Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Sun, 27 Mar 2011 11:32:55 +0000 Subject: [PATCH 006/317] [NTOS/MM] - Return STATUS_IMAGE_NOT_AT_BASE when mapping an image section to a different base address. New ntdll loader depends on this and fails to relocate the image if this status is not returned. svn path=/trunk/; revision=51171 --- reactos/ntoskrnl/mm/section.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/reactos/ntoskrnl/mm/section.c b/reactos/ntoskrnl/mm/section.c index aa092adf41d..83471dd5efc 100644 --- a/reactos/ntoskrnl/mm/section.c +++ b/reactos/ntoskrnl/mm/section.c @@ -4571,6 +4571,7 @@ MmMapViewOfSection(IN PVOID SectionObject, PMMSUPPORT AddressSpace; ULONG ViewOffset; NTSTATUS Status = STATUS_SUCCESS; + BOOLEAN NotAtBase = FALSE; if ((ULONG_PTR)SectionObject & 1) { @@ -4652,6 +4653,8 @@ MmMapViewOfSection(IN PVOID SectionObject, MmUnlockAddressSpace(AddressSpace); return(STATUS_UNSUCCESSFUL); } + /* Remember that we loaded image at a different base address */ + NotAtBase = TRUE; } for (i = 0; i < NrSegments; i++) @@ -4756,7 +4759,12 @@ MmMapViewOfSection(IN PVOID SectionObject, MmUnlockAddressSpace(AddressSpace); - return(STATUS_SUCCESS); + if (NotAtBase) + Status = STATUS_IMAGE_NOT_AT_BASE; + else + Status = STATUS_SUCCESS; + + return Status; } /* From 4288ba63064d3c8b754146db19bf7ff0855d1d7b Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sun, 27 Mar 2011 13:12:12 +0000 Subject: [PATCH 007/317] [SERVICES] ScmWriteDependencies: - Fixed an off-by-one bug. This bug caused a wrong calculation of the 'DependOnGroup' value data length. Group dependencies were not written properly to the registry. - Write 'DependOnService' and 'DependOnService' values to the registry only if the dependency strings are not empty. Delete a value if the corresponding dependency string is empty. This fixes another winetest. svn path=/trunk/; revision=51172 --- reactos/base/system/services/config.c | 42 ++++++++++++++++++--------- 1 file changed, 29 insertions(+), 13 deletions(-) diff --git a/reactos/base/system/services/config.c b/reactos/base/system/services/config.c index b056af5c86c..bcde1d47198 100644 --- a/reactos/base/system/services/config.c +++ b/reactos/base/system/services/config.c @@ -125,7 +125,7 @@ ScmWriteDependencies(HKEY hServiceKey, lpDst = lpGroupDeps; while (*lpSrc != 0) { - dwLength = wcslen(lpSrc); + dwLength = wcslen(lpSrc) + 1; if (*lpSrc == SC_GROUP_IDENTIFIERW) { lpSrc++; @@ -157,21 +157,37 @@ ScmWriteDependencies(HKEY hServiceKey, *lpDst = 0; dwServiceLength++; - dwError = RegSetValueExW(hServiceKey, - L"DependOnGroup", - 0, - REG_MULTI_SZ, - (LPBYTE)lpGroupDeps, - dwGroupLength * sizeof(WCHAR)); + if (dwGroupLength > 1) + { + dwError = RegSetValueExW(hServiceKey, + L"DependOnGroup", + 0, + REG_MULTI_SZ, + (LPBYTE)lpGroupDeps, + dwGroupLength * sizeof(WCHAR)); + } + else + { + RegDeleteValueW(hServiceKey, + L"DependOnGroup"); + } if (dwError == ERROR_SUCCESS) { - dwError = RegSetValueExW(hServiceKey, - L"DependOnService", - 0, - REG_MULTI_SZ, - (LPBYTE)lpServiceDeps, - dwServiceLength * sizeof(WCHAR)); + if (dwServiceLength > 1) + { + dwError = RegSetValueExW(hServiceKey, + L"DependOnService", + 0, + REG_MULTI_SZ, + (LPBYTE)lpServiceDeps, + dwServiceLength * sizeof(WCHAR)); + } + else + { + RegDeleteValueW(hServiceKey, + L"DependOnService"); + } } HeapFree(GetProcessHeap(), 0, lpGroupDeps); From 29b96f834c0476653c66c63b11bd9217e15618d6 Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Sun, 27 Mar 2011 16:37:26 +0000 Subject: [PATCH 008/317] - Lay out critical system DLLs so that they don't overlap when loaded properly. svn path=/trunk/; revision=51173 --- reactos/baseaddress.rbuild | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/reactos/baseaddress.rbuild b/reactos/baseaddress.rbuild index 6d5988ca988..489cd673514 100644 --- a/reactos/baseaddress.rbuild +++ b/reactos/baseaddress.rbuild @@ -244,13 +244,13 @@ - - - - - - - + + + + + + + From 91eff339fd8ccd4201568b0a3c3cbe1cc07e61d3 Mon Sep 17 00:00:00 2001 From: Daniel Reimer Date: Sun, 27 Mar 2011 18:34:22 +0000 Subject: [PATCH 009/317] Update the Applications to the recent Versions. Add the dlls the C,VB etc Runtime Packs will install into the description. Remove goOO from rapps. svn path=/trunk/; revision=51175 --- .../applications/rapps/rapps/comctl32ocx.txt | 2 +- .../applications/rapps/rapps/firefox36.txt | 18 +++++------ .../base/applications/rapps/rapps/go-oo.txt | 27 ---------------- .../applications/rapps/rapps/libreoffice.txt | 6 ++-- .../base/applications/rapps/rapps/mfc40.txt | 2 +- .../applications/rapps/rapps/mirandaim.txt | 4 +-- .../base/applications/rapps/rapps/msxml3.txt | 4 +-- .../base/applications/rapps/rapps/scite.txt | 4 +-- .../applications/rapps/rapps/seamonkey.txt | 14 ++++---- .../base/applications/rapps/rapps/tahoma.txt | 2 +- .../base/applications/rapps/rapps/vb5run.txt | 2 +- .../base/applications/rapps/rapps/vb6run.txt | 2 +- .../applications/rapps/rapps/vc2005run.txt | 32 ------------------- .../applications/rapps/rapps/vc2005sp1run.txt | 2 +- .../applications/rapps/rapps/vc2008run.txt | 32 ------------------- .../applications/rapps/rapps/vc2008sp1run.txt | 2 +- .../base/applications/rapps/rapps/vc6run.txt | 2 +- reactos/base/applications/rapps/rapps/vlc.txt | 6 ++-- 18 files changed, 36 insertions(+), 127 deletions(-) delete mode 100644 reactos/base/applications/rapps/rapps/go-oo.txt delete mode 100644 reactos/base/applications/rapps/rapps/vc2005run.txt delete mode 100644 reactos/base/applications/rapps/rapps/vc2008run.txt diff --git a/reactos/base/applications/rapps/rapps/comctl32ocx.txt b/reactos/base/applications/rapps/rapps/comctl32ocx.txt index b0aac593814..47494f3fb43 100644 --- a/reactos/base/applications/rapps/rapps/comctl32ocx.txt +++ b/reactos/base/applications/rapps/rapps/comctl32ocx.txt @@ -4,7 +4,7 @@ Name = Microsoft Visual Basic 6.0 Common Controls Version = 6.0 Licence = Unknown -Description = File needed by some applications. +Description = File needed by some applications. Contains: comctl32.ocx, mscomctl.ocx, advpack.dll. Size = 914kB Category = 14 URLSite = http://www.microsoft.com/downloads/details.aspx?FamilyID=25437D98-51D0-41C1-BB14-64662F5F62FE&displaylang=en diff --git a/reactos/base/applications/rapps/rapps/firefox36.txt b/reactos/base/applications/rapps/rapps/firefox36.txt index 4f5d3b8c96b..207565f77b1 100644 --- a/reactos/base/applications/rapps/rapps/firefox36.txt +++ b/reactos/base/applications/rapps/rapps/firefox36.txt @@ -2,53 +2,53 @@ [Section] Name = Mozilla Firefox 3.6 -Version = 3.6.15 +Version = 3.6.16 Licence = MPL/GPL/LGPL Description = The most popular and one of the best free Web Browsers out there. Size = 8.2M Category = 5 URLSite = http://www.mozilla.com/en-US/ -URLDownload = http://mozilla.cdn.leaseweb.com/firefox/releases/3.6.15/win32/en-US/Firefox%20Setup%203.6.15.exe +URLDownload = http://mozilla.cdn.leaseweb.com/firefox/releases/3.6.16/win32/en-US/Firefox%20Setup%203.6.16.exe CDPath = none [Section.0407] Description = Der populärste und einer der besten freien Webbrowser. Size = 8.1M URLSite = http://www.mozilla-europe.org/de/ -URLDownload = http://mozilla.cdn.leaseweb.com/firefox/releases/3.6.15/win32/de/Firefox%20Setup%203.6.15.exe +URLDownload = http://mozilla.cdn.leaseweb.com/firefox/releases/3.6.16/win32/de/Firefox%20Setup%203.6.16.exe [Section.040a] Description = El más popular y uno de los mejores navegadores web gratuitos que hay. Size = 8.1M URLSite = http://www.mozilla-europe.org/es/ -URLDownload = http://mozilla.cdn.leaseweb.com/firefox/releases/3.6.15/win32/es-ES/Firefox%20Setup%203.6.15.exe +URLDownload = http://mozilla.cdn.leaseweb.com/firefox/releases/3.6.16/win32/es-ES/Firefox%20Setup%203.6.16.exe [Section.040c] Description = Le navigateur web gratuit le plus populaire et l'un des meilleurs. Size = 8.1M URLSite = http://www.mozilla-europe.org/fr/ -URLDownload = http://mozilla.cdn.leaseweb.com/firefox/releases/3.6.15/win32/fr/Firefox%20Setup%203.6.15.exe +URLDownload = http://mozilla.cdn.leaseweb.com/firefox/releases/3.6.16/win32/fr/Firefox%20Setup%203.6.16.exe [Section.0414] Description = Mest populære og best også gratis nettleserene der ute. Size = 8.1M URLSite = http://www.mozilla-europe.org/no/ -URLDownload = http://mozilla.cdn.leaseweb.com/firefox/releases/3.6.15/win32/nb-NO/Firefox%20Setup%203.6.15.exe +URLDownload = http://mozilla.cdn.leaseweb.com/firefox/releases/3.6.16/win32/nb-NO/Firefox%20Setup%203.6.16.exe [Section.0415] Description = Najpopularniejsza i jedna z najlepszych darmowych przeglądarek internetowych. Size = 8.9M URLSite = http://www.mozilla-europe.org/pl/ -URLDownload = http://mozilla.cdn.leaseweb.com/firefox/releases/3.6.15/win32/pl/Firefox%20Setup%203.6.15.exe +URLDownload = http://mozilla.cdn.leaseweb.com/firefox/releases/3.6.16/win32/pl/Firefox%20Setup%203.6.16.exe [Section.0419] Description = Один из самых популярных и лучших бесплатных браузеров. Size = 8.5M URLSite = http://www.mozilla-europe.org/ru/ -URLDownload = http://mozilla.cdn.leaseweb.com/firefox/releases/3.6.15/win32/ru/Firefox%20Setup%203.6.15.exe +URLDownload = http://mozilla.cdn.leaseweb.com/firefox/releases/3.6.16/win32/ru/Firefox%20Setup%203.6.16.exe [Section.0422] Description = Найпопулярніший та один з кращих безплатних веб-браузерів. Size = 8.5M URLSite = http://www.mozilla-europe.org/uk/ -URLDownload = http://mozilla.cdn.leaseweb.com/firefox/releases/3.6.15/win32/uk/Firefox%20Setup%203.6.15.exe +URLDownload = http://mozilla.cdn.leaseweb.com/firefox/releases/3.6.16/win32/uk/Firefox%20Setup%203.6.16.exe diff --git a/reactos/base/applications/rapps/rapps/go-oo.txt b/reactos/base/applications/rapps/rapps/go-oo.txt deleted file mode 100644 index 28e9fa68f1a..00000000000 --- a/reactos/base/applications/rapps/rapps/go-oo.txt +++ /dev/null @@ -1,27 +0,0 @@ -; UTF-8 - -[Section] -Name = Go-OO -Version = 3.2.1-11 -Licence = LGPL -Description = Open Source Office Suite, based on Open Office, but way better. -Size = 181.0MB -Category = 6 -URLSite = http://www.go-oo.org/ -URLDownload = http://go-oo.mirrorbrain.org/stable/win32/3.2.1/GoOo-3.2.1-11.exe -CDPath = none - -[Section.0407] -Description = Open Source Office Suite, basierend auf Open Office, aber viel besser. - -[Section.040a] -Description = La suite de ofimática de código abierto. - -[Section.040c] -Description = Suite bureautique open source basée sur Open Office, mais bien meilleure. - -[Section.0415] -Description = Otwarty pakiet biurowy, bazujący na Open Office, ale znacznie lepszy. - -[Section.0422] -Description = Відкритий офісний пакет. diff --git a/reactos/base/applications/rapps/rapps/libreoffice.txt b/reactos/base/applications/rapps/rapps/libreoffice.txt index 93805ef8f7d..d609e3f80b4 100644 --- a/reactos/base/applications/rapps/rapps/libreoffice.txt +++ b/reactos/base/applications/rapps/rapps/libreoffice.txt @@ -2,13 +2,13 @@ [Section] Name = LibreOffice -Version = 3.3.1 +Version = 3.3.2 Licence = LGPL Description = Former called OpenOffice. Open Source Office Suite. -Size = 213.4MB +Size = 214.0MB Category = 6 URLSite = http://www.documentfoundation.org/ -URLDownload = http://download.documentfoundation.org/libreoffice/stable/3.3.1/win/x86/LibO_3.3.1_Win_x86_install_multi.exe +URLDownload = http://download.documentfoundation.org/libreoffice/stable/3.3.2/win/x86/LibO_3.3.2_Win_x86_install_multi.exe CDPath = none [Section.0407] diff --git a/reactos/base/applications/rapps/rapps/mfc40.txt b/reactos/base/applications/rapps/rapps/mfc40.txt index 58e1f4ebe02..b732baa385e 100644 --- a/reactos/base/applications/rapps/rapps/mfc40.txt +++ b/reactos/base/applications/rapps/rapps/mfc40.txt @@ -4,7 +4,7 @@ Name = OLE Viewer and Microsoft Foundation Classes version 4 Version = 4.0 Licence = Unknown -Description = MFC 4 is needed by some applications. +Description = MFC 4 is needed by some applications. Contains: mfc40.dll, msvcrt40.dll. Size = 865kB Category = 14 URLSite = http://support.microsoft.com/kb/122244/ diff --git a/reactos/base/applications/rapps/rapps/mirandaim.txt b/reactos/base/applications/rapps/rapps/mirandaim.txt index 68ff3854ab0..9e1198eb888 100644 --- a/reactos/base/applications/rapps/rapps/mirandaim.txt +++ b/reactos/base/applications/rapps/rapps/mirandaim.txt @@ -2,13 +2,13 @@ [Section] Name = Miranda IM -Version = 0.9.17 +Version = 0.9.18 Licence = GPL Description = Open source multiprotocol instant messaging application - May not work completely. Size = 3.0MB Category = 5 URLSite = http://www.miranda-im.org/ -URLDownload = http://miranda.googlecode.com/files/miranda-im-v0.9.17-unicode.exe +URLDownload = http://miranda.googlecode.com/files/miranda-im-v0.9.18-unicode.exe CDPath = none [Section.0407] diff --git a/reactos/base/applications/rapps/rapps/msxml3.txt b/reactos/base/applications/rapps/rapps/msxml3.txt index 788488af34c..d023aa69db9 100644 --- a/reactos/base/applications/rapps/rapps/msxml3.txt +++ b/reactos/base/applications/rapps/rapps/msxml3.txt @@ -4,11 +4,11 @@ Name = Microsoft XML 3 Version = 3.0 Licence = Unknown -Description = MSXML3 is needed for some MSI Installers. +Description = MSXML3 is needed for some MSI Installers. Contains: msxml3.dll, msxml3a.dll, msxml3r.dll. Size = 1.0MB Category = 14 URLSite = http://www.microsoft.com/downloads/details.aspx?FamilyID=28494391-052B-42FF-9674-F752BDCA9582&displaylang=en -URLDownload = http://download.microsoft.com/download/8/8/8/888f34b7-4f54-4f06-8dac-fa29b19f33dd/msxml3.msi +URLDownload = ftp://ftp.uni-rostock.de/pub/tools/microsoft/XML/US/msxml3.msi CDPath = none [Section.0407] diff --git a/reactos/base/applications/rapps/rapps/scite.txt b/reactos/base/applications/rapps/rapps/scite.txt index a323c6d24a1..b9e287e025a 100644 --- a/reactos/base/applications/rapps/rapps/scite.txt +++ b/reactos/base/applications/rapps/rapps/scite.txt @@ -2,13 +2,13 @@ [Section] Name = SciTE -Version = 2.24 +Version = 2.25 Licence = Freeware Description = SciTE is a SCIntilla based Text Editor. Originally built to demonstrate Scintilla, it has grown to be a generally useful editor with facilities for building and running programs. Size = 0.6M Category = 7 URLSite = http://www.scintilla.org/ -URLDownload = http://kent.dl.sourceforge.net/project/scintilla/SciTE/2.24/Sc224.exe +URLDownload = http://kent.dl.sourceforge.net/project/scintilla/SciTE/2.25/Sc225.exe CDPath = none [Section.0407] diff --git a/reactos/base/applications/rapps/rapps/seamonkey.txt b/reactos/base/applications/rapps/rapps/seamonkey.txt index 2564895cac8..48579604d39 100644 --- a/reactos/base/applications/rapps/rapps/seamonkey.txt +++ b/reactos/base/applications/rapps/rapps/seamonkey.txt @@ -2,36 +2,36 @@ [Section] Name = Mozilla SeaMonkey -Version = 2.0.12 +Version = 2.0.13 Licence = MPL/GPL/LGPL Description = Mozilla Suite is alive. This is the one and only Browser, Mail, Chat, and Composer bundle you will ever need. Size = 10.2MB Category = 5 URLSite = http://www.seamonkey-project.org/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/seamonkey/releases/2.0.12/win32/en-US/SeaMonkey%20Setup%202.0.12.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/seamonkey/releases/2.0.13/win32/en-US/SeaMonkey%20Setup%202.0.13.exe CDPath = none [Section.0407] Description = Mozilla Suite lebt. Dies ist das einzige Browser-, Mail-, Chat- and Composerwerkzeug-Bundle welches Sie benötigen. Size = 10.1MB -URLDownload = http://releases.mozilla.org/pub/mozilla.org/seamonkey/releases/2.0.12/win32/de/SeaMonkey%20Setup%202.0.12.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/seamonkey/releases/2.0.13/win32/de/SeaMonkey%20Setup%202.0.13.exe [Section.040a] Description = La suite de Mozilla está viva. Es el primero y único navegador web, gestor de correo, lector de noticias, Chat y editor HTML que necesitarás. Size = 10.1MB -URLDownload = http://releases.mozilla.org/pub/mozilla.org/seamonkey/releases/2.0.12/win32/es-ES/SeaMonkey%20Setup%202.0.12.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/seamonkey/releases/2.0.13/win32/es-ES/SeaMonkey%20Setup%202.0.13.exe [Section.040c] Description = La suite Mozilla est en vie. Ceci est le seul et l'unique package navigateur, client mail, client chat et composer dont vous aurez besoin. Size = 10.1MB -URLDownload = http://releases.mozilla.org/pub/mozilla.org/seamonkey/releases/2.0.12/win32/fr/SeaMonkey%20Setup%202.0.12.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/seamonkey/releases/2.0.13/win32/fr/SeaMonkey%20Setup%202.0.13.exe [Section.0415] Description = Pakiet Mozilla żyje. W zestawie: przeglądarka, klient poczty, IRC oraz Edytor HTML - wszystko, czego potrzebujesz. Size = 11.0MB -URLDownload = http://releases.mozilla.org/pub/mozilla.org/seamonkey/releases/2.0.12/win32/pl/SeaMonkey%20Setup%202.0.12.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/seamonkey/releases/2.0.13/win32/pl/SeaMonkey%20Setup%202.0.13.exe [Section.0419] Description = Продолжение Mozilla Suite. Включает браузер, почтовый клиент, IRC-клиент и HTML-редактор. Size = 10.5MB -URLDownload = http://releases.mozilla.org/pub/mozilla.org/seamonkey/releases/2.0.12/win32/ru/SeaMonkey%20Setup%202.0.12.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/seamonkey/releases/2.0.13/win32/ru/SeaMonkey%20Setup%202.0.13.exe diff --git a/reactos/base/applications/rapps/rapps/tahoma.txt b/reactos/base/applications/rapps/rapps/tahoma.txt index 68181fd4e0e..41addaf0e6a 100644 --- a/reactos/base/applications/rapps/rapps/tahoma.txt +++ b/reactos/base/applications/rapps/rapps/tahoma.txt @@ -4,7 +4,7 @@ Name = Microsoft Tahoma Font Version = 1.0 Licence = Unknown -Description = Tahoma Font pack needed by some apps (Steam). +Description = Tahoma Font pack needed by some apps (Steam). Contains: Tahoma.tff, Tahomabd.ttf. Size = 305kB Category = 14 URLSite = http://support.microsoft.com/ diff --git a/reactos/base/applications/rapps/rapps/vb5run.txt b/reactos/base/applications/rapps/rapps/vb5run.txt index 12fb70ef3e9..a2847618589 100644 --- a/reactos/base/applications/rapps/rapps/vb5run.txt +++ b/reactos/base/applications/rapps/rapps/vb5run.txt @@ -4,7 +4,7 @@ Name = Visual Basic 5 Runtime Version = 5.0 Licence = Unknown -Description = Visual Basic 5 Runtime. +Description = Visual Basic 5 Runtime. Contains: advpack.dll, asycfilt.dll, comcat.dll, msvbvm50.dll, oleaut32.dll, olepro32.dll. Size = 970kB Category = 14 URLSite = http://support.microsoft.com/kb/180071/ diff --git a/reactos/base/applications/rapps/rapps/vb6run.txt b/reactos/base/applications/rapps/rapps/vb6run.txt index 542b977c95d..a7f34a12ed6 100644 --- a/reactos/base/applications/rapps/rapps/vb6run.txt +++ b/reactos/base/applications/rapps/rapps/vb6run.txt @@ -4,7 +4,7 @@ Name = Visual Basic 6 Runtime Version = 6.0 Licence = Unknown -Description = Visual Basic 6 Runtime. +Description = Visual Basic 6 Runtime. Contains: advpack.dll, asycfilt.dll, comcat.dll, msvbvm60.dll, oleaut32.dll, olepro32.dll. Size = 1.0MB Category = 14 URLSite = http://support.microsoft.com/kb/192461/ diff --git a/reactos/base/applications/rapps/rapps/vc2005run.txt b/reactos/base/applications/rapps/rapps/vc2005run.txt deleted file mode 100644 index 50b68787d2c..00000000000 --- a/reactos/base/applications/rapps/rapps/vc2005run.txt +++ /dev/null @@ -1,32 +0,0 @@ -; UTF-8 - -[Section] -Name = Microsoft Visual C++ 2005 Redistributable Package -Version = 7.0 -Licence = Unknown -Description = Visual Studio 2005 Runtime. -Size = 2.6MB -Category = 14 -URLSite = http://www.microsoft.com/Downloads/details.aspx?displaylang=en&FamilyID=32bc1bee-a3f9-4c13-9c99-220b62a191ee -URLDownload = http://download.microsoft.com/download/6/B/B/6BB661D6-A8AE-4819-B79F-236472F6070C/vcredist_x86.exe -CDPath = none - -[Section.0407] -Licence = Unbekannt -Description = Visual Studio 2005 Laufzeitsystem. - -[Section.040a] -Licence = Desconocida -Description = Librerias Visual Studio 2005. - -[Section.040c] -Licence = Inconnue -Description = Bibliothèque Visual Studio 2005. - -[Section.0415] -Licence = Nieznana -Description = Biblioteki uruchomieniowe Visual Studio 2005. - -[Section.0422] -Licence = Невідома -Description = Бібліотеки Visual Studio 2005. diff --git a/reactos/base/applications/rapps/rapps/vc2005sp1run.txt b/reactos/base/applications/rapps/rapps/vc2005sp1run.txt index 40a8a5dee88..b8966eaebc1 100644 --- a/reactos/base/applications/rapps/rapps/vc2005sp1run.txt +++ b/reactos/base/applications/rapps/rapps/vc2005sp1run.txt @@ -4,7 +4,7 @@ Name = Microsoft Visual C++ 2005 SP1 Redistributable Package Version = 7.1 Licence = Unknown -Description = Visual Studio 2005 Runtime SP1. +Description = Visual Studio 2005 Runtime SP1. Contains: atl80.dll, mfc80.dll, mfcm80.dll, mfcm80u.dll, msdia80.dll, msvcm80.dll, msvcp80.dll, msvcr80.dll, vcomp.dll. Size = 2.6MB Category = 14 URLSite = http://www.microsoft.com/downloads/details.aspx?FamilyID=200b2fd9-ae1a-4a14-984d-389c36f85647&displaylang=en diff --git a/reactos/base/applications/rapps/rapps/vc2008run.txt b/reactos/base/applications/rapps/rapps/vc2008run.txt deleted file mode 100644 index b6bf3443feb..00000000000 --- a/reactos/base/applications/rapps/rapps/vc2008run.txt +++ /dev/null @@ -1,32 +0,0 @@ -; UTF-8 - -[Section] -Name = Microsoft Visual C++ 2008 Redistributable Package -Version = 8.0 -Licence = Unknown -Description = Visual Studio 2008 Runtime. -Size = 4.3MB -Category = 14 -URLSite = http://www.microsoft.com/DOWNLOADS/details.aspx?FamilyID=9b2da534-3e03-4391-8a4d-074b9f2bc1bf&displaylang=en -URLDownload = http://download.microsoft.com/download/9/7/7/977B481A-7BA6-4E30-AC40-ED51EB2028F2/vcredist_x86.exe -CDPath = none - -[Section.0407] -Licence = Unbekannt -Description = Visual Studio 2008 Laufzeitsystem. - -[Section.040a] -Licence = Desconocida -Description = Librerias Visual Studio 2008. - -[Section.040c] -Licence = Inconnue -Description = Bibliothèque Visual Studio 2008. - -[Section.0415] -Licence = Nieznana -Description = Biblioteki uruchomieniowe Visual Studio 2008. - -[Section.0422] -Licence = Невідома -Description = Бібліотеки Visual Studio 2008. diff --git a/reactos/base/applications/rapps/rapps/vc2008sp1run.txt b/reactos/base/applications/rapps/rapps/vc2008sp1run.txt index 0f05a041bc6..2743f24c607 100644 --- a/reactos/base/applications/rapps/rapps/vc2008sp1run.txt +++ b/reactos/base/applications/rapps/rapps/vc2008sp1run.txt @@ -4,7 +4,7 @@ Name = Microsoft Visual C++ 2008 SP1 Redistributable Package Version = 8.0 Licence = Unknown -Description = Visual Studio 2008 SP1 Runtime. +Description = Visual Studio 2008 SP1 Runtime. Contains: atl90.dll, mfc90.dll, mfc90u.dll, mfcm90.dll, mfcm90u.dll, msdia90.dll, msvcm90.dll, msvcp90.dll, msvcr90.dll, vcomp90.dll. Size = 4.0MB Category = 14 URLSite = http://www.microsoft.com/downloads/details.aspx?familyid=A5C84275-3B97-4AB7-A40D-3802B2AF5FC2&displaylang=en diff --git a/reactos/base/applications/rapps/rapps/vc6run.txt b/reactos/base/applications/rapps/rapps/vc6run.txt index 9ed5a088034..0f45b98a420 100644 --- a/reactos/base/applications/rapps/rapps/vc6run.txt +++ b/reactos/base/applications/rapps/rapps/vc6run.txt @@ -4,7 +4,7 @@ Name = Microsoft Visual C++ 6 Redistributable Package Version = 6.0 Licence = Unknown -Description = Visual Studio 6 Runtime. +Description = Visual Studio 6 Runtime. Contains: advpack.dll, asycfilt.dll, atla.dll, atlu.dll, comcat.dll, mfc42.dll, mfc42u.dll, msvcirt.dll, msvcp60.dll, msvcrt.dll, oleaut32.dll, olepro32.dll. Size = 1.7MB Category = 14 URLSite = http://support.microsoft.com/kb/259403/ diff --git a/reactos/base/applications/rapps/rapps/vlc.txt b/reactos/base/applications/rapps/rapps/vlc.txt index ae94d897561..0e35475c489 100644 --- a/reactos/base/applications/rapps/rapps/vlc.txt +++ b/reactos/base/applications/rapps/rapps/vlc.txt @@ -2,13 +2,13 @@ [Section] Name = VLC media player -Version = 1.1.7 +Version = 1.1.8 Licence = GPL Description = A media player. -Size = 19.4MB +Size = 19.6MB Category = 1 URLSite = http://www.videolan.org/vlc/ -URLDownload = http://kent.dl.sourceforge.net/project/vlc/1.1.7/win32/vlc-1.1.7-win32.exe +URLDownload = http://kent.dl.sourceforge.net/project/vlc/1.1.8/win32/vlc-1.1.8-win32.exe CDPath = none [Section.0407] From 8174c5cfde298e6e394e9f8053c41678746cd1cb Mon Sep 17 00:00:00 2001 From: Rafal Harabien Date: Sun, 27 Mar 2011 21:51:41 +0000 Subject: [PATCH 010/317] [SYSSETUP] Set HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\InstallDate to install date. Patch by Edijs Kolesnikovics slightly modified by me See issue #6044 for more details. svn path=/trunk/; revision=51176 --- reactos/dll/win32/syssetup/wizard.c | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/reactos/dll/win32/syssetup/wizard.c b/reactos/dll/win32/syssetup/wizard.c index 63d6bc2ed88..7c438ab5ecd 100644 --- a/reactos/dll/win32/syssetup/wizard.c +++ b/reactos/dll/win32/syssetup/wizard.c @@ -1916,11 +1916,30 @@ ProcessPageDlgProc(HWND hwndDlg, static VOID -SetupIsActive( DWORD dw ) +SetInstallationCompleted(VOID) { HKEY hKey = 0; - if (RegOpenKeyExW( HKEY_LOCAL_MACHINE, L"SYSTEM\\Setup", 0, KEY_WRITE, &hKey ) == ERROR_SUCCESS) { - RegSetValueExW( hKey, L"SystemSetupInProgress", 0, REG_DWORD, (CONST BYTE *)&dw, sizeof(dw) ); + DWORD InProgress = 0; + DWORD InstallDate; + + if (RegOpenKeyExW( HKEY_LOCAL_MACHINE, + L"SYSTEM\\Setup", + 0, + KEY_WRITE, + &hKey ) == ERROR_SUCCESS) + { + RegSetValueExW( hKey, L"SystemSetupInProgress", 0, REG_DWORD, (LPBYTE)&InProgress, sizeof(InProgress) ); + RegCloseKey( hKey ); + } + + if (RegOpenKeyExW( HKEY_LOCAL_MACHINE, + L"Software\\Microsoft\\Windows NT\\CurrentVersion", + 0, + KEY_WRITE, + &hKey ) == ERROR_SUCCESS) + { + InstallDate = (DWORD)time(NULL); + RegSetValueExW( hKey, L"InstallDate", 0, REG_DWORD, (LPBYTE)&InstallDate, sizeof(InstallDate) ); RegCloseKey( hKey ); } } @@ -1951,7 +1970,7 @@ FinishDlgProc(HWND hwndDlg, if (SetupData->UnattendSetup) { KillTimer(hwndDlg, 1); - SetupIsActive(0); + SetInstallationCompleted(); PostQuitMessage(0); } } @@ -1959,7 +1978,7 @@ FinishDlgProc(HWND hwndDlg, case WM_DESTROY: { - SetupIsActive(0); + SetInstallationCompleted(); PostQuitMessage(0); return TRUE; } From 54cac2ef9ef3b04d672d2226d0c6a821d22290ef Mon Sep 17 00:00:00 2001 From: Rafal Harabien Date: Sun, 27 Mar 2011 22:47:59 +0000 Subject: [PATCH 011/317] [PING] Fix crash if option, which needs number is on the end of command line Get rid of GetULONG and GetULONG2 functions. MS doesn't check input so precisely Command line options can be preceded by "/" See issue #6047 for more details. svn path=/trunk/; revision=51177 --- reactos/base/applications/network/ping/ping.c | 113 ++++++++---------- 1 file changed, 47 insertions(+), 66 deletions(-) diff --git a/reactos/base/applications/network/ping/ping.c b/reactos/base/applications/network/ping/ping.c index 6f7935e9159..c0bd93201a1 100644 --- a/reactos/base/applications/network/ping/ping.c +++ b/reactos/base/applications/network/ping/ping.c @@ -59,7 +59,6 @@ typedef struct _ICMP_ECHO_PACKET #pragma pack(1) -BOOL InvalidOption; BOOL NeverStop; BOOL ResolveAddresses; UINT PingCount; @@ -213,84 +212,71 @@ static VOID Reset(VOID) } } -/* Return ULONG in a string */ -static ULONG GetULONG(LPWSTR String) -{ - UINT i, Length; - ULONG Value; - LPWSTR StopString; - i = 0; - Length = (UINT)wcslen(String); - while ((i < Length) && ((String[i] < L'0') || (String[i] > L'9'))) i++; - if ((i >= Length) || ((String[i] < L'0') || (String[i] > L'9'))) - { - InvalidOption = TRUE; - return 0; - } - Value = wcstoul(&String[i], &StopString, 10); - - return Value; -} - -/* Return ULONG in a string. Try next paramter if not successful */ -static ULONG GetULONG2(LPWSTR String1, LPWSTR String2, PINT i) -{ - ULONG Value; - - Value = GetULONG(String1); - if (InvalidOption) - { - InvalidOption = FALSE; - if (String2[0] != L'-') - { - Value = GetULONG(String2); - if (!InvalidOption) - *i += 1; - } - } - - return Value; -} - /* Parse command line parameters */ static BOOL ParseCmdline(int argc, LPWSTR argv[]) { INT i; - BOOL ShowUsage; - BOOL FoundTarget; + BOOL FoundTarget = FALSE, InvalidOption = FALSE; + if (argc < 2) - ShowUsage = TRUE; - else - ShowUsage = FALSE; - FoundTarget = FALSE; - InvalidOption = FALSE; + { + Usage(); + return FALSE; + } for (i = 1; i < argc; i++) { - if (argv[i][0] == L'-') + if (argv[i][0] == L'-' || argv[i][0] == L'/') { switch (argv[i][1]) { case L't': NeverStop = TRUE; break; case L'a': ResolveAddresses = TRUE; break; - case L'n': PingCount = GetULONG2(&argv[i][2], argv[i + 1], &i); break; + case L'n': + if (i + 1 < argc) + PingCount = wcstoul(argv[++i], NULL, 0); + else + InvalidOption = TRUE; + break; case L'l': - DataSize = GetULONG2(&argv[i][2], argv[i + 1], &i); - if (DataSize > ICMP_MAXSIZE - sizeof(ICMP_ECHO_PACKET) - sizeof(IPv4_HEADER)) + if (i + 1 < argc) { - FormatOutput(IDS_BAD_VALUE_OPTION_L, ICMP_MAXSIZE - \ - (int)sizeof(ICMP_ECHO_PACKET) - \ - (int)sizeof(IPv4_HEADER)); - return FALSE; - } + DataSize = wcstoul(argv[++i], NULL, 0); + + if (DataSize > ICMP_MAXSIZE - sizeof(ICMP_ECHO_PACKET) - sizeof(IPv4_HEADER)) + { + FormatOutput(IDS_BAD_VALUE_OPTION_L, ICMP_MAXSIZE - \ + (int)sizeof(ICMP_ECHO_PACKET) - \ + (int)sizeof(IPv4_HEADER)); + return FALSE; + } + } else + InvalidOption = TRUE; break; case L'f': DontFragment = TRUE; break; - case L'i': TTLValue = GetULONG2(&argv[i][2], argv[i + 1], &i); break; - case L'v': TOSValue = GetULONG2(&argv[i][2], argv[i + 1], &i); break; - case L'w': Timeout = GetULONG2(&argv[i][2], argv[i + 1], &i); break; + case L'i': + if (i + 1 < argc) + TTLValue = wcstoul(argv[++i], NULL, 0); + else + InvalidOption = TRUE; + break; + case L'v': + if (i + 1 < argc) + TOSValue = wcstoul(argv[++i], NULL, 0); + else + InvalidOption = TRUE; + break; + case L'w': + if (i + 1 < argc) + Timeout = wcstoul(argv[++i], NULL, 0); + else + InvalidOption = TRUE; + break; + case '?': + Usage(); + return FALSE; default: FormatOutput(IDS_BAD_OPTION, argv[i]); - Usage(); return FALSE; } if (InvalidOption) @@ -314,17 +300,12 @@ static BOOL ParseCmdline(int argc, LPWSTR argv[]) } } - if ((!ShowUsage) && (!FoundTarget)) + if (!FoundTarget) { FormatOutput(IDS_DEST_MUST_BE_SPECIFIED); return FALSE; } - if (ShowUsage) - { - Usage(); - return FALSE; - } return TRUE; } From f21acd6f09d2793470d8e2a8230ea99d1d89e03b Mon Sep 17 00:00:00 2001 From: Rafal Harabien Date: Sun, 27 Mar 2011 23:19:56 +0000 Subject: [PATCH 012/317] [USER32] Don't fail if FillRect is called without brush. Fixes user32:uitools winetest svn path=/trunk/; revision=51178 --- reactos/dll/win32/user32/windows/draw.c | 29 ++++++++++++++++--------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/reactos/dll/win32/user32/windows/draw.c b/reactos/dll/win32/user32/windows/draw.c index dd50c75b1c3..1d353289c29 100644 --- a/reactos/dll/win32/user32/windows/draw.c +++ b/reactos/dll/win32/user32/windows/draw.c @@ -1565,19 +1565,28 @@ INT WINAPI FillRect(HDC hDC, CONST RECT *lprc, HBRUSH hbr) { HBRUSH prevhbr; + BOOL Ret; - if (hbr <= (HBRUSH)(COLOR_MENUBAR + 1)) + /* Select brush if specified */ + if (hbr) { - hbr = GetSysColorBrush(PtrToUlong(hbr) - 1); + /* Handle system colors */ + if (hbr <= (HBRUSH)(COLOR_MENUBAR + 1)) + hbr = GetSysColorBrush(PtrToUlong(hbr) - 1); + + prevhbr = SelectObject(hDC, hbr); + if (prevhbr == NULL) + return (INT)FALSE; } - if ((prevhbr = SelectObject(hDC, hbr)) == NULL) - { - return FALSE; - } - PatBlt(hDC, lprc->left, lprc->top, lprc->right - lprc->left, - lprc->bottom - lprc->top, PATCOPY); - SelectObject(hDC, prevhbr); - return TRUE; + + Ret = PatBlt(hDC, lprc->left, lprc->top, lprc->right - lprc->left, + lprc->bottom - lprc->top, PATCOPY); + + /* Select old brush */ + if (hbr) + SelectObject(hDC, prevhbr); + + return (INT)Ret; } /* From 4ef3dbc2255f7bd763c6fff4f2bb7b6e402763a6 Mon Sep 17 00:00:00 2001 From: James Tabor Date: Mon, 28 Mar 2011 00:17:21 +0000 Subject: [PATCH 013/317] [GDI32|User32|Win32k] - Fix ScrollDC ApiTest. svn path=/trunk/; revision=51179 --- reactos/dll/win32/gdi32/misc/misc.c | 14 ++++++---- reactos/dll/win32/user32/windows/paint.c | 28 +++++++++---------- .../subsystems/win32/win32k/ntuser/painting.c | 5 ++-- .../subsystems/win32/win32k/objects/region.c | 21 +++++++++++--- 4 files changed, 43 insertions(+), 25 deletions(-) diff --git a/reactos/dll/win32/gdi32/misc/misc.c b/reactos/dll/win32/gdi32/misc/misc.c index 25ff84253de..dac9a73a8ff 100644 --- a/reactos/dll/win32/gdi32/misc/misc.c +++ b/reactos/dll/win32/gdi32/misc/misc.c @@ -275,7 +275,7 @@ HGDIOBJ FASTCALL hGetPEBHandle(HANDLECACHETYPE Type, COLORREF cr) { - int Number, Count, MaxNum, GdiType; + int Number, Offset, MaxNum, GdiType; HANDLE Lock; HGDIOBJ Handle = NULL; @@ -289,19 +289,19 @@ hGetPEBHandle(HANDLECACHETYPE Type, COLORREF cr) if (Type == hctBrushHandle) { - Count = 0; + Offset = 0; MaxNum = CACHE_BRUSH_ENTRIES; GdiType = GDILoObjType_LO_BRUSH_TYPE; } else if (Type == hctPenHandle) { - Count = CACHE_BRUSH_ENTRIES; + Offset = CACHE_BRUSH_ENTRIES; MaxNum = CACHE_PEN_ENTRIES; GdiType = GDILoObjType_LO_PEN_TYPE; } else if (Type == hctRegionHandle) { - Count = CACHE_BRUSH_ENTRIES+CACHE_PEN_ENTRIES; + Offset = CACHE_BRUSH_ENTRIES+CACHE_PEN_ENTRIES; MaxNum = CACHE_REGION_ENTRIES; GdiType = GDILoObjType_LO_REGION_TYPE; } @@ -314,7 +314,7 @@ hGetPEBHandle(HANDLECACHETYPE Type, COLORREF cr) { PBRUSH_ATTR pBrush_Attr; HGDIOBJ *hPtr; - hPtr = GdiHandleCache->Handle + Count; + hPtr = GdiHandleCache->Handle + Offset; Handle = hPtr[Number - 1]; if (GdiGetHandleUserData( Handle, GdiType, (PVOID) &pBrush_Attr)) @@ -335,6 +335,10 @@ hGetPEBHandle(HANDLECACHETYPE Type, COLORREF cr) } } } + else + { + Handle = NULL; + } } (void)InterlockedExchangePointer((PVOID*)&GdiHandleCache->ulLock, Lock); return Handle; diff --git a/reactos/dll/win32/user32/windows/paint.c b/reactos/dll/win32/user32/windows/paint.c index 433577eedf5..dff5f98afd3 100644 --- a/reactos/dll/win32/user32/windows/paint.c +++ b/reactos/dll/win32/user32/windows/paint.c @@ -107,19 +107,19 @@ GetUpdateRect( pWnd = ValidateHwnd(Wnd); if (!pWnd) return FALSE; -/* + if ( pWnd->hrgnUpdate || pWnd->state & (WNDS_SENDERASEBACKGROUND|WNDS_SENDNCPAINT|WNDS_UPDATEDIRTY|WNDS_PAINTNOTPROCESSED)) - {*/ + { return NtUserGetUpdateRect(Wnd, Rect, Erase); -/* } + } if (Rect) { // Did the Rgn update? No! Back set and shutup! Rect->left = Rect->right = Rect->top = Rect->bottom = 0; } return FALSE; // msdn: "If there is no update region, the return value is zero." -*/ + } @@ -144,14 +144,14 @@ GetUpdateRgn( pWnd = ValidateHwnd(hWnd); if (!pWnd) return ERROR; -/* + if ( pWnd->hrgnUpdate || pWnd->state & (WNDS_SENDERASEBACKGROUND|WNDS_SENDNCPAINT|WNDS_UPDATEDIRTY|WNDS_PAINTNOTPROCESSED)) - {*/ + { return NtUserGetUpdateRgn(hWnd, hRgn, bErase); -/* } + } SetRectRgn(hRgn, 0, 0, 0, 0); - return NULLREGION;*/ + return NULLREGION; } @@ -239,14 +239,14 @@ UpdateWindow( if (!pWnd) return FALSE; -/* + if ( pWnd->hrgnUpdate || pWnd->state & WNDS_INTERNALPAINT || pWnd->spwndChild ) - {*/ + { return NtUserCallHwndLock(hWnd, HWNDLOCK_ROUTINE_UPDATEWINDOW); -/* } - return TRUE;*/ + } + return TRUE; } /* @@ -286,7 +286,7 @@ GetWindowRgn( if (!Ret) return ERROR; - if (pWnd->fnid != FNID_DESKTOP) + if (hWnd != GetDesktopWindow()) // pWnd->fnid != FNID_DESKTOP) Ret = OffsetRgn(hRgn, -pWnd->rcWindow.left, -pWnd->rcWindow.top); if (pWnd->ExStyle & WS_EX_LAYOUTRTL) @@ -320,7 +320,7 @@ GetWindowRgnBox( if (!Ret) return ERROR; - if (pWnd->fnid != FNID_DESKTOP) + if (hWnd != GetDesktopWindow()) // pWnd->fnid != FNID_DESKTOP) OffsetRect(lprc, -pWnd->rcWindow.left, -pWnd->rcWindow.top); if (pWnd->ExStyle & WS_EX_LAYOUTRTL) diff --git a/reactos/subsystems/win32/win32k/ntuser/painting.c b/reactos/subsystems/win32/win32k/ntuser/painting.c index f2e3850437f..48919098be7 100644 --- a/reactos/subsystems/win32/win32k/ntuser/painting.c +++ b/reactos/subsystems/win32/win32k/ntuser/painting.c @@ -1248,6 +1248,7 @@ UserScrollDC( hrgnOwn = hrgnUpdate; if (!NtGdiSetRectRgn(hrgnOwn, rcDst.left, rcDst.top, rcDst.right, rcDst.bottom)) { + DC_UnlockDc(pDC); return ERROR; } } @@ -1265,8 +1266,8 @@ UserScrollDC( NtGdiOffsetRgn(hrgnTmp, dx, dy); Result = NtGdiCombineRgn(hrgnOwn, hrgnOwn, hrgnTmp, RGN_DIFF); - /* DO NOT Unlock DC while messing with prgnVis! */ - DC_UnlockDc(pDC); + /* DO NOT Unlock DC while messing with prgnVis! */ + DC_UnlockDc(pDC); REGION_FreeRgnByHandle(hrgnTmp); diff --git a/reactos/subsystems/win32/win32k/objects/region.c b/reactos/subsystems/win32/win32k/objects/region.c index d0bd3bafc61..38ad6ae7232 100644 --- a/reactos/subsystems/win32/win32k/objects/region.c +++ b/reactos/subsystems/win32/win32k/objects/region.c @@ -2080,6 +2080,7 @@ REGION_AllocUserRgnWithHandle(INT nRgn) { Entry = GDI_HANDLE_GET_ENTRY(GdiHandleTable, pRgn->BaseObject.hHmgr); Entry->UserData = AllocateObjectAttr(); + RtlZeroMemory(Entry->UserData, sizeof(RGN_ATTR)); } return pRgn; } @@ -2090,6 +2091,7 @@ RGNOBJAPI_Lock(HRGN hRgn, PRGN_ATTR *ppRgn_Attr) { PGDI_TABLE_ENTRY Entry; PRGN_ATTR pRgn_Attr; + BOOL Hit = FALSE; PROSRGNDATA pRgn = NULL; pRgn = REGION_LockRgn(hRgn); @@ -2103,11 +2105,12 @@ RGNOBJAPI_Lock(HRGN hRgn, PRGN_ATTR *ppRgn_Attr) { _SEH2_TRY { - if ( !(pRgn_Attr->AttrFlags & ATTR_CACHED) && - pRgn_Attr->AttrFlags & (ATTR_RGN_VALID|ATTR_RGN_DIRTY) ) + if ( !(pRgn_Attr->AttrFlags & ATTR_CACHED) ) { - switch (pRgn_Attr->Flags) + if ( pRgn_Attr->AttrFlags & (ATTR_RGN_VALID|ATTR_RGN_DIRTY) ) { + switch (pRgn_Attr->Flags) + { case NULLREGION: EMPTY_REGION( pRgn ); break; @@ -2119,8 +2122,13 @@ RGNOBJAPI_Lock(HRGN hRgn, PRGN_ATTR *ppRgn_Attr) pRgn_Attr->Rect.right, pRgn_Attr->Rect.bottom ); break; + } + pRgn_Attr->AttrFlags &= ~ATTR_RGN_DIRTY; } - pRgn_Attr->AttrFlags &= ~ATTR_RGN_DIRTY; + } + else + { // This object is cached an waiting for it's resurrection by the users. + Hit = TRUE; } } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) @@ -2128,6 +2136,11 @@ RGNOBJAPI_Lock(HRGN hRgn, PRGN_ATTR *ppRgn_Attr) } _SEH2_END; + if (Hit) + { + REGION_UnlockRgn(pRgn); + return NULL; + } if (ppRgn_Attr) *ppRgn_Attr = pRgn_Attr; } From c5dad4998c9db06200fe3b57995f832b486ea67c Mon Sep 17 00:00:00 2001 From: Rafal Harabien Date: Mon, 28 Mar 2011 20:52:27 +0000 Subject: [PATCH 014/317] [USER32] Fix a bug causing "Attempted to lock object, wrong reuse counter" messages when CMD was started in LiveCD. Once got desktop HDC was used in different threads. When thread, which created handle terminated, DC handle was removed and next calls to CreateIcon* API was using invalid hDC. svn path=/trunk/; revision=51184 --- reactos/dll/win32/user32/windows/cursoricon.c | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/reactos/dll/win32/user32/windows/cursoricon.c b/reactos/dll/win32/user32/windows/cursoricon.c index 32b0ffde97a..e3c5ca13b29 100644 --- a/reactos/dll/win32/user32/windows/cursoricon.c +++ b/reactos/dll/win32/user32/windows/cursoricon.c @@ -458,16 +458,10 @@ static BOOL create_icon_bitmaps( const BITMAPINFO *bmi, int width, int height, void *color_bits, *mask_bits; BOOL ret = FALSE; HDC hdc = 0; - static HDC hScreenDC = 0; if (!(info = HeapAlloc( GetProcessHeap(), 0, max( size, FIELD_OFFSET( BITMAPINFO, bmiColors[2] ))))) return FALSE; - if(!hScreenDC) - { - hScreenDC = GetDC(0); - if(!hScreenDC) goto done; - } - if (!(hdc = CreateCompatibleDC(hScreenDC))) goto done; + if (!(hdc = CreateCompatibleDC(NULL))) goto done; memcpy( info, bmi, size ); info->bmiHeader.biHeight /= 2; @@ -491,8 +485,8 @@ static BOOL create_icon_bitmaps( const BITMAPINFO *bmi, int width, int height, else { if (!(*mask = CreateBitmap( width, height, 1, 1, NULL ))) goto done; - if (!(*color = CreateBitmap( width, height, GetDeviceCaps(hScreenDC, PLANES), - GetDeviceCaps(hScreenDC, BITSPIXEL), NULL ))) + if (!(*color = CreateBitmap( width, height, GetDeviceCaps(hdc, PLANES), + GetDeviceCaps(hdc, BITSPIXEL), NULL ))) { DeleteObject( *mask ); goto done; From 9e22fe596258da312518fc2af47837bf6d4fd3ff Mon Sep 17 00:00:00 2001 From: James Tabor Date: Tue, 29 Mar 2011 02:57:48 +0000 Subject: [PATCH 015/317] [Win32k] - Finish object attribute support part 2. - Removed DC from the list, ReactOS handles this in a different way. Comment out Brush and Pen switches until proper handling is implemented. svn path=/trunk/; revision=51185 --- .../subsystems/win32/win32k/objects/gdiobj.c | 45 +++++++++++++------ 1 file changed, 31 insertions(+), 14 deletions(-) diff --git a/reactos/subsystems/win32/win32k/objects/gdiobj.c b/reactos/subsystems/win32/win32k/objects/gdiobj.c index 6bbca8cddd4..45756ae81bf 100644 --- a/reactos/subsystems/win32/win32k/objects/gdiobj.c +++ b/reactos/subsystems/win32/win32k/objects/gdiobj.c @@ -741,16 +741,22 @@ IsObjectDead(HGDIOBJ hObject) } } - +/* + * Process Environment Cached GDI Handles + * + * What types of GDI handle objects that are cached in the GDI handle buffer? + * Brushes set to BS_SOLID, Pens with widths of zero or set to PS_SOLID, and + * Regions that are set to NULLREGION or SIMPLEREGION. + */ BOOL FASTCALL bPEBCacheHandle(HGDIOBJ Handle, int oType, PVOID pAttr) { PGDIHANDLECACHE GdiHandleCache; HGDIOBJ *hPtr; - BOOL Ret = FALSE; - int Offset = 0, Number; HANDLE Lock; + int Number, Offset, MaxNum = CACHE_PEN_ENTRIES; + BOOL Ret = FALSE; GdiHandleCache = (PGDIHANDLECACHE)NtCurrentTeb()->ProcessEnvironmentBlock->GdiHandleBuffer; @@ -758,6 +764,7 @@ bPEBCacheHandle(HGDIOBJ Handle, int oType, PVOID pAttr) { case hctBrushHandle: Offset = 0; + MaxNum = CACHE_BRUSH_ENTRIES; break; case hctPenHandle: @@ -783,10 +790,10 @@ bPEBCacheHandle(HGDIOBJ Handle, int oType, PVOID pAttr) hPtr = GdiHandleCache->Handle + Offset; - if ( pAttr && oType == hctRegionHandle) + if ( pAttr ) { - if ( Number < CACHE_REGION_ENTRIES ) - { + if ( Number < MaxNum ) + { // This object is cached and waiting for it's resurrection by the users. ((PRGN_ATTR)pAttr)->AttrFlags |= ATTR_CACHED; hPtr[Number] = Handle; GdiHandleCache->ulNumHandles[oType]++; @@ -817,6 +824,7 @@ GreDeleteObject(HGDIOBJ hObject) INT Index; PGDI_TABLE_ENTRY Entry; DWORD dwObjectType; + INT ihct; PVOID pAttr = NULL; DPRINT("NtGdiDeleteObject handle 0x%08x\n", hObject); @@ -831,14 +839,27 @@ GreDeleteObject(HGDIOBJ hObject) switch (dwObjectType) { case GDI_OBJECT_TYPE_BRUSH: + ihct = hctBrushHandle; + break; + + case GDI_OBJECT_TYPE_PEN: + ihct = hctPenHandle; break; case GDI_OBJECT_TYPE_REGION: - /* If pAttr NULL, the probability is high for System Region. */ + ihct = hctRegionHandle; + break; + } + + switch (dwObjectType) + { +// case GDI_OBJECT_TYPE_BRUSH: +// case GDI_OBJECT_TYPE_PEN: + case GDI_OBJECT_TYPE_REGION: + /* If pAttr NULL, the probability is high for System GDI handle object. */ if ( pAttr && - bPEBCacheHandle(hObject, hctRegionHandle, pAttr)) - { - /* User space handle only! */ + bPEBCacheHandle(hObject, ihct, pAttr) ) + { /* User space handle only! */ return TRUE; } if (pAttr) @@ -847,10 +868,6 @@ GreDeleteObject(HGDIOBJ hObject) Entry->UserData = NULL; } break; - - case GDI_OBJECT_TYPE_DC: -// DC_FreeDcAttr(hObject); - break; } return NULL != hObject From 827e75cb8914ac0931e3ed6986d37dd8541e338c Mon Sep 17 00:00:00 2001 From: James Tabor Date: Tue, 29 Mar 2011 05:11:02 +0000 Subject: [PATCH 016/317] [User32] - Fix select old brush in FillRect. svn path=/trunk/; revision=51186 --- reactos/dll/win32/user32/windows/draw.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/dll/win32/user32/windows/draw.c b/reactos/dll/win32/user32/windows/draw.c index 1d353289c29..5ecf9a53462 100644 --- a/reactos/dll/win32/user32/windows/draw.c +++ b/reactos/dll/win32/user32/windows/draw.c @@ -1564,8 +1564,8 @@ FlashWindow(HWND hWnd, BOOL bInvert) INT WINAPI FillRect(HDC hDC, CONST RECT *lprc, HBRUSH hbr) { - HBRUSH prevhbr; BOOL Ret; + HBRUSH prevhbr = NULL; /* Select brush if specified */ if (hbr) @@ -1583,7 +1583,7 @@ FillRect(HDC hDC, CONST RECT *lprc, HBRUSH hbr) lprc->bottom - lprc->top, PATCOPY); /* Select old brush */ - if (hbr) + if (prevhbr) SelectObject(hDC, prevhbr); return (INT)Ret; From 0bf0c70444b6477e4347e257b5683898dc249352 Mon Sep 17 00:00:00 2001 From: James Tabor Date: Tue, 29 Mar 2011 05:53:34 +0000 Subject: [PATCH 017/317] [User32|Win32k] - Properly implement RealGetWindowClass, fixes the ApiTest. Keeping the Ansi support for now, will use it as a reference. svn path=/trunk/; revision=51187 --- reactos/dll/win32/user32/windows/class.c | 39 +++++++++++-------- reactos/include/reactos/win32k/ntuser.h | 7 ---- .../subsystems/win32/win32k/ntuser/class.c | 23 ++++++++--- 3 files changed, 40 insertions(+), 29 deletions(-) diff --git a/reactos/dll/win32/user32/windows/class.c b/reactos/dll/win32/user32/windows/class.c index df665d1ce2d..6770b6d6d0b 100644 --- a/reactos/dll/win32/user32/windows/class.c +++ b/reactos/dll/win32/user32/windows/class.c @@ -696,22 +696,20 @@ GetClassNameA( LPSTR lpClassName, int nMaxCount) { - ANSI_STRING ClassName; - int Result; - - ClassName.MaximumLength = nMaxCount; - ClassName.Buffer = lpClassName; - - Result = NtUserGetClassName(hWnd, - (PUNICODE_STRING)&ClassName, - TRUE); + WCHAR tmpbuf[MAX_ATOM_LEN + 1]; + int len; + + if (nMaxCount <= 0) return 0; + if (!GetClassNameW( hWnd, tmpbuf, sizeof(tmpbuf)/sizeof(WCHAR) )) return 0; + RtlUnicodeToMultiByteN( lpClassName, nMaxCount - 1, (PULONG)&len, tmpbuf, strlenW(tmpbuf) * sizeof(WCHAR) ); + lpClassName[len] = 0; TRACE("%p class/atom: %s/%04x %x\n", hWnd, IS_ATOM(lpClassName) ? NULL : lpClassName, IS_ATOM(lpClassName) ? lpClassName : 0, nMaxCount); - return Result; + return len; } @@ -732,8 +730,8 @@ GetClassNameW( ClassName.Buffer = lpClassName; Result = NtUserGetClassName(hWnd, - &ClassName, - FALSE); + FALSE, + &ClassName); TRACE("%p class/atom: %S/%04x %x\n", hWnd, IS_ATOM(lpClassName) ? NULL : lpClassName, @@ -914,8 +912,11 @@ RealGetWindowClassW( LPWSTR pszType, UINT cchType) { - /* FIXME: Implement correct functionality of RealGetWindowClass */ - return GetClassNameW(hwnd,pszType,cchType); + UNICODE_STRING ClassName; + ClassName.MaximumLength = cchType * sizeof(WCHAR); + ClassName.Buffer = (PWSTR)pszType; + + return NtUserGetClassName(hwnd,TRUE,&ClassName); } @@ -929,8 +930,14 @@ RealGetWindowClassA( LPSTR pszType, UINT cchType) { - /* FIXME: Implement correct functionality of RealGetWindowClass */ - return GetClassNameA(hwnd,pszType,cchType); + WCHAR tmpbuf[MAX_ATOM_LEN + 1]; + UINT len; + + if (cchType <= 0) return 0; + if (!RealGetWindowClassW( hwnd, tmpbuf, sizeof(tmpbuf)/sizeof(WCHAR) )) return 0; + RtlUnicodeToMultiByteN( pszType, cchType - 1, (PULONG)&len, tmpbuf, strlenW(tmpbuf) * sizeof(WCHAR) ); + pszType[len] = 0; + return len; } /* diff --git a/reactos/include/reactos/win32k/ntuser.h b/reactos/include/reactos/win32k/ntuser.h index 484a3a4b84c..b6e2d8339ef 100644 --- a/reactos/include/reactos/win32k/ntuser.h +++ b/reactos/include/reactos/win32k/ntuser.h @@ -1761,18 +1761,11 @@ NtUserGetClassInfo(HINSTANCE hInstance, LPWSTR *ppszMenuName, BOOL Ansi); -INT -NTAPI -NtUserGetClassName(HWND hWnd, - PUNICODE_STRING ClassName, - BOOL Ansi); -#if 0 // Real NtUserGetClassName INT NTAPI NtUserGetClassName(HWND hWnd, BOOL Real, // 0 GetClassNameW, 1 RealGetWindowClassA/W PUNICODE_STRING ClassName); -#endif HANDLE NTAPI diff --git a/reactos/subsystems/win32/win32k/ntuser/class.c b/reactos/subsystems/win32/win32k/ntuser/class.c index 81e0076be26..74595eccaa3 100644 --- a/reactos/subsystems/win32/win32k/ntuser/class.c +++ b/reactos/subsystems/win32/win32k/ntuser/class.c @@ -1398,6 +1398,7 @@ UserUnregisterClass(IN PUNICODE_STRING ClassName, INT UserGetClassName(IN PCLS Class, IN OUT PUNICODE_STRING ClassName, + IN RTL_ATOM Atom, IN BOOL Ansi) { NTSTATUS Status = STATUS_SUCCESS; @@ -1451,7 +1452,7 @@ UserGetClassName(IN PCLS Class, /* query the class name */ Status = RtlQueryAtomInAtomTable(gAtomTable, - Class->atomClassName, + Atom ? Atom : Class->atomClassName, NULL, NULL, szTemp, @@ -1485,7 +1486,7 @@ UserGetClassName(IN PCLS Class, /* query the atom name */ Status = RtlQueryAtomInAtomTable(gAtomTable, - Class->atomClassName, + Atom ? Atom : Class->atomClassName, NULL, NULL, ClassName->Buffer, @@ -2376,18 +2377,27 @@ NtUserGetClassInfo( INT APIENTRY NtUserGetClassName (IN HWND hWnd, - OUT PUNICODE_STRING ClassName, - IN BOOL Ansi) + IN BOOL Real, + OUT PUNICODE_STRING ClassName) { PWND Window; UNICODE_STRING CapturedClassName; - INT Ret = 0; + INT iCls, Ret = 0; + RTL_ATOM Atom = 0; UserEnterShared(); Window = UserGetWindowObject(hWnd); if (Window != NULL) { + if (Real && Window->fnid && !(Window->fnid & FNID_DESTROY)) + { + if (LookupFnIdToiCls(Window->fnid, &iCls)) + { + Atom = gpsi->atomSysClass[iCls]; + } + } + _SEH2_TRY { ProbeForWriteUnicodeString(ClassName); @@ -2396,7 +2406,8 @@ NtUserGetClassName (IN HWND hWnd, /* get the class name */ Ret = UserGetClassName(Window->pcls, &CapturedClassName, - Ansi); + Atom, + FALSE); if (Ret != 0) { From 216026918d1bf2b8f533cfbea88cbad8a27af189 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Tue, 29 Mar 2011 09:52:39 +0000 Subject: [PATCH 018/317] [WIN32K] Fix parameter check and buffer probing in NtUserSetSysColors svn path=/trunk/; revision=51188 --- .../subsystems/win32/win32k/ntuser/ntstubs.c | 25 ++++++++----------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/reactos/subsystems/win32/win32k/ntuser/ntstubs.c b/reactos/subsystems/win32/win32k/ntuser/ntstubs.c index 7cdc720cd0a..1ec7f71ca97 100644 --- a/reactos/subsystems/win32/win32k/ntuser/ntstubs.c +++ b/reactos/subsystems/win32/win32k/ntuser/ntstubs.c @@ -539,37 +539,34 @@ NtUserSetSysColors( FLONG Flags) { DWORD Ret = TRUE; - NTSTATUS Status = STATUS_SUCCESS; if (cElements == 0) return TRUE; + if ((ULONG)cElements >= 0x40000000) + return FALSE; + UserEnterExclusive(); + _SEH2_TRY { - ProbeForRead(lpaElements, - sizeof(INT), - 1); - ProbeForRead(lpaRgbValues, - sizeof(COLORREF), - 1); -// Developers: We are thread locked and calling gdi. + ProbeForRead(lpaElements, cElements * sizeof(INT), 1); + ProbeForRead(lpaRgbValues, cElements * sizeof(COLORREF), 1); + IntSetSysColors(cElements, lpaElements, lpaRgbValues); } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { - Status = _SEH2_GetExceptionCode(); - } - _SEH2_END; - if (!NT_SUCCESS(Status)) - { - SetLastNtError(Status); + SetLastNtError(_SEH2_GetExceptionCode()); Ret = FALSE; } + _SEH2_END; + if (Ret) { UserSendNotifyMessage(HWND_BROADCAST, WM_SYSCOLORCHANGE, 0, 0); } + UserLeave(); return Ret; } From 854e23cc3e137bc8fdfcdc342851125843dce118 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Tue, 29 Mar 2011 10:02:38 +0000 Subject: [PATCH 019/317] [WIN32K] Make GdiTableSection a static variable and use it only from gdiobj.c svn path=/trunk/; revision=51189 --- reactos/subsystems/win32/win32k/include/gdiobj.h | 5 ++--- reactos/subsystems/win32/win32k/main/dllmain.c | 6 +++--- reactos/subsystems/win32/win32k/objects/gdiobj.c | 8 ++++---- 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/reactos/subsystems/win32/win32k/include/gdiobj.h b/reactos/subsystems/win32/win32k/include/gdiobj.h index e29077c2f42..032acc2c523 100644 --- a/reactos/subsystems/win32/win32k/include/gdiobj.h +++ b/reactos/subsystems/win32/win32k/include/gdiobj.h @@ -47,6 +47,7 @@ typedef struct _BASEOBJECT USHORT cExclusiveLock; USHORT BaseFlags; PTHREADINFO Tid; + EX_PUSH_LOCK pushlock; } BASEOBJECT, *POBJ; typedef struct _CLIENTOBJ @@ -62,8 +63,6 @@ enum BASEFLAGS BASEFLAG_READY_TO_DIE = 0x1000 }; -extern PSECTION_OBJECT GdiTableSection; - BOOL INTERNAL_CALL GDIOBJ_OwnedByCurrentProcess(HGDIOBJ ObjectHandle); BOOL INTERNAL_CALL GDIOBJ_SetOwnership(HGDIOBJ ObjectHandle, PEPROCESS Owner); BOOL INTERNAL_CALL GDIOBJ_CopyOwnership(HGDIOBJ CopyFrom, HGDIOBJ CopyTo); @@ -78,7 +77,7 @@ PGDIOBJ INTERNAL_CALL GDIOBJ_LockObj (HGDIOBJ hObj, DWORD ObjectType); PGDIOBJ INTERNAL_CALL GDIOBJ_ShareLockObj (HGDIOBJ hObj, DWORD ObjectType); VOID INTERNAL_CALL GDIOBJ_LockMultipleObjs(ULONG ulCount, IN HGDIOBJ* ahObj, OUT PGDIOBJ* apObj); -PVOID INTERNAL_CALL GDI_MapHandleTable(PSECTION_OBJECT SectionObject, PEPROCESS Process); +PVOID INTERNAL_CALL GDI_MapHandleTable(PEPROCESS Process); INIT_FUNCTION NTSTATUS diff --git a/reactos/subsystems/win32/win32k/main/dllmain.c b/reactos/subsystems/win32/win32k/main/dllmain.c index 1bff6e3f3b9..ce9f9b585b7 100644 --- a/reactos/subsystems/win32/win32k/main/dllmain.c +++ b/reactos/subsystems/win32/win32k/main/dllmain.c @@ -107,7 +107,7 @@ Win32kProcessCallback(struct _EPROCESS *Process, if(Process->Peb != NULL) { /* map the gdi handle table to user land */ - Process->Peb->GdiSharedHandleTable = GDI_MapHandleTable(GdiTableSection, Process); + Process->Peb->GdiSharedHandleTable = GDI_MapHandleTable(Process); Process->Peb->GdiDCAttributeList = GDI_BATCH_LIMIT; } @@ -264,7 +264,7 @@ Win32kThreadCallback(struct _ETHREAD *Thread, if (Win32Thread->KeyboardLayout) pci->hKL = Win32Thread->KeyboardLayout->hkl; pci->dwTIFlags = Win32Thread->TIF_flags; /* CI may not have been initialized. */ - if (!pci->pDeskInfo && Win32Thread->pDeskInfo) + if (!pci->pDeskInfo && Win32Thread->pDeskInfo) { if (!pci->ulClientDelta) pci->ulClientDelta = DesktopHeapGetUserDelta(); @@ -440,7 +440,7 @@ DriverEntry( /* Register our per-process and per-thread structures. */ PsEstablishWin32Callouts((PWIN32_CALLOUTS_FPNS)&CalloutData); -#if 0 // DBG +#if 1 // DBG /* Register service hook callbacks */ KdSystemDebugControl('CsoR', DbgPreServiceHook, ID_Win32PreServiceHook, 0, 0, 0, 0); KdSystemDebugControl('CsoR', DbgPostServiceHook, ID_Win32PostServiceHook, 0, 0, 0, 0); diff --git a/reactos/subsystems/win32/win32k/objects/gdiobj.c b/reactos/subsystems/win32/win32k/objects/gdiobj.c index 45756ae81bf..55f8a1d9b42 100644 --- a/reactos/subsystems/win32/win32k/objects/gdiobj.c +++ b/reactos/subsystems/win32/win32k/objects/gdiobj.c @@ -70,7 +70,7 @@ OBJ_TYPE_INFO ObjTypeInfo[BASE_OBJTYPE_COUNT] = static LARGE_INTEGER ShortDelay; PGDI_HANDLE_TABLE GdiHandleTable = NULL; -PSECTION_OBJECT GdiTableSection = NULL; +static PSECTION_OBJECT GdiTableSection = NULL; /** INTERNAL FUNCTIONS ********************************************************/ @@ -1663,7 +1663,7 @@ LockHandleFrom: } PVOID INTERNAL_CALL -GDI_MapHandleTable(PSECTION_OBJECT SectionObject, PEPROCESS Process) +GDI_MapHandleTable(PEPROCESS Process) { PVOID MappedView = NULL; NTSTATUS Status; @@ -1672,10 +1672,10 @@ GDI_MapHandleTable(PSECTION_OBJECT SectionObject, PEPROCESS Process) Offset.QuadPart = 0; - ASSERT(SectionObject != NULL); + ASSERT(GdiTableSection != NULL); ASSERT(Process != NULL); - Status = MmMapViewOfSection(SectionObject, + Status = MmMapViewOfSection(GdiTableSection, Process, &MappedView, 0, From e78589d99a0d697c1f72c88cdc22ab3cc34d7ccf Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Tue, 29 Mar 2011 10:07:11 +0000 Subject: [PATCH 020/317] [WIN32K] Disable system service hooks, that got accidentally enabled. svn path=/trunk/; revision=51190 --- reactos/subsystems/win32/win32k/main/dllmain.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/subsystems/win32/win32k/main/dllmain.c b/reactos/subsystems/win32/win32k/main/dllmain.c index ce9f9b585b7..59853171885 100644 --- a/reactos/subsystems/win32/win32k/main/dllmain.c +++ b/reactos/subsystems/win32/win32k/main/dllmain.c @@ -440,7 +440,7 @@ DriverEntry( /* Register our per-process and per-thread structures. */ PsEstablishWin32Callouts((PWIN32_CALLOUTS_FPNS)&CalloutData); -#if 1 // DBG +#if 0 // DBG /* Register service hook callbacks */ KdSystemDebugControl('CsoR', DbgPreServiceHook, ID_Win32PreServiceHook, 0, 0, 0, 0); KdSystemDebugControl('CsoR', DbgPostServiceHook, ID_Win32PostServiceHook, 0, 0, 0, 0); From d7e597d60ec06d1495e0c3e93bd708be27a0f23f Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Tue, 29 Mar 2011 10:25:10 +0000 Subject: [PATCH 021/317] [WIN32K] - Move IntGdiSetBrushOwner to brush.c - Move IntGdiSetDCOwnerEx to dclife.c - Move IntGdiSetRegionOwner to region.c svn path=/trunk/; revision=51191 --- .../subsystems/win32/win32k/objects/brush.c | 49 +++++++ .../subsystems/win32/win32k/objects/dclife.c | 44 ++++++- .../subsystems/win32/win32k/objects/gdiobj.c | 120 ------------------ .../subsystems/win32/win32k/objects/region.c | 28 ++++ 4 files changed, 120 insertions(+), 121 deletions(-) diff --git a/reactos/subsystems/win32/win32k/objects/brush.c b/reactos/subsystems/win32/win32k/objects/brush.c index 5ad5f0764bf..f9d773e2e38 100644 --- a/reactos/subsystems/win32/win32k/objects/brush.c +++ b/reactos/subsystems/win32/win32k/objects/brush.c @@ -573,4 +573,53 @@ NtGdiSetBrushOrg(HDC hDC, INT XOrg, INT YOrg, LPPOINT Point) return TRUE; } +BOOL +FASTCALL +IntGdiSetBrushOwner(PBRUSH pbr, DWORD OwnerMask) +{ + HBRUSH hBR; + PEPROCESS Owner = NULL; + PGDI_TABLE_ENTRY pEntry = NULL; + + if (!pbr) return FALSE; + + hBR = pbr->BaseObject.hHmgr; + + if (!hBR || (GDI_HANDLE_GET_TYPE(hBR) != GDI_OBJECT_TYPE_BRUSH)) + return FALSE; + else + { + INT Index = GDI_HANDLE_GET_INDEX((HGDIOBJ)hBR); + pEntry = &GdiHandleTable->Entries[Index]; + } + + if (pbr->flAttrs & GDIBRUSH_IS_GLOBAL) + { + GDIOBJ_ShareUnlockObjByPtr((POBJ)pbr); + return TRUE; + } + + if ((OwnerMask == GDI_OBJ_HMGR_PUBLIC) || OwnerMask == GDI_OBJ_HMGR_NONE) + { + // Set this Brush to inaccessible mode and to an Owner of NONE. +// if (OwnerMask == GDI_OBJ_HMGR_NONE) Owner = OwnerMask; + + if (!GDIOBJ_SetOwnership((HGDIOBJ) hBR, Owner)) + return FALSE; + + // Deny user access to User Data. + pEntry->UserData = NULL; // This hBR is inaccessible! + } + + if (OwnerMask == GDI_OBJ_HMGR_POWNED) + { + if (!GDIOBJ_SetOwnership((HGDIOBJ) hBR, PsGetCurrentProcess() )) + return FALSE; + + // Allow user access to User Data. + pEntry->UserData = pbr->pBrushAttr; + } + return TRUE; +} + /* EOF */ diff --git a/reactos/subsystems/win32/win32k/objects/dclife.c b/reactos/subsystems/win32/win32k/objects/dclife.c index 7d6d330e708..b83c6f039fd 100644 --- a/reactos/subsystems/win32/win32k/objects/dclife.c +++ b/reactos/subsystems/win32/win32k/objects/dclife.c @@ -836,7 +836,7 @@ IntGdiDeleteDC(HDC hDC, BOOL Force) { DPRINT1("Attempted to Delete 0x%x currently being destroyed!!!\n", hDC); } - + return TRUE; } @@ -973,3 +973,45 @@ IntGdiCreateDisplayDC(HDEV hDev, ULONG DcType, BOOL EmptyDC) return hDC; } +BOOL +FASTCALL +IntGdiSetDCOwnerEx( HDC hDC, DWORD OwnerMask, BOOL NoSetBrush) +{ + PDC pDC; + BOOL Ret = FALSE; + + if (!hDC || (GDI_HANDLE_GET_TYPE(hDC) != GDI_OBJECT_TYPE_DC)) return FALSE; + + if ((OwnerMask == GDI_OBJ_HMGR_PUBLIC) || OwnerMask == GDI_OBJ_HMGR_NONE) + { + pDC = DC_LockDc ( hDC ); + MmCopyFromCaller(&pDC->dcattr, pDC->pdcattr, sizeof(DC_ATTR)); + DC_vFreeDcAttr(pDC); + DC_UnlockDc( pDC ); + + if (!DC_SetOwnership( hDC, NULL )) // This hDC is inaccessible! + return Ret; + } + + if (OwnerMask == GDI_OBJ_HMGR_POWNED) + { + pDC = DC_LockDc ( hDC ); + ASSERT(pDC->pdcattr == &pDC->dcattr); + DC_UnlockDc( pDC ); + + if (!DC_SetOwnership( hDC, PsGetCurrentProcess() )) return Ret; + + DC_AllocateDcAttr( hDC ); // Allocate new dcattr + + DCU_SynchDcAttrtoUser( hDC ); // Copy data from dc to dcattr + } + + if ((OwnerMask != GDI_OBJ_HMGR_NONE) && !NoSetBrush) + { + pDC = DC_LockDc ( hDC ); + if (IntGdiSetBrushOwner((PBRUSH)pDC->dclevel.pbrFill, OwnerMask)) + IntGdiSetBrushOwner((PBRUSH)pDC->dclevel.pbrLine, OwnerMask); + DC_UnlockDc( pDC ); + } + return TRUE; +} diff --git a/reactos/subsystems/win32/win32k/objects/gdiobj.c b/reactos/subsystems/win32/win32k/objects/gdiobj.c index 55f8a1d9b42..6c6be35895c 100644 --- a/reactos/subsystems/win32/win32k/objects/gdiobj.c +++ b/reactos/subsystems/win32/win32k/objects/gdiobj.c @@ -1726,126 +1726,6 @@ GDIOBJ_LockMultipleObjs(ULONG ulCount, /** PUBLIC FUNCTIONS **********************************************************/ -BOOL -FASTCALL -IntGdiSetRegionOwner(HRGN hRgn, DWORD OwnerMask) -{ - INT Index; - PGDI_TABLE_ENTRY Entry; -/* - System Regions: - These regions do not use attribute sections and when allocated, use gdiobj - level functions. - */ - // FIXME! HAX!!! Remove this once we get everything right! - Index = GDI_HANDLE_GET_INDEX(hRgn); - Entry = &GdiHandleTable->Entries[Index]; - if (Entry->UserData) FreeObjectAttr(Entry->UserData); - Entry->UserData = NULL; - // - if ((OwnerMask == GDI_OBJ_HMGR_PUBLIC) || OwnerMask == GDI_OBJ_HMGR_NONE) - { - return GDIOBJ_SetOwnership(hRgn, NULL); - } - if (OwnerMask == GDI_OBJ_HMGR_POWNED) - { - return GDIOBJ_SetOwnership((HGDIOBJ) hRgn, PsGetCurrentProcess() ); - } - return FALSE; -} - -BOOL -FASTCALL -IntGdiSetBrushOwner(PBRUSH pbr, DWORD OwnerMask) -{ - HBRUSH hBR; - PEPROCESS Owner = NULL; - PGDI_TABLE_ENTRY pEntry = NULL; - - if (!pbr) return FALSE; - - hBR = pbr->BaseObject.hHmgr; - - if (!hBR || (GDI_HANDLE_GET_TYPE(hBR) != GDI_OBJECT_TYPE_BRUSH)) - return FALSE; - else - { - INT Index = GDI_HANDLE_GET_INDEX((HGDIOBJ)hBR); - pEntry = &GdiHandleTable->Entries[Index]; - } - - if (pbr->flAttrs & GDIBRUSH_IS_GLOBAL) - { - GDIOBJ_ShareUnlockObjByPtr((POBJ)pbr); - return TRUE; - } - - if ((OwnerMask == GDI_OBJ_HMGR_PUBLIC) || OwnerMask == GDI_OBJ_HMGR_NONE) - { - // Set this Brush to inaccessible mode and to an Owner of NONE. -// if (OwnerMask == GDI_OBJ_HMGR_NONE) Owner = OwnerMask; - - if (!GDIOBJ_SetOwnership((HGDIOBJ) hBR, Owner)) - return FALSE; - - // Deny user access to User Data. - pEntry->UserData = NULL; // This hBR is inaccessible! - } - - if (OwnerMask == GDI_OBJ_HMGR_POWNED) - { - if (!GDIOBJ_SetOwnership((HGDIOBJ) hBR, PsGetCurrentProcess() )) - return FALSE; - - // Allow user access to User Data. - pEntry->UserData = pbr->pBrushAttr; - } - return TRUE; -} - -BOOL -FASTCALL -IntGdiSetDCOwnerEx( HDC hDC, DWORD OwnerMask, BOOL NoSetBrush) -{ - PDC pDC; - BOOL Ret = FALSE; - - if (!hDC || (GDI_HANDLE_GET_TYPE(hDC) != GDI_OBJECT_TYPE_DC)) return FALSE; - - if ((OwnerMask == GDI_OBJ_HMGR_PUBLIC) || OwnerMask == GDI_OBJ_HMGR_NONE) - { - pDC = DC_LockDc ( hDC ); - MmCopyFromCaller(&pDC->dcattr, pDC->pdcattr, sizeof(DC_ATTR)); - DC_vFreeDcAttr(pDC); - DC_UnlockDc( pDC ); - - if (!DC_SetOwnership( hDC, NULL )) // This hDC is inaccessible! - return Ret; - } - - if (OwnerMask == GDI_OBJ_HMGR_POWNED) - { - pDC = DC_LockDc ( hDC ); - ASSERT(pDC->pdcattr == &pDC->dcattr); - DC_UnlockDc( pDC ); - - if (!DC_SetOwnership( hDC, PsGetCurrentProcess() )) return Ret; - - DC_AllocateDcAttr( hDC ); // Allocate new dcattr - - DCU_SynchDcAttrtoUser( hDC ); // Copy data from dc to dcattr - } - - if ((OwnerMask != GDI_OBJ_HMGR_NONE) && !NoSetBrush) - { - pDC = DC_LockDc ( hDC ); - if (IntGdiSetBrushOwner((PBRUSH)pDC->dclevel.pbrFill, OwnerMask)) - IntGdiSetBrushOwner((PBRUSH)pDC->dclevel.pbrLine, OwnerMask); - DC_UnlockDc( pDC ); - } - return TRUE; -} - INT FASTCALL GreGetObjectOwner(HGDIOBJ Handle, GDIOBJTYPE ObjType) diff --git a/reactos/subsystems/win32/win32k/objects/region.c b/reactos/subsystems/win32/win32k/objects/region.c index 38ad6ae7232..56b6763148e 100644 --- a/reactos/subsystems/win32/win32k/objects/region.c +++ b/reactos/subsystems/win32/win32k/objects/region.c @@ -3942,4 +3942,32 @@ NtGdiGetRegionData( return size + sizeof(RGNDATAHEADER); } +BOOL +FASTCALL +IntGdiSetRegionOwner(HRGN hRgn, DWORD OwnerMask) +{ + INT Index; + PGDI_TABLE_ENTRY Entry; +/* + System Regions: + These regions do not use attribute sections and when allocated, use gdiobj + level functions. + */ + // FIXME! HAX!!! Remove this once we get everything right! + Index = GDI_HANDLE_GET_INDEX(hRgn); + Entry = &GdiHandleTable->Entries[Index]; + if (Entry->UserData) FreeObjectAttr(Entry->UserData); + Entry->UserData = NULL; + // + if ((OwnerMask == GDI_OBJ_HMGR_PUBLIC) || OwnerMask == GDI_OBJ_HMGR_NONE) + { + return GDIOBJ_SetOwnership(hRgn, NULL); + } + if (OwnerMask == GDI_OBJ_HMGR_POWNED) + { + return GDIOBJ_SetOwnership((HGDIOBJ) hRgn, PsGetCurrentProcess() ); + } + return FALSE; +} + /* EOF */ From fb0b4f31c46ed05474bf33e35614169b841dd2de Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Tue, 29 Mar 2011 10:56:28 +0000 Subject: [PATCH 022/317] [NTOS/MM] - Remove IMG_SCN_TYPE_NOLOAD support which was firstly removed by Alex, then reenabled by Herve. Hopefully it works this time. - Return proper image size after successfully mapping an image section (previously, 0 was always returned). The change above is necessary for returning correct size. svn path=/trunk/; revision=51192 --- reactos/ntoskrnl/mm/section.c | 71 +++++++++++++++-------------------- 1 file changed, 30 insertions(+), 41 deletions(-) diff --git a/reactos/ntoskrnl/mm/section.c b/reactos/ntoskrnl/mm/section.c index 83471dd5efc..7749a03eb05 100644 --- a/reactos/ntoskrnl/mm/section.c +++ b/reactos/ntoskrnl/mm/section.c @@ -4326,14 +4326,11 @@ MmUnmapViewOfSection(PEPROCESS Process, * and calculate the image base address */ for (i = 0; i < NrSegments; i++) { - if (!(SectionSegments[i].Characteristics & IMAGE_SCN_TYPE_NOLOAD)) - { - if (Segment == &SectionSegments[i]) - { - ImageBaseAddress = (char*)BaseAddress - (ULONG_PTR)SectionSegments[i].VirtualAddress; - break; - } - } + if (Segment == &SectionSegments[i]) + { + ImageBaseAddress = (char*)BaseAddress - (ULONG_PTR)SectionSegments[i].VirtualAddress; + break; + } } if (i >= NrSegments) { @@ -4342,13 +4339,10 @@ MmUnmapViewOfSection(PEPROCESS Process, for (i = 0; i < NrSegments; i++) { - if (!(SectionSegments[i].Characteristics & IMAGE_SCN_TYPE_NOLOAD)) - { - PVOID SBaseAddress = (PVOID) - ((char*)ImageBaseAddress + (ULONG_PTR)SectionSegments[i].VirtualAddress); + PVOID SBaseAddress = (PVOID) + ((char*)ImageBaseAddress + (ULONG_PTR)SectionSegments[i].VirtualAddress); - Status = MmUnmapViewOfSegment(AddressSpace, SBaseAddress); - } + Status = MmUnmapViewOfSegment(AddressSpace, SBaseAddress); } } else @@ -4625,13 +4619,10 @@ MmMapViewOfSection(IN PVOID SectionObject, ImageSize = 0; for (i = 0; i < NrSegments; i++) { - if (!(SectionSegments[i].Characteristics & IMAGE_SCN_TYPE_NOLOAD)) - { - ULONG_PTR MaxExtent; - MaxExtent = (ULONG_PTR)SectionSegments[i].VirtualAddress + - SectionSegments[i].Length; - ImageSize = max(ImageSize, MaxExtent); - } + ULONG_PTR MaxExtent; + MaxExtent = (ULONG_PTR)SectionSegments[i].VirtualAddress + + SectionSegments[i].Length; + ImageSize = max(ImageSize, MaxExtent); } ImageSectionObject->ImageSize = ImageSize; @@ -4659,29 +4650,27 @@ MmMapViewOfSection(IN PVOID SectionObject, for (i = 0; i < NrSegments; i++) { - if (!(SectionSegments[i].Characteristics & IMAGE_SCN_TYPE_NOLOAD)) - { - PVOID SBaseAddress = (PVOID) - ((char*)ImageBase + (ULONG_PTR)SectionSegments[i].VirtualAddress); - MmLockSectionSegment(&SectionSegments[i]); - Status = MmMapViewOfSegment(AddressSpace, - Section, - &SectionSegments[i], - &SBaseAddress, - SectionSegments[i].Length, - SectionSegments[i].Protection, - 0, - 0); - MmUnlockSectionSegment(&SectionSegments[i]); - if (!NT_SUCCESS(Status)) - { - MmUnlockAddressSpace(AddressSpace); - return(Status); - } - } + PVOID SBaseAddress = (PVOID) + ((char*)ImageBase + (ULONG_PTR)SectionSegments[i].VirtualAddress); + MmLockSectionSegment(&SectionSegments[i]); + Status = MmMapViewOfSegment(AddressSpace, + Section, + &SectionSegments[i], + &SBaseAddress, + SectionSegments[i].Length, + SectionSegments[i].Protection, + 0, + 0); + MmUnlockSectionSegment(&SectionSegments[i]); + if (!NT_SUCCESS(Status)) + { + MmUnlockAddressSpace(AddressSpace); + return(Status); + } } *BaseAddress = (PVOID)ImageBase; + *ViewSize = ImageSize; } else { From 6771858659b5485c96c49c6a886f9d1e3180c57b Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Tue, 29 Mar 2011 11:00:34 +0000 Subject: [PATCH 023/317] [RTL] - Turn off LdrVerifyMappedImageMatchesChecksum() verification for now. (should have been part of r51192). svn path=/trunk/; revision=51193 --- reactos/lib/rtl/image.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/reactos/lib/rtl/image.c b/reactos/lib/rtl/image.c index 03c402fc20c..ce54a6b4df9 100644 --- a/reactos/lib/rtl/image.c +++ b/reactos/lib/rtl/image.c @@ -46,6 +46,7 @@ LdrVerifyMappedImageMatchesChecksum( IN ULONG ImageSize, IN ULONG FileLength) { +#if 0 PIMAGE_NT_HEADERS Header; PUSHORT Ptr; ULONG Sum; @@ -118,6 +119,9 @@ LdrVerifyMappedImageMatchesChecksum( DPRINT1("Image %p checksum mismatches! 0x%x != 0x%x, ImageSize %x, FileLen %x\n", BaseAddress, CalcSum, HeaderSum, ImageSize, FileLength); return (BOOLEAN)(CalcSum == HeaderSum); +#else + return TRUE; +#endif } /* From 2127ff030c01f57116ea0bcc8125458430bd5b16 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Tue, 29 Mar 2011 15:35:10 +0000 Subject: [PATCH 024/317] [WIN32K] Addendum to r51188: set last error, when overflow check fails. Fixes test regression. svn path=/trunk/; revision=51194 --- reactos/subsystems/win32/win32k/ntuser/ntstubs.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/reactos/subsystems/win32/win32k/ntuser/ntstubs.c b/reactos/subsystems/win32/win32k/ntuser/ntstubs.c index 1ec7f71ca97..c0834596f81 100644 --- a/reactos/subsystems/win32/win32k/ntuser/ntstubs.c +++ b/reactos/subsystems/win32/win32k/ntuser/ntstubs.c @@ -84,11 +84,11 @@ NtUserBitBltSysBmp( Ret = NtGdiBitBlt( hdc, nXDest, nYDest, - nWidth, - nHeight, + nWidth, + nHeight, hSystemBM, - nXSrc, - nYSrc, + nXSrc, + nYSrc, dwRop, 0, 0); @@ -255,7 +255,7 @@ HBRUSH APIENTRY NtUserGetControlColor( HWND hwndParent, - HWND hwnd, + HWND hwnd, HDC hdc, UINT CtlMsg) // Wine PaintRect: WM_CTLCOLORMSGBOX + hbrush { @@ -380,7 +380,7 @@ NtUserInitializeClientPfnArrays( DPRINT1("Failed reading Client Pfns from user space.\n"); SetLastNtError(Status); } - + UserLeave(); return Status; } @@ -543,8 +543,12 @@ NtUserSetSysColors( if (cElements == 0) return TRUE; + /* We need this check to prevent overflow later */ if ((ULONG)cElements >= 0x40000000) + { + EngSetLastError(ERROR_NOACCESS); return FALSE; + } UserEnterExclusive(); From c98d64bacb25add2325289e1f9d9c9be8f1942b5 Mon Sep 17 00:00:00 2001 From: Olaf Siejka Date: Tue, 29 Mar 2011 21:21:18 +0000 Subject: [PATCH 025/317] [SYSSETUP] - Fix compilation warning. Patch by Edijs Kolesnikovics See issue #6059 for more details. svn path=/trunk/; revision=51195 --- reactos/dll/win32/syssetup/wizard.c | 1 + 1 file changed, 1 insertion(+) diff --git a/reactos/dll/win32/syssetup/wizard.c b/reactos/dll/win32/syssetup/wizard.c index 7c438ab5ecd..de46e556ad5 100644 --- a/reactos/dll/win32/syssetup/wizard.c +++ b/reactos/dll/win32/syssetup/wizard.c @@ -20,6 +20,7 @@ #include #define NTOS_MODE_USER #include +#include #include From ed27eba84377638a4e7e993d56c4881a1228b53d Mon Sep 17 00:00:00 2001 From: Olaf Siejka Date: Tue, 29 Mar 2011 21:41:14 +0000 Subject: [PATCH 026/317] [SHELL32] - Fix compile warning (uninitialized use). Based on patch by Edijs Kolesnikovics slightly modified by Aleksiej See issue #6058 for more details. svn path=/trunk/; revision=51196 --- reactos/dll/win32/shell32/shlfileop.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/dll/win32/shell32/shlfileop.c b/reactos/dll/win32/shell32/shlfileop.c index 8fa50417493..ddf6670fe18 100644 --- a/reactos/dll/win32/shell32/shlfileop.c +++ b/reactos/dll/win32/shell32/shlfileop.c @@ -584,7 +584,7 @@ BOOL QueueFile( FILE_OPERATION_CONTEXT * Context) { - FILE_ENTRY * from, *to; + FILE_ENTRY * from, *too = NULL; BOOL bRet = FALSE; if (Context->Index >= Context->from->dwNumFiles) From a77d09adf9393128be3b688c5ad976a5f05cbf0d Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Tue, 29 Mar 2011 21:48:13 +0000 Subject: [PATCH 027/317] [KERNEL32] - Rename global vars to some better names (some of the names seen in Windows 2003 asserts and text messages). - Add BaseDefaultPath initialization, which will be needed but the new kernel32/ldr code, which is in turn required by the new ntdll/ldr code. - Add some beginnings of BasepGetDllPath(), but it returns NULL anyway now so no change in execution. svn path=/trunk/; revision=51197 --- reactos/dll/win32/kernel32/file/curdir.c | 2 + reactos/dll/win32/kernel32/file/dir.c | 38 +++++++++--------- reactos/dll/win32/kernel32/include/kernel32.h | 10 ++++- reactos/dll/win32/kernel32/misc/console.c | 4 +- reactos/dll/win32/kernel32/misc/dllmain.c | 28 +++++++++++-- reactos/dll/win32/kernel32/process/procsup.c | 40 ++++++++++++++++++- 6 files changed, 94 insertions(+), 28 deletions(-) diff --git a/reactos/dll/win32/kernel32/file/curdir.c b/reactos/dll/win32/kernel32/file/curdir.c index 8c74fbe11a1..42ae057f054 100644 --- a/reactos/dll/win32/kernel32/file/curdir.c +++ b/reactos/dll/win32/kernel32/file/curdir.c @@ -28,6 +28,8 @@ DEBUG_CHANNEL(kernel32file); UNICODE_STRING SystemDirectory; UNICODE_STRING WindowsDirectory; +UNICODE_STRING BaseDefaultPathAppend; +UNICODE_STRING BaseDefaultPath; /* FUNCTIONS *****************************************************************/ diff --git a/reactos/dll/win32/kernel32/file/dir.c b/reactos/dll/win32/kernel32/file/dir.c index a364e6a1f46..184403912f3 100644 --- a/reactos/dll/win32/kernel32/file/dir.c +++ b/reactos/dll/win32/kernel32/file/dir.c @@ -20,7 +20,7 @@ #include DEBUG_CHANNEL(kernel32file); -UNICODE_STRING DllDirectory = {0, 0, NULL}; +UNICODE_STRING BaseDllDirectory = {0, 0, NULL}; /* FUNCTIONS *****************************************************************/ @@ -1079,35 +1079,35 @@ SetDllDirectoryW( RtlInitUnicodeString(&PathName, lpPathName); - RtlEnterCriticalSection(&DllLock); + RtlEnterCriticalSection(&BaseDllDirectoryLock); if(PathName.Length > 0) { - if(PathName.Length + sizeof(WCHAR) <= DllDirectory.MaximumLength) + if(PathName.Length + sizeof(WCHAR) <= BaseDllDirectory.MaximumLength) { - RtlCopyUnicodeString(&DllDirectory, &PathName); + RtlCopyUnicodeString(&BaseDllDirectory, &PathName); } else { - RtlFreeUnicodeString(&DllDirectory); - if(!(DllDirectory.Buffer = (PWSTR)RtlAllocateHeap(RtlGetProcessHeap(), - 0, - PathName.Length + sizeof(WCHAR)))) + RtlFreeUnicodeString(&BaseDllDirectory); + if(!(BaseDllDirectory.Buffer = (PWSTR)RtlAllocateHeap(RtlGetProcessHeap(), + 0, + PathName.Length + sizeof(WCHAR)))) { - RtlLeaveCriticalSection(&DllLock); + RtlLeaveCriticalSection(&BaseDllDirectoryLock); SetLastError(ERROR_NOT_ENOUGH_MEMORY); return FALSE; } - DllDirectory.Length = 0; - DllDirectory.MaximumLength = PathName.Length + sizeof(WCHAR); + BaseDllDirectory.Length = 0; + BaseDllDirectory.MaximumLength = PathName.Length + sizeof(WCHAR); - RtlCopyUnicodeString(&DllDirectory, &PathName); + RtlCopyUnicodeString(&BaseDllDirectory, &PathName); } } else { - RtlFreeUnicodeString(&DllDirectory); + RtlFreeUnicodeString(&BaseDllDirectory); } - RtlLeaveCriticalSection(&DllLock); + RtlLeaveCriticalSection(&BaseDllDirectoryLock); return TRUE; } @@ -1144,10 +1144,10 @@ GetDllDirectoryW( { DWORD Ret; - RtlEnterCriticalSection(&DllLock); + RtlEnterCriticalSection(&BaseDllDirectoryLock); if(nBufferLength > 0) { - Ret = DllDirectory.Length / sizeof(WCHAR); + Ret = BaseDllDirectory.Length / sizeof(WCHAR); if(Ret > nBufferLength - 1) { Ret = nBufferLength - 1; @@ -1155,16 +1155,16 @@ GetDllDirectoryW( if(Ret > 0) { - RtlCopyMemory(lpBuffer, DllDirectory.Buffer, Ret * sizeof(WCHAR)); + RtlCopyMemory(lpBuffer, BaseDllDirectory.Buffer, Ret * sizeof(WCHAR)); } lpBuffer[Ret] = L'\0'; } else { /* include termination character, even if the string is empty! */ - Ret = (DllDirectory.Length / sizeof(WCHAR)) + 1; + Ret = (BaseDllDirectory.Length / sizeof(WCHAR)) + 1; } - RtlLeaveCriticalSection(&DllLock); + RtlLeaveCriticalSection(&BaseDllDirectoryLock); return Ret; } diff --git a/reactos/dll/win32/kernel32/include/kernel32.h b/reactos/dll/win32/kernel32/include/kernel32.h index 747c8b1b664..d6361b3bdfe 100755 --- a/reactos/dll/win32/kernel32/include/kernel32.h +++ b/reactos/dll/win32/kernel32/include/kernel32.h @@ -91,9 +91,9 @@ extern HANDLE hProcessHeap; extern HANDLE hBaseDir; extern HMODULE hCurrentModule; -extern RTL_CRITICAL_SECTION DllLock; +extern RTL_CRITICAL_SECTION BaseDllDirectoryLock; -extern UNICODE_STRING DllDirectory; +extern UNICODE_STRING BaseDllDirectory; extern LPTOP_LEVEL_EXCEPTION_FILTER GlobalTopLevelExceptionFilter; @@ -211,6 +211,12 @@ BasepMapFile(IN LPCWSTR lpApplicationName, OUT PHANDLE hSection, IN PUNICODE_STRING ApplicationName); +LPWSTR +WINAPI +BasepGetDllPath(LPWSTR FullPath, + PVOID Environment); + + PCODEPAGE_ENTRY FASTCALL IntGetCodePageEntry(UINT CodePage); diff --git a/reactos/dll/win32/kernel32/misc/console.c b/reactos/dll/win32/kernel32/misc/console.c index 2b0d253b23e..2fc95b58d5f 100644 --- a/reactos/dll/win32/kernel32/misc/console.c +++ b/reactos/dll/win32/kernel32/misc/console.c @@ -3524,7 +3524,7 @@ SetConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine, { BOOL Ret; - RtlEnterCriticalSection(&DllLock); + RtlEnterCriticalSection(&BaseDllDirectoryLock); if (Add) { Ret = AddConsoleCtrlHandler(HandlerRoutine); @@ -3534,7 +3534,7 @@ SetConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine, Ret = RemoveConsoleCtrlHandler(HandlerRoutine); } - RtlLeaveCriticalSection(&DllLock); + RtlLeaveCriticalSection(&BaseDllDirectoryLock); return(Ret); } diff --git a/reactos/dll/win32/kernel32/misc/dllmain.c b/reactos/dll/win32/kernel32/misc/dllmain.c index ae0ada2e85c..f43b9b27b69 100644 --- a/reactos/dll/win32/kernel32/misc/dllmain.c +++ b/reactos/dll/win32/kernel32/misc/dllmain.c @@ -5,6 +5,7 @@ * FILE: lib/kernel32/misc/dllmain.c * PURPOSE: Initialization * PROGRAMMER: Ariadne ( ariadne@xs4all.nl) + * Aleksey Bragin (aleksey@reactos.org) * UPDATE HISTORY: * Created 01/11/98 */ @@ -20,6 +21,10 @@ extern UNICODE_STRING SystemDirectory; extern UNICODE_STRING WindowsDirectory; +extern UNICODE_STRING BaseDefaultPath; +extern UNICODE_STRING BaseDefaultPathAppend; + +WCHAR BaseDefaultPathBuffer[6140]; HANDLE hProcessHeap = NULL; HMODULE hCurrentModule = NULL; @@ -36,7 +41,7 @@ DllMain(HANDLE hInst, LPVOID lpReserved); /* Critical section for various kernel32 data structures */ -RTL_CRITICAL_SECTION DllLock; +RTL_CRITICAL_SECTION BaseDllDirectoryLock; RTL_CRITICAL_SECTION ConsoleLock; extern BOOL WINAPI DefaultConsoleCtrlHandler(DWORD Event); @@ -275,6 +280,9 @@ DllMain(HANDLE hDll, /* Don't bother us for each thread */ LdrDisableThreadCalloutsForDll((PVOID)hDll); + /* Initialize default path to NULL */ + RtlInitUnicodeString(&BaseDefaultPath, NULL); + /* Setup the right Object Directory path */ if (!SessionId) { @@ -332,11 +340,25 @@ DllMain(HANDLE hDll, SystemDirectory.MaximumLength); if(SystemDirectory.Buffer == NULL) { + DPRINT1("Failure allocating SystemDirectory buffer\n"); return FALSE; } wcscpy(SystemDirectory.Buffer, WindowsDirectory.Buffer); wcscat(SystemDirectory.Buffer, L"\\System32"); + /* Construct the default path (using the static buffer) */ + _snwprintf(BaseDefaultPathBuffer, sizeof(BaseDefaultPathBuffer) / sizeof(WCHAR), + L".;%wZ;%wZ\\system;%wZ;", &SystemDirectory, &WindowsDirectory, &WindowsDirectory); + + BaseDefaultPath.Buffer = BaseDefaultPathBuffer; + BaseDefaultPath.Length = wcslen(BaseDefaultPathBuffer) * sizeof(WCHAR); + BaseDefaultPath.MaximumLength = sizeof(BaseDefaultPathBuffer); + + /* Use remaining part of the default path buffer for the append path */ + BaseDefaultPathAppend.Buffer = (PWSTR)((ULONG_PTR)BaseDefaultPathBuffer + BaseDefaultPath.Length); + BaseDefaultPathAppend.Length = 0; + BaseDefaultPathAppend.MaximumLength = BaseDefaultPath.MaximumLength - BaseDefaultPath.Length; + /* Initialize command line */ InitCommandLines(); @@ -349,7 +371,7 @@ DllMain(HANDLE hDll, } /* Initialize the DLL critical section */ - RtlInitializeCriticalSection(&DllLock); + RtlInitializeCriticalSection(&BaseDllDirectoryLock); /* Initialize the National Language Support routines */ if (!NlsInit()) @@ -395,7 +417,7 @@ DllMain(HANDLE hDll, ConsoleInitialized = FALSE; RtlDeleteCriticalSection (&ConsoleLock); } - RtlDeleteCriticalSection (&DllLock); + RtlDeleteCriticalSection (&BaseDllDirectoryLock); /* Close object base directory */ NtClose(hBaseDir); diff --git a/reactos/dll/win32/kernel32/process/procsup.c b/reactos/dll/win32/kernel32/process/procsup.c index 33b053d9324..a4d35d786d7 100644 --- a/reactos/dll/win32/kernel32/process/procsup.c +++ b/reactos/dll/win32/kernel32/process/procsup.c @@ -14,6 +14,9 @@ #define NDEBUG #include +UNICODE_STRING BasePathVariableName = RTL_CONSTANT_STRING(L"PATH"); +UNICODE_STRING BaseDefaultPath; + #define CMD_STRING L"cmd /c " extern __declspec(noreturn) @@ -352,13 +355,46 @@ BasepDuplicateAndWriteHandle(IN HANDLE ProcessHandle, } } +LPWSTR +WINAPI +BasepGetProcessPath(DWORD Reserved, + LPWSTR FullPath, + PVOID Environment) +{ + return NULL; +} + LPWSTR WINAPI BasepGetDllPath(LPWSTR FullPath, PVOID Environment) { - /* FIXME: Not yet implemented */ - return NULL; + LPWSTR DllPath = NULL; + + /* Acquire DLL directory lock */ + RtlEnterCriticalSection(&BaseDllDirectoryLock); + + /* Check if we have a base dll directory */ + if (BaseDllDirectory.Buffer) + { + /* Then get process path */ + DllPath = BasepGetProcessPath(0, FullPath, Environment); + + /* Release DLL directory lock */ + RtlLeaveCriticalSection(&BaseDllDirectoryLock); + + /* Return dll path */ + return DllPath; + } + + /* Release DLL directory lock */ + RtlLeaveCriticalSection(&BaseDllDirectoryLock); + + /* There is no base DLL directory */ + UNIMPLEMENTED; + + /* Return dll path */ + return DllPath; } VOID From 615f45bf9a7a544335bd0dfde399e62571c264d5 Mon Sep 17 00:00:00 2001 From: Olaf Siejka Date: Tue, 29 Mar 2011 21:48:30 +0000 Subject: [PATCH 028/317] [SHELL32] - Fix build, borked by copypasta svn path=/trunk/; revision=51198 --- reactos/dll/win32/shell32/shlfileop.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/dll/win32/shell32/shlfileop.c b/reactos/dll/win32/shell32/shlfileop.c index ddf6670fe18..2adcbc9adc5 100644 --- a/reactos/dll/win32/shell32/shlfileop.c +++ b/reactos/dll/win32/shell32/shlfileop.c @@ -584,7 +584,7 @@ BOOL QueueFile( FILE_OPERATION_CONTEXT * Context) { - FILE_ENTRY * from, *too = NULL; + FILE_ENTRY * from, *to = NULL; BOOL bRet = FALSE; if (Context->Index >= Context->from->dwNumFiles) From c07f34ceee9d5fde938865270ec0069c36a05fce Mon Sep 17 00:00:00 2001 From: Olaf Siejka Date: Tue, 29 Mar 2011 21:59:57 +0000 Subject: [PATCH 029/317] [SHELL32] - Fix a bug, by Johannes Anderwald svn path=/trunk/; revision=51199 --- reactos/dll/win32/shell32/shlfileop.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/dll/win32/shell32/shlfileop.c b/reactos/dll/win32/shell32/shlfileop.c index 2adcbc9adc5..f22b7225a00 100644 --- a/reactos/dll/win32/shell32/shlfileop.c +++ b/reactos/dll/win32/shell32/shlfileop.c @@ -593,7 +593,7 @@ QueueFile( /* get current file */ from = &Context->from->feFiles[Context->Index]; - if (Context->op->req->fFlags != FO_DELETE) + if (Context->op->req->wFunc != FO_DELETE) to = &Context->to->feFiles[Context->Index]; /* update status */ From f42a29cf5cff5ac2f6536513793c8287cc069a4b Mon Sep 17 00:00:00 2001 From: James Tabor Date: Tue, 29 Mar 2011 23:44:22 +0000 Subject: [PATCH 030/317] [Win32k] - Move IntGdiSetBrushOwner and IntGdiSetRegionOwner out of the export section. svn path=/trunk/; revision=51200 --- .../subsystems/win32/win32k/objects/brush.c | 97 +++++++++---------- .../subsystems/win32/win32k/objects/region.c | 56 +++++------ 2 files changed, 76 insertions(+), 77 deletions(-) diff --git a/reactos/subsystems/win32/win32k/objects/brush.c b/reactos/subsystems/win32/win32k/objects/brush.c index f9d773e2e38..72b7fd3864a 100644 --- a/reactos/subsystems/win32/win32k/objects/brush.c +++ b/reactos/subsystems/win32/win32k/objects/brush.c @@ -162,6 +162,54 @@ FreeObjectAttr(PVOID pAttr) return; } +BOOL +FASTCALL +IntGdiSetBrushOwner(PBRUSH pbr, DWORD OwnerMask) +{ + HBRUSH hBR; + PEPROCESS Owner = NULL; + PGDI_TABLE_ENTRY pEntry = NULL; + + if (!pbr) return FALSE; + + hBR = pbr->BaseObject.hHmgr; + + if (!hBR || (GDI_HANDLE_GET_TYPE(hBR) != GDI_OBJECT_TYPE_BRUSH)) + return FALSE; + else + { + INT Index = GDI_HANDLE_GET_INDEX((HGDIOBJ)hBR); + pEntry = &GdiHandleTable->Entries[Index]; + } + + if (pbr->flAttrs & GDIBRUSH_IS_GLOBAL) + { + GDIOBJ_ShareUnlockObjByPtr((POBJ)pbr); + return TRUE; + } + + if ((OwnerMask == GDI_OBJ_HMGR_PUBLIC) || OwnerMask == GDI_OBJ_HMGR_NONE) + { + // Set this Brush to inaccessible mode and to an Owner of NONE. +// if (OwnerMask == GDI_OBJ_HMGR_NONE) Owner = OwnerMask; + + if (!GDIOBJ_SetOwnership((HGDIOBJ) hBR, Owner)) + return FALSE; + + // Deny user access to User Data. + pEntry->UserData = NULL; // This hBR is inaccessible! + } + + if (OwnerMask == GDI_OBJ_HMGR_POWNED) + { + if (!GDIOBJ_SetOwnership((HGDIOBJ) hBR, PsGetCurrentProcess() )) + return FALSE; + + // Allow user access to User Data. + pEntry->UserData = pbr->pBrushAttr; + } + return TRUE; +} BOOL INTERNAL_CALL @@ -573,53 +621,4 @@ NtGdiSetBrushOrg(HDC hDC, INT XOrg, INT YOrg, LPPOINT Point) return TRUE; } -BOOL -FASTCALL -IntGdiSetBrushOwner(PBRUSH pbr, DWORD OwnerMask) -{ - HBRUSH hBR; - PEPROCESS Owner = NULL; - PGDI_TABLE_ENTRY pEntry = NULL; - - if (!pbr) return FALSE; - - hBR = pbr->BaseObject.hHmgr; - - if (!hBR || (GDI_HANDLE_GET_TYPE(hBR) != GDI_OBJECT_TYPE_BRUSH)) - return FALSE; - else - { - INT Index = GDI_HANDLE_GET_INDEX((HGDIOBJ)hBR); - pEntry = &GdiHandleTable->Entries[Index]; - } - - if (pbr->flAttrs & GDIBRUSH_IS_GLOBAL) - { - GDIOBJ_ShareUnlockObjByPtr((POBJ)pbr); - return TRUE; - } - - if ((OwnerMask == GDI_OBJ_HMGR_PUBLIC) || OwnerMask == GDI_OBJ_HMGR_NONE) - { - // Set this Brush to inaccessible mode and to an Owner of NONE. -// if (OwnerMask == GDI_OBJ_HMGR_NONE) Owner = OwnerMask; - - if (!GDIOBJ_SetOwnership((HGDIOBJ) hBR, Owner)) - return FALSE; - - // Deny user access to User Data. - pEntry->UserData = NULL; // This hBR is inaccessible! - } - - if (OwnerMask == GDI_OBJ_HMGR_POWNED) - { - if (!GDIOBJ_SetOwnership((HGDIOBJ) hBR, PsGetCurrentProcess() )) - return FALSE; - - // Allow user access to User Data. - pEntry->UserData = pbr->pBrushAttr; - } - return TRUE; -} - /* EOF */ diff --git a/reactos/subsystems/win32/win32k/objects/region.c b/reactos/subsystems/win32/win32k/objects/region.c index 56b6763148e..9a267493002 100644 --- a/reactos/subsystems/win32/win32k/objects/region.c +++ b/reactos/subsystems/win32/win32k/objects/region.c @@ -2294,6 +2294,34 @@ IntUpdateVisRectRgn(PDC pDC, PROSRGNDATA pRgn) } } +BOOL +FASTCALL +IntGdiSetRegionOwner(HRGN hRgn, DWORD OwnerMask) +{ + INT Index; + PGDI_TABLE_ENTRY Entry; +/* + System Regions: + These regions do not use attribute sections and when allocated, use gdiobj + level functions. + */ + // FIXME! HAX!!! Remove this once we get everything right! + Index = GDI_HANDLE_GET_INDEX(hRgn); + Entry = &GdiHandleTable->Entries[Index]; + if (Entry->UserData) FreeObjectAttr(Entry->UserData); + Entry->UserData = NULL; + // + if ((OwnerMask == GDI_OBJ_HMGR_PUBLIC) || OwnerMask == GDI_OBJ_HMGR_NONE) + { + return GDIOBJ_SetOwnership(hRgn, NULL); + } + if (OwnerMask == GDI_OBJ_HMGR_POWNED) + { + return GDIOBJ_SetOwnership((HGDIOBJ) hRgn, PsGetCurrentProcess() ); + } + return FALSE; +} + INT FASTCALL IntGdiCombineRgn(PROSRGNDATA destRgn, @@ -3942,32 +3970,4 @@ NtGdiGetRegionData( return size + sizeof(RGNDATAHEADER); } -BOOL -FASTCALL -IntGdiSetRegionOwner(HRGN hRgn, DWORD OwnerMask) -{ - INT Index; - PGDI_TABLE_ENTRY Entry; -/* - System Regions: - These regions do not use attribute sections and when allocated, use gdiobj - level functions. - */ - // FIXME! HAX!!! Remove this once we get everything right! - Index = GDI_HANDLE_GET_INDEX(hRgn); - Entry = &GdiHandleTable->Entries[Index]; - if (Entry->UserData) FreeObjectAttr(Entry->UserData); - Entry->UserData = NULL; - // - if ((OwnerMask == GDI_OBJ_HMGR_PUBLIC) || OwnerMask == GDI_OBJ_HMGR_NONE) - { - return GDIOBJ_SetOwnership(hRgn, NULL); - } - if (OwnerMask == GDI_OBJ_HMGR_POWNED) - { - return GDIOBJ_SetOwnership((HGDIOBJ) hRgn, PsGetCurrentProcess() ); - } - return FALSE; -} - /* EOF */ From 0d6b3c7ebd6229a2bd46b04d86cae6ef89cf0d7b Mon Sep 17 00:00:00 2001 From: James Tabor Date: Wed, 30 Mar 2011 01:00:28 +0000 Subject: [PATCH 031/317] [User32|Win32k] - Update NtUser pump functions, based on known values. Move one more function to the right place. svn path=/trunk/; revision=51201 --- reactos/include/reactos/win32k/ntuser.h | 28 ++++---- .../subsystems/win32/win32k/ntuser/ntstubs.c | 28 ++++---- .../subsystems/win32/win32k/ntuser/window.c | 67 ------------------- .../subsystems/win32/win32k/ntuser/winpos.c | 66 ++++++++++++++++++ 4 files changed, 94 insertions(+), 95 deletions(-) diff --git a/reactos/include/reactos/win32k/ntuser.h b/reactos/include/reactos/win32k/ntuser.h index b6e2d8339ef..71ea1772fc6 100644 --- a/reactos/include/reactos/win32k/ntuser.h +++ b/reactos/include/reactos/win32k/ntuser.h @@ -2404,28 +2404,28 @@ NtUserQueryWindow( HWND hWnd, DWORD Index); -DWORD +BOOL NTAPI NtUserRealInternalGetMessage( - DWORD dwUnknown1, - DWORD dwUnknown2, - DWORD dwUnknown3, - DWORD dwUnknown4, - DWORD dwUnknown5, - DWORD dwUnknown6); + LPMSG lpMsg, + HWND hWnd, + UINT wMsgFilterMin, + UINT wMsgFilterMax, + UINT wRemoveMsg, + BOOL bGMSG); -DWORD +HWND NTAPI NtUserRealChildWindowFromPoint( - DWORD Unknown0, - DWORD Unknown1, - DWORD Unknown2); + HWND Parent, + LONG x, + LONG y); -DWORD +BOOL NTAPI NtUserRealWaitMessageEx( - DWORD dwUnknown1, - DWORD dwUnknown2); + DWORD dwWakeMask, + UINT uTimeout); BOOL NTAPI diff --git a/reactos/subsystems/win32/win32k/ntuser/ntstubs.c b/reactos/subsystems/win32/win32k/ntuser/ntstubs.c index c0834596f81..06b84793c87 100644 --- a/reactos/subsystems/win32/win32k/ntuser/ntstubs.c +++ b/reactos/subsystems/win32/win32k/ntuser/ntstubs.c @@ -935,25 +935,25 @@ NtUserQueryInputContext( return 0; } -DWORD +BOOL APIENTRY NtUserRealInternalGetMessage( - DWORD dwUnknown1, - DWORD dwUnknown2, - DWORD dwUnknown3, - DWORD dwUnknown4, - DWORD dwUnknown5, - DWORD dwUnknown6) + LPMSG lpMsg, + HWND hWnd, + UINT wMsgFilterMin, + UINT wMsgFilterMax, + UINT wRemoveMsg, + BOOL bGMSG) { UNIMPLEMENTED; return 0; } -DWORD +BOOL APIENTRY NtUserRealWaitMessageEx( - DWORD dwUnknown1, - DWORD dwUnknown2) + DWORD dwWakeMask, + UINT uTimeout) { UNIMPLEMENTED; return 0; @@ -1252,10 +1252,10 @@ NtUserLockWindowUpdate(HWND hWnd) /* * @unimplemented */ -DWORD APIENTRY -NtUserRealChildWindowFromPoint(DWORD Unknown0, - DWORD Unknown1, - DWORD Unknown2) +HWND APIENTRY +NtUserRealChildWindowFromPoint(HWND Parent, + LONG x, + LONG y) { UNIMPLEMENTED diff --git a/reactos/subsystems/win32/win32k/ntuser/window.c b/reactos/subsystems/win32/win32k/ntuser/window.c index 72d232b5393..acd8a1aa14b 100644 --- a/reactos/subsystems/win32/win32k/ntuser/window.c +++ b/reactos/subsystems/win32/win32k/ntuser/window.c @@ -1478,73 +1478,6 @@ NtUserBuildHwndList( return STATUS_SUCCESS; } - -/* - * @implemented - */ -HWND APIENTRY -NtUserChildWindowFromPointEx(HWND hwndParent, - LONG x, - LONG y, - UINT uiFlags) -{ - PWND Parent; - POINTL Pt; - HWND Ret; - HWND *List, *phWnd; - - if(!(Parent = UserGetWindowObject(hwndParent))) - { - return NULL; - } - - Pt.x = x; - Pt.y = y; - - if(Parent->head.h != IntGetDesktopWindow()) - { - Pt.x += Parent->rcClient.left; - Pt.y += Parent->rcClient.top; - } - - if(!IntPtInWindow(Parent, Pt.x, Pt.y)) - { - return NULL; - } - - Ret = Parent->head.h; - if((List = IntWinListChildren(Parent))) - { - for(phWnd = List; *phWnd; phWnd++) - { - PWND Child; - if((Child = UserGetWindowObject(*phWnd))) - { - if(!(Child->style & WS_VISIBLE) && (uiFlags & CWP_SKIPINVISIBLE)) - { - continue; - } - if((Child->style & WS_DISABLED) && (uiFlags & CWP_SKIPDISABLED)) - { - continue; - } - if((Child->ExStyle & WS_EX_TRANSPARENT) && (uiFlags & CWP_SKIPTRANSPARENT)) - { - continue; - } - if(IntPtInWindow(Child, Pt.x, Pt.y)) - { - Ret = Child->head.h; - break; - } - } - } - ExFreePool(List); - } - - return Ret; -} - static void IntSendParentNotify( PWND pWindow, UINT msg ) { if ( (pWindow->style & (WS_CHILD | WS_POPUP)) == WS_CHILD && diff --git a/reactos/subsystems/win32/win32k/ntuser/winpos.c b/reactos/subsystems/win32/win32k/ntuser/winpos.c index 3934dcb21b6..7b9a6f6fa44 100644 --- a/reactos/subsystems/win32/win32k/ntuser/winpos.c +++ b/reactos/subsystems/win32/win32k/ntuser/winpos.c @@ -1797,6 +1797,72 @@ BOOL FASTCALL IntEndDeferWindowPosEx( HDWP hdwp ) return res; } +/* + * @implemented + */ +HWND APIENTRY +NtUserChildWindowFromPointEx(HWND hwndParent, + LONG x, + LONG y, + UINT uiFlags) +{ + PWND Parent; + POINTL Pt; + HWND Ret; + HWND *List, *phWnd; + + if(!(Parent = UserGetWindowObject(hwndParent))) + { + return NULL; + } + + Pt.x = x; + Pt.y = y; + + if(Parent->head.h != IntGetDesktopWindow()) + { + Pt.x += Parent->rcClient.left; + Pt.y += Parent->rcClient.top; + } + + if(!IntPtInWindow(Parent, Pt.x, Pt.y)) + { + return NULL; + } + + Ret = Parent->head.h; + if((List = IntWinListChildren(Parent))) + { + for(phWnd = List; *phWnd; phWnd++) + { + PWND Child; + if((Child = UserGetWindowObject(*phWnd))) + { + if(!(Child->style & WS_VISIBLE) && (uiFlags & CWP_SKIPINVISIBLE)) + { + continue; + } + if((Child->style & WS_DISABLED) && (uiFlags & CWP_SKIPDISABLED)) + { + continue; + } + if((Child->ExStyle & WS_EX_TRANSPARENT) && (uiFlags & CWP_SKIPTRANSPARENT)) + { + continue; + } + if(IntPtInWindow(Child, Pt.x, Pt.y)) + { + Ret = Child->head.h; + break; + } + } + } + ExFreePool(List); + } + + return Ret; +} + /* * @implemented */ From 815eb466ba330dd351be34c49b97b87b5ba4f5a7 Mon Sep 17 00:00:00 2001 From: James Tabor Date: Wed, 30 Mar 2011 01:26:54 +0000 Subject: [PATCH 032/317] [User32] - Connect the rest of the pump hooks and start tracking from application testing. svn path=/trunk/; revision=51202 --- reactos/dll/win32/user32/windows/message.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/reactos/dll/win32/user32/windows/message.c b/reactos/dll/win32/user32/windows/message.c index f00e6670a00..5536d835cec 100644 --- a/reactos/dll/win32/user32/windows/message.c +++ b/reactos/dll/win32/user32/windows/message.c @@ -2491,11 +2491,13 @@ BOOL WINAPI SetMessageQueue(int cMessagesMax) } typedef DWORD (WINAPI * RealGetQueueStatusProc)(UINT flags); typedef DWORD (WINAPI * RealMsgWaitForMultipleObjectsExProc)(DWORD nCount, CONST HANDLE *lpHandles, DWORD dwMilliseconds, DWORD dwWakeMask, DWORD dwFlags); +typedef BOOL (WINAPI * RealInternalGetMessageProc)(LPMSG,HWND,UINT,UINT,UINT,BOOL); +typedef BOOL (WINAPI * RealWaitMessageExProc)(DWORD,UINT); typedef struct _USER_MESSAGE_PUMP_ADDRESSES { DWORD cbSize; - //NtUserRealInternalGetMessageProc NtUserRealInternalGetMessage; - //NtUserRealWaitMessageExProc NtUserRealWaitMessageEx; + RealInternalGetMessageProc NtUserRealInternalGetMessage; + RealWaitMessageExProc NtUserRealWaitMessageEx; RealGetQueueStatusProc RealGetQueueStatus; RealMsgWaitForMultipleObjectsExProc RealMsgWaitForMultipleObjectsEx; } USER_MESSAGE_PUMP_ADDRESSES, * PUSER_MESSAGE_PUMP_ADDRESSES; @@ -2515,8 +2517,8 @@ CRITICAL_SECTION gcsMPH; MESSAGEPUMPHOOKPROC gpfnInitMPH; DWORD gcLoadMPH = 0; USER_MESSAGE_PUMP_ADDRESSES gmph = {sizeof(USER_MESSAGE_PUMP_ADDRESSES), - //NtUserRealInternalGetMessage, - //NtUserRealInternalWaitMessageEx, + NtUserRealInternalGetMessage, + NtUserRealWaitMessageEx, RealGetQueueStatus, RealMsgWaitForMultipleObjectsEx }; @@ -2532,8 +2534,8 @@ BOOL WINAPI IsInsideMessagePumpHook() void WINAPI ResetMessagePumpHook(PUSER_MESSAGE_PUMP_ADDRESSES Addresses) { Addresses->cbSize = sizeof(USER_MESSAGE_PUMP_ADDRESSES); - //Addresses->NtUserRealInternalGetMessage = (NtUserRealInternalGetMessageProc)NtUserRealInternalGetMessage; - //Addresses->NtUserRealWaitMessageEx = (NtUserRealWaitMessageExProc)NtUserRealInternalWaitMessageEx; + Addresses->NtUserRealInternalGetMessage = NtUserRealInternalGetMessage; + Addresses->NtUserRealWaitMessageEx = NtUserRealWaitMessageEx; Addresses->RealGetQueueStatus = RealGetQueueStatus; Addresses->RealMsgWaitForMultipleObjectsEx = RealMsgWaitForMultipleObjectsEx; } From 88339aa831161a7e22601814feb20afd7b9ab77c Mon Sep 17 00:00:00 2001 From: James Tabor Date: Wed, 30 Mar 2011 08:19:52 +0000 Subject: [PATCH 033/317] [User32|Win32k] - Move EnableWindow to Win32k. - Fix sign in class function. svn path=/trunk/; revision=51203 --- reactos/dll/win32/user32/windows/class.c | 2 +- reactos/dll/win32/user32/windows/input.c | 37 +--------------- .../subsystems/win32/win32k/include/window.h | 2 + .../win32/win32k/ntuser/simplecall.c | 3 +- .../subsystems/win32/win32k/ntuser/window.c | 44 +++++++++++++++++++ 5 files changed, 49 insertions(+), 39 deletions(-) diff --git a/reactos/dll/win32/user32/windows/class.c b/reactos/dll/win32/user32/windows/class.c index 6770b6d6d0b..0d9ae490b69 100644 --- a/reactos/dll/win32/user32/windows/class.c +++ b/reactos/dll/win32/user32/windows/class.c @@ -933,7 +933,7 @@ RealGetWindowClassA( WCHAR tmpbuf[MAX_ATOM_LEN + 1]; UINT len; - if (cchType <= 0) return 0; + if ((INT)cchType <= 0) return 0; if (!RealGetWindowClassW( hwnd, tmpbuf, sizeof(tmpbuf)/sizeof(WCHAR) )) return 0; RtlUnicodeToMultiByteN( pszType, cchType - 1, (PULONG)&len, tmpbuf, strlenW(tmpbuf) * sizeof(WCHAR) ); pszType[len] = 0; diff --git a/reactos/dll/win32/user32/windows/input.c b/reactos/dll/win32/user32/windows/input.c index 63f266eb492..e9189576963 100644 --- a/reactos/dll/win32/user32/windows/input.c +++ b/reactos/dll/win32/user32/windows/input.c @@ -100,7 +100,6 @@ DragDetect( #endif } - /* * @implemented */ @@ -108,43 +107,9 @@ BOOL WINAPI EnableWindow(HWND hWnd, BOOL bEnable) { - // This will soon be moved to win32k. - BOOL Update; - LONG Style = GetWindowLongPtrW(hWnd, GWL_STYLE); - /* check if updating is needed */ - UINT bIsDisabled = (Style & WS_DISABLED); - Update = bIsDisabled; - - if (bEnable) - { - Style &= ~WS_DISABLED; - } - else - { - Update = !bIsDisabled; - - SendMessageW( hWnd, WM_CANCELMODE, 0, 0); - - /* Remove keyboard focus from that window if it had focus */ - if (hWnd == GetFocus()) - { - SetFocus(NULL); - } - Style |= WS_DISABLED; - } - - NtUserSetWindowLong(hWnd, GWL_STYLE, Style, FALSE); - - if (Update) - { - IntNotifyWinEvent(EVENT_OBJECT_STATECHANGE, hWnd, OBJID_WINDOW, CHILDID_SELF, 0); - SendMessageW(hWnd, WM_ENABLE, (LPARAM)bEnable, 0); - } - // Return nonzero if it was disabled, or zero if it wasn't: - return bIsDisabled; + return NtUserCallTwoParam((DWORD_PTR)hWnd, (DWORD_PTR)bEnable, TWOPARAM_ROUTINE_ENABLEWINDOW); } - /* * @implemented */ diff --git a/reactos/subsystems/win32/win32k/include/window.h b/reactos/subsystems/win32/win32k/include/window.h index 0e2073d3df1..44e6a8c86db 100644 --- a/reactos/subsystems/win32/win32k/include/window.h +++ b/reactos/subsystems/win32/win32k/include/window.h @@ -111,4 +111,6 @@ VOID FASTCALL IntNotifyWinEvent(DWORD, PWND, LONG, LONG, DWORD); PWND FASTCALL co_UserCreateWindowEx(CREATESTRUCTW*, PUNICODE_STRING, PLARGE_STRING); WNDPROC FASTCALL IntGetWindowProc(PWND,BOOL); +BOOL FASTCALL IntEnableWindow(HWND,BOOL); + /* EOF */ diff --git a/reactos/subsystems/win32/win32k/ntuser/simplecall.c b/reactos/subsystems/win32/win32k/ntuser/simplecall.c index d4a1a14f403..21109806fe9 100644 --- a/reactos/subsystems/win32/win32k/ntuser/simplecall.c +++ b/reactos/subsystems/win32/win32k/ntuser/simplecall.c @@ -436,8 +436,7 @@ NtUserCallTwoParam( } case TWOPARAM_ROUTINE_ENABLEWINDOW: - UNIMPLEMENTED - RETURN( 0); + RETURN( IntEnableWindow((HWND)Param1, (BOOL)Param2)); case TWOPARAM_ROUTINE_SHOWOWNEDPOPUPS: { diff --git a/reactos/subsystems/win32/win32k/ntuser/window.c b/reactos/subsystems/win32/win32k/ntuser/window.c index acd8a1aa14b..21aecf32546 100644 --- a/reactos/subsystems/win32/win32k/ntuser/window.c +++ b/reactos/subsystems/win32/win32k/ntuser/window.c @@ -176,6 +176,50 @@ IntGetParent(PWND Wnd) return NULL; } +BOOL +FASTCALL +IntEnableWindow( HWND hWnd, BOOL bEnable ) +{ + BOOL Update; + PWND pWnd; + UINT bIsDisabled; + + if(!(pWnd = UserGetWindowObject(hWnd))) + { + return FALSE; + } + + /* check if updating is needed */ + bIsDisabled = (pWnd->style & WS_DISABLED); + Update = bIsDisabled; + + if (bEnable) + { + pWnd->style &= ~WS_DISABLED; + } + else + { + Update = !bIsDisabled; + + co_IntSendMessage( hWnd, WM_CANCELMODE, 0, 0); + + /* Remove keyboard focus from that window if it had focus */ + if (hWnd == IntGetThreadFocusWindow()) + { + co_UserSetFocus(NULL); + } + pWnd->style |= WS_DISABLED; + } + + if (Update) + { + IntNotifyWinEvent(EVENT_OBJECT_STATECHANGE, pWnd, OBJID_WINDOW, CHILDID_SELF, 0); + co_IntSendMessage(hWnd, WM_ENABLE, (LPARAM)bEnable, 0); + } + // Return nonzero if it was disabled, or zero if it wasn't: + return bIsDisabled; +} + /* * IntWinListChildren * From 550e976e243ed90dfacb0f97e2264e5b60f9d66f Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Wed, 30 Mar 2011 11:05:40 +0000 Subject: [PATCH 034/317] [NTOS/KE] - Clear KernelApcPending flag every time the Kernel APCs queue is not empty. svn path=/trunk/; revision=51204 --- reactos/ntoskrnl/ke/apc.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/reactos/ntoskrnl/ke/apc.c b/reactos/ntoskrnl/ke/apc.c index 53f19f1a271..c4bab2a4c02 100644 --- a/reactos/ntoskrnl/ke/apc.c +++ b/reactos/ntoskrnl/ke/apc.c @@ -340,6 +340,9 @@ KiDeliverApc(IN KPROCESSOR_MODE DeliveryMode, break; } + /* Kernel APC is not pending anymore */ + Thread->ApcState.KernelApcPending = FALSE; + /* Get the next Entry */ ApcListEntry = Thread->ApcState.ApcListHead[KernelMode].Flink; Apc = CONTAINING_RECORD(ApcListEntry, KAPC, ApcListEntry); From e37934bec0074e234365b1e2e4466eee0bc011bf Mon Sep 17 00:00:00 2001 From: Gabriel Ilardi Date: Wed, 30 Mar 2011 13:02:57 +0000 Subject: [PATCH 035/317] [CMD] Fix a typo in dir that led to omitting the last character in the AM/PM time format. See issue #6061 for more details. svn path=/trunk/; revision=51205 --- reactos/base/shell/cmd/dir.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/base/shell/cmd/dir.c b/reactos/base/shell/cmd/dir.c index ce1e5657771..e648f0cbde4 100644 --- a/reactos/base/shell/cmd/dir.c +++ b/reactos/base/shell/cmd/dir.c @@ -680,10 +680,10 @@ FormatTime(TCHAR *lpTime, LPSYSTEMTIME dt) { case 0: /* 12 hour format */ default: - return _stprintf(lpTime,_T("%02d%c%02u%c"), + return _stprintf(lpTime,_T("%02d%c%02u %cM"), (dt->wHour == 0 ? 12 : (dt->wHour <= 12 ? dt->wHour : dt->wHour - 12)), cTimeSeparator, - dt->wMinute, (dt->wHour <= 11 ? _T('a') : _T('p'))); + dt->wMinute, (dt->wHour <= 11 ? _T('A') : _T('P'))); break; case 1: /* 24 hour format */ From 5882dc90387a8eb351e39f318f797b4c7ea69955 Mon Sep 17 00:00:00 2001 From: Olaf Siejka Date: Wed, 30 Mar 2011 18:49:01 +0000 Subject: [PATCH 036/317] [DESK] - Translation patch by Adam "Saibamen" Stachowicz. See issue #6057 for more details. [EXPLORER] - Translation patch by Adam "Saibamen" Stachowicz. [SERVMAN] - Translation patch by Adam "Saibamen" Stachowicz. [SHELL32] - Translation patch by Adam "Saibamen" Stachowicz. See issue #6060 for more details. svn path=/trunk/; revision=51206 --- .../base/applications/mscutils/servman/lang/pl-PL.rc | 11 ++++++----- reactos/base/shell/explorer/explorer-pl.rc | 4 ++-- reactos/dll/cpl/desk/lang/pl-PL.rc | 11 ++++++----- reactos/dll/win32/shell32/lang/pl-PL.rc | 2 +- 4 files changed, 15 insertions(+), 13 deletions(-) diff --git a/reactos/base/applications/mscutils/servman/lang/pl-PL.rc b/reactos/base/applications/mscutils/servman/lang/pl-PL.rc index ea785ed3433..df0759c7e9f 100644 --- a/reactos/base/applications/mscutils/servman/lang/pl-PL.rc +++ b/reactos/base/applications/mscutils/servman/lang/pl-PL.rc @@ -4,6 +4,7 @@ * https://sourceforge.net/projects/reactospl * * updated by Caemyr - Olaf Siejka (Jan, 2008) + * updated by Saibamen - Adam Stachowicz (Mar, 2011) */ LANGUAGE LANG_POLISH, SUBLANG_DEFAULT @@ -46,7 +47,7 @@ BEGIN POPUP "Pomoc" BEGIN MENUITEM "Pomoc", ID_HELP - MENUITEM "Servman - informacje", ID_ABOUT + MENUITEM "O programie", ID_ABOUT END END @@ -72,11 +73,11 @@ BEGIN END IDD_ABOUTBOX DIALOGEX 22,16,190,182 -CAPTION "Service Manager - informacje" +CAPTION "Meneder Usug - informacje" FONT 8, "MS Shell Dlg",0,0 STYLE DS_SHELLFONT | WS_BORDER | WS_DLGFRAME | WS_SYSMENU | DS_MODALFRAME BEGIN - LTEXT "Service Manager v0.5.1\nCopyright (C) 2005-2006\nby Ged Murphy (gedmurphy@gmail.com)", IDC_STATIC, 48, 7, 135, 26 + LTEXT "Meneder Usug v0.5.1\nCopyright (C) 2005-2006\nby Ged Murphy (gedmurphy@gmail.com)", IDC_STATIC, 48, 7, 135, 26 PUSHBUTTON "Zamknij", IDOK, 75, 162, 44, 15 ICON IDI_SM_ICON, IDC_STATIC, 10, 10, 7, 30 EDITTEXT IDC_LICENSE_EDIT, 8, 44, 174, 107, WS_VISIBLE | WS_VSCROLL | WS_TABSTOP | ES_READONLY | ES_MULTILINE @@ -198,8 +199,8 @@ END STRINGTABLE DISCARDABLE BEGIN IDS_NUM_SERVICES "Numer usugi: %d" - IDS_STOP_DEPENDS "When %s stops, these other services will also stop" - IDS_NO_DEPENDS "" + IDS_STOP_DEPENDS "Kiedy %s si zatrzyma, inne usugi rwnie si zatrzymaj" + IDS_NO_DEPENDS "" IDS_LICENSE "Niniejszy program jest wolnym oprogramowaniem; moesz go rozprowadza dalej i/lub modyfikowa na warunkach Powszechnej Licencji Publicznej GNU, wydanej przez Fundacj Wolnego Oprogramowania - wedug wersji 2 tej Licencji lub (wedug Twojego wyboru) ktrej z pniejszych wersji.\r\n\r\nNiniejszy program rozpowszechniany jest z nadziej, i bdzie on uyteczny - jednak BEZ JAKIEJKOLWIEK GWARANCJI, nawet domylnej gwarancji PRZYDATNOCI HANDLOWEJ albo PRZYDATNOCI DO OKRELONYCH ZASTOSOWA. W celu uzyskania bliszych informacji signij do Powszechnej Licencji Publicznej GNU.\r\n\r\nZ pewnoci wraz z niniejszym programem otrzymae te egzemplarz Powszechnej Licencji Publicznej GNU (GNU General Public License); jeli nie - napisz do Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA." END diff --git a/reactos/base/shell/explorer/explorer-pl.rc b/reactos/base/shell/explorer/explorer-pl.rc index 06a142d5ae3..9dad38a8f7a 100644 --- a/reactos/base/shell/explorer/explorer-pl.rc +++ b/reactos/base/shell/explorer/explorer-pl.rc @@ -381,8 +381,8 @@ BEGIN IDS_DESKTOPBAR_SETTINGS "Waciwoci pulpitu" IDS_DESKTOP "Pulpit" IDS_TASKBAR "Pasek zada" - IDS_NAMECOLUMN "Name" - IDS_PATHCOLUMN "Path" + IDS_NAMECOLUMN "Nazwa" + IDS_PATHCOLUMN "cieka" IDS_MENUCOLUMN "Menu path" END diff --git a/reactos/dll/cpl/desk/lang/pl-PL.rc b/reactos/dll/cpl/desk/lang/pl-PL.rc index 80c38df7b7d..50f6ef58b4c 100644 --- a/reactos/dll/cpl/desk/lang/pl-PL.rc +++ b/reactos/dll/cpl/desk/lang/pl-PL.rc @@ -7,6 +7,7 @@ * Use ReactOS forum PM or IRC to contact me * http://www.reactos.org * IRC: irc.freenode.net #reactos-pl; +* update by Saibamen saibamenppl@gmail.com (29.03.2011) */ LANGUAGE LANG_POLISH, SUBLANG_DEFAULT @@ -217,11 +218,11 @@ END STRINGTABLE DISCARDABLE BEGIN - IDS_COLOR_4BIT "16 kolorw (4 Bity)" - IDS_COLOR_8BIT "256 kolorw (8 Bitw)" - IDS_COLOR_16BIT "65,536 kolorw (16 Bitw)" - IDS_COLOR_24BIT "16,777,216 kolorw (24 Bitw)" - IDS_COLOR_32BIT "16,777,216 kolorw (32 Bity)" + IDS_COLOR_4BIT "16 kolorw" + IDS_COLOR_8BIT "256 kolorw" + IDS_COLOR_16BIT "High Color (16 Bitw)" + IDS_COLOR_24BIT "True Color (24 Bitw)" + IDS_COLOR_32BIT "True Color (32 Bity)" IDS_PIXEL "%lux%lu pikseli" END diff --git a/reactos/dll/win32/shell32/lang/pl-PL.rc b/reactos/dll/win32/shell32/lang/pl-PL.rc index cb33116bd45..588990e6fe3 100644 --- a/reactos/dll/win32/shell32/lang/pl-PL.rc +++ b/reactos/dll/win32/shell32/lang/pl-PL.rc @@ -223,7 +223,7 @@ BEGIN LTEXT "", 14011, 68, 93, 160, 10 LTEXT "Utworzony:", 14014, 8, 118, 45, 10 LTEXT "", 14015, 68, 118, 160, 10 - AUTOCHECKBOX "&Tylko-do-odczytu", 14021, 45, 150, 67, 10 + AUTOCHECKBOX "&Tylko do odczytu", 14021, 45, 150, 67, 10 AUTOCHECKBOX "&Ukryty", 14022, 126, 150, 50, 10 END From b94139f67f9a2d37033c36cd1c3738cd16563a52 Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Wed, 30 Mar 2011 20:56:05 +0000 Subject: [PATCH 037/317] [NTDLL] - Add RtlDosApplyFileIsolationRedirection_Ustr() stub. svn path=/trunk/; revision=51207 --- reactos/dll/ntdll/rtl/libsupp.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/reactos/dll/ntdll/rtl/libsupp.c b/reactos/dll/ntdll/rtl/libsupp.c index 4239183c436..f3e685c10af 100644 --- a/reactos/dll/ntdll/rtl/libsupp.c +++ b/reactos/dll/ntdll/rtl/libsupp.c @@ -519,3 +519,22 @@ RtlPcToFileHeader(IN PVOID PcValue, *BaseOfImage = ImageBase; return ImageBase; } + +NTSYSAPI +NTSTATUS +NTAPI +RtlDosApplyFileIsolationRedirection_Ustr( + IN BOOLEAN Unknown, + IN PUNICODE_STRING OriginalName, + IN PUNICODE_STRING Extension, + IN OUT PUNICODE_STRING RedirectedName, + IN OUT PUNICODE_STRING RedirectedName2, + IN OUT PUNICODE_STRING *OriginalName2, + IN PVOID Unknown1, + IN PVOID Unknown2, + IN PVOID Unknown3 +) +{ + return STATUS_SXS_KEY_NOT_FOUND; +} + From b98f8ccd88bace66631c6635c99f223a6b50298e Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Wed, 30 Mar 2011 21:21:42 +0000 Subject: [PATCH 038/317] [NTDLL] - Implement LdrEnumerateLoadedModules(). svn path=/trunk/; revision=51208 --- reactos/dll/ntdll/def/ntdll.pspec | 2 +- reactos/dll/ntdll/ldr/ldrapi.c | 62 +++++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+), 1 deletion(-) diff --git a/reactos/dll/ntdll/def/ntdll.pspec b/reactos/dll/ntdll/def/ntdll.pspec index f9027dda2a1..2c5de04b8d1 100644 --- a/reactos/dll/ntdll/def/ntdll.pspec +++ b/reactos/dll/ntdll/def/ntdll.pspec @@ -77,7 +77,7 @@ //@ stdcall LdrDestroyOutOfProcessImage @ stdcall LdrDisableThreadCalloutsForDll(long) @ stdcall LdrEnumResources(ptr ptr long ptr ptr) -//@ stdcall LdrEnumerateLoadedModules +@ stdcall LdrEnumerateLoadedModules(long ptr long) //@ stdcall LdrFindCreateProcessManifest // 5.1 and 5.2 only @ stdcall LdrFindEntryForAddress(ptr ptr) @ stdcall LdrFindResourceDirectory_U(long ptr long ptr) diff --git a/reactos/dll/ntdll/ldr/ldrapi.c b/reactos/dll/ntdll/ldr/ldrapi.c index 0a19351dab8..ad56964d7ea 100644 --- a/reactos/dll/ntdll/ldr/ldrapi.c +++ b/reactos/dll/ntdll/ldr/ldrapi.c @@ -530,4 +530,66 @@ LdrQueryProcessModuleInformation(IN PRTL_PROCESS_MODULES ModuleInformation, return LdrQueryProcessModuleInformationEx(0, 0, ModuleInformation, Size, ReturnedSize); } +NTSTATUS +NTAPI +LdrEnumerateLoadedModules(BOOLEAN ReservedFlag, PLDR_ENUM_CALLBACK EnumProc, ULONG Context) +{ + PLIST_ENTRY ListHead, ListEntry; + PLDR_DATA_TABLE_ENTRY LdrEntry; + NTSTATUS Status; + ULONG Cookie; + BOOLEAN Stop = FALSE; + + /* Check parameters */ + if (ReservedFlag || !EnumProc) return STATUS_INVALID_PARAMETER; + + /* Acquire the loader lock */ + Status = LdrLockLoaderLock(0, NULL, &Cookie); + if (!NT_SUCCESS(Status)) return Status; + + /* Loop all the modules and call enum proc */ + ListHead = &NtCurrentPeb()->Ldr->InLoadOrderModuleList; + ListEntry = ListHead->Flink; + while (ListHead != ListEntry) + { + /* Get the entry */ + LdrEntry = CONTAINING_RECORD(ListEntry, LDR_DATA_TABLE_ENTRY, InLoadOrderLinks); + + /* Call the enumeration proc inside SEH */ + _SEH2_TRY + { + EnumProc(LdrEntry, Context, &Stop); + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + /* Ignoring the exception */ + } _SEH2_END; + + /* Break if we were asked to stop enumeration */ + if (Stop) + { + /* Release loader lock */ + Status = LdrUnlockLoaderLock(0, Cookie); + + /* Reset any successful status to STATUS_SUCCESS, but leave + failure to the caller */ + if (NT_SUCCESS(Status)) + Status = STATUS_SUCCESS; + + /* Return any possible failure status */ + return Status; + } + + /* Advance to the next module */ + ListEntry = ListEntry->Flink; + } + + /* Release loader lock, it must succeed this time */ + Status = LdrUnlockLoaderLock(0, Cookie); + ASSERT(NT_SUCCESS(Status)); + + /* Return success */ + return STATUS_SUCCESS; +} + /* EOF */ From c7b59706ce6c8c907773fcf8559e498af6d22a46 Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Wed, 30 Mar 2011 21:33:57 +0000 Subject: [PATCH 039/317] - Fix build. svn path=/trunk/; revision=51209 --- reactos/include/ndk/ldrfuncs.h | 8 ++++++++ reactos/include/ndk/ldrtypes.h | 6 ++++++ 2 files changed, 14 insertions(+) diff --git a/reactos/include/ndk/ldrfuncs.h b/reactos/include/ndk/ldrfuncs.h index 743d213b87e..8b967fa8e3d 100644 --- a/reactos/include/ndk/ldrfuncs.h +++ b/reactos/include/ndk/ldrfuncs.h @@ -118,4 +118,12 @@ LdrProcessRelocationBlockLongLong( IN LONGLONG Delta ); +NTSTATUS +NTAPI +LdrEnumerateLoadedModules( + IN BOOLEAN ReservedFlag, + IN PLDR_ENUM_CALLBACK EnumProc, + IN ULONG Context +); + #endif diff --git a/reactos/include/ndk/ldrtypes.h b/reactos/include/ndk/ldrtypes.h index d706fec93e3..fbfa381638b 100644 --- a/reactos/include/ndk/ldrtypes.h +++ b/reactos/include/ndk/ldrtypes.h @@ -188,4 +188,10 @@ typedef struct _ALT_RESOURCE_MODULE #endif } ALT_RESOURCE_MODULE, *PALT_RESOURCE_MODULE; +// +// Callback function for LdrEnumerateLoadedModules +// +typedef NTSTATUS (NTAPI LDR_ENUM_CALLBACK)(IN PLDR_DATA_TABLE_ENTRY ModuleInformation, IN ULONG Parameter, OUT BOOLEAN *Stop); +typedef LDR_ENUM_CALLBACK *PLDR_ENUM_CALLBACK; + #endif From 73b6d5b3d6b70d5ae9074b78a727de02b7ce7aaf Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Thu, 31 Mar 2011 11:32:57 +0000 Subject: [PATCH 040/317] [NTDLL] - Change Context/Parameter in LdrEnumerateLoadedModules() to PVOID (previous ULONG type was a typo). svn path=/trunk/; revision=51210 --- reactos/dll/ntdll/ldr/ldrapi.c | 2 +- reactos/include/ndk/ldrfuncs.h | 2 +- reactos/include/ndk/ldrtypes.h | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/reactos/dll/ntdll/ldr/ldrapi.c b/reactos/dll/ntdll/ldr/ldrapi.c index ad56964d7ea..9b697ca9a0e 100644 --- a/reactos/dll/ntdll/ldr/ldrapi.c +++ b/reactos/dll/ntdll/ldr/ldrapi.c @@ -532,7 +532,7 @@ LdrQueryProcessModuleInformation(IN PRTL_PROCESS_MODULES ModuleInformation, NTSTATUS NTAPI -LdrEnumerateLoadedModules(BOOLEAN ReservedFlag, PLDR_ENUM_CALLBACK EnumProc, ULONG Context) +LdrEnumerateLoadedModules(BOOLEAN ReservedFlag, PLDR_ENUM_CALLBACK EnumProc, PVOID Context) { PLIST_ENTRY ListHead, ListEntry; PLDR_DATA_TABLE_ENTRY LdrEntry; diff --git a/reactos/include/ndk/ldrfuncs.h b/reactos/include/ndk/ldrfuncs.h index 8b967fa8e3d..1bf8a83d32c 100644 --- a/reactos/include/ndk/ldrfuncs.h +++ b/reactos/include/ndk/ldrfuncs.h @@ -123,7 +123,7 @@ NTAPI LdrEnumerateLoadedModules( IN BOOLEAN ReservedFlag, IN PLDR_ENUM_CALLBACK EnumProc, - IN ULONG Context + IN PVOID Context ); #endif diff --git a/reactos/include/ndk/ldrtypes.h b/reactos/include/ndk/ldrtypes.h index fbfa381638b..49ebe38cd55 100644 --- a/reactos/include/ndk/ldrtypes.h +++ b/reactos/include/ndk/ldrtypes.h @@ -191,7 +191,7 @@ typedef struct _ALT_RESOURCE_MODULE // // Callback function for LdrEnumerateLoadedModules // -typedef NTSTATUS (NTAPI LDR_ENUM_CALLBACK)(IN PLDR_DATA_TABLE_ENTRY ModuleInformation, IN ULONG Parameter, OUT BOOLEAN *Stop); +typedef NTSTATUS (NTAPI LDR_ENUM_CALLBACK)(IN PLDR_DATA_TABLE_ENTRY ModuleInformation, IN PVOID Parameter, OUT BOOLEAN *Stop); typedef LDR_ENUM_CALLBACK *PLDR_ENUM_CALLBACK; #endif From ddbfebc22a6e69bfe14c2a2f8e11cc035010f94d Mon Sep 17 00:00:00 2001 From: Rafal Harabien Date: Thu, 31 Mar 2011 15:56:24 +0000 Subject: [PATCH 041/317] [SYSTEMINFO] Convert TABs to spaces Print output to stdout instead of stderr Close opened registry keys Simplify a bit Add System Manufacturer and System Model Add System Up Time (patch by Edijs Kolesnikovics , see issue 6055 for more details) svn path=/trunk/; revision=51212 --- .../sysutils/systeminfo/lang/de-DE.rc | 4 +- .../sysutils/systeminfo/lang/en-US.rc | 4 +- .../sysutils/systeminfo/lang/es-ES.rc | 4 +- .../sysutils/systeminfo/lang/fr-FR.rc | 4 +- .../sysutils/systeminfo/lang/no-NO.rc | 4 +- .../sysutils/systeminfo/lang/pl-PL.rc | 6 +- .../sysutils/systeminfo/lang/sk-SK.rc | 4 +- .../sysutils/systeminfo/lang/uk-UA.rc | 4 +- .../sysutils/systeminfo/resource.h | 14 +- .../sysutils/systeminfo/systeminfo.c | 547 +++++++++--------- 10 files changed, 299 insertions(+), 296 deletions(-) diff --git a/rosapps/applications/sysutils/systeminfo/lang/de-DE.rc b/rosapps/applications/sysutils/systeminfo/lang/de-DE.rc index bcb637853bd..3ee3ac425d7 100644 --- a/rosapps/applications/sysutils/systeminfo/lang/de-DE.rc +++ b/rosapps/applications/sysutils/systeminfo/lang/de-DE.rc @@ -32,11 +32,11 @@ Beispiele:\n\ SYSTEMINFO /S system /FO CSV /NH\n" IDS_OS_NAME, "OS Name: %s\n" -IDS_OS_VERSION, "OS Version: %d.%d.%d %s" -IDS_OS_BUILD, " Build %s\n" +IDS_OS_VERSION, "OS Version: %u.%u.%u %s Build %u\n" IDS_OS_BUILD_TYPE, "OS Build Typ: %s\n" IDS_REG_OWNER, "Registrierter Benutzer: %s\n" IDS_REG_ORG, "Registrierte Organisation: %s\n" +IDS_UP_TIME, "System Up Time: %u Days, %u Hours, %u, Minutes, %u Seconds\n" IDS_PRODUCT_ID, "Produkt ID: %s\n" IDS_INST_DATE, "Installationsdatum: %s, " IDS_INST_TIME, "%s\n" diff --git a/rosapps/applications/sysutils/systeminfo/lang/en-US.rc b/rosapps/applications/sysutils/systeminfo/lang/en-US.rc index 503e6912aa4..005fa713f1b 100644 --- a/rosapps/applications/sysutils/systeminfo/lang/en-US.rc +++ b/rosapps/applications/sysutils/systeminfo/lang/en-US.rc @@ -30,11 +30,11 @@ Examples:\n\ SYSTEMINFO /S system /FO CSV /NH\n" IDS_OS_NAME, "OS Name: %s\n" -IDS_OS_VERSION, "OS Version: %d.%d.%d %s" -IDS_OS_BUILD, " Build %s\n" +IDS_OS_VERSION, "OS Version: %u.%u.%u %s Build %u\n" IDS_OS_BUILD_TYPE, "OS Build Type: %s\n" IDS_REG_OWNER, "Registered Owner: %s\n" IDS_REG_ORG, "Registered Organization: %s\n" +IDS_UP_TIME, "System Up Time: %u Days, %u Hours, %u, Minutes, %u Seconds\n" IDS_PRODUCT_ID, "Product ID: %s\n" IDS_INST_DATE, "Install Date: %s, " IDS_INST_TIME, "%s\n" diff --git a/rosapps/applications/sysutils/systeminfo/lang/es-ES.rc b/rosapps/applications/sysutils/systeminfo/lang/es-ES.rc index 13e3589c2fe..eabccc4cc04 100644 --- a/rosapps/applications/sysutils/systeminfo/lang/es-ES.rc +++ b/rosapps/applications/sysutils/systeminfo/lang/es-ES.rc @@ -35,11 +35,11 @@ Ejemplos:\n\ SYSTEMINFO /S sistema /FO CSV /NH\n" IDS_OS_NAME, "Nombre Sistema Operativo: %s\n" -IDS_OS_VERSION, "Versin Sistema Operativo: %d.%d.%d %s" -IDS_OS_BUILD, " Compilacin %s\n" +IDS_OS_VERSION, "Versin Sistema Operativo: %u.%u.%u %s Compilacin %u\n" IDS_OS_BUILD_TYPE, "Tipo Compilacin: %s\n" IDS_REG_OWNER, "Propietario: %s\n" IDS_REG_ORG, "Organizacin: %s\n" +IDS_UP_TIME, "System Up Time: %u Days, %u Hours, %u, Minutes, %u Seconds\n" IDS_PRODUCT_ID, "Identificador de Producto %s\n" IDS_INST_DATE, "Fecha de Instalacin: %s, " IDS_INST_TIME, "%s\n" diff --git a/rosapps/applications/sysutils/systeminfo/lang/fr-FR.rc b/rosapps/applications/sysutils/systeminfo/lang/fr-FR.rc index fdf0b2cf8ac..aacdbdf80c2 100644 --- a/rosapps/applications/sysutils/systeminfo/lang/fr-FR.rc +++ b/rosapps/applications/sysutils/systeminfo/lang/fr-FR.rc @@ -30,11 +30,11 @@ Exemples:\n\ SYSTEMINFO /S systme /FO CSV /NH\n" IDS_OS_NAME, "Nom du systme d'exploitation : %s\n" -IDS_OS_VERSION, "Version du systme d'exploitation : %d.%d.%d %s" -IDS_OS_BUILD, " Compilation %s\n" +IDS_OS_VERSION, "Version du systme d'exploitation : %u.%u.%u %s Compilation %u\n" IDS_OS_BUILD_TYPE, "Type de compilation du systme d'exploitation : %s\n" IDS_REG_OWNER, "Propritaire enregistr : %s\n" IDS_REG_ORG, "Organisation enregistre : %s\n" +IDS_UP_TIME, "System Up Time: %u Days, %u Hours, %u, Minutes, %u Seconds\n" IDS_PRODUCT_ID, "ID du produit : %s\n" IDS_INST_DATE, "Date d'installation : %s, " IDS_INST_TIME, "%s\n" diff --git a/rosapps/applications/sysutils/systeminfo/lang/no-NO.rc b/rosapps/applications/sysutils/systeminfo/lang/no-NO.rc index 2f862a3a18f..f541156c496 100644 --- a/rosapps/applications/sysutils/systeminfo/lang/no-NO.rc +++ b/rosapps/applications/sysutils/systeminfo/lang/no-NO.rc @@ -30,11 +30,11 @@ Eksempler:\n\ SYSTEMINFO /S system /FO CSV /NH\n" IDS_OS_NAME, "OS navn: %s\n" -IDS_OS_VERSION, "OS versjon: %d.%d.%d %s" -IDS_OS_BUILD, " Bygget %s\n" +IDS_OS_VERSION, "OS versjon: %u.%u.%u %s Bygget %u\n" IDS_OS_BUILD_TYPE, "OS bygg type: %s\n" IDS_REG_OWNER, "Registert eier: %s\n" IDS_REG_ORG, "Registerert organisasjon: %s\n" +IDS_UP_TIME, "System Up Time: %u Days, %u Hours, %u, Minutes, %u Seconds\n" IDS_PRODUCT_ID, "Produkt ID: %s\n" IDS_INST_DATE, "Installert dato: %s, " IDS_INST_TIME, "%s\n" diff --git a/rosapps/applications/sysutils/systeminfo/lang/pl-PL.rc b/rosapps/applications/sysutils/systeminfo/lang/pl-PL.rc index 69cd7543400..53a421dcf12 100644 --- a/rosapps/applications/sysutils/systeminfo/lang/pl-PL.rc +++ b/rosapps/applications/sysutils/systeminfo/lang/pl-PL.rc @@ -37,11 +37,11 @@ Przyk SYSTEMINFO /S system /FO CSV /NH\n" IDS_OS_NAME, "Nazwa Systemu: %s\n" -IDS_OS_VERSION, "Wersja: %d.%d.%d %s" -IDS_OS_BUILD, " Kompilacja %s\n" +IDS_OS_VERSION, "Wersja: %u.%u.%u %s Kompilacja %u\n" IDS_OS_BUILD_TYPE, "Rodzaj kompilacji: %s\n" IDS_REG_OWNER, "Uytkownik: %s\n" IDS_REG_ORG, "Organizacja: %s\n" +IDS_UP_TIME, "System Up Time: %u Days, %u Hours, %u, Minutes, %u Seconds\n" IDS_PRODUCT_ID, "ID produktu: %s\n" IDS_INST_DATE, "Data instalacji: %s, " IDS_INST_TIME, "%s\n" @@ -49,7 +49,7 @@ IDS_SYS_TYPE_UNKNOWN, "Rodzaj systemu: Unknown\n" IDS_SYS_TYPE_X86, "Architektura: X86-based PC\n" IDS_SYS_TYPE_IA64, "Architektura: IA64-based PC\n" IDS_SYS_TYPE_AMD64, "Rodzaj systemu: AMD64-based PC\n" -IDS_PROCESSORS, "Ilo Procesorw: %u .\n" +IDS_PROCESSORS, "Ilo Procesorw: %u.\n" IDS_ROS_DIR, "Katalog ReactOS: %s\n" IDS_SYS_DIR, "Katalog Systemowy: %s\n" IDS_BOOT_DEV, "Urzdzenie rdowe: %s\n" diff --git a/rosapps/applications/sysutils/systeminfo/lang/sk-SK.rc b/rosapps/applications/sysutils/systeminfo/lang/sk-SK.rc index abdb09d00c2..a4b87232f69 100644 --- a/rosapps/applications/sysutils/systeminfo/lang/sk-SK.rc +++ b/rosapps/applications/sysutils/systeminfo/lang/sk-SK.rc @@ -34,11 +34,11 @@ Examples:\n\ SYSTEMINFO /S system /FO CSV /NH\n" IDS_OS_NAME, "Nzov OS: %s\n" -IDS_OS_VERSION, "Verzia OS: %d.%d.%d %s" -IDS_OS_BUILD, " Build %s\n" +IDS_OS_VERSION, "Verzia OS: %u.%u.%u %s Build %u\n" IDS_OS_BUILD_TYPE, "OS Build typ: %s\n" IDS_REG_OWNER, "Registovan vlastnk: %s\n" IDS_REG_ORG, "Registrovan organizcia: %s\n" +IDS_UP_TIME, "System Up Time: %u Days, %u Hours, %u, Minutes, %u Seconds\n" IDS_PRODUCT_ID, "ID produktu: %s\n" IDS_INST_DATE, "Dtum intalcie: %s, " IDS_INST_TIME, "%s\n" diff --git a/rosapps/applications/sysutils/systeminfo/lang/uk-UA.rc b/rosapps/applications/sysutils/systeminfo/lang/uk-UA.rc index 3dc62009d51..e0f96369ad3 100644 --- a/rosapps/applications/sysutils/systeminfo/lang/uk-UA.rc +++ b/rosapps/applications/sysutils/systeminfo/lang/uk-UA.rc @@ -38,11 +38,11 @@ IDS_USAGE, "SYSTEMINFO [/S SYSTEMINFO /S /FO CSV /NH\n" IDS_OS_NAME, "' : %s\n" -IDS_OS_VERSION, " : %d.%d.%d %s" -IDS_OS_BUILD, " %s\n" +IDS_OS_VERSION, " : %u.%u.%u %s %u\n" IDS_OS_BUILD_TYPE, " : %s\n" IDS_REG_OWNER, " : %s\n" IDS_REG_ORG, " : %s\n" +IDS_UP_TIME, "System Up Time: %u Days, %u Hours, %u, Minutes, %u Seconds\n" IDS_PRODUCT_ID, "ID : %s\n" IDS_INST_DATE, " : %s, " IDS_INST_TIME, "%s\n" diff --git a/rosapps/applications/sysutils/systeminfo/resource.h b/rosapps/applications/sysutils/systeminfo/resource.h index a8499d52eec..4942b4739cc 100644 --- a/rosapps/applications/sysutils/systeminfo/resource.h +++ b/rosapps/applications/sysutils/systeminfo/resource.h @@ -2,13 +2,13 @@ #define IDS_OS_NAME 100 #define IDS_OS_VERSION 101 -#define IDS_OS_BUILD 102 -#define IDS_OS_BUILD_TYPE 103 -#define IDS_REG_OWNER 104 -#define IDS_REG_ORG 105 -#define IDS_PRODUCT_ID 106 -#define IDS_INST_DATE 107 -#define IDS_INST_TIME 108 +#define IDS_OS_BUILD_TYPE 102 +#define IDS_REG_OWNER 103 +#define IDS_REG_ORG 104 +#define IDS_PRODUCT_ID 105 +#define IDS_INST_DATE 106 +#define IDS_INST_TIME 107 +#define IDS_UP_TIME 108 #define IDS_SYS_TYPE_UNKNOWN 109 #define IDS_SYS_TYPE_X86 110 #define IDS_SYS_TYPE_IA64 111 diff --git a/rosapps/applications/sysutils/systeminfo/systeminfo.c b/rosapps/applications/sysutils/systeminfo/systeminfo.c index d641c200da0..3231732a569 100644 --- a/rosapps/applications/sysutils/systeminfo/systeminfo.c +++ b/rosapps/applications/sysutils/systeminfo/systeminfo.c @@ -21,23 +21,26 @@ #include #include #include +#include #include "resource.h" #define BUFFER_SIZE 32767 +#define B_TO_MB(bytes) ((bytes)/(1024*1024)) +#define B_TO_KB(bytes) ((bytes)/1024) /* Load from resource and convert to OEM */ static BOOL GetOemStrings(UINT rcID, LPSTR OutMsg) { - TCHAR Msg[BUFFER_SIZE]; - if (LoadString(GetModuleHandle(NULL), rcID, (LPTSTR)Msg, BUFFER_SIZE)) - { - CharToOem(Msg, OutMsg); - return TRUE; - } - return FALSE; + TCHAR Msg[BUFFER_SIZE]; + if (LoadString(GetModuleHandle(NULL), rcID, (LPTSTR)Msg, BUFFER_SIZE)) + { + CharToOem(Msg, OutMsg); + return TRUE; + } + return FALSE; } /* Load data from registry */ @@ -45,25 +48,25 @@ static BOOL GetRegistryValue(HKEY hKeyName, LPCTSTR SubKey, LPCTSTR ValueName, LPCTSTR Buf) { - DWORD CharCount = BUFFER_SIZE; - HKEY hKey; - LONG lRet; + DWORD CharCount = BUFFER_SIZE; + HKEY hKey; + LONG lRet; - CharCount = BUFFER_SIZE; - lRet = RegOpenKeyEx(hKeyName, - SubKey, - 0, - KEY_QUERY_VALUE, - &hKey); - if (lRet != ERROR_SUCCESS) return FALSE; - lRet = RegQueryValueEx(hKey, - ValueName, - NULL, - NULL, - (LPBYTE)Buf, - &CharCount); - if (lRet != ERROR_SUCCESS) return FALSE; - return TRUE; + lRet = RegOpenKeyEx(hKeyName, + SubKey, + 0, + KEY_QUERY_VALUE, + &hKey); + if (lRet != ERROR_SUCCESS) return FALSE; + lRet = RegQueryValueEx(hKey, + ValueName, + NULL, + NULL, + (LPBYTE)Buf, + &CharCount); + if (lRet != ERROR_SUCCESS) return FALSE; + RegCloseKey(hKey); + return TRUE; } /* Show usage */ @@ -71,298 +74,298 @@ static VOID Usage(VOID) { - TCHAR Buf[BUFFER_SIZE]; - if(GetOemStrings(IDS_USAGE,Buf)) printf("%s",Buf); + TCHAR Buf[BUFFER_SIZE]; + if(GetOemStrings(IDS_USAGE, Buf)) printf("%s",Buf); } /* Print all system information */ VOID AllSysInfo(VOID) { - DWORD CharCount = BUFFER_SIZE; - OSVERSIONINFO VersionInfo; - BOOL bOsVersionInfoEx; - SYSTEM_INFO SysInfo; - TCHAR Buf[BUFFER_SIZE],Tmp[BUFFER_SIZE], Msg[BUFFER_SIZE]; - MEMORYSTATUS memory; - unsigned int DIV = 1024; - TIME_ZONE_INFORMATION TimeZoneInfo; + DWORD dwCharCount = BUFFER_SIZE; + OSVERSIONINFO VersionInfo; + SYSTEM_INFO SysInfo; + TCHAR Buf[BUFFER_SIZE], Tmp[BUFFER_SIZE], Msg[BUFFER_SIZE], szSystemDir[MAX_PATH]; + MEMORYSTATUS MemoryStatus; + unsigned int cSeconds; + TIME_ZONE_INFORMATION TimeZoneInfo; - GetSystemInfo(&SysInfo); + if (!GetSystemDirectory(szSystemDir, sizeof(szSystemDir)/sizeof(szSystemDir[0]))) + printf("Error getting: GetSystemDirectory\n"); + GetSystemInfo(&SysInfo); - // getting computer name - CharCount = BUFFER_SIZE; - if(!GetComputerName(Buf,&CharCount)) printf("Error getting: GetComputerName"); - if(GetOemStrings(IDS_HOST_NAME,Msg)) fprintf(stderr,Msg,Buf); + // getting computer name + dwCharCount = BUFFER_SIZE; + if (!GetComputerName(Buf, &dwCharCount)) + printf("Error getting: GetComputerName"); + if (GetOemStrings(IDS_HOST_NAME, Msg)) + printf(Msg, Buf); - //getting OS Name - GetRegistryValue(HKEY_LOCAL_MACHINE, - TEXT("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion"), - TEXT("ProductName"), - Buf); - if(GetOemStrings(IDS_OS_NAME,Msg)) fprintf(stderr,Msg,Buf); + //getting OS Name + GetRegistryValue(HKEY_LOCAL_MACHINE, + TEXT("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion"), + TEXT("ProductName"), + Buf); + if (GetOemStrings(IDS_OS_NAME, Msg)) printf(Msg, Buf); - //getting OS Version - ZeroMemory(&VersionInfo, sizeof(OSVERSIONINFO)); - VersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); - if(!(bOsVersionInfoEx = GetVersionEx((OSVERSIONINFO*)&VersionInfo))) - { - VersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); - if (!GetVersionEx((OSVERSIONINFO*)&VersionInfo)) - return; - } - if (VersionInfo.dwPlatformId == VER_PLATFORM_WIN32_NT) - { - if (GetRegistryValue(HKEY_LOCAL_MACHINE, - TEXT("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion"), - TEXT("CSDVersion"), - Buf)) - if(GetOemStrings(IDS_OS_VERSION,Msg)) - fprintf(stderr, Msg, - (int)VersionInfo.dwMajorVersion, - (int)VersionInfo.dwMinorVersion, - (int)VersionInfo.dwBuildNumber, - Buf); - if (GetRegistryValue(HKEY_LOCAL_MACHINE, - TEXT("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion"), - TEXT("CurrentBuildNumber"), - Buf)) - if(GetOemStrings(IDS_OS_BUILD,Msg)) fprintf(stderr,Msg,Buf); - } + //getting OS Version + ZeroMemory(&VersionInfo, sizeof(VersionInfo)); + VersionInfo.dwOSVersionInfoSize = sizeof(VersionInfo); + GetVersionEx(&VersionInfo); + + if (GetOemStrings(IDS_OS_VERSION, Msg)) + printf(Msg, + (unsigned)VersionInfo.dwMajorVersion, + (unsigned)VersionInfo.dwMinorVersion, + (unsigned)VersionInfo.dwBuildNumber, + VersionInfo.szCSDVersion, + (unsigned)VersionInfo.dwBuildNumber); - //getting OS Manufacturer + //getting OS Manufacturer - //getting OS Configuration + //getting OS Configuration - //getting OS Build Type - if (GetRegistryValue(HKEY_LOCAL_MACHINE, - TEXT("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion"), - TEXT("CurrentType"), - Buf)) - if(GetOemStrings(IDS_OS_BUILD_TYPE,Msg)) fprintf(stderr,Msg,Buf); + //getting OS Build Type + if (GetRegistryValue(HKEY_LOCAL_MACHINE, + TEXT("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion"), + TEXT("CurrentType"), + Buf)) + if (GetOemStrings(IDS_OS_BUILD_TYPE, Msg)) printf(Msg, Buf); - //getting Registered Owner - if (GetRegistryValue(HKEY_LOCAL_MACHINE, - TEXT("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion"), - TEXT("RegisteredOwner"), - Buf)) - if(GetOemStrings(IDS_REG_OWNER,Msg)) fprintf(stderr,Msg,Buf); + //getting Registered Owner + if (GetRegistryValue(HKEY_LOCAL_MACHINE, + TEXT("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion"), + TEXT("RegisteredOwner"), + Buf)) + if (GetOemStrings(IDS_REG_OWNER, Msg)) printf(Msg, Buf); - //getting Registered Organization - if (GetRegistryValue(HKEY_LOCAL_MACHINE, - TEXT("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion"), - TEXT("RegisteredOrganization"), - Buf)) - if(GetOemStrings(IDS_REG_ORG,Msg)) fprintf(stderr,Msg,Buf); + //getting Registered Organization + if (GetRegistryValue(HKEY_LOCAL_MACHINE, + TEXT("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion"), + TEXT("RegisteredOrganization"), + Buf)) + if (GetOemStrings(IDS_REG_ORG, Msg)) printf(Msg, Buf); - //getting Product ID - if (GetRegistryValue(HKEY_LOCAL_MACHINE, - TEXT("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion"), - TEXT("ProductId"), - Buf)) - if(GetOemStrings(IDS_PRODUCT_ID,Msg)) fprintf(stderr,Msg,Buf); + //getting Product ID // use SOFTWARE\Microsoft\Windows NT\CurrentVersion\InstallDate + if (GetRegistryValue(HKEY_LOCAL_MACHINE, + TEXT("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion"), + TEXT("ProductId"), + Buf)) + if (GetOemStrings(IDS_PRODUCT_ID, Msg)) printf(Msg, Buf); - //getting Install Date - if (GetRegistryValue(HKEY_LOCAL_MACHINE, - TEXT("SOFTWARE\\Microsoft\\WBEM\\CIMOM"), - TEXT("SetupDate"), - Buf)) - if(GetOemStrings(IDS_INST_DATE,Msg)) fprintf(stderr,Msg,Buf); + //getting Install Date + if (GetRegistryValue(HKEY_LOCAL_MACHINE, + TEXT("SOFTWARE\\Microsoft\\WBEM\\CIMOM"), + TEXT("SetupDate"), + Buf)) + if (GetOemStrings(IDS_INST_DATE, Msg)) printf(Msg, Buf); - //getting Install Time - if (GetRegistryValue(HKEY_LOCAL_MACHINE, - TEXT("SOFTWARE\\Microsoft\\WBEM\\CIMOM"), - TEXT("SetupTime"), - Buf)) - if(GetOemStrings(IDS_INST_TIME,Msg)) fprintf(stderr,Msg,Buf); + //getting Install Time + if (GetRegistryValue(HKEY_LOCAL_MACHINE, + TEXT("SOFTWARE\\Microsoft\\WBEM\\CIMOM"), + TEXT("SetupTime"), + Buf)) + if (GetOemStrings(IDS_INST_TIME, Msg)) printf(Msg, Buf); - //getting System Up Time + //getting System Up Time + cSeconds = GetTickCount() / 1000; + if (GetOemStrings(IDS_UP_TIME, Msg)) + printf(Msg, cSeconds / (60*60*24), (cSeconds / (60*60)) % 24, (cSeconds / 60) % 60, cSeconds % 60); - //getting System Manufacturer + //getting System Manufacturer + sprintf(Tmp, "%s\\oeminfo.ini", szSystemDir); + GetPrivateProfileString(TEXT("General"), + TEXT("Manufacturer"), + TEXT("To Be Filled By O.E.M."), + Buf, + sizeof(Buf)/sizeof(Buf[0]), + Tmp); + printf("System Manufacturer:\t\t%s\n", Buf); - //getting System Model + //getting System Model + GetPrivateProfileString(TEXT("General"), + TEXT("Model"), + TEXT("To Be Filled By O.E.M."), + Buf, + sizeof(Buf)/sizeof(Buf[0]), + Tmp); + printf("System Model:\t\t\t%s\n", Buf); - //getting System type - switch (SysInfo.wProcessorArchitecture) - { - case PROCESSOR_ARCHITECTURE_UNKNOWN: - if(GetOemStrings(IDS_SYS_TYPE_UNKNOWN,Msg)) printf("%s",Msg); - break; - case PROCESSOR_ARCHITECTURE_INTEL: - if(GetOemStrings(IDS_SYS_TYPE_X86,Msg)) printf("%s",Msg); - break; - case PROCESSOR_ARCHITECTURE_IA64: - if(GetOemStrings(IDS_SYS_TYPE_IA64,Msg)) printf("%s",Msg); - break; - case PROCESSOR_ARCHITECTURE_AMD64: - if(GetOemStrings(IDS_SYS_TYPE_AMD64,Msg)) printf("%s",Msg); - break; - } + //getting System type + switch (SysInfo.wProcessorArchitecture) + { + case PROCESSOR_ARCHITECTURE_UNKNOWN: + if (GetOemStrings(IDS_SYS_TYPE_UNKNOWN, Msg)) printf("%s", Msg); + break; + case PROCESSOR_ARCHITECTURE_INTEL: + if (GetOemStrings(IDS_SYS_TYPE_X86, Msg)) printf("%s", Msg); + break; + case PROCESSOR_ARCHITECTURE_IA64: + if (GetOemStrings(IDS_SYS_TYPE_IA64, Msg)) printf("%s", Msg); + break; + case PROCESSOR_ARCHITECTURE_AMD64: + if (GetOemStrings(IDS_SYS_TYPE_AMD64, Msg)) printf("%s", Msg); + break; + } - //getting Processor(s) - if(GetOemStrings(IDS_PROCESSORS,Msg)) - { - unsigned int i; - fprintf(stderr,Msg,(unsigned int)SysInfo.dwNumberOfProcessors); - for(i = 0; i < (unsigned int)SysInfo.dwNumberOfProcessors; i++) - { - sprintf(Tmp,"HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\%u",i); - if (GetRegistryValue(HKEY_LOCAL_MACHINE, - (LPCTSTR)Tmp, - TEXT("Identifier"), - Buf)) - printf(" [0%u]: %s",i+1,Buf); - if (GetRegistryValue(HKEY_LOCAL_MACHINE, - (LPCTSTR)Tmp, - TEXT("VendorIdentifier"), - Buf)) - printf(" %s\n",Buf); - } - } + //getting Processor(s) + if (GetOemStrings(IDS_PROCESSORS, Msg)) + { + unsigned int i; + printf(Msg, (unsigned int)SysInfo.dwNumberOfProcessors); + for(i = 0; i < (unsigned int)SysInfo.dwNumberOfProcessors; i++) + { + sprintf(Tmp,"HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\%u",i); + if (GetRegistryValue(HKEY_LOCAL_MACHINE, + (LPCTSTR)Tmp, + TEXT("Identifier"), + Buf)) + printf(" [0%u]: %s", i+1, Buf); + if (GetRegistryValue(HKEY_LOCAL_MACHINE, + (LPCTSTR)Tmp, + TEXT("VendorIdentifier"), + Buf)) + printf(" %s\n", Buf); + } + } - //getting BIOS Version - if (GetRegistryValue(HKEY_LOCAL_MACHINE, - TEXT("HARDWARE\\DESCRIPTION\\System"), - TEXT("SystemBiosVersion"), - Buf)) - if(GetOemStrings(IDS_BIOS_VERSION,Msg)) fprintf(stderr,Msg,Buf); + //getting BIOS Version + if (GetRegistryValue(HKEY_LOCAL_MACHINE, + TEXT("HARDWARE\\DESCRIPTION\\System"), + TEXT("SystemBiosVersion"), + Buf)) + if (GetOemStrings(IDS_BIOS_VERSION, Msg)) printf(Msg, Buf); - //gettings BIOS date - if (GetRegistryValue(HKEY_LOCAL_MACHINE, - TEXT("HARDWARE\\DESCRIPTION\\System"), - TEXT("SystemBiosDate"), - Buf)) - if(GetOemStrings(IDS_BIOS_DATE,Msg)) fprintf(stderr,Msg,Buf); + //gettings BIOS date + if (GetRegistryValue(HKEY_LOCAL_MACHINE, + TEXT("HARDWARE\\DESCRIPTION\\System"), + TEXT("SystemBiosDate"), + Buf)) + if (GetOemStrings(IDS_BIOS_DATE, Msg)) printf(Msg, Buf); - //getting ReactOS Directory - if(!GetWindowsDirectory(Buf,BUFFER_SIZE)) printf("Error getting: GetWindowsDirectory"); - if(GetOemStrings(IDS_ROS_DIR,Msg)) fprintf(stderr,Msg,Buf); + //getting ReactOS Directory + if (!GetWindowsDirectory(Buf, BUFFER_SIZE)) printf("Error getting: GetWindowsDirectory"); + if (GetOemStrings(IDS_ROS_DIR, Msg)) printf(Msg, Buf); - //getting System Directory - if(!GetSystemDirectory(Buf,BUFFER_SIZE)) printf("Error getting: GetSystemDirectory"); - if(GetOemStrings(IDS_SYS_DIR,Msg)) fprintf(stderr,Msg,Buf); + //getting System Directory + if (GetOemStrings(IDS_SYS_DIR, Msg)) printf(Msg, szSystemDir); - //getting Boot Device - if (GetRegistryValue(HKEY_LOCAL_MACHINE, - TEXT("SYSTEM\\Setup"), - TEXT("SystemPartition"), - Buf)) - if(GetOemStrings(IDS_BOOT_DEV,Msg)) fprintf(stderr,Msg,Buf); + //getting Boot Device + if (GetRegistryValue(HKEY_LOCAL_MACHINE, + TEXT("SYSTEM\\Setup"), + TEXT("SystemPartition"), + Buf)) + if (GetOemStrings(IDS_BOOT_DEV, Msg)) printf(Msg, Buf); - //getting System Locale - if (GetRegistryValue(HKEY_CURRENT_USER, - TEXT("Control Panel\\International"), - TEXT("Locale"), - Tmp)) - if (GetRegistryValue(HKEY_CLASSES_ROOT, - TEXT("MIME\\Database\\Rfc1766"), - (LPTSTR)Tmp, - Buf)) - if(GetOemStrings(IDS_SYS_LOCALE,Msg)) fprintf(stderr,Msg,Buf); + //getting System Locale + if (GetRegistryValue(HKEY_CURRENT_USER, + TEXT("Control Panel\\International"), + TEXT("Locale"), + Tmp)) + if (GetRegistryValue(HKEY_CLASSES_ROOT, + TEXT("MIME\\Database\\Rfc1766"), + (LPTSTR)Tmp, + Buf)) + if (GetOemStrings(IDS_SYS_LOCALE, Msg)) printf(Msg, Buf); - //getting Input Locale - if (GetRegistryValue(HKEY_CURRENT_USER, - TEXT("Keyboard Layout\\Preload"), - TEXT("1"), - Buf)) - { - int i,j; - for(j = 0, i = 4; i <= 8; j++, i++) Tmp[j] = Buf[i]; - if (GetRegistryValue(HKEY_CLASSES_ROOT, - TEXT("MIME\\Database\\Rfc1766"), - (LPTSTR)Tmp, - Buf)) - if(GetOemStrings(IDS_INPUT_LOCALE,Msg)) fprintf(stderr,Msg,Buf); - } + //getting Input Locale + if (GetRegistryValue(HKEY_CURRENT_USER, + TEXT("Keyboard Layout\\Preload"), + TEXT("1"), + Buf)) + { + int i,j; + for(j = 0, i = 4; i <= 8; j++, i++) Tmp[j] = Buf[i]; + if (GetRegistryValue(HKEY_CLASSES_ROOT, + TEXT("MIME\\Database\\Rfc1766"), + (LPTSTR)Tmp, + Buf)) + if (GetOemStrings(IDS_INPUT_LOCALE, Msg)) printf(Msg, Buf); + } - //getting Time Zone - GetTimeZoneInformation(&TimeZoneInfo); - sprintf(Tmp,"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Time Zones\\%S",TimeZoneInfo.StandardName); - if (GetRegistryValue(HKEY_LOCAL_MACHINE, - (LPCTSTR)Tmp, - TEXT("Display"), - Buf)) - if(GetOemStrings(IDS_TIME_ZONE,Msg)) fprintf(stderr,Msg,Buf); + //getting Time Zone + GetTimeZoneInformation(&TimeZoneInfo); + sprintf(Tmp,"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Time Zones\\%S",TimeZoneInfo.StandardName); + if (GetRegistryValue(HKEY_LOCAL_MACHINE, + (LPCTSTR)Tmp, + TEXT("Display"), + Buf)) + if (GetOemStrings(IDS_TIME_ZONE, Msg)) printf(Msg, Buf); - //getting Total Physical Memory - GlobalMemoryStatus(&memory); - if(GetOemStrings(IDS_TOTAL_PHYS_MEM,Msg)) - fprintf(stderr, - Msg, - memory.dwTotalPhys/(DIV*DIV), - memory.dwTotalPhys/DIV); + //getting Total Physical Memory + GlobalMemoryStatus(&MemoryStatus); + if(GetOemStrings(IDS_TOTAL_PHYS_MEM, Msg)) + printf(Msg, + B_TO_MB(MemoryStatus.dwTotalPhys), + B_TO_KB(MemoryStatus.dwTotalPhys)); - //getting Available Physical Memory - if(GetOemStrings(IDS_AVAIL_PHISICAL_MEM,Msg)) - fprintf(stderr, - Msg, - memory.dwAvailPhys/(DIV*DIV), - memory.dwAvailPhys/DIV); + //getting Available Physical Memory + if(GetOemStrings(IDS_AVAIL_PHISICAL_MEM,Msg)) + printf(Msg, + B_TO_MB(MemoryStatus.dwAvailPhys), + B_TO_KB(MemoryStatus.dwAvailPhys)); - //getting Virtual Memory: Max Size - if(GetOemStrings(IDS_VIRT_MEM_MAX,Msg)) - fprintf(stderr, - Msg, - memory.dwTotalVirtual/(DIV*DIV), - memory.dwTotalVirtual/DIV); + //getting Virtual Memory: Max Size + if(GetOemStrings(IDS_VIRT_MEM_MAX, Msg)) + printf(Msg, + B_TO_MB(MemoryStatus.dwTotalVirtual), + B_TO_KB(MemoryStatus.dwTotalVirtual)); - //getting Virtual Memory: Available - if(GetOemStrings(IDS_VIRT_MEM_AVAIL,Msg)) - fprintf(stderr, - Msg, - memory.dwAvailVirtual/(DIV*DIV), - memory.dwAvailVirtual/DIV); + //getting Virtual Memory: Available + if(GetOemStrings(IDS_VIRT_MEM_AVAIL, Msg)) + printf(Msg, + B_TO_MB(MemoryStatus.dwAvailVirtual), + B_TO_KB(MemoryStatus.dwAvailVirtual)); - //getting Virtual Memory: In Use - if(GetOemStrings(IDS_VIRT_MEM_INUSE,Msg)) - fprintf(stderr, - Msg, - (memory.dwTotalVirtual-memory.dwAvailVirtual)/(DIV*DIV), - (memory.dwTotalVirtual-memory.dwAvailVirtual)/DIV); + //getting Virtual Memory: In Use + if(GetOemStrings(IDS_VIRT_MEM_INUSE, Msg)) + printf(Msg, + B_TO_MB(MemoryStatus.dwTotalVirtual-MemoryStatus.dwAvailVirtual), + B_TO_KB(MemoryStatus.dwTotalVirtual-MemoryStatus.dwAvailVirtual)); - //getting Page File Location(s) - if (GetRegistryValue(HKEY_LOCAL_MACHINE, - TEXT("SYSTEM\\ControlSet001\\Control\\Session Manager\\Memory Management"), - TEXT("PagingFiles"), - Buf)) - { - int i; - for(i = 0; i < strlen((char*)Buf); i++) - { - if (Buf[i] == ' ') - { - Buf[i] = '\0'; - break; - } - } - if(GetOemStrings(IDS_PAGEFILE_LOC,Msg)) fprintf(stderr,Msg,Buf); - } + //getting Page File Location(s) + if (GetRegistryValue(HKEY_LOCAL_MACHINE, + TEXT("SYSTEM\\ControlSet001\\Control\\Session Manager\\Memory Management"), + TEXT("PagingFiles"), + Buf)) + { + int i; + for(i = 0; i < strlen((char*)Buf); i++) + { + if (Buf[i] == ' ') + { + Buf[i] = '\0'; + break; + } + } + if(GetOemStrings(IDS_PAGEFILE_LOC, Msg)) printf(Msg, Buf); + } - //getting Domain - if (GetRegistryValue(HKEY_LOCAL_MACHINE, - TEXT("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon"), - TEXT("CachePrimaryDomain"), - Buf)) - if(GetOemStrings(IDS_DOMINE,Msg)) fprintf(stderr,Msg,Buf); + //getting Domain + if (GetRegistryValue(HKEY_LOCAL_MACHINE, + TEXT("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon"), + TEXT("CachePrimaryDomain"), + Buf)) + if(GetOemStrings(IDS_DOMINE, Msg)) printf(Msg, Buf); - //getting Logon Server + //getting Logon Server - //getting NetWork Card(s) - if(GetOemStrings(IDS_NETWORK_CARDS,Msg)) - { + //getting NetWork Card(s) + if(GetOemStrings(IDS_NETWORK_CARDS, Msg)) + { - } + } } /* Main program */ int main(int argc, char *argv[]) { - if (argc > 1 && !strcmp(argv[1], "/?")) - { - Usage(); - return 0; - } - AllSysInfo(); - return 0; + if (argc > 1 && (!strcmp(argv[1], "/?") || !strcmp(argv[1], "-?"))) + { + Usage(); + return 0; + } + AllSysInfo(); + return 0; } From 62d4baba0355e19c17e4dcc76f62093db8dbb499 Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Thu, 31 Mar 2011 16:16:10 +0000 Subject: [PATCH 042/317] [PSDK] - More header updates svn path=/trunk/; revision=51213 --- reactos/include/psdk/ksmedia.h | 60 ++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/reactos/include/psdk/ksmedia.h b/reactos/include/psdk/ksmedia.h index 4873e1dbe64..1cde28039e2 100644 --- a/reactos/include/psdk/ksmedia.h +++ b/reactos/include/psdk/ksmedia.h @@ -348,6 +348,25 @@ typedef struct { WAVEFORMATEX WaveFormatEx; } KSDATAFORMAT_WAVEFORMATEX, *PKSDATAFORMAT_WAVEFORMATEX; +#ifndef _WAVEFORMATEXTENSIBLE_ +#define _WAVEFORMATEXTENSIBLE_ +typedef struct { + WAVEFORMATEX Format; + union + { + WORD wValidBitsPerSample; + WORD wSamplesPerBlock; + WORD wReserved; + }Samples; + DWORD dwChannelMask; + GUID SubFormat; +} WAVEFORMATEXTENSIBLE, *PWAVEFORMATEXTENSIBLE; +#endif + +#if !defined(WAVE_FORMAT_EXTENSIBLE) +#define WAVE_FORMAT_EXTENSIBLE 0xFFFE +#endif + typedef struct { ULONG Flags; ULONG Control; @@ -734,4 +753,45 @@ typedef struct ULONG ChannelMask; } KSDATARANGE_MUSIC, *PKSDATARANGE_MUSIC; +#define SPEAKER_FRONT_LEFT 0x1 +#define SPEAKER_FRONT_RIGHT 0x2 +#define SPEAKER_FRONT_CENTER 0x4 +#define SPEAKER_LOW_FREQUENCY 0x8 +#define SPEAKER_BACK_LEFT 0x10 +#define SPEAKER_BACK_RIGHT 0x20 +#define SPEAKER_FRONT_LEFT_OF_CENTER 0x40 +#define SPEAKER_FRONT_RIGHT_OF_CENTER 0x80 +#define SPEAKER_BACK_CENTER 0x100 +#define SPEAKER_SIDE_LEFT 0x200 +#define SPEAKER_SIDE_RIGHT 0x400 +#define SPEAKER_TOP_CENTER 0x800 +#define SPEAKER_TOP_FRONT_LEFT 0x1000 +#define SPEAKER_TOP_FRONT_CENTER 0x2000 +#define SPEAKER_TOP_FRONT_RIGHT 0x4000 +#define SPEAKER_TOP_BACK_LEFT 0x8000 +#define SPEAKER_TOP_BACK_CENTER 0x10000 +#define SPEAKER_TOP_BACK_RIGHT 0x20000 + +#define SPEAKER_RESERVED 0x7FFC0000 +#define SPEAKER_ALL 0x80000000 + + +#if (NTDDI_VERSION >= NTDDI_WINXP) +#define KSAUDIO_SPEAKER_DIRECTOUT 0 +#endif + +#define KSAUDIO_SPEAKER_MONO (SPEAKER_FRONT_CENTER) +#define KSAUDIO_SPEAKER_STEREO (SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT) +#define KSAUDIO_SPEAKER_QUAD (SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | \ + SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT) +#define KSAUDIO_SPEAKER_SURROUND (SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | \ + SPEAKER_FRONT_CENTER | SPEAKER_BACK_CENTER) +#define KSAUDIO_SPEAKER_5POINT1 (SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | \ + SPEAKER_FRONT_CENTER | SPEAKER_LOW_FREQUENCY | \ + SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT) +#define KSAUDIO_SPEAKER_7POINT1 (SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | \ + SPEAKER_FRONT_CENTER | SPEAKER_LOW_FREQUENCY | \ + SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT | \ + SPEAKER_FRONT_LEFT_OF_CENTER | SPEAKER_FRONT_RIGHT_OF_CENTER) + #endif From 0a3b87a1efdb40cf1b6db33fa8c12c166949ed70 Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Thu, 31 Mar 2011 16:21:38 +0000 Subject: [PATCH 043/317] - Fix build attempt #1 svn path=/trunk/; revision=51214 --- reactos/include/psdk/ksmedia.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/reactos/include/psdk/ksmedia.h b/reactos/include/psdk/ksmedia.h index 1cde28039e2..3860e73b33f 100644 --- a/reactos/include/psdk/ksmedia.h +++ b/reactos/include/psdk/ksmedia.h @@ -753,6 +753,10 @@ typedef struct ULONG ChannelMask; } KSDATARANGE_MUSIC, *PKSDATARANGE_MUSIC; +#ifndef _SPEAKER_POSITIONS_ +#define _SPEAKER_POSITIONS_ + + #define SPEAKER_FRONT_LEFT 0x1 #define SPEAKER_FRONT_RIGHT 0x2 #define SPEAKER_FRONT_CENTER 0x4 @@ -775,6 +779,7 @@ typedef struct #define SPEAKER_RESERVED 0x7FFC0000 #define SPEAKER_ALL 0x80000000 +#endif #if (NTDDI_VERSION >= NTDDI_WINXP) #define KSAUDIO_SPEAKER_DIRECTOUT 0 From 04afecea16343398d0755c255378433f286e1575 Mon Sep 17 00:00:00 2001 From: Rafal Harabien Date: Thu, 31 Mar 2011 16:51:19 +0000 Subject: [PATCH 044/317] [SYSTEMINFO] Add System Manufacturer and System Model to resources Convert TABs to spaces in resources Sort strings in resources a bit svn path=/trunk/; revision=51215 --- .../sysutils/systeminfo/lang/de-DE.rc | 76 ++++++++-------- .../sysutils/systeminfo/lang/en-US.rc | 76 ++++++++-------- .../sysutils/systeminfo/lang/es-ES.rc | 76 ++++++++-------- .../sysutils/systeminfo/lang/fr-FR.rc | 76 ++++++++-------- .../sysutils/systeminfo/lang/no-NO.rc | 88 ++++++++++--------- .../sysutils/systeminfo/lang/pl-PL.rc | 76 ++++++++-------- .../sysutils/systeminfo/lang/sk-SK.rc | 88 ++++++++++--------- .../sysutils/systeminfo/lang/uk-UA.rc | 74 ++++++++-------- .../sysutils/systeminfo/resource.h | 66 +++++++------- .../sysutils/systeminfo/systeminfo.c | 6 +- 10 files changed, 361 insertions(+), 341 deletions(-) diff --git a/rosapps/applications/sysutils/systeminfo/lang/de-DE.rc b/rosapps/applications/sysutils/systeminfo/lang/de-DE.rc index 3ee3ac425d7..18efe35948b 100644 --- a/rosapps/applications/sysutils/systeminfo/lang/de-DE.rc +++ b/rosapps/applications/sysutils/systeminfo/lang/de-DE.rc @@ -11,16 +11,16 @@ Parameterliste:\n\ /S System Bestimmt das Remotesystem mit dem die Verbindung\n\ hergestellt werden soll.\n\n\ /U [Domne\]Benutzer Bestimmt den Benutzerkontext unter dem\n\ - der Befehl ausgefhrt werden soll.\n\n\ + der Befehl ausgefhrt werden soll.\n\n\ /P [Passwort] Bestimmt das Kennwort fr den zugewiesenen\n\ - Benutzerkontext. Bei Auslassung, wird dieses\n\ + Benutzerkontext. Bei Auslassung, wird dieses\n\ angefordert.\n\n\ /FO Format Bestimmt das Format in dem die Ausgabe\n\ - angezeigt werden soll.\n\ - Gltige Werte: TABLE, LIST, CSV.\n\n\ + angezeigt werden soll.\n\ + Gltige Werte: TABLE, LIST, CSV.\n\n\ /NH Bestimmt, dass der Spalten-Header in der\n\ - Ausgabe nicht angezeigt werden soll.\n\ - Nur fr Formate TABLE und CSV.\n\n\ + Ausgabe nicht angezeigt werden soll.\n\ + Nur fr Formate TABLE und CSV.\n\n\ /? Zeigt die Hilfemeldung an.\n\n\ Beispiele:\n\ SYSTEMINFO\n\ @@ -31,36 +31,38 @@ Beispiele:\n\ SYSTEMINFO /S system /FO LIST\n\ SYSTEMINFO /S system /FO CSV /NH\n" -IDS_OS_NAME, "OS Name: %s\n" -IDS_OS_VERSION, "OS Version: %u.%u.%u %s Build %u\n" -IDS_OS_BUILD_TYPE, "OS Build Typ: %s\n" -IDS_REG_OWNER, "Registrierter Benutzer: %s\n" -IDS_REG_ORG, "Registrierte Organisation: %s\n" -IDS_UP_TIME, "System Up Time: %u Days, %u Hours, %u, Minutes, %u Seconds\n" -IDS_PRODUCT_ID, "Produkt ID: %s\n" -IDS_INST_DATE, "Installationsdatum: %s, " -IDS_INST_TIME, "%s\n" -IDS_SYS_TYPE_UNKNOWN, "Systemtyp: Unbekannt\n" -IDS_SYS_TYPE_X86, "Systemtyp: X86-based PC\n" -IDS_SYS_TYPE_IA64, "Systemtyp: IA64-based PC\n" -IDS_SYS_TYPE_AMD64, "Systemtyp: AMD64-based PC\n" -IDS_PROCESSORS, "Prozessor(en): %u Prozessor(en) Installiert.\n" -IDS_ROS_DIR, "ReactOS Verzeichnis: %s\n" -IDS_SYS_DIR, "System Verzeichnis: %s\n" -IDS_BOOT_DEV, "Startgert: %s\n" -IDS_SYS_LOCALE, "Systemgebietsschema: %s\n" -IDS_INPUT_LOCALE, "Eingabegebietsschema: %s\n" -IDS_TOTAL_PHYS_MEM, "Gesamter Physikalischer Speicher: %ld MB (%ld KB)\n" -IDS_AVAIL_PHISICAL_MEM, "Verfgbarer Physikalischer Speicher: %ld MB (%ld KB)\n" -IDS_VIRT_MEM_MAX, "Auslagerungsdatei: Max Gre: %ld MB (%ld KB)\n" -IDS_VIRT_MEM_AVAIL, "Auslagerungsdatei: Verfgbar: %ld MB (%ld KB)\n" -IDS_VIRT_MEM_INUSE, "Auslagerungsdatei: In Verwendung: %ld MB (%ld KB)\n" -IDS_HOST_NAME, "Domne: %s\n" -IDS_PAGEFILE_LOC, "Auslagerungsdateipfad(e) %s" -IDS_TIME_ZONE, "Zeitzone: %s\n" -IDS_DOMINE, "Domain: %s\n" -IDS_BIOS_DATE, "BIOS Datum: %s\n" -IDS_BIOS_VERSION, "BIOS Version: %s\n" -IDS_NETWORK_CARDS, "Netzwerkkarte(n) %u Installiert.\n" +IDS_HOST_NAME, "Domne: %s\n" +IDS_OS_NAME, "OS Name: %s\n" +IDS_OS_VERSION, "OS Version: %u.%u.%u %s Build %u\n" +IDS_OS_BUILD_TYPE, "OS Build Typ: %s\n" +IDS_REG_OWNER, "Registrierter Benutzer: %s\n" +IDS_REG_ORG, "Registrierte Organisation: %s\n" +IDS_PRODUCT_ID, "Produkt ID: %s\n" +IDS_INST_DATE, "Installationsdatum: %s, " +IDS_INST_TIME, "%s\n" +IDS_UP_TIME, "System Up Time: %u Days, %u Hours, %u, Minutes, %u Seconds\n" +IDS_SYS_MANUFACTURER, "System Manufacturer: %s\n" +IDS_SYS_MODEL, "System Model: %s\n" +IDS_SYS_TYPE_UNKNOWN, "Systemtyp: Unbekannt\n" +IDS_SYS_TYPE_X86, "Systemtyp: X86-based PC\n" +IDS_SYS_TYPE_IA64, "Systemtyp: IA64-based PC\n" +IDS_SYS_TYPE_AMD64, "Systemtyp: AMD64-based PC\n" +IDS_PROCESSORS, "Prozessor(en): %u Prozessor(en) Installiert.\n" +IDS_BIOS_DATE, "BIOS Datum: %s\n" +IDS_BIOS_VERSION, "BIOS Version: %s\n" +IDS_ROS_DIR, "ReactOS Verzeichnis: %s\n" +IDS_SYS_DIR, "System Verzeichnis: %s\n" +IDS_BOOT_DEV, "Startgert: %s\n" +IDS_SYS_LOCALE, "Systemgebietsschema: %s\n" +IDS_INPUT_LOCALE, "Eingabegebietsschema: %s\n" +IDS_TOTAL_PHYS_MEM, "Gesamter Physikalischer Speicher: %ld MB (%ld KB)\n" +IDS_AVAIL_PHISICAL_MEM, "Verfgbarer Physikalischer Speicher: %ld MB (%ld KB)\n" +IDS_VIRT_MEM_MAX, "Auslagerungsdatei: Max Gre: %ld MB (%ld KB)\n" +IDS_VIRT_MEM_AVAIL, "Auslagerungsdatei: Verfgbar: %ld MB (%ld KB)\n" +IDS_VIRT_MEM_INUSE, "Auslagerungsdatei: In Verwendung: %ld MB (%ld KB)\n" +IDS_PAGEFILE_LOC, "Auslagerungsdateipfad(e) %s" +IDS_TIME_ZONE, "Zeitzone: %s\n" +IDS_DOMINE, "Domain: %s\n" +IDS_NETWORK_CARDS, "Netzwerkkarte(n) %u Installiert.\n" END diff --git a/rosapps/applications/sysutils/systeminfo/lang/en-US.rc b/rosapps/applications/sysutils/systeminfo/lang/en-US.rc index 005fa713f1b..6c2053f836c 100644 --- a/rosapps/applications/sysutils/systeminfo/lang/en-US.rc +++ b/rosapps/applications/sysutils/systeminfo/lang/en-US.rc @@ -10,15 +10,15 @@ Description:\n\ Parameter List:\n\ /S system Specifies the remote system to connect to.\n\n\ /U [domain\\]user Specifies the user context under which\n\ - the command should execute.\n\n\ + the command should execute.\n\n\ /P [password] Specifies the password for the given\n\ - user context. Prompts for input if omitted.\n\n\ + user context. Prompts for input if omitted.\n\n\ /FO format Specifies the format in which the output\n\ - is to be displayed.\n\ - Valid values: ""TABLE"", ""LIST"", ""CSV"".\n\n\ + is to be displayed.\n\ + Valid values: ""TABLE"", ""LIST"", ""CSV"".\n\n\ /NH Specifies that the ""Column Header"" should\n\ - not be displayed in the output.\n\ - Valid only for ""TABLE"" and ""CSV"" formats.\n\n\ + not be displayed in the output.\n\ + Valid only for ""TABLE"" and ""CSV"" formats.\n\n\ /? Displays this help/usage.\n\n\ Examples:\n\ SYSTEMINFO\n\ @@ -29,36 +29,38 @@ Examples:\n\ SYSTEMINFO /S system /FO LIST\n\ SYSTEMINFO /S system /FO CSV /NH\n" -IDS_OS_NAME, "OS Name: %s\n" -IDS_OS_VERSION, "OS Version: %u.%u.%u %s Build %u\n" -IDS_OS_BUILD_TYPE, "OS Build Type: %s\n" -IDS_REG_OWNER, "Registered Owner: %s\n" -IDS_REG_ORG, "Registered Organization: %s\n" -IDS_UP_TIME, "System Up Time: %u Days, %u Hours, %u, Minutes, %u Seconds\n" -IDS_PRODUCT_ID, "Product ID: %s\n" -IDS_INST_DATE, "Install Date: %s, " -IDS_INST_TIME, "%s\n" -IDS_SYS_TYPE_UNKNOWN, "System type: Unknown\n" -IDS_SYS_TYPE_X86, "System type: X86-based PC\n" -IDS_SYS_TYPE_IA64, "System type: IA64-based PC\n" -IDS_SYS_TYPE_AMD64, "System type: AMD64-based PC\n" -IDS_PROCESSORS, "Processor(s): %u Processor(s) Installed.\n" -IDS_ROS_DIR, "ReactOS Directory: %s\n" -IDS_SYS_DIR, "System Directory: %s\n" -IDS_BOOT_DEV, "Boot Device: %s\n" -IDS_SYS_LOCALE, "System Locale: %s\n" -IDS_INPUT_LOCALE, "Input Locale: %s\n" -IDS_TOTAL_PHYS_MEM, "Total Physical Memory: %ld MB (%ld KB)\n" -IDS_AVAIL_PHISICAL_MEM, "Available Physical Memory: %ld MB (%ld KB)\n" -IDS_VIRT_MEM_MAX, "Virtual Memory: Max Size: %ld MB (%ld KB)\n" -IDS_VIRT_MEM_AVAIL, "Virtual Memory: Available: %ld MB (%ld KB)\n" -IDS_VIRT_MEM_INUSE, "Virtual Memory: In Use: %ld MB (%ld KB)\n" -IDS_HOST_NAME, "Host Name: %s\n" -IDS_PAGEFILE_LOC, "Page File Location(s) %s\n" -IDS_TIME_ZONE, "Time zone: %s\n" -IDS_DOMINE, "Domain: %s\n" -IDS_BIOS_DATE, "BIOS Date: %s\n" -IDS_BIOS_VERSION, "BIOS Version: %s\n" -IDS_NETWORK_CARDS, "Network Card(s) %u Installed.\n" +IDS_HOST_NAME, "Host Name: %s\n" +IDS_OS_NAME, "OS Name: %s\n" +IDS_OS_VERSION, "OS Version: %u.%u.%u %s Build %u\n" +IDS_OS_BUILD_TYPE, "OS Build Type: %s\n" +IDS_REG_OWNER, "Registered Owner: %s\n" +IDS_REG_ORG, "Registered Organization: %s\n" +IDS_PRODUCT_ID, "Product ID: %s\n" +IDS_INST_DATE, "Install Date: %s, " +IDS_INST_TIME, "%s\n" +IDS_UP_TIME, "System Up Time: %u Days, %u Hours, %u, Minutes, %u Seconds\n" +IDS_SYS_MANUFACTURER, "System Manufacturer: %s\n" +IDS_SYS_MODEL, "System Model: %s\n" +IDS_SYS_TYPE_UNKNOWN, "System type: Unknown\n" +IDS_SYS_TYPE_X86, "System type: X86-based PC\n" +IDS_SYS_TYPE_IA64, "System type: IA64-based PC\n" +IDS_SYS_TYPE_AMD64, "System type: AMD64-based PC\n" +IDS_PROCESSORS, "Processor(s): %u Processor(s) Installed.\n" +IDS_BIOS_DATE, "BIOS Date: %s\n" +IDS_BIOS_VERSION, "BIOS Version: %s\n" +IDS_ROS_DIR, "ReactOS Directory: %s\n" +IDS_SYS_DIR, "System Directory: %s\n" +IDS_BOOT_DEV, "Boot Device: %s\n" +IDS_SYS_LOCALE, "System Locale: %s\n" +IDS_INPUT_LOCALE, "Input Locale: %s\n" +IDS_TOTAL_PHYS_MEM, "Total Physical Memory: %ld MB (%ld KB)\n" +IDS_AVAIL_PHISICAL_MEM, "Available Physical Memory: %ld MB (%ld KB)\n" +IDS_VIRT_MEM_MAX, "Virtual Memory: Max Size: %ld MB (%ld KB)\n" +IDS_VIRT_MEM_AVAIL, "Virtual Memory: Available: %ld MB (%ld KB)\n" +IDS_VIRT_MEM_INUSE, "Virtual Memory: In Use: %ld MB (%ld KB)\n" +IDS_PAGEFILE_LOC, "Page File Location(s) %s\n" +IDS_TIME_ZONE, "Time zone: %s\n" +IDS_DOMINE, "Domain: %s\n" +IDS_NETWORK_CARDS, "Network Card(s) %u Installed.\n" END diff --git a/rosapps/applications/sysutils/systeminfo/lang/es-ES.rc b/rosapps/applications/sysutils/systeminfo/lang/es-ES.rc index eabccc4cc04..21491ba7075 100644 --- a/rosapps/applications/sysutils/systeminfo/lang/es-ES.rc +++ b/rosapps/applications/sysutils/systeminfo/lang/es-ES.rc @@ -15,15 +15,15 @@ Description:\n\ Lista de Parametros:\n\ /S sistema Especifica el sistema remoto al cual conectarse.\n\n\ /U [dominio\\]usuario Especifica el usuario bajo el cual el comando\n\ - debe ejecutarse.\n\n\ + debe ejecutarse.\n\n\ /P [contrasea] Especifica la contrasea de usuario.\n\ - Pregunta por ella si es omitida.\n\n\ + Pregunta por ella si es omitida.\n\n\ /FO formato Especifica el formato en el que la salida\n\ - ser mostrada.\n\ - Valores vlidos: ""TABLE"", ""LIST"", ""CSV"".\n\n\ + ser mostrada.\n\ + Valores vlidos: ""TABLE"", ""LIST"", ""CSV"".\n\n\ /NH Especifica que la ""Columna cabezera"" no ser\n\ - mostrada en la salida.\n\ - Vlido slo para formatos ""TABLE"" y ""CSV"" .\n\n\ + mostrada en la salida.\n\ + Vlido slo para formatos ""TABLE"" y ""CSV"" .\n\n\ /? Muestra esta ayuda.\n\n\ Ejemplos:\n\ SYSTEMINFO\n\ @@ -34,36 +34,38 @@ Ejemplos:\n\ SYSTEMINFO /S sistema /FO LIST\n\ SYSTEMINFO /S sistema /FO CSV /NH\n" -IDS_OS_NAME, "Nombre Sistema Operativo: %s\n" -IDS_OS_VERSION, "Versin Sistema Operativo: %u.%u.%u %s Compilacin %u\n" -IDS_OS_BUILD_TYPE, "Tipo Compilacin: %s\n" -IDS_REG_OWNER, "Propietario: %s\n" -IDS_REG_ORG, "Organizacin: %s\n" -IDS_UP_TIME, "System Up Time: %u Days, %u Hours, %u, Minutes, %u Seconds\n" -IDS_PRODUCT_ID, "Identificador de Producto %s\n" -IDS_INST_DATE, "Fecha de Instalacin: %s, " -IDS_INST_TIME, "%s\n" -IDS_SYS_TYPE_UNKNOWN, "Tipo de sistema: Desconocido\n" -IDS_SYS_TYPE_X86, "Tipo de sistema: PC basado en X86\n" -IDS_SYS_TYPE_IA64, "Tipo de sistema: PC basado en IA64\n" -IDS_SYS_TYPE_AMD64, "Tipo de sistema: PC basado en AMD64\n" -IDS_PROCESSORS, "Procesador(es): %u Procesador(es) Instalados.\n" -IDS_ROS_DIR, "Directorio de ReactOS: %s\n" -IDS_SYS_DIR, "Directorio del Sistema: %s\n" -IDS_BOOT_DEV, "Dispositivo de Inicio: %s\n" -IDS_SYS_LOCALE, "Idioma del sistema: %s\n" -IDS_INPUT_LOCALE, "Idioma de entrada: %s\n" -IDS_TOTAL_PHYS_MEM, "Memoria Fsica Total: %ld MB (%ld KB)\n" -IDS_AVAIL_PHISICAL_MEM, "Memoria Fsica Disponible: %ld MB (%ld KB)\n" -IDS_VIRT_MEM_MAX, "Memoria Virtual: Tamao Mx: %ld MB (%ld KB)\n" -IDS_VIRT_MEM_AVAIL, "Memoria Virtual: Disponible: %ld MB (%ld KB)\n" -IDS_VIRT_MEM_INUSE, "Memoria Virtual: En Uso: %ld MB (%ld KB)\n" -IDS_HOST_NAME, "Nombre del Servidor: %s\n" -IDS_PAGEFILE_LOC, "Ruta(s) Archivo Paginacin %s\n" -IDS_TIME_ZONE, "Zona horario: %s\n" -IDS_DOMINE, "Dominio: %s\n" -IDS_BIOS_DATE, "Fecha BIOS: %s\n" -IDS_BIOS_VERSION, "Versin BIOS: %s\n" -IDS_NETWORK_CARDS, "Tarjeta(s) de Red %u No Instalada.\n" +IDS_HOST_NAME, "Nombre del Servidor: %s\n" +IDS_OS_NAME, "Nombre Sistema Operativo: %s\n" +IDS_OS_VERSION, "Versin Sistema Operativo: %u.%u.%u %s Compilacin %u\n" +IDS_OS_BUILD_TYPE, "Tipo Compilacin: %s\n" +IDS_REG_OWNER, "Propietario: %s\n" +IDS_REG_ORG, "Organizacin: %s\n" +IDS_PRODUCT_ID, "Identificador de Producto %s\n" +IDS_INST_DATE, "Fecha de Instalacin: %s, " +IDS_INST_TIME, "%s\n" +IDS_UP_TIME, "System Up Time: %u Days, %u Hours, %u, Minutes, %u Seconds\n" +IDS_SYS_MANUFACTURER, "System Manufacturer: %s\n" +IDS_SYS_MODEL, "System Model: %s\n" +IDS_SYS_TYPE_UNKNOWN, "Tipo de sistema: Desconocido\n" +IDS_SYS_TYPE_X86, "Tipo de sistema: PC basado en X86\n" +IDS_SYS_TYPE_IA64, "Tipo de sistema: PC basado en IA64\n" +IDS_SYS_TYPE_AMD64, "Tipo de sistema: PC basado en AMD64\n" +IDS_PROCESSORS, "Procesador(es): %u Procesador(es) Instalados.\n" +IDS_BIOS_DATE, "Fecha BIOS: %s\n" +IDS_BIOS_VERSION, "Versin BIOS: %s\n" +IDS_ROS_DIR, "Directorio de ReactOS: %s\n" +IDS_SYS_DIR, "Directorio del Sistema: %s\n" +IDS_BOOT_DEV, "Dispositivo de Inicio: %s\n" +IDS_SYS_LOCALE, "Idioma del sistema: %s\n" +IDS_INPUT_LOCALE, "Idioma de entrada: %s\n" +IDS_TOTAL_PHYS_MEM, "Memoria Fsica Total: %ld MB (%ld KB)\n" +IDS_AVAIL_PHISICAL_MEM, "Memoria Fsica Disponible: %ld MB (%ld KB)\n" +IDS_VIRT_MEM_MAX, "Memoria Virtual: Tamao Mx: %ld MB (%ld KB)\n" +IDS_VIRT_MEM_AVAIL, "Memoria Virtual: Disponible: %ld MB (%ld KB)\n" +IDS_VIRT_MEM_INUSE, "Memoria Virtual: En Uso: %ld MB (%ld KB)\n" +IDS_PAGEFILE_LOC, "Ruta(s) Archivo Paginacin %s\n" +IDS_TIME_ZONE, "Zona horario: %s\n" +IDS_DOMINE, "Dominio: %s\n" +IDS_NETWORK_CARDS, "Tarjeta(s) de Red %u No Instalada.\n" END diff --git a/rosapps/applications/sysutils/systeminfo/lang/fr-FR.rc b/rosapps/applications/sysutils/systeminfo/lang/fr-FR.rc index aacdbdf80c2..d99900e1ab1 100644 --- a/rosapps/applications/sysutils/systeminfo/lang/fr-FR.rc +++ b/rosapps/applications/sysutils/systeminfo/lang/fr-FR.rc @@ -10,15 +10,15 @@ Description :\n\ Parameter List:\n\ /S systme Spcifie le systme distant auquel se connecter.\n\n\ /U [domain\\]user Spcifie le contexte utilisateur dans lequel\n\ - la commande doit tre excute.\n\n\ + la commande doit tre excute.\n\n\ /P [motdepasse] Spcifie le mot de passe pour le contexte utilisateur\n\ - fourni. Le demande si ommis.\n\n\ + fourni. Le demande si ommis.\n\n\ /FO format Spcifie le format dans lequel la sortie\n\ - doit tre affiche.\n\ - Valeurs valides: ""TABLE"", ""LIST"", ""CSV"".\n\n\ + doit tre affiche.\n\ + Valeurs valides: ""TABLE"", ""LIST"", ""CSV"".\n\n\ /NH Spcifie que ""L'entte de colonne"" ne doit\n\ - pas tre affich dans la sortie.\n\ - Valide uniquement pour les format ""TABLE"" et ""CSV"".\n\n\ + pas tre affich dans la sortie.\n\ + Valide uniquement pour les format ""TABLE"" et ""CSV"".\n\n\ /? Affiche cette aide.\n\n\ Exemples:\n\ SYSTEMINFO\n\ @@ -29,36 +29,38 @@ Exemples:\n\ SYSTEMINFO /S systme /FO LIST\n\ SYSTEMINFO /S systme /FO CSV /NH\n" -IDS_OS_NAME, "Nom du systme d'exploitation : %s\n" -IDS_OS_VERSION, "Version du systme d'exploitation : %u.%u.%u %s Compilation %u\n" -IDS_OS_BUILD_TYPE, "Type de compilation du systme d'exploitation : %s\n" -IDS_REG_OWNER, "Propritaire enregistr : %s\n" -IDS_REG_ORG, "Organisation enregistre : %s\n" -IDS_UP_TIME, "System Up Time: %u Days, %u Hours, %u, Minutes, %u Seconds\n" -IDS_PRODUCT_ID, "ID du produit : %s\n" -IDS_INST_DATE, "Date d'installation : %s, " -IDS_INST_TIME, "%s\n" -IDS_SYS_TYPE_UNKNOWN, "Type du systme : Inconnu\n" -IDS_SYS_TYPE_X86, "Type du systme : Bas sur un PC X86\n" -IDS_SYS_TYPE_IA64, "Type du systme : Bas sur un PC IA64\n" -IDS_SYS_TYPE_AMD64, "Type du systme : Bas sur un PC AMD64\n" -IDS_PROCESSORS, "Processeur(s) : %u Processeur(s) install(s).\n" -IDS_ROS_DIR, "Rpertoire ReactOS : %s\n" -IDS_SYS_DIR, "Rpertoire systme : %s\n" -IDS_BOOT_DEV, "Priphrique de dmarrage : %s\n" -IDS_SYS_LOCALE, "Paramtre rgional du systme : %s\n" -IDS_INPUT_LOCALE, "Paramtre rgional de saisie : %s\n" -IDS_TOTAL_PHYS_MEM, "Mmoire physique totale : %ld Mo (%ld Ko)\n" -IDS_AVAIL_PHISICAL_MEM, "Mmoire physique disponible : %ld Mo (%ld Ko)\n" -IDS_VIRT_MEM_MAX, "Mmoire virtuelle: Taille max : %ld Mo (%ld Ko)\n" -IDS_VIRT_MEM_AVAIL, "Mmoire virtuelle: Disponible : %ld Mo (%ld Ko)\n" -IDS_VIRT_MEM_INUSE, "Mmoire virtuelle: Utilise : %ld Mo (%ld Ko)\n" -IDS_HOST_NAME, "Nom d'hte : %s\n" -IDS_PAGEFILE_LOC, "Emplacement(s) des fichiers d'change %s" -IDS_TIME_ZONE, "Fuseau horaire : %s\n" -IDS_DOMINE, "Domaine : %s\n" -IDS_BIOS_DATE, "Date du BIOS : %s\n" -IDS_BIOS_VERSION, "Version du BIOS : %s\n" -IDS_NETWORK_CARDS, "Carte(s) rseau %u installe(s).\n" +IDS_HOST_NAME, "Nom d'hte : %s\n" +IDS_OS_NAME, "Nom du systme d'exploitation : %s\n" +IDS_OS_VERSION, "Version du systme d'exploitation : %u.%u.%u %s Compilation %u\n" +IDS_OS_BUILD_TYPE, "Type de compilation du systme d'exploitation : %s\n" +IDS_REG_OWNER, "Propritaire enregistr : %s\n" +IDS_REG_ORG, "Organisation enregistre : %s\n" +IDS_PRODUCT_ID, "ID du produit : %s\n" +IDS_INST_DATE, "Date d'installation : %s, " +IDS_INST_TIME, "%s\n" +IDS_UP_TIME, "System Up Time: %u Days, %u Hours, %u, Minutes, %u Seconds\n" +IDS_SYS_MANUFACTURER, "System Manufacturer: %s\n" +IDS_SYS_MODEL, "System Model: %s\n" +IDS_SYS_TYPE_UNKNOWN, "Type du systme : Inconnu\n" +IDS_SYS_TYPE_X86, "Type du systme : Bas sur un PC X86\n" +IDS_SYS_TYPE_IA64, "Type du systme : Bas sur un PC IA64\n" +IDS_SYS_TYPE_AMD64, "Type du systme : Bas sur un PC AMD64\n" +IDS_PROCESSORS, "Processeur(s) : %u Processeur(s) install(s).\n" +IDS_BIOS_DATE, "Date du BIOS : %s\n" +IDS_BIOS_VERSION, "Version du BIOS : %s\n" +IDS_ROS_DIR, "Rpertoire ReactOS : %s\n" +IDS_SYS_DIR, "Rpertoire systme : %s\n" +IDS_BOOT_DEV, "Priphrique de dmarrage : %s\n" +IDS_SYS_LOCALE, "Paramtre rgional du systme : %s\n" +IDS_INPUT_LOCALE, "Paramtre rgional de saisie : %s\n" +IDS_TOTAL_PHYS_MEM, "Mmoire physique totale : %ld Mo (%ld Ko)\n" +IDS_AVAIL_PHISICAL_MEM, "Mmoire physique disponible : %ld Mo (%ld Ko)\n" +IDS_VIRT_MEM_MAX, "Mmoire virtuelle: Taille max : %ld Mo (%ld Ko)\n" +IDS_VIRT_MEM_AVAIL, "Mmoire virtuelle: Disponible : %ld Mo (%ld Ko)\n" +IDS_VIRT_MEM_INUSE, "Mmoire virtuelle: Utilise : %ld Mo (%ld Ko)\n" +IDS_PAGEFILE_LOC, "Emplacement(s) des fichiers d'change %s" +IDS_TIME_ZONE, "Fuseau horaire : %s\n" +IDS_DOMINE, "Domaine : %s\n" +IDS_NETWORK_CARDS, "Carte(s) rseau %u installe(s).\n" END diff --git a/rosapps/applications/sysutils/systeminfo/lang/no-NO.rc b/rosapps/applications/sysutils/systeminfo/lang/no-NO.rc index f541156c496..0beda9afec7 100644 --- a/rosapps/applications/sysutils/systeminfo/lang/no-NO.rc +++ b/rosapps/applications/sysutils/systeminfo/lang/no-NO.rc @@ -8,18 +8,18 @@ Beskrivelse:\n\ Denne komando linje verktyet gjr det mulig for en administrator sprre om basis\n\ system konfigurasjon informasjon.\n\n\ Parameter liste:\n\ - /S system Spesifisere eksternt system for kunne kobles til.\n\n\ - /U [domene\\]bruker Spesifisere brukeren sammenheng under hvilken\n\ - av kommando som skal kjres.\n\n\ - /P [passord] Spesifisere passord for gitt\n\ - bruker sammenheng. Prompts for input if omitted.\n\n\ - /FO format Spesifisere formatet som i utgende\n\ - som skal vises.\n\ - Gyldige verdier: ""TABLE"", ""LIST"", ""CSV"".\n\n\ - /NH Spesifisere at ""Column Header"" skal\n\ - ikke vises i utgende.\n\ - Gyldig for bare ""TABLE"" og ""CSV"" formater.\n\n\ - /? Vis denne hjelp/bruk meldingen.\n\n\ + /S system Spesifisere eksternt system for kunne kobles til.\n\n\ + /U [domene\\]bruker Spesifisere brukeren sammenheng under hvilken\n\ + av kommando som skal kjres.\n\n\ + /P [passord] Spesifisere passord for gitt\n\ + bruker sammenheng. Prompts for input if omitted.\n\n\ + /FO format Spesifisere formatet som i utgende\n\ + som skal vises.\n\ + Gyldige verdier: ""TABLE"", ""LIST"", ""CSV"".\n\n\ + /NH Spesifisere at ""Column Header"" skal\n\ + ikke vises i utgende.\n\ + Gyldig for bare ""TABLE"" og ""CSV"" formater.\n\n\ + /? Vis denne hjelp/bruk meldingen.\n\n\ Eksempler:\n\ SYSTEMINFO\n\ SYSTEMINFO /?\n\ @@ -29,36 +29,38 @@ Eksempler:\n\ SYSTEMINFO /S system /FO LIST\n\ SYSTEMINFO /S system /FO CSV /NH\n" -IDS_OS_NAME, "OS navn: %s\n" -IDS_OS_VERSION, "OS versjon: %u.%u.%u %s Bygget %u\n" -IDS_OS_BUILD_TYPE, "OS bygg type: %s\n" -IDS_REG_OWNER, "Registert eier: %s\n" -IDS_REG_ORG, "Registerert organisasjon: %s\n" -IDS_UP_TIME, "System Up Time: %u Days, %u Hours, %u, Minutes, %u Seconds\n" -IDS_PRODUCT_ID, "Produkt ID: %s\n" -IDS_INST_DATE, "Installert dato: %s, " -IDS_INST_TIME, "%s\n" -IDS_SYS_TYPE_UNKNOWN, "Systemtype: Ukjent\n" -IDS_SYS_TYPE_X86, "Systemtype: X86-basert PC\n" -IDS_SYS_TYPE_IA64, "Systemtype: IA64-basert PC\n" -IDS_SYS_TYPE_AMD64, "Systemtype: AMD64-basert PC\n" -IDS_PROCESSORS, "Prosessor(er): %u Prosessor(er) installert.\n" -IDS_ROS_DIR, "ReactOS mappe: %s\n" -IDS_SYS_DIR, "System mappe: %s\n" -IDS_BOOT_DEV, "Oppstartsenhet: %s\n" -IDS_SYS_LOCALE, "System lokal: %s\n" -IDS_INPUT_LOCALE, "Input lokal: %s\n" -IDS_TOTAL_PHYS_MEM, "Total fysisk minne: %ld MB (%ld KB)\n" -IDS_AVAIL_PHISICAL_MEM, "Tilgjengelig fysisk minne: %ld MB (%ld KB)\n" -IDS_VIRT_MEM_MAX, "Virtuelt minne: Maks Strrelse: %ld MB (%ld KB)\n" -IDS_VIRT_MEM_AVAIL, "Virtuelt minne: Tilgjengelig: %ld MB (%ld KB)\n" -IDS_VIRT_MEM_INUSE, "Virtuelt minne: i bruk: %ld MB (%ld KB)\n" -IDS_HOST_NAME, "Datamaskin navn: %s\n" -IDS_PAGEFILE_LOC, "Sidevekslingsfil lokalsjon(er) %s\n" -IDS_TIME_ZONE, "Tidssone: %s\n" -IDS_DOMINE, "Domene: %s\n" -IDS_BIOS_DATE, "BIOS dato: %s\n" -IDS_BIOS_VERSION, "BIOS Versjon: %s\n" -IDS_NETWORK_CARDS, "Nettverkskort(er) %u installert.\n" +IDS_HOST_NAME, "Datamaskin navn: %s\n" +IDS_OS_NAME, "OS navn: %s\n" +IDS_OS_VERSION, "OS versjon: %u.%u.%u %s Bygget %u\n" +IDS_OS_BUILD_TYPE, "OS bygg type: %s\n" +IDS_REG_OWNER, "Registert eier: %s\n" +IDS_REG_ORG, "Registerert organisasjon: %s\n" +IDS_PRODUCT_ID, "Produkt ID: %s\n" +IDS_INST_DATE, "Installert dato: %s, " +IDS_INST_TIME, "%s\n" +IDS_UP_TIME, "System Up Time: %u Days, %u Hours, %u, Minutes, %u Seconds\n" +IDS_SYS_MANUFACTURER, "System Manufacturer: %s\n" +IDS_SYS_MODEL, "System Model: %s\n" +IDS_SYS_TYPE_UNKNOWN, "Systemtype: Ukjent\n" +IDS_SYS_TYPE_X86, "Systemtype: X86-basert PC\n" +IDS_SYS_TYPE_IA64, "Systemtype: IA64-basert PC\n" +IDS_SYS_TYPE_AMD64, "Systemtype: AMD64-basert PC\n" +IDS_PROCESSORS, "Prosessor(er): %u Prosessor(er) installert.\n" +IDS_BIOS_DATE, "BIOS dato: %s\n" +IDS_BIOS_VERSION, "BIOS Versjon: %s\n" +IDS_ROS_DIR, "ReactOS mappe: %s\n" +IDS_SYS_DIR, "System mappe: %s\n" +IDS_BOOT_DEV, "Oppstartsenhet: %s\n" +IDS_SYS_LOCALE, "System lokal: %s\n" +IDS_INPUT_LOCALE, "Input lokal: %s\n" +IDS_TOTAL_PHYS_MEM, "Total fysisk minne: %ld MB (%ld KB)\n" +IDS_AVAIL_PHISICAL_MEM, "Tilgjengelig fysisk minne: %ld MB (%ld KB)\n" +IDS_VIRT_MEM_MAX, "Virtuelt minne: Maks Strrelse: %ld MB (%ld KB)\n" +IDS_VIRT_MEM_AVAIL, "Virtuelt minne: Tilgjengelig: %ld MB (%ld KB)\n" +IDS_VIRT_MEM_INUSE, "Virtuelt minne: i bruk: %ld MB (%ld KB)\n" +IDS_PAGEFILE_LOC, "Sidevekslingsfil lokalsjon(er) %s\n" +IDS_TIME_ZONE, "Tidssone: %s\n" +IDS_DOMINE, "Domene: %s\n" +IDS_NETWORK_CARDS, "Nettverkskort(er) %u installert.\n" END diff --git a/rosapps/applications/sysutils/systeminfo/lang/pl-PL.rc b/rosapps/applications/sysutils/systeminfo/lang/pl-PL.rc index 53a421dcf12..6f48d0656ee 100644 --- a/rosapps/applications/sysutils/systeminfo/lang/pl-PL.rc +++ b/rosapps/applications/sysutils/systeminfo/lang/pl-PL.rc @@ -17,15 +17,15 @@ Opis:\n\ Lista parametrw:\n\ /S system Wyznacza nazw systemu zdalnego do poczenia.\n\n\ /U [domain\\]user Wyznacza uytkownika (domen) z ktrego konta\n\ - komenda bdzie wywoana.\n\n\ + komenda bdzie wywoana.\n\n\ /P [password] Wyznacza haso do uytego konta uytkownika\n\ - Program sam zapyta o haso, jeli nie jest podane.\n\n\ + Program sam zapyta o haso, jeli nie jest podane.\n\n\ /FO format Wyznacza format w ktrym wywietlone zostan\n\ - informacje o systemie.\n\ - Dostpne formaty: ""TABLE"", ""LIST"", ""CSV"".\n\n\ + informacje o systemie.\n\ + Dostpne formaty: ""TABLE"", ""LIST"", ""CSV"".\n\n\ /NH Blokuje wywietlanie kolumny ""Column Header"" w\n\ - informacjach systemowych.\n\ - Dziaa tylko z formatami ""TABLE"" i ""CSV"".\n\n\ + informacjach systemowych.\n\ + Dziaa tylko z formatami ""TABLE"" i ""CSV"".\n\n\ /? Wywietla niniejszy tekst pomocy.\n\n\ Przykady:\n\ SYSTEMINFO\n\ @@ -36,36 +36,38 @@ Przyk SYSTEMINFO /S system /FO LIST\n\ SYSTEMINFO /S system /FO CSV /NH\n" -IDS_OS_NAME, "Nazwa Systemu: %s\n" -IDS_OS_VERSION, "Wersja: %u.%u.%u %s Kompilacja %u\n" -IDS_OS_BUILD_TYPE, "Rodzaj kompilacji: %s\n" -IDS_REG_OWNER, "Uytkownik: %s\n" -IDS_REG_ORG, "Organizacja: %s\n" -IDS_UP_TIME, "System Up Time: %u Days, %u Hours, %u, Minutes, %u Seconds\n" -IDS_PRODUCT_ID, "ID produktu: %s\n" -IDS_INST_DATE, "Data instalacji: %s, " -IDS_INST_TIME, "%s\n" -IDS_SYS_TYPE_UNKNOWN, "Rodzaj systemu: Unknown\n" -IDS_SYS_TYPE_X86, "Architektura: X86-based PC\n" -IDS_SYS_TYPE_IA64, "Architektura: IA64-based PC\n" -IDS_SYS_TYPE_AMD64, "Rodzaj systemu: AMD64-based PC\n" -IDS_PROCESSORS, "Ilo Procesorw: %u.\n" -IDS_ROS_DIR, "Katalog ReactOS: %s\n" -IDS_SYS_DIR, "Katalog Systemowy: %s\n" -IDS_BOOT_DEV, "Urzdzenie rdowe: %s\n" -IDS_SYS_LOCALE, "Wersja lokalizacji: %s\n" -IDS_INPUT_LOCALE, "Lokalizacja klawiatury: %s\n" -IDS_TOTAL_PHYS_MEM, "Pamici fizycznej ogem: %ld MB (%ld KB)\n" -IDS_AVAIL_PHISICAL_MEM, "Dostpnej pamici fizycznej: %ld MB (%ld KB)\n" -IDS_VIRT_MEM_MAX, "Pamici wirtualnej: Maksymalnie: %ld MB (%ld KB)\n" -IDS_VIRT_MEM_AVAIL, "Pamici wirtualnej: Dostpne: %ld MB (%ld KB)\n" -IDS_VIRT_MEM_INUSE, "Pamici wirtualnej: W uyciu: %ld MB (%ld KB)\n" -IDS_HOST_NAME, "Nazwa hosta: %s\n" -IDS_PAGEFILE_LOC, "Lokalizacja pliku wymiany %s\n" -IDS_TIME_ZONE, "Strefa czasowa: %s\n" -IDS_DOMINE, "Domena: %s\n" -IDS_BIOS_DATE, "Data BIOSu: %s\n" -IDS_BIOS_VERSION, "Wersja BIOSu: %s\n" -IDS_NETWORK_CARDS, "Liczba kart sieciowych %u.\n" +IDS_HOST_NAME, "Nazwa hosta: %s\n" +IDS_OS_NAME, "Nazwa Systemu: %s\n" +IDS_OS_VERSION, "Wersja: %u.%u.%u %s Kompilacja %u\n" +IDS_OS_BUILD_TYPE, "Rodzaj kompilacji: %s\n" +IDS_REG_OWNER, "Uytkownik: %s\n" +IDS_REG_ORG, "Organizacja: %s\n" +IDS_PRODUCT_ID, "ID produktu: %s\n" +IDS_INST_DATE, "Data instalacji: %s, " +IDS_INST_TIME, "%s\n" +IDS_UP_TIME, "System Up Time: %u Days, %u Hours, %u, Minutes, %u Seconds\n" +IDS_SYS_MANUFACTURER, "Producent systemu: %s\n" +IDS_SYS_MODEL, "Model systemu: %s\n" +IDS_SYS_TYPE_UNKNOWN, "Rodzaj systemu: Unknown\n" +IDS_SYS_TYPE_X86, "Architektura: X86-based PC\n" +IDS_SYS_TYPE_IA64, "Architektura: IA64-based PC\n" +IDS_SYS_TYPE_AMD64, "Rodzaj systemu: AMD64-based PC\n" +IDS_PROCESSORS, "Ilo Procesorw: %u.\n" +IDS_BIOS_DATE, "Data BIOSu: %s\n" +IDS_BIOS_VERSION, "Wersja BIOSu: %s\n" +IDS_ROS_DIR, "Katalog ReactOS: %s\n" +IDS_SYS_DIR, "Katalog Systemowy: %s\n" +IDS_BOOT_DEV, "Urzdzenie rdowe: %s\n" +IDS_SYS_LOCALE, "Wersja lokalizacji: %s\n" +IDS_INPUT_LOCALE, "Lokalizacja klawiatury: %s\n" +IDS_TOTAL_PHYS_MEM, "Pamici fizycznej ogem: %ld MB (%ld KB)\n" +IDS_AVAIL_PHISICAL_MEM, "Dostpnej pamici fizycznej: %ld MB (%ld KB)\n" +IDS_VIRT_MEM_MAX, "Pamici wirtualnej: Maksymalnie: %ld MB (%ld KB)\n" +IDS_VIRT_MEM_AVAIL, "Pamici wirtualnej: Dostpne: %ld MB (%ld KB)\n" +IDS_VIRT_MEM_INUSE, "Pamici wirtualnej: W uyciu: %ld MB (%ld KB)\n" +IDS_PAGEFILE_LOC, "Lokalizacja pliku wymiany %s\n" +IDS_TIME_ZONE, "Strefa czasowa: %s\n" +IDS_DOMINE, "Domena: %s\n" +IDS_NETWORK_CARDS, "Liczba kart sieciowych %u.\n" END diff --git a/rosapps/applications/sysutils/systeminfo/lang/sk-SK.rc b/rosapps/applications/sysutils/systeminfo/lang/sk-SK.rc index a4b87232f69..cfe27484ec7 100644 --- a/rosapps/applications/sysutils/systeminfo/lang/sk-SK.rc +++ b/rosapps/applications/sysutils/systeminfo/lang/sk-SK.rc @@ -12,18 +12,18 @@ Description:\n\ This command line tool enables an administrator to query for basic\n\ system configuration information.\n\n\ Parameter List:\n\ - /S systm Specifies the remote system to connect to.\n\n\ - /U [domna\\]pouvate Specifies the user context under which\n\ - the command should execute.\n\n\ - /P [heslo] Specifies the password for the given\n\ - user context. Prompts for input if omitted.\n\n\ - /FO formt Specifies the format in which the output\n\ - is to be displayed.\n\ - Valid values: ""TABLE"", ""LIST"", ""CSV"".\n\n\ - /NH Specifies that the ""Column Header"" should\n\ - not be displayed in the output.\n\ - Valid only for ""TABLE"" and ""CSV"" formats.\n\n\ - /? Displays this help/usage.\n\n\ + /S systm Specifies the remote system to connect to.\n\n\ + /U [domna\\]pouvate Specifies the user context under which\n\ + the command should execute.\n\n\ + /P [heslo] Specifies the password for the given\n\ + user context. Prompts for input if omitted.\n\n\ + /FO formt Specifies the format in which the output\n\ + is to be displayed.\n\ + Valid values: ""TABLE"", ""LIST"", ""CSV"".\n\n\ + /NH Specifies that the ""Column Header"" should\n\ + not be displayed in the output.\n\ + Valid only for ""TABLE"" and ""CSV"" formats.\n\n\ + /? Displays this help/usage.\n\n\ Examples:\n\ SYSTEMINFO\n\ SYSTEMINFO /?\n\ @@ -33,36 +33,38 @@ Examples:\n\ SYSTEMINFO /S system /FO LIST\n\ SYSTEMINFO /S system /FO CSV /NH\n" -IDS_OS_NAME, "Nzov OS: %s\n" -IDS_OS_VERSION, "Verzia OS: %u.%u.%u %s Build %u\n" -IDS_OS_BUILD_TYPE, "OS Build typ: %s\n" -IDS_REG_OWNER, "Registovan vlastnk: %s\n" -IDS_REG_ORG, "Registrovan organizcia: %s\n" -IDS_UP_TIME, "System Up Time: %u Days, %u Hours, %u, Minutes, %u Seconds\n" -IDS_PRODUCT_ID, "ID produktu: %s\n" -IDS_INST_DATE, "Dtum intalcie: %s, " -IDS_INST_TIME, "%s\n" -IDS_SYS_TYPE_UNKNOWN, "Typ systmu: Neznmy\n" -IDS_SYS_TYPE_X86, "Typ systmu: PC zaloen na X86\n" -IDS_SYS_TYPE_IA64, "Typ systmu: PC zaloen na IA64\n" -IDS_SYS_TYPE_AMD64, "Typ systmu: PC zaloen na AMD64\n" -IDS_PROCESSORS, "Procesor(y): %u Procesor(y) naintalovan.\n" -IDS_ROS_DIR, "Adresr ReactOS: %s\n" -IDS_SYS_DIR, "Adresr System: %s\n" -IDS_BOOT_DEV, "Zavdzacie zariadenie: %s\n" -IDS_SYS_LOCALE, "System Locale: %s\n" -IDS_INPUT_LOCALE, "Input Locale: %s\n" -IDS_TOTAL_PHYS_MEM, "Celkov fyzick pam: %ld MB (%ld KB)\n" -IDS_AVAIL_PHISICAL_MEM, "Dostupn fyzick pam: %ld MB (%ld KB)\n" -IDS_VIRT_MEM_MAX, "Virtulna pam: Max Size: %ld MB (%ld KB)\n" -IDS_VIRT_MEM_AVAIL, "Virtulna pam: Available: %ld MB (%ld KB)\n" -IDS_VIRT_MEM_INUSE, "Virtulna pam: In Use: %ld MB (%ld KB)\n" -IDS_HOST_NAME, "Host Name: %s\n" -IDS_PAGEFILE_LOC, "Umiestnenie(a) strnkovacieho sboru: %s\n" -IDS_TIME_ZONE, "asov psmo: %s\n" -IDS_DOMINE, "Domna: %s\n" -IDS_BIOS_DATE, "Dtum BIOSu: %s\n" -IDS_BIOS_VERSION, "Verzia BIOSu: %s\n" -IDS_NETWORK_CARDS, "Sieov karta(y) %u naintalovan.\n" +IDS_HOST_NAME, "Host Name: %s\n" +IDS_OS_NAME, "Nzov OS: %s\n" +IDS_OS_VERSION, "Verzia OS: %u.%u.%u %s Build %u\n" +IDS_OS_BUILD_TYPE, "OS Build typ: %s\n" +IDS_REG_OWNER, "Registovan vlastnk: %s\n" +IDS_REG_ORG, "Registrovan organizcia: %s\n" +IDS_PRODUCT_ID, "ID produktu: %s\n" +IDS_INST_DATE, "Dtum intalcie: %s, " +IDS_INST_TIME, "%s\n" +IDS_UP_TIME, "System Up Time: %u Days, %u Hours, %u, Minutes, %u Seconds\n" +IDS_SYS_MANUFACTURER, "System Manufacturer: %s\n" +IDS_SYS_MODEL, "System Model: %s\n" +IDS_SYS_TYPE_UNKNOWN, "Typ systmu: Neznmy\n" +IDS_SYS_TYPE_X86, "Typ systmu: PC zaloen na X86\n" +IDS_SYS_TYPE_IA64, "Typ systmu: PC zaloen na IA64\n" +IDS_SYS_TYPE_AMD64, "Typ systmu: PC zaloen na AMD64\n" +IDS_PROCESSORS, "Procesor(y): %u Procesor(y) naintalovan.\n" +IDS_BIOS_DATE, "Dtum BIOSu: %s\n" +IDS_BIOS_VERSION, "Verzia BIOSu: %s\n" +IDS_ROS_DIR, "Adresr ReactOS: %s\n" +IDS_SYS_DIR, "Adresr System: %s\n" +IDS_BOOT_DEV, "Zavdzacie zariadenie: %s\n" +IDS_SYS_LOCALE, "System Locale: %s\n" +IDS_INPUT_LOCALE, "Input Locale: %s\n" +IDS_TOTAL_PHYS_MEM, "Celkov fyzick pam: %ld MB (%ld KB)\n" +IDS_AVAIL_PHISICAL_MEM, "Dostupn fyzick pam: %ld MB (%ld KB)\n" +IDS_VIRT_MEM_MAX, "Virtulna pam: Max Size: %ld MB (%ld KB)\n" +IDS_VIRT_MEM_AVAIL, "Virtulna pam: Available: %ld MB (%ld KB)\n" +IDS_VIRT_MEM_INUSE, "Virtulna pam: In Use: %ld MB (%ld KB)\n" +IDS_PAGEFILE_LOC, "Umiestnenie(a) strnkovacieho sboru: %s\n" +IDS_TIME_ZONE, "asov psmo: %s\n" +IDS_DOMINE, "Domna: %s\n" +IDS_NETWORK_CARDS, "Sieov karta(y) %u naintalovan.\n" END diff --git a/rosapps/applications/sysutils/systeminfo/lang/uk-UA.rc b/rosapps/applications/sysutils/systeminfo/lang/uk-UA.rc index e0f96369ad3..edc724e7f12 100644 --- a/rosapps/applications/sysutils/systeminfo/lang/uk-UA.rc +++ b/rosapps/applications/sysutils/systeminfo/lang/uk-UA.rc @@ -20,13 +20,13 @@ IDS_USAGE, "SYSTEMINFO [/S /U [\\]. , \n\ .\n\n\ /P [] .\n\ - , .\n\n\ + , .\n\n\ /FO , \n\ - .\n\ - : ""TABLE"", ""LIST"", ""CSV"".\n\n\ + .\n\ + : ""TABLE"", ""LIST"", ""CSV"".\n\n\ /NH \n\ - .\n\ - ""TABLE"" and ""CSV"".\n\n\ + .\n\ + ""TABLE"" and ""CSV"".\n\n\ /? .\n\n\ :\n\ SYSTEMINFO\n\ @@ -37,36 +37,38 @@ IDS_USAGE, "SYSTEMINFO [/S SYSTEMINFO /S /FO LIST\n\ SYSTEMINFO /S /FO CSV /NH\n" -IDS_OS_NAME, "' : %s\n" -IDS_OS_VERSION, " : %u.%u.%u %s %u\n" -IDS_OS_BUILD_TYPE, " : %s\n" -IDS_REG_OWNER, " : %s\n" -IDS_REG_ORG, " : %s\n" -IDS_UP_TIME, "System Up Time: %u Days, %u Hours, %u, Minutes, %u Seconds\n" -IDS_PRODUCT_ID, "ID : %s\n" -IDS_INST_DATE, " : %s, " -IDS_INST_TIME, "%s\n" -IDS_SYS_TYPE_UNKNOWN, " : \n" -IDS_SYS_TYPE_X86, " : X86-based PC\n" -IDS_SYS_TYPE_IA64, " : IA64-based PC\n" -IDS_SYS_TYPE_AMD64, " : AMD64-based PC\n" -IDS_PROCESSORS, "(): %u (,) .\n" -IDS_ROS_DIR, " ReactOS: %s\n" -IDS_SYS_DIR, " : %s\n" -IDS_BOOT_DEV, " : %s\n" -IDS_SYS_LOCALE, " : %s\n" -IDS_INPUT_LOCALE, " : %s\n" -IDS_TOTAL_PHYS_MEM, " ': %ld (%ld )\n" -IDS_AVAIL_PHISICAL_MEM, " ': %ld (%ld )\n" -IDS_VIRT_MEM_MAX, "³ ': . : %ld (%ld )\n" -IDS_VIRT_MEM_AVAIL, "³ ': : %ld (%ld )\n" -IDS_VIRT_MEM_INUSE, "³ ': .: %ld (%ld )\n" -IDS_HOST_NAME, "' ': %s\n" -IDS_PAGEFILE_LOC, " %s\n" -IDS_TIME_ZONE, " : %s\n" -IDS_DOMINE, ": %s\n" -IDS_BIOS_DATE, " BIOS: %s\n" -IDS_BIOS_VERSION, " BIOS: %s\n" -IDS_NETWORK_CARDS, " () %u Installed.\n" +IDS_HOST_NAME, "' ': %s\n" +IDS_OS_NAME, "' : %s\n" +IDS_OS_VERSION, " : %u.%u.%u %s %u\n" +IDS_OS_BUILD_TYPE, " : %s\n" +IDS_REG_OWNER, " : %s\n" +IDS_REG_ORG, " : %s\n" +IDS_PRODUCT_ID, "ID : %s\n" +IDS_INST_DATE, " : %s, " +IDS_INST_TIME, "%s\n" +IDS_UP_TIME, "System Up Time: %u Days, %u Hours, %u, Minutes, %u Seconds\n" +IDS_SYS_MANUFACTURER, "System Manufacturer: %s\n" +IDS_SYS_MODEL, "System Model: %s\n" +IDS_SYS_TYPE_UNKNOWN, " : \n" +IDS_SYS_TYPE_X86, " : X86-based PC\n" +IDS_SYS_TYPE_IA64, " : IA64-based PC\n" +IDS_SYS_TYPE_AMD64, " : AMD64-based PC\n" +IDS_PROCESSORS, "(): %u (,) .\n" +IDS_BIOS_DATE, " BIOS: %s\n" +IDS_BIOS_VERSION, " BIOS: %s\n" +IDS_ROS_DIR, " ReactOS: %s\n" +IDS_SYS_DIR, " : %s\n" +IDS_BOOT_DEV, " : %s\n" +IDS_SYS_LOCALE, " : %s\n" +IDS_INPUT_LOCALE, " : %s\n" +IDS_TOTAL_PHYS_MEM, " ': %ld (%ld )\n" +IDS_AVAIL_PHISICAL_MEM, " ': %ld (%ld )\n" +IDS_VIRT_MEM_MAX, "³ ': . : %ld (%ld )\n" +IDS_VIRT_MEM_AVAIL, "³ ': : %ld (%ld )\n" +IDS_VIRT_MEM_INUSE, "³ ': .: %ld (%ld )\n" +IDS_PAGEFILE_LOC, " %s\n" +IDS_TIME_ZONE, " : %s\n" +IDS_DOMINE, ": %s\n" +IDS_NETWORK_CARDS, " () %u Installed.\n" END diff --git a/rosapps/applications/sysutils/systeminfo/resource.h b/rosapps/applications/sysutils/systeminfo/resource.h index 4942b4739cc..eb28aea10a3 100644 --- a/rosapps/applications/sysutils/systeminfo/resource.h +++ b/rosapps/applications/sysutils/systeminfo/resource.h @@ -1,33 +1,35 @@ -#define IDS_USAGE 1000 +#define IDS_USAGE 1000 -#define IDS_OS_NAME 100 -#define IDS_OS_VERSION 101 -#define IDS_OS_BUILD_TYPE 102 -#define IDS_REG_OWNER 103 -#define IDS_REG_ORG 104 -#define IDS_PRODUCT_ID 105 -#define IDS_INST_DATE 106 -#define IDS_INST_TIME 107 -#define IDS_UP_TIME 108 -#define IDS_SYS_TYPE_UNKNOWN 109 -#define IDS_SYS_TYPE_X86 110 -#define IDS_SYS_TYPE_IA64 111 -#define IDS_SYS_TYPE_AMD64 112 -#define IDS_PROCESSORS 113 -#define IDS_ROS_DIR 114 -#define IDS_SYS_DIR 115 -#define IDS_BOOT_DEV 116 -#define IDS_SYS_LOCALE 117 -#define IDS_INPUT_LOCALE 118 -#define IDS_TOTAL_PHYS_MEM 119 -#define IDS_AVAIL_PHISICAL_MEM 120 -#define IDS_VIRT_MEM_MAX 121 -#define IDS_VIRT_MEM_AVAIL 122 -#define IDS_VIRT_MEM_INUSE 123 -#define IDS_HOST_NAME 124 -#define IDS_PAGEFILE_LOC 125 -#define IDS_TIME_ZONE 126 -#define IDS_DOMINE 127 -#define IDS_BIOS_DATE 128 -#define IDS_BIOS_VERSION 129 -#define IDS_NETWORK_CARDS 130 +#define IDS_HOST_NAME 100 +#define IDS_OS_NAME 101 +#define IDS_OS_VERSION 102 +#define IDS_OS_BUILD_TYPE 103 +#define IDS_REG_OWNER 104 +#define IDS_REG_ORG 105 +#define IDS_PRODUCT_ID 106 +#define IDS_INST_DATE 107 +#define IDS_INST_TIME 108 +#define IDS_UP_TIME 109 +#define IDS_SYS_MANUFACTURER 110 +#define IDS_SYS_MODEL 111 +#define IDS_SYS_TYPE_UNKNOWN 112 +#define IDS_PROCESSORS 113 +#define IDS_BIOS_DATE 114 +#define IDS_BIOS_VERSION 115 +#define IDS_ROS_DIR 116 +#define IDS_SYS_DIR 117 +#define IDS_BOOT_DEV 118 +#define IDS_SYS_LOCALE 119 +#define IDS_INPUT_LOCALE 120 +#define IDS_TOTAL_PHYS_MEM 121 +#define IDS_AVAIL_PHISICAL_MEM 122 +#define IDS_VIRT_MEM_MAX 123 +#define IDS_VIRT_MEM_AVAIL 124 +#define IDS_VIRT_MEM_INUSE 125 +#define IDS_PAGEFILE_LOC 126 +#define IDS_TIME_ZONE 127 +#define IDS_DOMINE 128 +#define IDS_NETWORK_CARDS 130 +#define IDS_SYS_TYPE_X86 140 +#define IDS_SYS_TYPE_IA64 141 +#define IDS_SYS_TYPE_AMD64 142 diff --git a/rosapps/applications/sysutils/systeminfo/systeminfo.c b/rosapps/applications/sysutils/systeminfo/systeminfo.c index 3231732a569..68b32e1ec9d 100644 --- a/rosapps/applications/sysutils/systeminfo/systeminfo.c +++ b/rosapps/applications/sysutils/systeminfo/systeminfo.c @@ -180,7 +180,8 @@ AllSysInfo(VOID) Buf, sizeof(Buf)/sizeof(Buf[0]), Tmp); - printf("System Manufacturer:\t\t%s\n", Buf); + if (GetOemStrings(IDS_SYS_MANUFACTURER, Msg)) + printf(Msg, Buf); //getting System Model GetPrivateProfileString(TEXT("General"), @@ -189,7 +190,8 @@ AllSysInfo(VOID) Buf, sizeof(Buf)/sizeof(Buf[0]), Tmp); - printf("System Model:\t\t\t%s\n", Buf); + if (GetOemStrings(IDS_SYS_MODEL, Msg)) + printf(Msg, Buf); //getting System type switch (SysInfo.wProcessorArchitecture) From 951d604b0c2b77ef5429df0c019e74f1367c4486 Mon Sep 17 00:00:00 2001 From: James Tabor Date: Thu, 31 Mar 2011 21:20:06 +0000 Subject: [PATCH 045/317] [Win32k] - Fix wine post message test, corrected the peek message window selection. - Add a check for dead windows and new message queue flags. - Other miscellaneous fix ups. svn path=/trunk/; revision=51216 --- .../win32/win32k/include/msgqueue.h | 34 ++++++++-- .../subsystems/win32/win32k/ntuser/message.c | 49 +++++++++------ .../subsystems/win32/win32k/ntuser/msgqueue.c | 62 +++++++++++++------ 3 files changed, 103 insertions(+), 42 deletions(-) diff --git a/reactos/subsystems/win32/win32k/include/msgqueue.h b/reactos/subsystems/win32/win32k/include/msgqueue.h index f078a16f23d..5af589ee0a8 100644 --- a/reactos/subsystems/win32/win32k/include/msgqueue.h +++ b/reactos/subsystems/win32/win32k/include/msgqueue.h @@ -78,12 +78,16 @@ typedef struct _USER_MESSAGE_QUEUE HANDLE NewMessagesHandle; /* Last time PeekMessage() was called. */ ULONG LastMsgRead; - /* Current window with focus (ie. receives keyboard input) for this queue. */ - HWND FocusWindow; - /* Current active window for this queue. */ - HWND ActiveWindow; /* Current capture window for this queue. */ HWND CaptureWindow; + PWND spwndCapture; + /* Current window with focus (ie. receives keyboard input) for this queue. */ + HWND FocusWindow; + PWND spwndFocus; + /* Current active window for this queue. */ + HWND ActiveWindow; + PWND spwndActive; + PWND spwndActivePrev; /* Current move/size window for this queue */ HWND MoveSize; /* Current menu owner window for this queue */ @@ -92,6 +96,8 @@ typedef struct _USER_MESSAGE_QUEUE BYTE MenuState; /* Caret information for this queue */ PTHRDCARETINFO CaretInfo; + /* Message Queue Flags */ + DWORD QF_flags; /* queue state tracking */ // Send list QS_SENDMESSAGE @@ -112,8 +118,28 @@ typedef struct _USER_MESSAGE_QUEUE struct _DESKTOP *Desktop; } USER_MESSAGE_QUEUE, *PUSER_MESSAGE_QUEUE; +#define QF_UPDATEKEYSTATE 0x00000001 +#define QF_FMENUSTATUSBREAK 0x00000004 +#define QF_FMENUSTATUS 0x00000008 +#define QF_FF10STATUS 0x00000010 +#define QF_MOUSEMOVED 0x00000020 // See MouseMoved. +#define QF_ACTIVATIONCHANGE 0x00000040 +#define QF_TABSWITCHING 0x00000080 +#define QF_KEYSTATERESET 0x00000100 +#define QF_INDESTROY 0x00000200 +#define QF_LOCKNOREMOVE 0x00000400 +#define QF_FOCUSNULLSINCEACTIVE 0x00000800 +#define QF_DIALOGACTIVE 0x00004000 +#define QF_EVENTDEACTIVATEREMOVED 0x00008000 +#define QF_TRACKMOUSELEAVE 0x00020000 +#define QF_TRACKMOUSEHOVER 0x00040000 +#define QF_TRACKMOUSEFIRING 0x00080000 +#define QF_CAPTURELOCKED 0x00100000 +#define QF_ACTIVEWNDTRACKING 0x00200000 + BOOL FASTCALL MsqIsHung(PUSER_MESSAGE_QUEUE MessageQueue); +VOID CALLBACK HungAppSysTimerProc(HWND,UINT,UINT_PTR,DWORD); NTSTATUS FASTCALL co_MsqSendMessage(PUSER_MESSAGE_QUEUE MessageQueue, HWND Wnd, UINT Msg, WPARAM wParam, LPARAM lParam, diff --git a/reactos/subsystems/win32/win32k/ntuser/message.c b/reactos/subsystems/win32/win32k/ntuser/message.c index 0822009f541..f14ec4745ed 100644 --- a/reactos/subsystems/win32/win32k/ntuser/message.c +++ b/reactos/subsystems/win32/win32k/ntuser/message.c @@ -1233,6 +1233,7 @@ co_IntSendMessageTimeoutSingle( HWND hWnd, if (uFlags & SMTO_ABORTIFHUNG && MsqIsHung(Window->head.pti->MessageQueue)) { + // FIXME - Set window hung and add to a list. /* FIXME - Set a LastError? */ RETURN( FALSE); } @@ -1258,7 +1259,7 @@ co_IntSendMessageTimeoutSingle( HWND hWnd, } while ((STATUS_TIMEOUT == Status) && (uFlags & SMTO_NOTIMEOUTIFNOTHUNG) && - !MsqIsHung(Window->head.pti->MessageQueue)); + !MsqIsHung(Window->head.pti->MessageQueue)); // FIXME - Set window hung and add to a list. IntCallWndProcRet( Window, hWnd, Msg, wParam, lParam, (LRESULT *)uResult); @@ -1348,7 +1349,13 @@ co_IntSendMessageNoWait(HWND hWnd, &Result); return Result; } - +/* MSDN: + If you send a message in the range below WM_USER to the asynchronous message + functions (PostMessage, SendNotifyMessage, and SendMessageCallback), its + message parameters cannot include pointers. Otherwise, the operation will fail. + The functions will return before the receiving thread has had a chance to + process the message and the sender will free the memory before it is used. +*/ LRESULT FASTCALL co_IntSendMessageWithCallBack( HWND hWnd, UINT Msg, @@ -2014,24 +2021,23 @@ NtUserMessageCall( HWND hWnd, UserEnterExclusive(); - /* Validate input */ - if (hWnd && (hWnd != INVALID_HANDLE_VALUE)) - { - Window = UserGetWindowObject(hWnd); - if (!Window) - { - UserLeave(); - return FALSE; - } - } - switch(dwType) { case FNID_DEFWINDOWPROC: - if (Window) UserRefObjectCo(Window, &Ref); + /* Validate input */ + if (hWnd && (hWnd != INVALID_HANDLE_VALUE)) + { + Window = UserGetWindowObject(hWnd); + if (!Window) + { + UserLeave(); + return FALSE; + } + } + UserRefObjectCo(Window, &Ref); lResult = IntDefWindowProc(Window, Msg, wParam, lParam, Ansi); Ret = TRUE; - if (Window) UserDerefObjectCo(Window); + UserDerefObjectCo(Window); break; case FNID_SENDNOTIFYMESSAGE: Ret = UserSendNotifyMessage(hWnd, Msg, wParam, lParam); @@ -2050,7 +2056,6 @@ NtUserMessageCall( HWND hWnd, } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { - Ret = FALSE; _SEH2_YIELD(break); } _SEH2_END; @@ -2121,13 +2126,18 @@ NtUserMessageCall( HWND hWnd, } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { - Ret = FALSE; _SEH2_YIELD(break); } _SEH2_END; - if (!co_IntSendMessageWithCallBack(hWnd, Msg, wParam, lParam, - CallBackInfo.CallBack, CallBackInfo.Context, &uResult)) + if (is_pointer_message(Msg)) + { + EngSetLastError(ERROR_MESSAGE_SYNC_ONLY ); + break; + } + + if (!(Ret = co_IntSendMessageWithCallBack(hWnd, Msg, wParam, lParam, + CallBackInfo.CallBack, CallBackInfo.Context, &uResult))) { DPRINT1("Callback failure!\n"); } @@ -2165,7 +2175,6 @@ NtUserMessageCall( HWND hWnd, } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { - Ret = FALSE; _SEH2_YIELD(break); } _SEH2_END; diff --git a/reactos/subsystems/win32/win32k/ntuser/msgqueue.c b/reactos/subsystems/win32/win32k/ntuser/msgqueue.c index f225950dfd6..9f0706706af 100644 --- a/reactos/subsystems/win32/win32k/ntuser/msgqueue.c +++ b/reactos/subsystems/win32/win32k/ntuser/msgqueue.c @@ -121,7 +121,7 @@ ClearMsgBitsMask(PUSER_MESSAGE_QUEUE Queue, UINT MessageBits) pti = Queue->Thread->Tcb.Win32Thread; if (MessageBits & QS_KEY) - { + { if (--Queue->nCntsQBits[QSRosKey] == 0) ClrMask |= QS_KEY; } if (MessageBits & QS_MOUSEMOVE) // ReactOS hard coded. @@ -244,7 +244,13 @@ co_MsqInsertMouseMessage(MSG* Msg) pwnd != NULL; pwnd = pwnd->spwndNext ) { - if((pwnd->style & WS_VISIBLE) && + if ( pwnd->state2 & WNDS2_INDESTROY || pwnd->state & WNDS_DESTROYED ) + { + DPRINT("The Window is in DESTROY!\n"); + continue; + } + + if((pwnd->style & WS_VISIBLE) && IntPtInWindow(pwnd, Msg->pt.x, Msg->pt.y)) { Msg->hwnd = pwnd->head.h; @@ -623,7 +629,7 @@ co_MsqSendMessage(PUSER_MESSAGE_QUEUE MessageQueue, UINT uTimeout, BOOL Block, INT HookMessage, ULONG_PTR *uResult) { - PTHREADINFO pti; + PTHREADINFO pti, ptirec; PUSER_SENT_MESSAGE Message; KEVENT CompletionEvent; NTSTATUS WaitStatus; @@ -642,8 +648,10 @@ co_MsqSendMessage(PUSER_MESSAGE_QUEUE MessageQueue, pti = PsGetCurrentThreadWin32Thread(); ThreadQueue = pti->MessageQueue; + ptirec = MessageQueue->Thread->Tcb.Win32Thread; ASSERT(ThreadQueue != MessageQueue); - + ASSERT(ptirec->pcti); // Send must have a client side to receive it!!!! + Timeout.QuadPart = (LONGLONG) uTimeout * (LONGLONG) -10000; /* FIXME - increase reference counter of sender's message queue here */ @@ -727,7 +735,7 @@ co_MsqSendMessage(PUSER_MESSAGE_QUEUE MessageQueue, Entry = Entry->Flink; } - DPRINT("MsqSendMessage (blocked) timed out\n"); + DPRINT("MsqSendMessage (blocked) timed out 1\n"); } while (co_MsqDispatchOneSentMessage(ThreadQueue)) ; @@ -787,7 +795,7 @@ co_MsqSendMessage(PUSER_MESSAGE_QUEUE MessageQueue, Entry = Entry->Flink; } - DPRINT("MsqSendMessage timed out\n"); + DPRINT("MsqSendMessage timed out 2\n"); break; } while (co_MsqDispatchOneSentMessage(ThreadQueue)) @@ -860,7 +868,7 @@ static void MsqSendParentNotify( PWND pwnd, WORD event, WORD idChild, POINT pt ) if (pwndParent == pwndDesktop) break; pt.x += pwnd->rcClient.left - pwndParent->rcClient.left; pt.y += pwnd->rcClient.top - pwndParent->rcClient.top; - + pwnd = pwndParent; co_IntSendMessage( UserHMGetHandle(pwnd), WM_PARENTNOTIFY, MAKEWPARAM( event, idChild ), MAKELPARAM( pt.x, pt.y ) ); @@ -902,7 +910,7 @@ BOOL co_IntProcessMouseMessage(MSG* msg, BOOL* RemoveMessages, UINT first, UINT } DPRINT("Got mouse message for 0x%x, hittest: 0x%x\n", msg->hwnd, hittest ); - + if (pwndMsg == NULL || pwndMsg->head.pti != pti) { /* Remove and ignore the message */ @@ -972,7 +980,7 @@ BOOL co_IntProcessMouseMessage(MSG* msg, BOOL* RemoveMessages, UINT first, UINT } } - if (!((first == 0 && last == 0) || (message >= first || message <= last))) + if (!((first == 0 && last == 0) || (message >= first || message <= last))) { DPRINT("Message out of range!!!\n"); RETURN(FALSE); @@ -1095,8 +1103,8 @@ BOOL co_IntProcessMouseMessage(MSG* msg, BOOL* RemoveMessages, UINT first, UINT if (pwndTop && pwndTop != pwndDesktop) { - LONG ret = co_IntSendMessage( msg->hwnd, - WM_MOUSEACTIVATE, + LONG ret = co_IntSendMessage( msg->hwnd, + WM_MOUSEACTIVATE, (WPARAM)UserHMGetHandle(pwndTop), MAKELONG( hittest, msg->message)); switch(ret) @@ -1250,7 +1258,7 @@ co_MsqPeekHardwareMessage(IN PUSER_MESSAGE_QUEUE MessageQueue, CurrentMessage = CONTAINING_RECORD(CurrentEntry, USER_MESSAGE, ListEntry); - do + do { if (IsListEmpty(CurrentEntry)) break; if (!CurrentMessage) break; @@ -1296,7 +1304,7 @@ MsqPeekMessage(IN PUSER_MESSAGE_QUEUE MessageQueue, PLIST_ENTRY CurrentEntry; PUSER_MESSAGE CurrentMessage; PLIST_ENTRY ListHead; - + CurrentEntry = MessageQueue->PostedMessagesListHead.Flink; ListHead = &MessageQueue->PostedMessagesListHead; @@ -1309,8 +1317,15 @@ MsqPeekMessage(IN PUSER_MESSAGE_QUEUE MessageQueue, if (IsListEmpty(CurrentEntry)) break; if (!CurrentMessage) break; CurrentEntry = CurrentEntry->Flink; - - if ( ( !Window || Window == HWND_BOTTOM || Window->head.h == CurrentMessage->Msg.hwnd ) && +/* + MSDN: + 1: any window that belongs to the current thread, and any messages on the current thread's message queue whose hwnd value is NULL. + 2: retrieves only messages on the current thread's message queue whose hwnd value is NULL. + 3: handle to the window whose messages are to be retrieved. + */ + if ( ( !Window || // 1 + ( Window == HWND_BOTTOM && CurrentMessage->Msg.hwnd == NULL ) || // 2 + ( Window != HWND_BOTTOM && Window->head.h == CurrentMessage->Msg.hwnd ) ) && // 3 ( ( ( MsgFilterLow == 0 && MsgFilterHigh == 0 ) && CurrentMessage->QS_Flags & QSflags ) || ( MsgFilterLow <= CurrentMessage->Msg.message && MsgFilterHigh >= CurrentMessage->Msg.message ) ) ) { @@ -1342,7 +1357,7 @@ co_MsqWaitForNewMessages(PUSER_MESSAGE_QUEUE MessageQueue, PWND WndFilter, ret = KeWaitForSingleObject(MessageQueue->NewMessages, Executive, UserMode, - FALSE, + FALSE, NULL); UserEnterCo(); return ret; @@ -1357,6 +1372,15 @@ MsqIsHung(PUSER_MESSAGE_QUEUE MessageQueue) return ((LargeTickCount.u.LowPart - MessageQueue->LastMsgRead) > MSQ_HUNG); } +VOID +CALLBACK +HungAppSysTimerProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime) +{ + //DoTheScreenSaver(); + DPRINT("HungAppSysTimerProc\n"); + // Process list of windows that are hung and waiting. +} + BOOLEAN FASTCALL MsqInitializeMessageQueue(struct _ETHREAD *Thread, PUSER_MESSAGE_QUEUE MessageQueue) { @@ -1405,7 +1429,7 @@ MsqCleanupMessageQueue(PUSER_MESSAGE_QUEUE MessageQueue) PUSER_MESSAGE CurrentMessage; PUSER_SENT_MESSAGE CurrentSentMessage; PTHREADINFO pti; - + pti = MessageQueue->Thread->Tcb.Win32Thread; @@ -1428,7 +1452,7 @@ MsqCleanupMessageQueue(PUSER_MESSAGE_QUEUE MessageQueue) DPRINT("Notify the sender and remove a message from the queue that had not been dispatched\n"); /* remove the message from the dispatching list if needed */ - if ((!(CurrentSentMessage->HookMessage & MSQ_SENTNOWAIT)) + if ((!(CurrentSentMessage->HookMessage & MSQ_SENTNOWAIT)) && (CurrentSentMessage->DispatchingListEntry.Flink != NULL)) { RemoveEntryList(&CurrentSentMessage->DispatchingListEntry); @@ -1555,6 +1579,8 @@ MsqDestroyMessageQueue(PUSER_MESSAGE_QUEUE MessageQueue) { PDESKTOP desk; + MessageQueue->QF_flags |= QF_INDESTROY; + /* remove the message queue from any desktops */ if ((desk = InterlockedExchangePointer((PVOID*)&MessageQueue->Desktop, 0))) { From 0ca9a93ca6ccdd8095e0d17e40b5cf8dfb94abd6 Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Fri, 1 Apr 2011 10:06:03 +0000 Subject: [PATCH 046/317] [KERNEL32] - Implement a simple version of BasepGetDllPath()/BasepGetProcessPath(). svn path=/trunk/; revision=51217 --- reactos/dll/win32/kernel32/include/kernel32.h | 2 + reactos/dll/win32/kernel32/misc/dllmain.c | 2 - reactos/dll/win32/kernel32/process/procsup.c | 187 ++++++++++++++++++ 3 files changed, 189 insertions(+), 2 deletions(-) diff --git a/reactos/dll/win32/kernel32/include/kernel32.h b/reactos/dll/win32/kernel32/include/kernel32.h index d6361b3bdfe..ef74e9e69ad 100755 --- a/reactos/dll/win32/kernel32/include/kernel32.h +++ b/reactos/dll/win32/kernel32/include/kernel32.h @@ -94,6 +94,8 @@ extern HMODULE hCurrentModule; extern RTL_CRITICAL_SECTION BaseDllDirectoryLock; extern UNICODE_STRING BaseDllDirectory; +extern UNICODE_STRING BaseDefaultPath; +extern UNICODE_STRING BaseDefaultPathAppend; extern LPTOP_LEVEL_EXCEPTION_FILTER GlobalTopLevelExceptionFilter; diff --git a/reactos/dll/win32/kernel32/misc/dllmain.c b/reactos/dll/win32/kernel32/misc/dllmain.c index f43b9b27b69..c29a1828481 100644 --- a/reactos/dll/win32/kernel32/misc/dllmain.c +++ b/reactos/dll/win32/kernel32/misc/dllmain.c @@ -21,8 +21,6 @@ extern UNICODE_STRING SystemDirectory; extern UNICODE_STRING WindowsDirectory; -extern UNICODE_STRING BaseDefaultPath; -extern UNICODE_STRING BaseDefaultPathAppend; WCHAR BaseDefaultPathBuffer[6140]; diff --git a/reactos/dll/win32/kernel32/process/procsup.c b/reactos/dll/win32/kernel32/process/procsup.c index a4d35d786d7..95f415b9a04 100644 --- a/reactos/dll/win32/kernel32/process/procsup.c +++ b/reactos/dll/win32/kernel32/process/procsup.c @@ -16,6 +16,7 @@ UNICODE_STRING BasePathVariableName = RTL_CONSTANT_STRING(L"PATH"); UNICODE_STRING BaseDefaultPath; +PLDR_DATA_TABLE_ENTRY BasepExeLdrEntry; #define CMD_STRING L"cmd /c " @@ -355,12 +356,194 @@ BasepDuplicateAndWriteHandle(IN HANDLE ProcessHandle, } } +VOID +NTAPI +BasepLocateExeLdrEntry(IN PLDR_DATA_TABLE_ENTRY Entry, + IN PVOID Context, + OUT BOOLEAN *StopEnumeration) +{ + /* Make sure we get Entry, Context and valid StopEnumeration pointer */ + ASSERT(Entry); + ASSERT(Context); + ASSERT(StopEnumeration); + + /* If entry is already found - signal to stop */ + if (BasepExeLdrEntry) + { + /* Signal to stop enumeration and return */ + *StopEnumeration = TRUE; + return; + } + + /* We don't have a exe ldr entry, so try to see if this one is ours + by matching base address */ + if (Entry->DllBase == Context) + { + /* It matches, so remember the ldr entry */ + BasepExeLdrEntry = Entry; + + /* And stop enumeration */ + *StopEnumeration = TRUE; + } +} + LPWSTR WINAPI BasepGetProcessPath(DWORD Reserved, LPWSTR FullPath, PVOID Environment) { + NTSTATUS Status; + LPWSTR AllocatedPath = NULL, ch; + ULONG DefaultLength = BaseDefaultPath.Length; + ULONG AppLength = 0; + UNICODE_STRING EnvPath; + LPWSTR NamePtr; + LPWSTR PathBuffer; + BOOLEAN SecondAttempt = FALSE; + PPEB Peb = NtCurrentPeb(); + + if (!Environment) RtlAcquirePebLock(); + + /* Query PATH env var into append path */ + Status = RtlQueryEnvironmentVariable_U(Environment, + &BasePathVariableName, + &BaseDefaultPathAppend); + if (NT_SUCCESS(Status)) + { + /* Add up PATH environment length */ + DefaultLength += BaseDefaultPathAppend.Length; + } + else if (Status == STATUS_BUFFER_TOO_SMALL) + { + /* We have to allocate path dynamically */ + AllocatedPath = RtlAllocateHeap(RtlGetProcessHeap(), 0, BaseDefaultPathAppend.Length + sizeof(UNICODE_NULL)); + + if (AllocatedPath) + { + /* Set up EnvPath */ + EnvPath.Buffer = AllocatedPath; + EnvPath.Length = BaseDefaultPathAppend.Length + sizeof(UNICODE_NULL); + EnvPath.MaximumLength = EnvPath.Length; + + /* Query PATH env var into newly allocated path */ + Status = RtlQueryEnvironmentVariable_U(Environment, + &BasePathVariableName, + &EnvPath); + + if (NT_SUCCESS(Status)) + { + DefaultLength += EnvPath.Length; + } + else + { + /* Free newly allocated path, it didn't work */ + RtlFreeHeap(RtlGetProcessHeap(), 0, AllocatedPath); + AllocatedPath = NULL; + Status = STATUS_NO_MEMORY; + } + } + } + +secondattempt: + if (!FullPath) + { + /* Initialize BasepExeLdrEntry if necessary */ + if (!BasepExeLdrEntry) + LdrEnumerateLoadedModules(0, BasepLocateExeLdrEntry, Peb->ImageBaseAddress); + + DPRINT1("Found BasepExeLdrEntry %wZ\n", &BasepExeLdrEntry->FullDllName); + + /* Set name pointer to the full dll path */ + NamePtr = BasepExeLdrEntry->FullDllName.Buffer; + } + else + { + /* Set name pointer to the provided path */ + NamePtr = FullPath; + } + + /* Determine application path length */ + if (NamePtr) + { + ch = NamePtr; + while (*ch) + { + /* Check if there is a slash */ + if (*ch == L'\\') + { + /* Update app length */ + AppLength = (ULONG_PTR)ch - (ULONG_PTR)NamePtr + sizeof(WCHAR); + } + + ch++; + } + } + + /* Now check, if we found a valid path in the provided full path */ + if (!AppLength && FullPath && !SecondAttempt) + { + /* We were provided with a bad full path, retry again using just this app's path */ + FullPath = NULL; + SecondAttempt = TRUE; + goto secondattempt; + } + + /* Allocate the path buffer */ + PathBuffer = RtlAllocateHeap(RtlGetProcessHeap(), 0, DefaultLength + AppLength + 2*sizeof(WCHAR)); + if (!PathBuffer) + { + /* Fail */ + if (!Environment) RtlReleasePebLock(); + if (AllocatedPath) RtlFreeHeap(RtlGetProcessHeap(), 0, AllocatedPath); + return NULL; + } + + /* Copy contents there */ + if (AppLength) + { + /* Remove trailing slashes if it's not root dir */ + if (AppLength != 3*sizeof(WCHAR)) + AppLength -= sizeof(WCHAR); + + /* Copy contents */ + RtlMoveMemory(PathBuffer, NamePtr, AppLength); + } + + /* Release the lock */ + if (!Environment) RtlReleasePebLock(); + + /* Finish preparing the path string */ + NamePtr = &PathBuffer[AppLength / sizeof(WCHAR)]; + + /* Put a separating ";" if something was added */ + if (AppLength) + { + *NamePtr = L';'; + NamePtr++; + } + + if (AllocatedPath) + { + /* Dynamically allocated env path, copy from the static buffer, + concatenate with dynamic buffer and free it */ + RtlMoveMemory(NamePtr, BaseDefaultPath.Buffer, BaseDefaultPath.Length); + RtlMoveMemory(&NamePtr[BaseDefaultPath.Length / sizeof(WCHAR)], AllocatedPath, EnvPath.Length); + + /* Free it */ + RtlFreeHeap(RtlGetProcessHeap(), 0, AllocatedPath); + } + else + { + /* Static env path string, copy directly from BaseDefaultPath */ + RtlMoveMemory(NamePtr, BaseDefaultPath.Buffer, DefaultLength); + } + + /* Null terminate the string */ + NamePtr[DefaultLength / sizeof(WCHAR)] = 0; + + DPRINT("Path: %S\n", NamePtr); + return NULL; } @@ -369,6 +552,7 @@ WINAPI BasepGetDllPath(LPWSTR FullPath, PVOID Environment) { +#if 0 LPWSTR DllPath = NULL; /* Acquire DLL directory lock */ @@ -395,6 +579,9 @@ BasepGetDllPath(LPWSTR FullPath, /* Return dll path */ return DllPath; +#else + return BasepGetProcessPath(0, FullPath, Environment); +#endif } VOID From 472df5e17a512918c02e4ab5de59924231a3cc54 Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Fri, 1 Apr 2011 12:18:54 +0000 Subject: [PATCH 047/317] - Fix build. Happens. svn path=/trunk/; revision=51218 --- reactos/include/ndk/ldrtypes.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/include/ndk/ldrtypes.h b/reactos/include/ndk/ldrtypes.h index 49ebe38cd55..aaf790ab6e5 100644 --- a/reactos/include/ndk/ldrtypes.h +++ b/reactos/include/ndk/ldrtypes.h @@ -191,7 +191,7 @@ typedef struct _ALT_RESOURCE_MODULE // // Callback function for LdrEnumerateLoadedModules // -typedef NTSTATUS (NTAPI LDR_ENUM_CALLBACK)(IN PLDR_DATA_TABLE_ENTRY ModuleInformation, IN PVOID Parameter, OUT BOOLEAN *Stop); +typedef VOID (NTAPI LDR_ENUM_CALLBACK)(IN PLDR_DATA_TABLE_ENTRY ModuleInformation, IN PVOID Parameter, OUT BOOLEAN *Stop); typedef LDR_ENUM_CALLBACK *PLDR_ENUM_CALLBACK; #endif From 7c126a9a69cffd5b1c8e8889669aa90998a6fb3a Mon Sep 17 00:00:00 2001 From: Rafal Harabien Date: Fri, 1 Apr 2011 18:58:12 +0000 Subject: [PATCH 048/317] [SYSTEMINFO] Don't translate System Type Don't mix TCHARs and chars Fix Time Zone for not English systems Use proper registry key for Install Date Format dates using system settings Format numbers svn path=/trunk/; revision=51221 --- .../sysutils/systeminfo/lang/de-DE.rc | 22 +- .../sysutils/systeminfo/lang/en-US.rc | 22 +- .../sysutils/systeminfo/lang/es-ES.rc | 20 +- .../sysutils/systeminfo/lang/fr-FR.rc | 20 +- .../sysutils/systeminfo/lang/no-NO.rc | 22 +- .../sysutils/systeminfo/lang/pl-PL.rc | 22 +- .../sysutils/systeminfo/lang/sk-SK.rc | 20 +- .../sysutils/systeminfo/lang/uk-UA.rc | 22 +- .../sysutils/systeminfo/resource.h | 6 +- .../sysutils/systeminfo/systeminfo.c | 507 +++++++++++------- 10 files changed, 395 insertions(+), 288 deletions(-) diff --git a/rosapps/applications/sysutils/systeminfo/lang/de-DE.rc b/rosapps/applications/sysutils/systeminfo/lang/de-DE.rc index 18efe35948b..f161f72c54c 100644 --- a/rosapps/applications/sysutils/systeminfo/lang/de-DE.rc +++ b/rosapps/applications/sysutils/systeminfo/lang/de-DE.rc @@ -38,15 +38,11 @@ IDS_OS_BUILD_TYPE, "OS Build Typ: %s\n" IDS_REG_OWNER, "Registrierter Benutzer: %s\n" IDS_REG_ORG, "Registrierte Organisation: %s\n" IDS_PRODUCT_ID, "Produkt ID: %s\n" -IDS_INST_DATE, "Installationsdatum: %s, " -IDS_INST_TIME, "%s\n" +IDS_INST_DATE, "Installationsdatum: %s\n" IDS_UP_TIME, "System Up Time: %u Days, %u Hours, %u, Minutes, %u Seconds\n" IDS_SYS_MANUFACTURER, "System Manufacturer: %s\n" IDS_SYS_MODEL, "System Model: %s\n" -IDS_SYS_TYPE_UNKNOWN, "Systemtyp: Unbekannt\n" -IDS_SYS_TYPE_X86, "Systemtyp: X86-based PC\n" -IDS_SYS_TYPE_IA64, "Systemtyp: IA64-based PC\n" -IDS_SYS_TYPE_AMD64, "Systemtyp: AMD64-based PC\n" +IDS_SYS_TYPE, "Systemtyp: %s\n" IDS_PROCESSORS, "Prozessor(en): %u Prozessor(en) Installiert.\n" IDS_BIOS_DATE, "BIOS Datum: %s\n" IDS_BIOS_VERSION, "BIOS Version: %s\n" @@ -55,13 +51,13 @@ IDS_SYS_DIR, "System Verzeichnis: %s\n" IDS_BOOT_DEV, "Startgert: %s\n" IDS_SYS_LOCALE, "Systemgebietsschema: %s\n" IDS_INPUT_LOCALE, "Eingabegebietsschema: %s\n" -IDS_TOTAL_PHYS_MEM, "Gesamter Physikalischer Speicher: %ld MB (%ld KB)\n" -IDS_AVAIL_PHISICAL_MEM, "Verfgbarer Physikalischer Speicher: %ld MB (%ld KB)\n" -IDS_VIRT_MEM_MAX, "Auslagerungsdatei: Max Gre: %ld MB (%ld KB)\n" -IDS_VIRT_MEM_AVAIL, "Auslagerungsdatei: Verfgbar: %ld MB (%ld KB)\n" -IDS_VIRT_MEM_INUSE, "Auslagerungsdatei: In Verwendung: %ld MB (%ld KB)\n" -IDS_PAGEFILE_LOC, "Auslagerungsdateipfad(e) %s" -IDS_TIME_ZONE, "Zeitzone: %s\n" +IDS_TIME_ZONE, "Zeitzone: %s\n" +IDS_TOTAL_PHYS_MEM, "Gesamter Physikalischer Speicher: %s MB\n" +IDS_AVAIL_PHISICAL_MEM, "Verfgbarer Physikalischer Speicher: %s MB\n" +IDS_VIRT_MEM_MAX, "Auslagerungsdatei: Max Gre: %s MB\n" +IDS_VIRT_MEM_AVAIL, "Auslagerungsdatei: Verfgbar: %s MB\n" +IDS_VIRT_MEM_INUSE, "Auslagerungsdatei: In Verwendung: %s MB\n" +IDS_PAGEFILE_LOC, "Auslagerungsdateipfad(e): %s" IDS_DOMINE, "Domain: %s\n" IDS_NETWORK_CARDS, "Netzwerkkarte(n) %u Installiert.\n" diff --git a/rosapps/applications/sysutils/systeminfo/lang/en-US.rc b/rosapps/applications/sysutils/systeminfo/lang/en-US.rc index 6c2053f836c..d7731b67229 100644 --- a/rosapps/applications/sysutils/systeminfo/lang/en-US.rc +++ b/rosapps/applications/sysutils/systeminfo/lang/en-US.rc @@ -36,15 +36,11 @@ IDS_OS_BUILD_TYPE, "OS Build Type: %s\n" IDS_REG_OWNER, "Registered Owner: %s\n" IDS_REG_ORG, "Registered Organization: %s\n" IDS_PRODUCT_ID, "Product ID: %s\n" -IDS_INST_DATE, "Install Date: %s, " -IDS_INST_TIME, "%s\n" +IDS_INST_DATE, "Install Date: %s\n" IDS_UP_TIME, "System Up Time: %u Days, %u Hours, %u, Minutes, %u Seconds\n" IDS_SYS_MANUFACTURER, "System Manufacturer: %s\n" IDS_SYS_MODEL, "System Model: %s\n" -IDS_SYS_TYPE_UNKNOWN, "System type: Unknown\n" -IDS_SYS_TYPE_X86, "System type: X86-based PC\n" -IDS_SYS_TYPE_IA64, "System type: IA64-based PC\n" -IDS_SYS_TYPE_AMD64, "System type: AMD64-based PC\n" +IDS_SYS_TYPE, "System type: %s\n" IDS_PROCESSORS, "Processor(s): %u Processor(s) Installed.\n" IDS_BIOS_DATE, "BIOS Date: %s\n" IDS_BIOS_VERSION, "BIOS Version: %s\n" @@ -53,13 +49,13 @@ IDS_SYS_DIR, "System Directory: %s\n" IDS_BOOT_DEV, "Boot Device: %s\n" IDS_SYS_LOCALE, "System Locale: %s\n" IDS_INPUT_LOCALE, "Input Locale: %s\n" -IDS_TOTAL_PHYS_MEM, "Total Physical Memory: %ld MB (%ld KB)\n" -IDS_AVAIL_PHISICAL_MEM, "Available Physical Memory: %ld MB (%ld KB)\n" -IDS_VIRT_MEM_MAX, "Virtual Memory: Max Size: %ld MB (%ld KB)\n" -IDS_VIRT_MEM_AVAIL, "Virtual Memory: Available: %ld MB (%ld KB)\n" -IDS_VIRT_MEM_INUSE, "Virtual Memory: In Use: %ld MB (%ld KB)\n" -IDS_PAGEFILE_LOC, "Page File Location(s) %s\n" -IDS_TIME_ZONE, "Time zone: %s\n" +IDS_TIME_ZONE, "Time zone: %s\n" +IDS_TOTAL_PHYS_MEM, "Total Physical Memory: %s MB\n" +IDS_AVAIL_PHISICAL_MEM, "Available Physical Memory: %s MB\n" +IDS_VIRT_MEM_MAX, "Virtual Memory: Max Size: %s MB\n" +IDS_VIRT_MEM_AVAIL, "Virtual Memory: Available: %s MB\n" +IDS_VIRT_MEM_INUSE, "Virtual Memory: In Use: %s MB\n" +IDS_PAGEFILE_LOC, "Page File Location(s): %s\n" IDS_DOMINE, "Domain: %s\n" IDS_NETWORK_CARDS, "Network Card(s) %u Installed.\n" diff --git a/rosapps/applications/sysutils/systeminfo/lang/es-ES.rc b/rosapps/applications/sysutils/systeminfo/lang/es-ES.rc index 21491ba7075..423c67d0374 100644 --- a/rosapps/applications/sysutils/systeminfo/lang/es-ES.rc +++ b/rosapps/applications/sysutils/systeminfo/lang/es-ES.rc @@ -41,15 +41,11 @@ IDS_OS_BUILD_TYPE, "Tipo Compilaci IDS_REG_OWNER, "Propietario: %s\n" IDS_REG_ORG, "Organizacin: %s\n" IDS_PRODUCT_ID, "Identificador de Producto %s\n" -IDS_INST_DATE, "Fecha de Instalacin: %s, " -IDS_INST_TIME, "%s\n" +IDS_INST_DATE, "Fecha de Instalacin: %s\n" IDS_UP_TIME, "System Up Time: %u Days, %u Hours, %u, Minutes, %u Seconds\n" IDS_SYS_MANUFACTURER, "System Manufacturer: %s\n" IDS_SYS_MODEL, "System Model: %s\n" -IDS_SYS_TYPE_UNKNOWN, "Tipo de sistema: Desconocido\n" -IDS_SYS_TYPE_X86, "Tipo de sistema: PC basado en X86\n" -IDS_SYS_TYPE_IA64, "Tipo de sistema: PC basado en IA64\n" -IDS_SYS_TYPE_AMD64, "Tipo de sistema: PC basado en AMD64\n" +IDS_SYS_TYPE, "Tipo de sistema: %s\n" IDS_PROCESSORS, "Procesador(es): %u Procesador(es) Instalados.\n" IDS_BIOS_DATE, "Fecha BIOS: %s\n" IDS_BIOS_VERSION, "Versin BIOS: %s\n" @@ -58,13 +54,13 @@ IDS_SYS_DIR, "Directorio del Sistema: %s\n" IDS_BOOT_DEV, "Dispositivo de Inicio: %s\n" IDS_SYS_LOCALE, "Idioma del sistema: %s\n" IDS_INPUT_LOCALE, "Idioma de entrada: %s\n" -IDS_TOTAL_PHYS_MEM, "Memoria Fsica Total: %ld MB (%ld KB)\n" -IDS_AVAIL_PHISICAL_MEM, "Memoria Fsica Disponible: %ld MB (%ld KB)\n" -IDS_VIRT_MEM_MAX, "Memoria Virtual: Tamao Mx: %ld MB (%ld KB)\n" -IDS_VIRT_MEM_AVAIL, "Memoria Virtual: Disponible: %ld MB (%ld KB)\n" -IDS_VIRT_MEM_INUSE, "Memoria Virtual: En Uso: %ld MB (%ld KB)\n" -IDS_PAGEFILE_LOC, "Ruta(s) Archivo Paginacin %s\n" IDS_TIME_ZONE, "Zona horario: %s\n" +IDS_TOTAL_PHYS_MEM, "Memoria Fsica Total: %s MB\n" +IDS_AVAIL_PHISICAL_MEM, "Memoria Fsica Disponible: %s MB\n" +IDS_VIRT_MEM_MAX, "Memoria Virtual: Tamao Mx: %s MB\n" +IDS_VIRT_MEM_AVAIL, "Memoria Virtual: Disponible: %s MB\n" +IDS_VIRT_MEM_INUSE, "Memoria Virtual: En Uso: %s MB\n" +IDS_PAGEFILE_LOC, "Ruta(s) Archivo Paginacin: %s\n" IDS_DOMINE, "Dominio: %s\n" IDS_NETWORK_CARDS, "Tarjeta(s) de Red %u No Instalada.\n" diff --git a/rosapps/applications/sysutils/systeminfo/lang/fr-FR.rc b/rosapps/applications/sysutils/systeminfo/lang/fr-FR.rc index d99900e1ab1..4d9c9a4ae3b 100644 --- a/rosapps/applications/sysutils/systeminfo/lang/fr-FR.rc +++ b/rosapps/applications/sysutils/systeminfo/lang/fr-FR.rc @@ -36,15 +36,11 @@ IDS_OS_BUILD_TYPE, "Type de compilation du syst IDS_REG_OWNER, "Propritaire enregistr : %s\n" IDS_REG_ORG, "Organisation enregistre : %s\n" IDS_PRODUCT_ID, "ID du produit : %s\n" -IDS_INST_DATE, "Date d'installation : %s, " -IDS_INST_TIME, "%s\n" +IDS_INST_DATE, "Date d'installation : %s\n" IDS_UP_TIME, "System Up Time: %u Days, %u Hours, %u, Minutes, %u Seconds\n" IDS_SYS_MANUFACTURER, "System Manufacturer: %s\n" IDS_SYS_MODEL, "System Model: %s\n" -IDS_SYS_TYPE_UNKNOWN, "Type du systme : Inconnu\n" -IDS_SYS_TYPE_X86, "Type du systme : Bas sur un PC X86\n" -IDS_SYS_TYPE_IA64, "Type du systme : Bas sur un PC IA64\n" -IDS_SYS_TYPE_AMD64, "Type du systme : Bas sur un PC AMD64\n" +IDS_SYS_TYPE, "Type du systme : %s\n" IDS_PROCESSORS, "Processeur(s) : %u Processeur(s) install(s).\n" IDS_BIOS_DATE, "Date du BIOS : %s\n" IDS_BIOS_VERSION, "Version du BIOS : %s\n" @@ -53,13 +49,13 @@ IDS_SYS_DIR, "R IDS_BOOT_DEV, "Priphrique de dmarrage : %s\n" IDS_SYS_LOCALE, "Paramtre rgional du systme : %s\n" IDS_INPUT_LOCALE, "Paramtre rgional de saisie : %s\n" -IDS_TOTAL_PHYS_MEM, "Mmoire physique totale : %ld Mo (%ld Ko)\n" -IDS_AVAIL_PHISICAL_MEM, "Mmoire physique disponible : %ld Mo (%ld Ko)\n" -IDS_VIRT_MEM_MAX, "Mmoire virtuelle: Taille max : %ld Mo (%ld Ko)\n" -IDS_VIRT_MEM_AVAIL, "Mmoire virtuelle: Disponible : %ld Mo (%ld Ko)\n" -IDS_VIRT_MEM_INUSE, "Mmoire virtuelle: Utilise : %ld Mo (%ld Ko)\n" -IDS_PAGEFILE_LOC, "Emplacement(s) des fichiers d'change %s" IDS_TIME_ZONE, "Fuseau horaire : %s\n" +IDS_TOTAL_PHYS_MEM, "Mmoire physique totale : %s Mo\n" +IDS_AVAIL_PHISICAL_MEM, "Mmoire physique disponible : %s Mo\n" +IDS_VIRT_MEM_MAX, "Mmoire virtuelle: Taille max : %s Mo\n" +IDS_VIRT_MEM_AVAIL, "Mmoire virtuelle: Disponible : %s Mo\n" +IDS_VIRT_MEM_INUSE, "Mmoire virtuelle: Utilise : %s Mo\n" +IDS_PAGEFILE_LOC, "Emplacement(s) des fichiers d'change : %s" IDS_DOMINE, "Domaine : %s\n" IDS_NETWORK_CARDS, "Carte(s) rseau %u installe(s).\n" diff --git a/rosapps/applications/sysutils/systeminfo/lang/no-NO.rc b/rosapps/applications/sysutils/systeminfo/lang/no-NO.rc index 0beda9afec7..e4e49667182 100644 --- a/rosapps/applications/sysutils/systeminfo/lang/no-NO.rc +++ b/rosapps/applications/sysutils/systeminfo/lang/no-NO.rc @@ -36,15 +36,11 @@ IDS_OS_BUILD_TYPE, "OS bygg type: %s\n" IDS_REG_OWNER, "Registert eier: %s\n" IDS_REG_ORG, "Registerert organisasjon: %s\n" IDS_PRODUCT_ID, "Produkt ID: %s\n" -IDS_INST_DATE, "Installert dato: %s, " -IDS_INST_TIME, "%s\n" +IDS_INST_DATE, "Installert dato: %s\n" IDS_UP_TIME, "System Up Time: %u Days, %u Hours, %u, Minutes, %u Seconds\n" IDS_SYS_MANUFACTURER, "System Manufacturer: %s\n" IDS_SYS_MODEL, "System Model: %s\n" -IDS_SYS_TYPE_UNKNOWN, "Systemtype: Ukjent\n" -IDS_SYS_TYPE_X86, "Systemtype: X86-basert PC\n" -IDS_SYS_TYPE_IA64, "Systemtype: IA64-basert PC\n" -IDS_SYS_TYPE_AMD64, "Systemtype: AMD64-basert PC\n" +IDS_SYS_TYPE, "Systemtype: %s\n" IDS_PROCESSORS, "Prosessor(er): %u Prosessor(er) installert.\n" IDS_BIOS_DATE, "BIOS dato: %s\n" IDS_BIOS_VERSION, "BIOS Versjon: %s\n" @@ -53,13 +49,13 @@ IDS_SYS_DIR, "System mappe: %s\n" IDS_BOOT_DEV, "Oppstartsenhet: %s\n" IDS_SYS_LOCALE, "System lokal: %s\n" IDS_INPUT_LOCALE, "Input lokal: %s\n" -IDS_TOTAL_PHYS_MEM, "Total fysisk minne: %ld MB (%ld KB)\n" -IDS_AVAIL_PHISICAL_MEM, "Tilgjengelig fysisk minne: %ld MB (%ld KB)\n" -IDS_VIRT_MEM_MAX, "Virtuelt minne: Maks Strrelse: %ld MB (%ld KB)\n" -IDS_VIRT_MEM_AVAIL, "Virtuelt minne: Tilgjengelig: %ld MB (%ld KB)\n" -IDS_VIRT_MEM_INUSE, "Virtuelt minne: i bruk: %ld MB (%ld KB)\n" -IDS_PAGEFILE_LOC, "Sidevekslingsfil lokalsjon(er) %s\n" -IDS_TIME_ZONE, "Tidssone: %s\n" +IDS_TIME_ZONE, "Tidssone: %s\n" +IDS_TOTAL_PHYS_MEM, "Total fysisk minne: %s MB\n" +IDS_AVAIL_PHISICAL_MEM, "Tilgjengelig fysisk minne: %s MB\n" +IDS_VIRT_MEM_MAX, "Virtuelt minne: Maks Strrelse: %s MB\n" +IDS_VIRT_MEM_AVAIL, "Virtuelt minne: Tilgjengelig: %s MB\n" +IDS_VIRT_MEM_INUSE, "Virtuelt minne: i bruk: %s MB\n" +IDS_PAGEFILE_LOC, "Sidevekslingsfil lokalsjon(er): %s\n" IDS_DOMINE, "Domene: %s\n" IDS_NETWORK_CARDS, "Nettverkskort(er) %u installert.\n" diff --git a/rosapps/applications/sysutils/systeminfo/lang/pl-PL.rc b/rosapps/applications/sysutils/systeminfo/lang/pl-PL.rc index 6f48d0656ee..749a63fc5d9 100644 --- a/rosapps/applications/sysutils/systeminfo/lang/pl-PL.rc +++ b/rosapps/applications/sysutils/systeminfo/lang/pl-PL.rc @@ -43,15 +43,11 @@ IDS_OS_BUILD_TYPE, "Rodzaj kompilacji: %s\n" IDS_REG_OWNER, "Uytkownik: %s\n" IDS_REG_ORG, "Organizacja: %s\n" IDS_PRODUCT_ID, "ID produktu: %s\n" -IDS_INST_DATE, "Data instalacji: %s, " -IDS_INST_TIME, "%s\n" +IDS_INST_DATE, "Data instalacji: %s\n" IDS_UP_TIME, "System Up Time: %u Days, %u Hours, %u, Minutes, %u Seconds\n" IDS_SYS_MANUFACTURER, "Producent systemu: %s\n" IDS_SYS_MODEL, "Model systemu: %s\n" -IDS_SYS_TYPE_UNKNOWN, "Rodzaj systemu: Unknown\n" -IDS_SYS_TYPE_X86, "Architektura: X86-based PC\n" -IDS_SYS_TYPE_IA64, "Architektura: IA64-based PC\n" -IDS_SYS_TYPE_AMD64, "Rodzaj systemu: AMD64-based PC\n" +IDS_SYS_TYPE, "Rodzaj systemu: %s\n" IDS_PROCESSORS, "Ilo Procesorw: %u.\n" IDS_BIOS_DATE, "Data BIOSu: %s\n" IDS_BIOS_VERSION, "Wersja BIOSu: %s\n" @@ -60,13 +56,13 @@ IDS_SYS_DIR, "Katalog Systemowy: %s\n" IDS_BOOT_DEV, "Urzdzenie rdowe: %s\n" IDS_SYS_LOCALE, "Wersja lokalizacji: %s\n" IDS_INPUT_LOCALE, "Lokalizacja klawiatury: %s\n" -IDS_TOTAL_PHYS_MEM, "Pamici fizycznej ogem: %ld MB (%ld KB)\n" -IDS_AVAIL_PHISICAL_MEM, "Dostpnej pamici fizycznej: %ld MB (%ld KB)\n" -IDS_VIRT_MEM_MAX, "Pamici wirtualnej: Maksymalnie: %ld MB (%ld KB)\n" -IDS_VIRT_MEM_AVAIL, "Pamici wirtualnej: Dostpne: %ld MB (%ld KB)\n" -IDS_VIRT_MEM_INUSE, "Pamici wirtualnej: W uyciu: %ld MB (%ld KB)\n" -IDS_PAGEFILE_LOC, "Lokalizacja pliku wymiany %s\n" -IDS_TIME_ZONE, "Strefa czasowa: %s\n" +IDS_TIME_ZONE, "Strefa czasowa: %s\n" +IDS_TOTAL_PHYS_MEM, "Pamici fizycznej ogem: %s MB\n" +IDS_AVAIL_PHISICAL_MEM, "Dostpnej pamici fizycznej: %s MB\n" +IDS_VIRT_MEM_MAX, "Pamici wirtualnej: maksymalnie: %s MB\n" +IDS_VIRT_MEM_AVAIL, "Pamici wirtualnej: dostpne: %s MB\n" +IDS_VIRT_MEM_INUSE, "Pamici wirtualnej: w uyciu: %s MB\n" +IDS_PAGEFILE_LOC, "Lokalizacja pliku wymiany: %s\n" IDS_DOMINE, "Domena: %s\n" IDS_NETWORK_CARDS, "Liczba kart sieciowych %u.\n" diff --git a/rosapps/applications/sysutils/systeminfo/lang/sk-SK.rc b/rosapps/applications/sysutils/systeminfo/lang/sk-SK.rc index cfe27484ec7..f53414670f2 100644 --- a/rosapps/applications/sysutils/systeminfo/lang/sk-SK.rc +++ b/rosapps/applications/sysutils/systeminfo/lang/sk-SK.rc @@ -40,15 +40,11 @@ IDS_OS_BUILD_TYPE, "OS Build typ: %s\n" IDS_REG_OWNER, "Registovan vlastnk: %s\n" IDS_REG_ORG, "Registrovan organizcia: %s\n" IDS_PRODUCT_ID, "ID produktu: %s\n" -IDS_INST_DATE, "Dtum intalcie: %s, " -IDS_INST_TIME, "%s\n" +IDS_INST_DATE, "Dtum intalcie: %s\n" IDS_UP_TIME, "System Up Time: %u Days, %u Hours, %u, Minutes, %u Seconds\n" IDS_SYS_MANUFACTURER, "System Manufacturer: %s\n" IDS_SYS_MODEL, "System Model: %s\n" -IDS_SYS_TYPE_UNKNOWN, "Typ systmu: Neznmy\n" -IDS_SYS_TYPE_X86, "Typ systmu: PC zaloen na X86\n" -IDS_SYS_TYPE_IA64, "Typ systmu: PC zaloen na IA64\n" -IDS_SYS_TYPE_AMD64, "Typ systmu: PC zaloen na AMD64\n" +IDS_SYS_TYPE, "Typ systmu: %s\n" IDS_PROCESSORS, "Procesor(y): %u Procesor(y) naintalovan.\n" IDS_BIOS_DATE, "Dtum BIOSu: %s\n" IDS_BIOS_VERSION, "Verzia BIOSu: %s\n" @@ -57,13 +53,13 @@ IDS_SYS_DIR, "Adres IDS_BOOT_DEV, "Zavdzacie zariadenie: %s\n" IDS_SYS_LOCALE, "System Locale: %s\n" IDS_INPUT_LOCALE, "Input Locale: %s\n" -IDS_TOTAL_PHYS_MEM, "Celkov fyzick pam: %ld MB (%ld KB)\n" -IDS_AVAIL_PHISICAL_MEM, "Dostupn fyzick pam: %ld MB (%ld KB)\n" -IDS_VIRT_MEM_MAX, "Virtulna pam: Max Size: %ld MB (%ld KB)\n" -IDS_VIRT_MEM_AVAIL, "Virtulna pam: Available: %ld MB (%ld KB)\n" -IDS_VIRT_MEM_INUSE, "Virtulna pam: In Use: %ld MB (%ld KB)\n" -IDS_PAGEFILE_LOC, "Umiestnenie(a) strnkovacieho sboru: %s\n" IDS_TIME_ZONE, "asov psmo: %s\n" +IDS_TOTAL_PHYS_MEM, "Celkov fyzick pam: %s MB\n" +IDS_AVAIL_PHISICAL_MEM, "Dostupn fyzick pam: %s MB\n" +IDS_VIRT_MEM_MAX, "Virtulna pam: Max Size: %s MB\n" +IDS_VIRT_MEM_AVAIL, "Virtulna pam: Available: %s MB\n" +IDS_VIRT_MEM_INUSE, "Virtulna pam: In Use: %s MB\n" +IDS_PAGEFILE_LOC, "Umiestnenie(a) strnkovacieho sboru: %s\n" IDS_DOMINE, "Domna: %s\n" IDS_NETWORK_CARDS, "Sieov karta(y) %u naintalovan.\n" diff --git a/rosapps/applications/sysutils/systeminfo/lang/uk-UA.rc b/rosapps/applications/sysutils/systeminfo/lang/uk-UA.rc index edc724e7f12..eccf833302e 100644 --- a/rosapps/applications/sysutils/systeminfo/lang/uk-UA.rc +++ b/rosapps/applications/sysutils/systeminfo/lang/uk-UA.rc @@ -44,15 +44,11 @@ IDS_OS_BUILD_TYPE, " IDS_REG_OWNER, " : %s\n" IDS_REG_ORG, " : %s\n" IDS_PRODUCT_ID, "ID : %s\n" -IDS_INST_DATE, " : %s, " -IDS_INST_TIME, "%s\n" +IDS_INST_DATE, " : %s\n" IDS_UP_TIME, "System Up Time: %u Days, %u Hours, %u, Minutes, %u Seconds\n" IDS_SYS_MANUFACTURER, "System Manufacturer: %s\n" IDS_SYS_MODEL, "System Model: %s\n" -IDS_SYS_TYPE_UNKNOWN, " : \n" -IDS_SYS_TYPE_X86, " : X86-based PC\n" -IDS_SYS_TYPE_IA64, " : IA64-based PC\n" -IDS_SYS_TYPE_AMD64, " : AMD64-based PC\n" +IDS_SYS_TYPE, " : %s\n" IDS_PROCESSORS, "(): %u (,) .\n" IDS_BIOS_DATE, " BIOS: %s\n" IDS_BIOS_VERSION, " BIOS: %s\n" @@ -61,13 +57,13 @@ IDS_SYS_DIR, " IDS_BOOT_DEV, " : %s\n" IDS_SYS_LOCALE, " : %s\n" IDS_INPUT_LOCALE, " : %s\n" -IDS_TOTAL_PHYS_MEM, " ': %ld (%ld )\n" -IDS_AVAIL_PHISICAL_MEM, " ': %ld (%ld )\n" -IDS_VIRT_MEM_MAX, "³ ': . : %ld (%ld )\n" -IDS_VIRT_MEM_AVAIL, "³ ': : %ld (%ld )\n" -IDS_VIRT_MEM_INUSE, "³ ': .: %ld (%ld )\n" -IDS_PAGEFILE_LOC, " %s\n" -IDS_TIME_ZONE, " : %s\n" +IDS_TIME_ZONE, " : %s\n" +IDS_TOTAL_PHYS_MEM, " ': %s \n" +IDS_AVAIL_PHISICAL_MEM, " ': %s \n" +IDS_VIRT_MEM_MAX, "³ ': . : %s \n" +IDS_VIRT_MEM_AVAIL, "³ ': : %s \n" +IDS_VIRT_MEM_INUSE, "³ ': .: %s \n" +IDS_PAGEFILE_LOC, " : %s\n" IDS_DOMINE, ": %s\n" IDS_NETWORK_CARDS, " () %u Installed.\n" diff --git a/rosapps/applications/sysutils/systeminfo/resource.h b/rosapps/applications/sysutils/systeminfo/resource.h index eb28aea10a3..da4408392a0 100644 --- a/rosapps/applications/sysutils/systeminfo/resource.h +++ b/rosapps/applications/sysutils/systeminfo/resource.h @@ -8,11 +8,10 @@ #define IDS_REG_ORG 105 #define IDS_PRODUCT_ID 106 #define IDS_INST_DATE 107 -#define IDS_INST_TIME 108 #define IDS_UP_TIME 109 #define IDS_SYS_MANUFACTURER 110 #define IDS_SYS_MODEL 111 -#define IDS_SYS_TYPE_UNKNOWN 112 +#define IDS_SYS_TYPE 112 #define IDS_PROCESSORS 113 #define IDS_BIOS_DATE 114 #define IDS_BIOS_VERSION 115 @@ -30,6 +29,3 @@ #define IDS_TIME_ZONE 127 #define IDS_DOMINE 128 #define IDS_NETWORK_CARDS 130 -#define IDS_SYS_TYPE_X86 140 -#define IDS_SYS_TYPE_IA64 141 -#define IDS_SYS_TYPE_AMD64 142 diff --git a/rosapps/applications/sysutils/systeminfo/systeminfo.c b/rosapps/applications/sysutils/systeminfo/systeminfo.c index 68b32e1ec9d..1e911ded3ce 100644 --- a/rosapps/applications/sysutils/systeminfo/systeminfo.c +++ b/rosapps/applications/sysutils/systeminfo/systeminfo.c @@ -14,27 +14,27 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* Copyright (C) 2007, Dmitry Chapyshev */ +/* Copyright (C) 2011, Rafal Harabien */ #include #include #include #include #include -#include #include +#include #include "resource.h" #define BUFFER_SIZE 32767 -#define B_TO_MB(bytes) ((bytes)/(1024*1024)) -#define B_TO_KB(bytes) ((bytes)/1024) /* Load from resource and convert to OEM */ static BOOL -GetOemStrings(UINT rcID, LPSTR OutMsg) +GetOemStrings(UINT rcID, LPTSTR OutMsg) { TCHAR Msg[BUFFER_SIZE]; + if (LoadString(GetModuleHandle(NULL), rcID, (LPTSTR)Msg, BUFFER_SIZE)) { CharToOem(Msg, OutMsg); @@ -46,27 +46,124 @@ GetOemStrings(UINT rcID, LPSTR OutMsg) /* Load data from registry */ static BOOL -GetRegistryValue(HKEY hKeyName, LPCTSTR SubKey, LPCTSTR ValueName, LPCTSTR Buf) +RegGetSZ(HKEY hKey, LPCTSTR lpSubKey, LPCTSTR lpValueName, LPTSTR Buf) { - DWORD CharCount = BUFFER_SIZE; - HKEY hKey; - LONG lRet; + DWORD dwBytes = BUFFER_SIZE*sizeof(TCHAR), dwType; + BOOL bRet = TRUE; + + /* If SubKy is specified open it */ + if (lpSubKey && RegOpenKeyEx(hKey, + lpSubKey, + 0, + KEY_QUERY_VALUE, + &hKey) != ERROR_SUCCESS) + { + //_tprintf("Warning! Cannot open %s. Last error: %lu.\n", lpSubKey, GetLastError()); + return FALSE; + } - lRet = RegOpenKeyEx(hKeyName, - SubKey, - 0, - KEY_QUERY_VALUE, - &hKey); - if (lRet != ERROR_SUCCESS) return FALSE; - lRet = RegQueryValueEx(hKey, - ValueName, - NULL, - NULL, - (LPBYTE)Buf, - &CharCount); - if (lRet != ERROR_SUCCESS) return FALSE; - RegCloseKey(hKey); - return TRUE; + if (RegQueryValueEx(hKey, + lpValueName, + NULL, + &dwType, + (LPBYTE)Buf, + &dwBytes) != ERROR_SUCCESS || (dwType != REG_SZ && dwType != REG_MULTI_SZ)) + { + //_tprintf("Warning! Cannot query %s. Last error: %lu, type: %lu.\n", lpValueName, GetLastError(), dwType); + dwBytes = 0; + bRet = FALSE; + } + + /* Close key if we opened it */ + if (lpSubKey) + RegCloseKey(hKey); + + /* NULL-terminate string */ + Buf[min(BUFFER_SIZE-1, dwBytes/sizeof(TCHAR))] = TEXT('\0'); + + return bRet; +} + +static +BOOL +RegGetDWORD(HKEY hKey, LPCTSTR lpSubKey, LPCTSTR lpValueName, LPDWORD lpData) +{ + DWORD dwBytes = sizeof(*lpData), dwType; + BOOL bRet = TRUE; + + /* If SubKy is specified open it */ + if (lpSubKey && RegOpenKeyEx(hKey, + lpSubKey, + 0, + KEY_QUERY_VALUE, + &hKey) != ERROR_SUCCESS) + { + return FALSE; + } + + if (RegQueryValueEx(hKey, + lpValueName, + NULL, + &dwType, + (LPBYTE)lpData, + &dwBytes) != ERROR_SUCCESS || dwType != REG_DWORD) + { + //_tprintf("Warning! Cannot query %s. Last err: %lu, type: %lu\n", lpValueName, GetLastError(), dwType); + *lpData = 0; + bRet = FALSE; + } + + /* Close key if we opened it */ + if (lpSubKey) + RegCloseKey(hKey); + + return bRet; +} + +static +void +FormatBytes(LPTSTR Buf, unsigned cBytes) +{ + TCHAR szMB[32], Tmp[BUFFER_SIZE]; + NUMBERFMT fmt; + + itoa(cBytes / (1024*1024), szMB, 10); + + fmt.NumDigits = 0; + fmt.LeadingZero = 0; + fmt.Grouping = 3; + fmt.lpDecimalSep = TEXT(""); + fmt.lpThousandSep = TEXT(" "); + fmt.NegativeOrder = 0; + if(!GetNumberFormat(LOCALE_SYSTEM_DEFAULT, 0, szMB, &fmt, Tmp, BUFFER_SIZE)) + printf("Error! GetNumberFormat failed.\n"); + + CharToOem(Tmp, Buf); +} + +static +void +FormatDateTime(time_t Time, LPTSTR lpBuf) +{ + unsigned cchBuf = BUFFER_SIZE, i; + SYSTEMTIME SysTime; + const struct tm *lpTm; + + lpTm = localtime(&Time); + SysTime.wYear = (WORD)(1900 + lpTm->tm_year); + SysTime.wMonth = (WORD)(1 + lpTm->tm_mon); + SysTime.wDayOfWeek = (WORD)lpTm->tm_wday; + SysTime.wDay = (WORD)lpTm->tm_mday; + SysTime.wHour = (WORD)lpTm->tm_hour; + SysTime.wMinute = (WORD)lpTm->tm_min; + SysTime.wSecond = (WORD)lpTm->tm_sec; + SysTime.wMilliseconds = 0; + + i = GetDateFormat(LOCALE_SYSTEM_DEFAULT, 0, &SysTime, NULL, lpBuf, cchBuf); + if (i) + --i; /* don't count NULL character */ + i += _stprintf(lpBuf + i, TEXT(", ")); + GetTimeFormat(LOCALE_SYSTEM_DEFAULT, 0, &SysTime, NULL, lpBuf + i, cchBuf - i); } /* Show usage */ @@ -75,46 +172,63 @@ VOID Usage(VOID) { TCHAR Buf[BUFFER_SIZE]; - if(GetOemStrings(IDS_USAGE, Buf)) printf("%s",Buf); + + if(GetOemStrings(IDS_USAGE, Buf)) + _tprintf("%s", Buf); } /* Print all system information */ VOID AllSysInfo(VOID) { - DWORD dwCharCount = BUFFER_SIZE; + DWORD dwCharCount = BUFFER_SIZE, dwTimestamp; OSVERSIONINFO VersionInfo; SYSTEM_INFO SysInfo; TCHAR Buf[BUFFER_SIZE], Tmp[BUFFER_SIZE], Msg[BUFFER_SIZE], szSystemDir[MAX_PATH]; + const TCHAR *lpcszSysType; MEMORYSTATUS MemoryStatus; unsigned int cSeconds; TIME_ZONE_INFORMATION TimeZoneInfo; + HKEY hKey; if (!GetSystemDirectory(szSystemDir, sizeof(szSystemDir)/sizeof(szSystemDir[0]))) - printf("Error getting: GetSystemDirectory\n"); + { + _tprintf("Error! GetSystemDirectory failed.\n"); + return; + } + GetSystemInfo(&SysInfo); // getting computer name dwCharCount = BUFFER_SIZE; if (!GetComputerName(Buf, &dwCharCount)) - printf("Error getting: GetComputerName"); - if (GetOemStrings(IDS_HOST_NAME, Msg)) - printf(Msg, Buf); + _tprintf("Error! GetComputerName failed.\n"); + else if (GetOemStrings(IDS_HOST_NAME, Msg)) + _tprintf(Msg, Buf); + + // open CurrentVersion key + if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, + TEXT("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion"), + 0, + KEY_QUERY_VALUE, + &hKey) != ERROR_SUCCESS) + { + _tprintf("Error! RegOpenKeyEx failed.\n"); + return; + } //getting OS Name - GetRegistryValue(HKEY_LOCAL_MACHINE, - TEXT("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion"), - TEXT("ProductName"), - Buf); - if (GetOemStrings(IDS_OS_NAME, Msg)) printf(Msg, Buf); + RegGetSZ(hKey, NULL, TEXT("ProductName"), Buf); + if (GetOemStrings(IDS_OS_NAME, Msg)) + _tprintf(Msg, Buf); //getting OS Version ZeroMemory(&VersionInfo, sizeof(VersionInfo)); VersionInfo.dwOSVersionInfoSize = sizeof(VersionInfo); GetVersionEx(&VersionInfo); - + if (GetOemStrings(IDS_OS_VERSION, Msg)) - printf(Msg, + _tprintf(Msg, (unsigned)VersionInfo.dwMajorVersion, (unsigned)VersionInfo.dwMinorVersion, (unsigned)VersionInfo.dwBuildNumber, @@ -126,53 +240,40 @@ AllSysInfo(VOID) //getting OS Configuration //getting OS Build Type - if (GetRegistryValue(HKEY_LOCAL_MACHINE, - TEXT("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion"), - TEXT("CurrentType"), - Buf)) - if (GetOemStrings(IDS_OS_BUILD_TYPE, Msg)) printf(Msg, Buf); + RegGetSZ(hKey, NULL, TEXT("CurrentType"), Buf); + if (GetOemStrings(IDS_OS_BUILD_TYPE, Msg)) + _tprintf(Msg, Buf); //getting Registered Owner - if (GetRegistryValue(HKEY_LOCAL_MACHINE, - TEXT("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion"), - TEXT("RegisteredOwner"), - Buf)) - if (GetOemStrings(IDS_REG_OWNER, Msg)) printf(Msg, Buf); + RegGetSZ(hKey, NULL, TEXT("RegisteredOwner"), Buf); + if (GetOemStrings(IDS_REG_OWNER, Msg)) + _tprintf(Msg, Buf); //getting Registered Organization - if (GetRegistryValue(HKEY_LOCAL_MACHINE, - TEXT("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion"), - TEXT("RegisteredOrganization"), - Buf)) - if (GetOemStrings(IDS_REG_ORG, Msg)) printf(Msg, Buf); + RegGetSZ(hKey, NULL, TEXT("RegisteredOrganization"), Buf); + if (GetOemStrings(IDS_REG_ORG, Msg)) + _tprintf(Msg, Buf); - //getting Product ID // use SOFTWARE\Microsoft\Windows NT\CurrentVersion\InstallDate - if (GetRegistryValue(HKEY_LOCAL_MACHINE, - TEXT("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion"), - TEXT("ProductId"), - Buf)) - if (GetOemStrings(IDS_PRODUCT_ID, Msg)) printf(Msg, Buf); + //getting Product ID + RegGetSZ(hKey, NULL, TEXT("ProductId"), Buf); + if (GetOemStrings(IDS_PRODUCT_ID, Msg)) + _tprintf(Msg, Buf); //getting Install Date - if (GetRegistryValue(HKEY_LOCAL_MACHINE, - TEXT("SOFTWARE\\Microsoft\\WBEM\\CIMOM"), - TEXT("SetupDate"), - Buf)) - if (GetOemStrings(IDS_INST_DATE, Msg)) printf(Msg, Buf); + RegGetDWORD(hKey, NULL, TEXT("InstallDate"), &dwTimestamp); + FormatDateTime((time_t)dwTimestamp, Buf); + if (GetOemStrings(IDS_INST_DATE, Msg)) + _tprintf(Msg, Buf); - //getting Install Time - if (GetRegistryValue(HKEY_LOCAL_MACHINE, - TEXT("SOFTWARE\\Microsoft\\WBEM\\CIMOM"), - TEXT("SetupTime"), - Buf)) - if (GetOemStrings(IDS_INST_TIME, Msg)) printf(Msg, Buf); + // close Current Version key now + RegCloseKey(hKey); //getting System Up Time cSeconds = GetTickCount() / 1000; if (GetOemStrings(IDS_UP_TIME, Msg)) - printf(Msg, cSeconds / (60*60*24), (cSeconds / (60*60)) % 24, (cSeconds / 60) % 60, cSeconds % 60); + _tprintf(Msg, cSeconds / (60*60*24), (cSeconds / (60*60)) % 24, (cSeconds / 60) % 60, cSeconds % 60); - //getting System Manufacturer + //getting System Manufacturer; HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\OEMInformation\Manufacturer for Win >= 6.0 sprintf(Tmp, "%s\\oeminfo.ini", szSystemDir); GetPrivateProfileString(TEXT("General"), TEXT("Manufacturer"), @@ -181,9 +282,9 @@ AllSysInfo(VOID) sizeof(Buf)/sizeof(Buf[0]), Tmp); if (GetOemStrings(IDS_SYS_MANUFACTURER, Msg)) - printf(Msg, Buf); + _tprintf(Msg, Buf); - //getting System Model + //getting System Model; HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\OEMInformation\Model for Win >= 6.0 GetPrivateProfileString(TEXT("General"), TEXT("Model"), TEXT("To Be Filled By O.E.M."), @@ -191,164 +292,204 @@ AllSysInfo(VOID) sizeof(Buf)/sizeof(Buf[0]), Tmp); if (GetOemStrings(IDS_SYS_MODEL, Msg)) - printf(Msg, Buf); + _tprintf(Msg, Buf); //getting System type switch (SysInfo.wProcessorArchitecture) { - case PROCESSOR_ARCHITECTURE_UNKNOWN: - if (GetOemStrings(IDS_SYS_TYPE_UNKNOWN, Msg)) printf("%s", Msg); - break; case PROCESSOR_ARCHITECTURE_INTEL: - if (GetOemStrings(IDS_SYS_TYPE_X86, Msg)) printf("%s", Msg); + lpcszSysType = TEXT("X86-based PC"); break; case PROCESSOR_ARCHITECTURE_IA64: - if (GetOemStrings(IDS_SYS_TYPE_IA64, Msg)) printf("%s", Msg); + lpcszSysType = TEXT("IA64-based PC"); break; case PROCESSOR_ARCHITECTURE_AMD64: - if (GetOemStrings(IDS_SYS_TYPE_AMD64, Msg)) printf("%s", Msg); + lpcszSysType = TEXT("AMD64-based PC"); + break; + default: + lpcszSysType = TEXT("Unknown"); break; } + if (GetOemStrings(IDS_SYS_TYPE, Msg)) + _tprintf(Msg, lpcszSysType); //getting Processor(s) if (GetOemStrings(IDS_PROCESSORS, Msg)) { unsigned int i; - printf(Msg, (unsigned int)SysInfo.dwNumberOfProcessors); + _tprintf(Msg, (unsigned int)SysInfo.dwNumberOfProcessors); for(i = 0; i < (unsigned int)SysInfo.dwNumberOfProcessors; i++) { - sprintf(Tmp,"HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\%u",i); - if (GetRegistryValue(HKEY_LOCAL_MACHINE, - (LPCTSTR)Tmp, - TEXT("Identifier"), - Buf)) - printf(" [0%u]: %s", i+1, Buf); - if (GetRegistryValue(HKEY_LOCAL_MACHINE, - (LPCTSTR)Tmp, - TEXT("VendorIdentifier"), - Buf)) - printf(" %s\n", Buf); + sprintf(Tmp, "HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\%u",i); + + RegGetSZ(HKEY_LOCAL_MACHINE, Tmp, TEXT("Identifier"), Buf); + _tprintf(" [%02u]: %s", i+1, Buf); + + RegGetSZ(HKEY_LOCAL_MACHINE, Tmp, TEXT("VendorIdentifier"), Buf); + _tprintf(" %s\n", Buf); } } //getting BIOS Version - if (GetRegistryValue(HKEY_LOCAL_MACHINE, - TEXT("HARDWARE\\DESCRIPTION\\System"), - TEXT("SystemBiosVersion"), - Buf)) - if (GetOemStrings(IDS_BIOS_VERSION, Msg)) printf(Msg, Buf); + RegGetSZ(HKEY_LOCAL_MACHINE, + TEXT("HARDWARE\\DESCRIPTION\\System"), + TEXT("SystemBiosVersion"), + Buf); + if (GetOemStrings(IDS_BIOS_VERSION, Msg)) + _tprintf(Msg, Buf); //gettings BIOS date - if (GetRegistryValue(HKEY_LOCAL_MACHINE, - TEXT("HARDWARE\\DESCRIPTION\\System"), - TEXT("SystemBiosDate"), - Buf)) - if (GetOemStrings(IDS_BIOS_DATE, Msg)) printf(Msg, Buf); + RegGetSZ(HKEY_LOCAL_MACHINE, + TEXT("HARDWARE\\DESCRIPTION\\System"), + TEXT("SystemBiosDate"), + Buf); + if (GetOemStrings(IDS_BIOS_DATE, Msg)) + _tprintf(Msg, Buf); //getting ReactOS Directory - if (!GetWindowsDirectory(Buf, BUFFER_SIZE)) printf("Error getting: GetWindowsDirectory"); - if (GetOemStrings(IDS_ROS_DIR, Msg)) printf(Msg, Buf); + if (!GetWindowsDirectory(Buf, BUFFER_SIZE)) + _tprintf("Error! GetWindowsDirectory failed."); + else if (GetOemStrings(IDS_ROS_DIR, Msg)) + _tprintf(Msg, Buf); //getting System Directory - if (GetOemStrings(IDS_SYS_DIR, Msg)) printf(Msg, szSystemDir); + if (GetOemStrings(IDS_SYS_DIR, Msg)) + _tprintf(Msg, szSystemDir); //getting Boot Device - if (GetRegistryValue(HKEY_LOCAL_MACHINE, - TEXT("SYSTEM\\Setup"), - TEXT("SystemPartition"), - Buf)) - if (GetOemStrings(IDS_BOOT_DEV, Msg)) printf(Msg, Buf); + RegGetSZ(HKEY_LOCAL_MACHINE, + TEXT("SYSTEM\\Setup"), + TEXT("SystemPartition"), + Buf); + if (GetOemStrings(IDS_BOOT_DEV, Msg)) + _tprintf(Msg, Buf); //getting System Locale - if (GetRegistryValue(HKEY_CURRENT_USER, - TEXT("Control Panel\\International"), - TEXT("Locale"), - Tmp)) - if (GetRegistryValue(HKEY_CLASSES_ROOT, - TEXT("MIME\\Database\\Rfc1766"), - (LPTSTR)Tmp, - Buf)) - if (GetOemStrings(IDS_SYS_LOCALE, Msg)) printf(Msg, Buf); + if (RegGetSZ(HKEY_CURRENT_USER, + TEXT("Control Panel\\International"), + TEXT("Locale"), + Tmp)) + if (RegGetSZ(HKEY_CLASSES_ROOT, + TEXT("MIME\\Database\\Rfc1766"), + Tmp, + Buf)) + if (GetOemStrings(IDS_SYS_LOCALE, Msg)) + _tprintf(Msg, Buf); //getting Input Locale - if (GetRegistryValue(HKEY_CURRENT_USER, - TEXT("Keyboard Layout\\Preload"), - TEXT("1"), - Buf)) + if (RegGetSZ(HKEY_CURRENT_USER, + TEXT("Keyboard Layout\\Preload"), + TEXT("1"), + Buf)) { - int i,j; - for(j = 0, i = 4; i <= 8; j++, i++) Tmp[j] = Buf[i]; - if (GetRegistryValue(HKEY_CLASSES_ROOT, - TEXT("MIME\\Database\\Rfc1766"), - (LPTSTR)Tmp, - Buf)) - if (GetOemStrings(IDS_INPUT_LOCALE, Msg)) printf(Msg, Buf); + int i, j; + + for(j = 0, i = 4; i <= 8; j++, i++) + Tmp[j] = Buf[i]; + + if (RegGetSZ(HKEY_CLASSES_ROOT, + TEXT("MIME\\Database\\Rfc1766"), + Tmp, + Buf)) + if (GetOemStrings(IDS_INPUT_LOCALE, Msg)) + _tprintf(Msg, Buf); } //getting Time Zone GetTimeZoneInformation(&TimeZoneInfo); - sprintf(Tmp,"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Time Zones\\%S",TimeZoneInfo.StandardName); - if (GetRegistryValue(HKEY_LOCAL_MACHINE, - (LPCTSTR)Tmp, - TEXT("Display"), - Buf)) - if (GetOemStrings(IDS_TIME_ZONE, Msg)) printf(Msg, Buf); - - //getting Total Physical Memory - GlobalMemoryStatus(&MemoryStatus); - if(GetOemStrings(IDS_TOTAL_PHYS_MEM, Msg)) - printf(Msg, - B_TO_MB(MemoryStatus.dwTotalPhys), - B_TO_KB(MemoryStatus.dwTotalPhys)); - - //getting Available Physical Memory - if(GetOemStrings(IDS_AVAIL_PHISICAL_MEM,Msg)) - printf(Msg, - B_TO_MB(MemoryStatus.dwAvailPhys), - B_TO_KB(MemoryStatus.dwAvailPhys)); - - //getting Virtual Memory: Max Size - if(GetOemStrings(IDS_VIRT_MEM_MAX, Msg)) - printf(Msg, - B_TO_MB(MemoryStatus.dwTotalVirtual), - B_TO_KB(MemoryStatus.dwTotalVirtual)); - - //getting Virtual Memory: Available - if(GetOemStrings(IDS_VIRT_MEM_AVAIL, Msg)) - printf(Msg, - B_TO_MB(MemoryStatus.dwAvailVirtual), - B_TO_KB(MemoryStatus.dwAvailVirtual)); - - //getting Virtual Memory: In Use - if(GetOemStrings(IDS_VIRT_MEM_INUSE, Msg)) - printf(Msg, - B_TO_MB(MemoryStatus.dwTotalVirtual-MemoryStatus.dwAvailVirtual), - B_TO_KB(MemoryStatus.dwTotalVirtual-MemoryStatus.dwAvailVirtual)); - - //getting Page File Location(s) - if (GetRegistryValue(HKEY_LOCAL_MACHINE, - TEXT("SYSTEM\\ControlSet001\\Control\\Session Manager\\Memory Management"), - TEXT("PagingFiles"), - Buf)) + + /* Open Time Zones key */ + if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, + TEXT("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Time Zones"), + 0, + KEY_ENUMERATE_SUB_KEYS|KEY_READ, + &hKey) == ERROR_SUCCESS) { - int i; - for(i = 0; i < strlen((char*)Buf); i++) + unsigned i; + + /* Find current timezone */ + dwCharCount = 256; // Windows seems to have a bug - it doesnt accept BUFFER_SIZE here + for(i = 0; RegEnumKeyEx(hKey, i, Tmp, &dwCharCount, NULL, NULL, NULL, NULL) == ERROR_SUCCESS; ++i, dwCharCount = 255) { - if (Buf[i] == ' ') +#ifdef _UNICODE + RegGetSZ(hKey, Tmp, TEXT("Std"), Buf); + + if(!wcscmp(wBuf, TimeZoneInfo.StandardName)) +#else + wchar_t wBuf[BUFFER_SIZE]; + + RegGetSZ(hKey, Tmp, TEXT("Std"), Buf); + mbstowcs(wBuf, Buf, BUFFER_SIZE); + + if(!wcscmp(wBuf, TimeZoneInfo.StandardName)) +#endif { - Buf[i] = '\0'; + RegGetSZ(hKey, Tmp, TEXT("Display"), Buf); + + if (GetOemStrings(IDS_TIME_ZONE, Msg)) + _tprintf(Msg, Buf); + break; } } - if(GetOemStrings(IDS_PAGEFILE_LOC, Msg)) printf(Msg, Buf); + RegCloseKey(hKey); + } + + + //getting Total Physical Memory + GlobalMemoryStatus(&MemoryStatus); + FormatBytes(Buf, MemoryStatus.dwTotalPhys); + if (GetOemStrings(IDS_TOTAL_PHYS_MEM, Msg)) + _tprintf(Msg, Buf); + + //getting Available Physical Memory + FormatBytes(Buf, MemoryStatus.dwAvailPhys); + if (GetOemStrings(IDS_AVAIL_PHISICAL_MEM,Msg)) + _tprintf(Msg, Buf); + + //getting Virtual Memory: Max Size + FormatBytes(Buf, MemoryStatus.dwTotalVirtual); + if (GetOemStrings(IDS_VIRT_MEM_MAX, Msg)) + _tprintf(Msg, Buf); + + //getting Virtual Memory: Available + FormatBytes(Buf, MemoryStatus.dwAvailVirtual); + if (GetOemStrings(IDS_VIRT_MEM_AVAIL, Msg)) + _tprintf(Msg, Buf); + + //getting Virtual Memory: In Use + FormatBytes(Buf, MemoryStatus.dwTotalVirtual-MemoryStatus.dwAvailVirtual); + if (GetOemStrings(IDS_VIRT_MEM_INUSE, Msg)) + _tprintf(Msg, Buf); + + //getting Page File Location(s) + if (RegGetSZ(HKEY_LOCAL_MACHINE, + TEXT("SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Memory Management"), + TEXT("PagingFiles"), + Buf)) + { + int i; + + for(i = 0; i < strlen((char*)Buf); i++) + { + if (Buf[i] == TEXT(' ')) + { + Buf[i] = TEXT('\0'); + break; + } + } + + if(GetOemStrings(IDS_PAGEFILE_LOC, Msg)) + _tprintf(Msg, Buf); } //getting Domain - if (GetRegistryValue(HKEY_LOCAL_MACHINE, - TEXT("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon"), - TEXT("CachePrimaryDomain"), - Buf)) - if(GetOemStrings(IDS_DOMINE, Msg)) printf(Msg, Buf); + if (RegGetSZ(HKEY_LOCAL_MACHINE, + TEXT("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon"), + TEXT("CachePrimaryDomain"), + Buf)) + if(GetOemStrings(IDS_DOMINE, Msg)) + _tprintf(Msg, Buf); //getting Logon Server @@ -368,6 +509,8 @@ main(int argc, char *argv[]) Usage(); return 0; } + AllSysInfo(); + return 0; } From f4f2b68256090c04f73cfb777fc6e19eb9e99233 Mon Sep 17 00:00:00 2001 From: Rafal Harabien Date: Fri, 1 Apr 2011 22:10:52 +0000 Subject: [PATCH 049/317] [ADVAPI32] * Fix bug in RegQueryValueExA, which causes buffer overflow * Fixes systeminfo in ReactOS See issue #6050 for more details. svn path=/trunk/; revision=51222 --- reactos/dll/win32/advapi32/reg/reg.c | 44 +++++++++++++++------------- 1 file changed, 24 insertions(+), 20 deletions(-) diff --git a/reactos/dll/win32/advapi32/reg/reg.c b/reactos/dll/win32/advapi32/reg/reg.c index c6af98b5b4f..cfc8ba1ea28 100644 --- a/reactos/dll/win32/advapi32/reg/reg.c +++ b/reactos/dll/win32/advapi32/reg/reg.c @@ -3988,7 +3988,7 @@ RegQueryValueExA(HKEY hKey, LPDWORD lpcbData) { UNICODE_STRING ValueName; - UNICODE_STRING ValueData; + LPWSTR lpValueBuffer; LONG ErrorCode; DWORD Length; DWORD Type; @@ -4003,39 +4003,42 @@ RegQueryValueExA(HKEY hKey, return ERROR_INVALID_PARAMETER; } + Length = (lpcbData == NULL || lpData == NULL) ? 0 : *lpcbData * sizeof(WCHAR); + if (lpData) { - ValueData.Length = 0; - ValueData.MaximumLength = (*lpcbData + 1) * sizeof(WCHAR); - ValueData.Buffer = RtlAllocateHeap(ProcessHeap, - 0, - ValueData.MaximumLength); - if (!ValueData.Buffer) + lpValueBuffer = RtlAllocateHeap(ProcessHeap, + 0, + Length + sizeof(WCHAR)); + if (!lpValueBuffer) { return ERROR_OUTOFMEMORY; } } else { - ValueData.Buffer = NULL; - ValueData.Length = 0; - ValueData.MaximumLength = 0; + lpValueBuffer = NULL; if (lpcbData) *lpcbData = 0; } - RtlCreateUnicodeStringFromAsciiz(&ValueName, - (LPSTR)lpValueName); + if(!RtlCreateUnicodeStringFromAsciiz(&ValueName, + (LPSTR)lpValueName)) + { + ERR("RtlCreateUnicodeStringFromAsciiz failed!\n"); + ErrorCode = ERROR_OUTOFMEMORY; + goto cleanup; + } - Length = (lpcbData == NULL) ? 0 : *lpcbData * sizeof(WCHAR); ErrorCode = RegQueryValueExW(hKey, ValueName.Buffer, lpReserved, &Type, - (lpData == NULL) ? NULL : (LPBYTE)ValueData.Buffer, + (LPBYTE)lpValueBuffer, &Length); TRACE("ErrorCode %lu\n", ErrorCode); + RtlFreeUnicodeString(&ValueName); if (ErrorCode == ERROR_SUCCESS || @@ -4044,9 +4047,9 @@ RegQueryValueExA(HKEY hKey, if (is_string(Type)) { - if (ErrorCode == ERROR_SUCCESS && ValueData.Buffer != NULL) + if (ErrorCode == ERROR_SUCCESS && lpValueBuffer != NULL) { - Status = RtlUnicodeToMultiByteN((PCHAR)lpData, *lpcbData, &Index, (PWCHAR)ValueData.Buffer, Length); + Status = RtlUnicodeToMultiByteN((PCHAR)lpData, *lpcbData, &Index, (PWCHAR)lpValueBuffer, Length); if (NT_SUCCESS(Status)) { PCHAR szData = (PCHAR)lpData; @@ -4063,7 +4066,7 @@ RegQueryValueExA(HKEY hKey, Length = Length / sizeof(WCHAR); } - else if (ErrorCode == ERROR_SUCCESS && ValueData.Buffer != NULL) + else if (ErrorCode == ERROR_SUCCESS && lpValueBuffer != NULL) { if (*lpcbData < Length) { @@ -4071,7 +4074,7 @@ RegQueryValueExA(HKEY hKey, } else { - RtlMoveMemory(lpData, ValueData.Buffer, Length); + RtlMoveMemory(lpData, lpValueBuffer, Length); } } @@ -4086,9 +4089,10 @@ RegQueryValueExA(HKEY hKey, *lpType = Type; } - if (ValueData.Buffer != NULL) +cleanup: + if (lpValueBuffer != NULL) { - RtlFreeHeap(ProcessHeap, 0, ValueData.Buffer); + RtlFreeHeap(ProcessHeap, 0, lpValueBuffer); } return ErrorCode; From 1d045ebeb326c1fbf5bead70d8ca083ce16fe908 Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Sat, 2 Apr 2011 09:20:16 +0000 Subject: [PATCH 050/317] [NTDLL] - Fix a typo which led to incorrect logic of TLS allocation. This repairs those installers broken by r51051. See issue #6009 for more details. svn path=/trunk/; revision=51223 --- reactos/dll/ntdll/ldr/ldrinit.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/dll/ntdll/ldr/ldrinit.c b/reactos/dll/ntdll/ldr/ldrinit.c index cccaa4ee4f3..5913304361a 100644 --- a/reactos/dll/ntdll/ldr/ldrinit.c +++ b/reactos/dll/ntdll/ldr/ldrinit.c @@ -786,8 +786,8 @@ LdrpAllocateTls(VOID) PVOID *TlsVector; /* Check if we have any entries */ - if (LdrpNumberOfTlsEntries) - return 0; + if (!LdrpNumberOfTlsEntries) + return STATUS_SUCCESS; /* Allocate the vector array */ TlsVector = RtlAllocateHeap(RtlGetProcessHeap(), From 0857319218b176097b0126b92b5169a4f0411135 Mon Sep 17 00:00:00 2001 From: Giannis Adamopoulos Date: Sat, 2 Apr 2011 10:12:44 +0000 Subject: [PATCH 051/317] [win32k] - Simplify co_IntWaitMessage - In co_IntGetPeekMessage, call co_MsqWaitForNewMessages instead of co_IntWaitMessage when we need to wait for a new message. co_IntWaitMessage calls co_IntPeekMessage again without removing messages. The problem is that processing some messages produce other messages or hooks even though the message must not be removed. As a result some messages like WM_NCHITTEST were received twice by the application - Should fix bug 3232 svn path=/trunk/; revision=51224 --- .../subsystems/win32/win32k/ntuser/message.c | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/reactos/subsystems/win32/win32k/ntuser/message.c b/reactos/subsystems/win32/win32k/ntuser/message.c index f14ec4745ed..b66f31db35d 100644 --- a/reactos/subsystems/win32/win32k/ntuser/message.c +++ b/reactos/subsystems/win32/win32k/ntuser/message.c @@ -850,15 +850,15 @@ co_IntWaitMessage( PWND Window, Window, MsgFilterMin, MsgFilterMax); - } - while ( (STATUS_WAIT_0 <= Status && Status <= STATUS_WAIT_63) || - STATUS_TIMEOUT == Status ); + if (!NT_SUCCESS(Status)) + { + SetLastNtError(Status); + DPRINT1("Exit co_IntWaitMessage on error!\n"); - if (!NT_SUCCESS(Status)) - { - SetLastNtError(Status); - DPRINT1("Exit co_IntWaitMessage on error!\n"); + return FALSE; + } } + while ( TRUE ); return FALSE; } @@ -874,6 +874,7 @@ co_IntGetPeekMessage( PMSG pMsg, PWND Window; PTHREADINFO pti; BOOL Present = FALSE; + NTSTATUS Status; if ( hWnd == HWND_TOPMOST || hWnd == HWND_BROADCAST ) hWnd = HWND_BOTTOM; @@ -941,7 +942,11 @@ co_IntGetPeekMessage( PMSG pMsg, if ( bGMSG ) { - if ( !co_IntWaitMessage(Window, MsgFilterMin, MsgFilterMax) ) + Status = co_MsqWaitForNewMessages( pti->MessageQueue, + Window, + MsgFilterMin, + MsgFilterMax); + if ( !NT_SUCCESS(Status) ) { Present = -1; break; From 88e51aaa476e74ce7135140895242477ea281e7f Mon Sep 17 00:00:00 2001 From: Rafal Harabien Date: Sat, 2 Apr 2011 14:54:24 +0000 Subject: [PATCH 052/317] [SYSTEMINFO] * Fix Domain field * Get rid of TCHAR * Translate System Up Time to polish svn path=/trunk/; revision=51225 --- .../sysutils/systeminfo/lang/de-DE.rc | 4 +- .../sysutils/systeminfo/lang/en-US.rc | 4 +- .../sysutils/systeminfo/lang/es-ES.rc | 4 +- .../sysutils/systeminfo/lang/fr-FR.rc | 4 +- .../sysutils/systeminfo/lang/no-NO.rc | 4 +- .../sysutils/systeminfo/lang/pl-PL.rc | 4 +- .../sysutils/systeminfo/lang/sk-SK.rc | 4 +- .../sysutils/systeminfo/lang/uk-UA.rc | 4 +- .../sysutils/systeminfo/resource.h | 2 +- .../sysutils/systeminfo/systeminfo.c | 337 +++++++++--------- .../sysutils/systeminfo/systeminfo.rbuild | 1 + 11 files changed, 184 insertions(+), 188 deletions(-) diff --git a/rosapps/applications/sysutils/systeminfo/lang/de-DE.rc b/rosapps/applications/sysutils/systeminfo/lang/de-DE.rc index f161f72c54c..287217c99b1 100644 --- a/rosapps/applications/sysutils/systeminfo/lang/de-DE.rc +++ b/rosapps/applications/sysutils/systeminfo/lang/de-DE.rc @@ -39,7 +39,7 @@ IDS_REG_OWNER, "Registrierter Benutzer: %s\n" IDS_REG_ORG, "Registrierte Organisation: %s\n" IDS_PRODUCT_ID, "Produkt ID: %s\n" IDS_INST_DATE, "Installationsdatum: %s\n" -IDS_UP_TIME, "System Up Time: %u Days, %u Hours, %u, Minutes, %u Seconds\n" +IDS_UP_TIME, "System Up Time: %u Days, %u Hours, %u Minutes, %u Seconds\n" IDS_SYS_MANUFACTURER, "System Manufacturer: %s\n" IDS_SYS_MODEL, "System Model: %s\n" IDS_SYS_TYPE, "Systemtyp: %s\n" @@ -58,7 +58,7 @@ IDS_VIRT_MEM_MAX, "Auslagerungsdatei: Max Gr IDS_VIRT_MEM_AVAIL, "Auslagerungsdatei: Verfgbar: %s MB\n" IDS_VIRT_MEM_INUSE, "Auslagerungsdatei: In Verwendung: %s MB\n" IDS_PAGEFILE_LOC, "Auslagerungsdateipfad(e): %s" -IDS_DOMINE, "Domain: %s\n" +IDS_DOMAIN, "Domain: %s\n" IDS_NETWORK_CARDS, "Netzwerkkarte(n) %u Installiert.\n" END diff --git a/rosapps/applications/sysutils/systeminfo/lang/en-US.rc b/rosapps/applications/sysutils/systeminfo/lang/en-US.rc index d7731b67229..aa0c7713a08 100644 --- a/rosapps/applications/sysutils/systeminfo/lang/en-US.rc +++ b/rosapps/applications/sysutils/systeminfo/lang/en-US.rc @@ -37,7 +37,7 @@ IDS_REG_OWNER, "Registered Owner: %s\n" IDS_REG_ORG, "Registered Organization: %s\n" IDS_PRODUCT_ID, "Product ID: %s\n" IDS_INST_DATE, "Install Date: %s\n" -IDS_UP_TIME, "System Up Time: %u Days, %u Hours, %u, Minutes, %u Seconds\n" +IDS_UP_TIME, "System Up Time: %u Days, %u Hours, %u Minutes, %u Seconds\n" IDS_SYS_MANUFACTURER, "System Manufacturer: %s\n" IDS_SYS_MODEL, "System Model: %s\n" IDS_SYS_TYPE, "System type: %s\n" @@ -56,7 +56,7 @@ IDS_VIRT_MEM_MAX, "Virtual Memory: Max Size: %s MB\n" IDS_VIRT_MEM_AVAIL, "Virtual Memory: Available: %s MB\n" IDS_VIRT_MEM_INUSE, "Virtual Memory: In Use: %s MB\n" IDS_PAGEFILE_LOC, "Page File Location(s): %s\n" -IDS_DOMINE, "Domain: %s\n" +IDS_DOMAIN, "Domain: %s\n" IDS_NETWORK_CARDS, "Network Card(s) %u Installed.\n" END diff --git a/rosapps/applications/sysutils/systeminfo/lang/es-ES.rc b/rosapps/applications/sysutils/systeminfo/lang/es-ES.rc index 423c67d0374..c9ec95f6a78 100644 --- a/rosapps/applications/sysutils/systeminfo/lang/es-ES.rc +++ b/rosapps/applications/sysutils/systeminfo/lang/es-ES.rc @@ -42,7 +42,7 @@ IDS_REG_OWNER, "Propietario: %s\n" IDS_REG_ORG, "Organizacin: %s\n" IDS_PRODUCT_ID, "Identificador de Producto %s\n" IDS_INST_DATE, "Fecha de Instalacin: %s\n" -IDS_UP_TIME, "System Up Time: %u Days, %u Hours, %u, Minutes, %u Seconds\n" +IDS_UP_TIME, "System Up Time: %u Days, %u Hours, %u Minutes, %u Seconds\n" IDS_SYS_MANUFACTURER, "System Manufacturer: %s\n" IDS_SYS_MODEL, "System Model: %s\n" IDS_SYS_TYPE, "Tipo de sistema: %s\n" @@ -61,7 +61,7 @@ IDS_VIRT_MEM_MAX, "Memoria Virtual: Tama IDS_VIRT_MEM_AVAIL, "Memoria Virtual: Disponible: %s MB\n" IDS_VIRT_MEM_INUSE, "Memoria Virtual: En Uso: %s MB\n" IDS_PAGEFILE_LOC, "Ruta(s) Archivo Paginacin: %s\n" -IDS_DOMINE, "Dominio: %s\n" +IDS_DOMAIN, "Dominio: %s\n" IDS_NETWORK_CARDS, "Tarjeta(s) de Red %u No Instalada.\n" END diff --git a/rosapps/applications/sysutils/systeminfo/lang/fr-FR.rc b/rosapps/applications/sysutils/systeminfo/lang/fr-FR.rc index 4d9c9a4ae3b..82b5a62f84d 100644 --- a/rosapps/applications/sysutils/systeminfo/lang/fr-FR.rc +++ b/rosapps/applications/sysutils/systeminfo/lang/fr-FR.rc @@ -37,7 +37,7 @@ IDS_REG_OWNER, "Propri IDS_REG_ORG, "Organisation enregistre : %s\n" IDS_PRODUCT_ID, "ID du produit : %s\n" IDS_INST_DATE, "Date d'installation : %s\n" -IDS_UP_TIME, "System Up Time: %u Days, %u Hours, %u, Minutes, %u Seconds\n" +IDS_UP_TIME, "System Up Time: %u Days, %u Hours, %u Minutes, %u Seconds\n" IDS_SYS_MANUFACTURER, "System Manufacturer: %s\n" IDS_SYS_MODEL, "System Model: %s\n" IDS_SYS_TYPE, "Type du systme : %s\n" @@ -56,7 +56,7 @@ IDS_VIRT_MEM_MAX, "M IDS_VIRT_MEM_AVAIL, "Mmoire virtuelle: Disponible : %s Mo\n" IDS_VIRT_MEM_INUSE, "Mmoire virtuelle: Utilise : %s Mo\n" IDS_PAGEFILE_LOC, "Emplacement(s) des fichiers d'change : %s" -IDS_DOMINE, "Domaine : %s\n" +IDS_DOMAIN, "Domaine : %s\n" IDS_NETWORK_CARDS, "Carte(s) rseau %u installe(s).\n" END diff --git a/rosapps/applications/sysutils/systeminfo/lang/no-NO.rc b/rosapps/applications/sysutils/systeminfo/lang/no-NO.rc index e4e49667182..7f92fe924a3 100644 --- a/rosapps/applications/sysutils/systeminfo/lang/no-NO.rc +++ b/rosapps/applications/sysutils/systeminfo/lang/no-NO.rc @@ -37,7 +37,7 @@ IDS_REG_OWNER, "Registert eier: %s\n" IDS_REG_ORG, "Registerert organisasjon: %s\n" IDS_PRODUCT_ID, "Produkt ID: %s\n" IDS_INST_DATE, "Installert dato: %s\n" -IDS_UP_TIME, "System Up Time: %u Days, %u Hours, %u, Minutes, %u Seconds\n" +IDS_UP_TIME, "System Up Time: %u Days, %u Hours, %u Minutes, %u Seconds\n" IDS_SYS_MANUFACTURER, "System Manufacturer: %s\n" IDS_SYS_MODEL, "System Model: %s\n" IDS_SYS_TYPE, "Systemtype: %s\n" @@ -56,7 +56,7 @@ IDS_VIRT_MEM_MAX, "Virtuelt minne: Maks St IDS_VIRT_MEM_AVAIL, "Virtuelt minne: Tilgjengelig: %s MB\n" IDS_VIRT_MEM_INUSE, "Virtuelt minne: i bruk: %s MB\n" IDS_PAGEFILE_LOC, "Sidevekslingsfil lokalsjon(er): %s\n" -IDS_DOMINE, "Domene: %s\n" +IDS_DOMAIN, "Domene: %s\n" IDS_NETWORK_CARDS, "Nettverkskort(er) %u installert.\n" END diff --git a/rosapps/applications/sysutils/systeminfo/lang/pl-PL.rc b/rosapps/applications/sysutils/systeminfo/lang/pl-PL.rc index 749a63fc5d9..fc92954bd17 100644 --- a/rosapps/applications/sysutils/systeminfo/lang/pl-PL.rc +++ b/rosapps/applications/sysutils/systeminfo/lang/pl-PL.rc @@ -44,7 +44,7 @@ IDS_REG_OWNER, "U IDS_REG_ORG, "Organizacja: %s\n" IDS_PRODUCT_ID, "ID produktu: %s\n" IDS_INST_DATE, "Data instalacji: %s\n" -IDS_UP_TIME, "System Up Time: %u Days, %u Hours, %u, Minutes, %u Seconds\n" +IDS_UP_TIME, "Czas pracy systemu: %u dni, %u godzin, %u minut, %u sekund\n" IDS_SYS_MANUFACTURER, "Producent systemu: %s\n" IDS_SYS_MODEL, "Model systemu: %s\n" IDS_SYS_TYPE, "Rodzaj systemu: %s\n" @@ -63,7 +63,7 @@ IDS_VIRT_MEM_MAX, "Pami IDS_VIRT_MEM_AVAIL, "Pamici wirtualnej: dostpne: %s MB\n" IDS_VIRT_MEM_INUSE, "Pamici wirtualnej: w uyciu: %s MB\n" IDS_PAGEFILE_LOC, "Lokalizacja pliku wymiany: %s\n" -IDS_DOMINE, "Domena: %s\n" +IDS_DOMAIN, "Domena: %s\n" IDS_NETWORK_CARDS, "Liczba kart sieciowych %u.\n" END diff --git a/rosapps/applications/sysutils/systeminfo/lang/sk-SK.rc b/rosapps/applications/sysutils/systeminfo/lang/sk-SK.rc index f53414670f2..474373b7744 100644 --- a/rosapps/applications/sysutils/systeminfo/lang/sk-SK.rc +++ b/rosapps/applications/sysutils/systeminfo/lang/sk-SK.rc @@ -41,7 +41,7 @@ IDS_REG_OWNER, "Registovan IDS_REG_ORG, "Registrovan organizcia: %s\n" IDS_PRODUCT_ID, "ID produktu: %s\n" IDS_INST_DATE, "Dtum intalcie: %s\n" -IDS_UP_TIME, "System Up Time: %u Days, %u Hours, %u, Minutes, %u Seconds\n" +IDS_UP_TIME, "System Up Time: %u Days, %u Hours, %u Minutes, %u Seconds\n" IDS_SYS_MANUFACTURER, "System Manufacturer: %s\n" IDS_SYS_MODEL, "System Model: %s\n" IDS_SYS_TYPE, "Typ systmu: %s\n" @@ -60,7 +60,7 @@ IDS_VIRT_MEM_MAX, "Virtu IDS_VIRT_MEM_AVAIL, "Virtulna pam: Available: %s MB\n" IDS_VIRT_MEM_INUSE, "Virtulna pam: In Use: %s MB\n" IDS_PAGEFILE_LOC, "Umiestnenie(a) strnkovacieho sboru: %s\n" -IDS_DOMINE, "Domna: %s\n" +IDS_DOMAIN, "Domna: %s\n" IDS_NETWORK_CARDS, "Sieov karta(y) %u naintalovan.\n" END diff --git a/rosapps/applications/sysutils/systeminfo/lang/uk-UA.rc b/rosapps/applications/sysutils/systeminfo/lang/uk-UA.rc index eccf833302e..a0c8f57674f 100644 --- a/rosapps/applications/sysutils/systeminfo/lang/uk-UA.rc +++ b/rosapps/applications/sysutils/systeminfo/lang/uk-UA.rc @@ -45,7 +45,7 @@ IDS_REG_OWNER, " IDS_REG_ORG, " : %s\n" IDS_PRODUCT_ID, "ID : %s\n" IDS_INST_DATE, " : %s\n" -IDS_UP_TIME, "System Up Time: %u Days, %u Hours, %u, Minutes, %u Seconds\n" +IDS_UP_TIME, "System Up Time: %u Days, %u Hours, %u Minutes, %u Seconds\n" IDS_SYS_MANUFACTURER, "System Manufacturer: %s\n" IDS_SYS_MODEL, "System Model: %s\n" IDS_SYS_TYPE, " : %s\n" @@ -64,7 +64,7 @@ IDS_VIRT_MEM_MAX, "³ IDS_VIRT_MEM_AVAIL, "³ ': : %s \n" IDS_VIRT_MEM_INUSE, "³ ': .: %s \n" IDS_PAGEFILE_LOC, " : %s\n" -IDS_DOMINE, ": %s\n" +IDS_DOMAIN, ": %s\n" IDS_NETWORK_CARDS, " () %u Installed.\n" END diff --git a/rosapps/applications/sysutils/systeminfo/resource.h b/rosapps/applications/sysutils/systeminfo/resource.h index da4408392a0..c50f3bd74e8 100644 --- a/rosapps/applications/sysutils/systeminfo/resource.h +++ b/rosapps/applications/sysutils/systeminfo/resource.h @@ -27,5 +27,5 @@ #define IDS_VIRT_MEM_INUSE 125 #define IDS_PAGEFILE_LOC 126 #define IDS_TIME_ZONE 127 -#define IDS_DOMINE 128 +#define IDS_DOMAIN 128 #define IDS_NETWORK_CARDS 130 diff --git a/rosapps/applications/sysutils/systeminfo/systeminfo.c b/rosapps/applications/sysutils/systeminfo/systeminfo.c index 1e911ded3ce..3f8d354f49a 100644 --- a/rosapps/applications/sysutils/systeminfo/systeminfo.c +++ b/rosapps/applications/sysutils/systeminfo/systeminfo.c @@ -16,13 +16,15 @@ /* Copyright (C) 2007, Dmitry Chapyshev */ /* Copyright (C) 2011, Rafal Harabien */ +#include #include #include #include #include #include -#include #include +#include +#include #include "resource.h" @@ -31,68 +33,64 @@ /* Load from resource and convert to OEM */ static BOOL -GetOemStrings(UINT rcID, LPTSTR OutMsg) +GetOemStrings(UINT rcID, LPWSTR OutMsg) { - TCHAR Msg[BUFFER_SIZE]; - - if (LoadString(GetModuleHandle(NULL), rcID, (LPTSTR)Msg, BUFFER_SIZE)) - { - CharToOem(Msg, OutMsg); + if (LoadStringW(GetModuleHandle(NULL), rcID, OutMsg, BUFFER_SIZE)) return TRUE; - } + return FALSE; } /* Load data from registry */ static BOOL -RegGetSZ(HKEY hKey, LPCTSTR lpSubKey, LPCTSTR lpValueName, LPTSTR Buf) +RegGetSZ(HKEY hKey, LPCWSTR lpSubKey, LPCWSTR lpValueName, LPWSTR Buf) { - DWORD dwBytes = BUFFER_SIZE*sizeof(TCHAR), dwType; + DWORD dwBytes = BUFFER_SIZE*sizeof(WCHAR), dwType; BOOL bRet = TRUE; - + /* If SubKy is specified open it */ - if (lpSubKey && RegOpenKeyEx(hKey, - lpSubKey, - 0, - KEY_QUERY_VALUE, - &hKey) != ERROR_SUCCESS) + if (lpSubKey && RegOpenKeyExW(hKey, + lpSubKey, + 0, + KEY_QUERY_VALUE, + &hKey) != ERROR_SUCCESS) { - //_tprintf("Warning! Cannot open %s. Last error: %lu.\n", lpSubKey, GetLastError()); + //wprintf("Warning! Cannot open %s. Last error: %lu.\n", lpSubKey, GetLastError()); return FALSE; } - if (RegQueryValueEx(hKey, - lpValueName, - NULL, - &dwType, - (LPBYTE)Buf, - &dwBytes) != ERROR_SUCCESS || (dwType != REG_SZ && dwType != REG_MULTI_SZ)) + if (RegQueryValueExW(hKey, + lpValueName, + NULL, + &dwType, + (LPBYTE)Buf, + &dwBytes) != ERROR_SUCCESS || (dwType != REG_SZ && dwType != REG_MULTI_SZ)) { - //_tprintf("Warning! Cannot query %s. Last error: %lu, type: %lu.\n", lpValueName, GetLastError(), dwType); + //wprintf("Warning! Cannot query %s. Last error: %lu, type: %lu.\n", lpValueName, GetLastError(), dwType); dwBytes = 0; bRet = FALSE; } - + /* Close key if we opened it */ if (lpSubKey) RegCloseKey(hKey); - + /* NULL-terminate string */ - Buf[min(BUFFER_SIZE-1, dwBytes/sizeof(TCHAR))] = TEXT('\0'); - + Buf[min(BUFFER_SIZE-1, dwBytes/sizeof(WCHAR))] = L'\0'; + return bRet; } static BOOL -RegGetDWORD(HKEY hKey, LPCTSTR lpSubKey, LPCTSTR lpValueName, LPDWORD lpData) +RegGetDWORD(HKEY hKey, LPCWSTR lpSubKey, LPCWSTR lpValueName, LPDWORD lpData) { DWORD dwBytes = sizeof(*lpData), dwType; BOOL bRet = TRUE; /* If SubKy is specified open it */ - if (lpSubKey && RegOpenKeyEx(hKey, + if (lpSubKey && RegOpenKeyExW(hKey, lpSubKey, 0, KEY_QUERY_VALUE, @@ -101,54 +99,53 @@ RegGetDWORD(HKEY hKey, LPCTSTR lpSubKey, LPCTSTR lpValueName, LPDWORD lpData) return FALSE; } - if (RegQueryValueEx(hKey, - lpValueName, - NULL, - &dwType, - (LPBYTE)lpData, - &dwBytes) != ERROR_SUCCESS || dwType != REG_DWORD) + if (RegQueryValueExW(hKey, + lpValueName, + NULL, + &dwType, + (LPBYTE)lpData, + &dwBytes) != ERROR_SUCCESS || dwType != REG_DWORD) { - //_tprintf("Warning! Cannot query %s. Last err: %lu, type: %lu\n", lpValueName, GetLastError(), dwType); + //wprintf("Warning! Cannot query %s. Last err: %lu, type: %lu\n", lpValueName, GetLastError(), dwType); *lpData = 0; bRet = FALSE; } - + /* Close key if we opened it */ if (lpSubKey) RegCloseKey(hKey); - + return bRet; } static void -FormatBytes(LPTSTR Buf, unsigned cBytes) +FormatBytes(LPWSTR Buf, unsigned cBytes) { - TCHAR szMB[32], Tmp[BUFFER_SIZE]; - NUMBERFMT fmt; - - itoa(cBytes / (1024*1024), szMB, 10); - + WCHAR szMB[32]; + NUMBERFMTW fmt; + + _itow(cBytes / (1024*1024), szMB, 10); + fmt.NumDigits = 0; fmt.LeadingZero = 0; fmt.Grouping = 3; - fmt.lpDecimalSep = TEXT(""); - fmt.lpThousandSep = TEXT(" "); + fmt.lpDecimalSep = L""; + fmt.lpThousandSep = L" "; fmt.NegativeOrder = 0; - if(!GetNumberFormat(LOCALE_SYSTEM_DEFAULT, 0, szMB, &fmt, Tmp, BUFFER_SIZE)) - printf("Error! GetNumberFormat failed.\n"); - - CharToOem(Tmp, Buf); + + if(!GetNumberFormatW(LOCALE_SYSTEM_DEFAULT, 0, szMB, &fmt, Buf, BUFFER_SIZE)) + wprintf(L"Error! GetNumberFormat failed.\n"); } static void -FormatDateTime(time_t Time, LPTSTR lpBuf) +FormatDateTime(time_t Time, LPWSTR lpBuf) { unsigned cchBuf = BUFFER_SIZE, i; SYSTEMTIME SysTime; const struct tm *lpTm; - + lpTm = localtime(&Time); SysTime.wYear = (WORD)(1900 + lpTm->tm_year); SysTime.wMonth = (WORD)(1 + lpTm->tm_mon); @@ -158,12 +155,15 @@ FormatDateTime(time_t Time, LPTSTR lpBuf) SysTime.wMinute = (WORD)lpTm->tm_min; SysTime.wSecond = (WORD)lpTm->tm_sec; SysTime.wMilliseconds = 0; - - i = GetDateFormat(LOCALE_SYSTEM_DEFAULT, 0, &SysTime, NULL, lpBuf, cchBuf); + + /* Time first */ + i = GetDateFormatW(LOCALE_SYSTEM_DEFAULT, 0, &SysTime, NULL, lpBuf, cchBuf); if (i) --i; /* don't count NULL character */ - i += _stprintf(lpBuf + i, TEXT(", ")); - GetTimeFormat(LOCALE_SYSTEM_DEFAULT, 0, &SysTime, NULL, lpBuf + i, cchBuf - i); + + /* Time now */ + i += swprintf(lpBuf + i, L", "); + GetTimeFormatW(LOCALE_SYSTEM_DEFAULT, 0, &SysTime, NULL, lpBuf + i, cchBuf - i); } /* Show usage */ @@ -171,10 +171,10 @@ static VOID Usage(VOID) { - TCHAR Buf[BUFFER_SIZE]; - + WCHAR Buf[BUFFER_SIZE]; + if(GetOemStrings(IDS_USAGE, Buf)) - _tprintf("%s", Buf); + wprintf(L"%s", Buf); } /* Print all system information */ @@ -182,18 +182,20 @@ VOID AllSysInfo(VOID) { DWORD dwCharCount = BUFFER_SIZE, dwTimestamp; - OSVERSIONINFO VersionInfo; + OSVERSIONINFOW VersionInfo; SYSTEM_INFO SysInfo; - TCHAR Buf[BUFFER_SIZE], Tmp[BUFFER_SIZE], Msg[BUFFER_SIZE], szSystemDir[MAX_PATH]; - const TCHAR *lpcszSysType; + WCHAR Buf[BUFFER_SIZE], Tmp[BUFFER_SIZE], Msg[BUFFER_SIZE], szSystemDir[MAX_PATH]; + const WCHAR *lpcszSysType; + LPWSTR lpNetBuffer; + NETSETUP_JOIN_STATUS NetJoinStatus; MEMORYSTATUS MemoryStatus; unsigned int cSeconds; TIME_ZONE_INFORMATION TimeZoneInfo; HKEY hKey; - if (!GetSystemDirectory(szSystemDir, sizeof(szSystemDir)/sizeof(szSystemDir[0]))) + if (!GetSystemDirectoryW(szSystemDir, sizeof(szSystemDir)/sizeof(szSystemDir[0]))) { - _tprintf("Error! GetSystemDirectory failed.\n"); + wprintf(L"Error! GetSystemDirectory failed.\n"); return; } @@ -201,34 +203,34 @@ AllSysInfo(VOID) // getting computer name dwCharCount = BUFFER_SIZE; - if (!GetComputerName(Buf, &dwCharCount)) - _tprintf("Error! GetComputerName failed.\n"); + if (!GetComputerNameW(Buf, &dwCharCount)) + wprintf(L"Error! GetComputerName failed.\n"); else if (GetOemStrings(IDS_HOST_NAME, Msg)) - _tprintf(Msg, Buf); + wprintf(Msg, Buf); // open CurrentVersion key - if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, - TEXT("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion"), + if(RegOpenKeyExW(HKEY_LOCAL_MACHINE, + L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion", 0, KEY_QUERY_VALUE, &hKey) != ERROR_SUCCESS) { - _tprintf("Error! RegOpenKeyEx failed.\n"); + wprintf(L"Error! RegOpenKeyEx failed.\n"); return; } //getting OS Name - RegGetSZ(hKey, NULL, TEXT("ProductName"), Buf); + RegGetSZ(hKey, NULL, L"ProductName", Buf); if (GetOemStrings(IDS_OS_NAME, Msg)) - _tprintf(Msg, Buf); + wprintf(Msg, Buf); //getting OS Version ZeroMemory(&VersionInfo, sizeof(VersionInfo)); VersionInfo.dwOSVersionInfoSize = sizeof(VersionInfo); - GetVersionEx(&VersionInfo); + GetVersionExW(&VersionInfo); if (GetOemStrings(IDS_OS_VERSION, Msg)) - _tprintf(Msg, + wprintf(Msg, (unsigned)VersionInfo.dwMajorVersion, (unsigned)VersionInfo.dwMinorVersion, (unsigned)VersionInfo.dwBuildNumber, @@ -240,30 +242,30 @@ AllSysInfo(VOID) //getting OS Configuration //getting OS Build Type - RegGetSZ(hKey, NULL, TEXT("CurrentType"), Buf); + RegGetSZ(hKey, NULL, L"CurrentType", Buf); if (GetOemStrings(IDS_OS_BUILD_TYPE, Msg)) - _tprintf(Msg, Buf); + wprintf(Msg, Buf); //getting Registered Owner - RegGetSZ(hKey, NULL, TEXT("RegisteredOwner"), Buf); + RegGetSZ(hKey, NULL, L"RegisteredOwner", Buf); if (GetOemStrings(IDS_REG_OWNER, Msg)) - _tprintf(Msg, Buf); + wprintf(Msg, Buf); //getting Registered Organization - RegGetSZ(hKey, NULL, TEXT("RegisteredOrganization"), Buf); + RegGetSZ(hKey, NULL, L"RegisteredOrganization", Buf); if (GetOemStrings(IDS_REG_ORG, Msg)) - _tprintf(Msg, Buf); + wprintf(Msg, Buf); //getting Product ID - RegGetSZ(hKey, NULL, TEXT("ProductId"), Buf); + RegGetSZ(hKey, NULL, L"ProductId", Buf); if (GetOemStrings(IDS_PRODUCT_ID, Msg)) - _tprintf(Msg, Buf); + wprintf(Msg, Buf); //getting Install Date - RegGetDWORD(hKey, NULL, TEXT("InstallDate"), &dwTimestamp); + RegGetDWORD(hKey, NULL, L"InstallDate", &dwTimestamp); FormatDateTime((time_t)dwTimestamp, Buf); if (GetOemStrings(IDS_INST_DATE, Msg)) - _tprintf(Msg, Buf); + wprintf(Msg, Buf); // close Current Version key now RegCloseKey(hKey); @@ -271,115 +273,115 @@ AllSysInfo(VOID) //getting System Up Time cSeconds = GetTickCount() / 1000; if (GetOemStrings(IDS_UP_TIME, Msg)) - _tprintf(Msg, cSeconds / (60*60*24), (cSeconds / (60*60)) % 24, (cSeconds / 60) % 60, cSeconds % 60); + wprintf(Msg, cSeconds / (60*60*24), (cSeconds / (60*60)) % 24, (cSeconds / 60) % 60, cSeconds % 60); //getting System Manufacturer; HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\OEMInformation\Manufacturer for Win >= 6.0 - sprintf(Tmp, "%s\\oeminfo.ini", szSystemDir); - GetPrivateProfileString(TEXT("General"), - TEXT("Manufacturer"), - TEXT("To Be Filled By O.E.M."), - Buf, - sizeof(Buf)/sizeof(Buf[0]), - Tmp); + swprintf(Tmp, L"%s\\oeminfo.ini", szSystemDir); + GetPrivateProfileStringW(L"General", + L"Manufacturer", + L"To Be Filled By O.E.M.", + Buf, + sizeof(Buf)/sizeof(Buf[0]), + Tmp); if (GetOemStrings(IDS_SYS_MANUFACTURER, Msg)) - _tprintf(Msg, Buf); + wprintf(Msg, Buf); //getting System Model; HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\OEMInformation\Model for Win >= 6.0 - GetPrivateProfileString(TEXT("General"), - TEXT("Model"), - TEXT("To Be Filled By O.E.M."), - Buf, - sizeof(Buf)/sizeof(Buf[0]), - Tmp); + GetPrivateProfileStringW(L"General", + L"Model", + L"To Be Filled By O.E.M.", + Buf, + sizeof(Buf)/sizeof(Buf[0]), + Tmp); if (GetOemStrings(IDS_SYS_MODEL, Msg)) - _tprintf(Msg, Buf); + wprintf(Msg, Buf); //getting System type switch (SysInfo.wProcessorArchitecture) { case PROCESSOR_ARCHITECTURE_INTEL: - lpcszSysType = TEXT("X86-based PC"); + lpcszSysType = L"X86-based PC"; break; case PROCESSOR_ARCHITECTURE_IA64: - lpcszSysType = TEXT("IA64-based PC"); + lpcszSysType = L"IA64-based PC"; break; case PROCESSOR_ARCHITECTURE_AMD64: - lpcszSysType = TEXT("AMD64-based PC"); + lpcszSysType = L"AMD64-based PC"; break; default: - lpcszSysType = TEXT("Unknown"); + lpcszSysType = L"Unknown"; break; } if (GetOemStrings(IDS_SYS_TYPE, Msg)) - _tprintf(Msg, lpcszSysType); + wprintf(Msg, lpcszSysType); //getting Processor(s) if (GetOemStrings(IDS_PROCESSORS, Msg)) { unsigned int i; - _tprintf(Msg, (unsigned int)SysInfo.dwNumberOfProcessors); + wprintf(Msg, (unsigned int)SysInfo.dwNumberOfProcessors); for(i = 0; i < (unsigned int)SysInfo.dwNumberOfProcessors; i++) { - sprintf(Tmp, "HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\%u",i); + swprintf(Tmp, L"HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\%u", i); - RegGetSZ(HKEY_LOCAL_MACHINE, Tmp, TEXT("Identifier"), Buf); - _tprintf(" [%02u]: %s", i+1, Buf); + RegGetSZ(HKEY_LOCAL_MACHINE, Tmp, L"Identifier", Buf); + wprintf(L" [%02u]: %s", i+1, Buf); - RegGetSZ(HKEY_LOCAL_MACHINE, Tmp, TEXT("VendorIdentifier"), Buf); - _tprintf(" %s\n", Buf); + RegGetSZ(HKEY_LOCAL_MACHINE, Tmp, L"VendorIdentifier", Buf); + wprintf(L" %s\n", Buf); } } //getting BIOS Version RegGetSZ(HKEY_LOCAL_MACHINE, - TEXT("HARDWARE\\DESCRIPTION\\System"), - TEXT("SystemBiosVersion"), + L"HARDWARE\\DESCRIPTION\\System", + L"SystemBiosVersion", Buf); if (GetOemStrings(IDS_BIOS_VERSION, Msg)) - _tprintf(Msg, Buf); + wprintf(Msg, Buf); //gettings BIOS date RegGetSZ(HKEY_LOCAL_MACHINE, - TEXT("HARDWARE\\DESCRIPTION\\System"), - TEXT("SystemBiosDate"), + L"HARDWARE\\DESCRIPTION\\System", + L"SystemBiosDate", Buf); if (GetOemStrings(IDS_BIOS_DATE, Msg)) - _tprintf(Msg, Buf); + wprintf(Msg, Buf); //getting ReactOS Directory - if (!GetWindowsDirectory(Buf, BUFFER_SIZE)) - _tprintf("Error! GetWindowsDirectory failed."); + if (!GetWindowsDirectoryW(Buf, BUFFER_SIZE)) + wprintf(L"Error! GetWindowsDirectory failed."); else if (GetOemStrings(IDS_ROS_DIR, Msg)) - _tprintf(Msg, Buf); + wprintf(Msg, Buf); //getting System Directory if (GetOemStrings(IDS_SYS_DIR, Msg)) - _tprintf(Msg, szSystemDir); + wprintf(Msg, szSystemDir); //getting Boot Device RegGetSZ(HKEY_LOCAL_MACHINE, - TEXT("SYSTEM\\Setup"), - TEXT("SystemPartition"), + L"SYSTEM\\Setup", + L"SystemPartition", Buf); if (GetOemStrings(IDS_BOOT_DEV, Msg)) - _tprintf(Msg, Buf); + wprintf(Msg, Buf); //getting System Locale if (RegGetSZ(HKEY_CURRENT_USER, - TEXT("Control Panel\\International"), - TEXT("Locale"), + L"Control Panel\\International", + L"Locale", Tmp)) if (RegGetSZ(HKEY_CLASSES_ROOT, - TEXT("MIME\\Database\\Rfc1766"), + L"MIME\\Database\\Rfc1766", Tmp, Buf)) if (GetOemStrings(IDS_SYS_LOCALE, Msg)) - _tprintf(Msg, Buf); + wprintf(Msg, Buf); //getting Input Locale if (RegGetSZ(HKEY_CURRENT_USER, - TEXT("Keyboard Layout\\Preload"), - TEXT("1"), + L"Keyboard Layout\\Preload", + L"1", Buf)) { int i, j; @@ -388,84 +390,74 @@ AllSysInfo(VOID) Tmp[j] = Buf[i]; if (RegGetSZ(HKEY_CLASSES_ROOT, - TEXT("MIME\\Database\\Rfc1766"), + L"MIME\\Database\\Rfc1766", Tmp, Buf)) if (GetOemStrings(IDS_INPUT_LOCALE, Msg)) - _tprintf(Msg, Buf); + wprintf(Msg, Buf); } //getting Time Zone GetTimeZoneInformation(&TimeZoneInfo); - + /* Open Time Zones key */ - if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, - TEXT("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Time Zones"), - 0, - KEY_ENUMERATE_SUB_KEYS|KEY_READ, - &hKey) == ERROR_SUCCESS) + if(RegOpenKeyExW(HKEY_LOCAL_MACHINE, + L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Time Zones", + 0, + KEY_ENUMERATE_SUB_KEYS|KEY_READ, + &hKey) == ERROR_SUCCESS) { unsigned i; - + /* Find current timezone */ dwCharCount = 256; // Windows seems to have a bug - it doesnt accept BUFFER_SIZE here - for(i = 0; RegEnumKeyEx(hKey, i, Tmp, &dwCharCount, NULL, NULL, NULL, NULL) == ERROR_SUCCESS; ++i, dwCharCount = 255) + for(i = 0; RegEnumKeyExW(hKey, i, Tmp, &dwCharCount, NULL, NULL, NULL, NULL) == ERROR_SUCCESS; ++i, dwCharCount = 255) { -#ifdef _UNICODE - RegGetSZ(hKey, Tmp, TEXT("Std"), Buf); - - if(!wcscmp(wBuf, TimeZoneInfo.StandardName)) -#else - wchar_t wBuf[BUFFER_SIZE]; + RegGetSZ(hKey, Tmp, L"Std", Buf); - RegGetSZ(hKey, Tmp, TEXT("Std"), Buf); - mbstowcs(wBuf, Buf, BUFFER_SIZE); - - if(!wcscmp(wBuf, TimeZoneInfo.StandardName)) -#endif + if(!wcscmp(Buf, TimeZoneInfo.StandardName)) { - RegGetSZ(hKey, Tmp, TEXT("Display"), Buf); + RegGetSZ(hKey, Tmp, L"Display", Buf); if (GetOemStrings(IDS_TIME_ZONE, Msg)) - _tprintf(Msg, Buf); + wprintf(Msg, Buf); break; } } RegCloseKey(hKey); } - - + //getting Total Physical Memory GlobalMemoryStatus(&MemoryStatus); FormatBytes(Buf, MemoryStatus.dwTotalPhys); if (GetOemStrings(IDS_TOTAL_PHYS_MEM, Msg)) - _tprintf(Msg, Buf); + wprintf(Msg, Buf); //getting Available Physical Memory FormatBytes(Buf, MemoryStatus.dwAvailPhys); if (GetOemStrings(IDS_AVAIL_PHISICAL_MEM,Msg)) - _tprintf(Msg, Buf); + wprintf(Msg, Buf); //getting Virtual Memory: Max Size FormatBytes(Buf, MemoryStatus.dwTotalVirtual); if (GetOemStrings(IDS_VIRT_MEM_MAX, Msg)) - _tprintf(Msg, Buf); + wprintf(Msg, Buf); //getting Virtual Memory: Available FormatBytes(Buf, MemoryStatus.dwAvailVirtual); if (GetOemStrings(IDS_VIRT_MEM_AVAIL, Msg)) - _tprintf(Msg, Buf); + wprintf(Msg, Buf); //getting Virtual Memory: In Use FormatBytes(Buf, MemoryStatus.dwTotalVirtual-MemoryStatus.dwAvailVirtual); if (GetOemStrings(IDS_VIRT_MEM_INUSE, Msg)) - _tprintf(Msg, Buf); + wprintf(Msg, Buf); //getting Page File Location(s) if (RegGetSZ(HKEY_LOCAL_MACHINE, - TEXT("SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Memory Management"), - TEXT("PagingFiles"), + L"SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Memory Management", + L"PagingFiles", Buf)) { int i; @@ -478,18 +470,19 @@ AllSysInfo(VOID) break; } } - + if(GetOemStrings(IDS_PAGEFILE_LOC, Msg)) - _tprintf(Msg, Buf); + wprintf(Msg, Buf); } //getting Domain - if (RegGetSZ(HKEY_LOCAL_MACHINE, - TEXT("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon"), - TEXT("CachePrimaryDomain"), - Buf)) - if(GetOemStrings(IDS_DOMINE, Msg)) - _tprintf(Msg, Buf); + if (NetGetJoinInformation (NULL, &lpNetBuffer, &NetJoinStatus) == NERR_Success) + { + if(GetOemStrings(IDS_DOMAIN, Msg)) + wprintf(Msg, lpNetBuffer); + + NetApiBufferFree(lpNetBuffer); + } //getting Logon Server @@ -504,6 +497,8 @@ AllSysInfo(VOID) int main(int argc, char *argv[]) { + setlocale(LC_ALL, ""); + if (argc > 1 && (!strcmp(argv[1], "/?") || !strcmp(argv[1], "-?"))) { Usage(); diff --git a/rosapps/applications/sysutils/systeminfo/systeminfo.rbuild b/rosapps/applications/sysutils/systeminfo/systeminfo.rbuild index 56a855f263f..5779bd1f911 100644 --- a/rosapps/applications/sysutils/systeminfo/systeminfo.rbuild +++ b/rosapps/applications/sysutils/systeminfo/systeminfo.rbuild @@ -2,6 +2,7 @@ user32 ntdll advapi32 + netapi32 systeminfo.c systeminfo.rc rsrc.rc From 542a951d464e2f20cf2b65b1a768135060121524 Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Sat, 2 Apr 2011 15:15:08 +0000 Subject: [PATCH 053/317] [TEE] - TEE should overwrite existing file - Patch by vins8920 hotmail See issue #6022 for more details. svn path=/trunk/; revision=51226 --- rosapps/applications/cmdutils/tee/tee.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rosapps/applications/cmdutils/tee/tee.c b/rosapps/applications/cmdutils/tee/tee.c index 0d244fa3038..149f8486d0c 100644 --- a/rosapps/applications/cmdutils/tee/tee.c +++ b/rosapps/applications/cmdutils/tee/tee.c @@ -154,7 +154,7 @@ INT main (int argc,char **p) //l=0; hFile[i] = CreateFile(files[i],GENERIC_WRITE, 0,NULL, - OPEN_ALWAYS, + CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL,NULL); if (hFile[i] == INVALID_HANDLE_VALUE) From 91e657f78287f7faa36440143ef376a21e74a36c Mon Sep 17 00:00:00 2001 From: Ged Murphy Date: Sat, 2 Apr 2011 15:22:48 +0000 Subject: [PATCH 054/317] {FULLFAT] - Update FullFat to the latest stable release (1.0.5) - I'm awaiting a reply from James as to when 1.1.0 will be released as it have some nice improvements. svn path=/trunk/; revision=51227 --- .../include/reactos/libs/fullfat/ff_config.h | 15 +- reactos/include/reactos/libs/fullfat/ff_dir.h | 2 +- reactos/include/reactos/libs/fullfat/ff_fat.h | 2 +- .../include/reactos/libs/fullfat/ff_fatdef.h | 90 +++++++++ .../include/reactos/libs/fullfat/ff_ioman.h | 19 +- .../include/reactos/libs/fullfat/ff_memory.h | 118 +++++++++++- .../include/reactos/libs/fullfat/fullfat.h | 8 + reactos/lib/3rdparty/fullfat/ff_dir.c | 1 - reactos/lib/3rdparty/fullfat/ff_dir.h | 2 +- reactos/lib/3rdparty/fullfat/ff_fat.c | 28 ++- reactos/lib/3rdparty/fullfat/ff_file.c | 52 ++++- reactos/lib/3rdparty/fullfat/ff_hash.c | 4 +- reactos/lib/3rdparty/fullfat/ff_ioman.c | 179 ++++++++++++------ reactos/lib/3rdparty/fullfat/ff_memory.c | 106 ++++------- 14 files changed, 456 insertions(+), 170 deletions(-) create mode 100644 reactos/include/reactos/libs/fullfat/ff_fatdef.h diff --git a/reactos/include/reactos/libs/fullfat/ff_config.h b/reactos/include/reactos/libs/fullfat/ff_config.h index f81c79ac7c9..4588ef9c305 100644 --- a/reactos/include/reactos/libs/fullfat/ff_config.h +++ b/reactos/include/reactos/libs/fullfat/ff_config.h @@ -74,13 +74,24 @@ // within the same path. E.g. a copy \dir1\*.* \dir2\*.* command. // This command requires FF_MAX_PATH number of bytes of memory. (Defined below, default 2600). +//---------- BLKDEV USES SEMAPHORE +#define FF_BLKDEV_USES_SEM // When defined, each call to fnReadBlocks and fnWriteBlocks will be done while semaphore is locked + // See also ff_safety.c + // (HT addition) + #define FF_PATH_CACHE_DEPTH 2 // The Number of PATH's to Cache. //---------- DON'T USE MALLOC //#define FF_NO_MALLOC -//---------- DON'T +#define FF_MALLOC(aSize) malloc(aSize) +#define FF_FREE(apPtr) free(apPtr) + +//#define FF_INLINE_MEMORY_ACCESS + +//#define FF_INLINE static __forceinline // Keywords to inline functions (Windows) +#define FF_INLINE static inline // Standard for GCC //---------- Hash Table Support @@ -117,7 +128,7 @@ //---------- AUTOMATIC SETTINGS DO NOT EDIT -- These configure your options from above, and check sanity! #ifdef FF_LFN_SUPPORT -#define FF_MAX_FILENAME 260 +#define FF_MAX_FILENAME (129) #else #define FF_MAX_FILENAME 13 #endif diff --git a/reactos/include/reactos/libs/fullfat/ff_dir.h b/reactos/include/reactos/libs/fullfat/ff_dir.h index 7415eac06e6..41eb7278f8d 100644 --- a/reactos/include/reactos/libs/fullfat/ff_dir.h +++ b/reactos/include/reactos/libs/fullfat/ff_dir.h @@ -43,7 +43,7 @@ #include "ff_ioman.h" #include "ff_blk.h" #include "ff_fat.h" -#include "fat.h" +#include "ff_fatdef.h" #include "ff_memory.h" #include "ff_time.h" #include "ff_hash.h" diff --git a/reactos/include/reactos/libs/fullfat/ff_fat.h b/reactos/include/reactos/libs/fullfat/ff_fat.h index 2e6ff6702b9..8add6d0132e 100644 --- a/reactos/include/reactos/libs/fullfat/ff_fat.h +++ b/reactos/include/reactos/libs/fullfat/ff_fat.h @@ -39,7 +39,7 @@ #define _FF_FAT_H_ #include "ff_config.h" -#include "fat.h" +#include "ff_fatdef.h" #include "ff_ioman.h" #include "ff_blk.h" #include "ff_types.h" diff --git a/reactos/include/reactos/libs/fullfat/ff_fatdef.h b/reactos/include/reactos/libs/fullfat/ff_fatdef.h new file mode 100644 index 00000000000..7fd7c3c5f6f --- /dev/null +++ b/reactos/include/reactos/libs/fullfat/ff_fatdef.h @@ -0,0 +1,90 @@ +/***************************************************************************** + * FullFAT - High Performance, Thread-Safe Embedded FAT File-System * + * Copyright (C) 2009 James Walmsley (james@worm.me.uk) * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + * IMPORTANT NOTICE: * + * ================= * + * Alternative Licensing is available directly from the Copyright holder, * + * (James Walmsley). For more information consult LICENSING.TXT to obtain * + * a Commercial license. * + * * + * See RESTRICTIONS.TXT for extra restrictions on the use of FullFAT. * + * * + * Removing the above notice is illegal and will invalidate this license. * + ***************************************************************************** + * See http://worm.me.uk/fullfat for more information. * + * Or http://fullfat.googlecode.com/ for latest releases and the wiki. * + *****************************************************************************/ +#ifndef _FF_FATDEF_H_ +#define _FF_FATDEF_H_ + +/* + This file defines offsets to various data for the FAT specification. +*/ + +// MBR / PBR Offsets + +#define FF_FAT_BYTES_PER_SECTOR 0x00B +#define FF_FAT_SECTORS_PER_CLUS 0x00D +#define FF_FAT_RESERVED_SECTORS 0x00E +#define FF_FAT_NUMBER_OF_FATS 0x010 +#define FF_FAT_ROOT_ENTRY_COUNT 0x011 +#define FF_FAT_16_TOTAL_SECTORS 0x013 +#define FF_FAT_32_TOTAL_SECTORS 0x020 +#define FF_FAT_16_SECTORS_PER_FAT 0x016 +#define FF_FAT_32_SECTORS_PER_FAT 0x024 +#define FF_FAT_ROOT_DIR_CLUSTER 0x02C + +#define FF_FAT_16_VOL_LABEL 0x02B +#define FF_FAT_32_VOL_LABEL 0x047 + +#define FF_FAT_PTBL 0x1BE +#define FF_FAT_PTBL_LBA 0x008 +#define FF_FAT_PTBL_ACTIVE 0x000 +#define FF_FAT_PTBL_ID 0x004 + +#define FF_FAT_MBR_SIGNATURE 0x1FE + +#define FF_FAT_DELETED 0xE5 + +// Directory Entry Offsets +#define FF_FAT_DIRENT_SHORTNAME 0x000 +#define FF_FAT_DIRENT_ATTRIB 0x00B +#define FF_FAT_DIRENT_CREATE_TIME 0x00E ///< Creation Time. +#define FF_FAT_DIRENT_CREATE_DATE 0x010 ///< Creation Date. +#define FF_FAT_DIRENT_LASTACC_DATE 0x012 ///< Date of Last Access. +#define FF_FAT_DIRENT_CLUS_HIGH 0x014 +#define FF_FAT_DIRENT_LASTMOD_TIME 0x016 ///< Time of Last modification. +#define FF_FAT_DIRENT_LASTMOD_DATE 0x018 ///< Date of Last modification. +#define FF_FAT_DIRENT_CLUS_LOW 0x01A +#define FF_FAT_DIRENT_FILESIZE 0x01C +#define FF_FAT_LFN_ORD 0x000 +#define FF_FAT_LFN_NAME_1 0x001 +#define FF_FAT_LFN_CHECKSUM 0x00D +#define FF_FAT_LFN_NAME_2 0x00E +#define FF_FAT_LFN_NAME_3 0x01C + +// Dirent Attributes +#define FF_FAT_ATTR_READONLY 0x01 +#define FF_FAT_ATTR_HIDDEN 0x02 +#define FF_FAT_ATTR_SYSTEM 0x04 +#define FF_FAT_ATTR_VOLID 0x08 +#define FF_FAT_ATTR_DIR 0x10 +#define FF_FAT_ATTR_ARCHIVE 0x20 +#define FF_FAT_ATTR_LFN 0x0F + +#endif + diff --git a/reactos/include/reactos/libs/fullfat/ff_ioman.h b/reactos/include/reactos/libs/fullfat/ff_ioman.h index 187ffa347f9..d59c10593cd 100644 --- a/reactos/include/reactos/libs/fullfat/ff_ioman.h +++ b/reactos/include/reactos/libs/fullfat/ff_ioman.h @@ -100,10 +100,10 @@ typedef struct { **/ typedef struct { FF_T_UINT32 Sector; ///< The LBA of the Cached sector. - FF_T_UINT8 Mode; ///< Read or Write mode. + FF_T_UINT32 LRU; ///< For the Least Recently Used algorithm. FF_T_UINT16 NumHandles; ///< Number of objects using this buffer. FF_T_UINT16 Persistance; ///< For the persistance algorithm. - FF_T_UINT32 LRU; ///< For the Least Recently Used algorithm. + FF_T_UINT8 Mode; ///< Read or Write mode. FF_T_BOOL Modified; ///< If the sector was modified since read. FF_T_BOOL Valid; ///< Initially FALSE. FF_T_UINT8 *pBuffer; ///< Pointer to the cache block. @@ -129,7 +129,7 @@ typedef struct { FF_T_UINT16 BlkSize; ///< Size of a Sector Block in bytes. FF_T_UINT8 BlkFactor; ///< Scale Factor for blocksizes above 512! //FF_T_INT8 Name[FF_MAX_PARTITION_NAME]; ///< Partition Identifier e.g. c: sd0: etc. - //FF_T_INT8 VolLabel[12]; ///< Volume Label of the partition. + FF_T_INT8 VolLabel[12]; ///< Volume Label of the partition. FF_T_UINT32 BeginLBA; ///< LBA start address of the partition. FF_T_UINT32 PartSize; ///< Size of Partition in number of sectors. FF_T_UINT32 FatBeginLBA; ///< LBA of the FAT tables. @@ -182,14 +182,15 @@ typedef struct { FF_BLK_DEVICE *pBlkDevice; ///< Pointer to a Block device description. FF_PARTITION *pPartition; ///< Pointer to a partition description. FF_BUFFER *pBuffers; ///< Pointer to the first buffer description. - FF_T_UINT32 LastReplaced; ///< Marks which sector was last replaced in the cache. - FF_T_UINT16 BlkSize; ///< The Block size that IOMAN is configured to. - FF_T_UINT8 *pCacheMem; ///< Pointer to a block of memory for the cache. - FF_T_UINT16 CacheSize; ///< Size of the cache in number of Sectors. - FF_T_UINT8 MemAllocation; ///< Bit-Mask identifying allocated pointers. - FF_T_UINT8 Locks; ///< Lock Flag for FAT & DIR Locking etc (This must be accessed via a semaphore). void *pSemaphore; ///< Pointer to a Semaphore object. (For buffer description modifications only!). void *FirstFile; ///< Pointer to the first File object. + FF_T_UINT8 *pCacheMem; ///< Pointer to a block of memory for the cache. + FF_T_UINT32 LastReplaced; ///< Marks which sector was last replaced in the cache. + FF_T_UINT16 BlkSize; ///< The Block size that IOMAN is configured to. + FF_T_UINT16 CacheSize; ///< Size of the cache in number of Sectors. + FF_T_UINT8 PreventFlush; ///< Flushing to disk only allowed when 0 + FF_T_UINT8 MemAllocation; ///< Bit-Mask identifying allocated pointers. + FF_T_UINT8 Locks; ///< Lock Flag for FAT & DIR Locking etc (This must be accessed via a semaphore). } FF_IOMAN; // Bit-Masks for Memory Allocation testing. diff --git a/reactos/include/reactos/libs/fullfat/ff_memory.h b/reactos/include/reactos/libs/fullfat/ff_memory.h index 1d4507c4a85..555a829210a 100644 --- a/reactos/include/reactos/libs/fullfat/ff_memory.h +++ b/reactos/include/reactos/libs/fullfat/ff_memory.h @@ -41,19 +41,119 @@ #include "ff_config.h" #include "ff_types.h" - +/* + HT changed type of aOffset to u32 +*/ //---------- PROTOTYPES -FF_T_UINT8 FF_getChar (FF_T_UINT8 *pBuffer, FF_T_UINT16 offset); -FF_T_UINT16 FF_getShort (FF_T_UINT8 *pBuffer, FF_T_UINT16 offset); -FF_T_UINT32 FF_getLong (FF_T_UINT8 *pBuffer, FF_T_UINT16 offset); +#if defined(FF_LITTLE_ENDIAN) -void FF_putChar (FF_T_UINT8 *pBuffer, FF_T_UINT16 offset, FF_T_UINT8 Value); -void FF_putShort (FF_T_UINT8 *pBuffer, FF_T_UINT16 offset, FF_T_UINT16 Value); -void FF_putLong (FF_T_UINT8 *pBuffer, FF_T_UINT16 offset, FF_T_UINT32 Value); +typedef struct { + FF_T_UINT8 u8_0; + FF_T_UINT8 u8_1; +} FF_T_SHORT; -void *FF_Malloc(FF_T_UINT32 allocSize); -void FF_Free(void *pBuffer); +typedef struct { + FF_T_UINT8 u8_0; + FF_T_UINT8 u8_1; + FF_T_UINT8 u8_2; + FF_T_UINT8 u8_3; +} FF_T_LONG; + +#elif defined(FF_BIG_ENDIAN) + +typedef struct { + FF_T_UINT8 u8_1; + FF_T_UINT8 u8_0; +} FF_T_SHORT; + +typedef struct { + FF_T_UINT8 u8_3; + FF_T_UINT8 u8_2; + FF_T_UINT8 u8_1; + FF_T_UINT8 u8_0; +} FF_T_LONG; + +#else + +#error Little or Big Endian? + +#endif + +//! 16-bit union. +typedef union { + FF_T_UINT16 u16; + FF_T_SHORT bytes; +} FF_T_UN16; + +//! 32-bit union. +typedef union { + FF_T_UINT32 u32; + FF_T_LONG bytes; +} FF_T_UN32; + +/* HT inlined these functions: + */ + +#ifdef FF_INLINE_MEMORY_ACCESS + +FF_INLINE FF_T_UINT8 FF_getChar(FF_T_UINT8 *pBuffer, FF_T_UINT32 aOffset) +{ + return (FF_T_UINT8) (pBuffer[aOffset]); +} + +FF_INLINE FF_T_UINT16 FF_getShort(FF_T_UINT8 *pBuffer, FF_T_UINT32 aOffset) +{ + FF_T_UN16 u16; + pBuffer += aOffset; + u16.bytes.u8_1 = pBuffer[1]; + u16.bytes.u8_0 = pBuffer[0]; + return u16.u16; +} + +FF_INLINE FF_T_UINT32 FF_getLong(FF_T_UINT8 *pBuffer, FF_T_UINT32 aOffset) { + FF_T_UN32 u32; + pBuffer += aOffset; + u32.bytes.u8_3 = pBuffer[3]; + u32.bytes.u8_2 = pBuffer[2]; + u32.bytes.u8_1 = pBuffer[1]; + u32.bytes.u8_0 = pBuffer[0]; + return u32.u32; +} + +FF_INLINE void FF_putChar(FF_T_UINT8 *pBuffer, FF_T_UINT32 aOffset, FF_T_UINT8 Value) { + pBuffer[aOffset] = Value; +} + +FF_INLINE void FF_putShort(FF_T_UINT8 *pBuffer, FF_T_UINT32 aOffset, FF_T_UINT16 Value) { + FF_T_UN16 u16; + u16.u16 = Value; + pBuffer += aOffset; + pBuffer[0] = u16.bytes.u8_0; + pBuffer[1] = u16.bytes.u8_1; +} + +FF_INLINE void FF_putLong(FF_T_UINT8 *pBuffer, FF_T_UINT32 aOffset, FF_T_UINT32 Value) { + FF_T_UN32 u32; + u32.u32 = Value; + pBuffer += aOffset; + pBuffer[0] = u32.bytes.u8_0; + pBuffer[1] = u32.bytes.u8_1; + pBuffer[2] = u32.bytes.u8_2; + pBuffer[3] = u32.bytes.u8_3; +} + +#else + +FF_T_UINT8 FF_getChar(FF_T_UINT8 *pBuffer, FF_T_UINT32 aOffset); +FF_T_UINT16 FF_getShort(FF_T_UINT8 *pBuffer, FF_T_UINT32 aOffset); +FF_T_UINT32 FF_getLong(FF_T_UINT8 *pBuffer, FF_T_UINT32 aOffset); +void FF_putChar(FF_T_UINT8 *pBuffer, FF_T_UINT32 aOffset, FF_T_UINT8 Value); +void FF_putShort(FF_T_UINT8 *pBuffer, FF_T_UINT32 aOffset, FF_T_UINT16 Value); +void FF_putLong(FF_T_UINT8 *pBuffer, FF_T_UINT32 aOffset, FF_T_UINT32 Value); + + +#endif #endif diff --git a/reactos/include/reactos/libs/fullfat/fullfat.h b/reactos/include/reactos/libs/fullfat/fullfat.h index dd8da071cf5..e4e8363e432 100644 --- a/reactos/include/reactos/libs/fullfat/fullfat.h +++ b/reactos/include/reactos/libs/fullfat/fullfat.h @@ -32,6 +32,10 @@ #ifndef _FULLFAT_H_ #define _FULLFAT_H_ +#ifdef __cplusplus +extern "C" { +#endif + #include "ff_config.h" #include "ff_ioman.h" #include "ff_fat.h" @@ -41,6 +45,10 @@ #include "ff_crc.h" #include "ff_hash.h" #include "ff_string.h" +//#include "ff_format.h" +#ifdef __cplusplus +} // extern "C" +#endif #endif diff --git a/reactos/lib/3rdparty/fullfat/ff_dir.c b/reactos/lib/3rdparty/fullfat/ff_dir.c index 6bba0b79020..f35d91c02e6 100644 --- a/reactos/lib/3rdparty/fullfat/ff_dir.c +++ b/reactos/lib/3rdparty/fullfat/ff_dir.c @@ -1769,4 +1769,3 @@ void FF_RmLFNs(FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, FF_T_UINT16 DirEntry) { }while(FF_getChar(EntryBuffer, (FF_T_UINT16)(FF_FAT_DIRENT_ATTRIB)) == FF_FAT_ATTR_LFN); } - diff --git a/reactos/lib/3rdparty/fullfat/ff_dir.h b/reactos/lib/3rdparty/fullfat/ff_dir.h index 7415eac06e6..41eb7278f8d 100644 --- a/reactos/lib/3rdparty/fullfat/ff_dir.h +++ b/reactos/lib/3rdparty/fullfat/ff_dir.h @@ -43,7 +43,7 @@ #include "ff_ioman.h" #include "ff_blk.h" #include "ff_fat.h" -#include "fat.h" +#include "ff_fatdef.h" #include "ff_memory.h" #include "ff_time.h" #include "ff_hash.h" diff --git a/reactos/lib/3rdparty/fullfat/ff_fat.c b/reactos/lib/3rdparty/fullfat/ff_fat.c index 1cbd420ffad..66769e56af7 100644 --- a/reactos/lib/3rdparty/fullfat/ff_fat.c +++ b/reactos/lib/3rdparty/fullfat/ff_fat.c @@ -136,13 +136,13 @@ FF_T_SINT32 FF_getFatEntry(FF_IOMAN *pIoman, FF_T_UINT32 nCluster) { FatSectorEntry = FatOffset % pIoman->pPartition->BlkSize; LBAadjust = (FF_T_UINT8) (FatSectorEntry / pIoman->BlkSize); - relClusterEntry = (FF_T_UINT16) (FatSectorEntry % pIoman->BlkSize); + relClusterEntry = (FF_T_UINT32) (FatSectorEntry % pIoman->BlkSize); FatSector = FF_getRealLBA(pIoman, FatSector); #ifdef FF_FAT12_SUPPORT if(pIoman->pPartition->Type == FF_T_FAT12) { - if(relClusterEntry == (pIoman->BlkSize - 1)) { + if(relClusterEntry == (FF_T_UINT32)(pIoman->BlkSize - 1)) { // Fat Entry SPANS a Sector! // First Buffer get the last Byte in buffer (first byte of our address)! pBuffer = FF_GetBuffer(pIoman, FatSector + LBAadjust, FF_MODE_READ); @@ -333,7 +333,7 @@ FF_T_SINT8 FF_putFatEntry(FF_IOMAN *pIoman, FF_T_UINT32 nCluster, FF_T_UINT32 Va FF_T_UINT32 FatSectorEntry; FF_T_UINT32 FatEntry; FF_T_UINT8 LBAadjust; - FF_T_UINT16 relClusterEntry; + FF_T_UINT32 relClusterEntry; #ifdef FF_FAT12_SUPPORT FF_T_UINT8 F12short[2]; // For FAT12 FAT Table Across sector boundary traversal. #endif @@ -350,13 +350,13 @@ FF_T_SINT8 FF_putFatEntry(FF_IOMAN *pIoman, FF_T_UINT32 nCluster, FF_T_UINT32 Va FatSectorEntry = FatOffset % pIoman->pPartition->BlkSize; LBAadjust = (FF_T_UINT8) (FatSectorEntry / pIoman->BlkSize); - relClusterEntry = (FF_T_UINT16)(FatSectorEntry % pIoman->BlkSize); + relClusterEntry = (FF_T_UINT32)(FatSectorEntry % pIoman->BlkSize); FatSector = FF_getRealLBA(pIoman, FatSector); #ifdef FF_FAT12_SUPPORT if(pIoman->pPartition->Type == FF_T_FAT12) { - if(relClusterEntry == (FF_T_UINT16) (pIoman->BlkSize - 1)) { + if(relClusterEntry == (FF_T_UINT32)(pIoman->BlkSize - 1)) { // Fat Entry SPANS a Sector! // First Buffer get the last Byte in buffer (first byte of our address)! pBuffer = FF_GetBuffer(pIoman, FatSector + LBAadjust, FF_MODE_READ); @@ -497,6 +497,11 @@ FF_T_UINT32 FF_FindFreeCluster(FF_IOMAN *pIoman) { for(i = FatSector; i < pIoman->pPartition->SectorsPerFAT; i++) { pBuffer = FF_GetBuffer(pIoman, pIoman->pPartition->FatBeginLBA + i, FF_MODE_READ); { + // HT addition: don't use non-existing clusters + if (nCluster >= pIoman->pPartition->NumClusters) { + FF_ReleaseBuffer(pIoman, pBuffer); + return 0; + } for(x = nCluster % EntriesPerSector; x < EntriesPerSector; x++) { if(pIoman->pPartition->Type == FF_T_FAT32) { FatOffset = x * 4; @@ -612,6 +617,7 @@ FF_T_SINT8 FF_UnlinkClusterChain(FF_IOMAN *pIoman, FF_T_UINT32 StartCluster, FF_ FF_T_UINT32 fatEntry; FF_T_UINT32 currentCluster, chainLength = 0; FF_T_UINT32 iLen = 0; + FF_T_UINT32 lastFree = StartCluster; /* HT addition : reset LastFreeCluster */ fatEntry = StartCluster; @@ -622,9 +628,15 @@ FF_T_SINT8 FF_UnlinkClusterChain(FF_IOMAN *pIoman, FF_T_UINT32 StartCluster, FF_ do { fatEntry = FF_getFatEntry(pIoman, fatEntry); FF_putFatEntry(pIoman, currentCluster, 0x00000000); + if (lastFree > currentCluster) { + lastFree = currentCluster; + } currentCluster = fatEntry; iLen ++; }while(!FF_isEndOfChain(pIoman, fatEntry)); + if (pIoman->pPartition->LastFreeCluster > lastFree) { + pIoman->pPartition->LastFreeCluster = lastFree; + } FF_IncreaseFreeClusters(pIoman, iLen); } else { // Truncation - This is quite hard, because we can only do it backwards. @@ -694,7 +706,7 @@ FF_T_UINT32 FF_CountFreeClusters(FF_IOMAN *pIoman) { } else { FatOffset = x * 2; FatSectorEntry = FatOffset % pIoman->pPartition->BlkSize; - FatEntry = (FF_T_UINT32) FF_getShort(pBuffer->pBuffer, (FF_T_UINT16)FatSectorEntry); + FatEntry = (FF_T_UINT32) FF_getShort(pBuffer->pBuffer, FatSectorEntry); } if(FatEntry == 0x00000000) { FreeClusters += 1; @@ -706,7 +718,7 @@ FF_T_UINT32 FF_CountFreeClusters(FF_IOMAN *pIoman) { FF_ReleaseBuffer(pIoman, pBuffer); } - return FreeClusters; + return FreeClusters <= pIoman->pPartition->NumClusters ? FreeClusters : pIoman->pPartition->NumClusters; } #ifdef FF_64_NUM_SUPPORT @@ -747,4 +759,4 @@ FF_T_UINT32 FF_GetFreeSize(FF_IOMAN *pIoman) { } return 0; } -#endif +#endif \ No newline at end of file diff --git a/reactos/lib/3rdparty/fullfat/ff_file.c b/reactos/lib/3rdparty/fullfat/ff_file.c index 7f982dc90d4..cd29e31562b 100644 --- a/reactos/lib/3rdparty/fullfat/ff_file.c +++ b/reactos/lib/3rdparty/fullfat/ff_file.c @@ -163,7 +163,7 @@ FF_FILE *FF_Open(FF_IOMAN *pIoman, const FF_T_INT8 *path, FF_T_UINT8 Mode, FF_ER } return (FF_FILE *)NULL; } - pFile = FF_Malloc(sizeof(FF_FILE)); + pFile = FF_MALLOC(sizeof(FF_FILE)); if(!pFile) { if(pError) { *pError = FF_ERR_NOT_ENOUGH_MEMORY; @@ -222,7 +222,7 @@ FF_FILE *FF_Open(FF_IOMAN *pIoman, const FF_T_INT8 *path, FF_T_UINT8 Mode, FF_ER if(Object.Attrib == FF_FAT_ATTR_DIR) { if(!(pFile->Mode & FF_MODE_DIR)) { // Not the object, File Not Found! - FF_Free(pFile); + FF_FREE(pFile); if(pError) { *pError = FF_ERR_FILE_OBJECT_IS_A_DIR; } @@ -233,7 +233,7 @@ FF_FILE *FF_Open(FF_IOMAN *pIoman, const FF_T_INT8 *path, FF_T_UINT8 Mode, FF_ER //---------- Ensure Read-Only files don't get opened for Writing. if((pFile->Mode & FF_MODE_WRITE) || (pFile->Mode & FF_MODE_APPEND)) { if((Object.Attrib & FF_FAT_ATTR_READONLY)) { - FF_Free(pFile); + FF_FREE(pFile); if(pError) { *pError = FF_ERR_FILE_IS_READ_ONLY; } @@ -276,7 +276,7 @@ FF_FILE *FF_Open(FF_IOMAN *pIoman, const FF_T_INT8 *path, FF_T_UINT8 Mode, FF_ER if(pFileChain->ObjectCluster == pFile->ObjectCluster) { // File is already open! DON'T ALLOW IT! FF_ReleaseSemaphore(pIoman->pSemaphore); - FF_Free(pFile); + FF_FREE(pFile); if(pError) { *pError = FF_ERR_FILE_ALREADY_OPEN; } @@ -294,7 +294,7 @@ FF_FILE *FF_Open(FF_IOMAN *pIoman, const FF_T_INT8 *path, FF_T_UINT8 Mode, FF_ER return pFile; }else { - FF_Free(pFile); + FF_FREE(pFile); if(pError) { *pError = FF_ERR_FILE_NOT_FOUND; } @@ -305,7 +305,7 @@ FF_FILE *FF_Open(FF_IOMAN *pIoman, const FF_T_INT8 *path, FF_T_UINT8 Mode, FF_ER *pError = FF_ERR_FILE_INVALID_PATH; } - FF_Free(pFile); + FF_FREE(pFile); return (FF_FILE *)NULL; } @@ -600,7 +600,14 @@ static FF_T_SINT32 FF_ReadClusters(FF_FILE *pFile, FF_T_UINT32 Count, FF_T_UINT8 do { if(pFile->pIoman->pBlkDevice->fnReadBlocks) { +#ifdef FF_BLKDEV_USES_SEM + FF_PendSemaphore(pFile->pIoman->pSemaphore); +#endif + // Called from FF_Read, sem not claimed RetVal = pFile->pIoman->pBlkDevice->fnReadBlocks(buffer, nItemLBA, Sectors, pFile->pIoman->pBlkDevice->pParam); +#ifdef FF_BLKDEV_USES_SEM + FF_ReleaseSemaphore(pFile->pIoman->pSemaphore); +#endif if(RetVal == FF_ERR_DRIVER_BUSY) { FF_Yield(); FF_Sleep(FF_DRIVER_BUSY_SLEEP); @@ -703,7 +710,14 @@ static FF_T_SINT32 FF_WriteClusters(FF_FILE *pFile, FF_T_UINT32 Count, FF_T_UINT do { if(pFile->pIoman->pBlkDevice->fnWriteBlocks) { +#ifdef FF_BLKDEV_USES_SEM + FF_PendSemaphore(pFile->pIoman->pSemaphore); +#endif + // Called from FF_Write, sem not claimed RetVal = pFile->pIoman->pBlkDevice->fnWriteBlocks(buffer, nItemLBA, Sectors, pFile->pIoman->pBlkDevice->pParam); +#ifdef FF_BLKDEV_USES_SEM + FF_ReleaseSemaphore(pFile->pIoman->pSemaphore); +#endif if(RetVal == FF_ERR_DRIVER_BUSY) { FF_Yield(); FF_Sleep(FF_DRIVER_BUSY_SLEEP); @@ -832,7 +846,13 @@ FF_T_SINT32 FF_Read(FF_FILE *pFile, FF_T_UINT32 ElementSize, FF_T_UINT32 Count, do { if(pIoman->pBlkDevice->fnReadBlocks) { +#ifdef FF_BLKDEV_USES_SEM + FF_PendSemaphore(pFile->pIoman->pSemaphore); +#endif RetVal = pFile->pIoman->pBlkDevice->fnReadBlocks(buffer, nItemLBA, sSectors, pIoman->pBlkDevice->pParam); +#ifdef FF_BLKDEV_USES_SEM + FF_ReleaseSemaphore(pFile->pIoman->pSemaphore); +#endif } if(RetVal == FF_ERR_DRIVER_BUSY) { FF_Yield(); @@ -887,7 +907,13 @@ FF_T_SINT32 FF_Read(FF_FILE *pFile, FF_T_UINT32 ElementSize, FF_T_UINT32 Count, do { if(pIoman->pBlkDevice->fnReadBlocks) { +#ifdef FF_BLKDEV_USES_SEM + FF_PendSemaphore(pFile->pIoman->pSemaphore); +#endif RetVal = pFile->pIoman->pBlkDevice->fnReadBlocks(buffer, nItemLBA, sSectors, pIoman->pBlkDevice->pParam); +#ifdef FF_BLKDEV_USES_SEM + FF_ReleaseSemaphore(pFile->pIoman->pSemaphore); +#endif } if(RetVal == FF_ERR_DRIVER_BUSY) { FF_Yield(); @@ -1116,7 +1142,13 @@ FF_T_SINT32 FF_Write(FF_FILE *pFile, FF_T_UINT32 ElementSize, FF_T_UINT32 Count, do { if(pIoman->pBlkDevice->fnWriteBlocks) { +#ifdef FF_BLKDEV_USES_SEM + FF_PendSemaphore(pFile->pIoman->pSemaphore); +#endif RetVal = pFile->pIoman->pBlkDevice->fnWriteBlocks(buffer, nItemLBA, sSectors, pIoman->pBlkDevice->pParam); +#ifdef FF_BLKDEV_USES_SEM + FF_ReleaseSemaphore(pFile->pIoman->pSemaphore); +#endif } if(RetVal == FF_ERR_DRIVER_BUSY) { FF_Yield(); @@ -1174,7 +1206,13 @@ FF_T_SINT32 FF_Write(FF_FILE *pFile, FF_T_UINT32 ElementSize, FF_T_UINT32 Count, do { if(pIoman->pBlkDevice->fnWriteBlocks) { +#ifdef FF_BLKDEV_USES_SEM + FF_PendSemaphore(pFile->pIoman->pSemaphore); +#endif RetVal = pFile->pIoman->pBlkDevice->fnWriteBlocks(buffer, nItemLBA, sSectors, pIoman->pBlkDevice->pParam); +#ifdef FF_BLKDEV_USES_SEM + FF_ReleaseSemaphore(pFile->pIoman->pSemaphore); +#endif } if(RetVal == FF_ERR_DRIVER_BUSY) { FF_Yield(); @@ -1405,7 +1443,7 @@ FF_ERROR FF_Close(FF_FILE *pFile) { FF_ReleaseSemaphore(pFile->pIoman->pSemaphore); // If file written, flush to disk - FF_Free(pFile); + FF_FREE(pFile); // Simply free the pointer! return FF_ERR_NONE; } diff --git a/reactos/lib/3rdparty/fullfat/ff_hash.c b/reactos/lib/3rdparty/fullfat/ff_hash.c index 5bcaf4c66d2..4a07c81d37e 100644 --- a/reactos/lib/3rdparty/fullfat/ff_hash.c +++ b/reactos/lib/3rdparty/fullfat/ff_hash.c @@ -53,7 +53,7 @@ struct _FF_HASH_TABLE { * **/ FF_HASH_TABLE FF_CreateHashTable() { - FF_HASH_TABLE pHash = (FF_HASH_TABLE) FF_Malloc(sizeof(struct _FF_HASH_TABLE)); + FF_HASH_TABLE pHash = (FF_HASH_TABLE) FF_MALLOC(sizeof(struct _FF_HASH_TABLE)); if(pHash) { FF_ClearHashTable(pHash); @@ -110,7 +110,7 @@ FF_T_BOOL FF_isHashSet(FF_HASH_TABLE pHash, FF_T_UINT32 nHash) { FF_ERROR FF_DestroyHashTable(FF_HASH_TABLE pHash) { if(pHash) { - free(pHash); + FF_FREE(pHash); return FF_ERR_NONE; } return FF_ERR_NULL_POINTER; diff --git a/reactos/lib/3rdparty/fullfat/ff_ioman.c b/reactos/lib/3rdparty/fullfat/ff_ioman.c index c30126d3f28..60871f831a0 100644 --- a/reactos/lib/3rdparty/fullfat/ff_ioman.c +++ b/reactos/lib/3rdparty/fullfat/ff_ioman.c @@ -42,8 +42,10 @@ * Destroying a FullFAT IO object. **/ +#include + #include "ff_ioman.h" // Includes ff_types.h, ff_safety.h, -#include "fat.h" +#include "ff_fatdef.h" extern FF_T_UINT32 FF_FindFreeCluster (FF_IOMAN *pIoman); extern FF_T_UINT32 FF_CountFreeClusters (FF_IOMAN *pIoman); @@ -89,7 +91,7 @@ FF_IOMAN *FF_CreateIOMAN(FF_T_UINT8 *pCacheMem, FF_T_UINT32 Size, FF_T_UINT16 Bl return NULL; // Memory Size not a multiple of BlkSize > 0 } - pIoman = (FF_IOMAN *) FF_Malloc(sizeof(FF_IOMAN)); + pIoman = (FF_IOMAN *) FF_MALLOC(sizeof(FF_IOMAN)); if(!pIoman) { // Ensure malloc() succeeded. if(pError) { @@ -98,62 +100,68 @@ FF_IOMAN *FF_CreateIOMAN(FF_T_UINT8 *pCacheMem, FF_T_UINT32 Size, FF_T_UINT16 Bl return NULL; } + memset (pIoman, '\0', sizeof(FF_IOMAN)); + // This is just a bit-mask, to use a byte to keep track of memory. // pIoman->MemAllocation = 0x00; // Unset all allocation identifiers. - pIoman->pBlkDevice = NULL; - pIoman->pBuffers = NULL; - pIoman->pCacheMem = NULL; - pIoman->pPartition = NULL; - pIoman->pSemaphore = NULL; - - pIoman->pPartition = (FF_PARTITION *) FF_Malloc(sizeof(FF_PARTITION)); - if(pIoman->pPartition) { // If succeeded, flag that allocation. - pIoman->MemAllocation |= FF_IOMAN_ALLOC_PART; - pIoman->pPartition->LastFreeCluster = 0; - pIoman->pPartition->PartitionMounted = FF_FALSE; // This should be checked by FF_Open(); -#ifdef FF_PATH_CACHE - pIoman->pPartition->PCIndex = 0; - for(i = 0; i < FF_PATH_CACHE_DEPTH; i++) { - pIoman->pPartition->PathCache[i].DirCluster = 0; - pIoman->pPartition->PathCache[i].Path[0] = '\0'; -#ifdef FF_HASH_TABLE_SUPPORT - pIoman->pPartition->PathCache[i].pHashTable = FF_CreateHashTable(); - pIoman->pPartition->PathCache[i].bHashed = FF_FALSE; -#endif + pIoman->pPartition = (FF_PARTITION *) FF_MALLOC(sizeof(FF_PARTITION)); + if(!pIoman->pPartition) { + if(pError) { + *pError = FF_ERR_NOT_ENOUGH_MEMORY; } + FF_DestroyIOMAN(pIoman); + return NULL; + } + memset (pIoman->pPartition, '\0', sizeof(FF_PARTITION)); + + pIoman->MemAllocation |= FF_IOMAN_ALLOC_PART; // If succeeded, flag that allocation. + pIoman->pPartition->LastFreeCluster = 0; + pIoman->pPartition->PartitionMounted = FF_FALSE; // This should be checked by FF_Open(); +#ifdef FF_PATH_CACHE + pIoman->pPartition->PCIndex = 0; + for(i = 0; i < FF_PATH_CACHE_DEPTH; i++) { + pIoman->pPartition->PathCache[i].DirCluster = 0; + pIoman->pPartition->PathCache[i].Path[0] = '\0'; +#ifdef FF_HASH_TABLE_SUPPORT + pIoman->pPartition->PathCache[i].pHashTable = FF_CreateHashTable(); + pIoman->pPartition->PathCache[i].bHashed = FF_FALSE; #endif - } else { + } +#endif + + pIoman->pBlkDevice = (FF_BLK_DEVICE *) FF_MALLOC(sizeof(FF_BLK_DEVICE)); + if(!pIoman->pBlkDevice) { // If succeeded, flag that allocation. + if(pError) { + *pError = FF_ERR_NOT_ENOUGH_MEMORY; + } FF_DestroyIOMAN(pIoman); return NULL; } + memset (pIoman->pBlkDevice, '\0', sizeof(FF_BLK_DEVICE)); + pIoman->MemAllocation |= FF_IOMAN_ALLOC_BLKDEV; - pIoman->pBlkDevice = (FF_BLK_DEVICE *) FF_Malloc(sizeof(FF_BLK_DEVICE)); - if(pIoman->pBlkDevice) { // If succeeded, flag that allocation. - pIoman->MemAllocation |= FF_IOMAN_ALLOC_BLKDEV; - - // Make sure all pointers are NULL - pIoman->pBlkDevice->fnReadBlocks = NULL; - pIoman->pBlkDevice->fnWriteBlocks = NULL; - pIoman->pBlkDevice->pParam = NULL; - - } else { - FF_DestroyIOMAN(pIoman); - return NULL; - } + // Make sure all pointers are NULL + pIoman->pBlkDevice->fnReadBlocks = NULL; + pIoman->pBlkDevice->fnWriteBlocks = NULL; + pIoman->pBlkDevice->pParam = NULL; // Organise the memory provided, or create our own! if(pCacheMem) { pIoman->pCacheMem = pCacheMem; }else { // No-Cache buffer provided (malloc) - pLong = (FF_T_UINT32 *) FF_Malloc(Size); + pLong = (FF_T_UINT32 *) FF_MALLOC(Size); pIoman->pCacheMem = (FF_T_UINT8 *) pLong; if(!pIoman->pCacheMem) { - pIoman->MemAllocation |= FF_IOMAN_ALLOC_BUFFERS; + if(pError) { + *pError = FF_ERR_NOT_ENOUGH_MEMORY; + } FF_DestroyIOMAN(pIoman); return NULL; } + pIoman->MemAllocation |= FF_IOMAN_ALLOC_BUFFERS; } + memset (pIoman->pCacheMem, '\0', Size); pIoman->BlkSize = BlkSize; pIoman->CacheSize = (FF_T_UINT16) (Size / BlkSize); @@ -163,14 +171,19 @@ FF_IOMAN *FF_CreateIOMAN(FF_T_UINT8 *pCacheMem, FF_T_UINT32 Size, FF_T_UINT16 Bl /* Malloc() memory for buffer objects. (FullFAT never refers to a buffer directly but uses buffer objects instead. Allows us to provide thread safety. */ - pIoman->pBuffers = (FF_BUFFER *) FF_Malloc(sizeof(FF_BUFFER) * pIoman->CacheSize); + pIoman->pBuffers = (FF_BUFFER *) FF_MALLOC(sizeof(FF_BUFFER) * pIoman->CacheSize); - if(pIoman->pBuffers) { - pIoman->MemAllocation |= FF_IOMAN_ALLOC_BUFDESCR; - FF_IOMAN_InitBufferDescriptors(pIoman); - } else { + if(!pIoman->pBuffers) { + if(pError) { + *pError = FF_ERR_NOT_ENOUGH_MEMORY; + } FF_DestroyIOMAN(pIoman); + return NULL; // HT added } + memset (pIoman->pBuffers, '\0', sizeof(FF_BUFFER) * pIoman->CacheSize); + + pIoman->MemAllocation |= FF_IOMAN_ALLOC_BUFDESCR; + FF_IOMAN_InitBufferDescriptors(pIoman); // Finally create a Semaphore for Buffer Description modifications. pIoman->pSemaphore = FF_CreateSemaphore(); @@ -196,22 +209,22 @@ FF_ERROR FF_DestroyIOMAN(FF_IOMAN *pIoman) { // Ensure pPartition pointer was allocated. if((pIoman->MemAllocation & FF_IOMAN_ALLOC_PART)) { - FF_Free(pIoman->pPartition); + FF_FREE(pIoman->pPartition); } // Ensure pBlkDevice pointer was allocated. if((pIoman->MemAllocation & FF_IOMAN_ALLOC_BLKDEV)) { - FF_Free(pIoman->pBlkDevice); + FF_FREE(pIoman->pBlkDevice); } // Ensure pBuffers pointer was allocated. if((pIoman->MemAllocation & FF_IOMAN_ALLOC_BUFDESCR)) { - FF_Free(pIoman->pBuffers); + FF_FREE(pIoman->pBuffers); } // Ensure pCacheMem pointer was allocated. if((pIoman->MemAllocation & FF_IOMAN_ALLOC_BUFFERS)) { - FF_Free(pIoman->pCacheMem); + FF_FREE(pIoman->pCacheMem); } // Destroy any Semaphore that was created. @@ -220,7 +233,7 @@ FF_ERROR FF_DestroyIOMAN(FF_IOMAN *pIoman) { } // Finally free the FF_IOMAN object. - FF_Free(pIoman); + FF_FREE(pIoman); return FF_ERR_NONE; } @@ -236,15 +249,9 @@ static void FF_IOMAN_InitBufferDescriptors(FF_IOMAN *pIoman) { FF_T_UINT16 i; FF_BUFFER *pBuffer = pIoman->pBuffers; pIoman->LastReplaced = 0; + // HT : it is assmued that pBuffer was cleared by memset () for(i = 0; i < pIoman->CacheSize; i++) { - pBuffer->Mode = 0; - pBuffer->NumHandles = 0; - pBuffer->Persistance = 0; - pBuffer->LRU = 0; - pBuffer->Sector = 0; pBuffer->pBuffer = (FF_T_UINT8 *)((pIoman->pCacheMem) + (pIoman->BlkSize * i)); - pBuffer->Modified = FF_FALSE; - pBuffer->Valid = FF_FALSE; pBuffer++; } } @@ -273,12 +280,15 @@ static void FF_IOMAN_InitBufferDescriptors(FF_IOMAN *pIoman) { * @param Sector LBA address of the sector to fetch. * @param pBuffer Pointer to a byte-wise buffer to store the fetched data. * + * HT Note: will be called while semaphore claimed (by FF_GetBuffer) + * * @return FF_TRUE when valid, else FF_FALSE. **/ static FF_ERROR FF_IOMAN_FillBuffer(FF_IOMAN *pIoman, FF_T_UINT32 Sector, FF_T_UINT8 *pBuffer) { FF_T_SINT32 retVal = 0; if(pIoman->pBlkDevice->fnReadBlocks) { // Make sure we don't execute a NULL. do{ + // Called from FF_GetBuffer with semaphore claimed retVal = pIoman->pBlkDevice->fnReadBlocks(pBuffer, Sector, 1, pIoman->pBlkDevice->pParam); if(retVal == FF_ERR_DRIVER_BUSY) { FF_Sleep(FF_DRIVER_BUSY_SLEEP); @@ -306,9 +316,13 @@ static FF_ERROR FF_IOMAN_FillBuffer(FF_IOMAN *pIoman, FF_T_UINT32 Sector, FF_T_U * @param Sector LBA address of the sector to fetch. * @param pBuffer Pointer to a byte-wise buffer to store the fetched data. * + * + * HT made it a globally accesible function to be used by new module ff_format.c + * Note that this function is called when semaphore is already locked + * * @return FF_TRUE when valid, else FF_FALSE. **/ -static FF_ERROR FF_IOMAN_FlushBuffer(FF_IOMAN *pIoman, FF_T_UINT32 Sector, FF_T_UINT8 *pBuffer) { +/* static */ FF_ERROR FF_IOMAN_FlushBuffer(FF_IOMAN *pIoman, FF_T_UINT32 Sector, FF_T_UINT8 *pBuffer) { FF_T_SINT32 retVal = 0; if(pIoman->pBlkDevice->fnWriteBlocks) { // Make sure we don't execute a NULL. do{ @@ -481,7 +495,7 @@ FF_BUFFER *FF_GetBuffer(FF_IOMAN *pIoman, FF_T_UINT32 Sector, FF_T_UINT8 Mode) { } } FF_ReleaseSemaphore(pIoman->pSemaphore); - FF_Yield(); + FF_Yield(); // Better to go asleep to give low-priority task a chance to release buffer(s) } return pBufMatch; // Return the Matched Buffer! @@ -500,7 +514,11 @@ void FF_ReleaseBuffer(FF_IOMAN *pIoman, FF_BUFFER *pBuffer) { // Protect description changes with a semaphore. FF_PendSemaphore(pIoman->pSemaphore); { - pBuffer->NumHandles--; + if (pBuffer->NumHandles) { + pBuffer->NumHandles--; + } else { + //printf ("FF_ReleaseBuffer: buffer not claimed\n"); + } } FF_ReleaseSemaphore(pIoman->pSemaphore); } @@ -630,6 +648,34 @@ static FF_ERROR FF_DetermineFatType(FF_IOMAN *pIoman) { return FF_ERR_IOMAN_NOT_FAT_FORMATTED; } + +static FF_T_SINT8 FF_PartitionCount (FF_T_UINT8 *pBuffer) +{ + FF_T_SINT8 count = 0; + FF_T_SINT8 part; + // Check PBR or MBR signature + if (FF_getChar(pBuffer, FF_FAT_MBR_SIGNATURE) != 0x55 && + FF_getChar(pBuffer, FF_FAT_MBR_SIGNATURE) != 0xAA ) { + // No MBR, but is it a PBR ? + if (FF_getChar(pBuffer, 0) == 0xEB && // PBR Byte 0 + FF_getChar(pBuffer, 2) == 0x90 && // PBR Byte 2 + (FF_getChar(pBuffer, 21) & 0xF0) == 0xF0) {// PBR Byte 21 : Media byte + return 1; // No MBR but PBR exist then only one partition + } + return 0; // No MBR and no PBR then no partition found + } + for (part = 0; part < 4; part++) { + FF_T_UINT8 active = FF_getChar(pBuffer, FF_FAT_PTBL + FF_FAT_PTBL_ACTIVE + (16 * part)); + FF_T_UINT8 part_id = FF_getChar(pBuffer, FF_FAT_PTBL + FF_FAT_PTBL_ID + (16 * part)); + // The first sector must be a MBR, then check the partition entry in the MBR + if (active != 0x80 && (active != 0 || part_id == 0)) { + break; + } + count++; + } + return count; +} + /** * @public * @brief Mounts the Specified partition, the volume specified by the FF_IOMAN object provided. @@ -651,6 +697,7 @@ static FF_ERROR FF_DetermineFatType(FF_IOMAN *pIoman) { FF_ERROR FF_MountPartition(FF_IOMAN *pIoman, FF_T_UINT8 PartitionNumber) { FF_PARTITION *pPart; FF_BUFFER *pBuffer = 0; + int partCount; if(!pIoman) { return FF_ERR_NULL_POINTER; @@ -662,18 +709,27 @@ FF_ERROR FF_MountPartition(FF_IOMAN *pIoman, FF_T_UINT8 PartitionNumber) { pPart = pIoman->pPartition; + memset (pIoman->pBuffers, '\0', sizeof(FF_BUFFER) * pIoman->CacheSize); + memset (pIoman->pCacheMem, '\0', pIoman->BlkSize * pIoman->CacheSize); + + FF_IOMAN_InitBufferDescriptors(pIoman); + pIoman->FirstFile = 0; + pBuffer = FF_GetBuffer(pIoman, 0, FF_MODE_READ); if(!pBuffer) { return FF_ERR_DEVICE_DRIVER_FAILED; } + + partCount = FF_PartitionCount (pBuffer->pBuffer); + pPart->BlkSize = FF_getShort(pBuffer->pBuffer, FF_FAT_BYTES_PER_SECTOR); - if((pPart->BlkSize % 512) == 0 && pPart->BlkSize > 0) { + if (partCount == 0) { //(pPart->BlkSize % 512) == 0 && pPart->BlkSize > 0) { // Volume is not partitioned (MBR Found) pPart->BeginLBA = 0; } else { // Primary Partitions to deal with! - pPart->BeginLBA = FF_getLong(pBuffer->pBuffer, (FF_T_UINT16)(FF_FAT_PTBL + FF_FAT_PTBL_LBA + (16 * PartitionNumber))); + pPart->BeginLBA = FF_getLong(pBuffer->pBuffer, FF_FAT_PTBL + FF_FAT_PTBL_LBA + (16 * PartitionNumber)); FF_ReleaseBuffer(pIoman, pBuffer); if(!pPart->BeginLBA) { @@ -690,6 +746,7 @@ FF_ERROR FF_MountPartition(FF_IOMAN *pIoman, FF_T_UINT8 PartitionNumber) { return FF_ERR_IOMAN_INVALID_FORMAT; } } + // Assume FAT16, then we'll adjust if its FAT32 pPart->ReservedSectors = FF_getShort(pBuffer->pBuffer, FF_FAT_RESERVED_SECTORS); pPart->FatBeginLBA = pPart->BeginLBA + pPart->ReservedSectors; @@ -709,6 +766,7 @@ FF_ERROR FF_MountPartition(FF_IOMAN *pIoman, FF_T_UINT8 PartitionNumber) { if(pPart->TotalSectors == 0) { pPart->TotalSectors = FF_getLong(pBuffer->pBuffer, FF_FAT_32_TOTAL_SECTORS); } + memcpy (pPart->VolLabel, pBuffer->pBuffer + FF_FAT_32_VOL_LABEL, sizeof pPart->VolLabel); } else { // FAT16 pPart->ClusterBeginLBA = pPart->BeginLBA + pPart->ReservedSectors + (pPart->NumFATS * pPart->SectorsPerFAT); pPart->TotalSectors = (FF_T_UINT32) FF_getShort(pBuffer->pBuffer, FF_FAT_16_TOTAL_SECTORS); @@ -716,6 +774,7 @@ FF_ERROR FF_MountPartition(FF_IOMAN *pIoman, FF_T_UINT8 PartitionNumber) { if(pPart->TotalSectors == 0) { pPart->TotalSectors = FF_getLong(pBuffer->pBuffer, FF_FAT_32_TOTAL_SECTORS); } + memcpy (pPart->VolLabel, pBuffer->pBuffer + FF_FAT_16_VOL_LABEL, sizeof pPart->VolLabel); } FF_ReleaseBuffer(pIoman, pBuffer); // Release the buffer finally! diff --git a/reactos/lib/3rdparty/fullfat/ff_memory.c b/reactos/lib/3rdparty/fullfat/ff_memory.c index cdbb2acf02d..2d6913d64d7 100644 --- a/reactos/lib/3rdparty/fullfat/ff_memory.c +++ b/reactos/lib/3rdparty/fullfat/ff_memory.c @@ -48,87 +48,55 @@ #include "ff_memory.h" #include "ff_config.h" -#ifdef FF_LITTLE_ENDIAN - -/** - * @public - * @brief 8 bit memory access routines. - **/ /* - These functions swap the byte-orders of shorts and longs. A getChar function is provided - incase there is a system that doesn't have byte-wise access to all memory. + * HT inlined these functions + * + * Not much left for the C-module + */ - These functions can be replaced with your own platform specific byte-order swapping routines - for more efficiency. - The provided functions should work on almost all platforms. -*/ -FF_T_UINT8 FF_getChar(FF_T_UINT8 *pBuffer, FF_T_UINT16 offset) { - return (FF_T_UINT8) (pBuffer[offset]); +#ifndef FF_INLINE_MEMORY_ACCESS +FF_T_UINT8 FF_getChar(FF_T_UINT8 *pBuffer, FF_T_UINT32 aOffset) { + return (FF_T_UINT8) (pBuffer[aOffset]); } -FF_T_UINT16 FF_getShort(FF_T_UINT8 *pBuffer, FF_T_UINT16 offset) { - return (FF_T_UINT16) (pBuffer[offset] & 0x00FF) | ((FF_T_UINT16) (pBuffer[offset+1] << 8) & 0xFF00); +FF_T_UINT16 FF_getShort(FF_T_UINT8 *pBuffer, FF_T_UINT32 aOffset) { + FF_T_UN16 u16; + pBuffer += aOffset; + u16.bytes.u8_1 = pBuffer[1]; + u16.bytes.u8_0 = pBuffer[0]; + return u16.u16; } -FF_T_UINT32 FF_getLong(FF_T_UINT8 *pBuffer, FF_T_UINT16 offset) { - return (FF_T_UINT32) (pBuffer[offset] & 0x000000FF) | ((FF_T_UINT32) (pBuffer[offset+1] << 8) & 0x0000FF00) | ((FF_T_UINT32) (pBuffer[offset+2] << 16) & 0x00FF0000) | ((FF_T_UINT32) (pBuffer[offset+3] << 24) & 0xFF000000); +FF_T_UINT32 FF_getLong(FF_T_UINT8 *pBuffer, FF_T_UINT32 aOffset) { + FF_T_UN32 u32; + pBuffer += aOffset; + u32.bytes.u8_3 = pBuffer[3]; + u32.bytes.u8_2 = pBuffer[2]; + u32.bytes.u8_1 = pBuffer[1]; + u32.bytes.u8_0 = pBuffer[0]; + return u32.u32; } -void FF_putChar(FF_T_UINT8 *pBuffer, FF_T_UINT16 offset, FF_T_UINT8 Value) { - pBuffer[offset] = Value; +void FF_putChar(FF_T_UINT8 *pBuffer, FF_T_UINT32 aOffset, FF_T_UINT8 Value) { + pBuffer[aOffset] = Value; } -void FF_putShort(FF_T_UINT8 *pBuffer, FF_T_UINT16 offset, FF_T_UINT16 Value) { - FF_T_UINT8 *Val = (FF_T_UINT8 *) &Value; - pBuffer[offset] = Val[0]; - pBuffer[offset + 1] = Val[1]; +void FF_putShort(FF_T_UINT8 *pBuffer, FF_T_UINT32 aOffset, FF_T_UINT16 Value) { + FF_T_UN16 u16; + u16.u16 = Value; + pBuffer += aOffset; + pBuffer[0] = u16.bytes.u8_0; + pBuffer[1] = u16.bytes.u8_1; } -void FF_putLong(FF_T_UINT8 *pBuffer, FF_T_UINT16 offset, FF_T_UINT32 Value) { - FF_T_UINT8 *Val = (FF_T_UINT8 *) &Value; - pBuffer[offset] = Val[0]; - pBuffer[offset + 1] = Val[1]; - pBuffer[offset + 2] = Val[2]; - pBuffer[offset + 3] = Val[3]; -} - -#endif - -#ifdef FF_BIG_ENDIAN -/* - These haven't been tested or checked. They should work in theory :) - Please contact james@worm.me.uk if they don't work, and also any fix. -*/ -FF_T_UINT8 FF_getChar(FF_T_UINT8 *pBuffer, FF_T_UINT16 offset) { - return (FF_T_UINT8) (pBuffer[offset]); -} - -FF_T_UINT16 FF_getShort(FF_T_UINT8 *pBuffer, FF_T_UINT16 offset) { - return (FF_T_UINT16) ((pBuffer[offset] & 0xFF00) << 8) | ((FF_T_UINT16) (pBuffer[offset+1]) & 0x00FF); -} - -FF_T_UINT32 FF_getLong(FF_T_UINT8 *pBuffer, FF_T_UINT16 offset) { - return (FF_T_UINT32) ((pBuffer[offset] << 24) & 0xFF0000) | ((FF_T_UINT32) (pBuffer[offset+1] << 16) & 0x00FF0000) | ((FF_T_UINT32) (pBuffer[offset+2] << 8) & 0x0000FF00) | ((FF_T_UINT32) (pBuffer[offset+3]) & 0x000000FF); -} - -void FF_putChar(FF_T_UINT8 *pBuffer, FF_T_UINT16 offset, FF_T_UINT8 Value) { - pBuffer[offset] = Value; -} - -void FF_putShort(FF_T_UINT8 *pBuffer, FF_T_UINT16 offset, FF_T_UINT16 Value) { - FF_T_UINT8 *Val = (FF_T_UINT8 *) &Value; - pBuffer[offset] = Val[1]; - pBuffer[offset + 1] = Val[0]; -} - -void FF_putLong(FF_T_UINT8 *pBuffer, FF_T_UINT16 offset, FF_T_UINT32 Value) { - FF_T_UINT8 *Val = (FF_T_UINT8 *) &Value; - pBuffer[offset] = Val[3]; - pBuffer[offset + 1] = Val[2]; - pBuffer[offset + 2] = Val[1]; - pBuffer[offset + 3] = Val[0]; +void FF_putLong(FF_T_UINT8 *pBuffer, FF_T_UINT32 aOffset, FF_T_UINT32 Value) { + FF_T_UN32 u32; + u32.u32 = Value; + pBuffer += aOffset; + pBuffer[0] = u32.bytes.u8_0; + pBuffer[1] = u32.bytes.u8_1; + pBuffer[2] = u32.bytes.u8_2; + pBuffer[3] = u32.bytes.u8_3; } #endif - - From 888f3912cb212baf778c727d83389b17121d48d4 Mon Sep 17 00:00:00 2001 From: Rafal Harabien Date: Sat, 2 Apr 2011 15:50:45 +0000 Subject: [PATCH 055/317] [SYSTEMINFO] * Fix System Locale field * Fix Input Locale field svn path=/trunk/; revision=51228 --- .../sysutils/systeminfo/systeminfo.c | 50 ++++++++++--------- .../sysutils/systeminfo/systeminfo.rbuild | 1 + 2 files changed, 28 insertions(+), 23 deletions(-) diff --git a/rosapps/applications/sysutils/systeminfo/systeminfo.c b/rosapps/applications/sysutils/systeminfo/systeminfo.c index 3f8d354f49a..49503679c2b 100644 --- a/rosapps/applications/sysutils/systeminfo/systeminfo.c +++ b/rosapps/applications/sysutils/systeminfo/systeminfo.c @@ -18,13 +18,12 @@ #include #include -#include #include -#include #include #include #include #include +#include #include "resource.h" @@ -56,7 +55,7 @@ RegGetSZ(HKEY hKey, LPCWSTR lpSubKey, LPCWSTR lpValueName, LPWSTR Buf) KEY_QUERY_VALUE, &hKey) != ERROR_SUCCESS) { - //wprintf("Warning! Cannot open %s. Last error: %lu.\n", lpSubKey, GetLastError()); + wprintf(L"Warning! Cannot open %s. Last error: %lu.\n", lpSubKey, GetLastError()); return FALSE; } @@ -67,7 +66,7 @@ RegGetSZ(HKEY hKey, LPCWSTR lpSubKey, LPCWSTR lpValueName, LPWSTR Buf) (LPBYTE)Buf, &dwBytes) != ERROR_SUCCESS || (dwType != REG_SZ && dwType != REG_MULTI_SZ)) { - //wprintf("Warning! Cannot query %s. Last error: %lu, type: %lu.\n", lpValueName, GetLastError(), dwType); + wprintf(L"Warning! Cannot query %s. Last error: %lu, type: %lu.\n", lpValueName, GetLastError(), dwType); dwBytes = 0; bRet = FALSE; } @@ -96,6 +95,7 @@ RegGetDWORD(HKEY hKey, LPCWSTR lpSubKey, LPCWSTR lpValueName, LPDWORD lpData) KEY_QUERY_VALUE, &hKey) != ERROR_SUCCESS) { + wprintf(L"Warning! Cannot open %s. Last error: %lu.\n", lpSubKey, GetLastError()); return FALSE; } @@ -106,7 +106,7 @@ RegGetDWORD(HKEY hKey, LPCWSTR lpSubKey, LPCWSTR lpValueName, LPDWORD lpData) (LPBYTE)lpData, &dwBytes) != ERROR_SUCCESS || dwType != REG_DWORD) { - //wprintf("Warning! Cannot query %s. Last err: %lu, type: %lu\n", lpValueName, GetLastError(), dwType); + wprintf(L"Warning! Cannot query %s. Last err: %lu, type: %lu\n", lpValueName, GetLastError(), dwType); *lpData = 0; bRet = FALSE; } @@ -186,7 +186,7 @@ AllSysInfo(VOID) SYSTEM_INFO SysInfo; WCHAR Buf[BUFFER_SIZE], Tmp[BUFFER_SIZE], Msg[BUFFER_SIZE], szSystemDir[MAX_PATH]; const WCHAR *lpcszSysType; - LPWSTR lpNetBuffer; + LPWSTR lpBuffer; NETSETUP_JOIN_STATUS NetJoinStatus; MEMORYSTATUS MemoryStatus; unsigned int cSeconds; @@ -325,7 +325,7 @@ AllSysInfo(VOID) swprintf(Tmp, L"HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\%u", i); RegGetSZ(HKEY_LOCAL_MACHINE, Tmp, L"Identifier", Buf); - wprintf(L" [%02u]: %s", i+1, Buf); + wprintf(L" [%02u]: %s", i+1, Buf); RegGetSZ(HKEY_LOCAL_MACHINE, Tmp, L"VendorIdentifier", Buf); wprintf(L" %s\n", Buf); @@ -367,35 +367,39 @@ AllSysInfo(VOID) wprintf(Msg, Buf); //getting System Locale - if (RegGetSZ(HKEY_CURRENT_USER, - L"Control Panel\\International", - L"Locale", - Tmp)) + if (GetLocaleInfoW(LOCALE_SYSTEM_DEFAULT, LOCALE_ILANGUAGE, Tmp, BUFFER_SIZE)) if (RegGetSZ(HKEY_CLASSES_ROOT, L"MIME\\Database\\Rfc1766", Tmp, Buf)) + { + /* get rid of @filename,resource */ + lpBuffer = wcschr(Buf, L';'); + if (lpBuffer) + SHLoadIndirectString(lpBuffer+1, lpBuffer+1, BUFFER_SIZE - (lpBuffer-Buf) - 1, NULL); + if (GetOemStrings(IDS_SYS_LOCALE, Msg)) wprintf(Msg, Buf); + } //getting Input Locale if (RegGetSZ(HKEY_CURRENT_USER, L"Keyboard Layout\\Preload", L"1", - Buf)) - { - int i, j; - - for(j = 0, i = 4; i <= 8; j++, i++) - Tmp[j] = Buf[i]; - + Tmp) && wcslen(Tmp) > 4) if (RegGetSZ(HKEY_CLASSES_ROOT, L"MIME\\Database\\Rfc1766", - Tmp, + Tmp + 4, Buf)) + { + /* get rid of @filename,resource */ + lpBuffer = wcschr(Buf, L';'); + if (lpBuffer) + SHLoadIndirectString(lpBuffer+1, lpBuffer+1, BUFFER_SIZE - (lpBuffer-Buf) - 1, NULL); + if (GetOemStrings(IDS_INPUT_LOCALE, Msg)) wprintf(Msg, Buf); - } + } //getting Time Zone GetTimeZoneInformation(&TimeZoneInfo); @@ -476,12 +480,12 @@ AllSysInfo(VOID) } //getting Domain - if (NetGetJoinInformation (NULL, &lpNetBuffer, &NetJoinStatus) == NERR_Success) + if (NetGetJoinInformation (NULL, &lpBuffer, &NetJoinStatus) == NERR_Success) { if(GetOemStrings(IDS_DOMAIN, Msg)) - wprintf(Msg, lpNetBuffer); + wprintf(Msg, lpBuffer); - NetApiBufferFree(lpNetBuffer); + NetApiBufferFree(lpBuffer); } //getting Logon Server diff --git a/rosapps/applications/sysutils/systeminfo/systeminfo.rbuild b/rosapps/applications/sysutils/systeminfo/systeminfo.rbuild index 5779bd1f911..fc3ef6dd2c3 100644 --- a/rosapps/applications/sysutils/systeminfo/systeminfo.rbuild +++ b/rosapps/applications/sysutils/systeminfo/systeminfo.rbuild @@ -3,6 +3,7 @@ ntdll advapi32 netapi32 + shlwapi systeminfo.c systeminfo.rc rsrc.rc From 271454653dc352ee752e5743c4ae4182639eceeb Mon Sep 17 00:00:00 2001 From: Ged Murphy Date: Sat, 2 Apr 2011 16:31:43 +0000 Subject: [PATCH 056/317] [FULLFAT] - Update FullFat to the latest SVN code on James' recommendation. - This release has many advantages over the previous, including full UTF-8 and UTF-16 support and the ability to modify attributes and timestamps. All of which are important for ros. - It currently has a few warnings (in both gcc and msc), so I've had to turn allow warnings on. svn path=/trunk/; revision=51229 --- .../include/reactos/libs/fullfat/ff_config.h | 194 +- reactos/include/reactos/libs/fullfat/ff_crc.h | 1 + reactos/include/reactos/libs/fullfat/ff_dir.h | 134 +- .../include/reactos/libs/fullfat/ff_error.h | 130 +- reactos/include/reactos/libs/fullfat/ff_fat.h | 25 +- .../include/reactos/libs/fullfat/ff_fatdef.h | 15 + .../include/reactos/libs/fullfat/ff_file.h | 20 +- .../include/reactos/libs/fullfat/ff_format.h | 47 + .../include/reactos/libs/fullfat/ff_ioman.h | 29 +- .../include/reactos/libs/fullfat/ff_memory.h | 2 +- .../include/reactos/libs/fullfat/ff_string.h | 36 +- .../include/reactos/libs/fullfat/ff_types.h | 9 + .../include/reactos/libs/fullfat/ff_unicode.h | 60 + .../include/reactos/libs/fullfat/fullfat.h | 1 + reactos/lib/3rdparty/fullfat/ff_crc.c | 73 +- reactos/lib/3rdparty/fullfat/ff_dir.c | 2460 +++++++++++------ reactos/lib/3rdparty/fullfat/ff_dir.h | 134 +- reactos/lib/3rdparty/fullfat/ff_error.c | 6 +- reactos/lib/3rdparty/fullfat/ff_fat.c | 168 +- reactos/lib/3rdparty/fullfat/ff_file.c | 716 +++-- reactos/lib/3rdparty/fullfat/ff_format.c | 132 + reactos/lib/3rdparty/fullfat/ff_hash.c | 4 +- reactos/lib/3rdparty/fullfat/ff_ioman.c | 462 ++-- reactos/lib/3rdparty/fullfat/ff_string.c | 274 +- reactos/lib/3rdparty/fullfat/ff_unicode.c | 294 ++ reactos/lib/3rdparty/fullfat/fullfat.rbuild | 4 +- 26 files changed, 3972 insertions(+), 1458 deletions(-) create mode 100644 reactos/include/reactos/libs/fullfat/ff_format.h create mode 100644 reactos/include/reactos/libs/fullfat/ff_unicode.h create mode 100644 reactos/lib/3rdparty/fullfat/ff_format.c create mode 100644 reactos/lib/3rdparty/fullfat/ff_unicode.c diff --git a/reactos/include/reactos/libs/fullfat/ff_config.h b/reactos/include/reactos/libs/fullfat/ff_config.h index 4588ef9c305..0c8e3f37db2 100644 --- a/reactos/include/reactos/libs/fullfat/ff_config.h +++ b/reactos/include/reactos/libs/fullfat/ff_config.h @@ -34,108 +34,138 @@ Here you can change the configuration of FullFAT as appropriate to your platform. */ - //---------- ENDIANESS -#define FF_LITTLE_ENDIAN // Choosing the Byte-order of your system is important. -//#define FF_BIG_ENDIAN // You may be able to provide better Byte-order swapping routines to FullFAT. - // See ff_memory.c for more information. +#define FF_LITTLE_ENDIAN // Choosing the Byte-order of your system is important. +//#define FF_BIG_ENDIAN // You may be able to provide better Byte-order swapping routines to FullFAT. + // See ff_memory.c for more information. + //---------- LFN (Long File-name) SUPPORT -#define FF_LFN_SUPPORT // Comment this out if you don't want to worry about Patent Issues. - // FullFAT works great with LFNs and without. You choose, its your project! +#define FF_LFN_SUPPORT // Comment this out if you don't want to worry about Patent Issues. + // FullFAT works great with LFNs and without. You choose, its your project! -//---------- LEGAL LFNS -//#define FF_LEGAL_LFNS // Enabling this define causes FullFAT to not infringe on any of Microsoft's patents when making LFN names. - // To do this, it will only create LFNs and no shortnames. Microsofts patents are only relevent when mapping - // a shortname to a long name. This is the same way that Linux gets around the FAT legal issues: - // see http://lkml.org/lkml/2009/6/26/314 - // - // Enabling this may break compatibility with devices that cannot read LFN filenames. - // Enabling this option causes no compatibility issues when reading any media. - -//---------- TIME SUPPORT -#define FF_TIME_SUPPORT // Should FullFAT use time stamping. Only if you have provided the relevant time drivers in ff_time.c - // Note, by default ff_time.c is set-up for the Windows Demonstration. Please see ff_time.c to disable. - -//---------- FILE SPACE ALLOCATION PERFORMANCE - // Uncomment the prefered method. (Can only choose a single method). -#define FF_ALLOC_DEFAULT // Only allocate as much as is needed. (Provides good performance, without wasting space). -//#define FF_ALLOC_DOUBLE // Doubles the size of a file each time allocation is required. (When high-performance writing is required). - -//---------- Use Native STDIO.h -//#define FF_USE_NATIVE_STDIO // Makes FullFAT conform to values provided by your native STDIO.h file. - -//---------- FREE SPACE CALCULATION -//#define FF_MOUNT_FIND_FREE // Uncomment this option to check for Freespace on a volume mount. (Performance Penalty while mounting). - // If not done in the mount, it will be done on the first call to FF_GetFreeSize() function. - -//---------- PATH CACHE -#define FF_PATH_CACHE // Enables a simply Path Caching mechanism that increases performance of repeated operations - // within the same path. E.g. a copy \dir1\*.* \dir2\*.* command. - // This command requires FF_MAX_PATH number of bytes of memory. (Defined below, default 2600). - -//---------- BLKDEV USES SEMAPHORE -#define FF_BLKDEV_USES_SEM // When defined, each call to fnReadBlocks and fnWriteBlocks will be done while semaphore is locked - // See also ff_safety.c - // (HT addition) +//#define FF_INCLUDE_SHORT_NAME // HT addition, in 'FF_DIRENT', beside FileName, ShortName will be filled as well + // Useful for debugging, but also some situations its useful to know both. +//---------- SHORTNAMES CAN USE THE CASE BITS +#define FF_SHORTNAME_CASE // Works for XP+ e.g. short.TXT or SHORT.txt. -#define FF_PATH_CACHE_DEPTH 2 // The Number of PATH's to Cache. +//---------- UNICODE SUPPORT +//#define FF_UNICODE_SUPPORT // If this is defined, then all of FullFAT's API's will expect to receive UTF-16 formatted strings. + // FF_FindFirst() and FF_FindNext() will also return Filenames in UTF-16 format. + // NOTE: This option may cause FullFAT to not "Clean-compile" when using GCC. This is because + // pedantically GCC refuses to accept C99 library functions, unless the -std=c99 flag is used. + // To use UNICODE (UTF-16, or UTF-32 depending on the size of wchar_t) you must have a C99 compliant + // compiler and library. -//---------- DON'T USE MALLOC -//#define FF_NO_MALLOC +//#define FF_UNICODE_UTF8_SUPPORT // If this is defined, then all of FullFAT's API's will expect to receive UTF-8 formatted strings. + // FF_FindFirst() and FF_FindNext() will also return Filenames in UTF-8 format. -#define FF_MALLOC(aSize) malloc(aSize) -#define FF_FREE(apPtr) free(apPtr) - -//#define FF_INLINE_MEMORY_ACCESS - -//#define FF_INLINE static __forceinline // Keywords to inline functions (Windows) -#define FF_INLINE static inline // Standard for GCC - - -//---------- Hash Table Support -//#define FF_HASH_TABLE_SUPPORT // Enable HASH to speed up file creation. -#ifdef FF_HASH_TABLE_SUPPORT -#define FF_HASH_FUNCTION CRC16 -//#define FF_HASH_FUNCTION CRC8 -#endif + // Note the 2 UNICODE options are mutually exclusive. Only one can be enabled. + // Ensure that dirents are big enough to hold the maximum UTF-8 sequence. //---------- FAT12 SUPPORT -#define FF_FAT12_SUPPORT // Enable FAT12 Suppport. You can reduce the code-size by commenting this out. - // If you don't need FAT12 support, why have it. FAT12 is more complex to process, - // therefore savings can be made by not having it. +#define FF_FAT12_SUPPORT // Enable FAT12 Suppport. You can reduce the code-size by commenting this out. + // If you don't need FAT12 support, why have it. FAT12 is more complex to process, + // therefore savings can be made by not having it. + + +//---------- TIME SUPPORT +#define FF_TIME_SUPPORT // Should FullFAT use time stamping. Only if you have provided the relevant time drivers in ff_time.c + // Note, by default ff_time.c is set-up for the Windows Demonstration. Please see ff_time.c to disable. + + +//---------- FILE SPACE ALLOCATION PERFORMANCE + // Uncomment the prefered method. (Can only choose a single method). +#define FF_ALLOC_DEFAULT // Only allocate as much as is needed. (Provides good performance, without wasting space). +//#define FF_ALLOC_DOUBLE // Doubles the size of a file each time allocation is required. (When high-performance writing is required). + + +//---------- Use Native STDIO.h +//#define FF_USE_NATIVE_STDIO // Makes FullFAT conform to values provided by your native STDIO.h file. + + +//---------- FREE SPACE CALCULATION +//#define FF_MOUNT_FIND_FREE // Uncomment this option to check for Freespace on a volume mount. (Performance Penalty while mounting). + // If not done in the mount, it will be done on the first call to FF_GetFreeSize() function. + + +//---------- FIND API WILD-CARD SUPPORT +#define FF_FINDAPI_ALLOW_WILDCARDS // Defined to enable Wild-cards in the API. Disabling this, makes the API consistent with 1.0.x series. + +#define FF_WILDCARD_CASE_INSENSITIVE // Alter the case insensitivity of the Wild-card checking behaviour. + + +//---------- PATH CACHE ---------- +#define FF_PATH_CACHE // Enables a simply Path Caching mechanism that increases performance of repeated operations + // within the same path. E.g. a copy \dir1\*.* \dir2\*.* command. + // This command requires FF_MAX_PATH number of bytes of memory. (Defined below, default 2600). + +#define FF_PATH_CACHE_DEPTH 5 // The Number of PATH's to Cache. (Memory Requirement ~= FF_PATH_CACHE_DEPTH * FF_MAX_PATH). + + +//---------- HASH CACHE // Speed up File-creation with a HASH table. Provides up to 20x performance boost. +//#define FF_HASH_CACHE // Enable HASH to speed up file creation. +#define FF_HASH_CACHE_DEPTH 10 // Number of Directories to be Hashed. (For CRC16 memory is 8KB * DEPTH) +#define FF_HASH_FUNCTION CRC16 // Choose a 16-bit hash. +//#define FF_HASH_FUNCTION CRC8 // Choose an 8-bit hash. + + +//---------- BLKDEV USES SEMAPHORE +#define FF_BLKDEV_USES_SEM // When defined, each call to fnReadBlocks and fnWriteBlocks will be done while semaphore is locked + // See also ff_safety.c + // (HT addition) - Thanks to Hein Tibosch + + +//---------- MALLOC + // These should map on to platform specific memory allocators. +#define FF_MALLOC(aSize) malloc(aSize) +#define FF_FREE(apPtr) free(apPtr) + + +//---------- IN-LINE FUNCTIONS +//---------- INLINE KeyWord // Define FF_INLINE as your compiler's inline keyword. This is placed before the type qualifier. +#define FF_INLINE static __forceinline // Keywords to inline functions (Windows) +//#define FF_INLINE static inline // Standard for GCC + +//---------- Inline Memory Independence Routines for better performance, but bigger codesize. +//#define FF_INLINE_MEMORY_ACCESS +//---------- Inline Block Calculation Routines for slightly better performance in critical sections. +//#define FF_INLINE_BLOCK_CALCULATIONS + //---------- 64-Bit Number Support -#define FF_64_NUM_SUPPORT // This helps to give information about the FreeSpace and VolumeSize of a partition or volume. - // If you cannot support 64-bit integers, then FullFAT still works, its just that the functions: - // FF_GetFreeSize() and FF_GetVolumeSize() don't make sense when reporting sizes > 4GB. +#define FF_64_NUM_SUPPORT // This helps to give information about the FreeSpace and VolumeSize of a partition or volume. + // If you cannot support 64-bit integers, then FullFAT still works, its just that the functions: + // FF_GetFreeSize() and FF_GetVolumeSize() don't make sense when reporting sizes > 4GB. -//---------- Driver Sleep Time // How long FullFAT should sleep the thread for in ms, if FF_ERR_DRIVER_BUSY is recieved. -#define FF_DRIVER_BUSY_SLEEP 20 -//---------- Debugging Features -#define FF_DEBUG // Enable the Error Code string functions. const FF_T_INT8 *FF_GetErrMessage( FF_T_SINT32 iErrorCode); - // Uncommenting this just stops FullFAT error strings being compiled. +//---------- Driver Sleep Time +#define FF_DRIVER_BUSY_SLEEP 20 // How long FullFAT should sleep the thread for in ms, if FF_ERR_DRIVER_BUSY is recieved. -//---------- Actively Determine if partition is FAT -#define FF_FAT_CHECK // This is experimental, so if FullFAT won't mount your volume, comment this out - // Also report the problem to james@worm.me.uk + +//---------- DEBUGGING FEATURES (HELPFUL ERROR MESSAGES) +#define FF_DEBUG // Enable the Error Code string functions. const FF_T_INT8 *FF_GetErrMessage( FF_T_SINT32 iErrorCode); + // Uncommenting this just stops FullFAT error strings being compiled. + // Further calls to FF_GetErrMessage() are safe, and simply returns a pointer to a NULL string. (""). + // This should be disabled to reduce code-size dramatically. //---------- AUTOMATIC SETTINGS DO NOT EDIT -- These configure your options from above, and check sanity! #ifdef FF_LFN_SUPPORT -#define FF_MAX_FILENAME (129) +#define FF_MAX_FILENAME (260) #else -#define FF_MAX_FILENAME 13 +#define FF_MAX_FILENAME (13) #endif #ifdef FF_USE_NATIVE_STDIO #ifdef MAX_PATH #define FF_MAX_PATH MAX_PATH +#elif PATH_MAX +#define FF_MAX_PATH PATH_MAX #else #define FF_MAX_PATH 2600 #endif @@ -155,6 +185,16 @@ #endif #endif +#ifdef FF_UNICODE_SUPPORT +#ifdef FF_UNICODE_UTF8_SUPPORT +#error FullFAT Invalid ff_config.h file: Must choose a single UNICODE support option. FF_UNICODE_SUPPORT for UTF-16, FF_UNICODE_UTF8_SUPPORT for UTF-8. +#endif +#endif + +#ifndef FF_FAT_CHECK // FF_FAT_CHECK is now forced. +#define FF_FAT_CHECK +#endif + #ifndef FF_LITTLE_ENDIAN #ifndef FF_BIG_ENDIAN #error FullFAT Invalid ff_config.h file: An ENDIANESS must be defined for your platform. See ff_config.h file. @@ -167,16 +207,18 @@ #endif #endif -#ifdef FF_HASH_TABLE_SUPPORT +#ifdef FF_HASH_CACHE #if FF_HASH_FUNCTION == CRC16 #define FF_HASH_TABLE_SIZE 8192 #elif FF_HASH_FUNCTION == CRC8 #define FF_HASH_TABLE_SIZE 32 #else -#error Invalid Hashing function selected. CRC16 or CRC8! +#error FullFAT Invalid ff_config.h file: Invalid Hashing function selected. CRC16 or CRC8! #endif #endif #endif + +//---------- END-OF-CONFIGURATION diff --git a/reactos/include/reactos/libs/fullfat/ff_crc.h b/reactos/include/reactos/libs/fullfat/ff_crc.h index 7349269d836..51b658dc1f3 100644 --- a/reactos/include/reactos/libs/fullfat/ff_crc.h +++ b/reactos/include/reactos/libs/fullfat/ff_crc.h @@ -44,6 +44,7 @@ FF_T_UINT8 FF_GetCRC8 (FF_T_UINT8 *pbyData, FF_T_UINT32 stLength); FF_T_UINT16 FF_GetCRC16 (FF_T_UINT8 *pbyData, FF_T_UINT32 stLength); +FF_T_UINT32 FF_GetCRC32 (FF_T_UINT8 *pbyData, FF_T_UINT32 stLength); #endif diff --git a/reactos/include/reactos/libs/fullfat/ff_dir.h b/reactos/include/reactos/libs/fullfat/ff_dir.h index 41eb7278f8d..6c99b7279c5 100644 --- a/reactos/include/reactos/libs/fullfat/ff_dir.h +++ b/reactos/include/reactos/libs/fullfat/ff_dir.h @@ -52,54 +52,118 @@ #include typedef struct { - FF_T_INT8 FileName[FF_MAX_FILENAME]; - FF_T_UINT8 Attrib; + FF_T_UINT32 ulChainLength; + FF_T_UINT32 ulDirCluster; + FF_T_UINT32 ulCurrentClusterLCN; + FF_T_UINT32 ulCurrentClusterNum; + FF_T_UINT32 ulCurrentEntry; + FF_BUFFER *pBuffer; +} FF_FETCH_CONTEXT; + +typedef struct { FF_T_UINT32 Filesize; FF_T_UINT32 ObjectCluster; - + + // Book Keeping + FF_T_UINT32 CurrentCluster; + FF_T_UINT32 AddrCurrentCluster; + FF_T_UINT32 DirCluster; + FF_T_UINT16 CurrentItem; + // End Book Keeping + #ifdef FF_TIME_SUPPORT FF_SYSTEMTIME CreateTime; ///< Date and Time Created. FF_SYSTEMTIME ModifiedTime; ///< Date and Time Modified. FF_SYSTEMTIME AccessedTime; ///< Date of Last Access. #endif - //---- Book Keeping for FF_Find Functions - FF_T_UINT16 CurrentItem; - FF_T_UINT32 DirCluster; - FF_T_UINT32 CurrentCluster; - FF_T_UINT32 AddrCurrentCluster; - //FF_T_UINT8 NumLFNs; +#ifdef FF_FINDAPI_ALLOW_WILDCARDS +#ifdef FF_UNICODE_SUPPORT + FF_T_WCHAR szWildCard[FF_MAX_FILENAME]; +#else + FF_T_INT8 szWildCard[FF_MAX_FILENAME]; +#endif +#endif + +#ifdef FF_UNICODE_SUPPORT + FF_T_WCHAR FileName[FF_MAX_FILENAME]; +#else + FF_T_INT8 FileName[FF_MAX_FILENAME]; +#endif + +#if defined(FF_LFN_SUPPORT) && defined(FF_INCLUDE_SHORT_NAME) + FF_T_INT8 ShortName[13]; +#endif + FF_T_UINT8 Attrib; + FF_FETCH_CONTEXT FetchContext; } FF_DIRENT; - FF_ERROR FF_GetEntry (FF_IOMAN *pIoman, FF_T_UINT16 nEntry, FF_T_UINT32 DirCluster, FF_DIRENT *pDirent); - FF_T_SINT8 FF_PutEntry (FF_IOMAN *pIoman, FF_T_UINT16 Entry, FF_T_UINT32 DirCluster, FF_DIRENT *pDirent); - FF_T_SINT8 FF_FindEntry (FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, FF_T_INT8 *Name, FF_DIRENT *pDirent, FF_T_BOOL LFNs); - FF_ERROR FF_FindFirst (FF_IOMAN *pIoman, FF_DIRENT *pDirent, const FF_T_INT8 *path); - FF_ERROR FF_FindNext (FF_IOMAN *pIoman, FF_DIRENT *pDirent); - void FF_PopulateShortDirent(FF_IOMAN *pIoman, FF_DIRENT *pDirent, FF_T_UINT8 *EntryBuffer); - FF_T_SINT8 FF_PopulateLongDirent(FF_IOMAN *pIoman, FF_DIRENT *pDirent, FF_T_UINT32 DirCluster, FF_T_UINT16 nEntry); - FF_T_SINT8 FF_FetchEntry (FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, FF_T_UINT16 nEntry, FF_T_UINT8 *buffer); - FF_T_SINT8 FF_PushEntry (FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, FF_T_UINT16 nEntry, FF_T_UINT8 *buffer); - FF_T_BOOL FF_isEndOfDir (FF_T_UINT8 *EntryBuffer); - FF_T_SINT8 FF_FindNextInDir(FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, FF_DIRENT *pDirent); - FF_T_UINT32 FF_FindEntryInDir(FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, FF_T_INT8 *name, FF_T_UINT8 pa_Attrib, FF_DIRENT *pDirent); - FF_T_SINT8 FF_CreateShortName(FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, FF_T_INT8 *ShortName, FF_T_INT8 *LongName); - -void FF_lockDIR (FF_IOMAN *pIoman); -void FF_unlockDIR (FF_IOMAN *pIoman); -FF_T_UINT32 FF_CreateFile(FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, FF_T_INT8 *FileName, FF_DIRENT *pDirent); -FF_ERROR FF_MkDir(FF_IOMAN *pIoman, const FF_T_INT8 *Path); -FF_T_SINT8 FF_CreateDirent(FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, FF_DIRENT *pDirent); -FF_T_SINT8 FF_ExtendDirectory(FF_IOMAN *pIoman, FF_T_UINT32 DirCluster); -FF_T_UINT32 FF_FindDir(FF_IOMAN *pIoman, const FF_T_INT8 *path, FF_T_UINT16 pathLen); -FF_T_BOOL FF_CheckDirentHash(FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, FF_T_UINT32 nHash); -FF_T_BOOL FF_DirHashed(FF_IOMAN *pIoman, FF_T_UINT32 DirCluster); -FF_ERROR FF_AddDirentHash(FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, FF_T_UINT32 nHash); -void FF_SetDirHashed(FF_IOMAN *pIoman, FF_T_UINT32 DirCluster); +// PUBLIC API +#ifdef FF_UNICODE_SUPPORT +FF_ERROR FF_FindFirst (FF_IOMAN *pIoman, FF_DIRENT *pDirent, const FF_T_WCHAR *path); +FF_ERROR FF_MkDir (FF_IOMAN *pIoman, const FF_T_WCHAR *Path); +#else +FF_ERROR FF_FindFirst (FF_IOMAN *pIoman, FF_DIRENT *pDirent, const FF_T_INT8 *path); +FF_ERROR FF_MkDir (FF_IOMAN *pIoman, const FF_T_INT8 *Path); +#endif -void FF_RmLFNs(FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, FF_T_UINT16 DirEntry); +FF_ERROR FF_FindNext (FF_IOMAN *pIoman, FF_DIRENT *pDirent); + + +// INTERNAL API +FF_ERROR FF_GetEntry (FF_IOMAN *pIoman, FF_T_UINT16 nEntry, FF_T_UINT32 DirCluster, FF_DIRENT *pDirent); +FF_ERROR FF_PutEntry (FF_IOMAN *pIoman, FF_T_UINT16 Entry, FF_T_UINT32 DirCluster, FF_DIRENT *pDirent); +FF_T_SINT8 FF_FindEntry (FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, FF_T_INT8 *Name, FF_DIRENT *pDirent, FF_T_BOOL LFNs); + +void FF_PopulateShortDirent (FF_IOMAN *pIoman, FF_DIRENT *pDirent, FF_T_UINT8 *EntryBuffer); +FF_ERROR FF_PopulateLongDirent (FF_IOMAN *pIoman, FF_DIRENT *pDirent, FF_T_UINT16 nEntry, FF_FETCH_CONTEXT *pFetchContext); + +FF_ERROR FF_InitEntryFetch (FF_IOMAN *pIoman, FF_T_UINT32 ulDirCluster, FF_FETCH_CONTEXT *pContext); +FF_ERROR FF_FetchEntryWithContext (FF_IOMAN *pIoman, FF_T_UINT32 ulEntry, FF_FETCH_CONTEXT *pContext, FF_T_UINT8 *pEntryBuffer); +FF_ERROR FF_PushEntryWithContext (FF_IOMAN *pIoman, FF_T_UINT32 ulEntry, FF_FETCH_CONTEXT *pContext, FF_T_UINT8 *pEntryBuffer); +void FF_CleanupEntryFetch (FF_IOMAN *pIoman, FF_FETCH_CONTEXT *pContext); + +FF_T_SINT8 FF_PushEntry (FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, FF_T_UINT16 nEntry, FF_T_UINT8 *buffer, void *pParam); +FF_T_BOOL FF_isEndOfDir (FF_T_UINT8 *EntryBuffer); +FF_ERROR FF_FindNextInDir (FF_IOMAN *pIoman, FF_DIRENT *pDirent, FF_FETCH_CONTEXT *pFetchContext); + +#ifdef FF_UNICODE_SUPPORT +FF_T_UINT32 FF_FindEntryInDir (FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, const FF_T_WCHAR *name, FF_T_UINT8 pa_Attrib, FF_DIRENT *pDirent, FF_ERROR *pError); +FF_T_SINT8 FF_CreateShortName (FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, FF_T_WCHAR *ShortName, FF_T_WCHAR *LongName); +#else +FF_T_UINT32 FF_FindEntryInDir (FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, const FF_T_INT8 *name, FF_T_UINT8 pa_Attrib, FF_DIRENT *pDirent, FF_ERROR *pError); +FF_T_SINT8 FF_CreateShortName (FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, FF_T_INT8 *ShortName, FF_T_INT8 *LongName); +#endif + + +void FF_lockDIR (FF_IOMAN *pIoman); +void FF_unlockDIR (FF_IOMAN *pIoman); + +#ifdef FF_UNICODE_SUPPORT +FF_T_UINT32 FF_CreateFile(FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, FF_T_WCHAR *FileName, FF_DIRENT *pDirent, FF_ERROR *pError); +#else +FF_T_UINT32 FF_CreateFile(FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, FF_T_INT8 *FileName, FF_DIRENT *pDirent, FF_ERROR *pError); +#endif + +FF_ERROR FF_CreateDirent (FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, FF_DIRENT *pDirent); +FF_ERROR FF_ExtendDirectory (FF_IOMAN *pIoman, FF_T_UINT32 DirCluster); + +#ifdef FF_UNICODE_SUPPORT +FF_T_UINT32 FF_FindDir (FF_IOMAN *pIoman, const FF_T_WCHAR *path, FF_T_UINT16 pathLen, FF_ERROR *pError); +#else +FF_T_UINT32 FF_FindDir (FF_IOMAN *pIoman, const FF_T_INT8 *path, FF_T_UINT16 pathLen, FF_ERROR *pError); +#endif + +#ifdef FF_HASH_CACHE +FF_T_BOOL FF_CheckDirentHash (FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, FF_T_UINT32 nHash); +FF_T_BOOL FF_DirHashed (FF_IOMAN *pIoman, FF_T_UINT32 DirCluster); +FF_ERROR FF_AddDirentHash (FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, FF_T_UINT32 nHash); +FF_ERROR FF_HashDir (FF_IOMAN *pIoman, FF_T_UINT32 ulDirCluster); +#endif + +FF_ERROR FF_RmLFNs(FF_IOMAN *pIoman, FF_T_UINT16 usDirEntry, FF_FETCH_CONTEXT *pContext); #endif diff --git a/reactos/include/reactos/libs/fullfat/ff_error.h b/reactos/include/reactos/libs/fullfat/ff_error.h index 8a48c8f1cce..c6b39dcd018 100644 --- a/reactos/include/reactos/libs/fullfat/ff_error.h +++ b/reactos/include/reactos/libs/fullfat/ff_error.h @@ -40,53 +40,111 @@ #include "ff_config.h" #include "ff_types.h" +/** + Error codes are 32-bit numbers, and consist of three items: + 8Bits 8bits 16bits + ........ ........ ........ ........ + [ModuleID][FunctionID][-- ERROR CODE --] + +**/ + +#define FF_GETERROR(x) (x & 0x0000FFFF) + +#define FF_MODULE_SHIFT 24 +#define FF_FUNCTION_SHIFT 16 + +//----- FullFAT Module Identifiers +#define FF_MODULE_IOMAN (1 << FF_MODULE_SHIFT) +#define FF_MODULE_DIR (2 << FF_MODULE_SHIFT) +#define FF_MODULE_FILE (3 << FF_MODULE_SHIFT) +#define FF_MODULE_FAT (4 << FF_MODULE_SHIFT) +#define FF_MODULE_CRC (5 << FF_MODULE_SHIFT) +#define FF_MODULE_FORMAT (6 << FF_MODULE_SHIFT) +#define FF_MODULE_HASH (7 << FF_MODULE_SHIFT) +#define FF_MODULE_MEMORY (8 << FF_MODULE_SHIFT) +#define FF_MODULE_STRING (9 << FF_MODULE_SHIFT) +#define FF_MODULE_UNICODE (10 << FF_MODULE_SHIFT) +#define FF_MODULE_SAFETY (11 << FF_MODULE_SHIFT) +#define FF_MODULE_TIME (12 << FF_MODULE_SHIFT) +#define FF_MODULE_DRIVER (13 << FF_MODULE_SHIFT) // We can mark underlying platform error codes with this. + +//----- FullFAT Function Identifiers (In Modular Order) +//----- FF_IOMAN - The FullFAT I/O Manager. +#define FF_CREATEIOMAN (1 << FF_FUNCTION_SHIFT) | FF_MODULE_IOMAN +#define FF_DESTROYIOMAN (2 << FF_FUNCTION_SHIFT) | FF_MODULE_IOMAN +#define FF_REGISTERBLKDEVICE (3 << FF_FUNCTION_SHIFT) | FF_MODULE_IOMAN +#define FF_UNREGISTERBLKDEVICE (4 << FF_FUNCTION_SHIFT) | FF_MODULE_IOMAN +#define FF_MOUNTPARTITION (5 << FF_FUNCTION_SHIFT) | FF_MODULE_IOMAN +#define FF_UNMOUNTPARTITION (6 << FF_FUNCTION_SHIFT) | FF_MODULE_IOMAN +#define FF_FLUSHCACHE (7 << FF_FUNCTION_SHIFT) | FF_MODULE_IOMAN +#define FF_GETPARTITIONBLOCKSIZE (8 << FF_FUNCTION_SHIFT) | FF_MODULE_IOMAN +#define FF_BLOCKREAD (9 << FF_FUNCTION_SHIFT) | FF_MODULE_IOMAN +#define FF_BLOCKWRITE (10 << FF_FUNCTION_SHIFT) | FF_MODULE_IOMAN + +//----- FF_DIR - The FullFAT directory handling routines. +// -- COMPLETE THESE ERROR CODES TOMORROW :P + + /* FullFAT defines different Error-Code spaces for each module. This ensures that all error codes remain unique, and their meaning can be quickly identified. */ // Global Error Codes -#define FF_ERR_NONE 0 ///< No Error -#define FF_ERR_NULL_POINTER -2 ///< pIoman was NULL. -#define FF_ERR_NOT_ENOUGH_MEMORY -3 ///< malloc() failed! - Could not allocate handle memory. -#define FF_ERR_DEVICE_DRIVER_FAILED -4 ///< The Block Device driver reported a FATAL error, cannot continue. +#define FF_ERR_NONE 0 ///< No Error +//#define FF_ERR_GENERIC 1 ///< BAD NEVER USE THIS! +#define FF_ERR_NULL_POINTER 2 ///< pIoman was NULL. +#define FF_ERR_NOT_ENOUGH_MEMORY 3 ///< malloc() failed! - Could not allocate handle memory. +#define FF_ERR_DEVICE_DRIVER_FAILED 4 ///< The Block Device driver reported a FATAL error, cannot continue. // IOMAN Error Codes -#define FF_ERR_IOMAN_BAD_BLKSIZE -11 ///< The provided blocksize was not a multiple of 512. -#define FF_ERR_IOMAN_BAD_MEMSIZE -12 ///< The memory size was not a multiple of the blocksize. -#define FF_ERR_IOMAN_DEV_ALREADY_REGD -13 ///< Device was already registered. Use FF_UnRegister() to re-use this IOMAN with another device. -#define FF_ERR_IOMAN_NO_MOUNTABLE_PARTITION -14 ///< A mountable partition could not be found on the device. -#define FF_ERR_IOMAN_INVALID_FORMAT -15 ///< The -#define FF_ERR_IOMAN_INVALID_PARTITION_NUM -16 ///< The partition number provided was out of range. -#define FF_ERR_IOMAN_NOT_FAT_FORMATTED -17 ///< The partition did not look like a FAT partition. -#define FF_ERR_IOMAN_DEV_INVALID_BLKSIZE -18 ///< IOMAN object BlkSize is not compatible with the blocksize of this device driver. -#define FF_ERR_IOMAN_PARTITION_MOUNTED -19 ///< Device is in use by an actively mounted partition. Unmount the partition first. -#define FF_ERR_IOMAN_ACTIVE_HANDLES -20 ///< The partition cannot be unmounted until all active file handles are closed. (There may also be active handles on the cache). +#define FF_ERR_IOMAN_BAD_BLKSIZE 11 ///< The provided blocksize was not a multiple of 512. +#define FF_ERR_IOMAN_BAD_MEMSIZE 12 ///< The memory size was not a multiple of the blocksize. +#define FF_ERR_IOMAN_DEV_ALREADY_REGD 13 ///< Device was already registered. Use FF_UnRegister() to re-use this IOMAN with another device. +#define FF_ERR_IOMAN_NO_MOUNTABLE_PARTITION 14 ///< A mountable partition could not be found on the device. +#define FF_ERR_IOMAN_INVALID_FORMAT 15 ///< The +#define FF_ERR_IOMAN_INVALID_PARTITION_NUM 16 ///< The partition number provided was out of range. +#define FF_ERR_IOMAN_NOT_FAT_FORMATTED 17 ///< The partition did not look like a FAT partition. +#define FF_ERR_IOMAN_DEV_INVALID_BLKSIZE 18 ///< IOMAN object BlkSize is not compatible with the blocksize of this device driver. +#define FF_ERR_IOMAN_PARTITION_MOUNTED 19 ///< Device is in use by an actively mounted partition. Unmount the partition first. +#define FF_ERR_IOMAN_ACTIVE_HANDLES 20 ///< The partition cannot be unmounted until all active file handles are closed. (There may also be active handles on the cache). +#define FF_ERR_IOMAN_GPT_HEADER_CORRUPT 21 ///< The GPT partition table appears to be corrupt, refusing to mount. +#define FF_ERR_IOMAN_NOT_ENOUGH_FREE_SPACE 22 +#define FF_ERR_IOMAN_OUT_OF_BOUNDS_READ 23 +#define FF_ERR_IOMAN_OUT_OF_BOUNDS_WRITE 24 -// File Error Codes -30 + -#define FF_ERR_FILE_ALREADY_OPEN -30 ///< File is in use. -#define FF_ERR_FILE_NOT_FOUND -31 ///< File was not found. -#define FF_ERR_FILE_OBJECT_IS_A_DIR -32 ///< Tried to FF_Open() a Directory. -#define FF_ERR_FILE_IS_READ_ONLY -33 ///< Tried to FF_Open() a file marked read only. -#define FF_ERR_FILE_INVALID_PATH -34 ///< The path of the file was not found. -#define FF_ERR_FILE_NOT_OPENED_IN_WRITE_MODE -35 -#define FF_ERR_FILE_NOT_OPENED_IN_READ_MODE -36 -#define FF_ERR_FILE_EXTEND_FAILED -37 ///< Could not extend the file. -#define FF_ERR_FILE_DESTINATION_EXISTS -38 -#define FF_ERR_FILE_SOURCE_NOT_FOUND -39 -#define FF_ERR_FILE_DIR_NOT_FOUND -40 -#define FF_ERR_FILE_COULD_NOT_CREATE_DIRENT -41 +// File Error Codes 30 + +#define FF_ERR_FILE_ALREADY_OPEN 30 ///< File is in use. +#define FF_ERR_FILE_NOT_FOUND 31 ///< File was not found. +#define FF_ERR_FILE_OBJECT_IS_A_DIR 32 ///< Tried to FF_Open() a Directory. +#define FF_ERR_FILE_IS_READ_ONLY 33 ///< Tried to FF_Open() a file marked read only. +#define FF_ERR_FILE_INVALID_PATH 34 ///< The path of the file was not found. +#define FF_ERR_FILE_NOT_OPENED_IN_WRITE_MODE 35 +#define FF_ERR_FILE_NOT_OPENED_IN_READ_MODE 36 +#define FF_ERR_FILE_EXTEND_FAILED 37 ///< Could not extend the file. +#define FF_ERR_FILE_DESTINATION_EXISTS 38 +#define FF_ERR_FILE_SOURCE_NOT_FOUND 39 +#define FF_ERR_FILE_DIR_NOT_FOUND 40 +#define FF_ERR_FILE_COULD_NOT_CREATE_DIRENT 41 -// Directory Error Codes -50 + -#define FF_ERR_DIR_OBJECT_EXISTS -50 ///< A file or folder of the same name already exists in the current directory. -#define FF_ERR_DIR_DIRECTORY_FULL -51 ///< No more items could be added to the directory. -#define FF_ERR_DIR_END_OF_DIR -52 /// -#define FF_ERR_DIR_NOT_EMPTY -53 ///< Cannot delete a directory that contains files or folders. -#define FF_ERR_DIR_INVALID_PATH -54 ///< Could not find the directory specified by the path. -#define FF_ERR_DIR_CANT_EXTEND_ROOT_DIR -55 ///< Can't extend the root dir. +// Directory Error Codes 50 + +#define FF_ERR_DIR_OBJECT_EXISTS 50 ///< A file or folder of the same name already exists in the current directory. +#define FF_ERR_DIR_DIRECTORY_FULL 51 ///< No more items could be added to the directory. +#define FF_ERR_DIR_END_OF_DIR 52 /// +#define FF_ERR_DIR_NOT_EMPTY 53 ///< Cannot delete a directory that contains files or folders. +#define FF_ERR_DIR_INVALID_PATH 54 ///< Could not find the directory specified by the path. +#define FF_ERR_DIR_CANT_EXTEND_ROOT_DIR 55 ///< Can't extend the root dir. +#define FF_ERR_DIR_EXTEND_FAILED 56 ///< Not enough space to extend the directory. +#define FF_ERR_DIR_NAME_TOO_LONG 57 ///< Name exceeds the number of allowed charachters for a filename. -// Fat Error Codes -70 + -#define FF_ERR_FAT_NO_FREE_CLUSTERS -70 ///< No more free space is available on the disk. +// Fat Error Codes 70 + +#define FF_ERR_FAT_NO_FREE_CLUSTERS 70 ///< No more free space is available on the disk. + +// UNICODE Error Codes 100 + +#define FF_ERR_UNICODE_INVALID_CODE 100 ///< An invalid Unicode charachter was provided! +#define FF_ERR_UNICODE_DEST_TOO_SMALL 101 ///< Not enough space in the UTF-16 buffer to encode the entire sequence as UTF-16. +#define FF_ERR_UNICODE_INVALID_SEQUENCE 102 ///< An invalid UTF-16 sequence was encountered. +#define FF_ERR_UNICODE_CONVERSION_EXCEEDED 103 ///< Filename exceeds MAX long-filename length when converted to UTF-16. #ifdef FF_DEBUG const FF_T_INT8 *FF_GetErrMessage(FF_ERROR iErrorCode); diff --git a/reactos/include/reactos/libs/fullfat/ff_fat.h b/reactos/include/reactos/libs/fullfat/ff_fat.h index 8add6d0132e..0ff784590ab 100644 --- a/reactos/include/reactos/libs/fullfat/ff_fat.h +++ b/reactos/include/reactos/libs/fullfat/ff_fat.h @@ -52,24 +52,23 @@ FF_T_UINT32 FF_getRealLBA (FF_IOMAN *pIoman, FF_T_UINT32 LBA); FF_T_UINT32 FF_Cluster2LBA (FF_IOMAN *pIoman, FF_T_UINT32 Cluster); FF_T_UINT32 FF_LBA2Cluster (FF_IOMAN *pIoman, FF_T_UINT32 Address); - FF_T_SINT32 FF_getFatEntry (FF_IOMAN *pIoman, FF_T_UINT32 nCluster); + FF_T_UINT32 FF_getFatEntry (FF_IOMAN *pIoman, FF_T_UINT32 nCluster, FF_ERROR *pError); + FF_ERROR FF_putFatEntry (FF_IOMAN *pIoman, FF_T_UINT32 nCluster, FF_T_UINT32 Value); FF_T_BOOL FF_isEndOfChain (FF_IOMAN *pIoman, FF_T_UINT32 fatEntry); - FF_T_SINT8 FF_putFatEntry (FF_IOMAN *pIoman, FF_T_UINT32 nCluster, FF_T_UINT32 Value); - FF_T_UINT32 FF_FindFreeCluster (FF_IOMAN *pIoman); + FF_T_UINT32 FF_FindFreeCluster (FF_IOMAN *pIoman, FF_ERROR *pError); FF_T_UINT32 FF_ExtendClusterChain (FF_IOMAN *pIoman, FF_T_UINT32 StartCluster, FF_T_UINT32 Count); - FF_T_SINT8 FF_UnlinkClusterChain (FF_IOMAN *pIoman, FF_T_UINT32 StartCluster, FF_T_UINT16 Count); - FF_T_UINT32 FF_TraverseFAT (FF_IOMAN *pIoman, FF_T_UINT32 Start, FF_T_UINT32 Count); - FF_T_UINT32 FF_CreateClusterChain (FF_IOMAN *pIoman); - FF_T_UINT32 FF_GetChainLength (FF_IOMAN *pIoman, FF_T_UINT32 pa_nStartCluster, FF_T_UINT32 *piEndOfChain); - FF_T_UINT32 FF_FindEndOfChain (FF_IOMAN *pIoman, FF_T_UINT32 Start); - FF_T_SINT8 FF_ClearCluster (FF_IOMAN *pIoman, FF_T_UINT32 nCluster); + FF_ERROR FF_UnlinkClusterChain (FF_IOMAN *pIoman, FF_T_UINT32 StartCluster, FF_T_UINT16 Count); + FF_T_UINT32 FF_TraverseFAT (FF_IOMAN *pIoman, FF_T_UINT32 Start, FF_T_UINT32 Count, FF_ERROR *pError); + FF_T_UINT32 FF_CreateClusterChain (FF_IOMAN *pIoman, FF_ERROR *pError); + FF_T_UINT32 FF_GetChainLength (FF_IOMAN *pIoman, FF_T_UINT32 pa_nStartCluster, FF_T_UINT32 *piEndOfChain, FF_ERROR *pError); + FF_T_UINT32 FF_FindEndOfChain (FF_IOMAN *pIoman, FF_T_UINT32 Start, FF_ERROR *pError); + FF_ERROR FF_ClearCluster (FF_IOMAN *pIoman, FF_T_UINT32 nCluster); #ifdef FF_64_NUM_SUPPORT - FF_T_UINT64 FF_GetFreeSize (FF_IOMAN *pIoman); + FF_T_UINT64 FF_GetFreeSize (FF_IOMAN *pIoman, FF_ERROR *pError); #else - FF_T_UINT32 FF_GetFreeSize (FF_IOMAN *pIoman); + FF_T_UINT32 FF_GetFreeSize (FF_IOMAN *pIoman, FF_ERROR *pError); #endif - FF_T_UINT32 FF_FindFreeCluster (FF_IOMAN *pIoman); - FF_T_UINT32 FF_CountFreeClusters (FF_IOMAN *pIoman); + FF_T_UINT32 FF_CountFreeClusters (FF_IOMAN *pIoman, FF_ERROR *pError); // WARNING: If this protoype changes, it must be updated in ff_ioman.c also! void FF_lockFAT (FF_IOMAN *pIoman); void FF_unlockFAT (FF_IOMAN *pIoman); diff --git a/reactos/include/reactos/libs/fullfat/ff_fatdef.h b/reactos/include/reactos/libs/fullfat/ff_fatdef.h index 7fd7c3c5f6f..8e86d138a6d 100644 --- a/reactos/include/reactos/libs/fullfat/ff_fatdef.h +++ b/reactos/include/reactos/libs/fullfat/ff_fatdef.h @@ -86,5 +86,20 @@ #define FF_FAT_ATTR_ARCHIVE 0x20 #define FF_FAT_ATTR_LFN 0x0F +/** + * -- Hein_Tibosch additions for mixed case in shortnames -- + * + * Specifically, bit 4 means lowercase extension and bit 3 lowercase basename, + * which allows for combinations such as "example.TXT" or "HELLO.txt" but not "Mixed.txt" + */ + +#define FF_FAT_CASE_OFFS 0x0C ///< After NT/XP : 2 case bits +#define FF_FAT_CASE_ATTR_BASE 0x08 +#define FF_FAT_CASE_ATTR_EXT 0x10 + +#if defined(FF_LFN_SUPPORT) && defined(FF_INCLUDE_SHORT_NAME) +#define FF_FAT_ATTR_IS_LFN 0x40 ///< artificial attribute, for debugging only +#endif + #endif diff --git a/reactos/include/reactos/libs/fullfat/ff_file.h b/reactos/include/reactos/libs/fullfat/ff_file.h index e74d4a6a6ed..ac5528e38c7 100644 --- a/reactos/include/reactos/libs/fullfat/ff_file.h +++ b/reactos/include/reactos/libs/fullfat/ff_file.h @@ -75,19 +75,29 @@ typedef struct _FF_FILE { //---------- PROTOTYPES // PUBLIC (Interfaces): -FF_FILE *FF_Open (FF_IOMAN *pIoman, const FF_T_INT8 *path, FF_T_UINT8 Mode, FF_ERROR *pError); +#ifdef FF_UNICODE_SUPPORT +FF_FILE *FF_Open(FF_IOMAN *pIoman, const FF_T_WCHAR *path, FF_T_UINT8 Mode, FF_ERROR *pError); +FF_T_BOOL FF_isDirEmpty (FF_IOMAN *pIoman, const FF_T_WCHAR *Path); +FF_ERROR FF_RmFile (FF_IOMAN *pIoman, const FF_T_WCHAR *path); +FF_ERROR FF_RmDir (FF_IOMAN *pIoman, const FF_T_WCHAR *path); +FF_ERROR FF_Move (FF_IOMAN *pIoman, const FF_T_WCHAR *szSourceFile, const FF_T_WCHAR *szDestinationFile); +#else +FF_FILE *FF_Open(FF_IOMAN *pIoman, const FF_T_INT8 *path, FF_T_UINT8 Mode, FF_ERROR *pError); +FF_T_BOOL FF_isDirEmpty (FF_IOMAN *pIoman, const FF_T_INT8 *Path); +FF_ERROR FF_RmFile (FF_IOMAN *pIoman, const FF_T_INT8 *path); +FF_ERROR FF_RmDir (FF_IOMAN *pIoman, const FF_T_INT8 *path); +FF_ERROR FF_Move (FF_IOMAN *pIoman, const FF_T_INT8 *szSourceFile, const FF_T_INT8 *szDestinationFile); +#endif FF_ERROR FF_Close (FF_FILE *pFile); FF_T_SINT32 FF_GetC (FF_FILE *pFile); +FF_T_SINT32 FF_GetLine (FF_FILE *pFile, FF_T_INT8 *szLine, FF_T_UINT32 ulLimit); FF_T_SINT32 FF_Read (FF_FILE *pFile, FF_T_UINT32 ElementSize, FF_T_UINT32 Count, FF_T_UINT8 *buffer); FF_T_SINT32 FF_Write (FF_FILE *pFile, FF_T_UINT32 ElementSize, FF_T_UINT32 Count, FF_T_UINT8 *buffer); FF_T_BOOL FF_isEOF (FF_FILE *pFile); FF_ERROR FF_Seek (FF_FILE *pFile, FF_T_SINT32 Offset, FF_T_INT8 Origin); FF_T_SINT32 FF_PutC (FF_FILE *pFile, FF_T_UINT8 Value); FF_T_UINT32 FF_Tell (FF_FILE *pFile); -FF_ERROR FF_RmFile (FF_IOMAN *pIoman, const FF_T_INT8 *path); -FF_ERROR FF_RmDir (FF_IOMAN *pIoman, const FF_T_INT8 *path); -FF_T_BOOL FF_isDirEmpty (FF_IOMAN *pIoman, const FF_T_INT8 *Path); -FF_ERROR FF_Move (FF_IOMAN *pIoman, const FF_T_INT8 *szSourceFile, const FF_T_INT8 *szDestinationFile); + FF_T_UINT8 FF_GetModeBits (FF_T_INT8 *Mode); // Private : diff --git a/reactos/include/reactos/libs/fullfat/ff_format.h b/reactos/include/reactos/libs/fullfat/ff_format.h new file mode 100644 index 00000000000..d7c53e58a9f --- /dev/null +++ b/reactos/include/reactos/libs/fullfat/ff_format.h @@ -0,0 +1,47 @@ +/***************************************************************************** + * FullFAT - High Performance, Thread-Safe Embedded FAT File-System * + * Copyright (C) 2009 James Walmsley (james@worm.me.uk) * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + * IMPORTANT NOTICE: * + * ================= * + * Alternative Licensing is available directly from the Copyright holder, * + * (James Walmsley). For more information consult LICENSING.TXT to obtain * + * a Commercial license. * + * * + * See RESTRICTIONS.TXT for extra restrictions on the use of FullFAT. * + * * + * Removing the above notice is illegal and will invalidate this license. * + ***************************************************************************** + * See http://worm.me.uk/fullfat for more information. * + * Or http://fullfat.googlecode.com/ for latest releases and the wiki. * + *****************************************************************************/ + +/** + * @file ff_format.c + * @author James Walmsley + * @ingroup FORMAT + * + **/ + + +#ifndef _FF_FORMAT_H_ +#define _FF_FORMAT_H_ + + + + + +#endif diff --git a/reactos/include/reactos/libs/fullfat/ff_ioman.h b/reactos/include/reactos/libs/fullfat/ff_ioman.h index d59c10593cd..92d62ebd85d 100644 --- a/reactos/include/reactos/libs/fullfat/ff_ioman.h +++ b/reactos/include/reactos/libs/fullfat/ff_ioman.h @@ -87,8 +87,8 @@ typedef FF_T_SINT32 (*FF_READ_BLOCKS) (FF_T_UINT8 *pBuffer, FF_T_UINT32 SectorAd * @brief Describes the block device driver interface to FullFAT. **/ typedef struct { - FF_WRITE_BLOCKS fnWriteBlocks; ///< Function Pointer, to write a block(s) from a block device. - FF_READ_BLOCKS fnReadBlocks; ///< Function Pointer, to read a block(s) from a block device. + FF_WRITE_BLOCKS fnpWriteBlocks; ///< Function Pointer, to write a block(s) from a block device. + FF_READ_BLOCKS fnpReadBlocks; ///< Function Pointer, to read a block(s) from a block device. FF_T_UINT16 devBlkSize; ///< Block size that the driver deals with. void *pParam; ///< Pointer to some parameters e.g. for a Low-Level Driver Handle } FF_BLK_DEVICE; @@ -110,14 +110,23 @@ typedef struct { } FF_BUFFER; typedef struct { +#ifdef FF_UNICODE_SUPPORT + FF_T_WCHAR Path[FF_MAX_PATH]; +#else FF_T_INT8 Path[FF_MAX_PATH]; - FF_T_UINT32 DirCluster; -#ifdef FF_HASH_TABLE_SUPPORT - FF_HASH_TABLE pHashTable; - FF_T_BOOL bHashed; #endif + FF_T_UINT32 DirCluster; } FF_PATHCACHE; +#ifdef FF_HASH_CACHE +typedef struct { + FF_T_UINT32 ulDirCluster; ///< The Starting Cluster of the dir that the hash represents. + FF_HASH_TABLE pHashTable; ///< Pointer to the Hash Table object. + FF_T_UINT32 ulNumHandles; ///< Number of active Handles using this hash table. + FF_T_UINT32 ulMisses; ///< Number of times this Hash Table was missed, (i.e. how redundant it is). +} FF_HASHCACHE; +#endif + /** * @private * @brief FullFAT identifies a partition with the following data. @@ -183,6 +192,9 @@ typedef struct { FF_PARTITION *pPartition; ///< Pointer to a partition description. FF_BUFFER *pBuffers; ///< Pointer to the first buffer description. void *pSemaphore; ///< Pointer to a Semaphore object. (For buffer description modifications only!). +#ifdef FF_BLKDEV_USES_SEM + void *pBlkDevSemaphore; ///< Semaphore to guarantee Atomic access to the underlying block device, if required. +#endif void *FirstFile; ///< Pointer to the first File object. FF_T_UINT8 *pCacheMem; ///< Pointer to a block of memory for the cache. FF_T_UINT32 LastReplaced; ///< Marks which sector was last replaced in the cache. @@ -191,6 +203,9 @@ typedef struct { FF_T_UINT8 PreventFlush; ///< Flushing to disk only allowed when 0 FF_T_UINT8 MemAllocation; ///< Bit-Mask identifying allocated pointers. FF_T_UINT8 Locks; ///< Lock Flag for FAT & DIR Locking etc (This must be accessed via a semaphore). +#ifdef FF_HASH_CACHE + FF_HASHCACHE HashCache[FF_HASH_CACHE_DEPTH]; +#endif } FF_IOMAN; // Bit-Masks for Memory Allocation testing. @@ -220,6 +235,8 @@ FF_T_UINT32 FF_GetVolumeSize(FF_IOMAN *pIoman); #endif // PUBLIC (To FullFAT Only): +FF_T_SINT32 FF_BlockRead (FF_IOMAN *pIoman, FF_T_UINT32 ulSectorLBA, FF_T_UINT32 ulNumSectors, void *pBuffer); +FF_T_SINT32 FF_BlockWrite (FF_IOMAN *pIoman, FF_T_UINT32 ulSectorLBA, FF_T_UINT32 ulNumSectors, void *pBuffer); FF_ERROR FF_IncreaseFreeClusters (FF_IOMAN *pIoman, FF_T_UINT32 Count); FF_ERROR FF_DecreaseFreeClusters (FF_IOMAN *pIoman, FF_T_UINT32 Count); FF_BUFFER *FF_GetBuffer (FF_IOMAN *pIoman, FF_T_UINT32 Sector, FF_T_UINT8 Mode); diff --git a/reactos/include/reactos/libs/fullfat/ff_memory.h b/reactos/include/reactos/libs/fullfat/ff_memory.h index 555a829210a..03ae55a77a3 100644 --- a/reactos/include/reactos/libs/fullfat/ff_memory.h +++ b/reactos/include/reactos/libs/fullfat/ff_memory.h @@ -76,7 +76,7 @@ typedef struct { #else -#error Little or Big Endian? +#error Little or Big Endian? - Please set an endianess in ff_config.h #endif diff --git a/reactos/include/reactos/libs/fullfat/ff_string.h b/reactos/include/reactos/libs/fullfat/ff_string.h index e3789102e4b..a5e85955da4 100644 --- a/reactos/include/reactos/libs/fullfat/ff_string.h +++ b/reactos/include/reactos/libs/fullfat/ff_string.h @@ -44,11 +44,37 @@ #define _FF_STRING_H_ #include "ff_types.h" +#include "ff_config.h" +#include -void FF_tolower (FF_T_INT8 *string, FF_T_UINT32 strLen); -void FF_toupper (FF_T_INT8 *string, FF_T_UINT32 strLen); -FF_T_BOOL FF_strmatch (const FF_T_INT8 *str1, const FF_T_INT8 *str2, FF_T_UINT16 len); -FF_T_INT8 *FF_strtok (const FF_T_INT8 *string, FF_T_INT8 *token, FF_T_UINT16 *tokenNumber, FF_T_BOOL *last, FF_T_UINT16 Length); -FF_T_BOOL FF_wildcompare(const FF_T_INT8 *pszWildCard, const FF_T_INT8 *pszString); +#ifdef WIN32 +#define stricmp stricmp +#define FF_stricmp stricmp +#else +#define strcasecmp strcasecmp +#define FF_stricmp strcasecmp +#endif + +#ifdef FF_UNICODE_SUPPORT +void FF_tolower (FF_T_WCHAR *string, FF_T_UINT32 strLen); +void FF_toupper (FF_T_WCHAR *string, FF_T_UINT32 strLen); +FF_T_BOOL FF_strmatch (const FF_T_WCHAR *str1, const FF_T_WCHAR *str2, FF_T_UINT16 len); +FF_T_WCHAR *FF_strtok (const FF_T_WCHAR *string, FF_T_WCHAR *token, FF_T_UINT16 *tokenNumber, FF_T_BOOL *last, FF_T_UINT16 Length); +FF_T_BOOL FF_wildcompare (const FF_T_WCHAR *pszWildCard, const FF_T_WCHAR *pszString); + +// ASCII to UTF16 and UTF16 to ASCII routines. -- These are lossy routines, and are only for converting ASCII to UTF-16 +// and the equivalent back to ASCII. Do not use them for international text. +void FF_cstrtowcs(FF_T_WCHAR *wcsDest, const FF_T_INT8 *szpSource); +void FF_wcstocstr(FF_T_INT8 *szpDest, const FF_T_WCHAR *wcsSource); +void FF_cstrntowcs(FF_T_WCHAR *wcsDest, const FF_T_INT8 *szpSource, FF_T_UINT32 len); +void FF_wcsntocstr(FF_T_INT8 *szpDest, const FF_T_WCHAR *wcsSource, FF_T_UINT32 len); + +#else +void FF_tolower (FF_T_INT8 *string, FF_T_UINT32 strLen); +void FF_toupper (FF_T_INT8 *string, FF_T_UINT32 strLen); +FF_T_BOOL FF_strmatch (const FF_T_INT8 *str1, const FF_T_INT8 *str2, FF_T_UINT16 len); +FF_T_INT8 *FF_strtok (const FF_T_INT8 *string, FF_T_INT8 *token, FF_T_UINT16 *tokenNumber, FF_T_BOOL *last, FF_T_UINT16 Length); +FF_T_BOOL FF_wildcompare (const FF_T_INT8 *pszWildCard, const FF_T_INT8 *pszString); +#endif #endif diff --git a/reactos/include/reactos/libs/fullfat/ff_types.h b/reactos/include/reactos/libs/fullfat/ff_types.h index 59a599670a3..0a3d5c280f1 100644 --- a/reactos/include/reactos/libs/fullfat/ff_types.h +++ b/reactos/include/reactos/libs/fullfat/ff_types.h @@ -61,6 +61,11 @@ typedef long FF_T_INT32; ///< 32 bit default integer. typedef unsigned long FF_T_UINT32; ///< 32 bit unsigned integer. typedef signed long FF_T_SINT32; ///< 32 bit signed integer. +//---------------- Platform Integer Sizes +typedef int FF_T_INT; +typedef unsigned int FF_T_UINT; +typedef signed int FF_T_SINT; + #ifdef FF_64_NUM_SUPPORT //---------------- 64 BIT INTEGERS // If you cannot define these, then make sure you see ff_config.h typedef long long FF_T_INT64; // about 64-bit number support. @@ -70,5 +75,9 @@ typedef signed long long FF_T_SINT64; // > 4GB in bytes if you cannot support 64 #endif typedef FF_T_SINT32 FF_ERROR; ///< A special error code type to ease some inconsistencies in Error reporting. +#ifdef FF_UNICODE_SUPPORT +#include +typedef wchar_t FF_T_WCHAR; ///< Unicode UTF-16 Charachter type, for FullFAT when UNICODE is enabled. +#endif #endif // end of include guard diff --git a/reactos/include/reactos/libs/fullfat/ff_unicode.h b/reactos/include/reactos/libs/fullfat/ff_unicode.h new file mode 100644 index 00000000000..9f0cbecb4cd --- /dev/null +++ b/reactos/include/reactos/libs/fullfat/ff_unicode.h @@ -0,0 +1,60 @@ +/***************************************************************************** + * FullFAT - High Performance, Thread-Safe Embedded FAT File-System * + * Copyright (C) 2009 James Walmsley (james@worm.me.uk) * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + * IMPORTANT NOTICE: * + * ================= * + * Alternative Licensing is available directly from the Copyright holder, * + * (James Walmsley). For more information consult LICENSING.TXT to obtain * + * a Commercial license. * + * * + * See RESTRICTIONS.TXT for extra restrictions on the use of FullFAT. * + * * + * Removing the above notice is illegal and will invalidate this license. * + ***************************************************************************** + * See http://worm.me.uk/fullfat for more information. * + * Or http://fullfat.googlecode.com/ for latest releases and the wiki. * + *****************************************************************************/ + +/** + * @file ff_unicode.c + * @author James Walmsley + * @ingroup UNICODE + * + **/ + +#ifndef _FF_UNICODE_H_ +#define _FF_UNICODE_H_ + +#include "ff_config.h" +#include "ff_types.h" +#include "ff_error.h" + +// UTF8 / UTF16 Transformation Functions + +FF_T_UINT FF_GetUtf16SequenceLen (FF_T_UINT16 usLeadChar); +FF_T_SINT32 FF_Utf8ctoUtf16c (FF_T_UINT16 *utf16Dest, const FF_T_UINT8 *utf8Source, FF_T_UINT32 ulSize); +FF_T_SINT32 FF_Utf16ctoUtf8c (FF_T_UINT8 *utf8Dest, const FF_T_UINT16 *utf16Source, FF_T_UINT32 ulSize); + +// UTF16 / UTF32 Transformation Functions + +FF_T_SINT32 FF_Utf16ctoUtf32c(FF_T_UINT32 *utf32Dest, const FF_T_UINT16 *utf16Source); +FF_T_SINT32 FF_Utf32ctoUtf16c(FF_T_UINT16 *utf16Dest, FF_T_UINT32 utf32char, FF_T_UINT32 ulSize); + +// String transformations +FF_T_SINT32 FF_Utf32stoUtf8s(FF_T_UINT8 *Utf8String, FF_T_UINT32 *Utf32String); + +#endif diff --git a/reactos/include/reactos/libs/fullfat/fullfat.h b/reactos/include/reactos/libs/fullfat/fullfat.h index e4e8363e432..18aa2bb2549 100644 --- a/reactos/include/reactos/libs/fullfat/fullfat.h +++ b/reactos/include/reactos/libs/fullfat/fullfat.h @@ -45,6 +45,7 @@ extern "C" { #include "ff_crc.h" #include "ff_hash.h" #include "ff_string.h" +#include "ff_unicode.h" //#include "ff_format.h" #ifdef __cplusplus diff --git a/reactos/lib/3rdparty/fullfat/ff_crc.c b/reactos/lib/3rdparty/fullfat/ff_crc.c index 9c6ea469334..2b6f76ba5a2 100644 --- a/reactos/lib/3rdparty/fullfat/ff_crc.c +++ b/reactos/lib/3rdparty/fullfat/ff_crc.c @@ -41,7 +41,68 @@ #include "ff_crc.h" -static const FF_T_UINT8 CRC16_Low[256] = + +static const FF_T_UINT32 crc32_table[256] = { + 0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419, 0x706AF48F, + 0xE963A535, 0x9E6495A3, 0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988, + 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91, 0x1DB71064, 0x6AB020F2, + 0xF3B97148, 0x84BE41DE, 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7, + 0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, 0x14015C4F, 0x63066CD9, + 0xFA0F3D63, 0x8D080DF5, 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172, + 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B, 0x35B5A8FA, 0x42B2986C, + 0xDBBBC9D6, 0xACBCF940, 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59, + 0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, 0x21B4F4B5, 0x56B3C423, + 0xCFBA9599, 0xB8BDA50F, 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924, + 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D, 0x76DC4190, 0x01DB7106, + 0x98D220BC, 0xEFD5102A, 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433, + 0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, 0x7F6A0DBB, 0x086D3D2D, + 0x91646C97, 0xE6635C01, 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E, + 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457, 0x65B0D9C6, 0x12B7E950, + 0x8BBEB8EA, 0xFCB9887C, 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65, + 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, 0x4ADFA541, 0x3DD895D7, + 0xA4D1C46D, 0xD3D6F4FB, 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0, + 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9, 0x5005713C, 0x270241AA, + 0xBE0B1010, 0xC90C2086, 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F, + 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, 0x59B33D17, 0x2EB40D81, + 0xB7BD5C3B, 0xC0BA6CAD, 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A, + 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683, 0xE3630B12, 0x94643B84, + 0x0D6D6A3E, 0x7A6A5AA8, 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1, + 0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, 0xF762575D, 0x806567CB, + 0x196C3671, 0x6E6B06E7, 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC, + 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5, 0xD6D6A3E8, 0xA1D1937E, + 0x38D8C2C4, 0x4FDFF252, 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B, + 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, 0xDF60EFC3, 0xA867DF55, + 0x316E8EEF, 0x4669BE79, 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236, + 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F, 0xC5BA3BBE, 0xB2BD0B28, + 0x2BB45A92, 0x5CB36A04, 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D, + 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, 0x9C0906A9, 0xEB0E363F, + 0x72076785, 0x05005713, 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38, + 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21, 0x86D3D2D4, 0xF1D4E242, + 0x68DDB3F8, 0x1FDA836E, 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777, + 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, 0x8F659EFF, 0xF862AE69, + 0x616BFFD3, 0x166CCF45, 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2, + 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB, 0xAED16A4A, 0xD9D65ADC, + 0x40DF0B66, 0x37D83BF0, 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9, + 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, 0xBAD03605, 0xCDD70693, + 0x54DE5729, 0x23D967BF, 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94, + 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D +}; + +FF_T_UINT32 FF_GetCRC32(FF_T_UINT8 *pbyData, FF_T_UINT32 stLength) { + + register FF_T_UINT32 crc = 0xFFFFFFFF; + + while(stLength--) { + crc = ((crc >> 8) & 0x00FFFFFF) ^ crc32_table[(crc^*pbyData++) & 0x000000FF]; + } + + return (crc ^ 0xFFFFFFFF); +} + + + + +static const FF_T_UINT8 crc16_table_low[256] = { 0x000, 0x0c1, 0x081, 0x040, 0x001, 0x0c0, 0x080, 0x041, 0x001, 0x0c0, 0x080, 0x041, 0x000, 0x0c1, 0x081, 0x040, @@ -77,7 +138,7 @@ static const FF_T_UINT8 CRC16_Low[256] = 0x001, 0x0c0, 0x080, 0x041, 0x000, 0x0c1, 0x081, 0x040, }; -static const FF_T_UINT8 CRC16_High[256] = +static const FF_T_UINT8 crc16_table_high[256] = { 0x000, 0x0c0, 0x0c1, 0x001, 0x0c3, 0x003, 0x002, 0x0c2, 0x0c6, 0x006, 0x007, 0x0c7, 0x005, 0x0c5, 0x0c4, 0x004, @@ -130,15 +191,15 @@ FF_T_UINT16 FF_GetCRC16(FF_T_UINT8 *pbyData, FF_T_UINT32 stLength) { while (stLength--) { bTableValue = (FF_T_UINT8)((wCRC & 0x00FF) ^ *pbyData++); - wCRC = (FF_T_UINT16)(((CRC16_High[bTableValue]) << 8) - + (CRC16_Low[bTableValue] ^ ((wCRC >> 8) & 0x00FF))); + wCRC = (FF_T_UINT16)(((crc16_table_high[bTableValue]) << 8) + + (crc16_table_low[bTableValue] ^ ((wCRC >> 8) & 0x00FF))); } return wCRC; } -static const FF_T_UINT8 byCRCLookUpTable[256] = +static const FF_T_UINT8 crc8_table[256] = { 0, 94, 188, 226, 97, 63, 221, 131, 194, 156, 126, 32, 163, 253, 31, 65, @@ -188,7 +249,7 @@ FF_T_UINT8 FF_GetCRC8(FF_T_UINT8 *pbyData, FF_T_UINT32 stLength) { FF_T_UINT8 byCRC = 0, byData; while (stLength--) { byData = *pbyData++; - byCRC = byCRCLookUpTable[(byCRC ^ byData)]; + byCRC = crc8_table[(byCRC ^ byData)]; } return byCRC; } diff --git a/reactos/lib/3rdparty/fullfat/ff_dir.c b/reactos/lib/3rdparty/fullfat/ff_dir.c index f35d91c02e6..f34c18ecbab 100644 --- a/reactos/lib/3rdparty/fullfat/ff_dir.c +++ b/reactos/lib/3rdparty/fullfat/ff_dir.c @@ -42,16 +42,44 @@ #include "ff_dir.h" #include "ff_string.h" +#include "ff_unicode.h" #include + +#ifdef FF_UNICODE_SUPPORT +#include +#endif + +#ifdef WIN32 +#else +#include // tolower() +int strcasecmp(const char *s1, const char *s2) +{ + unsigned char c1,c2; + do { + c1 = *s1++; + c2 = *s2++; + c1 = (unsigned char) tolower( (unsigned char) c1); + c2 = (unsigned char) tolower( (unsigned char) c2); + } + while((c1 == c2) && (c1 != '\0')); + return (int) c1-c2; +} +#endif + + +#ifdef FF_UNICODE_SUPPORT +static void FF_ProcessShortName(FF_T_WCHAR *name); +#else static void FF_ProcessShortName(FF_T_INT8 *name); +#endif void FF_lockDIR(FF_IOMAN *pIoman) { - FF_PendSemaphore(pIoman->pSemaphore); // Use Semaphore to protect FAT modifications. + FF_PendSemaphore(pIoman->pSemaphore); // Use Semaphore to protect DIR modifications. { while((pIoman->Locks & FF_DIR_LOCK)) { FF_ReleaseSemaphore(pIoman->pSemaphore); - FF_Yield(); // Keep Releasing and Yielding until we have the Fat protector. + FF_Yield(); // Keep Releasing and Yielding until we have the DIR protector. FF_PendSemaphore(pIoman->pSemaphore); } pIoman->Locks |= FF_DIR_LOCK; @@ -77,24 +105,28 @@ static FF_T_UINT8 FF_CreateChkSum(const FF_T_UINT8 *pa_pShortName) { return ChkSum; } -FF_T_SINT8 FF_FindNextInDir(FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, FF_DIRENT *pDirent) { + +FF_ERROR FF_FindNextInDir(FF_IOMAN *pIoman, FF_DIRENT *pDirent, FF_FETCH_CONTEXT *pFetchContext) { - FF_T_UINT8 numLFNs; - FF_T_UINT8 EntryBuffer[32]; + FF_T_UINT8 numLFNs; + FF_T_UINT8 EntryBuffer[32]; + FF_ERROR Error; if(!pIoman) { return FF_ERR_NULL_POINTER; } - //pDirent->NumLFNs = 0; - for(; pDirent->CurrentItem < 0xFFFF; pDirent->CurrentItem += 1) { - if(FF_FetchEntry(pIoman, DirCluster, pDirent->CurrentItem, EntryBuffer)) { - return -2; + + Error = FF_FetchEntryWithContext(pIoman, pDirent->CurrentItem, pFetchContext, EntryBuffer); + + if(Error) { + return Error; } + if(EntryBuffer[0] != 0xE5) { if(FF_isEndOfDir(EntryBuffer)){ - return -2; + return FF_ERR_DIR_END_OF_DIR; } pDirent->Attrib = FF_getChar(EntryBuffer, (FF_T_UINT16)(FF_FAT_DIRENT_ATTRIB)); if((pDirent->Attrib & FF_FAT_ATTR_LFN) == FF_FAT_ATTR_LFN) { @@ -102,8 +134,11 @@ FF_T_SINT8 FF_FindNextInDir(FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, FF_DIRENT numLFNs = (FF_T_UINT8)(EntryBuffer[0] & ~0x40); //pDirent->NumLFNs = numLFNs; #ifdef FF_LFN_SUPPORT - FF_PopulateLongDirent(pIoman, pDirent, DirCluster, pDirent->CurrentItem); - return 0; + Error = FF_PopulateLongDirent(pIoman, pDirent, pDirent->CurrentItem, pFetchContext); + if(Error) { + return Error; + } + return FF_ERR_NONE; #else pDirent->CurrentItem += (numLFNs - 1); #endif @@ -113,421 +148,307 @@ FF_T_SINT8 FF_FindNextInDir(FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, FF_DIRENT } else { FF_PopulateShortDirent(pIoman, pDirent, EntryBuffer); pDirent->CurrentItem += 1; - return 0; + return FF_ERR_NONE; } } } - return -1; + return FF_ERR_DIR_END_OF_DIR; } -/* -FF_T_BOOL FF_ShortNameExists(FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, FF_T_INT8 *name) { - FF_DIRENT MyDir; +#ifdef FF_UNICODE_SUPPORT +static FF_T_BOOL FF_ShortNameExists(FF_IOMAN *pIoman, FF_T_UINT32 ulDirCluster, FF_T_WCHAR *szShortName, FF_ERROR *pError) { +#else +static FF_T_BOOL FF_ShortNameExists(FF_IOMAN *pIoman, FF_T_UINT32 ulDirCluster, FF_T_INT8 *szShortName, FF_ERROR *pError) { +#endif - if(FF_FindEntry(pIoman, DirCluster, name, &MyDir, FF_FALSE)) { - return FF_FALSE; - } + FF_T_UINT16 i; + FF_T_UINT8 EntryBuffer[32]; + FF_T_UINT8 Attrib; + FF_FETCH_CONTEXT FetchContext; + +#ifdef FF_UNICODE_SUPPORT + FF_T_WCHAR UTF16EntryBuffer[32]; +#endif - return FF_TRUE; -}*/ +#ifdef FF_HASH_CACHE + FF_T_UINT32 ulHash; +#endif -FF_T_BOOL FF_ShortNameExists(FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, FF_T_INT8 *name) { + *pError = FF_ERR_NONE; - FF_T_UINT16 i; - FF_T_UINT8 EntryBuffer[32]; - FF_T_UINT8 Attrib; -#ifdef FF_HASH_TABLE_SUPPORT - - if(!FF_DirHashed(pIoman, DirCluster)) { - for(i = 0; i < 0xFFFF; i++) { - if(FF_FetchEntry(pIoman, DirCluster, i, EntryBuffer)) { - FF_SetDirHashed(pIoman, DirCluster); - break; - } - Attrib = FF_getChar(EntryBuffer, FF_FAT_DIRENT_ATTRIB); - if(FF_getChar(EntryBuffer, 0x00) != 0xE5) { - if(Attrib != FF_FAT_ATTR_LFN) { - if(FF_isEndOfDir(EntryBuffer)) { - FF_SetDirHashed(pIoman, DirCluster); - break; - } - FF_ProcessShortName((FF_T_INT8 *)EntryBuffer); - FF_AddDirentHash(pIoman, DirCluster, FF_GetCRC16((FF_T_UINT8 *) EntryBuffer, strlen(EntryBuffer))); - } - } - } - } +#ifdef FF_HASH_CACHE + if(!FF_DirHashed(pIoman, ulDirCluster)) { + // Hash the directory + FF_HashDir(pIoman, ulDirCluster); + } #if FF_HASH_FUNCTION == CRC16 - if(FF_CheckDirentHash(pIoman, DirCluster, (FF_T_UINT32)FF_GetCRC16((FF_T_UINT8 *) name, strlen(name)))) { + ulHash = (FF_T_UINT32) FF_GetCRC16((FF_T_UINT8 *) szShortName, strlen(szShortName)); #elif FF_HASH_FUNCTION == CRC8 - if(FF_CheckDirentHash(pIoman, DirCluster, (FF_T_UINT32)FF_GetCRC8((FF_T_UINT8 *) name, strlen(name)))) { + ulHash = (FF_T_UINT32) FF_GetCRC8((FF_T_UINT8 *) szShortName, strlen(szShortName)); +#endif + + if(!FF_CheckDirentHash(pIoman, ulDirCluster, ulHash)) { + return FF_FALSE; + } + +#endif + + *pError = FF_InitEntryFetch(pIoman, ulDirCluster, &FetchContext); + if(*pError) { + return FF_FALSE; + } + + for(i = 0; i < 0xFFFF; i++) { + *pError = FF_FetchEntryWithContext(pIoman, i, &FetchContext, EntryBuffer); + if(*pError) { + FF_CleanupEntryFetch(pIoman, &FetchContext); + return FF_FALSE; + } + Attrib = FF_getChar(EntryBuffer, FF_FAT_DIRENT_ATTRIB); + if(FF_getChar(EntryBuffer, 0x00) != 0xE5) { + if(Attrib != FF_FAT_ATTR_LFN) { +#ifdef FF_UNICODE_SUPPORT + // Convert Entry Buffer into UTF16 + FF_cstrntowcs(UTF16EntryBuffer, (FF_T_INT8 *) EntryBuffer, 32); + FF_ProcessShortName(UTF16EntryBuffer); #else - { + FF_ProcessShortName((FF_T_INT8 *)EntryBuffer); #endif + if(FF_isEndOfDir(EntryBuffer)) { + FF_CleanupEntryFetch(pIoman, &FetchContext); + return FF_FALSE; + } +#ifdef FF_UNICODE_SUPPORT + if(wcscmp(szShortName, UTF16EntryBuffer) == 0) { +#else + if(strcmp(szShortName, (FF_T_INT8 *)EntryBuffer) == 0) { #endif - - for(i = 0; i < 0xFFFF; i++) { - FF_FetchEntry(pIoman, DirCluster, i, EntryBuffer); - Attrib = FF_getChar(EntryBuffer, FF_FAT_DIRENT_ATTRIB); - if(FF_getChar(EntryBuffer, 0x00) != 0xE5) { - if(Attrib != FF_FAT_ATTR_LFN) { - FF_ProcessShortName((FF_T_INT8 *)EntryBuffer); - if(FF_isEndOfDir(EntryBuffer)) { - return FF_FALSE; - } - if(strcmp(name, (FF_T_INT8 *)EntryBuffer) == 0) { - return FF_TRUE; - } - } + FF_CleanupEntryFetch(pIoman, &FetchContext); + return FF_TRUE; } } -#ifdef FF_HASH_TABLE_SUPPORT } -#endif - - return FF_FALSE; + } + + FF_CleanupEntryFetch(pIoman, &FetchContext); + return FF_FALSE; } -FF_T_UINT32 FF_FindEntryInDir(FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, FF_T_INT8 *name, FF_T_UINT8 pa_Attrib, FF_DIRENT *pDirent) { - FF_T_UINT16 fnameLen; - FF_T_UINT16 compareLength; - FF_T_UINT16 nameLen; - FF_T_INT8 Filename[FF_MAX_FILENAME]; - FF_T_INT8 MyFname[FF_MAX_FILENAME]; - FF_T_BOOL bBreak = FF_FALSE; - - pDirent->CurrentItem = 0; - nameLen = (FF_T_UINT16) strlen(name); +#ifdef FF_UNICODE_SUPPORT +FF_T_UINT32 FF_FindEntryInDir(FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, const FF_T_WCHAR *name, FF_T_UINT8 pa_Attrib, FF_DIRENT *pDirent, FF_ERROR *pError) { +#else +FF_T_UINT32 FF_FindEntryInDir(FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, const FF_T_INT8 *name, FF_T_UINT8 pa_Attrib, FF_DIRENT *pDirent, FF_ERROR *pError) { +#endif - while(!bBreak) { - if(FF_FindNextInDir(pIoman, DirCluster, pDirent)) { - break; // end of dir, file not found! - } - - if((pDirent->Attrib & pa_Attrib) == pa_Attrib){ - strcpy(Filename, pDirent->FileName); - fnameLen = (FF_T_UINT16) strlen(Filename); - FF_tolower(Filename, (FF_T_UINT32) fnameLen); - if(nameLen < FF_MAX_FILENAME) { - memcpy(MyFname, name, nameLen + 1); - } else { - memcpy(MyFname, name, FF_MAX_FILENAME); - MyFname[FF_MAX_FILENAME - 1] = '\0'; - } - FF_tolower(MyFname, (FF_T_UINT32) nameLen); - if(nameLen > fnameLen) { - compareLength = nameLen; - } else { - compareLength = fnameLen; - } - if(strncmp(MyFname, Filename, (FF_T_UINT32) compareLength) == 0) { - // Object found! - return pDirent->ObjectCluster; // Return the cluster number - } - } - } - - return 0; -} - -/* -#define FF_DIR_LFN_TRAVERSED 0x01 -#define FF_DIR_LFN_DELETED 0x02 - -FF_T_SINT8 FF_PopulateLongBufEntry(FF_IOMAN *pIoman, FF_BUFFER **ppBuffer, FF_DIRENT *pDirent) { - // Relative positions! - FF_T_UINT32 RelBlockNum; - FF_T_UINT32 RelBlockPos = FF_getMinorBlockEntry(pIoman, pDirent->CurrentItem, 32); - FF_T_UINT32 iItemLBA; - FF_T_INT8 *DirBuffer = ((*ppBuffer)->pBuffer + (RelBlockPos * 32)); - FF_T_UINT8 numLFNs = (FF_getChar(DirBuffer, (FF_T_UINT16) 0) & ~0x40); - FF_T_UINT16 x,i,y,myShort, lenlfn = 0; - FF_T_UINT32 CurrentCluster; - FF_T_SINT8 RetVal = FF_ERR_NONE; - FF_T_INT8 ShortName[13]; - FF_T_UINT8 CheckSum = FF_getChar(DirBuffer, FF_FAT_LFN_CHECKSUM); - - while(numLFNs > 0) { - - for(i = 0, y = 0; i < 5; i++, y += 2) { - pDirent->FileName[i + ((numLFNs - 1) * 13)] = DirBuffer[FF_FAT_LFN_NAME_1 + y]; - lenlfn++; - } - - for(i = 0, y = 0; i < 6; i++, y += 2) { - pDirent->FileName[i + ((numLFNs - 1) * 13) + 5] = DirBuffer[FF_FAT_LFN_NAME_2 + y]; - lenlfn++; - } - - for(i = 0, y = 0; i < 2; i++, y += 2) { - pDirent->FileName[i + ((numLFNs - 1) * 13) + 11] = DirBuffer[FF_FAT_LFN_NAME_3 + y]; - lenlfn++; - } - numLFNs--; - pDirent->CurrentItem += 1; - - CurrentCluster = FF_getClusterChainNumber(pIoman, pDirent->CurrentItem, 32); - RelBlockNum = FF_getMajorBlockNumber(pIoman, pDirent->CurrentItem, 32); - RelBlockPos = FF_getMinorBlockEntry(pIoman, pDirent->CurrentItem, 32); - iItemLBA = FF_Cluster2LBA(pIoman, pDirent->AddrCurrentCluster) + RelBlockNum; - - if(CurrentCluster > pDirent->CurrentCluster) { - pDirent->AddrCurrentCluster = FF_TraverseFAT(pIoman, pDirent->AddrCurrentCluster, 1); - pDirent->CurrentCluster += 1; - iItemLBA = FF_Cluster2LBA(pIoman, pDirent->AddrCurrentCluster) + RelBlockNum; - FF_ReleaseBuffer(pIoman, *ppBuffer); - *ppBuffer = FF_GetBuffer(pIoman, iItemLBA, FF_MODE_READ); - RetVal |= FF_DIR_LFN_TRAVERSED; - } else if(iItemLBA > ((*ppBuffer)->Sector)) { - FF_ReleaseBuffer(pIoman, *ppBuffer); - *ppBuffer = FF_GetBuffer(pIoman, iItemLBA, FF_MODE_READ); - RetVal |= FF_DIR_LFN_TRAVERSED; - } - - DirBuffer = ((*ppBuffer)->pBuffer + (RelBlockPos * 32)); - } - - if(FF_getChar(DirBuffer, (FF_T_UINT16) 0) == FF_FAT_DELETED) { - RetVal |= FF_DIR_LFN_DELETED; - return RetVal; - } - - pDirent->FileName[lenlfn] = '\0'; - - // Process the ShortName Entry - memcpy(ShortName, DirBuffer, 11); - if(CheckSum != FF_CreateChkSum(ShortName)) { - FF_ProcessShortName(ShortName); - strcpy(pDirent->FileName, ShortName); - } else { - FF_ProcessShortName(ShortName); - } - - myShort = FF_getShort(DirBuffer, (FF_T_UINT16)(FF_FAT_DIRENT_CLUS_HIGH)); - pDirent->ObjectCluster = (FF_T_UINT32) (myShort << 16); - myShort = FF_getShort(DirBuffer, (FF_T_UINT16)(FF_FAT_DIRENT_CLUS_LOW)); - pDirent->ObjectCluster |= myShort; - - // Get the filesize. - pDirent->Filesize = FF_getLong(DirBuffer, (FF_T_UINT16)(FF_FAT_DIRENT_FILESIZE)); - // Get the attribute. - pDirent->Attrib = FF_getChar(DirBuffer, (FF_T_UINT16)(FF_FAT_DIRENT_ATTRIB)); - - return RetVal; -}*/ - -/* -FF_T_SINT8 FF_FindEntry(FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, FF_T_INT8 *Name, FF_DIRENT *pDirent, FF_T_BOOL LFNs) { - - FF_T_UINT32 iItemLBA; - FF_BUFFER *pBuffer; - FF_T_INT8 *DirBuffer; - FF_T_UINT32 fatEntry = DirCluster; - FF_T_UINT32 i,x; - FF_T_UINT32 numLFNs; - FF_T_UINT16 NameLen, DirentNameLen; - FF_T_BOOL Compare = FF_FALSE; - FF_T_SINT8 RetVal = 0; - FF_T_UINT16 RelEntry; + FF_FETCH_CONTEXT FetchContext; + FF_T_UINT8 *src; // Pointer to read from pBuffer + FF_T_UINT8 *lastSrc; +#ifdef FF_UNICODE_UTF8_SUPPORT + FF_T_SINT32 utf8Error; + FF_T_UINT8 bSurrogate = FF_FALSE; +#endif +#ifdef FF_UNICODE_SUPPORT + FF_T_WCHAR *ptr; // Pointer to store a LFN +#else + FF_T_INT8 *ptr; // Pointer to store a LFN +#endif +#ifdef FF_UNICODE_SUPPORT + FF_T_WCHAR *lastPtr = pDirent->FileName + sizeof(pDirent->FileName); +#else + FF_T_INT8 *lastPtr = pDirent->FileName + sizeof(pDirent->FileName); +#endif + FF_T_UINT8 CheckSum; + FF_T_UINT8 lastAttrib; + FF_T_INT8 totalLFNs = 0; + FF_T_INT8 numLFNs = 0; + FF_T_INT32 i; + FF_T_UINT16 lfnItem = 0; pDirent->CurrentItem = 0; - pDirent->AddrCurrentCluster = DirCluster; - pDirent->CurrentCluster = 0; - pDirent->DirCluster = DirCluster; + pDirent->Attrib = 0; - do { - - pDirent->AddrCurrentCluster = fatEntry; - iItemLBA = FF_Cluster2LBA(pIoman, pDirent->AddrCurrentCluster); + FF_InitEntryFetch(pIoman, DirCluster, &FetchContext); - for(i = 0; i < pIoman->pPartition->SectorsPerCluster; i++) { - - if(FF_getClusterChainNumber(pIoman, pDirent->CurrentItem, 32) > pDirent->CurrentCluster) { - break; - } - - pBuffer = FF_GetBuffer(pIoman, iItemLBA + i, FF_MODE_READ); - { - if(!pBuffer) { - return FF_ERR_DEVICE_DRIVER_FAILED; - } - pBuffer->Persistance = 1; - RelEntry = FF_getMinorBlockEntry(pIoman, pDirent->CurrentItem, 32); - for(x = RelEntry; x < (pIoman->BlkSize / 32); x++) { - if(FF_getMajorBlockNumber(pIoman, pDirent->CurrentItem, 32) > i) { - break; - } - if(FF_getClusterChainNumber(pIoman, pDirent->CurrentItem, 32) > pDirent->CurrentCluster) { - break; - } - RelEntry = FF_getMinorBlockEntry(pIoman, pDirent->CurrentItem, 32); - x = RelEntry; - if(x >= (pIoman->BlkSize / 32)) { - break; - } - DirBuffer = (pBuffer->pBuffer + (32 * x)); - // Process each entry and Compare to Name! - if(FF_getChar(DirBuffer, (FF_T_UINT16) 0) != FF_FAT_DELETED) { - if(DirBuffer[0] == 0x00) { - FF_ReleaseBuffer(pIoman, pBuffer); - return FF_ERR_DIR_END_OF_DIR; - } - pDirent->Attrib = FF_getChar(DirBuffer, (FF_T_UINT16)(FF_FAT_DIRENT_ATTRIB)); - if((pDirent->Attrib & FF_FAT_ATTR_LFN) == FF_FAT_ATTR_LFN) { - numLFNs = (FF_T_UINT8)(DirBuffer[0] & ~0x40); - if(LFNs) { - RetVal = FF_PopulateLongBufEntry(pIoman, &pBuffer, pDirent); - if((RetVal & FF_DIR_LFN_DELETED)) { - Compare = FF_FALSE; - RetVal &= ~FF_DIR_LFN_DELETED; - } else { - Compare = FF_TRUE; - } - - pDirent->CurrentItem += 1; - } else { - pDirent->CurrentItem += numLFNs; - } - - } else { - FF_PopulateShortDirent(pDirent, DirBuffer); - Compare = FF_TRUE; - pDirent->CurrentItem += 1; - } - - if(Compare) { - // Compare the Items - NameLen = strlen(Name); - DirentNameLen = strlen(pDirent->FileName); - - if(NameLen == DirentNameLen) { // Names are same length, possible match. - if(FF_StrMatch(Name, pDirent->FileName, NameLen)) { - FF_ReleaseBuffer(pIoman, pBuffer); - return FF_ERR_NONE; // Success Item found! - } - } - Compare = FF_FALSE; - } - - if((RetVal & FF_DIR_LFN_TRAVERSED)) { - break; - } - - } else { - pDirent->CurrentItem += 1; - } - } - } - FF_ReleaseBuffer(pIoman, pBuffer); - if((RetVal & FF_DIR_LFN_TRAVERSED)) { - break; - } - } - - // Traverse! - - if((RetVal & FF_DIR_LFN_TRAVERSED)) { - RetVal = FF_ERR_NONE; - fatEntry = pDirent->AddrCurrentCluster; - } else { - if(FF_getClusterChainNumber(pIoman, pDirent->CurrentItem, 32) > pDirent->CurrentCluster) { - fatEntry = FF_getFatEntry(pIoman, pDirent->AddrCurrentCluster); - pDirent->AddrCurrentCluster = FF_TraverseFAT(pIoman, pDirent->AddrCurrentCluster, 1); - pDirent->CurrentCluster += 1; - } - } - } while(!FF_isEndOfChain(pIoman, fatEntry)); - - return FF_ERR_DIR_END_OF_DIR; -}*/ - - -/** - * @private - **/ -/*FF_T_UINT32 FF_FindEntry(FF_IOMAN *pIoman, FF_T_SINT8 *path, FF_T_UINT8 pa_Attrib, FF_DIRENT *pDirent) { - - FF_T_INT32 retVal; - FF_T_INT8 name[FF_MAX_FILENAME]; - FF_T_INT8 Filename[FF_MAX_FILENAME]; - FF_T_UINT16 fnameLen; - FF_T_UINT16 compareLength; - FF_T_UINT16 nameLen; - FF_T_UINT16 i = strlen(path); - - - while(i != 0) { - if(path[i] == '\\' || path[i] == '/') { + while(pDirent->CurrentItem < 0xFFFF) { + if (FF_FetchEntryWithContext(pIoman, pDirent->CurrentItem, &FetchContext, NULL)) { break; } - i--; - } - - if(i == 0) { - i = 1; - } - - nameLen = strlen((path + i)); - strncpy(name, (path + i), nameLen); - name[nameLen] = '\0'; - - - if(FF_FindFirst(pIoman, pDirent, path)) { - return 0; // file not found. - } - - if((pDirent->Attrib & pa_Attrib) == pa_Attrib){ - strcpy(Filename, pDirent->FileName); - fnameLen = (FF_T_UINT16) strlen(Filename); - FF_tolower(Filename, (FF_T_UINT32) fnameLen); - FF_tolower(name, (FF_T_UINT32) nameLen); - if(nameLen > fnameLen) { - compareLength = nameLen; - } else { - compareLength = fnameLen; - } - if(strncmp(name, Filename, (FF_T_UINT32) compareLength) == 0) { - // Object found!! - return pDirent->ObjectCluster; // Return the cluster number - } - } - - while(1) { - if(FF_FindNext(pIoman, pDirent)) { - return 0; // end of dir, file not found! - } - - if((pDirent->Attrib & pa_Attrib) == pa_Attrib){ - strcpy(Filename, pDirent->FileName); - fnameLen = (FF_T_UINT16) strlen(Filename); - FF_tolower(Filename, (FF_T_UINT32) fnameLen); - FF_tolower(name, (FF_T_UINT32) nameLen); - if(nameLen > fnameLen) { - compareLength = nameLen; - } else { - compareLength = fnameLen; + lastSrc = FetchContext.pBuffer->pBuffer + pIoman->BlkSize; + for (src = FetchContext.pBuffer->pBuffer; src < lastSrc; src += 32, pDirent->CurrentItem++) { + if (FF_isEndOfDir(src)) { // 0x00: end-of-dir + FF_CleanupEntryFetch(pIoman, &FetchContext); + return 0; } - if(strncmp(name, Filename, (FF_T_UINT32) compareLength) == 0) { - // Object found! - return pDirent->ObjectCluster; // Return the cluster number + if (src[0] == 0xE5) { // Entry not used + pDirent->Attrib = 0; + continue; } + lastAttrib = pDirent->Attrib; + pDirent->Attrib = FF_getChar(src, FF_FAT_DIRENT_ATTRIB); + if((pDirent->Attrib & FF_FAT_ATTR_LFN) == FF_FAT_ATTR_LFN) { + // LFN Processing +#ifdef FF_LFN_SUPPORT + if (numLFNs == 0 || (lastAttrib & FF_FAT_ATTR_LFN) != FF_FAT_ATTR_LFN) { + totalLFNs = numLFNs = (FF_T_UINT8)(src[0] & ~0x40); + lfnItem = pDirent->CurrentItem; + CheckSum = FF_getChar(src, FF_FAT_LFN_CHECKSUM); + lastPtr[-1] = '\0'; + } + if (numLFNs) { + numLFNs--; + ptr = pDirent->FileName + (numLFNs * 13); + + /* + This section needs to extract the name and do the comparison + dependent on UNICODE settings in the ff_config.h file. + */ +#ifdef FF_UNICODE_SUPPORT + // Add UTF-16 Routine here + memcpy(ptr, &src[FF_FAT_LFN_NAME_1], 10); // Copy first 5 UTF-16 chars (10 bytes). + ptr += 5; // Increment Filename pointer 5 utf16 chars. + + memcpy(ptr, &src[FF_FAT_LFN_NAME_2], 12); //Copy next 6 chars (12 bytes). + ptr += 6; + + memcpy(ptr, &src[FF_FAT_LFN_NAME_3], 4); // You're getting the idea by now! + ptr += 2; + +#endif +#ifdef FF_UNICODE_UTF8_SUPPORT + // UTF-8 Routine here + for(i = 0; i < 5 && ptr < lastPtr; i++) { + // Was there a surrogate sequence? -- Add handling here. + utf8Error = FF_Utf16ctoUtf8c((FF_T_UINT8 *) ptr, (FF_T_UINT16 *) &src[FF_FAT_LFN_NAME_1 + (2*i)], lastPtr - ptr); + if(utf8Error > 0) { + ptr += utf8Error; + + } else { + if(utf8Error == FF_ERR_UNICODE_INVALID_SEQUENCE) { + // Handle potential surrogate sequence across entries. + + } + } + } + + for(i = 0; i < 6 && ptr < lastPtr; i++) { + // Was there a surrogate sequence? -- To add handling here. + utf8Error = FF_Utf16ctoUtf8c((FF_T_UINT8 *) ptr, (FF_T_UINT16 *) &src[FF_FAT_LFN_NAME_2 + (2*i)], lastPtr - ptr); + if(utf8Error > 0) { + ptr += utf8Error; + } else { + if(utf8Error == FF_ERR_UNICODE_INVALID_SEQUENCE) { + // Handle potential surrogate sequence across entries. + } + } + } + + for(i = 0; i < 2 && ptr < lastPtr; i++) { + // Was there a surrogate sequence? -- To add handling here. + utf8Error = FF_Utf16ctoUtf8c((FF_T_UINT8 *) ptr, (FF_T_UINT16 *) &src[FF_FAT_LFN_NAME_3 + (2*i)], lastPtr - ptr); + if(utf8Error > 0) { + ptr += utf8Error; + } else { + if(utf8Error == FF_ERR_UNICODE_INVALID_SEQUENCE) { + // Handle potential surrogate sequence across entries. + } + } + } + +#endif +#ifndef FF_UNICODE_SUPPORT +#ifndef FF_UNICODE_UTF8_SUPPORT + for(i = 0; i < 10 && ptr < lastPtr; i += 2) + *(ptr++) = src[FF_FAT_LFN_NAME_1 + i]; + + for(i = 0; i < 12 && ptr < lastPtr; i += 2) + *(ptr++) = src[FF_FAT_LFN_NAME_2 + i]; + + for(i = 0; i < 4 && ptr < lastPtr; i += 2) + *(ptr++) = src[FF_FAT_LFN_NAME_3 + i]; + + if (numLFNs == totalLFNs-1 && ptr < lastPtr) + *ptr = '\0'; // Important when name len is multiple of 13 +#endif +#endif + if (numLFNs == totalLFNs-1 && ptr < lastPtr) + *ptr = '\0'; // Important when name len is multiple of 13 + + } +#endif + continue; + } + if ((pDirent->Attrib & FF_FAT_ATTR_VOLID) == FF_FAT_ATTR_VOLID) { + totalLFNs = 0; + continue; + } +#ifdef FF_LFN_SUPPORT + if(!totalLFNs || CheckSum != FF_CreateChkSum(src)) +#endif + { +#ifdef FF_UNICODE_SUPPORT + for(i = 0; i < 11; i++) { + pDirent->FileName[i] = (FF_T_WCHAR) src[i]; + } + FF_ProcessShortName(pDirent->FileName); +#else + memcpy(pDirent->FileName, src, 11); + FF_ProcessShortName(pDirent->FileName); +#endif + totalLFNs = 0; + } + + if((pDirent->Attrib & pa_Attrib) == pa_Attrib){ +#ifdef FF_UNICODE_SUPPORT + if(!wcsicmp(name, pDirent->FileName)) { +#else + if (!FF_stricmp(name, pDirent->FileName)) { +#endif + // Finally get the complete information +#ifdef FF_LFN_SUPPORT + if (totalLFNs) { + FF_PopulateLongDirent(pIoman, pDirent, lfnItem, &FetchContext); + } else +#endif + { + FF_PopulateShortDirent(pIoman, pDirent, src); + } + // Object found! + FF_CleanupEntryFetch(pIoman, &FetchContext); + return pDirent->ObjectCluster; // Return the cluster number + } + } + totalLFNs = 0; } - } + } // for (src = FetchContext.pBuffer->pBuffer; src < lastSrc; src += 32, pDirent->CurrentItem++) + + FF_CleanupEntryFetch(pIoman, &FetchContext); + return 0; -}*/ +} + + /** * @private **/ - -FF_T_UINT32 FF_FindDir(FF_IOMAN *pIoman, const FF_T_INT8 *path, FF_T_UINT16 pathLen) { +#ifdef FF_UNICODE_SUPPORT +FF_T_UINT32 FF_FindDir(FF_IOMAN *pIoman, const FF_T_WCHAR *path, FF_T_UINT16 pathLen, FF_ERROR *pError) { +#else +FF_T_UINT32 FF_FindDir(FF_IOMAN *pIoman, const FF_T_INT8 *path, FF_T_UINT16 pathLen, FF_ERROR *pError) { +#endif FF_T_UINT32 dirCluster = pIoman->pPartition->RootDirCluster; - FF_T_INT8 mytoken[FF_MAX_FILENAME]; - FF_T_INT8 *token; +#ifdef FF_UNICODE_SUPPORT + FF_T_WCHAR mytoken[FF_MAX_FILENAME]; + FF_T_WCHAR *token; +#else + FF_T_INT8 mytoken[FF_MAX_FILENAME]; + FF_T_INT8 *token; +#endif + FF_T_UINT16 it = 0; // Re-entrancy Variables for FF_strtok() FF_T_BOOL last = FF_FALSE; FF_DIRENT MyDir; @@ -535,7 +456,9 @@ FF_T_UINT32 FF_FindDir(FF_IOMAN *pIoman, const FF_T_INT8 *path, FF_T_UINT16 path FF_T_UINT32 i; #endif - if(pathLen == 1) { // Must be the root dir! (/ or \) + *pError = FF_ERR_NONE; + + if(pathLen <= 1) { // Must be the root dir! (/ or \) return pIoman->pPartition->RootDirCluster; } @@ -547,8 +470,14 @@ FF_T_UINT32 FF_FindDir(FF_IOMAN *pIoman, const FF_T_INT8 *path, FF_T_UINT16 path FF_PendSemaphore(pIoman->pSemaphore); // Thread safety on shared object! { for(i = 0; i < FF_PATH_CACHE_DEPTH; i++) { +#ifdef FF_UNICODE_SUPPORT + if(wcslen(pIoman->pPartition->PathCache[i].Path) == pathLen) { + if(FF_strmatch(pIoman->pPartition->PathCache[i].Path, path, pathLen)) { +#else if(strlen(pIoman->pPartition->PathCache[i].Path) == pathLen) { if(FF_strmatch(pIoman->pPartition->PathCache[i].Path, path, pathLen)) { +#endif + FF_ReleaseSemaphore(pIoman->pSemaphore); return pIoman->pPartition->PathCache[i].DirCluster; } @@ -561,9 +490,13 @@ FF_T_UINT32 FF_FindDir(FF_IOMAN *pIoman, const FF_T_INT8 *path, FF_T_UINT16 path token = FF_strtok(path, mytoken, &it, &last, pathLen); do{ - //lastDirCluster = dirCluster; MyDir.CurrentItem = 0; - dirCluster = FF_FindEntryInDir(pIoman, dirCluster, token, FF_FAT_ATTR_DIR, &MyDir); + dirCluster = FF_FindEntryInDir(pIoman, dirCluster, token, FF_FAT_ATTR_DIR, &MyDir, pError); + + if(*pError) { + return 0; + } + /*if(dirCluster == 0 && MyDir.CurrentItem == 2 && MyDir.FileName[0] == '.') { // .. Dir Entry pointing to root dir. dirCluster = pIoman->pPartition->RootDirCluster; }*/ @@ -575,7 +508,11 @@ FF_T_UINT32 FF_FindDir(FF_IOMAN *pIoman, const FF_T_INT8 *path, FF_T_UINT16 path FF_PendSemaphore(pIoman->pSemaphore); { if(pathLen < FF_MAX_PATH) { // Ensure the PATH won't cause a buffer overrun. +#ifdef FF_UNICODE_SUPPORT + memcpy(pIoman->pPartition->PathCache[pIoman->pPartition->PCIndex].Path, path, pathLen * sizeof(FF_T_WCHAR)); +#else memcpy(pIoman->pPartition->PathCache[pIoman->pPartition->PCIndex].Path, path, pathLen); +#endif pIoman->pPartition->PathCache[pIoman->pPartition->PCIndex].Path[pathLen] = '\0'; pIoman->pPartition->PathCache[pIoman->pPartition->PCIndex].DirCluster = dirCluster; #ifdef FF_HASH_TABLE_SUPPORT @@ -594,132 +531,81 @@ FF_T_UINT32 FF_FindDir(FF_IOMAN *pIoman, const FF_T_INT8 *path, FF_T_UINT16 path return dirCluster; } -/* -FF_T_UINT32 FF_FindDir(FF_IOMAN *pIoman, FF_T_INT8 *path, FF_T_UINT16 pathLen) { - FF_T_UINT32 dirCluster = pIoman->pPartition->RootDirCluster; - FF_T_INT8 mytoken[FF_MAX_FILENAME]; - FF_T_INT8 *token; - FF_T_UINT16 it = 0; // Re-entrancy Variables for FF_strtok() - FF_T_BOOL last = FF_FALSE; - FF_DIRENT MyDir; - if(pathLen == 1) { // Must be the root dir! (/ or \) - return pIoman->pPartition->RootDirCluster; - } - - if(path[pathLen-1] == '\\' || path[pathLen-1] == '/') { - pathLen--; - } - - token = FF_strtok(path, mytoken, &it, &last, pathLen); - - do{ - //lastDirCluster = dirCluster; - MyDir.CurrentItem = 0; - if(FF_FindEntry(pIoman, dirCluster, token, &MyDir, FF_TRUE)) { - return 0; - } else { - dirCluster = MyDir.ObjectCluster; - } - if(MyDir.Attrib != FF_FAT_ATTR_DIR) { - return 0; - } - if(dirCluster == 0 && MyDir.CurrentItem == 2 && MyDir.FileName[0] == '.') { // .. Dir Entry pointing to root dir. - dirCluster = pIoman->pPartition->RootDirCluster; - } - token = FF_strtok(path, mytoken, &it, &last, pathLen); - }while(token != NULL); - - return dirCluster; -} -*/ - -#ifdef FF_LFN_SUPPORT +#if defined(FF_SHORTNAME_CASE) /** * @private - **//* -FF_T_SINT8 FF_getLFN(FF_IOMAN *pIoman, FF_BUFFER *pBuffer, FF_DIRENT *pDirent, FF_T_INT8 *filename) { - - FF_T_UINT8 numLFNs; - FF_T_UINT16 lenlfn = 0; - FF_T_UINT8 tester; - FF_T_UINT16 i,y; - FF_T_UINT32 CurrentCluster; - FF_T_UINT32 fatEntry; - FF_T_UINT8 *buffer = pBuffer->pBuffer; - FF_T_UINT32 Sector = pBuffer->Sector; - FF_T_UINT32 Entry = FF_getMinorBlockEntry(pIoman, pDirent->CurrentItem, 32); - - tester = FF_getChar(pBuffer->pBuffer, (FF_T_UINT16)(Entry * 32)); - numLFNs = (FF_T_UINT8) (tester & ~0x40); - - while(numLFNs > 0) { - if(FF_getClusterChainNumber(pIoman, pDirent->CurrentItem, 32) > pDirent->CurrentCluster) { - FF_ReleaseBuffer(pIoman, pBuffer); - fatEntry = FF_getFatEntry(pIoman, pDirent->DirCluster); - if(fatEntry == (FF_T_UINT32) FF_ERR_DEVICE_DRIVER_FAILED) { - return FF_ERR_DEVICE_DRIVER_FAILED; - } - - if(FF_isEndOfChain(pIoman, fatEntry)) { - CurrentCluster = pDirent->DirCluster; - // ERROR THIS SHOULD NOT OCCUR! - } else { - CurrentCluster = fatEntry; - } - - pBuffer = FF_GetBuffer(pIoman, FF_getRealLBA(pIoman, FF_Cluster2LBA(pIoman, CurrentCluster)), FF_MODE_READ); - if(!pBuffer) { - return FF_ERR_DEVICE_DRIVER_FAILED; - } - Entry = 0; + * For short-name entries, NT/XP etc store case information in byte 0x0c + * Use this to show proper case of "README.txt" or "source.H" + **/ +#ifdef FF_UNICODE_SUPPORT +static void FF_CaseShortName(FF_T_WCHAR *name, FF_T_UINT8 attrib) { +#else +static void FF_CaseShortName(FF_T_INT8 *name, FF_T_UINT8 attrib) { +#endif + FF_T_UINT8 testAttrib = FF_FAT_CASE_ATTR_BASE; + for (; *name; name++) { + if (*name == '.') { + testAttrib = FF_FAT_CASE_ATTR_EXT; + } else if ((attrib & testAttrib)) { + if (*name >= 'A' && *name <= 'Z') + *name += 0x20; + } else if (*name >= 'a' && *name <= 'z') { + *name -= 0x20; } - - if(Entry > 15) { - FF_ReleaseBuffer(pIoman, pBuffer); - Sector += 1; - pBuffer = FF_GetBuffer(pIoman, Sector, FF_MODE_READ); - if(!pBuffer) { - return FF_ERR_DEVICE_DRIVER_FAILED; - } - buffer = pBuffer->pBuffer; - Entry = 0; - } - - for(i = 0, y = 0; i < 5; i++, y += 2) { - filename[i + ((numLFNs - 1) * 13)] = buffer[(Entry * 32) + FF_FAT_LFN_NAME_1 + y]; - lenlfn++; - } - - for(i = 0, y = 0; i < 6; i++, y += 2) { - filename[i + ((numLFNs - 1) * 13) + 5] = buffer[(Entry * 32) + FF_FAT_LFN_NAME_2 + y]; - lenlfn++; - } - - for(i = 0, y = 0; i < 2; i++, y += 2) { - filename[i + ((numLFNs - 1) * 13) + 11] = buffer[(Entry * 32) + FF_FAT_LFN_NAME_3 + y]; - lenlfn++; - } - - numLFNs--; - - Entry++; - pDirent->CurrentItem += 1; } - - filename[lenlfn] = '\0'; - - return 0; -}*/ +} #endif /** * @private **/ + +#ifdef FF_UNICODE_SUPPORT +static void FF_ProcessShortName(FF_T_WCHAR *name) { + FF_T_WCHAR shortName[13]; + FF_T_WCHAR *ptr = name; +#else static void FF_ProcessShortName(FF_T_INT8 *name) { FF_T_INT8 shortName[13]; + FF_T_INT8 *ptr = name; +#endif FF_T_UINT8 i; +#ifdef FF_UNICODE_SUPPORT + memcpy(shortName, name, 11 * sizeof(FF_T_WCHAR)); +#else memcpy(shortName, name, 11); +#endif + + for(i = 0; i < 11; i++) { + if(shortName[i] == 0x20) { + if (i >= 8) + break; + i = 7; + } else { + if (i == 8) + *(ptr++) = '.'; + *(ptr++) = shortName[i]; + } + } + *ptr = '\0'; +} + +/* +#ifdef FF_UNICODE_SUPPORT +static void FF_ProcessShortName(FF_T_WCHAR *name) { + FF_T_WCHAR shortName[13]; +#else +static void FF_ProcessShortName(FF_T_INT8 *name) { + FF_T_INT8 shortName[13]; +#endif + + FF_T_UINT8 i; +#ifdef FF_UNICODE_SUPPORT + memcpy(shortName, name, 11 * sizeof(FF_T_WCHAR)); +#else + memcpy(shortName, name, 11); +#endif for(i = 0; i < 8; i++) { if(shortName[i] == 0x20) { @@ -745,7 +631,7 @@ static void FF_ProcessShortName(FF_T_INT8 *name) { name[i] = '\0'; } -} +}*/ #ifdef FF_TIME_SUPPORT static void FF_PlaceTime(FF_T_UINT8 *EntryBuffer, FF_T_UINT32 Offset) { @@ -790,28 +676,40 @@ static void FF_GetDate(FF_SYSTEMTIME *pTime, FF_T_UINT8 *EntryBuffer, FF_T_UINT3 pTime->Month = (((myShort & 0x01E0) >> 5) & 0x000F); pTime->Day = myShort & 0x01F; } - - - #endif void FF_PopulateShortDirent(FF_IOMAN *pIoman, FF_DIRENT *pDirent, FF_T_UINT8 *EntryBuffer) { FF_T_UINT16 myShort; - +#ifdef FF_UNICODE_SUPPORT + FF_T_WCHAR UTF16EntryBuffer[12]; + FF_cstrntowcs(UTF16EntryBuffer, (FF_T_INT8 *) EntryBuffer, 11); + memcpy(pDirent->FileName, UTF16EntryBuffer, 11 * sizeof(FF_T_WCHAR)); +#else memcpy(pDirent->FileName, EntryBuffer, 11); // Copy the filename into the Dirent object. +#endif +#if defined(FF_LFN_SUPPORT) && defined(FF_INCLUDE_SHORT_NAME) + memcpy(pDirent->ShortName, EntryBuffer, 11); + pDirent->ShortName[11] = '\0'; + FF_ProcessShortName(pDirent->ShortName); // Format the shortname, for pleasant viewing. + +#endif FF_ProcessShortName(pDirent->FileName); // Format the shortname, for pleasant viewing. #ifdef FF_HASH_TABLE_SUPPORT -#if FF_HASH_FUNCTION == CRC16 +/*#if FF_HASH_FUNCTION == CRC16 FF_AddDirentHash(pIoman, pDirent->DirCluster, (FF_T_UINT32)FF_GetCRC16((FF_T_UINT8 *) pDirent->FileName, strlen(pDirent->FileName))); #elif FF_HASH_FUNCTION == CRC8 FF_AddDirentHash(pIoman, pDirent->DirCluster, (FF_T_UINT32)FF_GetCRC8((FF_T_UINT8 *) pDirent->FileName, strlen(pDirent->FileName))); -#endif +#endif*/ #else - pIoman = NULL; + pIoman = NULL; // Silence a compiler warning, about not referencing pIoman. #endif +#ifdef FF_UNICODE_SUPPORT + FF_tolower(pDirent->FileName, (FF_T_UINT32)wcslen(pDirent->FileName)); +#else FF_tolower(pDirent->FileName, (FF_T_UINT32)strlen(pDirent->FileName)); +#endif // Get the item's Cluster address. myShort = FF_getShort(EntryBuffer, (FF_T_UINT16)(FF_FAT_DIRENT_CLUS_HIGH)); @@ -837,68 +735,167 @@ void FF_PopulateShortDirent(FF_IOMAN *pIoman, FF_DIRENT *pDirent, FF_T_UINT8 *En pDirent->Attrib = FF_getChar(EntryBuffer, (FF_T_UINT16)(FF_FAT_DIRENT_ATTRIB)); } -FF_T_SINT8 FF_FetchEntry(FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, FF_T_UINT16 nEntry, FF_T_UINT8 *buffer) { - FF_BUFFER *pBuffer; - FF_T_UINT32 itemLBA; - FF_T_UINT32 chainLength = FF_GetChainLength(pIoman, DirCluster, NULL); // BottleNeck - FF_T_UINT32 clusterNum = FF_getClusterChainNumber (pIoman, nEntry, (FF_T_UINT16)32); - FF_T_UINT32 relItem = FF_getMinorBlockEntry (pIoman, nEntry, (FF_T_UINT16)32); - FF_T_UINT32 clusterAddress = FF_TraverseFAT(pIoman, DirCluster, clusterNum); // BottleNeck +/* + Initialises a context object for FF_FetchEntryWithContext() +*/ +FF_ERROR FF_InitEntryFetch(FF_IOMAN *pIoman, FF_T_UINT32 ulDirCluster, FF_FETCH_CONTEXT *pContext) { + + FF_ERROR Error; + + memset(pContext, 0, sizeof(FF_FETCH_CONTEXT)); + + pContext->ulChainLength = FF_GetChainLength(pIoman, ulDirCluster, NULL, &Error); // Get the total length of the chain. + if(Error) { + return Error; + } + pContext->ulDirCluster = ulDirCluster; + pContext->ulCurrentClusterLCN = ulDirCluster; + pContext->ulCurrentClusterNum = 0; + pContext->ulCurrentEntry = 0; if(pIoman->pPartition->Type != FF_T_FAT32) { - if(DirCluster == pIoman->pPartition->RootDirCluster) { - chainLength = pIoman->pPartition->RootDirSectors / pIoman->pPartition->SectorsPerCluster; - if(!chainLength) { // Some media has RootDirSectors < SectorsPerCluster. This is wrong, as it should be atleast 1 cluster! - chainLength = 1; + // Handle Root Dirs that don't have cluster chains! + if(pContext->ulDirCluster == pIoman->pPartition->RootDirCluster) { + // This is a RootDIR, special consideration needs to be made, because it doesn't have a Cluster chain! + pContext->ulChainLength = pIoman->pPartition->RootDirSectors / pIoman->pPartition->SectorsPerCluster; + if(!pContext->ulChainLength) { // Some media has RootDirSectors < SectorsPerCluster. This is wrong, as it should be atleast 1 cluster! + pContext->ulChainLength = 1; } - clusterAddress = DirCluster; - clusterNum = 0; - if(nEntry > ((pIoman->pPartition->RootDirSectors * pIoman->pPartition->BlkSize) / 32)) { + } + } + + return FF_ERR_NONE; +} + +void FF_CleanupEntryFetch(FF_IOMAN *pIoman, FF_FETCH_CONTEXT *pContext) { + if(pContext->pBuffer) { + FF_ReleaseBuffer(pIoman, pContext->pBuffer); + pContext->pBuffer = NULL; + } +} + +FF_ERROR FF_FetchEntryWithContext(FF_IOMAN *pIoman, FF_T_UINT32 ulEntry, FF_FETCH_CONTEXT *pContext, FF_T_UINT8 *pEntryBuffer) { + + FF_T_UINT32 ulItemLBA; + FF_T_UINT32 ulRelItem; + FF_T_UINT32 ulClusterNum; + FF_ERROR Error; + + ulClusterNum = FF_getClusterChainNumber(pIoman, ulEntry, (FF_T_UINT16)32); + ulRelItem = FF_getMinorBlockEntry (pIoman, ulEntry, (FF_T_UINT16)32); + + if(ulClusterNum != pContext->ulCurrentClusterNum) { + // Traverse the fat gently! + if(ulClusterNum > pContext->ulCurrentClusterNum) { + pContext->ulCurrentClusterLCN = FF_TraverseFAT(pIoman, pContext->ulCurrentClusterLCN, (ulClusterNum - pContext->ulCurrentClusterNum), &Error); + if(Error) { + return Error; + } + } else { + pContext->ulCurrentClusterLCN = FF_TraverseFAT(pIoman, pContext->ulDirCluster, ulClusterNum, &Error); + if(Error) { + return Error; + } + } + pContext->ulCurrentClusterNum = ulClusterNum; + } + + if(pIoman->pPartition->Type != FF_T_FAT32) { + // Handle Root Dirs that don't have cluster chains! + if(pContext->ulDirCluster == pIoman->pPartition->RootDirCluster) { + // This is a RootDIR, special consideration needs to be made, because it doesn't have a Cluster chain! + pContext->ulCurrentClusterLCN = pContext->ulDirCluster; + ulClusterNum = 0; + if(ulEntry > ((pIoman->pPartition->RootDirSectors * pIoman->pPartition->BlkSize) / 32)) { return FF_ERR_DIR_END_OF_DIR; } } } - - if((clusterNum + 1) > chainLength) { + + if((ulClusterNum + 1) > pContext->ulChainLength) { return FF_ERR_DIR_END_OF_DIR; // End of Dir was reached! } - itemLBA = FF_Cluster2LBA(pIoman, clusterAddress) + FF_getMajorBlockNumber(pIoman, nEntry, (FF_T_UINT16)32); - itemLBA = FF_getRealLBA (pIoman, itemLBA) + FF_getMinorBlockNumber(pIoman, relItem, (FF_T_UINT16)32); - - pBuffer = FF_GetBuffer(pIoman, itemLBA, FF_MODE_READ); - { - memcpy(buffer, (pBuffer->pBuffer + (relItem*32)), 32); - pBuffer->Persistance = 1; + ulItemLBA = FF_Cluster2LBA (pIoman, pContext->ulCurrentClusterLCN) + FF_getMajorBlockNumber(pIoman, ulEntry, (FF_T_UINT16)32); + ulItemLBA = FF_getRealLBA (pIoman, ulItemLBA) + FF_getMinorBlockNumber(pIoman, ulRelItem, (FF_T_UINT16)32); + + if(!pContext->pBuffer || (pContext->pBuffer->Sector != ulItemLBA)) { + if(pContext->pBuffer) { + FF_ReleaseBuffer(pIoman, pContext->pBuffer); + } + pContext->pBuffer = FF_GetBuffer(pIoman, ulItemLBA, FF_MODE_READ); + if(!pContext->pBuffer) { + return FF_ERR_DEVICE_DRIVER_FAILED; + } } - FF_ReleaseBuffer(pIoman, pBuffer); - + + if (pEntryBuffer) { // HT Because it might be called with NULL + memcpy(pEntryBuffer, (pContext->pBuffer->pBuffer + (ulRelItem*32)), 32); + } + return FF_ERR_NONE; } -FF_T_SINT8 FF_PushEntry(FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, FF_T_UINT16 nEntry, FF_T_UINT8 *buffer) { - FF_BUFFER *pBuffer; - FF_T_UINT32 itemLBA; - FF_T_UINT32 chainLength = FF_GetChainLength(pIoman, DirCluster, NULL); // BottleNeck - FF_T_UINT32 clusterNum = FF_getClusterChainNumber (pIoman, nEntry, (FF_T_UINT16)32); - FF_T_UINT32 relItem = FF_getMinorBlockEntry (pIoman, nEntry, (FF_T_UINT16)32); - FF_T_UINT32 clusterAddress = FF_TraverseFAT(pIoman, DirCluster, clusterNum); // BottleNeck - - if((clusterNum + 1) > chainLength) { +FF_ERROR FF_PushEntryWithContext(FF_IOMAN *pIoman, FF_T_UINT32 ulEntry, FF_FETCH_CONTEXT *pContext, FF_T_UINT8 *pEntryBuffer) { + FF_T_UINT32 ulItemLBA; + FF_T_UINT32 ulRelItem; + FF_T_UINT32 ulClusterNum; + FF_ERROR Error; + + ulClusterNum = FF_getClusterChainNumber(pIoman, ulEntry, (FF_T_UINT16)32); + ulRelItem = FF_getMinorBlockEntry (pIoman, ulEntry, (FF_T_UINT16)32); + + if(ulClusterNum != pContext->ulCurrentClusterNum) { + // Traverse the fat gently! + if(ulClusterNum > pContext->ulCurrentClusterNum) { + pContext->ulCurrentClusterLCN = FF_TraverseFAT(pIoman, pContext->ulCurrentClusterLCN, (ulClusterNum - pContext->ulCurrentClusterNum), &Error); + if(Error) { + return Error; + } + } else { + pContext->ulCurrentClusterLCN = FF_TraverseFAT(pIoman, pContext->ulDirCluster, ulClusterNum, &Error); + if(Error) { + return Error; + } + } + pContext->ulCurrentClusterNum = ulClusterNum; + } + + if(pIoman->pPartition->Type != FF_T_FAT32) { + // Handle Root Dirs that don't have cluster chains! + if(pContext->ulDirCluster == pIoman->pPartition->RootDirCluster) { + // This is a RootDIR, special consideration needs to be made, because it doesn't have a Cluster chain! + pContext->ulCurrentClusterLCN = pContext->ulDirCluster; + ulClusterNum = 0; + if(ulEntry > ((pIoman->pPartition->RootDirSectors * pIoman->pPartition->BlkSize) / 32)) { + return FF_ERR_DIR_END_OF_DIR; + } + } + } + + if((ulClusterNum + 1) > pContext->ulChainLength) { return FF_ERR_DIR_END_OF_DIR; // End of Dir was reached! } - itemLBA = FF_Cluster2LBA(pIoman, clusterAddress) + FF_getMajorBlockNumber(pIoman, nEntry, (FF_T_UINT16)32); - itemLBA = FF_getRealLBA (pIoman, itemLBA) + FF_getMinorBlockNumber(pIoman, relItem, (FF_T_UINT16)32); - - pBuffer = FF_GetBuffer(pIoman, itemLBA, FF_MODE_WRITE); - { - memcpy((pBuffer->pBuffer + (relItem*32)), buffer, 32); + ulItemLBA = FF_Cluster2LBA (pIoman, pContext->ulCurrentClusterLCN) + FF_getMajorBlockNumber(pIoman, ulEntry, (FF_T_UINT16)32); + ulItemLBA = FF_getRealLBA (pIoman, ulItemLBA) + FF_getMinorBlockNumber(pIoman, ulRelItem, (FF_T_UINT16)32); + + if(!pContext->pBuffer || (pContext->pBuffer->Sector != ulItemLBA)) { + if(pContext->pBuffer) { + FF_ReleaseBuffer(pIoman, pContext->pBuffer); + } + pContext->pBuffer = FF_GetBuffer(pIoman, ulItemLBA, FF_MODE_READ); + if(!pContext->pBuffer) { + return FF_ERR_DEVICE_DRIVER_FAILED; + } } - FF_ReleaseBuffer(pIoman, pBuffer); - - return 0; + + memcpy((pContext->pBuffer->pBuffer + (ulRelItem*32)), pEntryBuffer, 32); + pContext->pBuffer->Mode = FF_MODE_WRITE; + pContext->pBuffer->Modified = FF_TRUE; + + return FF_ERR_NONE; } @@ -906,14 +903,24 @@ FF_T_SINT8 FF_PushEntry(FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, FF_T_UINT16 nE * @private **/ FF_ERROR FF_GetEntry(FF_IOMAN *pIoman, FF_T_UINT16 nEntry, FF_T_UINT32 DirCluster, FF_DIRENT *pDirent) { - FF_T_UINT8 EntryBuffer[32]; - FF_T_UINT8 numLFNs; + FF_T_UINT8 EntryBuffer[32]; + FF_T_UINT8 numLFNs; + FF_FETCH_CONTEXT FetchContext; + FF_ERROR Error; + + Error = FF_InitEntryFetch(pIoman, DirCluster, &FetchContext); + if(Error) { + return Error; + } - if(FF_FetchEntry(pIoman, DirCluster, nEntry, EntryBuffer)) { - return FF_ERR_DIR_END_OF_DIR; + Error = FF_FetchEntryWithContext(pIoman, nEntry, &FetchContext, EntryBuffer); + if(Error) { + FF_CleanupEntryFetch(pIoman, &FetchContext); + return Error; } if(EntryBuffer[0] != 0xE5) { if(FF_isEndOfDir(EntryBuffer)){ + FF_CleanupEntryFetch(pIoman, &FetchContext); return FF_ERR_DIR_END_OF_DIR; } @@ -923,8 +930,12 @@ FF_ERROR FF_GetEntry(FF_IOMAN *pIoman, FF_T_UINT16 nEntry, FF_T_UINT32 DirCluste // LFN Processing numLFNs = (FF_T_UINT8)(EntryBuffer[0] & ~0x40); #ifdef FF_LFN_SUPPORT - FF_PopulateLongDirent(pIoman, pDirent, DirCluster, nEntry); - return 0; + Error = FF_PopulateLongDirent(pIoman, pDirent, nEntry, &FetchContext); + FF_CleanupEntryFetch(pIoman, &FetchContext); + if(Error) { + return Error; + } + return FF_ERR_NONE; #else pDirent->CurrentItem += (numLFNs - 1); #endif @@ -934,9 +945,12 @@ FF_ERROR FF_GetEntry(FF_IOMAN *pIoman, FF_T_UINT16 nEntry, FF_T_UINT32 DirCluste } else { FF_PopulateShortDirent(pIoman, pDirent, EntryBuffer); pDirent->CurrentItem += 1; + FF_CleanupEntryFetch(pIoman, &FetchContext); return 0; } } + + FF_CleanupEntryFetch(pIoman, &FetchContext); return FF_ERR_NONE; } @@ -947,55 +961,123 @@ FF_T_BOOL FF_isEndOfDir(FF_T_UINT8 *EntryBuffer) { return FF_FALSE; } -#ifdef FF_HASH_TABLE_SUPPORT -FF_ERROR FF_AddDirentHash(FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, FF_T_UINT32 nHash) { +#ifdef FF_HASH_CACHE +FF_ERROR FF_AddDirentHash(FF_IOMAN *pIoman, FF_T_UINT32 ulDirCluster, FF_T_UINT32 ulHash) { FF_T_UINT32 i; FF_HASH_TABLE pHash = NULL; - for(i = 0; i < FF_PATH_CACHE_DEPTH; i++) { - if(pIoman->pPartition->PathCache[i].DirCluster == DirCluster) { - pHash = pIoman->pPartition->PathCache[i].pHashTable; + for(i = 0; i < FF_HASH_CACHE_DEPTH; i++) { + if(pIoman->HashCache[i].ulDirCluster == ulDirCluster) { + pHash = pIoman->HashCache[i].pHashTable; break; } } if(pHash) { - FF_SetHash(pHash, nHash); + FF_SetHash(pHash, ulHash); } return FF_ERR_NONE; } -FF_T_BOOL FF_CheckDirentHash(FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, FF_T_UINT32 nHash) { +FF_T_BOOL FF_CheckDirentHash(FF_IOMAN *pIoman, FF_T_UINT32 ulDirCluster, FF_T_UINT32 ulHash) { FF_T_UINT32 i; FF_HASH_TABLE pHash = NULL; - for(i = 0; i < FF_PATH_CACHE_DEPTH; i++) { - if(pIoman->pPartition->PathCache[i].DirCluster == DirCluster) { - pHash = pIoman->pPartition->PathCache[i].pHashTable; + for(i = 0; i < FF_HASH_CACHE_DEPTH; i++) { + if(pIoman->HashCache[i].ulDirCluster == ulDirCluster) { + pHash = pIoman->HashCache[i].pHashTable; break; } } if(pHash) { - return FF_isHashSet(pHash, nHash); + return FF_isHashSet(pHash, ulHash); } return FF_FALSE; } -FF_T_BOOL FF_DirHashed(FF_IOMAN *pIoman, FF_T_UINT32 DirCluster) { +FF_T_BOOL FF_DirHashed(FF_IOMAN *pIoman, FF_T_UINT32 ulDirCluster) { FF_T_UINT32 i; - for(i = 0; i < FF_PATH_CACHE_DEPTH; i++) { - if(pIoman->pPartition->PathCache[i].DirCluster == DirCluster) { - if(pIoman->pPartition->PathCache[i].bHashed) { - return FF_TRUE; - } + for(i = 0; i < FF_HASH_CACHE_DEPTH; i++) { + if(pIoman->HashCache[i].ulDirCluster == ulDirCluster) { + return FF_TRUE; } } return FF_FALSE; } -void FF_SetDirHashed(FF_IOMAN *pIoman, FF_T_UINT32 DirCluster) { +FF_ERROR FF_HashDir(FF_IOMAN *pIoman, FF_T_UINT32 ulDirCluster) { + // Find most suitable Hash Table to replace! + FF_T_UINT32 i; + FF_HASHCACHE *pHashCache = NULL; + FF_FETCH_CONTEXT FetchContext; + FF_T_UINT8 EntryBuffer[32], ucAttrib; + FF_T_UINT32 ulHash; + + if(FF_DirHashed(pIoman, ulDirCluster)) { + return FF_ERR_NONE; // Don't wastefully re-hash a dir! + } + + //printf("----- Hashing Directory\n"); + + for(i = 0; i < FF_HASH_CACHE_DEPTH; i++) { + if(!pIoman->HashCache[i].ulNumHandles) { + if(!pHashCache) { + pHashCache = &pIoman->HashCache[i]; + } else { + if((pIoman->HashCache[i].ulMisses > pHashCache->ulMisses)) { + pHashCache = &pIoman->HashCache[i]; + } + } + } + } + + if(pHashCache) { + // Clear the hash table! + FF_ClearHashTable(pHashCache->pHashTable); + pHashCache->ulDirCluster = ulDirCluster; + pHashCache->ulMisses = 0; + + // Hash the directory! + + FF_InitEntryFetch(pIoman, ulDirCluster, &FetchContext); + + for(i = 0; i < 0xFFFF; i++) { + if(FF_FetchEntryWithContext(pIoman, i, &FetchContext, EntryBuffer)) { + break; // HT addition + } + ucAttrib = FF_getChar(EntryBuffer, FF_FAT_DIRENT_ATTRIB); + if(FF_getChar(EntryBuffer, 0x00) != 0xE5) { + if(ucAttrib != FF_FAT_ATTR_LFN) { + FF_ProcessShortName((FF_T_INT8 *)EntryBuffer); + if(FF_isEndOfDir(EntryBuffer)) { + // HT uncommented + FF_CleanupEntryFetch(pIoman, &FetchContext); + return FF_ERR_NONE; + } + + // Generate the Hash +#if FF_HASH_FUNCTION == CRC16 + ulHash = FF_GetCRC16(EntryBuffer, strlen((const FF_T_INT8 *) EntryBuffer)); +#elif FF_HASH_FUNCTION == CRC8 + ulHash = FF_GetCRC8(EntryBuffer, strlen((const FF_T_INT8 *) EntryBuffer)); +#endif + FF_SetHash(pHashCache->pHashTable, ulHash); + + } + } + } + + FF_CleanupEntryFetch(pIoman, &FetchContext); + + return FF_ERR_NONE; + } + + return -1; +} + +/*void FF_SetDirHashed(FF_IOMAN *pIoman, FF_T_UINT32 DirCluster) { int i; for(i = 0; i < FF_PATH_CACHE_DEPTH; i++) { if(pIoman->pPartition->PathCache[i].DirCluster == DirCluster) { @@ -1003,27 +1085,273 @@ void FF_SetDirHashed(FF_IOMAN *pIoman, FF_T_UINT32 DirCluster) { return; } } -} +}*/ #endif +FF_ERROR FF_PopulateLongDirent(FF_IOMAN *pIoman, FF_DIRENT *pDirent, FF_T_UINT16 nEntry, FF_FETCH_CONTEXT *pFetchContext) { + // First get the entire name as UTF-16 from the LFN's. + // Then transform into the API's native string format. + + FF_ERROR Error; + FF_T_UINT uiNumLFNs; + FF_T_UINT uiLfnLength = 0; + FF_T_UINT i,y; +#ifdef FF_UNICODE_UTF8_SUPPORT +// FF_T_SINT32 slRetVal; + FF_T_UINT16 nLfnBegin; + FF_T_UINT16 usUtf8Len = 0; +#endif + FF_T_UINT16 myShort; + FF_T_UINT8 ucCheckSum; -FF_T_SINT8 FF_PopulateLongDirent(FF_IOMAN *pIoman, FF_DIRENT *pDirent, FF_T_UINT32 DirCluster, FF_T_UINT16 nEntry) { FF_T_UINT8 EntryBuffer[32]; + //FF_T_UINT16 UTF16Name[FF_MAX_FILENAME]; + +#ifdef FF_UNICODE_SUPPORT + FF_T_WCHAR WCEntryBuffer[32]; + FF_T_WCHAR ShortName[13]; +#else FF_T_INT8 ShortName[13]; +#endif + + Error = FF_FetchEntryWithContext(pIoman, nEntry++, pFetchContext, EntryBuffer); + if(Error) { + return Error; + } + + uiNumLFNs = (FF_T_UINT)(EntryBuffer[0] & ~0x40); + ucCheckSum = FF_getChar(EntryBuffer, FF_FAT_LFN_CHECKSUM); + +#ifdef FF_UNICODE_SUPPORT // UTF-16 Can simply get segments of the UTF-16 sequence going forward + // in the dirents. (I.e. reversed order). + + while(uiNumLFNs) { // Avoid stack intensive use of a UTF-16 buffer. Stream direct to FileName dirent field in correct format. + + // memcopy direct!-UTF-16 support + memcpy(pDirent->FileName + ((uiNumLFNs - 1) * 13) + 0, &EntryBuffer[FF_FAT_LFN_NAME_1], 10); + memcpy(pDirent->FileName + ((uiNumLFNs - 1) * 13) + 5, &EntryBuffer[FF_FAT_LFN_NAME_2], 12); + memcpy(pDirent->FileName + ((uiNumLFNs - 1) * 13) + 11, &EntryBuffer[FF_FAT_LFN_NAME_3], 4); + + + uiLfnLength += 13; + + Error = FF_FetchEntryWithContext(pIoman, nEntry++, pFetchContext, EntryBuffer); + if(Error) { + return Error; + } + uiNumLFNs--; + } + + pDirent->FileName[uiLfnLength] = '\0'; +#endif + +#ifdef FF_UNICODE_UTF8_SUPPORT + // UTF-8 Sequence, we can only convert this from the beginning, must receive entries in reverse. + nLfnBegin = nEntry - 1; + + for(i = 0; i < uiNumLFNs; i++) { + Error = FF_FetchEntryWithContext(pIoman, (nLfnBegin + (uiNumLFNs - 1) - i), pFetchContext, EntryBuffer); + if(Error) { + return Error; + } + + // Now have the first part of the UTF-16 sequence. Stream into a UTF-8 sequence. + for(y = 0; y < 5; y++) { + Error = FF_Utf16ctoUtf8c((FF_T_UINT8 *) &pDirent->FileName[usUtf8Len], (FF_T_UINT16 *) &EntryBuffer[FF_FAT_LFN_NAME_1 + (y*2)], sizeof(pDirent->FileName) - usUtf8Len); + if(Error > 0) { + usUtf8Len += (FF_T_UINT16) Error; + } + } + + for(y = 0; y < 6; y++) { + Error = FF_Utf16ctoUtf8c((FF_T_UINT8 *) &pDirent->FileName[usUtf8Len], (FF_T_UINT16 *) &EntryBuffer[FF_FAT_LFN_NAME_2 + (y*2)], sizeof(pDirent->FileName) - usUtf8Len); + if(Error > 0) { + usUtf8Len += (FF_T_UINT16) Error; + } + } + + for(y = 0; y < 2; y++) { + Error = FF_Utf16ctoUtf8c((FF_T_UINT8 *) &pDirent->FileName[usUtf8Len], (FF_T_UINT16 *) &EntryBuffer[FF_FAT_LFN_NAME_3 + (y*2)], sizeof(pDirent->FileName) - usUtf8Len); + if(Error > 0) { + usUtf8Len += (FF_T_UINT16) Error; + } + } + nEntry++; + } + + pDirent->FileName[usUtf8Len] = '\0'; + + // Put Entry context to correct position. + Error = FF_FetchEntryWithContext(pIoman, nEntry-1, pFetchContext, EntryBuffer); + if(Error) { + return Error; + } + +#endif + +#ifndef FF_UNICODE_SUPPORT +#ifndef FF_UNICODE_UTF8_SUPPORT // No Unicode, simple ASCII. + while(uiNumLFNs) { // Avoid stack intensive use of a UTF-16 buffer. Stream direct to FileName dirent field in correct format. + + for(i = 0; i < 5; i++) { + pDirent->FileName[((uiNumLFNs - 1) * 13) + i] = EntryBuffer[FF_FAT_LFN_NAME_1 + (i*2)]; + } + + for(i = 0; i < 6; i++) { + pDirent->FileName[((uiNumLFNs - 1) * 13) + i + 5] = EntryBuffer[FF_FAT_LFN_NAME_2 + (i*2)]; + } + + for(i = 0; i < 2; i++) { + pDirent->FileName[((uiNumLFNs - 1) * 13) + i + 11] = EntryBuffer[FF_FAT_LFN_NAME_3 + (i*2)]; + } + + uiLfnLength += 13; + + Error = FF_FetchEntryWithContext(pIoman, nEntry++, pFetchContext, EntryBuffer); + if(Error) { + return Error; + } + uiNumLFNs--; + } + + pDirent->FileName[uiLfnLength] = '\0'; + + +#endif +#endif + // Process the Shortname. -- LFN Transformation is now complete. + // Process the ShortName Entry + + // if SHORTNAMES must be included, simple byte copy into shortname buffer. +#if defined(FF_LFN_SUPPORT) && defined(FF_INCLUDE_SHORT_NAME) + memcpy(pDirent->ShortName, EntryBuffer, 11); + pDirent->ShortName[11] = '\0'; + FF_ProcessShortName(pDirent->ShortName); +#endif + +#ifdef FF_UNICODE_SUPPORT + FF_cstrntowcs(WCEntryBuffer, (FF_T_INT8 *) EntryBuffer, 32); + memcpy(ShortName, WCEntryBuffer, 11 * sizeof(FF_T_WCHAR)); +#else + memcpy(ShortName, EntryBuffer, 11); +#endif + FF_ProcessShortName(ShortName); + if(ucCheckSum != FF_CreateChkSum(EntryBuffer)) { +#ifdef FF_UNICODE_SUPPORT + wcscpy(pDirent->FileName, ShortName); +#else + strcpy(pDirent->FileName, ShortName); +#endif + } + + // Finally fill in the other details + myShort = FF_getShort(EntryBuffer, (FF_T_UINT16)(FF_FAT_DIRENT_CLUS_HIGH)); + pDirent->ObjectCluster = (FF_T_UINT32) (myShort << 16); + myShort = FF_getShort(EntryBuffer, (FF_T_UINT16)(FF_FAT_DIRENT_CLUS_LOW)); + pDirent->ObjectCluster |= myShort; + +#ifdef FF_TIME_SUPPORT + // Get the creation Time & Date + FF_GetTime(&pDirent->CreateTime, EntryBuffer, FF_FAT_DIRENT_CREATE_TIME); + FF_GetDate(&pDirent->CreateTime, EntryBuffer, FF_FAT_DIRENT_CREATE_DATE); + // Get the modified Time & Date + FF_GetTime(&pDirent->CreateTime, EntryBuffer, FF_FAT_DIRENT_LASTMOD_TIME); + FF_GetDate(&pDirent->CreateTime, EntryBuffer, FF_FAT_DIRENT_LASTMOD_DATE); + // Get the last accessed Date. + FF_GetDate(&pDirent->AccessedTime, EntryBuffer, FF_FAT_DIRENT_LASTACC_DATE); + pDirent->AccessedTime.Hour = 0; + pDirent->AccessedTime.Minute = 0; + pDirent->AccessedTime.Second = 0; +#endif + + // Get the filesize. + pDirent->Filesize = FF_getLong(EntryBuffer, (FF_T_UINT16)(FF_FAT_DIRENT_FILESIZE)); + // Get the attribute. + pDirent->Attrib = FF_getChar(EntryBuffer, (FF_T_UINT16)(FF_FAT_DIRENT_ATTRIB)); + + pDirent->CurrentItem = nEntry; + //return x; + return FF_ERR_NONE; +} + +/* +FF_ERROR FF_PopulateLongDirent(FF_IOMAN *pIoman, FF_DIRENT *pDirent, FF_T_UINT16 nEntry, FF_FETCH_CONTEXT *pFetchContext) { + FF_T_UINT8 EntryBuffer[32]; +#ifdef FF_UNICODE_SUPPORT + FF_T_WCHAR UTF16EntryBuffer[32]; + FF_T_WCHAR ShortName[13]; +#if WCHAR_MAX > 0xFFFF + FF_T_UINT16 i,y; +#endif +#else + FF_T_INT8 ShortName[13]; +#ifdef FF_UNICODE_UTF8_SUPPORT + FF_T_SINT32 i, y; +#else + FF_T_UINT16 i, y; +#endif +#endif + +#ifdef FF_UNICODE_UTF8_SUPPORT + FF_T_UINT16 UTF16Name[FF_MAX_FILENAME]; // Read in the entire UTF-16 name into this buffer. + FF_T_UINT16 *UTF16cptr; +#endif FF_T_UINT8 numLFNs; FF_T_UINT8 x; FF_T_UINT8 CheckSum = 0; - FF_T_UINT16 i,y; + FF_T_UINT16 lenlfn = 0; FF_T_UINT16 myShort; + FF_ERROR Error; - FF_FetchEntry(pIoman, DirCluster, nEntry++, EntryBuffer); + Error = FF_FetchEntryWithContext(pIoman, nEntry++, pFetchContext, EntryBuffer); + if(Error) { + return Error; + } + numLFNs = (FF_T_UINT8)(EntryBuffer[0] & ~0x40); // Handle the name CheckSum = FF_getChar(EntryBuffer, FF_FAT_LFN_CHECKSUM); x = numLFNs; while(numLFNs) { + if(numLFNs > 1) { + numLFNs = numLFNs; + } + +#ifdef FF_UNICODE_SUPPORT + // Simply fill the FileName buffer with UTF-16 Filename! +#if WCHAR_MAX <= 0xFFFF // System works in UTF-16 so we can trust it if we just copy the UTF-16 strings directly. + memcpy(pDirent->FileName + ((numLFNs - 1) * 13) + 0, &EntryBuffer[FF_FAT_LFN_NAME_1], (5 * 2)); + memcpy(pDirent->FileName + ((numLFNs - 1) * 13) + 5, &EntryBuffer[FF_FAT_LFN_NAME_2], (6 * 2)); + memcpy(pDirent->FileName + ((numLFNs - 1) * 13) + 11, &EntryBuffer[FF_FAT_LFN_NAME_3], (2 * 2)); + lenlfn += 13; +#else + for(i = 0, y = 0; i < 5; i++, y += 2) { + FF_Utf16ctoUtf32c((FF_T_UINT32 *)&pDirent->FileName[i + ((numLFNs - 1) * 13)], (FF_T_UINT16 *) &EntryBuffer[FF_FAT_LFN_NAME_1 + y]); + //pDirent->FileName[i + ((numLFNs - 1) * 13)] = (FF_T_WCHAR) ((FF_T_WCHAR) EntryBuffer[FF_FAT_LFN_NAME_1 + y] | ((FF_T_WCHAR) EntryBuffer[FF_FAT_LFN_NAME_1 + y + 1] >> 8)); + lenlfn++; + } + for(i = 0, y = 0; i < 6; i++, y += 2) { + FF_Utf16ctoUtf32c((FF_T_UINT32 *)&pDirent->FileName[i + ((numLFNs - 1) * 13) + 5], (FF_T_UINT16 *) &EntryBuffer[FF_FAT_LFN_NAME_2 + y]); + //pDirent->FileName[i + ((numLFNs - 1) * 13) + 5] = (FF_T_WCHAR) ((FF_T_WCHAR) EntryBuffer[FF_FAT_LFN_NAME_2 + y] | ((FF_T_WCHAR) EntryBuffer[FF_FAT_LFN_NAME_2 + y + 1] >> 8)); + lenlfn++; + } + for(i = 0, y = 0; i < 2; i++, y += 2) { + FF_Utf16ctoUtf32c((FF_T_UINT32 *)&pDirent->FileName[i + ((numLFNs - 1) * 13) + 11], (FF_T_UINT16 *) &EntryBuffer[FF_FAT_LFN_NAME_3 + y]); + //pDirent->FileName[i + ((numLFNs - 1) * 13) + 11] = (FF_T_WCHAR) ((FF_T_WCHAR) EntryBuffer[FF_FAT_LFN_NAME_3 + y] | ((FF_T_WCHAR)EntryBuffer[FF_FAT_LFN_NAME_3 + y + 1] >> 8)); + lenlfn++; + } +#endif + // Copy each part of the LFNS +#else +#ifdef FF_UNICODE_UTF8_SUPPORT + memcpy(UTF16Name + ((numLFNs - 1) * 13) + 0, &EntryBuffer[FF_FAT_LFN_NAME_1], (5 * 2)); + memcpy(UTF16Name + ((numLFNs - 1) * 13) + 5, &EntryBuffer[FF_FAT_LFN_NAME_2], (6 * 2)); + memcpy(UTF16Name + ((numLFNs - 1) * 13) + 11, &EntryBuffer[FF_FAT_LFN_NAME_3], (2 * 2)); + lenlfn += 13; +#else + // Attempts to pull ASCII from UTF-8 encoding. for(i = 0, y = 0; i < 5; i++, y += 2) { pDirent->FileName[i + ((numLFNs - 1) * 13)] = EntryBuffer[FF_FAT_LFN_NAME_1 + y]; lenlfn++; @@ -1038,28 +1366,56 @@ FF_T_SINT8 FF_PopulateLongDirent(FF_IOMAN *pIoman, FF_DIRENT *pDirent, FF_T_UINT pDirent->FileName[i + ((numLFNs - 1) * 13) + 11] = EntryBuffer[FF_FAT_LFN_NAME_3 + y]; lenlfn++; } +#endif +#endif - FF_FetchEntry(pIoman, DirCluster, nEntry++, EntryBuffer); + Error = FF_FetchEntryWithContext(pIoman, nEntry++, pFetchContext, EntryBuffer); + if(Error) { + return Error; + } numLFNs--; } +#ifdef FF_UNICODE_UTF8_SUPPORT + UTF16cptr = UTF16Name; + UTF16Name[lenlfn] = '\0'; + i = 0; // Keep tabs of the current char position in the UTF-8 sequence. + while(*UTF16cptr) { + y = FF_Utf16ctoUtf8c((FF_T_UINT8 *)&pDirent->FileName[i], UTF16cptr, (FF_MAX_FILENAME - i)); + i += y; + if(FF_GetUtf16SequenceLen(*UTF16cptr++) == 2) { // IF this is a surrogate, then bump the UTF16 Pointer. + UTF16cptr++; + } + } + pDirent->FileName[i] = '\0'; +#else pDirent->FileName[lenlfn] = '\0'; +#endif // Process the ShortName Entry +#ifdef FF_UNICODE_SUPPORT + FF_cstrntowcs(UTF16EntryBuffer, (FF_T_INT8 *) EntryBuffer, 32); + memcpy(ShortName, UTF16EntryBuffer, 11 * sizeof(FF_T_WCHAR)); +#else memcpy(ShortName, EntryBuffer, 11); +#endif if(CheckSum != FF_CreateChkSum(EntryBuffer)) { FF_ProcessShortName(ShortName); +#ifdef FF_UNICODE_SUPPORT + wcscpy(pDirent->FileName, ShortName); +#else strcpy(pDirent->FileName, ShortName); +#endif } else { FF_ProcessShortName(ShortName); } -#ifdef FF_HASH_TABLE_SUPPORT -#if FF_HASH_FUNCTION == CRC16 - FF_AddDirentHash(pIoman, DirCluster, (FF_T_UINT32)FF_GetCRC16((FF_T_UINT8 *) ShortName, strlen(ShortName))); +#ifdef FF_HASH_TABLE_SUPPORT*/ +/*#if FF_HASH_FUNCTION == CRC16 + FF_AddDirentHash(pIoman, pFetchContext->ulDirCluster, (FF_T_UINT32)FF_GetCRC16((FF_T_UINT8 *) ShortName, strlen(ShortName))); #elif FF_HASH_FUNCTION == CRC8 FF_AddDirentHash(pIoman, DirCluster, (FF_T_UINT32)FF_GetCRC8((FF_T_UINT8 *) ShortName, strlen(ShortName))); -#endif +#endif*//* #endif myShort = FF_getShort(EntryBuffer, (FF_T_UINT16)(FF_FAT_DIRENT_CLUS_HIGH)); @@ -1087,9 +1443,10 @@ FF_T_SINT8 FF_PopulateLongDirent(FF_IOMAN *pIoman, FF_DIRENT *pDirent, FF_T_UINT pDirent->Attrib = FF_getChar(EntryBuffer, (FF_T_UINT16)(FF_FAT_DIRENT_ATTRIB)); pDirent->CurrentItem = nEntry; - return x; + //return x; + return FF_ERR_NONE; } - +*/ /** * @public * @brief Find's the first directory entry for the provided path. @@ -1097,6 +1454,22 @@ FF_T_SINT8 FF_PopulateLongDirent(FF_IOMAN *pIoman, FF_DIRENT *pDirent, FF_T_UINT * All values recorded in pDirent must be preserved to and between calls to * FF_FindNext(). * + * If FF_FINDAPI_ALLOW_WILDCARDS is defined, then path will have the following behaviour: + * + * path = "\" - Open the root dir, and iterate through all items. + * path = "\*.c" - Open the root dir, showing only files matching *.c wildcard. + * path = "\sub1\newdir" - Get the DIRENT for the newdir directory in /sub1/ if one exists. + * path = "\sub1\newdir\" - Open the directory /sub1/newdir/ and iterate through all items. + * path = "\sub1\newdir\*.c" - Open the directory /sub1/newdir/ and iterate through all items matching the *.c wildcard. + * + * It is important to distinguish the differences in behaviour between opening a Find operation + * on a path like /sub1 and /sub1/. (/sub1 gets the sub1 dirent from the / dir, whereas /sub/ opens the sub1 dir). + * + * Note, as compatible with other similar APIs, FullFAT also accepts \sub1\* for the same behaviour as + * /sub1/. + * + * For more up-to-date information please see the FullFAT wiki pages. + * * @param pIoman FF_IOMAN object that was created by FF_CreateIOMAN(). * @param pDirent FF_DIRENT object to store the entry information. * @param path String to of the path to the Dir being listed. @@ -1106,60 +1479,78 @@ FF_T_SINT8 FF_PopulateLongDirent(FF_IOMAN *pIoman, FF_DIRENT *pDirent, FF_T_UINT * @return -2 if Dir was not found. * **/ +#ifdef FF_UNICODE_SUPPORT +FF_ERROR FF_FindFirst(FF_IOMAN *pIoman, FF_DIRENT *pDirent, const FF_T_WCHAR *path) { +#else FF_ERROR FF_FindFirst(FF_IOMAN *pIoman, FF_DIRENT *pDirent, const FF_T_INT8 *path) { - FF_T_UINT8 numLFNs; - FF_T_UINT8 EntryBuffer[32]; +#endif +#ifdef FF_UNICODE_SUPPORT + FF_T_UINT16 PathLen = (FF_T_UINT16) wcslen(path); +#else FF_T_UINT16 PathLen = (FF_T_UINT16) strlen(path); +#endif + FF_ERROR Error; + +#ifdef FF_FINDAPI_ALLOW_WILDCARDS + FF_T_UINT16 i = 0; +#ifdef FF_UNICODE_SUPPORT + const FF_T_WCHAR *szWildCard; // Check for a Wild-card. +#else + const FF_T_INT8 *szWildCard; // Check for a Wild-card. +#endif +#endif if(!pIoman) { return FF_ERR_NULL_POINTER; } + // Detect a Wild-Card on the End, or Filename, as apposed to a complete path. +#ifndef FF_FINDAPI_ALLOW_WILDCARDS pDirent->DirCluster = FF_FindDir(pIoman, path, PathLen); // Get the directory cluster, if it exists. +#endif + +#ifdef FF_FINDAPI_ALLOW_WILDCARDS + pDirent->szWildCard[0] = '\0'; // WildCard blank if its not a wildCard. + + szWildCard = &path[PathLen - 1]; + + if(PathLen) { + while(*szWildCard != '\\' && *szWildCard != '/') { // Open the dir of the last token. + i++; + szWildCard--; + if(!(PathLen - i)) { + break; + } + } + } + + pDirent->DirCluster = FF_FindDir(pIoman, path, PathLen - i, &Error); + if(Error) { + return Error; + } + if(pDirent->DirCluster) { + // Valid Dir found, copy the wildCard to filename! +#ifdef FF_UNICODE_SUPPORT + wcsncpy(pDirent->szWildCard, ++szWildCard, FF_MAX_FILENAME); +#else + strncpy(pDirent->szWildCard, ++szWildCard, FF_MAX_FILENAME); +#endif + } +#endif if(pDirent->DirCluster == 0) { return FF_ERR_DIR_INVALID_PATH; } - - for(pDirent->CurrentItem = 0; pDirent->CurrentItem < 0xFFFF; pDirent->CurrentItem += 1) { - if(FF_FetchEntry(pIoman, pDirent->DirCluster, pDirent->CurrentItem, EntryBuffer)) { - return FF_ERR_DIR_END_OF_DIR; - } - if(EntryBuffer[0] != FF_FAT_DELETED) { - if(FF_isEndOfDir(EntryBuffer)){ - return FF_ERR_DIR_END_OF_DIR; - } - pDirent->Attrib = FF_getChar(EntryBuffer, (FF_T_UINT16)(FF_FAT_DIRENT_ATTRIB)); - if((pDirent->Attrib & FF_FAT_ATTR_LFN) == FF_FAT_ATTR_LFN) { - // LFN Processing - numLFNs = (FF_T_UINT8)(EntryBuffer[0] & ~0x40); - // Get the shortname and check if it is marked deleted. -#ifdef FF_LFN_SUPPORT - // Fetch the shortname, and get it's checksum, or for a deleted item with - // orphaned LFN entries. - if(FF_FetchEntry(pIoman, pDirent->DirCluster, (pDirent->CurrentItem + numLFNs), EntryBuffer)) { - return FF_ERR_DIR_END_OF_DIR; - } - - if(EntryBuffer[0] != FF_FAT_DELETED) { - FF_PopulateLongDirent(pIoman, pDirent, pDirent->DirCluster, pDirent->CurrentItem); - return FF_ERR_NONE; - } -#else - pDirent->CurrentItem += (numLFNs - 1); -#endif - } else if((pDirent->Attrib & FF_FAT_ATTR_VOLID) == FF_FAT_ATTR_VOLID) { - // Do Nothing - - } else { - FF_PopulateShortDirent(pIoman, pDirent, EntryBuffer); - pDirent->CurrentItem += 1; - return FF_ERR_NONE; - } - } - } - return FF_ERR_DIR_END_OF_DIR; + // Initialise the Fetch Context + Error = FF_InitEntryFetch(pIoman, pDirent->DirCluster, &pDirent->FetchContext); + if(Error) { + return Error; + } + + pDirent->CurrentItem = 0; + + return FF_FindNext(pIoman, pDirent); } /** @@ -1167,16 +1558,17 @@ FF_ERROR FF_FindFirst(FF_IOMAN *pIoman, FF_DIRENT *pDirent, const FF_T_INT8 *pat * @brief Get's the next Entry based on the data recorded in the FF_DIRENT object. * * All values recorded in pDirent must be preserved to and between calls to - * FF_FindNext(). + * FF_FindNext(). Please see @see FF_FindFirst() for find initialisation. * * @param pIoman FF_IOMAN object that was created by FF_CreateIOMAN(). - * @param pDirent FF_DIRENT object to store the entry information. + * @param pDirent FF_DIRENT object to store the entry information. (As initialised by FF_FindFirst()). * * @return FF_ERR_DEVICE_DRIVER_FAILED is device access failed. * **/ FF_ERROR FF_FindNext(FF_IOMAN *pIoman, FF_DIRENT *pDirent) { + FF_ERROR Error; FF_T_UINT8 numLFNs; FF_T_UINT8 EntryBuffer[32]; @@ -1185,11 +1577,14 @@ FF_ERROR FF_FindNext(FF_IOMAN *pIoman, FF_DIRENT *pDirent) { } for(; pDirent->CurrentItem < 0xFFFF; pDirent->CurrentItem += 1) { - if(FF_FetchEntry(pIoman, pDirent->DirCluster, pDirent->CurrentItem, EntryBuffer)) { - return FF_ERR_DIR_END_OF_DIR; + Error = FF_FetchEntryWithContext(pIoman, pDirent->CurrentItem, &pDirent->FetchContext, EntryBuffer); + if(Error) { + FF_CleanupEntryFetch(pIoman, &pDirent->FetchContext); + return Error; } if(EntryBuffer[0] != FF_FAT_DELETED) { if(FF_isEndOfDir(EntryBuffer)){ + FF_CleanupEntryFetch(pIoman, &pDirent->FetchContext); return FF_ERR_DIR_END_OF_DIR; } pDirent->Attrib = FF_getChar(EntryBuffer, (FF_T_UINT16)(FF_FAT_DIRENT_ATTRIB)); @@ -1200,13 +1595,41 @@ FF_ERROR FF_FindNext(FF_IOMAN *pIoman, FF_DIRENT *pDirent) { #ifdef FF_LFN_SUPPORT // Fetch the shortname, and get it's checksum, or for a deleted item with // orphaned LFN entries. - if(FF_FetchEntry(pIoman, pDirent->DirCluster, (pDirent->CurrentItem + numLFNs), EntryBuffer)) { - return FF_ERR_DIR_END_OF_DIR; + Error = FF_FetchEntryWithContext(pIoman, (pDirent->CurrentItem + numLFNs), &pDirent->FetchContext, EntryBuffer); + if(Error) { + FF_CleanupEntryFetch(pIoman, &pDirent->FetchContext); + return Error; } if(EntryBuffer[0] != FF_FAT_DELETED) { - FF_PopulateLongDirent(pIoman, pDirent, pDirent->DirCluster, pDirent->CurrentItem); + Error = FF_PopulateLongDirent(pIoman, pDirent, pDirent->CurrentItem, &pDirent->FetchContext); + if(Error) { + FF_CleanupEntryFetch(pIoman, &pDirent->FetchContext); + return Error; + } +#ifdef FF_INCLUDE_SHORT_NAME + pDirent->Attrib |= FF_FAT_ATTR_IS_LFN; +#endif + +#ifdef FF_FINDAPI_ALLOW_WILDCARDS +#ifdef FF_UNICODE_SUPPORT + if(wcscmp(pDirent->szWildCard, L"")) { +#else + if(strcmp(pDirent->szWildCard, "")) { +#endif + if(FF_wildcompare(pDirent->szWildCard, pDirent->FileName)) { + FF_CleanupEntryFetch(pIoman, &pDirent->FetchContext); + return FF_ERR_NONE; + } + pDirent->CurrentItem -= 1; + } else { + FF_CleanupEntryFetch(pIoman, &pDirent->FetchContext); + return FF_ERR_NONE; + } +#else + FF_CleanupEntryFetch(pIoman, &pDirent->FetchContext); return FF_ERR_NONE; +#endif } #else pDirent->CurrentItem += (numLFNs - 1); @@ -1216,11 +1639,37 @@ FF_ERROR FF_FindNext(FF_IOMAN *pIoman, FF_DIRENT *pDirent) { } else { FF_PopulateShortDirent(pIoman, pDirent, EntryBuffer); +#if defined(FF_SHORTNAME_CASE) + // Apply NT/XP+ bits to get correct case + FF_CaseShortName(pDirent->FileName, FF_getChar(EntryBuffer, FF_FAT_CASE_OFFS)); +#endif +#ifdef FF_FINDAPI_ALLOW_WILDCARDS +#ifdef FF_UNICODE_SUPPORT + if(wcscmp(pDirent->szWildCard, L"")) { +#else + if(strcmp(pDirent->szWildCard, "")) { +#endif + if(FF_wildcompare(pDirent->szWildCard, pDirent->FileName)) { + FF_CleanupEntryFetch(pIoman, &pDirent->FetchContext); + pDirent->CurrentItem += 1; + return FF_ERR_NONE; + } + } else { + FF_CleanupEntryFetch(pIoman, &pDirent->FetchContext); + pDirent->CurrentItem += 1; + return FF_ERR_NONE; + } +#else + + FF_CleanupEntryFetch(pIoman, &pDirent->FetchContext); pDirent->CurrentItem += 1; return FF_ERR_NONE; +#endif } } } + + FF_CleanupEntryFetch(pIoman, &pDirent->FetchContext); return FF_ERR_DIR_END_OF_DIR; } @@ -1234,30 +1683,55 @@ FF_T_SINT8 FF_RewindFind(FF_IOMAN *pIoman, FF_DIRENT *pDirent) { return 0; } +/* + Returns >= 0 for a free dirent entry. + Returns < 0 with and Error code if anything goes wrong. +*/ +static FF_T_SINT32 FF_FindFreeDirent(FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, FF_T_UINT16 Sequential) { -FF_T_SINT32 FF_FindFreeDirent(FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, FF_T_UINT16 Sequential) { + FF_T_UINT8 EntryBuffer[32]; + FF_T_UINT16 i = 0; + FF_T_UINT16 nEntry; + FF_ERROR Error; + FF_T_UINT32 DirLength; + FF_FETCH_CONTEXT FetchContext; - FF_T_UINT8 EntryBuffer[32]; - FF_T_UINT16 i = 0; - FF_T_UINT16 nEntry; - FF_T_SINT8 RetVal; - FF_T_UINT32 DirLength; - FF_T_UINT32 iEndOfChain; + Error = FF_InitEntryFetch(pIoman, DirCluster, &FetchContext); + if(Error) { + return Error; + } for(nEntry = 0; nEntry < 0xFFFF; nEntry++) { - if(FF_FetchEntry(pIoman, DirCluster, nEntry, EntryBuffer) == FF_ERR_DIR_END_OF_DIR) { - RetVal = FF_ExtendDirectory(pIoman, DirCluster); - if(RetVal != FF_ERR_NONE) { - return RetVal; + Error = FF_FetchEntryWithContext(pIoman, nEntry, &FetchContext, EntryBuffer); + if(Error == FF_ERR_DIR_END_OF_DIR) { + + Error = FF_ExtendDirectory(pIoman, DirCluster); + FF_CleanupEntryFetch(pIoman, &FetchContext); + + if(Error) { + return Error; } + return nEntry; + } else { + if(Error) { + FF_CleanupEntryFetch(pIoman, &FetchContext); + return Error; + } } if(FF_isEndOfDir(EntryBuffer)) { // If its the end of the Dir, then FreeDirents from here. // Check Dir is long enough! - DirLength = FF_GetChainLength(pIoman, DirCluster, &iEndOfChain); + DirLength = FetchContext.ulChainLength;//FF_GetChainLength(pIoman, DirCluster, &iEndOfChain); if((nEntry + Sequential) > (FF_T_UINT16)(((pIoman->pPartition->SectorsPerCluster * pIoman->pPartition->BlkSize) * DirLength) / 32)) { - FF_ExtendDirectory(pIoman, DirCluster); + Error = FF_ExtendDirectory(pIoman, DirCluster); } + + FF_CleanupEntryFetch(pIoman, &FetchContext); + + if(Error) { + return Error; + } + return nEntry; } if(EntryBuffer[0] == 0xE5) { @@ -1267,36 +1741,48 @@ FF_T_SINT32 FF_FindFreeDirent(FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, FF_T_UIN } if(i == Sequential) { + FF_CleanupEntryFetch(pIoman, &FetchContext); return (nEntry - (Sequential - 1));// Return the beginning entry in the sequential sequence. } } - return FF_ERR_DIR_DIRECTORY_FULL; + FF_CleanupEntryFetch(pIoman, &FetchContext); + + return FF_ERR_DIR_DIRECTORY_FULL; } -FF_T_SINT8 FF_PutEntry(FF_IOMAN *pIoman, FF_T_UINT16 Entry, FF_T_UINT32 DirCluster, FF_DIRENT *pDirent) { +FF_ERROR FF_PutEntry(FF_IOMAN *pIoman, FF_T_UINT16 Entry, FF_T_UINT32 DirCluster, FF_DIRENT *pDirent) { FF_BUFFER *pBuffer; + FF_ERROR Error; FF_T_UINT32 itemLBA; FF_T_UINT32 clusterNum = FF_getClusterChainNumber (pIoman, Entry, (FF_T_UINT16)32); FF_T_UINT32 relItem = FF_getMinorBlockEntry (pIoman, Entry, (FF_T_UINT16)32); - FF_T_UINT32 clusterAddress = FF_TraverseFAT(pIoman, DirCluster, clusterNum); + FF_T_UINT32 clusterAddress = FF_TraverseFAT(pIoman, DirCluster, clusterNum, &Error); + + if(Error) { + return Error; + } itemLBA = FF_Cluster2LBA(pIoman, clusterAddress) + FF_getMajorBlockNumber(pIoman, Entry, (FF_T_UINT16)32); itemLBA = FF_getRealLBA (pIoman, itemLBA) + FF_getMinorBlockNumber(pIoman, relItem, (FF_T_UINT16)32); pBuffer = FF_GetBuffer(pIoman, itemLBA, FF_MODE_WRITE); { + if(!pBuffer) { + return FF_ERR_DEVICE_DRIVER_FAILED; + } // Modify the Entry! //memcpy((pBuffer->pBuffer + (32*relItem)), pDirent->FileName, 11); - FF_putChar(pBuffer->pBuffer, (FF_T_UINT16)(FF_FAT_DIRENT_ATTRIB + (32 * relItem)), pDirent->Attrib); - FF_putShort(pBuffer->pBuffer, (FF_T_UINT16)(FF_FAT_DIRENT_CLUS_HIGH + (32 * relItem)), (FF_T_UINT16)(pDirent->ObjectCluster >> 16)); - FF_putShort(pBuffer->pBuffer, (FF_T_UINT16)(FF_FAT_DIRENT_CLUS_LOW + (32 * relItem)), (FF_T_UINT16)(pDirent->ObjectCluster)); - FF_putLong(pBuffer->pBuffer, (FF_T_UINT16)(FF_FAT_DIRENT_FILESIZE + (32 * relItem)), pDirent->Filesize); + relItem *= 32; + FF_putChar(pBuffer->pBuffer, (FF_T_UINT16)(FF_FAT_DIRENT_ATTRIB + relItem), pDirent->Attrib); + FF_putShort(pBuffer->pBuffer, (FF_T_UINT16)(FF_FAT_DIRENT_CLUS_HIGH + relItem), (FF_T_UINT16)(pDirent->ObjectCluster >> 16)); + FF_putShort(pBuffer->pBuffer, (FF_T_UINT16)(FF_FAT_DIRENT_CLUS_LOW + relItem), (FF_T_UINT16)(pDirent->ObjectCluster)); + FF_putLong(pBuffer->pBuffer, (FF_T_UINT16)(FF_FAT_DIRENT_FILESIZE + relItem), pDirent->Filesize); #ifdef FF_TIME_SUPPORT - FF_PlaceDate((pBuffer->pBuffer + (32 * relItem)), FF_FAT_DIRENT_LASTACC_DATE); // Last accessed date. + FF_PlaceDate((pBuffer->pBuffer + relItem), FF_FAT_DIRENT_LASTACC_DATE); // Last accessed date. #endif } FF_ReleaseBuffer(pIoman, pBuffer); @@ -1304,143 +1790,200 @@ FF_T_SINT8 FF_PutEntry(FF_IOMAN *pIoman, FF_T_UINT16 Entry, FF_T_UINT32 DirClust return 0; } +FF_T_BOOL FF_ValidShortChar (FF_T_INT8 Chr) +{ + return (Chr >= 'A' && Chr <= 'Z') || +#if defined(FF_SHORTNAME_CASE) + (Chr >= 'a' && Chr <= 'z') || // lower-case can be stored using NT/XP attribute +#endif + (Chr >= '0' && Chr <= '9') || + strchr ("$%-_@~`!(){}^#&", Chr) != NULL; +} -/*static FF_T_BOOL FF_isShortName(const FF_T_UINT8 *Name, FF_T_UINT16 StrLen) { - FF_T_UINT16 i; - for(i = 0; i < StrLen; i++) { - if(Name[i] == '.') { - i--; - } - } - if(i < 11) { - return FF_TRUE; - } - return FF_FALSE; -}*/ +FF_T_BOOL FF_ValidLongChar (FF_T_INT8 Chr) +{ + return Chr >= 0x20 && strchr ("/\\:*?\"<>|", Chr) == NULL; +} +#ifdef FF_UNICODE_SUPPORT +FF_T_SINT8 FF_CreateShortName(FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, FF_T_WCHAR *ShortName, FF_T_WCHAR *LongName) { +#else FF_T_SINT8 FF_CreateShortName(FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, FF_T_INT8 *ShortName, FF_T_INT8 *LongName) { - FF_T_UINT16 i,x,y; - FF_T_INT8 TempName[FF_MAX_FILENAME]; +#endif + FF_T_UINT8 caseAttrib = 0; +#if defined(FF_SHORTNAME_CASE) + FF_T_UINT8 testAttrib = FF_FAT_CASE_ATTR_BASE; +#endif + + FF_T_UINT16 i,x,y,last_dot; + FF_T_UINT16 first_tilde = 6; +#ifdef FF_UNICODE_SUPPORT + FF_T_WCHAR MyShortName[13]; +#else FF_T_INT8 MyShortName[13]; - FF_T_UINT16 NameLen; - FF_T_BOOL FitsShort = FF_FALSE; +#endif + FF_T_UINT16 NameLen; + FF_T_BOOL FitsShort = FF_TRUE; FF_DIRENT MyDir; + FF_T_BOOL found; //FF_T_SINT8 RetVal = 0; FF_T_INT8 NumberBuf[6]; - // Create a Short Name - strncpy(TempName, LongName, FF_MAX_FILENAME); - NameLen = (FF_T_UINT16) strlen(TempName); - FF_toupper(TempName, NameLen); + FF_ERROR Error; - // Initialise Shortname - - for(i = 0; i < 11; i++) { - ShortName[i] = 0x20; - } +#ifdef FF_UNICODE_SUPPORT + NameLen = (FF_T_UINT16) wcslen(LongName); +#else + NameLen = (FF_T_UINT16) strlen(LongName); +#endif // Does LongName fit a shortname? - for(i = 0, x = 0; i < NameLen; i++) { - if(TempName[i] != '.') { + for(i = 0, x = 0, last_dot = NameLen; i < NameLen; i++) { + if(LongName[i] != '.') { x++; - } - } - - if(x <= 11) { - //FitsShort = FF_TRUE; - } - - // Main part of the name - for(i = 0, x = 0; i < 8; i++, x++) { - if(i == 0 && TempName[x] == '.') { - i--; } else { - if(TempName[x] == '.') { - break; - } else if(TempName[x] == ' ') { - i--; - } else { - ShortName[i] = TempName[x]; - if(ShortName[i] == 0x00) { - ShortName[i] = 0x20; - } - } - } - } - - for(i = NameLen; i > x; i--) { - if(TempName[i] == '.') { - break; + last_dot = i; } } - if(TempName[i] == '.') { - x = i + 1; - for(i = 0; i < 3; i++) { - if(x < NameLen) { - ShortName[8 + i] = TempName[x++]; + if (NameLen > 12 || NameLen-x > 1 || NameLen-last_dot > 4 || last_dot > 8) { + FitsShort = FF_FALSE; + } + + for(i = 0, x = 0; i < 11; x++) { + FF_T_INT8 ch = (FF_T_INT8) LongName[x]; + if (!ch) + break; + if (x == last_dot) { + while (i < 8) + ShortName[i++] = 0x20; +#if defined(FF_SHORTNAME_CASE) + testAttrib = FF_FAT_CASE_ATTR_EXT; +#endif + } else { + if (i == 8) { + x = last_dot; + ch = (FF_T_INT8) LongName[x]; + if (ch) + ch = (FF_T_INT8) LongName[++x]; +#if defined(FF_SHORTNAME_CASE) + testAttrib = FF_FAT_CASE_ATTR_EXT; +#endif } + if (!FF_ValidShortChar (ch)) { + FitsShort = FF_FALSE; + continue; + } + if (ch >= 'a' && ch <= 'z') { + ch -= 0x20; +#if defined(FF_SHORTNAME_CASE) + if (testAttrib) + caseAttrib |= testAttrib; + else + FitsShort = FF_FALSE; // We had capital: does not fit + } else if (ch >= 'A' && ch <= 'Z') { + if (caseAttrib & testAttrib) + FitsShort = FF_FALSE; // We had lower-case: does not fit + testAttrib = 0; +#endif + } + ShortName[i++] = ch; } } + while (i < 11) + ShortName[i++] = 0x20; + if (last_dot < first_tilde) + first_tilde = last_dot; + if (NameLen < first_tilde) // Names like "Abc" will become "~Abc" + first_tilde = NameLen; // Tail : memcpy(MyShortName, ShortName, 11); FF_ProcessShortName(MyShortName); - - if(!FF_FindEntryInDir(pIoman, DirCluster, MyShortName, 0x00, &MyDir) && FitsShort) { - return 0; - } else { - if(FitsShort) { - return FF_ERR_DIR_OBJECT_EXISTS; - } - for(i = 1; i < 0x0000FFFF; i++) { // Max Number of Entries in a DIR! - sprintf(NumberBuf, "%d", i); - NameLen = (FF_T_UINT16) strlen(NumberBuf); - x = 7 - NameLen; - ShortName[x++] = '~'; - for(y = 0; y < NameLen; y++) { - ShortName[x+y] = NumberBuf[y]; - } - memcpy(MyShortName, ShortName, 11); - FF_ProcessShortName(MyShortName); - if(!FF_ShortNameExists(pIoman, DirCluster, MyShortName)) { - return 0; - } - } - // Add a tail and special number until we're happy :D + found = (FF_T_BOOL) FF_FindEntryInDir(pIoman, DirCluster, MyShortName, 0x00, &MyDir, &Error); +#ifdef Hein_Tibosch + if (verboseLevel >= 1) logPrintf ("Long Name: %-14.14s Short '%s' (%s) Fit '%d' Found %d\n", LongName, ShortName, MyShortName, FitsShort, found); +#endif + if(FitsShort && !found) { + return caseAttrib | 0x01; } + if(FitsShort) { + return FF_ERR_DIR_OBJECT_EXISTS; + } + for(i = 1; i < 0x0000FFFF; i++) { // Max Number of Entries in a DIR! + sprintf(NumberBuf, "%d", i); + NameLen = (FF_T_UINT16) strlen(NumberBuf); + x = 7 - NameLen; + if (x > first_tilde) + x = first_tilde; + ShortName[x++] = '~'; + for(y = 0; y < NameLen; y++) { + ShortName[x+y] = NumberBuf[y]; + } + memcpy(MyShortName, ShortName, 11); + FF_ProcessShortName(MyShortName); + found = FF_ShortNameExists(pIoman, DirCluster, MyShortName, &Error); +#ifdef Hein_Tibosch + if (verboseLevel >= 1) logPrintf ("Long Name: %-14.14s Short '%s' (%s) Fit '%d' Found %d\n", LongName, ShortName, MyShortName, FitsShort, found); +#endif + if(!found) { +#ifdef FF_HASH_CACHE +#if FF_HASH_FUNCTION == CRC16 + FF_AddDirentHash(pIoman, DirCluster, (FF_T_UINT32) FF_GetCRC16((FF_T_UINT8*)MyShortName, strlen(MyShortName))); +#elif FF_HASH_FUNCTION == CRC8 + FF_AddDirentHash(pIoman, DirCluster, (FF_T_UINT32) FF_GetCRC8((FF_T_UINT8*)MyShortName, strlen(MyShortName))); +#endif +#endif + return 0; + } + } + // Add a tail and special number until we're happy :D return FF_ERR_DIR_DIRECTORY_FULL; } + + #ifdef FF_LFN_SUPPORT -static FF_T_SINT8 FF_CreateLFNEntry(FF_T_UINT8 *EntryBuffer, FF_T_INT8 *Name, FF_T_UINT8 NameLen, FF_T_UINT8 nLFN, FF_T_UINT8 CheckSum) { +static FF_T_SINT8 FF_CreateLFNEntry(FF_T_UINT8 *EntryBuffer, FF_T_UINT16 *Name, FF_T_UINT uiNameLen, FF_T_UINT uiLFN, FF_T_UINT8 CheckSum) { - FF_T_UINT8 i, x; + FF_T_UINT i, x; memset(EntryBuffer, 0, 32); - FF_putChar(EntryBuffer, FF_FAT_LFN_ORD, (FF_T_UINT8) ((nLFN & ~0x40))); + FF_putChar(EntryBuffer, FF_FAT_LFN_ORD, (FF_T_UINT8) ((uiLFN & ~0x40))); FF_putChar(EntryBuffer, FF_FAT_DIRENT_ATTRIB, (FF_T_UINT8) FF_FAT_ATTR_LFN); FF_putChar(EntryBuffer, FF_FAT_LFN_CHECKSUM, (FF_T_UINT8) CheckSum); // Name_1 for(i = 0, x = 0; i < 5; i++, x += 2) { - if(i < NameLen) { - EntryBuffer[FF_FAT_LFN_NAME_1 + x] = Name[i]; - } else if (i == NameLen) { - EntryBuffer[FF_FAT_LFN_NAME_1 + x] = '\0'; - }else { - EntryBuffer[FF_FAT_LFN_NAME_1 + x] = 0xFF; - EntryBuffer[FF_FAT_LFN_NAME_1 + x + 1] = 0xFF; + if(i < uiNameLen) + { + memcpy(&EntryBuffer[FF_FAT_LFN_NAME_1 + x], &Name[i], sizeof(FF_T_UINT16)); + //bobtntfullfat *((FF_T_UINT16 *) &EntryBuffer[FF_FAT_LFN_NAME_1 + x]) = Name[i]; } + else + if (i == uiNameLen) + { + EntryBuffer[FF_FAT_LFN_NAME_1 + x] = '\0'; + EntryBuffer[FF_FAT_LFN_NAME_1 + x + 1] = '\0'; + } + else + { + EntryBuffer[FF_FAT_LFN_NAME_1 + x] = 0xFF; + EntryBuffer[FF_FAT_LFN_NAME_1 + x + 1] = 0xFF; + } } // Name_2 for(i = 0, x = 0; i < 6; i++, x += 2) { - if((i + 5) < NameLen) { - EntryBuffer[FF_FAT_LFN_NAME_2 + x] = Name[i+5]; - } else if ((i + 5) == NameLen) { - EntryBuffer[FF_FAT_LFN_NAME_2 + x] = '\0'; + if((i + 5) < uiNameLen) + { + memcpy(&EntryBuffer[FF_FAT_LFN_NAME_2 + x], &Name[i+5], sizeof(FF_T_UINT16)); + //EntryBuffer[FF_FAT_LFN_NAME_2 + x] = Name[i+5]; + //bobtntfullfat *((FF_T_UINT16 *) &EntryBuffer[FF_FAT_LFN_NAME_2 + x]) = Name[i+5]; + } else if ((i + 5) == uiNameLen) { + EntryBuffer[FF_FAT_LFN_NAME_2 + x] = '\0'; + EntryBuffer[FF_FAT_LFN_NAME_2 + x + 1] = '\0'; }else { EntryBuffer[FF_FAT_LFN_NAME_2 + x] = 0xFF; EntryBuffer[FF_FAT_LFN_NAME_2 + x + 1] = 0xFF; @@ -1449,10 +1992,14 @@ static FF_T_SINT8 FF_CreateLFNEntry(FF_T_UINT8 *EntryBuffer, FF_T_INT8 *Name, FF // Name_3 for(i = 0, x = 0; i < 2; i++, x += 2) { - if((i + 11) < NameLen) { - EntryBuffer[FF_FAT_LFN_NAME_3 + x] = Name[i+11]; - } else if ((i + 11) == NameLen) { - EntryBuffer[FF_FAT_LFN_NAME_3 + x] = '\0'; + if((i + 11) < uiNameLen) + { + memcpy(&EntryBuffer[FF_FAT_LFN_NAME_3 + x], &Name[i+11], sizeof(FF_T_UINT16)); + //EntryBuffer[FF_FAT_LFN_NAME_3 + x] = Name[i+11]; + //bobtntfullfat *((FF_T_UINT16 *) &EntryBuffer[FF_FAT_LFN_NAME_3 + x]) = Name[i+11]; + } else if ((i + 11) == uiNameLen) { + EntryBuffer[FF_FAT_LFN_NAME_3 + x] = '\0'; + EntryBuffer[FF_FAT_LFN_NAME_3 + x + 1] = '\0'; }else { EntryBuffer[FF_FAT_LFN_NAME_3 + x] = 0xFF; EntryBuffer[FF_FAT_LFN_NAME_3 + x + 1] = 0xFF; @@ -1461,13 +2008,26 @@ static FF_T_SINT8 FF_CreateLFNEntry(FF_T_UINT8 *EntryBuffer, FF_T_INT8 *Name, FF return FF_ERR_NONE; } +#endif -static FF_T_SINT8 FF_CreateLFNs(FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, FF_T_INT8 *Name, FF_T_UINT8 CheckSum, FF_T_UINT16 nEntry) { +/* +#ifdef FF_UNICODE_SUPPORT +static FF_ERROR FF_CreateLFNs(FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, FF_T_WCHAR *Name, FF_T_UINT8 CheckSum, FF_T_UINT16 nEntry) { +#else +static FF_ERROR FF_CreateLFNs(FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, FF_T_INT8 *Name, FF_T_UINT8 CheckSum, FF_T_UINT16 nEntry) { +#endif FF_T_UINT8 EntryBuffer[32]; +#ifdef FF_UNICODE_SUPPORT + FF_T_UINT16 NameLen = (FF_T_UINT16) wcslen(Name); +#else FF_T_UINT16 NameLen = (FF_T_UINT16) strlen(Name); +#endif FF_T_UINT8 NumLFNs = (FF_T_UINT8) (NameLen / 13); FF_T_UINT8 i; FF_T_UINT8 EndPos = (NameLen % 13); + FF_ERROR Error; + + FF_FETCH_CONTEXT FetchContext; if(EndPos) { NumLFNs ++; @@ -1475,6 +2035,11 @@ static FF_T_SINT8 FF_CreateLFNs(FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, FF_T_I EndPos = 13; } + Error = FF_InitEntryFetch(pIoman, DirCluster, &FetchContext); + if(Error) { + return Error; + } + for(i = NumLFNs; i > 0; i--) { if(i == NumLFNs) { FF_CreateLFNEntry(EntryBuffer, (Name + (13 * (i - 1))), EndPos, i, CheckSum); @@ -1482,16 +2047,143 @@ static FF_T_SINT8 FF_CreateLFNs(FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, FF_T_I } else { FF_CreateLFNEntry(EntryBuffer, (Name + (13 * (i - 1))), 13, i, CheckSum); } - FF_PushEntry(pIoman, DirCluster, nEntry + (NumLFNs - i), EntryBuffer); + + Error = FF_PushEntryWithContext(pIoman, nEntry + (NumLFNs - i), &FetchContext, EntryBuffer); + if(Error) { + FF_CleanupEntryFetch(pIoman, &FetchContext); + return Error; + } } + FF_CleanupEntryFetch(pIoman, &FetchContext); + return FF_ERR_NONE; } #endif +*/ -FF_T_SINT8 FF_ExtendDirectory(FF_IOMAN *pIoman, FF_T_UINT32 DirCluster) { + +#ifdef FF_UNICODE_SUPPORT +static FF_ERROR FF_CreateLFNs(FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, FF_T_WCHAR *Name, FF_T_UINT8 CheckSum, FF_T_UINT16 nEntry) { +#else +static FF_ERROR FF_CreateLFNs(FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, FF_T_INT8 *Name, FF_T_UINT8 CheckSum, FF_T_UINT16 nEntry) { +#endif + FF_ERROR Error; + FF_T_UINT uiNumLFNs; + FF_T_UINT uiEndPos; + FF_T_UINT i,y; + +#ifdef FF_UNICODE_UTF8_SUPPORT + FF_T_SINT32 slRetVal; +#endif + +#ifndef FF_UNICODE_SUPPORT +#ifndef FF_UNICODE_UTF8_SUPPORT + FF_T_UINT16 *pUtf16; +#endif +#endif + + FF_FETCH_CONTEXT FetchContext; + + FF_T_UINT8 EntryBuffer[32]; + FF_T_UINT16 usUtf16Name[FF_MAX_FILENAME + 1]; + + +#ifdef FF_UNICODE_SUPPORT +#if WCHAR_MAX <= 0xFFFF + y = wcslen(Name); + if(y > FF_MAX_FILENAME) { + return FF_ERR_DIR_NAME_TOO_LONG; + } + wcsncpy(usUtf16Name, Name, FF_MAX_FILENAME); +#else + i = 0; + y = 0; + while(Name[i]) { + FF_Utf32ctoUtf16c(&usUtf16Name[y], (FF_T_UINT32) Name[i], FF_MAX_FILENAME - i); + y += FF_GetUtf16SequenceLen(usUtf16Name[y]); + i++; + if(y > FF_MAX_FILENAME) { + return FF_ERR_DIR_NAME_TOO_LONG; + } + } +#endif +#endif + + // Convert the name into UTF-16 format. +#ifdef FF_UNICODE_UTF8_SUPPORT + // Simply convert the UTF8 to UTF16 and be done with it. + i = 0; + y = 0; + while(Name[i]) { + slRetVal = FF_Utf8ctoUtf16c(&usUtf16Name[y], (FF_T_UINT8 *)&Name[i], FF_MAX_FILENAME - i); + if(slRetVal > 0) { + i += slRetVal; + } else { + break; // No more space in the UTF-16 buffer, simply truncate for safety. + } + y += FF_GetUtf16SequenceLen(usUtf16Name[y]); + if(y > FF_MAX_FILENAME) { + return FF_ERR_DIR_NAME_TOO_LONG; + } + } +#else +#ifndef FF_UNICODE_SUPPORT + i = 0; + y = strlen(Name); + if(y > FF_MAX_FILENAME) { + return FF_ERR_DIR_NAME_TOO_LONG; + } + pUtf16 = usUtf16Name; + while(Name[i]) { + usUtf16Name[i] = (FF_T_UINT16) Name[i]; + i++; + } +#endif +#endif + + // Whole name is now in a valid UTF-16 format. Lets go make thos LFN's. + // i should at this point be the length of the name. + + uiNumLFNs = y / 13; // Number of LFNs is the total number of UTF-16 units, divided by 13 (13 units per LFN). + uiEndPos = y % 13; // The ending position in an LFN, of the last LFN UTF-16 charachter. + + if(uiEndPos) { + uiNumLFNs++; + } else { + uiEndPos = 13; + } + + Error = FF_InitEntryFetch(pIoman, DirCluster, &FetchContext); + if(Error) { + return Error; + } + + // After this point, i is no longer the length of the Filename in UTF-16 units. + for(i = uiNumLFNs; i > 0; i--) { + if(i == uiNumLFNs) { + FF_CreateLFNEntry(EntryBuffer, (usUtf16Name + (13 * (i - 1))), uiEndPos, i, CheckSum); + EntryBuffer[0] |= 0x40; + } else { + FF_CreateLFNEntry(EntryBuffer, (usUtf16Name + (13 * (i - 1))), 13, i, CheckSum); + } + + Error = FF_PushEntryWithContext(pIoman, nEntry + (uiNumLFNs - i), &FetchContext, EntryBuffer); + if(Error) { + FF_CleanupEntryFetch(pIoman, &FetchContext); + return Error; + } + } + + FF_CleanupEntryFetch(pIoman, &FetchContext); + + return FF_ERR_NONE; +} + +FF_ERROR FF_ExtendDirectory(FF_IOMAN *pIoman, FF_T_UINT32 DirCluster) { FF_T_UINT32 CurrentCluster; FF_T_UINT32 NextCluster; + FF_ERROR Error; if(pIoman->pPartition->Type != FF_T_FAT32) { if(DirCluster == pIoman->pPartition->RootDirCluster) { @@ -1500,7 +2192,10 @@ FF_T_SINT8 FF_ExtendDirectory(FF_IOMAN *pIoman, FF_T_UINT32 DirCluster) { } if(!pIoman->pPartition->FreeClusterCount) { - pIoman->pPartition->FreeClusterCount = FF_CountFreeClusters(pIoman); + pIoman->pPartition->FreeClusterCount = FF_CountFreeClusters(pIoman, &Error); + if(Error) { + return Error; + } if(pIoman->pPartition->FreeClusterCount == 0) { return FF_ERR_FAT_NO_FREE_CLUSTERS; } @@ -1508,20 +2203,52 @@ FF_T_SINT8 FF_ExtendDirectory(FF_IOMAN *pIoman, FF_T_UINT32 DirCluster) { FF_lockFAT(pIoman); { - CurrentCluster = FF_FindEndOfChain(pIoman, DirCluster); - NextCluster = FF_FindFreeCluster(pIoman); - FF_putFatEntry(pIoman, CurrentCluster, NextCluster); - FF_putFatEntry(pIoman, NextCluster, 0xFFFFFFFF); + CurrentCluster = FF_FindEndOfChain(pIoman, DirCluster, &Error); + if(Error) { + FF_unlockFAT(pIoman); + return Error; + } + + NextCluster = FF_FindFreeCluster(pIoman, &Error); + if(Error) { + FF_unlockFAT(pIoman); + return Error; + } + + Error = FF_putFatEntry(pIoman, CurrentCluster, NextCluster); + if(Error) { + FF_unlockFAT(pIoman); + return Error; + } + + Error = FF_putFatEntry(pIoman, NextCluster, 0xFFFFFFFF); + if(Error) { + FF_unlockFAT(pIoman); + return Error; + } } FF_unlockFAT(pIoman); - FF_ClearCluster(pIoman, NextCluster); - FF_DecreaseFreeClusters(pIoman, 1); + Error = FF_ClearCluster(pIoman, NextCluster); + if(Error) { + FF_unlockFAT(pIoman); + return Error; + } + + Error = FF_DecreaseFreeClusters(pIoman, 1); + if(Error) { + FF_unlockFAT(pIoman); + return Error; + } return FF_ERR_NONE; } -static void FF_MakeNameCompliant(FF_T_INT8 *Name) { +#ifdef FF_UNICODE_SUPPORT +static void FF_MakeNameCompliant(FF_T_WCHAR *Name) { +#else +static void FF_MakeNameCompliant(FF_T_UINT8 *Name) { +#endif if((FF_T_UINT8) Name[0] == 0xE5) { // Support Japanese KANJI symbol. Name[0] = 0x05; @@ -1531,7 +2258,7 @@ static void FF_MakeNameCompliant(FF_T_INT8 *Name) { if(*Name < 0x20 || *Name == 0x7F || *Name == 0x22 || *Name == 0x7C) { // Leave all extended chars as they are. *Name = '_'; } - if(*Name >= 0x2A && *Name <= 0x2F && *Name != 0x2B && *Name != 0x2E) { + if(*Name >= 0x2A && *Name <= 0x2F && *Name != 0x2B && *Name != 0x2E && *Name != 0x2D) { *Name = '_'; } if(*Name >= 0x3A && *Name <= 0x3F) { @@ -1544,23 +2271,43 @@ static void FF_MakeNameCompliant(FF_T_INT8 *Name) { } } -FF_T_SINT8 FF_CreateDirent(FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, FF_DIRENT *pDirent) { +FF_ERROR FF_CreateDirent(FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, FF_DIRENT *pDirent) { FF_T_UINT8 EntryBuffer[32]; +#ifdef FF_UNICODE_SUPPORT + FF_T_UINT16 NameLen = (FF_T_UINT16) wcslen(pDirent->FileName); +#else FF_T_UINT16 NameLen = (FF_T_UINT16) strlen(pDirent->FileName); +#endif FF_T_UINT8 numLFNs = (FF_T_UINT8) (NameLen / 13); FF_T_SINT32 FreeEntry; - FF_T_SINT8 RetVal = 0; + FF_ERROR RetVal = FF_ERR_NONE; FF_T_UINT8 Entries; + + FF_FETCH_CONTEXT FetchContext; + #ifdef FF_LFN_SUPPORT FF_T_UINT8 CheckSum; #endif +#ifdef FF_UNICODE_SUPPORT + FF_T_WCHAR UTF16EntryBuffer[32]; +#if WCHAR_MAX > 0xFFFF + // Check that the filename won't exceed the max LFN length if converted to UTF-16. + /*if(FF_Utf32GetUtf16Len((FF_T_UINT32 *) pDirent->FileName) > FF_MAX_FILENAME) { + return FF_ERR_UNICODE_CONVERSION_EXCEEDED; + }*/ +#endif + +#endif + +#ifdef FF_UNICODE_SUPPORT FF_MakeNameCompliant(pDirent->FileName); // Ensure we don't break the Dir tables. +#else + FF_MakeNameCompliant((FF_T_UINT8 *)pDirent->FileName); // Ensure we don't break the Dir tables. +#endif memset(EntryBuffer, 0, 32); - - if(NameLen % 13) { numLFNs ++; } @@ -1576,10 +2323,18 @@ FF_T_SINT8 FF_CreateDirent(FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, FF_DIRENT * FF_lockDIR(pIoman); { if((FreeEntry = FF_FindFreeDirent(pIoman, DirCluster, Entries)) >= 0) { +#ifdef FF_UNICODE_SUPPORT + //FF_cstrntowcs(UTF16EntryBuffer, (FF_T_INT8 *) EntryBuffer, 32); + RetVal = FF_CreateShortName(pIoman, DirCluster, UTF16EntryBuffer, pDirent->FileName); +#else RetVal = FF_CreateShortName(pIoman, DirCluster, (FF_T_INT8 *) EntryBuffer, pDirent->FileName); +#endif - if(!RetVal) { + //if(!RetVal) { #ifdef FF_LFN_SUPPORT +#ifdef FF_UNICODE_SUPPORT + FF_wcsntocstr((FF_T_INT8 *) EntryBuffer, UTF16EntryBuffer, 11); +#endif CheckSum = FF_CreateChkSum(EntryBuffer); FF_CreateLFNs(pIoman, DirCluster, pDirent->FileName, CheckSum, (FF_T_UINT16) FreeEntry); #else @@ -1598,10 +2353,24 @@ FF_T_SINT8 FF_CreateDirent(FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, FF_DIRENT * FF_putShort(EntryBuffer, (FF_T_UINT16)(FF_FAT_DIRENT_CLUS_LOW), (FF_T_UINT16)(pDirent->ObjectCluster)); FF_putLong(EntryBuffer, (FF_T_UINT16)(FF_FAT_DIRENT_FILESIZE), pDirent->Filesize); - FF_PushEntry(pIoman, DirCluster, (FF_T_UINT16) (FreeEntry + numLFNs), EntryBuffer); - } + RetVal = FF_InitEntryFetch(pIoman, DirCluster, &FetchContext); + if(RetVal) { + FF_unlockDIR(pIoman); + return RetVal; + } + RetVal = FF_PushEntryWithContext(pIoman, (FF_T_UINT16) (FreeEntry + numLFNs), &FetchContext, EntryBuffer); + FF_CleanupEntryFetch(pIoman, &FetchContext); + if(RetVal) { + FF_unlockDIR(pIoman); + return RetVal; + } + /*} else { + FF_unlockDIR(pIoman); + return RetVal; + }*/ }else { - RetVal = (FF_T_SINT8) FreeEntry; + FF_unlockDIR(pIoman); + return FreeEntry; } } FF_unlockDIR(pIoman); @@ -1614,19 +2383,36 @@ FF_T_SINT8 FF_CreateDirent(FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, FF_DIRENT * pDirent->CurrentItem = (FF_T_UINT16) (FreeEntry + numLFNs); } - return 0; + return FF_ERR_NONE; } -FF_T_UINT32 FF_CreateFile(FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, FF_T_INT8 *FileName, FF_DIRENT *pDirent) { - FF_DIRENT MyFile; + +#ifdef FF_UNICODE_SUPPORT +FF_T_UINT32 FF_CreateFile(FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, FF_T_WCHAR *FileName, FF_DIRENT *pDirent, FF_ERROR *pError) { +#else +FF_T_UINT32 FF_CreateFile(FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, FF_T_INT8 *FileName, FF_DIRENT *pDirent, FF_ERROR *pError) { +#endif + FF_DIRENT MyFile; + *pError = FF_ERR_NONE; +#ifdef FF_UNICODE_SUPPORT + wcsncpy(MyFile.FileName, FileName, FF_MAX_FILENAME); +#else strncpy(MyFile.FileName, FileName, FF_MAX_FILENAME); +#endif MyFile.Attrib = 0x00; MyFile.Filesize = 0; - MyFile.ObjectCluster = FF_CreateClusterChain(pIoman); + MyFile.ObjectCluster = FF_CreateClusterChain(pIoman, pError); + if(*pError) { + FF_UnlinkClusterChain(pIoman, MyFile.ObjectCluster, 0); + FF_FlushCache(pIoman); + return 0; + } MyFile.CurrentItem = 0; - if(FF_CreateDirent(pIoman, DirCluster, &MyFile)) { + *pError = FF_CreateDirent(pIoman, DirCluster, &MyFile); + + if(*pError) { FF_UnlinkClusterChain(pIoman, MyFile.ObjectCluster, 0); FF_FlushCache(pIoman); return 0; @@ -1653,20 +2439,34 @@ FF_T_UINT32 FF_CreateFile(FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, FF_T_INT8 *F * @return FF_ERR_DIR_INVALID_PATH * @return FF_ERR_NONE on success. **/ +#ifdef FF_UNICODE_SUPPORT +FF_ERROR FF_MkDir(FF_IOMAN *pIoman, const FF_T_WCHAR *Path) { +#else FF_ERROR FF_MkDir(FF_IOMAN *pIoman, const FF_T_INT8 *Path) { +#endif FF_DIRENT MyDir; FF_T_UINT32 DirCluster; +#ifdef FF_UNICODE_SUPPORT + FF_T_WCHAR DirName[FF_MAX_FILENAME]; +#else FF_T_INT8 DirName[FF_MAX_FILENAME]; +#endif FF_T_UINT8 EntryBuffer[32]; FF_T_UINT32 DotDotCluster; FF_T_UINT16 i; - FF_T_SINT8 RetVal = 0; + FF_ERROR Error = FF_ERR_NONE; + + FF_FETCH_CONTEXT FetchContext; if(!pIoman) { return FF_ERR_NULL_POINTER; } +#ifdef FF_UNICODE_SUPPORT + i = (FF_T_UINT16) wcslen(Path); +#else i = (FF_T_UINT16) strlen(Path); +#endif while(i != 0) { if(Path[i] == '\\' || Path[i] == '/') { @@ -1675,35 +2475,60 @@ FF_ERROR FF_MkDir(FF_IOMAN *pIoman, const FF_T_INT8 *Path) { i--; } +#ifdef FF_UNICODE_SUPPORT + wcsncpy(DirName, (Path + i + 1), FF_MAX_FILENAME); +#else strncpy(DirName, (Path + i + 1), FF_MAX_FILENAME); +#endif if(i == 0) { i = 1; } - DirCluster = FF_FindDir(pIoman, Path, i); + DirCluster = FF_FindDir(pIoman, Path, i, &Error); + + if(Error) { + return Error; + } if(DirCluster) { - - /*if(!FF_FindEntry(pIoman, DirCluster, DirName, &MyDir, FF_TRUE)) { - return FF_ERR_DIR_OBJECT_EXISTS; - }*/ - if(FF_FindEntryInDir(pIoman, DirCluster, DirName, 0x00, &MyDir)) { + if(FF_FindEntryInDir(pIoman, DirCluster, DirName, 0x00, &MyDir, &Error)) { return FF_ERR_DIR_OBJECT_EXISTS; } + if(Error && Error != FF_ERR_DIR_END_OF_DIR) { + return Error; + } + +#ifdef FF_UNICODE_SUPPORT + wcsncpy(MyDir.FileName, DirName, FF_MAX_FILENAME); +#else strncpy(MyDir.FileName, DirName, FF_MAX_FILENAME); +#endif MyDir.Filesize = 0; MyDir.Attrib = FF_FAT_ATTR_DIR; - MyDir.ObjectCluster = FF_CreateClusterChain(pIoman); - FF_ClearCluster(pIoman, MyDir.ObjectCluster); + MyDir.ObjectCluster = FF_CreateClusterChain(pIoman, &Error); + if(Error) { + return Error; + } + if(MyDir.ObjectCluster) { + Error = FF_ClearCluster(pIoman, MyDir.ObjectCluster); + if(Error) { + FF_UnlinkClusterChain(pIoman, MyDir.ObjectCluster, 0); + FF_FlushCache(pIoman); + return Error; + } + } else { + // Couldn't allocate any space for the dir! + return FF_ERR_DIR_EXTEND_FAILED; + } - RetVal = FF_CreateDirent(pIoman, DirCluster, &MyDir); + Error = FF_CreateDirent(pIoman, DirCluster, &MyDir); - if(RetVal) { + if(Error) { FF_UnlinkClusterChain(pIoman, MyDir.ObjectCluster, 0); FF_FlushCache(pIoman); - return RetVal; + return Error; } memset(EntryBuffer, 0, 32); @@ -1716,7 +2541,20 @@ FF_ERROR FF_MkDir(FF_IOMAN *pIoman, const FF_T_INT8 *Path) { FF_putShort(EntryBuffer, (FF_T_UINT16)(FF_FAT_DIRENT_CLUS_LOW), (FF_T_UINT16) MyDir.ObjectCluster); FF_putLong(EntryBuffer, (FF_T_UINT16)(FF_FAT_DIRENT_FILESIZE), 0); - FF_PushEntry(pIoman, MyDir.ObjectCluster, 0, EntryBuffer); + Error = FF_InitEntryFetch(pIoman, MyDir.ObjectCluster, &FetchContext); + if(Error) { + FF_UnlinkClusterChain(pIoman, MyDir.ObjectCluster, 0); + FF_FlushCache(pIoman); + return Error; + } + + Error = FF_PushEntryWithContext(pIoman, 0, &FetchContext, EntryBuffer); + if(Error) { + FF_UnlinkClusterChain(pIoman, MyDir.ObjectCluster, 0); + FF_FlushCache(pIoman); + FF_CleanupEntryFetch(pIoman, &FetchContext); + return Error; + } memset(EntryBuffer, 0, 32); EntryBuffer[0] = '.'; @@ -1736,8 +2574,16 @@ FF_ERROR FF_MkDir(FF_IOMAN *pIoman, const FF_T_INT8 *Path) { FF_putShort(EntryBuffer, (FF_T_UINT16)(FF_FAT_DIRENT_CLUS_LOW), (FF_T_UINT16) DotDotCluster); FF_putLong(EntryBuffer, (FF_T_UINT16)(FF_FAT_DIRENT_FILESIZE), 0); - FF_PushEntry(pIoman, MyDir.ObjectCluster, 1, EntryBuffer); - + //FF_PushEntry(pIoman, MyDir.ObjectCluster, 1, EntryBuffer); + Error = FF_PushEntryWithContext(pIoman, 1, &FetchContext, EntryBuffer); + if(Error) { + FF_UnlinkClusterChain(pIoman, MyDir.ObjectCluster, 0); + FF_FlushCache(pIoman); + FF_CleanupEntryFetch(pIoman, &FetchContext); + return Error; + } + FF_CleanupEntryFetch(pIoman, &FetchContext); + FF_FlushCache(pIoman); // Ensure dir was flushed to the disk! return FF_ERR_NONE; @@ -1748,24 +2594,32 @@ FF_ERROR FF_MkDir(FF_IOMAN *pIoman, const FF_T_INT8 *Path) { -void FF_RmLFNs(FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, FF_T_UINT16 DirEntry) { +FF_ERROR FF_RmLFNs(FF_IOMAN *pIoman, FF_T_UINT16 usDirEntry, FF_FETCH_CONTEXT *pContext) { + FF_ERROR Error; FF_T_UINT8 EntryBuffer[32]; - DirEntry--; + usDirEntry--; do { - FF_FetchEntry(pIoman, DirCluster, DirEntry, EntryBuffer); + Error = FF_FetchEntryWithContext(pIoman, usDirEntry, pContext, EntryBuffer); + if(Error) { + return Error; + } if(FF_getChar(EntryBuffer, (FF_T_UINT16)(FF_FAT_DIRENT_ATTRIB)) == FF_FAT_ATTR_LFN) { FF_putChar(EntryBuffer, (FF_T_UINT16) 0, (FF_T_UINT8) 0xE5); - FF_PushEntry(pIoman, DirCluster, DirEntry, EntryBuffer); + Error = FF_PushEntryWithContext(pIoman, usDirEntry, pContext, EntryBuffer); + if(Error) { + return Error; + } } - if(DirEntry == 0) { + if(usDirEntry == 0) { break; } - DirEntry--; + usDirEntry--; }while(FF_getChar(EntryBuffer, (FF_T_UINT16)(FF_FAT_DIRENT_ATTRIB)) == FF_FAT_ATTR_LFN); + return FF_ERR_NONE; } diff --git a/reactos/lib/3rdparty/fullfat/ff_dir.h b/reactos/lib/3rdparty/fullfat/ff_dir.h index 41eb7278f8d..6c99b7279c5 100644 --- a/reactos/lib/3rdparty/fullfat/ff_dir.h +++ b/reactos/lib/3rdparty/fullfat/ff_dir.h @@ -52,54 +52,118 @@ #include typedef struct { - FF_T_INT8 FileName[FF_MAX_FILENAME]; - FF_T_UINT8 Attrib; + FF_T_UINT32 ulChainLength; + FF_T_UINT32 ulDirCluster; + FF_T_UINT32 ulCurrentClusterLCN; + FF_T_UINT32 ulCurrentClusterNum; + FF_T_UINT32 ulCurrentEntry; + FF_BUFFER *pBuffer; +} FF_FETCH_CONTEXT; + +typedef struct { FF_T_UINT32 Filesize; FF_T_UINT32 ObjectCluster; - + + // Book Keeping + FF_T_UINT32 CurrentCluster; + FF_T_UINT32 AddrCurrentCluster; + FF_T_UINT32 DirCluster; + FF_T_UINT16 CurrentItem; + // End Book Keeping + #ifdef FF_TIME_SUPPORT FF_SYSTEMTIME CreateTime; ///< Date and Time Created. FF_SYSTEMTIME ModifiedTime; ///< Date and Time Modified. FF_SYSTEMTIME AccessedTime; ///< Date of Last Access. #endif - //---- Book Keeping for FF_Find Functions - FF_T_UINT16 CurrentItem; - FF_T_UINT32 DirCluster; - FF_T_UINT32 CurrentCluster; - FF_T_UINT32 AddrCurrentCluster; - //FF_T_UINT8 NumLFNs; +#ifdef FF_FINDAPI_ALLOW_WILDCARDS +#ifdef FF_UNICODE_SUPPORT + FF_T_WCHAR szWildCard[FF_MAX_FILENAME]; +#else + FF_T_INT8 szWildCard[FF_MAX_FILENAME]; +#endif +#endif + +#ifdef FF_UNICODE_SUPPORT + FF_T_WCHAR FileName[FF_MAX_FILENAME]; +#else + FF_T_INT8 FileName[FF_MAX_FILENAME]; +#endif + +#if defined(FF_LFN_SUPPORT) && defined(FF_INCLUDE_SHORT_NAME) + FF_T_INT8 ShortName[13]; +#endif + FF_T_UINT8 Attrib; + FF_FETCH_CONTEXT FetchContext; } FF_DIRENT; - FF_ERROR FF_GetEntry (FF_IOMAN *pIoman, FF_T_UINT16 nEntry, FF_T_UINT32 DirCluster, FF_DIRENT *pDirent); - FF_T_SINT8 FF_PutEntry (FF_IOMAN *pIoman, FF_T_UINT16 Entry, FF_T_UINT32 DirCluster, FF_DIRENT *pDirent); - FF_T_SINT8 FF_FindEntry (FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, FF_T_INT8 *Name, FF_DIRENT *pDirent, FF_T_BOOL LFNs); - FF_ERROR FF_FindFirst (FF_IOMAN *pIoman, FF_DIRENT *pDirent, const FF_T_INT8 *path); - FF_ERROR FF_FindNext (FF_IOMAN *pIoman, FF_DIRENT *pDirent); - void FF_PopulateShortDirent(FF_IOMAN *pIoman, FF_DIRENT *pDirent, FF_T_UINT8 *EntryBuffer); - FF_T_SINT8 FF_PopulateLongDirent(FF_IOMAN *pIoman, FF_DIRENT *pDirent, FF_T_UINT32 DirCluster, FF_T_UINT16 nEntry); - FF_T_SINT8 FF_FetchEntry (FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, FF_T_UINT16 nEntry, FF_T_UINT8 *buffer); - FF_T_SINT8 FF_PushEntry (FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, FF_T_UINT16 nEntry, FF_T_UINT8 *buffer); - FF_T_BOOL FF_isEndOfDir (FF_T_UINT8 *EntryBuffer); - FF_T_SINT8 FF_FindNextInDir(FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, FF_DIRENT *pDirent); - FF_T_UINT32 FF_FindEntryInDir(FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, FF_T_INT8 *name, FF_T_UINT8 pa_Attrib, FF_DIRENT *pDirent); - FF_T_SINT8 FF_CreateShortName(FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, FF_T_INT8 *ShortName, FF_T_INT8 *LongName); - -void FF_lockDIR (FF_IOMAN *pIoman); -void FF_unlockDIR (FF_IOMAN *pIoman); -FF_T_UINT32 FF_CreateFile(FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, FF_T_INT8 *FileName, FF_DIRENT *pDirent); -FF_ERROR FF_MkDir(FF_IOMAN *pIoman, const FF_T_INT8 *Path); -FF_T_SINT8 FF_CreateDirent(FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, FF_DIRENT *pDirent); -FF_T_SINT8 FF_ExtendDirectory(FF_IOMAN *pIoman, FF_T_UINT32 DirCluster); -FF_T_UINT32 FF_FindDir(FF_IOMAN *pIoman, const FF_T_INT8 *path, FF_T_UINT16 pathLen); -FF_T_BOOL FF_CheckDirentHash(FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, FF_T_UINT32 nHash); -FF_T_BOOL FF_DirHashed(FF_IOMAN *pIoman, FF_T_UINT32 DirCluster); -FF_ERROR FF_AddDirentHash(FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, FF_T_UINT32 nHash); -void FF_SetDirHashed(FF_IOMAN *pIoman, FF_T_UINT32 DirCluster); +// PUBLIC API +#ifdef FF_UNICODE_SUPPORT +FF_ERROR FF_FindFirst (FF_IOMAN *pIoman, FF_DIRENT *pDirent, const FF_T_WCHAR *path); +FF_ERROR FF_MkDir (FF_IOMAN *pIoman, const FF_T_WCHAR *Path); +#else +FF_ERROR FF_FindFirst (FF_IOMAN *pIoman, FF_DIRENT *pDirent, const FF_T_INT8 *path); +FF_ERROR FF_MkDir (FF_IOMAN *pIoman, const FF_T_INT8 *Path); +#endif -void FF_RmLFNs(FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, FF_T_UINT16 DirEntry); +FF_ERROR FF_FindNext (FF_IOMAN *pIoman, FF_DIRENT *pDirent); + + +// INTERNAL API +FF_ERROR FF_GetEntry (FF_IOMAN *pIoman, FF_T_UINT16 nEntry, FF_T_UINT32 DirCluster, FF_DIRENT *pDirent); +FF_ERROR FF_PutEntry (FF_IOMAN *pIoman, FF_T_UINT16 Entry, FF_T_UINT32 DirCluster, FF_DIRENT *pDirent); +FF_T_SINT8 FF_FindEntry (FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, FF_T_INT8 *Name, FF_DIRENT *pDirent, FF_T_BOOL LFNs); + +void FF_PopulateShortDirent (FF_IOMAN *pIoman, FF_DIRENT *pDirent, FF_T_UINT8 *EntryBuffer); +FF_ERROR FF_PopulateLongDirent (FF_IOMAN *pIoman, FF_DIRENT *pDirent, FF_T_UINT16 nEntry, FF_FETCH_CONTEXT *pFetchContext); + +FF_ERROR FF_InitEntryFetch (FF_IOMAN *pIoman, FF_T_UINT32 ulDirCluster, FF_FETCH_CONTEXT *pContext); +FF_ERROR FF_FetchEntryWithContext (FF_IOMAN *pIoman, FF_T_UINT32 ulEntry, FF_FETCH_CONTEXT *pContext, FF_T_UINT8 *pEntryBuffer); +FF_ERROR FF_PushEntryWithContext (FF_IOMAN *pIoman, FF_T_UINT32 ulEntry, FF_FETCH_CONTEXT *pContext, FF_T_UINT8 *pEntryBuffer); +void FF_CleanupEntryFetch (FF_IOMAN *pIoman, FF_FETCH_CONTEXT *pContext); + +FF_T_SINT8 FF_PushEntry (FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, FF_T_UINT16 nEntry, FF_T_UINT8 *buffer, void *pParam); +FF_T_BOOL FF_isEndOfDir (FF_T_UINT8 *EntryBuffer); +FF_ERROR FF_FindNextInDir (FF_IOMAN *pIoman, FF_DIRENT *pDirent, FF_FETCH_CONTEXT *pFetchContext); + +#ifdef FF_UNICODE_SUPPORT +FF_T_UINT32 FF_FindEntryInDir (FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, const FF_T_WCHAR *name, FF_T_UINT8 pa_Attrib, FF_DIRENT *pDirent, FF_ERROR *pError); +FF_T_SINT8 FF_CreateShortName (FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, FF_T_WCHAR *ShortName, FF_T_WCHAR *LongName); +#else +FF_T_UINT32 FF_FindEntryInDir (FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, const FF_T_INT8 *name, FF_T_UINT8 pa_Attrib, FF_DIRENT *pDirent, FF_ERROR *pError); +FF_T_SINT8 FF_CreateShortName (FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, FF_T_INT8 *ShortName, FF_T_INT8 *LongName); +#endif + + +void FF_lockDIR (FF_IOMAN *pIoman); +void FF_unlockDIR (FF_IOMAN *pIoman); + +#ifdef FF_UNICODE_SUPPORT +FF_T_UINT32 FF_CreateFile(FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, FF_T_WCHAR *FileName, FF_DIRENT *pDirent, FF_ERROR *pError); +#else +FF_T_UINT32 FF_CreateFile(FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, FF_T_INT8 *FileName, FF_DIRENT *pDirent, FF_ERROR *pError); +#endif + +FF_ERROR FF_CreateDirent (FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, FF_DIRENT *pDirent); +FF_ERROR FF_ExtendDirectory (FF_IOMAN *pIoman, FF_T_UINT32 DirCluster); + +#ifdef FF_UNICODE_SUPPORT +FF_T_UINT32 FF_FindDir (FF_IOMAN *pIoman, const FF_T_WCHAR *path, FF_T_UINT16 pathLen, FF_ERROR *pError); +#else +FF_T_UINT32 FF_FindDir (FF_IOMAN *pIoman, const FF_T_INT8 *path, FF_T_UINT16 pathLen, FF_ERROR *pError); +#endif + +#ifdef FF_HASH_CACHE +FF_T_BOOL FF_CheckDirentHash (FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, FF_T_UINT32 nHash); +FF_T_BOOL FF_DirHashed (FF_IOMAN *pIoman, FF_T_UINT32 DirCluster); +FF_ERROR FF_AddDirentHash (FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, FF_T_UINT32 nHash); +FF_ERROR FF_HashDir (FF_IOMAN *pIoman, FF_T_UINT32 ulDirCluster); +#endif + +FF_ERROR FF_RmLFNs(FF_IOMAN *pIoman, FF_T_UINT16 usDirEntry, FF_FETCH_CONTEXT *pContext); #endif diff --git a/reactos/lib/3rdparty/fullfat/ff_error.c b/reactos/lib/3rdparty/fullfat/ff_error.c index 483bf964ce3..787c8769aaa 100644 --- a/reactos/lib/3rdparty/fullfat/ff_error.c +++ b/reactos/lib/3rdparty/fullfat/ff_error.c @@ -56,7 +56,7 @@ const struct _FFERRTAB {"Not enough memory (malloc() returned NULL).", FF_ERR_NOT_ENOUGH_MEMORY}, {"Device Driver returned a FATAL error!.", FF_ERR_DEVICE_DRIVER_FAILED}, {"The blocksize is not 512 multiple.", FF_ERR_IOMAN_BAD_BLKSIZE}, - {"The provided memory size, is not a multiple of the blocksize.", FF_ERR_IOMAN_BAD_MEMSIZE}, + {"The memory size, is not a multiple of the blocksize. (Atleast 2 Blocks).", FF_ERR_IOMAN_BAD_MEMSIZE}, {"Device is already registered, use FF_UnregisterBlkDevice() first.", FF_ERR_IOMAN_DEV_ALREADY_REGD}, {"No mountable partition was found on the specified device.", FF_ERR_IOMAN_NO_MOUNTABLE_PARTITION}, {"The format of the MBR was unrecognised.", FF_ERR_IOMAN_INVALID_FORMAT}, @@ -65,6 +65,7 @@ const struct _FFERRTAB {"Cannot register device. (BlkSize not a multiple of 512).", FF_ERR_IOMAN_DEV_INVALID_BLKSIZE}, {"Cannot unregister device, a partition is still mounted.", FF_ERR_IOMAN_PARTITION_MOUNTED}, {"Cannot unmount the partition while there are active FILE handles.", FF_ERR_IOMAN_ACTIVE_HANDLES}, + {"The GPT partition header appears to be corrupt, refusing to mount.", FF_ERR_IOMAN_GPT_HEADER_CORRUPT}, {"Cannot open the file, file already in use.", FF_ERR_FILE_ALREADY_OPEN}, {"The specified file could not be found.", FF_ERR_FILE_NOT_FOUND}, {"Cannot open a Directory.", FF_ERR_FILE_OBJECT_IS_A_DIR}, @@ -84,6 +85,9 @@ const struct _FFERRTAB {"Source file was not found.", FF_ERR_FILE_SOURCE_NOT_FOUND}, {"Destination path (dir) was not found.", FF_ERR_FILE_DIR_NOT_FOUND}, {"Failed to create the directory Entry.", FF_ERR_FILE_COULD_NOT_CREATE_DIRENT}, + {"Not enough free disk space to complete the disk transaction.", FF_ERR_IOMAN_NOT_ENOUGH_FREE_SPACE}, + {"Attempted to Read a sector out of bounds.", FF_ERR_IOMAN_OUT_OF_BOUNDS_READ}, + {"Attempted to Write a sector out of bounds.", FF_ERR_IOMAN_OUT_OF_BOUNDS_WRITE}, }; /** diff --git a/reactos/lib/3rdparty/fullfat/ff_fat.c b/reactos/lib/3rdparty/fullfat/ff_fat.c index 66769e56af7..fb5ac824033 100644 --- a/reactos/lib/3rdparty/fullfat/ff_fat.c +++ b/reactos/lib/3rdparty/fullfat/ff_fat.c @@ -110,7 +110,7 @@ FF_T_UINT32 FF_LBA2Cluster(FF_IOMAN *pIoman, FF_T_UINT32 Address) { /** * @private **/ -FF_T_SINT32 FF_getFatEntry(FF_IOMAN *pIoman, FF_T_UINT32 nCluster) { +FF_T_UINT32 FF_getFatEntry(FF_IOMAN *pIoman, FF_T_UINT32 nCluster, FF_ERROR *pError) { FF_BUFFER *pBuffer; FF_T_UINT32 FatOffset; @@ -148,7 +148,8 @@ FF_T_SINT32 FF_getFatEntry(FF_IOMAN *pIoman, FF_T_UINT32 nCluster) { pBuffer = FF_GetBuffer(pIoman, FatSector + LBAadjust, FF_MODE_READ); { if(!pBuffer) { - return FF_ERR_DEVICE_DRIVER_FAILED; + *pError = FF_ERR_DEVICE_DRIVER_FAILED; + return 0; } F12short[0] = FF_getChar(pBuffer->pBuffer, (FF_T_UINT16)(pIoman->BlkSize - 1)); } @@ -157,7 +158,8 @@ FF_T_SINT32 FF_getFatEntry(FF_IOMAN *pIoman, FF_T_UINT32 nCluster) { pBuffer = FF_GetBuffer(pIoman, FatSector + LBAadjust + 1, FF_MODE_READ); { if(!pBuffer) { - return FF_ERR_DEVICE_DRIVER_FAILED; + *pError = FF_ERR_DEVICE_DRIVER_FAILED; + return 0; } F12short[1] = FF_getChar(pBuffer->pBuffer, 0); } @@ -176,7 +178,8 @@ FF_T_SINT32 FF_getFatEntry(FF_IOMAN *pIoman, FF_T_UINT32 nCluster) { pBuffer = FF_GetBuffer(pIoman, FatSector + LBAadjust, FF_MODE_READ); { if(!pBuffer) { - return FF_ERR_DEVICE_DRIVER_FAILED; + *pError = FF_ERR_DEVICE_DRIVER_FAILED; + return 0; } switch(pIoman->pPartition->Type) { @@ -208,11 +211,10 @@ FF_T_SINT32 FF_getFatEntry(FF_IOMAN *pIoman, FF_T_UINT32 nCluster) { return (FF_T_SINT32) FatEntry; } -FF_T_SINT8 FF_ClearCluster(FF_IOMAN *pIoman, FF_T_UINT32 nCluster) { +FF_ERROR FF_ClearCluster(FF_IOMAN *pIoman, FF_T_UINT32 nCluster) { FF_BUFFER *pBuffer; FF_T_UINT16 i; FF_T_UINT32 BaseLBA; - FF_T_SINT8 RetVal = 0; BaseLBA = FF_Cluster2LBA(pIoman, nCluster); BaseLBA = FF_getRealLBA(pIoman, BaseLBA); @@ -220,16 +222,15 @@ FF_T_SINT8 FF_ClearCluster(FF_IOMAN *pIoman, FF_T_UINT32 nCluster) { for(i = 0; i < pIoman->pPartition->SectorsPerCluster; i++) { pBuffer = FF_GetBuffer(pIoman, BaseLBA++, FF_MODE_WRITE); { - if(pBuffer) { - memset(pBuffer->pBuffer, 0x00, 512); - } else { - RetVal = FF_ERR_DEVICE_DRIVER_FAILED; + if(!pBuffer) { + return FF_ERR_DEVICE_DRIVER_FAILED; } + memset(pBuffer->pBuffer, 0x00, 512); } FF_ReleaseBuffer(pIoman, pBuffer); } - return RetVal; + return FF_ERR_NONE; } /** @@ -240,17 +241,19 @@ FF_T_SINT8 FF_ClearCluster(FF_IOMAN *pIoman, FF_T_UINT32 nCluster) { * @param Start Cluster address of the first cluster in the chain. * @param Count Number of Cluster in the chain, * - * @return FF_TRUE if it is an end of chain, otherwise FF_FALSE. + * * **/ -FF_T_UINT32 FF_TraverseFAT(FF_IOMAN *pIoman, FF_T_UINT32 Start, FF_T_UINT32 Count) { +FF_T_UINT32 FF_TraverseFAT(FF_IOMAN *pIoman, FF_T_UINT32 Start, FF_T_UINT32 Count, FF_ERROR *pError) { FF_T_UINT32 i; FF_T_UINT32 fatEntry = Start, currentCluster = Start; + *pError = FF_ERR_NONE; + for(i = 0; i < Count; i++) { - fatEntry = FF_getFatEntry(pIoman, currentCluster); - if(fatEntry == (FF_T_UINT32) FF_ERR_DEVICE_DRIVER_FAILED) { + fatEntry = FF_getFatEntry(pIoman, currentCluster, pError); + if(*pError) { return 0; } @@ -264,13 +267,14 @@ FF_T_UINT32 FF_TraverseFAT(FF_IOMAN *pIoman, FF_T_UINT32 Start, FF_T_UINT32 Coun return fatEntry; } -FF_T_UINT32 FF_FindEndOfChain(FF_IOMAN *pIoman, FF_T_UINT32 Start) { +FF_T_UINT32 FF_FindEndOfChain(FF_IOMAN *pIoman, FF_T_UINT32 Start, FF_ERROR *pError) { FF_T_UINT32 fatEntry = Start, currentCluster = Start; + *pError = FF_ERR_NONE; while(!FF_isEndOfChain(pIoman, fatEntry)) { - fatEntry = FF_getFatEntry(pIoman, currentCluster); - if(fatEntry == (FF_T_UINT32) FF_ERR_DEVICE_DRIVER_FAILED) { + fatEntry = FF_getFatEntry(pIoman, currentCluster, pError); + if(*pError) { return 0; } @@ -325,7 +329,7 @@ FF_T_BOOL FF_isEndOfChain(FF_IOMAN *pIoman, FF_T_UINT32 fatEntry) { * @param nCluster Cluster Number to be modified. * @param Value The Value to store. **/ -FF_T_SINT8 FF_putFatEntry(FF_IOMAN *pIoman, FF_T_UINT32 nCluster, FF_T_UINT32 Value) { +FF_ERROR FF_putFatEntry(FF_IOMAN *pIoman, FF_T_UINT32 nCluster, FF_T_UINT32 Value) { FF_BUFFER *pBuffer; FF_T_UINT32 FatOffset; @@ -439,7 +443,7 @@ FF_T_SINT8 FF_putFatEntry(FF_IOMAN *pIoman, FF_T_UINT32 nCluster, FF_T_UINT32 Va } FF_ReleaseBuffer(pIoman, pBuffer); - return 0; + return FF_ERR_NONE; } @@ -454,12 +458,17 @@ FF_T_SINT8 FF_putFatEntry(FF_IOMAN *pIoman, FF_T_UINT32 nCluster, FF_T_UINT32 Va * @return 0 on error. **/ #ifdef FF_FAT12_SUPPORT -FF_T_UINT32 FF_FindFreeClusterOLD(FF_IOMAN *pIoman) { +static FF_T_UINT32 FF_FindFreeClusterOLD(FF_IOMAN *pIoman, FF_ERROR *pError) { FF_T_UINT32 nCluster; FF_T_UINT32 fatEntry; + *pError = FF_ERR_NONE; + for(nCluster = pIoman->pPartition->LastFreeCluster; nCluster < pIoman->pPartition->NumClusters; nCluster++) { - fatEntry = FF_getFatEntry(pIoman, nCluster); + fatEntry = FF_getFatEntry(pIoman, nCluster, pError); + if(*pError) { + return 0; + } if(fatEntry == 0x00000000) { pIoman->pPartition->LastFreeCluster = nCluster; return nCluster; @@ -469,7 +478,7 @@ FF_T_UINT32 FF_FindFreeClusterOLD(FF_IOMAN *pIoman) { } #endif -FF_T_UINT32 FF_FindFreeCluster(FF_IOMAN *pIoman) { +FF_T_UINT32 FF_FindFreeCluster(FF_IOMAN *pIoman, FF_ERROR *pError) { FF_BUFFER *pBuffer; FF_T_UINT32 i, x, nCluster = pIoman->pPartition->LastFreeCluster; FF_T_UINT32 FatOffset; @@ -478,9 +487,11 @@ FF_T_UINT32 FF_FindFreeCluster(FF_IOMAN *pIoman) { FF_T_UINT32 EntriesPerSector; FF_T_UINT32 FatEntry = 1; + *pError = FF_ERR_NONE; + #ifdef FF_FAT12_SUPPORT if(pIoman->pPartition->Type == FF_T_FAT12) { // FAT12 tables are too small to optimise, and would make it very complicated! - return FF_FindFreeClusterOLD(pIoman); + return FF_FindFreeClusterOLD(pIoman, pError); } #endif @@ -491,15 +502,20 @@ FF_T_UINT32 FF_FindFreeCluster(FF_IOMAN *pIoman) { EntriesPerSector = pIoman->BlkSize / 2; FatOffset = nCluster * 2; } + + // HT addition: don't use non-existing clusters + if (nCluster >= pIoman->pPartition->NumClusters) { + *pError = FF_ERR_FAT_NO_FREE_CLUSTERS; + return 0; + } FatSector = (FatOffset / pIoman->pPartition->BlkSize); for(i = FatSector; i < pIoman->pPartition->SectorsPerFAT; i++) { pBuffer = FF_GetBuffer(pIoman, pIoman->pPartition->FatBeginLBA + i, FF_MODE_READ); { - // HT addition: don't use non-existing clusters - if (nCluster >= pIoman->pPartition->NumClusters) { - FF_ReleaseBuffer(pIoman, pBuffer); + if(!pBuffer) { + *pError = FF_ERR_DEVICE_DRIVER_FAILED; return 0; } for(x = nCluster % EntriesPerSector; x < EntriesPerSector; x++) { @@ -533,24 +549,54 @@ FF_T_UINT32 FF_FindFreeCluster(FF_IOMAN *pIoman) { * @private * @brief Create's a Cluster Chain **/ -FF_T_UINT32 FF_CreateClusterChain(FF_IOMAN *pIoman) { +FF_T_UINT32 FF_CreateClusterChain(FF_IOMAN *pIoman, FF_ERROR *pError) { FF_T_UINT32 iStartCluster; + FF_ERROR Error; + *pError = FF_ERR_NONE; + FF_lockFAT(pIoman); { - iStartCluster = FF_FindFreeCluster(pIoman); - FF_putFatEntry(pIoman, iStartCluster, 0xFFFFFFFF); // Mark the cluster as EOC + iStartCluster = FF_FindFreeCluster(pIoman, &Error); + if(Error) { + *pError = Error; + FF_unlockFAT(pIoman); + return 0; + } + + if(iStartCluster) { + Error = FF_putFatEntry(pIoman, iStartCluster, 0xFFFFFFFF); // Mark the cluster as End-Of-Chain + if(Error) { + *pError = Error; + FF_unlockFAT(pIoman); + return 0; + } + } } FF_unlockFAT(pIoman); + + if(iStartCluster) { + Error = FF_DecreaseFreeClusters(pIoman, 1); + if(Error) { + *pError = Error; + return 0; + } + } + return iStartCluster; } -FF_T_UINT32 FF_GetChainLength(FF_IOMAN *pIoman, FF_T_UINT32 pa_nStartCluster, FF_T_UINT32 *piEndOfChain) { +FF_T_UINT32 FF_GetChainLength(FF_IOMAN *pIoman, FF_T_UINT32 pa_nStartCluster, FF_T_UINT32 *piEndOfChain, FF_ERROR *pError) { FF_T_UINT32 iLength = 0; + + *pError = FF_ERR_NONE; FF_lockFAT(pIoman); { while(!FF_isEndOfChain(pIoman, pa_nStartCluster)) { - pa_nStartCluster = FF_getFatEntry(pIoman, pa_nStartCluster); + pa_nStartCluster = FF_getFatEntry(pIoman, pa_nStartCluster, pError); + if(*pError) { + return 0; + } iLength++; } if(piEndOfChain) { @@ -612,12 +658,13 @@ FF_T_UINT32 FF_ExtendClusterChain(FF_IOMAN *pIoman, FF_T_UINT32 StartCluster, FF * @return -1 If the device driver failed to provide access. * **/ -FF_T_SINT8 FF_UnlinkClusterChain(FF_IOMAN *pIoman, FF_T_UINT32 StartCluster, FF_T_UINT16 Count) { +FF_ERROR FF_UnlinkClusterChain(FF_IOMAN *pIoman, FF_T_UINT32 StartCluster, FF_T_UINT16 Count) { FF_T_UINT32 fatEntry; FF_T_UINT32 currentCluster, chainLength = 0; FF_T_UINT32 iLen = 0; FF_T_UINT32 lastFree = StartCluster; /* HT addition : reset LastFreeCluster */ + FF_ERROR Error; fatEntry = StartCluster; @@ -626,8 +673,15 @@ FF_T_SINT8 FF_UnlinkClusterChain(FF_IOMAN *pIoman, FF_T_UINT32 StartCluster, FF_ currentCluster = StartCluster; fatEntry = currentCluster; do { - fatEntry = FF_getFatEntry(pIoman, fatEntry); - FF_putFatEntry(pIoman, currentCluster, 0x00000000); + fatEntry = FF_getFatEntry(pIoman, fatEntry, &Error); + if(Error) { + return Error; + } + Error = FF_putFatEntry(pIoman, currentCluster, 0x00000000); + if(Error) { + return Error; + } + if (lastFree > currentCluster) { lastFree = currentCluster; } @@ -637,11 +691,17 @@ FF_T_SINT8 FF_UnlinkClusterChain(FF_IOMAN *pIoman, FF_T_UINT32 StartCluster, FF_ if (pIoman->pPartition->LastFreeCluster > lastFree) { pIoman->pPartition->LastFreeCluster = lastFree; } - FF_IncreaseFreeClusters(pIoman, iLen); + Error = FF_IncreaseFreeClusters(pIoman, iLen); + if(Error) { + return Error; + } } else { // Truncation - This is quite hard, because we can only do it backwards. do { - fatEntry = FF_getFatEntry(pIoman, fatEntry); + fatEntry = FF_getFatEntry(pIoman, fatEntry, &Error); + if(Error) { + return Error; + } chainLength++; }while(!FF_isEndOfChain(pIoman, fatEntry)); } @@ -650,14 +710,19 @@ FF_T_SINT8 FF_UnlinkClusterChain(FF_IOMAN *pIoman, FF_T_UINT32 StartCluster, FF_ } #ifdef FF_FAT12_SUPPORT -FF_T_UINT32 FF_CountFreeClustersOLD(FF_IOMAN *pIoman) { +FF_T_UINT32 FF_CountFreeClustersOLD(FF_IOMAN *pIoman, FF_ERROR *pError) { FF_T_UINT32 i; FF_T_UINT32 TotalClusters = pIoman->pPartition->DataSectors / pIoman->pPartition->SectorsPerCluster; FF_T_UINT32 FatEntry; FF_T_UINT32 FreeClusters = 0; + *pError = FF_ERR_NONE; + for(i = 0; i < TotalClusters; i++) { - FatEntry = FF_getFatEntry(pIoman, i); + FatEntry = FF_getFatEntry(pIoman, i, pError); + if(*pError) { + return 0; + } if(!FatEntry) { FreeClusters++; } @@ -668,7 +733,7 @@ FF_T_UINT32 FF_CountFreeClustersOLD(FF_IOMAN *pIoman) { #endif -FF_T_UINT32 FF_CountFreeClusters(FF_IOMAN *pIoman) { +FF_T_UINT32 FF_CountFreeClusters(FF_IOMAN *pIoman, FF_ERROR *pError) { FF_BUFFER *pBuffer; FF_T_UINT32 i, x, nCluster = 0; FF_T_UINT32 FatOffset; @@ -678,9 +743,14 @@ FF_T_UINT32 FF_CountFreeClusters(FF_IOMAN *pIoman) { FF_T_UINT32 FatEntry = 1; FF_T_UINT32 FreeClusters = 0; + *pError = FF_ERR_NONE; + #ifdef FF_FAT12_SUPPORT if(pIoman->pPartition->Type == FF_T_FAT12) { // FAT12 tables are too small to optimise, and would make it very complicated! - return FF_CountFreeClustersOLD(pIoman); + FreeClusters = FF_CountFreeClustersOLD(pIoman, pError); + if(*pError) { + return 0; + } } #endif @@ -697,6 +767,10 @@ FF_T_UINT32 FF_CountFreeClusters(FF_IOMAN *pIoman) { for(i = 0; i < pIoman->pPartition->SectorsPerFAT; i++) { pBuffer = FF_GetBuffer(pIoman, pIoman->pPartition->FatBeginLBA + i, FF_MODE_READ); { + if(!pBuffer) { + *pError = FF_ERR_DEVICE_DRIVER_FAILED; + return 0; + } for(x = nCluster % EntriesPerSector; x < EntriesPerSector; x++) { if(pIoman->pPartition->Type == FF_T_FAT32) { FatOffset = x * 4; @@ -722,15 +796,23 @@ FF_T_UINT32 FF_CountFreeClusters(FF_IOMAN *pIoman) { } #ifdef FF_64_NUM_SUPPORT -FF_T_UINT64 FF_GetFreeSize(FF_IOMAN *pIoman) { +FF_T_UINT64 FF_GetFreeSize(FF_IOMAN *pIoman, FF_ERROR *pError) { FF_T_UINT32 FreeClusters; FF_T_UINT64 FreeSize; + FF_ERROR Error; if(pIoman) { FF_lockFAT(pIoman); { if(!pIoman->pPartition->FreeClusterCount) { - pIoman->pPartition->FreeClusterCount = FF_CountFreeClusters(pIoman); + pIoman->pPartition->FreeClusterCount = FF_CountFreeClusters(pIoman, &Error); + if(Error) { + if(pError) { + *pError = Error; + } + FF_unlockFAT(pIoman); + return 0; + } } FreeClusters = pIoman->pPartition->FreeClusterCount; } diff --git a/reactos/lib/3rdparty/fullfat/ff_file.c b/reactos/lib/3rdparty/fullfat/ff_file.c index cd29e31562b..716467a7833 100644 --- a/reactos/lib/3rdparty/fullfat/ff_file.c +++ b/reactos/lib/3rdparty/fullfat/ff_file.c @@ -42,6 +42,11 @@ #include "ff_file.h" #include "ff_string.h" +#include "ff_config.h" + +#ifdef FF_UNICODE_SUPPORT +#include +#endif /** * @public @@ -143,13 +148,22 @@ FF_T_UINT8 FF_GetModeBits(FF_T_INT8 *Mode) { * @return NULL pointer on Error, in which case pError should be checked for more information. * @return pError can be: **/ +#ifdef FF_UNICODE_SUPPORT +FF_FILE *FF_Open(FF_IOMAN *pIoman, const FF_T_WCHAR *path, FF_T_UINT8 Mode, FF_ERROR *pError) { +#else FF_FILE *FF_Open(FF_IOMAN *pIoman, const FF_T_INT8 *path, FF_T_UINT8 Mode, FF_ERROR *pError) { +#endif FF_FILE *pFile; FF_FILE *pFileChain; FF_DIRENT Object; FF_T_UINT32 DirCluster, FileCluster; FF_T_UINT32 nBytesPerCluster; +#ifdef FF_UNICODE_SUPPORT + FF_T_WCHAR filename[FF_MAX_FILENAME]; +#else FF_T_INT8 filename[FF_MAX_FILENAME]; +#endif + FF_ERROR Error; FF_T_UINT16 i; @@ -174,7 +188,11 @@ FF_FILE *FF_Open(FF_IOMAN *pIoman, const FF_T_INT8 *path, FF_T_UINT8 Mode, FF_ER // Get the Mode Bits. pFile->Mode = Mode; +#ifdef FF_UNICODE_SUPPORT + i = (FF_T_UINT16) wcslen(path); +#else i = (FF_T_UINT16) strlen(path); +#endif while(i != 0) { if(path[i] == '\\' || path[i] == '/') { @@ -182,29 +200,45 @@ FF_FILE *FF_Open(FF_IOMAN *pIoman, const FF_T_INT8 *path, FF_T_UINT8 Mode, FF_ER } i--; } - +#ifdef FF_UNICODE_SUPPORT + wcsncpy(filename, (path + i + 1), FF_MAX_FILENAME); +#else strncpy(filename, (path + i + 1), FF_MAX_FILENAME); +#endif if(i == 0) { i = 1; } - DirCluster = FF_FindDir(pIoman, path, i); + DirCluster = FF_FindDir(pIoman, path, i, &Error); + if(Error) { + if(pError) { + *pError = Error; + } + FF_FREE(pFile); + return (FF_FILE *) NULL; + } if(DirCluster) { - //RetVal = //FF_FindEntry(pIoman, DirCluster, filename, &Object, FF_TRUE); - //if(RetVal >= 0) { - //FileCluster = Object.ObjectCluster;//FF_FindEntryInDir(pIoman, DirCluster, filename, 0x00, &Object); - //} else { - // FileCluster = 0; - //} - FileCluster = FF_FindEntryInDir(pIoman, DirCluster, filename, 0x00, &Object); + FileCluster = FF_FindEntryInDir(pIoman, DirCluster, filename, 0x00, &Object, &Error); + if(Error) { + if(pError) { + *pError = Error; + } + FF_FREE(pFile); + return (FF_FILE *) NULL; + } if(!FileCluster) { // If 0 was returned, it might be because the file has no allocated cluster +#ifdef FF_UNICODE_SUPPORT + if(wcslen(filename) == wcslen(Object.FileName)) { + if(Object.Filesize == 0 && FF_strmatch(filename, Object.FileName, (FF_T_UINT16) wcslen(filename)) == FF_TRUE) { +#else if(strlen(filename) == strlen(Object.FileName)) { if(Object.Filesize == 0 && FF_strmatch(filename, Object.FileName, (FF_T_UINT16) strlen(filename)) == FF_TRUE) { +#endif // The file really was found! FileCluster = 1; } @@ -213,7 +247,14 @@ FF_FILE *FF_Open(FF_IOMAN *pIoman, const FF_T_INT8 *path, FF_T_UINT8 Mode, FF_ER if(!FileCluster) { if((pFile->Mode & FF_MODE_CREATE)) { - FileCluster = FF_CreateFile(pIoman, DirCluster, filename, &Object); + FileCluster = FF_CreateFile(pIoman, DirCluster, filename, &Object, &Error); + if(Error) { + if(pError) { + *pError = Error; + } + FF_FREE(pFile); + return (FF_FILE *) NULL; + } Object.CurrentItem += 1; } } @@ -318,7 +359,11 @@ FF_FILE *FF_Open(FF_IOMAN *pIoman, const FF_T_INT8 *path, FF_T_UINT8 Mode, FF_ER * @param pIoman FF_IOMAN object returned from the FF_CreateIOMAN() function. * **/ +#ifdef FF_UNICODE_SUPPORT +FF_T_BOOL FF_isDirEmpty(FF_IOMAN *pIoman, const FF_T_WCHAR *Path) { +#else FF_T_BOOL FF_isDirEmpty(FF_IOMAN *pIoman, const FF_T_INT8 *Path) { +#endif FF_DIRENT MyDir; FF_ERROR RetVal = FF_ERR_NONE; @@ -340,11 +385,16 @@ FF_T_BOOL FF_isDirEmpty(FF_IOMAN *pIoman, const FF_T_INT8 *Path) { return FF_TRUE; } +#ifdef FF_UNICODE_SUPPORT +FF_ERROR FF_RmDir(FF_IOMAN *pIoman, const FF_T_WCHAR *path) { +#else FF_ERROR FF_RmDir(FF_IOMAN *pIoman, const FF_T_INT8 *path) { - FF_FILE *pFile; - FF_ERROR Error = FF_ERR_NONE; - FF_T_UINT8 EntryBuffer[32]; - FF_T_SINT8 RetVal = FF_ERR_NONE; +#endif + FF_FILE *pFile; + FF_ERROR Error = FF_ERR_NONE; + FF_T_UINT8 EntryBuffer[32]; + FF_FETCH_CONTEXT FetchContext; + FF_T_SINT8 RetVal = FF_ERR_NONE; #ifdef FF_PATH_CACHE FF_T_UINT32 i; #endif @@ -366,20 +416,57 @@ FF_ERROR FF_RmDir(FF_IOMAN *pIoman, const FF_T_INT8 *path) { if(FF_isDirEmpty(pIoman, path)) { FF_lockFAT(pIoman); { - FF_UnlinkClusterChain(pIoman, pFile->ObjectCluster, 0); // 0 to delete the entire chain! + Error = FF_UnlinkClusterChain(pIoman, pFile->ObjectCluster, 0); // 0 to delete the entire chain! } FF_unlockFAT(pIoman); + + if(Error) { + FF_unlockDIR(pIoman); + FF_Close(pFile); + return Error; + } + + // Initialise the dirent Fetch Context object for faster removal of dirents. + + Error = FF_InitEntryFetch(pIoman, pFile->DirCluster, &FetchContext); + if(Error) { + FF_unlockDIR(pIoman); + FF_Close(pFile); + return Error; + } // Edit the Directory Entry! (So it appears as deleted); - FF_RmLFNs(pIoman, pFile->DirCluster, pFile->DirEntry); - FF_FetchEntry(pIoman, pFile->DirCluster, pFile->DirEntry, EntryBuffer); + Error = FF_RmLFNs(pIoman, pFile->DirEntry, &FetchContext); + if(Error) { + FF_CleanupEntryFetch(pIoman, &FetchContext); + FF_unlockDIR(pIoman); + FF_Close(pFile); + return Error; + } + Error = FF_FetchEntryWithContext(pIoman, pFile->DirEntry, &FetchContext, EntryBuffer); + if(Error) { + FF_CleanupEntryFetch(pIoman, &FetchContext); + FF_unlockDIR(pIoman); + FF_Close(pFile); + return Error; + } EntryBuffer[0] = 0xE5; - FF_PushEntry(pIoman, pFile->DirCluster, pFile->DirEntry, EntryBuffer); + Error = FF_PushEntryWithContext(pIoman, pFile->DirEntry, &FetchContext, EntryBuffer); + if(Error) { + FF_CleanupEntryFetch(pIoman, &FetchContext); + FF_unlockDIR(pIoman); + FF_Close(pFile); + return Error; + } #ifdef FF_PATH_CACHE FF_PendSemaphore(pIoman->pSemaphore); // Thread safety on shared object! { for(i = 0; i < FF_PATH_CACHE_DEPTH; i++) { +#ifdef FF_UNICODE_SUPPORT + if(FF_strmatch(pIoman->pPartition->PathCache[i].Path, path, (FF_T_UINT16)wcslen(path))) { +#else if(FF_strmatch(pIoman->pPartition->PathCache[i].Path, path, (FF_T_UINT16)strlen(path))) { +#endif pIoman->pPartition->PathCache[i].Path[0] = '\0'; pIoman->pPartition->PathCache[i].DirCluster = 0; FF_ReleaseSemaphore(pIoman->pSemaphore); @@ -389,24 +476,46 @@ FF_ERROR FF_RmDir(FF_IOMAN *pIoman, const FF_T_INT8 *path) { FF_ReleaseSemaphore(pIoman->pSemaphore); #endif - FF_IncreaseFreeClusters(pIoman, pFile->iChainLength); + Error = FF_IncreaseFreeClusters(pIoman, pFile->iChainLength); + if(Error) { + FF_CleanupEntryFetch(pIoman, &FetchContext); + FF_unlockDIR(pIoman); + FF_Close(pFile); + return Error; + } - FF_FlushCache(pIoman); + FF_CleanupEntryFetch(pIoman, &FetchContext); + + Error = FF_FlushCache(pIoman); + if(Error) { + FF_unlockDIR(pIoman); + FF_Close(pFile); + return Error; + } } else { RetVal = FF_ERR_DIR_NOT_EMPTY; } } FF_unlockDIR(pIoman); - - FF_Close(pFile); // Free the file pointer resources + Error = FF_Close(pFile); // Free the file pointer resources + + if(Error) { + return Error; + } + // File is now lost! return RetVal; } +#ifdef FF_UNICODE_SUPPORT +FF_ERROR FF_RmFile(FF_IOMAN *pIoman, const FF_T_WCHAR *path) { +#else FF_ERROR FF_RmFile(FF_IOMAN *pIoman, const FF_T_INT8 *path) { +#endif FF_FILE *pFile; - FF_ERROR Error = 0; + FF_ERROR Error = FF_ERR_NONE; FF_T_UINT8 EntryBuffer[32]; + FF_FETCH_CONTEXT FetchContext; pFile = FF_Open(pIoman, path, FF_MODE_READ, &Error); @@ -416,26 +525,64 @@ FF_ERROR FF_RmFile(FF_IOMAN *pIoman, const FF_T_INT8 *path) { pFile->FileDeleted = FF_TRUE; - FF_lockFAT(pIoman); // Lock the FAT so its thread-safe. - { - FF_UnlinkClusterChain(pIoman, pFile->ObjectCluster, 0); // 0 to delete the entire chain! + if(pFile->ObjectCluster) { // Ensure there is actually a cluster chain to delete! + FF_lockFAT(pIoman); // Lock the FAT so its thread-safe. + { + Error = FF_UnlinkClusterChain(pIoman, pFile->ObjectCluster, 0); // 0 to delete the entire chain! + } + FF_unlockFAT(pIoman); + + if(Error) { + FF_Close(pFile); + return Error; + } } - FF_unlockFAT(pIoman); // Edit the Directory Entry! (So it appears as deleted); FF_lockDIR(pIoman); { - FF_RmLFNs(pIoman, pFile->DirCluster, pFile->DirEntry); - FF_FetchEntry(pIoman, pFile->DirCluster, pFile->DirEntry, EntryBuffer); + Error = FF_InitEntryFetch(pIoman, pFile->DirCluster, &FetchContext); + if(Error) { + FF_unlockDIR(pIoman); + FF_Close(pFile); + return Error; + } + Error = FF_RmLFNs(pIoman, pFile->DirEntry, &FetchContext); + if(Error) { + FF_CleanupEntryFetch(pIoman, &FetchContext); + FF_unlockDIR(pIoman); + FF_Close(pFile); + return Error; + } + Error = FF_FetchEntryWithContext(pIoman, pFile->DirEntry, &FetchContext, EntryBuffer); + if(Error) { + FF_CleanupEntryFetch(pIoman, &FetchContext); + FF_unlockDIR(pIoman); + FF_Close(pFile); + return Error; + } EntryBuffer[0] = 0xE5; - FF_PushEntry(pIoman, pFile->DirCluster, pFile->DirEntry, EntryBuffer); + + Error = FF_PushEntryWithContext(pIoman, pFile->DirEntry, &FetchContext, EntryBuffer); + if(Error) { + FF_CleanupEntryFetch(pIoman, &FetchContext); + FF_unlockDIR(pIoman); + FF_Close(pFile); + return Error; + } + + FF_CleanupEntryFetch(pIoman, &FetchContext); } FF_unlockDIR(pIoman); - FF_FlushCache(pIoman); + Error = FF_FlushCache(pIoman); + if(Error) { + FF_Close(pFile); + return Error; + } - FF_Close(pFile); // Free the file pointer resources - return 0; + Error = FF_Close(pFile); // Free the file pointer resources + return Error; } /** @@ -453,13 +600,18 @@ FF_ERROR FF_RmFile(FF_IOMAN *pIoman, const FF_T_INT8 *path) { * @return FF_ERR_FILE_SOURCE_NOT_FOUND if the source file was not found. * **/ +#ifdef FF_UNICODE_SUPPORT +FF_ERROR FF_Move(FF_IOMAN *pIoman, const FF_T_WCHAR *szSourceFile, const FF_T_WCHAR *szDestinationFile) { +#else FF_ERROR FF_Move(FF_IOMAN *pIoman, const FF_T_INT8 *szSourceFile, const FF_T_INT8 *szDestinationFile) { +#endif FF_ERROR Error; FF_FILE *pSrcFile, *pDestFile; FF_DIRENT MyFile; FF_T_UINT8 EntryBuffer[32]; FF_T_UINT16 i; FF_T_UINT32 DirCluster; + FF_FETCH_CONTEXT FetchContext; if(!pIoman) { return FF_ERR_NULL_POINTER; @@ -480,16 +632,34 @@ FF_ERROR FF_Move(FF_IOMAN *pIoman, const FF_T_INT8 *szSourceFile, const FF_T_INT pSrcFile = FF_Open(pIoman, szSourceFile, FF_MODE_DIR, &Error); } - if(pSrcFile) { + if(!pSrcFile) { + return Error; + } + if(pSrcFile) { // Create the new dirent. - FF_FetchEntry(pIoman, pSrcFile->DirCluster, pSrcFile->DirEntry, EntryBuffer); + Error = FF_InitEntryFetch(pIoman, pSrcFile->DirCluster, &FetchContext); + if(Error) { + FF_Close(pSrcFile); + return Error; + } + Error = FF_FetchEntryWithContext(pIoman, pSrcFile->DirEntry, &FetchContext, EntryBuffer); + if(Error) { + FF_Close(pSrcFile); + FF_CleanupEntryFetch(pIoman, &FetchContext); + return Error; + } + //FF_FetchEntry(pIoman, pSrcFile->DirCluster, pSrcFile->DirEntry, EntryBuffer); MyFile.Attrib = FF_getChar(EntryBuffer, (FF_T_UINT16)(FF_FAT_DIRENT_ATTRIB)); MyFile.Filesize = pSrcFile->Filesize; MyFile.ObjectCluster = pSrcFile->ObjectCluster; MyFile.CurrentItem = 0; +#ifdef FF_UNICODE_SUPPORT + i = (FF_T_UINT16) wcslen(szDestinationFile); +#else i = (FF_T_UINT16) strlen(szDestinationFile); +#endif while(i != 0) { if(szDestinationFile[i] == '\\' || szDestinationFile[i] == '/') { @@ -498,30 +668,62 @@ FF_ERROR FF_Move(FF_IOMAN *pIoman, const FF_T_INT8 *szSourceFile, const FF_T_INT i--; } +#ifdef FF_UNICODE_SUPPORT + wcsncpy(MyFile.FileName, (szDestinationFile + i + 1), FF_MAX_FILENAME); +#else strncpy(MyFile.FileName, (szDestinationFile + i + 1), FF_MAX_FILENAME); +#endif if(i == 0) { i = 1; } - DirCluster = FF_FindDir(pIoman, szDestinationFile, i); + DirCluster = FF_FindDir(pIoman, szDestinationFile, i, &Error); + if(Error) { + FF_Close(pSrcFile); + FF_CleanupEntryFetch(pIoman, &FetchContext); + return Error; + } if(DirCluster) { // Destination Dir was found, we can now create the new entry. - if(FF_CreateDirent(pIoman, DirCluster, &MyFile)) { + Error = FF_CreateDirent(pIoman, DirCluster, &MyFile); + if(Error) { FF_Close(pSrcFile); - return FF_ERR_FILE_COULD_NOT_CREATE_DIRENT; // FAILED + FF_CleanupEntryFetch(pIoman, &FetchContext); + return Error; // FAILED } // Edit the Directory Entry! (So it appears as deleted); FF_lockDIR(pIoman); { - FF_RmLFNs(pIoman, pSrcFile->DirCluster, pSrcFile->DirEntry); - FF_FetchEntry(pIoman, pSrcFile->DirCluster, pSrcFile->DirEntry, EntryBuffer); + + Error = FF_RmLFNs(pIoman, pSrcFile->DirEntry, &FetchContext); + if(Error) { + FF_unlockDIR(pIoman); + FF_Close(pSrcFile); + FF_CleanupEntryFetch(pIoman, &FetchContext); + return Error; + } + Error = FF_FetchEntryWithContext(pIoman, pSrcFile->DirEntry, &FetchContext, EntryBuffer); + if(Error) { + FF_unlockDIR(pIoman); + FF_Close(pSrcFile); + FF_CleanupEntryFetch(pIoman, &FetchContext); + return Error; + } EntryBuffer[0] = 0xE5; - FF_PushEntry(pIoman, pSrcFile->DirCluster, pSrcFile->DirEntry, EntryBuffer); + //FF_PushEntry(pIoman, pSrcFile->DirCluster, pSrcFile->DirEntry, EntryBuffer); + Error = FF_PushEntryWithContext(pIoman, pSrcFile->DirEntry, &FetchContext, EntryBuffer); + if(Error) { + FF_unlockDIR(pIoman); + FF_Close(pSrcFile); + FF_CleanupEntryFetch(pIoman, &FetchContext); + return Error; + } + FF_CleanupEntryFetch(pIoman, &FetchContext); } FF_unlockDIR(pIoman); FF_Close(pSrcFile); @@ -560,14 +762,19 @@ FF_T_BOOL FF_isEOF(FF_FILE *pFile) { } } -static FF_T_UINT32 FF_GetSequentialClusters(FF_IOMAN *pIoman, FF_T_UINT32 StartCluster, FF_T_UINT32 Limit) { +static FF_T_UINT32 FF_GetSequentialClusters(FF_IOMAN *pIoman, FF_T_UINT32 StartCluster, FF_T_UINT32 Limit, FF_ERROR *pError) { FF_T_UINT32 CurrentCluster; FF_T_UINT32 NextCluster = StartCluster; FF_T_UINT32 i = 0; + *pError = FF_ERR_NONE; + do { CurrentCluster = NextCluster; - NextCluster = FF_getFatEntry(pIoman, CurrentCluster); + NextCluster = FF_getFatEntry(pIoman, CurrentCluster, pError); + if(*pError) { + return 0; + } if(NextCluster == (CurrentCluster + 1)) { i++; } else { @@ -584,48 +791,40 @@ static FF_T_UINT32 FF_GetSequentialClusters(FF_IOMAN *pIoman, FF_T_UINT32 StartC return i; } -static FF_T_SINT32 FF_ReadClusters(FF_FILE *pFile, FF_T_UINT32 Count, FF_T_UINT8 *buffer) { - FF_T_UINT32 Sectors; +static FF_ERROR FF_ReadClusters(FF_FILE *pFile, FF_T_UINT32 Count, FF_T_UINT8 *buffer) { + FF_T_UINT32 ulSectors; FF_T_UINT32 SequentialClusters = 0; FF_T_UINT32 nItemLBA; - FF_T_SINT32 RetVal; + FF_T_SINT32 slRetVal; + FF_ERROR Error; while(Count != 0) { if((Count - 1) > 0) { - SequentialClusters = FF_GetSequentialClusters(pFile->pIoman, pFile->AddrCurrentCluster, (Count - 1)); + SequentialClusters = FF_GetSequentialClusters(pFile->pIoman, pFile->AddrCurrentCluster, (Count - 1), &Error); + if(Error) { + return Error; + } } - Sectors = (SequentialClusters + 1) * pFile->pIoman->pPartition->SectorsPerCluster; + ulSectors = (SequentialClusters + 1) * pFile->pIoman->pPartition->SectorsPerCluster; nItemLBA = FF_Cluster2LBA(pFile->pIoman, pFile->AddrCurrentCluster); nItemLBA = FF_getRealLBA(pFile->pIoman, nItemLBA); - do { - if(pFile->pIoman->pBlkDevice->fnReadBlocks) { -#ifdef FF_BLKDEV_USES_SEM - FF_PendSemaphore(pFile->pIoman->pSemaphore); -#endif - // Called from FF_Read, sem not claimed - RetVal = pFile->pIoman->pBlkDevice->fnReadBlocks(buffer, nItemLBA, Sectors, pFile->pIoman->pBlkDevice->pParam); -#ifdef FF_BLKDEV_USES_SEM - FF_ReleaseSemaphore(pFile->pIoman->pSemaphore); -#endif - if(RetVal == FF_ERR_DRIVER_BUSY) { - FF_Yield(); - FF_Sleep(FF_DRIVER_BUSY_SLEEP); - } - } else { - RetVal = FF_ERR_DEVICE_DRIVER_FAILED; - } - - }while(RetVal == FF_ERR_DRIVER_BUSY); + slRetVal = FF_BlockRead(pFile->pIoman, nItemLBA, ulSectors, buffer); + if(slRetVal < 0) { + return slRetVal; + } Count -= (SequentialClusters + 1); - pFile->AddrCurrentCluster = FF_TraverseFAT(pFile->pIoman, pFile->AddrCurrentCluster, (SequentialClusters + 1)); + pFile->AddrCurrentCluster = FF_TraverseFAT(pFile->pIoman, pFile->AddrCurrentCluster, (SequentialClusters + 1), &Error); + if(Error) { + return Error; + } pFile->CurrentCluster += (SequentialClusters + 1); - buffer += Sectors * pFile->pIoman->BlkSize; + buffer += ulSectors * pFile->pIoman->BlkSize; SequentialClusters = 0; } - return 0; + return FF_ERR_NONE; } @@ -637,6 +836,7 @@ static FF_ERROR FF_ExtendFile(FF_FILE *pFile, FF_T_UINT32 Size) { FF_T_UINT32 CurrentCluster, NextCluster; FF_T_UINT32 i; FF_DIRENT OriginalEntry; + FF_ERROR Error; if((pFile->Mode & FF_MODE_WRITE) != FF_MODE_WRITE) { return FF_ERR_FILE_NOT_OPENED_IN_WRITE_MODE; @@ -644,13 +844,25 @@ static FF_ERROR FF_ExtendFile(FF_FILE *pFile, FF_T_UINT32 Size) { if(pFile->Filesize == 0 && pFile->ObjectCluster == 0) { // No Allocated clusters. // Create a Cluster chain! - pFile->AddrCurrentCluster = FF_CreateClusterChain(pFile->pIoman); - if(!FF_GetEntry(pIoman, pFile->DirEntry, pFile->DirCluster, &OriginalEntry)) { - OriginalEntry.ObjectCluster = pFile->AddrCurrentCluster; - FF_PutEntry(pIoman, pFile->DirEntry, pFile->DirCluster, &OriginalEntry); - } else { - return FF_ERR_FILE_EXTEND_FAILED; + pFile->AddrCurrentCluster = FF_CreateClusterChain(pFile->pIoman, &Error); + + if(Error) { + return Error; } + + Error = FF_GetEntry(pIoman, pFile->DirEntry, pFile->DirCluster, &OriginalEntry); + + if(!Error) { + OriginalEntry.ObjectCluster = pFile->AddrCurrentCluster; + Error = FF_PutEntry(pIoman, pFile->DirEntry, pFile->DirCluster, &OriginalEntry); + } else { + return Error; + } + + if(Error) { + return Error; + } + pFile->ObjectCluster = pFile->AddrCurrentCluster; pFile->iChainLength = 1; pFile->CurrentCluster = 0; @@ -662,7 +874,10 @@ static FF_ERROR FF_ExtendFile(FF_FILE *pFile, FF_T_UINT32 Size) { } if(pFile->iChainLength == 0) { // First extension requiring the chain length, - pFile->iChainLength = FF_GetChainLength(pIoman, pFile->ObjectCluster, &pFile->iEndOfChain); + pFile->iChainLength = FF_GetChainLength(pIoman, pFile->ObjectCluster, &pFile->iEndOfChain, &Error); + if(Error) { + return Error; + } } nClusterToExtend = (nTotalClustersNeeded - pFile->iChainLength); @@ -673,65 +888,88 @@ static FF_ERROR FF_ExtendFile(FF_FILE *pFile, FF_T_UINT32 Size) { FF_lockFAT(pIoman); { for(i = 0; i <= nClusterToExtend; i++) { - CurrentCluster = FF_FindEndOfChain(pIoman, NextCluster); - NextCluster = FF_FindFreeCluster(pIoman); + CurrentCluster = FF_FindEndOfChain(pIoman, NextCluster, &Error); + if(Error) { + FF_unlockFAT(pIoman); + FF_DecreaseFreeClusters(pIoman, i); + return Error; + } + NextCluster = FF_FindFreeCluster(pIoman, &Error); + if(Error) { + FF_unlockFAT(pIoman); + FF_DecreaseFreeClusters(pIoman, i); + return Error; + } if(!NextCluster) { FF_unlockFAT(pIoman); + FF_DecreaseFreeClusters(pIoman, i); return FF_ERR_FAT_NO_FREE_CLUSTERS; } - FF_putFatEntry(pIoman, CurrentCluster, NextCluster); - FF_putFatEntry(pIoman, NextCluster, 0xFFFFFFFF); + + Error = FF_putFatEntry(pIoman, CurrentCluster, NextCluster); + if(Error) { + FF_unlockFAT(pIoman); + FF_DecreaseFreeClusters(pIoman, i); + return Error; + } + Error = FF_putFatEntry(pIoman, NextCluster, 0xFFFFFFFF); + if(Error) { + FF_unlockFAT(pIoman); + FF_DecreaseFreeClusters(pIoman, i); + return Error; + } } - pFile->iEndOfChain = FF_FindEndOfChain(pIoman, NextCluster); + pFile->iEndOfChain = FF_FindEndOfChain(pIoman, NextCluster, &Error); + if(Error) { + FF_unlockFAT(pIoman); + FF_DecreaseFreeClusters(pIoman, i); + return Error; + } } FF_unlockFAT(pIoman); pFile->iChainLength += i; - FF_DecreaseFreeClusters(pIoman, i); // Keep Tab of Numbers for fast FreeSize() + Error = FF_DecreaseFreeClusters(pIoman, i); // Keep Tab of Numbers for fast FreeSize() + if(Error) { + return Error; + } } return FF_ERR_NONE; } -static FF_T_SINT32 FF_WriteClusters(FF_FILE *pFile, FF_T_UINT32 Count, FF_T_UINT8 *buffer) { - FF_T_UINT32 Sectors; +static FF_ERROR FF_WriteClusters(FF_FILE *pFile, FF_T_UINT32 Count, FF_T_UINT8 *buffer) { + FF_T_UINT32 ulSectors; FF_T_UINT32 SequentialClusters = 0; FF_T_UINT32 nItemLBA; - FF_T_SINT32 RetVal; + FF_T_SINT32 slRetVal; + FF_ERROR Error; while(Count != 0) { if((Count - 1) > 0) { - SequentialClusters = FF_GetSequentialClusters(pFile->pIoman, pFile->AddrCurrentCluster, (Count - 1)); + SequentialClusters = FF_GetSequentialClusters(pFile->pIoman, pFile->AddrCurrentCluster, (Count - 1), &Error); + if(Error) { + return Error; + } } - Sectors = (SequentialClusters + 1) * pFile->pIoman->pPartition->SectorsPerCluster; + ulSectors = (SequentialClusters + 1) * pFile->pIoman->pPartition->SectorsPerCluster; nItemLBA = FF_Cluster2LBA(pFile->pIoman, pFile->AddrCurrentCluster); nItemLBA = FF_getRealLBA(pFile->pIoman, nItemLBA); - do { - if(pFile->pIoman->pBlkDevice->fnWriteBlocks) { -#ifdef FF_BLKDEV_USES_SEM - FF_PendSemaphore(pFile->pIoman->pSemaphore); -#endif - // Called from FF_Write, sem not claimed - RetVal = pFile->pIoman->pBlkDevice->fnWriteBlocks(buffer, nItemLBA, Sectors, pFile->pIoman->pBlkDevice->pParam); -#ifdef FF_BLKDEV_USES_SEM - FF_ReleaseSemaphore(pFile->pIoman->pSemaphore); -#endif - if(RetVal == FF_ERR_DRIVER_BUSY) { - FF_Yield(); - FF_Sleep(FF_DRIVER_BUSY_SLEEP); - } - } else { - RetVal = FF_ERR_DEVICE_DRIVER_FAILED; - } - - }while(RetVal == FF_ERR_DRIVER_BUSY); + slRetVal = FF_BlockWrite(pFile->pIoman, nItemLBA, ulSectors, buffer); + + if(slRetVal < 0) { + return slRetVal; + } Count -= (SequentialClusters + 1); - pFile->AddrCurrentCluster = FF_TraverseFAT(pFile->pIoman, pFile->AddrCurrentCluster, (SequentialClusters + 1)); + pFile->AddrCurrentCluster = FF_TraverseFAT(pFile->pIoman, pFile->AddrCurrentCluster, (SequentialClusters + 1), &Error); + if(Error) { + return Error; + } pFile->CurrentCluster += (SequentialClusters + 1); - buffer += Sectors * pFile->pIoman->BlkSize; + buffer += ulSectors * pFile->pIoman->BlkSize; SequentialClusters = 0; } @@ -763,6 +1001,7 @@ FF_T_SINT32 FF_Read(FF_FILE *pFile, FF_T_UINT32 ElementSize, FF_T_UINT32 Count, FF_T_UINT32 nRelClusterPos; FF_T_UINT32 nBytesPerCluster; FF_T_UINT32 nClusterDiff; + FF_ERROR Error; if(!pFile) { return FF_ERR_NULL_POINTER; @@ -785,7 +1024,10 @@ FF_T_SINT32 FF_Read(FF_FILE *pFile, FF_T_UINT32 ElementSize, FF_T_UINT32 Count, nClusterDiff = FF_getClusterChainNumber(pFile->pIoman, pFile->FilePointer, 1) - pFile->CurrentCluster; if(nClusterDiff) { if(pFile->CurrentCluster < FF_getClusterChainNumber(pFile->pIoman, pFile->FilePointer, 1)) { - pFile->AddrCurrentCluster = FF_TraverseFAT(pIoman, pFile->AddrCurrentCluster, nClusterDiff); + pFile->AddrCurrentCluster = FF_TraverseFAT(pIoman, pFile->AddrCurrentCluster, nClusterDiff, &Error); + if(Error) { + return Error; + } pFile->CurrentCluster += nClusterDiff; } } @@ -798,6 +1040,9 @@ FF_T_SINT32 FF_Read(FF_FILE *pFile, FF_T_UINT32 ElementSize, FF_T_UINT32 Count, if((nRelBlockPos + nBytes) < pIoman->BlkSize) { // Bytes to read are within a block and less than a block size. pBuffer = FF_GetBuffer(pIoman, nItemLBA, FF_MODE_READ); { + if(!pBuffer) { + return FF_ERR_DEVICE_DRIVER_FAILED; + } memcpy(buffer, (pBuffer->pBuffer + nRelBlockPos), nBytes); } FF_ReleaseBuffer(pIoman, pBuffer); @@ -813,6 +1058,9 @@ FF_T_SINT32 FF_Read(FF_FILE *pFile, FF_T_UINT32 ElementSize, FF_T_UINT32 Count, nBytesToRead = pIoman->BlkSize - nRelBlockPos; pBuffer = FF_GetBuffer(pIoman, nItemLBA, FF_MODE_READ); { + if(!pBuffer) { + return FF_ERR_DEVICE_DRIVER_FAILED; + } // Here we copy to the sector boudary. memcpy(buffer, (pBuffer->pBuffer + nRelBlockPos), nBytesToRead); } @@ -834,7 +1082,10 @@ FF_T_SINT32 FF_Read(FF_FILE *pFile, FF_T_UINT32 ElementSize, FF_T_UINT32 Count, nClusterDiff = FF_getClusterChainNumber(pFile->pIoman, pFile->FilePointer, 1) - pFile->CurrentCluster; if(nClusterDiff) { if(pFile->CurrentCluster < FF_getClusterChainNumber(pFile->pIoman, pFile->FilePointer, 1)) { - pFile->AddrCurrentCluster = FF_TraverseFAT(pIoman, pFile->AddrCurrentCluster, nClusterDiff); + pFile->AddrCurrentCluster = FF_TraverseFAT(pIoman, pFile->AddrCurrentCluster, nClusterDiff, &Error); + if(Error) { + return Error; + } pFile->CurrentCluster += nClusterDiff; } } @@ -844,21 +1095,7 @@ FF_T_SINT32 FF_Read(FF_FILE *pFile, FF_T_UINT32 ElementSize, FF_T_UINT32 Count, sSectors = (FF_T_UINT16) (pIoman->pPartition->SectorsPerCluster - (nRelClusterPos / pIoman->BlkSize)); - do { - if(pIoman->pBlkDevice->fnReadBlocks) { -#ifdef FF_BLKDEV_USES_SEM - FF_PendSemaphore(pFile->pIoman->pSemaphore); -#endif - RetVal = pFile->pIoman->pBlkDevice->fnReadBlocks(buffer, nItemLBA, sSectors, pIoman->pBlkDevice->pParam); -#ifdef FF_BLKDEV_USES_SEM - FF_ReleaseSemaphore(pFile->pIoman->pSemaphore); -#endif - } - if(RetVal == FF_ERR_DRIVER_BUSY) { - FF_Yield(); - FF_Sleep(FF_DRIVER_BUSY_SLEEP); - } - }while(RetVal == FF_ERR_DRIVER_BUSY); + RetVal = FF_BlockRead(pIoman, nItemLBA, (FF_T_UINT32) sSectors, buffer); nBytesToRead = sSectors * pIoman->BlkSize; nBytes -= nBytesToRead; @@ -874,13 +1111,19 @@ FF_T_SINT32 FF_Read(FF_FILE *pFile, FF_T_UINT32 ElementSize, FF_T_UINT32 Count, nClusterDiff = FF_getClusterChainNumber(pFile->pIoman, pFile->FilePointer, 1) - pFile->CurrentCluster; if(nClusterDiff) { if(pFile->CurrentCluster < FF_getClusterChainNumber(pFile->pIoman, pFile->FilePointer, 1)) { - pFile->AddrCurrentCluster = FF_TraverseFAT(pIoman, pFile->AddrCurrentCluster, nClusterDiff); + pFile->AddrCurrentCluster = FF_TraverseFAT(pIoman, pFile->AddrCurrentCluster, nClusterDiff, &Error); + if(Error) { + return Error; + } pFile->CurrentCluster += nClusterDiff; } } //----- End of Contributor fix. - FF_ReadClusters(pFile, (nBytes / nBytesPerCluster), buffer); + RetVal = FF_ReadClusters(pFile, (nBytes / nBytesPerCluster), buffer); + if(RetVal < 0) { + return RetVal; + } nBytesToRead = (nBytesPerCluster * (nBytes / nBytesPerCluster)); pFile->FilePointer += nBytesToRead; @@ -897,29 +1140,22 @@ FF_T_SINT32 FF_Read(FF_FILE *pFile, FF_T_UINT32 ElementSize, FF_T_UINT32 Count, nClusterDiff = FF_getClusterChainNumber(pFile->pIoman, pFile->FilePointer, 1) - pFile->CurrentCluster; if(nClusterDiff) { if(pFile->CurrentCluster < FF_getClusterChainNumber(pFile->pIoman, pFile->FilePointer, 1)) { - pFile->AddrCurrentCluster = FF_TraverseFAT(pIoman, pFile->AddrCurrentCluster, nClusterDiff); + pFile->AddrCurrentCluster = FF_TraverseFAT(pIoman, pFile->AddrCurrentCluster, nClusterDiff, &Error); + if(Error) { + return Error; + } pFile->CurrentCluster += nClusterDiff; } } nItemLBA = FF_Cluster2LBA(pIoman, pFile->AddrCurrentCluster); nItemLBA = FF_getRealLBA(pIoman, nItemLBA + FF_getMajorBlockNumber(pIoman, pFile->FilePointer, 1)) + FF_getMinorBlockNumber(pIoman, pFile->FilePointer, 1); - - do { - if(pIoman->pBlkDevice->fnReadBlocks) { -#ifdef FF_BLKDEV_USES_SEM - FF_PendSemaphore(pFile->pIoman->pSemaphore); -#endif - RetVal = pFile->pIoman->pBlkDevice->fnReadBlocks(buffer, nItemLBA, sSectors, pIoman->pBlkDevice->pParam); -#ifdef FF_BLKDEV_USES_SEM - FF_ReleaseSemaphore(pFile->pIoman->pSemaphore); -#endif - } - if(RetVal == FF_ERR_DRIVER_BUSY) { - FF_Yield(); - FF_Sleep(FF_DRIVER_BUSY_SLEEP); - } - }while(RetVal == FF_ERR_DRIVER_BUSY); + + RetVal = FF_BlockRead(pIoman, nItemLBA, (FF_T_UINT32) sSectors, buffer); + + if(RetVal < 0) { + return RetVal; + } nBytesToRead = sSectors * pIoman->BlkSize; pFile->FilePointer += nBytesToRead; @@ -934,7 +1170,10 @@ FF_T_SINT32 FF_Read(FF_FILE *pFile, FF_T_UINT32 ElementSize, FF_T_UINT32 Count, nClusterDiff = FF_getClusterChainNumber(pFile->pIoman, pFile->FilePointer, 1) - pFile->CurrentCluster; if(nClusterDiff) { if(pFile->CurrentCluster < FF_getClusterChainNumber(pFile->pIoman, pFile->FilePointer, 1)) { - pFile->AddrCurrentCluster = FF_TraverseFAT(pIoman, pFile->AddrCurrentCluster, nClusterDiff); + pFile->AddrCurrentCluster = FF_TraverseFAT(pIoman, pFile->AddrCurrentCluster, nClusterDiff, &Error); + if(Error) { + return Error; + } pFile->CurrentCluster += nClusterDiff; } } @@ -943,6 +1182,9 @@ FF_T_SINT32 FF_Read(FF_FILE *pFile, FF_T_UINT32 ElementSize, FF_T_UINT32 Count, nItemLBA = FF_getRealLBA(pIoman, nItemLBA + FF_getMajorBlockNumber(pIoman, pFile->FilePointer, 1)) + FF_getMinorBlockNumber(pIoman, pFile->FilePointer, 1); pBuffer = FF_GetBuffer(pIoman, nItemLBA, FF_MODE_READ); { + if(!pBuffer) { + return FF_ERR_DEVICE_DRIVER_FAILED; + } memcpy(buffer, pBuffer->pBuffer, nBytes); } FF_ReleaseBuffer(pIoman, pBuffer); @@ -980,6 +1222,7 @@ FF_T_SINT32 FF_GetC(FF_FILE *pFile) { FF_T_UINT32 relMinorBlockPos; FF_T_UINT32 clusterNum; FF_T_UINT32 nClusterDiff; + FF_ERROR Error; if(!pFile) { @@ -1000,7 +1243,10 @@ FF_T_SINT32 FF_GetC(FF_FILE *pFile) { nClusterDiff = FF_getClusterChainNumber(pFile->pIoman, pFile->FilePointer, 1) - pFile->CurrentCluster; if(nClusterDiff) { if(pFile->CurrentCluster < FF_getClusterChainNumber(pFile->pIoman, pFile->FilePointer, 1)) { - pFile->AddrCurrentCluster = FF_TraverseFAT(pFile->pIoman, pFile->AddrCurrentCluster, nClusterDiff); + pFile->AddrCurrentCluster = FF_TraverseFAT(pFile->pIoman, pFile->AddrCurrentCluster, nClusterDiff, &Error); + if(Error) { + return Error; + } pFile->CurrentCluster += nClusterDiff; } } @@ -1012,7 +1258,7 @@ FF_T_SINT32 FF_GetC(FF_FILE *pFile) { pBuffer = FF_GetBuffer(pFile->pIoman, fileLBA, FF_MODE_READ); { if(!pBuffer) { - return -3; + return FF_ERR_DEVICE_DRIVER_FAILED; } retChar = pBuffer->pBuffer[relMinorBlockPos]; } @@ -1023,6 +1269,45 @@ FF_T_SINT32 FF_GetC(FF_FILE *pFile) { return (FF_T_INT32) retChar; } + +/** + * @public + * @brief Gets a Line from a Text File, but no more than ulLimit charachters. The line will be NULL terminated. + * + * The behaviour of this function is undefined when called on a binary file. + * It should just read in ulLimit bytes of binary, and ZERO terminate the line. + * + * This function works for both UNIX line feeds, and Windows CRLF type files. + * + * @param pFile The FF_FILE object pointer. + * @param szLine The charachter buffer where the line should be stored. + * @param ulLimit This should be the max number of charachters that szLine can hold. + * + * @return The number of charachters read from the line, on success. + * @return 0 when no more lines are available, or when ulLimit is 0. + * @return FF_ERR_NULL_POINTER if pFile or szLine are NULL; + * + **/ +FF_T_SINT32 FF_GetLine(FF_FILE *pFile, FF_T_INT8 *szLine, FF_T_UINT32 ulLimit) { + FF_T_SINT32 c; + FF_T_UINT32 i; + + if(!pFile || !szLine) { + return FF_ERR_NULL_POINTER; + } + + for(i = 0; i < (ulLimit - 1) && (c=FF_GetC(pFile)) >= 0 && c != '\n'; ++i) { + if(c == '\r') { + i--; + } else { + szLine[i] = (FF_T_INT8) c; + } + } + + szLine[i] = '\0'; + return i; +} + FF_T_UINT32 FF_Tell(FF_FILE *pFile) { return pFile->FilePointer; } @@ -1047,7 +1332,7 @@ FF_T_SINT32 FF_Write(FF_FILE *pFile, FF_T_UINT32 ElementSize, FF_T_UINT32 Count, FF_BUFFER *pBuffer; FF_T_UINT32 nRelBlockPos; FF_T_UINT32 nItemLBA; - FF_T_SINT32 RetVal = 0; + FF_T_SINT32 slRetVal = 0; FF_T_UINT16 sSectors; FF_T_UINT32 nRelClusterPos; FF_T_UINT32 nBytesPerCluster, nClusterDiff, nClusters; @@ -1085,7 +1370,10 @@ FF_T_SINT32 FF_Write(FF_FILE *pFile, FF_T_UINT32 ElementSize, FF_T_UINT32 Count, nClusterDiff = FF_getClusterChainNumber(pFile->pIoman, pFile->FilePointer, 1) - pFile->CurrentCluster; if(nClusterDiff) { if(pFile->CurrentCluster != FF_getClusterChainNumber(pFile->pIoman, pFile->FilePointer, 1)) { - pFile->AddrCurrentCluster = FF_TraverseFAT(pIoman, pFile->AddrCurrentCluster, nClusterDiff); + pFile->AddrCurrentCluster = FF_TraverseFAT(pIoman, pFile->AddrCurrentCluster, nClusterDiff, &Error); + if(Error) { + return Error; + } pFile->CurrentCluster += nClusterDiff; } } @@ -1096,6 +1384,9 @@ FF_T_SINT32 FF_Write(FF_FILE *pFile, FF_T_UINT32 ElementSize, FF_T_UINT32 Count, if((nRelBlockPos + nBytes) < pIoman->BlkSize) { // Bytes to read are within a block and less than a block size. pBuffer = FF_GetBuffer(pIoman, nItemLBA, FF_MODE_WRITE); { + if(!pBuffer) { + return FF_ERR_DEVICE_DRIVER_FAILED; + } memcpy((pBuffer->pBuffer + nRelBlockPos), buffer, nBytes); } FF_ReleaseBuffer(pIoman, pBuffer); @@ -1111,6 +1402,9 @@ FF_T_SINT32 FF_Write(FF_FILE *pFile, FF_T_UINT32 ElementSize, FF_T_UINT32 Count, nBytesToWrite = pIoman->BlkSize - nRelBlockPos; pBuffer = FF_GetBuffer(pIoman, nItemLBA, FF_MODE_WRITE); { + if(!pBuffer) { + return FF_ERR_DEVICE_DRIVER_FAILED; + } // Here we copy to the sector boudary. memcpy((pBuffer->pBuffer + nRelBlockPos), buffer, nBytesToWrite); } @@ -1130,7 +1424,10 @@ FF_T_SINT32 FF_Write(FF_FILE *pFile, FF_T_UINT32 ElementSize, FF_T_UINT32 Count, nClusterDiff = FF_getClusterChainNumber(pFile->pIoman, pFile->FilePointer, 1) - pFile->CurrentCluster; if(nClusterDiff) { if(pFile->CurrentCluster < FF_getClusterChainNumber(pFile->pIoman, pFile->FilePointer, 1)) { - pFile->AddrCurrentCluster = FF_TraverseFAT(pIoman, pFile->AddrCurrentCluster, nClusterDiff); + pFile->AddrCurrentCluster = FF_TraverseFAT(pIoman, pFile->AddrCurrentCluster, nClusterDiff, &Error); + if(Error) { + return Error; + } pFile->CurrentCluster += nClusterDiff; } } @@ -1139,22 +1436,11 @@ FF_T_SINT32 FF_Write(FF_FILE *pFile, FF_T_UINT32 ElementSize, FF_T_UINT32 Count, nItemLBA = FF_getRealLBA(pIoman, nItemLBA + FF_getMajorBlockNumber(pIoman, pFile->FilePointer, 1)) + FF_getMinorBlockNumber(pIoman, pFile->FilePointer, 1); sSectors = (FF_T_UINT16) (pIoman->pPartition->SectorsPerCluster - (nRelClusterPos / pIoman->BlkSize)); - - do { - if(pIoman->pBlkDevice->fnWriteBlocks) { -#ifdef FF_BLKDEV_USES_SEM - FF_PendSemaphore(pFile->pIoman->pSemaphore); -#endif - RetVal = pFile->pIoman->pBlkDevice->fnWriteBlocks(buffer, nItemLBA, sSectors, pIoman->pBlkDevice->pParam); -#ifdef FF_BLKDEV_USES_SEM - FF_ReleaseSemaphore(pFile->pIoman->pSemaphore); -#endif - } - if(RetVal == FF_ERR_DRIVER_BUSY) { - FF_Yield(); - FF_Sleep(FF_DRIVER_BUSY_SLEEP); - } - }while(RetVal == FF_ERR_DRIVER_BUSY); + + slRetVal = FF_BlockWrite(pFile->pIoman, nItemLBA, sSectors, buffer); + if(slRetVal < 0) { + return slRetVal; + } nBytesToWrite = sSectors * pIoman->BlkSize; nBytes -= nBytesToWrite; @@ -1170,7 +1456,10 @@ FF_T_SINT32 FF_Write(FF_FILE *pFile, FF_T_UINT32 ElementSize, FF_T_UINT32 Count, nClusterDiff = FF_getClusterChainNumber(pFile->pIoman, pFile->FilePointer, 1) - pFile->CurrentCluster; if(nClusterDiff) { if(pFile->CurrentCluster < FF_getClusterChainNumber(pFile->pIoman, pFile->FilePointer, 1)) { - pFile->AddrCurrentCluster = FF_TraverseFAT(pIoman, pFile->AddrCurrentCluster, nClusterDiff); + pFile->AddrCurrentCluster = FF_TraverseFAT(pIoman, pFile->AddrCurrentCluster, nClusterDiff, &Error); + if(Error) { + return Error; + } pFile->CurrentCluster += nClusterDiff; } } @@ -1178,7 +1467,10 @@ FF_T_SINT32 FF_Write(FF_FILE *pFile, FF_T_UINT32 ElementSize, FF_T_UINT32 Count, nClusters = (nBytes / nBytesPerCluster); - FF_WriteClusters(pFile, nClusters, buffer); + slRetVal = FF_WriteClusters(pFile, nClusters, buffer); + if(slRetVal < 0) { + return slRetVal; + } nBytesToWrite = (nBytesPerCluster * nClusters); @@ -1196,7 +1488,10 @@ FF_T_SINT32 FF_Write(FF_FILE *pFile, FF_T_UINT32 ElementSize, FF_T_UINT32 Count, nClusterDiff = FF_getClusterChainNumber(pFile->pIoman, pFile->FilePointer, 1) - pFile->CurrentCluster; if(nClusterDiff) { if(pFile->CurrentCluster < FF_getClusterChainNumber(pFile->pIoman, pFile->FilePointer, 1)) { - pFile->AddrCurrentCluster = FF_TraverseFAT(pIoman, pFile->AddrCurrentCluster, nClusterDiff); + pFile->AddrCurrentCluster = FF_TraverseFAT(pIoman, pFile->AddrCurrentCluster, nClusterDiff, &Error); + if(Error) { + return Error; + } pFile->CurrentCluster += nClusterDiff; } } @@ -1204,28 +1499,16 @@ FF_T_SINT32 FF_Write(FF_FILE *pFile, FF_T_UINT32 ElementSize, FF_T_UINT32 Count, nItemLBA = FF_Cluster2LBA(pIoman, pFile->AddrCurrentCluster); nItemLBA = FF_getRealLBA(pIoman, nItemLBA + FF_getMajorBlockNumber(pIoman, pFile->FilePointer, 1)) + FF_getMinorBlockNumber(pIoman, pFile->FilePointer, 1); - do { - if(pIoman->pBlkDevice->fnWriteBlocks) { -#ifdef FF_BLKDEV_USES_SEM - FF_PendSemaphore(pFile->pIoman->pSemaphore); -#endif - RetVal = pFile->pIoman->pBlkDevice->fnWriteBlocks(buffer, nItemLBA, sSectors, pIoman->pBlkDevice->pParam); -#ifdef FF_BLKDEV_USES_SEM - FF_ReleaseSemaphore(pFile->pIoman->pSemaphore); -#endif - } - if(RetVal == FF_ERR_DRIVER_BUSY) { - FF_Yield(); - FF_Sleep(FF_DRIVER_BUSY_SLEEP); - } - }while(RetVal == FF_ERR_DRIVER_BUSY); + slRetVal = FF_BlockWrite(pFile->pIoman, nItemLBA, sSectors, buffer); + if(slRetVal < 0) { + return slRetVal; + } nBytesToWrite = sSectors * pIoman->BlkSize; pFile->FilePointer += nBytesToWrite; nBytes -= nBytesToWrite; buffer += nBytesToWrite; nBytesWritten += nBytesToWrite; - } //---------- Write (memcpy) Remaining Bytes @@ -1234,7 +1517,10 @@ FF_T_SINT32 FF_Write(FF_FILE *pFile, FF_T_UINT32 ElementSize, FF_T_UINT32 Count, nClusterDiff = FF_getClusterChainNumber(pFile->pIoman, pFile->FilePointer, 1) - pFile->CurrentCluster; if(nClusterDiff) { if(pFile->CurrentCluster < FF_getClusterChainNumber(pFile->pIoman, pFile->FilePointer, 1)) { - pFile->AddrCurrentCluster = FF_TraverseFAT(pIoman, pFile->AddrCurrentCluster, nClusterDiff); + pFile->AddrCurrentCluster = FF_TraverseFAT(pIoman, pFile->AddrCurrentCluster, nClusterDiff, &Error); + if(Error) { + return Error; + } pFile->CurrentCluster += nClusterDiff; } } @@ -1243,6 +1529,9 @@ FF_T_SINT32 FF_Write(FF_FILE *pFile, FF_T_UINT32 ElementSize, FF_T_UINT32 Count, nItemLBA = FF_getRealLBA(pIoman, nItemLBA + FF_getMajorBlockNumber(pIoman, pFile->FilePointer, 1)) + FF_getMinorBlockNumber(pIoman, pFile->FilePointer, 1); pBuffer = FF_GetBuffer(pIoman, nItemLBA, FF_MODE_WRITE); { + if(!pBuffer) { + return FF_ERR_DEVICE_DRIVER_FAILED; + } memcpy(pBuffer->pBuffer, buffer, nBytes); } FF_ReleaseBuffer(pIoman, pBuffer); @@ -1279,6 +1568,7 @@ FF_T_SINT32 FF_PutC(FF_FILE *pFile, FF_T_UINT8 pa_cValue) { FF_T_UINT32 iItemLBA; FF_T_UINT32 iRelPos; FF_T_UINT32 nClusterDiff; + FF_ERROR Error; if(!pFile) { // Ensure we don't have a Null file pointer on a Public interface. return FF_ERR_NULL_POINTER; @@ -1298,18 +1588,24 @@ FF_T_SINT32 FF_PutC(FF_FILE *pFile, FF_T_UINT8 pa_cValue) { iRelPos = FF_getMinorBlockEntry(pFile->pIoman, pFile->FilePointer, 1); // Handle File Space Allocation. - FF_ExtendFile(pFile, pFile->FilePointer + 1); + Error = FF_ExtendFile(pFile, pFile->FilePointer + 1); + if(Error) { + return Error; + } nClusterDiff = FF_getClusterChainNumber(pFile->pIoman, pFile->FilePointer, 1) - pFile->CurrentCluster; if(nClusterDiff) { if(pFile->CurrentCluster < FF_getClusterChainNumber(pFile->pIoman, pFile->FilePointer, 1)) { - pFile->AddrCurrentCluster = FF_TraverseFAT(pFile->pIoman, pFile->AddrCurrentCluster, nClusterDiff); + pFile->AddrCurrentCluster = FF_TraverseFAT(pFile->pIoman, pFile->AddrCurrentCluster, nClusterDiff, &Error); + if(Error) { + return Error; + } pFile->CurrentCluster += nClusterDiff; } } iItemLBA = FF_Cluster2LBA(pFile->pIoman, pFile->AddrCurrentCluster) + FF_getMajorBlockNumber(pFile->pIoman, pFile->FilePointer, (FF_T_UINT16) 1); - iItemLBA = FF_getRealLBA (pFile->pIoman, iItemLBA) + FF_getMinorBlockNumber(pFile->pIoman, pFile->FilePointer, (FF_T_UINT16) 1); + iItemLBA = FF_getRealLBA (pFile->pIoman, iItemLBA) + FF_getMinorBlockNumber(pFile->pIoman, pFile->FilePointer, (FF_T_UINT16) 1); pBuffer = FF_GetBuffer(pFile->pIoman, iItemLBA, FF_MODE_WRITE); { @@ -1339,22 +1635,32 @@ FF_T_SINT32 FF_PutC(FF_FILE *pFile, FF_T_UINT8 pa_cValue) { * * @return 0 on Sucess, * @return -2 if offset results in an invalid position in the file. - * @return -1 if a FF_FILE pointer was not recieved. + * @return FF_ERR_NULL_POINTER if a FF_FILE pointer was not recieved. * @return -3 if an invalid origin was provided. * **/ FF_ERROR FF_Seek(FF_FILE *pFile, FF_T_SINT32 Offset, FF_T_INT8 Origin) { + FF_ERROR Error; + if(!pFile) { return FF_ERR_NULL_POINTER; } + Error = FF_FlushCache(pFile->pIoman); + if(Error) { + return Error; + } + switch(Origin) { case FF_SEEK_SET: if((FF_T_UINT32) Offset <= pFile->Filesize && Offset >= 0) { pFile->FilePointer = Offset; pFile->CurrentCluster = FF_getClusterChainNumber(pFile->pIoman, pFile->FilePointer, 1); - pFile->AddrCurrentCluster = FF_TraverseFAT(pFile->pIoman, pFile->ObjectCluster, pFile->CurrentCluster); + pFile->AddrCurrentCluster = FF_TraverseFAT(pFile->pIoman, pFile->ObjectCluster, pFile->CurrentCluster, &Error); + if(Error) { + return Error; + } } else { return -2; } @@ -1364,7 +1670,10 @@ FF_ERROR FF_Seek(FF_FILE *pFile, FF_T_SINT32 Offset, FF_T_INT8 Origin) { if((Offset + pFile->FilePointer) <= pFile->Filesize && (Offset + (FF_T_SINT32) pFile->FilePointer) >= 0) { pFile->FilePointer = Offset + pFile->FilePointer; pFile->CurrentCluster = FF_getClusterChainNumber(pFile->pIoman, pFile->FilePointer, 1); - pFile->AddrCurrentCluster = FF_TraverseFAT(pFile->pIoman, pFile->ObjectCluster, pFile->CurrentCluster); + pFile->AddrCurrentCluster = FF_TraverseFAT(pFile->pIoman, pFile->ObjectCluster, pFile->CurrentCluster, &Error); + if(Error) { + return Error; + } } else { return -2; } @@ -1374,7 +1683,10 @@ FF_ERROR FF_Seek(FF_FILE *pFile, FF_T_SINT32 Offset, FF_T_INT8 Origin) { if((Offset + (FF_T_SINT32) pFile->Filesize) >= 0 && (Offset + pFile->Filesize) <= pFile->Filesize) { pFile->FilePointer = Offset + pFile->Filesize; pFile->CurrentCluster = FF_getClusterChainNumber(pFile->pIoman, pFile->FilePointer, 1); - pFile->AddrCurrentCluster = FF_TraverseFAT(pFile->pIoman, pFile->ObjectCluster, pFile->CurrentCluster); + pFile->AddrCurrentCluster = FF_TraverseFAT(pFile->pIoman, pFile->ObjectCluster, pFile->CurrentCluster, &Error); + if(Error) { + return Error; + } } else { return -2; } @@ -1419,14 +1731,15 @@ FF_ERROR FF_Close(FF_FILE *pFile) { if(!pFile->FileDeleted) { if(pFile->Filesize != OriginalEntry.Filesize) { OriginalEntry.Filesize = pFile->Filesize; - FF_PutEntry(pFile->pIoman, pFile->DirEntry, pFile->DirCluster, &OriginalEntry); + Error = FF_PutEntry(pFile->pIoman, pFile->DirEntry, pFile->DirCluster, &OriginalEntry); + if(Error) { + return Error; + } } } - //if(pFile->Mode == FF_MODE_WRITE) { - FF_FlushCache(pFile->pIoman); // Ensure all modfied blocks are flushed to disk! - //} - + Error = FF_FlushCache(pFile->pIoman); // Ensure all modfied blocks are flushed to disk! + // Handle Linked list! FF_PendSemaphore(pFile->pIoman->pSemaphore); { // Semaphore is required, or linked list could become corrupted. @@ -1444,6 +1757,11 @@ FF_ERROR FF_Close(FF_FILE *pFile) { // If file written, flush to disk FF_FREE(pFile); + + if(Error) { + return Error; + } + // Simply free the pointer! return FF_ERR_NONE; } diff --git a/reactos/lib/3rdparty/fullfat/ff_format.c b/reactos/lib/3rdparty/fullfat/ff_format.c new file mode 100644 index 00000000000..8799f9a204e --- /dev/null +++ b/reactos/lib/3rdparty/fullfat/ff_format.c @@ -0,0 +1,132 @@ +/***************************************************************************** + * FullFAT - High Performance, Thread-Safe Embedded FAT File-System * + * Copyright (C) 2009 James Walmsley (james@worm.me.uk) * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + * IMPORTANT NOTICE: * + * ================= * + * Alternative Licensing is available directly from the Copyright holder, * + * (James Walmsley). For more information consult LICENSING.TXT to obtain * + * a Commercial license. * + * * + * See RESTRICTIONS.TXT for extra restrictions on the use of FullFAT. * + * * + * Removing the above notice is illegal and will invalidate this license. * + ***************************************************************************** + * See http://worm.me.uk/fullfat for more information. * + * Or http://fullfat.googlecode.com/ for latest releases and the wiki. * + *****************************************************************************/ + +/** + * @file ff_format.c + * @author James Walmsley + * @ingroup FORMAT + * + * @defgroup FORMAT Independent FAT Formatter + * @brief Provides an interface to format a partition with FAT. + * + * + * + **/ + + +#include "ff_format.h" +#include "ff_types.h" +#include "ff_ioman.h" +#include "ff_fatdef.h" + +static FF_T_SINT8 FF_PartitionCount (FF_T_UINT8 *pBuffer) +{ + FF_T_SINT8 count = 0; + FF_T_SINT8 part; + // Check PBR or MBR signature + if (FF_getChar(pBuffer, FF_FAT_MBR_SIGNATURE) != 0x55 && + FF_getChar(pBuffer, FF_FAT_MBR_SIGNATURE) != 0xAA ) { + // No MBR, but is it a PBR ? + if (FF_getChar(pBuffer, 0) == 0xEB && // PBR Byte 0 + FF_getChar(pBuffer, 2) == 0x90 && // PBR Byte 2 + (FF_getChar(pBuffer, 21) & 0xF0) == 0xF0) {// PBR Byte 21 : Media byte + return 1; // No MBR but PBR exist then only one partition + } + return 0; // No MBR and no PBR then no partition found + } + for (part = 0; part < 4; part++) { + FF_T_UINT8 active = FF_getChar(pBuffer, FF_FAT_PTBL + FF_FAT_PTBL_ACTIVE + (16 * part)); + FF_T_UINT8 part_id = FF_getChar(pBuffer, FF_FAT_PTBL + FF_FAT_PTBL_ID + (16 * part)); + // The first sector must be a MBR, then check the partition entry in the MBR + if (active != 0x80 && (active != 0 || part_id == 0)) { + break; + } + count++; + } + return count; +} + +FF_ERROR FF_FormatPartition(FF_IOMAN *pIoman, FF_T_UINT32 ulPartitionNumber, FF_T_UINT32 ulClusterSize) { + + FF_BUFFER *pBuffer; + FF_T_UINT8 ucPartitionType; + FF_T_SINT8 scPartitionCount; + + FF_T_UINT32 /*ulPartitionBeginLBA, ulPartitionLength,*/ ulPnum; + + FF_ERROR Error = FF_ERR_NONE; + + ulClusterSize = 0; + + // Get Partition Metrics, and pass on to FF_Format() function + + pBuffer = FF_GetBuffer(pIoman, 0, FF_MODE_READ); + { + if(!pBuffer) { + return FF_ERR_DEVICE_DRIVER_FAILED; + } + + scPartitionCount = FF_PartitionCount(pBuffer->pBuffer); + + ucPartitionType = FF_getChar(pBuffer->pBuffer, FF_FAT_PTBL + FF_FAT_PTBL_ID); + + if(ucPartitionType == 0xEE) { + // Handle Extended Partitions + ulPnum = 0; + } else { + if(ulPartitionNumber > (FF_T_UINT32) scPartitionCount) { + FF_ReleaseBuffer(pIoman, pBuffer); + return FF_ERR_IOMAN_INVALID_PARTITION_NUM; + } + ulPnum = ulPartitionNumber; + } + + } + FF_ReleaseBuffer(pIoman, pBuffer); + + + + return Error; + +} + +FF_ERROR FF_Format(FF_IOMAN *pIoman, FF_T_UINT32 ulStartLBA, FF_T_UINT32 ulEndLBA, FF_T_UINT32 ulClusterSize) { + FF_T_UINT32 ulTotalSectors; + FF_T_UINT32 ulTotalClusters; + + ulTotalSectors = ulEndLBA - ulStartLBA; + ulTotalClusters = ulTotalSectors / (ulClusterSize / pIoman->BlkSize); + + + return -1; + + +} \ No newline at end of file diff --git a/reactos/lib/3rdparty/fullfat/ff_hash.c b/reactos/lib/3rdparty/fullfat/ff_hash.c index 4a07c81d37e..6357987b313 100644 --- a/reactos/lib/3rdparty/fullfat/ff_hash.c +++ b/reactos/lib/3rdparty/fullfat/ff_hash.c @@ -43,9 +43,9 @@ #include #include -#ifdef FF_HASH_TABLE_SUPPORT +#ifdef FF_HASH_CACHE struct _FF_HASH_TABLE { - FF_T_UINT8 bitTable[FF_HASH_TABLE_SIZE]; + FF_T_UINT8 bitTable[FF_HASH_TABLE_SIZE]; }; /** diff --git a/reactos/lib/3rdparty/fullfat/ff_ioman.c b/reactos/lib/3rdparty/fullfat/ff_ioman.c index 60871f831a0..8e8fc32d418 100644 --- a/reactos/lib/3rdparty/fullfat/ff_ioman.c +++ b/reactos/lib/3rdparty/fullfat/ff_ioman.c @@ -46,9 +46,10 @@ #include "ff_ioman.h" // Includes ff_types.h, ff_safety.h, #include "ff_fatdef.h" +#include "ff_crc.h" -extern FF_T_UINT32 FF_FindFreeCluster (FF_IOMAN *pIoman); -extern FF_T_UINT32 FF_CountFreeClusters (FF_IOMAN *pIoman); +//extern FF_T_UINT32 FF_FindFreeCluster (FF_IOMAN *pIoman); +extern FF_T_UINT32 FF_CountFreeClusters (FF_IOMAN *pIoman, FF_ERROR *pError); static void FF_IOMAN_InitBufferDescriptors(FF_IOMAN *pIoman); @@ -57,7 +58,7 @@ static void FF_IOMAN_InitBufferDescriptors(FF_IOMAN *pIoman); * @brief Creates an FF_IOMAN object, to initialise FullFAT * * @param pCacheMem Pointer to a buffer for the cache. (NULL if ok to Malloc). - * @param Size The size of the provided buffer, or size of the cache to be created. + * @param Size The size of the provided buffer, or size of the cache to be created. (Must be atleast 2 * BlkSize). Always a multiple of BlkSize. * @param BlkSize The block size of devices to be attached. If in doubt use 512. * @param pError Pointer to a signed byte for error checking. Can be NULL if not required. * @param pError To be checked when a NULL pointer is returned. @@ -77,16 +78,16 @@ FF_IOMAN *FF_CreateIOMAN(FF_T_UINT8 *pCacheMem, FF_T_UINT32 Size, FF_T_UINT16 Bl *pError = FF_ERR_NONE; } - if((BlkSize % 512) != 0 || Size == 0) { + if((BlkSize % 512) != 0 || BlkSize == 0) { if(pError) { - *pError = FF_ERR_IOMAN_BAD_BLKSIZE; + *pError = FF_ERR_IOMAN_BAD_BLKSIZE | FF_CREATEIOMAN; } return NULL; // BlkSize Size not a multiple of 512 > 0 } - if((Size % BlkSize) != 0 || Size == 0) { + if((Size % BlkSize) != 0 || Size == 0 || Size == BlkSize) { // Size must now be atleast 2 * BlkSize (or a deadlock will occur). if(pError) { - *pError = FF_ERR_IOMAN_BAD_MEMSIZE; + *pError = FF_ERR_IOMAN_BAD_MEMSIZE | FF_CREATEIOMAN; } return NULL; // Memory Size not a multiple of BlkSize > 0 } @@ -95,7 +96,7 @@ FF_IOMAN *FF_CreateIOMAN(FF_T_UINT8 *pCacheMem, FF_T_UINT32 Size, FF_T_UINT16 Bl if(!pIoman) { // Ensure malloc() succeeded. if(pError) { - *pError = FF_ERR_NOT_ENOUGH_MEMORY; + *pError = FF_ERR_NOT_ENOUGH_MEMORY | FF_CREATEIOMAN; } return NULL; } @@ -107,7 +108,7 @@ FF_IOMAN *FF_CreateIOMAN(FF_T_UINT8 *pCacheMem, FF_T_UINT32 Size, FF_T_UINT16 Bl pIoman->pPartition = (FF_PARTITION *) FF_MALLOC(sizeof(FF_PARTITION)); if(!pIoman->pPartition) { if(pError) { - *pError = FF_ERR_NOT_ENOUGH_MEMORY; + *pError = FF_ERR_NOT_ENOUGH_MEMORY | FF_CREATEIOMAN; } FF_DestroyIOMAN(pIoman); return NULL; @@ -122,17 +123,25 @@ FF_IOMAN *FF_CreateIOMAN(FF_T_UINT8 *pCacheMem, FF_T_UINT32 Size, FF_T_UINT16 Bl for(i = 0; i < FF_PATH_CACHE_DEPTH; i++) { pIoman->pPartition->PathCache[i].DirCluster = 0; pIoman->pPartition->PathCache[i].Path[0] = '\0'; -#ifdef FF_HASH_TABLE_SUPPORT +/*#ifdef FF_HASH_TABLE_SUPPORT pIoman->pPartition->PathCache[i].pHashTable = FF_CreateHashTable(); pIoman->pPartition->PathCache[i].bHashed = FF_FALSE; +#endif*/ + } #endif + +#ifdef FF_HASH_CACHE + for(i = 0; i < FF_HASH_CACHE_DEPTH; i++) { + pIoman->HashCache[i].pHashTable = FF_CreateHashTable(); + pIoman->HashCache[i].ulDirCluster = 0; + pIoman->HashCache[i].ulMisses = 100; } #endif pIoman->pBlkDevice = (FF_BLK_DEVICE *) FF_MALLOC(sizeof(FF_BLK_DEVICE)); if(!pIoman->pBlkDevice) { // If succeeded, flag that allocation. if(pError) { - *pError = FF_ERR_NOT_ENOUGH_MEMORY; + *pError = FF_ERR_NOT_ENOUGH_MEMORY | FF_CREATEIOMAN; } FF_DestroyIOMAN(pIoman); return NULL; @@ -141,8 +150,8 @@ FF_IOMAN *FF_CreateIOMAN(FF_T_UINT8 *pCacheMem, FF_T_UINT32 Size, FF_T_UINT16 Bl pIoman->MemAllocation |= FF_IOMAN_ALLOC_BLKDEV; // Make sure all pointers are NULL - pIoman->pBlkDevice->fnReadBlocks = NULL; - pIoman->pBlkDevice->fnWriteBlocks = NULL; + pIoman->pBlkDevice->fnpReadBlocks = NULL; + pIoman->pBlkDevice->fnpWriteBlocks = NULL; pIoman->pBlkDevice->pParam = NULL; // Organise the memory provided, or create our own! @@ -153,7 +162,7 @@ FF_IOMAN *FF_CreateIOMAN(FF_T_UINT8 *pCacheMem, FF_T_UINT32 Size, FF_T_UINT16 Bl pIoman->pCacheMem = (FF_T_UINT8 *) pLong; if(!pIoman->pCacheMem) { if(pError) { - *pError = FF_ERR_NOT_ENOUGH_MEMORY; + *pError = FF_ERR_NOT_ENOUGH_MEMORY | FF_CREATEIOMAN; } FF_DestroyIOMAN(pIoman); return NULL; @@ -175,7 +184,7 @@ FF_IOMAN *FF_CreateIOMAN(FF_T_UINT8 *pCacheMem, FF_T_UINT32 Size, FF_T_UINT16 Bl if(!pIoman->pBuffers) { if(pError) { - *pError = FF_ERR_NOT_ENOUGH_MEMORY; + *pError = FF_ERR_NOT_ENOUGH_MEMORY | FF_CREATEIOMAN; } FF_DestroyIOMAN(pIoman); return NULL; // HT added @@ -188,6 +197,10 @@ FF_IOMAN *FF_CreateIOMAN(FF_T_UINT8 *pCacheMem, FF_T_UINT32 Size, FF_T_UINT16 Bl // Finally create a Semaphore for Buffer Description modifications. pIoman->pSemaphore = FF_CreateSemaphore(); +#ifdef FF_BLKDEV_USES_SEM + pIoman->pBlkDevSemaphore = FF_CreateSemaphore(); +#endif + return pIoman; // Sucess, return the created object. } @@ -202,9 +215,13 @@ FF_IOMAN *FF_CreateIOMAN(FF_T_UINT8 *pCacheMem, FF_T_UINT32 Size, FF_T_UINT16 Bl **/ FF_ERROR FF_DestroyIOMAN(FF_IOMAN *pIoman) { +#ifdef FF_HASH_CACHE + FF_T_UINT32 i; +#endif + // Ensure no NULL pointer was provided. if(!pIoman) { - return FF_ERR_NULL_POINTER; + return FF_ERR_NULL_POINTER | FF_DESTROYIOMAN; } // Ensure pPartition pointer was allocated. @@ -231,6 +248,18 @@ FF_ERROR FF_DestroyIOMAN(FF_IOMAN *pIoman) { if(pIoman->pSemaphore) { FF_DestroySemaphore(pIoman->pSemaphore); } +#ifdef FF_BLKDEV_USES_SEM + if(pIoman->pBlkDevSemaphore) { + FF_DestroySemaphore(pIoman->pBlkDevSemaphore); + } +#endif + + // Destroy HashCache +#ifdef FF_HASH_CACHE + for(i = 0; i < FF_HASH_CACHE_DEPTH; i++) { + FF_DestroyHashTable(pIoman->HashCache[i].pHashTable); + } +#endif // Finally free the FF_IOMAN object. FF_FREE(pIoman); @@ -256,94 +285,6 @@ static void FF_IOMAN_InitBufferDescriptors(FF_IOMAN *pIoman) { } } -/** - * @private - * @brief Tests the Mode for validity. - * - * @param Mode Mode of buffer to check. - * - * @return FF_TRUE when valid, else FF_FALSE. - **/ -/*static FF_T_BOOL FF_IOMAN_ModeValid(FF_T_UINT8 Mode) { - if(Mode == FF_MODE_READ || Mode == FF_MODE_WRITE) { - return FF_TRUE; - } - return FF_FALSE; -}*/ - - -/** - * @private - * @brief Fills a buffer with the appropriate sector via the device driver. - * - * @param pIoman FF_IOMAN object. - * @param Sector LBA address of the sector to fetch. - * @param pBuffer Pointer to a byte-wise buffer to store the fetched data. - * - * HT Note: will be called while semaphore claimed (by FF_GetBuffer) - * - * @return FF_TRUE when valid, else FF_FALSE. - **/ -static FF_ERROR FF_IOMAN_FillBuffer(FF_IOMAN *pIoman, FF_T_UINT32 Sector, FF_T_UINT8 *pBuffer) { - FF_T_SINT32 retVal = 0; - if(pIoman->pBlkDevice->fnReadBlocks) { // Make sure we don't execute a NULL. - do{ - // Called from FF_GetBuffer with semaphore claimed - retVal = pIoman->pBlkDevice->fnReadBlocks(pBuffer, Sector, 1, pIoman->pBlkDevice->pParam); - if(retVal == FF_ERR_DRIVER_BUSY) { - FF_Sleep(FF_DRIVER_BUSY_SLEEP); - } - } while(retVal == FF_ERR_DRIVER_BUSY); - if(retVal < 0) { - return -1; // FF_ERR_DRIVER_FATAL_ERROR was returned Fail! - } else { - if(retVal == 1) { - return 0; // 1 Block was sucessfully read. - } else { - return -1; // 0 Blocks we're read, Error! - } - } - } - return -1; // error no device diver registered. -} - - -/** - * @private - * @brief Flushes a buffer to the device driver. - * - * @param pIoman FF_IOMAN object. - * @param Sector LBA address of the sector to fetch. - * @param pBuffer Pointer to a byte-wise buffer to store the fetched data. - * - * - * HT made it a globally accesible function to be used by new module ff_format.c - * Note that this function is called when semaphore is already locked - * - * @return FF_TRUE when valid, else FF_FALSE. - **/ -/* static */ FF_ERROR FF_IOMAN_FlushBuffer(FF_IOMAN *pIoman, FF_T_UINT32 Sector, FF_T_UINT8 *pBuffer) { - FF_T_SINT32 retVal = 0; - if(pIoman->pBlkDevice->fnWriteBlocks) { // Make sure we don't execute a NULL. - do{ - retVal = pIoman->pBlkDevice->fnWriteBlocks(pBuffer, Sector, 1, pIoman->pBlkDevice->pParam); - if(retVal == FF_ERR_DRIVER_BUSY) { - FF_Sleep(FF_DRIVER_BUSY_SLEEP); - } - } while(retVal == FF_ERR_DRIVER_BUSY); - if(retVal < 0) { - return -1; // FF_ERR_DRIVER_FATAL_ERROR was returned Fail! - } else { - if(retVal == 1) { - return FF_ERR_NONE; // 1 Block was sucessfully written. - } else { - return -1; // 0 Blocks we're written, Error! - } - } - } - return -1; // error no device diver registered. -} - /** * @private @@ -358,7 +299,7 @@ FF_ERROR FF_FlushCache(FF_IOMAN *pIoman) { FF_T_UINT16 i,x; if(!pIoman) { - return FF_ERR_NULL_POINTER; + return FF_ERR_NULL_POINTER | FF_FLUSHCACHE; } FF_PendSemaphore(pIoman->pSemaphore); @@ -366,7 +307,7 @@ FF_ERROR FF_FlushCache(FF_IOMAN *pIoman) { for(i = 0; i < pIoman->CacheSize; i++) { if((pIoman->pBuffers + i)->NumHandles == 0 && (pIoman->pBuffers + i)->Modified == FF_TRUE) { - FF_IOMAN_FlushBuffer(pIoman, (pIoman->pBuffers + i)->Sector, (pIoman->pBuffers + i)->pBuffer); + FF_BlockWrite(pIoman, (pIoman->pBuffers + i)->Sector, 1, (pIoman->pBuffers + i)->pBuffer); // Buffer has now been flushed, mark it as a read buffer and unmodified. (pIoman->pBuffers + i)->Mode = FF_MODE_READ; @@ -389,13 +330,6 @@ FF_ERROR FF_FlushCache(FF_IOMAN *pIoman) { return FF_ERR_NONE; } -/*static FF_T_BOOL FF_isFATSector(FF_IOMAN *pIoman, FF_T_UINT32 Sector) { - if(Sector >= pIoman->pPartition->FatBeginLBA && Sector < (pIoman->pPartition->FatBeginLBA + pIoman->pPartition->ReservedSectors)) { - return FF_TRUE; - } - return FF_FALSE; -}*/ - FF_BUFFER *FF_GetBuffer(FF_IOMAN *pIoman, FF_T_UINT32 Sector, FF_T_UINT8 Mode) { FF_BUFFER *pBuffer; FF_BUFFER *pBufLRU = NULL; @@ -407,35 +341,13 @@ FF_BUFFER *FF_GetBuffer(FF_IOMAN *pIoman, FF_T_UINT32 Sector, FF_T_UINT8 Mode) { while(!pBufMatch) { FF_PendSemaphore(pIoman->pSemaphore); { - for(i = 0; i < pIoman->CacheSize; i++) { + pBuffer = pIoman->pBuffers; + // HT if a perfect match has priority, find that first + for(i = 0; i < pIoman->CacheSize; i++, pBuffer++) { pBuffer = (pIoman->pBuffers + i); if(pBuffer->Sector == Sector && pBuffer->Valid == FF_TRUE) { pBufMatch = pBuffer; - } else { - if(pBuffer->NumHandles == 0) { - pBuffer->LRU += 1; - - if(!pBufLRU) { - pBufLRU = pBuffer; - } - if(!pBufLHITS) { - pBufLHITS = pBuffer; - } - - if(pBuffer->LRU >= pBufLRU->LRU) { - if(pBuffer->LRU == pBufLRU->LRU) { - if(pBuffer->Persistance > pBufLRU->Persistance) { - pBufLRU = pBuffer; - } - } else { - pBufLRU = pBuffer; - } - } - - if(pBuffer->Persistance < pBufLHITS->Persistance) { - pBufLHITS = pBuffer; - } - } + break; // Why look further if you found a perfect match? } } @@ -468,11 +380,38 @@ FF_BUFFER *FF_GetBuffer(FF_IOMAN *pIoman, FF_T_UINT32 Sector, FF_T_UINT8 Mode) { pBufMatch = NULL; // Sector is already in use, keep yielding until its available! } else { - // Choose a suitable buffer! + pBuffer = pIoman->pBuffers; + for(i = 0; i < pIoman->CacheSize; i++, pBuffer++) { + if(pBuffer->NumHandles == 0) { + pBuffer->LRU += 1; + + if(!pBufLRU) { + pBufLRU = pBuffer; + } + if(!pBufLHITS) { + pBufLHITS = pBuffer; + } + + if(pBuffer->LRU >= pBufLRU->LRU) { + if(pBuffer->LRU == pBufLRU->LRU) { + if(pBuffer->Persistance > pBufLRU->Persistance) { + pBufLRU = pBuffer; + } + } else { + pBufLRU = pBuffer; + } + } + + if(pBuffer->Persistance < pBufLHITS->Persistance) { + pBufLHITS = pBuffer; + } + } + } + if(pBufLRU) { // Process the suitable candidate. if(pBufLRU->Modified == FF_TRUE) { - FF_IOMAN_FlushBuffer(pIoman, pBufLRU->Sector, pBufLRU->pBuffer); + FF_BlockWrite(pIoman, pBufLRU->Sector, 1, pBufLRU->pBuffer); } pBufLRU->Mode = Mode; pBufLRU->Persistance = 1; @@ -486,7 +425,7 @@ FF_BUFFER *FF_GetBuffer(FF_IOMAN *pIoman, FF_T_UINT32 Sector, FF_T_UINT8 Mode) { pBufLRU->Modified = FF_FALSE; } - FF_IOMAN_FillBuffer(pIoman, Sector, pBufLRU->pBuffer); + FF_BlockRead(pIoman, Sector, 1, pBufLRU->pBuffer); pBufLRU->Valid = FF_TRUE; FF_ReleaseSemaphore(pIoman->pSemaphore); return pBufLRU; @@ -540,39 +479,94 @@ void FF_ReleaseBuffer(FF_IOMAN *pIoman, FF_BUFFER *pBuffer) { **/ FF_ERROR FF_RegisterBlkDevice(FF_IOMAN *pIoman, FF_T_UINT16 BlkSize, FF_WRITE_BLOCKS fnWriteBlocks, FF_READ_BLOCKS fnReadBlocks, void *pParam) { if(!pIoman) { // We can't do anything without an IOMAN object. - return FF_ERR_NULL_POINTER; + return FF_ERR_NULL_POINTER | FF_REGISTERBLKDEVICE; } if((BlkSize % 512) != 0 || BlkSize == 0) { - return FF_ERR_IOMAN_DEV_INVALID_BLKSIZE; // BlkSize Size not a multiple of IOMAN's Expected BlockSize > 0 + return FF_ERR_IOMAN_DEV_INVALID_BLKSIZE | FF_REGISTERBLKDEVICE; // BlkSize Size not a multiple of IOMAN's Expected BlockSize > 0 } if((BlkSize % pIoman->BlkSize) != 0 || BlkSize == 0) { - return FF_ERR_IOMAN_DEV_INVALID_BLKSIZE; // BlkSize Size not a multiple of IOMAN's Expected BlockSize > 0 + return FF_ERR_IOMAN_DEV_INVALID_BLKSIZE | FF_REGISTERBLKDEVICE; // BlkSize Size not a multiple of IOMAN's Expected BlockSize > 0 } // Ensure that a device cannot be re-registered "mid-flight" // Doing so would corrupt the context of FullFAT - if(pIoman->pBlkDevice->fnReadBlocks) { - return FF_ERR_IOMAN_DEV_ALREADY_REGD; + if(pIoman->pBlkDevice->fnpReadBlocks) { + return FF_ERR_IOMAN_DEV_ALREADY_REGD | FF_REGISTERBLKDEVICE; } - if(pIoman->pBlkDevice->fnWriteBlocks) { - return FF_ERR_IOMAN_DEV_ALREADY_REGD; + if(pIoman->pBlkDevice->fnpWriteBlocks) { + return FF_ERR_IOMAN_DEV_ALREADY_REGD | FF_REGISTERBLKDEVICE; } if(pIoman->pBlkDevice->pParam) { - return FF_ERR_IOMAN_DEV_ALREADY_REGD; + return FF_ERR_IOMAN_DEV_ALREADY_REGD | FF_REGISTERBLKDEVICE; } // Here we shall just set the values. // FullFAT checks before using any of these values. pIoman->pBlkDevice->devBlkSize = BlkSize; - pIoman->pBlkDevice->fnReadBlocks = fnReadBlocks; - pIoman->pBlkDevice->fnWriteBlocks = fnWriteBlocks; + pIoman->pBlkDevice->fnpReadBlocks = fnReadBlocks; + pIoman->pBlkDevice->fnpWriteBlocks = fnWriteBlocks; pIoman->pBlkDevice->pParam = pParam; return FF_ERR_NONE; // Success } +/* + New Interface for FullFAT to read blocks. +*/ + +FF_T_SINT32 FF_BlockRead(FF_IOMAN *pIoman, FF_T_UINT32 ulSectorLBA, FF_T_UINT32 ulNumSectors, void *pBuffer) { + FF_T_SINT32 slRetVal = 0; + + if(pIoman->pPartition->TotalSectors) { + if((ulSectorLBA + ulNumSectors) > (pIoman->pPartition->TotalSectors + pIoman->pPartition->BeginLBA)) { + return -(FF_ERR_IOMAN_OUT_OF_BOUNDS_READ | FF_BLOCKREAD); + } + } + + if(pIoman->pBlkDevice->fnpReadBlocks) { // Make sure we don't execute a NULL. +#ifdef FF_BLKDEV_USES_SEM + FF_PendSemaphore(pIoman->pBlkDevSemaphore); +#endif + slRetVal = pIoman->pBlkDevice->fnpReadBlocks(pBuffer, ulSectorLBA, ulNumSectors, pIoman->pBlkDevice->pParam); +#ifdef FF_BLKDEV_USES_SEM + FF_ReleaseSemaphore(pIoman->pBlkDevSemaphore); +#endif + if(FF_GETERROR(slRetVal) == FF_ERR_DRIVER_BUSY) { + FF_Sleep(FF_DRIVER_BUSY_SLEEP); + } + } while(FF_GETERROR(slRetVal) == FF_ERR_DRIVER_BUSY); + + return slRetVal; +} + +FF_T_SINT32 FF_BlockWrite(FF_IOMAN *pIoman, FF_T_UINT32 ulSectorLBA, FF_T_UINT32 ulNumSectors, void *pBuffer) { + FF_T_SINT32 slRetVal = 0; + + if(pIoman->pPartition->TotalSectors) { + if((ulSectorLBA + ulNumSectors) > (pIoman->pPartition->TotalSectors + pIoman->pPartition->BeginLBA)) { + return -(FF_ERR_IOMAN_OUT_OF_BOUNDS_WRITE | FF_BLOCKWRITE); + } + } + + if(pIoman->pBlkDevice->fnpWriteBlocks) { // Make sure we don't execute a NULL. +#ifdef FF_BLKDEV_USES_SEM + FF_PendSemaphore(pIoman->pBlkDevSemaphore); +#endif + slRetVal = pIoman->pBlkDevice->fnpWriteBlocks(pBuffer, ulSectorLBA, ulNumSectors, pIoman->pBlkDevice->pParam); +#ifdef FF_BLKDEV_USES_SEM + FF_ReleaseSemaphore(pIoman->pBlkDevSemaphore); +#endif + if(FF_GETERROR(slRetVal) == FF_ERR_DRIVER_BUSY) { + FF_Sleep(FF_DRIVER_BUSY_SLEEP); + } + } while(FF_GETERROR(slRetVal) == FF_ERR_DRIVER_BUSY); + + return slRetVal; +} + + /** * @private **/ @@ -638,7 +632,7 @@ static FF_ERROR FF_DetermineFatType(FF_IOMAN *pIoman) { testLong = FF_getLong(pBuffer->pBuffer, 0x0000); } FF_ReleaseBuffer(pIoman, pBuffer); - if((testLong & 0x0FFFFFF8) != 0x0FFFFFF8) { + if((testLong & 0x0FFFFFF8) != 0x0FFFFFF8 && (testLong & 0x0FFFFFF8) != 0x0FFFFFF0) { return FF_ERR_IOMAN_NOT_FAT_FORMATTED; } #endif @@ -676,6 +670,91 @@ static FF_T_SINT8 FF_PartitionCount (FF_T_UINT8 *pBuffer) return count; } +/* + Mount GPT Partition Tables +*/ + +#define FF_GPT_HEAD_ENTRY_SIZE 0x54 +#define FF_GPT_HEAD_TOTAL_ENTRIES 0x50 +#define FF_GPT_HEAD_PART_ENTRY_LBA 0x48 +#define FF_GPT_ENTRY_FIRST_SECTOR_LBA 0x20 +#define FF_GPT_HEAD_CRC 0x10 +#define FF_GPT_HEAD_LENGTH 0x0C + +static FF_ERROR FF_GetEfiPartitionEntry(FF_IOMAN *pIoman, FF_T_UINT32 ulPartitionNumber) { + // Continuing on from FF_MountPartition() pPartition->BeginLBA should be the sector of the GPT Header + FF_BUFFER *pBuffer; + FF_PARTITION *pPart = pIoman->pPartition; + + FF_T_UINT32 ulBeginGPT; + FF_T_UINT32 ulEntrySector; + FF_T_UINT32 ulSectorOffset; + FF_T_UINT32 ulTotalPartitionEntries; + FF_T_UINT32 ulPartitionEntrySize; + FF_T_UINT32 ulGPTHeadCRC, ulGPTCrcCheck, ulGPTHeadLength; + + if(ulPartitionNumber >= 128) { + return FF_ERR_IOMAN_INVALID_PARTITION_NUM; + } + + pBuffer = FF_GetBuffer(pIoman, pPart->BeginLBA, FF_MODE_READ); + { + if(!pBuffer) { + return FF_ERR_DEVICE_DRIVER_FAILED; + } + + // Verify this is an EFI header + if(memcmp(pBuffer->pBuffer, "EFI PART", 8) != 0) { + FF_ReleaseBuffer(pIoman, pBuffer); + return FF_ERR_IOMAN_INVALID_FORMAT; + } + + ulBeginGPT = FF_getLong(pBuffer->pBuffer, FF_GPT_HEAD_PART_ENTRY_LBA); + ulTotalPartitionEntries = FF_getLong(pBuffer->pBuffer, FF_GPT_HEAD_TOTAL_ENTRIES); + ulPartitionEntrySize = FF_getLong(pBuffer->pBuffer, FF_GPT_HEAD_ENTRY_SIZE); + ulGPTHeadCRC = FF_getLong(pBuffer->pBuffer, FF_GPT_HEAD_CRC); + ulGPTHeadLength = FF_getLong(pBuffer->pBuffer, FF_GPT_HEAD_LENGTH); + + // Calculate Head CRC + + // Blank CRC field + FF_putLong(pBuffer->pBuffer, FF_GPT_HEAD_CRC, 0x00000000); + + // Calculate CRC + ulGPTCrcCheck = FF_GetCRC32(pBuffer->pBuffer, ulGPTHeadLength); + + // Restore The CRC field + FF_putLong(pBuffer->pBuffer, FF_GPT_HEAD_CRC, ulGPTHeadCRC); + } + FF_ReleaseBuffer(pIoman, pBuffer); + + // Check CRC + if(ulGPTHeadCRC != ulGPTCrcCheck) { + return FF_ERR_IOMAN_GPT_HEADER_CORRUPT; + } + + // Calculate Sector Containing the Partition Entry we want to use. + + ulEntrySector = ((ulPartitionNumber * ulPartitionEntrySize) / pIoman->BlkSize) + ulBeginGPT; + ulSectorOffset = (ulPartitionNumber % (pIoman->BlkSize / ulPartitionEntrySize)) * ulPartitionEntrySize; + + pBuffer = FF_GetBuffer(pIoman, ulEntrySector, FF_MODE_READ); + { + if(!pBuffer) { + return FF_ERR_DEVICE_DRIVER_FAILED; + } + + pPart->BeginLBA = FF_getLong(pBuffer->pBuffer, ulSectorOffset + FF_GPT_ENTRY_FIRST_SECTOR_LBA); + } + FF_ReleaseBuffer(pIoman, pBuffer); + + if(!pPart->BeginLBA) { + return FF_ERR_IOMAN_INVALID_PARTITION_NUM; + } + + return FF_ERR_NONE; +} + /** * @public * @brief Mounts the Specified partition, the volume specified by the FF_IOMAN object provided. @@ -697,15 +776,19 @@ static FF_T_SINT8 FF_PartitionCount (FF_T_UINT8 *pBuffer) FF_ERROR FF_MountPartition(FF_IOMAN *pIoman, FF_T_UINT8 PartitionNumber) { FF_PARTITION *pPart; FF_BUFFER *pBuffer = 0; + FF_ERROR Error; + + FF_T_UINT8 ucPartitionType; + int partCount; if(!pIoman) { return FF_ERR_NULL_POINTER; } - if(PartitionNumber > 3) { + /*if(PartitionNumber > 3) { return FF_ERR_IOMAN_INVALID_PARTITION_NUM; - } + }*/ pPart = pIoman->pPartition; @@ -728,10 +811,32 @@ FF_ERROR FF_MountPartition(FF_IOMAN *pIoman, FF_T_UINT8 PartitionNumber) { // Volume is not partitioned (MBR Found) pPart->BeginLBA = 0; } else { - // Primary Partitions to deal with! - pPart->BeginLBA = FF_getLong(pBuffer->pBuffer, FF_FAT_PTBL + FF_FAT_PTBL_LBA + (16 * PartitionNumber)); + + ucPartitionType = FF_getChar(pBuffer->pBuffer, FF_FAT_PTBL + FF_FAT_PTBL_ID); // Ensure its not an EFI partition! + + if(ucPartitionType != 0xEE) { + + if(PartitionNumber > 3) { + FF_ReleaseBuffer(pIoman, pBuffer); + return FF_ERR_IOMAN_INVALID_PARTITION_NUM; + } + + // Primary Partitions to deal with! + pPart->BeginLBA = FF_getLong(pBuffer->pBuffer, FF_FAT_PTBL + FF_FAT_PTBL_LBA + (16 * PartitionNumber)); + } + FF_ReleaseBuffer(pIoman, pBuffer); + if(ucPartitionType == 0xEE) { + + pPart->BeginLBA = FF_getLong(pBuffer->pBuffer, FF_FAT_PTBL + FF_FAT_PTBL_LBA); + Error = FF_GetEfiPartitionEntry(pIoman, PartitionNumber); + + if(Error) { + return Error; + } + } + if(!pPart->BeginLBA) { return FF_ERR_IOMAN_NO_MOUNTABLE_PARTITION; } @@ -778,13 +883,25 @@ FF_ERROR FF_MountPartition(FF_IOMAN *pIoman, FF_T_UINT8 PartitionNumber) { } FF_ReleaseBuffer(pIoman, pBuffer); // Release the buffer finally! + + if(!pPart->BlkSize) { + return FF_ERR_IOMAN_INVALID_FORMAT; + } + pPart->RootDirSectors = ((FF_getShort(pBuffer->pBuffer, FF_FAT_ROOT_ENTRY_COUNT) * 32) + pPart->BlkSize - 1) / pPart->BlkSize; pPart->FirstDataSector = pPart->ClusterBeginLBA + pPart->RootDirSectors; pPart->DataSectors = pPart->TotalSectors - (pPart->ReservedSectors + (pPart->NumFATS * pPart->SectorsPerFAT) + pPart->RootDirSectors); + + if(!pPart->SectorsPerCluster) { + return FF_ERR_IOMAN_INVALID_FORMAT; + } + pPart->NumClusters = pPart->DataSectors / pPart->SectorsPerCluster; - if(FF_DetermineFatType(pIoman)) { - return FF_ERR_IOMAN_NOT_FAT_FORMATTED; + Error = FF_DetermineFatType(pIoman); + + if(Error) { + return Error; } #ifdef FF_MOUNT_FIND_FREE @@ -820,8 +937,8 @@ FF_ERROR FF_UnregisterBlkDevice(FF_IOMAN *pIoman) { { if(pIoman->pPartition->PartitionMounted == FF_FALSE) { pIoman->pBlkDevice->devBlkSize = 0; - pIoman->pBlkDevice->fnReadBlocks = NULL; - pIoman->pBlkDevice->fnWriteBlocks = NULL; + pIoman->pBlkDevice->fnpReadBlocks = NULL; + pIoman->pBlkDevice->fnpWriteBlocks = NULL; pIoman->pBlkDevice->pParam = NULL; } else { RetVal = FF_ERR_IOMAN_PARTITION_MOUNTED; @@ -876,7 +993,11 @@ FF_ERROR FF_UnmountPartition(FF_IOMAN *pIoman) { { if(!FF_ActiveHandles(pIoman)) { if(pIoman->FirstFile == NULL) { + // Release Semaphore to call this function! + FF_ReleaseSemaphore(pIoman->pSemaphore); FF_FlushCache(pIoman); // Flush any unwritten sectors to disk. + // Reclaim Semaphore + FF_PendSemaphore(pIoman->pSemaphore); pIoman->pPartition->PartitionMounted = FF_FALSE; } else { RetVal = FF_ERR_IOMAN_ACTIVE_HANDLES; @@ -893,12 +1014,17 @@ FF_ERROR FF_UnmountPartition(FF_IOMAN *pIoman) { FF_ERROR FF_IncreaseFreeClusters(FF_IOMAN *pIoman, FF_T_UINT32 Count) { + FF_ERROR Error; //FF_PendSemaphore(pIoman->pSemaphore); //{ if(!pIoman->pPartition->FreeClusterCount) { - pIoman->pPartition->FreeClusterCount = FF_CountFreeClusters(pIoman); + pIoman->pPartition->FreeClusterCount = FF_CountFreeClusters(pIoman, &Error); + if(Error) { + return Error; + } + } else { + pIoman->pPartition->FreeClusterCount += Count; } - pIoman->pPartition->FreeClusterCount += Count; //} //FF_ReleaseSemaphore(pIoman->pSemaphore); @@ -907,12 +1033,18 @@ FF_ERROR FF_IncreaseFreeClusters(FF_IOMAN *pIoman, FF_T_UINT32 Count) { FF_ERROR FF_DecreaseFreeClusters(FF_IOMAN *pIoman, FF_T_UINT32 Count) { + FF_ERROR Error; + //FF_lockFAT(pIoman); //{ if(!pIoman->pPartition->FreeClusterCount) { - pIoman->pPartition->FreeClusterCount = FF_CountFreeClusters(pIoman); + pIoman->pPartition->FreeClusterCount = FF_CountFreeClusters(pIoman, &Error); + if(Error) { + return Error; + } + } else { + pIoman->pPartition->FreeClusterCount -= Count; } - pIoman->pPartition->FreeClusterCount -= Count; //} //FF_unlockFAT(pIoman); diff --git a/reactos/lib/3rdparty/fullfat/ff_string.c b/reactos/lib/3rdparty/fullfat/ff_string.c index 6913ee7082f..b6c06790ea9 100644 --- a/reactos/lib/3rdparty/fullfat/ff_string.c +++ b/reactos/lib/3rdparty/fullfat/ff_string.c @@ -42,27 +42,57 @@ #include #include +#include #include "ff_string.h" +#include "ff_error.h" + +#ifdef FF_UNICODE_SUPPORT +#include +#include +#endif /* * These will eventually be moved into a platform independent string * library. Which will be optional. (To allow the use of system specific versions). */ +#ifdef FF_UNICODE_SUPPORT + +void FF_cstrntowcs(FF_T_WCHAR *wcsDest, const FF_T_INT8 *szpSource, FF_T_UINT32 len) { + while(*szpSource && len--) { + *wcsDest++ = *szpSource++; + } + *wcsDest = '\0'; +} + +void FF_cstrtowcs(FF_T_WCHAR *wcsDest, const FF_T_INT8 *szpSource) { + while(*szpSource) { + *wcsDest++ = (FF_T_WCHAR) *szpSource++; + } + *wcsDest = '\0'; +} + +void FF_wcstocstr(FF_T_INT8 *szpDest, const FF_T_WCHAR *wcsSource) { + while(*wcsSource) { + *szpDest++ = (FF_T_INT8) *wcsSource++; + } + *szpDest = '\0'; +} + +void FF_wcsntocstr(FF_T_INT8 *szpDest, const FF_T_WCHAR *wcsSource, FF_T_UINT32 len) { + while(*wcsSource && len--) { + *szpDest++ = (FF_T_INT8) *wcsSource++; + } + *szpDest = '\0'; +} + +#endif + /** * @private * @brief Converts an ASCII string to lowercase. **/ -void FF_tolower(FF_T_INT8 *string, FF_T_UINT32 strLen) { - FF_T_UINT32 i; - for(i = 0; i < strLen; i++) { - if(string[i] >= 'A' && string[i] <= 'Z') - string[i] += 32; - if(string[i] == '\0') - break; - } -} - +#ifndef FF_UNICODE_SUPPORT /** * @private * @brief Converts an ASCII string to uppercase. @@ -76,6 +106,32 @@ void FF_toupper(FF_T_INT8 *string, FF_T_UINT32 strLen) { break; } } +void FF_tolower(FF_T_INT8 *string, FF_T_UINT32 strLen) { + FF_T_UINT32 i; + for(i = 0; i < strLen; i++) { + if(string[i] >= 'A' && string[i] <= 'Z') + string[i] += 32; + if(string[i] == '\0') + break; + } +} + +#else +void FF_toupper(FF_T_WCHAR *string, FF_T_UINT32 strLen) { + FF_T_UINT32 i; + for(i = 0; i < strLen; i++) { + string[i] = towupper(string[i]); + } +} +void FF_tolower(FF_T_WCHAR *string, FF_T_UINT32 strLen) { + FF_T_UINT32 i; + for(i = 0; i < strLen; i++) { + string[i] = towlower(string[i]); + } +} +#endif + + /** @@ -84,6 +140,8 @@ void FF_toupper(FF_T_INT8 *string, FF_T_UINT32 strLen) { * otherwise FF_FALSE is returned. * **/ + +#ifndef FF_UNICODE_SUPPORT FF_T_BOOL FF_strmatch(const FF_T_INT8 *str1, const FF_T_INT8 *str2, FF_T_UINT16 len) { register FF_T_UINT16 i; register FF_T_INT8 char1, char2; @@ -112,12 +170,38 @@ FF_T_BOOL FF_strmatch(const FF_T_INT8 *str1, const FF_T_INT8 *str2, FF_T_UINT16 return FF_TRUE; } +#else + +FF_T_BOOL FF_strmatch(const FF_T_WCHAR *str1, const FF_T_WCHAR *str2, FF_T_UINT16 len) { + register FF_T_UINT16 i; + register FF_T_WCHAR char1, char2; + + if(!len) { + if(wcslen(str1) != wcslen(str2)) { + return FF_FALSE; + } + len = (FF_T_UINT16) wcslen(str1); + } + + for(i = 0; i < len; i++) { + char1 = towlower(str1[i]); + char2 = towlower(str2[i]); + if(char1 != char2) { + return FF_FALSE; + } + } + + return FF_TRUE; +} +#endif /** * @private * @brief A re-entrant Strtok function. No documentation is provided :P * Use at your own risk. (This is for FullFAT's use only). **/ + +#ifndef FF_UNICODE_SUPPORT FF_T_INT8 *FF_strtok(const FF_T_INT8 *string, FF_T_INT8 *token, FF_T_UINT16 *tokenNumber, FF_T_BOOL *last, FF_T_UINT16 Length) { FF_T_UINT16 strLen = Length; FF_T_UINT16 i,y, tokenStart, tokenEnd = 0; @@ -153,20 +237,80 @@ FF_T_INT8 *FF_strtok(const FF_T_INT8 *string, FF_T_INT8 *token, FF_T_UINT16 *tok } tokenEnd = i; } - - memcpy(token, (string + tokenStart), (FF_T_UINT32)(tokenEnd - tokenStart)); - token[tokenEnd - tokenStart] = '\0'; + if((tokenEnd - tokenStart) < FF_MAX_FILENAME) { + memcpy(token, (string + tokenStart), (FF_T_UINT32)(tokenEnd - tokenStart)); + token[tokenEnd - tokenStart] = '\0'; + } else { + memcpy(token, (string + tokenStart), (FF_T_UINT32)(FF_MAX_FILENAME)); + token[FF_MAX_FILENAME-1] = '\0'; + } + //token[tokenEnd - tokenStart] = '\0'; *tokenNumber += 1; return token; } +#else +FF_T_WCHAR *FF_strtok(const FF_T_WCHAR *string, FF_T_WCHAR *token, FF_T_UINT16 *tokenNumber, FF_T_BOOL *last, FF_T_UINT16 Length) { + FF_T_UINT16 strLen = Length; + FF_T_UINT16 i,y, tokenStart, tokenEnd = 0; -FF_T_BOOL FF_wildcompare(const FF_T_INT8 *pszWildCard, const FF_T_INT8 *pszString) { - /* Check to see if the string contains the wild card */ + i = 0; + y = 0; + + if(string[i] == '\\' || string[i] == '/') { + i++; + } + + tokenStart = i; + + while(i < strLen) { + if(string[i] == '\\' || string[i] == '/') { + y++; + if(y == *tokenNumber) { + tokenStart = (FF_T_UINT16)(i + 1); + } + if(y == (*tokenNumber + 1)) { + tokenEnd = i; + break; + } + } + i++; + } + + if(!tokenEnd) { + if(*last == FF_TRUE) { + return NULL; + } else { + *last = FF_TRUE; + } + tokenEnd = i; + } + if((tokenEnd - tokenStart) < FF_MAX_FILENAME) { + memcpy(token, (string + tokenStart), (FF_T_UINT32)(tokenEnd - tokenStart) * sizeof(FF_T_WCHAR)); + token[tokenEnd - tokenStart] = '\0'; + } else { + memcpy(token, (string + tokenStart), (FF_T_UINT32)(FF_MAX_FILENAME) * sizeof(FF_T_WCHAR)); + token[FF_MAX_FILENAME-1] = '\0'; + } + //token[tokenEnd - tokenStart] = '\0'; + *tokenNumber += 1; + + return token; +} +#endif + +/* + A Wild-Card Comparator Library function, Provided by Adam Fullerton. + This can be extended or altered to improve or advance wildCard matching + of the FF_FindFirst() and FF_FindNext() API's. +*/ +#ifdef FF_FINDAPI_ALLOW_WILDCARDS +/*FF_T_BOOL FF_wildcompare(const FF_T_INT8 *pszWildCard, const FF_T_INT8 *pszString) { + // Check to see if the string contains the wild card if (!memchr(pszWildCard, '*', strlen(pszWildCard))) { - /* if it does not then do a straight string compare */ + // if it does not then do a straight string compare if (strcmp(pszWildCard, pszString)) { return FF_FALSE; @@ -177,20 +321,20 @@ FF_T_BOOL FF_wildcompare(const FF_T_INT8 *pszWildCard, const FF_T_INT8 *pszStrin while ((*pszWildCard) && (*pszString)) { - /* Test for the wild card */ + // Test for the wild card if (*pszWildCard == '*') { - /* Eat more than one */ + // Eat more than one while (*pszWildCard == '*') { pszWildCard++; } - /* If there are more chars in the string */ + // If there are more chars in the string if (*pszWildCard) { - /* Search for the next char */ + // Search for the next char pszString = memchr(pszString, (int)*pszWildCard, strlen(pszString)); - /* if it does not exist then the strings don't match */ + // if it does not exist then the strings don't match if (!pszString) { return FF_FALSE; @@ -201,7 +345,7 @@ FF_T_BOOL FF_wildcompare(const FF_T_INT8 *pszWildCard, const FF_T_INT8 *pszStrin { if (*pszWildCard) { - /* continue */ + // continue break; } else @@ -212,17 +356,17 @@ FF_T_BOOL FF_wildcompare(const FF_T_INT8 *pszWildCard, const FF_T_INT8 *pszStrin } else { - /* Fail if they don't match */ + // Fail if they don't match if (*pszWildCard != *pszString) { return FF_FALSE; } } - /* Bump both pointers */ + // Bump both pointers pszWildCard++; pszString++; } - /* fail if different lengths */ + // fail if different lengths if (*pszWildCard != *pszString) { return FF_FALSE; @@ -230,5 +374,83 @@ FF_T_BOOL FF_wildcompare(const FF_T_INT8 *pszWildCard, const FF_T_INT8 *pszStrin } return FF_TRUE; -} +}*/ +/* + This is a better Wild-card compare function, that works perfectly, and is much more efficient. + This function was contributed by one of our commercial customers. +*/ +#ifdef FF_UNICODE_SUPPORT +FF_T_BOOL FF_wildcompare(const FF_T_WCHAR *pszWildCard, const FF_T_WCHAR *pszString) { + register const FF_T_WCHAR *pszWc = NULL; + register const FF_T_WCHAR *pszStr = NULL; // Encourage the string pointers to be placed in memory. + do { + if ( *pszWildCard == '*' ) { + while(*(1 + pszWildCard++) == '*'); // Eat up multiple '*''s + pszWc = (pszWildCard - 1); + pszStr = pszString; + } + if (*pszWildCard == '?' && !*pszString) { + return FF_FALSE; // False when the string is ended, yet a ? charachter is demanded. + } +#ifdef FF_WILDCARD_CASE_INSENSITIVE + if (*pszWildCard != '?' && tolower(*pszWildCard) != tolower(*pszString)) { +#else + if (*pszWildCard != '?' && *pszWildCard != *pszString) { +#endif + if (pszWc == NULL) { + return FF_FALSE; + } + pszWildCard = pszWc; + pszString = pszStr++; + } + } while ( *pszWildCard++ && *pszString++ ); + while(*pszWildCard == '*') { + pszWildCard++; + } + + if(!*(pszWildCard - 1)) { // WildCard is at the end. (Terminated) + return FF_TRUE; // Therefore this must be a match. + } + + return FF_FALSE; // If not, then return FF_FALSE! +} +#else +FF_T_BOOL FF_wildcompare(const FF_T_INT8 *pszWildCard, const FF_T_INT8 *pszString) { + register const FF_T_INT8 *pszWc = NULL; + register const FF_T_INT8 *pszStr = NULL; // Encourage the string pointers to be placed in memory. + do { + if ( *pszWildCard == '*' ) { + while(*(1 + pszWildCard++) == '*'); // Eat up multiple '*''s + pszWc = (pszWildCard - 1); + pszStr = pszString; + } + if (*pszWildCard == '?' && !*pszString) { + return FF_FALSE; // False when the string is ended, yet a ? charachter is demanded. + } +#ifdef FF_WILDCARD_CASE_INSENSITIVE + if (*pszWildCard != '?' && tolower(*pszWildCard) != tolower(*pszString)) { +#else + if (*pszWildCard != '?' && *pszWildCard != *pszString) { +#endif + if (pszWc == NULL) { + return FF_FALSE; + } + pszWildCard = pszWc; + pszString = pszStr++; + } + } while ( *pszWildCard++ && *pszString++ ); + + while(*pszWildCard == '*') { + pszWildCard++; + } + + if(!*(pszWildCard - 1)) { // WildCard is at the end. (Terminated) + return FF_TRUE; // Therefore this must be a match. + } + + return FF_FALSE; // If not, then return FF_FALSE! +} +#endif + +#endif diff --git a/reactos/lib/3rdparty/fullfat/ff_unicode.c b/reactos/lib/3rdparty/fullfat/ff_unicode.c new file mode 100644 index 00000000000..24fffd420d4 --- /dev/null +++ b/reactos/lib/3rdparty/fullfat/ff_unicode.c @@ -0,0 +1,294 @@ +/***************************************************************************** + * FullFAT - High Performance, Thread-Safe Embedded FAT File-System * + * Copyright (C) 2009 James Walmsley (james@worm.me.uk) * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + * IMPORTANT NOTICE: * + * ================= * + * Alternative Licensing is available directly from the Copyright holder, * + * (James Walmsley). For more information consult LICENSING.TXT to obtain * + * a Commercial license. * + * * + * See RESTRICTIONS.TXT for extra restrictions on the use of FullFAT. * + * * + * Removing the above notice is illegal and will invalidate this license. * + ***************************************************************************** + * See http://worm.me.uk/fullfat for more information. * + * Or http://fullfat.googlecode.com/ for latest releases and the wiki. * + *****************************************************************************/ + +/** + * @file ff_unicode.c + * @author James Walmsley + * @ingroup UNICODE + * + * @defgroup UNICODE FullFAT UNICODE Library + * @brief Portable UNICODE Transformation Library for FullFAT + * + **/ + +#include "ff_unicode.h" +#include "string.h" + +// UTF-8 Routines + +/* + UCS-4 range (hex.) UTF-8 octet sequence (binary) + 0000 0000-0000 007F 0xxxxxxx + 0000 0080-0000 07FF 110xxxxx 10xxxxxx + 0000 0800-0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx + + 0001 0000-001F FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx + 0020 0000-03FF FFFF 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx -- We don't encode these because we won't receive them. (Invalid UNICODE). + 0400 0000-7FFF FFFF 1111110x 10xxxxxx ... 10xxxxxx -- We don't encode these because we won't receive them. (Invalid UNICODE). +*/ + +FF_T_UINT FF_GetUtf16SequenceLen(FF_T_UINT16 usLeadChar) { + if((usLeadChar & 0xFC00) == 0xD800) { + return 2; + } + return 1; +} + +/* + Returns the number of UTF-8 units read. + Will not exceed ulSize UTF-16 units. (ulSize * 2 bytes). +*/ +/* + UCS-4 range (hex.) UTF-8 octet sequence (binary) + 0000 0000-0000 007F 0xxxxxxx + 0000 0080-0000 07FF 110xxxxx 10xxxxxx + 0000 0800-0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx + + 0001 0000-001F FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx + 0020 0000-03FF FFFF 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx -- We don't encode these because we won't receive them. (Invalid UNICODE). + 0400 0000-7FFF FFFF 1111110x 10xxxxxx ... 10xxxxxx -- We don't encode these because we won't receive them. (Invalid UNICODE). +*/ +FF_T_SINT32 FF_Utf8ctoUtf16c(FF_T_UINT16 *utf16Dest, const FF_T_UINT8 *utf8Source, FF_T_UINT32 ulSize) { + FF_T_UINT32 ulUtf32char; + FF_T_UINT16 utf16Source = 0; + register FF_T_INT uiSequenceNumber = 0; + + while((*utf8Source & (0x80 >> (uiSequenceNumber)))) { // Count number of set bits before a zero. + uiSequenceNumber++; + } + + if(!uiSequenceNumber) { + uiSequenceNumber++; + } + + if(!ulSize) { + return FF_ERR_UNICODE_DEST_TOO_SMALL; + } + + switch(uiSequenceNumber) { + case 1: + utf16Source = (FF_T_UINT16) *utf8Source; + memcpy(utf16Dest,&utf16Source,sizeof(FF_T_UINT16)); + //bobtntfullfat *utf16Dest = (FF_T_UINT16) *utf8Source; + break; + + case 2: + utf16Source =(FF_T_UINT16) ((*utf8Source & 0x1F) << 6) | ((*(utf8Source + 1) & 0x3F)); + memcpy(utf16Dest,&utf16Source,sizeof(FF_T_UINT16)); + //bobtntfullfat *utf16Dest = (FF_T_UINT16) ((*utf8Source & 0x1F) << 6) | ((*(utf8Source + 1) & 0x3F)); + break; + + case 3: + utf16Source =(FF_T_UINT16) ((*utf8Source & 0x0F) << 12) | ((*(utf8Source + 1) & 0x3F) << 6) | ((*(utf8Source + 2) & 0x3F)); + memcpy(utf16Dest,&utf16Source,sizeof(FF_T_UINT16)); + //bobtntfullfat *utf16Dest = (FF_T_UINT16) ((*utf8Source & 0x0F) << 12) | ((*(utf8Source + 1) & 0x3F) << 6) | ((*(utf8Source + 2) & 0x3F)); + break; + + case 4: + // Convert to UTF-32 and then into UTF-16 + if(ulSize < 2) { + return FF_ERR_UNICODE_DEST_TOO_SMALL; + } + ulUtf32char = (FF_T_UINT16) ((*utf8Source & 0x0F) << 18) | ((*(utf8Source + 1) & 0x3F) << 12) | ((*(utf8Source + 2) & 0x3F) << 6) | ((*(utf8Source + 3) & 0x3F)); + + utf16Source = (FF_T_UINT16) (((ulUtf32char - 0x10000) & 0xFFC00) >> 10) | 0xD800; + memcpy(utf16Dest,&utf16Source,sizeof(FF_T_UINT16)); + utf16Source = (FF_T_UINT16) (((ulUtf32char - 0x10000) & 0x003FF) >> 00) | 0xDC00; + memcpy(utf16Dest+1,&utf16Source,sizeof(FF_T_UINT16)); + //bobtntfullfat *(utf16Dest + 0) = (FF_T_UINT16) (((ulUtf32char - 0x10000) & 0xFFC00) >> 10) | 0xD800; + //bobtntfullfat *(utf16Dest + 1) = (FF_T_UINT16) (((ulUtf32char - 0x10000) & 0x003FF) >> 00) | 0xDC00; + break; + + default: + break; + } + + return uiSequenceNumber; +} + + +/* + Returns the number of UTF-8 units required to encode the UTF-16 sequence. + Will not exceed ulSize UTF-8 units. (ulSize * 1 bytes). +*/ +FF_T_SINT32 FF_Utf16ctoUtf8c(FF_T_UINT8 *utf8Dest, const FF_T_UINT16 *utf16Source, FF_T_UINT32 ulSize) { + FF_T_UINT32 ulUtf32char; + FF_T_UINT16 ulUtf16char; + + if(!ulSize) { + return FF_ERR_UNICODE_DEST_TOO_SMALL; + } + + memcpy(&ulUtf16char, utf16Source, sizeof(FF_T_UINT16)); + if((/*bobtntfullfat *utf16Source*/ulUtf16char & 0xF800) == 0xD800) { // A surrogate sequence was encountered. Must transform to UTF32 first. + ulUtf32char = ((FF_T_UINT32) (ulUtf16char & 0x003FF) << 10) + 0x10000; + //bobtntfullfat ulUtf32char = ((FF_T_UINT32) (*(utf16Source + 0) & 0x003FF) << 10) + 0x10000; + + memcpy(&ulUtf16char, utf16Source + 1, sizeof(FF_T_UINT16)); + if((/*bobtntfullfat *(utf16Source + 1)*/ulUtf16char & 0xFC00) != 0xDC00) { + return FF_ERR_UNICODE_INVALID_SEQUENCE; // Invalid UTF-16 sequence. + } + ulUtf32char |= ((FF_T_UINT32) (/*bobtntfullfat *(utf16Source + 1)*/ulUtf16char & 0x003FF)); + + } else { + ulUtf32char = (FF_T_UINT32) /*bobtntfullfat *utf16Source*/ulUtf16char; + } + + // Now convert to the UTF-8 sequence. + if(ulUtf32char < 0x00000080) { // Single byte UTF-8 sequence. + *(utf8Dest + 0) = (FF_T_UINT8) ulUtf32char; + return 1; + } + + if(ulUtf32char < 0x00000800) { // Double byte UTF-8 sequence. + if(ulSize < 2) { + return FF_ERR_UNICODE_DEST_TOO_SMALL; + } + *(utf8Dest + 0) = (FF_T_UINT8) (0xC0 | ((ulUtf32char >> 6) & 0x1F)); + *(utf8Dest + 1) = (FF_T_UINT8) (0x80 | ((ulUtf32char >> 0) & 0x3F)); + return 2; + } + + if(ulUtf32char < 0x00010000) { // Triple byte UTF-8 sequence. + if(ulSize < 3) { + return FF_ERR_UNICODE_DEST_TOO_SMALL; + } + *(utf8Dest + 0) = (FF_T_UINT8) (0xE0 | ((ulUtf32char >> 12) & 0x0F)); + *(utf8Dest + 1) = (FF_T_UINT8) (0x80 | ((ulUtf32char >> 6 ) & 0x3F)); + *(utf8Dest + 2) = (FF_T_UINT8) (0x80 | ((ulUtf32char >> 0 ) & 0x3F)); + return 3; + } + + if(ulUtf32char < 0x00200000) { // Quadruple byte UTF-8 sequence. + if(ulSize < 4) { + return FF_ERR_UNICODE_DEST_TOO_SMALL; + } + *(utf8Dest + 0) = (FF_T_UINT8) (0xF0 | ((ulUtf32char >> 18) & 0x07)); + *(utf8Dest + 1) = (FF_T_UINT8) (0x80 | ((ulUtf32char >> 12) & 0x3F)); + *(utf8Dest + 2) = (FF_T_UINT8) (0x80 | ((ulUtf32char >> 6 ) & 0x3F)); + *(utf8Dest + 3) = (FF_T_UINT8) (0x80 | ((ulUtf32char >> 0 ) & 0x3F)); + return 4; + } + + return FF_ERR_UNICODE_INVALID_CODE; // Invalid Charachter +} + + +// UTF-16 Support Functions + +// Converts a UTF-32 Charachter into its equivalent UTF-16 sequence. +FF_T_SINT32 FF_Utf32ctoUtf16c(FF_T_UINT16 *utf16Dest, FF_T_UINT32 utf32char, FF_T_UINT32 ulSize) { + + // Check that its a valid UTF-32 wide-char! + + if(utf32char >= 0xD800 && utf32char <= 0xDFFF) { // This range is not a valid Unicode code point. + return FF_ERR_UNICODE_INVALID_CODE; // Invalid charachter. + } + + if(utf32char < 0x10000) { + *utf16Dest = (FF_T_UINT16) utf32char; // Simple conversion! Char comes within UTF-16 space (without surrogates). + return 1; + } + + if(ulSize < 2) { + return FF_ERR_UNICODE_DEST_TOO_SMALL; // Not enough UTF-16 units to record this charachter. + } + + if(utf32char < 0x00200000) { + // Conversion to a UTF-16 Surrogate pair! + //valueImage = utf32char - 0x10000; + + *(utf16Dest + 0) = (FF_T_UINT16) (((utf32char - 0x10000) & 0xFFC00) >> 10) | 0xD800; + *(utf16Dest + 1) = (FF_T_UINT16) (((utf32char - 0x10000) & 0x003FF) >> 00) | 0xDC00; + + return 2; // Surrogate pair encoded value. + } + + return FF_ERR_UNICODE_INVALID_CODE; // Invalid Charachter +} + +// Converts a UTF-16 sequence into its equivalent UTF-32 code point. +FF_T_SINT32 FF_Utf16ctoUtf32c(FF_T_UINT32 *utf32Dest, const FF_T_UINT16 *utf16Source) { + + if((*utf16Source & 0xFC00) != 0xD800) { // Not a surrogate sequence. + *utf32Dest = (FF_T_UINT32) *utf16Source; + return 1; // A single UTF-16 item was used to represent the charachter. + } + + *utf32Dest = ((FF_T_UINT32) (*(utf16Source + 0) & 0x003FF) << 10) + 0x10000; + + if((*(utf16Source + 1) & 0xFC00) != 0xDC00) { + return FF_ERR_UNICODE_INVALID_SEQUENCE; // Invalid UTF-16 sequence. + } + *utf32Dest |= ((FF_T_UINT32) (*(utf16Source + 1) & 0x003FF)); + return 2; // 2 utf-16 units make up the Unicode code-point. +} + + +/* + Returns the total number of UTF-16 items required to represent + the provided UTF-32 string in UTF-16 form. +*/ +/* +FF_T_UINT FF_Utf32GetUtf16Len(const FF_T_UINT32 *utf32String) { + FF_T_UINT utf16len = 0; + + while(*utf32String) { + if(*utf32String++ <= 0xFFFF) { + utf16len++; + } else { + utf16len += 2; + } + } + + return utf16len; +}*/ + + +// String conversions + +FF_T_SINT32 FF_Utf32stoUtf8s(FF_T_UINT8 *Utf8String, FF_T_UINT32 *Utf32String) { + int i = 0,y = 0; + + FF_T_UINT16 utf16buffer[2]; + + while(Utf32String[i]) { + // Convert to a UTF16 char. + FF_Utf32ctoUtf16c(utf16buffer, Utf32String[i], 2); + // Now convert the UTF16 to UTF8 sequence. + y += FF_Utf16ctoUtf8c(&Utf8String[y], utf16buffer, 4); + i++; + } + + Utf8String[y] = '\0'; + + return 0; +} diff --git a/reactos/lib/3rdparty/fullfat/fullfat.rbuild b/reactos/lib/3rdparty/fullfat/fullfat.rbuild index df4d3580b01..754502d6d57 100644 --- a/reactos/lib/3rdparty/fullfat/fullfat.rbuild +++ b/reactos/lib/3rdparty/fullfat/fullfat.rbuild @@ -1,6 +1,6 @@ - + include/reactos/libs/fullfat @@ -10,10 +10,12 @@ ff_error.c ff_fat.c ff_file.c + ff_format.c ff_hash.c ff_ioman.c ff_memory.c ff_safety.c ff_string.c ff_time.c + ff_unicode.c From 50fd13ae9c673275c156002c50ee8e9e6d2fbd4a Mon Sep 17 00:00:00 2001 From: Ged Murphy Date: Sat, 2 Apr 2011 16:37:25 +0000 Subject: [PATCH 057/317] [FULLFAT] - Switch UTF-16 support on throughout the library. svn path=/trunk/; revision=51230 --- reactos/include/reactos/libs/fullfat/ff_config.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/include/reactos/libs/fullfat/ff_config.h b/reactos/include/reactos/libs/fullfat/ff_config.h index 0c8e3f37db2..d8de409f1c6 100644 --- a/reactos/include/reactos/libs/fullfat/ff_config.h +++ b/reactos/include/reactos/libs/fullfat/ff_config.h @@ -51,7 +51,7 @@ //---------- UNICODE SUPPORT -//#define FF_UNICODE_SUPPORT // If this is defined, then all of FullFAT's API's will expect to receive UTF-16 formatted strings. +#define FF_UNICODE_SUPPORT // If this is defined, then all of FullFAT's API's will expect to receive UTF-16 formatted strings. // FF_FindFirst() and FF_FindNext() will also return Filenames in UTF-16 format. // NOTE: This option may cause FullFAT to not "Clean-compile" when using GCC. This is because // pedantically GCC refuses to accept C99 library functions, unless the -std=c99 flag is used. From a27aa839046b19e4177141ffcc8877da3a581fe8 Mon Sep 17 00:00:00 2001 From: Rafal Harabien Date: Sat, 2 Apr 2011 17:51:09 +0000 Subject: [PATCH 058/317] [SYSTEMINFO] Clean it up a bit Prepare for CSV format support svn path=/trunk/; revision=51233 --- .../sysutils/systeminfo/lang/de-DE.rc | 60 +++-- .../sysutils/systeminfo/lang/en-US.rc | 62 +++-- .../sysutils/systeminfo/lang/es-ES.rc | 62 +++-- .../sysutils/systeminfo/lang/fr-FR.rc | 62 +++-- .../sysutils/systeminfo/lang/no-NO.rc | 62 +++-- .../sysutils/systeminfo/lang/pl-PL.rc | 62 +++-- .../sysutils/systeminfo/lang/sk-SK.rc | 62 +++-- .../sysutils/systeminfo/lang/uk-UA.rc | 62 +++-- .../sysutils/systeminfo/resource.h | 54 ++-- .../sysutils/systeminfo/systeminfo.c | 247 ++++++++++-------- 10 files changed, 429 insertions(+), 366 deletions(-) diff --git a/rosapps/applications/sysutils/systeminfo/lang/de-DE.rc b/rosapps/applications/sysutils/systeminfo/lang/de-DE.rc index 287217c99b1..f7a0e476016 100644 --- a/rosapps/applications/sysutils/systeminfo/lang/de-DE.rc +++ b/rosapps/applications/sysutils/systeminfo/lang/de-DE.rc @@ -31,34 +31,38 @@ Beispiele:\n\ SYSTEMINFO /S system /FO LIST\n\ SYSTEMINFO /S system /FO CSV /NH\n" -IDS_HOST_NAME, "Domne: %s\n" -IDS_OS_NAME, "OS Name: %s\n" -IDS_OS_VERSION, "OS Version: %u.%u.%u %s Build %u\n" -IDS_OS_BUILD_TYPE, "OS Build Typ: %s\n" -IDS_REG_OWNER, "Registrierter Benutzer: %s\n" -IDS_REG_ORG, "Registrierte Organisation: %s\n" -IDS_PRODUCT_ID, "Produkt ID: %s\n" -IDS_INST_DATE, "Installationsdatum: %s\n" -IDS_UP_TIME, "System Up Time: %u Days, %u Hours, %u Minutes, %u Seconds\n" -IDS_SYS_MANUFACTURER, "System Manufacturer: %s\n" -IDS_SYS_MODEL, "System Model: %s\n" -IDS_SYS_TYPE, "Systemtyp: %s\n" -IDS_PROCESSORS, "Prozessor(en): %u Prozessor(en) Installiert.\n" -IDS_BIOS_DATE, "BIOS Datum: %s\n" -IDS_BIOS_VERSION, "BIOS Version: %s\n" -IDS_ROS_DIR, "ReactOS Verzeichnis: %s\n" -IDS_SYS_DIR, "System Verzeichnis: %s\n" -IDS_BOOT_DEV, "Startgert: %s\n" -IDS_SYS_LOCALE, "Systemgebietsschema: %s\n" -IDS_INPUT_LOCALE, "Eingabegebietsschema: %s\n" -IDS_TIME_ZONE, "Zeitzone: %s\n" -IDS_TOTAL_PHYS_MEM, "Gesamter Physikalischer Speicher: %s MB\n" -IDS_AVAIL_PHISICAL_MEM, "Verfgbarer Physikalischer Speicher: %s MB\n" -IDS_VIRT_MEM_MAX, "Auslagerungsdatei: Max Gre: %s MB\n" -IDS_VIRT_MEM_AVAIL, "Auslagerungsdatei: Verfgbar: %s MB\n" -IDS_VIRT_MEM_INUSE, "Auslagerungsdatei: In Verwendung: %s MB\n" +IDS_HOST_NAME, "Domne" +IDS_OS_NAME, "OS Name" +IDS_OS_VERSION, "OS Version: Build %u" +IDS_BUILD, "Build" +IDS_OS_BUILD_TYPE, "OS Build Typ" +IDS_REG_OWNER, "Registrierter Benutzer" +IDS_REG_ORG, "Registrierte Organisation" +IDS_PRODUCT_ID, "Produkt ID" +IDS_INST_DATE, "Installationsdatum" +IDS_UP_TIME, "System Up Time" +IDS_UP_TIME_FORMAT "%u Days, %u Hours, %u Minutes, %u Seconds" +IDS_SYS_MANUFACTURER, "System Manufacturer" +IDS_SYS_MODEL, "System Model" +IDS_SYS_TYPE, "Systemtyp" +IDS_PROCESSORS, "Prozessor(en)" +IDS_PROCESSORS_FORMAT, "%u Prozessor(en) Installiert." +IDS_BIOS_DATE, "BIOS Datum" +IDS_BIOS_VERSION, "BIOS Version" +IDS_ROS_DIR, "ReactOS Verzeichnis" +IDS_SYS_DIR, "System Verzeichnis" +IDS_BOOT_DEV, "Startgert" +IDS_SYS_LOCALE, "Systemgebietsschema" +IDS_INPUT_LOCALE, "Eingabegebietsschema" +IDS_TIME_ZONE, "Zeitzone" +IDS_TOTAL_PHYS_MEM, "Gesamter Physikalischer Speicher" +IDS_AVAIL_PHISICAL_MEM, "Verfgbarer Physikalischer Speicher" +IDS_VIRT_MEM_MAX, "Auslagerungsdatei: Max Gre" +IDS_VIRT_MEM_AVAIL, "Auslagerungsdatei: Verfgbar" +IDS_VIRT_MEM_INUSE, "Auslagerungsdatei: In Verwendung" IDS_PAGEFILE_LOC, "Auslagerungsdateipfad(e): %s" -IDS_DOMAIN, "Domain: %s\n" -IDS_NETWORK_CARDS, "Netzwerkkarte(n) %u Installiert.\n" +IDS_DOMAIN, "Domain" +IDS_NETWORK_CARDS, "Netzwerkkarte(n)" +IDS_NETWORK_CARDS_FORMAT, "%u Installiert." END diff --git a/rosapps/applications/sysutils/systeminfo/lang/en-US.rc b/rosapps/applications/sysutils/systeminfo/lang/en-US.rc index aa0c7713a08..05bdb9dac96 100644 --- a/rosapps/applications/sysutils/systeminfo/lang/en-US.rc +++ b/rosapps/applications/sysutils/systeminfo/lang/en-US.rc @@ -29,34 +29,38 @@ Examples:\n\ SYSTEMINFO /S system /FO LIST\n\ SYSTEMINFO /S system /FO CSV /NH\n" -IDS_HOST_NAME, "Host Name: %s\n" -IDS_OS_NAME, "OS Name: %s\n" -IDS_OS_VERSION, "OS Version: %u.%u.%u %s Build %u\n" -IDS_OS_BUILD_TYPE, "OS Build Type: %s\n" -IDS_REG_OWNER, "Registered Owner: %s\n" -IDS_REG_ORG, "Registered Organization: %s\n" -IDS_PRODUCT_ID, "Product ID: %s\n" -IDS_INST_DATE, "Install Date: %s\n" -IDS_UP_TIME, "System Up Time: %u Days, %u Hours, %u Minutes, %u Seconds\n" -IDS_SYS_MANUFACTURER, "System Manufacturer: %s\n" -IDS_SYS_MODEL, "System Model: %s\n" -IDS_SYS_TYPE, "System type: %s\n" -IDS_PROCESSORS, "Processor(s): %u Processor(s) Installed.\n" -IDS_BIOS_DATE, "BIOS Date: %s\n" -IDS_BIOS_VERSION, "BIOS Version: %s\n" -IDS_ROS_DIR, "ReactOS Directory: %s\n" -IDS_SYS_DIR, "System Directory: %s\n" -IDS_BOOT_DEV, "Boot Device: %s\n" -IDS_SYS_LOCALE, "System Locale: %s\n" -IDS_INPUT_LOCALE, "Input Locale: %s\n" -IDS_TIME_ZONE, "Time zone: %s\n" -IDS_TOTAL_PHYS_MEM, "Total Physical Memory: %s MB\n" -IDS_AVAIL_PHISICAL_MEM, "Available Physical Memory: %s MB\n" -IDS_VIRT_MEM_MAX, "Virtual Memory: Max Size: %s MB\n" -IDS_VIRT_MEM_AVAIL, "Virtual Memory: Available: %s MB\n" -IDS_VIRT_MEM_INUSE, "Virtual Memory: In Use: %s MB\n" -IDS_PAGEFILE_LOC, "Page File Location(s): %s\n" -IDS_DOMAIN, "Domain: %s\n" -IDS_NETWORK_CARDS, "Network Card(s) %u Installed.\n" +IDS_HOST_NAME, "Host Name" +IDS_OS_NAME, "OS Name" +IDS_OS_VERSION, "OS Version" +IDS_BUILD, "Build" +IDS_OS_BUILD_TYPE, "OS Build Type" +IDS_REG_OWNER, "Registered Owner" +IDS_REG_ORG, "Registered Organization" +IDS_PRODUCT_ID, "Product ID" +IDS_INST_DATE, "Install Date" +IDS_UP_TIME, "System Up Time" +IDS_UP_TIME_FORMAT "%u Days, %u Hours, %u Minutes, %u Seconds" +IDS_SYS_MANUFACTURER, "System Manufacturer" +IDS_SYS_MODEL, "System Model" +IDS_SYS_TYPE, "System type" +IDS_PROCESSORS, "Processor(s)" +IDS_PROCESSORS_FORMAT, "%u Processor(s) Installed." +IDS_BIOS_DATE, "BIOS Date" +IDS_BIOS_VERSION, "BIOS Version" +IDS_ROS_DIR, "ReactOS Directory" +IDS_SYS_DIR, "System Directory" +IDS_BOOT_DEV, "Boot Device" +IDS_SYS_LOCALE, "System Locale" +IDS_INPUT_LOCALE, "Input Locale" +IDS_TIME_ZONE, "Time zone" +IDS_TOTAL_PHYS_MEM, "Total Physical Memory" +IDS_AVAIL_PHISICAL_MEM, "Available Physical Memory" +IDS_VIRT_MEM_MAX, "Virtual Memory: Max Size" +IDS_VIRT_MEM_AVAIL, "Virtual Memory: Available" +IDS_VIRT_MEM_INUSE, "Virtual Memory: In Use" +IDS_PAGEFILE_LOC, "Page File Location(s)" +IDS_DOMAIN, "Domain" +IDS_NETWORK_CARDS, "Network Card(s)" +IDS_NETWORK_CARDS_FORMAT, "%u Installed." END diff --git a/rosapps/applications/sysutils/systeminfo/lang/es-ES.rc b/rosapps/applications/sysutils/systeminfo/lang/es-ES.rc index c9ec95f6a78..b57be05cf12 100644 --- a/rosapps/applications/sysutils/systeminfo/lang/es-ES.rc +++ b/rosapps/applications/sysutils/systeminfo/lang/es-ES.rc @@ -34,34 +34,38 @@ Ejemplos:\n\ SYSTEMINFO /S sistema /FO LIST\n\ SYSTEMINFO /S sistema /FO CSV /NH\n" -IDS_HOST_NAME, "Nombre del Servidor: %s\n" -IDS_OS_NAME, "Nombre Sistema Operativo: %s\n" -IDS_OS_VERSION, "Versin Sistema Operativo: %u.%u.%u %s Compilacin %u\n" -IDS_OS_BUILD_TYPE, "Tipo Compilacin: %s\n" -IDS_REG_OWNER, "Propietario: %s\n" -IDS_REG_ORG, "Organizacin: %s\n" -IDS_PRODUCT_ID, "Identificador de Producto %s\n" -IDS_INST_DATE, "Fecha de Instalacin: %s\n" -IDS_UP_TIME, "System Up Time: %u Days, %u Hours, %u Minutes, %u Seconds\n" -IDS_SYS_MANUFACTURER, "System Manufacturer: %s\n" -IDS_SYS_MODEL, "System Model: %s\n" -IDS_SYS_TYPE, "Tipo de sistema: %s\n" -IDS_PROCESSORS, "Procesador(es): %u Procesador(es) Instalados.\n" -IDS_BIOS_DATE, "Fecha BIOS: %s\n" -IDS_BIOS_VERSION, "Versin BIOS: %s\n" -IDS_ROS_DIR, "Directorio de ReactOS: %s\n" -IDS_SYS_DIR, "Directorio del Sistema: %s\n" -IDS_BOOT_DEV, "Dispositivo de Inicio: %s\n" -IDS_SYS_LOCALE, "Idioma del sistema: %s\n" -IDS_INPUT_LOCALE, "Idioma de entrada: %s\n" -IDS_TIME_ZONE, "Zona horario: %s\n" -IDS_TOTAL_PHYS_MEM, "Memoria Fsica Total: %s MB\n" -IDS_AVAIL_PHISICAL_MEM, "Memoria Fsica Disponible: %s MB\n" -IDS_VIRT_MEM_MAX, "Memoria Virtual: Tamao Mx: %s MB\n" -IDS_VIRT_MEM_AVAIL, "Memoria Virtual: Disponible: %s MB\n" -IDS_VIRT_MEM_INUSE, "Memoria Virtual: En Uso: %s MB\n" -IDS_PAGEFILE_LOC, "Ruta(s) Archivo Paginacin: %s\n" -IDS_DOMAIN, "Dominio: %s\n" -IDS_NETWORK_CARDS, "Tarjeta(s) de Red %u No Instalada.\n" +IDS_HOST_NAME, "Nombre del Servidor" +IDS_OS_NAME, "Nombre Sistema Operativo" +IDS_OS_VERSION, "Versin Sistema Operativo" +IDS_BUILD, "Compilacin" +IDS_OS_BUILD_TYPE, "Tipo Compilacin" +IDS_REG_OWNER, "Propietario" +IDS_REG_ORG, "Organizacin" +IDS_PRODUCT_ID, "Identificador de Producto" +IDS_INST_DATE, "Fecha de Instalacin" +IDS_UP_TIME, "System Up Time" +IDS_UP_TIME_FORMAT "%u Days, %u Hours, %u Minutes, %u Seconds" +IDS_SYS_MANUFACTURER, "System Manufacturer" +IDS_SYS_MODEL, "System Model" +IDS_SYS_TYPE, "Tipo de sistema" +IDS_PROCESSORS, "Procesador(es)" +IDS_PROCESSORS_FORMAT, "%u Procesador(es) Instalados." +IDS_BIOS_DATE, "Fecha BIOS" +IDS_BIOS_VERSION, "Versin BIOS" +IDS_ROS_DIR, "Directorio de ReactOS" +IDS_SYS_DIR, "Directorio del Sistema" +IDS_BOOT_DEV, "Dispositivo de Inicio" +IDS_SYS_LOCALE, "Idioma del sistema" +IDS_INPUT_LOCALE, "Idioma de entrada" +IDS_TIME_ZONE, "Zona horario" +IDS_TOTAL_PHYS_MEM, "Memoria Fsica Total" +IDS_AVAIL_PHISICAL_MEM, "Memoria Fsica Disponible" +IDS_VIRT_MEM_MAX, "Memoria Virtual: Tamao Mx" +IDS_VIRT_MEM_AVAIL, "Memoria Virtual: Disponible" +IDS_VIRT_MEM_INUSE, "Memoria Virtual: En Uso" +IDS_PAGEFILE_LOC, "Ruta(s) Archivo Paginacin" +IDS_DOMAIN, "Dominio" +IDS_NETWORK_CARDS, "Tarjeta(s) de Red" +IDS_NETWORK_CARDS_FORMAT, "%u No Instalada." END diff --git a/rosapps/applications/sysutils/systeminfo/lang/fr-FR.rc b/rosapps/applications/sysutils/systeminfo/lang/fr-FR.rc index 82b5a62f84d..88eb9c06d4c 100644 --- a/rosapps/applications/sysutils/systeminfo/lang/fr-FR.rc +++ b/rosapps/applications/sysutils/systeminfo/lang/fr-FR.rc @@ -29,34 +29,38 @@ Exemples:\n\ SYSTEMINFO /S systme /FO LIST\n\ SYSTEMINFO /S systme /FO CSV /NH\n" -IDS_HOST_NAME, "Nom d'hte : %s\n" -IDS_OS_NAME, "Nom du systme d'exploitation : %s\n" -IDS_OS_VERSION, "Version du systme d'exploitation : %u.%u.%u %s Compilation %u\n" -IDS_OS_BUILD_TYPE, "Type de compilation du systme d'exploitation : %s\n" -IDS_REG_OWNER, "Propritaire enregistr : %s\n" -IDS_REG_ORG, "Organisation enregistre : %s\n" -IDS_PRODUCT_ID, "ID du produit : %s\n" -IDS_INST_DATE, "Date d'installation : %s\n" -IDS_UP_TIME, "System Up Time: %u Days, %u Hours, %u Minutes, %u Seconds\n" -IDS_SYS_MANUFACTURER, "System Manufacturer: %s\n" -IDS_SYS_MODEL, "System Model: %s\n" -IDS_SYS_TYPE, "Type du systme : %s\n" -IDS_PROCESSORS, "Processeur(s) : %u Processeur(s) install(s).\n" -IDS_BIOS_DATE, "Date du BIOS : %s\n" -IDS_BIOS_VERSION, "Version du BIOS : %s\n" -IDS_ROS_DIR, "Rpertoire ReactOS : %s\n" -IDS_SYS_DIR, "Rpertoire systme : %s\n" -IDS_BOOT_DEV, "Priphrique de dmarrage : %s\n" -IDS_SYS_LOCALE, "Paramtre rgional du systme : %s\n" -IDS_INPUT_LOCALE, "Paramtre rgional de saisie : %s\n" -IDS_TIME_ZONE, "Fuseau horaire : %s\n" -IDS_TOTAL_PHYS_MEM, "Mmoire physique totale : %s Mo\n" -IDS_AVAIL_PHISICAL_MEM, "Mmoire physique disponible : %s Mo\n" -IDS_VIRT_MEM_MAX, "Mmoire virtuelle: Taille max : %s Mo\n" -IDS_VIRT_MEM_AVAIL, "Mmoire virtuelle: Disponible : %s Mo\n" -IDS_VIRT_MEM_INUSE, "Mmoire virtuelle: Utilise : %s Mo\n" -IDS_PAGEFILE_LOC, "Emplacement(s) des fichiers d'change : %s" -IDS_DOMAIN, "Domaine : %s\n" -IDS_NETWORK_CARDS, "Carte(s) rseau %u installe(s).\n" +IDS_HOST_NAME, "Nom d'hte" +IDS_OS_NAME, "Nom du systme d'exploitation" +IDS_OS_VERSION, "Version du systme d'exploitation" +IDS_BUILD, "Compilation" +IDS_OS_BUILD_TYPE, "Type de compilation du systme d'exploitation" +IDS_REG_OWNER, "Propritaire enregistr" +IDS_REG_ORG, "Organisation enregistre" +IDS_PRODUCT_ID, "ID du produit" +IDS_INST_DATE, "Date d'installation" +IDS_UP_TIME, "System Up Time" +IDS_UP_TIME_FORMAT "%u Days, %u Hours, %u Minutes, %u Seconds" +IDS_SYS_MANUFACTURER, "System Manufacturer" +IDS_SYS_MODEL, "System Model" +IDS_SYS_TYPE, "Type du systme" +IDS_PROCESSORS, "Processeur(s)" +IDS_PROCESSORS_FORMAT, "%u Processeur(s) install(s)." +IDS_BIOS_DATE, "Date du BIOS" +IDS_BIOS_VERSION, "Version du BIOS" +IDS_ROS_DIR, "Rpertoire ReactOS" +IDS_SYS_DIR, "Rpertoire systme" +IDS_BOOT_DEV, "Priphrique de dmarrage" +IDS_SYS_LOCALE, "Paramtre rgional du systme" +IDS_INPUT_LOCALE, "Paramtre rgional de saisie" +IDS_TIME_ZONE, "Fuseau horaire" +IDS_TOTAL_PHYS_MEM, "Mmoire physique totale" +IDS_AVAIL_PHISICAL_MEM, "Mmoire physique disponible" +IDS_VIRT_MEM_MAX, "Mmoire virtuelle: Taille max" +IDS_VIRT_MEM_AVAIL, "Mmoire virtuelle: Disponible" +IDS_VIRT_MEM_INUSE, "Mmoire virtuelle: Utilise" +IDS_PAGEFILE_LOC, "Emplacement(s) des fichiers d'change" +IDS_DOMAIN, "Domaine" +IDS_NETWORK_CARDS, "Carte(s) rseau" +IDS_NETWORK_CARDS_FORMAT, "%u installe(s)." END diff --git a/rosapps/applications/sysutils/systeminfo/lang/no-NO.rc b/rosapps/applications/sysutils/systeminfo/lang/no-NO.rc index 7f92fe924a3..af655d38478 100644 --- a/rosapps/applications/sysutils/systeminfo/lang/no-NO.rc +++ b/rosapps/applications/sysutils/systeminfo/lang/no-NO.rc @@ -29,34 +29,38 @@ Eksempler:\n\ SYSTEMINFO /S system /FO LIST\n\ SYSTEMINFO /S system /FO CSV /NH\n" -IDS_HOST_NAME, "Datamaskin navn: %s\n" -IDS_OS_NAME, "OS navn: %s\n" -IDS_OS_VERSION, "OS versjon: %u.%u.%u %s Bygget %u\n" -IDS_OS_BUILD_TYPE, "OS bygg type: %s\n" -IDS_REG_OWNER, "Registert eier: %s\n" -IDS_REG_ORG, "Registerert organisasjon: %s\n" -IDS_PRODUCT_ID, "Produkt ID: %s\n" -IDS_INST_DATE, "Installert dato: %s\n" -IDS_UP_TIME, "System Up Time: %u Days, %u Hours, %u Minutes, %u Seconds\n" -IDS_SYS_MANUFACTURER, "System Manufacturer: %s\n" -IDS_SYS_MODEL, "System Model: %s\n" -IDS_SYS_TYPE, "Systemtype: %s\n" -IDS_PROCESSORS, "Prosessor(er): %u Prosessor(er) installert.\n" -IDS_BIOS_DATE, "BIOS dato: %s\n" -IDS_BIOS_VERSION, "BIOS Versjon: %s\n" -IDS_ROS_DIR, "ReactOS mappe: %s\n" -IDS_SYS_DIR, "System mappe: %s\n" -IDS_BOOT_DEV, "Oppstartsenhet: %s\n" -IDS_SYS_LOCALE, "System lokal: %s\n" -IDS_INPUT_LOCALE, "Input lokal: %s\n" -IDS_TIME_ZONE, "Tidssone: %s\n" -IDS_TOTAL_PHYS_MEM, "Total fysisk minne: %s MB\n" -IDS_AVAIL_PHISICAL_MEM, "Tilgjengelig fysisk minne: %s MB\n" -IDS_VIRT_MEM_MAX, "Virtuelt minne: Maks Strrelse: %s MB\n" -IDS_VIRT_MEM_AVAIL, "Virtuelt minne: Tilgjengelig: %s MB\n" -IDS_VIRT_MEM_INUSE, "Virtuelt minne: i bruk: %s MB\n" -IDS_PAGEFILE_LOC, "Sidevekslingsfil lokalsjon(er): %s\n" -IDS_DOMAIN, "Domene: %s\n" -IDS_NETWORK_CARDS, "Nettverkskort(er) %u installert.\n" +IDS_HOST_NAME, "Datamaskin navn" +IDS_OS_NAME, "OS navn" +IDS_OS_VERSION, "OS versjon" +IDS_BUILD, "Bygget" +IDS_OS_BUILD_TYPE, "OS bygg type" +IDS_REG_OWNER, "Registert eier" +IDS_REG_ORG, "Registerert organisasjon" +IDS_PRODUCT_ID, "Produkt ID" +IDS_INST_DATE, "Installert dato" +IDS_UP_TIME, "System Up Time" +IDS_UP_TIME_FORMAT "%u Days, %u Hours, %u Minutes, %u Seconds" +IDS_SYS_MANUFACTURER, "System Manufacturer" +IDS_SYS_MODEL, "System Model" +IDS_SYS_TYPE, "Systemtype" +IDS_PROCESSORS, "Prosessor(er)" +IDS_PROCESSORS_FORMAT, "%u Prosessor(er) installert." +IDS_BIOS_DATE, "BIOS dato" +IDS_BIOS_VERSION, "BIOS Versjon" +IDS_ROS_DIR, "ReactOS mappe" +IDS_SYS_DIR, "System mappe" +IDS_BOOT_DEV, "Oppstartsenhet" +IDS_SYS_LOCALE, "System lokal" +IDS_INPUT_LOCALE, "Input lokal" +IDS_TIME_ZONE, "Tidssone" +IDS_TOTAL_PHYS_MEM, "Total fysisk minne" +IDS_AVAIL_PHISICAL_MEM, "Tilgjengelig fysisk minne" +IDS_VIRT_MEM_MAX, "Virtuelt minne: Maks Strrelse" +IDS_VIRT_MEM_AVAIL, "Virtuelt minne: Tilgjengelig" +IDS_VIRT_MEM_INUSE, "Virtuelt minne: i bruk" +IDS_PAGEFILE_LOC, "Sidevekslingsfil lokalsjon(er)" +IDS_DOMAIN, "Domene" +IDS_NETWORK_CARDS, "Nettverkskort(er)" +IDS_NETWORK_CARDS_FORMAT, "%u installert." END diff --git a/rosapps/applications/sysutils/systeminfo/lang/pl-PL.rc b/rosapps/applications/sysutils/systeminfo/lang/pl-PL.rc index fc92954bd17..c18a60935c2 100644 --- a/rosapps/applications/sysutils/systeminfo/lang/pl-PL.rc +++ b/rosapps/applications/sysutils/systeminfo/lang/pl-PL.rc @@ -36,34 +36,38 @@ Przyk SYSTEMINFO /S system /FO LIST\n\ SYSTEMINFO /S system /FO CSV /NH\n" -IDS_HOST_NAME, "Nazwa hosta: %s\n" -IDS_OS_NAME, "Nazwa Systemu: %s\n" -IDS_OS_VERSION, "Wersja: %u.%u.%u %s Kompilacja %u\n" -IDS_OS_BUILD_TYPE, "Rodzaj kompilacji: %s\n" -IDS_REG_OWNER, "Uytkownik: %s\n" -IDS_REG_ORG, "Organizacja: %s\n" -IDS_PRODUCT_ID, "ID produktu: %s\n" -IDS_INST_DATE, "Data instalacji: %s\n" -IDS_UP_TIME, "Czas pracy systemu: %u dni, %u godzin, %u minut, %u sekund\n" -IDS_SYS_MANUFACTURER, "Producent systemu: %s\n" -IDS_SYS_MODEL, "Model systemu: %s\n" -IDS_SYS_TYPE, "Rodzaj systemu: %s\n" -IDS_PROCESSORS, "Ilo Procesorw: %u.\n" -IDS_BIOS_DATE, "Data BIOSu: %s\n" -IDS_BIOS_VERSION, "Wersja BIOSu: %s\n" -IDS_ROS_DIR, "Katalog ReactOS: %s\n" -IDS_SYS_DIR, "Katalog Systemowy: %s\n" -IDS_BOOT_DEV, "Urzdzenie rdowe: %s\n" -IDS_SYS_LOCALE, "Wersja lokalizacji: %s\n" -IDS_INPUT_LOCALE, "Lokalizacja klawiatury: %s\n" -IDS_TIME_ZONE, "Strefa czasowa: %s\n" -IDS_TOTAL_PHYS_MEM, "Pamici fizycznej ogem: %s MB\n" -IDS_AVAIL_PHISICAL_MEM, "Dostpnej pamici fizycznej: %s MB\n" -IDS_VIRT_MEM_MAX, "Pamici wirtualnej: maksymalnie: %s MB\n" -IDS_VIRT_MEM_AVAIL, "Pamici wirtualnej: dostpne: %s MB\n" -IDS_VIRT_MEM_INUSE, "Pamici wirtualnej: w uyciu: %s MB\n" -IDS_PAGEFILE_LOC, "Lokalizacja pliku wymiany: %s\n" -IDS_DOMAIN, "Domena: %s\n" -IDS_NETWORK_CARDS, "Liczba kart sieciowych %u.\n" +IDS_HOST_NAME, "Nazwa hosta" +IDS_OS_NAME, "Nazwa systemu" +IDS_OS_VERSION, "Wersja systemu" +IDS_BUILD, "Kompilacja" +IDS_OS_BUILD_TYPE, "Rodzaj kompilacji" +IDS_REG_OWNER, "Uytkownik" +IDS_REG_ORG, "Organizacja" +IDS_PRODUCT_ID, "ID produktu" +IDS_INST_DATE, "Data instalacji" +IDS_UP_TIME, "Czas pracy systemu" +IDS_UP_TIME_FORMAT "%u dni, %u godzin, %u minut, %u sekund" +IDS_SYS_MANUFACTURER, "Producent systemu" +IDS_SYS_MODEL, "Model systemu" +IDS_SYS_TYPE, "Rodzaj systemu" +IDS_PROCESSORS, "Procesory" +IDS_PROCESSORS_FORMAT, "Zainstalowane procesory: %u." +IDS_BIOS_DATE, "Data BIOSu" +IDS_BIOS_VERSION, "Wersja BIOSu" +IDS_ROS_DIR, "Katalog ReactOS" +IDS_SYS_DIR, "Katalog Systemowy" +IDS_BOOT_DEV, "Urzdzenie rdowe" +IDS_SYS_LOCALE, "Wersja lokalizacji" +IDS_INPUT_LOCALE, "Lokalizacja klawiatury" +IDS_TIME_ZONE, "Strefa czasowa" +IDS_TOTAL_PHYS_MEM, "Pamici fizycznej ogem" +IDS_AVAIL_PHISICAL_MEM, "Dostpnej pamici fizycznej" +IDS_VIRT_MEM_MAX, "Pamici wirtualnej: maksymalnie" +IDS_VIRT_MEM_AVAIL, "Pamici wirtualnej: dostpne" +IDS_VIRT_MEM_INUSE, "Pamici wirtualnej: w uyciu" +IDS_PAGEFILE_LOC, "Lokalizacja pliku wymiany" +IDS_DOMAIN, "Domena" +IDS_NETWORK_CARDS, "Karty sieciowe" +IDS_NETWORK_CARDS_FORMAT, "Zainstalowane karty NIC: %u." END diff --git a/rosapps/applications/sysutils/systeminfo/lang/sk-SK.rc b/rosapps/applications/sysutils/systeminfo/lang/sk-SK.rc index 474373b7744..7da44551e49 100644 --- a/rosapps/applications/sysutils/systeminfo/lang/sk-SK.rc +++ b/rosapps/applications/sysutils/systeminfo/lang/sk-SK.rc @@ -33,34 +33,38 @@ Examples:\n\ SYSTEMINFO /S system /FO LIST\n\ SYSTEMINFO /S system /FO CSV /NH\n" -IDS_HOST_NAME, "Host Name: %s\n" -IDS_OS_NAME, "Nzov OS: %s\n" -IDS_OS_VERSION, "Verzia OS: %u.%u.%u %s Build %u\n" -IDS_OS_BUILD_TYPE, "OS Build typ: %s\n" -IDS_REG_OWNER, "Registovan vlastnk: %s\n" -IDS_REG_ORG, "Registrovan organizcia: %s\n" -IDS_PRODUCT_ID, "ID produktu: %s\n" -IDS_INST_DATE, "Dtum intalcie: %s\n" -IDS_UP_TIME, "System Up Time: %u Days, %u Hours, %u Minutes, %u Seconds\n" -IDS_SYS_MANUFACTURER, "System Manufacturer: %s\n" -IDS_SYS_MODEL, "System Model: %s\n" -IDS_SYS_TYPE, "Typ systmu: %s\n" -IDS_PROCESSORS, "Procesor(y): %u Procesor(y) naintalovan.\n" -IDS_BIOS_DATE, "Dtum BIOSu: %s\n" -IDS_BIOS_VERSION, "Verzia BIOSu: %s\n" -IDS_ROS_DIR, "Adresr ReactOS: %s\n" -IDS_SYS_DIR, "Adresr System: %s\n" -IDS_BOOT_DEV, "Zavdzacie zariadenie: %s\n" -IDS_SYS_LOCALE, "System Locale: %s\n" -IDS_INPUT_LOCALE, "Input Locale: %s\n" -IDS_TIME_ZONE, "asov psmo: %s\n" -IDS_TOTAL_PHYS_MEM, "Celkov fyzick pam: %s MB\n" -IDS_AVAIL_PHISICAL_MEM, "Dostupn fyzick pam: %s MB\n" -IDS_VIRT_MEM_MAX, "Virtulna pam: Max Size: %s MB\n" -IDS_VIRT_MEM_AVAIL, "Virtulna pam: Available: %s MB\n" -IDS_VIRT_MEM_INUSE, "Virtulna pam: In Use: %s MB\n" -IDS_PAGEFILE_LOC, "Umiestnenie(a) strnkovacieho sboru: %s\n" -IDS_DOMAIN, "Domna: %s\n" -IDS_NETWORK_CARDS, "Sieov karta(y) %u naintalovan.\n" +IDS_HOST_NAME, "Host Name" +IDS_OS_NAME, "Nzov OS" +IDS_OS_VERSION, "Verzia OS" +IDS_BUILD, "Build" +IDS_OS_BUILD_TYPE, "OS Build typ" +IDS_REG_OWNER, "Registovan vlastnk" +IDS_REG_ORG, "Registrovan organizcia" +IDS_PRODUCT_ID, "ID produktu" +IDS_INST_DATE, "Dtum intalcie" +IDS_UP_TIME, "System Up Time" +IDS_UP_TIME_FORMAT "%u Days, %u Hours, %u Minutes, %u Seconds" +IDS_SYS_MANUFACTURER, "System Manufacturer" +IDS_SYS_MODEL, "System Model" +IDS_SYS_TYPE, "Typ systmu" +IDS_PROCESSORS, "Procesor(y)" +IDS_PROCESSORS_FORMAT, "%u Procesor(y) naintalovan." +IDS_BIOS_DATE, "Dtum BIOSu" +IDS_BIOS_VERSION, "Verzia BIOSu" +IDS_ROS_DIR, "Adresr ReactOS" +IDS_SYS_DIR, "Adresr System" +IDS_BOOT_DEV, "Zavdzacie zariadenie" +IDS_SYS_LOCALE, "System Locale" +IDS_INPUT_LOCALE, "Input Locale" +IDS_TIME_ZONE, "asov psmo" +IDS_TOTAL_PHYS_MEM, "Celkov fyzick pam" +IDS_AVAIL_PHISICAL_MEM, "Dostupn fyzick pam" +IDS_VIRT_MEM_MAX, "Virtulna pam: Max Size" +IDS_VIRT_MEM_AVAIL, "Virtulna pam: Available" +IDS_VIRT_MEM_INUSE, "Virtulna pam: In Use" +IDS_PAGEFILE_LOC, "Umiestnenie(a) strnkovacieho sboru" +IDS_DOMAIN, "Domna" +IDS_NETWORK_CARDS, "Sieov karta(y)" +IDS_NETWORK_CARDS_FORMAT, "%u naintalovan." END diff --git a/rosapps/applications/sysutils/systeminfo/lang/uk-UA.rc b/rosapps/applications/sysutils/systeminfo/lang/uk-UA.rc index a0c8f57674f..08e575c3fb8 100644 --- a/rosapps/applications/sysutils/systeminfo/lang/uk-UA.rc +++ b/rosapps/applications/sysutils/systeminfo/lang/uk-UA.rc @@ -37,34 +37,38 @@ IDS_USAGE, "SYSTEMINFO [/S SYSTEMINFO /S /FO LIST\n\ SYSTEMINFO /S /FO CSV /NH\n" -IDS_HOST_NAME, "' ': %s\n" -IDS_OS_NAME, "' : %s\n" -IDS_OS_VERSION, " : %u.%u.%u %s %u\n" -IDS_OS_BUILD_TYPE, " : %s\n" -IDS_REG_OWNER, " : %s\n" -IDS_REG_ORG, " : %s\n" -IDS_PRODUCT_ID, "ID : %s\n" -IDS_INST_DATE, " : %s\n" -IDS_UP_TIME, "System Up Time: %u Days, %u Hours, %u Minutes, %u Seconds\n" -IDS_SYS_MANUFACTURER, "System Manufacturer: %s\n" -IDS_SYS_MODEL, "System Model: %s\n" -IDS_SYS_TYPE, " : %s\n" -IDS_PROCESSORS, "(): %u (,) .\n" -IDS_BIOS_DATE, " BIOS: %s\n" -IDS_BIOS_VERSION, " BIOS: %s\n" -IDS_ROS_DIR, " ReactOS: %s\n" -IDS_SYS_DIR, " : %s\n" -IDS_BOOT_DEV, " : %s\n" -IDS_SYS_LOCALE, " : %s\n" -IDS_INPUT_LOCALE, " : %s\n" -IDS_TIME_ZONE, " : %s\n" -IDS_TOTAL_PHYS_MEM, " ': %s \n" -IDS_AVAIL_PHISICAL_MEM, " ': %s \n" -IDS_VIRT_MEM_MAX, "³ ': . : %s \n" -IDS_VIRT_MEM_AVAIL, "³ ': : %s \n" -IDS_VIRT_MEM_INUSE, "³ ': .: %s \n" -IDS_PAGEFILE_LOC, " : %s\n" -IDS_DOMAIN, ": %s\n" -IDS_NETWORK_CARDS, " () %u Installed.\n" +IDS_HOST_NAME, "' '" +IDS_OS_NAME, "' " +IDS_OS_VERSION, " " +IDS_BUILD, "" +IDS_OS_BUILD_TYPE, " " +IDS_REG_OWNER, " " +IDS_REG_ORG, " " +IDS_PRODUCT_ID, "ID " +IDS_INST_DATE, " " +IDS_UP_TIME, "System Up Time" +IDS_UP_TIME_FORMAT "%u Days, %u Hours, %u Minutes, %u Seconds" +IDS_SYS_MANUFACTURER, "System Manufacturer" +IDS_SYS_MODEL, "System Model" +IDS_SYS_TYPE, " " +IDS_PROCESSORS, "()" +IDS_PROCESSORS_FORMAT, "%u (,) ." +IDS_BIOS_DATE, " BIOS" +IDS_BIOS_VERSION, " BIOS" +IDS_ROS_DIR, " ReactOS" +IDS_SYS_DIR, " " +IDS_BOOT_DEV, " " +IDS_SYS_LOCALE, " " +IDS_INPUT_LOCALE, " " +IDS_TIME_ZONE, " " +IDS_TOTAL_PHYS_MEM, " '" +IDS_AVAIL_PHISICAL_MEM, " '" +IDS_VIRT_MEM_MAX, "³ ': . " +IDS_VIRT_MEM_AVAIL, "³ ': " +IDS_VIRT_MEM_INUSE, "³ ': ." +IDS_PAGEFILE_LOC, " " +IDS_DOMAIN, "" +IDS_NETWORK_CARDS, " ()" +IDS_NETWORK_CARDS_FORMAT, "%u Installed." END diff --git a/rosapps/applications/sysutils/systeminfo/resource.h b/rosapps/applications/sysutils/systeminfo/resource.h index c50f3bd74e8..c69f6f5a20d 100644 --- a/rosapps/applications/sysutils/systeminfo/resource.h +++ b/rosapps/applications/sysutils/systeminfo/resource.h @@ -3,29 +3,33 @@ #define IDS_HOST_NAME 100 #define IDS_OS_NAME 101 #define IDS_OS_VERSION 102 -#define IDS_OS_BUILD_TYPE 103 -#define IDS_REG_OWNER 104 -#define IDS_REG_ORG 105 -#define IDS_PRODUCT_ID 106 -#define IDS_INST_DATE 107 +#define IDS_BUILD 103 +#define IDS_OS_BUILD_TYPE 104 +#define IDS_REG_OWNER 105 +#define IDS_REG_ORG 106 +#define IDS_PRODUCT_ID 107 +#define IDS_INST_DATE 108 #define IDS_UP_TIME 109 -#define IDS_SYS_MANUFACTURER 110 -#define IDS_SYS_MODEL 111 -#define IDS_SYS_TYPE 112 -#define IDS_PROCESSORS 113 -#define IDS_BIOS_DATE 114 -#define IDS_BIOS_VERSION 115 -#define IDS_ROS_DIR 116 -#define IDS_SYS_DIR 117 -#define IDS_BOOT_DEV 118 -#define IDS_SYS_LOCALE 119 -#define IDS_INPUT_LOCALE 120 -#define IDS_TOTAL_PHYS_MEM 121 -#define IDS_AVAIL_PHISICAL_MEM 122 -#define IDS_VIRT_MEM_MAX 123 -#define IDS_VIRT_MEM_AVAIL 124 -#define IDS_VIRT_MEM_INUSE 125 -#define IDS_PAGEFILE_LOC 126 -#define IDS_TIME_ZONE 127 -#define IDS_DOMAIN 128 -#define IDS_NETWORK_CARDS 130 +#define IDS_UP_TIME_FORMAT 110 +#define IDS_SYS_MANUFACTURER 111 +#define IDS_SYS_MODEL 112 +#define IDS_SYS_TYPE 113 +#define IDS_PROCESSORS 114 +#define IDS_PROCESSORS_FORMAT 115 +#define IDS_BIOS_DATE 116 +#define IDS_BIOS_VERSION 117 +#define IDS_ROS_DIR 118 +#define IDS_SYS_DIR 119 +#define IDS_BOOT_DEV 120 +#define IDS_SYS_LOCALE 121 +#define IDS_INPUT_LOCALE 122 +#define IDS_TOTAL_PHYS_MEM 123 +#define IDS_AVAIL_PHISICAL_MEM 124 +#define IDS_VIRT_MEM_MAX 125 +#define IDS_VIRT_MEM_AVAIL 126 +#define IDS_VIRT_MEM_INUSE 127 +#define IDS_PAGEFILE_LOC 128 +#define IDS_TIME_ZONE 129 +#define IDS_DOMAIN 130 +#define IDS_NETWORK_CARDS 131 +#define IDS_NETWORK_CARDS_FORMAT 132 diff --git a/rosapps/applications/sysutils/systeminfo/systeminfo.c b/rosapps/applications/sysutils/systeminfo/systeminfo.c index 49503679c2b..d9ebe2a6e62 100644 --- a/rosapps/applications/sysutils/systeminfo/systeminfo.c +++ b/rosapps/applications/sysutils/systeminfo/systeminfo.c @@ -19,6 +19,7 @@ #include #include #include +#include #include #include #include @@ -42,11 +43,11 @@ GetOemStrings(UINT rcID, LPWSTR OutMsg) /* Load data from registry */ static -BOOL -RegGetSZ(HKEY hKey, LPCWSTR lpSubKey, LPCWSTR lpValueName, LPWSTR Buf) +unsigned +RegGetSZ(HKEY hKey, LPCWSTR lpSubKey, LPCWSTR lpValueName, LPWSTR lpBuf, DWORD cchBuf) { - DWORD dwBytes = BUFFER_SIZE*sizeof(WCHAR), dwType; - BOOL bRet = TRUE; + DWORD dwBytes = cchBuf*sizeof(WCHAR), dwType; + unsigned cChars; /* If SubKy is specified open it */ if (lpSubKey && RegOpenKeyExW(hKey, @@ -56,29 +57,34 @@ RegGetSZ(HKEY hKey, LPCWSTR lpSubKey, LPCWSTR lpValueName, LPWSTR Buf) &hKey) != ERROR_SUCCESS) { wprintf(L"Warning! Cannot open %s. Last error: %lu.\n", lpSubKey, GetLastError()); - return FALSE; + return 0; } if (RegQueryValueExW(hKey, lpValueName, NULL, &dwType, - (LPBYTE)Buf, + (LPBYTE)lpBuf, &dwBytes) != ERROR_SUCCESS || (dwType != REG_SZ && dwType != REG_MULTI_SZ)) { wprintf(L"Warning! Cannot query %s. Last error: %lu, type: %lu.\n", lpValueName, GetLastError(), dwType); dwBytes = 0; - bRet = FALSE; } /* Close key if we opened it */ if (lpSubKey) RegCloseKey(hKey); - /* NULL-terminate string */ - Buf[min(BUFFER_SIZE-1, dwBytes/sizeof(WCHAR))] = L'\0'; + cChars = dwBytes/sizeof(WCHAR); - return bRet; + /* NULL-terminate string */ + lpBuf[min(cchBuf-1, cChars)] = L'\0'; + + /* Don't count NULL characters */ + while(cChars && !lpBuf[cChars-1]) + --cChars; + + return cChars; } static @@ -119,11 +125,12 @@ RegGetDWORD(HKEY hKey, LPCWSTR lpSubKey, LPCWSTR lpValueName, LPDWORD lpData) } static -void -FormatBytes(LPWSTR Buf, unsigned cBytes) +VOID +FormatBytes(LPWSTR lpBuf, unsigned cBytes) { WCHAR szMB[32]; NUMBERFMTW fmt; + unsigned i; _itow(cBytes / (1024*1024), szMB, 10); @@ -134,15 +141,17 @@ FormatBytes(LPWSTR Buf, unsigned cBytes) fmt.lpThousandSep = L" "; fmt.NegativeOrder = 0; - if(!GetNumberFormatW(LOCALE_SYSTEM_DEFAULT, 0, szMB, &fmt, Buf, BUFFER_SIZE)) - wprintf(L"Error! GetNumberFormat failed.\n"); + i = GetNumberFormatW(LOCALE_SYSTEM_DEFAULT, 0, szMB, &fmt, lpBuf, BUFFER_SIZE - 3); + if (i) + --i; /* don't count NULL character */ + wcscpy(lpBuf + i, L" MB"); } static -void +VOID FormatDateTime(time_t Time, LPWSTR lpBuf) { - unsigned cchBuf = BUFFER_SIZE, i; + unsigned i; SYSTEMTIME SysTime; const struct tm *lpTm; @@ -156,14 +165,15 @@ FormatDateTime(time_t Time, LPWSTR lpBuf) SysTime.wSecond = (WORD)lpTm->tm_sec; SysTime.wMilliseconds = 0; - /* Time first */ - i = GetDateFormatW(LOCALE_SYSTEM_DEFAULT, 0, &SysTime, NULL, lpBuf, cchBuf); + /* Copy date first */ + i = GetDateFormatW(LOCALE_SYSTEM_DEFAULT, 0, &SysTime, NULL, lpBuf, BUFFER_SIZE - 2); if (i) --i; /* don't count NULL character */ - /* Time now */ + /* Copy time now */ i += swprintf(lpBuf + i, L", "); - GetTimeFormatW(LOCALE_SYSTEM_DEFAULT, 0, &SysTime, NULL, lpBuf + i, cchBuf - i); + i += 2; + GetTimeFormatW(LOCALE_SYSTEM_DEFAULT, 0, &SysTime, NULL, lpBuf + i, BUFFER_SIZE - i); } /* Show usage */ @@ -177,6 +187,32 @@ Usage(VOID) wprintf(L"%s", Buf); } +static +VOID +PrintRow(UINT nTitleID, unsigned cxOffset, LPWSTR lpFormat, ...) +{ + WCHAR Buf[BUFFER_SIZE]; + va_list Args; + unsigned c; + + if (nTitleID) + { + c = LoadStringW(GetModuleHandle(NULL), nTitleID, Buf, BUFFER_SIZE); + if (!c) + return; + + wcscpy(Buf + c, L":"); + } else + Buf[0] = L'\0'; + wprintf(L"%-32s ", Buf); + + va_start(Args, lpFormat); + vwprintf(lpFormat, Args); + va_end(Args); + + wprintf(L"\n"); +} + /* Print all system information */ VOID AllSysInfo(VOID) @@ -189,7 +225,7 @@ AllSysInfo(VOID) LPWSTR lpBuffer; NETSETUP_JOIN_STATUS NetJoinStatus; MEMORYSTATUS MemoryStatus; - unsigned int cSeconds; + unsigned int cSeconds, i, j; TIME_ZONE_INFORMATION TimeZoneInfo; HKEY hKey; @@ -205,8 +241,8 @@ AllSysInfo(VOID) dwCharCount = BUFFER_SIZE; if (!GetComputerNameW(Buf, &dwCharCount)) wprintf(L"Error! GetComputerName failed.\n"); - else if (GetOemStrings(IDS_HOST_NAME, Msg)) - wprintf(Msg, Buf); + else + PrintRow(IDS_HOST_NAME, 0, L"%s", Buf); // open CurrentVersion key if(RegOpenKeyExW(HKEY_LOCAL_MACHINE, @@ -220,60 +256,60 @@ AllSysInfo(VOID) } //getting OS Name - RegGetSZ(hKey, NULL, L"ProductName", Buf); - if (GetOemStrings(IDS_OS_NAME, Msg)) - wprintf(Msg, Buf); + RegGetSZ(hKey, NULL, L"ProductName", Buf, BUFFER_SIZE); + PrintRow(IDS_OS_NAME, 0, L"%s", Buf); //getting OS Version ZeroMemory(&VersionInfo, sizeof(VersionInfo)); VersionInfo.dwOSVersionInfoSize = sizeof(VersionInfo); GetVersionExW(&VersionInfo); - if (GetOemStrings(IDS_OS_VERSION, Msg)) - wprintf(Msg, - (unsigned)VersionInfo.dwMajorVersion, - (unsigned)VersionInfo.dwMinorVersion, - (unsigned)VersionInfo.dwBuildNumber, - VersionInfo.szCSDVersion, - (unsigned)VersionInfo.dwBuildNumber); + if (!LoadStringW(GetModuleHandle(NULL), IDS_BUILD, Tmp, BUFFER_SIZE)) + Tmp[0] = L'\0'; + PrintRow(IDS_OS_VERSION, + 0, + L"%u.%u.%u %s %s %u", + (unsigned)VersionInfo.dwMajorVersion, + (unsigned)VersionInfo.dwMinorVersion, + (unsigned)VersionInfo.dwBuildNumber, + VersionInfo.szCSDVersion, + Tmp, + (unsigned)VersionInfo.dwBuildNumber); //getting OS Manufacturer //getting OS Configuration //getting OS Build Type - RegGetSZ(hKey, NULL, L"CurrentType", Buf); - if (GetOemStrings(IDS_OS_BUILD_TYPE, Msg)) - wprintf(Msg, Buf); + RegGetSZ(hKey, NULL, L"CurrentType", Buf, BUFFER_SIZE); + PrintRow(IDS_OS_BUILD_TYPE, 0, L"%s", Buf); //getting Registered Owner - RegGetSZ(hKey, NULL, L"RegisteredOwner", Buf); - if (GetOemStrings(IDS_REG_OWNER, Msg)) - wprintf(Msg, Buf); + RegGetSZ(hKey, NULL, L"RegisteredOwner", Buf, BUFFER_SIZE); + PrintRow(IDS_REG_OWNER, 0, L"%s", Buf); //getting Registered Organization - RegGetSZ(hKey, NULL, L"RegisteredOrganization", Buf); - if (GetOemStrings(IDS_REG_ORG, Msg)) - wprintf(Msg, Buf); + RegGetSZ(hKey, NULL, L"RegisteredOrganization", Buf, BUFFER_SIZE); + PrintRow(IDS_REG_ORG, 0, L"%s", Buf); //getting Product ID - RegGetSZ(hKey, NULL, L"ProductId", Buf); - if (GetOemStrings(IDS_PRODUCT_ID, Msg)) - wprintf(Msg, Buf); + RegGetSZ(hKey, NULL, L"ProductId", Buf, BUFFER_SIZE); + PrintRow(IDS_PRODUCT_ID, 0, L"%s", Buf); //getting Install Date RegGetDWORD(hKey, NULL, L"InstallDate", &dwTimestamp); FormatDateTime((time_t)dwTimestamp, Buf); - if (GetOemStrings(IDS_INST_DATE, Msg)) - wprintf(Msg, Buf); + PrintRow(IDS_INST_DATE, 0, L"%s", Buf); // close Current Version key now RegCloseKey(hKey); //getting System Up Time cSeconds = GetTickCount() / 1000; - if (GetOemStrings(IDS_UP_TIME, Msg)) - wprintf(Msg, cSeconds / (60*60*24), (cSeconds / (60*60)) % 24, (cSeconds / 60) % 60, cSeconds % 60); + if (!LoadStringW(GetModuleHandle(NULL), IDS_UP_TIME_FORMAT, Tmp, BUFFER_SIZE)) + Tmp[0] = L'\0'; + swprintf(Buf, Tmp, cSeconds / (60*60*24), (cSeconds / (60*60)) % 24, (cSeconds / 60) % 60, cSeconds % 60); + PrintRow(IDS_UP_TIME, 0, L"%s", Buf); //getting System Manufacturer; HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\OEMInformation\Manufacturer for Win >= 6.0 swprintf(Tmp, L"%s\\oeminfo.ini", szSystemDir); @@ -283,8 +319,7 @@ AllSysInfo(VOID) Buf, sizeof(Buf)/sizeof(Buf[0]), Tmp); - if (GetOemStrings(IDS_SYS_MANUFACTURER, Msg)) - wprintf(Msg, Buf); + PrintRow(IDS_SYS_MANUFACTURER, 0, L"%s", Buf); //getting System Model; HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\OEMInformation\Model for Win >= 6.0 GetPrivateProfileStringW(L"General", @@ -293,8 +328,7 @@ AllSysInfo(VOID) Buf, sizeof(Buf)/sizeof(Buf[0]), Tmp); - if (GetOemStrings(IDS_SYS_MODEL, Msg)) - wprintf(Msg, Buf); + PrintRow(IDS_SYS_MODEL, 0, L"%s", Buf); //getting System type switch (SysInfo.wProcessorArchitecture) @@ -312,93 +346,93 @@ AllSysInfo(VOID) lpcszSysType = L"Unknown"; break; } - if (GetOemStrings(IDS_SYS_TYPE, Msg)) - wprintf(Msg, lpcszSysType); + PrintRow(IDS_SYS_TYPE, 0, L"%s", lpcszSysType); //getting Processor(s) - if (GetOemStrings(IDS_PROCESSORS, Msg)) + if (!LoadStringW(GetModuleHandle(NULL), IDS_PROCESSORS_FORMAT, Tmp, BUFFER_SIZE)) + Tmp[0] = L'\0'; + swprintf(Buf, Tmp, (unsigned)SysInfo.dwNumberOfProcessors); + PrintRow(IDS_PROCESSORS, 0, L"%s", Buf); + for(i = 0; i < (unsigned int)SysInfo.dwNumberOfProcessors; i++) { - unsigned int i; - wprintf(Msg, (unsigned int)SysInfo.dwNumberOfProcessors); - for(i = 0; i < (unsigned int)SysInfo.dwNumberOfProcessors; i++) - { - swprintf(Tmp, L"HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\%u", i); - - RegGetSZ(HKEY_LOCAL_MACHINE, Tmp, L"Identifier", Buf); - wprintf(L" [%02u]: %s", i+1, Buf); - - RegGetSZ(HKEY_LOCAL_MACHINE, Tmp, L"VendorIdentifier", Buf); - wprintf(L" %s\n", Buf); - } + swprintf(Tmp, L"HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\%u", i); + j = swprintf(Buf, L"[%02u]: ", i + 1); + + j += RegGetSZ(HKEY_LOCAL_MACHINE, Tmp, L"Identifier", Buf + j, BUFFER_SIZE - j); + if(j + 1 < BUFFER_SIZE) + Buf[j++] = L' '; + RegGetSZ(HKEY_LOCAL_MACHINE, Tmp, L"VendorIdentifier", Buf + j, BUFFER_SIZE - j); + + PrintRow(0, 0, L"%s", Buf); } //getting BIOS Version RegGetSZ(HKEY_LOCAL_MACHINE, L"HARDWARE\\DESCRIPTION\\System", L"SystemBiosVersion", - Buf); - if (GetOemStrings(IDS_BIOS_VERSION, Msg)) - wprintf(Msg, Buf); + Buf, + BUFFER_SIZE); + PrintRow(IDS_BIOS_VERSION, 0, L"%s", Buf); //gettings BIOS date RegGetSZ(HKEY_LOCAL_MACHINE, L"HARDWARE\\DESCRIPTION\\System", L"SystemBiosDate", - Buf); - if (GetOemStrings(IDS_BIOS_DATE, Msg)) - wprintf(Msg, Buf); + Buf, + BUFFER_SIZE); + PrintRow(IDS_BIOS_DATE, 0, L"%s", Buf); //getting ReactOS Directory if (!GetWindowsDirectoryW(Buf, BUFFER_SIZE)) wprintf(L"Error! GetWindowsDirectory failed."); - else if (GetOemStrings(IDS_ROS_DIR, Msg)) - wprintf(Msg, Buf); + else + PrintRow(IDS_ROS_DIR, 0, L"%s", Buf); //getting System Directory - if (GetOemStrings(IDS_SYS_DIR, Msg)) - wprintf(Msg, szSystemDir); + PrintRow(IDS_SYS_DIR, 0, L"%s", szSystemDir); //getting Boot Device RegGetSZ(HKEY_LOCAL_MACHINE, L"SYSTEM\\Setup", L"SystemPartition", - Buf); - if (GetOemStrings(IDS_BOOT_DEV, Msg)) - wprintf(Msg, Buf); + Buf, + BUFFER_SIZE); + PrintRow(IDS_BOOT_DEV, 0, L"%s", Buf); //getting System Locale if (GetLocaleInfoW(LOCALE_SYSTEM_DEFAULT, LOCALE_ILANGUAGE, Tmp, BUFFER_SIZE)) if (RegGetSZ(HKEY_CLASSES_ROOT, L"MIME\\Database\\Rfc1766", Tmp, - Buf)) + Buf, + BUFFER_SIZE)) { /* get rid of @filename,resource */ lpBuffer = wcschr(Buf, L';'); if (lpBuffer) SHLoadIndirectString(lpBuffer+1, lpBuffer+1, BUFFER_SIZE - (lpBuffer-Buf) - 1, NULL); - if (GetOemStrings(IDS_SYS_LOCALE, Msg)) - wprintf(Msg, Buf); + PrintRow(IDS_SYS_LOCALE, 0, L"%s", Buf); } //getting Input Locale if (RegGetSZ(HKEY_CURRENT_USER, L"Keyboard Layout\\Preload", L"1", - Tmp) && wcslen(Tmp) > 4) + Tmp, + BUFFER_SIZE) && wcslen(Tmp) > 4) if (RegGetSZ(HKEY_CLASSES_ROOT, L"MIME\\Database\\Rfc1766", Tmp + 4, - Buf)) + Buf, + BUFFER_SIZE)) { /* get rid of @filename,resource */ lpBuffer = wcschr(Buf, L';'); if (lpBuffer) SHLoadIndirectString(lpBuffer+1, lpBuffer+1, BUFFER_SIZE - (lpBuffer-Buf) - 1, NULL); - if (GetOemStrings(IDS_INPUT_LOCALE, Msg)) - wprintf(Msg, Buf); + PrintRow(IDS_INPUT_LOCALE, 0, L"%s", Buf); } //getting Time Zone @@ -417,14 +451,13 @@ AllSysInfo(VOID) dwCharCount = 256; // Windows seems to have a bug - it doesnt accept BUFFER_SIZE here for(i = 0; RegEnumKeyExW(hKey, i, Tmp, &dwCharCount, NULL, NULL, NULL, NULL) == ERROR_SUCCESS; ++i, dwCharCount = 255) { - RegGetSZ(hKey, Tmp, L"Std", Buf); + RegGetSZ(hKey, Tmp, L"Std", Buf, BUFFER_SIZE); if(!wcscmp(Buf, TimeZoneInfo.StandardName)) { - RegGetSZ(hKey, Tmp, L"Display", Buf); + RegGetSZ(hKey, Tmp, L"Display", Buf, BUFFER_SIZE); - if (GetOemStrings(IDS_TIME_ZONE, Msg)) - wprintf(Msg, Buf); + PrintRow(IDS_TIME_ZONE, 0, L"%s", Buf); break; } @@ -435,55 +468,49 @@ AllSysInfo(VOID) //getting Total Physical Memory GlobalMemoryStatus(&MemoryStatus); FormatBytes(Buf, MemoryStatus.dwTotalPhys); - if (GetOemStrings(IDS_TOTAL_PHYS_MEM, Msg)) - wprintf(Msg, Buf); + PrintRow(IDS_TOTAL_PHYS_MEM, 0, L"%s", Buf); //getting Available Physical Memory FormatBytes(Buf, MemoryStatus.dwAvailPhys); - if (GetOemStrings(IDS_AVAIL_PHISICAL_MEM,Msg)) - wprintf(Msg, Buf); + PrintRow(IDS_AVAIL_PHISICAL_MEM, 0, L"%s", Buf); //getting Virtual Memory: Max Size FormatBytes(Buf, MemoryStatus.dwTotalVirtual); - if (GetOemStrings(IDS_VIRT_MEM_MAX, Msg)) - wprintf(Msg, Buf); + PrintRow(IDS_VIRT_MEM_MAX, 0, L"%s", Buf); //getting Virtual Memory: Available FormatBytes(Buf, MemoryStatus.dwAvailVirtual); - if (GetOemStrings(IDS_VIRT_MEM_AVAIL, Msg)) - wprintf(Msg, Buf); + PrintRow(IDS_VIRT_MEM_AVAIL, 0, L"%s", Buf); //getting Virtual Memory: In Use FormatBytes(Buf, MemoryStatus.dwTotalVirtual-MemoryStatus.dwAvailVirtual); - if (GetOemStrings(IDS_VIRT_MEM_INUSE, Msg)) - wprintf(Msg, Buf); + PrintRow(IDS_VIRT_MEM_INUSE, 0, L"%s", Buf); //getting Page File Location(s) if (RegGetSZ(HKEY_LOCAL_MACHINE, L"SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Memory Management", L"PagingFiles", - Buf)) + Buf, + BUFFER_SIZE)) { int i; - for(i = 0; i < strlen((char*)Buf); i++) + for(i = 0; Buf[i]; i++) { - if (Buf[i] == TEXT(' ')) + if (Buf[i] == L' ') { - Buf[i] = TEXT('\0'); + Buf[i] = L'\0'; break; } } - if(GetOemStrings(IDS_PAGEFILE_LOC, Msg)) - wprintf(Msg, Buf); + PrintRow(IDS_PAGEFILE_LOC, 0, L"%s", Buf); } //getting Domain if (NetGetJoinInformation (NULL, &lpBuffer, &NetJoinStatus) == NERR_Success) { - if(GetOemStrings(IDS_DOMAIN, Msg)) - wprintf(Msg, lpBuffer); + PrintRow(IDS_DOMAIN, 0, L"%s", lpBuffer); NetApiBufferFree(lpBuffer); } From d7899fc4747e43848fbcad124488500e13d033af Mon Sep 17 00:00:00 2001 From: Ged Murphy Date: Sat, 2 Apr 2011 18:12:31 +0000 Subject: [PATCH 059/317] [FULLFAT] - Fix warnings for both msc and rbuild - These fixes will be applied to the FullFat source too, so I've not bothered with a local ros.diff svn path=/trunk/; revision=51234 --- .../include/reactos/libs/fullfat/ff_string.h | 2 - reactos/lib/3rdparty/fullfat/ff_dir.c | 6 +- reactos/lib/3rdparty/fullfat/ff_dir.h | 169 ------------------ reactos/lib/3rdparty/fullfat/fullfat.rbuild | 2 +- 4 files changed, 5 insertions(+), 174 deletions(-) delete mode 100644 reactos/lib/3rdparty/fullfat/ff_dir.h diff --git a/reactos/include/reactos/libs/fullfat/ff_string.h b/reactos/include/reactos/libs/fullfat/ff_string.h index a5e85955da4..0820391f56c 100644 --- a/reactos/include/reactos/libs/fullfat/ff_string.h +++ b/reactos/include/reactos/libs/fullfat/ff_string.h @@ -48,10 +48,8 @@ #include #ifdef WIN32 -#define stricmp stricmp #define FF_stricmp stricmp #else -#define strcasecmp strcasecmp #define FF_stricmp strcasecmp #endif diff --git a/reactos/lib/3rdparty/fullfat/ff_dir.c b/reactos/lib/3rdparty/fullfat/ff_dir.c index f34c18ecbab..b9767352b8e 100644 --- a/reactos/lib/3rdparty/fullfat/ff_dir.c +++ b/reactos/lib/3rdparty/fullfat/ff_dir.c @@ -261,13 +261,15 @@ FF_T_UINT32 FF_FindEntryInDir(FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, const FF #else FF_T_INT8 *lastPtr = pDirent->FileName + sizeof(pDirent->FileName); #endif - FF_T_UINT8 CheckSum; + FF_T_UINT8 CheckSum = 0; FF_T_UINT8 lastAttrib; FF_T_INT8 totalLFNs = 0; FF_T_INT8 numLFNs = 0; FF_T_INT32 i; FF_T_UINT16 lfnItem = 0; + pError = NULL; + pDirent->CurrentItem = 0; pDirent->Attrib = 0; @@ -1095,8 +1097,8 @@ FF_ERROR FF_PopulateLongDirent(FF_IOMAN *pIoman, FF_DIRENT *pDirent, FF_T_UINT16 FF_ERROR Error; FF_T_UINT uiNumLFNs; FF_T_UINT uiLfnLength = 0; - FF_T_UINT i,y; #ifdef FF_UNICODE_UTF8_SUPPORT + FF_T_UINT i,y; // FF_T_SINT32 slRetVal; FF_T_UINT16 nLfnBegin; FF_T_UINT16 usUtf8Len = 0; diff --git a/reactos/lib/3rdparty/fullfat/ff_dir.h b/reactos/lib/3rdparty/fullfat/ff_dir.h deleted file mode 100644 index 6c99b7279c5..00000000000 --- a/reactos/lib/3rdparty/fullfat/ff_dir.h +++ /dev/null @@ -1,169 +0,0 @@ -/***************************************************************************** - * FullFAT - High Performance, Thread-Safe Embedded FAT File-System * - * Copyright (C) 2009 James Walmsley (james@worm.me.uk) * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - * * - * IMPORTANT NOTICE: * - * ================= * - * Alternative Licensing is available directly from the Copyright holder, * - * (James Walmsley). For more information consult LICENSING.TXT to obtain * - * a Commercial license. * - * * - * See RESTRICTIONS.TXT for extra restrictions on the use of FullFAT. * - * * - * Removing the above notice is illegal and will invalidate this license. * - ***************************************************************************** - * See http://worm.me.uk/fullfat for more information. * - * Or http://fullfat.googlecode.com/ for latest releases and the wiki. * - *****************************************************************************/ - -/** - * @file ff_dir.h - * @author James Walmsley - * @ingroup DIR - **/ -#ifndef _FF_DIR_H_ -#define _FF_DIR_H_ - -#include "ff_types.h" -#include "ff_config.h" -#include "ff_error.h" -#include "ff_ioman.h" -#include "ff_blk.h" -#include "ff_fat.h" -#include "ff_fatdef.h" -#include "ff_memory.h" -#include "ff_time.h" -#include "ff_hash.h" -#include "ff_crc.h" -#include "ff_file.h" -#include - -typedef struct { - FF_T_UINT32 ulChainLength; - FF_T_UINT32 ulDirCluster; - FF_T_UINT32 ulCurrentClusterLCN; - FF_T_UINT32 ulCurrentClusterNum; - FF_T_UINT32 ulCurrentEntry; - FF_BUFFER *pBuffer; -} FF_FETCH_CONTEXT; - -typedef struct { - FF_T_UINT32 Filesize; - FF_T_UINT32 ObjectCluster; - - // Book Keeping - FF_T_UINT32 CurrentCluster; - FF_T_UINT32 AddrCurrentCluster; - FF_T_UINT32 DirCluster; - FF_T_UINT16 CurrentItem; - // End Book Keeping - -#ifdef FF_TIME_SUPPORT - FF_SYSTEMTIME CreateTime; ///< Date and Time Created. - FF_SYSTEMTIME ModifiedTime; ///< Date and Time Modified. - FF_SYSTEMTIME AccessedTime; ///< Date of Last Access. -#endif - -#ifdef FF_FINDAPI_ALLOW_WILDCARDS -#ifdef FF_UNICODE_SUPPORT - FF_T_WCHAR szWildCard[FF_MAX_FILENAME]; -#else - FF_T_INT8 szWildCard[FF_MAX_FILENAME]; -#endif -#endif - -#ifdef FF_UNICODE_SUPPORT - FF_T_WCHAR FileName[FF_MAX_FILENAME]; -#else - FF_T_INT8 FileName[FF_MAX_FILENAME]; -#endif - -#if defined(FF_LFN_SUPPORT) && defined(FF_INCLUDE_SHORT_NAME) - FF_T_INT8 ShortName[13]; -#endif - FF_T_UINT8 Attrib; - FF_FETCH_CONTEXT FetchContext; -} FF_DIRENT; - - - -// PUBLIC API -#ifdef FF_UNICODE_SUPPORT -FF_ERROR FF_FindFirst (FF_IOMAN *pIoman, FF_DIRENT *pDirent, const FF_T_WCHAR *path); -FF_ERROR FF_MkDir (FF_IOMAN *pIoman, const FF_T_WCHAR *Path); -#else -FF_ERROR FF_FindFirst (FF_IOMAN *pIoman, FF_DIRENT *pDirent, const FF_T_INT8 *path); -FF_ERROR FF_MkDir (FF_IOMAN *pIoman, const FF_T_INT8 *Path); -#endif - -FF_ERROR FF_FindNext (FF_IOMAN *pIoman, FF_DIRENT *pDirent); - - -// INTERNAL API -FF_ERROR FF_GetEntry (FF_IOMAN *pIoman, FF_T_UINT16 nEntry, FF_T_UINT32 DirCluster, FF_DIRENT *pDirent); -FF_ERROR FF_PutEntry (FF_IOMAN *pIoman, FF_T_UINT16 Entry, FF_T_UINT32 DirCluster, FF_DIRENT *pDirent); -FF_T_SINT8 FF_FindEntry (FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, FF_T_INT8 *Name, FF_DIRENT *pDirent, FF_T_BOOL LFNs); - -void FF_PopulateShortDirent (FF_IOMAN *pIoman, FF_DIRENT *pDirent, FF_T_UINT8 *EntryBuffer); -FF_ERROR FF_PopulateLongDirent (FF_IOMAN *pIoman, FF_DIRENT *pDirent, FF_T_UINT16 nEntry, FF_FETCH_CONTEXT *pFetchContext); - -FF_ERROR FF_InitEntryFetch (FF_IOMAN *pIoman, FF_T_UINT32 ulDirCluster, FF_FETCH_CONTEXT *pContext); -FF_ERROR FF_FetchEntryWithContext (FF_IOMAN *pIoman, FF_T_UINT32 ulEntry, FF_FETCH_CONTEXT *pContext, FF_T_UINT8 *pEntryBuffer); -FF_ERROR FF_PushEntryWithContext (FF_IOMAN *pIoman, FF_T_UINT32 ulEntry, FF_FETCH_CONTEXT *pContext, FF_T_UINT8 *pEntryBuffer); -void FF_CleanupEntryFetch (FF_IOMAN *pIoman, FF_FETCH_CONTEXT *pContext); - -FF_T_SINT8 FF_PushEntry (FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, FF_T_UINT16 nEntry, FF_T_UINT8 *buffer, void *pParam); -FF_T_BOOL FF_isEndOfDir (FF_T_UINT8 *EntryBuffer); -FF_ERROR FF_FindNextInDir (FF_IOMAN *pIoman, FF_DIRENT *pDirent, FF_FETCH_CONTEXT *pFetchContext); - -#ifdef FF_UNICODE_SUPPORT -FF_T_UINT32 FF_FindEntryInDir (FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, const FF_T_WCHAR *name, FF_T_UINT8 pa_Attrib, FF_DIRENT *pDirent, FF_ERROR *pError); -FF_T_SINT8 FF_CreateShortName (FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, FF_T_WCHAR *ShortName, FF_T_WCHAR *LongName); -#else -FF_T_UINT32 FF_FindEntryInDir (FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, const FF_T_INT8 *name, FF_T_UINT8 pa_Attrib, FF_DIRENT *pDirent, FF_ERROR *pError); -FF_T_SINT8 FF_CreateShortName (FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, FF_T_INT8 *ShortName, FF_T_INT8 *LongName); -#endif - - -void FF_lockDIR (FF_IOMAN *pIoman); -void FF_unlockDIR (FF_IOMAN *pIoman); - -#ifdef FF_UNICODE_SUPPORT -FF_T_UINT32 FF_CreateFile(FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, FF_T_WCHAR *FileName, FF_DIRENT *pDirent, FF_ERROR *pError); -#else -FF_T_UINT32 FF_CreateFile(FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, FF_T_INT8 *FileName, FF_DIRENT *pDirent, FF_ERROR *pError); -#endif - -FF_ERROR FF_CreateDirent (FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, FF_DIRENT *pDirent); -FF_ERROR FF_ExtendDirectory (FF_IOMAN *pIoman, FF_T_UINT32 DirCluster); - -#ifdef FF_UNICODE_SUPPORT -FF_T_UINT32 FF_FindDir (FF_IOMAN *pIoman, const FF_T_WCHAR *path, FF_T_UINT16 pathLen, FF_ERROR *pError); -#else -FF_T_UINT32 FF_FindDir (FF_IOMAN *pIoman, const FF_T_INT8 *path, FF_T_UINT16 pathLen, FF_ERROR *pError); -#endif - -#ifdef FF_HASH_CACHE -FF_T_BOOL FF_CheckDirentHash (FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, FF_T_UINT32 nHash); -FF_T_BOOL FF_DirHashed (FF_IOMAN *pIoman, FF_T_UINT32 DirCluster); -FF_ERROR FF_AddDirentHash (FF_IOMAN *pIoman, FF_T_UINT32 DirCluster, FF_T_UINT32 nHash); -FF_ERROR FF_HashDir (FF_IOMAN *pIoman, FF_T_UINT32 ulDirCluster); -#endif - -FF_ERROR FF_RmLFNs(FF_IOMAN *pIoman, FF_T_UINT16 usDirEntry, FF_FETCH_CONTEXT *pContext); - -#endif - diff --git a/reactos/lib/3rdparty/fullfat/fullfat.rbuild b/reactos/lib/3rdparty/fullfat/fullfat.rbuild index 754502d6d57..4e18e3b3c18 100644 --- a/reactos/lib/3rdparty/fullfat/fullfat.rbuild +++ b/reactos/lib/3rdparty/fullfat/fullfat.rbuild @@ -1,6 +1,6 @@ - + include/reactos/libs/fullfat From 901b5f0d914046aba2b862044fc3673e09e07fb7 Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Sat, 2 Apr 2011 18:32:04 +0000 Subject: [PATCH 060/317] [NDK] - Add RTL_PERTHREAD_CURDIR structure definition. - Fix RTL_DRIVE_LETTER_CURDIR type vs. structure definition typo (adding more underscores is a truly universal fix!). svn path=/trunk/; revision=51235 --- reactos/include/ndk/rtltypes.h | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/reactos/include/ndk/rtltypes.h b/reactos/include/ndk/rtltypes.h index c211ccada3c..3b932372ca9 100644 --- a/reactos/include/ndk/rtltypes.h +++ b/reactos/include/ndk/rtltypes.h @@ -1012,7 +1012,7 @@ typedef struct _CURDIR HANDLE Handle; } CURDIR, *PCURDIR; -typedef struct RTL_DRIVE_LETTER_CURDIR +typedef struct _RTL_DRIVE_LETTER_CURDIR { USHORT Flags; USHORT Length; @@ -1020,6 +1020,13 @@ typedef struct RTL_DRIVE_LETTER_CURDIR UNICODE_STRING DosPath; } RTL_DRIVE_LETTER_CURDIR, *PRTL_DRIVE_LETTER_CURDIR; +typedef struct _RTL_PERTHREAD_CURDIR +{ + PRTL_DRIVE_LETTER_CURDIR CurrentDirectories; + PUNICODE_STRING ImageName; + PVOID Environment; +} RTL_PERTHREAD_CURDIR, *PRTL_PERTHREAD_CURDIR; + // // Private State structure for RtlAcquirePrivilege/RtlReleasePrivilege // From f6c92d8d84d727926a448a4f8f49ccc26887e46a Mon Sep 17 00:00:00 2001 From: Ged Murphy Date: Sat, 2 Apr 2011 18:51:41 +0000 Subject: [PATCH 061/317] [FULLFAT] - Map the memory functions onto kernel APIs svn path=/trunk/; revision=51236 --- reactos/include/reactos/libs/fullfat/ff_config.h | 4 ++-- reactos/include/reactos/libs/fullfat/ff_memory.h | 6 ++++++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/reactos/include/reactos/libs/fullfat/ff_config.h b/reactos/include/reactos/libs/fullfat/ff_config.h index d8de409f1c6..09383e336af 100644 --- a/reactos/include/reactos/libs/fullfat/ff_config.h +++ b/reactos/include/reactos/libs/fullfat/ff_config.h @@ -121,8 +121,8 @@ //---------- MALLOC // These should map on to platform specific memory allocators. -#define FF_MALLOC(aSize) malloc(aSize) -#define FF_FREE(apPtr) free(apPtr) +#define FF_MALLOC(aSize) FF_Malloc(aSize) +#define FF_FREE(apPtr) FF_Free(apPtr) //---------- IN-LINE FUNCTIONS diff --git a/reactos/include/reactos/libs/fullfat/ff_memory.h b/reactos/include/reactos/libs/fullfat/ff_memory.h index 03ae55a77a3..5064c2776d2 100644 --- a/reactos/include/reactos/libs/fullfat/ff_memory.h +++ b/reactos/include/reactos/libs/fullfat/ff_memory.h @@ -41,6 +41,12 @@ #include "ff_config.h" #include "ff_types.h" +#ifdef __REACTOS__ +// defined in fullfat.c +void *FF_Malloc(FF_T_UINT32 allocSize); +void FF_Free(void *pBuffer); +#endif + /* HT changed type of aOffset to u32 */ From 6f4a96d594e03e84ee8bd7a1fd1161e03066a821 Mon Sep 17 00:00:00 2001 From: James Tabor Date: Sun, 3 Apr 2011 02:14:14 +0000 Subject: [PATCH 062/317] [Win32k] - Fix the return checks for co_MsqWaitForNewMessages, now the wait_idle test no longer randomly crash, also tested the testkbd check from bug 3212. Setup co_MsqWaitForNewMessages to act like get message, checking QS bits and dispatching send messages if queued. - Added desktop hit test data point, now the new track mouse timer code works. Not yet committed. svn path=/trunk/; revision=51237 --- .../subsystems/win32/win32k/ntuser/message.c | 8 ++++++- .../subsystems/win32/win32k/ntuser/msgqueue.c | 21 ++++++++++++++++--- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/reactos/subsystems/win32/win32k/ntuser/message.c b/reactos/subsystems/win32/win32k/ntuser/message.c index b66f31db35d..53e2b432a4f 100644 --- a/reactos/subsystems/win32/win32k/ntuser/message.c +++ b/reactos/subsystems/win32/win32k/ntuser/message.c @@ -857,6 +857,10 @@ co_IntWaitMessage( PWND Window, return FALSE; } + if (Status == STATUS_USER_APC || Status == STATUS_TIMEOUT) + { + return FALSE; + } } while ( TRUE ); @@ -946,7 +950,9 @@ co_IntGetPeekMessage( PMSG pMsg, Window, MsgFilterMin, MsgFilterMax); - if ( !NT_SUCCESS(Status) ) + if ( !NT_SUCCESS(Status) || + Status == STATUS_USER_APC || + Status == STATUS_TIMEOUT ) { Present = -1; break; diff --git a/reactos/subsystems/win32/win32k/ntuser/msgqueue.c b/reactos/subsystems/win32/win32k/ntuser/msgqueue.c index 9f0706706af..db8ca7c97b8 100644 --- a/reactos/subsystems/win32/win32k/ntuser/msgqueue.c +++ b/reactos/subsystems/win32/win32k/ntuser/msgqueue.c @@ -193,6 +193,7 @@ co_MsqInsertMouseMessage(MSG* Msg) { LARGE_INTEGER LargeTickCount; MSLLHOOKSTRUCT MouseHookData; + PDESKTOP pDesk; PWND pwnd, pwndDesktop; KeQueryTickCount(&LargeTickCount); @@ -254,6 +255,9 @@ co_MsqInsertMouseMessage(MSG* Msg) IntPtInWindow(pwnd, Msg->pt.x, Msg->pt.y)) { Msg->hwnd = pwnd->head.h; + pDesk = pwnd->head.rpdesk; + pDesk->htEx = HTCLIENT; + pDesk->spwndTrack = pwnd; break; } } @@ -1031,8 +1035,6 @@ BOOL co_IntProcessMouseMessage(MSG* msg, BOOL* RemoveMessages, UINT first, UINT /* message is accepted now (but may still get dropped) */ - pti->rpdesk->htEx = hittest; /* Now set the capture hit. */ - event.message = msg->message; event.time = msg->time; event.hwnd = msg->hwnd; @@ -1351,8 +1353,20 @@ NTSTATUS FASTCALL co_MsqWaitForNewMessages(PUSER_MESSAGE_QUEUE MessageQueue, PWND WndFilter, UINT MsgFilterMin, UINT MsgFilterMax) { - NTSTATUS ret; + PTHREADINFO pti; + NTSTATUS ret = STATUS_SUCCESS; + + pti = MessageQueue->Thread->Tcb.Win32Thread; + while ( co_MsqDispatchOneSentMessage(MessageQueue) ); + + if (pti->pcti->fsWakeBits & pti->pcti->fsChangeBits ) + { + return ret; + } + + pti->pClientInfo->cSpins = 0; + IdlePing(); UserLeaveCo(); ret = KeWaitForSingleObject(MessageQueue->NewMessages, Executive, @@ -1360,6 +1374,7 @@ co_MsqWaitForNewMessages(PUSER_MESSAGE_QUEUE MessageQueue, PWND WndFilter, FALSE, NULL); UserEnterCo(); + IdlePong(); return ret; } From 629be1865d28398e1f980efa827e48d2650965af Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Sun, 3 Apr 2011 09:42:08 +0000 Subject: [PATCH 063/317] [KERNEL32] - Rewrite large part of ldr.c code, including FreeLibrary, FreeLibraryAndExitThread, GetModuleFileNameA/W, GetModuleHandleA/W, ExA/W. Now they properly validate parameters, common code for getting module handles is factored into a standalone function which is reused for all 4 APIs instead of duplicating almost the same code four times. GetModuleFileNameA became a typical A->W wrapper around GetModuleFileNameW so duplication is also removed there. - Getting module handle also became a correct implementation because now it takes process's dll path into account instead of always assuming a "default" one (which is incompatible with a new ntdll loader). - Fixed a typo in BasepGetProcessPath which led to incorrect value being returned. Downgrade two debugprints. svn path=/trunk/; revision=51238 --- reactos/dll/win32/kernel32/misc/ldr.c | 634 ++++++++++++------- reactos/dll/win32/kernel32/process/procsup.c | 6 +- 2 files changed, 406 insertions(+), 234 deletions(-) diff --git a/reactos/dll/win32/kernel32/misc/ldr.c b/reactos/dll/win32/kernel32/misc/ldr.c index decc300fbab..50fdcc31049 100644 --- a/reactos/dll/win32/kernel32/misc/ldr.c +++ b/reactos/dll/win32/kernel32/misc/ldr.c @@ -1,10 +1,10 @@ -/* $Id$ - * +/* * COPYRIGHT: See COPYING in the top level directory * PROJECT : ReactOS user mode libraries * MODULE : kernel32.dll - * FILE : reactos/lib/kernel32/misc/ldr.c - * AUTHOR : Ariadne + * FILE : reactos/dll/win32/kernel32/misc/ldr.c + * AUTHOR : Aleksey Bragin + * Ariadne */ #include @@ -22,8 +22,53 @@ typedef struct tagLOADPARMS32 { extern BOOLEAN InWindows; extern WaitForInputIdleType lpfnGlobalRegisterWaitForInputIdle; +#define BASEP_GET_MODULE_HANDLE_EX_PARAMETER_VALIDATION_FAIL 1 +#define BASEP_GET_MODULE_HANDLE_EX_PARAMETER_VALIDATION_SUCCESS 2 +#define BASEP_GET_MODULE_HANDLE_EX_PARAMETER_VALIDATION_CONTINUE 3 + /* FUNCTIONS ****************************************************************/ +DWORD +WINAPI +BasepGetModuleHandleExParameterValidation(DWORD dwFlags, + LPCWSTR lpwModuleName, + HMODULE *phModule) +{ + /* Set phModule to 0 if it's not a NULL pointer */ + if (phModule) *phModule = 0; + + /* Check for invalid flags combination */ + if (dwFlags & ~(GET_MODULE_HANDLE_EX_FLAG_PIN | + GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT | + GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS) || + (dwFlags & GET_MODULE_HANDLE_EX_FLAG_PIN && + dwFlags & GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT) || + (!lpwModuleName && (dwFlags & GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS)) + ) + { + BaseSetLastNTError(STATUS_INVALID_PARAMETER_1); + return BASEP_GET_MODULE_HANDLE_EX_PARAMETER_VALIDATION_FAIL; + } + + /* Check 2nd parameter */ + if (!phModule) + { + BaseSetLastNTError(STATUS_INVALID_PARAMETER_2); + return BASEP_GET_MODULE_HANDLE_EX_PARAMETER_VALIDATION_FAIL; + } + + /* Return what we have according to the module name */ + if (lpwModuleName) + { + return BASEP_GET_MODULE_HANDLE_EX_PARAMETER_VALIDATION_CONTINUE; + } + + /* No name given, so put ImageBaseAddress there */ + *phModule = (HMODULE)NtCurrentPeb()->ImageBaseAddress; + + return BASEP_GET_MODULE_HANDLE_EX_PARAMETER_VALIDATION_SUCCESS; +} + /** * @name GetDllLoadPath * @@ -220,7 +265,7 @@ LoadLibraryExW ( HINSTANCE hInst; NTSTATUS Status; PWSTR SearchPath; - ULONG DllCharacteristics; + ULONG DllCharacteristics = 0; BOOL FreeString = FALSE; (void)hFile; @@ -350,26 +395,37 @@ BOOL WINAPI FreeLibrary(HINSTANCE hLibModule) { NTSTATUS Status; - if (!hLibModule) - { - SetLastError(ERROR_INVALID_HANDLE); - return FALSE; - } - if ((ULONG_PTR)hLibModule & 1) { - /* this is a LOAD_LIBRARY_AS_DATAFILE module */ - char *ptr = (char *)hLibModule - 1; - return UnmapViewOfFile(ptr); + /* This is a LOAD_LIBRARY_AS_DATAFILE module */ + if (RtlImageNtHeader((PVOID)((ULONG_PTR)hLibModule & ~1))) + { + /* Unmap view */ + Status = NtUnmapViewOfSection(NtCurrentProcess(), (PVOID)((ULONG_PTR)hLibModule & ~1)); + + /* Unload alternate resource module */ + LdrUnloadAlternateResourceModule(hLibModule); + } + else + Status = STATUS_INVALID_IMAGE_FORMAT; + } + else + { + /* Just unload it */ + Status = LdrUnloadDll((PVOID)hLibModule); } - Status = LdrUnloadDll(hLibModule); + /* Check what kind of status we got */ if (!NT_SUCCESS(Status)) { - SetLastErrorByStatus(Status); + /* Set last error */ + BaseSetLastNTError(Status); + + /* Return failure */ return FALSE; } + /* Return success */ return TRUE; } @@ -379,12 +435,30 @@ BOOL WINAPI FreeLibrary(HINSTANCE hLibModule) */ VOID WINAPI -FreeLibraryAndExitThread ( - HMODULE hLibModule, - DWORD dwExitCode - ) +FreeLibraryAndExitThread(HMODULE hLibModule, + DWORD dwExitCode) { - FreeLibrary(hLibModule); + NTSTATUS Status; + + if ((ULONG_PTR)hLibModule & 1) + { + /* This is a LOAD_LIBRARY_AS_DATAFILE module */ + if (RtlImageNtHeader((PVOID)((ULONG_PTR)hLibModule & ~1))) + { + /* Unmap view */ + Status = NtUnmapViewOfSection(NtCurrentProcess(), (PVOID)((ULONG_PTR)hLibModule & ~1)); + + /* Unload alternate resource module */ + LdrUnloadAlternateResourceModule(hLibModule); + } + } + else + { + /* Just unload it */ + Status = LdrUnloadDll((PVOID)hLibModule); + } + + /* Exit thread */ ExitThread(dwExitCode); } @@ -394,123 +468,287 @@ FreeLibraryAndExitThread ( */ DWORD WINAPI -GetModuleFileNameA ( - HINSTANCE hModule, - LPSTR lpFilename, - DWORD nSize - ) +GetModuleFileNameA(HINSTANCE hModule, + LPSTR lpFilename, + DWORD nSize) { - ANSI_STRING FileName; - PLIST_ENTRY ModuleListHead; - PLIST_ENTRY Entry; - PLDR_DATA_TABLE_ENTRY Module; - PPEB Peb; - ULONG Length = 0; + UNICODE_STRING filenameW; + ANSI_STRING FilenameA; + NTSTATUS Status; + DWORD Length = 0; - Peb = NtCurrentPeb (); - RtlEnterCriticalSection (Peb->LoaderLock); + /* Allocate a unicode buffer */ + filenameW.Buffer = RtlAllocateHeap(RtlGetProcessHeap(), 0, nSize * sizeof(WCHAR)); + if (!filenameW.Buffer) + { + BaseSetLastNTError(STATUS_NO_MEMORY); + return 0; + } - if (hModule == NULL) - hModule = Peb->ImageBaseAddress; + /* Call unicode API */ + filenameW.Length = GetModuleFileNameW(hModule, filenameW.Buffer, nSize) * sizeof(WCHAR); + filenameW.MaximumLength = filenameW.Length + sizeof(WCHAR); - ModuleListHead = &Peb->Ldr->InLoadOrderModuleList; - Entry = ModuleListHead->Flink; + if (filenameW.Length) + { + /* Convert to ansi string */ + Status = BasepUnicodeStringTo8BitString(&FilenameA, &filenameW, TRUE); + if (!NT_SUCCESS(Status)) + { + /* Set last error, free string and retun failure */ + BaseSetLastNTError(Status); + RtlFreeUnicodeString(&filenameW); + return 0; + } - while (Entry != ModuleListHead) - { - Module = CONTAINING_RECORD(Entry, LDR_DATA_TABLE_ENTRY, InLoadOrderLinks); - if (Module->DllBase == (PVOID)hModule) - { - Length = min(nSize, Module->FullDllName.Length / sizeof(WCHAR)); - FileName.Length = 0; - FileName.MaximumLength = (USHORT)Length * sizeof(WCHAR); - FileName.Buffer = lpFilename; + /* Calculate size to copy */ + Length = min(nSize, FilenameA.Length); - /* convert unicode string to ansi (or oem) */ - if (bIsFileApiAnsi) - RtlUnicodeStringToAnsiString (&FileName, - &Module->FullDllName, - FALSE); - else - RtlUnicodeStringToOemString (&FileName, - &Module->FullDllName, - FALSE); - - if (Length < nSize) - lpFilename[Length] = '\0'; - else - SetLastErrorByStatus (STATUS_BUFFER_TOO_SMALL); + /* Remove terminating zero */ + if (Length == FilenameA.Length) + Length--; - RtlLeaveCriticalSection (Peb->LoaderLock); - return Length; - } + /* Now copy back to the caller amount he asked */ + RtlMoveMemory(lpFilename, FilenameA.Buffer, Length); - Entry = Entry->Flink; - } + /* Free ansi filename */ + RtlFreeAnsiString(&FilenameA); + } - SetLastErrorByStatus (STATUS_DLL_NOT_FOUND); - RtlLeaveCriticalSection (Peb->LoaderLock); + /* Free unicode filename */ + RtlFreeHeap(RtlGetProcessHeap(), 0, filenameW.Buffer); - return 0; + /* Return length copied */ + return Length; } - /* * @implemented */ DWORD WINAPI -GetModuleFileNameW ( - HINSTANCE hModule, - LPWSTR lpFilename, - DWORD nSize - ) +GetModuleFileNameW(HINSTANCE hModule, + LPWSTR lpFilename, + DWORD nSize) { - UNICODE_STRING FileName; - PLIST_ENTRY ModuleListHead; - PLIST_ENTRY Entry; - PLDR_DATA_TABLE_ENTRY Module; - PPEB Peb; - ULONG Length = 0; + PLIST_ENTRY ModuleListHead, Entry; + PLDR_DATA_TABLE_ENTRY Module; + ULONG Length = 0; + ULONG Cookie; + PPEB Peb; - Peb = NtCurrentPeb (); - RtlEnterCriticalSection (Peb->LoaderLock); + /* Upscale nSize from chars to bytes */ + nSize *= sizeof(WCHAR); - if (hModule == NULL) - hModule = Peb->ImageBaseAddress; + _SEH2_TRY + { + /* We don't use per-thread cur dir now */ + //PRTL_PERTHREAD_CURDIR PerThreadCurdir = (PRTL_PERTHREAD_CURDIR)teb->NtTib.SubSystemTib; - ModuleListHead = &Peb->Ldr->InLoadOrderModuleList; - Entry = ModuleListHead->Flink; - while (Entry != ModuleListHead) - { - Module = CONTAINING_RECORD(Entry, LDR_DATA_TABLE_ENTRY, InLoadOrderLinks); + Peb = NtCurrentPeb (); - if (Module->DllBase == (PVOID)hModule) - { - Length = min(nSize, Module->FullDllName.Length / sizeof(WCHAR)); - FileName.Length = 0; - FileName.MaximumLength = (USHORT) Length * sizeof(WCHAR); - FileName.Buffer = lpFilename; + /* Acquire a loader lock */ + LdrLockLoaderLock(LDR_LOCK_LOADER_LOCK_FLAG_RAISE_STATUS, NULL, &Cookie); - RtlCopyUnicodeString (&FileName, - &Module->FullDllName); - if (Length < nSize) - lpFilename[Length] = L'\0'; - else - SetLastErrorByStatus (STATUS_BUFFER_TOO_SMALL); + /* Traverse the module list */ + ModuleListHead = &Peb->Ldr->InLoadOrderModuleList; + Entry = ModuleListHead->Flink; + while (Entry != ModuleListHead) + { + Module = CONTAINING_RECORD(Entry, LDR_DATA_TABLE_ENTRY, InLoadOrderLinks); - RtlLeaveCriticalSection (Peb->LoaderLock); + /* Check if this is the requested module */ + if (Module->DllBase == (PVOID)hModule) + { + /* Calculate size to copy */ + Length = min(nSize, Module->FullDllName.MaximumLength); - return Length; - } + /* Copy contents */ + RtlMoveMemory(lpFilename, Module->FullDllName.Buffer, Length); - Entry = Entry->Flink; - } + /* Subtract a terminating zero */ + if (Length == Module->FullDllName.MaximumLength) + Length -= sizeof(WCHAR); - SetLastErrorByStatus (STATUS_DLL_NOT_FOUND); - RtlLeaveCriticalSection (Peb->LoaderLock); + /* Break out of the loop */ + break; + } - return 0; + /* Advance to the next entry */ + Entry = Entry->Flink; + } + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + BaseSetLastNTError(_SEH2_GetExceptionCode()); + Length = 0; + } _SEH2_END + + /* Release the loader lock */ + LdrUnlockLoaderLock(LDR_LOCK_LOADER_LOCK_FLAG_RAISE_STATUS, Cookie); + + return Length; +} + +HMODULE +WINAPI +GetModuleHandleForUnicodeString(PUNICODE_STRING ModuleName) +{ + NTSTATUS Status; + PVOID Module; + LPWSTR DllPath; + + /* Try to get a handle with a magic value of 1 for DllPath */ + Status = LdrGetDllHandle((LPWSTR)1, NULL, ModuleName, &Module); + + /* If that succeeded - we're done */ + if (NT_SUCCESS(Status)) return Module; + + /* If not, then the path should be computed */ + DllPath = BasepGetDllPath(NULL, 0); + + /* Call LdrGetHandle() again providing the computed DllPath + and wrapped into SEH */ + _SEH2_TRY + { + Status = LdrGetDllHandle(DllPath, NULL, ModuleName, &Module); + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + /* Fail with the SEH error */ + Status = _SEH2_GetExceptionCode(); + } + _SEH2_END; + + /* Free the DllPath */ + RtlFreeHeap(RtlGetProcessHeap(), 0, DllPath); + + /* In case of error set last win32 error and return NULL */ + if (!NT_SUCCESS(Status)) + { + DPRINT("Failure acquiring DLL module '%wZ' handle, Status 0x%08X\n", ModuleName, Status); + SetLastErrorByStatus(Status); + Module = 0; + } + + /* Return module */ + return (HMODULE)Module; +} + +BOOLEAN +WINAPI +BasepGetModuleHandleExW(BOOLEAN NoLock, DWORD dwPublicFlags, LPCWSTR lpwModuleName, HMODULE *phModule) +{ + DWORD Cookie; + NTSTATUS Status = STATUS_SUCCESS, Status2; + HANDLE hModule = 0; + UNICODE_STRING ModuleNameU; + DWORD dwValid; + BOOLEAN Redirected = FALSE; // FIXME + + /* Validate parameters */ + dwValid = BasepGetModuleHandleExParameterValidation(dwPublicFlags, lpwModuleName, phModule); + ASSERT(dwValid == BASEP_GET_MODULE_HANDLE_EX_PARAMETER_VALIDATION_CONTINUE); + + /* Acquire lock if necessary */ + if (!NoLock) + { + Status = LdrLockLoaderLock(0, NULL, &Cookie); + if (!NT_SUCCESS(Status)) + { + /* Fail */ + SetLastErrorByStatus(Status); + if (phModule) *phModule = 0; + return Status; + } + } + + if (!(dwPublicFlags & GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS)) + { + /* Create a unicode string out of module name */ + RtlInitUnicodeString(&ModuleNameU, lpwModuleName); + + // FIXME: Do some redirected DLL stuff? + if (Redirected) + { + UNIMPLEMENTED; + } + + if (!hModule) + { + hModule = GetModuleHandleForUnicodeString(&ModuleNameU); + if (!hModule) + { + // FIXME: Status?! + goto quickie; + } + } + } + else + { + /* Perform Pc to file header to get module instance */ + hModule = (HMODULE)RtlPcToFileHeader((PVOID)lpwModuleName, + (PVOID*)&hModule); + + /* Check if it succeeded */ + if (!hModule) + { + /* Set "dll not found" status and quit */ + Status = STATUS_DLL_NOT_FOUND; + goto quickie; + } + } + + /* Check if changing reference is not forbidden */ + if (!(dwPublicFlags & GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT)) + { + /* Add reference to this DLL */ + Status = LdrAddRefDll((dwPublicFlags & GET_MODULE_HANDLE_EX_FLAG_PIN) ? LDR_PIN_MODULE : 0, + hModule); + } + +quickie: + /* Unlock loader lock if it was acquired */ + if (!NoLock) + { + Status2 = LdrUnlockLoaderLock(0, Cookie); + ASSERT(NT_SUCCESS(Status2)); + } + + /* Set last error in case of failure */ + if (!NT_SUCCESS(Status)) + SetLastErrorByStatus(Status); + + /* Set the module handle to the caller */ + if (phModule) *phModule = hModule; + + /* Return TRUE on success and FALSE otherwise */ + return NT_SUCCESS(Status); +} + +/* + * @implemented + */ +HMODULE +WINAPI +GetModuleHandleA(LPCSTR lpModuleName) +{ + PUNICODE_STRING ModuleNameW; + PTEB pTeb = NtCurrentTeb(); + + /* Check if we have no name to convert */ + if (!lpModuleName) + return ((HMODULE)pTeb->ProcessEnvironmentBlock->ImageBaseAddress); + + /* Convert module name to unicode */ + ModuleNameW = Basep8BitStringToStaticUnicodeString(lpModuleName); + + /* Call W version if conversion was successful */ + if (ModuleNameW) + return GetModuleHandleW(ModuleNameW->Buffer); + + /* Return failure */ + return 0; } @@ -519,61 +757,26 @@ GetModuleFileNameW ( */ HMODULE WINAPI -GetModuleHandleA ( LPCSTR lpModuleName ) +GetModuleHandleW(LPCWSTR lpModuleName) { - ANSI_STRING ModuleName; - NTSTATUS Status; - PTEB pTeb = NtCurrentTeb(); + HMODULE hModule; + NTSTATUS Status; - if (lpModuleName == NULL) - { - return ((HMODULE)pTeb->ProcessEnvironmentBlock->ImageBaseAddress); - } + /* If current module is requested - return it right away */ + if (!lpModuleName) + return ((HMODULE)NtCurrentPeb()->ImageBaseAddress); - RtlInitAnsiString(&ModuleName, lpModuleName); + /* Use common helper routine */ + Status = BasepGetModuleHandleExW(TRUE, + GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, + lpModuleName, + &hModule); - Status = RtlAnsiStringToUnicodeString(&pTeb->StaticUnicodeString, - &ModuleName, - FALSE); + /* If it wasn't successful - return 0 */ + if (!NT_SUCCESS(Status)) hModule = 0; - if (NT_SUCCESS(Status)) - { - return GetModuleHandleW(pTeb->StaticUnicodeString.Buffer); - } - - SetLastErrorByStatus(Status); - return FALSE; -} - - -/* - * @implemented - */ -HMODULE -WINAPI -GetModuleHandleW (LPCWSTR lpModuleName) -{ - UNICODE_STRING ModuleName; - PVOID BaseAddress; - NTSTATUS Status; - - if (lpModuleName == NULL) - return ((HMODULE)NtCurrentPeb()->ImageBaseAddress); - - RtlInitUnicodeString (&ModuleName, - (LPWSTR)lpModuleName); - - Status = LdrGetDllHandle (0, - 0, - &ModuleName, - &BaseAddress); - if (!NT_SUCCESS(Status)) - { - SetLastErrorByStatus (Status); - return NULL; - } - - return ((HMODULE)BaseAddress); + /* Return the handle */ + return hModule; } @@ -583,64 +786,31 @@ GetModuleHandleW (LPCWSTR lpModuleName) BOOL WINAPI GetModuleHandleExW(IN DWORD dwFlags, - IN LPCWSTR lpModuleName OPTIONAL, + IN LPCWSTR lpwModuleName OPTIONAL, OUT HMODULE* phModule) { - HMODULE hModule; NTSTATUS Status; + DWORD dwValid; BOOL Ret = FALSE; - if (phModule == NULL || - ((dwFlags & (GET_MODULE_HANDLE_EX_FLAG_PIN | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT)) == - (GET_MODULE_HANDLE_EX_FLAG_PIN | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT))) - { - SetLastError(ERROR_INVALID_PARAMETER); - return FALSE; - } + /* Validate parameters */ + dwValid = BasepGetModuleHandleExParameterValidation(dwFlags, lpwModuleName, phModule); - if (lpModuleName == NULL) - { - hModule = NtCurrentPeb()->ImageBaseAddress; - } - else - { - if (dwFlags & GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS) - { - hModule = (HMODULE)RtlPcToFileHeader((PVOID)lpModuleName, - (PVOID*)&hModule); - if (hModule == NULL) - { - SetLastErrorByStatus(STATUS_DLL_NOT_FOUND); - } - } - else - { - hModule = GetModuleHandleW(lpModuleName); - } - } + /* If result is invalid parameter - return failure */ + if (dwValid == BASEP_GET_MODULE_HANDLE_EX_PARAMETER_VALIDATION_FAIL) return FALSE; - if (hModule != NULL) - { - if (!(dwFlags & GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT)) - { - Status = LdrAddRefDll((dwFlags & GET_MODULE_HANDLE_EX_FLAG_PIN) ? LDR_PIN_MODULE : 0, - hModule); + /* If result is 2, there is no need to do anything - return success. */ + if (dwValid == BASEP_GET_MODULE_HANDLE_EX_PARAMETER_VALIDATION_SUCCESS) return TRUE; - if (NT_SUCCESS(Status)) - { - Ret = TRUE; - } - else - { - SetLastErrorByStatus(Status); - hModule = NULL; - } - } - else - Ret = TRUE; - } + /* Use common helper routine */ + Status = BasepGetModuleHandleExW(FALSE, + dwFlags, + lpwModuleName, + phModule); + + /* Return TRUE in case of success */ + if (NT_SUCCESS(Status)) Ret = TRUE; - *phModule = hModule; return Ret; } @@ -650,41 +820,45 @@ GetModuleHandleExW(IN DWORD dwFlags, BOOL WINAPI GetModuleHandleExA(IN DWORD dwFlags, - IN LPCSTR lpModuleName OPTIONAL, + IN LPCSTR lpModuleName OPTIONAL, OUT HMODULE* phModule) { - ANSI_STRING ModuleName; - LPCWSTR lpModuleNameW; - NTSTATUS Status; + PUNICODE_STRING lpModuleNameW; + DWORD dwValid; BOOL Ret; - PTEB pTeb = NtCurrentTeb(); + /* Validate parameters */ + dwValid = BasepGetModuleHandleExParameterValidation(dwFlags, (LPCWSTR)lpModuleName, phModule); + /* If result is invalid parameter - return failure */ + if (dwValid == BASEP_GET_MODULE_HANDLE_EX_PARAMETER_VALIDATION_FAIL) return FALSE; + + /* If result is 2, there is no need to do anything - return success. */ + if (dwValid == BASEP_GET_MODULE_HANDLE_EX_PARAMETER_VALIDATION_SUCCESS) return TRUE; + + /* Check if we don't need to convert the name */ if (dwFlags & GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS) { - lpModuleNameW = (LPCWSTR)lpModuleName; + /* Call the W version of the API without conversion */ + Ret = GetModuleHandleExW(dwFlags, + (LPCWSTR)lpModuleName, + phModule); } else { - RtlInitAnsiString(&ModuleName, lpModuleName); + /* Convert module name to unicode */ + lpModuleNameW = Basep8BitStringToStaticUnicodeString(lpModuleName); - Status = RtlAnsiStringToUnicodeString(&pTeb->StaticUnicodeString, - &ModuleName, - FALSE); + /* Return FALSE if conversion failed */ + if (!lpModuleNameW) return FALSE; - if (!NT_SUCCESS(Status)) - { - SetLastErrorByStatus(Status); - return FALSE; - } - - lpModuleNameW = pTeb->StaticUnicodeString.Buffer; + /* Call the W version of the API */ + Ret = GetModuleHandleExW(dwFlags, + lpModuleNameW->Buffer, + phModule); } - Ret = GetModuleHandleExW(dwFlags, - lpModuleNameW, - phModule); - + /* Return result */ return Ret; } diff --git a/reactos/dll/win32/kernel32/process/procsup.c b/reactos/dll/win32/kernel32/process/procsup.c index 95f415b9a04..39f700714d3 100644 --- a/reactos/dll/win32/kernel32/process/procsup.c +++ b/reactos/dll/win32/kernel32/process/procsup.c @@ -452,7 +452,7 @@ secondattempt: if (!BasepExeLdrEntry) LdrEnumerateLoadedModules(0, BasepLocateExeLdrEntry, Peb->ImageBaseAddress); - DPRINT1("Found BasepExeLdrEntry %wZ\n", &BasepExeLdrEntry->FullDllName); + DPRINT("Found BasepExeLdrEntry %wZ\n", &BasepExeLdrEntry->FullDllName); /* Set name pointer to the full dll path */ NamePtr = BasepExeLdrEntry->FullDllName.Buffer; @@ -542,9 +542,7 @@ secondattempt: /* Null terminate the string */ NamePtr[DefaultLength / sizeof(WCHAR)] = 0; - DPRINT("Path: %S\n", NamePtr); - - return NULL; + return PathBuffer; } LPWSTR From f66194544b40541bf3a8028dc095cb20672babd7 Mon Sep 17 00:00:00 2001 From: James Tabor Date: Sun, 3 Apr 2011 12:22:00 +0000 Subject: [PATCH 064/317] [Win32k] - Fix DDE test crash. it's a band-aide. - Fix the last two post quite message test, all pass now. svn path=/trunk/; revision=51239 --- .../subsystems/win32/win32k/ntuser/message.c | 37 ++++++++++--------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/reactos/subsystems/win32/win32k/ntuser/message.c b/reactos/subsystems/win32/win32k/ntuser/message.c index 53e2b432a4f..e13b30352a3 100644 --- a/reactos/subsystems/win32/win32k/ntuser/message.c +++ b/reactos/subsystems/win32/win32k/ntuser/message.c @@ -320,6 +320,7 @@ PackParam(LPARAM *lParamPacked, UINT Msg, WPARAM wParam, LPARAM lParam, BOOL Non { PMSGMEMORY MsgMemoryEntry; PVOID PackedData; + SIZE_T size; MsgMemoryEntry = FindMsgMemory(Msg); @@ -328,7 +329,13 @@ PackParam(LPARAM *lParamPacked, UINT Msg, WPARAM wParam, LPARAM lParam, BOOL Non /* Keep previous behavior */ return STATUS_SUCCESS; } - PackedData = ExAllocatePoolWithTag(NonPagedPool, MsgMemorySize(MsgMemoryEntry, wParam, lParam), TAG_MSG); + size = MsgMemorySize(MsgMemoryEntry, wParam, lParam); + if (!size) + { + DPRINT1("No size for lParamPacked\n"); + return STATUS_SUCCESS; + } + PackedData = ExAllocatePoolWithTag(NonPagedPool, size, TAG_MSG); RtlCopyMemory(PackedData, (PVOID)lParam, MsgMemorySize(MsgMemoryEntry, wParam, lParam)); *lParamPacked = (LPARAM)PackedData; } @@ -937,11 +944,7 @@ co_IntGetPeekMessage( PMSG pMsg, co_HOOK_CallHooks( WH_GETMESSAGE, HC_ACTION, RemoveMsg & PM_REMOVE, (LPARAM)pMsg); - if ( bGMSG ) - { - Present = (WM_QUIT != pMsg->message); - break; - } + if ( bGMSG ) break; } if ( bGMSG ) @@ -1044,7 +1047,6 @@ UserPostMessage( HWND Wnd, PTHREADINFO pti; MSG Message, KernelModeMsg; LARGE_INTEGER LargeTickCount; - PMSGMEMORY MsgMemoryEntry; Message.hwnd = Wnd; Message.message = Msg; @@ -1054,11 +1056,18 @@ UserPostMessage( HWND Wnd, KeQueryTickCount(&LargeTickCount); Message.time = MsqCalculateMessageTime(&LargeTickCount); - MsgMemoryEntry = FindMsgMemory(Message.message); + if (is_pointer_message(Message.message)) + { + EngSetLastError(ERROR_MESSAGE_SYNC_ONLY ); + return FALSE; + } if( Msg >= WM_DDE_FIRST && Msg <= WM_DDE_LAST ) { NTSTATUS Status; + PMSGMEMORY MsgMemoryEntry; + + MsgMemoryEntry = FindMsgMemory(Message.message); Status = CopyMsgToKernelMem(&KernelModeMsg, &Message, MsgMemoryEntry); if (! NT_SUCCESS(Status)) @@ -1077,12 +1086,6 @@ UserPostMessage( HWND Wnd, return TRUE; } - if (is_pointer_message(Message.message)) - { - EngSetLastError(ERROR_MESSAGE_SYNC_ONLY ); - return FALSE; - } - if (!Wnd) { return UserPostThreadMessage( PtrToInt(PsGetCurrentThreadId()), @@ -1276,8 +1279,8 @@ co_IntSendMessageTimeoutSingle( HWND hWnd, if (STATUS_TIMEOUT == Status) { - /* -MSDN says: +/* + MSDN says: Microsoft Windows 2000: If GetLastError returns zero, then the function timed out. XP+ : If the function fails or times out, the return value is zero. @@ -1873,7 +1876,7 @@ NtUserGetMessage(PMSG pMsg, _SEH2_END; } - return Ret; + return Ret ? (WM_QUIT != pMsg->message) : FALSE; } BOOL APIENTRY From 8907f384ebaeaf223713a6fe896be6007f63481c Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sun, 3 Apr 2011 14:51:18 +0000 Subject: [PATCH 065/317] [LSASRV] Fix typos in lsa.idl (LsarLookupNames2, LsarLookupNames3 and LsarLookupNames4) and fix resulting errors in lsasrv.dll. svn path=/trunk/; revision=51240 --- reactos/dll/win32/lsasrv/lsarpc.c | 6 +++--- reactos/include/reactos/idl/lsa.idl | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/reactos/dll/win32/lsasrv/lsarpc.c b/reactos/dll/win32/lsasrv/lsarpc.c index 9055bf608e0..7887a7d5abf 100644 --- a/reactos/dll/win32/lsasrv/lsarpc.c +++ b/reactos/dll/win32/lsasrv/lsarpc.c @@ -1185,7 +1185,7 @@ NTSTATUS WINAPI LsarLookupNames2( DWORD Count, PRPC_UNICODE_STRING Names, PLSAPR_REFERENCED_DOMAIN_LIST *ReferencedDomains, - PLSAPR_TRANSLATED_SID_EX TranslatedSids, + PLSAPR_TRANSLATED_SIDS_EX TranslatedSids, LSAP_LOOKUP_LEVEL LookupLevel, DWORD *MappedCount, DWORD LookupOptions, @@ -1287,7 +1287,7 @@ NTSTATUS WINAPI LsarLookupNames3( DWORD Count, PRPC_UNICODE_STRING Names, PLSAPR_REFERENCED_DOMAIN_LIST *ReferencedDomains, - PLSAPR_TRANSLATED_SID_EX2 TranslatedSids, + PLSAPR_TRANSLATED_SIDS_EX2 TranslatedSids, LSAP_LOOKUP_LEVEL LookupLevel, DWORD *MappedCount, DWORD LookupOptions, @@ -1391,7 +1391,7 @@ NTSTATUS WINAPI LsarLookupNames4( DWORD Count, PRPC_UNICODE_STRING Names, PLSAPR_REFERENCED_DOMAIN_LIST *ReferencedDomains, - PLSAPR_TRANSLATED_SID_EX2 TranslatedSids, + PLSAPR_TRANSLATED_SIDS_EX2 TranslatedSids, LSAP_LOOKUP_LEVEL LookupLevel, DWORD *MappedCount, DWORD LookupOptions, diff --git a/reactos/include/reactos/idl/lsa.idl b/reactos/include/reactos/idl/lsa.idl index 00949cf4779..2a9aba6e8cb 100644 --- a/reactos/include/reactos/idl/lsa.idl +++ b/reactos/include/reactos/idl/lsa.idl @@ -975,7 +975,7 @@ cpp_quote("#if _WIN32_WINNT >= 0x0500") [in] DWORD Count, [in, size_is(Count)] PRPC_UNICODE_STRING Names, [out] PLSAPR_REFERENCED_DOMAIN_LIST *ReferencedDomains, - [in, out] PLSAPR_TRANSLATED_SID_EX TranslatedSids, + [in, out] PLSAPR_TRANSLATED_SIDS_EX TranslatedSids, [in] LSAP_LOOKUP_LEVEL LookupLevel, [in, out] DWORD *MappedCount, [in] DWORD LookupOptions, @@ -1029,7 +1029,7 @@ cpp_quote("#if _WIN32_WINNT >= 0x0501") [in] DWORD Count, [in, size_is(Count)] PRPC_UNICODE_STRING Names, [out] PLSAPR_REFERENCED_DOMAIN_LIST *ReferencedDomains, - [in, out] PLSAPR_TRANSLATED_SID_EX2 TranslatedSids, + [in, out] PLSAPR_TRANSLATED_SIDS_EX2 TranslatedSids, [in] LSAP_LOOKUP_LEVEL LookupLevel, [in, out] DWORD *MappedCount, [in] DWORD LookupOptions, @@ -1088,7 +1088,7 @@ cpp_quote("#if _WIN32_WINNT >= 0x0501") [in] DWORD Count, [in, size_is(Count)] PRPC_UNICODE_STRING Names, [out] PLSAPR_REFERENCED_DOMAIN_LIST *ReferencedDomains, - [in, out] PLSAPR_TRANSLATED_SID_EX2 TranslatedSids, + [in, out] PLSAPR_TRANSLATED_SIDS_EX2 TranslatedSids, [in] LSAP_LOOKUP_LEVEL LookupLevel, [in, out] DWORD *MappedCount, [in] DWORD LookupOptions, From 4c2b7d67a104524c877704716d41ef285a4509bf Mon Sep 17 00:00:00 2001 From: Ged Murphy Date: Sun, 3 Apr 2011 16:22:15 +0000 Subject: [PATCH 066/317] [FULLFAT] - Add the kernel APIs required by the library svn path=/trunk/; revision=51241 --- reactos/lib/3rdparty/fullfat/ff_safety.c | 107 ++++++++++++++++++----- 1 file changed, 85 insertions(+), 22 deletions(-) diff --git a/reactos/lib/3rdparty/fullfat/ff_safety.c b/reactos/lib/3rdparty/fullfat/ff_safety.c index 9659f5a57eb..685185c07b8 100644 --- a/reactos/lib/3rdparty/fullfat/ff_safety.c +++ b/reactos/lib/3rdparty/fullfat/ff_safety.c @@ -55,50 +55,113 @@ **/ #include "ff_safety.h" // ncludes ff_types.h +#include +#define TAG_FULLFAT 'FLUF' + +// Call your OS's CreateSemaphore function +// void *FF_CreateSemaphore(void) { - // Call your OS's CreateSemaphore function - // + PKSEMAPHORE ProcessSemaphore; - // return pointer to semaphore - return NULL; // Comment this out for your implementation. + /* Allocate some memory to store the semaphore */ + ProcessSemaphore = ExAllocatePoolWithTag(NonPagedPool, + sizeof(KSEMAPHORE), + TAG_FULLFAT); + if (ProcessSemaphore) + { + /* Initialize it */ + KeInitializeSemaphore(ProcessSemaphore, + 0, + MAXLONG); + } + + return ProcessSemaphore; } +// Call your OS's PendSemaphore with the provided pSemaphore pointer. +// +// This should block indefinitely until the Semaphore +// becomes available. (No timeout!) +// If your OS doesn't do it for you, you should sleep +// this thread until the Semaphore is available. void FF_PendSemaphore(void *pSemaphore) { - // Call your OS's PendSemaphore with the provided pSemaphore pointer. - // - // This should block indefinitely until the Semaphore - // becomes available. (No timeout!) - // If your OS doesn't do it for you, you should sleep - // this thread until the Semaphore is available. - pSemaphore = 0; + NTSTATUS Status; + + /* Sanity check */ + if (pSemaphore) + { + /* Wait for the sempaphore to become signaled */ + Status = KeWaitForSingleObject(pSemaphore, + Executive, + KernelMode, + FALSE, + NULL); + if (NT_SUCCESS(Status)) + { + if (Status != STATUS_SUCCESS) + { + // log an error? + } + } + else + { + // log an error? + } + } } +// Call your OS's ReleaseSemaphore with the provided pSemaphore pointer. +// void FF_ReleaseSemaphore(void *pSemaphore) { - // Call your OS's ReleaseSemaphore with the provided pSemaphore pointer. - // - // - pSemaphore = 0; + /* Sanity check */ + if (pSemaphore) + { + /* Increment the semaphore */ + KeReleaseSemaphore(pSemaphore, + 0, + 1, + FALSE); + } } +// Call your OS's DestroySemaphore with the provided pSemaphore pointer. +// void FF_DestroySemaphore(void *pSemaphore) { - // Call your OS's DestroySemaphore with the provided pSemaphore pointer. - // - // - pSemaphore = 0; + /* Sanity check */ + if (pSemaphore) + { + /* Free the semaphore memory */ + ExFreePoolWithTag(pSemaphore, + TAG_FULLFAT); + } } +// FIXME: what do we do with this? void FF_Yield(void) { // Call your OS's thread Yield function. // If this doesn't work, then a deadlock will occur } +// Call your OS's thread sleep function, +// Sleep for TimeMs milliseconds void FF_Sleep(FF_T_UINT32 TimeMs) { - // Call your OS's thread sleep function, - // Sleep for TimeMs milliseconds - TimeMs = 0; + LARGE_INTEGER Interval; + NTSTATUS Status; + + /* Calculate the interval */ + Interval.QuadPart = -((LONGLONG)TimeMs * 10000); + + /* Do the wait */ + Status = KeDelayExecutionThread(KernelMode, + FALSE, + &Interval); + if (!NT_SUCCESS(Status)) + { + // log an error? + } } From 9d955773ac73d1c7053e0e19d44c77b9970fc949 Mon Sep 17 00:00:00 2001 From: Sylvain Petreolle Date: Sun, 3 Apr 2011 20:26:57 +0000 Subject: [PATCH 067/317] [CONSOLE] Fix french resource file name. Dedicated to HeisSpiter & JanusMagnus. svn path=/trunk/; revision=51243 --- reactos/dll/cpl/console/lang/{fr-Fr.rc => fr-FR.rc} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename reactos/dll/cpl/console/lang/{fr-Fr.rc => fr-FR.rc} (100%) diff --git a/reactos/dll/cpl/console/lang/fr-Fr.rc b/reactos/dll/cpl/console/lang/fr-FR.rc similarity index 100% rename from reactos/dll/cpl/console/lang/fr-Fr.rc rename to reactos/dll/cpl/console/lang/fr-FR.rc From 526f2d84e4f5e8aecead9f5e859c83dd6af762c2 Mon Sep 17 00:00:00 2001 From: James Tabor Date: Sun, 3 Apr 2011 21:12:40 +0000 Subject: [PATCH 068/317] [Win32k] - Fix GetPeekMessage apitest that was broken when fixing the last two post quite message test. svn path=/trunk/; revision=51245 --- reactos/subsystems/win32/win32k/ntuser/message.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/reactos/subsystems/win32/win32k/ntuser/message.c b/reactos/subsystems/win32/win32k/ntuser/message.c index e13b30352a3..4081267b8c3 100644 --- a/reactos/subsystems/win32/win32k/ntuser/message.c +++ b/reactos/subsystems/win32/win32k/ntuser/message.c @@ -1861,7 +1861,7 @@ NtUserGetMessage(PMSG pMsg, UserLeave(); - if (Ret) + if (Ret == TRUE) { _SEH2_TRY { @@ -1876,7 +1876,10 @@ NtUserGetMessage(PMSG pMsg, _SEH2_END; } - return Ret ? (WM_QUIT != pMsg->message) : FALSE; + if ((INT)Ret != -1) + Ret = Ret ? (WM_QUIT != pMsg->message) : FALSE; + + return Ret; } BOOL APIENTRY From 53af1b545ed044078ad09f1df3c122d355c9461f Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Sun, 3 Apr 2011 21:46:42 +0000 Subject: [PATCH 069/317] [KERNEL32] - Implement BasepMapModuleHandle and use it in GetModuleFileNameW. Later, it'll be used by other module and loader related functions in kernel32. - Wrap a call to RtlImageNtHeader into SEH, because winetest and for some reason FF installer call it with incorrect handle and expect it to not crash (Windows also has SEH, but inside RtlImageNtHeader). - Fix null-termination problems in GetModuleFileNameA, and incorrect calculation of characters returned in GetModuleFileNameW. - Various smaller improvements to the rewritten code (missing parenthesis, better variable names, use pretty LDR_ macros from http://msdn.microsoft.com/en-us/library/ms684179(v=vs.85).aspx ). - Thanks for your feedback! See issue #6079 for more details. svn path=/trunk/; revision=51246 --- reactos/dll/win32/kernel32/misc/ldr.c | 72 +++++++++++++++++++-------- reactos/include/ndk/ldrtypes.h | 7 +++ 2 files changed, 58 insertions(+), 21 deletions(-) diff --git a/reactos/dll/win32/kernel32/misc/ldr.c b/reactos/dll/win32/kernel32/misc/ldr.c index 50fdcc31049..8dd3d9994dc 100644 --- a/reactos/dll/win32/kernel32/misc/ldr.c +++ b/reactos/dll/win32/kernel32/misc/ldr.c @@ -41,8 +41,8 @@ BasepGetModuleHandleExParameterValidation(DWORD dwFlags, if (dwFlags & ~(GET_MODULE_HANDLE_EX_FLAG_PIN | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT | GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS) || - (dwFlags & GET_MODULE_HANDLE_EX_FLAG_PIN && - dwFlags & GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT) || + ((dwFlags & GET_MODULE_HANDLE_EX_FLAG_PIN) && + (dwFlags & GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT)) || (!lpwModuleName && (dwFlags & GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS)) ) { @@ -69,6 +69,21 @@ BasepGetModuleHandleExParameterValidation(DWORD dwFlags, return BASEP_GET_MODULE_HANDLE_EX_PARAMETER_VALIDATION_SUCCESS; } +PVOID +WINAPI +BasepMapModuleHandle(HMODULE hModule, BOOLEAN AsDataFile) +{ + /* If no handle is provided - use current image base address */ + if (!hModule) return NtCurrentPeb()->ImageBaseAddress; + + /* Check if it's a normal or a datafile one */ + if (LDR_IS_DATAFILE(hModule) && !AsDataFile) + return NULL; + + /* It'a a normal DLL, just return its handle */ + return hModule; +} + /** * @name GetDllLoadPath * @@ -394,11 +409,22 @@ GetProcAddress( HMODULE hModule, LPCSTR lpProcName ) BOOL WINAPI FreeLibrary(HINSTANCE hLibModule) { NTSTATUS Status; + PIMAGE_NT_HEADERS NtHeaders; - if ((ULONG_PTR)hLibModule & 1) + if (LDR_IS_DATAFILE(hLibModule)) { - /* This is a LOAD_LIBRARY_AS_DATAFILE module */ - if (RtlImageNtHeader((PVOID)((ULONG_PTR)hLibModule & ~1))) + // FIXME: This SEH should go inside RtlImageNtHeader instead + _SEH2_TRY + { + /* This is a LOAD_LIBRARY_AS_DATAFILE module, check if it's a valid one */ + NtHeaders = RtlImageNtHeader((PVOID)((ULONG_PTR)hLibModule & ~1)); + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + NtHeaders = NULL; + } _SEH2_END + + if (NtHeaders) { /* Unmap view */ Status = NtUnmapViewOfSection(NtCurrentProcess(), (PVOID)((ULONG_PTR)hLibModule & ~1)); @@ -440,7 +466,7 @@ FreeLibraryAndExitThread(HMODULE hLibModule, { NTSTATUS Status; - if ((ULONG_PTR)hLibModule & 1) + if (LDR_IS_DATAFILE(hLibModule)) { /* This is a LOAD_LIBRARY_AS_DATAFILE module */ if (RtlImageNtHeader((PVOID)((ULONG_PTR)hLibModule & ~1))) @@ -472,51 +498,53 @@ GetModuleFileNameA(HINSTANCE hModule, LPSTR lpFilename, DWORD nSize) { - UNICODE_STRING filenameW; + UNICODE_STRING FilenameW; ANSI_STRING FilenameA; NTSTATUS Status; - DWORD Length = 0; + DWORD Length = 0, LengthToCopy; /* Allocate a unicode buffer */ - filenameW.Buffer = RtlAllocateHeap(RtlGetProcessHeap(), 0, nSize * sizeof(WCHAR)); - if (!filenameW.Buffer) + FilenameW.Buffer = RtlAllocateHeap(RtlGetProcessHeap(), 0, nSize * sizeof(WCHAR)); + if (!FilenameW.Buffer) { BaseSetLastNTError(STATUS_NO_MEMORY); return 0; } /* Call unicode API */ - filenameW.Length = GetModuleFileNameW(hModule, filenameW.Buffer, nSize) * sizeof(WCHAR); - filenameW.MaximumLength = filenameW.Length + sizeof(WCHAR); + FilenameW.Length = GetModuleFileNameW(hModule, FilenameW.Buffer, nSize) * sizeof(WCHAR); + FilenameW.MaximumLength = FilenameW.Length + sizeof(WCHAR); - if (filenameW.Length) + if (FilenameW.Length) { /* Convert to ansi string */ - Status = BasepUnicodeStringTo8BitString(&FilenameA, &filenameW, TRUE); + Status = BasepUnicodeStringTo8BitString(&FilenameA, &FilenameW, TRUE); if (!NT_SUCCESS(Status)) { /* Set last error, free string and retun failure */ BaseSetLastNTError(Status); - RtlFreeUnicodeString(&filenameW); + RtlFreeUnicodeString(&FilenameW); return 0; } /* Calculate size to copy */ Length = min(nSize, FilenameA.Length); - /* Remove terminating zero */ - if (Length == FilenameA.Length) - Length--; + /* Include terminating zero */ + if (nSize > Length) + LengthToCopy = Length + 1; + else + LengthToCopy = nSize; /* Now copy back to the caller amount he asked */ - RtlMoveMemory(lpFilename, FilenameA.Buffer, Length); + RtlMoveMemory(lpFilename, FilenameA.Buffer, LengthToCopy); /* Free ansi filename */ RtlFreeAnsiString(&FilenameA); } /* Free unicode filename */ - RtlFreeHeap(RtlGetProcessHeap(), 0, filenameW.Buffer); + RtlFreeHeap(RtlGetProcessHeap(), 0, FilenameW.Buffer); /* Return length copied */ return Length; @@ -537,6 +565,8 @@ GetModuleFileNameW(HINSTANCE hModule, ULONG Cookie; PPEB Peb; + hModule = BasepMapModuleHandle(hModule, FALSE); + /* Upscale nSize from chars to bytes */ nSize *= sizeof(WCHAR); @@ -587,7 +617,7 @@ GetModuleFileNameW(HINSTANCE hModule, /* Release the loader lock */ LdrUnlockLoaderLock(LDR_LOCK_LOADER_LOCK_FLAG_RAISE_STATUS, Cookie); - return Length; + return Length / sizeof(WCHAR); } HMODULE diff --git a/reactos/include/ndk/ldrtypes.h b/reactos/include/ndk/ldrtypes.h index aaf790ab6e5..4586f8325e5 100644 --- a/reactos/include/ndk/ldrtypes.h +++ b/reactos/include/ndk/ldrtypes.h @@ -79,6 +79,13 @@ Author: // #define IMAGE_SCN_TYPE_NOLOAD 0x00000002 +// +// Loader datafile/imagemapping macros +// +#define LDR_IS_DATAFILE(handle) (((ULONG_PTR)(handle)) & (ULONG_PTR)1) +#define LDR_IS_IMAGEMAPPING(handle) (((ULONG_PTR)(handle)) & (ULONG_PTR)2) +#define LDR_IS_RESOURCE(handle) (LDR_IS_IMAGEMAPPING(handle) || LDR_IS_DATAFILE(handle)) + // // Loader Data stored in the PEB // From 594dd8de49e5f05219ce28e1888ecdfb67079739 Mon Sep 17 00:00:00 2001 From: Sylvain Petreolle Date: Sun, 3 Apr 2011 22:09:07 +0000 Subject: [PATCH 070/317] [RBUILD] Use msvcrt as default crt for DLLs/OCX modules. svn path=/trunk/; revision=51247 --- reactos/tools/rbuild/module.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/tools/rbuild/module.cpp b/reactos/tools/rbuild/module.cpp index e0c9ff826df..f050640e68c 100644 --- a/reactos/tools/rbuild/module.cpp +++ b/reactos/tools/rbuild/module.cpp @@ -1226,7 +1226,7 @@ Module::GetDefaultModuleCRT () const return "static"; case Win32DLL: case Win32OCX: - return "ntdll"; + return "msvcrt"; case NativeDLL: case NativeCUI: return "ntdll"; From 7a18540a920ac8a3b7f8b50a68f6cbd085f833f5 Mon Sep 17 00:00:00 2001 From: James Tabor Date: Mon, 4 Apr 2011 07:18:54 +0000 Subject: [PATCH 071/317] [User32|Win32k] - Working on wine win test_capture_4, pass all the tests in test_capture_4_proc but still waiting forever in MenuTrackMenu:WaitMessage! svn path=/trunk/; revision=51248 --- reactos/dll/win32/user32/windows/menu.c | 6 ++- reactos/dll/win32/user32/windows/message.c | 5 ++- .../subsystems/win32/win32k/ntuser/focus.c | 28 +++++++++---- reactos/subsystems/win32/win32k/ntuser/misc.c | 39 ++++++++++--------- 4 files changed, 48 insertions(+), 30 deletions(-) diff --git a/reactos/dll/win32/user32/windows/menu.c b/reactos/dll/win32/user32/windows/menu.c index 9b500dbd8a0..38294269bef 100644 --- a/reactos/dll/win32/user32/windows/menu.c +++ b/reactos/dll/win32/user32/windows/menu.c @@ -3207,8 +3207,10 @@ static INT FASTCALL MenuTrackMenu(HMENU hmenu, UINT wFlags, INT x, INT y, fEndMenu = !fRemove; } - SetCapture(mt.OwnerWnd); - (void)NtUserSetGUIThreadHandle(MSQ_STATE_MENUOWNER, mt.OwnerWnd); + /* owner may not be visible when tracking a popup, so use the menu itself */ + capture_win = (wFlags & TPM_POPUPMENU) ? MenuInfo.Wnd : mt.OwnerWnd; + (void)NtUserSetGUIThreadHandle(MSQ_STATE_MENUOWNER, capture_win); // 1 + SetCapture(capture_win); // 2 FIXME("MenuTrackMenu 1\n"); while (! fEndMenu) diff --git a/reactos/dll/win32/user32/windows/message.c b/reactos/dll/win32/user32/windows/message.c index 5536d835cec..13d12147d09 100644 --- a/reactos/dll/win32/user32/windows/message.c +++ b/reactos/dll/win32/user32/windows/message.c @@ -2380,8 +2380,9 @@ GetCapture(VOID) BOOL WINAPI ReleaseCapture(VOID) { - NtUserSetCapture(NULL); - return(TRUE); + HWND hwndPrev = NtUserSetCapture(NULL); + return(hwndPrev ? TRUE : FALSE); +// return (BOOL)NtUserCallNoParam(NOPARAM_ROUTINE_RELEASECAPTURE); } diff --git a/reactos/subsystems/win32/win32k/ntuser/focus.c b/reactos/subsystems/win32/win32k/ntuser/focus.c index 9989e880956..65750944072 100644 --- a/reactos/subsystems/win32/win32k/ntuser/focus.c +++ b/reactos/subsystems/win32/win32k/ntuser/focus.c @@ -546,6 +546,9 @@ co_UserSetCapture(HWND hWnd) pti = PsGetCurrentThreadWin32Thread(); ThreadQueue = pti->MessageQueue; + if (ThreadQueue->QF_flags & QF_CAPTURELOCKED) + return NULL; + if ((Window = UserGetWindowObject(hWnd))) { if (Window->head.pti->MessageQueue != ThreadQueue) @@ -553,7 +556,7 @@ co_UserSetCapture(HWND hWnd) return NULL; } } - + hWndPrev = MsqSetStateWindow(ThreadQueue, MSQ_STATE_CAPTURE, hWnd); if (hWndPrev) @@ -563,19 +566,28 @@ co_UserSetCapture(HWND hWnd) IntNotifyWinEvent(EVENT_SYSTEM_CAPTUREEND, pWnd, OBJID_WINDOW, CHILDID_SELF, WEF_SETBYWNDPTI); } + if (Window) + IntNotifyWinEvent(EVENT_SYSTEM_CAPTURESTART, Window, OBJID_WINDOW, CHILDID_SELF, WEF_SETBYWNDPTI); + + if (hWndPrev && hWndPrev != hWnd) + { + if (ThreadQueue->MenuOwner && Window) ThreadQueue->QF_flags |= QF_CAPTURELOCKED; + + co_IntPostOrSendMessage(hWndPrev, WM_CAPTURECHANGED, 0, (LPARAM)hWnd); + + ThreadQueue->QF_flags &= ~QF_CAPTURELOCKED; + } + + ThreadQueue->CaptureWindow = hWnd; + + /// These are hacks! /* also remove other windows if not capturing anymore */ if (hWnd == NULL) { MsqSetStateWindow(ThreadQueue, MSQ_STATE_MENUOWNER, NULL); MsqSetStateWindow(ThreadQueue, MSQ_STATE_MOVESIZE, NULL); } - - if (Window) - IntNotifyWinEvent(EVENT_SYSTEM_CAPTURESTART, Window, OBJID_WINDOW, CHILDID_SELF, WEF_SETBYWNDPTI); - - co_IntPostOrSendMessage(hWndPrev, WM_CAPTURECHANGED, 0, (LPARAM)hWnd); - ThreadQueue->CaptureWindow = hWnd; - + /// return hWndPrev; } diff --git a/reactos/subsystems/win32/win32k/ntuser/misc.c b/reactos/subsystems/win32/win32k/ntuser/misc.c index 3a6b0e3f9d3..a36403e49c1 100644 --- a/reactos/subsystems/win32/win32k/ntuser/misc.c +++ b/reactos/subsystems/win32/win32k/ntuser/misc.c @@ -179,7 +179,9 @@ NtUserGetGUIThreadInfo( GUITHREADINFO SafeGui; PDESKTOP Desktop; PUSER_MESSAGE_QUEUE MsgQueue; + PTHREADINFO W32Thread; PETHREAD Thread = NULL; + DECLARE_RETURN(BOOLEAN); DPRINT("Enter NtUserGetGUIThreadInfo\n"); @@ -198,7 +200,7 @@ NtUserGetGUIThreadInfo( RETURN( FALSE); } - if(idThread) + if (idThread) { Status = PsLookupThreadByThreadId((HANDLE)(DWORD_PTR)idThread, &Thread); if(!NT_SUCCESS(Status)) @@ -206,24 +208,17 @@ NtUserGetGUIThreadInfo( EngSetLastError(ERROR_ACCESS_DENIED); RETURN( FALSE); } - Desktop = ((PTHREADINFO)Thread->Tcb.Win32Thread)->rpdesk; + W32Thread = (PTHREADINFO)Thread->Tcb.Win32Thread; + Desktop = W32Thread->rpdesk; } else - { - /* get the foreground thread */ - PTHREADINFO W32Thread = (PTHREADINFO)PsGetCurrentThread()->Tcb.Win32Thread; + { /* get the foreground thread */ + Thread = PsGetCurrentThread(); + W32Thread = (PTHREADINFO)Thread->Tcb.Win32Thread; Desktop = W32Thread->rpdesk; - if(Desktop) - { - MsgQueue = Desktop->ActiveMessageQueue; - if(MsgQueue) - { - Thread = MsgQueue->Thread; - } - } } - if(!Thread || !Desktop) + if (!Thread || !Desktop ) { if(idThread && Thread) ObDereferenceObject(Thread); @@ -231,13 +226,21 @@ NtUserGetGUIThreadInfo( RETURN( FALSE); } - MsgQueue = (PUSER_MESSAGE_QUEUE)Desktop->ActiveMessageQueue; + if ( W32Thread->MessageQueue ) + MsgQueue = W32Thread->MessageQueue; + else + { + if ( Desktop ) MsgQueue = Desktop->ActiveMessageQueue; + } + CaretInfo = MsgQueue->CaretInfo; SafeGui.flags = (CaretInfo->Visible ? GUI_CARETBLINKING : 0); - if(MsgQueue->MenuOwner) + + if (MsgQueue->MenuOwner) SafeGui.flags |= GUI_INMENUMODE | MsgQueue->MenuState; - if(MsgQueue->MoveSize) + + if (MsgQueue->MoveSize) SafeGui.flags |= GUI_INMOVESIZE; /* FIXME add flag GUI_16BITTASK */ @@ -254,7 +257,7 @@ NtUserGetGUIThreadInfo( SafeGui.rcCaret.right = SafeGui.rcCaret.left + CaretInfo->Size.cx; SafeGui.rcCaret.bottom = SafeGui.rcCaret.top + CaretInfo->Size.cy; - if(idThread) + if (idThread) ObDereferenceObject(Thread); Status = MmCopyToCaller(lpgui, &SafeGui, sizeof(GUITHREADINFO)); From 94b1cd39cdc7e3a501ff75f91bd4cbe4a99345a4 Mon Sep 17 00:00:00 2001 From: James Tabor Date: Mon, 4 Apr 2011 07:22:41 +0000 Subject: [PATCH 072/317] - Fix build. svn path=/trunk/; revision=51249 --- reactos/dll/win32/user32/windows/menu.c | 1 + 1 file changed, 1 insertion(+) diff --git a/reactos/dll/win32/user32/windows/menu.c b/reactos/dll/win32/user32/windows/menu.c index 38294269bef..92749931c8a 100644 --- a/reactos/dll/win32/user32/windows/menu.c +++ b/reactos/dll/win32/user32/windows/menu.c @@ -3174,6 +3174,7 @@ static INT FASTCALL MenuTrackMenu(HMENU hmenu, UINT wFlags, INT x, INT y, BOOL fRemove; INT executedMenuId = -1; MTRACKER mt; + HWND capture_win; BOOL enterIdleSent = FALSE; mt.TrackFlags = 0; From 15474a66e9bfafa139073b02a535dba5e17a0914 Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Mon, 4 Apr 2011 14:27:29 +0000 Subject: [PATCH 073/317] [SNDVOL32] - Set Control variable to null, which prevents that mixer controls being assigned to another line when the current line does not have any controls. Bug was highlighted when opening the property window. In that case sndvol32 frees the previous setting, so all mixer lines are also getting freed including their controls, which caused a double free in the case the line did not have any controls assigned. svn path=/trunk/; revision=51252 --- reactos/base/applications/sndvol32/mixer.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/base/applications/sndvol32/mixer.c b/reactos/base/applications/sndvol32/mixer.c index b085fe95fb3..f01496c7ed3 100644 --- a/reactos/base/applications/sndvol32/mixer.c +++ b/reactos/base/applications/sndvol32/mixer.c @@ -189,7 +189,7 @@ SndMixerQueryConnections(PSND_MIXER Mixer, MIXER_GETLINEINFOF_SOURCE); if (Result == MMSYSERR_NOERROR) { - LPMIXERCONTROL Controls; + LPMIXERCONTROL Controls = NULL; PSND_MIXER_CONNECTION Con; DPRINT("++ Source: %ws\n", LineInfo.szName); From 7fcd953546f81e00f680c0e8d5634f0549908c2c Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Mon, 4 Apr 2011 19:35:24 +0000 Subject: [PATCH 074/317] [KERNEL32] - Minor cleanup, better flag names (thanks to ProcessHacker team for the good names and values). - Return error in failure path of BasepGetModuleHandleExW. - Optimize GetModuleHandleExA so that it calls the internal routine directly, without going through GetModuleHandleExW first and thus validating parameters second time. svn path=/trunk/; revision=51253 --- reactos/dll/ntdll/ldr/ldrapi.c | 31 ++++++++--------- reactos/dll/win32/kernel32/misc/ldr.c | 50 ++++++++++++++++----------- reactos/include/ndk/ldrtypes.h | 8 +++-- 3 files changed, 49 insertions(+), 40 deletions(-) diff --git a/reactos/dll/ntdll/ldr/ldrapi.c b/reactos/dll/ntdll/ldr/ldrapi.c index 9b697ca9a0e..e08f4ca5ec8 100644 --- a/reactos/dll/ntdll/ldr/ldrapi.c +++ b/reactos/dll/ntdll/ldr/ldrapi.c @@ -15,9 +15,6 @@ /* GLOBALS *******************************************************************/ -#define LDR_LOCK_HELD 0x2 -#define LDR_LOCK_FREE 0x1 - LONG LdrpLoaderLockAcquisitonCount; /* FUNCTIONS *****************************************************************/ @@ -38,7 +35,7 @@ LdrUnlockLoaderLock(IN ULONG Flags, if (Flags & ~1) { /* Flags are invalid, check how to fail */ - if (Flags & LDR_LOCK_LOADER_LOCK_FLAG_RAISE_STATUS) + if (Flags & LDR_LOCK_LOADER_LOCK_FLAG_RAISE_ON_ERRORS) { /* The caller wants us to raise status */ RtlRaiseStatus(STATUS_INVALID_PARAMETER_1); @@ -60,7 +57,7 @@ LdrUnlockLoaderLock(IN ULONG Flags, DPRINT1("LdrUnlockLoaderLock() called with an invalid cookie!\n"); /* Invalid cookie, check how to fail */ - if (Flags & LDR_LOCK_LOADER_LOCK_FLAG_RAISE_STATUS) + if (Flags & LDR_LOCK_LOADER_LOCK_FLAG_RAISE_ON_ERRORS) { /* The caller wants us to raise status */ RtlRaiseStatus(STATUS_INVALID_PARAMETER_2); @@ -73,7 +70,7 @@ LdrUnlockLoaderLock(IN ULONG Flags, } /* Ready to release the lock */ - if (Flags & LDR_LOCK_LOADER_LOCK_FLAG_RAISE_STATUS) + if (Flags & LDR_LOCK_LOADER_LOCK_FLAG_RAISE_ON_ERRORS) { /* Do a direct leave */ RtlLeaveCriticalSection(&LdrpLoaderLock); @@ -118,11 +115,11 @@ LdrLockLoaderLock(IN ULONG Flags, if (Cookie) *Cookie = 0; /* Validate the flags */ - if (Flags & ~(LDR_LOCK_LOADER_LOCK_FLAG_RAISE_STATUS | + if (Flags & ~(LDR_LOCK_LOADER_LOCK_FLAG_RAISE_ON_ERRORS | LDR_LOCK_LOADER_LOCK_FLAG_TRY_ONLY)) { /* Flags are invalid, check how to fail */ - if (Flags & LDR_LOCK_LOADER_LOCK_FLAG_RAISE_STATUS) + if (Flags & LDR_LOCK_LOADER_LOCK_FLAG_RAISE_ON_ERRORS) { /* The caller wants us to raise status */ RtlRaiseStatus(STATUS_INVALID_PARAMETER_1); @@ -136,7 +133,7 @@ LdrLockLoaderLock(IN ULONG Flags, if (!Cookie) { /* No cookie check how to fail */ - if (Flags & LDR_LOCK_LOADER_LOCK_FLAG_RAISE_STATUS) + if (Flags & LDR_LOCK_LOADER_LOCK_FLAG_RAISE_ON_ERRORS) { /* The caller wants us to raise status */ RtlRaiseStatus(STATUS_INVALID_PARAMETER_3); @@ -150,7 +147,7 @@ LdrLockLoaderLock(IN ULONG Flags, if ((Flags & LDR_LOCK_LOADER_LOCK_FLAG_TRY_ONLY) && !(Result)) { /* No pointer to return the data to */ - if (Flags & LDR_LOCK_LOADER_LOCK_FLAG_RAISE_STATUS) + if (Flags & LDR_LOCK_LOADER_LOCK_FLAG_RAISE_ON_ERRORS) { /* The caller wants us to raise status */ RtlRaiseStatus(STATUS_INVALID_PARAMETER_2); @@ -164,7 +161,7 @@ LdrLockLoaderLock(IN ULONG Flags, if (InInit) return STATUS_SUCCESS; /* Check what locking semantic to use */ - if (Flags & LDR_LOCK_LOADER_LOCK_FLAG_RAISE_STATUS) + if (Flags & LDR_LOCK_LOADER_LOCK_FLAG_RAISE_ON_ERRORS) { /* Check if we should enter or simply try */ if (Flags & LDR_LOCK_LOADER_LOCK_FLAG_TRY_ONLY) @@ -173,13 +170,13 @@ LdrLockLoaderLock(IN ULONG Flags, if (!RtlTryEnterCriticalSection(&LdrpLoaderLock)) { /* It's locked */ - *Result = LDR_LOCK_HELD; + *Result = LDR_LOCK_LOADER_LOCK_DISPOSITION_LOCK_NOT_ACQUIRED; goto Quickie; } else { /* It worked */ - *Result = LDR_LOCK_FREE; + *Result = LDR_LOCK_LOADER_LOCK_DISPOSITION_LOCK_ACQUIRED; } } else @@ -188,7 +185,7 @@ LdrLockLoaderLock(IN ULONG Flags, RtlEnterCriticalSection(&LdrpLoaderLock); /* See if result was requested */ - if (Result) *Result = LDR_LOCK_FREE; + if (Result) *Result = LDR_LOCK_LOADER_LOCK_DISPOSITION_LOCK_ACQUIRED; } /* Increase the acquisition count */ @@ -209,13 +206,13 @@ LdrLockLoaderLock(IN ULONG Flags, if (!RtlTryEnterCriticalSection(&LdrpLoaderLock)) { /* It's locked */ - *Result = LDR_LOCK_HELD; + *Result = LDR_LOCK_LOADER_LOCK_DISPOSITION_LOCK_NOT_ACQUIRED; _SEH2_YIELD(return STATUS_SUCCESS); } else { /* It worked */ - *Result = LDR_LOCK_FREE; + *Result = LDR_LOCK_LOADER_LOCK_DISPOSITION_LOCK_ACQUIRED; } } else @@ -224,7 +221,7 @@ LdrLockLoaderLock(IN ULONG Flags, RtlEnterCriticalSection(&LdrpLoaderLock); /* See if result was requested */ - if (Result) *Result = LDR_LOCK_FREE; + if (Result) *Result = LDR_LOCK_LOADER_LOCK_DISPOSITION_LOCK_ACQUIRED; } /* Increase the acquisition count */ diff --git a/reactos/dll/win32/kernel32/misc/ldr.c b/reactos/dll/win32/kernel32/misc/ldr.c index 8dd3d9994dc..cbf00e56896 100644 --- a/reactos/dll/win32/kernel32/misc/ldr.c +++ b/reactos/dll/win32/kernel32/misc/ldr.c @@ -22,7 +22,7 @@ typedef struct tagLOADPARMS32 { extern BOOLEAN InWindows; extern WaitForInputIdleType lpfnGlobalRegisterWaitForInputIdle; -#define BASEP_GET_MODULE_HANDLE_EX_PARAMETER_VALIDATION_FAIL 1 +#define BASEP_GET_MODULE_HANDLE_EX_PARAMETER_VALIDATION_ERROR 1 #define BASEP_GET_MODULE_HANDLE_EX_PARAMETER_VALIDATION_SUCCESS 2 #define BASEP_GET_MODULE_HANDLE_EX_PARAMETER_VALIDATION_CONTINUE 3 @@ -47,14 +47,14 @@ BasepGetModuleHandleExParameterValidation(DWORD dwFlags, ) { BaseSetLastNTError(STATUS_INVALID_PARAMETER_1); - return BASEP_GET_MODULE_HANDLE_EX_PARAMETER_VALIDATION_FAIL; + return BASEP_GET_MODULE_HANDLE_EX_PARAMETER_VALIDATION_ERROR; } /* Check 2nd parameter */ if (!phModule) { BaseSetLastNTError(STATUS_INVALID_PARAMETER_2); - return BASEP_GET_MODULE_HANDLE_EX_PARAMETER_VALIDATION_FAIL; + return BASEP_GET_MODULE_HANDLE_EX_PARAMETER_VALIDATION_ERROR; } /* Return what we have according to the module name */ @@ -578,7 +578,7 @@ GetModuleFileNameW(HINSTANCE hModule, Peb = NtCurrentPeb (); /* Acquire a loader lock */ - LdrLockLoaderLock(LDR_LOCK_LOADER_LOCK_FLAG_RAISE_STATUS, NULL, &Cookie); + LdrLockLoaderLock(LDR_LOCK_LOADER_LOCK_FLAG_RAISE_ON_ERRORS, NULL, &Cookie); /* Traverse the module list */ ModuleListHead = &Peb->Ldr->InLoadOrderModuleList; @@ -615,7 +615,7 @@ GetModuleFileNameW(HINSTANCE hModule, } _SEH2_END /* Release the loader lock */ - LdrUnlockLoaderLock(LDR_LOCK_LOADER_LOCK_FLAG_RAISE_STATUS, Cookie); + LdrUnlockLoaderLock(LDR_LOCK_LOADER_LOCK_FLAG_RAISE_ON_ERRORS, Cookie); return Length / sizeof(WCHAR); } @@ -709,7 +709,8 @@ BasepGetModuleHandleExW(BOOLEAN NoLock, DWORD dwPublicFlags, LPCWSTR lpwModuleNa hModule = GetModuleHandleForUnicodeString(&ModuleNameU); if (!hModule) { - // FIXME: Status?! + /* Last error is already set, so just return failure by setting status */ + Status = STATUS_DLL_NOT_FOUND; goto quickie; } } @@ -737,6 +738,10 @@ BasepGetModuleHandleExW(BOOLEAN NoLock, DWORD dwPublicFlags, LPCWSTR lpwModuleNa hModule); } + /* Set last error in case of failure */ + if (!NT_SUCCESS(Status)) + SetLastErrorByStatus(Status); + quickie: /* Unlock loader lock if it was acquired */ if (!NoLock) @@ -745,10 +750,6 @@ quickie: ASSERT(NT_SUCCESS(Status2)); } - /* Set last error in case of failure */ - if (!NT_SUCCESS(Status)) - SetLastErrorByStatus(Status); - /* Set the module handle to the caller */ if (phModule) *phModule = hModule; @@ -827,7 +828,7 @@ GetModuleHandleExW(IN DWORD dwFlags, dwValid = BasepGetModuleHandleExParameterValidation(dwFlags, lpwModuleName, phModule); /* If result is invalid parameter - return failure */ - if (dwValid == BASEP_GET_MODULE_HANDLE_EX_PARAMETER_VALIDATION_FAIL) return FALSE; + if (dwValid == BASEP_GET_MODULE_HANDLE_EX_PARAMETER_VALIDATION_ERROR) return FALSE; /* If result is 2, there is no need to do anything - return success. */ if (dwValid == BASEP_GET_MODULE_HANDLE_EX_PARAMETER_VALIDATION_SUCCESS) return TRUE; @@ -855,13 +856,14 @@ GetModuleHandleExA(IN DWORD dwFlags, { PUNICODE_STRING lpModuleNameW; DWORD dwValid; - BOOL Ret; + BOOL Ret = FALSE; + NTSTATUS Status; /* Validate parameters */ dwValid = BasepGetModuleHandleExParameterValidation(dwFlags, (LPCWSTR)lpModuleName, phModule); /* If result is invalid parameter - return failure */ - if (dwValid == BASEP_GET_MODULE_HANDLE_EX_PARAMETER_VALIDATION_FAIL) return FALSE; + if (dwValid == BASEP_GET_MODULE_HANDLE_EX_PARAMETER_VALIDATION_ERROR) return FALSE; /* If result is 2, there is no need to do anything - return success. */ if (dwValid == BASEP_GET_MODULE_HANDLE_EX_PARAMETER_VALIDATION_SUCCESS) return TRUE; @@ -869,10 +871,11 @@ GetModuleHandleExA(IN DWORD dwFlags, /* Check if we don't need to convert the name */ if (dwFlags & GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS) { - /* Call the W version of the API without conversion */ - Ret = GetModuleHandleExW(dwFlags, - (LPCWSTR)lpModuleName, - phModule); + /* Call the extended version of the API without conversion */ + Status = BasepGetModuleHandleExW(FALSE, + dwFlags, + (LPCWSTR)lpModuleName, + phModule); } else { @@ -882,12 +885,17 @@ GetModuleHandleExA(IN DWORD dwFlags, /* Return FALSE if conversion failed */ if (!lpModuleNameW) return FALSE; - /* Call the W version of the API */ - Ret = GetModuleHandleExW(dwFlags, - lpModuleNameW->Buffer, - phModule); + /* Call the extended version of the API */ + Status = BasepGetModuleHandleExW(FALSE, + dwFlags, + lpModuleNameW->Buffer, + phModule); } + /* If result was successful - return true */ + if (NT_SUCCESS(Status)) + Ret = TRUE; + /* Return result */ return Ret; } diff --git a/reactos/include/ndk/ldrtypes.h b/reactos/include/ndk/ldrtypes.h index 4586f8325e5..8887a040b07 100644 --- a/reactos/include/ndk/ldrtypes.h +++ b/reactos/include/ndk/ldrtypes.h @@ -71,8 +71,12 @@ Author: // // LdrLockLoaderLock Flags // -#define LDR_LOCK_LOADER_LOCK_FLAG_RAISE_STATUS 0x00000001 -#define LDR_LOCK_LOADER_LOCK_FLAG_TRY_ONLY 0x00000002 +#define LDR_LOCK_LOADER_LOCK_FLAG_RAISE_ON_ERRORS 0x00000001 +#define LDR_LOCK_LOADER_LOCK_FLAG_TRY_ONLY 0x00000002 + +#define LDR_LOCK_LOADER_LOCK_DISPOSITION_INVALID 0 +#define LDR_LOCK_LOADER_LOCK_DISPOSITION_LOCK_ACQUIRED 1 +#define LDR_LOCK_LOADER_LOCK_DISPOSITION_LOCK_NOT_ACQUIRED 2 // // FIXME: THIS SHOULD *NOT* BE USED! From 9990b69447eedb3e1ddce99e9d53299ccbafe249 Mon Sep 17 00:00:00 2001 From: Michael Martin Date: Mon, 4 Apr 2011 21:15:07 +0000 Subject: [PATCH 075/317] [Win32k] - Do not block calling thread when sending WM_PARENTNOTIFY messages. Fixes hang at end of user32 winetest for msg. svn path=/trunk/; revision=51254 --- reactos/subsystems/win32/win32k/ntuser/window.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/reactos/subsystems/win32/win32k/ntuser/window.c b/reactos/subsystems/win32/win32k/ntuser/window.c index 21aecf32546..a64f48d5ba9 100644 --- a/reactos/subsystems/win32/win32k/ntuser/window.c +++ b/reactos/subsystems/win32/win32k/ntuser/window.c @@ -1529,10 +1529,10 @@ static void IntSendParentNotify( PWND pWindow, UINT msg ) { if (pWindow->spwndParent && pWindow->spwndParent != UserGetDesktopWindow()) { - co_IntSendMessage( pWindow->spwndParent->head.h, - WM_PARENTNOTIFY, - MAKEWPARAM( msg, pWindow->IDMenu), - (LPARAM)pWindow->head.h ); + co_IntSendMessageNoWait( pWindow->spwndParent->head.h, + WM_PARENTNOTIFY, + MAKEWPARAM( msg, pWindow->IDMenu), + (LPARAM)pWindow->head.h ); } } } From 771f834c4379ff488b4f72b6bc6ec2e753f17750 Mon Sep 17 00:00:00 2001 From: Michael Martin Date: Mon, 4 Apr 2011 21:50:24 +0000 Subject: [PATCH 076/317] [Win32k] - co_MsqDispatchOneSentMessage: After calling the windows procedure check if the message was a callback. If so place the message into the calling MessageQueue. Also check if the current MessageQueue is the calling MessageQueue in which case dont call the Windows procedure but call the callback routine. SendMessageCallback is now properly implemented. - Remove the use of MSQ_SENTNOWAIT and instead use the SenderQueue and CallBackSenderQueue members to determine if the MessageQueues need to be dereferenced. - Modify co_MsqSendMessage to accept more parameters so that it can handle Notification, Callback and Internal messages. These changes make this function more complex but removes duplicate code in messages.c and move the handling for all queued messages in one location. - co_IntSendMessageWithCallBack: If the callback is for the same Message Queue, call it vice queuing it. Insert the message into the MessageQueue before waking the thread to handle the message. Should fix bug 5580. svn path=/trunk/; revision=51255 --- .../subsystems/win32/win32k/ntuser/event.c | 10 +- reactos/subsystems/win32/win32k/ntuser/hook.c | 10 +- .../subsystems/win32/win32k/ntuser/message.c | 49 ++++-- .../subsystems/win32/win32k/ntuser/msgqueue.c | 152 +++++++++++++----- 4 files changed, 155 insertions(+), 66 deletions(-) diff --git a/reactos/subsystems/win32/win32k/ntuser/event.c b/reactos/subsystems/win32/win32k/ntuser/event.c index 18bde4ca040..0af97a25449 100644 --- a/reactos/subsystems/win32/win32k/ntuser/event.c +++ b/reactos/subsystems/win32/win32k/ntuser/event.c @@ -115,15 +115,19 @@ IntCallLowLevelEvent( PEVENTHOOK pEH, /* FIXME should get timeout from * HKEY_CURRENT_USER\Control Panel\Desktop\LowLevelHooksTimeout */ - Status = co_MsqSendMessage( pEH->head.pti->MessageQueue, + Status = co_MsqSendMessage( ((PTHREADINFO)PsGetCurrentThreadWin32Thread())->MessageQueue, + pEH->head.pti->MessageQueue, hwnd, event, 0, - (LPARAM)pEP, + (LPARAM)pEP, + FALSE, + NULL, + 0, 300, TRUE, MSQ_ISEVENT, - &uResult); + &uResult); if (!NT_SUCCESS(Status)) { ExFreePoolWithTag(pEP, TAG_HOOK); diff --git a/reactos/subsystems/win32/win32k/ntuser/hook.c b/reactos/subsystems/win32/win32k/ntuser/hook.c index 40d847b12ae..d41e3218a9b 100644 --- a/reactos/subsystems/win32/win32k/ntuser/hook.c +++ b/reactos/subsystems/win32/win32k/ntuser/hook.c @@ -88,15 +88,19 @@ IntCallLowLevelHook( PHOOK Hook, /* FIXME should get timeout from * HKEY_CURRENT_USER\Control Panel\Desktop\LowLevelHooksTimeout */ - Status = co_MsqSendMessage( pti->MessageQueue, + Status = co_MsqSendMessage( ((PTHREADINFO)PsGetCurrentThreadWin32Thread())->MessageQueue, + pti->MessageQueue, IntToPtr(Code), // hWnd Hook->HookId, // Msg wParam, - (LPARAM)pHP, + (LPARAM)pHP, + FALSE, + NULL, + 0, uTimeout, Block, MSQ_ISHOOK, - &uResult); + &uResult); if (!NT_SUCCESS(Status)) { DPRINT1("Error Hook Call SendMsg. %d Status: 0x%x\n", Hook->HookId, Status); diff --git a/reactos/subsystems/win32/win32k/ntuser/message.c b/reactos/subsystems/win32/win32k/ntuser/message.c index 4081267b8c3..922aa6d3197 100644 --- a/reactos/subsystems/win32/win32k/ntuser/message.c +++ b/reactos/subsystems/win32/win32k/ntuser/message.c @@ -1261,11 +1261,15 @@ co_IntSendMessageTimeoutSingle( HWND hWnd, do { - Status = co_MsqSendMessage( Window->head.pti->MessageQueue, + Status = co_MsqSendMessage(((PTHREADINFO)PsGetCurrentThreadWin32Thread())->MessageQueue, + Window->head.pti->MessageQueue, hWnd, Msg, wParam, lParam, + FALSE, + NULL, + 0, uTimeout, (uFlags & SMTO_BLOCK), MSQ_NORMAL, @@ -1354,6 +1358,7 @@ co_IntSendMessageNoWait(HWND hWnd, LPARAM lParam) { ULONG_PTR Result = 0; + /* Piggyback off CallBack */ co_IntSendMessageWithCallBack(hWnd, Msg, wParam, @@ -1372,12 +1377,12 @@ co_IntSendMessageNoWait(HWND hWnd, */ LRESULT FASTCALL co_IntSendMessageWithCallBack( HWND hWnd, - UINT Msg, - WPARAM wParam, - LPARAM lParam, - SENDASYNCPROC CompletionCallback, - ULONG_PTR CompletionCallbackContext, - ULONG_PTR *uResult) + UINT Msg, + WPARAM wParam, + LPARAM lParam, + SENDASYNCPROC CompletionCallback, + ULONG_PTR CompletionCallbackContext, + ULONG_PTR *uResult) { ULONG_PTR Result; PWND Window = NULL; @@ -1437,7 +1442,7 @@ co_IntSendMessageWithCallBack( HWND hWnd, } /* If this is not a callback and it can be sent now, then send it. */ - if ((Window->head.pti->MessageQueue == Win32Thread->MessageQueue) && (CompletionCallback == NULL)) + if (Window->head.pti->MessageQueue == Win32Thread->MessageQueue) { ObReferenceObject(Win32Thread->pEThread); Result = (ULONG_PTR)co_IntCallWindowProc( Window->lpfnWndProc, @@ -1452,11 +1457,20 @@ co_IntSendMessageWithCallBack( HWND hWnd, *uResult = Result; } ObDereferenceObject(Win32Thread->pEThread); + + if (CompletionCallback) + { + co_IntCallSentMessageCallback(CompletionCallback, + hWnd, + Msg, + CompletionCallbackContext, + Result); + } } IntCallWndProcRet( Window, hWnd, Msg, wParam, lParam, (LRESULT *)uResult); - if ((Window->head.pti->MessageQueue == Win32Thread->MessageQueue) && (CompletionCallback == NULL)) + if (Window->head.pti->MessageQueue == Win32Thread->MessageQueue) { if (! NT_SUCCESS(UnpackParam(lParamPacked, Msg, wParam, lParam, FALSE))) { @@ -1480,18 +1494,21 @@ co_IntSendMessageWithCallBack( HWND hWnd, Message->lResult = 0; Message->QS_Flags = 0; Message->SenderQueue = NULL; // mjmartin, you are right! This is null. - Message->CallBackSenderQueue = Win32Thread->MessageQueue; - + if (CompletionCallback) + Message->CallBackSenderQueue = Win32Thread->MessageQueue; + else + Message->CallBackSenderQueue = NULL; IntReferenceMessageQueue(Window->head.pti->MessageQueue); Message->CompletionCallback = CompletionCallback; Message->CompletionCallbackContext = CompletionCallbackContext; - Message->HookMessage = MSQ_NORMAL | MSQ_SENTNOWAIT; - Message->HasPackedLParam = (lParamBufferSize > 0); + Message->HookMessage = MSQ_NORMAL; + Message->HasPackedLParam = (lParamBufferSize > -1); Message->QS_Flags = QS_SENDMESSAGE; - MsqWakeQueue(Window->head.pti->MessageQueue, QS_SENDMESSAGE, FALSE); - + if (CompletionCallback) + InsertTailList(&Win32Thread->MessageQueue->DispatchingMessagesHead, &Message->DispatchingListEntry); InsertTailList(&Window->head.pti->MessageQueue->SentMessagesListHead, &Message->ListEntry); + MsqWakeQueue(Window->head.pti->MessageQueue, QS_SENDMESSAGE, FALSE); IntDereferenceMessageQueue(Window->head.pti->MessageQueue); RETURN(TRUE); @@ -2112,7 +2129,7 @@ NtUserMessageCall( HWND hWnd, { co_IntSendMessageTimeout( HWND_BROADCAST, Msg, - wParam, + wParam, lParam, SMTO_NORMAL, 2000, diff --git a/reactos/subsystems/win32/win32k/ntuser/msgqueue.c b/reactos/subsystems/win32/win32k/ntuser/msgqueue.c index db8ca7c97b8..be62390ffa4 100644 --- a/reactos/subsystems/win32/win32k/ntuser/msgqueue.c +++ b/reactos/subsystems/win32/win32k/ntuser/msgqueue.c @@ -423,7 +423,7 @@ co_MsqDispatchOneSentMessage(PUSER_MESSAGE_QUEUE MessageQueue) PLIST_ENTRY Entry; LRESULT Result; PTHREADINFO pti; - + if (IsListEmpty(&MessageQueue->SentMessagesListHead)) { return(FALSE); @@ -466,6 +466,18 @@ co_MsqDispatchOneSentMessage(PUSER_MESSAGE_QUEUE MessageQueue) Message->Msg.wParam, Message->Msg.lParam); } + else if ((Message->CompletionCallback) + && (Message->CallBackSenderQueue == MessageQueue)) + { /* Call the callback routine */ + ASSERT(Message->QS_Flags & QS_SMRESULT); + co_IntCallSentMessageCallback(Message->CompletionCallback, + Message->Msg.hwnd, + Message->Msg.message, + Message->CompletionCallbackContext, + Message->lResult); + /* Set callback to NULL to prevent reentry */ + Message->CompletionCallback = NULL; + } else { /* Call the window procedure. */ Result = co_IntSendMessage( Message->Msg.hwnd, @@ -478,8 +490,23 @@ co_MsqDispatchOneSentMessage(PUSER_MESSAGE_QUEUE MessageQueue) to be cleaned up on thread termination anymore */ RemoveEntryList(&Message->ListEntry); - /* remove the message from the dispatching list if needed, so lock the sender's message queue */ - if (!(Message->HookMessage & MSQ_SENTNOWAIT)) + if (Message->CompletionCallback) + { + if (Message->CallBackSenderQueue) + { + Message->lResult = Result; + Message->QS_Flags |= QS_SMRESULT; + + /* queue it in the callers message queue */ + InsertTailList(&Message->CallBackSenderQueue->SentMessagesListHead, &Message->ListEntry); + MsqWakeQueue(Message->CallBackSenderQueue, QS_SENDMESSAGE, TRUE); + IntDereferenceMessageQueue(Message->CallBackSenderQueue); + } + return (TRUE); + } + + /* remove the message from the dispatching list if there is a SenderQueue, so lock the sender's message queue */ + if ((Message->SenderQueue) || (Message->CallBackSenderQueue)) { if (Message->DispatchingListEntry.Flink != NULL) { @@ -513,18 +540,8 @@ co_MsqDispatchOneSentMessage(PUSER_MESSAGE_QUEUE MessageQueue) KeSetEvent(Message->CompletionEvent, IO_NO_INCREMENT, FALSE); } - /* Call the callback if the message was sent with SendMessageCallback */ - if (Message->CompletionCallback != NULL) - { - co_IntCallSentMessageCallback(Message->CompletionCallback, - Message->Msg.hwnd, - Message->Msg.message, - Message->CompletionCallbackContext, - Result); - } - - /* Only if it is not a no wait message */ - if (!(Message->HookMessage & MSQ_SENTNOWAIT)) + /* If SenderQueue then SenderQueue and MessageQueue was referenced, dereference them here */ + if (Message->SenderQueue) { IntDereferenceMessageQueue(Message->SenderQueue); IntDereferenceMessageQueue(MessageQueue); @@ -588,10 +605,11 @@ MsqRemoveWindowMessagesFromQueue(PVOID pWindow) RemoveEntryList(&SentMessage->ListEntry); ClearMsgBitsMask(MessageQueue, SentMessage->QS_Flags); - /* remove the message from the dispatching list if neede */ - if ((!(SentMessage->HookMessage & MSQ_SENTNOWAIT)) + /* If there was a SenderQueue then remove the message from this threads dispatching list */ + if (((SentMessage->SenderQueue) || (SentMessage->CallBackSenderQueue)) && (SentMessage->DispatchingListEntry.Flink != NULL)) { + SentMessage->CallBackSenderQueue = NULL; RemoveEntryList(&SentMessage->DispatchingListEntry); } @@ -607,8 +625,8 @@ MsqRemoveWindowMessagesFromQueue(PVOID pWindow) ExFreePool((PVOID)SentMessage->Msg.lParam); } - /* Only if it is not a no wait message */ - if (!(SentMessage->HookMessage & MSQ_SENTNOWAIT)) + /* If SenderQueue then SenderQueue and MessageQueue was referenced, dereference them here */ + if (SentMessage->SenderQueue) { /* dereference our and the sender's message queue */ IntDereferenceMessageQueue(MessageQueue); @@ -628,8 +646,9 @@ MsqRemoveWindowMessagesFromQueue(PVOID pWindow) } NTSTATUS FASTCALL -co_MsqSendMessage(PUSER_MESSAGE_QUEUE MessageQueue, - HWND Wnd, UINT Msg, WPARAM wParam, LPARAM lParam, +co_MsqSendMessage(PUSER_MESSAGE_QUEUE ThreadQueue, PUSER_MESSAGE_QUEUE MessageQueue, + HWND Wnd, UINT Msg, WPARAM wParam, LPARAM lParam, BOOL HasPackedLParam, + SENDASYNCPROC CompletionCallback, ULONG_PTR CompletionCallbackContext, UINT uTimeout, BOOL Block, INT HookMessage, ULONG_PTR *uResult) { @@ -637,49 +656,87 @@ co_MsqSendMessage(PUSER_MESSAGE_QUEUE MessageQueue, PUSER_SENT_MESSAGE Message; KEVENT CompletionEvent; NTSTATUS WaitStatus; - PUSER_MESSAGE_QUEUE ThreadQueue; LARGE_INTEGER Timeout; PLIST_ENTRY Entry; + BOOL WaitForCompletion; LRESULT Result = 0; //// Result could be trashed. //// + /* Notification messages and some internal messages sent from the subsystem must not block current + thread and therefore pass NULL as ThreadQueue. Callbacks also do not block */ + WaitForCompletion = ((ThreadQueue) && (!CompletionCallback)); + if(!(Message = ExAllocatePoolWithTag(PagedPool, sizeof(USER_SENT_MESSAGE), TAG_USRMSG))) { DPRINT1("MsqSendMessage(): Not enough memory to allocate a message"); return STATUS_INSUFFICIENT_RESOURCES; } - KeInitializeEvent(&CompletionEvent, NotificationEvent, FALSE); + /* Initialize event if calling thread will wait on completion */ + if (WaitForCompletion) + KeInitializeEvent(&CompletionEvent, NotificationEvent, FALSE); pti = PsGetCurrentThreadWin32Thread(); - ThreadQueue = pti->MessageQueue; ptirec = MessageQueue->Thread->Tcb.Win32Thread; ASSERT(ThreadQueue != MessageQueue); ASSERT(ptirec->pcti); // Send must have a client side to receive it!!!! Timeout.QuadPart = (LONGLONG) uTimeout * (LONGLONG) -10000; - /* FIXME - increase reference counter of sender's message queue here */ - Message->Msg.hwnd = Wnd; Message->Msg.message = Msg; Message->Msg.wParam = wParam; Message->Msg.lParam = lParam; - Message->CompletionEvent = &CompletionEvent; - Message->Result = &Result; Message->lResult = 0; Message->QS_Flags = 0; - Message->SenderQueue = ThreadQueue; - Message->CallBackSenderQueue = NULL; - IntReferenceMessageQueue(ThreadQueue); - Message->CompletionCallback = NULL; - Message->CompletionCallbackContext = 0; - Message->HookMessage = HookMessage; - Message->HasPackedLParam = FALSE; + if (WaitForCompletion) + { + /* Normal SendMessage that will block until the Windows Procedure handles the message */ + Message->SenderQueue = ThreadQueue; + Message->CompletionEvent = &CompletionEvent; + Message->Result = &Result; + } + else + { + /* Either a SendMessageCallback, Notify Message or Internal Message from Win32k */ + Message->SenderQueue = NULL; + Message->CompletionEvent = NULL; + Message->Result = NULL; + } + + if (CompletionCallback) + { + Message->CallBackSenderQueue = ThreadQueue; + } + else + { + Message->CallBackSenderQueue = NULL; + } + + /* Reference the ThreadQueue if there was one. For normal messages + the thread is dereferenced when the messages is processed by windows procedure. + For callbacks it dereferenced once the callback message is processed and placed back + into the sending message queue */ + if (ThreadQueue != NULL) + IntReferenceMessageQueue(ThreadQueue); + + Message->CompletionCallback = CompletionCallback; + Message->CompletionCallbackContext = CompletionCallbackContext; + Message->HookMessage = HookMessage; + Message->HasPackedLParam = HasPackedLParam; + + if (HasPackedLParam) + { + ASSERT(Message->SenderQueue == NULL); + } + IntReferenceMessageQueue(MessageQueue); - /* add it to the list of pending messages */ - InsertTailList(&ThreadQueue->DispatchingMessagesHead, &Message->DispatchingListEntry); + /* Add it to the list of pending messages if waiting on completion or if message is callback. + This is done for callbacks as if the Sender terminates it will set the CallBackSenderQueue member to NULL, + informing the windows procedure handling the message to discard the callback procedure */ + if (ThreadQueue != NULL) + InsertTailList(&ThreadQueue->DispatchingMessagesHead, &Message->DispatchingListEntry); /* queue it in the destination's message queue */ InsertTailList(&MessageQueue->SentMessagesListHead, &Message->ListEntry); @@ -687,6 +744,13 @@ co_MsqSendMessage(PUSER_MESSAGE_QUEUE MessageQueue, Message->QS_Flags = QS_SENDMESSAGE; MsqWakeQueue(MessageQueue, QS_SENDMESSAGE, TRUE); + /* If not waiting on completion, dereference the MessageQueue and return */ + if (!WaitForCompletion) + { + IntDereferenceMessageQueue(MessageQueue); + return STATUS_SUCCESS; + } + /* we can't access the Message anymore since it could have already been deleted! */ if(Block) @@ -854,7 +918,7 @@ MsqPostQuitMessage(PUSER_MESSAGE_QUEUE MessageQueue, ULONG ExitCode) * Send a WM_PARENTNOTIFY to all ancestors of the given window, unless * the window has the WS_EX_NOPARENTNOTIFY style. */ -static void MsqSendParentNotify( PWND pwnd, WORD event, WORD idChild, POINT pt ) +void MsqSendParentNotify( PWND pwnd, WORD event, WORD idChild, POINT pt ) { PWND pwndDesktop = UserGetWindowObject(IntGetDesktopWindow()); @@ -1466,8 +1530,8 @@ MsqCleanupMessageQueue(PUSER_MESSAGE_QUEUE MessageQueue) DPRINT("Notify the sender and remove a message from the queue that had not been dispatched\n"); - /* remove the message from the dispatching list if needed */ - if ((!(CurrentSentMessage->HookMessage & MSQ_SENTNOWAIT)) + /* remove the message from the dispatching list if there was a SenderQueue */ + if (((CurrentSentMessage->SenderQueue) || (CurrentSentMessage->CallBackSenderQueue)) && (CurrentSentMessage->DispatchingListEntry.Flink != NULL)) { RemoveEntryList(&CurrentSentMessage->DispatchingListEntry); @@ -1485,8 +1549,8 @@ MsqCleanupMessageQueue(PUSER_MESSAGE_QUEUE MessageQueue) ExFreePool((PVOID)CurrentSentMessage->Msg.lParam); } - /* Only if it is not a no wait message */ - if (!(CurrentSentMessage->HookMessage & MSQ_SENTNOWAIT)) + /* If SenderQueue then SenderQueue and MessageQueue was referenced, dereference them here */ + if (CurrentSentMessage->SenderQueue) { /* dereference our and the sender's message queue */ IntDereferenceMessageQueue(MessageQueue); @@ -1525,8 +1589,8 @@ MsqCleanupMessageQueue(PUSER_MESSAGE_QUEUE MessageQueue) ExFreePool((PVOID)CurrentSentMessage->Msg.lParam); } - /* Only if it is not a no wait message */ - if (!(CurrentSentMessage->HookMessage & MSQ_SENTNOWAIT)) + /* If SenderQueue then SenderQueue and MessageQueue was referenced, dereference them here */ + if (CurrentSentMessage->SenderQueue) { /* dereference our and the sender's message queue */ IntDereferenceMessageQueue(MessageQueue); From 862d46f96e0e49f4bcf58972b49906c03bf4a809 Mon Sep 17 00:00:00 2001 From: Michael Martin Date: Mon, 4 Apr 2011 22:08:39 +0000 Subject: [PATCH 077/317] - Revert 51255 that was committed on accident. The patch is not ready yet. svn path=/trunk/; revision=51256 --- .../subsystems/win32/win32k/ntuser/event.c | 10 +- reactos/subsystems/win32/win32k/ntuser/hook.c | 10 +- .../subsystems/win32/win32k/ntuser/message.c | 49 ++---- .../subsystems/win32/win32k/ntuser/msgqueue.c | 150 +++++------------- 4 files changed, 65 insertions(+), 154 deletions(-) diff --git a/reactos/subsystems/win32/win32k/ntuser/event.c b/reactos/subsystems/win32/win32k/ntuser/event.c index 0af97a25449..18bde4ca040 100644 --- a/reactos/subsystems/win32/win32k/ntuser/event.c +++ b/reactos/subsystems/win32/win32k/ntuser/event.c @@ -115,19 +115,15 @@ IntCallLowLevelEvent( PEVENTHOOK pEH, /* FIXME should get timeout from * HKEY_CURRENT_USER\Control Panel\Desktop\LowLevelHooksTimeout */ - Status = co_MsqSendMessage( ((PTHREADINFO)PsGetCurrentThreadWin32Thread())->MessageQueue, - pEH->head.pti->MessageQueue, + Status = co_MsqSendMessage( pEH->head.pti->MessageQueue, hwnd, event, 0, - (LPARAM)pEP, - FALSE, - NULL, - 0, + (LPARAM)pEP, 300, TRUE, MSQ_ISEVENT, - &uResult); + &uResult); if (!NT_SUCCESS(Status)) { ExFreePoolWithTag(pEP, TAG_HOOK); diff --git a/reactos/subsystems/win32/win32k/ntuser/hook.c b/reactos/subsystems/win32/win32k/ntuser/hook.c index d41e3218a9b..40d847b12ae 100644 --- a/reactos/subsystems/win32/win32k/ntuser/hook.c +++ b/reactos/subsystems/win32/win32k/ntuser/hook.c @@ -88,19 +88,15 @@ IntCallLowLevelHook( PHOOK Hook, /* FIXME should get timeout from * HKEY_CURRENT_USER\Control Panel\Desktop\LowLevelHooksTimeout */ - Status = co_MsqSendMessage( ((PTHREADINFO)PsGetCurrentThreadWin32Thread())->MessageQueue, - pti->MessageQueue, + Status = co_MsqSendMessage( pti->MessageQueue, IntToPtr(Code), // hWnd Hook->HookId, // Msg wParam, - (LPARAM)pHP, - FALSE, - NULL, - 0, + (LPARAM)pHP, uTimeout, Block, MSQ_ISHOOK, - &uResult); + &uResult); if (!NT_SUCCESS(Status)) { DPRINT1("Error Hook Call SendMsg. %d Status: 0x%x\n", Hook->HookId, Status); diff --git a/reactos/subsystems/win32/win32k/ntuser/message.c b/reactos/subsystems/win32/win32k/ntuser/message.c index 922aa6d3197..4081267b8c3 100644 --- a/reactos/subsystems/win32/win32k/ntuser/message.c +++ b/reactos/subsystems/win32/win32k/ntuser/message.c @@ -1261,15 +1261,11 @@ co_IntSendMessageTimeoutSingle( HWND hWnd, do { - Status = co_MsqSendMessage(((PTHREADINFO)PsGetCurrentThreadWin32Thread())->MessageQueue, - Window->head.pti->MessageQueue, + Status = co_MsqSendMessage( Window->head.pti->MessageQueue, hWnd, Msg, wParam, lParam, - FALSE, - NULL, - 0, uTimeout, (uFlags & SMTO_BLOCK), MSQ_NORMAL, @@ -1358,7 +1354,6 @@ co_IntSendMessageNoWait(HWND hWnd, LPARAM lParam) { ULONG_PTR Result = 0; - /* Piggyback off CallBack */ co_IntSendMessageWithCallBack(hWnd, Msg, wParam, @@ -1377,12 +1372,12 @@ co_IntSendMessageNoWait(HWND hWnd, */ LRESULT FASTCALL co_IntSendMessageWithCallBack( HWND hWnd, - UINT Msg, - WPARAM wParam, - LPARAM lParam, - SENDASYNCPROC CompletionCallback, - ULONG_PTR CompletionCallbackContext, - ULONG_PTR *uResult) + UINT Msg, + WPARAM wParam, + LPARAM lParam, + SENDASYNCPROC CompletionCallback, + ULONG_PTR CompletionCallbackContext, + ULONG_PTR *uResult) { ULONG_PTR Result; PWND Window = NULL; @@ -1442,7 +1437,7 @@ co_IntSendMessageWithCallBack( HWND hWnd, } /* If this is not a callback and it can be sent now, then send it. */ - if (Window->head.pti->MessageQueue == Win32Thread->MessageQueue) + if ((Window->head.pti->MessageQueue == Win32Thread->MessageQueue) && (CompletionCallback == NULL)) { ObReferenceObject(Win32Thread->pEThread); Result = (ULONG_PTR)co_IntCallWindowProc( Window->lpfnWndProc, @@ -1457,20 +1452,11 @@ co_IntSendMessageWithCallBack( HWND hWnd, *uResult = Result; } ObDereferenceObject(Win32Thread->pEThread); - - if (CompletionCallback) - { - co_IntCallSentMessageCallback(CompletionCallback, - hWnd, - Msg, - CompletionCallbackContext, - Result); - } } IntCallWndProcRet( Window, hWnd, Msg, wParam, lParam, (LRESULT *)uResult); - if (Window->head.pti->MessageQueue == Win32Thread->MessageQueue) + if ((Window->head.pti->MessageQueue == Win32Thread->MessageQueue) && (CompletionCallback == NULL)) { if (! NT_SUCCESS(UnpackParam(lParamPacked, Msg, wParam, lParam, FALSE))) { @@ -1494,21 +1480,18 @@ co_IntSendMessageWithCallBack( HWND hWnd, Message->lResult = 0; Message->QS_Flags = 0; Message->SenderQueue = NULL; // mjmartin, you are right! This is null. - if (CompletionCallback) - Message->CallBackSenderQueue = Win32Thread->MessageQueue; - else - Message->CallBackSenderQueue = NULL; + Message->CallBackSenderQueue = Win32Thread->MessageQueue; + IntReferenceMessageQueue(Window->head.pti->MessageQueue); Message->CompletionCallback = CompletionCallback; Message->CompletionCallbackContext = CompletionCallbackContext; - Message->HookMessage = MSQ_NORMAL; - Message->HasPackedLParam = (lParamBufferSize > -1); + Message->HookMessage = MSQ_NORMAL | MSQ_SENTNOWAIT; + Message->HasPackedLParam = (lParamBufferSize > 0); Message->QS_Flags = QS_SENDMESSAGE; - if (CompletionCallback) - InsertTailList(&Win32Thread->MessageQueue->DispatchingMessagesHead, &Message->DispatchingListEntry); - InsertTailList(&Window->head.pti->MessageQueue->SentMessagesListHead, &Message->ListEntry); MsqWakeQueue(Window->head.pti->MessageQueue, QS_SENDMESSAGE, FALSE); + + InsertTailList(&Window->head.pti->MessageQueue->SentMessagesListHead, &Message->ListEntry); IntDereferenceMessageQueue(Window->head.pti->MessageQueue); RETURN(TRUE); @@ -2129,7 +2112,7 @@ NtUserMessageCall( HWND hWnd, { co_IntSendMessageTimeout( HWND_BROADCAST, Msg, - wParam, + wParam, lParam, SMTO_NORMAL, 2000, diff --git a/reactos/subsystems/win32/win32k/ntuser/msgqueue.c b/reactos/subsystems/win32/win32k/ntuser/msgqueue.c index be62390ffa4..db8ca7c97b8 100644 --- a/reactos/subsystems/win32/win32k/ntuser/msgqueue.c +++ b/reactos/subsystems/win32/win32k/ntuser/msgqueue.c @@ -423,7 +423,7 @@ co_MsqDispatchOneSentMessage(PUSER_MESSAGE_QUEUE MessageQueue) PLIST_ENTRY Entry; LRESULT Result; PTHREADINFO pti; - + if (IsListEmpty(&MessageQueue->SentMessagesListHead)) { return(FALSE); @@ -466,18 +466,6 @@ co_MsqDispatchOneSentMessage(PUSER_MESSAGE_QUEUE MessageQueue) Message->Msg.wParam, Message->Msg.lParam); } - else if ((Message->CompletionCallback) - && (Message->CallBackSenderQueue == MessageQueue)) - { /* Call the callback routine */ - ASSERT(Message->QS_Flags & QS_SMRESULT); - co_IntCallSentMessageCallback(Message->CompletionCallback, - Message->Msg.hwnd, - Message->Msg.message, - Message->CompletionCallbackContext, - Message->lResult); - /* Set callback to NULL to prevent reentry */ - Message->CompletionCallback = NULL; - } else { /* Call the window procedure. */ Result = co_IntSendMessage( Message->Msg.hwnd, @@ -490,23 +478,8 @@ co_MsqDispatchOneSentMessage(PUSER_MESSAGE_QUEUE MessageQueue) to be cleaned up on thread termination anymore */ RemoveEntryList(&Message->ListEntry); - if (Message->CompletionCallback) - { - if (Message->CallBackSenderQueue) - { - Message->lResult = Result; - Message->QS_Flags |= QS_SMRESULT; - - /* queue it in the callers message queue */ - InsertTailList(&Message->CallBackSenderQueue->SentMessagesListHead, &Message->ListEntry); - MsqWakeQueue(Message->CallBackSenderQueue, QS_SENDMESSAGE, TRUE); - IntDereferenceMessageQueue(Message->CallBackSenderQueue); - } - return (TRUE); - } - - /* remove the message from the dispatching list if there is a SenderQueue, so lock the sender's message queue */ - if ((Message->SenderQueue) || (Message->CallBackSenderQueue)) + /* remove the message from the dispatching list if needed, so lock the sender's message queue */ + if (!(Message->HookMessage & MSQ_SENTNOWAIT)) { if (Message->DispatchingListEntry.Flink != NULL) { @@ -540,8 +513,18 @@ co_MsqDispatchOneSentMessage(PUSER_MESSAGE_QUEUE MessageQueue) KeSetEvent(Message->CompletionEvent, IO_NO_INCREMENT, FALSE); } - /* If SenderQueue then SenderQueue and MessageQueue was referenced, dereference them here */ - if (Message->SenderQueue) + /* Call the callback if the message was sent with SendMessageCallback */ + if (Message->CompletionCallback != NULL) + { + co_IntCallSentMessageCallback(Message->CompletionCallback, + Message->Msg.hwnd, + Message->Msg.message, + Message->CompletionCallbackContext, + Result); + } + + /* Only if it is not a no wait message */ + if (!(Message->HookMessage & MSQ_SENTNOWAIT)) { IntDereferenceMessageQueue(Message->SenderQueue); IntDereferenceMessageQueue(MessageQueue); @@ -605,11 +588,10 @@ MsqRemoveWindowMessagesFromQueue(PVOID pWindow) RemoveEntryList(&SentMessage->ListEntry); ClearMsgBitsMask(MessageQueue, SentMessage->QS_Flags); - /* If there was a SenderQueue then remove the message from this threads dispatching list */ - if (((SentMessage->SenderQueue) || (SentMessage->CallBackSenderQueue)) + /* remove the message from the dispatching list if neede */ + if ((!(SentMessage->HookMessage & MSQ_SENTNOWAIT)) && (SentMessage->DispatchingListEntry.Flink != NULL)) { - SentMessage->CallBackSenderQueue = NULL; RemoveEntryList(&SentMessage->DispatchingListEntry); } @@ -625,8 +607,8 @@ MsqRemoveWindowMessagesFromQueue(PVOID pWindow) ExFreePool((PVOID)SentMessage->Msg.lParam); } - /* If SenderQueue then SenderQueue and MessageQueue was referenced, dereference them here */ - if (SentMessage->SenderQueue) + /* Only if it is not a no wait message */ + if (!(SentMessage->HookMessage & MSQ_SENTNOWAIT)) { /* dereference our and the sender's message queue */ IntDereferenceMessageQueue(MessageQueue); @@ -646,9 +628,8 @@ MsqRemoveWindowMessagesFromQueue(PVOID pWindow) } NTSTATUS FASTCALL -co_MsqSendMessage(PUSER_MESSAGE_QUEUE ThreadQueue, PUSER_MESSAGE_QUEUE MessageQueue, - HWND Wnd, UINT Msg, WPARAM wParam, LPARAM lParam, BOOL HasPackedLParam, - SENDASYNCPROC CompletionCallback, ULONG_PTR CompletionCallbackContext, +co_MsqSendMessage(PUSER_MESSAGE_QUEUE MessageQueue, + HWND Wnd, UINT Msg, WPARAM wParam, LPARAM lParam, UINT uTimeout, BOOL Block, INT HookMessage, ULONG_PTR *uResult) { @@ -656,87 +637,49 @@ co_MsqSendMessage(PUSER_MESSAGE_QUEUE ThreadQueue, PUSER_MESSAGE_QUEUE MessageQu PUSER_SENT_MESSAGE Message; KEVENT CompletionEvent; NTSTATUS WaitStatus; + PUSER_MESSAGE_QUEUE ThreadQueue; LARGE_INTEGER Timeout; PLIST_ENTRY Entry; - BOOL WaitForCompletion; LRESULT Result = 0; //// Result could be trashed. //// - /* Notification messages and some internal messages sent from the subsystem must not block current - thread and therefore pass NULL as ThreadQueue. Callbacks also do not block */ - WaitForCompletion = ((ThreadQueue) && (!CompletionCallback)); - if(!(Message = ExAllocatePoolWithTag(PagedPool, sizeof(USER_SENT_MESSAGE), TAG_USRMSG))) { DPRINT1("MsqSendMessage(): Not enough memory to allocate a message"); return STATUS_INSUFFICIENT_RESOURCES; } - /* Initialize event if calling thread will wait on completion */ - if (WaitForCompletion) - KeInitializeEvent(&CompletionEvent, NotificationEvent, FALSE); + KeInitializeEvent(&CompletionEvent, NotificationEvent, FALSE); pti = PsGetCurrentThreadWin32Thread(); + ThreadQueue = pti->MessageQueue; ptirec = MessageQueue->Thread->Tcb.Win32Thread; ASSERT(ThreadQueue != MessageQueue); ASSERT(ptirec->pcti); // Send must have a client side to receive it!!!! Timeout.QuadPart = (LONGLONG) uTimeout * (LONGLONG) -10000; + /* FIXME - increase reference counter of sender's message queue here */ + Message->Msg.hwnd = Wnd; Message->Msg.message = Msg; Message->Msg.wParam = wParam; Message->Msg.lParam = lParam; + Message->CompletionEvent = &CompletionEvent; + Message->Result = &Result; Message->lResult = 0; Message->QS_Flags = 0; - - if (WaitForCompletion) - { - /* Normal SendMessage that will block until the Windows Procedure handles the message */ - Message->SenderQueue = ThreadQueue; - Message->CompletionEvent = &CompletionEvent; - Message->Result = &Result; - } - else - { - /* Either a SendMessageCallback, Notify Message or Internal Message from Win32k */ - Message->SenderQueue = NULL; - Message->CompletionEvent = NULL; - Message->Result = NULL; - } - - if (CompletionCallback) - { - Message->CallBackSenderQueue = ThreadQueue; - } - else - { - Message->CallBackSenderQueue = NULL; - } - - /* Reference the ThreadQueue if there was one. For normal messages - the thread is dereferenced when the messages is processed by windows procedure. - For callbacks it dereferenced once the callback message is processed and placed back - into the sending message queue */ - if (ThreadQueue != NULL) - IntReferenceMessageQueue(ThreadQueue); - - Message->CompletionCallback = CompletionCallback; - Message->CompletionCallbackContext = CompletionCallbackContext; + Message->SenderQueue = ThreadQueue; + Message->CallBackSenderQueue = NULL; + IntReferenceMessageQueue(ThreadQueue); + Message->CompletionCallback = NULL; + Message->CompletionCallbackContext = 0; Message->HookMessage = HookMessage; - Message->HasPackedLParam = HasPackedLParam; + Message->HasPackedLParam = FALSE; - if (HasPackedLParam) - { - ASSERT(Message->SenderQueue == NULL); - } - IntReferenceMessageQueue(MessageQueue); - /* Add it to the list of pending messages if waiting on completion or if message is callback. - This is done for callbacks as if the Sender terminates it will set the CallBackSenderQueue member to NULL, - informing the windows procedure handling the message to discard the callback procedure */ - if (ThreadQueue != NULL) - InsertTailList(&ThreadQueue->DispatchingMessagesHead, &Message->DispatchingListEntry); + /* add it to the list of pending messages */ + InsertTailList(&ThreadQueue->DispatchingMessagesHead, &Message->DispatchingListEntry); /* queue it in the destination's message queue */ InsertTailList(&MessageQueue->SentMessagesListHead, &Message->ListEntry); @@ -744,13 +687,6 @@ co_MsqSendMessage(PUSER_MESSAGE_QUEUE ThreadQueue, PUSER_MESSAGE_QUEUE MessageQu Message->QS_Flags = QS_SENDMESSAGE; MsqWakeQueue(MessageQueue, QS_SENDMESSAGE, TRUE); - /* If not waiting on completion, dereference the MessageQueue and return */ - if (!WaitForCompletion) - { - IntDereferenceMessageQueue(MessageQueue); - return STATUS_SUCCESS; - } - /* we can't access the Message anymore since it could have already been deleted! */ if(Block) @@ -918,7 +854,7 @@ MsqPostQuitMessage(PUSER_MESSAGE_QUEUE MessageQueue, ULONG ExitCode) * Send a WM_PARENTNOTIFY to all ancestors of the given window, unless * the window has the WS_EX_NOPARENTNOTIFY style. */ -void MsqSendParentNotify( PWND pwnd, WORD event, WORD idChild, POINT pt ) +static void MsqSendParentNotify( PWND pwnd, WORD event, WORD idChild, POINT pt ) { PWND pwndDesktop = UserGetWindowObject(IntGetDesktopWindow()); @@ -1530,8 +1466,8 @@ MsqCleanupMessageQueue(PUSER_MESSAGE_QUEUE MessageQueue) DPRINT("Notify the sender and remove a message from the queue that had not been dispatched\n"); - /* remove the message from the dispatching list if there was a SenderQueue */ - if (((CurrentSentMessage->SenderQueue) || (CurrentSentMessage->CallBackSenderQueue)) + /* remove the message from the dispatching list if needed */ + if ((!(CurrentSentMessage->HookMessage & MSQ_SENTNOWAIT)) && (CurrentSentMessage->DispatchingListEntry.Flink != NULL)) { RemoveEntryList(&CurrentSentMessage->DispatchingListEntry); @@ -1549,8 +1485,8 @@ MsqCleanupMessageQueue(PUSER_MESSAGE_QUEUE MessageQueue) ExFreePool((PVOID)CurrentSentMessage->Msg.lParam); } - /* If SenderQueue then SenderQueue and MessageQueue was referenced, dereference them here */ - if (CurrentSentMessage->SenderQueue) + /* Only if it is not a no wait message */ + if (!(CurrentSentMessage->HookMessage & MSQ_SENTNOWAIT)) { /* dereference our and the sender's message queue */ IntDereferenceMessageQueue(MessageQueue); @@ -1589,8 +1525,8 @@ MsqCleanupMessageQueue(PUSER_MESSAGE_QUEUE MessageQueue) ExFreePool((PVOID)CurrentSentMessage->Msg.lParam); } - /* If SenderQueue then SenderQueue and MessageQueue was referenced, dereference them here */ - if (CurrentSentMessage->SenderQueue) + /* Only if it is not a no wait message */ + if (!(CurrentSentMessage->HookMessage & MSQ_SENTNOWAIT)) { /* dereference our and the sender's message queue */ IntDereferenceMessageQueue(MessageQueue); From 35a75304b795aac3f50511e61bd4cd13e2860cd6 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Mon, 4 Apr 2011 22:08:45 +0000 Subject: [PATCH 078/317] [ADVAPI32/LSASRV] - Implement LsaLookupNames2 in advapi32.dll. - Implement LsarLookupNames3 in lsasrv.dll as a mock-up which returns a hard-coded user account (Administrator). This fixes several wine tests. svn path=/trunk/; revision=51257 --- reactos/dll/win32/advapi32/sec/lsa.c | 68 +++++++++++---- reactos/dll/win32/lsasrv/lsarpc.c | 124 ++++++++++++++++++++++++++- 2 files changed, 170 insertions(+), 22 deletions(-) diff --git a/reactos/dll/win32/advapi32/sec/lsa.c b/reactos/dll/win32/advapi32/sec/lsa.c index 246fbc5ae29..ec76774bbfd 100644 --- a/reactos/dll/win32/advapi32/sec/lsa.c +++ b/reactos/dll/win32/advapi32/sec/lsa.c @@ -430,20 +430,22 @@ LsaLookupNames(IN LSA_HANDLE PolicyHandle, OUT PLSA_REFERENCED_DOMAIN_LIST *ReferencedDomains, OUT PLSA_TRANSLATED_SID *Sids) { - LSAPR_TRANSLATED_SIDS TranslatedSids; + LSAPR_TRANSLATED_SIDS TranslatedSids = {0, NULL}; ULONG MappedCount = 0; NTSTATUS Status; TRACE("(%p,0x%08x,%p,%p,%p)\n", PolicyHandle, Count, Names, ReferencedDomains, Sids); + if (ReferencedDomains == NULL || Sids == NULL) + return STATUS_INVALID_PARAMETER; + RpcTryExcept { *ReferencedDomains = NULL; *Sids = NULL; TranslatedSids.Entries = Count; - TranslatedSids.Sids = *Sids; Status = LsarLookupNames((LSAPR_HANDLE)PolicyHandle, Count, @@ -458,9 +460,7 @@ LsaLookupNames(IN LSA_HANDLE PolicyHandle, RpcExcept(EXCEPTION_EXECUTE_HANDLER) { if (TranslatedSids.Sids != NULL) - { MIDL_user_free(TranslatedSids.Sids); - } Status = I_RpcMapWin32Status(RpcExceptionCode()); } @@ -471,27 +471,56 @@ LsaLookupNames(IN LSA_HANDLE PolicyHandle, /* - * @unimplemented + * @implemented */ NTSTATUS WINAPI -LsaLookupNames2( - LSA_HANDLE PolicyHandle, - ULONG Flags, - ULONG Count, - PLSA_UNICODE_STRING Names, - PLSA_REFERENCED_DOMAIN_LIST *ReferencedDomains, - PLSA_TRANSLATED_SID2 *Sids) +LsaLookupNames2(IN LSA_HANDLE PolicyHandle, + IN ULONG Flags, + IN ULONG Count, + IN PLSA_UNICODE_STRING Names, + OUT PLSA_REFERENCED_DOMAIN_LIST *ReferencedDomains, + OUT PLSA_TRANSLATED_SID2 *Sids) { - FIXME("(%p,0x%08x,0x%08x,%p,%p,%p) stub\n", PolicyHandle, Flags, - Count, Names, ReferencedDomains, Sids); - if (Names != NULL && Count > 0) + LSAPR_TRANSLATED_SIDS_EX2 TranslatedSids = {0, NULL}; + ULONG MappedCount = 0; + NTSTATUS Status; + + TRACE("(%p,0x%08x,0x%08x,%p,%p,%p) stub\n", PolicyHandle, Flags, + Count, Names, ReferencedDomains, Sids); + + if (ReferencedDomains == NULL || Sids == NULL) + return STATUS_INVALID_PARAMETER; + + RpcTryExcept { - *ReferencedDomains = RtlAllocateHeap(RtlGetProcessHeap(), 0, sizeof(LSA_REFERENCED_DOMAIN_LIST)); - *Sids = RtlAllocateHeap(RtlGetProcessHeap(), 0, Count * sizeof(LSA_TRANSLATED_SID2)); - return STATUS_SOME_NOT_MAPPED; + *ReferencedDomains = NULL; + *Sids = NULL; + + TranslatedSids.Entries = Count; + + Status = LsarLookupNames3((LSAPR_HANDLE)PolicyHandle, + Count, + (PRPC_UNICODE_STRING)Names, + (PLSAPR_REFERENCED_DOMAIN_LIST *)ReferencedDomains, + &TranslatedSids, + LsapLookupWksta, + &MappedCount, + Flags, + 2); + + *Sids = (PLSA_TRANSLATED_SID2)TranslatedSids.Sids; } - return STATUS_NONE_MAPPED; + RpcExcept(EXCEPTION_EXECUTE_HANDLER) + { + if (TranslatedSids.Sids != NULL) + MIDL_user_free(TranslatedSids.Sids); + + Status = I_RpcMapWin32Status(RpcExceptionCode()); + } + RpcEndExcept; + + return Status; } @@ -762,6 +791,7 @@ LsaQueryDomainInformationPolicy( return STATUS_NOT_IMPLEMENTED; } + /* * @unimplemented */ diff --git a/reactos/dll/win32/lsasrv/lsarpc.c b/reactos/dll/win32/lsasrv/lsarpc.c index 7887a7d5abf..c4c94970121 100644 --- a/reactos/dll/win32/lsasrv/lsarpc.c +++ b/reactos/dll/win32/lsasrv/lsarpc.c @@ -554,7 +554,7 @@ NTSTATUS WINAPI LsarLookupNames( for (i = 0; i < Count; i++) { OutputSids[i].Use = SidTypeWellKnownGroup; - OutputSids[i].RelativeId = DOMAIN_ALIAS_RID_ADMINS; + OutputSids[i].RelativeId = DOMAIN_USER_RID_ADMIN; //DOMAIN_ALIAS_RID_ADMINS; OutputSids[i].DomainIndex = i; } @@ -1293,8 +1293,126 @@ NTSTATUS WINAPI LsarLookupNames3( DWORD LookupOptions, DWORD ClientRevision) { - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; + SID_IDENTIFIER_AUTHORITY IdentifierAuthority = {SECURITY_NT_AUTHORITY}; + static const UNICODE_STRING DomainName = RTL_CONSTANT_STRING(L"DOMAIN"); + PLSAPR_REFERENCED_DOMAIN_LIST DomainsBuffer = NULL; + PLSAPR_TRANSLATED_SID_EX2 SidsBuffer = NULL; + ULONG SidsBufferLength; + ULONG DomainSidLength; + ULONG AccountSidLength; + PSID DomainSid; + PSID AccountSid; + ULONG i; + NTSTATUS Status; + + TRACE("LsarLookupNames3(%p, %lu, %p, %p, %p, %d, %p, %lu, %lu)\n", + PolicyHandle, Count, Names, ReferencedDomains, TranslatedSids, + LookupLevel, MappedCount, LookupOptions, ClientRevision); + + if (Count == 0) + return STATUS_NONE_MAPPED; + + TranslatedSids->Entries = Count; + TranslatedSids->Sids = NULL; + *ReferencedDomains = NULL; + + SidsBufferLength = Count * sizeof(LSAPR_TRANSLATED_SID_EX2); + SidsBuffer = MIDL_user_allocate(SidsBufferLength); + if (SidsBuffer == NULL) + return STATUS_INSUFFICIENT_RESOURCES; + + for (i = 0; i < Count; i++) + { + SidsBuffer[i].Use = SidTypeUser; + SidsBuffer[i].Sid = NULL; + SidsBuffer[i].DomainIndex = -1; + SidsBuffer[i].Flags = 0; + } + + DomainsBuffer = MIDL_user_allocate(sizeof(LSAPR_REFERENCED_DOMAIN_LIST)); + if (DomainsBuffer == NULL) + { + MIDL_user_free(SidsBuffer); + return STATUS_INSUFFICIENT_RESOURCES; + } + + DomainsBuffer->Entries = Count; + DomainsBuffer->Domains = MIDL_user_allocate(Count * sizeof(LSA_TRUST_INFORMATION)); + if (DomainsBuffer->Domains == NULL) + { + MIDL_user_free(DomainsBuffer); + MIDL_user_free(SidsBuffer); + return STATUS_INSUFFICIENT_RESOURCES; + } + + Status = RtlAllocateAndInitializeSid(&IdentifierAuthority, + 2, + SECURITY_BUILTIN_DOMAIN_RID, + DOMAIN_ALIAS_RID_ADMINS, + 0, 0, 0, 0, 0, 0, + &DomainSid); + if (!NT_SUCCESS(Status)) + { + MIDL_user_free(DomainsBuffer->Domains); + MIDL_user_free(DomainsBuffer); + MIDL_user_free(SidsBuffer); + return Status; + } + + DomainSidLength = RtlLengthSid(DomainSid); + + for (i = 0; i < Count; i++) + { + DomainsBuffer->Domains[i].Sid = MIDL_user_allocate(DomainSidLength); + RtlCopyMemory(DomainsBuffer->Domains[i].Sid, + DomainSid, + DomainSidLength); + + DomainsBuffer->Domains[i].Name.Buffer = MIDL_user_allocate(DomainName.MaximumLength); + DomainsBuffer->Domains[i].Name.Length = DomainName.Length; + DomainsBuffer->Domains[i].Name.MaximumLength = DomainName.MaximumLength; + RtlCopyMemory(DomainsBuffer->Domains[i].Name.Buffer, + DomainName.Buffer, + DomainName.MaximumLength); + } + + Status = RtlAllocateAndInitializeSid(&IdentifierAuthority, + 3, + SECURITY_BUILTIN_DOMAIN_RID, + DOMAIN_ALIAS_RID_ADMINS, + DOMAIN_USER_RID_ADMIN, + 0, 0, 0, 0, 0, + &AccountSid); + if (!NT_SUCCESS(Status)) + { + MIDL_user_free(DomainsBuffer->Domains); + MIDL_user_free(DomainsBuffer); + MIDL_user_free(SidsBuffer); + return Status; + } + + AccountSidLength = RtlLengthSid(AccountSid); + + for (i = 0; i < Count; i++) + { + SidsBuffer[i].Use = SidTypeWellKnownGroup; + SidsBuffer[i].Sid = MIDL_user_allocate(AccountSidLength); + + RtlCopyMemory(SidsBuffer[i].Sid, + AccountSid, + AccountSidLength); + + SidsBuffer[i].DomainIndex = i; + SidsBuffer[i].Flags = 0; + } + + *ReferencedDomains = DomainsBuffer; + *MappedCount = Count; + + TranslatedSids->Entries = Count; + TranslatedSids->Sids = SidsBuffer; + + return STATUS_SUCCESS; } From 6ecaf80fcfe4ade4db2f2f2200d6f4ff6af5e0c9 Mon Sep 17 00:00:00 2001 From: Michael Martin Date: Tue, 5 Apr 2011 11:42:38 +0000 Subject: [PATCH 079/317] [NTOS/MM] - Update PoolTag used with ExFreePooWithTag to match changes made in 46987 by richard. svn path=/trunk/; revision=51258 --- reactos/ntoskrnl/mm/ARM3/sysldr.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/reactos/ntoskrnl/mm/ARM3/sysldr.c b/reactos/ntoskrnl/mm/ARM3/sysldr.c index 443a33d5e63..2ca28005d9c 100644 --- a/reactos/ntoskrnl/mm/ARM3/sysldr.c +++ b/reactos/ntoskrnl/mm/ARM3/sysldr.c @@ -1059,7 +1059,7 @@ MiResolveImageReferences(IN PVOID ImageBase, { /* It's not, it's importing stuff it shouldn't be! */ MiDereferenceImports(LoadedImports); - if (LoadedImports) ExFreePool(LoadedImports); + if (LoadedImports) ExFreePoolWithTag(LoadedImports, 'TDmM'); return STATUS_PROCEDURE_NOT_FOUND; } @@ -1073,7 +1073,7 @@ MiResolveImageReferences(IN PVOID ImageBase, { /* This is not kernel code */ MiDereferenceImports(LoadedImports); - if (LoadedImports) ExFreePool(LoadedImports); + if (LoadedImports) ExFreePoolWithTag(LoadedImports, 'TDmM'); return STATUS_PROCEDURE_NOT_FOUND; } @@ -1098,7 +1098,7 @@ MiResolveImageReferences(IN PVOID ImageBase, { /* Failed */ MiDereferenceImports(LoadedImports); - if (LoadedImports) ExFreePoolWithTag(LoadedImports, TAG_LDR_WSTR); + if (LoadedImports) ExFreePoolWithTag(LoadedImports, 'TDmM'); return Status; } @@ -1219,7 +1219,7 @@ CheckDllState: /* Cleanup and return */ RtlFreeUnicodeString(&NameString); MiDereferenceImports(LoadedImports); - if (LoadedImports) ExFreePoolWithTag(LoadedImports, TAG_LDR_WSTR); + if (LoadedImports) ExFreePoolWithTag(LoadedImports, 'TDmM'); return Status; } @@ -1252,7 +1252,7 @@ CheckDllState: { /* Cleanup and return */ MiDereferenceImports(LoadedImports); - if (LoadedImports) ExFreePoolWithTag(LoadedImports, TAG_LDR_WSTR); + if (LoadedImports) ExFreePoolWithTag(LoadedImports, 'TDmM'); DPRINT1("Warning: Driver failed to load, %S not found\n", *MissingDriver); return STATUS_DRIVER_ENTRYPOINT_NOT_FOUND; } @@ -1282,7 +1282,7 @@ CheckDllState: { /* Cleanup and return */ MiDereferenceImports(LoadedImports); - if (LoadedImports) ExFreePoolWithTag(LoadedImports, TAG_LDR_WSTR); + if (LoadedImports) ExFreePoolWithTag(LoadedImports, 'TDmM'); return Status; } @@ -1315,13 +1315,13 @@ CheckDllState: if (!ImportCount) { /* Free the list and set it to no imports */ - ExFreePoolWithTag(LoadedImports, TAG_LDR_WSTR); + ExFreePoolWithTag(LoadedImports, 'TDmM'); LoadedImports = MM_SYSLDR_NO_IMPORTS; } else if (ImportCount == 1) { /* Just one entry, we can free the table and only use our entry */ - ExFreePoolWithTag(LoadedImports, TAG_LDR_WSTR); + ExFreePoolWithTag(LoadedImports, 'TDmM'); LoadedImports = (PLOAD_IMPORTS)ImportEntry; } else if (ImportCount != LoadedImports->Count) @@ -1349,7 +1349,7 @@ CheckDllState: } /* Free the old copy */ - ExFreePoolWithTag(LoadedImports, TAG_LDR_WSTR); + ExFreePoolWithTag(LoadedImports, 'TDmM'); LoadedImports = NewImports; } } @@ -3004,7 +3004,7 @@ Quickie: /* if (NamePrefix) ExFreePool(PrefixName.Buffer); */ /* Free the name buffer and return status */ - ExFreePoolWithTag(Buffer, TAG_LDR_WSTR); + ExFreePoolWithTag(Buffer, 'nLmM'); return Status; } From be54395eb8f2a4eb4ff326cb8a4c7c1e6119370d Mon Sep 17 00:00:00 2001 From: Rafal Harabien Date: Tue, 5 Apr 2011 21:14:18 +0000 Subject: [PATCH 080/317] [PSDK] Add GetAdaptersAddresses declaration Add forgotten GetComputerNameEx macro svn path=/trunk/; revision=51259 --- reactos/include/psdk/iphlpapi.h | 3 +++ reactos/include/psdk/winbase.h | 6 ++++++ 2 files changed, 9 insertions(+) diff --git a/reactos/include/psdk/iphlpapi.h b/reactos/include/psdk/iphlpapi.h index 56c32fdc087..a799280d265 100644 --- a/reactos/include/psdk/iphlpapi.h +++ b/reactos/include/psdk/iphlpapi.h @@ -19,6 +19,9 @@ DWORD WINAPI DeleteProxyArpEntry(DWORD,DWORD,DWORD); DWORD WINAPI EnableRouter(HANDLE*,OVERLAPPED*); DWORD WINAPI FlushIpNetTable(DWORD); DWORD WINAPI GetAdapterIndex(LPWSTR,PULONG); +#ifdef _WINSOCK2API_ +DWORD WINAPI GetAdaptersAddresses(ULONG,ULONG,PVOID,PIP_ADAPTER_ADDRESSES,PULONG); +#endif DWORD WINAPI GetAdaptersInfo(PIP_ADAPTER_INFO,PULONG); DWORD WINAPI GetBestInterface(IPAddr,PDWORD); DWORD WINAPI GetBestRoute(DWORD,DWORD,PMIB_IPFORWARDROW); diff --git a/reactos/include/psdk/winbase.h b/reactos/include/psdk/winbase.h index ee06339189e..6cdb089423c 100644 --- a/reactos/include/psdk/winbase.h +++ b/reactos/include/psdk/winbase.h @@ -2416,6 +2416,9 @@ typedef PCACTCTXW PCACTCTX; #define GetCommandLine GetCommandLineW #define GetCompressedFileSize GetCompressedFileSizeW #define GetComputerName GetComputerNameW +#if (_WIN32_WINNT >= 0x0500) +#define GetComputerNameEx GetComputerNameExW +#endif #define GetCurrentDirectory GetCurrentDirectoryW #define GetDefaultCommConfig GetDefaultCommConfigW #define GetDiskFreeSpace GetDiskFreeSpaceW @@ -2619,6 +2622,9 @@ typedef ENUMRESTYPEPROCA ENUMRESTYPEPROC; #define GetBinaryType GetBinaryTypeA #define GetCommandLine GetCommandLineA #define GetComputerName GetComputerNameA +#if (_WIN32_WINNT >= 0x0500) +#define GetComputerNameEx GetComputerNameExA +#endif #define GetCompressedFileSize GetCompressedFileSizeA #define GetCurrentDirectory GetCurrentDirectoryA #define GetDefaultCommConfig GetDefaultCommConfigA From 4ce4beb1cbfbb8555a87479531c69ac8807ea5c2 Mon Sep 17 00:00:00 2001 From: Rafal Harabien Date: Tue, 5 Apr 2011 21:20:42 +0000 Subject: [PATCH 081/317] [SYSTEMINFO] Add Italian translation (patch by Vincenzo Cotugno ) Decrease buffer size Don't print NULL domain/workgroup Add network adapters detection svn path=/trunk/; revision=51260 --- .../sysutils/systeminfo/lang/de-DE.rc | 6 + .../sysutils/systeminfo/lang/en-US.rc | 6 + .../sysutils/systeminfo/lang/es-ES.rc | 6 + .../sysutils/systeminfo/lang/fr-FR.rc | 6 + .../sysutils/systeminfo/lang/it-IT.rc | 72 ++++++ .../sysutils/systeminfo/lang/no-NO.rc | 6 + .../sysutils/systeminfo/lang/pl-PL.rc | 6 + .../sysutils/systeminfo/lang/sk-SK.rc | 6 + .../sysutils/systeminfo/lang/uk-UA.rc | 6 + .../sysutils/systeminfo/resource.h | 72 +++--- .../applications/sysutils/systeminfo/rsrc.rc | 4 +- .../sysutils/systeminfo/systeminfo.c | 221 ++++++++++++------ .../sysutils/systeminfo/systeminfo.rbuild | 2 + 13 files changed, 318 insertions(+), 101 deletions(-) create mode 100644 rosapps/applications/sysutils/systeminfo/lang/it-IT.rc diff --git a/rosapps/applications/sysutils/systeminfo/lang/de-DE.rc b/rosapps/applications/sysutils/systeminfo/lang/de-DE.rc index f7a0e476016..e6fdc4a6419 100644 --- a/rosapps/applications/sysutils/systeminfo/lang/de-DE.rc +++ b/rosapps/applications/sysutils/systeminfo/lang/de-DE.rc @@ -64,5 +64,11 @@ IDS_PAGEFILE_LOC, "Auslagerungsdateipfad(e): %s" IDS_DOMAIN, "Domain" IDS_NETWORK_CARDS, "Netzwerkkarte(n)" IDS_NETWORK_CARDS_FORMAT, "%u Installiert." +IDS_CONNECTION_NAME, "Connection Name" +IDS_STATUS, "Status" +IDS_MEDIA_DISCONNECTED, "Media disconnected" +IDS_DHCP_ENABLED, "DHCP Enabled" +IDS_NO, "No" +IDS_IP_ADDRESSES, "IP address(es)" END diff --git a/rosapps/applications/sysutils/systeminfo/lang/en-US.rc b/rosapps/applications/sysutils/systeminfo/lang/en-US.rc index 05bdb9dac96..2b9bed9ad6b 100644 --- a/rosapps/applications/sysutils/systeminfo/lang/en-US.rc +++ b/rosapps/applications/sysutils/systeminfo/lang/en-US.rc @@ -62,5 +62,11 @@ IDS_PAGEFILE_LOC, "Page File Location(s)" IDS_DOMAIN, "Domain" IDS_NETWORK_CARDS, "Network Card(s)" IDS_NETWORK_CARDS_FORMAT, "%u Installed." +IDS_CONNECTION_NAME, "Connection Name" +IDS_STATUS, "Status" +IDS_MEDIA_DISCONNECTED, "Media disconnected" +IDS_DHCP_ENABLED, "DHCP Enabled" +IDS_NO, "No" +IDS_IP_ADDRESSES, "IP address(es)" END diff --git a/rosapps/applications/sysutils/systeminfo/lang/es-ES.rc b/rosapps/applications/sysutils/systeminfo/lang/es-ES.rc index b57be05cf12..644e5da0ef8 100644 --- a/rosapps/applications/sysutils/systeminfo/lang/es-ES.rc +++ b/rosapps/applications/sysutils/systeminfo/lang/es-ES.rc @@ -67,5 +67,11 @@ IDS_PAGEFILE_LOC, "Ruta(s) Archivo Paginaci IDS_DOMAIN, "Dominio" IDS_NETWORK_CARDS, "Tarjeta(s) de Red" IDS_NETWORK_CARDS_FORMAT, "%u No Instalada." +IDS_CONNECTION_NAME, "Connection Name" +IDS_STATUS, "Status" +IDS_MEDIA_DISCONNECTED, "Media disconnected" +IDS_DHCP_ENABLED, "DHCP Enabled" +IDS_NO, "No" +IDS_IP_ADDRESSES, "IP address(es)" END diff --git a/rosapps/applications/sysutils/systeminfo/lang/fr-FR.rc b/rosapps/applications/sysutils/systeminfo/lang/fr-FR.rc index 88eb9c06d4c..1565ccb097d 100644 --- a/rosapps/applications/sysutils/systeminfo/lang/fr-FR.rc +++ b/rosapps/applications/sysutils/systeminfo/lang/fr-FR.rc @@ -62,5 +62,11 @@ IDS_PAGEFILE_LOC, "Emplacement(s) des fichiers d' IDS_DOMAIN, "Domaine" IDS_NETWORK_CARDS, "Carte(s) rseau" IDS_NETWORK_CARDS_FORMAT, "%u installe(s)." +IDS_CONNECTION_NAME, "Connection Name" +IDS_STATUS, "Status" +IDS_MEDIA_DISCONNECTED, "Media disconnected" +IDS_DHCP_ENABLED, "DHCP Enabled" +IDS_NO, "No" +IDS_IP_ADDRESSES, "IP address(es)" END diff --git a/rosapps/applications/sysutils/systeminfo/lang/it-IT.rc b/rosapps/applications/sysutils/systeminfo/lang/it-IT.rc new file mode 100644 index 00000000000..e02c2363925 --- /dev/null +++ b/rosapps/applications/sysutils/systeminfo/lang/it-IT.rc @@ -0,0 +1,72 @@ +LANGUAGE LANG_ITALIAN, SUBLANG_NEUTRAL + +STRINGTABLE DISCARDABLE +BEGIN + +IDS_USAGE, "SYSTEMINFO [/S sistema [/U nomeutente [/P [password]]]] [/FO formato] [/NH]\n\n\ +Descrizione:\n\ + Quest utilit permettere ad un amministratore di\n\ + visualizzare alcune informazioni basilari sulla configurazione del pc.\n\n\ +Lista Parametri:\n\ + /S sistema Specifica il sistema remoto a cui connettersi.\n\n\ + /U [dominio\\]utente Specifica il contesto utente in cui eseguire\n\ + il comando.\n\n\ + /P [password] Specifica la password per il dato\n\ + contesto utente. Se omesso, viene richiesto.\n\n\ + /FO formato Specifica il formato con cui l'output\n\ + viene mostrato.\n\ + Valori Validi: ""TABLE"", ""LIST"", ""CSV"".\n\n\ + /NH Specifica che la ""Etichetta Colonna"" non\n\ + deve essere mostrata nell'output.\n\ + Valido solo per i formati ""TABLE"" e ""CSV"" .\n\n\ + /? Mostra questo aiuto.\n\n\ +Esempi:\n\ + SYSTEMINFO\n\ + SYSTEMINFO /?\n\ + SYSTEMINFO /S sistema\n\ + SYSTEMINFO /S sistema /U utente\n\ + SYSTEMINFO /S sistema /U dominio\\utente /P password /FO TABLE\n\ + SYSTEMINFO /S sistema /FO LIST\n\ + SYSTEMINFO /S sistema /FO CSV /NH\n" + +IDS_HOST_NAME, "Nome Host" +IDS_OS_NAME, "Nome SO" +IDS_OS_VERSION, "Versione SO" +IDS_BUILD, "Build" +IDS_OS_BUILD_TYPE, "Tipo SO" +IDS_REG_OWNER, "Proprietario Registrato" +IDS_REG_ORG, "Organizzazione Registrata" +IDS_PRODUCT_ID, "ID Prodotto" +IDS_INST_DATE, "Data Installazione" +IDS_UP_TIME, "Tempo di Avvio Sistema" +IDS_UP_TIME_FORMAT "%u Giorno, %u Ore, %u Minuti, %u Secondi" +IDS_SYS_MANUFACTURER, "Produttore PC" +IDS_SYS_MODEL, "Modello Sistema" +IDS_SYS_TYPE, "Tipo Sistema" +IDS_PROCESSORS, "Processore" +IDS_PROCESSORS_FORMAT, "%u Processore(i) Installato." +IDS_BIOS_DATE, "Data BIOS" +IDS_BIOS_VERSION, "Versione BIOS" +IDS_ROS_DIR, "Directory ReactOS" +IDS_SYS_DIR, "Directory di Sistema" +IDS_BOOT_DEV, "Periferica di Avvio" +IDS_SYS_LOCALE, "Impostazioni Locali Sistema" +IDS_INPUT_LOCALE, "Impostazioni Locali Input" +IDS_TIME_ZONE, "Fuso Orario" +IDS_TOTAL_PHYS_MEM, "Memoria Fisica Totale" +IDS_AVAIL_PHISICAL_MEM, "Memoria Fisica Disponibile" +IDS_VIRT_MEM_MAX, "Memoria Virtuale: Dimensione Massima" +IDS_VIRT_MEM_AVAIL, "Memoria Virtuale: Disponibile" +IDS_VIRT_MEM_INUSE, "Memoria Virtuale: In Uso" +IDS_PAGEFILE_LOC, "Posizioni File di Paging" +IDS_DOMAIN, "Dominio" +IDS_NETWORK_CARDS, "Schede di Rete" +IDS_NETWORK_CARDS_FORMAT, "%u Installate." +IDS_CONNECTION_NAME, "Nome Connessione" +IDS_STATUS, "Stato" +IDS_MEDIA_DISCONNECTED, "Disconnesso" +IDS_DHCP_ENABLED, "DHCP Abilitato" +IDS_NO, "No" +IDS_IP_ADDRESSES, "Indirizzo(i) IP" + +END diff --git a/rosapps/applications/sysutils/systeminfo/lang/no-NO.rc b/rosapps/applications/sysutils/systeminfo/lang/no-NO.rc index af655d38478..b117059d4d9 100644 --- a/rosapps/applications/sysutils/systeminfo/lang/no-NO.rc +++ b/rosapps/applications/sysutils/systeminfo/lang/no-NO.rc @@ -62,5 +62,11 @@ IDS_PAGEFILE_LOC, "Sidevekslingsfil lokalsjon(er)" IDS_DOMAIN, "Domene" IDS_NETWORK_CARDS, "Nettverkskort(er)" IDS_NETWORK_CARDS_FORMAT, "%u installert." +IDS_CONNECTION_NAME, "Connection Name" +IDS_STATUS, "Status" +IDS_MEDIA_DISCONNECTED, "Media disconnected" +IDS_DHCP_ENABLED, "DHCP Enabled" +IDS_NO, "No" +IDS_IP_ADDRESSES, "IP address(es)" END diff --git a/rosapps/applications/sysutils/systeminfo/lang/pl-PL.rc b/rosapps/applications/sysutils/systeminfo/lang/pl-PL.rc index c18a60935c2..a1706643060 100644 --- a/rosapps/applications/sysutils/systeminfo/lang/pl-PL.rc +++ b/rosapps/applications/sysutils/systeminfo/lang/pl-PL.rc @@ -69,5 +69,11 @@ IDS_PAGEFILE_LOC, "Lokalizacja pliku wymiany" IDS_DOMAIN, "Domena" IDS_NETWORK_CARDS, "Karty sieciowe" IDS_NETWORK_CARDS_FORMAT, "Zainstalowane karty NIC: %u." +IDS_CONNECTION_NAME, "Nazwa poczenia" +IDS_STATUS, "Stan" +IDS_MEDIA_DISCONNECTED, "Nonik odczony" +IDS_DHCP_ENABLED, "DHCP wczone" +IDS_NO, "Nie" +IDS_IP_ADDRESSES, "Adresy IP" END diff --git a/rosapps/applications/sysutils/systeminfo/lang/sk-SK.rc b/rosapps/applications/sysutils/systeminfo/lang/sk-SK.rc index 7da44551e49..4d4e89c7a7c 100644 --- a/rosapps/applications/sysutils/systeminfo/lang/sk-SK.rc +++ b/rosapps/applications/sysutils/systeminfo/lang/sk-SK.rc @@ -66,5 +66,11 @@ IDS_PAGEFILE_LOC, "Umiestnenie(a) str IDS_DOMAIN, "Domna" IDS_NETWORK_CARDS, "Sieov karta(y)" IDS_NETWORK_CARDS_FORMAT, "%u naintalovan." +IDS_CONNECTION_NAME, "Connection Name" +IDS_STATUS, "Status" +IDS_MEDIA_DISCONNECTED, "Media disconnected" +IDS_DHCP_ENABLED, "DHCP Enabled" +IDS_NO, "No" +IDS_IP_ADDRESSES, "IP address(es)" END diff --git a/rosapps/applications/sysutils/systeminfo/lang/uk-UA.rc b/rosapps/applications/sysutils/systeminfo/lang/uk-UA.rc index 08e575c3fb8..6d2645ba1eb 100644 --- a/rosapps/applications/sysutils/systeminfo/lang/uk-UA.rc +++ b/rosapps/applications/sysutils/systeminfo/lang/uk-UA.rc @@ -70,5 +70,11 @@ IDS_PAGEFILE_LOC, " IDS_DOMAIN, "" IDS_NETWORK_CARDS, " ()" IDS_NETWORK_CARDS_FORMAT, "%u Installed." +IDS_CONNECTION_NAME, "Connection Name" +IDS_STATUS, "Status" +IDS_MEDIA_DISCONNECTED, "Media disconnected" +IDS_DHCP_ENABLED, "DHCP Enabled" +IDS_NO, "No" +IDS_IP_ADDRESSES, "IP address(es)" END diff --git a/rosapps/applications/sysutils/systeminfo/resource.h b/rosapps/applications/sysutils/systeminfo/resource.h index c69f6f5a20d..2a8f5564c03 100644 --- a/rosapps/applications/sysutils/systeminfo/resource.h +++ b/rosapps/applications/sysutils/systeminfo/resource.h @@ -1,35 +1,41 @@ -#define IDS_USAGE 1000 +#define IDS_USAGE 1000 -#define IDS_HOST_NAME 100 -#define IDS_OS_NAME 101 -#define IDS_OS_VERSION 102 -#define IDS_BUILD 103 -#define IDS_OS_BUILD_TYPE 104 -#define IDS_REG_OWNER 105 -#define IDS_REG_ORG 106 -#define IDS_PRODUCT_ID 107 -#define IDS_INST_DATE 108 -#define IDS_UP_TIME 109 -#define IDS_UP_TIME_FORMAT 110 -#define IDS_SYS_MANUFACTURER 111 -#define IDS_SYS_MODEL 112 -#define IDS_SYS_TYPE 113 -#define IDS_PROCESSORS 114 -#define IDS_PROCESSORS_FORMAT 115 -#define IDS_BIOS_DATE 116 -#define IDS_BIOS_VERSION 117 -#define IDS_ROS_DIR 118 -#define IDS_SYS_DIR 119 -#define IDS_BOOT_DEV 120 -#define IDS_SYS_LOCALE 121 -#define IDS_INPUT_LOCALE 122 -#define IDS_TOTAL_PHYS_MEM 123 -#define IDS_AVAIL_PHISICAL_MEM 124 -#define IDS_VIRT_MEM_MAX 125 -#define IDS_VIRT_MEM_AVAIL 126 -#define IDS_VIRT_MEM_INUSE 127 -#define IDS_PAGEFILE_LOC 128 -#define IDS_TIME_ZONE 129 -#define IDS_DOMAIN 130 -#define IDS_NETWORK_CARDS 131 +#define IDS_HOST_NAME 100 +#define IDS_OS_NAME 101 +#define IDS_OS_VERSION 102 +#define IDS_BUILD 103 +#define IDS_OS_BUILD_TYPE 104 +#define IDS_REG_OWNER 105 +#define IDS_REG_ORG 106 +#define IDS_PRODUCT_ID 107 +#define IDS_INST_DATE 108 +#define IDS_UP_TIME 109 +#define IDS_UP_TIME_FORMAT 110 +#define IDS_SYS_MANUFACTURER 111 +#define IDS_SYS_MODEL 112 +#define IDS_SYS_TYPE 113 +#define IDS_PROCESSORS 114 +#define IDS_PROCESSORS_FORMAT 115 +#define IDS_BIOS_DATE 116 +#define IDS_BIOS_VERSION 117 +#define IDS_ROS_DIR 118 +#define IDS_SYS_DIR 119 +#define IDS_BOOT_DEV 120 +#define IDS_SYS_LOCALE 121 +#define IDS_INPUT_LOCALE 122 +#define IDS_TOTAL_PHYS_MEM 123 +#define IDS_AVAIL_PHISICAL_MEM 124 +#define IDS_VIRT_MEM_MAX 125 +#define IDS_VIRT_MEM_AVAIL 126 +#define IDS_VIRT_MEM_INUSE 127 +#define IDS_PAGEFILE_LOC 128 +#define IDS_TIME_ZONE 129 +#define IDS_DOMAIN 130 +#define IDS_NETWORK_CARDS 131 #define IDS_NETWORK_CARDS_FORMAT 132 +#define IDS_CONNECTION_NAME 133 +#define IDS_STATUS 134 +#define IDS_MEDIA_DISCONNECTED 135 +#define IDS_DHCP_ENABLED 136 +#define IDS_NO 137 +#define IDS_IP_ADDRESSES 138 diff --git a/rosapps/applications/sysutils/systeminfo/rsrc.rc b/rosapps/applications/sysutils/systeminfo/rsrc.rc index d12216077e7..42c65fabd20 100644 --- a/rosapps/applications/sysutils/systeminfo/rsrc.rc +++ b/rosapps/applications/sysutils/systeminfo/rsrc.rc @@ -5,7 +5,9 @@ #include "lang/en-US.rc" #include "lang/es-ES.rc" #include "lang/fr-FR.rc" +#include "lang/it-IT.rc" +#include "lang/no-NO.rc" #include "lang/pl-PL.rc" #include "lang/sk-SK.rc" #include "lang/uk-UA.rc" -#include "lang/no-NO.rc" + diff --git a/rosapps/applications/sysutils/systeminfo/systeminfo.c b/rosapps/applications/sysutils/systeminfo/systeminfo.c index d9ebe2a6e62..12818ecc5ee 100644 --- a/rosapps/applications/sysutils/systeminfo/systeminfo.c +++ b/rosapps/applications/sysutils/systeminfo/systeminfo.c @@ -25,31 +25,22 @@ #include #include #include +#include +#include #include "resource.h" -#define BUFFER_SIZE 32767 +#define BUFFER_SIZE 1024 -/* Load from resource and convert to OEM */ -static -BOOL -GetOemStrings(UINT rcID, LPWSTR OutMsg) -{ - if (LoadStringW(GetModuleHandle(NULL), rcID, OutMsg, BUFFER_SIZE)) - return TRUE; - - return FALSE; -} - -/* Load data from registry */ +/* Load string from registry */ static unsigned RegGetSZ(HKEY hKey, LPCWSTR lpSubKey, LPCWSTR lpValueName, LPWSTR lpBuf, DWORD cchBuf) { - DWORD dwBytes = cchBuf*sizeof(WCHAR), dwType; + DWORD dwBytes = cchBuf*sizeof(WCHAR), dwType = 0; unsigned cChars; - /* If SubKy is specified open it */ + /* If SubKey is specified open it */ if (lpSubKey && RegOpenKeyExW(hKey, lpSubKey, 0, @@ -60,6 +51,7 @@ RegGetSZ(HKEY hKey, LPCWSTR lpSubKey, LPCWSTR lpValueName, LPWSTR lpBuf, DWORD c return 0; } + /* Query registry value and check its type */ if (RegQueryValueExW(hKey, lpValueName, NULL, @@ -70,6 +62,11 @@ RegGetSZ(HKEY hKey, LPCWSTR lpSubKey, LPCWSTR lpValueName, LPWSTR lpBuf, DWORD c wprintf(L"Warning! Cannot query %s. Last error: %lu, type: %lu.\n", lpValueName, GetLastError(), dwType); dwBytes = 0; } + else + { + wcscpy(lpBuf, L"N/A"); + dwBytes = 6; + } /* Close key if we opened it */ if (lpSubKey) @@ -87,6 +84,7 @@ RegGetSZ(HKEY hKey, LPCWSTR lpSubKey, LPCWSTR lpValueName, LPWSTR lpBuf, DWORD c return cChars; } +/* Load DWORD from registry */ static BOOL RegGetDWORD(HKEY hKey, LPCWSTR lpSubKey, LPCWSTR lpValueName, LPDWORD lpData) @@ -94,7 +92,7 @@ RegGetDWORD(HKEY hKey, LPCWSTR lpSubKey, LPCWSTR lpValueName, LPDWORD lpData) DWORD dwBytes = sizeof(*lpData), dwType; BOOL bRet = TRUE; - /* If SubKy is specified open it */ + /* If SubKey is specified open it */ if (lpSubKey && RegOpenKeyExW(hKey, lpSubKey, 0, @@ -105,6 +103,7 @@ RegGetDWORD(HKEY hKey, LPCWSTR lpSubKey, LPCWSTR lpValueName, LPDWORD lpData) return FALSE; } + /* Query registry value and check its type */ if (RegQueryValueExW(hKey, lpValueName, NULL, @@ -124,6 +123,7 @@ RegGetDWORD(HKEY hKey, LPCWSTR lpSubKey, LPCWSTR lpValueName, LPDWORD lpData) return bRet; } +/* Format bytes */ static VOID FormatBytes(LPWSTR lpBuf, unsigned cBytes) @@ -147,6 +147,7 @@ FormatBytes(LPWSTR lpBuf, unsigned cBytes) wcscpy(lpBuf + i, L" MB"); } +/* Format date and time */ static VOID FormatDateTime(time_t Time, LPWSTR lpBuf) @@ -181,30 +182,35 @@ static VOID Usage(VOID) { - WCHAR Buf[BUFFER_SIZE]; - - if(GetOemStrings(IDS_USAGE, Buf)) + WCHAR Buf[4096]; + if (LoadStringW(GetModuleHandle(NULL), IDS_USAGE, Buf, 4096)) wprintf(L"%s", Buf); } static VOID -PrintRow(UINT nTitleID, unsigned cxOffset, LPWSTR lpFormat, ...) +PrintRow(UINT nTitleID, BOOL bIndent, LPWSTR lpFormat, ...) { WCHAR Buf[BUFFER_SIZE]; va_list Args; unsigned c; - + if (nTitleID) { - c = LoadStringW(GetModuleHandle(NULL), nTitleID, Buf, BUFFER_SIZE); + c = LoadStringW(GetModuleHandle(NULL), nTitleID, Buf, BUFFER_SIZE - 2); if (!c) return; - - wcscpy(Buf + c, L":"); + + wcscpy(Buf + c, L": "); } else Buf[0] = L'\0'; - wprintf(L"%-32s ", Buf); + + if (!bIndent) + wprintf(L"%-32s", Buf); + else if (Buf[0]) + wprintf(L"%38s%-16s", L"", Buf); + else + wprintf(L"%38s", L""); va_start(Args, lpFormat); vwprintf(lpFormat, Args); @@ -217,10 +223,10 @@ PrintRow(UINT nTitleID, unsigned cxOffset, LPWSTR lpFormat, ...) VOID AllSysInfo(VOID) { - DWORD dwCharCount = BUFFER_SIZE, dwTimestamp; + DWORD dwCharCount = BUFFER_SIZE, dwTimestamp, dwResult; OSVERSIONINFOW VersionInfo; SYSTEM_INFO SysInfo; - WCHAR Buf[BUFFER_SIZE], Tmp[BUFFER_SIZE], Msg[BUFFER_SIZE], szSystemDir[MAX_PATH]; + WCHAR Buf[BUFFER_SIZE], Tmp[BUFFER_SIZE], szSystemDir[MAX_PATH]; const WCHAR *lpcszSysType; LPWSTR lpBuffer; NETSETUP_JOIN_STATUS NetJoinStatus; @@ -228,6 +234,8 @@ AllSysInfo(VOID) unsigned int cSeconds, i, j; TIME_ZONE_INFORMATION TimeZoneInfo; HKEY hKey; + PIP_ADAPTER_ADDRESSES pAdapters; + ULONG cbAdapters; if (!GetSystemDirectoryW(szSystemDir, sizeof(szSystemDir)/sizeof(szSystemDir[0]))) { @@ -242,7 +250,7 @@ AllSysInfo(VOID) if (!GetComputerNameW(Buf, &dwCharCount)) wprintf(L"Error! GetComputerName failed.\n"); else - PrintRow(IDS_HOST_NAME, 0, L"%s", Buf); + PrintRow(IDS_HOST_NAME, FALSE, L"%s", Buf); // open CurrentVersion key if(RegOpenKeyExW(HKEY_LOCAL_MACHINE, @@ -257,7 +265,7 @@ AllSysInfo(VOID) //getting OS Name RegGetSZ(hKey, NULL, L"ProductName", Buf, BUFFER_SIZE); - PrintRow(IDS_OS_NAME, 0, L"%s", Buf); + PrintRow(IDS_OS_NAME, FALSE, L"%s", Buf); //getting OS Version ZeroMemory(&VersionInfo, sizeof(VersionInfo)); @@ -267,14 +275,14 @@ AllSysInfo(VOID) if (!LoadStringW(GetModuleHandle(NULL), IDS_BUILD, Tmp, BUFFER_SIZE)) Tmp[0] = L'\0'; PrintRow(IDS_OS_VERSION, - 0, - L"%u.%u.%u %s %s %u", - (unsigned)VersionInfo.dwMajorVersion, - (unsigned)VersionInfo.dwMinorVersion, - (unsigned)VersionInfo.dwBuildNumber, + FALSE, + L"%lu.%lu.%lu %s %s %lu", + VersionInfo.dwMajorVersion, + VersionInfo.dwMinorVersion, + VersionInfo.dwBuildNumber, VersionInfo.szCSDVersion, Tmp, - (unsigned)VersionInfo.dwBuildNumber); + VersionInfo.dwBuildNumber); //getting OS Manufacturer @@ -282,24 +290,24 @@ AllSysInfo(VOID) //getting OS Build Type RegGetSZ(hKey, NULL, L"CurrentType", Buf, BUFFER_SIZE); - PrintRow(IDS_OS_BUILD_TYPE, 0, L"%s", Buf); + PrintRow(IDS_OS_BUILD_TYPE, FALSE, L"%s", Buf); //getting Registered Owner RegGetSZ(hKey, NULL, L"RegisteredOwner", Buf, BUFFER_SIZE); - PrintRow(IDS_REG_OWNER, 0, L"%s", Buf); + PrintRow(IDS_REG_OWNER, FALSE, L"%s", Buf); //getting Registered Organization RegGetSZ(hKey, NULL, L"RegisteredOrganization", Buf, BUFFER_SIZE); - PrintRow(IDS_REG_ORG, 0, L"%s", Buf); + PrintRow(IDS_REG_ORG, FALSE, L"%s", Buf); //getting Product ID RegGetSZ(hKey, NULL, L"ProductId", Buf, BUFFER_SIZE); - PrintRow(IDS_PRODUCT_ID, 0, L"%s", Buf); + PrintRow(IDS_PRODUCT_ID, FALSE, L"%s", Buf); //getting Install Date RegGetDWORD(hKey, NULL, L"InstallDate", &dwTimestamp); FormatDateTime((time_t)dwTimestamp, Buf); - PrintRow(IDS_INST_DATE, 0, L"%s", Buf); + PrintRow(IDS_INST_DATE, FALSE, L"%s", Buf); // close Current Version key now RegCloseKey(hKey); @@ -309,7 +317,7 @@ AllSysInfo(VOID) if (!LoadStringW(GetModuleHandle(NULL), IDS_UP_TIME_FORMAT, Tmp, BUFFER_SIZE)) Tmp[0] = L'\0'; swprintf(Buf, Tmp, cSeconds / (60*60*24), (cSeconds / (60*60)) % 24, (cSeconds / 60) % 60, cSeconds % 60); - PrintRow(IDS_UP_TIME, 0, L"%s", Buf); + PrintRow(IDS_UP_TIME, FALSE, L"%s", Buf); //getting System Manufacturer; HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\OEMInformation\Manufacturer for Win >= 6.0 swprintf(Tmp, L"%s\\oeminfo.ini", szSystemDir); @@ -319,7 +327,7 @@ AllSysInfo(VOID) Buf, sizeof(Buf)/sizeof(Buf[0]), Tmp); - PrintRow(IDS_SYS_MANUFACTURER, 0, L"%s", Buf); + PrintRow(IDS_SYS_MANUFACTURER, FALSE, L"%s", Buf); //getting System Model; HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\OEMInformation\Model for Win >= 6.0 GetPrivateProfileStringW(L"General", @@ -328,7 +336,7 @@ AllSysInfo(VOID) Buf, sizeof(Buf)/sizeof(Buf[0]), Tmp); - PrintRow(IDS_SYS_MODEL, 0, L"%s", Buf); + PrintRow(IDS_SYS_MODEL, FALSE, L"%s", Buf); //getting System type switch (SysInfo.wProcessorArchitecture) @@ -346,13 +354,13 @@ AllSysInfo(VOID) lpcszSysType = L"Unknown"; break; } - PrintRow(IDS_SYS_TYPE, 0, L"%s", lpcszSysType); + PrintRow(IDS_SYS_TYPE, FALSE, L"%s", lpcszSysType); //getting Processor(s) if (!LoadStringW(GetModuleHandle(NULL), IDS_PROCESSORS_FORMAT, Tmp, BUFFER_SIZE)) Tmp[0] = L'\0'; swprintf(Buf, Tmp, (unsigned)SysInfo.dwNumberOfProcessors); - PrintRow(IDS_PROCESSORS, 0, L"%s", Buf); + PrintRow(IDS_PROCESSORS, FALSE, L"%s", Buf); for(i = 0; i < (unsigned int)SysInfo.dwNumberOfProcessors; i++) { swprintf(Tmp, L"HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\%u", i); @@ -363,7 +371,7 @@ AllSysInfo(VOID) Buf[j++] = L' '; RegGetSZ(HKEY_LOCAL_MACHINE, Tmp, L"VendorIdentifier", Buf + j, BUFFER_SIZE - j); - PrintRow(0, 0, L"%s", Buf); + PrintRow(0, FALSE, L"%s", Buf); } //getting BIOS Version @@ -372,7 +380,7 @@ AllSysInfo(VOID) L"SystemBiosVersion", Buf, BUFFER_SIZE); - PrintRow(IDS_BIOS_VERSION, 0, L"%s", Buf); + PrintRow(IDS_BIOS_VERSION, FALSE, L"%s", Buf); //gettings BIOS date RegGetSZ(HKEY_LOCAL_MACHINE, @@ -380,13 +388,13 @@ AllSysInfo(VOID) L"SystemBiosDate", Buf, BUFFER_SIZE); - PrintRow(IDS_BIOS_DATE, 0, L"%s", Buf); + PrintRow(IDS_BIOS_DATE, FALSE, L"%s", Buf); //getting ReactOS Directory if (!GetWindowsDirectoryW(Buf, BUFFER_SIZE)) wprintf(L"Error! GetWindowsDirectory failed."); else - PrintRow(IDS_ROS_DIR, 0, L"%s", Buf); + PrintRow(IDS_ROS_DIR, FALSE, L"%s", Buf); //getting System Directory PrintRow(IDS_SYS_DIR, 0, L"%s", szSystemDir); @@ -397,7 +405,7 @@ AllSysInfo(VOID) L"SystemPartition", Buf, BUFFER_SIZE); - PrintRow(IDS_BOOT_DEV, 0, L"%s", Buf); + PrintRow(IDS_BOOT_DEV, FALSE, L"%s", Buf); //getting System Locale if (GetLocaleInfoW(LOCALE_SYSTEM_DEFAULT, LOCALE_ILANGUAGE, Tmp, BUFFER_SIZE)) @@ -412,7 +420,7 @@ AllSysInfo(VOID) if (lpBuffer) SHLoadIndirectString(lpBuffer+1, lpBuffer+1, BUFFER_SIZE - (lpBuffer-Buf) - 1, NULL); - PrintRow(IDS_SYS_LOCALE, 0, L"%s", Buf); + PrintRow(IDS_SYS_LOCALE, FALSE, L"%s", Buf); } //getting Input Locale @@ -432,7 +440,7 @@ AllSysInfo(VOID) if (lpBuffer) SHLoadIndirectString(lpBuffer+1, lpBuffer+1, BUFFER_SIZE - (lpBuffer-Buf) - 1, NULL); - PrintRow(IDS_INPUT_LOCALE, 0, L"%s", Buf); + PrintRow(IDS_INPUT_LOCALE, FALSE, L"%s", Buf); } //getting Time Zone @@ -448,16 +456,16 @@ AllSysInfo(VOID) unsigned i; /* Find current timezone */ - dwCharCount = 256; // Windows seems to have a bug - it doesnt accept BUFFER_SIZE here + dwCharCount = BUFFER_SIZE; for(i = 0; RegEnumKeyExW(hKey, i, Tmp, &dwCharCount, NULL, NULL, NULL, NULL) == ERROR_SUCCESS; ++i, dwCharCount = 255) { RegGetSZ(hKey, Tmp, L"Std", Buf, BUFFER_SIZE); - if(!wcscmp(Buf, TimeZoneInfo.StandardName)) + if (!wcscmp(Buf, TimeZoneInfo.StandardName)) { RegGetSZ(hKey, Tmp, L"Display", Buf, BUFFER_SIZE); - PrintRow(IDS_TIME_ZONE, 0, L"%s", Buf); + PrintRow(IDS_TIME_ZONE, FALSE, L"%s", Buf); break; } @@ -468,23 +476,23 @@ AllSysInfo(VOID) //getting Total Physical Memory GlobalMemoryStatus(&MemoryStatus); FormatBytes(Buf, MemoryStatus.dwTotalPhys); - PrintRow(IDS_TOTAL_PHYS_MEM, 0, L"%s", Buf); + PrintRow(IDS_TOTAL_PHYS_MEM, FALSE, L"%s", Buf); //getting Available Physical Memory FormatBytes(Buf, MemoryStatus.dwAvailPhys); - PrintRow(IDS_AVAIL_PHISICAL_MEM, 0, L"%s", Buf); + PrintRow(IDS_AVAIL_PHISICAL_MEM, FALSE, L"%s", Buf); //getting Virtual Memory: Max Size FormatBytes(Buf, MemoryStatus.dwTotalVirtual); - PrintRow(IDS_VIRT_MEM_MAX, 0, L"%s", Buf); + PrintRow(IDS_VIRT_MEM_MAX, FALSE, L"%s", Buf); //getting Virtual Memory: Available FormatBytes(Buf, MemoryStatus.dwAvailVirtual); - PrintRow(IDS_VIRT_MEM_AVAIL, 0, L"%s", Buf); + PrintRow(IDS_VIRT_MEM_AVAIL, FALSE, L"%s", Buf); //getting Virtual Memory: In Use FormatBytes(Buf, MemoryStatus.dwTotalVirtual-MemoryStatus.dwAvailVirtual); - PrintRow(IDS_VIRT_MEM_INUSE, 0, L"%s", Buf); + PrintRow(IDS_VIRT_MEM_INUSE, FALSE, L"%s", Buf); //getting Page File Location(s) if (RegGetSZ(HKEY_LOCAL_MACHINE, @@ -504,13 +512,14 @@ AllSysInfo(VOID) } } - PrintRow(IDS_PAGEFILE_LOC, 0, L"%s", Buf); + PrintRow(IDS_PAGEFILE_LOC, FALSE, L"%s", Buf); } //getting Domain if (NetGetJoinInformation (NULL, &lpBuffer, &NetJoinStatus) == NERR_Success) { - PrintRow(IDS_DOMAIN, 0, L"%s", lpBuffer); + if (NetJoinStatus == NetSetupWorkgroupName || NetJoinStatus == NetSetupDomainName) + PrintRow(IDS_DOMAIN, FALSE, L"%s", lpBuffer); NetApiBufferFree(lpBuffer); } @@ -518,22 +527,100 @@ AllSysInfo(VOID) //getting Logon Server //getting NetWork Card(s) - if(GetOemStrings(IDS_NETWORK_CARDS, Msg)) + cbAdapters = 4096; + pAdapters = malloc(cbAdapters); + while((dwResult = GetAdaptersAddresses(AF_UNSPEC, 0x0002, NULL, pAdapters, &cbAdapters)) == ERROR_BUFFER_OVERFLOW) { - + cbAdapters += 4096; + pAdapters = (PIP_ADAPTER_ADDRESSES)realloc(pAdapters, cbAdapters); } + + if (dwResult == ERROR_SUCCESS) + { + PIP_ADAPTER_ADDRESSES pCurrentAdapter = pAdapters; + unsigned cAdapters = 0; + + /* Count adapters */ + for(i = 0; pCurrentAdapter; ++i) + { + if (pCurrentAdapter->IfType != 24 && pCurrentAdapter->IfType != 131) + ++cAdapters; + pCurrentAdapter = pCurrentAdapter->Next; + } + + + /* Print adapters count */ + if (!LoadStringW(GetModuleHandle(NULL), IDS_NETWORK_CARDS_FORMAT, Tmp, BUFFER_SIZE)) + Tmp[0] = L'\0'; + swprintf(Buf, Tmp, cAdapters); + PrintRow(IDS_NETWORK_CARDS, FALSE, L"%s", Buf); + + /* Show information about each adapter */ + pCurrentAdapter = pAdapters; + for(i = 0; pCurrentAdapter; ++i) + { + if (pCurrentAdapter->IfType != 24 && pCurrentAdapter->IfType != 131)//IF_TYPE_SOFTWARE_LOOPBACK) + { + PIP_ADAPTER_UNICAST_ADDRESS pAddress; + + PrintRow(0, FALSE, L"[%02u]: %s", i + 1, pCurrentAdapter->Description); + PrintRow(IDS_CONNECTION_NAME, TRUE, L"%s", pCurrentAdapter->FriendlyName); + if (!(pCurrentAdapter->Flags & 0x0004)) + { + if (!LoadStringW(GetModuleHandle(NULL), IDS_NO, Buf, BUFFER_SIZE)) + Buf[0] = L'\0'; + PrintRow(IDS_DHCP_ENABLED, TRUE, Buf); + } + if (pCurrentAdapter->OperStatus == IfOperStatusDown) + { + if (!LoadStringW(GetModuleHandle(NULL), IDS_MEDIA_DISCONNECTED, Buf, BUFFER_SIZE)) + Buf[0] = L'\0'; + PrintRow(IDS_STATUS, TRUE, Buf); + } + else + { + if (!LoadStringW(GetModuleHandle(NULL), IDS_IP_ADDRESSES, Buf, BUFFER_SIZE)) + Buf[0] = L'\0'; + PrintRow(0, TRUE, Buf); + pAddress = pCurrentAdapter->FirstUnicastAddress; + for (j = 0; pAddress; ++j) + { + dwCharCount = BUFFER_SIZE; + WSAAddressToStringW(pAddress->Address.lpSockaddr, pAddress->Address.iSockaddrLength, NULL, Buf, &dwCharCount); + PrintRow(0, TRUE, L"[%02u]: %s", j + 1, Buf); + pAddress = pAddress->Next; + } + } + } + pCurrentAdapter = pCurrentAdapter->Next; + } + } + free(pAdapters); } /* Main program */ int main(int argc, char *argv[]) { + WSADATA WsaData; + int i; + setlocale(LC_ALL, ""); - if (argc > 1 && (!strcmp(argv[1], "/?") || !strcmp(argv[1], "-?"))) + WSAStartup(MAKEWORD(2, 2), &WsaData); + + for (i = 1; i < argc; ++i) { - Usage(); - return 0; + if (!strcmp(argv[i], "/?") || !strcmp(argv[i], "-?")) + { + Usage(); + return 0; + } + else + { + printf("Unsupported argument: %s\n", argv[i]); + return -1; + } } AllSysInfo(); diff --git a/rosapps/applications/sysutils/systeminfo/systeminfo.rbuild b/rosapps/applications/sysutils/systeminfo/systeminfo.rbuild index fc3ef6dd2c3..8a4b0fbc7b1 100644 --- a/rosapps/applications/sysutils/systeminfo/systeminfo.rbuild +++ b/rosapps/applications/sysutils/systeminfo/systeminfo.rbuild @@ -4,6 +4,8 @@ advapi32 netapi32 shlwapi + iphlpapi + ws2_32 systeminfo.c systeminfo.rc rsrc.rc From 26504807cdc2ff9c58aeba7733e6171059a750ed Mon Sep 17 00:00:00 2001 From: Rafal Harabien Date: Tue, 5 Apr 2011 21:24:25 +0000 Subject: [PATCH 082/317] [USRMGR] Free buffer instead of freeing pointer to buffer svn path=/trunk/; revision=51261 --- reactos/dll/cpl/usrmgr/groupprops.c | 2 +- reactos/dll/cpl/usrmgr/groups.c | 2 +- reactos/dll/cpl/usrmgr/userprops.c | 2 +- reactos/dll/cpl/usrmgr/users.c | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/reactos/dll/cpl/usrmgr/groupprops.c b/reactos/dll/cpl/usrmgr/groupprops.c index ac30a280c00..d34acd3eb51 100644 --- a/reactos/dll/cpl/usrmgr/groupprops.c +++ b/reactos/dll/cpl/usrmgr/groupprops.c @@ -139,7 +139,7 @@ InitGroupMembersList(HWND hwndDlg, pUserBuffer[i].usri20_comment); } - NetApiBufferFree(&pUserBuffer); + NetApiBufferFree(pUserBuffer); /* No more data left */ if (netStatus != ERROR_MORE_DATA) diff --git a/reactos/dll/cpl/usrmgr/groups.c b/reactos/dll/cpl/usrmgr/groups.c index 4eebfa40f26..445d90ad342 100644 --- a/reactos/dll/cpl/usrmgr/groups.c +++ b/reactos/dll/cpl/usrmgr/groups.c @@ -77,7 +77,7 @@ UpdateGroupsList(HWND hwndListView) pBuffer[i].lgrpi1_comment); } - NetApiBufferFree(&pBuffer); + NetApiBufferFree(pBuffer); /* No more data left */ if (netStatus != ERROR_MORE_DATA) diff --git a/reactos/dll/cpl/usrmgr/userprops.c b/reactos/dll/cpl/usrmgr/userprops.c index c007b1846d1..a9cd031f02a 100644 --- a/reactos/dll/cpl/usrmgr/userprops.c +++ b/reactos/dll/cpl/usrmgr/userprops.c @@ -432,7 +432,7 @@ InitUserGroupsList(HWND hwndDlg) pBuffer[i].lgrpi1_comment); } - NetApiBufferFree(&pBuffer); + NetApiBufferFree(pBuffer); /* No more data left */ if (netStatus != ERROR_MORE_DATA) diff --git a/reactos/dll/cpl/usrmgr/users.c b/reactos/dll/cpl/usrmgr/users.c index 04ff45eaca3..174ec2f4f57 100644 --- a/reactos/dll/cpl/usrmgr/users.c +++ b/reactos/dll/cpl/usrmgr/users.c @@ -441,7 +441,7 @@ UpdateUsersList(HWND hwndListView) pBuffer[i].usri20_comment); } - NetApiBufferFree(&pBuffer); + NetApiBufferFree(pBuffer); /* No more data left */ if (netStatus != ERROR_MORE_DATA) From ddb4a8780dd78ee3a31eff44a2d19d9173ad1263 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Tue, 5 Apr 2011 21:37:54 +0000 Subject: [PATCH 083/317] [WIDL] Reapply the switchtype patch. svn path=/trunk/; revision=51262 --- reactos/tools/widl/parser.tab.c | 6 ++++++ reactos/tools/widl/parser.y | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/reactos/tools/widl/parser.tab.c b/reactos/tools/widl/parser.tab.c index 3df4c104073..0166dbd56c8 100644 --- a/reactos/tools/widl/parser.tab.c +++ b/reactos/tools/widl/parser.tab.c @@ -6334,6 +6334,12 @@ static type_t *reg_typedefs(decl_spec_t *decl_spec, declarator_list_t *decls, at else if (is_attr(attrs, ATTR_UUID) && !is_attr(attrs, ATTR_PUBLIC)) attrs = append_attr( attrs, make_attr(ATTR_PUBLIC) ); + /* Append the SWITCHTYPE attribute to a non-encapsulated union if it does not already have it. */ + if (type_get_type_detect_alias(type) == TYPE_UNION && + is_attr(attrs, ATTR_SWITCHTYPE) && + !is_attr(type->attrs, ATTR_SWITCHTYPE)) + type->attrs = append_attr(type->attrs, make_attrp(ATTR_SWITCHTYPE, get_attrp(attrs, ATTR_SWITCHTYPE))); + LIST_FOR_EACH_ENTRY( decl, decls, const declarator_t, entry ) { diff --git a/reactos/tools/widl/parser.y b/reactos/tools/widl/parser.y index c924a662f7f..d5f87f98291 100644 --- a/reactos/tools/widl/parser.y +++ b/reactos/tools/widl/parser.y @@ -1854,6 +1854,12 @@ static type_t *reg_typedefs(decl_spec_t *decl_spec, declarator_list_t *decls, at else if (is_attr(attrs, ATTR_UUID) && !is_attr(attrs, ATTR_PUBLIC)) attrs = append_attr( attrs, make_attr(ATTR_PUBLIC) ); + /* Append the SWITCHTYPE attribute to a non-encapsulated union if it does not already have it. */ + if (type_get_type_detect_alias(type) == TYPE_UNION && + is_attr(attrs, ATTR_SWITCHTYPE) && + !is_attr(type->attrs, ATTR_SWITCHTYPE)) + type->attrs = append_attr(type->attrs, make_attrp(ATTR_SWITCHTYPE, get_attrp(attrs, ATTR_SWITCHTYPE))); + LIST_FOR_EACH_ENTRY( decl, decls, const declarator_t, entry ) { From f43d2fe8ca8b3fa41d57a3021acffaa46574cc42 Mon Sep 17 00:00:00 2001 From: James Tabor Date: Wed, 6 Apr 2011 01:31:50 +0000 Subject: [PATCH 084/317] [Win32k] - Fix to unfocused explorer minimize hang, spotted by R3dDr4g0n . svn path=/trunk/; revision=51263 --- reactos/subsystems/win32/win32k/ntuser/window.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/reactos/subsystems/win32/win32k/ntuser/window.c b/reactos/subsystems/win32/win32k/ntuser/window.c index a64f48d5ba9..379edcd99f3 100644 --- a/reactos/subsystems/win32/win32k/ntuser/window.c +++ b/reactos/subsystems/win32/win32k/ntuser/window.c @@ -1529,10 +1529,14 @@ static void IntSendParentNotify( PWND pWindow, UINT msg ) { if (pWindow->spwndParent && pWindow->spwndParent != UserGetDesktopWindow()) { + USER_REFERENCE_ENTRY Ref; + UserRefObjectCo(pWindow->spwndParent, &Ref); // Fix explorer minimize hang. + // Should be co_IntSendMessage please retest, Ref to Chg, revision 51254... co_IntSendMessageNoWait( pWindow->spwndParent->head.h, WM_PARENTNOTIFY, MAKEWPARAM( msg, pWindow->IDMenu), (LPARAM)pWindow->head.h ); + UserDerefObjectCo(pWindow->spwndParent); } } } From 374e21b4e07680d6d477bb2cd59858048e5bd539 Mon Sep 17 00:00:00 2001 From: James Tabor Date: Wed, 6 Apr 2011 12:23:54 +0000 Subject: [PATCH 085/317] [Win32k] - The Reak fix to unfocused explorer minimize hang, spotted by R3dDr4g0n . svn path=/trunk/; revision=51264 --- .../subsystems/win32/win32k/ntuser/msgqueue.c | 26 +++++-------------- .../subsystems/win32/win32k/ntuser/window.c | 2 +- 2 files changed, 7 insertions(+), 21 deletions(-) diff --git a/reactos/subsystems/win32/win32k/ntuser/msgqueue.c b/reactos/subsystems/win32/win32k/ntuser/msgqueue.c index db8ca7c97b8..6af6000137c 100644 --- a/reactos/subsystems/win32/win32k/ntuser/msgqueue.c +++ b/reactos/subsystems/win32/win32k/ntuser/msgqueue.c @@ -1353,28 +1353,14 @@ NTSTATUS FASTCALL co_MsqWaitForNewMessages(PUSER_MESSAGE_QUEUE MessageQueue, PWND WndFilter, UINT MsgFilterMin, UINT MsgFilterMax) { - PTHREADINFO pti; - NTSTATUS ret = STATUS_SUCCESS; - - pti = MessageQueue->Thread->Tcb.Win32Thread; - - while ( co_MsqDispatchOneSentMessage(MessageQueue) ); - - if (pti->pcti->fsWakeBits & pti->pcti->fsChangeBits ) - { - return ret; - } - - pti->pClientInfo->cSpins = 0; - IdlePing(); + NTSTATUS ret; UserLeaveCo(); - ret = KeWaitForSingleObject(MessageQueue->NewMessages, - Executive, - UserMode, - FALSE, - NULL); + ret = KeWaitForSingleObject( MessageQueue->NewMessages, + UserRequest, + UserMode, + FALSE, + NULL ); UserEnterCo(); - IdlePong(); return ret; } diff --git a/reactos/subsystems/win32/win32k/ntuser/window.c b/reactos/subsystems/win32/win32k/ntuser/window.c index 379edcd99f3..f07a5455517 100644 --- a/reactos/subsystems/win32/win32k/ntuser/window.c +++ b/reactos/subsystems/win32/win32k/ntuser/window.c @@ -1530,7 +1530,7 @@ static void IntSendParentNotify( PWND pWindow, UINT msg ) if (pWindow->spwndParent && pWindow->spwndParent != UserGetDesktopWindow()) { USER_REFERENCE_ENTRY Ref; - UserRefObjectCo(pWindow->spwndParent, &Ref); // Fix explorer minimize hang. + UserRefObjectCo(pWindow->spwndParent, &Ref); // Should be co_IntSendMessage please retest, Ref to Chg, revision 51254... co_IntSendMessageNoWait( pWindow->spwndParent->head.h, WM_PARENTNOTIFY, From 3890323807d975750a66446eb8885d89b9262128 Mon Sep 17 00:00:00 2001 From: James Tabor Date: Wed, 6 Apr 2011 12:53:52 +0000 Subject: [PATCH 086/317] [User32|Win32k] - Pass all the wine test_capture_1/2/3/4. - Fix the menu tracking pop up hang issue by looking for deceased windows that pass on while in the start of tracking. This could be a fix for other wine tests. - ReactOS is not Linux and wine is not enough! svn path=/trunk/; revision=51265 --- reactos/dll/win32/user32/windows/menu.c | 38 ++++++++++++------- reactos/dll/win32/user32/windows/message.c | 4 +- .../subsystems/win32/win32k/include/focus.h | 4 ++ .../subsystems/win32/win32k/ntuser/focus.c | 35 +++++++++++++++-- .../subsystems/win32/win32k/ntuser/message.c | 2 - .../win32/win32k/ntuser/simplecall.c | 4 +- 6 files changed, 63 insertions(+), 24 deletions(-) diff --git a/reactos/dll/win32/user32/windows/menu.c b/reactos/dll/win32/user32/windows/menu.c index 92749931c8a..004eaa7886b 100644 --- a/reactos/dll/win32/user32/windows/menu.c +++ b/reactos/dll/win32/user32/windows/menu.c @@ -1576,6 +1576,11 @@ static BOOL FASTCALL MenuShowPopup(HWND hwndOwner, HMENU hmenu, UINT id, UINT fl MenuInfo.FocusedItem = NO_SELECTED_ITEM; } + /* ReactOS Check */ + if (!ValidateHwnd(hwndOwner)) + { // This window maybe already DEAD!!! + return FALSE; + } /* store the owner for DrawItem */ MenuInfo.WndOwner = hwndOwner; MenuSetRosMenuInfo(&MenuInfo); @@ -3208,14 +3213,16 @@ static INT FASTCALL MenuTrackMenu(HMENU hmenu, UINT wFlags, INT x, INT y, fEndMenu = !fRemove; } + if (wFlags & TF_ENDMENU) fEndMenu = TRUE; + /* owner may not be visible when tracking a popup, so use the menu itself */ capture_win = (wFlags & TPM_POPUPMENU) ? MenuInfo.Wnd : mt.OwnerWnd; (void)NtUserSetGUIThreadHandle(MSQ_STATE_MENUOWNER, capture_win); // 1 SetCapture(capture_win); // 2 - FIXME("MenuTrackMenu 1\n"); while (! fEndMenu) { + BOOL ErrorExit = FALSE; PVOID menu = ValidateHandle(mt.CurrentMenu, VALIDATE_TYPE_MENU); if (!menu) /* sometimes happens if I do a window manager close */ break; @@ -3233,6 +3240,12 @@ static INT FASTCALL MenuTrackMenu(HMENU hmenu, UINT wFlags, INT x, INT y, } else { + /* ReactOS Check */ + if (!ValidateHwnd(mt.OwnerWnd) || !ValidateHwnd(MenuInfo.Wnd)) + { + ErrorExit = TRUE; // Do not wait on dead windows, now test_capture_4 works. + break; + } if (!enterIdleSent) { HWND win = MenuInfo.Flags & MF_POPUP ? MenuInfo.Wnd : NULL; @@ -3241,9 +3254,10 @@ static INT FASTCALL MenuTrackMenu(HMENU hmenu, UINT wFlags, INT x, INT y, } WaitMessage(); } - //FIXME("MenuTrackMenu loop 1\n"); } + if (ErrorExit) break; // Gracefully dropout. + /* check if EndMenu() tried to cancel us, by posting this message */ if (msg.message == WM_CANCELMODE) { @@ -3449,7 +3463,6 @@ static INT FASTCALL MenuTrackMenu(HMENU hmenu, UINT wFlags, INT x, INT y, { PeekMessageW( &msg, 0, msg.message, msg.message, PM_REMOVE ); DispatchMessageW( &msg ); - //FIXME("MenuTrackMenu loop 2\n"); continue; } @@ -3460,9 +3473,7 @@ static INT FASTCALL MenuTrackMenu(HMENU hmenu, UINT wFlags, INT x, INT y, if (fRemove && !(mt.TrackFlags & TF_SKIPREMOVE) ) PeekMessageW( &msg, 0, msg.message, msg.message, PM_REMOVE ); else mt.TrackFlags &= ~TF_SKIPREMOVE; - //FIXME("MenuTrackMenu loop 3\n"); } - FIXME("MenuTrackMenu 2\n"); (void)NtUserSetGUIThreadHandle(MSQ_STATE_MENUOWNER, NULL); SetCapture(NULL); /* release the capture */ @@ -3521,12 +3532,11 @@ static BOOL FASTCALL MenuInitTracking(HWND hWnd, HMENU hMenu, BOOL bPopup, UINT HideCaret(0); - MenuGetRosMenuInfo(&MenuInfo, hMenu); /* This makes the menus of applications built with Delphi work. * It also enables menus to be displayed in more than one window, * but there are some bugs left that need to be fixed in this case. */ - if(MenuInfo.Self == hMenu) + if (MenuGetRosMenuInfo(&MenuInfo, hMenu)) { MenuInfo.Wnd = hWnd; MenuSetRosMenuInfo(&MenuInfo); @@ -3658,13 +3668,7 @@ VOID MenuTrackKbdMenuBar(HWND hwnd, UINT wParam, WCHAR wChar) MenuSelectItem( hwnd, &MenuInfo, uItem, TRUE, 0 ); - if (wParam & HTSYSMENU) - { - /* prevent sysmenu activation for managed windows on Alt down/up */ -// if (GetPropA( hwnd, "__wine_x11_managed" )) - wFlags |= TF_ENDMENU; /* schedule end of menu tracking */ - } - else + if (!(wParam & HTSYSMENU) || wChar == ' ') { if( uItem == NO_SELECTED_ITEM ) MenuMoveSelection( hwnd, &MenuInfo, ITEM_NEXT ); @@ -3693,6 +3697,12 @@ BOOL WINAPI TrackPopupMenuEx( HMENU Menu, UINT Flags, int x, int y, return FALSE; } + /* ReactOS Check */ + if (!ValidateHwnd(Wnd)) + { + return FALSE; + } + MenuGetRosMenuInfo(&MenuInfo, Menu); if (IsWindow(MenuInfo.Wnd)) { diff --git a/reactos/dll/win32/user32/windows/message.c b/reactos/dll/win32/user32/windows/message.c index 13d12147d09..8cc1a07f581 100644 --- a/reactos/dll/win32/user32/windows/message.c +++ b/reactos/dll/win32/user32/windows/message.c @@ -2380,9 +2380,7 @@ GetCapture(VOID) BOOL WINAPI ReleaseCapture(VOID) { - HWND hwndPrev = NtUserSetCapture(NULL); - return(hwndPrev ? TRUE : FALSE); -// return (BOOL)NtUserCallNoParam(NOPARAM_ROUTINE_RELEASECAPTURE); + return (BOOL)NtUserCallNoParam(NOPARAM_ROUTINE_RELEASECAPTURE); } diff --git a/reactos/subsystems/win32/win32k/include/focus.h b/reactos/subsystems/win32/win32k/include/focus.h index 299efb56e0f..5c7e6fcefcc 100644 --- a/reactos/subsystems/win32/win32k/include/focus.h +++ b/reactos/subsystems/win32/win32k/include/focus.h @@ -7,6 +7,10 @@ HWND FASTCALL IntGetCaptureWindow(VOID); HWND FASTCALL IntGetFocusWindow(VOID); +HWND FASTCALL +co_UserSetCapture(HWND hWnd); +BOOL FASTCALL +IntReleaseCapture(VOID); /* * These functions take the window handles from current thread queue. diff --git a/reactos/subsystems/win32/win32k/ntuser/focus.c b/reactos/subsystems/win32/win32k/ntuser/focus.c index 65750944072..cdc26a7ff94 100644 --- a/reactos/subsystems/win32/win32k/ntuser/focus.c +++ b/reactos/subsystems/win32/win32k/ntuser/focus.c @@ -580,17 +580,44 @@ co_UserSetCapture(HWND hWnd) ThreadQueue->CaptureWindow = hWnd; - /// These are hacks! - /* also remove other windows if not capturing anymore */ - if (hWnd == NULL) + if (hWnd == NULL) // Release mode. { + MOUSEINPUT mi; + /// These are hacks! + /* also remove other windows if not capturing anymore */ MsqSetStateWindow(ThreadQueue, MSQ_STATE_MENUOWNER, NULL); MsqSetStateWindow(ThreadQueue, MSQ_STATE_MOVESIZE, NULL); - } /// + /* Somebody may have missed some mouse movements */ + mi.dx = 0; + mi.dy = 0; + mi.mouseData = 0; + mi.dwFlags = MOUSEEVENTF_MOVE; + mi.time = 0; + mi.dwExtraInfo = 0; + IntMouseInput(&mi); + } return hWndPrev; } +BOOL +FASTCALL +IntReleaseCapture(VOID) +{ + PTHREADINFO pti; + PUSER_MESSAGE_QUEUE ThreadQueue; + + pti = PsGetCurrentThreadWin32Thread(); + ThreadQueue = pti->MessageQueue; + + // Can not release inside WM_CAPTURECHANGED!! + if (ThreadQueue->QF_flags & QF_CAPTURELOCKED) return FALSE; + + co_UserSetCapture(NULL); + + return TRUE; +} + /* * @implemented */ diff --git a/reactos/subsystems/win32/win32k/ntuser/message.c b/reactos/subsystems/win32/win32k/ntuser/message.c index 4081267b8c3..31fc6ac7d7c 100644 --- a/reactos/subsystems/win32/win32k/ntuser/message.c +++ b/reactos/subsystems/win32/win32k/ntuser/message.c @@ -16,7 +16,6 @@ #include BOOLEAN NTAPI PsGetProcessExitProcessCalled(PEPROCESS Process); -HWND FASTCALL co_UserSetCapture(HWND hWnd); #define PM_BADMSGFLAGS ~((QS_RAWINPUT << 16)|PM_QS_SENDMESSAGE|PM_QS_PAINT|PM_QS_POSTMESSAGE|PM_QS_INPUT|PM_NOYIELD|PM_REMOVE) @@ -861,7 +860,6 @@ co_IntWaitMessage( PWND Window, { SetLastNtError(Status); DPRINT1("Exit co_IntWaitMessage on error!\n"); - return FALSE; } if (Status == STATUS_USER_APC || Status == STATUS_TIMEOUT) diff --git a/reactos/subsystems/win32/win32k/ntuser/simplecall.c b/reactos/subsystems/win32/win32k/ntuser/simplecall.c index 21109806fe9..e5243d93ad1 100644 --- a/reactos/subsystems/win32/win32k/ntuser/simplecall.c +++ b/reactos/subsystems/win32/win32k/ntuser/simplecall.c @@ -119,6 +119,9 @@ NtUserCallNoParam(DWORD Routine) RETURN( (DWORD_PTR)MAKELONG(pti->ptLast.x, pti->ptLast.y)); } + case NOPARAM_ROUTINE_RELEASECAPTURE: + RETURN( (DWORD_PTR)IntReleaseCapture()); + default: DPRINT1("Calling invalid routine number 0x%x in NtUserCallNoParam\n", Routine); EngSetLastError(ERROR_INVALID_PARAMETER); @@ -252,7 +255,6 @@ NtUserCallOneParam( { BOOL ret = TRUE; - _SEH2_TRY { ProbeForWrite((POINT*)Param,sizeof(POINT),1); From 5cf13573ed44daa6730f3ed82afcb37e61e808ed Mon Sep 17 00:00:00 2001 From: James Tabor Date: Wed, 6 Apr 2011 12:56:46 +0000 Subject: [PATCH 087/317] - Turn on test_capture_4. svn path=/trunk/; revision=51266 --- rostests/winetests/user32/win.c | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/rostests/winetests/user32/win.c b/rostests/winetests/user32/win.c index 668399caeef..33c837bed0e 100644 --- a/rostests/winetests/user32/win.c +++ b/rostests/winetests/user32/win.c @@ -6058,11 +6058,7 @@ START_TEST(win) test_capture_1(); test_capture_2(); test_capture_3(hwndMain, hwndMain2); - - if(!winetest_interactive) - skip("skipping test_capture_4, that hangs on reactos\n"); - else - test_capture_4(); + test_capture_4(); test_CreateWindow(); test_parent_owner(); From 8324997bc49b90dab833189caa0285a175ebe165 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Gardou?= Date: Wed, 6 Apr 2011 13:28:32 +0000 Subject: [PATCH 088/317] [CMAKE] RosTests : buildno_header is no longer a valid target svn path=/trunk/; revision=51267 --- rostests/apitests/w32kdll/w32kdll_2k3sp2/CMakeLists.txt | 2 +- rostests/apitests/w32kdll/w32kdll_2ksp4/CMakeLists.txt | 2 +- rostests/apitests/w32kdll/w32kdll_ros/CMakeLists.txt | 2 +- rostests/apitests/w32kdll/w32kdll_vista/CMakeLists.txt | 2 +- rostests/apitests/w32kdll/w32kdll_xpsp2/CMakeLists.txt | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/rostests/apitests/w32kdll/w32kdll_2k3sp2/CMakeLists.txt b/rostests/apitests/w32kdll/w32kdll_2k3sp2/CMakeLists.txt index ead3b82f1bf..57da80875a3 100644 --- a/rostests/apitests/w32kdll/w32kdll_2k3sp2/CMakeLists.txt +++ b/rostests/apitests/w32kdll/w32kdll_2k3sp2/CMakeLists.txt @@ -2,5 +2,5 @@ add_library(w32kdll_2k3sp2 SHARED main.c w32kdll_2k3sp2.S) set_entrypoint(w32kdll_2k3sp2 0) target_link_libraries(w32kdll_2k3sp2 ${CMAKE_CURRENT_SOURCE_DIR}/w32kdll_2k3sp2.def) -add_dependencies(w32kdll_2k3sp2 psdk buildno_header) +add_dependencies(w32kdll_2k3sp2 psdk ) add_importlib_target(w32kdll_2k3sp2.def) diff --git a/rostests/apitests/w32kdll/w32kdll_2ksp4/CMakeLists.txt b/rostests/apitests/w32kdll/w32kdll_2ksp4/CMakeLists.txt index efc4ec0ad68..66768eeef4d 100644 --- a/rostests/apitests/w32kdll/w32kdll_2ksp4/CMakeLists.txt +++ b/rostests/apitests/w32kdll/w32kdll_2ksp4/CMakeLists.txt @@ -2,5 +2,5 @@ add_library(w32kdll_2ksp4 SHARED main.c w32kdll_2ksp4.S) set_entrypoint(w32kdll_2ksp4 0) target_link_libraries(w32kdll_2ksp4 ${CMAKE_CURRENT_SOURCE_DIR}/w32kdll_2ksp4.def) -add_dependencies(w32kdll_2ksp4 psdk buildno_header) +add_dependencies(w32kdll_2ksp4 psdk ) add_importlib_target(w32kdll_2ksp4.def) diff --git a/rostests/apitests/w32kdll/w32kdll_ros/CMakeLists.txt b/rostests/apitests/w32kdll/w32kdll_ros/CMakeLists.txt index ad143fee275..c96fff8d796 100644 --- a/rostests/apitests/w32kdll/w32kdll_ros/CMakeLists.txt +++ b/rostests/apitests/w32kdll/w32kdll_ros/CMakeLists.txt @@ -7,5 +7,5 @@ target_link_libraries(w32kdll ${CMAKE_CURRENT_SOURCE_DIR}/w32kdll_ros.def win32ksys) -add_dependencies(w32kdll psdk buildno_header) +add_dependencies(w32kdll psdk ) add_importlib_target(w32kdll_ros.def) diff --git a/rostests/apitests/w32kdll/w32kdll_vista/CMakeLists.txt b/rostests/apitests/w32kdll/w32kdll_vista/CMakeLists.txt index 5c387435e80..a70bec57cf7 100644 --- a/rostests/apitests/w32kdll/w32kdll_vista/CMakeLists.txt +++ b/rostests/apitests/w32kdll/w32kdll_vista/CMakeLists.txt @@ -2,5 +2,5 @@ add_library(w32kdll_vista SHARED main.c w32kdll_vista.S) set_entrypoint(w32kdll_vista 0) target_link_libraries(w32kdll_vista ${CMAKE_CURRENT_SOURCE_DIR}/w32kdll_vista.def) -add_dependencies(w32kdll_vista psdk buildno_header) +add_dependencies(w32kdll_vista psdk ) add_importlib_target(w32kdll_vista.def) diff --git a/rostests/apitests/w32kdll/w32kdll_xpsp2/CMakeLists.txt b/rostests/apitests/w32kdll/w32kdll_xpsp2/CMakeLists.txt index 3f86810f2c6..e3579261dd4 100644 --- a/rostests/apitests/w32kdll/w32kdll_xpsp2/CMakeLists.txt +++ b/rostests/apitests/w32kdll/w32kdll_xpsp2/CMakeLists.txt @@ -2,5 +2,5 @@ add_library(w32kdll_xpsp2 SHARED main.c w32kdll_xpsp2.S) set_entrypoint(w32kdll_xpsp2 0) target_link_libraries(w32kdll_xpsp2 ${CMAKE_CURRENT_SOURCE_DIR}/w32kdll_xpsp2.def) -add_dependencies(w32kdll_xpsp2 psdk buildno_header) +add_dependencies(w32kdll_xpsp2 psdk ) add_importlib_target(w32kdll_xpsp2.def) From 0e072c5063bd98bf31a40952491f78ea5dfc358b Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Wed, 6 Apr 2011 18:49:16 +0000 Subject: [PATCH 089/317] [RPCRT4] Fix return type of *ClientCall functions. Merged from cmake branch svn path=/trunk/; revision=51269 --- reactos/dll/win32/rpcrt4/cproxy.c | 4 ++-- reactos/dll/win32/rpcrt4/ndr_stubless.c | 17 +++++++---------- reactos/include/psdk/rpcndr.h | 10 ++++------ 3 files changed, 13 insertions(+), 18 deletions(-) diff --git a/reactos/dll/win32/rpcrt4/cproxy.c b/reactos/dll/win32/rpcrt4/cproxy.c index 9ce555f7146..176204667ad 100644 --- a/reactos/dll/win32/rpcrt4/cproxy.c +++ b/reactos/dll/win32/rpcrt4/cproxy.c @@ -17,7 +17,7 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA - * + * * TODO: Handle non-i386 architectures */ @@ -96,7 +96,7 @@ HRESULT WINAPI ObjectStubless(DWORD *args) args[0] = *(const WORD*)(fs + 8); TRACE("(%p)->(%d)([%d bytes]) ret=%08x\n", iface, index, args[0], args[1]); - return NdrClientCall2(stubless->pStubDesc, fs, args + 2); + return NdrClientCall2(stubless->pStubDesc, fs, args + 2).Simple; } #define BLOCK_SIZE 1024 diff --git a/reactos/dll/win32/rpcrt4/ndr_stubless.c b/reactos/dll/win32/rpcrt4/ndr_stubless.c index 645a0ca4729..d6b9c5f90c2 100644 --- a/reactos/dll/win32/rpcrt4/ndr_stubless.c +++ b/reactos/dll/win32/rpcrt4/ndr_stubless.c @@ -510,7 +510,7 @@ void client_do_args_old_format(PMIDL_STUB_MESSAGE pStubMsg, } else { - const NDR_PARAM_OI_OTHER *pParamOther = + const NDR_PARAM_OI_OTHER *pParamOther = (const NDR_PARAM_OI_OTHER *)&pFormat[current_offset]; const unsigned char *pTypeFormat = @@ -548,10 +548,7 @@ void client_do_args_old_format(PMIDL_STUB_MESSAGE pStubMsg, } } -/* the return type should be CLIENT_CALL_RETURN, but this is incompatible - * with the way gcc returns structures. "void *" should be the largest type - * that MIDL should allow you to return anyway */ -LONG_PTR WINAPIV NdrClientCall2(PMIDL_STUB_DESC pStubDesc, PFORMAT_STRING pFormat, ...) +CLIENT_CALL_RETURN WINAPIV NdrClientCall2(PMIDL_STUB_DESC pStubDesc, PFORMAT_STRING pFormat, ...) { /* pointer to start of stack where arguments start */ RPC_MESSAGE rpcMsg; @@ -574,7 +571,7 @@ LONG_PTR WINAPIV NdrClientCall2(PMIDL_STUB_DESC pStubDesc, PFORMAT_STRING pForma /* -Oif or -Oicf generated format */ BOOL bV2Format = FALSE; /* the value to return to the client from the remote procedure */ - LONG_PTR RetVal = 0; + CLIENT_CALL_RETURN RetVal = {0}; /* the pointer to the object when in OLE mode */ void * This = NULL; PFORMAT_STRING pHandleFormat; @@ -630,7 +627,7 @@ LONG_PTR WINAPIV NdrClientCall2(PMIDL_STUB_DESC pStubDesc, PFORMAT_STRING pForma if (!(pProcHeader->Oi_flags & RPC_FC_PROC_OIF_OBJECT)) { pFormat = client_get_handle(&stubMsg, pProcHeader, pHandleFormat, &hBinding); - if (!pFormat) return 0; + if (!pFormat) return RetVal; } bV2Format = (pStubDesc->Version >= 0x20000); @@ -729,7 +726,7 @@ LONG_PTR WINAPIV NdrClientCall2(PMIDL_STUB_DESC pStubDesc, PFORMAT_STRING pForma } __EXCEPT_ALL { - RetVal = NdrProxyErrorHandler(GetExceptionCode()); + RetVal.Simple = NdrProxyErrorHandler(GetExceptionCode()); } __ENDTRY } @@ -830,7 +827,7 @@ LONG_PTR WINAPIV NdrClientCall2(PMIDL_STUB_DESC pStubDesc, PFORMAT_STRING pForma client_free_handle(&stubMsg, pProcHeader, pHandleFormat, hBinding); } - TRACE("RetVal = 0x%lx\n", RetVal); + TRACE("RetVal = 0x%p\n", RetVal.Pointer); return RetVal; } @@ -1465,7 +1462,7 @@ LONG WINAPI NdrStubCall2( pRpcMsg->BufferLength = stubMsg.BufferLength; /* allocate buffer for [out] and [ret] params */ - Status = I_RpcGetBuffer(pRpcMsg); + Status = I_RpcGetBuffer(pRpcMsg); if (Status) RpcRaiseException(Status); stubMsg.Buffer = pRpcMsg->Buffer; diff --git a/reactos/include/psdk/rpcndr.h b/reactos/include/psdk/rpcndr.h index dd3a532b342..9171044a979 100644 --- a/reactos/include/psdk/rpcndr.h +++ b/reactos/include/psdk/rpcndr.h @@ -650,15 +650,13 @@ RPCRTAPI void RPC_ENTRY RPCRTAPI unsigned char* RPC_ENTRY NdrUserMarshalSimpleTypeConvert( ULONG *pFlags, unsigned char *pBuffer, unsigned char FormatChar ); -/* Note: this should return a CLIENT_CALL_RETURN, but calling convention for - * returning structures/unions is different between Windows and gcc on i386. */ -LONG_PTR RPC_VAR_ENTRY +CLIENT_CALL_RETURN RPC_VAR_ENTRY NdrClientCall2( PMIDL_STUB_DESC pStubDescriptor, PFORMAT_STRING pFormat, ... ); -LONG_PTR RPC_VAR_ENTRY +CLIENT_CALL_RETURN RPC_VAR_ENTRY NdrClientCall( PMIDL_STUB_DESC pStubDescriptor, PFORMAT_STRING pFormat, ... ); -LONG_PTR RPC_VAR_ENTRY +CLIENT_CALL_RETURN RPC_VAR_ENTRY NdrAsyncClientCall( PMIDL_STUB_DESC pStubDescriptor, PFORMAT_STRING pFormat, ... ); -LONG_PTR RPC_VAR_ENTRY +CLIENT_CALL_RETURN RPC_VAR_ENTRY NdrDcomAsyncClientCall( PMIDL_STUB_DESC pStubDescriptor, PFORMAT_STRING pFormat, ... ); RPCRTAPI void RPC_ENTRY From 672303db6bb5274b4895020d99603a556a3c2ec5 Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Wed, 6 Apr 2011 19:03:20 +0000 Subject: [PATCH 090/317] [KERNEL32] - Rewrite most of kernel32 module loading APIs (except for LoadLibraryExW, for testing purposes it's gonna be committed in a separate commit). Rewritten parts include: * Better definition of LOADPARMS32 structure for LoadModule, and rewritten LoadModule which is now a well structured function with proper parameters validation, proper work algorithm and setting proper last error values in failure cases. Optimization of allocating MAX_PATH buffer on stack instead of in the heap is saved from the old version of the function. * LoadLibraryA, added a path-hack (present at least up to Windows 2003) for twain_32.dll loading (not that important, but still a compatibility issue). * Make GetProcAddress() use BasepMapModuleHandle for mapping the passed-in handle (including properly handling NULL module handle which was incorrectly handled by the old implementation), and check for a special failure case when LdrGetProcedureAddress returns pointer to the image base address. svn path=/trunk/; revision=51270 --- reactos/dll/win32/kernel32/misc/ldr.c | 339 +++++++++++++++++--------- 1 file changed, 220 insertions(+), 119 deletions(-) diff --git a/reactos/dll/win32/kernel32/misc/ldr.c b/reactos/dll/win32/kernel32/misc/ldr.c index cbf00e56896..85f9891be79 100644 --- a/reactos/dll/win32/kernel32/misc/ldr.c +++ b/reactos/dll/win32/kernel32/misc/ldr.c @@ -15,7 +15,8 @@ typedef struct tagLOADPARMS32 { LPSTR lpEnvAddress; LPSTR lpCmdLine; - LPSTR lpCmdShow; + WORD wMagicValue; + WORD wCmdShow; DWORD dwReserved; } LOADPARMS32; @@ -167,12 +168,17 @@ DisableThreadLibraryCalls( { NTSTATUS Status; + /* Disable thread library calls */ Status = LdrDisableThreadCalloutsForDll((PVOID)hLibModule); + + /* If it wasn't success - set last error and return failure */ if (!NT_SUCCESS(Status)) { BaseSetLastNTError(Status); return FALSE; } + + /* Return success */ return TRUE; } @@ -182,43 +188,74 @@ DisableThreadLibraryCalls( */ HINSTANCE WINAPI -LoadLibraryA ( - LPCSTR lpLibFileName - ) +LoadLibraryA(LPCSTR lpLibFileName) { - return LoadLibraryExA (lpLibFileName, 0, 0); -} + LPSTR PathBuffer; + UINT Len; + HINSTANCE Result; + /* Treat twain_32.dll in a special way (what a surprise...) */ + if (lpLibFileName && !_strcmpi(lpLibFileName, "twain_32.dll")) + { + /* Allocate space for the buffer */ + PathBuffer = RtlAllocateHeap(RtlGetProcessHeap(), 0, MAX_PATH); + if (PathBuffer) + { + /* Get windows dir in this buffer */ + Len = GetWindowsDirectoryA(PathBuffer, MAX_PATH - 13); /* 13 is sizeof of '\\twain_32.dll' */ + if (Len && Len < (MAX_PATH - 13)) + { + /* We successfully got windows directory. Concatenate twain_32.dll to it */ + strncat(PathBuffer, "\\twain_32.dll", 13); + + /* And recursively call ourselves with a new string */ + Result = LoadLibraryA(PathBuffer); + + /* If it was successful - free memory and return result */ + if (Result) + { + RtlFreeHeap(RtlGetProcessHeap(), 0, PathBuffer); + return Result; + } + } + + /* Free allocated buffer */ + RtlFreeHeap(RtlGetProcessHeap(), 0, PathBuffer); + } + } + + /* Call the Ex version of the API */ + return LoadLibraryExA(lpLibFileName, 0, 0); +} /* * @implemented */ HINSTANCE WINAPI -LoadLibraryExA( - LPCSTR lpLibFileName, - HANDLE hFile, - DWORD dwFlags) +LoadLibraryExA(LPCSTR lpLibFileName, + HANDLE hFile, + DWORD dwFlags) { - PUNICODE_STRING FileNameW; + PUNICODE_STRING FileNameW; + /* Convert file name to unicode */ if (!(FileNameW = Basep8BitStringToStaticUnicodeString(lpLibFileName))) return NULL; + /* And call W version of the API */ return LoadLibraryExW(FileNameW->Buffer, hFile, dwFlags); } - /* * @implemented */ HINSTANCE WINAPI -LoadLibraryW ( - LPCWSTR lpLibFileName - ) +LoadLibraryW(LPCWSTR lpLibFileName) { - return LoadLibraryExW (lpLibFileName, 0, 0); + /* Call Ex version of the API */ + return LoadLibraryExW (lpLibFileName, 0, 0); } @@ -364,42 +401,56 @@ done: */ FARPROC WINAPI -GetProcAddress( HMODULE hModule, LPCSTR lpProcName ) +GetProcAddress(HMODULE hModule, LPCSTR lpProcName) { - ANSI_STRING ProcedureName; - FARPROC fnExp = NULL; - NTSTATUS Status; + ANSI_STRING ProcedureName, *ProcNamePtr = NULL; + FARPROC fnExp = NULL; + NTSTATUS Status; + PVOID hMapped; + ULONG Ordinal = 0; - if (!hModule) - { - SetLastError(ERROR_PROC_NOT_FOUND); - return NULL; - } + if (HIWORD(lpProcName) != 0) + { + /* Look up by name */ + RtlInitAnsiString(&ProcedureName, (LPSTR)lpProcName); + ProcNamePtr = &ProcedureName; + } + else + { + /* Look up by ordinal */ + Ordinal = (ULONG)lpProcName; + } - if (HIWORD(lpProcName) != 0) - { - RtlInitAnsiString (&ProcedureName, - (LPSTR)lpProcName); - Status = LdrGetProcedureAddress ((PVOID)hModule, - &ProcedureName, - 0, - (PVOID*)&fnExp); - } - else - { - Status = LdrGetProcedureAddress ((PVOID)hModule, - NULL, - (ULONG)lpProcName, - (PVOID*)&fnExp); - } + /* Map provided handle */ + hMapped = BasepMapModuleHandle(hModule, FALSE); - if (!NT_SUCCESS(Status)) - { - SetLastErrorByStatus(Status); - fnExp = NULL; - } + /* Get the proc address */ + Status = LdrGetProcedureAddress(hMapped, + ProcNamePtr, + Ordinal, + (PVOID*)&fnExp); - return fnExp; + if (!NT_SUCCESS(Status)) + { + BaseSetLastNTError(Status); + return NULL; + } + + /* Check for a special case when returned pointer is + the same as iamge's base address */ + if (fnExp == hMapped) + { + /* Set correct error code */ + if (HIWORD(lpProcName) != 0) + BaseSetLastNTError(STATUS_ENTRYPOINT_NOT_FOUND); + else + BaseSetLastNTError(STATUS_ORDINAL_NOT_FOUND); + + return NULL; + } + + /* All good, return procedure pointer */ + return fnExp; } @@ -906,87 +957,137 @@ GetModuleHandleExA(IN DWORD dwFlags, */ DWORD WINAPI -LoadModule ( - LPCSTR lpModuleName, - LPVOID lpParameterBlock - ) +LoadModule(LPCSTR lpModuleName, + LPVOID lpParameterBlock) { - STARTUPINFOA StartupInfo; - PROCESS_INFORMATION ProcessInformation; - LOADPARMS32 *LoadParams; - char FileName[MAX_PATH]; - char *CommandLine, *t; - BYTE Length; + STARTUPINFOA StartupInfo; + PROCESS_INFORMATION ProcessInformation; + LOADPARMS32 *LoadParams; + char FileName[MAX_PATH]; + LPSTR CommandLine; + DWORD Length, Error; + BOOL ProcessStatus; + ANSI_STRING AnsiStr; + UNICODE_STRING UnicStr; + RTL_PATH_TYPE PathType; + HANDLE Handle; - LoadParams = (LOADPARMS32*)lpParameterBlock; - if(!lpModuleName || !LoadParams || (((WORD*)LoadParams->lpCmdShow)[0] != 2)) - { - /* windows doesn't check parameters, we do */ - SetLastError(ERROR_INVALID_PARAMETER); - return 0; - } + LoadParams = (LOADPARMS32*)lpParameterBlock; - if(!SearchPathA(NULL, lpModuleName, ".exe", MAX_PATH, FileName, NULL) && - !SearchPathA(NULL, lpModuleName, NULL, MAX_PATH, FileName, NULL)) - { - return ERROR_FILE_NOT_FOUND; - } - - Length = (BYTE)LoadParams->lpCmdLine[0]; - if(!(CommandLine = RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, - strlen(lpModuleName) + Length + 2))) - { - SetLastError(ERROR_NOT_ENOUGH_MEMORY); - return 0; - } - - /* Create command line string */ - strcpy(CommandLine, lpModuleName); - t = CommandLine + strlen(CommandLine); - *(t++) = ' '; - memcpy(t, LoadParams->lpCmdLine + 1, Length); - - /* Build StartupInfo */ - RtlZeroMemory(&StartupInfo, sizeof(STARTUPINFOA)); - StartupInfo.cb = sizeof(STARTUPINFOA); - StartupInfo.dwFlags = STARTF_USESHOWWINDOW; - StartupInfo.wShowWindow = ((WORD*)LoadParams->lpCmdShow)[1]; - - if(!CreateProcessA(FileName, CommandLine, NULL, NULL, FALSE, 0, LoadParams->lpEnvAddress, - NULL, &StartupInfo, &ProcessInformation)) - { - DWORD Error; - - RtlFreeHeap(RtlGetProcessHeap(), 0, CommandLine); - /* return the right value */ - Error = GetLastError(); - switch(Error) + /* Check load parameters */ + if (LoadParams->dwReserved || LoadParams->wMagicValue != 2) { - case ERROR_BAD_EXE_FORMAT: - { - return ERROR_BAD_FORMAT; - } - case ERROR_FILE_NOT_FOUND: - case ERROR_PATH_NOT_FOUND: - { - return Error; - } + /* Fail with invalid param error */ + BaseSetLastNTError(STATUS_INVALID_PARAMETER); + return 0; } - return 0; - } - RtlFreeHeap(RtlGetProcessHeap(), 0, CommandLine); + /* Search path */ + Length = SearchPathA(NULL, lpModuleName, ".exe", MAX_PATH, FileName, NULL); - /* Wait up to 15 seconds for the process to become idle */ - if (NULL != lpfnGlobalRegisterWaitForInputIdle) - { - lpfnGlobalRegisterWaitForInputIdle(ProcessInformation.hProcess, 15000); - } + /* Check if path was found */ + if (Length && Length < MAX_PATH) + { + /* Build StartupInfo */ + RtlZeroMemory(&StartupInfo, sizeof(StartupInfo)); - NtClose(ProcessInformation.hThread); - NtClose(ProcessInformation.hProcess); + StartupInfo.cb = sizeof(STARTUPINFOA); + StartupInfo.dwFlags = STARTF_USESHOWWINDOW; + StartupInfo.wShowWindow = LoadParams->wCmdShow; - return 33; + /* Allocate command line buffer */ + CommandLine = RtlAllocateHeap(RtlGetProcessHeap(), + HEAP_ZERO_MEMORY, + (ULONG)LoadParams->lpCmdLine[0] + Length + 2); + + /* Put module name there, then a space, and then copy provided command line, + and null-terminate it */ + RtlCopyMemory(CommandLine, FileName, Length); + CommandLine[Length] = ' '; + RtlCopyMemory(&CommandLine[Length + 1], &LoadParams->lpCmdLine[1], (ULONG)LoadParams->lpCmdLine[0]); + CommandLine[Length + 1 + (ULONG)LoadParams->lpCmdLine[0]] = 0; + + /* Create the process */ + ProcessStatus = CreateProcessA(FileName, + CommandLine, + NULL, + NULL, + FALSE, + 0, + LoadParams->lpEnvAddress, + NULL, + &StartupInfo, + &ProcessInformation); + + /* Free the command line buffer */ + RtlFreeHeap(RtlGetProcessHeap(), 0, CommandLine); + + if (!ProcessStatus) + { + /* Creating process failed, return right error code */ + Error = GetLastError(); + switch(Error) + { + case ERROR_BAD_EXE_FORMAT: + return ERROR_BAD_FORMAT; + + case ERROR_FILE_NOT_FOUND: + case ERROR_PATH_NOT_FOUND: + return Error; + } + + /* Return 0 otherwise */ + return 0; + } + + /* Wait up to 30 seconds for the process to become idle */ + if (lpfnGlobalRegisterWaitForInputIdle) + { + lpfnGlobalRegisterWaitForInputIdle(ProcessInformation.hProcess, 30000); + } + + /* Close handles */ + NtClose(ProcessInformation.hThread); + NtClose(ProcessInformation.hProcess); + + /* Return magic success value (33) */ + return 33; + } + + /* The path was not found, create an ansi string from + the module name and convert it to unicode */ + RtlInitAnsiString(&AnsiStr, lpModuleName); + if (!NT_SUCCESS(RtlAnsiStringToUnicodeString(&UnicStr,&AnsiStr,TRUE))) + return ERROR_FILE_NOT_FOUND; + + /* Determine path type */ + PathType = RtlDetermineDosPathNameType_U(UnicStr.Buffer); + + /* Free the unicode module name */ + RtlFreeUnicodeString(&UnicStr); + + /* If it's a relative path, return file not found */ + if (PathType == RtlPathTypeRelative) + return ERROR_FILE_NOT_FOUND; + + /* If not, try to open it */ + Handle = CreateFile(lpModuleName, + GENERIC_READ, + FILE_SHARE_READ | FILE_SHARE_WRITE, + NULL, + OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL, + NULL); + + if (Handle != INVALID_HANDLE_VALUE) + { + /* Opening file succeeded for some reason, close the handle and return file not found anyway */ + CloseHandle(Handle); + return ERROR_FILE_NOT_FOUND; + } + + /* Return last error which CreateFile set during an attempt to open it */ + return GetLastError(); } /* EOF */ From 446f42d3af1c97087edd38e981ac58a4805b0f02 Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Wed, 6 Apr 2011 21:05:05 +0000 Subject: [PATCH 091/317] [SNDVOL32] - Implement loading of resources and parsing the dialog template in memory - Store the created windows in an array - Implement destroying of controls when mixer is changed / line selection is altered - Implement generating layout for each new line - Implement setting line name - Resources have not yet been commited - Sndvol32 is not yet functional svn path=/trunk/; revision=51271 --- reactos/base/applications/sndvol32/dialog.c | 384 ++++++++++++++++++ reactos/base/applications/sndvol32/misc.c | 3 +- reactos/base/applications/sndvol32/mixer.c | 2 +- .../base/applications/sndvol32/resources.h | 7 +- reactos/base/applications/sndvol32/sndvol32.c | 129 +++--- reactos/base/applications/sndvol32/sndvol32.h | 32 +- .../applications/sndvol32/sndvol32.rbuild | 1 + 7 files changed, 500 insertions(+), 58 deletions(-) create mode 100644 reactos/base/applications/sndvol32/dialog.c diff --git a/reactos/base/applications/sndvol32/dialog.c b/reactos/base/applications/sndvol32/dialog.c new file mode 100644 index 00000000000..3cddcd043e2 --- /dev/null +++ b/reactos/base/applications/sndvol32/dialog.c @@ -0,0 +1,384 @@ +/* $Id: misc.c 43790 2009-10-27 10:34:16Z dgorbachev $ + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS Sound Volume Control + * FILE: subsys/system/sndvol32/dialog.c + * PROGRAMMERS: Johannes Anderwald + */ +#include "sndvol32.h" + + +#define XLEFT (30) +#define XTOP (20) +#define DIALOG_VOLUME_SIZE (150) + +LPVOID +LoadDialogResource( + IN HMODULE hModule, + IN LPCWSTR ResourceName, + OUT LPDWORD ResourceLength) +{ + HRSRC hSrc; + HGLOBAL hRes; + PVOID Result; + + /* find resource */ + hSrc = FindResourceW(hModule, ResourceName, (LPCWSTR)RT_DIALOG); + + if (!hSrc) + { + /* failed to find resource */ + return NULL; + } + + /* now load the resource */ + hRes = LoadResource(hAppInstance, hSrc); + if (!hRes) + { + /* failed to load resource */ + return NULL; + } + + /* now lock the resource */ + Result = LockResource(hRes); + + if (!Result) + { + /* failed to lock resource */ + return NULL; + } + + if (ResourceLength) + { + /* store output length */ + *ResourceLength = SizeofResource(hAppInstance, hSrc); + } + + /* done */ + return Result; +} + +LPWORD +AddDialogControl( + IN HWND hwndDialog, + IN HWND * OutWnd, + IN LPRECT DialogOffset, + IN PDLGITEMTEMPLATE DialogItem, + IN DWORD DialogIdMultiplier, + IN HFONT hFont) +{ + RECT rect; + LPWORD Offset; + LPWSTR ClassName, WindowName = NULL; + HWND hwnd; + DWORD wID; + + /* initialize client rectangle */ + rect.left = DialogItem->x + DialogOffset->left; + rect.top = DialogItem->y + DialogOffset->top; + rect.right = DialogItem->cx; + rect.bottom = DialogItem->cy; + + //MapDialogRect(hwndDialog, &rect); + + /* move offset after dialog item */ + Offset = (LPWORD)(DialogItem + 1); + + if (*Offset == 0xFFFF) + { + /* class is encoded as type */ + Offset++; + + /* get control type */ + switch(*Offset) + { + case 0x80: + ClassName = L"button"; + WindowName = (LPWSTR)(Offset + 1); + break ; + case 0x82: + ClassName = L"static"; + WindowName = (LPWSTR)(Offset + 1); + break; + default: + /* FIXME */ + assert(0); + ClassName = 0; + } + } + else + { + /* class name is encoded as string */ + ClassName = (LPWSTR)Offset; + + /* adjust offset */ + Offset += wcslen(ClassName) + 1; + + /* get offset */ + WindowName = (LPWSTR)(Offset + 1); + } + + if (DialogItem->id == MAXWORD) + { + /* id is not important */ + wID = DialogItem->id; + } + else + { + /* calculate id */ + wID = DialogItem->id * (DialogIdMultiplier + 1); + + } + /* now create the window */ + hwnd = CreateWindowExW(DialogItem->dwExtendedStyle, + ClassName, + WindowName, + DialogItem->style, + rect.left, + rect.top, + rect.right, + rect.bottom, + hwndDialog, + (HMENU)(wID), + hAppInstance, + NULL); + + /* sanity check */ + assert(hwnd); + + /* store window */ + *OutWnd = hwnd; + + /* check if this the track bar */ + if (!wcsicmp(ClassName, L"msctls_trackbar32")) + { + /* set up range */ + SendMessage(hwnd, TBM_SETRANGE, (WPARAM) TRUE, (LPARAM) MAKELONG(0, 5)); + + /* set up page size */ + SendMessage(hwnd, TBM_SETPAGESIZE, 0, (LPARAM) 1); + + /* set available range */ + SendMessage(hwnd, TBM_SETSEL, (WPARAM) FALSE, (LPARAM) MAKELONG(0, 5)); + } + else if (!wcsicmp(ClassName, L"static") || !wcsicmp(ClassName, L"button")) + { + /* set font */ + SendMessageW(hwnd, WM_SETFONT, (WPARAM)hFont, TRUE); + } + + //ShowWindow(hwnd, SW_SHOWNORMAL); + + if (WindowName != NULL) + { + /* position offset to start of name */ + Offset++; + + /* move offset past name */ + Offset += wcslen((LPWSTR)Offset) + 1; + } + else + { + /* no name so just adjust offset */ + Offset++; + } + + /* check if there is additional data */ + if (*Offset == 0) + { + /* no additional data */ + Offset++; + } + else + { + /* add data offset */ + Offset += *Offset; + } + + /* make sure next template is word-aligned */ + Offset = (LPWORD)(((ULONG_PTR)Offset + 3) & ~3); + + /* done */ + return Offset; +} + +VOID +LoadDialogControls( + IN PMIXER_WINDOW MixerWindow, + LPRECT DialogOffset, + LPVOID DlgResource, + DWORD DialogIdMultiplier) +{ + LPDLGTEMPLATE DialogHeader; + PDLGITEMTEMPLATE DialogItem; + LPWORD Offset; + WORD FontSize; + WCHAR FontName[100]; + WORD Length, Index; + HFONT Font; + + /* get dialog header */ + DialogHeader = (LPDLGTEMPLATE)DlgResource; + + /* sanity check */ + assert(DialogHeader->cdit); + + if (MixerWindow->Window) + MixerWindow->Window = (HWND*)HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, MixerWindow->Window, (MixerWindow->WindowCount + DialogHeader->cdit) * sizeof(HWND)); + else + MixerWindow->Window = (HWND*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, DialogHeader->cdit * sizeof(HWND)); + if (!MixerWindow->Window) + { + /* no memory */ + return; + } + + /* now walk past the dialog header */ + Offset = (LPWORD)(DialogHeader + 1); + + /* FIXME: support menu */ + assert(*Offset == 0); + Offset++; + + /* FIXME: support classes */ + assert(*Offset == 0); + Offset++; + + /* FIXME: support titles */ + assert(*Offset == 0); + Offset++; + + /* get font size */ + FontSize = *Offset; + Offset++; + + /* calculate font length */ + Length = wcslen((LPWSTR)Offset) + 1; + assert(Length < (sizeof(FontName) / sizeof(WCHAR))); + + /* copy font */ + wcscpy(FontName, (LPWSTR)Offset); + + Font = CreateFontW(FontSize+8, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, FF_DONTCARE, FontName); + assert(Font); + + /* move offset after font name */ + Offset += Length; + + /* offset is now at first dialog item control */ + DialogItem = (PDLGITEMTEMPLATE)Offset; + + /* enumerate now all controls */ + for(Index = 0; Index < DialogHeader->cdit; Index++) + { + /* add controls */ + Offset = AddDialogControl(MixerWindow->hWnd, &MixerWindow->Window[MixerWindow->WindowCount], DialogOffset, DialogItem, DialogIdMultiplier, Font); + + /* sanity check */ + assert(Offset); + + /* move dialog item to new offset */ + DialogItem =(PDLGITEMTEMPLATE)Offset; + + /* increment window count */ + MixerWindow->WindowCount++; + } +} + +VOID +LoadDialog( + IN HMODULE hModule, + IN PMIXER_WINDOW MixerWindow, + IN LPCWSTR DialogResId, + IN DWORD Index) +{ + LPVOID DlgResource; + RECT rect; + + /* first load the dialog resource */ + DlgResource = LoadDialogResource(hModule, DialogResId, NULL); + + if (!DlgResource) + { + /* failed to load resource */ + return; + } + + /* get window size */ + GetClientRect(MixerWindow->hWnd, &rect); + + /* adjust client position */ + rect.left += (Index * DIALOG_VOLUME_SIZE); + + + /* now add the controls */ + LoadDialogControls(MixerWindow, &rect, DlgResource, Index); + +} + +BOOL +CALLBACK +EnumConnectionsCallback( + PSND_MIXER Mixer, + DWORD LineID, + LPMIXERLINE Line, + PVOID Context) +{ + WCHAR LineName[MIXER_LONG_NAME_CHARS]; + DWORD Flags; + DWORD wID; + RECT rect; + PPREFERENCES_CONTEXT PrefContext = (PPREFERENCES_CONTEXT)Context; + + if (Line->cControls != 0) + { + /* get line name */ + if (SndMixerGetLineName(PrefContext->Mixer, PrefContext->SelectedLine, LineName, MIXER_LONG_NAME_CHARS, FALSE) == -1) + { + /* failed to get line name */ + LineName[0] = L'\0'; + } + + /* check if line is found in registry settings */ + if (ReadLineConfig(PrefContext->DeviceName, + LineName, + Line->szName, + &Flags)) + { + /* is it selected */ + if (Flags != 0x4) + { + /* load dialog resource */ + LoadDialog(hAppInstance, PrefContext->MixerWindow, MAKEINTRESOURCE(IDD_VOLUME_CTRL), PrefContext->Count); + + /* get id */ + wID = (PrefContext->Count + 1) * IDC_LINE_NAME; + + /* set line name */ + SetDlgItemTextW(PrefContext->MixerWindow->hWnd, wID, Line->szName); + + /* increment dialog count */ + PrefContext->Count++; + + /* get application rectangle */ + GetWindowRect(PrefContext->MixerWindow->hWnd, &rect); + + /* now move the window */ + MoveWindow(PrefContext->MixerWindow->hWnd, rect.left, rect.top, (PrefContext->Count * DIALOG_VOLUME_SIZE), rect.bottom, TRUE); + + } + } + } + return TRUE; +} + +VOID +LoadDialogCtrls( + PPREFERENCES_CONTEXT PrefContext) +{ + /* set dialog count to one */ + PrefContext->Count = 0; + + /* enumerate controls */ + SndMixerEnumConnections(PrefContext->Mixer, PrefContext->SelectedLine, EnumConnectionsCallback, (PVOID)PrefContext); +} diff --git a/reactos/base/applications/sndvol32/misc.c b/reactos/base/applications/sndvol32/misc.c index 2935a85e193..169e6114339 100644 --- a/reactos/base/applications/sndvol32/misc.c +++ b/reactos/base/applications/sndvol32/misc.c @@ -23,7 +23,8 @@ * FILE: subsys/system/sndvol32/misc.c * PROGRAMMERS: Thomas Weidenmueller */ -#include +#include "sndvol32.h" + static INT LengthOfStrResource(IN HINSTANCE hInst, diff --git a/reactos/base/applications/sndvol32/mixer.c b/reactos/base/applications/sndvol32/mixer.c index f01496c7ed3..d4e883ba2a9 100644 --- a/reactos/base/applications/sndvol32/mixer.c +++ b/reactos/base/applications/sndvol32/mixer.c @@ -23,7 +23,7 @@ * FILE: subsys/system/sndvol32/mixer.c * PROGRAMMERS: Thomas Weidenmueller */ -#include +#include "sndvol32.h" #define NO_MIXER_SELECTED ((UINT)(~0)) diff --git a/reactos/base/applications/sndvol32/resources.h b/reactos/base/applications/sndvol32/resources.h index 0272ffecd1c..2fa18a50a66 100644 --- a/reactos/base/applications/sndvol32/resources.h +++ b/reactos/base/applications/sndvol32/resources.h @@ -10,7 +10,7 @@ #define IDC_HELP_TOPICS 1101 #define IDC_ABOUT 1102 -#define IDD_PREFERENCES 101 + #define IDC_MIXERDEVICE 1001 #define IDC_PLAYBACK 1002 #define IDC_RECORDING 1003 @@ -18,6 +18,11 @@ #define IDC_LINE 1005 #define IDC_LABELCONTROLS 1006 #define IDC_CONTROLS 1007 +#define IDC_LINE_NAME 1008 #define IDS_SNDVOL32 100 #define IDS_NOMIXERDEVICES 101 + + +#define IDD_VOLUME_CTRL 200 +#define IDD_PREFERENCES 201 diff --git a/reactos/base/applications/sndvol32/sndvol32.c b/reactos/base/applications/sndvol32/sndvol32.c index 3816d353a63..6c8ad7c55c1 100644 --- a/reactos/base/applications/sndvol32/sndvol32.c +++ b/reactos/base/applications/sndvol32/sndvol32.c @@ -23,13 +23,14 @@ * FILE: subsys/system/sndvol32/sndvol32.c * PROGRAMMERS: Thomas Weidenmueller */ -#include +#include "sndvol32.h" HINSTANCE hAppInstance; ATOM MainWindowClass; HWND hMainWnd; HANDLE hAppHeap; LPTSTR lpAppTitle; +PREFERENCES_CONTEXT Preferences; #define GetDialogData(hwndDlg, type) \ ( P##type )GetWindowLongPtr((hwndDlg), DWLP_USER) @@ -38,21 +39,7 @@ LPTSTR lpAppTitle; /******************************************************************************/ -typedef struct _PREFERENCES_CONTEXT -{ - PMIXER_WINDOW MixerWindow; - PSND_MIXER Mixer; - HWND hwndDlg; - UINT Selected; - DWORD SelectedLine; - DWORD PlaybackID; - DWORD RecordingID; - UINT OtherLines; - TCHAR DeviceName[128]; - - DWORD tmp; -} PREFERENCES_CONTEXT, *PPREFERENCES_CONTEXT; typedef struct _PREFERENCES_FILL_DEVICES { @@ -546,18 +533,36 @@ DlgPreferencesProc(HWND hwndDlg, return 0; } + /******************************************************************************/ static VOID DeleteMixerWindowControls(PMIXER_WINDOW MixerWindow) { - UNREFERENCED_PARAMETER(MixerWindow); + DWORD Index; + + for(Index = 0; Index < MixerWindow->WindowCount; Index++) + { + /* destroys the window */ + DestroyWindow(MixerWindow->Window[Index]); + } + + /* free memory */ + HeapFree(GetProcessHeap(), 0, MixerWindow->Window); + + /* set to null */ + MixerWindow->Window = NULL; + MixerWindow->WindowCount = 0; } static BOOL -RebuildMixerWindowControls(PMIXER_WINDOW MixerWindow) +RebuildMixerWindowControls(PPREFERENCES_CONTEXT PrefContext) { - DeleteMixerWindowControls(MixerWindow); + /* delete existing mixer controls */ + DeleteMixerWindowControls(PrefContext->MixerWindow); + + /* load new mixer controls */ + LoadDialogCtrls(PrefContext); return TRUE; } @@ -637,44 +642,56 @@ MainWindowProc(HWND hwnd, GWL_USERDATA, (LONG_PTR)MixerWindow); MixerWindow->hWnd = hwnd; - MixerWindow->hStatusBar = CreateStatusWindow(WS_VISIBLE | WS_CHILD | WS_CLIPSIBLINGS, - NULL, - hwnd, - 0); - if (MixerWindow->hStatusBar != NULL) + MixerWindow->Mixer = SndMixerCreate(MixerWindow->hWnd); + if (MixerWindow->Mixer != NULL) { - MixerWindow->Mixer = SndMixerCreate(MixerWindow->hWnd); - if (MixerWindow->Mixer != NULL) + TCHAR szProduct[MAXPNAMELEN]; + + /* get mixer product name */ + if (SndMixerGetProductName(MixerWindow->Mixer, + szProduct, + sizeof(szProduct) / sizeof(szProduct[0])) == -1) { - TCHAR szProduct[MAXPNAMELEN]; - - if (SndMixerGetProductName(MixerWindow->Mixer, - szProduct, - sizeof(szProduct) / sizeof(szProduct[0])) > 0) - { - SendMessage(MixerWindow->hStatusBar, - WM_SETTEXT, - 0, - (LPARAM)szProduct); - } - - if (!RebuildMixerWindowControls(MixerWindow)) - { - DPRINT("Rebuilding mixer window controls failed!\n"); - SndMixerDestroy(MixerWindow->Mixer); - MixerWindow->Mixer = NULL; - Result = -1; - } + /* failed to get name */ + szProduct[0] = L'\0'; } - else + + + /* initialize perferences */ + ZeroMemory(&Preferences, sizeof(Preferences)); + + /* store mixer */ + Preferences.Mixer = MixerWindow->Mixer; + + /* store mixer window */ + Preferences.MixerWindow = MixerWindow; + + /* first destination line id */ + Preferences.SelectedLine = 0xFFFF0000; + + /* copy product */ + wcscpy(Preferences.DeviceName, szProduct); + + if (!RebuildMixerWindowControls(&Preferences)) { + DPRINT("Rebuilding mixer window controls failed!\n"); + SndMixerDestroy(MixerWindow->Mixer); + MixerWindow->Mixer = NULL; Result = -1; } - } - else - { - DPRINT("Failed to create status window!\n"); - Result = -1; + + /* create status window */ + MixerWindow->hStatusBar = CreateStatusWindow(WS_VISIBLE | WS_CHILD | WS_CLIPSIBLINGS, + NULL, + hwnd, + 0); + if (MixerWindow->hStatusBar) + { + SendMessage(MixerWindow->hStatusBar, + WM_SETTEXT, + 0, + (LPARAM)szProduct); + } } break; } @@ -746,7 +763,7 @@ CreateApplicationWindow(VOID) HWND hWnd; PMIXER_WINDOW MixerWindow = HeapAlloc(hAppHeap, - 0, + HEAP_ZERO_MEMORY, sizeof(MIXER_WINDOW)); if (MixerWindow == NULL) { @@ -758,8 +775,8 @@ CreateApplicationWindow(VOID) hWnd = CreateWindowEx(WS_EX_WINDOWEDGE | WS_EX_CONTROLPARENT, SZ_APP_CLASS, lpAppTitle, - WS_DLGFRAME | WS_CAPTION | WS_MINIMIZEBOX | WS_SYSMENU | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | WS_VISIBLE, - CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, + WS_OVERLAPPEDWINDOW | WS_VISIBLE, //WS_DLGFRAME | WS_CAPTION | WS_MINIMIZEBOX | WS_SYSMENU | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | WS_VISIBLE, + 0, 0, 300, 315, NULL, LoadMenu(hAppInstance, MAKEINTRESOURCE(IDM_MAINMENU)), @@ -805,6 +822,7 @@ _tWinMain(HINSTANCE hInstance, { MSG Msg; int Ret = 1; + INITCOMMONCONTROLSEX Controls; UNREFERENCED_PARAMETER(hPrevInstance); UNREFERENCED_PARAMETER(lpszCmdLine); @@ -823,7 +841,10 @@ _tWinMain(HINSTANCE hInstance, lpAppTitle = NULL; } - InitCommonControls(); + Controls.dwSize = sizeof(INITCOMMONCONTROLSEX); + Controls.dwICC = ICC_BAR_CLASSES | ICC_STANDARD_CLASSES; + + InitCommonControlsEx(&Controls); if (RegisterApplicationClasses()) { diff --git a/reactos/base/applications/sndvol32/sndvol32.h b/reactos/base/applications/sndvol32/sndvol32.h index 8ca5669bb4f..9cbae1ccbf8 100644 --- a/reactos/base/applications/sndvol32/sndvol32.h +++ b/reactos/base/applications/sndvol32/sndvol32.h @@ -9,6 +9,7 @@ #include #include #include "resources.h" +#include typedef struct _MIXER_WINDOW { @@ -16,6 +17,10 @@ typedef struct _MIXER_WINDOW HWND hStatusBar; struct _SND_MIXER *Mixer; UINT SelectedLine; + UINT WindowCount; + HWND * Window; + + } MIXER_WINDOW, *PMIXER_WINDOW; extern HINSTANCE hAppInstance; @@ -26,7 +31,8 @@ extern HANDLE hAppHeap; #define SZ_APP_CLASS TEXT("Volume Control") ULONG DbgPrint(PCH , ...); -#define DPRINT DbgPrint("SNDVOL32: %s:%i: ", __FILE__, __LINE__); DbgPrint +#define DPRINT +//DbgPrint("SNDVOL32: %s:%i: ", __FILE__, __LINE__); DbgPrint /* @@ -61,6 +67,24 @@ typedef struct _SND_MIXER PSND_MIXER_DESTINATION Lines; } SND_MIXER, *PSND_MIXER; +typedef struct _PREFERENCES_CONTEXT +{ + PMIXER_WINDOW MixerWindow; + PSND_MIXER Mixer; + HWND hwndDlg; + + UINT Selected; + DWORD SelectedLine; + DWORD PlaybackID; + DWORD RecordingID; + UINT OtherLines; + TCHAR DeviceName[128]; + + DWORD Count; + DWORD tmp; +} PREFERENCES_CONTEXT, *PPREFERENCES_CONTEXT; + + typedef BOOL (CALLBACK *PFNSNDMIXENUMLINES)(PSND_MIXER Mixer, LPMIXERLINE Line, UINT DisplayControls, PVOID Context); typedef BOOL (CALLBACK *PFNSNDMIXENUMCONNECTIONS)(PSND_MIXER Mixer, DWORD LineID, LPMIXERLINE Line, PVOID Context); typedef BOOL (CALLBACK *PFNSNDMIXENUMPRODUCTS)(PSND_MIXER Mixer, UINT Id, LPCTSTR ProductName, PVOID Context); @@ -78,6 +102,12 @@ BOOL SndMixerEnumLines(PSND_MIXER Mixer, PFNSNDMIXENUMLINES EnumProc, PVOID Cont BOOL SndMixerEnumConnections(PSND_MIXER Mixer, DWORD LineID, PFNSNDMIXENUMCONNECTIONS EnumProc, PVOID Context); BOOL SndMixerIsDisplayControl(PSND_MIXER Mixer, LPMIXERCONTROL Control); +/* + * dialog.c + */ +VOID +LoadDialogCtrls(PPREFERENCES_CONTEXT PrefContext); + /* * MISC */ diff --git a/reactos/base/applications/sndvol32/sndvol32.rbuild b/reactos/base/applications/sndvol32/sndvol32.rbuild index 97d5a60cc95..38d5d9e0f5a 100644 --- a/reactos/base/applications/sndvol32/sndvol32.rbuild +++ b/reactos/base/applications/sndvol32/sndvol32.rbuild @@ -11,6 +11,7 @@ shell32 winmm sndvol32.h + dialog.c misc.c mixer.c sndvol32.c From 3983f64027b168f44e2bb5bf83dd5216cb24ee26 Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Wed, 6 Apr 2011 21:49:04 +0000 Subject: [PATCH 092/317] [KERNEL32] - Finish the ldr.c rewrite. Properly implement LoadLibraryExW (which contained some good code pieces added by Alex). Implement BasepLoadLibraryAsDatafile, however it doesn't support redirection yet and a call to load alternate resource module is commented out (it's totally absent in the existing ntdll/ldr API now). - Mark GetDllLoadPath as deprecated, should be removed when SearchPathW is rewritten (or at least, reviewed). The new function to use is BasepGetDllPath. svn path=/trunk/; revision=51272 --- reactos/dll/win32/kernel32/include/kernel32.h | 1 + reactos/dll/win32/kernel32/misc/ldr.c | 257 ++++++++++++------ 2 files changed, 172 insertions(+), 86 deletions(-) diff --git a/reactos/dll/win32/kernel32/include/kernel32.h b/reactos/dll/win32/kernel32/include/kernel32.h index ef74e9e69ad..b315c2ed69f 100755 --- a/reactos/dll/win32/kernel32/include/kernel32.h +++ b/reactos/dll/win32/kernel32/include/kernel32.h @@ -96,6 +96,7 @@ extern RTL_CRITICAL_SECTION BaseDllDirectoryLock; extern UNICODE_STRING BaseDllDirectory; extern UNICODE_STRING BaseDefaultPath; extern UNICODE_STRING BaseDefaultPathAppend; +extern PLDR_DATA_TABLE_ENTRY BasepExeLdrEntry; extern LPTOP_LEVEL_EXCEPTION_FILTER GlobalTopLevelExceptionFilter; diff --git a/reactos/dll/win32/kernel32/misc/ldr.c b/reactos/dll/win32/kernel32/misc/ldr.c index 85f9891be79..62e02fb696a 100644 --- a/reactos/dll/win32/kernel32/misc/ldr.c +++ b/reactos/dll/win32/kernel32/misc/ldr.c @@ -1,10 +1,9 @@ /* * COPYRIGHT: See COPYING in the top level directory - * PROJECT : ReactOS user mode libraries + * PROJECT : ReactOS system libraries * MODULE : kernel32.dll * FILE : reactos/dll/win32/kernel32/misc/ldr.c * AUTHOR : Aleksey Bragin - * Ariadne */ #include @@ -27,6 +26,12 @@ extern WaitForInputIdleType lpfnGlobalRegisterWaitForInputIdle; #define BASEP_GET_MODULE_HANDLE_EX_PARAMETER_VALIDATION_SUCCESS 2 #define BASEP_GET_MODULE_HANDLE_EX_PARAMETER_VALIDATION_CONTINUE 3 +VOID +NTAPI +BasepLocateExeLdrEntry(IN PLDR_DATA_TABLE_ENTRY Entry, + IN PVOID Context, + OUT BOOLEAN *StopEnumeration); + /* FUNCTIONS ****************************************************************/ DWORD @@ -102,6 +107,8 @@ GetDllLoadPath(LPCWSTR lpModule) UNICODE_STRING ModuleName; DWORD LastError = GetLastError(); /* GetEnvironmentVariable changes LastError */ + // FIXME: This function is used only by SearchPathW, and is deprecated and will be deleted ASAP. + if ((lpModule != NULL) && (wcslen(lpModule) > 2) && (lpModule[1] == ':')) { lpModuleEnd = lpModule + wcslen(lpModule); @@ -261,69 +268,113 @@ LoadLibraryW(LPCWSTR lpLibFileName) static NTSTATUS -LoadLibraryAsDatafile(PWSTR path, LPCWSTR name, HMODULE* hmod) +BasepLoadLibraryAsDatafile(PWSTR Path, LPCWSTR Name, HMODULE *hModule) { - static const WCHAR dotDLL[] = {'.','d','l','l',0}; - - WCHAR filenameW[MAX_PATH]; + WCHAR FilenameW[MAX_PATH]; HANDLE hFile = INVALID_HANDLE_VALUE; - HANDLE mapping; - HMODULE module; + HANDLE hMapping; + NTSTATUS Status; + PVOID lpBaseAddress; + SIZE_T ViewSize; + //PUNICODE_STRING OriginalName; + //UNICODE_STRING dotDLL = RTL_CONSTANT_STRING(L".DLL"); - *hmod = 0; + /* Zero out handle value */ + *hModule = 0; - if (!SearchPathW( path, name, dotDLL, sizeof(filenameW) / sizeof(filenameW[0]), - filenameW, NULL )) + /*Status = RtlDosApplyFileIsolationRedirection_Ustr(TRUE, + Name, + &dotDLL, + RedirName, + RedirName2, + &OriginalName2, + NULL, + NULL, + NULL);*/ + + /* Try to search for it */ + if (!SearchPathW(Path, + Name, + L".DLL", + sizeof(FilenameW) / sizeof(FilenameW[0]), + FilenameW, + NULL)) { + /* Return last status value directly */ return NtCurrentTeb()->LastStatusValue; } - hFile = CreateFileW( filenameW, GENERIC_READ, FILE_SHARE_READ, - NULL, OPEN_EXISTING, 0, 0 ); + /* Open this file we found */ + hFile = CreateFileW(FilenameW, + GENERIC_READ, + FILE_SHARE_READ | FILE_SHARE_DELETE, + NULL, + OPEN_EXISTING, + 0, + 0); + /* If opening failed - return last status value */ if (hFile == INVALID_HANDLE_VALUE) return NtCurrentTeb()->LastStatusValue; - mapping = CreateFileMappingW( hFile, NULL, PAGE_READONLY, 0, 0, NULL ); - CloseHandle( hFile ); - if (!mapping) return NtCurrentTeb()->LastStatusValue; + /* Create file mapping */ + hMapping = CreateFileMappingW(hFile, NULL, PAGE_READONLY, 0, 0, NULL); - module = MapViewOfFile( mapping, FILE_MAP_READ, 0, 0, 0 ); - CloseHandle( mapping ); - if (!module) return NtCurrentTeb()->LastStatusValue; + /* Close the file handle */ + CloseHandle(hFile); - /* make sure it's a valid PE file */ - if (!RtlImageNtHeader(module)) + /* If creating file mapping failed - return last status value */ + if (!hMapping) return NtCurrentTeb()->LastStatusValue; + + /* Map view of section */ + Status = NtMapViewOfSection(hMapping, + NtCurrentProcess(), + &lpBaseAddress, + 0, + 0, + 0, + &ViewSize, + ViewShare, + 0, + PAGE_READONLY); + + /* Close handle to the section */ + CloseHandle(hMapping); + + /* If mapping view of section failed - return last status value */ + if (!NT_SUCCESS(Status)) return NtCurrentTeb()->LastStatusValue; + + /* Make sure it's a valid PE file */ + if (!RtlImageNtHeader(lpBaseAddress)) { - UnmapViewOfFile( module ); + /* Unmap the view and return failure status */ + UnmapViewOfFile(lpBaseAddress); return STATUS_INVALID_IMAGE_FORMAT; } - *hmod = (HMODULE)((char *)module + 1); /* set low bit of handle to indicate datafile module */ + + /* Set low bit of handle to indicate datafile module */ + *hModule = (HMODULE)((ULONG_PTR)lpBaseAddress | 1); + + /* Load alternate resource module */ + //LdrLoadAlternateResourceModule(*hModule, FilenameW); + return STATUS_SUCCESS; } - /* * @implemented */ HINSTANCE WINAPI -LoadLibraryExW ( - LPCWSTR lpLibFileName, - HANDLE hFile, - DWORD dwFlags - ) +LoadLibraryExW(LPCWSTR lpLibFileName, + HANDLE hFile, + DWORD dwFlags) { - UNICODE_STRING DllName; - HINSTANCE hInst; - NTSTATUS Status; - PWSTR SearchPath; + UNICODE_STRING DllName; + HINSTANCE hInst; + NTSTATUS Status; + PWSTR SearchPath; ULONG DllCharacteristics = 0; - BOOL FreeString = FALSE; - - (void)hFile; - - if ( lpLibFileName == NULL ) - return NULL; + BOOL FreeString = FALSE; /* Check for any flags LdrLoadDll might be interested in */ if (dwFlags & DONT_RESOLVE_DLL_REFERENCES) @@ -332,67 +383,101 @@ LoadLibraryExW ( DllCharacteristics = IMAGE_FILE_EXECUTABLE_IMAGE; } - dwFlags &= - DONT_RESOLVE_DLL_REFERENCES | - LOAD_LIBRARY_AS_DATAFILE | - LOAD_WITH_ALTERED_SEARCH_PATH; + /* Build up a unicode dll name from null-terminated string */ + RtlInitUnicodeString(&DllName, (LPWSTR)lpLibFileName); - SearchPath = GetDllLoadPath( - dwFlags & LOAD_WITH_ALTERED_SEARCH_PATH ? lpLibFileName : NULL); + /* Lazy-initialize BasepExeLdrEntry */ + if (!BasepExeLdrEntry) + LdrEnumerateLoadedModules(0, BasepLocateExeLdrEntry, NtCurrentPeb()->ImageBaseAddress); - RtlInitUnicodeString(&DllName, (LPWSTR)lpLibFileName); - - if (DllName.Buffer[DllName.Length/sizeof(WCHAR) - 1] == L' ') - { - RtlCreateUnicodeString(&DllName, (LPWSTR)lpLibFileName); - while (DllName.Length > sizeof(WCHAR) && - DllName.Buffer[DllName.Length/sizeof(WCHAR) - 1] == L' ') - { - DllName.Length -= sizeof(WCHAR); - } - DllName.Buffer[DllName.Length/sizeof(WCHAR)] = UNICODE_NULL; - FreeString = TRUE; - } - - if (dwFlags & LOAD_LIBRARY_AS_DATAFILE) + /* Check if that module is our exe*/ + if (BasepExeLdrEntry && !(dwFlags & LOAD_LIBRARY_AS_DATAFILE) && + DllName.Length == BasepExeLdrEntry->FullDllName.Length) { - Status = LdrGetDllHandle(SearchPath, NULL, &DllName, (PVOID*)&hInst); - if (!NT_SUCCESS(Status)) + /* Lengths match and it's not a datafile, so perform name comparison */ + if (RtlEqualUnicodeString(&DllName, &BasepExeLdrEntry->FullDllName, TRUE)) { - /* The method in load_library_as_datafile allows searching for the - * 'native' libraries only - */ - Status = LoadLibraryAsDatafile(SearchPath, DllName.Buffer, &hInst); - goto done; + /* That's us! */ + return BasepExeLdrEntry->DllBase; } } - /* HACK!!! FIXME */ - if (InWindows) + /* Check for trailing spaces and remove them if necessary */ + if (DllName.Buffer[DllName.Length/sizeof(WCHAR) - 1] == L' ') { - /* Call the API Properly */ - Status = LdrLoadDll(SearchPath, - &DllCharacteristics, - &DllName, - (PVOID*)&hInst); + RtlCreateUnicodeString(&DllName, (LPWSTR)lpLibFileName); + while (DllName.Length > sizeof(WCHAR) && + DllName.Buffer[DllName.Length/sizeof(WCHAR) - 1] == L' ') + { + DllName.Length -= sizeof(WCHAR); + } + DllName.Buffer[DllName.Length/sizeof(WCHAR)] = UNICODE_NULL; + FreeString = TRUE; } - else + + /* Compute the load path */ + SearchPath = BasepGetDllPath((dwFlags & LOAD_WITH_ALTERED_SEARCH_PATH) ? (LPWSTR)lpLibFileName : NULL, + NULL); + + if (!SearchPath) { - /* Call the ROS API. NOTE: Don't fix this, I have a patch to merge later. */ - Status = LdrLoadDll(SearchPath, &dwFlags, &DllName, (PVOID*)&hInst); + /* Getting DLL path failed, so set last error, free mem and return */ + BaseSetLastNTError(STATUS_NO_MEMORY); + if (FreeString) RtlFreeUnicodeString(&DllName); + return NULL; } + _SEH2_TRY + { + if (dwFlags & LOAD_LIBRARY_AS_DATAFILE) + { + /* If the image is loaded as a datafile, try to get its handle */ + Status = LdrGetDllHandle(SearchPath, NULL, &DllName, (PVOID*)&hInst); + if (!NT_SUCCESS(Status)) + { + /* It's not loaded yet - so load it up */ + Status = BasepLoadLibraryAsDatafile(SearchPath, DllName.Buffer, &hInst); + _SEH2_YIELD(goto done;) + } + } + + /* HACK!!! FIXME */ + if (InWindows) + { + /* Call the API Properly */ + Status = LdrLoadDll(SearchPath, + &DllCharacteristics, + &DllName, + (PVOID*)&hInst); + } + else + { + /* Call the ROS API. NOTE: Don't fix this, I have a patch to merge later. */ + Status = LdrLoadDll(SearchPath, &dwFlags, &DllName, (PVOID*)&hInst); + } + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + Status = _SEH2_GetExceptionCode(); + } _SEH2_END + + done: - RtlFreeHeap(RtlGetProcessHeap(), 0, SearchPath); - if (FreeString) - RtlFreeUnicodeString(&DllName); - if ( !NT_SUCCESS(Status)) - { - SetLastErrorByStatus (Status); - return NULL; - } + /* Free SearchPath buffer */ + RtlFreeHeap(RtlGetProcessHeap(), 0, SearchPath); - return hInst; + /* Free DllName string if it was dynamically allocated */ + if (FreeString) RtlFreeUnicodeString(&DllName); + + /* Set last error in failure case */ + if ( !NT_SUCCESS(Status)) + { + BaseSetLastNTError(Status); + return NULL; + } + + /* Return loaded module handle */ + return hInst; } From 07de2df4a2828dce87f2d4e0c44eb0cad042d857 Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Thu, 7 Apr 2011 21:31:21 +0000 Subject: [PATCH 093/317] [SNDVOL32] - Implement retrieving current volume level and mute state and set the dialog controls on startup - Remove last line separator from GUI - Implement updating slider / switch control when another application modifies volume settings - Implement writing current selected lines settings into registry when the preference dialog is closed - Implement helper functions which receive / set volume level - Sndvol32 is now fully functional and has been tested in Windows XP SP3 - TODO: implement support for setting volume balance (left - right slider) - TODO: Resources have not yet been commited svn path=/trunk/; revision=51274 --- reactos/base/applications/sndvol32/dialog.c | 192 ++++++++++- reactos/base/applications/sndvol32/misc.c | 100 +++++- reactos/base/applications/sndvol32/mixer.c | 52 ++- .../base/applications/sndvol32/resources.h | 5 +- reactos/base/applications/sndvol32/sndvol32.c | 322 +++++++++++++++++- reactos/base/applications/sndvol32/sndvol32.h | 30 +- 6 files changed, 668 insertions(+), 33 deletions(-) diff --git a/reactos/base/applications/sndvol32/dialog.c b/reactos/base/applications/sndvol32/dialog.c index 3cddcd043e2..63b3233b1bf 100644 --- a/reactos/base/applications/sndvol32/dialog.c +++ b/reactos/base/applications/sndvol32/dialog.c @@ -159,7 +159,11 @@ AddDialogControl( SendMessage(hwnd, TBM_SETPAGESIZE, 0, (LPARAM) 1); /* set available range */ - SendMessage(hwnd, TBM_SETSEL, (WPARAM) FALSE, (LPARAM) MAKELONG(0, 5)); + //SendMessage(hwnd, TBM_SETSEL, (WPARAM) FALSE, (LPARAM) MAKELONG(0, 5)); + + /* set position */ + SendMessage(hwnd, TBM_SETPOS, (WPARAM) TRUE, (LPARAM) 0); + } else if (!wcsicmp(ClassName, L"static") || !wcsicmp(ClassName, L"button")) { @@ -328,12 +332,15 @@ EnumConnectionsCallback( DWORD Flags; DWORD wID; RECT rect; + UINT ControlCount = 0, Index; + LPMIXERCONTROL Control = NULL; + HWND hDlgCtrl; PPREFERENCES_CONTEXT PrefContext = (PPREFERENCES_CONTEXT)Context; if (Line->cControls != 0) { /* get line name */ - if (SndMixerGetLineName(PrefContext->Mixer, PrefContext->SelectedLine, LineName, MIXER_LONG_NAME_CHARS, FALSE) == -1) + if (SndMixerGetLineName(PrefContext->MixerWindow->Mixer, PrefContext->SelectedLine, LineName, MIXER_LONG_NAME_CHARS, FALSE) == -1) { /* failed to get line name */ LineName[0] = L'\0'; @@ -357,6 +364,74 @@ EnumConnectionsCallback( /* set line name */ SetDlgItemTextW(PrefContext->MixerWindow->hWnd, wID, Line->szName); + /* query controls */ + if (SndMixerQueryControls(Mixer, &ControlCount, Line, &Control) == TRUE) + { + /* now go through all controls and update their states */ + for(Index = 0; Index < ControlCount; Index++) + { + if ((Control[Index].dwControlType & MIXERCONTROL_CT_CLASS_MASK) == MIXERCONTROL_CT_CLASS_SWITCH) + { + MIXERCONTROLDETAILS_BOOLEAN Details; + + /* get volume control details */ + if (SndMixerGetVolumeControlDetails(Mixer, Control[Index].dwControlID, sizeof(MIXERCONTROLDETAILS_BOOLEAN), (LPVOID)&Details) != -1) + { + /* update dialog control */ + wID = (PrefContext->Count + 1) * IDC_LINE_SWITCH; + + /* get dialog control */ + hDlgCtrl = GetDlgItem(PrefContext->MixerWindow->hWnd, wID); + + if (hDlgCtrl != NULL) + { + /* check state */ + if (SendMessageW(hDlgCtrl, BM_GETCHECK, 0, 0) != Details.fValue) + { + /* update control state */ + SendMessageW(hDlgCtrl, BM_SETCHECK, (WPARAM)Details.fValue, 0); + } + } + } + } + else if ((Control[Index].dwControlType & MIXERCONTROL_CT_CLASS_MASK) == MIXERCONTROL_CT_CLASS_FADER) + { + MIXERCONTROLDETAILS_UNSIGNED Details; + + /* get volume control details */ + if (SndMixerGetVolumeControlDetails(Mixer, Control[Index].dwControlID, sizeof(MIXERCONTROLDETAILS_UNSIGNED), (LPVOID)&Details) != -1) + { + /* update dialog control */ + DWORD Position; + DWORD Step = 0x10000 / 5; + + /* FIXME: give me granularity */ + Position = 5 - (Details.dwValue / Step); + + /* FIXME support left - right slider */ + wID = (PrefContext->Count + 1) * IDC_LINE_SLIDER_VERT; + + /* get dialog control */ + hDlgCtrl = GetDlgItem(PrefContext->MixerWindow->hWnd, wID); + + if (hDlgCtrl != NULL) + { + /* check state */ + LRESULT OldPosition = SendMessageW(hDlgCtrl, TBM_GETPOS, 0, 0); + if (OldPosition != Position) + { + /* update control state */ + SendMessageW(hDlgCtrl, TBM_SETPOS, (WPARAM)TRUE, Position + Index); + } + } + } + } + } + + /* free controls */ + HeapFree(GetProcessHeap(), 0, Control); + } + /* increment dialog count */ PrefContext->Count++; @@ -365,7 +440,6 @@ EnumConnectionsCallback( /* now move the window */ MoveWindow(PrefContext->MixerWindow->hWnd, rect.left, rect.top, (PrefContext->Count * DIALOG_VOLUME_SIZE), rect.bottom, TRUE); - } } } @@ -376,9 +450,117 @@ VOID LoadDialogCtrls( PPREFERENCES_CONTEXT PrefContext) { - /* set dialog count to one */ + HWND hDlgCtrl; + + /* set dialog count to zero */ PrefContext->Count = 0; /* enumerate controls */ - SndMixerEnumConnections(PrefContext->Mixer, PrefContext->SelectedLine, EnumConnectionsCallback, (PVOID)PrefContext); + SndMixerEnumConnections(PrefContext->MixerWindow->Mixer, PrefContext->SelectedLine, EnumConnectionsCallback, (PVOID)PrefContext); + + /* get last line seperator */ + hDlgCtrl = GetDlgItem(PrefContext->MixerWindow->hWnd, IDC_LINE_SEP * PrefContext->Count); + + if (hDlgCtrl != NULL) + { + /* hide last seperator */ + ShowWindow(hDlgCtrl, SW_HIDE); + } + } + +VOID +UpdateDialogLineSwitchControl( + PPREFERENCES_CONTEXT PrefContext, + LPMIXERLINE Line, + LONG fValue) +{ + DWORD Index; + DWORD wID; + HWND hDlgCtrl; + WCHAR LineName[MIXER_LONG_NAME_CHARS]; + + /* find the index of this line */ + for(Index = 0; Index < PrefContext->Count; Index++) + { + /* get id */ + wID = (Index + 1) * IDC_LINE_NAME; + + if (GetDlgItemText(PrefContext->MixerWindow->hWnd, wID, LineName, MIXER_LONG_NAME_CHARS) == 0) + { + /* failed to retrieve id */ + continue; + } + + /* check if the line name matches */ + if (!wcsicmp(LineName, Line->szName)) + { + /* found matching line name */ + wID = (Index + 1) * IDC_LINE_SWITCH; + + /* get dialog control */ + hDlgCtrl = GetDlgItem(PrefContext->MixerWindow->hWnd, wID); + + if (hDlgCtrl != NULL) + { + /* check state */ + if (SendMessageW(hDlgCtrl, BM_GETCHECK, 0, 0) != fValue) + { + /* update control state */ + SendMessageW(hDlgCtrl, BM_SETCHECK, (WPARAM)fValue, 0); + } + } + break; + } + } +} + +VOID +UpdateDialogLineSliderControl( + PPREFERENCES_CONTEXT PrefContext, + LPMIXERLINE Line, + DWORD dwControlID, + DWORD dwDialogID, + DWORD Position) +{ + DWORD Index; + DWORD wID; + HWND hDlgCtrl; + WCHAR LineName[MIXER_LONG_NAME_CHARS]; + + /* find the index of this line */ + for(Index = 0; Index < PrefContext->Count; Index++) + { + /* get id */ + wID = (Index + 1) * IDC_LINE_NAME; + + if (GetDlgItemText(PrefContext->MixerWindow->hWnd, wID, LineName, MIXER_LONG_NAME_CHARS) == 0) + { + /* failed to retrieve id */ + continue; + } + + /* check if the line name matches */ + if (!wcsicmp(LineName, Line->szName)) + { + /* found matching line name */ + wID = (Index + 1) * dwDialogID; + + /* get dialog control */ + hDlgCtrl = GetDlgItem(PrefContext->MixerWindow->hWnd, wID); + + if (hDlgCtrl != NULL) + { + /* check state */ + LRESULT OldPosition = SendMessageW(hDlgCtrl, TBM_GETPOS, 0, 0); + if (OldPosition != Position) + { + /* update control state */ + SendMessageW(hDlgCtrl, TBM_SETPOS, (WPARAM)TRUE, Position + Index); + } + } + break; + } + } +} + diff --git a/reactos/base/applications/sndvol32/misc.c b/reactos/base/applications/sndvol32/misc.c index 169e6114339..48c1d955f3b 100644 --- a/reactos/base/applications/sndvol32/misc.c +++ b/reactos/base/applications/sndvol32/misc.c @@ -126,13 +126,6 @@ LoadAndFormatString(IN HINSTANCE hInstance, return Ret; } -/* NOTE: do NOT modify SNDVOL_REG_LINESTATE for binary compatibility with XP! */ -typedef struct _SNDVOL_REG_LINESTATE -{ - DWORD Flags; - WCHAR LineName[MIXER_LONG_NAME_CHARS]; -} SNDVOL_REG_LINESTATE, *PSNDVOL_REG_LINESTATE; - static const TCHAR AppRegSettings[] = TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Applets\\Volume Control"); static const TCHAR AppOptionsKey[] = TEXT("Options"); static const TCHAR LineStatesValue[] = TEXT("LineStates"); @@ -162,6 +155,97 @@ CloseAppConfig(VOID) RegCloseKey(hAppSettingsKey); hAppSettingsKey = NULL; } +} + +BOOL +WriteLineConfig(IN LPTSTR szDeviceName, + IN LPTSTR szLineName, + IN LPTSTR szControlName, + IN DWORD Flags) +{ + HKEY hLineKey; + DWORD Type; + DWORD i, Size = 0; + PSNDVOL_REG_LINESTATE LineStates = NULL; + TCHAR szDevRegKey[MAX_PATH]; + BOOL Ret = FALSE; + + _stprintf(szDevRegKey, + TEXT("%s\\%s"), + szDeviceName, + szLineName); + + if (RegCreateKeyEx(hAppSettingsKey, + szDevRegKey, + 0, + NULL, + REG_OPTION_NON_VOLATILE, + KEY_READ | KEY_WRITE, + NULL, + &hLineKey, + NULL) == ERROR_SUCCESS) + { + if (RegQueryValueEx(hLineKey, + LineStatesValue, + NULL, + &Type, + NULL, + &Size) != ERROR_SUCCESS || + Type != REG_BINARY || + Size == 0 || (Size % sizeof(SNDVOL_REG_LINESTATE) != 0)) + { + goto ExitClose; + } + + LineStates = HeapAlloc(GetProcessHeap(), + HEAP_ZERO_MEMORY, + Size); + + if (LineStates != NULL) + { + if (RegQueryValueEx(hLineKey, + LineStatesValue, + NULL, + &Type, + (LPBYTE)LineStates, + &Size) != ERROR_SUCCESS || + Type != REG_BINARY || + Size == 0 || (Size % sizeof(SNDVOL_REG_LINESTATE) != 0)) + { + goto ExitClose; + } + + /* try to find the control */ + for (i = 0; i < Size / sizeof(SNDVOL_REG_LINESTATE); i++) + { + if (!_tcscmp(szControlName, + LineStates[i].LineName)) + { + LineStates[i].Flags = Flags; + Ret = TRUE; + break; + } + } + + /* now update line states */ + if (Ret) + { + RegSetValueEx(hLineKey, LineStatesValue, 0, REG_BINARY, (const BYTE*)LineStates, Size); + } + } + +ExitClose: + HeapFree(GetProcessHeap(), + 0, + LineStates); + RegCloseKey(hLineKey); + } + + return Ret; + + + + } BOOL @@ -205,7 +289,7 @@ ReadLineConfig(IN LPTSTR szDeviceName, } LineStates = HeapAlloc(GetProcessHeap(), - 0, + HEAP_ZERO_MEMORY, Size); if (LineStates != NULL) diff --git a/reactos/base/applications/sndvol32/mixer.c b/reactos/base/applications/sndvol32/mixer.c index d4e883ba2a9..0fbc172fcec 100644 --- a/reactos/base/applications/sndvol32/mixer.c +++ b/reactos/base/applications/sndvol32/mixer.c @@ -107,7 +107,7 @@ SndMixerClose(PSND_MIXER Mixer) } } -static BOOL +BOOL SndMixerQueryControls(PSND_MIXER Mixer, PUINT DisplayControls, LPMIXERLINE LineInfo, @@ -116,7 +116,7 @@ SndMixerQueryControls(PSND_MIXER Mixer, if (LineInfo->cControls > 0) { *Controls = (MIXERCONTROL*) HeapAlloc(GetProcessHeap(), - 0, + HEAP_ZERO_MEMORY, LineInfo->cControls * sizeof(MIXERCONTROL)); if (*Controls != NULL) { @@ -207,7 +207,7 @@ SndMixerQueryConnections(PSND_MIXER Mixer, } Con = (SND_MIXER_CONNECTION*) HeapAlloc(GetProcessHeap(), - 0, + HEAP_ZERO_MEMORY, sizeof(SND_MIXER_CONNECTION)); if (Con != NULL) { @@ -469,6 +469,52 @@ SndMixerEnumProducts(PSND_MIXER Mixer, return Ret; } +INT +SndMixerSetVolumeControlDetails(PSND_MIXER Mixer, DWORD dwControlID, DWORD cbDetails, LPVOID paDetails) +{ + MIXERCONTROLDETAILS MixerDetails; + + if (Mixer->hmx) + { + MixerDetails.cbStruct = sizeof(MIXERCONTROLDETAILS); + MixerDetails.dwControlID = dwControlID; + MixerDetails.cChannels = 1; //FIXME + MixerDetails.cMultipleItems = 0; + MixerDetails.cbDetails = cbDetails; + MixerDetails.paDetails = paDetails; + + if (mixerSetControlDetails((HMIXEROBJ)Mixer->hmx, &MixerDetails, MIXER_GETCONTROLDETAILSF_VALUE | MIXER_OBJECTF_HMIXER) == MMSYSERR_NOERROR) + { + return 1; + } + } + + return -1; +} + + +INT +SndMixerGetVolumeControlDetails(PSND_MIXER Mixer, DWORD dwControlID, DWORD cbDetails, LPVOID paDetails) +{ + MIXERCONTROLDETAILS MixerDetails; + + if (Mixer->hmx) + { + MixerDetails.cbStruct = sizeof(MIXERCONTROLDETAILS); + MixerDetails.dwControlID = dwControlID; + MixerDetails.cChannels = 1; //FIXME + MixerDetails.cMultipleItems = 0; + MixerDetails.cbDetails = cbDetails; + MixerDetails.paDetails = paDetails; + + if (mixerGetControlDetails((HMIXEROBJ)Mixer->hmx, &MixerDetails, MIXER_GETCONTROLDETAILSF_VALUE | MIXER_OBJECTF_HMIXER) == MMSYSERR_NOERROR) + { + return 1; + } + } + return -1; +} + INT SndMixerGetDestinationCount(PSND_MIXER Mixer) { diff --git a/reactos/base/applications/sndvol32/resources.h b/reactos/base/applications/sndvol32/resources.h index 2fa18a50a66..737f1794dd8 100644 --- a/reactos/base/applications/sndvol32/resources.h +++ b/reactos/base/applications/sndvol32/resources.h @@ -19,10 +19,13 @@ #define IDC_LABELCONTROLS 1006 #define IDC_CONTROLS 1007 #define IDC_LINE_NAME 1008 +#define IDC_LINE_SWITCH 1009 +#define IDC_LINE_SLIDER_HORZ 1010 +#define IDC_LINE_SLIDER_VERT 1011 +#define IDC_LINE_SEP 1012 #define IDS_SNDVOL32 100 #define IDS_NOMIXERDEVICES 101 - #define IDD_VOLUME_CTRL 200 #define IDD_PREFERENCES 201 diff --git a/reactos/base/applications/sndvol32/sndvol32.c b/reactos/base/applications/sndvol32/sndvol32.c index 6c8ad7c55c1..df69bb9cf0a 100644 --- a/reactos/base/applications/sndvol32/sndvol32.c +++ b/reactos/base/applications/sndvol32/sndvol32.c @@ -338,6 +338,53 @@ UpdatePrefDlgControls(PPREFERENCES_CONTEXT Context, } } +static +VOID +WriteLineSettings(PREFERENCES_CONTEXT Context, HWND hwndDlg) +{ + HWND hwndControls; + INT Count, Index; + WCHAR LineName[MIXER_LONG_NAME_CHARS]; + WCHAR DestinationName[MIXER_LONG_NAME_CHARS]; + DWORD Flags; + + /* get list view */ + hwndControls = GetDlgItem(hwndDlg, IDC_CONTROLS); + + /* get list item count */ + Count = ListView_GetItemCount(hwndControls); + + /* sanity check */ + assert(Count); + + if (SndMixerGetLineName(Preferences.MixerWindow->Mixer, Preferences.SelectedLine, DestinationName, MIXER_LONG_NAME_CHARS, TRUE) == -1) + { + /* failed to get destination line name */ + return; + } + + /* allocate line states array */ + for(Index = 0; Index < Count; Index++) + { + /* set to empty */ + LineName[0] = L'\0'; + + /* get item text */ + ListView_GetItemText(hwndControls, Index, 0, LineName, MIXER_LONG_NAME_CHARS); + + /* make sure it is null terminated */ + LineName[MIXER_LONG_NAME_CHARS-1] = L'\0'; + + /* get check state */ + Flags = (ListView_GetCheckState(hwndControls, Index) == 0 ? 0x4 : 0); + + /* write configuration */ + WriteLineConfig(Preferences.DeviceName, DestinationName, LineName, Flags); + } + + +} + static INT_PTR CALLBACK DlgPreferencesProc(HWND hwndDlg, UINT uMsg, @@ -444,6 +491,12 @@ DlgPreferencesProc(HWND hwndDlg, } case IDOK: + { + /* write line settings */ + WriteLineSettings(Preferences, hwndDlg); + + /* fall through */ + } case IDCANCEL: { EndDialog(hwndDlg, @@ -454,18 +507,6 @@ DlgPreferencesProc(HWND hwndDlg, break; } - case MM_MIXM_LINE_CHANGE: - { - DPRINT("MM_MIXM_LINE_CHANGE\n"); - break; - } - - case MM_MIXM_CONTROL_CHANGE: - { - DPRINT("MM_MIXM_CONTROL_CHANGE\n"); - break; - } - case WM_INITDIALOG: { PREFERENCES_FILL_DEVICES FillDevContext; @@ -567,6 +608,149 @@ RebuildMixerWindowControls(PPREFERENCES_CONTEXT PrefContext) return TRUE; } +static +BOOL +CALLBACK +SetVolumeCallback(PSND_MIXER Mixer, DWORD LineID, LPMIXERLINE Line, PVOID Ctx) +{ + UINT ControlCount = 0, Index; + LPMIXERCONTROL Control = NULL; + MIXERCONTROLDETAILS_UNSIGNED uDetails; + MIXERCONTROLDETAILS_BOOLEAN bDetails; + PSET_VOLUME_CONTEXT Context = (PSET_VOLUME_CONTEXT)Ctx; + + /* check if the line name is equal */ + if (wcsicmp(Line->szName, Context->LineName)) + { + /* it is not */ + return TRUE; + } + + /* query controls */ + if (SndMixerQueryControls(Mixer, &ControlCount, Line, &Control) == FALSE) + { + /* failed to query for controls */ + return FALSE; + } + + /* now go through all controls and compare control ids */ + for(Index = 0; Index < ControlCount; Index++) + { + if (Context->bVertical) + { + if ((Control[Index].dwControlType & MIXERCONTROL_CT_CLASS_MASK) == MIXERCONTROL_CT_CLASS_FADER) + { + /* FIXME: give me granularity */ + DWORD Step = 0x10000 / 5; + + /* set up details */ + uDetails.dwValue = 0x10000 - Step * Context->SliderPos; + + /* set volume */ + SndMixerSetVolumeControlDetails(Preferences.MixerWindow->Mixer, Control[Index].dwControlID, sizeof(MIXERCONTROLDETAILS_UNSIGNED), (LPVOID)&uDetails); + + /* done */ + break; + } + } + else if (Context->bSwitch) + { + if ((Control[Index].dwControlType & MIXERCONTROL_CT_CLASS_MASK) == MIXERCONTROL_CT_CLASS_SWITCH) + { + /* set up details */ + bDetails.fValue = Context->SliderPos; + + /* set volume */ + SndMixerSetVolumeControlDetails(Preferences.MixerWindow->Mixer, Control[Index].dwControlID, sizeof(MIXERCONTROLDETAILS_BOOLEAN), (LPVOID)&bDetails); + + /* done */ + break; + } + } + else + { + /* FIXME: implement left - right channel switch support */ + assert(0); + } + } + + /* free controls */ + HeapFree(GetProcessHeap(), 0, Control); + + + /* done */ + return TRUE; +} + +static +BOOL +CALLBACK +MixerControlChangeCallback(PSND_MIXER Mixer, DWORD LineID, LPMIXERLINE Line, PVOID Context) +{ + UINT ControlCount = 0, Index; + LPMIXERCONTROL Control = NULL; + + /* check if the line has controls */ + if (Line->cControls == 0) + { + /* no controls */ + return TRUE; + } + + /* query controls */ + if (SndMixerQueryControls(Mixer, &ControlCount, Line, &Control) == FALSE) + { + /* failed to query for controls */ + return FALSE; + } + + /* now go through all controls and compare control ids */ + for(Index = 0; Index < ControlCount; Index++) + { + if (Control[Index].dwControlID == PtrToUlong(Context)) + { + if ((Control[Index].dwControlType & MIXERCONTROL_CT_CLASS_MASK) == MIXERCONTROL_CT_CLASS_SWITCH) + { + MIXERCONTROLDETAILS_BOOLEAN Details; + + /* get volume control details */ + if (SndMixerGetVolumeControlDetails(Preferences.MixerWindow->Mixer, Control[Index].dwControlID, sizeof(MIXERCONTROLDETAILS_BOOLEAN), (LPVOID)&Details) != -1) + { + /* update dialog control */ + UpdateDialogLineSwitchControl(&Preferences, Line, Details.fValue); + } + } + else if ((Control[Index].dwControlType & MIXERCONTROL_CT_CLASS_MASK) == MIXERCONTROL_CT_CLASS_FADER) + { + MIXERCONTROLDETAILS_UNSIGNED Details; + + /* get volume control details */ + if (SndMixerGetVolumeControlDetails(Preferences.MixerWindow->Mixer, Control[Index].dwControlID, sizeof(MIXERCONTROLDETAILS_UNSIGNED), (LPVOID)&Details) != -1) + { + /* update dialog control */ + DWORD Position; + DWORD Step = 0x10000 / 5; + + /* FIXME: give me granularity */ + Position = 5 - (Details.dwValue / Step); + + /* update volume control slider */ + UpdateDialogLineSliderControl(&Preferences, Line, Control[Index].dwControlID, IDC_LINE_SLIDER_VERT, Position); + } + } + break; + } + } + + /* free controls */ + HeapFree(GetProcessHeap(), 0, Control); + + + /* done */ + return TRUE; +} + + static LRESULT CALLBACK MainWindowProc(HWND hwnd, UINT uMsg, @@ -574,7 +758,9 @@ MainWindowProc(HWND hwnd, LPARAM lParam) { PMIXER_WINDOW MixerWindow; + DWORD CtrlID, LineOffset; LRESULT Result = 0; + SET_VOLUME_CONTEXT Context; switch (uMsg) { @@ -598,7 +784,46 @@ MainWindowProc(HWND hwnd, DlgPreferencesProc, (LPARAM)&Preferences) == IDOK) { - /* FIXME - update window */ + /* update window */ + TCHAR szProduct[MAXPNAMELEN]; + + /* get mixer product name */ + if (SndMixerGetProductName(MixerWindow->Mixer, + szProduct, + sizeof(szProduct) / sizeof(szProduct[0])) == -1) + { + /* failed to get name */ + szProduct[0] = L'\0'; + } + else + { + /* copy product */ + wcscpy(Preferences.DeviceName, szProduct); + } + + /* destroy old status bar */ + DestroyWindow(MixerWindow->hStatusBar); + + /* rebuild dialog controls */ + if (RebuildMixerWindowControls(&Preferences)) + { + DPRINT("Rebuilding mixer window controls failed!\n"); + } + + /* create status window */ + MixerWindow->hStatusBar = CreateStatusWindow(WS_VISIBLE | WS_CHILD | WS_CLIPSIBLINGS, + NULL, + hwnd, + 0); + + /* set status bar */ + if (MixerWindow->hStatusBar) + { + SendMessage(MixerWindow->hStatusBar, + WM_SETTEXT, + 0, + (LPARAM)szProduct); + } } break; } @@ -619,6 +844,35 @@ MainWindowProc(HWND hwnd, hAppIcon); break; } + + default: + { + /* get button id */ + CtrlID = LOWORD(wParam); + + /* check if the message is from the line switch */ + if (HIWORD(wParam) == BN_CLICKED && (CtrlID % IDC_LINE_SWITCH == 0)) + { + /* compute line offset */ + LineOffset = CtrlID / IDC_LINE_SWITCH; + + /* compute window id of line name static control */ + CtrlID = LineOffset * IDC_LINE_NAME; + + /* get line name */ + if (GetDlgItemTextW(hwnd, CtrlID, Context.LineName, MIXER_LONG_NAME_CHARS) != 0) + { + /* setup context */ + Context.SliderPos = SendMessage((HWND)lParam, BM_GETCHECK, 0, 0); + Context.bVertical = FALSE; + Context.bSwitch = TRUE; + + /* set volume */ + SndMixerEnumConnections(Preferences.MixerWindow->Mixer, Preferences.SelectedLine, SetVolumeCallback, (LPVOID)&Context); + } + } + } + } break; } @@ -632,9 +886,49 @@ MainWindowProc(HWND hwnd, case MM_MIXM_CONTROL_CHANGE: { DPRINT("MM_MIXM_CONTROL_CHANGE\n"); + + /* get mixer window */ + MixerWindow = GetWindowData(hwnd, + MIXER_WINDOW); + + /* sanity checks */ + assert(MixerWindow); + assert(MixerWindow->Mixer->hmx == (HMIXER)wParam); + + SndMixerEnumConnections(MixerWindow->Mixer, Preferences.SelectedLine, MixerControlChangeCallback, (PVOID)lParam); break; } + case WM_VSCROLL: + { + if (LOWORD(wParam) == TB_THUMBTRACK) + { + /* get dialog item ctrl */ + CtrlID = GetDlgCtrlID((HWND)lParam); + + /* get line index */ + LineOffset = CtrlID / IDC_LINE_SLIDER_VERT; + + /* compute window id of line name static control */ + CtrlID = LineOffset * IDC_LINE_NAME; + + /* get line name */ + if (GetDlgItemTextW(hwnd, CtrlID, Context.LineName, MIXER_LONG_NAME_CHARS) != 0) + { + /* setup context */ + Context.SliderPos = HIWORD(wParam); + Context.bVertical = TRUE; + Context.bSwitch = FALSE; + + /* set volume */ + SndMixerEnumConnections(Preferences.MixerWindow->Mixer, Preferences.SelectedLine, SetVolumeCallback, (LPVOID)&Context); + } + } + + break; + } + + case WM_CREATE: { MixerWindow = ((LPCREATESTRUCT)lParam)->lpCreateParams; @@ -775,7 +1069,7 @@ CreateApplicationWindow(VOID) hWnd = CreateWindowEx(WS_EX_WINDOWEDGE | WS_EX_CONTROLPARENT, SZ_APP_CLASS, lpAppTitle, - WS_OVERLAPPEDWINDOW | WS_VISIBLE, //WS_DLGFRAME | WS_CAPTION | WS_MINIMIZEBOX | WS_SYSMENU | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | WS_VISIBLE, + WS_DLGFRAME | WS_CAPTION | WS_MINIMIZEBOX | WS_SYSMENU | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | WS_VISIBLE, 0, 0, 300, 315, NULL, LoadMenu(hAppInstance, diff --git a/reactos/base/applications/sndvol32/sndvol32.h b/reactos/base/applications/sndvol32/sndvol32.h index 9cbae1ccbf8..520ff7d59ff 100644 --- a/reactos/base/applications/sndvol32/sndvol32.h +++ b/reactos/base/applications/sndvol32/sndvol32.h @@ -84,6 +84,22 @@ typedef struct _PREFERENCES_CONTEXT DWORD tmp; } PREFERENCES_CONTEXT, *PPREFERENCES_CONTEXT; +typedef struct +{ + WCHAR LineName[MIXER_LONG_NAME_CHARS]; + UINT SliderPos; + BOOL bVertical; + BOOL bSwitch; + +}SET_VOLUME_CONTEXT, *PSET_VOLUME_CONTEXT; + +/* NOTE: do NOT modify SNDVOL_REG_LINESTATE for binary compatibility with XP! */ +typedef struct _SNDVOL_REG_LINESTATE +{ + DWORD Flags; + WCHAR LineName[MIXER_LONG_NAME_CHARS]; +} SNDVOL_REG_LINESTATE, *PSNDVOL_REG_LINESTATE; + typedef BOOL (CALLBACK *PFNSNDMIXENUMLINES)(PSND_MIXER Mixer, LPMIXERLINE Line, UINT DisplayControls, PVOID Context); typedef BOOL (CALLBACK *PFNSNDMIXENUMCONNECTIONS)(PSND_MIXER Mixer, DWORD LineID, LPMIXERLINE Line, PVOID Context); @@ -94,6 +110,8 @@ VOID SndMixerDestroy(PSND_MIXER Mixer); VOID SndMixerClose(PSND_MIXER Mixer); BOOL SndMixerSelect(PSND_MIXER Mixer, UINT MixerId); UINT SndMixerGetSelection(PSND_MIXER Mixer); +INT SndMixerSetVolumeControlDetails(PSND_MIXER Mixer, DWORD dwControlID, DWORD cbDetails, LPVOID paDetails); +INT SndMixerGetVolumeControlDetails(PSND_MIXER Mixer, DWORD dwControlID, DWORD cbDetails, LPVOID paDetails); INT SndMixerGetProductName(PSND_MIXER Mixer, LPTSTR lpBuffer, UINT uSize); INT SndMixerGetLineName(PSND_MIXER Mixer, DWORD LineID, LPTSTR lpBuffer, UINT uSize, BOOL LongName); BOOL SndMixerEnumProducts(PSND_MIXER Mixer, PFNSNDMIXENUMPRODUCTS EnumProc, PVOID Context); @@ -101,12 +119,14 @@ INT SndMixerGetDestinationCount(PSND_MIXER Mixer); BOOL SndMixerEnumLines(PSND_MIXER Mixer, PFNSNDMIXENUMLINES EnumProc, PVOID Context); BOOL SndMixerEnumConnections(PSND_MIXER Mixer, DWORD LineID, PFNSNDMIXENUMCONNECTIONS EnumProc, PVOID Context); BOOL SndMixerIsDisplayControl(PSND_MIXER Mixer, LPMIXERCONTROL Control); +BOOL SndMixerQueryControls(PSND_MIXER Mixer, PUINT DisplayControls, LPMIXERLINE LineInfo, LPMIXERCONTROL *Controls); /* * dialog.c */ -VOID -LoadDialogCtrls(PPREFERENCES_CONTEXT PrefContext); +VOID LoadDialogCtrls(PPREFERENCES_CONTEXT PrefContext); +VOID UpdateDialogLineSliderControl(PPREFERENCES_CONTEXT PrefContext, LPMIXERLINE Line, DWORD dwControlID, DWORD DialogID, DWORD Position); +VOID UpdateDialogLineSwitchControl(PPREFERENCES_CONTEXT PrefContext, LPMIXERLINE Line, LONG fValue); /* * MISC @@ -137,4 +157,10 @@ ReadLineConfig(IN LPTSTR szDeviceName, IN LPTSTR szControlName, OUT DWORD *Flags); +BOOL +WriteLineConfig(IN LPTSTR szDeviceName, + IN LPTSTR szLineName, + IN LPTSTR szControlName, + IN DWORD Flags); + #endif /* __SNDVOL32_H */ From 0a6bb0f70d386493ec13c71d600ad1b5d64f5f91 Mon Sep 17 00:00:00 2001 From: Michael Martin Date: Thu, 7 Apr 2011 23:57:00 +0000 Subject: [PATCH 094/317] [Win32k] - co_IntSendMessageWithCallBack: Insert the message into the messagequeue before attempting to wake the queue. Probably fixes bug 5580. - Remove the use of MSQ_SENTNOWAIT that was used to determine if messagequeues needed dereferencing. Instead use the SenderQueue member of the message. - Do not close the NewMessagesHandle member of the messagequeue in IntDereferenceMessageQueue. The last reference on a messagequeue could be released by a thread belonging to a process other than the on that created the handle. Also the creating process could already be long gone. Instead close this handle in MsqDestroyMessageQueue which is in the thread/process that created the handle. Problem noticed by smiley. - Revert change done in 51254. James you are indeed correct. Testing shows that the WM_PARENTNOTIFY message is not sent when the program is exiting. svn path=/trunk/; revision=51275 --- .../win32/win32k/include/msgqueue.h | 3 -- .../subsystems/win32/win32k/ntuser/message.c | 6 ++-- .../subsystems/win32/win32k/ntuser/msgqueue.c | 30 ++++++++++--------- .../subsystems/win32/win32k/ntuser/window.c | 9 +++--- 4 files changed, 23 insertions(+), 25 deletions(-) diff --git a/reactos/subsystems/win32/win32k/include/msgqueue.h b/reactos/subsystems/win32/win32k/include/msgqueue.h index 5af589ee0a8..1f412f56945 100644 --- a/reactos/subsystems/win32/win32k/include/msgqueue.h +++ b/reactos/subsystems/win32/win32k/include/msgqueue.h @@ -6,7 +6,6 @@ #define MSQ_NORMAL 0 #define MSQ_ISHOOK 1 #define MSQ_ISEVENT 2 -#define MSQ_SENTNOWAIT 0x80000000 #define QSIDCOUNTS 6 @@ -277,8 +276,6 @@ VOID APIENTRY MsqRemoveWindowMessagesFromQueue(PVOID pWindow); /* F*(&$ headers, DPRINT("Free message queue 0x%x\n", (MsgQueue)); \ if ((MsgQueue)->NewMessages != NULL) \ ObDereferenceObject((MsgQueue)->NewMessages); \ - if ((MsgQueue)->NewMessagesHandle != NULL) \ - ZwClose((MsgQueue)->NewMessagesHandle); \ ExFreePoolWithTag((MsgQueue), USERTAG_Q); \ } \ } while(0) diff --git a/reactos/subsystems/win32/win32k/ntuser/message.c b/reactos/subsystems/win32/win32k/ntuser/message.c index 31fc6ac7d7c..f2f5dae891d 100644 --- a/reactos/subsystems/win32/win32k/ntuser/message.c +++ b/reactos/subsystems/win32/win32k/ntuser/message.c @@ -1483,13 +1483,13 @@ co_IntSendMessageWithCallBack( HWND hWnd, IntReferenceMessageQueue(Window->head.pti->MessageQueue); Message->CompletionCallback = CompletionCallback; Message->CompletionCallbackContext = CompletionCallbackContext; - Message->HookMessage = MSQ_NORMAL | MSQ_SENTNOWAIT; + Message->HookMessage = MSQ_NORMAL; Message->HasPackedLParam = (lParamBufferSize > 0); - Message->QS_Flags = QS_SENDMESSAGE; - MsqWakeQueue(Window->head.pti->MessageQueue, QS_SENDMESSAGE, FALSE); InsertTailList(&Window->head.pti->MessageQueue->SentMessagesListHead, &Message->ListEntry); + MsqWakeQueue(Window->head.pti->MessageQueue, QS_SENDMESSAGE, TRUE); + IntDereferenceMessageQueue(Window->head.pti->MessageQueue); RETURN(TRUE); diff --git a/reactos/subsystems/win32/win32k/ntuser/msgqueue.c b/reactos/subsystems/win32/win32k/ntuser/msgqueue.c index 6af6000137c..16cd57889cd 100644 --- a/reactos/subsystems/win32/win32k/ntuser/msgqueue.c +++ b/reactos/subsystems/win32/win32k/ntuser/msgqueue.c @@ -479,7 +479,7 @@ co_MsqDispatchOneSentMessage(PUSER_MESSAGE_QUEUE MessageQueue) RemoveEntryList(&Message->ListEntry); /* remove the message from the dispatching list if needed, so lock the sender's message queue */ - if (!(Message->HookMessage & MSQ_SENTNOWAIT)) + if (Message->SenderQueue) { if (Message->DispatchingListEntry.Flink != NULL) { @@ -523,8 +523,8 @@ co_MsqDispatchOneSentMessage(PUSER_MESSAGE_QUEUE MessageQueue) Result); } - /* Only if it is not a no wait message */ - if (!(Message->HookMessage & MSQ_SENTNOWAIT)) + /* Only if the message has a sender was the queue referenced */ + if (Message->SenderQueue) { IntDereferenceMessageQueue(Message->SenderQueue); IntDereferenceMessageQueue(MessageQueue); @@ -588,8 +588,8 @@ MsqRemoveWindowMessagesFromQueue(PVOID pWindow) RemoveEntryList(&SentMessage->ListEntry); ClearMsgBitsMask(MessageQueue, SentMessage->QS_Flags); - /* remove the message from the dispatching list if neede */ - if ((!(SentMessage->HookMessage & MSQ_SENTNOWAIT)) + /* Only if the message has a sender was the queue referenced */ + if ((SentMessage->SenderQueue) && (SentMessage->DispatchingListEntry.Flink != NULL)) { RemoveEntryList(&SentMessage->DispatchingListEntry); @@ -607,8 +607,8 @@ MsqRemoveWindowMessagesFromQueue(PVOID pWindow) ExFreePool((PVOID)SentMessage->Msg.lParam); } - /* Only if it is not a no wait message */ - if (!(SentMessage->HookMessage & MSQ_SENTNOWAIT)) + /* Only if the message has a sender was the queue referenced */ + if (SentMessage->SenderQueue) { /* dereference our and the sender's message queue */ IntDereferenceMessageQueue(MessageQueue); @@ -1451,9 +1451,8 @@ MsqCleanupMessageQueue(PUSER_MESSAGE_QUEUE MessageQueue) ListEntry); DPRINT("Notify the sender and remove a message from the queue that had not been dispatched\n"); - - /* remove the message from the dispatching list if needed */ - if ((!(CurrentSentMessage->HookMessage & MSQ_SENTNOWAIT)) + /* Only if the message has a sender was the queue referenced */ + if ((CurrentSentMessage->SenderQueue) && (CurrentSentMessage->DispatchingListEntry.Flink != NULL)) { RemoveEntryList(&CurrentSentMessage->DispatchingListEntry); @@ -1471,8 +1470,8 @@ MsqCleanupMessageQueue(PUSER_MESSAGE_QUEUE MessageQueue) ExFreePool((PVOID)CurrentSentMessage->Msg.lParam); } - /* Only if it is not a no wait message */ - if (!(CurrentSentMessage->HookMessage & MSQ_SENTNOWAIT)) + /* Only if the message has a sender was the queue referenced */ + if (CurrentSentMessage->SenderQueue) { /* dereference our and the sender's message queue */ IntDereferenceMessageQueue(MessageQueue); @@ -1511,8 +1510,8 @@ MsqCleanupMessageQueue(PUSER_MESSAGE_QUEUE MessageQueue) ExFreePool((PVOID)CurrentSentMessage->Msg.lParam); } - /* Only if it is not a no wait message */ - if (!(CurrentSentMessage->HookMessage & MSQ_SENTNOWAIT)) + /* Only if the message has a sender was the queue referenced */ + if (CurrentSentMessage->SenderQueue) { /* dereference our and the sender's message queue */ IntDereferenceMessageQueue(MessageQueue); @@ -1592,6 +1591,9 @@ MsqDestroyMessageQueue(PUSER_MESSAGE_QUEUE MessageQueue) /* clean it up */ MsqCleanupMessageQueue(MessageQueue); + if (MessageQueue->NewMessagesHandle != NULL) + ZwClose(MessageQueue->NewMessagesHandle); + MessageQueue->NewMessagesHandle = NULL; /* decrease the reference counter, if it hits zero, the queue will be freed */ IntDereferenceMessageQueue(MessageQueue); } diff --git a/reactos/subsystems/win32/win32k/ntuser/window.c b/reactos/subsystems/win32/win32k/ntuser/window.c index f07a5455517..e94d19cf5b9 100644 --- a/reactos/subsystems/win32/win32k/ntuser/window.c +++ b/reactos/subsystems/win32/win32k/ntuser/window.c @@ -1531,11 +1531,10 @@ static void IntSendParentNotify( PWND pWindow, UINT msg ) { USER_REFERENCE_ENTRY Ref; UserRefObjectCo(pWindow->spwndParent, &Ref); - // Should be co_IntSendMessage please retest, Ref to Chg, revision 51254... - co_IntSendMessageNoWait( pWindow->spwndParent->head.h, - WM_PARENTNOTIFY, - MAKEWPARAM( msg, pWindow->IDMenu), - (LPARAM)pWindow->head.h ); + co_IntSendMessage( pWindow->spwndParent->head.h, + WM_PARENTNOTIFY, + MAKEWPARAM( msg, pWindow->IDMenu), + (LPARAM)pWindow->head.h ); UserDerefObjectCo(pWindow->spwndParent); } } From ef01012506c40826086f529db00e96f44ac63c85 Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Fri, 8 Apr 2011 08:35:48 +0000 Subject: [PATCH 095/317] [KMTEST] - Thomas Faber: Reset test results before starting a new FsRtl test. See issue #6083 for more details. svn path=/trunk/; revision=51276 --- rostests/drivers/kmtest/ntos_fsrtl.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/rostests/drivers/kmtest/ntos_fsrtl.c b/rostests/drivers/kmtest/ntos_fsrtl.c index f94b2529160..5eef05afdd7 100644 --- a/rostests/drivers/kmtest/ntos_fsrtl.c +++ b/rostests/drivers/kmtest/ntos_fsrtl.c @@ -334,6 +334,8 @@ VOID FsRtlIsDbcsInExpressionTest() VOID NtoskrnlFsRtlTest(HANDLE KeyHandle) { + StartTest(); + FsRtlIsNameInExpressionTest(); FsRtlIsDbcsInExpressionTest(); From a3690ead558d52fa602a18d1a8f11f817e148064 Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Fri, 8 Apr 2011 09:21:41 +0000 Subject: [PATCH 096/317] [KERNEL32] - Zero-initialize base address in BasepLoadLibraryAsDatafile. Should fix 2nd stage problems. - Add a trace debugprint, silented by default. See issue #6092 for more details. svn path=/trunk/; revision=51277 --- reactos/dll/win32/kernel32/misc/ldr.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/reactos/dll/win32/kernel32/misc/ldr.c b/reactos/dll/win32/kernel32/misc/ldr.c index 62e02fb696a..03c3ed1053d 100644 --- a/reactos/dll/win32/kernel32/misc/ldr.c +++ b/reactos/dll/win32/kernel32/misc/ldr.c @@ -274,7 +274,7 @@ BasepLoadLibraryAsDatafile(PWSTR Path, LPCWSTR Name, HMODULE *hModule) HANDLE hFile = INVALID_HANDLE_VALUE; HANDLE hMapping; NTSTATUS Status; - PVOID lpBaseAddress; + PVOID lpBaseAddress = NULL; SIZE_T ViewSize; //PUNICODE_STRING OriginalName; //UNICODE_STRING dotDLL = RTL_CONSTANT_STRING(L".DLL"); @@ -282,6 +282,8 @@ BasepLoadLibraryAsDatafile(PWSTR Path, LPCWSTR Name, HMODULE *hModule) /* Zero out handle value */ *hModule = 0; + DPRINT("BasepLoadLibraryAsDatafile(%S %S %p)\n", Path, Name, hModule); + /*Status = RtlDosApplyFileIsolationRedirection_Ustr(TRUE, Name, &dotDLL, @@ -470,7 +472,7 @@ done: if (FreeString) RtlFreeUnicodeString(&DllName); /* Set last error in failure case */ - if ( !NT_SUCCESS(Status)) + if (!NT_SUCCESS(Status)) { BaseSetLastNTError(Status); return NULL; From b63bf768a6fd5c4c5ed9fd6f5562a21e86491444 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Fri, 8 Apr 2011 12:30:33 +0000 Subject: [PATCH 097/317] [NTOSKRNL] ExInitializePushLock takes a PEX_PUSH_LOCK as parameter, do it the same in the inline version instead of casting to PULONG_PTR everywhere svn path=/trunk/; revision=51278 --- reactos/ntoskrnl/cc/view.c | 2 +- reactos/ntoskrnl/config/cminit.c | 6 +++--- reactos/ntoskrnl/config/cmkcbncb.c | 12 ++++++------ reactos/ntoskrnl/config/cmsysini.c | 6 +++--- reactos/ntoskrnl/ex/handle.c | 6 +++--- reactos/ntoskrnl/include/internal/ex.h | 4 ++-- reactos/ntoskrnl/mm/ARM3/mminit.c | 2 +- reactos/ntoskrnl/ob/obdir.c | 2 +- reactos/ntoskrnl/ob/obsdcach.c | 4 ++-- 9 files changed, 22 insertions(+), 22 deletions(-) diff --git a/reactos/ntoskrnl/cc/view.c b/reactos/ntoskrnl/cc/view.c index a17e2c942fe..e881188071f 100644 --- a/reactos/ntoskrnl/cc/view.c +++ b/reactos/ntoskrnl/cc/view.c @@ -596,7 +596,7 @@ CcRosCreateCacheSegment(PBCB Bcb, current->DirtySegmentListEntry.Flink = NULL; current->DirtySegmentListEntry.Blink = NULL; current->ReferenceCount = 1; - ExInitializePushLock((PULONG_PTR)¤t->Lock); + ExInitializePushLock(¤t->Lock); ExAcquirePushLockExclusive(¤t->Lock); KeAcquireGuardedMutex(&ViewLock); diff --git a/reactos/ntoskrnl/config/cminit.c b/reactos/ntoskrnl/config/cminit.c index be7efc1660f..6d85ef7d905 100644 --- a/reactos/ntoskrnl/config/cminit.c +++ b/reactos/ntoskrnl/config/cminit.c @@ -137,11 +137,11 @@ CmpInitializeHive(OUT PCMHIVE *RegistryHive, ExInitializeResourceLite(Hive->FlusherLock); /* Setup hive locks */ - ExInitializePushLock((PULONG_PTR)&Hive->HiveLock); + ExInitializePushLock(&Hive->HiveLock); Hive->HiveLockOwner = NULL; - ExInitializePushLock((PULONG_PTR)&Hive->WriterLock); + ExInitializePushLock(&Hive->WriterLock); Hive->WriterLockOwner = NULL; - ExInitializePushLock((PULONG_PTR)&Hive->SecurityLock); + ExInitializePushLock(&Hive->SecurityLock); Hive->HiveSecurityLockOwner = NULL; /* Clear file names */ diff --git a/reactos/ntoskrnl/config/cmkcbncb.c b/reactos/ntoskrnl/config/cmkcbncb.c index 1c093403c48..8fb6afba111 100644 --- a/reactos/ntoskrnl/config/cmkcbncb.c +++ b/reactos/ntoskrnl/config/cmkcbncb.c @@ -45,7 +45,7 @@ CmpInitializeCache(VOID) for (i = 0;i < CmpHashTableSize; i++) { /* Setup the pushlock */ - ExInitializePushLock((PULONG_PTR)&CmpCacheTable[i].Lock); + ExInitializePushLock(&CmpCacheTable[i].Lock); } /* Calculate length for the name cache */ @@ -66,7 +66,7 @@ CmpInitializeCache(VOID) for (i = 0;i < CmpHashTableSize; i++) { /* Setup the pushlock */ - ExInitializePushLock((PULONG_PTR)&CmpNameCacheTable[i].Lock); + ExInitializePushLock(&CmpNameCacheTable[i].Lock); } /* Setup the delayed close table */ @@ -1072,9 +1072,9 @@ EnlistKeyBodyWithKCB(IN PCM_KEY_BODY KeyBody, if (Flags & CMP_ENLIST_KCB_LOCKED_SHARED) { /* It's shared, so release the KCB shared lock */ - CmpReleaseKcbLock(KeyBody->KeyControlBlock); + CmpReleaseKcbLock(KeyBody->KeyControlBlock); ASSERT(!(Flags & CMP_ENLIST_KCB_LOCKED_EXCLUSIVE)); - } + } /* Check if we need to lock the KCB */ if (!(Flags & CMP_ENLIST_KCB_LOCKED_EXCLUSIVE)) @@ -1097,7 +1097,7 @@ EnlistKeyBodyWithKCB(IN PCM_KEY_BODY KeyBody, { /* Release the lock */ CmpReleaseKcbLock(KeyBody->KeyControlBlock); - } + } } VOID @@ -1184,7 +1184,7 @@ CmpFlushNotifiesOnKeyBodyList(IN PCM_KEY_CONTROL_BLOCK Kcb, ASSERT(KeyBody->NotifyBlock == NULL); /* Release the reference we took */ - ObDereferenceObjectDeferDelete(KeyBody); + ObDereferenceObjectDeferDelete(KeyBody); continue; } } diff --git a/reactos/ntoskrnl/config/cmsysini.c b/reactos/ntoskrnl/config/cmsysini.c index f144e84a0fa..164b45fa668 100644 --- a/reactos/ntoskrnl/config/cmsysini.c +++ b/reactos/ntoskrnl/config/cmsysini.c @@ -1393,8 +1393,8 @@ CmInitSystem1(VOID) /* Initialize the hive list and lock */ InitializeListHead(&CmpHiveListHead); - ExInitializePushLock((PVOID)&CmpHiveListHeadLock); - ExInitializePushLock((PVOID)&CmpLoadHiveLock); + ExInitializePushLock(&CmpHiveListHeadLock); + ExInitializePushLock(&CmpLoadHiveLock); /* Initialize registry lock */ ExInitializeResourceLite(&CmpRegistryLock); @@ -1614,7 +1614,7 @@ CmpFreeDriverList(IN PHHIVE Hive, if (DriverNode->ListEntry.RegistryPath.Buffer) { /* Free it */ - CmpFree(DriverNode->ListEntry.RegistryPath.Buffer, + CmpFree(DriverNode->ListEntry.RegistryPath.Buffer, DriverNode->ListEntry.RegistryPath.MaximumLength); } diff --git a/reactos/ntoskrnl/ex/handle.c b/reactos/ntoskrnl/ex/handle.c index 17ae2814550..755bc5d59b2 100644 --- a/reactos/ntoskrnl/ex/handle.c +++ b/reactos/ntoskrnl/ex/handle.c @@ -28,7 +28,7 @@ ExpInitializeHandleTables(VOID) { /* Initialize the list of handle tables and the lock */ InitializeListHead(&HandleTableListHead); - ExInitializePushLock((PULONG_PTR)&HandleTableListLock); + ExInitializePushLock(&HandleTableListLock); } PHANDLE_TABLE_ENTRY @@ -409,11 +409,11 @@ ExpAllocateHandleTable(IN PEPROCESS Process OPTIONAL, for (i = 0; i < 4; i++) { /* Initialize the handle table lock */ - ExInitializePushLock((PULONG_PTR)&HandleTable->HandleTableLock[i]); + ExInitializePushLock(&HandleTable->HandleTableLock[i]); } /* Initialize the contention event lock and return the lock */ - ExInitializePushLock((PULONG_PTR)&HandleTable->HandleContentionEvent); + ExInitializePushLock(&HandleTable->HandleContentionEvent); return HandleTable; } diff --git a/reactos/ntoskrnl/include/internal/ex.h b/reactos/ntoskrnl/include/internal/ex.h index 7c26af3070a..85a726b0cd8 100644 --- a/reactos/ntoskrnl/include/internal/ex.h +++ b/reactos/ntoskrnl/include/internal/ex.h @@ -887,10 +887,10 @@ ExWaitForUnblockPushLock( *--*/ FORCEINLINE VOID -_ExInitializePushLock(IN PULONG_PTR PushLock) +_ExInitializePushLock(OUT PEX_PUSH_LOCK PushLock) { /* Set the value to 0 */ - *PushLock = 0; + PushLock->Ptr = 0; } #define ExInitializePushLock _ExInitializePushLock diff --git a/reactos/ntoskrnl/mm/ARM3/mminit.c b/reactos/ntoskrnl/mm/ARM3/mminit.c index 9b3450af124..650b67b47ee 100644 --- a/reactos/ntoskrnl/mm/ARM3/mminit.c +++ b/reactos/ntoskrnl/mm/ARM3/mminit.c @@ -1993,7 +1993,7 @@ MmArmInitSystem(IN ULONG Phase, MmNumberOfSystemPtes, MmNumberOfSystemPtes * PAGE_SIZE); /* Initialize the working set lock */ - ExInitializePushLock((PULONG_PTR)&MmSystemCacheWs.WorkingSetMutex); + ExInitializePushLock(&MmSystemCacheWs.WorkingSetMutex); /* Set commit limit */ MmTotalCommitLimit = 2 * _1GB; diff --git a/reactos/ntoskrnl/ob/obdir.c b/reactos/ntoskrnl/ob/obdir.c index cf48553ccf7..a4a2a605f0a 100644 --- a/reactos/ntoskrnl/ob/obdir.c +++ b/reactos/ntoskrnl/ob/obdir.c @@ -768,7 +768,7 @@ NtCreateDirectoryObject(OUT PHANDLE DirectoryHandle, /* Setup the object */ RtlZeroMemory(Directory, sizeof(OBJECT_DIRECTORY)); - ExInitializePushLock((PULONG_PTR)&Directory->Lock); + ExInitializePushLock(&Directory->Lock); Directory->SessionId = -1; /* Insert it into the handle table */ diff --git a/reactos/ntoskrnl/ob/obsdcach.c b/reactos/ntoskrnl/ob/obsdcach.c index 1e8f9dad198..52e5a8d5096 100644 --- a/reactos/ntoskrnl/ob/obsdcach.c +++ b/reactos/ntoskrnl/ob/obsdcach.c @@ -67,7 +67,7 @@ ObpInitSdCache(VOID) { /* Initialize the lock and the list */ InitializeListHead(&ObsSecurityDescriptorCache[i].Head); - ExInitializePushLock((PULONG_PTR)&ObsSecurityDescriptorCache[i].PushLock); + ExInitializePushLock(&ObsSecurityDescriptorCache[i].PushLock); } /* Return success */ @@ -419,7 +419,7 @@ ObLogSecurityDescriptor(IN PSECURITY_DESCRIPTOR InputSecurityDescriptor, { /* Increment its reference count */ InterlockedExchangeAdd((PLONG)&SdHeader->RefCount, RefBias); - + /* Release the lock */ ObpSdReleaseLockShared(CacheEntry); From a6586c33b1f347929309ae384240b6eabb761fb7 Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Fri, 8 Apr 2011 17:49:49 +0000 Subject: [PATCH 098/317] [NTDLL] - Fix incorrect prototypes and partially implement fast unsafe versions of activation context activation/deactivation, however disable them for now, until the new loader is in place. - Fix their usage in the new loader code, which by mistake (which got copypasted into three other places) was passing a totally empty activation context to the activate function. svn path=/trunk/; revision=51281 --- reactos/dll/ntdll/def/ntdll.pspec | 4 +- reactos/dll/ntdll/ldr/ldrinit.c | 8 ++-- reactos/dll/ntdll/ldr/ldrpe.c | 4 +- reactos/include/ndk/rtlfuncs.h | 8 ++-- reactos/lib/rtl/actctx.c | 74 +++++++++++++++++++++++++------ 5 files changed, 72 insertions(+), 26 deletions(-) diff --git a/reactos/dll/ntdll/def/ntdll.pspec b/reactos/dll/ntdll/def/ntdll.pspec index 2c5de04b8d1..e87b71c6bf1 100644 --- a/reactos/dll/ntdll/def/ntdll.pspec +++ b/reactos/dll/ntdll/def/ntdll.pspec @@ -419,7 +419,7 @@ @ stdcall RtlAcquireSRWLockShared(ptr) @ stdcall RtlActivateActivationContext(long ptr ptr) //@ stdcall RtlActivateActivationContextEx -@ stdcall RtlActivateActivationContextUnsafeFast(ptr ptr) +@ fastcall RtlActivateActivationContextUnsafeFast(ptr ptr) @ stdcall RtlAddAccessAllowedAce(ptr long long ptr) @ stdcall RtlAddAccessAllowedAceEx(ptr long long long ptr) @ stdcall RtlAddAccessAllowedObjectAce(ptr long long long ptr ptr ptr) @@ -532,7 +532,7 @@ @ stdcall RtlCutoverTimeToSystemTime(ptr ptr ptr long) @ stdcall RtlDeNormalizeProcessParams(ptr) @ stdcall RtlDeactivateActivationContext(long long) -@ stdcall RtlDeactivateActivationContextUnsafeFast(ptr) +@ fastcall RtlDeactivateActivationContextUnsafeFast(ptr) //@ stdcall RtlDebugPrintTimes @ stdcall RtlDecodePointer(ptr) @ stdcall RtlDecodeSystemPointer(ptr) RtlEncodeSystemPointer diff --git a/reactos/dll/ntdll/ldr/ldrinit.c b/reactos/dll/ntdll/ldr/ldrinit.c index 5913304361a..a7a196fcaa3 100644 --- a/reactos/dll/ntdll/ldr/ldrinit.c +++ b/reactos/dll/ntdll/ldr/ldrinit.c @@ -616,8 +616,8 @@ LdrpRunInitializeRoutines(IN PCONTEXT Context OPTIONAL) /* Set up the Act Ctx */ ActCtx.Size = sizeof(ActCtx); - ActCtx.Frame.Flags = ACTCTX_FLAG_PROCESSOR_ARCHITECTURE_VALID; - RtlZeroMemory(&ActCtx, sizeof(ActCtx)); + ActCtx.Format = 1; + RtlZeroMemory(&ActCtx.Frame, sizeof(RTL_ACTIVATION_CONTEXT_STACK_FRAME)); /* Activate the ActCtx */ RtlActivateActivationContextUnsafeFast(&ActCtx, @@ -682,8 +682,8 @@ LdrpRunInitializeRoutines(IN PCONTEXT Context OPTIONAL) { /* Set up the Act Ctx */ ActCtx.Size = sizeof(ActCtx); - ActCtx.Frame.Flags = ACTCTX_FLAG_PROCESSOR_ARCHITECTURE_VALID; - RtlZeroMemory(&ActCtx, sizeof(ActCtx)); + ActCtx.Format = 1; + RtlZeroMemory(&ActCtx.Frame, sizeof(RTL_ACTIVATION_CONTEXT_STACK_FRAME)); /* Activate the ActCtx */ RtlActivateActivationContextUnsafeFast(&ActCtx, diff --git a/reactos/dll/ntdll/ldr/ldrpe.c b/reactos/dll/ntdll/ldr/ldrpe.c index 730d260d836..12e24fe547d 100644 --- a/reactos/dll/ntdll/ldr/ldrpe.c +++ b/reactos/dll/ntdll/ldr/ldrpe.c @@ -660,8 +660,8 @@ LdrpWalkImportDescriptor(IN LPWSTR DllPath OPTIONAL, DPRINT1("LdrpWalkImportDescriptor('%S' %x)\n", DllPath, LdrEntry); /* Set up the Act Ctx */ ActCtx.Size = sizeof(ActCtx); - ActCtx.Frame.Flags = ACTCTX_FLAG_PROCESSOR_ARCHITECTURE_VALID; - RtlZeroMemory(&ActCtx, sizeof(ActCtx)); + ActCtx.Frame.Flags = 1; + RtlZeroMemory(&ActCtx.Frame, sizeof(RTL_ACTIVATION_CONTEXT_STACK_FRAME)); /* Check if we have a manifest prober routine */ if (LdrpManifestProberRoutine) diff --git a/reactos/include/ndk/rtlfuncs.h b/reactos/include/ndk/rtlfuncs.h index a5c453f2e32..6807128b626 100644 --- a/reactos/include/ndk/rtlfuncs.h +++ b/reactos/include/ndk/rtlfuncs.h @@ -3071,8 +3071,8 @@ RtlAddRefActivationContext( NTSYSAPI -NTSTATUS -NTAPI +PRTL_ACTIVATION_CONTEXT_STACK_FRAME +FASTCALL RtlActivateActivationContextUnsafeFast( IN PRTL_CALLER_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME_EXTENDED Frame, IN PVOID Context @@ -3121,8 +3121,8 @@ NTAPI RtlFreeThreadActivationContextStack(void); NTSYSAPI -NTSTATUS -NTAPI +PRTL_ACTIVATION_CONTEXT_STACK_FRAME +FASTCALL RtlDeactivateActivationContextUnsafeFast( IN PRTL_CALLER_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME_EXTENDED Frame ); diff --git a/reactos/lib/rtl/actctx.c b/reactos/lib/rtl/actctx.c index cd900e1b8de..1a6dc569178 100644 --- a/reactos/lib/rtl/actctx.c +++ b/reactos/lib/rtl/actctx.c @@ -22,6 +22,8 @@ #include +BOOLEAN RtlpNotAllowingMultipleActivation; + #define QUERY_ACTCTX_FLAG_ACTIVE (0x00000001) #define ACTCTX_FLAGS_ALL (\ @@ -2730,31 +2732,75 @@ RtlAllocateActivationContextStack(IN PVOID *Context) return STATUS_SUCCESS; } -NTSTATUS -NTAPI +PRTL_ACTIVATION_CONTEXT_STACK_FRAME +FASTCALL RtlActivateActivationContextUnsafeFast(IN PRTL_CALLER_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME_EXTENDED Frame, IN PVOID Context) { - static int i; +#if NEW_NTDLL_LOADER + RTL_ACTIVATION_CONTEXT_STACK_FRAME *ActiveFrame; - if (i == 0) - UNIMPLEMENTED; - i++; + /* Get the curren active frame */ + ActiveFrame = NtCurrentTeb()->ActivationContextStackPointer->ActiveFrame; - return STATUS_NOT_IMPLEMENTED; + DPRINT1("ActiveFrame %p, &Frame->Frame %p, Context %p\n", ActiveFrame, &Frame->Frame, Context); + + /* Actually activate it */ + Frame->Frame.Previous = ActiveFrame; + Frame->Frame.ActivationContext = Context; + Frame->Frame.Flags = 0; + + /* Check if we can activate this context */ + if ((ActiveFrame && (ActiveFrame->ActivationContext != Context)) || + Context) + { + /* Set new active frame */ + NtCurrentTeb()->ActivationContextStackPointer->ActiveFrame = &Frame->Frame; + return &Frame->Frame; + } + + /* We can get here only one way: it was already activated */ + DPRINT1("Trying to activate improper activation context\n"); + + /* Activate only if we are allowing multiple activation */ + if (!RtlpNotAllowingMultipleActivation) + { + NtCurrentTeb()->ActivationContextStackPointer->ActiveFrame = &Frame->Frame; + } + else + { + /* Set flag */ + Frame->Frame.Flags = 0x30; + } + + /* Return pointer to the activation frame */ + return &Frame->Frame; +#else + return NULL; +#endif } -NTSTATUS -NTAPI +PRTL_ACTIVATION_CONTEXT_STACK_FRAME +FASTCALL RtlDeactivateActivationContextUnsafeFast(IN PRTL_CALLER_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME_EXTENDED Frame) { - static int i; +#if NEW_NTDLL_LOADER + RTL_ACTIVATION_CONTEXT_STACK_FRAME *frame, *top; - if (i == 0) - UNIMPLEMENTED; - i++; + /* find the right frame */ + top = NtCurrentTeb()->ActivationContextStackPointer->ActiveFrame; + frame = &Frame->Frame; - return STATUS_NOT_IMPLEMENTED; + if (!frame) + RtlRaiseStatus( STATUS_SXS_INVALID_DEACTIVATION ); + + /* pop everything up to and including frame */ + NtCurrentTeb()->ActivationContextStackPointer->ActiveFrame = frame->Previous; + + return frame; +#else + return NULL; +#endif } From efe3b7a684874d076cc62e03aa2e26e09998ff74 Mon Sep 17 00:00:00 2001 From: James Tabor Date: Fri, 8 Apr 2011 18:48:28 +0000 Subject: [PATCH 099/317] [Win32k] - Fix crash in msg test_interthread_message test. Noticed it once and not sure how to track it. svn path=/trunk/; revision=51282 --- reactos/subsystems/win32/win32k/ntuser/object.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/reactos/subsystems/win32/win32k/ntuser/object.c b/reactos/subsystems/win32/win32k/ntuser/object.c index 4df5c8f8f6d..bcf791e6b0c 100644 --- a/reactos/subsystems/win32/win32k/ntuser/object.c +++ b/reactos/subsystems/win32/win32k/ntuser/object.c @@ -407,6 +407,11 @@ UserDereferenceObject(PVOID object) { entry = handle_to_entry(gHandleTable, ((PHEAD)object)->h ); + if (!entry) + { + DPRINT1("warning! Dereference Object without ENTRY! Obj -> 0x%x\n", object); + return FALSE; + } DPRINT("warning! Dereference to zero! Obj -> 0x%x\n", object); ((PHEAD)object)->cLockObj = 0; From 5399e1d53e5b2ea5018aa7cdd9048be26dc837ef Mon Sep 17 00:00:00 2001 From: James Tabor Date: Fri, 8 Apr 2011 19:29:15 +0000 Subject: [PATCH 100/317] [User32|Win32k] - Fix TrackMouseEvent! Keyboard and Mouse pass all the right flags. Update to accelerator code. Fixed recursion in global hooks. Hack-implement GetMouseMovePointsEx due to slack time and boredom, it passes the input tests but does nothing. Pass all the test_TrackMouseEvent!!! test_accelerators and test_menu_messages work too, so far no hangs. svn path=/trunk/; revision=51283 --- reactos/dll/win32/user32/include/user32p.h | 13 - reactos/dll/win32/user32/misc/dllmain.c | 20 -- reactos/dll/win32/user32/user32.pspec | 2 +- reactos/dll/win32/user32/windows/input.c | 238 ------------- .../win32/win32k/include/cursoricon.h | 2 +- .../subsystems/win32/win32k/include/desktop.h | 12 +- .../subsystems/win32/win32k/include/input.h | 4 +- .../win32/win32k/include/msgqueue.h | 2 +- .../subsystems/win32/win32k/include/timer.h | 6 + .../win32/win32k/ntuser/accelerator.c | 185 ++++++----- .../subsystems/win32/win32k/ntuser/callback.c | 23 +- .../win32/win32k/ntuser/cursoricon.c | 24 +- .../subsystems/win32/win32k/ntuser/focus.c | 2 +- reactos/subsystems/win32/win32k/ntuser/hook.c | 8 +- .../subsystems/win32/win32k/ntuser/input.c | 312 +++++++++++++++++- .../subsystems/win32/win32k/ntuser/keyboard.c | 23 ++ reactos/subsystems/win32/win32k/ntuser/menu.c | 11 +- .../subsystems/win32/win32k/ntuser/msgqueue.c | 31 +- .../subsystems/win32/win32k/ntuser/ntstubs.c | 61 ---- .../win32/win32k/ntuser/simplecall.c | 2 +- .../subsystems/win32/win32k/ntuser/timer.c | 83 ++++- .../subsystems/win32/win32k/ntuser/window.c | 6 +- 22 files changed, 593 insertions(+), 477 deletions(-) diff --git a/reactos/dll/win32/user32/include/user32p.h b/reactos/dll/win32/user32/include/user32p.h index d4b32cb0abe..2f47ccc231c 100644 --- a/reactos/dll/win32/user32/include/user32p.h +++ b/reactos/dll/win32/user32/include/user32p.h @@ -112,19 +112,6 @@ extern HINSTANCE hImmInstance; /* Critical Section*/ extern RTL_CRITICAL_SECTION User32Crit; -typedef struct _USER32_TRACKINGLIST { - TRACKMOUSEEVENT tme; - POINT pos; /* center of hover rectangle */ - UINT_PTR timer; -} USER32_TRACKINGLIST,*PUSER32_TRACKINGLIST; - -typedef struct _USER32_THREAD_DATA -{ - USER32_TRACKINGLIST tracking_info; /* TrackMouseEvent stuff */ -} USER32_THREAD_DATA, *PUSER32_THREAD_DATA; - -PUSER32_THREAD_DATA User32GetThreadData(VOID); - /* FIXME: Belongs to some header. */ BOOL WINAPI GdiDllInitialize(HANDLE, DWORD, LPVOID); void InitStockObjects(void); diff --git a/reactos/dll/win32/user32/misc/dllmain.c b/reactos/dll/win32/user32/misc/dllmain.c index 7a1abc97d1e..b3c46ff7c9b 100644 --- a/reactos/dll/win32/user32/misc/dllmain.c +++ b/reactos/dll/win32/user32/misc/dllmain.c @@ -17,13 +17,6 @@ BOOL gfServerProcess = FALSE; WCHAR szAppInit[KEY_LENGTH]; -PUSER32_THREAD_DATA -User32GetThreadData() -{ - return ((PUSER32_THREAD_DATA)TlsGetValue(User32TlsIndex)); -} - - BOOL GetDllList() { @@ -192,25 +185,12 @@ UnloadAppInitDlls() BOOL InitThread(VOID) { - PUSER32_THREAD_DATA ThreadData; - - ThreadData = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, - sizeof(USER32_THREAD_DATA)); - if (ThreadData == NULL) - return FALSE; - if (!TlsSetValue(User32TlsIndex, ThreadData)) - return FALSE; return TRUE; } VOID CleanupThread(VOID) { - PUSER32_THREAD_DATA ThreadData; - - ThreadData = (PUSER32_THREAD_DATA)TlsGetValue(User32TlsIndex); - HeapFree(GetProcessHeap(), HEAP_ZERO_MEMORY, ThreadData); - TlsSetValue(User32TlsIndex, 0); } BOOL diff --git a/reactos/dll/win32/user32/user32.pspec b/reactos/dll/win32/user32/user32.pspec index 3913a9a92df..85c9e194ba9 100644 --- a/reactos/dll/win32/user32/user32.pspec +++ b/reactos/dll/win32/user32/user32.pspec @@ -690,7 +690,7 @@ @ stdcall ToAsciiEx(long long ptr ptr long long) @ stdcall ToUnicode(long long ptr ptr long long) @ stdcall ToUnicodeEx(long long ptr ptr long long long) -@ stdcall TrackMouseEvent(ptr) ; Direct call NtUserTrackMouseEvent +@ stdcall TrackMouseEvent(ptr) NtUserTrackMouseEvent @ stdcall TrackPopupMenu(long long long long long long ptr) @ stdcall TrackPopupMenuEx(long long long long long ptr) ; Direct call NtUserTrackPopupMenuEx @ stdcall TranslateAccelerator(long long ptr) TranslateAcceleratorA diff --git a/reactos/dll/win32/user32/windows/input.c b/reactos/dll/win32/user32/windows/input.c index e9189576963..9eadc0e81c2 100644 --- a/reactos/dll/win32/user32/windows/input.c +++ b/reactos/dll/win32/user32/windows/input.c @@ -530,242 +530,4 @@ mouse_event( NtUserSendInput(1, &Input, sizeof(INPUT)); } - -/*********************************************************************** - * get_key_state - */ -static WORD get_key_state(void) -{ - WORD ret = 0; - - if (GetSystemMetrics( SM_SWAPBUTTON )) - { - if (GetAsyncKeyState(VK_RBUTTON) & 0x80) ret |= MK_LBUTTON; - if (GetAsyncKeyState(VK_LBUTTON) & 0x80) ret |= MK_RBUTTON; - } - else - { - if (GetAsyncKeyState(VK_LBUTTON) & 0x80) ret |= MK_LBUTTON; - if (GetAsyncKeyState(VK_RBUTTON) & 0x80) ret |= MK_RBUTTON; - } - if (GetAsyncKeyState(VK_MBUTTON) & 0x80) ret |= MK_MBUTTON; - if (GetAsyncKeyState(VK_SHIFT) & 0x80) ret |= MK_SHIFT; - if (GetAsyncKeyState(VK_CONTROL) & 0x80) ret |= MK_CONTROL; - if (GetAsyncKeyState(VK_XBUTTON1) & 0x80) ret |= MK_XBUTTON1; - if (GetAsyncKeyState(VK_XBUTTON2) & 0x80) ret |= MK_XBUTTON2; - return ret; -} - -static void CALLBACK TrackMouseEventProc(HWND hwndUnused, UINT uMsg, UINT_PTR idEvent, - DWORD dwTime) -{ - POINT pos; - POINT posClient; - HWND hwnd; - INT hoverwidth = 0, hoverheight = 0; - RECT client; - PUSER32_TRACKINGLIST ptracking_info; - - ptracking_info = & User32GetThreadData()->tracking_info; - - GetCursorPos(&pos); - hwnd = WindowFromPoint(pos); - - SystemParametersInfoW(SPI_GETMOUSEHOVERWIDTH, 0, &hoverwidth, 0); - SystemParametersInfoW(SPI_GETMOUSEHOVERHEIGHT, 0, &hoverheight, 0); - - /* see if this tracking event is looking for TME_LEAVE and that the */ - /* mouse has left the window */ - if (ptracking_info->tme.dwFlags & TME_LEAVE) - { - if (ptracking_info->tme.hwndTrack != hwnd) - { - if (ptracking_info->tme.dwFlags & TME_NONCLIENT) - { - PostMessageW(ptracking_info->tme.hwndTrack, WM_NCMOUSELEAVE, 0, 0); - } - else - { - PostMessageW(ptracking_info->tme.hwndTrack, WM_MOUSELEAVE, 0, 0); - } - - /* remove the TME_LEAVE flag */ - ptracking_info->tme.dwFlags &= ~TME_LEAVE; - } - else - { - GetClientRect(hwnd, &client); - MapWindowPoints(hwnd, NULL, (LPPOINT)&client, 2); - if (PtInRect(&client, pos)) - { - if (ptracking_info->tme.dwFlags & TME_NONCLIENT) - { - PostMessageW(ptracking_info->tme.hwndTrack, WM_NCMOUSELEAVE, 0, 0); - /* remove the TME_LEAVE flag */ - ptracking_info->tme.dwFlags &= ~TME_LEAVE; - } - } - else - { - if (!(ptracking_info->tme.dwFlags & TME_NONCLIENT)) - { - PostMessageW(ptracking_info->tme.hwndTrack, WM_MOUSELEAVE, 0, 0); - /* remove the TME_LEAVE flag */ - ptracking_info->tme.dwFlags &= ~TME_LEAVE; - } - } - } - } - - /* see if we are tracking hovering for this hwnd */ - if (ptracking_info->tme.dwFlags & TME_HOVER) - { - /* has the cursor moved outside the rectangle centered around pos? */ - if ((abs(pos.x - ptracking_info->pos.x) > (hoverwidth / 2.0)) || - (abs(pos.y - ptracking_info->pos.y) > (hoverheight / 2.0))) - { - /* record this new position as the current position and reset */ - /* the iHoverTime variable to 0 */ - ptracking_info->pos = pos; - } - else - { - posClient.x = pos.x; - posClient.y = pos.y; - ScreenToClient(hwnd, &posClient); - - if (ptracking_info->tme.dwFlags & TME_NONCLIENT) - { - PostMessageW(ptracking_info->tme.hwndTrack, WM_NCMOUSEHOVER, - get_key_state(), MAKELPARAM( posClient.x, posClient.y )); - } - else - { - PostMessageW(ptracking_info->tme.hwndTrack, WM_MOUSEHOVER, - get_key_state(), MAKELPARAM( posClient.x, posClient.y )); - } - - /* stop tracking mouse hover */ - ptracking_info->tme.dwFlags &= ~TME_HOVER; - } - } - - /* stop the timer if the tracking list is empty */ - if (!(ptracking_info->tme.dwFlags & (TME_HOVER | TME_LEAVE))) - { - KillTimer(0, ptracking_info->timer); - RtlZeroMemory(ptracking_info,sizeof(USER32_TRACKINGLIST)); - } -} - - -/*********************************************************************** - * TrackMouseEvent [USER32] - * - * Requests notification of mouse events - * - * During mouse tracking WM_MOUSEHOVER or WM_MOUSELEAVE events are posted - * to the hwnd specified in the ptme structure. After the event message - * is posted to the hwnd, the entry in the queue is removed. - * - * If the current hwnd isn't ptme->hwndTrack the TME_HOVER flag is completely - * ignored. The TME_LEAVE flag results in a WM_MOUSELEAVE message being posted - * immediately and the TME_LEAVE flag being ignored. - * - * PARAMS - * ptme [I,O] pointer to TRACKMOUSEEVENT information structure. - * - * RETURNS - * Success: non-zero - * Failure: zero - * - */ -/* - * @implemented - */ -BOOL -WINAPI -TrackMouseEvent( - LPTRACKMOUSEEVENT ptme) -{ - HWND hwnd; - POINT pos; - DWORD hover_time; - PUSER32_TRACKINGLIST ptracking_info; - - TRACE("%lx, %lx, %p, %lx\n", ptme->cbSize, ptme->dwFlags, ptme->hwndTrack, ptme->dwHoverTime); - - if (ptme->cbSize != sizeof(TRACKMOUSEEVENT)) { - WARN("wrong TRACKMOUSEEVENT size from app\n"); - SetLastError(ERROR_INVALID_PARAMETER); - return FALSE; - } - - ptracking_info = & User32GetThreadData()->tracking_info; - - /* fill the TRACKMOUSEEVENT struct with the current tracking for the given hwnd */ - if (ptme->dwFlags & TME_QUERY ) - { - *ptme = ptracking_info->tme; - ptme->cbSize = sizeof(TRACKMOUSEEVENT); - - return TRUE; /* return here, TME_QUERY is retrieving information */ - } - - if (!IsWindow(ptme->hwndTrack)) - { - SetLastError(ERROR_INVALID_WINDOW_HANDLE); - return FALSE; - } - - hover_time = ptme->dwHoverTime; - - /* if HOVER_DEFAULT was specified replace this with the systems current value */ - if (hover_time == HOVER_DEFAULT || hover_time == 0) - { - SystemParametersInfoW(SPI_GETMOUSEHOVERTIME, 0, &hover_time, 0); - } - - GetCursorPos(&pos); - hwnd = WindowFromPoint(pos); - - if (ptme->dwFlags & ~(TME_CANCEL | TME_HOVER | TME_LEAVE | TME_NONCLIENT)) - { - FIXME("Unknown flag(s) %08lx\n", ptme->dwFlags & ~(TME_CANCEL | TME_HOVER | TME_LEAVE | TME_NONCLIENT)); - } - - if (ptme->dwFlags & TME_CANCEL) - { - if (ptracking_info->tme.hwndTrack == ptme->hwndTrack) - { - ptracking_info->tme.dwFlags &= ~(ptme->dwFlags & ~TME_CANCEL); - - /* if we aren't tracking on hover or leave remove this entry */ - if (!(ptracking_info->tme.dwFlags & (TME_HOVER | TME_LEAVE))) - { - KillTimer(0, ptracking_info->timer); - RtlZeroMemory(ptracking_info,sizeof(USER32_TRACKINGLIST)); - } - } - } else { - if (ptme->hwndTrack == hwnd) - { - /* Adding new mouse event to the tracking list */ - ptracking_info->tme = *ptme; - ptracking_info->tme.dwHoverTime = hover_time; - - /* Initialize HoverInfo variables even if not hover tracking */ - ptracking_info->pos = pos; - - if (!ptracking_info->timer) - { - ptracking_info->timer = SetTimer(0, 0, hover_time, TrackMouseEventProc); - } - } - } - - return TRUE; - -} - /* EOF */ diff --git a/reactos/subsystems/win32/win32k/include/cursoricon.h b/reactos/subsystems/win32/win32k/include/cursoricon.h index 0c0059a933d..8ee0ff873b7 100644 --- a/reactos/subsystems/win32/win32k/include/cursoricon.h +++ b/reactos/subsystems/win32/win32k/include/cursoricon.h @@ -69,7 +69,7 @@ BOOL UserDrawIconEx(HDC hDc, INT xLeft, INT yTop, PCURICON_OBJECT pIcon, INT cxW INT cyHeight, UINT istepIfAniCur, HBRUSH hbrFlickerFreeDraw, UINT diFlags); PCURICON_OBJECT FASTCALL UserGetCurIconObject(HCURSOR hCurIcon); -BOOL UserSetCursorPos( INT x, INT y, BOOL SendMouseMoveMsg); +BOOL UserSetCursorPos( INT x, INT y); int UserShowCursor(BOOL bShow); diff --git a/reactos/subsystems/win32/win32k/include/desktop.h b/reactos/subsystems/win32/win32k/include/desktop.h index 82607df23dc..fbf2f5481bd 100644 --- a/reactos/subsystems/win32/win32k/include/desktop.h +++ b/reactos/subsystems/win32/win32k/include/desktop.h @@ -9,6 +9,7 @@ typedef struct _DESKTOP LIST_ENTRY ListEntry; /* Pointer to the associated window station. */ struct _WINSTATION_OBJECT *rpwinstaParent; + DWORD dwDTFlags; PWND spwndForeground; PWND spwndTray; PWND spwndMessage; @@ -27,12 +28,20 @@ typedef struct _DESKTOP /* Pointer to the active queue. */ PVOID ActiveMessageQueue; /* Handle of the desktop window. */ - HANDLE DesktopWindow; + HWND DesktopWindow; /* Thread blocking input */ PVOID BlockInputThread; LIST_ENTRY ShellHookWindows; } DESKTOP, *PDESKTOP; +// Desktop flags +#define DF_TME_HOVER 0x00000400 +#define DF_TME_LEAVE 0x00000800 +#define DF_DESTROYED 0x00008000 +#define DF_DESKWNDDESTROYED 0x00010000 +#define DF_DYING 0x00020000 + + extern PDESKTOP InputDesktop; extern HDESK InputDesktopHandle; extern PCLS DesktopWindowClass; @@ -125,6 +134,7 @@ BOOL IntRegisterShellHookWindow(HWND hWnd); BOOL IntDeRegisterShellHookWindow(HWND hWnd); VOID co_IntShellHookNotify(WPARAM Message, LPARAM lParam); HDC FASTCALL UserGetDesktopDC(ULONG,BOOL,BOOL); +BOOL FASTCALL IntPaintDesktop(HDC hDC); #define IntIsActiveDesktop(Desktop) \ ((Desktop)->rpwinstaParent->ActiveDesktop == (Desktop)) diff --git a/reactos/subsystems/win32/win32k/include/input.h b/reactos/subsystems/win32/win32k/include/input.h index 167c2af5aad..ba123366a2a 100644 --- a/reactos/subsystems/win32/win32k/include/input.h +++ b/reactos/subsystems/win32/win32k/include/input.h @@ -42,8 +42,8 @@ VOID W32kUnregisterPrimitiveMessageQueue(VOID); PKBL W32kGetDefaultKeyLayout(VOID); VOID FASTCALL W32kKeyProcessMessage(LPMSG Msg, PKBDTABLES KeyLayout, BYTE Prefix); BOOL FASTCALL IntBlockInput(PTHREADINFO W32Thread, BOOL BlockIt); -BOOL FASTCALL IntMouseInput(MOUSEINPUT *mi); -BOOL FASTCALL IntKeyboardInput(KEYBDINPUT *ki); +BOOL FASTCALL IntMouseInput(MOUSEINPUT *mi, BOOL Injected); +BOOL FASTCALL IntKeyboardInput(KEYBDINPUT *ki, BOOL Injected); BOOL UserInitDefaultKeyboardLayout(VOID); PKBL UserHklToKbl(HKL hKl); diff --git a/reactos/subsystems/win32/win32k/include/msgqueue.h b/reactos/subsystems/win32/win32k/include/msgqueue.h index 1f412f56945..e5158574e10 100644 --- a/reactos/subsystems/win32/win32k/include/msgqueue.h +++ b/reactos/subsystems/win32/win32k/include/msgqueue.h @@ -242,7 +242,7 @@ co_MsqPostKeyboardMessage(UINT uMsg, WPARAM wParam, LPARAM lParam); VOID FASTCALL MsqPostHotKeyMessage(PVOID Thread, HWND hWnd, WPARAM wParam, LPARAM lParam); VOID FASTCALL -co_MsqInsertMouseMessage(MSG* Msg); +co_MsqInsertMouseMessage(MSG* Msg, DWORD flags, ULONG_PTR dwExtraInfo); BOOL FASTCALL MsqIsClkLck(LPMSG Msg, BOOL Remove); BOOL FASTCALL diff --git a/reactos/subsystems/win32/win32k/include/timer.h b/reactos/subsystems/win32/win32k/include/timer.h index c88da4a987d..9d20be9abfc 100644 --- a/reactos/subsystems/win32/win32k/include/timer.h +++ b/reactos/subsystems/win32/win32k/include/timer.h @@ -24,6 +24,12 @@ typedef struct _TIMER #define TMRF_WAITING 0x0020 #define TMRF_TIFROMWND 0x0040 +#define ID_EVENT_SYSTIMER_MOUSEHOVER (-6) +#define ID_EVENT_SYSTIMER_FLASHWIN (-8) +#define ID_EVENT_SYSTIMER_TRACKWIN (-9) +#define ID_EVENT_SYSTIMER_ANIMATEDFADE (-10) +#define ID_EVENT_SYSTIMER_INVALIDATEDCES (-11) + extern PKTIMER MasterTimer; INIT_FUNCTION diff --git a/reactos/subsystems/win32/win32k/ntuser/accelerator.c b/reactos/subsystems/win32/win32k/ntuser/accelerator.c index 78f1fd005b5..06240449ffc 100644 --- a/reactos/subsystems/win32/win32k/ntuser/accelerator.c +++ b/reactos/subsystems/win32/win32k/ntuser/accelerator.c @@ -1,27 +1,8 @@ /* - * ReactOS W32 Subsystem - * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 ReactOS Team - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ -/* $Id$ - * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel - * PURPOSE: Window classes - * FILE: subsys/win32k/ntuser/class.c + * PURPOSE: Window accelerator + * FILE: subsystems/win32/win32k/ntuser/accelerator.c * PROGRAMER: Casper S. Hornstrup (chorns@users.sourceforge.net) * REVISION HISTORY: * 06-06-2001 CSH Created @@ -105,10 +86,14 @@ co_IntTranslateAccelerator( WORD key, WORD cmd) { + INT mask = 0; UINT mesg = 0; + HWND hWnd; ASSERT_REFS_CO(Window); + hWnd = Window->head.h; + DPRINT("IntTranslateAccelerator(hwnd %x, message %x, wParam %x, lParam %x, fVirt %d, key %x, cmd %x)\n", Window->head.h, message, wParam, lParam, fVirt, key, cmd); @@ -117,37 +102,33 @@ co_IntTranslateAccelerator( return FALSE; } - if (message == WM_CHAR) + DPRINT("NtUserGetKeyState(VK_SHIFT) = 0x%x\n", + UserGetKeyState(VK_SHIFT)); + DPRINT("NtUserGetKeyState(VK_CONTROL) = 0x%x\n", + UserGetKeyState(VK_CONTROL)); + DPRINT("NtUserGetKeyState(VK_MENU) = 0x%x\n", + UserGetKeyState(VK_MENU)); + + if (UserGetKeyState(VK_CONTROL) & 0x8000) mask |= FCONTROL; + if (UserGetKeyState(VK_MENU) & 0x8000) mask |= FALT; + if (UserGetKeyState(VK_SHIFT) & 0x8000) mask |= FSHIFT; + + if (message == WM_CHAR || message == WM_SYSCHAR) { - if (!(fVirt & FALT) && !(fVirt & FVIRTKEY)) + if ( !(fVirt & FVIRTKEY) && (mask & FALT) == (fVirt & FALT) ) { - DPRINT("found accel for WM_CHAR: ('%c')\n", wParam & 0xff); + DPRINT("found accel for WM_CHAR: ('%c')\n", LOWORD(wParam) & 0xff); goto found; } } else { - if ((fVirt & FVIRTKEY) > 0) + if (fVirt & FVIRTKEY) { - INT mask = 0; DPRINT("found accel for virt_key %04x (scan %04x)\n", - wParam, 0xff & HIWORD(lParam)); + wParam, 0xff & HIWORD(lParam)); - DPRINT("NtUserGetKeyState(VK_SHIFT) = 0x%x\n", - UserGetKeyState(VK_SHIFT)); - DPRINT("NtUserGetKeyState(VK_CONTROL) = 0x%x\n", - UserGetKeyState(VK_CONTROL)); - DPRINT("NtUserGetKeyState(VK_MENU) = 0x%x\n", - UserGetKeyState(VK_MENU)); - - if (UserGetKeyState(VK_SHIFT) & 0x8000) - mask |= FSHIFT; - if (UserGetKeyState(VK_CONTROL) & 0x8000) - mask |= FCONTROL; - if (UserGetKeyState(VK_MENU) & 0x8000) - mask |= FALT; - if (mask == (fVirt & (FSHIFT | FCONTROL | FALT))) - goto found; + if (mask == (fVirt & (FSHIFT | FCONTROL | FALT))) goto found; DPRINT("but incorrect SHIFT/CTRL/ALT-state\n"); } else @@ -156,7 +137,7 @@ co_IntTranslateAccelerator( { if ((fVirt & FALT) && (lParam & 0x20000000)) { /* ^^ ALT pressed */ - DPRINT("found accel for Alt-%c\n", wParam & 0xff); + DPRINT("found accel for Alt-%c\n", LOWORD(wParam) & 0xff); goto found; } } @@ -173,80 +154,120 @@ found: mesg = 1; else if (IntGetCaptureWindow()) mesg = 2; - else if (!IntIsWindowVisible(Window)) /* FIXME: WINE IsWindowEnabled == IntIsWindowVisible? */ + else if (Window->style & WS_DISABLED) mesg = 3; else { #if 0 HMENU hMenu, hSubMenu, hSysMenu; UINT uSysStat = (UINT)-1, uStat = (UINT)-1, nPos; + PMENU_OBJECT MenuObject, SubMenu; + MENU_ITEM MenuItem; - hMenu = (UserGetWindowLongW(hWnd, GWL_STYLE) & WS_CHILD) ? 0 : GetMenu(hWnd); - hSysMenu = get_win_sys_menu(hWnd); +// hMenu = (UserGetWindowLongW(hWnd, GWL_STYLE) & WS_CHILD) ? 0 : GetMenu(hWnd); +// hSysMenu = get_win_sys_menu(hWnd); + hMenu = (Window->style & WS_CHILD) ? 0 : (HMENU)Window->IDMenu; + hSysMenu = Window->SystemMenu; + MenuObject = IntGetMenuObject(Window->SystemMenu); /* find menu item and ask application to initialize it */ /* 1. in the system menu */ hSubMenu = hSysMenu; - nPos = cmd; - if(MENU_FindItem(&hSubMenu, &nPos, MF_BYCOMMAND)) +// nPos = cmd; +// if(MENU_FindItem(&hSubMenu, &nPos, MF_BYCOMMAND)) + nPos = IntGetMenuItemByFlag( MenuObject, + cmd, + MF_BYCOMMAND, + &SubMenu, + &MenuItem, + NULL); + + if (MenuItem && (nPos != (UINT)-1)) { - co_IntSendMessage(hWnd, WM_INITMENU, (WPARAM)hSysMenu, 0L); - if(hSubMenu != hSysMenu) - { - nPos = MENU_FindSubMenu(&hSysMenu, hSubMenu); - TRACE_(accel)("hSysMenu = %p, hSubMenu = %p, nPos = %d\n", hSysMenu, hSubMenu, nPos); - co_IntSendMessage(hWnd, WM_INITMENUPOPUP, (WPARAM)hSubMenu, MAKELPARAM(nPos, TRUE)); + hSubMenu = MenuItem.hSubMenu; + + if (IntGetCaptureWindow()) + mesg = 2; + if (Window->style & WS_DISABLED) + mesg = 3; + else + { + co_IntSendMessage(hWnd, WM_INITMENU, (WPARAM)hSysMenu, 0L); + if(hSubMenu != hSysMenu) + { + nPos = MENU_FindSubMenu(&hSysMenu, hSubMenu); + DPRINT("hSysMenu = %p, hSubMenu = %p, nPos = %d\n", hSysMenu, hSubMenu, nPos); + co_IntSendMessage(hWnd, WM_INITMENUPOPUP, (WPARAM)hSubMenu, MAKELPARAM(nPos, TRUE)); + } + uSysStat = GetMenuState(GetSubMenu(hSysMenu, 0), cmd, MF_BYCOMMAND); } - uSysStat = GetMenuState(GetSubMenu(hSysMenu, 0), cmd, MF_BYCOMMAND); } else /* 2. in the window's menu */ { + MenuObject = IntGetMenuObject(hMenu); hSubMenu = hMenu; - nPos = cmd; - if(MENU_FindItem(&hSubMenu, &nPos, MF_BYCOMMAND)) +// nPos = cmd; +// if(MENU_FindItem(&hSubMenu, &nPos, MF_BYCOMMAND)) + nPos = IntGetMenuItemByFlag( MenuObject, + cmd, + MF_BYCOMMAND, + &SubMenu, + &MenuItem, + NULL); + + if (MenuItem && (nPos != (UINT)-1)) { - co_IntSendMessage(hWnd, WM_INITMENU, (WPARAM)hMenu, 0L); - if(hSubMenu != hMenu) + if (IntGetCaptureWindow()) + mesg = 2; + if (Window->style & WS_DISABLED) + mesg = 3; + else { - nPos = MENU_FindSubMenu(&hMenu, hSubMenu); - TRACE_(accel)("hMenu = %p, hSubMenu = %p, nPos = %d\n", hMenu, hSubMenu, nPos); - co_IntSendMessage(hWnd, WM_INITMENUPOPUP, (WPARAM)hSubMenu, MAKELPARAM(nPos, FALSE)); + co_IntSendMessage(hWnd, WM_INITMENU, (WPARAM)hMenu, 0L); + if(hSubMenu != hMenu) + { + nPos = MENU_FindSubMenu(&hMenu, hSubMenu); + DPRINT("hMenu = %p, hSubMenu = %p, nPos = %d\n", hMenu, hSubMenu, nPos); + co_IntSendMessage(hWnd, WM_INITMENUPOPUP, (WPARAM)hSubMenu, MAKELPARAM(nPos, FALSE)); + } + uStat = GetMenuState(hMenu, cmd, MF_BYCOMMAND); } - uStat = GetMenuState(hMenu, cmd, MF_BYCOMMAND); } } - if (uSysStat != (UINT)-1) + if (mesg == 0) { - if (uSysStat & (MF_DISABLED|MF_GRAYED)) - mesg=4; - else - mesg=WM_SYSCOMMAND; - } - else - { - if (uStat != (UINT)-1) + if (uSysStat != (UINT)-1) { - if (IsIconic(hWnd)) - mesg=5; + if (uSysStat & (MF_DISABLED|MF_GRAYED)) + mesg=4; else - { - if (uStat & (MF_DISABLED|MF_GRAYED)) - mesg=6; - else - mesg=WM_COMMAND; - } + mesg=WM_SYSCOMMAND; } else { - mesg=WM_COMMAND; + if (uStat != (UINT)-1) + { + if (Window->style & WS_MINIMIZE) + mesg=5; + else + { + if (uStat & (MF_DISABLED|MF_GRAYED)) + mesg=6; + else + mesg=WM_COMMAND; + } + } + else + { + mesg=WM_COMMAND; + } } } #else DPRINT1("Menu search not implemented\n"); mesg = WM_COMMAND; #endif - } if (mesg == WM_COMMAND) diff --git a/reactos/subsystems/win32/win32k/ntuser/callback.c b/reactos/subsystems/win32/win32k/ntuser/callback.c index 45e9f6accc0..e6cef3bfcd9 100644 --- a/reactos/subsystems/win32/win32k/ntuser/callback.c +++ b/reactos/subsystems/win32/win32k/ntuser/callback.c @@ -510,18 +510,25 @@ co_IntCallHookProc(INT HookId, UserEnterCo(); - _SEH2_TRY + if (ResultPointer) { - ProbeForRead(ResultPointer, sizeof(LRESULT), 1); - /* Simulate old behaviour: copy into our local buffer */ - Result = *(LRESULT*)ResultPointer; + _SEH2_TRY + { + ProbeForRead(ResultPointer, sizeof(LRESULT), 1); + /* Simulate old behaviour: copy into our local buffer */ + Result = *(LRESULT*)ResultPointer; + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + Result = 0; + Hit = TRUE; + } + _SEH2_END; } - _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + else { - Result = 0; - Hit = TRUE; + DPRINT1("ERROR: Hook ResultPointer 0x%x ResultLength %d\n",ResultPointer,ResultLength); } - _SEH2_END; if (!NT_SUCCESS(Status)) { diff --git a/reactos/subsystems/win32/win32k/ntuser/cursoricon.c b/reactos/subsystems/win32/win32k/ntuser/cursoricon.c index 1fd9f03ca42..fb9dfeebf84 100644 --- a/reactos/subsystems/win32/win32k/ntuser/cursoricon.c +++ b/reactos/subsystems/win32/win32k/ntuser/cursoricon.c @@ -159,7 +159,7 @@ UserSetCursor( return OldCursor; } -BOOL UserSetCursorPos( INT x, INT y, BOOL SendMouseMoveMsg) +BOOL UserSetCursorPos( INT x, INT y) { PWND DesktopWindow; PSYSTEM_CURSORINFO CurInfo; @@ -194,21 +194,17 @@ BOOL UserSetCursorPos( INT x, INT y, BOOL SendMouseMoveMsg) pt.x = x; pt.y = y; + /* 3. Generate a mouse move message, this sets the htEx. */ + Msg.message = WM_MOUSEMOVE; + Msg.wParam = CurInfo->ButtonsDown; + Msg.lParam = MAKELPARAM(x, y); + Msg.pt = pt; + co_MsqInsertMouseMessage(&Msg, 0, 0); - if (SendMouseMoveMsg) - { - /* Generate a mouse move message */ - Msg.message = WM_MOUSEMOVE; - Msg.wParam = CurInfo->ButtonsDown; - Msg.lParam = MAKELPARAM(x, y); - Msg.pt = pt; - co_MsqInsertMouseMessage(&Msg); - } - - /* Store the new cursor position */ + /* 1. Store the new cursor position */ gpsi->ptCursor = pt; - /* Move the mouse pointer */ + /* 2. Move the mouse pointer */ GreMovePointer(hDC, x, y); return TRUE; @@ -681,7 +677,7 @@ UserClipCursor( { CurInfo->bClipped = TRUE; RECTL_bIntersectRect(&CurInfo->rcClip, prcl, &DesktopWindow->rcWindow); - UserSetCursorPos(gpsi->ptCursor.x, gpsi->ptCursor.y, FALSE); + UserSetCursorPos(gpsi->ptCursor.x, gpsi->ptCursor.y); } else { diff --git a/reactos/subsystems/win32/win32k/ntuser/focus.c b/reactos/subsystems/win32/win32k/ntuser/focus.c index cdc26a7ff94..b4009fec73b 100644 --- a/reactos/subsystems/win32/win32k/ntuser/focus.c +++ b/reactos/subsystems/win32/win32k/ntuser/focus.c @@ -595,7 +595,7 @@ co_UserSetCapture(HWND hWnd) mi.dwFlags = MOUSEEVENTF_MOVE; mi.time = 0; mi.dwExtraInfo = 0; - IntMouseInput(&mi); + IntMouseInput(&mi,FALSE); } return hWndPrev; } diff --git a/reactos/subsystems/win32/win32k/ntuser/hook.c b/reactos/subsystems/win32/win32k/ntuser/hook.c index 40d847b12ae..e252716f921 100644 --- a/reactos/subsystems/win32/win32k/ntuser/hook.c +++ b/reactos/subsystems/win32/win32k/ntuser/hook.c @@ -1003,6 +1003,10 @@ co_HOOK_CallHooks( INT HookId, ClientInfo = pti->pClientInfo; SaveHook = pti->sphkCurrent; + /* Note: Setting pti->sphkCurrent will also lock the next hook to this + * hook ID. So, the CallNextHookEx will only call to that hook ID + * chain anyway. For Thread Hooks.... + */ /* Load it for the next call. */ pti->sphkCurrent = Hook; @@ -1042,7 +1046,7 @@ co_HOOK_CallHooks( INT HookId, ObDereferenceObject(Hook->Thread); } - if ( Global ) + if ( Global && !pti->sphkCurrent) { PTHREADINFO ptiHook; @@ -1057,6 +1061,7 @@ co_HOOK_CallHooks( INT HookId, * hook ID, this will have to post to each of the thread message queues * or make a direct call. */ + pti->sphkCurrent = Hook; // Prevent recursion within this thread. do { /* Hook->Thread is null, we hax around this with Hook->head.pti. */ @@ -1104,6 +1109,7 @@ co_HOOK_CallHooks( INT HookId, } while ( Hook ); DPRINT("Ret: Global HookId %d Result 0x%x\n", HookId,Result); + pti->sphkCurrent = NULL; } Exit: return Result; diff --git a/reactos/subsystems/win32/win32k/ntuser/input.c b/reactos/subsystems/win32/win32k/ntuser/input.c index f8550fc79d6..4c72c2e01f5 100644 --- a/reactos/subsystems/win32/win32k/ntuser/input.c +++ b/reactos/subsystems/win32/win32k/ntuser/input.c @@ -53,7 +53,7 @@ DWORD IntLastInputTick(BOOL LastInputTickSetGet); if(mi.dx != 0 || mi.dy != 0) \ mi.dwFlags |= MOUSEEVENTF_MOVE; \ if(mi.dwFlags) \ - IntMouseInput(&mi); \ + IntMouseInput(&mi,FALSE); \ ClearMouseInput(mi); @@ -481,6 +481,7 @@ IntKeyboardSendWinKeyMsg() static VOID APIENTRY co_IntKeyboardSendAltKeyMsg() { + DPRINT1("co_IntKeyboardSendAltKeyMsg\n"); co_MsqPostKeyboardMessage(WM_SYSCOMMAND,SC_KEYMENU,0); } @@ -1073,7 +1074,7 @@ CLEANUP: } BOOL FASTCALL -IntMouseInput(MOUSEINPUT *mi) +IntMouseInput(MOUSEINPUT *mi, BOOL Injected) { const UINT SwapBtnMsg[2][2] = { @@ -1137,7 +1138,7 @@ IntMouseInput(MOUSEINPUT *mi) if(mi->dwFlags & MOUSEEVENTF_MOVE) { - UserSetCursorPos(MousePos.x, MousePos.y, TRUE); + UserSetCursorPos(MousePos.x, MousePos.y); } if(mi->dwFlags & MOUSEEVENTF_LEFTDOWN) { @@ -1145,7 +1146,7 @@ IntMouseInput(MOUSEINPUT *mi) Msg.message = SwapBtnMsg[0][SwapButtons]; CurInfo->ButtonsDown |= SwapBtn[SwapButtons]; Msg.wParam |= CurInfo->ButtonsDown; - co_MsqInsertMouseMessage(&Msg); + co_MsqInsertMouseMessage(&Msg, Injected, mi->dwExtraInfo); } else if(mi->dwFlags & MOUSEEVENTF_LEFTUP) { @@ -1153,7 +1154,7 @@ IntMouseInput(MOUSEINPUT *mi) Msg.message = SwapBtnMsg[1][SwapButtons]; CurInfo->ButtonsDown &= ~SwapBtn[SwapButtons]; Msg.wParam |= CurInfo->ButtonsDown; - co_MsqInsertMouseMessage(&Msg); + co_MsqInsertMouseMessage(&Msg, Injected, mi->dwExtraInfo); } if(mi->dwFlags & MOUSEEVENTF_MIDDLEDOWN) { @@ -1161,7 +1162,7 @@ IntMouseInput(MOUSEINPUT *mi) Msg.message = WM_MBUTTONDOWN; CurInfo->ButtonsDown |= MK_MBUTTON; Msg.wParam |= CurInfo->ButtonsDown; - co_MsqInsertMouseMessage(&Msg); + co_MsqInsertMouseMessage(&Msg, Injected, mi->dwExtraInfo); } else if(mi->dwFlags & MOUSEEVENTF_MIDDLEUP) { @@ -1169,7 +1170,7 @@ IntMouseInput(MOUSEINPUT *mi) Msg.message = WM_MBUTTONUP; CurInfo->ButtonsDown &= ~MK_MBUTTON; Msg.wParam |= CurInfo->ButtonsDown; - co_MsqInsertMouseMessage(&Msg); + co_MsqInsertMouseMessage(&Msg, Injected, mi->dwExtraInfo); } if(mi->dwFlags & MOUSEEVENTF_RIGHTDOWN) { @@ -1177,7 +1178,7 @@ IntMouseInput(MOUSEINPUT *mi) Msg.message = SwapBtnMsg[0][!SwapButtons]; CurInfo->ButtonsDown |= SwapBtn[!SwapButtons]; Msg.wParam |= CurInfo->ButtonsDown; - co_MsqInsertMouseMessage(&Msg); + co_MsqInsertMouseMessage(&Msg, Injected, mi->dwExtraInfo); } else if(mi->dwFlags & MOUSEEVENTF_RIGHTUP) { @@ -1185,7 +1186,7 @@ IntMouseInput(MOUSEINPUT *mi) Msg.message = SwapBtnMsg[1][!SwapButtons]; CurInfo->ButtonsDown &= ~SwapBtn[!SwapButtons]; Msg.wParam |= CurInfo->ButtonsDown; - co_MsqInsertMouseMessage(&Msg); + co_MsqInsertMouseMessage(&Msg, Injected, mi->dwExtraInfo); } if((mi->dwFlags & (MOUSEEVENTF_XDOWN | MOUSEEVENTF_XUP)) && @@ -1203,14 +1204,14 @@ IntMouseInput(MOUSEINPUT *mi) gQueueKeyStateTable[VK_XBUTTON1] |= 0xc0; CurInfo->ButtonsDown |= MK_XBUTTON1; Msg.wParam = MAKEWPARAM(CurInfo->ButtonsDown, XBUTTON1); - co_MsqInsertMouseMessage(&Msg); + co_MsqInsertMouseMessage(&Msg, Injected, mi->dwExtraInfo); } if(mi->mouseData & XBUTTON2) { gQueueKeyStateTable[VK_XBUTTON2] |= 0xc0; CurInfo->ButtonsDown |= MK_XBUTTON2; Msg.wParam = MAKEWPARAM(CurInfo->ButtonsDown, XBUTTON2); - co_MsqInsertMouseMessage(&Msg); + co_MsqInsertMouseMessage(&Msg, Injected, mi->dwExtraInfo); } } else if(mi->dwFlags & MOUSEEVENTF_XUP) @@ -1221,28 +1222,28 @@ IntMouseInput(MOUSEINPUT *mi) gQueueKeyStateTable[VK_XBUTTON1] &= ~0x80; CurInfo->ButtonsDown &= ~MK_XBUTTON1; Msg.wParam = MAKEWPARAM(CurInfo->ButtonsDown, XBUTTON1); - co_MsqInsertMouseMessage(&Msg); + co_MsqInsertMouseMessage(&Msg, Injected, mi->dwExtraInfo); } if(mi->mouseData & XBUTTON2) { gQueueKeyStateTable[VK_XBUTTON2] &= ~0x80; CurInfo->ButtonsDown &= ~MK_XBUTTON2; Msg.wParam = MAKEWPARAM(CurInfo->ButtonsDown, XBUTTON2); - co_MsqInsertMouseMessage(&Msg); + co_MsqInsertMouseMessage(&Msg, Injected, mi->dwExtraInfo); } } if(mi->dwFlags & MOUSEEVENTF_WHEEL) { Msg.message = WM_MOUSEWHEEL; Msg.wParam = MAKEWPARAM(CurInfo->ButtonsDown, mi->mouseData); - co_MsqInsertMouseMessage(&Msg); + co_MsqInsertMouseMessage(&Msg, Injected, mi->dwExtraInfo); } return TRUE; } BOOL FASTCALL -IntKeyboardInput(KEYBDINPUT *ki) +IntKeyboardInput(KEYBDINPUT *ki, BOOL Injected) { PUSER_MESSAGE_QUEUE FocusMessageQueue; MSG Msg; @@ -1346,6 +1347,7 @@ IntKeyboardInput(KEYBDINPUT *ki) KbdHookData.vkCode = vk_hook; KbdHookData.scanCode = ki->wScan; KbdHookData.flags = flags >> 8; + if (Injected) KbdHookData.flags |= LLKHF_INJECTED; KbdHookData.time = Msg.time; KbdHookData.dwExtraInfo = ki->dwExtraInfo; if (co_HOOK_CallHooks(WH_KEYBOARD_LL, HC_ACTION, Msg.message, (LPARAM) &KbdHookData)) @@ -1510,13 +1512,13 @@ NtUserSendInput( switch(SafeInput.type) { case INPUT_MOUSE: - if(IntMouseInput(&SafeInput.mi)) + if(IntMouseInput(&SafeInput.mi, TRUE)) { cnt++; } break; case INPUT_KEYBOARD: - if(IntKeyboardInput(&SafeInput.ki)) + if(IntKeyboardInput(&SafeInput.ki, TRUE)) { cnt++; } @@ -1541,4 +1543,280 @@ CLEANUP: END_CLEANUP; } +BOOL +FASTCALL +IntQueryTrackMouseEvent( + LPTRACKMOUSEEVENT lpEventTrack) +{ + PDESKTOP pDesk; + PTHREADINFO pti; + + pti = PsGetCurrentThreadWin32Thread(); + pDesk = pti->rpdesk; + + /* Always cleared with size set and return true. */ + RtlZeroMemory(lpEventTrack ,sizeof(TRACKMOUSEEVENT)); + lpEventTrack->cbSize = sizeof(TRACKMOUSEEVENT); + + if ( pDesk->dwDTFlags & (DF_TME_LEAVE|DF_TME_HOVER) && + pDesk->spwndTrack && + pti->MessageQueue == pDesk->spwndTrack->head.pti->MessageQueue ) + { + if ( pDesk->htEx != HTCLIENT ) + lpEventTrack->dwFlags |= TME_NONCLIENT; + + if ( pDesk->dwDTFlags & DF_TME_LEAVE ) + lpEventTrack->dwFlags |= TME_LEAVE; + + if ( pDesk->dwDTFlags & DF_TME_HOVER ) + { + lpEventTrack->dwFlags |= TME_HOVER; + lpEventTrack->dwHoverTime = pDesk->dwMouseHoverTime; + } + lpEventTrack->hwndTrack = UserHMGetHandle(pDesk->spwndTrack); + } + return TRUE; +} + +BOOL +FASTCALL +IntTrackMouseEvent( + LPTRACKMOUSEEVENT lpEventTrack) +{ + PDESKTOP pDesk; + PTHREADINFO pti; + PWND pWnd; + POINT point; + + pti = PsGetCurrentThreadWin32Thread(); + pDesk = pti->rpdesk; + + if (!(pWnd = UserGetWindowObject(lpEventTrack->hwndTrack))) + return FALSE; + + if ( pDesk->spwndTrack != pWnd || + (pDesk->htEx != HTCLIENT) ^ !!(lpEventTrack->dwFlags & TME_NONCLIENT) ) + { + if ( lpEventTrack->dwFlags & TME_LEAVE && !(lpEventTrack->dwFlags & TME_CANCEL) ) + { + UserPostMessage( lpEventTrack->hwndTrack, + lpEventTrack->dwFlags & TME_NONCLIENT ? WM_NCMOUSELEAVE : WM_MOUSELEAVE, + 0, 0); + } + DPRINT("IntTrackMouseEvent spwndTrack 0x%x pwnd 0x%x\n", pDesk->spwndTrack,pWnd); + return TRUE; + } + + /* Tracking spwndTrack same as pWnd */ + if ( lpEventTrack->dwFlags & TME_CANCEL ) // Canceled mode. + { + if ( lpEventTrack->dwFlags & TME_LEAVE ) + pDesk->dwDTFlags &= ~DF_TME_LEAVE; + + if ( lpEventTrack->dwFlags & TME_HOVER ) + { + if ( pDesk->dwDTFlags & DF_TME_HOVER ) + { // Kill hover timer. + IntKillTimer(pWnd, ID_EVENT_SYSTIMER_MOUSEHOVER, TRUE); + pDesk->dwDTFlags &= ~DF_TME_HOVER; + } + } + } + else // Not Canceled. + { + if ( lpEventTrack->dwFlags & TME_LEAVE ) + pDesk->dwDTFlags |= DF_TME_LEAVE; + + if ( lpEventTrack->dwFlags & TME_HOVER ) + { + pDesk->dwDTFlags |= DF_TME_HOVER; + + if ( !lpEventTrack->dwHoverTime || lpEventTrack->dwHoverTime == HOVER_DEFAULT ) + pDesk->dwMouseHoverTime = gspv.iMouseHoverTime; // use the system default hover time-out. + else + pDesk->dwMouseHoverTime = lpEventTrack->dwHoverTime; + // Start timer for the hover period. + IntSetTimer( pWnd, ID_EVENT_SYSTIMER_MOUSEHOVER, pDesk->dwMouseHoverTime, SystemTimerProc, TMRF_SYSTEM); + // Get windows thread message points. + point = pWnd->head.pti->ptLast; + // Set desktop mouse hover from the system default hover rectangle. + RECTL_vSetRect(&pDesk->rcMouseHover, + point.x - gspv.iMouseHoverWidth / 2, + point.y - gspv.iMouseHoverHeight / 2, + point.x + gspv.iMouseHoverWidth / 2, + point.y + gspv.iMouseHoverHeight / 2); + } + } + return TRUE; +} + +BOOL +APIENTRY +NtUserTrackMouseEvent( + LPTRACKMOUSEEVENT lpEventTrack) +{ + TRACKMOUSEEVENT saveTME; + BOOL Ret = FALSE; + + DPRINT("Enter NtUserTrackMouseEvent\n"); + UserEnterExclusive(); + + _SEH2_TRY + { + ProbeForRead(lpEventTrack, sizeof(TRACKMOUSEEVENT), 1); + RtlCopyMemory(&saveTME, lpEventTrack, sizeof(TRACKMOUSEEVENT)); + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + SetLastNtError(_SEH2_GetExceptionCode()); + _SEH2_YIELD(goto Exit;) + } + _SEH2_END; + + if ( saveTME.cbSize != sizeof(TRACKMOUSEEVENT) ) + { + EngSetLastError(ERROR_INVALID_PARAMETER); + goto Exit; + } + + if (saveTME.dwFlags & ~(TME_CANCEL|TME_QUERY|TME_NONCLIENT|TME_LEAVE|TME_HOVER) ) + { + EngSetLastError(ERROR_INVALID_FLAGS); + goto Exit; + } + + if ( saveTME.dwFlags & TME_QUERY ) + { + Ret = IntQueryTrackMouseEvent(&saveTME); + _SEH2_TRY + { + ProbeForWrite(lpEventTrack, sizeof(TRACKMOUSEEVENT), 1); + RtlCopyMemory(lpEventTrack, &saveTME, sizeof(TRACKMOUSEEVENT)); + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + SetLastNtError(_SEH2_GetExceptionCode()); + Ret = FALSE; + } + _SEH2_END; + } + else + { + Ret = IntTrackMouseEvent(&saveTME); + } + +Exit: + DPRINT("Leave NtUserTrackMouseEvent, ret=%i\n",Ret); + UserLeave(); + return Ret; +} + +extern MOUSEMOVEPOINT MouseHistoryOfMoves[]; +extern INT gcur_count; + +DWORD +APIENTRY +NtUserGetMouseMovePointsEx( + UINT cbSize, + LPMOUSEMOVEPOINT lpptIn, + LPMOUSEMOVEPOINT lpptOut, + int nBufPoints, + DWORD resolution) +{ + MOUSEMOVEPOINT Safeppt; + BOOL Hit; + INT Count = -1; + DECLARE_RETURN(DWORD); + + DPRINT("Enter NtUserGetMouseMovePointsEx\n"); + UserEnterExclusive(); + + if ((cbSize != sizeof(MOUSEMOVEPOINT)) || (nBufPoints < 0) || (nBufPoints > 64)) + { + EngSetLastError(ERROR_INVALID_PARAMETER); + RETURN( -1); + } + + if (!lpptIn || (!lpptOut && nBufPoints)) + { + EngSetLastError(ERROR_NOACCESS); + RETURN( -1); + } + + _SEH2_TRY + { + ProbeForRead( lpptIn, cbSize, 1); + RtlCopyMemory(&Safeppt, lpptIn, cbSize); + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + SetLastNtError(_SEH2_GetExceptionCode()); + _SEH2_YIELD(RETURN( -1)) + } + _SEH2_END; + + // http://msdn.microsoft.com/en-us/library/ms646259(v=vs.85).aspx + // This explains the math issues in transforming points. + Count = gcur_count; // FIFO is forward so retrieve backward. + Hit = FALSE; + do + { + if (Safeppt.x == 0 && Safeppt.y == 0) + break; // No test. + // Finds the point, it returns the last nBufPoints prior to and including the supplied point. + if (MouseHistoryOfMoves[Count].x == Safeppt.x && MouseHistoryOfMoves[Count].y == Safeppt.y) + { + if ( Safeppt.time ) // Now test time and it seems to be absolute. + { + if (Safeppt.time == MouseHistoryOfMoves[Count].time) + { + Hit = TRUE; + break; + } + else + { + if (--Count < 0) Count = 63; + continue; + } + } + Hit = TRUE; + break; + } + if (--Count < 0) Count = 63; + } + while ( Count != gcur_count); + + switch(resolution) + { + case GMMP_USE_DISPLAY_POINTS: + if (nBufPoints) + { + _SEH2_TRY + { + ProbeForWrite(lpptOut, cbSize, 1); + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + SetLastNtError(_SEH2_GetExceptionCode()); + _SEH2_YIELD(RETURN( -1)) + } + _SEH2_END; + } + Count = nBufPoints; + break; + case GMMP_USE_HIGH_RESOLUTION_POINTS: + break; + default: + EngSetLastError(ERROR_POINT_NOT_FOUND); + RETURN( -1); + } + + RETURN( Count); + +CLEANUP: + DPRINT("Leave NtUserGetMouseMovePointsEx, ret=%i\n",_ret_); + UserLeave(); + END_CLEANUP; +} + /* EOF */ diff --git a/reactos/subsystems/win32/win32k/ntuser/keyboard.c b/reactos/subsystems/win32/win32k/ntuser/keyboard.c index 49a65450be5..d0509ad1e7a 100644 --- a/reactos/subsystems/win32/win32k/ntuser/keyboard.c +++ b/reactos/subsystems/win32/win32k/ntuser/keyboard.c @@ -400,7 +400,30 @@ DWORD FASTCALL UserGetAsyncKeyState(DWORD key) return ret; } +/*********************************************************************** + * get_key_state + */ +WORD FASTCALL get_key_state(void) +{ + WORD ret = 0; + if (gpsi->aiSysMet[SM_SWAPBUTTON]) + { + if (UserGetAsyncKeyState(VK_RBUTTON) & 0x80) ret |= MK_LBUTTON; + if (UserGetAsyncKeyState(VK_LBUTTON) & 0x80) ret |= MK_RBUTTON; + } + else + { + if (UserGetAsyncKeyState(VK_LBUTTON) & 0x80) ret |= MK_LBUTTON; + if (UserGetAsyncKeyState(VK_RBUTTON) & 0x80) ret |= MK_RBUTTON; + } + if (UserGetAsyncKeyState(VK_MBUTTON) & 0x80) ret |= MK_MBUTTON; + if (UserGetAsyncKeyState(VK_SHIFT) & 0x80) ret |= MK_SHIFT; + if (UserGetAsyncKeyState(VK_CONTROL) & 0x80) ret |= MK_CONTROL; + if (UserGetAsyncKeyState(VK_XBUTTON1) & 0x80) ret |= MK_XBUTTON1; + if (UserGetAsyncKeyState(VK_XBUTTON2) & 0x80) ret |= MK_XBUTTON2; + return ret; +} SHORT APIENTRY diff --git a/reactos/subsystems/win32/win32k/ntuser/menu.c b/reactos/subsystems/win32/win32k/ntuser/menu.c index b205fd62ef3..2c2a18f001c 100644 --- a/reactos/subsystems/win32/win32k/ntuser/menu.c +++ b/reactos/subsystems/win32/win32k/ntuser/menu.c @@ -709,14 +709,14 @@ IntSetMenuItemInfo(PMENU_OBJECT MenuObject, PMENU_ITEM MenuItem, PROSMENUITEMINF { return FALSE; } - if( lpmii->fType & ~fTypeMask) + if (lpmii->fType & ~fTypeMask) { DbgPrint("IntSetMenuItemInfo invalid fType flags %x\n", lpmii->fType & ~fTypeMask); lpmii->fMask &= ~(MIIM_TYPE | MIIM_FTYPE); } - if(lpmii->fMask & MIIM_TYPE) + if (lpmii->fMask & MIIM_TYPE) { - if(lpmii->fMask & ( MIIM_STRING | MIIM_FTYPE | MIIM_BITMAP)) + if (lpmii->fMask & ( MIIM_STRING | MIIM_FTYPE | MIIM_BITMAP)) { DbgPrint("IntSetMenuItemInfo: Invalid combination of fMask bits used\n"); /* this does not happen on Win9x/ME */ @@ -2056,11 +2056,13 @@ NtUserHiliteMenuItem( if(!(Window = UserGetWindowObject(hWnd))) { + EngSetLastError(ERROR_INVALID_WINDOW_HANDLE); RETURN(FALSE); } if(!(Menu = UserGetMenuObject(hMenu))) { + EngSetLastError(ERROR_INVALID_MENU_HANDLE); RETURN(FALSE); } @@ -2228,6 +2230,9 @@ UserMenuItemInfo( NULL, &MenuItem, NULL) < 0) { EngSetLastError(ERROR_INVALID_PARAMETER); +// This will crash menu (line 80) correct_behavior test! +// "NT4 and below can't handle a bigger MENUITEMINFO struct" + //EngSetLastError(ERROR_MENU_ITEM_NOT_FOUND); return( FALSE); } diff --git a/reactos/subsystems/win32/win32k/ntuser/msgqueue.c b/reactos/subsystems/win32/win32k/ntuser/msgqueue.c index 16cd57889cd..60ff1f18a61 100644 --- a/reactos/subsystems/win32/win32k/ntuser/msgqueue.c +++ b/reactos/subsystems/win32/win32k/ntuser/msgqueue.c @@ -20,6 +20,8 @@ /* GLOBALS *******************************************************************/ static PAGED_LOOKASIDE_LIST MessageLookasideList; +MOUSEMOVEPOINT MouseHistoryOfMoves[64]; +INT gcur_count = 0; /* FUNCTIONS *****************************************************************/ @@ -189,7 +191,7 @@ MsqPostMouseMove(PUSER_MESSAGE_QUEUE MessageQueue, MSG* Msg) } VOID FASTCALL -co_MsqInsertMouseMessage(MSG* Msg) +co_MsqInsertMouseMessage(MSG* Msg, DWORD flags, ULONG_PTR dwExtraInfo) { LARGE_INTEGER LargeTickCount; MSLLHOOKSTRUCT MouseHookData; @@ -219,9 +221,9 @@ co_MsqInsertMouseMessage(MSG* Msg) break; } - MouseHookData.flags = 0; + MouseHookData.flags = flags; // LLMHF_INJECTED MouseHookData.time = Msg->time; - MouseHookData.dwExtraInfo = 0; + MouseHookData.dwExtraInfo = dwExtraInfo; /* If the hook procedure returned non zero, dont send the message */ if (co_HOOK_CallHooks(WH_MOUSE_LL, HC_ACTION, Msg->message, (LPARAM) &MouseHookData)) @@ -232,11 +234,22 @@ co_MsqInsertMouseMessage(MSG* Msg) if(!pwndDesktop) return; + /* Set hit somewhere on the desktop */ + pDesk = pwndDesktop->head.rpdesk; + pDesk->htEx = HTNOWHERE; + pDesk->spwndTrack = pwndDesktop; + /* Check if the mouse is captured */ Msg->hwnd = IntGetCaptureWindow(); if(Msg->hwnd != NULL) { pwnd = UserGetWindowObject(Msg->hwnd); + if ((pwnd->style & WS_VISIBLE) && + IntPtInWindow(pwnd, Msg->pt.x, Msg->pt.y)) + { + pDesk->htEx = HTCLIENT; + pDesk->spwndTrack = pwnd; + } } else { @@ -255,7 +268,6 @@ co_MsqInsertMouseMessage(MSG* Msg) IntPtInWindow(pwnd, Msg->pt.x, Msg->pt.y)) { Msg->hwnd = pwnd->head.h; - pDesk = pwnd->head.rpdesk; pDesk->htEx = HTCLIENT; pDesk->spwndTrack = pwnd; break; @@ -277,6 +289,13 @@ co_MsqInsertMouseMessage(MSG* Msg) MsqPostMessage(pwnd->head.pti->MessageQueue, Msg, TRUE, QS_MOUSEBUTTON); } } + + /* Do GetMouseMovePointsEx FIFO. */ + MouseHistoryOfMoves[gcur_count].x = Msg->pt.x; + MouseHistoryOfMoves[gcur_count].y = Msg->pt.y; + MouseHistoryOfMoves[gcur_count].time = Msg->time; + MouseHistoryOfMoves[gcur_count].dwExtraInfo = 0; // need to be passed from IntMouseInput mi.dwExtraInfo. + if (gcur_count++ == 64) gcur_count = 0; // 0 - 63 is 64, FIFO forwards. } // @@ -1276,7 +1295,7 @@ co_MsqPeekHardwareMessage(IN PUSER_MESSAGE_QUEUE MessageQueue, if (Remove) { RemoveEntryList(&CurrentMessage->ListEntry); - ClearMsgBitsMask(MessageQueue, CurrentMessage->QS_Flags); + ClearMsgBitsMask(MessageQueue, QS_INPUT); MsqDestroyMessage(CurrentMessage); } @@ -1336,7 +1355,7 @@ MsqPeekMessage(IN PUSER_MESSAGE_QUEUE MessageQueue, if (Remove) { RemoveEntryList(&CurrentMessage->ListEntry); - ClearMsgBitsMask(MessageQueue, CurrentMessage->QS_Flags); + ClearMsgBitsMask(MessageQueue, QS_POSTMESSAGE); MsqDestroyMessage(CurrentMessage); } return(TRUE); diff --git a/reactos/subsystems/win32/win32k/ntuser/ntstubs.c b/reactos/subsystems/win32/win32k/ntuser/ntstubs.c index 06b84793c87..e1ede5abb5f 100644 --- a/reactos/subsystems/win32/win32k/ntuser/ntstubs.c +++ b/reactos/subsystems/win32/win32k/ntuser/ntstubs.c @@ -277,56 +277,6 @@ NtUserGetImeHotKey( return 0; } - -DWORD -APIENTRY -NtUserGetMouseMovePointsEx( - UINT cbSize, - LPMOUSEMOVEPOINT lppt, - LPMOUSEMOVEPOINT lpptBuf, - int nBufPoints, - DWORD resolution) -{ - UserEnterExclusive(); - - if ((cbSize != sizeof(MOUSEMOVEPOINT)) || (nBufPoints < 0) || (nBufPoints > 64)) - { - UserLeave(); - EngSetLastError(ERROR_INVALID_PARAMETER); - return -1; - } - - _SEH2_TRY - { - ProbeForRead(lppt, cbSize, 1); - ProbeForWrite(lpptBuf, cbSize, 1); - } - _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) - { - SetLastNtError(_SEH2_GetExceptionCode()); - EngSetLastError(ERROR_NOACCESS); - } - _SEH2_END; - -/* - Call a subfunction of GetMouseMovePointsEx! - switch(resolution) - { - case GMMP_USE_DISPLAY_POINTS: - case GMMP_USE_HIGH_RESOLUTION_POINTS: - break; - default: - EngSetLastError(GMMP_ERR_POINT_NOT_FOUND); - return GMMP_ERR_POINT_NOT_FOUND; - } - */ - UNIMPLEMENTED - UserLeave(); - return -1; -} - - - BOOL APIENTRY NtUserImpersonateDdeClientWindow( @@ -586,17 +536,6 @@ NtUserSetThreadState( return 0; } -BOOL -APIENTRY -NtUserTrackMouseEvent( - LPTRACKMOUSEEVENT lpEventTrack) -{ - UNIMPLEMENTED - - return 0; -} - - DWORD APIENTRY NtUserUpdateInputContext( diff --git a/reactos/subsystems/win32/win32k/ntuser/simplecall.c b/reactos/subsystems/win32/win32k/ntuser/simplecall.c index e5243d93ad1..0a57ea7768c 100644 --- a/reactos/subsystems/win32/win32k/ntuser/simplecall.c +++ b/reactos/subsystems/win32/win32k/ntuser/simplecall.c @@ -473,7 +473,7 @@ NtUserCallTwoParam( RETURN( (DWORD_PTR)co_IntRegisterLogonProcess((HANDLE)Param1, (BOOL)Param2)); case TWOPARAM_ROUTINE_SETCURSORPOS: - RETURN( (DWORD_PTR)UserSetCursorPos((int)Param1, (int)Param2, FALSE)); + RETURN( (DWORD_PTR)UserSetCursorPos((int)Param1, (int)Param2)); case TWOPARAM_ROUTINE_UNHOOKWINDOWSHOOK: RETURN( IntUnhookWindowsHook((int)Param1, (HOOKPROC)Param2)); diff --git a/reactos/subsystems/win32/win32k/ntuser/timer.c b/reactos/subsystems/win32/win32k/ntuser/timer.c index 401caadd306..05a7cb649a6 100644 --- a/reactos/subsystems/win32/win32k/ntuser/timer.c +++ b/reactos/subsystems/win32/win32k/ntuser/timer.c @@ -17,6 +17,8 @@ #define NDEBUG #include +WORD FASTCALL get_key_state(void); + /* GLOBALS *******************************************************************/ static LIST_ENTRY TimersListHead; @@ -82,7 +84,7 @@ RemoveTimer(PTIMER pTmr) { /* Set the flag, it will be removed when ready */ RemoveEntryList(&pTmr->ptmrList); - if ((pTmr->pWnd == NULL) && (!(pTmr->flags & TMRF_SYSTEM))) + if ((pTmr->pWnd == NULL) && (!(pTmr->flags & TMRF_SYSTEM))) // System timers are reusable. { UINT_PTR IDEvent; @@ -287,7 +289,73 @@ SystemTimerProc(HWND hwnd, UINT_PTR idEvent, DWORD dwTime) { - DPRINT( "Timer Running!\n" ); + PDESKTOP pDesk; + PWND pWnd = NULL; + + if (hwnd) + { + pWnd = UserGetWindowObject(hwnd); + if (!pWnd) + { + DPRINT1( "System Timer Proc has invalid window handle! 0x%x Id: %d\n", hwnd, idEvent); + return; + } + } + else + { + DPRINT( "Windowless Timer Running!\n" ); + return; + } + + switch (idEvent) + { +/* + Used in NtUserTrackMouseEvent. + */ + case ID_EVENT_SYSTIMER_MOUSEHOVER: + { + POINT Point; + UINT Msg; + WPARAM wParam; + + pDesk = pWnd->head.rpdesk; + if ( pDesk->dwDTFlags & DF_TME_HOVER && + pWnd == pDesk->spwndTrack ) + { + Point = gpsi->ptCursor; + if ( IntPtInRect(&pDesk->rcMouseHover, Point) ) + { + if (pDesk->htEx == HTCLIENT) // In a client area. + { + wParam = get_key_state(); + Msg = WM_MOUSEHOVER; + + if (pWnd->ExStyle & WS_EX_LAYOUTRTL) + { + Point.x = pWnd->rcClient.right - Point.x - 1; + } + else + Point.x -= pWnd->rcClient.left; + Point.y -= pWnd->rcClient.top; + } + else + { + wParam = pDesk->htEx; // Need to support all HTXYZ hits. + Msg = WM_NCMOUSEHOVER; + } + UserPostMessage(hwnd, Msg, wParam, MAKELPARAM(Point.x, Point.y)); + pDesk->dwDTFlags &= ~DF_TME_HOVER; + break; // Kill this timer. + } + } + } + return; // Not this window so just return. + + default: + DPRINT1( "System Timer Proc invalid id %d!\n", idEvent ); + break; + } + IntKillTimer(pWnd, idEvent, TRUE); } VOID @@ -296,7 +364,9 @@ StartTheTimers(VOID) { // Need to start gdi syncro timers then start timer with Hang App proc // that calles Idle process so the screen savers will know to run...... - IntSetTimer(NULL, 0, 1000, SystemTimerProc, TMRF_RIT); + IntSetTimer(NULL, 0, 1000, HungAppSysTimerProc, TMRF_RIT); +// Test Timers +// IntSetTimer(NULL, 0, 1000, SystemTimerProc, TMRF_RIT); } UINT_PTR @@ -347,6 +417,13 @@ PostTimerMessages(PWND Window) pTmr->flags &= ~TMRF_READY; pti->cTimersReady++; Hit = TRUE; + // Now move this entry to the end of the list so it will not be + // called again in the next msg loop. + if (pLE != &TimersListHead) + { + RemoveEntryList(&pTmr->ptmrList); + InsertTailList(&TimersListHead, &pTmr->ptmrList); + } break; } diff --git a/reactos/subsystems/win32/win32k/ntuser/window.c b/reactos/subsystems/win32/win32k/ntuser/window.c index e94d19cf5b9..52de61e35c2 100644 --- a/reactos/subsystems/win32/win32k/ntuser/window.c +++ b/reactos/subsystems/win32/win32k/ntuser/window.c @@ -1692,7 +1692,7 @@ PWND FASTCALL IntCreateWindow(CREATESTRUCTW* Cs, DPRINT("Created object with handle %X\n", hWnd); if (NULL == pti->rpdesk->DesktopWindow) - { + { /*HACK! Helper for win32csr/desktopbg.c */ /* If there is no desktop window yet, we must be creating it */ pti->rpdesk->DesktopWindow = hWnd; pti->rpdesk->pDeskInfo->spwnd = pWnd; @@ -1891,7 +1891,7 @@ PWND FASTCALL IntCreateWindow(CREATESTRUCTW* Cs, return pWnd; AllocError: - + DPRINT1("IntCreateWindow Allocation Error.\n"); if(pWnd) UserDereferenceObject(pWnd); @@ -2575,7 +2575,7 @@ BOOLEAN FASTCALL co_UserDestroyWindow(PWND Window) msg.wParam = IntGetSysCursorInfo()->ButtonsDown; msg.lParam = MAKELPARAM(gpsi->ptCursor.x, gpsi->ptCursor.y); msg.pt = gpsi->ptCursor; - co_MsqInsertMouseMessage(&msg); + co_MsqInsertMouseMessage(&msg, 0, 0); if (!IntIsWindow(Window->head.h)) { From d234fd5fc87b76d9432982cdb452b5d44524ad8b Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Fri, 8 Apr 2011 21:09:07 +0000 Subject: [PATCH 101/317] [SNDVOL32] - Add english resources for sndvol32 - Enjoy ;) svn path=/trunk/; revision=51284 --- reactos/base/applications/sndvol32/lang/en-US.rc | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/reactos/base/applications/sndvol32/lang/en-US.rc b/reactos/base/applications/sndvol32/lang/en-US.rc index 43e8fd88e5b..89b60d65b05 100644 --- a/reactos/base/applications/sndvol32/lang/en-US.rc +++ b/reactos/base/applications/sndvol32/lang/en-US.rc @@ -41,3 +41,17 @@ BEGIN PUSHBUTTON "OK", IDOK, 114,226,50,14 PUSHBUTTON "Cancel", IDCANCEL, 168,226,50,14 END + +IDD_VOLUME_CTRL DIALOG 0, 0, 90, 150 +STYLE WS_POPUP | WS_BORDER +FONT 8, "MS Shell Dlg" +{ + LTEXT "Master", IDC_LINE_NAME, 4, 7, 100, 15 + CONTROL "", -1, "static", SS_ETCHEDHORZ | WS_CHILD | WS_VISIBLE, 4, 30, 82, 1 + LTEXT "Balance", -1, 4, 35, 80, 42 + LTEXT "Volume", -1, 4, 100, 77, 108 + CONTROL "", IDC_LINE_SLIDER_HORZ, "msctls_trackbar32", TBS_HORZ | TBS_AUTOTICKS | TBS_BOTH | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 25, 55, 85, 30 + CONTROL "", IDC_LINE_SLIDER_VERT, "msctls_trackbar32", TBS_VERT | TBS_AUTOTICKS | TBS_BOTH | TBS_DOWNISLEFT | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 32, 115, 30, 70 + CHECKBOX "&Mute", IDC_LINE_SWITCH, 4, 190, 90, 12 + CONTROL "", IDC_LINE_SEP, "static", SS_ETCHEDVERT | WS_CHILD | WS_VISIBLE, 130, 7, 1, 200 +} From fcdea4c19d615c4188f9f316b4d020ed3eca297c Mon Sep 17 00:00:00 2001 From: Olaf Siejka Date: Fri, 8 Apr 2011 21:57:32 +0000 Subject: [PATCH 102/317] [DOSKEY] - Polish translation by Adam "Saibman" Stachowicz [SNDREC32] - Polish translation by Adam "Saibman" Stachowicz [SNDVOL32] - Polish translation update by me [TRANSLATION] - Polish translation fixes (spelling, typos, grammar) and updates on multiple modules by Adam "Saibman" Stachowicz, few small corrections by me. See issue #6087 for more details. svn path=/trunk/; revision=51285 --- reactos/base/applications/cacls/lang/pl-PL.rc | 4 +- reactos/base/applications/calc/lang/pl-PL.rc | 5 +- .../cmdutils/doskey/lang/pl-PL.rc | 34 +++++++++++ .../applications/cmdutils/find/lang/pl-PL.rc | 2 +- .../applications/cmdutils/more/lang/pl-PL.rc | 2 +- .../base/applications/cmdutils/xcopy/Pl.rc | 2 +- .../base/applications/dxdiag/lang/pl-PL.rc | 5 +- .../base/applications/findstr/lang/pl-PL.rc | 2 +- .../games/solitaire/lang/pl-PL.rc | 5 +- .../base/applications/logoff/lang/pl-PL.rc | 2 +- reactos/base/applications/mmc/lang/pl-PL.rc | 2 +- .../mscutils/eventvwr/lang/pl-PL.rc | 2 +- .../mscutils/servman/lang/bg-BG.rc | 2 +- .../mscutils/servman/lang/pl-PL.rc | 8 +-- reactos/base/applications/mstsc/lang/pl-PL.rc | 7 ++- .../network/ipconfig/lang/pl-PL.rc | 2 +- .../base/applications/notepad/lang/pl-PL.rc | 6 +- reactos/base/applications/rapps/lang/pl-PL.rc | 13 ++-- .../base/applications/regedit/lang/pl-PL.rc | 26 ++++---- .../base/applications/sndrec32/lang/pl-PL.rc | 61 +++++++++++++++++++ .../base/applications/sndvol32/lang/pl-PL.rc | 15 +++++ reactos/base/shell/explorer-new/lang/pl-PL.rc | 2 +- reactos/base/shell/explorer/explorer-pl.rc | 2 +- reactos/dll/cpl/desk/lang/pl-PL.rc | 2 +- reactos/dll/win32/shell32/lang/pl-PL.rc | 19 +++--- 25 files changed, 175 insertions(+), 57 deletions(-) create mode 100644 reactos/base/applications/cmdutils/doskey/lang/pl-PL.rc create mode 100644 reactos/base/applications/sndrec32/lang/pl-PL.rc diff --git a/reactos/base/applications/cacls/lang/pl-PL.rc b/reactos/base/applications/cacls/lang/pl-PL.rc index 7d5437d4b0f..57adf1f71a6 100644 --- a/reactos/base/applications/cacls/lang/pl-PL.rc +++ b/reactos/base/applications/cacls/lang/pl-PL.rc @@ -2,7 +2,7 @@ * translated by TestamenT * testament@users.sourceforge.net * https://sourceforge.net/projects/reactospl - * + * updated by Saibamen - Adam Stachowicz (saibamenppl@gmail.com) (Apr, 2011) */ LANGUAGE LANG_POLISH, SUBLANG_DEFAULT @@ -13,7 +13,7 @@ BEGIN IDS_HELP, "Poka lub modyfikuj list kontroli dostpu (Access Control List) plikw\n\n\ CACLS nazwa pliku [/T] [/E] [/C] [/G uytkownik:dostp [...]] [/R uytkownik [...]]\n\ [/P uytkownik:dostp [...]] [/D uytkownik [...]]\n\ - filename Poka ACL.\n\ + nazwa pliku Poka ACL.\n\ /T Zmiana ACL okrelonych plikw w\n\ aktualnym katalogu i wszystkich podkatalogach.\n\ /E Umoliwia edycj listy ACL zamiast jej zamiany.\n\ diff --git a/reactos/base/applications/calc/lang/pl-PL.rc b/reactos/base/applications/calc/lang/pl-PL.rc index 59cf444ef50..182419c005a 100644 --- a/reactos/base/applications/calc/lang/pl-PL.rc +++ b/reactos/base/applications/calc/lang/pl-PL.rc @@ -3,6 +3,7 @@ * Use ReactOS forum PM or IRC to contact me * http://www.reactos.org * IRC: irc.freenode.net #reactos-pl; + * updated by Saibamen - Adam Stachowicz (saibamenppl@gmail.com) (Apr, 2011) */ LANGUAGE LANG_POLISH, SUBLANG_DEFAULT @@ -234,7 +235,7 @@ END IDD_DIALOG_CONVERSION DIALOGEX 0, 0, 320, 130 STYLE DS_SHELLFONT | WS_MINIMIZEBOX | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "ReactOS Calculator" +CAPTION "Kalkulator ReactOS" MENU IDR_MENU_STANDARD FONT 8, "MS Shell Dlg" BEGIN @@ -252,7 +253,7 @@ BEGIN BS_VCENTER | BS_NOTIFY | WS_TABSTOP,276,24,40,17 CONTROL "CE",IDC_BUTTON_CE,"Button",BS_OWNERDRAW | BS_CENTER | BS_VCENTER | BS_NOTIFY | WS_TABSTOP,232,24,40,17 - CONTROL "Back",IDC_BUTTON_BACK,"Button",BS_OWNERDRAW | + CONTROL "Wstecz",IDC_BUTTON_BACK,"Button",BS_OWNERDRAW | BS_CENTER | BS_VCENTER | BS_NOTIFY | WS_TABSTOP,188,24, 40,17 RTEXT "",IDC_TEXT_OUTPUT,4,4,312,12,SS_CENTERIMAGE, diff --git a/reactos/base/applications/cmdutils/doskey/lang/pl-PL.rc b/reactos/base/applications/cmdutils/doskey/lang/pl-PL.rc new file mode 100644 index 00000000000..f1f3715a164 --- /dev/null +++ b/reactos/base/applications/cmdutils/doskey/lang/pl-PL.rc @@ -0,0 +1,34 @@ +/* + * translated by Saibamen - Adam Stachowicz (Apr,2011) + * Use ReactOS forum PM, IRC or saibamenppl at gmail.com to contact me + * http://www.reactos.org + * IRC: irc.freenode.net #reactos-pl + */ + +LANGUAGE LANG_POLISH, SUBLANG_DEFAULT + +STRINGTABLE DISCARDABLE +BEGIN + +IDS_HELP, "Zarzdza ustawieniami linii komend, historii i makr.\n\ +\n\ +DOSKEY [/INSERT | /OVERSTRIKE] [/EXENAME=exe] [/HISTORY] [/LISTSIZE=rozmiar]\n\ + [/REINSTALL] [/MACROS[:exe | :ALL]] [/MACROFILE=plik] [macroname=[tekst]]\n\ +\n\ + /INSERT Wcza tryb wstawiania tekstu.\n\ + /OVERSTRIKE Wycza tryb nadpisywania tekstu.\n\ + /EXENAME=exename Ustawia nazw programu do przegldania/zmiany historii\n\ + i makra. Domylnie jest to cmd.exe.\n\ + /HISTORY Wywietla histori komend.\n\ + /LISTSIZE=rozmiar Ustawia ilo wywietlanych komend dla buforu historii.\n\ + /REINSTALL Czyci histori komend.\n\ + /MACROS Wywietla definicje makro.\n\ + /MACROS:exename Wywietla definicje makro dla okrelonego programu.\n\ + /MACROS:ALL Wywietla definicje makro dla wszystkich programw.\n\ + /MACROFILE=plik aduje definicje makro z pliku.\n\ + macroname Nazwa dla tworzonego makro.\n\ + tekst Okrela zastpczy tekst dla makro.\n" + +IDS_INVALID_MACRO_DEF, "Nieprawidowa definicja makro: %s\n" + +END diff --git a/reactos/base/applications/cmdutils/find/lang/pl-PL.rc b/reactos/base/applications/cmdutils/find/lang/pl-PL.rc index d32c94bc63b..fca0184c805 100644 --- a/reactos/base/applications/cmdutils/find/lang/pl-PL.rc +++ b/reactos/base/applications/cmdutils/find/lang/pl-PL.rc @@ -15,7 +15,7 @@ IDS_USAGE, "FIND: Wy /C Oblicza w ilu liniach pojawi si szukany cig znakw\n\ /I Ignoruje wielko liter\n\ /N Numeruje wywietlane linie, zaczynajc od 1\n\ - /V Wywietla te linie ktre nie zawieraj szukanego cigu znakw" + /V Wywietla te linie, ktre nie zawieraj szukanego cigu znakw" IDS_NO_SUCH_FILE, "FIND: %s: Plik nie zosta znaleziony\n" diff --git a/reactos/base/applications/cmdutils/more/lang/pl-PL.rc b/reactos/base/applications/cmdutils/more/lang/pl-PL.rc index 6e211669c7d..2a8d0a858b1 100644 --- a/reactos/base/applications/cmdutils/more/lang/pl-PL.rc +++ b/reactos/base/applications/cmdutils/more/lang/pl-PL.rc @@ -15,7 +15,7 @@ BEGIN MORE [Napd:][cieka]Nazwa pliku\n\n\ [Napd:][cieka]Nazwa pliku Plik, ktrego zawarto ma by wywietlona.\n\ Polecenie\t\t Polecenie, ktrego wynik ma by wywietlony.\n\n\ - Po wywietleniu ""-- Kontynuuj --"" moesz nacisn dowolny klawisz by przej na nastpn stron.\n" + Po wywietleniu ""-- Kontynuuj --"" moesz nacisn dowolny klawisz, aby przej na nastpn stron.\n" IDS_CONTINUE, " -- Kontynuuj (100%) -- " IDS_FILE_ACCESS, "Brak dostpu do pliku: %s." diff --git a/reactos/base/applications/cmdutils/xcopy/Pl.rc b/reactos/base/applications/cmdutils/xcopy/Pl.rc index 4bf0971c6ba..15ca1593193 100644 --- a/reactos/base/applications/cmdutils/xcopy/Pl.rc +++ b/reactos/base/applications/cmdutils/xcopy/Pl.rc @@ -70,7 +70,7 @@ Gdzie:\n\ [/U] Kopiuje tylko pliki, ktre ju istniej w miejscu docelowym\n\ [/R] Zastpuje pliki tylko do odczytu\n\ [/H] Kopiuje rwnie pliki ukryte i systemowe\n\ -[/C] Kontynuuje nawet jeeli podczas kopiowania wystpiy bdy\n\ +[/C] Kontynuuje nawet jeeli podczas kopiowania wystpiy bdy\n\ [/A] Kopiuje tylko pliki z atrybutem archiwalny\n\ [/M] Kopiuje tylko pliki z atrybutem archiwalny i usuwa ten atrybut\n\ [/D | /D:m-d-y] Kopiuje tylko nowe pliki lub te zmodifikowane po podanej dacie.\n\ diff --git a/reactos/base/applications/dxdiag/lang/pl-PL.rc b/reactos/base/applications/dxdiag/lang/pl-PL.rc index 74cb797e2ba..cf747597acc 100644 --- a/reactos/base/applications/dxdiag/lang/pl-PL.rc +++ b/reactos/base/applications/dxdiag/lang/pl-PL.rc @@ -1,5 +1,6 @@ /* * translated by Caemyr - Olaf Siejka (Apr,2008) + * updated by Saibamen - Adam Stachowicz (Apr, 2011) * Use ReactOS forum PM or IRC to contact me * http://www.reactos.org * IRC: irc.freenode.net #reactos-pl @@ -25,7 +26,7 @@ IDD_SYSTEM_DIALOG DIALOGEX DISCARDABLE 0, 0, 462, 190 STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN FONT 8, "MS Shell Dlg" BEGIN - LTEXT "Ten program dostarcza szczegowych danych o komponentach ReactX i sterownikach, zainstalowanych na twoim systemie..", -1, 10, 10, 443, 17 + LTEXT "Ten program dostarcza szczegowe dane o komponentach ReactX i sterownikach, zainstalowanych na twoim systemie..", -1, 10, 10, 443, 17 LTEXT "Jeli wiesz ju, gdzie tkwi bd, kliknij na odpowiedni zakadk. W innym wypadku moesz przej przez wszystkie zakadki przyciskiem Nastpna", -1, 10, 30, 443, 25 GROUPBOX "Informacje o systemie", -1, 10, 55, 443, 130, SS_RIGHT LTEXT "Data i czas:", -1, 70, 70, 80, 10, SS_RIGHT @@ -138,7 +139,7 @@ BEGIN LTEXT "", IDC_STATIC_ADAPTER_PROVIDER, 335, 75, 100, 10 GROUPBOX "ReactX-", -1, 10, 115, 450, 60 CONTROL "", IDC_SLIDER_DSOUND, "msctls_trackbar32", TBS_BOTTOM | TBS_AUTOTICKS | WS_TABSTOP, 120, 135, 80, 17 - RTEXT "Przyspiesznie sprztowe\nPoziom:", -1, 20, 135, 90, 20 + RTEXT "Przyspieszenie sprztowe\nPoziom:", -1, 20, 135, 90, 20 PUSHBUTTON "Testuj DirectSound", IDC_BUTTON_TESTDSOUND, 270, 134, 80, 14 GROUPBOX "Uwagi", -1, 10, 180, 450, 40 EDITTEXT IDC_TEXT_DSOUNDINFO, 20, 192, 432, 20, WS_DISABLED | WS_TABSTOP diff --git a/reactos/base/applications/findstr/lang/pl-PL.rc b/reactos/base/applications/findstr/lang/pl-PL.rc index d32c94bc63b..fca0184c805 100644 --- a/reactos/base/applications/findstr/lang/pl-PL.rc +++ b/reactos/base/applications/findstr/lang/pl-PL.rc @@ -15,7 +15,7 @@ IDS_USAGE, "FIND: Wy /C Oblicza w ilu liniach pojawi si szukany cig znakw\n\ /I Ignoruje wielko liter\n\ /N Numeruje wywietlane linie, zaczynajc od 1\n\ - /V Wywietla te linie ktre nie zawieraj szukanego cigu znakw" + /V Wywietla te linie, ktre nie zawieraj szukanego cigu znakw" IDS_NO_SUCH_FILE, "FIND: %s: Plik nie zosta znaleziony\n" diff --git a/reactos/base/applications/games/solitaire/lang/pl-PL.rc b/reactos/base/applications/games/solitaire/lang/pl-PL.rc index 8d4052000f5..74c57fba51c 100644 --- a/reactos/base/applications/games/solitaire/lang/pl-PL.rc +++ b/reactos/base/applications/games/solitaire/lang/pl-PL.rc @@ -3,6 +3,7 @@ * testament@users.sourceforge.net * https://sourceforge.net/projects/reactospl * updated by Caemyr (olaf_siejka@o2.pl), Nov, 2008 + * updated by Saibamen - Adam Stachowicz (saibamenppl@gmail.com) (Apr, 2011) */ LANGUAGE LANG_POLISH, SUBLANG_DEFAULT @@ -53,7 +54,7 @@ END STRINGTABLE BEGIN IDS_SOL_NAME "Pasjans" - IDS_SOL_ABOUT "Solitaire by J. Brown\n\nCardLib version 1.0." + IDS_SOL_ABOUT "Pasjans by J. Brown\n\nCardLib version 1.0." IDS_SOL_QUIT "Zakoczy aktualn gr?" IDS_SOL_WIN "Gratulacje, wygrae!" IDS_SOL_DEAL "Nowe rozdanie?" @@ -76,7 +77,7 @@ BEGIN POPUP "Pomo&c" BEGIN MENUITEM "&Spis treci\tF1", IDM_HELP_CONTENTS - MENUITEM "Solit&aire - informacje", IDM_HELP_ABOUT + MENUITEM "Pasj&ans - informacje", IDM_HELP_ABOUT END END diff --git a/reactos/base/applications/logoff/lang/pl-PL.rc b/reactos/base/applications/logoff/lang/pl-PL.rc index 9746433a9a4..319854c8b8a 100644 --- a/reactos/base/applications/logoff/lang/pl-PL.rc +++ b/reactos/base/applications/logoff/lang/pl-PL.rc @@ -14,7 +14,7 @@ IDS_USAGE, "Przerywa sesj /v\t\tWywietla informacj o wykonanej czynnoci.\n\ /?\t\tWywietla niniejsz pomoc.\n\n" -IDS_LOGOFF_REMOTE, "Przeywanie sesji na maszynie zdalnej." +IDS_LOGOFF_REMOTE, "Przerywanie sesji na maszynie zdalnej." IDS_LOGOFF_LOCAL, "Przerywanie niniejszej sesji na maszynie lokalnej." IDS_ILLEGAL_PARAM, "Nieprawidowy parametr\n" diff --git a/reactos/base/applications/mmc/lang/pl-PL.rc b/reactos/base/applications/mmc/lang/pl-PL.rc index e6a90d8d6bf..856c2b00940 100644 --- a/reactos/base/applications/mmc/lang/pl-PL.rc +++ b/reactos/base/applications/mmc/lang/pl-PL.rc @@ -14,7 +14,7 @@ BEGIN MENUITEM "Za&kocz\tAlt+F4", ID_FILE_EXIT END - POPUP "&Help" + POPUP "&Pomoc" BEGIN MENUITEM "Konsola Zarzdzania ReactOS - i&nformacje...", ID_HELP_ABOUT END diff --git a/reactos/base/applications/mscutils/eventvwr/lang/pl-PL.rc b/reactos/base/applications/mscutils/eventvwr/lang/pl-PL.rc index 01e4da59d60..9a14b680348 100644 --- a/reactos/base/applications/mscutils/eventvwr/lang/pl-PL.rc +++ b/reactos/base/applications/mscutils/eventvwr/lang/pl-PL.rc @@ -97,7 +97,7 @@ END STRINGTABLE BEGIN IDS_APP_TITLE "Podgld zdarze" - IDC_EVENTSTRINGIDNOTFOUND "Opis zdarzenia dla danego numeru ID: ( %lu ) nie zosta odnaleziony w rdle: ( %s ). Ten komputer moe nie miec wystarczajcych informacji w rejestrze albo bibliotek DLL by wywietli wiadomoci z komputera zdalnego." + IDC_EVENTSTRINGIDNOTFOUND "Opis zdarzenia dla danego numeru ID: ( %lu ) nie zosta odnaleziony w rdle: ( %s ). Ten komputer moe nie miec wystarczajcych informacji w rejestrze albo bibliotek DLL, aby wywietli wiadomoci z komputera zdalnego." IDC_EVENTLOG_ERROR_TYPE "Bd" IDC_EVENTLOG_WARNING_TYPE "Ostrzeenie" IDC_EVENTLOG_INFORMATION_TYPE "Informacja" diff --git a/reactos/base/applications/mscutils/servman/lang/bg-BG.rc b/reactos/base/applications/mscutils/servman/lang/bg-BG.rc index f38c64fc5f3..23271f57a3e 100644 --- a/reactos/base/applications/mscutils/servman/lang/bg-BG.rc +++ b/reactos/base/applications/mscutils/servman/lang/bg-BG.rc @@ -68,7 +68,7 @@ CAPTION " FONT 8, "MS Shell Dlg",0,0 STYLE DS_SHELLFONT | WS_BORDER | WS_DLGFRAME | WS_SYSMENU | DS_MODALFRAME BEGIN - LTEXT "Service Manager v0.5.1\nCopyright (C) 2005-2006\nby Ged Murphy (gedmurphy@gmail.com)", IDC_STATIC, 48, 7, 130, 26 + LTEXT "Service Manager v0.8\nCopyright (C) 2005-2007\nby Ged Murphy (gedmurphy@gmail.com)", IDC_STATIC, 48, 7, 130, 26 PUSHBUTTON "Close", IDOK, 75, 162, 44, 15 ICON IDI_SM_ICON, IDC_STATIC, 10, 10, 7, 30 EDITTEXT IDC_LICENSE_EDIT, 8, 44, 174, 107, WS_VISIBLE | WS_VSCROLL | WS_TABSTOP | ES_READONLY | ES_MULTILINE diff --git a/reactos/base/applications/mscutils/servman/lang/pl-PL.rc b/reactos/base/applications/mscutils/servman/lang/pl-PL.rc index df0759c7e9f..bd5e473dc6e 100644 --- a/reactos/base/applications/mscutils/servman/lang/pl-PL.rc +++ b/reactos/base/applications/mscutils/servman/lang/pl-PL.rc @@ -4,7 +4,7 @@ * https://sourceforge.net/projects/reactospl * * updated by Caemyr - Olaf Siejka (Jan, 2008) - * updated by Saibamen - Adam Stachowicz (Mar, 2011) + * updated by Saibamen - Adam Stachowicz (saibamenppl@gmail.com) (Apr, 2011) */ LANGUAGE LANG_POLISH, SUBLANG_DEFAULT @@ -77,7 +77,7 @@ CAPTION "Mened FONT 8, "MS Shell Dlg",0,0 STYLE DS_SHELLFONT | WS_BORDER | WS_DLGFRAME | WS_SYSMENU | DS_MODALFRAME BEGIN - LTEXT "Meneder Usug v0.5.1\nCopyright (C) 2005-2006\nby Ged Murphy (gedmurphy@gmail.com)", IDC_STATIC, 48, 7, 135, 26 + LTEXT "Meneder Usug v0.8\nCopyright (C) 2005-2007\nby Ged Murphy (gedmurphy@gmail.com)", IDC_STATIC, 48, 7, 135, 26 PUSHBUTTON "Zamknij", IDOK, 75, 162, 44, 15 ICON IDI_SM_ICON, IDC_STATIC, 10, 10, 7, 30 EDITTEXT IDC_LICENSE_EDIT, 8, 44, 174, 107, WS_VISIBLE | WS_VSCROLL | WS_TABSTOP | ES_READONLY | ES_MULTILINE @@ -224,7 +224,7 @@ BEGIN IDS_CREATE_SUCCESS "Usuga utworzona pomylnie" IDS_DELETE_SUCCESS "Usuga skasowana pomylnie" IDS_CREATE_REQ "Pola oznaczone gwiazdkami\ns obowizkowe" - IDS_DELETE_STOP "Musisz rcznie zatrzyma usug przed usuwaniem!" + IDS_DELETE_STOP "Musisz rcznie zatrzyma usug przed usuniciem!" END STRINGTABLE DISCARDABLE @@ -287,7 +287,7 @@ BEGIN IDS_HINT_SYS_MOVE " Przesu to okno." IDS_HINT_SYS_SIZE " Zmienia wielko tego okna." IDS_HINT_SYS_MINIMIZE " Ukryj to okno do ikony." - IDS_HINT_SYS_MAXIMIZE " Rozwi to okno na peen ekran." + IDS_HINT_SYS_MAXIMIZE " Rozwi to okno na peny ekran." IDS_HINT_SYS_CLOSE " Zamknij to okno." END diff --git a/reactos/base/applications/mstsc/lang/pl-PL.rc b/reactos/base/applications/mstsc/lang/pl-PL.rc index c40a2d2f77c..f81062037be 100644 --- a/reactos/base/applications/mstsc/lang/pl-PL.rc +++ b/reactos/base/applications/mstsc/lang/pl-PL.rc @@ -3,6 +3,7 @@ * Use ReactOS forum PM or IRC to contact me * http://www.reactos.org * IRC: irc.freenode.net #reactos-pl; + * updated by Saibamen - Adam Stachowicz (saibamenppl@gmail.com) (Apr, 2011) */ LANGUAGE LANG_POLISH, SUBLANG_DEFAULT @@ -22,7 +23,7 @@ BEGIN PUSHBUTTON "Zapisz jako...",IDC_SAVEAS,123,139,50,14 PUSHBUTTON "Otwrz...",IDC_OPEN,177,139,50,14 ICON "", IDC_CONNICON, 16,114,20,20 - LTEXT "Zapisz obecne poczenie albo otwrz istniejcy ju plik z ustawieniami",IDC_STATIC,50,115,172,20 + LTEXT "Zapisz obecne poczenie albo otwrz ju istniejcy plik z ustawieniami",IDC_STATIC,50,115,172,20 END IDD_DISPLAY DIALOGEX 0, 0, 242, 175 @@ -33,7 +34,7 @@ BEGIN GROUPBOX "Liczba kolorw",IDC_STATIC,7,83,228,85 ICON "", IDC_REMICON, 15,19,20,20 ICON "", IDC_COLORSICON, 15,98,20,20 - LTEXT "Ustaw rozmiar twojego pulpitu zdalnego. Przesu suwak do koca w prawo by uruchomi pulpit na penym ekranie",IDC_STATIC,53,22,175,21 + LTEXT "Ustaw rozmiar twojego pulpitu zdalnego. Przesu suwak do koca w prawo, aby uruchomi pulpit na penym ekranie",IDC_STATIC,53,22,175,21 CONTROL "", IDC_GEOSLIDER, "msctls_trackbar32", TBS_AUTOTICKS | WS_TABSTOP, 56, 42, 124, 17 COMBOBOX IDC_BPPCOMBO,56,102,128,80, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP CONTROL "",IDC_COLORIMAGE,"Static",SS_OWNERDRAW | SS_SUNKEN, 56,121,127,10 @@ -45,7 +46,7 @@ END IDD_CONNECTDIALOG DIALOGEX 0, 0, 260, 262 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Remote Desktop Connection" +CAPTION "Poczenie pulpitu zdalnego" FONT 8, "MS Shell Dlg", 400, 0, 0x1 BEGIN DEFPUSHBUTTON "Pocz",IDOK,147,245,50,14 diff --git a/reactos/base/applications/network/ipconfig/lang/pl-PL.rc b/reactos/base/applications/network/ipconfig/lang/pl-PL.rc index a7813531024..6f813597f13 100644 --- a/reactos/base/applications/network/ipconfig/lang/pl-PL.rc +++ b/reactos/base/applications/network/ipconfig/lang/pl-PL.rc @@ -64,7 +64,7 @@ BEGIN \n \ Przykady:\n \ > ipconfig ... Pokazuje informacje.\n \ - > ipconfig /all ... Pokazuje informacje szczegowe.\n \ + > ipconfig /all ... Pokazuje szczegowe informacje.\n \ > ipconfig /renew ... Odnawia wszystkie karty.\n \ > ipconfig /renew EL* ... Odnawia kade poczenie o nazwie\n \ zaczynajcej si od EL\n \ diff --git a/reactos/base/applications/notepad/lang/pl-PL.rc b/reactos/base/applications/notepad/lang/pl-PL.rc index bab9bcabdb1..a99bf7515d2 100644 --- a/reactos/base/applications/notepad/lang/pl-PL.rc +++ b/reactos/base/applications/notepad/lang/pl-PL.rc @@ -153,10 +153,10 @@ END IDD_ABOUTBOX DIALOGEX DISCARDABLE 22,16,284,170 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_CAPTION | WS_SYSMENU -CAPTION "ReactOS Notatnik" +CAPTION "Notatnik ReactOS" FONT 8, "MS Shell Dlg" BEGIN - CONTROL "ReactOS Notatnik v1.0\r\nCopyright 1997,98 Marcel Baur \r\nCopyright 2000 Mike McCormack \r\nCopyright 2002 Sylvain Petreolle \r\nCopyright 2002 Andriy Palamarchuk\r\n ", + CONTROL "Notatnik ReactOS v1.0\r\nCopyright 1997,98 Marcel Baur \r\nCopyright 2000 Mike McCormack \r\nCopyright 2002 Sylvain Petreolle \r\nCopyright 2002 Andriy Palamarchuk\r\n ", -1,"Static",SS_LEFTNOWORDWRAP | WS_GROUP,46,7,232,39 CONTROL " ", -1,"Static",0x50000000,8,48,272,11 @@ -209,5 +209,5 @@ STRING_UTF8, "UTF-8" STRING_CRLF, "Windows" STRING_LF, "Unix" STRING_CR, "Mac" -STRING_LINE_COLUMN, "Line %d, column %d" +STRING_LINE_COLUMN, "Linia %d, kolumna %d" END diff --git a/reactos/base/applications/rapps/lang/pl-PL.rc b/reactos/base/applications/rapps/lang/pl-PL.rc index 5b68948a7e7..a5998f958f0 100644 --- a/reactos/base/applications/rapps/lang/pl-PL.rc +++ b/reactos/base/applications/rapps/lang/pl-PL.rc @@ -1,4 +1,5 @@ // * translated by Caemyr - Olaf Siejka (Aug, 2009) +// * updated by Saibamen - Adam Stachowicz (saibamenppl@gmail.com) (Apr, 2011) LANGUAGE LANG_POLISH, SUBLANG_DEFAULT @@ -41,7 +42,7 @@ BEGIN POPUP "popup" BEGIN MENUITEM "&Instaluj", ID_INSTALL - MENUITEM "&odinstaluj", ID_UNINSTALL + MENUITEM "&Odinstaluj", ID_UNINSTALL MENUITEM "&Modyfikuj", ID_MODIFY MENUITEM SEPARATOR MENUITEM "&Usu z rejestru", ID_REGREMOVE @@ -78,7 +79,7 @@ FONT 8, "MS Shell Dlg" BEGIN LTEXT "...", IDC_INSTALL_TEXT, 4, 5, 209, 35 - AUTORADIOBUTTON "&Zainstaluj z dysku (CD or DVD)", IDC_CD_INSTALL, 10, 46, 197, 11, WS_GROUP + AUTORADIOBUTTON "&Zainstaluj z dysku (CD lub DVD)", IDC_CD_INSTALL, 10, 46, 197, 11, WS_GROUP AUTORADIOBUTTON "&Pobierz i zainstaluj", IDC_DOWNLOAD_INSTALL, 10, 59, 197, 11, NOT WS_TABSTOP PUSHBUTTON "OK", IDOK, 86, 78, 60, 14 @@ -100,7 +101,7 @@ STYLE DS_SHELLFONT | WS_BORDER | WS_DLGFRAME | WS_SYSMENU | DS_MODALFRAME CAPTION "O programie" FONT 8, "MS Shell Dlg" BEGIN - LTEXT "ReactOS Applications Manager\nCopyright (C) 2009\nby Dmitry Chapyshev (dmitry@reactos.org)", IDC_STATIC, 48, 7, 130, 39 + LTEXT "Meneder aplikacji ReactOS\nCopyright (C) 2009\nby Dmitry Chapyshev (dmitry@reactos.org)", IDC_STATIC, 48, 7, 130, 39 PUSHBUTTON "Zamknij", IDOK, 133, 46, 50, 14 ICON IDI_MAIN, IDC_STATIC, 10, 10, 7, 30 END @@ -180,15 +181,15 @@ BEGIN IDS_MODIFY "Modyfikuj" IDS_APPS_COUNT "Licznik aplikacji: %d" IDS_WELCOME_TITLE "Witamy w Menederze aplikacji ReactOS!\n\n" - IDS_WELCOME_TEXT "Z listy po lewej wybierz kategori, a nastpnie aplikacj by j zainstalowa lub odinstalowa.\nStrona projektu ReactOS: " + IDS_WELCOME_TEXT "Z listy po lewej wybierz kategori, a nastpnie aplikacj, by j zainstalowa lub odinstalowa.\nStrona projektu ReactOS: " IDS_WELCOME_URL "http://www.reactos.org" IDS_INSTALLED "Zainstalowane" IDS_AVAILABLEFORINST "Dostpne" IDS_UPDATES "Uaktualnienia" IDS_APPLICATIONS "Aplikacje" - IDS_CHOOSE_FOLDER_TEXT "Wybierz katalog w ktrym bda zapisywane pobrane programy:" + IDS_CHOOSE_FOLDER_TEXT "Wybierz katalog, w ktrym bda zapisywane pobrane programy:" IDS_CHOOSE_FOLDER_ERROR "Wybrae nieistniejcy katalog! Czy chcesz utworzy nowy?" - IDS_USER_NOT_ADMIN "Musisz mie uprawnienia administratora aby uruchomi ""ReactOS Applications Manager""!" + IDS_USER_NOT_ADMIN "Musisz mie uprawnienia administratora, aby uruchomi ""Meneder aplikacji ReactOS""!" IDS_APP_REG_REMOVE "Czy na pewno chcesz usun wpis tego programu z rejestru?" IDS_INFORMATION "Informacja" IDS_UNABLE_TO_REMOVE "Nie mona byo usun wpisu z rejestru!" diff --git a/reactos/base/applications/regedit/lang/pl-PL.rc b/reactos/base/applications/regedit/lang/pl-PL.rc index 4f864f3df01..50087cfe068 100644 --- a/reactos/base/applications/regedit/lang/pl-PL.rc +++ b/reactos/base/applications/regedit/lang/pl-PL.rc @@ -8,6 +8,8 @@ * http://www.reactos.org * IRC: irc.freenode.net #reactos-pl; * + * updated by Saibamen - Adam Stachowicz (saibamenppl@gmail.com) (Apr, 2011) + * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either @@ -169,12 +171,12 @@ BEGIN END POPUP "" BEGIN - MENUITEM "C&ut", ID_HEXEDIT_CUT - MENUITEM "&Copy", ID_HEXEDIT_COPY - MENUITEM "&Paste", ID_HEXEDIT_PASTE - MENUITEM "&Delete", ID_HEXEDIT_DELETE + MENUITEM "W&ytnij", ID_HEXEDIT_CUT + MENUITEM "&Kopiuj", ID_HEXEDIT_COPY + MENUITEM "&Wklej", ID_HEXEDIT_PASTE + MENUITEM "&Usu", ID_HEXEDIT_DELETE MENUITEM SEPARATOR - MENUITEM "Select &All", ID_HEXEDIT_SELECT_ALL + MENUITEM "Zaznacz &cao", ID_HEXEDIT_SELECT_ALL END END @@ -184,13 +186,13 @@ END */ IDD_LOADHIVE DIALOGEX DISCARDABLE 0, 0, 193, 34 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Load Hive" +CAPTION "aduj drzewo" FONT 8, "Ms Shell Dlg" { - LTEXT "&Key:", IDC_STATIC, 4, 4, 15, 8, SS_LEFT + LTEXT "&Klucz:", IDC_STATIC, 4, 4, 15, 8, SS_LEFT EDITTEXT IDC_EDIT_KEY, 23, 2, 167, 13 DEFPUSHBUTTON "OK", IDOK, 140, 17, 50, 14 - PUSHBUTTON "Cancel", IDCANCEL, 89, 17, 50, 14 + PUSHBUTTON "Anuluj", IDCANCEL, 89, 17, 50, 14 } IDD_EDIT_STRING DIALOGEX 32, 24, 252, 84 @@ -292,9 +294,9 @@ BEGIN ID_REGISTRY_EXPORTREGISTRYFILE "Eksportuje cao lub cz rejestru do pliku" ID_REGISTRY_LOADHIVE - "Loads a hive file into the registry" + "aduje plik Drzewa do rejestru" ID_REGISTRY_UNLOADHIVE - "Unloads a hive from the registry" + "Wyadowuje Drzewo z rejestru" ID_REGISTRY_CONNECTNETWORKREGISTRY "Poczenie z rejestrem zdalnego komputera" ID_REGISTRY_DISCONNECTNETWORKREGISTRY @@ -351,8 +353,8 @@ BEGIN IDS_MY_COMPUTER "Mj komputer" IDS_IMPORT_REG_FILE "Importuj plik rejestru" IDS_EXPORT_REG_FILE "Eksportuj plik rejestru" - IDS_LOAD_HIVE "Load Hive" - IDS_UNLOAD_HIVE "Unload Hive" + IDS_LOAD_HIVE "aduj Drzewo" + IDS_UNLOAD_HIVE "Wyaduj Drzewo" IDS_INVALID_DWORD "(niewaciwa warto DWORD)" END diff --git a/reactos/base/applications/sndrec32/lang/pl-PL.rc b/reactos/base/applications/sndrec32/lang/pl-PL.rc new file mode 100644 index 00000000000..ea1e4f227b4 --- /dev/null +++ b/reactos/base/applications/sndrec32/lang/pl-PL.rc @@ -0,0 +1,61 @@ +/* + * translated by Saibamen - Adam Stachowicz (Apr,2011) + * Use ReactOS forum PM, IRC or saibamenppl at gmail.com to contact me + * http://www.reactos.org + * IRC: irc.freenode.net #reactos-pl; + */ + +LANGUAGE LANG_POLISH, SUBLANG_DEFAULT + +IDC_REACTOS_SNDREC32 ACCELERATORS +BEGIN + "?", IDM_ABOUT, ASCII, ALT + "/", IDM_ABOUT, ASCII, ALT +END + +IDD_ABOUTBOX DIALOGEX 0, 0, 196, 75 +STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Informacje o reactOS_sndrec32" +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + ICON 128,IDC_REACTOS_SNDREC32,19,14,21,20 + LTEXT "ReactOS_sndrec32, wersja 1.0",IDC_STATIC,56,16,114,8,SS_NOPREFIX + LTEXT "Copyright (C) 2009",IDC_STATIC,55,25,114,8 + DEFPUSHBUTTON "OK",IDOK,139,54,50,14,WS_GROUP +END + +IDR_MENU1 MENU +BEGIN + POPUP "Plik" + BEGIN + MENUITEM "Nowy", ID_NEW + MENUITEM "Otwrz...", ID_FILE_OPEN + MENUITEM "Zapisz", ID_FILE_SAVE, GRAYED + MENUITEM "Zapisz jako...", ID_FILE_SAVEAS, GRAYED + MENUITEM SEPARATOR + MENUITEM "Wyjcie", ID_EXIT + END + MENUITEM "todo1", 0 + MENUITEM "todo2", 0 + POPUP "?" + BEGIN + MENUITEM "O programie...", ID__ABOUT + END +END + +STRINGTABLE +BEGIN + IDS_APP_TITLE "Rejestrator dwiku" + IDC_REACTOS_SNDREC32 "REACTOS_SNDREC32" +END + +STRINGTABLE +BEGIN + IDS_STRPOS "Pozycja: %.2f s" + IDS_STRDUR "Dugo: %.2f s" + IDS_STRBUF "Bufor: %.2f kb" + IDS_STRFMT "%.1f kHz %u bits" + IDS_STRMONO "mono" + IDS_STRSTEREO "stereo" + IDS_STRCHAN "%s" +END diff --git a/reactos/base/applications/sndvol32/lang/pl-PL.rc b/reactos/base/applications/sndvol32/lang/pl-PL.rc index 23cc069d194..ca2b80e7c3e 100644 --- a/reactos/base/applications/sndvol32/lang/pl-PL.rc +++ b/reactos/base/applications/sndvol32/lang/pl-PL.rc @@ -2,6 +2,7 @@ * translated by TestamenT * testament@users.sourceforge.net * https://sourceforge.net/projects/reactospl + * Update by Caemyr - Olaf Siejka (Apr, 2011) * */ @@ -48,3 +49,17 @@ BEGIN PUSHBUTTON "OK", IDOK, 114,226,50,14 PUSHBUTTON "Anuluj", IDCANCEL, 168,226,50,14 END + +IDD_VOLUME_CTRL DIALOG 0, 0, 90, 150 +STYLE WS_POPUP | WS_BORDER +FONT 8, "MS Shell Dlg" +{ + LTEXT "Kana gwny", IDC_LINE_NAME, 4, 7, 100, 15 + CONTROL "", -1, "static", SS_ETCHEDHORZ | WS_CHILD | WS_VISIBLE, 4, 30, 82, 1 + LTEXT "Balans", -1, 4, 35, 80, 42 + LTEXT "Gono", -1, 4, 100, 77, 108 + CONTROL "", IDC_LINE_SLIDER_HORZ, "msctls_trackbar32", TBS_HORZ | TBS_AUTOTICKS | TBS_BOTH | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 25, 55, 85, 30 + CONTROL "", IDC_LINE_SLIDER_VERT, "msctls_trackbar32", TBS_VERT | TBS_AUTOTICKS | TBS_BOTH | TBS_DOWNISLEFT | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 32, 115, 30, 70 + CHECKBOX "&Wycisz", IDC_LINE_SWITCH, 4, 190, 90, 12 + CONTROL "", IDC_LINE_SEP, "static", SS_ETCHEDVERT | WS_CHILD | WS_VISIBLE, 130, 7, 1, 200 +} diff --git a/reactos/base/shell/explorer-new/lang/pl-PL.rc b/reactos/base/shell/explorer-new/lang/pl-PL.rc index 7b8e9de9cb6..224b7ab4eef 100644 --- a/reactos/base/shell/explorer-new/lang/pl-PL.rc +++ b/reactos/base/shell/explorer-new/lang/pl-PL.rc @@ -123,7 +123,7 @@ BEGIN IDS_PROPERTIES "Wa&ciwoci" IDS_OPEN_ALL_USERS "&Otwrz - wszyscy uytkownicy" IDS_EXPLORE_ALL_USERS "&Eksploruj - wszyscy uytkownicy" - IDS_STARTUP_ERROR "System nie moe uruchomi eksploratora poniewa rejestr jest niedostpny lub uszkodzony." + IDS_STARTUP_ERROR "System nie moe uruchomi eksploratora, poniewa rejestr jest niedostpny lub uszkodzony." END STRINGTABLE DISCARDABLE diff --git a/reactos/base/shell/explorer/explorer-pl.rc b/reactos/base/shell/explorer/explorer-pl.rc index 9dad38a8f7a..8624c4b6755 100644 --- a/reactos/base/shell/explorer/explorer-pl.rc +++ b/reactos/base/shell/explorer/explorer-pl.rc @@ -383,7 +383,7 @@ BEGIN IDS_TASKBAR "Pasek zada" IDS_NAMECOLUMN "Nazwa" IDS_PATHCOLUMN "cieka" - IDS_MENUCOLUMN "Menu path" + IDS_MENUCOLUMN "cieka menu" END #endif // Polish (PL) resources diff --git a/reactos/dll/cpl/desk/lang/pl-PL.rc b/reactos/dll/cpl/desk/lang/pl-PL.rc index 50f6ef58b4c..418502be1df 100644 --- a/reactos/dll/cpl/desk/lang/pl-PL.rc +++ b/reactos/dll/cpl/desk/lang/pl-PL.rc @@ -221,7 +221,7 @@ BEGIN IDS_COLOR_4BIT "16 kolorw" IDS_COLOR_8BIT "256 kolorw" IDS_COLOR_16BIT "High Color (16 Bitw)" - IDS_COLOR_24BIT "True Color (24 Bitw)" + IDS_COLOR_24BIT "True Color (24 Bity)" IDS_COLOR_32BIT "True Color (32 Bity)" IDS_PIXEL "%lux%lu pikseli" END diff --git a/reactos/dll/win32/shell32/lang/pl-PL.rc b/reactos/dll/win32/shell32/lang/pl-PL.rc index 588990e6fe3..2b1615b9721 100644 --- a/reactos/dll/win32/shell32/lang/pl-PL.rc +++ b/reactos/dll/win32/shell32/lang/pl-PL.rc @@ -21,6 +21,7 @@ * Use ReactOS forum PM or IRC to contact me * http://www.reactos.org * IRC: irc.freenode.net #reactos-pl; + * updated by Saibamen - Adam Stachowicz (saibamenppl@gmail.com) (Apr, 2011) */ LANGUAGE LANG_POLISH, SUBLANG_DEFAULT @@ -445,10 +446,10 @@ BEGIN PUSHBUTTON "&Nie", IDNO, 150, 122, 60, 14 PUSHBUTTON "Anuluj", IDCANCEL, 215, 122, 60, 14 ICON 146, -1, 11, 10, 21, 20, SS_REALSIZECONTROL - LTEXT "Ten katalog ju zawiera plik o nazwie '%2'.", 12291, 44, 10, 231, 22, SS_NOPREFIX - LTEXT "Ten katalog ju zawiera plik tylko do odczytu, o nazwie '%2'.", 12292, 41, 10, 222, 22, SS_NOPREFIX - LTEXT "Ten katalog ju zawiera plik systemowy o nazwie '%2'.", 12293, 41, 10, 222, 22, SS_NOPREFIX - LTEXT "Czy chciaby zastpi istniejcy plik?", -1, 44, 35, 228, 10, SS_NOPREFIX + LTEXT "Ten katalog zawiera ju plik o nazwie '%2'.", 12291, 44, 10, 231, 22, SS_NOPREFIX + LTEXT "Ten katalog zawiera ju plik tylko do odczytu, o nazwie '%2'.", 12292, 41, 10, 222, 22, SS_NOPREFIX + LTEXT "Ten katalog zawiera ju plik systemowy o nazwie '%2'.", 12293, 41, 10, 222, 22, SS_NOPREFIX + LTEXT "Czy chcesz zastpi istniejcy plik?", -1, 44, 35, 228, 10, SS_NOPREFIX LTEXT "(data i rozmiar nieznane)", 12302, 79, 51, 198, 20, SS_NOPREFIX ICON "", 12300, 50, 49, 21, 20, SS_REALSIZECONTROL LTEXT "nowym plikiem?", -1, 44, 75, 228, 10, SS_NOPREFIX @@ -541,9 +542,9 @@ CAPTION "Zamknij ReactOS" FONT 8, "MS Shell Dlg" BEGIN ICON 8240, -1, 6, 6, 21, 20, SS_REALSIZECONTROL | WS_GROUP - LTEXT "Co chcesz by komputer zrobi?", -1, 39, 7, 167, 10 + LTEXT "Co chcesz, aby zrobi komputer?", -1, 39, 7, 167, 10 COMBOBOX 8224, 39, 20, 165, 200, CBS_DROPDOWNLIST | WS_VSCROLL - LTEXT "Zachowuje sesje, utrzymujc komputer w ruchu na maym stopniu zasilania, z danymi wci w pamici. Komputer wrci do normalnego trybu pracy przy poruszeniu myszki albo naciniciu klawisza.", 8225, 39, 40, 167, 37 + LTEXT "Zachowuje sesj, podtrzymuje komputer na niskim poziomie poboru energii. Komputer wrci do normalnego trybu po poruszeniu myszk lub naciniciu klawisza. Dane znajdujce si w pamici zostan zachowane.", 8225, 39, 40, 167, 37 DEFPUSHBUTTON "OK", 1, 7, 82, 60, 14, WS_GROUP PUSHBUTTON "Anuluj", IDCANCEL, 75, 82, 60, 14 PUSHBUTTON "&Pomoc", IDHELP, 144, 82, 60, 14 @@ -660,9 +661,9 @@ BEGIN IDS_TRASHFOLDER_TEXT "Czy jeste pewien, e chcesz umieci folder '%1' i ca jego zawarto w koszu" IDS_TRASHMULTIPLE_TEXT "Elementw: %1 - czy na pewno chcesz je umieci w Koszu?" IDS_CANTTRASH_TEXT "Nie mog przenie elementu '%1' do Kosza. Czy chcesz go zamiast tego usun?" - IDS_OVERWRITEFILE_TEXT "Ten folder ju zawiera plik o nazwie '%1'.\n\nCzy chcesz go zastpi?" + IDS_OVERWRITEFILE_TEXT "Ten folder zawiera ju plik o nazwie '%1'.\n\nCzy chcesz go zastpi?" IDS_OVERWRITEFILE_CAPTION "Potwierd zastpienie pliku" - IDS_OVERWRITEFOLDER_TEXT "Ten folder ju zawiera folder o nazwie '%1'.\n\n"\ + IDS_OVERWRITEFOLDER_TEXT "Ten folder zawiera ju katalog o nazwie '%1'.\n\n"\ "Jeeli w docelowym folderze wystpi pliki o takich samych nazwach jak\n"\ "w wybranym folderze, to zostan one zastpione. Czy chcesz mimo to przenie\n"\ "lub skopiowa folder?" @@ -765,5 +766,5 @@ BEGIN IDS_DEFAULT_CLUSTER_SIZE "Domylny rozmiar jednostki alokacji" IDS_COPY_OF "Kopia" - IDS_SHLEXEC_NOASSOC "aden program nie jest skonfigurowane by otwiera pliki tego typu." + IDS_SHLEXEC_NOASSOC "aden program nie jest skonfigurowany, by otwiera pliki tego typu." END From a54b06c8cd7965b0dd865518e8c657614593a03c Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Fri, 8 Apr 2011 22:04:41 +0000 Subject: [PATCH 103/317] [SNDVOL32] - Always write line states configuration values in one step - Fixes the problem when old line state settings were not present - Advantage is that it is faster and sndvol32 now works in ReactOS svn path=/trunk/; revision=51286 --- reactos/base/applications/sndvol32/misc.c | 66 ++----------------- reactos/base/applications/sndvol32/sndvol32.c | 20 +++++- reactos/base/applications/sndvol32/sndvol32.h | 4 +- 3 files changed, 25 insertions(+), 65 deletions(-) diff --git a/reactos/base/applications/sndvol32/misc.c b/reactos/base/applications/sndvol32/misc.c index 48c1d955f3b..2eabfc9ed2c 100644 --- a/reactos/base/applications/sndvol32/misc.c +++ b/reactos/base/applications/sndvol32/misc.c @@ -160,13 +160,10 @@ CloseAppConfig(VOID) BOOL WriteLineConfig(IN LPTSTR szDeviceName, IN LPTSTR szLineName, - IN LPTSTR szControlName, - IN DWORD Flags) + IN PSNDVOL_REG_LINESTATE LineState, + IN DWORD cbSize) { HKEY hLineKey; - DWORD Type; - DWORD i, Size = 0; - PSNDVOL_REG_LINESTATE LineStates = NULL; TCHAR szDevRegKey[MAX_PATH]; BOOL Ret = FALSE; @@ -185,67 +182,14 @@ WriteLineConfig(IN LPTSTR szDeviceName, &hLineKey, NULL) == ERROR_SUCCESS) { - if (RegQueryValueEx(hLineKey, - LineStatesValue, - NULL, - &Type, - NULL, - &Size) != ERROR_SUCCESS || - Type != REG_BINARY || - Size == 0 || (Size % sizeof(SNDVOL_REG_LINESTATE) != 0)) - { - goto ExitClose; - } + /* now update line states */ + RegSetValueEx(hLineKey, LineStatesValue, 0, REG_BINARY, (const BYTE*)LineState, cbSize); + Ret = TRUE; - LineStates = HeapAlloc(GetProcessHeap(), - HEAP_ZERO_MEMORY, - Size); - - if (LineStates != NULL) - { - if (RegQueryValueEx(hLineKey, - LineStatesValue, - NULL, - &Type, - (LPBYTE)LineStates, - &Size) != ERROR_SUCCESS || - Type != REG_BINARY || - Size == 0 || (Size % sizeof(SNDVOL_REG_LINESTATE) != 0)) - { - goto ExitClose; - } - - /* try to find the control */ - for (i = 0; i < Size / sizeof(SNDVOL_REG_LINESTATE); i++) - { - if (!_tcscmp(szControlName, - LineStates[i].LineName)) - { - LineStates[i].Flags = Flags; - Ret = TRUE; - break; - } - } - - /* now update line states */ - if (Ret) - { - RegSetValueEx(hLineKey, LineStatesValue, 0, REG_BINARY, (const BYTE*)LineStates, Size); - } - } - -ExitClose: - HeapFree(GetProcessHeap(), - 0, - LineStates); RegCloseKey(hLineKey); } return Ret; - - - - } BOOL diff --git a/reactos/base/applications/sndvol32/sndvol32.c b/reactos/base/applications/sndvol32/sndvol32.c index df69bb9cf0a..895949cbc81 100644 --- a/reactos/base/applications/sndvol32/sndvol32.c +++ b/reactos/base/applications/sndvol32/sndvol32.c @@ -347,6 +347,7 @@ WriteLineSettings(PREFERENCES_CONTEXT Context, HWND hwndDlg) WCHAR LineName[MIXER_LONG_NAME_CHARS]; WCHAR DestinationName[MIXER_LONG_NAME_CHARS]; DWORD Flags; + PSNDVOL_REG_LINESTATE LineStates; /* get list view */ hwndControls = GetDlgItem(hwndDlg, IDC_CONTROLS); @@ -364,6 +365,14 @@ WriteLineSettings(PREFERENCES_CONTEXT Context, HWND hwndDlg) } /* allocate line states array */ + LineStates = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(SNDVOL_REG_LINESTATE) * Count); + if (LineStates == NULL) + { + /* failed to allocate line states array */ + return; + } + + for(Index = 0; Index < Count; Index++) { /* set to empty */ @@ -378,11 +387,18 @@ WriteLineSettings(PREFERENCES_CONTEXT Context, HWND hwndDlg) /* get check state */ Flags = (ListView_GetCheckState(hwndControls, Index) == 0 ? 0x4 : 0); - /* write configuration */ - WriteLineConfig(Preferences.DeviceName, DestinationName, LineName, Flags); + /* copy line name */ + wcscpy(LineStates[Index].LineName, LineName); + + /* store flags */ + LineStates[Index].Flags = Flags; } + /* now write the line config */ + WriteLineConfig(Preferences.DeviceName, DestinationName, LineStates, sizeof(SNDVOL_REG_LINESTATE) * Count); + /* free line states */ + HeapFree(GetProcessHeap(), 0, LineStates); } static INT_PTR CALLBACK diff --git a/reactos/base/applications/sndvol32/sndvol32.h b/reactos/base/applications/sndvol32/sndvol32.h index 520ff7d59ff..d6d3e10244f 100644 --- a/reactos/base/applications/sndvol32/sndvol32.h +++ b/reactos/base/applications/sndvol32/sndvol32.h @@ -160,7 +160,7 @@ ReadLineConfig(IN LPTSTR szDeviceName, BOOL WriteLineConfig(IN LPTSTR szDeviceName, IN LPTSTR szLineName, - IN LPTSTR szControlName, - IN DWORD Flags); + IN PSNDVOL_REG_LINESTATE LineState, + IN DWORD cbSize); #endif /* __SNDVOL32_H */ From 3fe212aea39872aa0fa360ba7db00e8f2a5b688b Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Fri, 8 Apr 2011 22:17:18 +0000 Subject: [PATCH 104/317] [SNDVOL32] - Fix mute switch control style svn path=/trunk/; revision=51287 --- reactos/base/applications/sndvol32/lang/en-US.rc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/base/applications/sndvol32/lang/en-US.rc b/reactos/base/applications/sndvol32/lang/en-US.rc index 89b60d65b05..1ab09241de0 100644 --- a/reactos/base/applications/sndvol32/lang/en-US.rc +++ b/reactos/base/applications/sndvol32/lang/en-US.rc @@ -52,6 +52,6 @@ FONT 8, "MS Shell Dlg" LTEXT "Volume", -1, 4, 100, 77, 108 CONTROL "", IDC_LINE_SLIDER_HORZ, "msctls_trackbar32", TBS_HORZ | TBS_AUTOTICKS | TBS_BOTH | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 25, 55, 85, 30 CONTROL "", IDC_LINE_SLIDER_VERT, "msctls_trackbar32", TBS_VERT | TBS_AUTOTICKS | TBS_BOTH | TBS_DOWNISLEFT | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 32, 115, 30, 70 - CHECKBOX "&Mute", IDC_LINE_SWITCH, 4, 190, 90, 12 + CHECKBOX "&Mute", IDC_LINE_SWITCH, 4, 190, 90, 12, BS_AUTOCHECKBOX CONTROL "", IDC_LINE_SEP, "static", SS_ETCHEDVERT | WS_CHILD | WS_VISIBLE, 130, 7, 1, 200 } From 6d9847ecb37be72c070c0c90a61fe8973af11e1e Mon Sep 17 00:00:00 2001 From: Sylvain Petreolle Date: Fri, 8 Apr 2011 22:40:12 +0000 Subject: [PATCH 105/317] [SNDVOL32] Update french translation. svn path=/trunk/; revision=51288 --- reactos/base/applications/sndvol32/lang/fr-FR.rc | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/reactos/base/applications/sndvol32/lang/fr-FR.rc b/reactos/base/applications/sndvol32/lang/fr-FR.rc index b2d32703fe9..0831863728d 100644 --- a/reactos/base/applications/sndvol32/lang/fr-FR.rc +++ b/reactos/base/applications/sndvol32/lang/fr-FR.rc @@ -42,3 +42,16 @@ BEGIN PUSHBUTTON "Annuler", IDCANCEL, 168,226,50,14 END +IDD_VOLUME_CTRL DIALOG 0, 0, 90, 150 +STYLE WS_POPUP | WS_BORDER +FONT 8, "MS Shell Dlg" +{ + LTEXT "Volume principal", IDC_LINE_NAME, 4, 7, 100, 15 + CONTROL "", -1, "static", SS_ETCHEDHORZ | WS_CHILD | WS_VISIBLE, 4, 30, 82, 1 + LTEXT "Balance", -1, 4, 35, 80, 42 + LTEXT "Volume", -1, 4, 100, 77, 108 + CONTROL "", IDC_LINE_SLIDER_HORZ, "msctls_trackbar32", TBS_HORZ | TBS_AUTOTICKS | TBS_BOTH | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 25, 55, 85, 30 + CONTROL "", IDC_LINE_SLIDER_VERT, "msctls_trackbar32", TBS_VERT | TBS_AUTOTICKS | TBS_BOTH | TBS_DOWNISLEFT | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 32, 115, 30, 70 + CHECKBOX "&Muet", IDC_LINE_SWITCH, 4, 190, 90, 12, BS_AUTOCHECKBOX + CONTROL "", IDC_LINE_SEP, "static", SS_ETCHEDVERT | WS_CHILD | WS_VISIBLE, 130, 7, 1, 200 +} From 02a6a17e28e340f9992c036683f9a37a72609417 Mon Sep 17 00:00:00 2001 From: Sylvain Petreolle Date: Fri, 8 Apr 2011 23:18:20 +0000 Subject: [PATCH 106/317] [SNDVOL32] Redraw window with correct size. Window height was growing after changing preferences. svn path=/trunk/; revision=51289 --- reactos/base/applications/sndvol32/dialog.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/reactos/base/applications/sndvol32/dialog.c b/reactos/base/applications/sndvol32/dialog.c index 63b3233b1bf..2b772b00f7c 100644 --- a/reactos/base/applications/sndvol32/dialog.c +++ b/reactos/base/applications/sndvol32/dialog.c @@ -130,11 +130,11 @@ AddDialogControl( } /* now create the window */ - hwnd = CreateWindowExW(DialogItem->dwExtendedStyle, - ClassName, - WindowName, - DialogItem->style, - rect.left, + hwnd = CreateWindowExW(DialogItem->dwExtendedStyle, + ClassName, + WindowName, + DialogItem->style, + rect.left, rect.top, rect.right, rect.bottom, @@ -187,7 +187,7 @@ AddDialogControl( Offset++; } - /* check if there is additional data */ + /* check if there is additional data */ if (*Offset == 0) { /* no additional data */ @@ -323,8 +323,8 @@ LoadDialog( BOOL CALLBACK EnumConnectionsCallback( - PSND_MIXER Mixer, - DWORD LineID, + PSND_MIXER Mixer, + DWORD LineID, LPMIXERLINE Line, PVOID Context) { @@ -439,7 +439,7 @@ EnumConnectionsCallback( GetWindowRect(PrefContext->MixerWindow->hWnd, &rect); /* now move the window */ - MoveWindow(PrefContext->MixerWindow->hWnd, rect.left, rect.top, (PrefContext->Count * DIALOG_VOLUME_SIZE), rect.bottom, TRUE); + MoveWindow(PrefContext->MixerWindow->hWnd, rect.left, rect.top, (PrefContext->Count * DIALOG_VOLUME_SIZE), rect.bottom - rect.top, TRUE); } } } From f78f9456fb0a4924c362db9c4e9181a5c3ebc7a1 Mon Sep 17 00:00:00 2001 From: James Tabor Date: Sat, 9 Apr 2011 07:08:17 +0000 Subject: [PATCH 107/317] [Win32k] - Added more missed mouse injection flag and extra data being passed in and from set cursor position. Wine mouse low level hook msg tests now see it and check the validity of the hook message. svn path=/trunk/; revision=51290 --- reactos/subsystems/win32/win32k/include/cursoricon.h | 2 +- reactos/subsystems/win32/win32k/ntuser/cursoricon.c | 6 +++--- reactos/subsystems/win32/win32k/ntuser/input.c | 2 +- reactos/subsystems/win32/win32k/ntuser/msgqueue.c | 2 +- reactos/subsystems/win32/win32k/ntuser/simplecall.c | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/reactos/subsystems/win32/win32k/include/cursoricon.h b/reactos/subsystems/win32/win32k/include/cursoricon.h index 8ee0ff873b7..90cb134ddd3 100644 --- a/reactos/subsystems/win32/win32k/include/cursoricon.h +++ b/reactos/subsystems/win32/win32k/include/cursoricon.h @@ -69,7 +69,7 @@ BOOL UserDrawIconEx(HDC hDc, INT xLeft, INT yTop, PCURICON_OBJECT pIcon, INT cxW INT cyHeight, UINT istepIfAniCur, HBRUSH hbrFlickerFreeDraw, UINT diFlags); PCURICON_OBJECT FASTCALL UserGetCurIconObject(HCURSOR hCurIcon); -BOOL UserSetCursorPos( INT x, INT y); +BOOL UserSetCursorPos( INT x, INT y, DWORD flags, ULONG_PTR dwExtraInfo); int UserShowCursor(BOOL bShow); diff --git a/reactos/subsystems/win32/win32k/ntuser/cursoricon.c b/reactos/subsystems/win32/win32k/ntuser/cursoricon.c index fb9dfeebf84..54033c258ef 100644 --- a/reactos/subsystems/win32/win32k/ntuser/cursoricon.c +++ b/reactos/subsystems/win32/win32k/ntuser/cursoricon.c @@ -159,7 +159,7 @@ UserSetCursor( return OldCursor; } -BOOL UserSetCursorPos( INT x, INT y) +BOOL UserSetCursorPos( INT x, INT y, DWORD flags, ULONG_PTR dwExtraInfo) { PWND DesktopWindow; PSYSTEM_CURSORINFO CurInfo; @@ -199,7 +199,7 @@ BOOL UserSetCursorPos( INT x, INT y) Msg.wParam = CurInfo->ButtonsDown; Msg.lParam = MAKELPARAM(x, y); Msg.pt = pt; - co_MsqInsertMouseMessage(&Msg, 0, 0); + co_MsqInsertMouseMessage(&Msg, flags, dwExtraInfo); /* 1. Store the new cursor position */ gpsi->ptCursor = pt; @@ -677,7 +677,7 @@ UserClipCursor( { CurInfo->bClipped = TRUE; RECTL_bIntersectRect(&CurInfo->rcClip, prcl, &DesktopWindow->rcWindow); - UserSetCursorPos(gpsi->ptCursor.x, gpsi->ptCursor.y); + UserSetCursorPos(gpsi->ptCursor.x, gpsi->ptCursor.y, 0, 0); } else { diff --git a/reactos/subsystems/win32/win32k/ntuser/input.c b/reactos/subsystems/win32/win32k/ntuser/input.c index 4c72c2e01f5..6d7d7eacbc3 100644 --- a/reactos/subsystems/win32/win32k/ntuser/input.c +++ b/reactos/subsystems/win32/win32k/ntuser/input.c @@ -1138,7 +1138,7 @@ IntMouseInput(MOUSEINPUT *mi, BOOL Injected) if(mi->dwFlags & MOUSEEVENTF_MOVE) { - UserSetCursorPos(MousePos.x, MousePos.y); + UserSetCursorPos(MousePos.x, MousePos.y, Injected, mi->dwExtraInfo); } if(mi->dwFlags & MOUSEEVENTF_LEFTDOWN) { diff --git a/reactos/subsystems/win32/win32k/ntuser/msgqueue.c b/reactos/subsystems/win32/win32k/ntuser/msgqueue.c index 60ff1f18a61..9f57375da83 100644 --- a/reactos/subsystems/win32/win32k/ntuser/msgqueue.c +++ b/reactos/subsystems/win32/win32k/ntuser/msgqueue.c @@ -294,7 +294,7 @@ co_MsqInsertMouseMessage(MSG* Msg, DWORD flags, ULONG_PTR dwExtraInfo) MouseHistoryOfMoves[gcur_count].x = Msg->pt.x; MouseHistoryOfMoves[gcur_count].y = Msg->pt.y; MouseHistoryOfMoves[gcur_count].time = Msg->time; - MouseHistoryOfMoves[gcur_count].dwExtraInfo = 0; // need to be passed from IntMouseInput mi.dwExtraInfo. + MouseHistoryOfMoves[gcur_count].dwExtraInfo = dwExtraInfo; if (gcur_count++ == 64) gcur_count = 0; // 0 - 63 is 64, FIFO forwards. } diff --git a/reactos/subsystems/win32/win32k/ntuser/simplecall.c b/reactos/subsystems/win32/win32k/ntuser/simplecall.c index 0a57ea7768c..c7de5ca265a 100644 --- a/reactos/subsystems/win32/win32k/ntuser/simplecall.c +++ b/reactos/subsystems/win32/win32k/ntuser/simplecall.c @@ -473,7 +473,7 @@ NtUserCallTwoParam( RETURN( (DWORD_PTR)co_IntRegisterLogonProcess((HANDLE)Param1, (BOOL)Param2)); case TWOPARAM_ROUTINE_SETCURSORPOS: - RETURN( (DWORD_PTR)UserSetCursorPos((int)Param1, (int)Param2)); + RETURN( (DWORD_PTR)UserSetCursorPos((int)Param1, (int)Param2, 0, 0)); case TWOPARAM_ROUTINE_UNHOOKWINDOWSHOOK: RETURN( IntUnhookWindowsHook((int)Param1, (HOOKPROC)Param2)); From 6301753d1df770e0aecea05f247b3e6bd597f071 Mon Sep 17 00:00:00 2001 From: Michael Martin Date: Sat, 9 Apr 2011 07:19:31 +0000 Subject: [PATCH 108/317] [Win32k] - Only call hooks and check if Win32Thread is in cleanup if the windows procedure is being called. - Set DispatchingListEntry.Flink to NULL. The real fix for bug 5580. This bug may be the cause of other crashes experienced by users just before loading desktop. Found by rafalh. svn path=/trunk/; revision=51291 --- .../subsystems/win32/win32k/ntuser/message.c | 25 +++++++++++-------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/reactos/subsystems/win32/win32k/ntuser/message.c b/reactos/subsystems/win32/win32k/ntuser/message.c index f2f5dae891d..ed7c718eea8 100644 --- a/reactos/subsystems/win32/win32k/ntuser/message.c +++ b/reactos/subsystems/win32/win32k/ntuser/message.c @@ -1403,17 +1403,8 @@ co_IntSendMessageWithCallBack( HWND hWnd, Win32Thread = PsGetCurrentThreadWin32Thread(); - IntCallWndProc( Window, hWnd, Msg, wParam, lParam); - if (Win32Thread == NULL) { - ASSERT(FALSE); - RETURN(FALSE); - } - - if (Win32Thread->TIF_flags & TIF_INCLEANUP) - { - /* Never send messages to exiting threads */ RETURN(FALSE); } @@ -1437,6 +1428,15 @@ co_IntSendMessageWithCallBack( HWND hWnd, /* If this is not a callback and it can be sent now, then send it. */ if ((Window->head.pti->MessageQueue == Win32Thread->MessageQueue) && (CompletionCallback == NULL)) { + if (Win32Thread->TIF_flags & TIF_INCLEANUP) + { + UnpackParam(lParamPacked, Msg, wParam, lParam, FALSE); + /* Never send messages to exiting threads */ + RETURN(FALSE); + } + + IntCallWndProc( Window, hWnd, Msg, wParam, lParam); + ObReferenceObject(Win32Thread->pEThread); Result = (ULONG_PTR)co_IntCallWindowProc( Window->lpfnWndProc, !Window->Unicode, @@ -1450,9 +1450,11 @@ co_IntSendMessageWithCallBack( HWND hWnd, *uResult = Result; } ObDereferenceObject(Win32Thread->pEThread); + + IntCallWndProcRet( Window, hWnd, Msg, wParam, lParam, (LRESULT *)uResult); } - IntCallWndProcRet( Window, hWnd, Msg, wParam, lParam, (LRESULT *)uResult); + if ((Window->head.pti->MessageQueue == Win32Thread->MessageQueue) && (CompletionCallback == NULL)) { @@ -1479,7 +1481,8 @@ co_IntSendMessageWithCallBack( HWND hWnd, Message->QS_Flags = 0; Message->SenderQueue = NULL; // mjmartin, you are right! This is null. Message->CallBackSenderQueue = Win32Thread->MessageQueue; - + Message->DispatchingListEntry.Flink = NULL; + IntReferenceMessageQueue(Window->head.pti->MessageQueue); Message->CompletionCallback = CompletionCallback; Message->CompletionCallbackContext = CompletionCallbackContext; From 39dac2cce0074dd819e1dabe8b5a684d1b8e7d9c Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Sat, 9 Apr 2011 10:36:25 +0000 Subject: [PATCH 109/317] [SNDVOL32] - Fix more subtle bugs: - Check with long line name if the current connection is activated when adding lines to dialog or when adding lines to the preferences dialog - Use the temporary preferences context when writing the line settings - Don't destroy the mixer when the preferences dialog is closed. the new mixer will be used for the application when the preferences are changed - Pass the current selected line to the preferences dialog svn path=/trunk/; revision=51292 --- reactos/base/applications/sndvol32/dialog.c | 2 +- reactos/base/applications/sndvol32/sndvol32.c | 46 +++++++++---------- reactos/base/applications/sndvol32/sndvol32.h | 3 +- 3 files changed, 23 insertions(+), 28 deletions(-) diff --git a/reactos/base/applications/sndvol32/dialog.c b/reactos/base/applications/sndvol32/dialog.c index 2b772b00f7c..a46b4a365a0 100644 --- a/reactos/base/applications/sndvol32/dialog.c +++ b/reactos/base/applications/sndvol32/dialog.c @@ -340,7 +340,7 @@ EnumConnectionsCallback( if (Line->cControls != 0) { /* get line name */ - if (SndMixerGetLineName(PrefContext->MixerWindow->Mixer, PrefContext->SelectedLine, LineName, MIXER_LONG_NAME_CHARS, FALSE) == -1) + if (SndMixerGetLineName(PrefContext->MixerWindow->Mixer, PrefContext->SelectedLine, LineName, MIXER_LONG_NAME_CHARS, TRUE) == -1) { /* failed to get line name */ LineName[0] = L'\0'; diff --git a/reactos/base/applications/sndvol32/sndvol32.c b/reactos/base/applications/sndvol32/sndvol32.c index 895949cbc81..87fc26a059e 100644 --- a/reactos/base/applications/sndvol32/sndvol32.c +++ b/reactos/base/applications/sndvol32/sndvol32.c @@ -199,7 +199,7 @@ PrefDlgAddConnection(PSND_MIXER Mixer, PrefContext->SelectedLine, LineName, MIXER_LONG_NAME_CHARS, - FALSE) == -1) + TRUE) == -1) { LineName[0] = TEXT('\0'); } @@ -340,7 +340,7 @@ UpdatePrefDlgControls(PPREFERENCES_CONTEXT Context, static VOID -WriteLineSettings(PREFERENCES_CONTEXT Context, HWND hwndDlg) +WriteLineSettings(PPREFERENCES_CONTEXT Context, HWND hwndDlg) { HWND hwndControls; INT Count, Index; @@ -358,7 +358,7 @@ WriteLineSettings(PREFERENCES_CONTEXT Context, HWND hwndDlg) /* sanity check */ assert(Count); - if (SndMixerGetLineName(Preferences.MixerWindow->Mixer, Preferences.SelectedLine, DestinationName, MIXER_LONG_NAME_CHARS, TRUE) == -1) + if (SndMixerGetLineName(Context->Mixer, Context->SelectedLine, DestinationName, MIXER_LONG_NAME_CHARS, TRUE) == -1) { /* failed to get destination line name */ return; @@ -395,7 +395,7 @@ WriteLineSettings(PREFERENCES_CONTEXT Context, HWND hwndDlg) } /* now write the line config */ - WriteLineConfig(Preferences.DeviceName, DestinationName, LineStates, sizeof(SNDVOL_REG_LINESTATE) * Count); + WriteLineConfig(Context->DeviceName, DestinationName, LineStates, sizeof(SNDVOL_REG_LINESTATE) * Count); /* free line states */ HeapFree(GetProcessHeap(), 0, LineStates); @@ -509,7 +509,7 @@ DlgPreferencesProc(HWND hwndDlg, case IDOK: { /* write line settings */ - WriteLineSettings(Preferences, hwndDlg); + WriteLineSettings(Context, hwndDlg); /* fall through */ } @@ -564,21 +564,10 @@ DlgPreferencesProc(HWND hwndDlg, /* update all controls */ UpdatePrefDlgControls(Context, - (DWORD)-1); + (DWORD)Context->SelectedLine); return TRUE; } - case WM_DESTROY: - { - Context = GetDialogData(hwndDlg, - PREFERENCES_CONTEXT); - if (Context->Mixer != NULL) - { - SndMixerDestroy(Context->Mixer); - } - break; - } - case WM_CLOSE: { EndDialog(hwndDlg, @@ -789,16 +778,17 @@ MainWindowProc(HWND hwnd, { case IDC_PROPERTIES: { - PREFERENCES_CONTEXT Preferences; + PREFERENCES_CONTEXT Pref; - Preferences.MixerWindow = MixerWindow; - Preferences.Mixer = NULL; + Pref.MixerWindow = MixerWindow; + Pref.Mixer = NULL; + Pref.SelectedLine = Preferences.SelectedLine; if (DialogBoxParam(hAppInstance, MAKEINTRESOURCE(IDD_PREFERENCES), hwnd, DlgPreferencesProc, - (LPARAM)&Preferences) == IDOK) + (LPARAM)&Pref) == IDOK) { /* update window */ TCHAR szProduct[MAXPNAMELEN]; @@ -820,11 +810,17 @@ MainWindowProc(HWND hwnd, /* destroy old status bar */ DestroyWindow(MixerWindow->hStatusBar); + /* update details */ + Preferences.SelectedLine = Pref.SelectedLine; + + /* destroy old mixer */ + SndMixerDestroy(Preferences.MixerWindow->Mixer); + + /* use new selected mixer */ + Preferences.MixerWindow->Mixer = Pref.Mixer; + /* rebuild dialog controls */ - if (RebuildMixerWindowControls(&Preferences)) - { - DPRINT("Rebuilding mixer window controls failed!\n"); - } + RebuildMixerWindowControls(&Preferences); /* create status window */ MixerWindow->hStatusBar = CreateStatusWindow(WS_VISIBLE | WS_CHILD | WS_CLIPSIBLINGS, diff --git a/reactos/base/applications/sndvol32/sndvol32.h b/reactos/base/applications/sndvol32/sndvol32.h index d6d3e10244f..b9a3ab43d2d 100644 --- a/reactos/base/applications/sndvol32/sndvol32.h +++ b/reactos/base/applications/sndvol32/sndvol32.h @@ -31,8 +31,7 @@ extern HANDLE hAppHeap; #define SZ_APP_CLASS TEXT("Volume Control") ULONG DbgPrint(PCH , ...); -#define DPRINT -//DbgPrint("SNDVOL32: %s:%i: ", __FILE__, __LINE__); DbgPrint +#define DPRINT DbgPrint("SNDVOL32: %s:%i: ", __FILE__, __LINE__); DbgPrint /* From f02f58236a43cb2602182a2f9d8c585faf55075f Mon Sep 17 00:00:00 2001 From: Matthias Kupfer Date: Sat, 9 Apr 2011 12:01:36 +0000 Subject: [PATCH 110/317] Command Prompt with translated window title - German translation added - other languages need to be translated (.rc files prepared) svn path=/trunk/; revision=51293 --- reactos/subsystems/win32/csrss/win32csr/console.c | 13 +++++++++++-- .../subsystems/win32/csrss/win32csr/lang/bg-BG.rc | 2 ++ .../subsystems/win32/csrss/win32csr/lang/de-DE.rc | 2 ++ .../subsystems/win32/csrss/win32csr/lang/el-GR.rc | 2 ++ .../subsystems/win32/csrss/win32csr/lang/en-US.rc | 2 ++ .../subsystems/win32/csrss/win32csr/lang/es-ES.rc | 2 ++ .../subsystems/win32/csrss/win32csr/lang/fr-FR.rc | 2 ++ .../subsystems/win32/csrss/win32csr/lang/id-ID.rc | 2 ++ .../subsystems/win32/csrss/win32csr/lang/it-IT.rc | 2 ++ .../subsystems/win32/csrss/win32csr/lang/ja-JP.rc | 2 ++ .../subsystems/win32/csrss/win32csr/lang/no-NO.rc | 2 ++ .../subsystems/win32/csrss/win32csr/lang/pl-PL.rc | 2 ++ .../subsystems/win32/csrss/win32csr/lang/ru-RU.rc | 2 ++ .../subsystems/win32/csrss/win32csr/lang/sk-SK.rc | 2 ++ .../subsystems/win32/csrss/win32csr/lang/uk-UA.rc | 2 ++ .../subsystems/win32/csrss/win32csr/lang/zh-CN.rc | 2 ++ .../subsystems/win32/csrss/win32csr/lang/zh-TW.rc | 2 ++ reactos/subsystems/win32/csrss/win32csr/resource.h | 2 ++ 18 files changed, 45 insertions(+), 2 deletions(-) diff --git a/reactos/subsystems/win32/csrss/win32csr/console.c b/reactos/subsystems/win32/csrss/win32csr/console.c index 2048d3bcbe5..99a622bb3b7 100644 --- a/reactos/subsystems/win32/csrss/win32csr/console.c +++ b/reactos/subsystems/win32/csrss/win32csr/console.c @@ -73,12 +73,21 @@ CsrInitConsole(PCSRSS_CONSOLE Console, BOOL Visible) SECURITY_ATTRIBUTES SecurityAttributes; PCSRSS_SCREEN_BUFFER NewBuffer; BOOL GuiMode; + WCHAR Title[255]; + HINSTANCE hInst; Console->Title.MaximumLength = Console->Title.Length = 0; Console->Title.Buffer = NULL; - //FIXME - RtlCreateUnicodeString(&Console->Title, L"Command Prompt"); + hInst = GetModuleHandleW(L"win32csr"); + if (LoadStringW(hInst,IDS_COMMAND_PROMPT,Title,sizeof(Title)/sizeof(Title[0]))) + { + RtlCreateUnicodeString(&Console->Title, Title); + } + else + { + RtlCreateUnicodeString(&Console->Title, L"Command Prompt"); + } Console->ReferenceCount = 0; Console->LineBuffer = NULL; diff --git a/reactos/subsystems/win32/csrss/win32csr/lang/bg-BG.rc b/reactos/subsystems/win32/csrss/win32csr/lang/bg-BG.rc index 69d97786ad4..2166ae0d236 100644 --- a/reactos/subsystems/win32/csrss/win32csr/lang/bg-BG.rc +++ b/reactos/subsystems/win32/csrss/win32csr/lang/bg-BG.rc @@ -59,4 +59,6 @@ BEGIN IDS_SCROLLPAGE_DOWN " " IDS_SCROLLUP " " IDS_SCROLLDOWN " " + + IDS_COMMAND_PROMPT "Command Prompt" END diff --git a/reactos/subsystems/win32/csrss/win32csr/lang/de-DE.rc b/reactos/subsystems/win32/csrss/win32csr/lang/de-DE.rc index a8fa75eabe2..dbe4f7ea7e4 100644 --- a/reactos/subsystems/win32/csrss/win32csr/lang/de-DE.rc +++ b/reactos/subsystems/win32/csrss/win32csr/lang/de-DE.rc @@ -53,4 +53,6 @@ BEGIN IDS_SCROLLPAGE_DOWN "Seite nach unten" IDS_SCROLLUP "Nach oben scrollen" IDS_SCROLLDOWN "Nach unten scrollen" + + IDS_COMMAND_PROMPT "Eingabeaufforderung" END diff --git a/reactos/subsystems/win32/csrss/win32csr/lang/el-GR.rc b/reactos/subsystems/win32/csrss/win32csr/lang/el-GR.rc index 103558a54c0..4990fb194c4 100644 --- a/reactos/subsystems/win32/csrss/win32csr/lang/el-GR.rc +++ b/reactos/subsystems/win32/csrss/win32csr/lang/el-GR.rc @@ -53,4 +53,6 @@ BEGIN IDS_SCROLLPAGE_DOWN " " IDS_SCROLLUP " " IDS_SCROLLDOWN " " + + IDS_COMMAND_PROMPT "Command Prompt" END diff --git a/reactos/subsystems/win32/csrss/win32csr/lang/en-US.rc b/reactos/subsystems/win32/csrss/win32csr/lang/en-US.rc index b6ebdf2a660..a9bf212513a 100644 --- a/reactos/subsystems/win32/csrss/win32csr/lang/en-US.rc +++ b/reactos/subsystems/win32/csrss/win32csr/lang/en-US.rc @@ -53,4 +53,6 @@ BEGIN IDS_SCROLLPAGE_DOWN "Page down" IDS_SCROLLUP "Scroll up" IDS_SCROLLDOWN "Scroll down" + + IDS_COMMAND_PROMPT "Command Prompt" END diff --git a/reactos/subsystems/win32/csrss/win32csr/lang/es-ES.rc b/reactos/subsystems/win32/csrss/win32csr/lang/es-ES.rc index 50960a7bfe4..d24849f9c38 100644 --- a/reactos/subsystems/win32/csrss/win32csr/lang/es-ES.rc +++ b/reactos/subsystems/win32/csrss/win32csr/lang/es-ES.rc @@ -58,4 +58,6 @@ BEGIN IDS_SCROLLPAGE_DOWN "Bajar pgina" IDS_SCROLLUP "Desplazar arriba" IDS_SCROLLDOWN "Desplazar abajo" + + IDS_COMMAND_PROMPT "Command Prompt" END diff --git a/reactos/subsystems/win32/csrss/win32csr/lang/fr-FR.rc b/reactos/subsystems/win32/csrss/win32csr/lang/fr-FR.rc index 708af193c8e..8dbe9f55a05 100644 --- a/reactos/subsystems/win32/csrss/win32csr/lang/fr-FR.rc +++ b/reactos/subsystems/win32/csrss/win32csr/lang/fr-FR.rc @@ -55,4 +55,6 @@ BEGIN IDS_SCROLLPAGE_DOWN "Page suivante" IDS_SCROLLUP "Dfiler en haut" IDS_SCROLLDOWN "Dfiler en bas" + + IDS_COMMAND_PROMPT "Command Prompt" END diff --git a/reactos/subsystems/win32/csrss/win32csr/lang/id-ID.rc b/reactos/subsystems/win32/csrss/win32csr/lang/id-ID.rc index 7faf10f7579..3df62722928 100644 --- a/reactos/subsystems/win32/csrss/win32csr/lang/id-ID.rc +++ b/reactos/subsystems/win32/csrss/win32csr/lang/id-ID.rc @@ -53,4 +53,6 @@ BEGIN IDS_SCROLLPAGE_DOWN "Halaman Turun" IDS_SCROLLUP "Gulung Naik" IDS_SCROLLDOWN "Gulung Turun" + + IDS_COMMAND_PROMPT "Command Prompt" END diff --git a/reactos/subsystems/win32/csrss/win32csr/lang/it-IT.rc b/reactos/subsystems/win32/csrss/win32csr/lang/it-IT.rc index 21d87610dc5..dbc75bf515a 100644 --- a/reactos/subsystems/win32/csrss/win32csr/lang/it-IT.rc +++ b/reactos/subsystems/win32/csrss/win32csr/lang/it-IT.rc @@ -62,4 +62,6 @@ BEGIN IDS_SCROLLPAGE_DOWN "Pagina gi" IDS_SCROLLUP "Scorri s" IDS_SCROLLDOWN "Scorri gi" + + IDS_COMMAND_PROMPT "Command Prompt" END diff --git a/reactos/subsystems/win32/csrss/win32csr/lang/ja-JP.rc b/reactos/subsystems/win32/csrss/win32csr/lang/ja-JP.rc index 1e21759498e..fd87c2d86d1 100644 --- a/reactos/subsystems/win32/csrss/win32csr/lang/ja-JP.rc +++ b/reactos/subsystems/win32/csrss/win32csr/lang/ja-JP.rc @@ -53,4 +53,6 @@ BEGIN IDS_SCROLLPAGE_DOWN "Page down" IDS_SCROLLUP "ɃXN[" IDS_SCROLLDOWN "ɃXN[" + + IDS_COMMAND_PROMPT "Command Prompt" END diff --git a/reactos/subsystems/win32/csrss/win32csr/lang/no-NO.rc b/reactos/subsystems/win32/csrss/win32csr/lang/no-NO.rc index a0ba9c5a5f4..61362b5043b 100644 --- a/reactos/subsystems/win32/csrss/win32csr/lang/no-NO.rc +++ b/reactos/subsystems/win32/csrss/win32csr/lang/no-NO.rc @@ -44,4 +44,6 @@ BEGIN IDS_SCROLLPAGE_DOWN "Side ned" IDS_SCROLLUP "Rull opp" IDS_SCROLLDOWN "Rull ned" + + IDS_COMMAND_PROMPT "Command Prompt" END diff --git a/reactos/subsystems/win32/csrss/win32csr/lang/pl-PL.rc b/reactos/subsystems/win32/csrss/win32csr/lang/pl-PL.rc index 9d8927ebc2d..8ca9f167e8a 100644 --- a/reactos/subsystems/win32/csrss/win32csr/lang/pl-PL.rc +++ b/reactos/subsystems/win32/csrss/win32csr/lang/pl-PL.rc @@ -58,4 +58,6 @@ BEGIN IDS_SCROLLPAGE_DOWN "Nastpna strona" IDS_SCROLLUP "Przewi do gry" IDS_SCROLLDOWN "Przewi na d" + + IDS_COMMAND_PROMPT "Command Prompt" END diff --git a/reactos/subsystems/win32/csrss/win32csr/lang/ru-RU.rc b/reactos/subsystems/win32/csrss/win32csr/lang/ru-RU.rc index e35fa896cfc..207fa1f4bab 100644 --- a/reactos/subsystems/win32/csrss/win32csr/lang/ru-RU.rc +++ b/reactos/subsystems/win32/csrss/win32csr/lang/ru-RU.rc @@ -53,4 +53,6 @@ BEGIN IDS_SCROLLPAGE_DOWN " " IDS_SCROLLUP " " IDS_SCROLLDOWN "Scroll Down" + + IDS_COMMAND_PROMPT "Command Prompt" END diff --git a/reactos/subsystems/win32/csrss/win32csr/lang/sk-SK.rc b/reactos/subsystems/win32/csrss/win32csr/lang/sk-SK.rc index 3642acb0878..3b9bcaa0483 100644 --- a/reactos/subsystems/win32/csrss/win32csr/lang/sk-SK.rc +++ b/reactos/subsystems/win32/csrss/win32csr/lang/sk-SK.rc @@ -57,4 +57,6 @@ BEGIN IDS_SCROLLPAGE_DOWN "O strnku niie" IDS_SCROLLUP "Rolova nahor" IDS_SCROLLDOWN "Rolova nadol" + + IDS_COMMAND_PROMPT "Command Prompt" END diff --git a/reactos/subsystems/win32/csrss/win32csr/lang/uk-UA.rc b/reactos/subsystems/win32/csrss/win32csr/lang/uk-UA.rc index 7cf8452f2d2..213de546b40 100644 --- a/reactos/subsystems/win32/csrss/win32csr/lang/uk-UA.rc +++ b/reactos/subsystems/win32/csrss/win32csr/lang/uk-UA.rc @@ -61,4 +61,6 @@ BEGIN IDS_SCROLLPAGE_DOWN " " IDS_SCROLLUP " " IDS_SCROLLDOWN " " + + IDS_COMMAND_PROMPT "Command Prompt" END diff --git a/reactos/subsystems/win32/csrss/win32csr/lang/zh-CN.rc b/reactos/subsystems/win32/csrss/win32csr/lang/zh-CN.rc index 598c5bcbf21..4c32bdd6e04 100644 --- a/reactos/subsystems/win32/csrss/win32csr/lang/zh-CN.rc +++ b/reactos/subsystems/win32/csrss/win32csr/lang/zh-CN.rc @@ -53,4 +53,6 @@ BEGIN IDS_SCROLLPAGE_DOWN "һҳ" IDS_SCROLLUP "Ϲ" IDS_SCROLLDOWN "¹" + + IDS_COMMAND_PROMPT "Command Prompt" END diff --git a/reactos/subsystems/win32/csrss/win32csr/lang/zh-TW.rc b/reactos/subsystems/win32/csrss/win32csr/lang/zh-TW.rc index ec5c87ca641..1d24b7dda9b 100644 --- a/reactos/subsystems/win32/csrss/win32csr/lang/zh-TW.rc +++ b/reactos/subsystems/win32/csrss/win32csr/lang/zh-TW.rc @@ -53,4 +53,6 @@ BEGIN IDS_SCROLLPAGE_DOWN "U@" IDS_SCROLLUP "VWu" IDS_SCROLLDOWN "VUu" + + IDS_COMMAND_PROMPT "Command Prompt" END diff --git a/reactos/subsystems/win32/csrss/win32csr/resource.h b/reactos/subsystems/win32/csrss/win32csr/resource.h index eaadd2f2349..10688212562 100644 --- a/reactos/subsystems/win32/csrss/win32csr/resource.h +++ b/reactos/subsystems/win32/csrss/win32csr/resource.h @@ -48,4 +48,6 @@ #define IDS_SCROLLUP 309 #define IDS_SCROLLDOWN 310 +#define IDS_COMMAND_PROMPT 500 + /* EOF */ From 4041e16e6ff278804bdbbc7dc7c95cbfcb956248 Mon Sep 17 00:00:00 2001 From: Kamil Hornicek Date: Sat, 9 Apr 2011 12:18:34 +0000 Subject: [PATCH 111/317] Updated Czech translations for ping, charmap, reactos, usetup, console, desk and shell32 by Radek Liska (radekliska at gmail dot com) with some subtle modifications by me. See issue #6067 for more details. svn path=/trunk/; revision=51294 --- .../base/applications/charmap/lang/cs-CZ.rc | 4 +- .../applications/network/ping/lang/cs-CZ.rc | 40 ++++++ .../base/applications/network/ping/ping.rc | 1 + reactos/base/setup/reactos/lang/cs-CZ.rc | 136 +++++++++--------- reactos/base/setup/usetup/lang/cs-CZ.h | 6 +- reactos/dll/cpl/console/lang/cs-CZ.rc | 10 +- reactos/dll/cpl/desk/lang/cs-CZ.rc | 28 ++-- reactos/dll/win32/shell32/lang/cs-CZ.rc | 10 +- 8 files changed, 140 insertions(+), 95 deletions(-) create mode 100644 reactos/base/applications/network/ping/lang/cs-CZ.rc diff --git a/reactos/base/applications/charmap/lang/cs-CZ.rc b/reactos/base/applications/charmap/lang/cs-CZ.rc index a9d48a5ff64..d31df8eb885 100644 --- a/reactos/base/applications/charmap/lang/cs-CZ.rc +++ b/reactos/base/applications/charmap/lang/cs-CZ.rc @@ -1,6 +1,6 @@ /* FILE: applications/charmap/lang/cs-CZ.rc * TRANSLATOR: Radek Liska aka Black_Fox (radekliska at gmail dot com) - * UPDATED: 2008-02-29 + * UPDATED: 2011-03-31 */ LANGUAGE LANG_CZECH, SUBLANG_DEFAULT @@ -10,7 +10,7 @@ CAPTION "Mapa znak FONT 8,"MS Shell Dlg",0,0 STYLE DS_SHELLFONT | WS_BORDER | WS_VISIBLE | WS_SYSMENU | WS_MINIMIZEBOX BEGIN - LTEXT "Font:", IDC_STATIC, 6, 7, 24, 9 + LTEXT "Psmo:", IDC_STATIC, 6, 7, 24, 9 COMBOBOX IDC_FONTCOMBO, 36, 5, 210, 210, WS_CHILD | WS_VISIBLE | WS_VSCROLL | CBS_DROPDOWNLIST | CBS_SORT | CBS_HASSTRINGS PUSHBUTTON "Npovda", IDC_CMHELP, 249, 5, 35, 13 CONTROL "", IDC_FONTMAP, "FontMapWnd", WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL, 20, 22, 266, 156 diff --git a/reactos/base/applications/network/ping/lang/cs-CZ.rc b/reactos/base/applications/network/ping/lang/cs-CZ.rc new file mode 100644 index 00000000000..ebc948a987c --- /dev/null +++ b/reactos/base/applications/network/ping/lang/cs-CZ.rc @@ -0,0 +1,40 @@ +/* FILE: base/applications/network/ping/lang/cs-CZ.rc + * TRANSLATOR: Radek Liska aka Black_Fox (radekliska at gmail dot com) + * UPDATED: 2011-03-31 + */ + +LANGUAGE LANG_CZECH, SUBLANG_DEFAULT + +STRINGTABLE DISCARDABLE +BEGIN + IDS_USAGE "\nPouit: ping [-t] [-n poet] [-l velikost] [-w timeout] cl\n\n\ +Options:\n\ + -t Opakovan zasl poadavky o ozvnu zadanmu cli a do zastaven.\n\ + Ukonen stisknutm Ctrl+C.\n\ + -n poet Poet poadavk o ozvnu, kter budou zaslny.\n\ + -l velikost Velikost vyrovnvac pamti.\n\ + -w timeout Doba v milisekundch, po kterou se bude ekat na odpov.\n\n\0" + + IDS_PING_WITH_BYTES "\nPing na %1 [%2] s %3!d! bajty dat:\n\n\0" + IDS_PING_STATISTICS "\nStatistika pro %1:\n\0" + IDS_PACKETS_SENT_RECEIVED_LOST " Pakety: Odeslno = %1!d!, Pijato = %2!d!, Ztraceno = %3!d! (%4!d!%% ztrta),\n\0" + IDS_APPROXIMATE_ROUND_TRIP "Piblin doba do pijet odezvy v milisekundch:\n\0" + IDS_MIN_MAX_AVERAGE " Minimum = %1, Maximum = %2, Prmr = %3\n\0" + IDS_NOT_ENOUGH_RESOURCES "Nen k dispozici dostatek volnch zdroj.\n\0" + IDS_UNKNOWN_HOST "Neznm hostitel %1.\n\0" + IDS_SETSOCKOPT_FAILED "setsockopt selhalo (%1!d!).\n\0" + IDS_COULD_NOT_CREATE_SOCKET "Nebylo mon vytvoit socket (#%1!d!).\n\0" + IDS_COULD_NOT_INIT_WINSOCK "Nebylo mon inicializovat knihovnu winsock.\n\0" + IDS_DEST_MUST_BE_SPECIFIED "Je nutno zadat nzev nebo IP adresu cle.\n\0" + IDS_BAD_PARAMETER "Nesprvn parametr %1.\n\0" + IDS_BAD_OPTION_FORMAT "Nesprvn formt volby %1.\n\0" + IDS_BAD_OPTION "Nesprvn volba %1.\n\0" + IDS_BAD_VALUE_OPTION_L "Nesprvn hodnota volby -l, platn rozsah je od 0 do %1!d!.\n\0" + IDS_REPLY_FROM "Odpov od %1: bajt=%2!d! as%3%4 TTL=%5!d!\n\0" + IDS_DEST_UNREACHABLE "Cl je nedostupn.\n\0" + IDS_COULD_NOT_TRANSMIT "Nebylo mon penst data (%1!d!).\n\0" + IDS_COULD_NOT_RECV "Nebylo mon pijmout data (%1!d!).\n\0" + IDS_REQUEST_TIMEOUT "asov limit dosti vyprel.\n\0" + IDS_MS "ms\0" + IDS_1MS "1ms\0" +END diff --git a/reactos/base/applications/network/ping/ping.rc b/reactos/base/applications/network/ping/ping.rc index 3f25d017260..b47c1744474 100644 --- a/reactos/base/applications/network/ping/ping.rc +++ b/reactos/base/applications/network/ping/ping.rc @@ -8,6 +8,7 @@ #define REACTOS_STR_ORIGINAL_COPYRIGHT "Casper S. Hornstrup (chorns@users.sourceforge.net)\0" #include +#include "lang/cs-CZ.rc" #include "lang/de-DE.rc" #include "lang/en-US.rc" #include "lang/fr-FR.rc" diff --git a/reactos/base/setup/reactos/lang/cs-CZ.rc b/reactos/base/setup/reactos/lang/cs-CZ.rc index 505042b65f9..7ba1456c1a3 100644 --- a/reactos/base/setup/reactos/lang/cs-CZ.rc +++ b/reactos/base/setup/reactos/lang/cs-CZ.rc @@ -1,119 +1,123 @@ -// Kario was here +/* FILE: dll/cpl/console/lang/cs-CZ.rc + * TRANSLATOR: Radek Liska aka Black_Fox (radekliska at gmail dot com) + * THANKS TO: kario for introducing the file + * UPDATED: 2011-03-31 + */ LANGUAGE LANG_CZECH, SUBLANG_DEFAULT IDD_STARTPAGE DIALOGEX DISCARDABLE 0, 0, 317, 193 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Instalace ReactOS" +CAPTION "Instalace systmu ReactOS" FONT 8, "MS Shell Dlg" BEGIN - LTEXT "Welcome to the ReactOS Setup Wizard.", IDC_STARTTITLE, 115, 8, 195, 24 - LTEXT "ReactOS nelze instalovat pmo z tohoto CD! Prosm restartujte pota z tohoto CD aby jste nainstalovali ReactOS.", IDC_STATIC, 115, 40, 195, 100 - LTEXT "Click Finish to exit the Setup.", IDC_STATIC, 115, 169, 195, 17 + LTEXT "Vtejte v prvodci instalace systmu ReactOS.", IDC_STARTTITLE, 115, 8, 195, 24 + LTEXT "Systm ReactOS zatm nelze nainstalovat pmo z tohoto CD! Pro instalaci restartuje pota z tohoto CD.", IDC_STATIC, 115, 40, 195, 100 + LTEXT "Klepnutm na Dokonit ukonte instalaci.", IDC_STATIC, 115, 169, 195, 17 END IDD_LANGSELPAGE DIALOGEX DISCARDABLE 0, 0, 317, 193 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Instalace ReactOS" +CAPTION "Instalace systmu ReactOS" FONT 8, "MS Shell Dlg" BEGIN CONTROL "IDB_LOGO", IDB_ROSLOGO, "Static", WS_CHILD | WS_VISIBLE | SS_OWNERDRAW, 18, 0, 290, 99 - CONTROL "Setup language:", IDC_STATIC, "Static", WS_CHILD | WS_VISIBLE | WS_GROUP | SS_RIGHT, 20, 109, 106, 11 + CONTROL "Jazyk instalace:", IDC_STATIC, "Static", WS_CHILD | WS_VISIBLE | WS_GROUP | SS_RIGHT, 20, 109, 106, 11 CONTROL "", IDC_LANGUAGES, "ComboBox", WS_VSCROLL | WS_TABSTOP | CBS_DROPDOWNLIST, 132, 107, 176, 142 - CONTROL "Keyboard or input method:", IDC_STATIC, "Static", WS_CHILD | WS_VISIBLE | WS_GROUP | SS_RIGHT, 20, 142, 106, 11 + CONTROL "Klvesnice i metoda zadvn:", IDC_STATIC, "Static", WS_CHILD | WS_VISIBLE | WS_GROUP | SS_RIGHT, 20, 142, 106, 11 CONTROL "", IDC_KEYLAYOUT, "ComboBox", WS_VSCROLL | WS_TABSTOP | CBS_DROPDOWNLIST, 132, 141, 176, 81 - LTEXT "Click Next to select the setup type.", IDC_STATIC, 10, 180 ,297, 10 + LTEXT "Po klepnut na Dal bude mon zvolit typ instalace.", IDC_STATIC, 10, 180 ,297, 10 END IDD_TYPEPAGE DIALOGEX DISCARDABLE 0, 0, 317, 193 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Instalace ReactOS" +CAPTION "Instalace systmu ReactOS" FONT 8, "MS Shell Dlg" BEGIN - CONTROL "Type of setup", IDC_STATIC, "Button", BS_GROUPBOX, 10,0,297,172 - CONTROL "Install ReactOS", IDC_INSTALL, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 20, 15, 277, 10 - CONTROL "Repair or update an installed ReactOS", IDC_SETUP, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 20, 30, 277, 10 - LTEXT "Click Next to setup the devices.", IDC_STATIC, 10, 180 ,297, 10 + CONTROL "Typ instalace", IDC_STATIC, "Button", BS_GROUPBOX, 10,0,297,172 + CONTROL "Nainstalovat systm ReactOS", IDC_INSTALL, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 20, 15, 277, 10 + CONTROL "Opravit nebo aktualizovat ji nainstalovan systm ReactOS", IDC_SETUP, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 20, 30, 277, 10 + LTEXT "Po klepnut na Dal bude mon nastavit zazen.", IDC_STATIC, 10, 180 ,297, 10 END IDD_DEVICEPAGE DIALOGEX DISCARDABLE 0, 0, 317, 193 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Instalace ReactOS" +CAPTION "Instalace systmu ReactOS" FONT 8, "MS Shell Dlg" BEGIN - CONTROL "Device settings", IDC_STATIC, "Button", BS_GROUPBOX, 10,0,297,172 - LTEXT "Computer:", IDC_STATIC, 20,15, 80, 10 + CONTROL "Nastaven zazen", IDC_STATIC, "Button", BS_GROUPBOX, 10,0,297,172 + LTEXT "Pota:", IDC_STATIC, 20,15, 80, 10 CONTROL "", IDC_COMPUTER, "ComboBox", WS_VSCROLL | WS_TABSTOP | CBS_DROPDOWNLIST , 100, 15, 150, 80 - LTEXT "Display:", IDC_STATIC, 20,35, 80, 10 + LTEXT "Obrazovka:", IDC_STATIC, 20,35, 80, 10 CONTROL "", IDC_DISPLAY, "ComboBox", WS_VSCROLL | WS_TABSTOP | CBS_DROPDOWNLIST , 100, 35, 150, 80 - LTEXT "Keyboard:", IDC_STATIC, 20,55, 80, 10 + LTEXT "Klvesnice:", IDC_STATIC, 20,55, 80, 10 CONTROL "", IDC_KEYBOARD, "ComboBox", WS_VSCROLL | WS_TABSTOP | CBS_DROPDOWNLIST , 100, 55, 150, 80 - LTEXT "Click Next setup of the installation device.", IDC_STATIC, 10, 180 ,277, 20 + LTEXT "Po klepnut na Dal bude mon nastavit instalan zazen.", IDC_STATIC, 10, 180 ,277, 20 END IDD_DRIVEPAGE DIALOGEX DISCARDABLE 0, 0, 317, 193 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Instalace ReactOS" +CAPTION "Instalace systmu ReactOS" FONT 8, "MS Shell Dlg" BEGIN - CONTROL "Partition for ReactOS installation", IDC_STATIC, "Button", BS_GROUPBOX, 10,1,298,176 + CONTROL "Oddl, do kterho bude systm ReactOS nainstalovn", IDC_STATIC, "Button", BS_GROUPBOX, 10,1,298,176 LISTBOX IDC_PARTITION, 20,12,278,142,LBS_HASSTRINGS | WS_VSCROLL - PUSHBUTTON "&Create", IDC_PARTCREATE, 20,155,50,15 - PUSHBUTTON "&Delete", IDC_PARTDELETE, 76,155,50,15 - PUSHBUTTON "D&river", IDC_DEVICEDRIVER, 162,155,50,15, WS_DISABLED - PUSHBUTTON "&Advanced Options...", IDC_PARTMOREOPTS, 218,155,80,15 - LTEXT "Click Next to check the summary.", IDC_STATIC, 10, 180 ,277, 20 + PUSHBUTTON "&Vytvoit", IDC_PARTCREATE, 20,155,50,15 + PUSHBUTTON "&Smazat", IDC_PARTDELETE, 76,155,50,15 + PUSHBUTTON "&Ovlada", IDC_DEVICEDRIVER, 162,155,50,15, WS_DISABLED + PUSHBUTTON "&Pokroil volby...", IDC_PARTMOREOPTS, 218,155,80,15 + LTEXT "Po klepnut na Dal bude mon zkontrolovat vechna nastaven.", IDC_STATIC, 10, 180 ,277, 20 END IDD_PARTITION DIALOGEX DISCARDABLE 0, 0, 145, 90 STYLE WS_VISIBLE|WS_CAPTION|WS_THICKFRAME -CAPTION "Create Partition" +CAPTION "Vytvoit oddl" FONT 8, "MS Shell Dlg" BEGIN CONTROL "",IDC_UPDOWN1,"msctls_updown32", WS_VISIBLE,104,22,9,13 - CONTROL "Create and format partition",IDC_STATIC,"Button",BS_GROUPBOX,7,5,129,57 - LTEXT "Size:",IDC_STATIC, 13,24,27,9 + CONTROL "Vytvoit a naformtovat oddl",IDC_STATIC,"Button",BS_GROUPBOX,7,5,129,57 + LTEXT "Velikost:",IDC_STATIC, 13,24,27,9 EDITTEXT IDC_PARTSIZE,52,23,53,13, WS_VISIBLE|WS_TABSTOP LTEXT "GB",IDC_UNIT, 117,24,14,9 - LTEXT "Filesystem:",IDC_STATIC,13,46,35,9 + LTEXT "Souborov systm:",IDC_STATIC,13,46,35,9 CONTROL "",IDC_FSTYPE,"ComboBox",WS_VISIBLE|WS_TABSTOP|CBS_DROPDOWNLIST,52,42,79,50 PUSHBUTTON "&OK",IDOK,35,68,47,15, WS_VISIBLE|WS_TABSTOP - PUSHBUTTON "&Cancel",IDCANCEL,87,68,47,15, WS_VISIBLE|WS_TABSTOP + PUSHBUTTON "&Storno",IDCANCEL,87,68,47,15, WS_VISIBLE|WS_TABSTOP END IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 105 STYLE WS_VISIBLE|WS_CAPTION|WS_THICKFRAME -CAPTION "Advanced Partition Settings" +CAPTION "Pokroil nastaven oddlu" FONT 8, "MS Shell Dlg" BEGIN - CONTROL "Installation folder", IDC_STATIC, "Button", BS_GROUPBOX, 4,1,298,30 + CONTROL "Instalan sloka", IDC_STATIC, "Button", BS_GROUPBOX, 4,1,298,30 EDITTEXT IDC_PATH, 10,11,278,13, WS_VISIBLE - CONTROL "Boot loader installation", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,41 + CONTROL "Instalace zavade", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,41 - CONTROL "Install boot loader on the hard disk (MBR and VBR)", IDC_INSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,46,278,11 - CONTROL "Install boot loader on the hard disk (VBR only)", IDC_INSTVBRONLY, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,57,278,11 - CONTROL "No installation of bootloader", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,68,278,11 + CONTROL "Nainstalovat zavad na pevn disk (MBR a VBR)", IDC_INSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,46,278,11 + CONTROL "Nainstalovat zavad na pevn disk (jen VBR)", IDC_INSTVBRONLY, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,57,278,11 + CONTROL "Zavad neinstalovat", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,68,278,11 PUSHBUTTON "&OK", IDOK, 180,83,50,15, WS_TABSTOP | WS_VISIBLE - PUSHBUTTON "&Cancel", IDCANCEL, 240,83,50,15, WS_TABSTOP | WS_VISIBLE + PUSHBUTTON "&Storno", IDCANCEL, 240,83,50,15, WS_TABSTOP | WS_VISIBLE END IDD_SUMMARYPAGE DIALOGEX 0, 0, 317, 193 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Instalace ReactOS" +CAPTION "Instalace systmu ReactOS" FONT 8, "MS Shell Dlg" BEGIN - CONTROL "Installation summary", IDC_ACTION, "Button", BS_GROUPBOX, 10,0,297,172 - LTEXT "Click Next to start the installation process.", IDC_STATIC, 10, 180 ,277, 20 + CONTROL "Shrnut instalace", IDC_ACTION, "Button", BS_GROUPBOX, 10,0,297,172 + LTEXT "Klepnutm na Dal zahjte instalan proces.", IDC_STATIC, 10, 180 ,277, 20 END IDD_PROCESSPAGE DIALOGEX 0, 0, 317, 193 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Instalace ReactOS" +CAPTION "Instalace systmu ReactOS" FONT 8, "MS Shell Dlg" BEGIN - CONTROL "Setup action", IDC_ACTION, "Button", BS_GROUPBOX, 10,0,297,172 - LTEXT "Install files...", IDC_ACTIVITY, 20, 50, 277, 10 + CONTROL "Akce instalace", IDC_ACTION, "Button", BS_GROUPBOX, 10,0,297,172 + LTEXT "Instalace soubor...", IDC_ACTIVITY, 20, 50, 277, 10 LTEXT "test.txt", IDC_ITEM, 30, 80, 257, 10 CONTROL "", IDC_PROCESSPROGRESS, "msctls_progress32", PBS_SMOOTH | WS_CHILD | WS_VISIBLE | WS_BORDER, 20, 120, 277, 8 @@ -121,34 +125,34 @@ END IDD_RESTARTPAGE DIALOGEX DISCARDABLE 0, 0, 317, 193 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Completing ReactOS Setup" +CAPTION "Dokonen instalace systmu ReactOS" FONT 8, "MS Shell Dlg" BEGIN - CONTROL "Completing the first stage of ReactOS Setup", IDC_FINISHTITLE, "Button", BS_GROUPBOX, 10,0,297,172 - LTEXT "You have successfully completed the first stage of ReactOS Setup.", IDC_STATIC, 20, 50, 277, 10 + CONTROL "Dokonen prvn sti instalace systmu ReactOS", IDC_FINISHTITLE, "Button", BS_GROUPBOX, 10,0,297,172 + LTEXT "Prvn st instalace systmu ReactOS byla spn dokonena.", IDC_STATIC, 20, 50, 277, 10 - LTEXT "When you click Finish, your computer will restart.", IDC_STATIC, 20, 80, 277, 10 + LTEXT "Po klepnut na Dokonit bude pota restartovn.", IDC_STATIC, 20, 80, 277, 10 CONTROL "", IDC_RESTART_PROGRESS, "msctls_progress32", PBS_SMOOTH | WS_CHILD | WS_VISIBLE | WS_BORDER, 20, 120, 277, 8 - LTEXT "If there is a CD in a drive, remove it. Then, to restart your computer, click Finish.", IDC_STATIC, 10, 180, 297, 20 + LTEXT "Pokud je v mechanice instalan CD, vyjmte jej. Pot kliknutm na Dokonit restartujte pota.", IDC_STATIC, 10, 180, 297, 20 END STRINGTABLE BEGIN - IDS_LANGTITLE "Language Selection" - IDS_LANGSUBTITLE "Choose language for setup and final system." - IDS_TYPETITLE "Welcome to ReactOS Setup" - IDS_TYPESUBTITLE "Choose setup type." - IDS_DEVICETITLE "Setup the basic devices" - IDS_DEVICESUBTITLE "Set the settings of display and keyboard." - IDS_DRIVETITLE "Setup the installation partition and system folder" - IDS_DRIVESUBTITLE "Prepare installation partition, system folder and boot loader." - IDS_PROCESSTITLE "Prepare partition, copy files and setup system" - IDS_PROCESSSUBTITLE "Create and format partition, copy files, install and setup boot loader" - IDS_RESTARTTITLE "First stage of setup finished" - IDS_RESTARTSUBTITLE "The first stage of setup has been completed, restart to continue with second stage" - IDS_SUMMARYTITLE "Installation Summary" - IDS_SUMMARYSUBTITLE "List installation properties to check before apply to the installation device" - IDS_ABORTSETUP "ReactOS is not completely installed on your computer. If you quit Setup now, you will need to run Setup again to install Reactos. Really quit?" - IDS_ABORTSETUP2 "Abort installation?" + IDS_LANGTITLE "Vbr jazyka" + IDS_LANGSUBTITLE "Volba jazyka, kter bude pouit pi instalaci a ve vslednm systmu." + IDS_TYPETITLE "Vtejte v prvodci instalace systmu ReactOS" + IDS_TYPESUBTITLE "Volba typu instalace." + IDS_DEVICETITLE "Nastaven zkladnch zazen" + IDS_DEVICESUBTITLE "Volba nastaven obrazovky a klvesnice." + IDS_DRIVETITLE "Nastaven instalanho oddlu a systmov sloky" + IDS_DRIVESUBTITLE "Pprava instalanho oddlu, systmov sloky a zavade." + IDS_PROCESSTITLE "Pprava oddlu, koprovn soubor a nastaven systmu" + IDS_PROCESSSUBTITLE "Vytvoen a naformtovn oddlu, koprovn soubor, instalace a nastaven zavade" + IDS_RESTARTTITLE "Prvn st instalace dokonena" + IDS_RESTARTSUBTITLE "Prvn st instalace byla dokonena, po restartovn potae se bude pokraovat druhou st" + IDS_SUMMARYTITLE "Shrnut instalace" + IDS_SUMMARYSUBTITLE "Vpis voleb instalace k oven ped tm, ne zane instalace" + IDS_ABORTSETUP "Systm ReactOS nen na tomto potai kompletn nainstalovan. Pokud nyn ukonte instalaci, bude ji pro nainstalovn systmu ReactOS nutn provst znova. Opravdu ukonit?" + IDS_ABORTSETUP2 "Peruit instalaci?" END /* EOF */ diff --git a/reactos/base/setup/usetup/lang/cs-CZ.h b/reactos/base/setup/usetup/lang/cs-CZ.h index eff2fa1665e..a38da327cd1 100644 --- a/reactos/base/setup/usetup/lang/cs-CZ.h +++ b/reactos/base/setup/usetup/lang/cs-CZ.h @@ -1,7 +1,7 @@ /* FILE: setup/usetup/lang/cs-CZ.rc * TRANSLATOR: Radek Liska aka Black_Fox (radekliska at gmail dot com) - * THANKS TO: preston - * UPDATED: 2010-12-12 + * THANKS TO: preston for bugfix advice at line 842 + * UPDATED: 2011-03-31 */ #pragma once @@ -43,7 +43,7 @@ static MUI_ENTRY csCZLanguagePageEntries[] = { 8, 13, - "\x07 Tento jazyk bude defaultnm jazykem v nainstalovanm systmu.", + "\x07 Tento jazyk bude vchozm jazykem v nainstalovanm systmu.", TEXT_STYLE_NORMAL }, { diff --git a/reactos/dll/cpl/console/lang/cs-CZ.rc b/reactos/dll/cpl/console/lang/cs-CZ.rc index 5bd19862b5e..da104559238 100644 --- a/reactos/dll/cpl/console/lang/cs-CZ.rc +++ b/reactos/dll/cpl/console/lang/cs-CZ.rc @@ -1,6 +1,6 @@ /* FILE: dll/cpl/console/lang/cs-CZ.rc * TRANSLATOR: Radek Liska aka Black_Fox (radekliska at gmail dot com) - * UPDATED: 2008-07-27 + * UPDATED: 2011-03-31 */ #include @@ -34,15 +34,15 @@ END IDD_PROPPAGEFONT DIALOGEX 0, 0, 253, 220 STYLE DS_SHELLFONT | WS_CHILD | WS_CAPTION -CAPTION "Font" +CAPTION "Psmo" FONT 8, "MS Shell Dlg" BEGIN LTEXT "Nhled okna:", -1, 10, 10, 94, 10 LTEXT "Velikost:", -1, 180, 10, 36, 10 CONTROL "", IDC_STATIC_FONT_WINDOW_PREVIEW, "Static", SS_OWNERDRAW | SS_SUNKEN, 10, 20, 163, 74 LISTBOX IDC_LBOX_FONTS, 181, 20, 55, 80, LBS_DISABLENOSCROLL | WS_VSCROLL - LTEXT "&Font:", -1, 10, 105, 33, 10 - CHECKBOX "&Tun fonty", IDC_CHECK_BOLD_FONTS, 56, 105, 60, 10 + LTEXT "&Psmo:", -1, 10, 105, 33, 10 + CHECKBOX "&Tun psma", IDC_CHECK_BOLD_FONTS, 56, 105, 60, 10 LISTBOX IDC_LBOX_TYPE, 10, 120, 110, 40, LBS_DISABLENOSCROLL | WS_VSCROLL GROUPBOX "", IDC_GROUPBOX_FONT_NAME, 6, 156, 241, 50 CONTROL "", IDC_STATIC_SELECT_FONT_PREVIEW, "Static", SS_OWNERDRAW | SS_SUNKEN, 16, 165, 95, 35 @@ -141,5 +141,5 @@ BEGIN IDS_CPLDESCRIPTION "Nastavit vlastnosti konzole." IDS_APPLY_SHORTCUT_ALL "Zmnit z&stupce, kter spustil toto okno" IDS_SCREEN_TEXT "C:\\ReactOS> dir\nSYSTEM 10-01-99 5:00\nSYSTEM32 10-01-99 5:00" - IDS_RASTERFONTS "Rastrov fonty" + IDS_RASTERFONTS "Rastrov psma" END diff --git a/reactos/dll/cpl/desk/lang/cs-CZ.rc b/reactos/dll/cpl/desk/lang/cs-CZ.rc index 717e214d7d8..727eb9dcac8 100644 --- a/reactos/dll/cpl/desk/lang/cs-CZ.rc +++ b/reactos/dll/cpl/desk/lang/cs-CZ.rc @@ -1,6 +1,6 @@ /* FILE: dll/cpl/desk/lang/cs-CZ.rc * TRANSLATOR: Radek Liska aka Black_Fox (radekliska at gmail dot com) - * UPDATED: 2008-07-27 + * UPDATED: 2011-03-31 * THANKS TO: potapnik, who translated major part of this file */ @@ -105,24 +105,24 @@ END IDD_EFFAPPEARANCE DIALOGEX DISCARDABLE 0, 0, 285, 185 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU EXSTYLE WS_EX_DLGMODALFRAME | WS_EX_WINDOWEDGE -CAPTION "Effects" +CAPTION "Efekty" FONT 8, "MS Shell Dlg" BEGIN - CONTROL "&Use the following transition effect for menus and tooltips:",IDC_EFFAPPEARANCE_ANIMATION,"button", + CONTROL "Pout nsledujc &efekt pechodu pro nabdky a popisky:",IDC_EFFAPPEARANCE_ANIMATION,"button", BS_AUTOCHECKBOX | WS_TABSTOP, 10, 5, 285, 19 COMBOBOX IDC_EFFAPPEARANCE_ANIMATIONTYPE, 20, 25, 80, 19 , CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_CHILD | WS_VSCROLL | WS_TABSTOP - CONTROL "U&se the following method to smooth edges of screen fonts:",IDC_EFFAPPEARANCE_SMOOTHING,"button", + CONTROL "Pout nsledujc metodu vyhlazovn &hran obrazovkovch psem:",IDC_EFFAPPEARANCE_SMOOTHING,"button", BS_AUTOCHECKBOX | WS_TABSTOP | WS_DISABLED, 10, 42, 285, 19 COMBOBOX IDC_EFFAPPEARANCE_SMOOTHINGTYPE, 20, 62, 80, 19 , CBS_DROPDOWNLIST | CBS_HASSTRINGS | CBS_SORT | WS_VSCROLL | WS_TABSTOP | WS_DISABLED - CONTROL "Us&e large icons",IDC_EFFAPPEARANCE_LARGEICONS,"button", + CONTROL "Pout velk &ikony",IDC_EFFAPPEARANCE_LARGEICONS,"button", BS_AUTOCHECKBOX | WS_TABSTOP | WS_DISABLED, 10, 80, 285, 19 - CONTROL "Show sh&adows under menus",IDC_EFFAPPEARANCE_SETDROPSHADOW,"button", + CONTROL "Zobrazovat &stny pod nabdkami",IDC_EFFAPPEARANCE_SETDROPSHADOW,"button", BS_AUTOCHECKBOX | WS_TABSTOP | WS_DISABLED, 10, 95, 285, 19 - CONTROL "Show &window contents while dragging",IDC_EFFAPPEARANCE_DRAGFULLWINDOWS,"button", + CONTROL "Zobrazovat &obsah okna bhem pesouvn",IDC_EFFAPPEARANCE_DRAGFULLWINDOWS,"button", BS_AUTOCHECKBOX | WS_TABSTOP, 10, 110, 285, 19 - CONTROL "&Hide underlined letters for keyboard navigation until I press the Alt key",IDC_EFFAPPEARANCE_KEYBOARDCUES,"button", + CONTROL "&Nezobrazovat podtren psmen u klvesovch zkratek, dokud nestisknu klvesu Alt",IDC_EFFAPPEARANCE_KEYBOARDCUES,"button", BS_AUTOCHECKBOX | WS_TABSTOP, 10, 125, 285, 19 - PUSHBUTTON "Cancel", IDCANCEL, 226, 165, 50, 14 + PUSHBUTTON "Storno", IDCANCEL, 226, 165, 50, 14 DEFPUSHBUTTON "OK", IDOK, 172, 165, 50, 14 END @@ -134,7 +134,7 @@ BEGIN LTEXT "Taenm nastavte ikony monitor, aby odpovdaly fyzickmu uspodn vaich monitor.",-1,3,3,240,10 CONTROL "",IDC_SETTINGS_MONSEL,"MONITORSELWNDCLASS",WS_CHILD|WS_VISIBLE|WS_TABSTOP,3,16,240,82,WS_EX_CLIENTEDGE LTEXT "&Obrazovka:",1820,3,100,38,8 - LTEXT "",IDC_SETTINGS_DEVICE,9,109,224,8 + LTEXT "",IDC_SETTINGS_DEVICE,9,109,224,8 GROUPBOX "&Velikost obrazovky",1818,3,120,115,43 CONTROL "",IDC_SETTINGS_RESOLUTION,"msctls_trackbar32",TBS_AUTOTICKS | WS_TABSTOP, 30,130,58,17 @@ -185,19 +185,19 @@ END STRINGTABLE DISCARDABLE BEGIN - IDS_SLIDEEFFECT "Slide effect" - IDS_FADEEFFECT "Fade effect" + IDS_SLIDEEFFECT "Efekt vysunut" + IDS_FADEEFFECT "Efekt pechodu" END STRINGTABLE DISCARDABLE BEGIN - IDS_STANDARDEFFECT "Standard" + IDS_STANDARDEFFECT "Standardn" IDS_CLEARTYPEEFFECT "ClearType" END STRINGTABLE BEGIN - IDS_MULTIPLEMONITORS "(Nkolik monitor)" + IDS_MULTIPLEMONITORS "(Vce monitor)" IDS_UNKNOWNMONITOR "(Neznm monitor)" IDS_ADVANCEDTITLEFMT "%s a %s" END diff --git a/reactos/dll/win32/shell32/lang/cs-CZ.rc b/reactos/dll/win32/shell32/lang/cs-CZ.rc index 728fce9fd08..7dbb4ebbd56 100644 --- a/reactos/dll/win32/shell32/lang/cs-CZ.rc +++ b/reactos/dll/win32/shell32/lang/cs-CZ.rc @@ -1,6 +1,6 @@ /* FILE: dll/win32/shell32/lang/cs-CZ.rc * TRANSLATOR: Radek Liska aka Black_Fox (radekliska at gmail dot com) - * UPDATED: 2010-05-25 + * UPDATED: 2011-03-31 * THANKS TO: navaraf, who translated major part of this file */ @@ -539,7 +539,7 @@ BEGIN PUSHBUTTON "&Zavt", IDCANCEL, 118, 198, 60, 14 LTEXT "&Kapacita:", -1, 7, 6, 169, 9 COMBOBOX 28673, 7, 17, 170, 200, CBS_DROPDOWNLIST | WS_VSCROLL | NOT WS_TABSTOP - LTEXT "&Souborov systm", -1, 7, 35, 170, 9 + LTEXT "Souborov syst&m", -1, 7, 35, 170, 9 COMBOBOX 28677, 7, 46, 170, 200, CBS_DROPDOWNLIST | WS_VSCROLL | NOT WS_TABSTOP CONTROL "", 28678, "MSCTLS_PROGRESS32", 0, 7, 181, 170, 8 LTEXT "&Velikost alokan jednotky", -1, 7, 64, 170, 9 @@ -597,7 +597,7 @@ BEGIN IDS_SHV_COLUMN13 "Kategorie" IDS_SHV_COLUMN_DELFROM "Pvodn umstn" IDS_SHV_COLUMN_DELDATE "Odstranno" - IDS_SHV_COLUMN_FONTTYPE "Fonttype" + IDS_SHV_COLUMN_FONTTYPE "Druh psma" //fonttype IDS_SHV_COLUMN_WORKGROUP "Pracovn skupina" IDS_SHV_NETWORKLOCATION "Sov umstn" IDS_SHV_COLUMN_DOCUMENTS "Dokumenty" @@ -739,8 +739,8 @@ BEGIN IDS_FILE_FOLDER "%u soubor, %u sloek" IDS_PRINTERS "Tiskrny" - IDS_FONTS "Fonty" - IDS_INSTALLNEWFONT "Nainstalovat nov font..." + IDS_FONTS "Psma" + IDS_INSTALLNEWFONT "Nainstalovat nov psmo..." IDS_DEFAULT_CLUSTER_SIZE "Vchoz alokan velikost" IDS_COPY_OF "Kopie " From 893a0bfccb67da3b670677dcd3e5e37f6425271c Mon Sep 17 00:00:00 2001 From: Giannis Adamopoulos Date: Sat, 9 Apr 2011 12:44:45 +0000 Subject: [PATCH 112/317] [win32k] - Rewrite GetKeyState based on wine. Now it's results are based on whether or nor the message queue has processed a keyboard message and not the actual state of the keyboard.c - TODO: ensure it works corectly and use this implementation in most other places in win32k when we need to check the state of a key. To ensure nothing breaks, this change affects only GetKeyState svn path=/trunk/; revision=51295 --- .../subsystems/win32/win32k/include/input.h | 16 +++ .../win32/win32k/include/msgqueue.h | 3 + .../subsystems/win32/win32k/ntuser/keyboard.c | 54 -------- .../subsystems/win32/win32k/ntuser/msgqueue.c | 116 ++++++++++++++++++ 4 files changed, 135 insertions(+), 54 deletions(-) diff --git a/reactos/subsystems/win32/win32k/include/input.h b/reactos/subsystems/win32/win32k/include/input.h index ba123366a2a..bcf54013e09 100644 --- a/reactos/subsystems/win32/win32k/include/input.h +++ b/reactos/subsystems/win32/win32k/include/input.h @@ -27,6 +27,22 @@ extern PATTACHINFO gpai; #define KBL_PRELOAD 2 #define KBL_RESET 4 +/* Key States */ +#define KS_DOWN_MASK 0xc0 +#define KS_DOWN_BIT 0x80 +#define KS_LOCK_BIT 0x01 +/* Lock modifiers */ +#define CAPITAL_BIT 0x80000000 +#define NUMLOCK_BIT 0x40000000 +#define MOD_BITS_MASK 0x3fffffff +#define MOD_KCTRL 0x02 +/* Scan Codes */ +#define SC_KEY_UP 0x8000 +/* lParam bits */ +#define LP_EXT_BIT (1<<24) +/* From kbdxx.c -- Key changes with numlock */ +#define KNUMP 0x400 + INIT_FUNCTION NTSTATUS NTAPI diff --git a/reactos/subsystems/win32/win32k/include/msgqueue.h b/reactos/subsystems/win32/win32k/include/msgqueue.h index e5158574e10..870cf874527 100644 --- a/reactos/subsystems/win32/win32k/include/msgqueue.h +++ b/reactos/subsystems/win32/win32k/include/msgqueue.h @@ -108,6 +108,9 @@ typedef struct _USER_MESSAGE_QUEUE /* extra message information */ LPARAM ExtraInfo; + /* state of each key */ + UCHAR KeyState[256]; + /* messages that are currently dispatched by other threads */ LIST_ENTRY DispatchingMessagesHead; /* messages that are currently dispatched by this message queue, required for cleanup */ diff --git a/reactos/subsystems/win32/win32k/ntuser/keyboard.c b/reactos/subsystems/win32/win32k/ntuser/keyboard.c index d0509ad1e7a..c4ef0430555 100644 --- a/reactos/subsystems/win32/win32k/ntuser/keyboard.c +++ b/reactos/subsystems/win32/win32k/ntuser/keyboard.c @@ -33,28 +33,8 @@ #define NDEBUG #include - -/* Lock modifiers */ -#define CAPITAL_BIT 0x80000000 -#define NUMLOCK_BIT 0x40000000 -#define MOD_BITS_MASK 0x3fffffff -#define MOD_KCTRL 0x02 -/* Key States */ -#define KS_DOWN_MASK 0xc0 -#define KS_DOWN_BIT 0x80 -#define KS_LOCK_BIT 0x01 -/* Scan Codes */ -#define SC_KEY_UP 0x8000 -/* lParam bits */ -#define LP_EXT_BIT (1<<24) -/* From kbdxx.c -- Key changes with numlock */ -#define KNUMP 0x400 - - BYTE gQueueKeyStateTable[256]; - - /* FUNCTIONS *****************************************************************/ /* Initialization -- Right now, just zero the key state and init the lock */ @@ -353,40 +333,6 @@ ToUnicodeInner(UINT wVirtKey, } -DWORD FASTCALL UserGetKeyState(DWORD key) -{ - DWORD ret = 0; - - if( key < 0x100 ) - { - ret = ((DWORD)(gQueueKeyStateTable[key] & KS_DOWN_BIT) << 8 ) | - (gQueueKeyStateTable[key] & KS_LOCK_BIT); - } - - return ret; -} - - -SHORT -APIENTRY -NtUserGetKeyState( - INT key) -{ - DECLARE_RETURN(DWORD); - - DPRINT("Enter NtUserGetKeyState\n"); - UserEnterExclusive(); - - RETURN(UserGetKeyState(key)); - -CLEANUP: - DPRINT("Leave NtUserGetKeyState, ret=%i\n",_ret_); - UserLeave(); - END_CLEANUP; -} - - - DWORD FASTCALL UserGetAsyncKeyState(DWORD key) { DWORD ret = 0; diff --git a/reactos/subsystems/win32/win32k/ntuser/msgqueue.c b/reactos/subsystems/win32/win32k/ntuser/msgqueue.c index 9f57375da83..2fb518dfed3 100644 --- a/reactos/subsystems/win32/win32k/ntuser/msgqueue.c +++ b/reactos/subsystems/win32/win32k/ntuser/msgqueue.c @@ -41,6 +41,106 @@ MsqInitializeImpl(VOID) return(STATUS_SUCCESS); } +DWORD FASTCALL UserGetKeyState(DWORD key) +{ + DWORD ret = 0; + PTHREADINFO pti; + PUSER_MESSAGE_QUEUE MessageQueue; + + pti = PsGetCurrentThreadWin32Thread(); + MessageQueue = pti->MessageQueue; + + if( key < 0x100 ) + { + ret = ((DWORD)(MessageQueue->KeyState[key] & KS_DOWN_BIT) << 8 ) | + (MessageQueue->KeyState[key] & KS_LOCK_BIT); + } + + return ret; +} + +/* change the input key state for a given key */ +static void set_input_key_state( PUSER_MESSAGE_QUEUE MessageQueue, UCHAR key, BOOL down ) +{ + if (down) + { + if (!(MessageQueue->KeyState[key] & KS_DOWN_BIT)) + { + MessageQueue->KeyState[key] ^= KS_LOCK_BIT; + } + MessageQueue->KeyState[key] |= KS_DOWN_BIT; + } + else + { + MessageQueue->KeyState[key] &= ~KS_DOWN_BIT; + } +} + +/* update the input key state for a keyboard message */ +static void update_input_key_state( PUSER_MESSAGE_QUEUE MessageQueue, MSG* msg ) +{ + UCHAR key; + BOOL down = 0; + + switch (msg->message) + { + case WM_LBUTTONDOWN: + down = 1; + /* fall through */ + case WM_LBUTTONUP: + set_input_key_state( MessageQueue, VK_LBUTTON, down ); + break; + case WM_MBUTTONDOWN: + down = 1; + /* fall through */ + case WM_MBUTTONUP: + set_input_key_state( MessageQueue, VK_MBUTTON, down ); + break; + case WM_RBUTTONDOWN: + down = 1; + /* fall through */ + case WM_RBUTTONUP: + set_input_key_state( MessageQueue, VK_RBUTTON, down ); + break; + case WM_XBUTTONDOWN: + down = 1; + /* fall through */ + case WM_XBUTTONUP: + if (msg->wParam == XBUTTON1) + set_input_key_state( MessageQueue, VK_XBUTTON1, down ); + else if (msg->wParam == XBUTTON2) + set_input_key_state( MessageQueue, VK_XBUTTON2, down ); + break; + case WM_KEYDOWN: + case WM_SYSKEYDOWN: + down = 1; + /* fall through */ + case WM_KEYUP: + case WM_SYSKEYUP: + key = (UCHAR)msg->wParam; + set_input_key_state( MessageQueue, key, down ); + switch(key) + { + case VK_LCONTROL: + case VK_RCONTROL: + down = (MessageQueue->KeyState[VK_LCONTROL] | MessageQueue->KeyState[VK_RCONTROL]) & KS_DOWN_BIT; + set_input_key_state( MessageQueue, VK_CONTROL, down ); + break; + case VK_LMENU: + case VK_RMENU: + down = (MessageQueue->KeyState[VK_LMENU] | MessageQueue->KeyState[VK_RMENU]) & KS_DOWN_BIT; + set_input_key_state( MessageQueue, VK_MENU, down ); + break; + case VK_LSHIFT: + case VK_RSHIFT: + down = (MessageQueue->KeyState[VK_LSHIFT] | MessageQueue->KeyState[VK_RSHIFT]) & KS_DOWN_BIT; + set_input_key_state( MessageQueue, VK_SHIFT, down ); + break; + } + break; + } +} + HANDLE FASTCALL IntMsqSetWakeMask(DWORD WakeMask) { @@ -1294,6 +1394,7 @@ co_MsqPeekHardwareMessage(IN PUSER_MESSAGE_QUEUE MessageQueue, if (Remove) { + update_input_key_state(MessageQueue, pMsg); RemoveEntryList(&CurrentMessage->ListEntry); ClearMsgBitsMask(MessageQueue, QS_INPUT); MsqDestroyMessage(CurrentMessage); @@ -1714,4 +1815,19 @@ MsqSetStateWindow(PUSER_MESSAGE_QUEUE MessageQueue, ULONG Type, HWND hWnd) return NULL; } +SHORT +APIENTRY +NtUserGetKeyState(INT key) +{ + DWORD Ret; + + UserEnterExclusive(); + + Ret = UserGetKeyState(key); + + UserLeave(); + + return Ret; +} + /* EOF */ From dc37bd8b99e7e5bad158556fe03c1cda6ab5c548 Mon Sep 17 00:00:00 2001 From: Daniel Reimer Date: Sat, 9 Apr 2011 14:46:37 +0000 Subject: [PATCH 113/317] - Sync all resource files with the English one. - Translate the new Dialog in the German one. - Normally we use BEGIN and END, no {} - DIALOG -> DIALOGEX svn path=/trunk/; revision=51296 --- reactos/base/applications/sndvol32/lang/bg-BG.rc | 16 +++++++++++++++- reactos/base/applications/sndvol32/lang/cs-CZ.rc | 16 +++++++++++++++- reactos/base/applications/sndvol32/lang/de-DE.rc | 16 +++++++++++++++- reactos/base/applications/sndvol32/lang/el-GR.rc | 16 +++++++++++++++- reactos/base/applications/sndvol32/lang/en-US.rc | 8 ++++---- reactos/base/applications/sndvol32/lang/es-ES.rc | 16 +++++++++++++++- reactos/base/applications/sndvol32/lang/fr-FR.rc | 8 ++++---- reactos/base/applications/sndvol32/lang/hu-HU.rc | 16 +++++++++++++++- reactos/base/applications/sndvol32/lang/id-ID.rc | 16 +++++++++++++++- reactos/base/applications/sndvol32/lang/it-IT.rc | 16 +++++++++++++++- reactos/base/applications/sndvol32/lang/ja-JP.rc | 16 +++++++++++++++- reactos/base/applications/sndvol32/lang/ko-KR.rc | 16 +++++++++++++++- reactos/base/applications/sndvol32/lang/lt-LT.rc | 16 +++++++++++++++- reactos/base/applications/sndvol32/lang/nl-NL.rc | 16 +++++++++++++++- reactos/base/applications/sndvol32/lang/no-NO.rc | 16 +++++++++++++++- reactos/base/applications/sndvol32/lang/pl-PL.rc | 8 ++++---- reactos/base/applications/sndvol32/lang/pt-BR.rc | 16 +++++++++++++++- reactos/base/applications/sndvol32/lang/ru-RU.rc | 16 +++++++++++++++- reactos/base/applications/sndvol32/lang/sk-SK.rc | 16 +++++++++++++++- reactos/base/applications/sndvol32/lang/sv-SE.rc | 16 +++++++++++++++- reactos/base/applications/sndvol32/lang/th-TH.rc | 16 +++++++++++++++- reactos/base/applications/sndvol32/lang/uk-UA.rc | 16 +++++++++++++++- 22 files changed, 297 insertions(+), 31 deletions(-) diff --git a/reactos/base/applications/sndvol32/lang/bg-BG.rc b/reactos/base/applications/sndvol32/lang/bg-BG.rc index 4f42b6b1d47..c1927f2d649 100644 --- a/reactos/base/applications/sndvol32/lang/bg-BG.rc +++ b/reactos/base/applications/sndvol32/lang/bg-BG.rc @@ -26,7 +26,7 @@ END IDD_PREFERENCES DIALOGEX 0, 0, 224, 250 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "" -FONT 8, "MS Shell Dlg", 0, 0, 0x0 +FONT 8, "MS Shell Dlg" BEGIN LTEXT "& :", -1, 7,8,48,9 COMBOBOX IDC_MIXERDEVICE, 55,8,162,80, CBS_DROPDOWNLIST | WS_TABSTOP @@ -41,3 +41,17 @@ BEGIN PUSHBUTTON "", IDOK, 114,226,50,14 PUSHBUTTON "", IDCANCEL, 168,226,50,14 END + +IDD_VOLUME_CTRL DIALOGEX 0, 0, 90, 150 +STYLE WS_POPUP | WS_BORDER +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Master", IDC_LINE_NAME, 4, 7, 100, 15 + CONTROL "", -1, "static", SS_ETCHEDHORZ | WS_CHILD | WS_VISIBLE, 4, 30, 82, 1 + LTEXT "Balance", -1, 4, 35, 80, 42 + LTEXT "Volume", -1, 4, 100, 77, 108 + CONTROL "", IDC_LINE_SLIDER_HORZ, "msctls_trackbar32", TBS_HORZ | TBS_AUTOTICKS | TBS_BOTH | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 25, 55, 85, 30 + CONTROL "", IDC_LINE_SLIDER_VERT, "msctls_trackbar32", TBS_VERT | TBS_AUTOTICKS | TBS_BOTH | TBS_DOWNISLEFT | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 32, 115, 30, 70 + CHECKBOX "&Mute", IDC_LINE_SWITCH, 4, 190, 90, 12, BS_AUTOCHECKBOX + CONTROL "", IDC_LINE_SEP, "static", SS_ETCHEDVERT | WS_CHILD | WS_VISIBLE, 130, 7, 1, 200 +END diff --git a/reactos/base/applications/sndvol32/lang/cs-CZ.rc b/reactos/base/applications/sndvol32/lang/cs-CZ.rc index abeec0eb9db..9e737209577 100644 --- a/reactos/base/applications/sndvol32/lang/cs-CZ.rc +++ b/reactos/base/applications/sndvol32/lang/cs-CZ.rc @@ -32,7 +32,7 @@ END IDD_PREFERENCES DIALOGEX 0, 0, 224, 250 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Monosti" -FONT 8, "MS Shell Dlg", 0, 0, 0x0 +FONT 8, "MS Shell Dlg" BEGIN LTEXT "&Smovac zazen:", -1, 7,8,48,9 COMBOBOX IDC_MIXERDEVICE, 55,8,162,80, CBS_DROPDOWNLIST | WS_TABSTOP @@ -47,3 +47,17 @@ BEGIN PUSHBUTTON "OK", IDOK, 114,226,50,14 PUSHBUTTON "Storno", IDCANCEL, 168,226,50,14 END + +IDD_VOLUME_CTRL DIALOGEX 0, 0, 90, 150 +STYLE WS_POPUP | WS_BORDER +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Master", IDC_LINE_NAME, 4, 7, 100, 15 + CONTROL "", -1, "static", SS_ETCHEDHORZ | WS_CHILD | WS_VISIBLE, 4, 30, 82, 1 + LTEXT "Balance", -1, 4, 35, 80, 42 + LTEXT "Volume", -1, 4, 100, 77, 108 + CONTROL "", IDC_LINE_SLIDER_HORZ, "msctls_trackbar32", TBS_HORZ | TBS_AUTOTICKS | TBS_BOTH | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 25, 55, 85, 30 + CONTROL "", IDC_LINE_SLIDER_VERT, "msctls_trackbar32", TBS_VERT | TBS_AUTOTICKS | TBS_BOTH | TBS_DOWNISLEFT | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 32, 115, 30, 70 + CHECKBOX "&Mute", IDC_LINE_SWITCH, 4, 190, 90, 12, BS_AUTOCHECKBOX + CONTROL "", IDC_LINE_SEP, "static", SS_ETCHEDVERT | WS_CHILD | WS_VISIBLE, 130, 7, 1, 200 +END diff --git a/reactos/base/applications/sndvol32/lang/de-DE.rc b/reactos/base/applications/sndvol32/lang/de-DE.rc index 6ea135d5a0a..8cdfa1058eb 100644 --- a/reactos/base/applications/sndvol32/lang/de-DE.rc +++ b/reactos/base/applications/sndvol32/lang/de-DE.rc @@ -26,7 +26,7 @@ END IDD_PREFERENCES DIALOGEX 0, 0, 224, 250 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Eigenschaften" -FONT 8, "MS Shell Dlg", 0, 0, 0x0 +FONT 8, "MS Shell Dlg" BEGIN LTEXT "&Mixer:", -1, 7,8,48,9 COMBOBOX IDC_MIXERDEVICE, 55,8,162,80, CBS_DROPDOWNLIST | WS_TABSTOP @@ -41,3 +41,17 @@ BEGIN PUSHBUTTON "OK", IDOK, 114,226,50,14 PUSHBUTTON "Abbrechen", IDCANCEL, 168,226,50,14 END + +IDD_VOLUME_CTRL DIALOGEX 0, 0, 90, 150 +STYLE WS_POPUP | WS_BORDER +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Master", IDC_LINE_NAME, 4, 7, 100, 15 + CONTROL "", -1, "static", SS_ETCHEDHORZ | WS_CHILD | WS_VISIBLE, 4, 30, 82, 1 + LTEXT "Balance", -1, 4, 35, 80, 42 + LTEXT "Lautstrke", -1, 4, 100, 77, 108 + CONTROL "", IDC_LINE_SLIDER_HORZ, "msctls_trackbar32", TBS_HORZ | TBS_AUTOTICKS | TBS_BOTH | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 25, 55, 85, 30 + CONTROL "", IDC_LINE_SLIDER_VERT, "msctls_trackbar32", TBS_VERT | TBS_AUTOTICKS | TBS_BOTH | TBS_DOWNISLEFT | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 32, 115, 30, 70 + CHECKBOX "&Stumm", IDC_LINE_SWITCH, 4, 190, 90, 12, BS_AUTOCHECKBOX + CONTROL "", IDC_LINE_SEP, "static", SS_ETCHEDVERT | WS_CHILD | WS_VISIBLE, 130, 7, 1, 200 +END diff --git a/reactos/base/applications/sndvol32/lang/el-GR.rc b/reactos/base/applications/sndvol32/lang/el-GR.rc index 5e985e25cbf..a535250aaa7 100644 --- a/reactos/base/applications/sndvol32/lang/el-GR.rc +++ b/reactos/base/applications/sndvol32/lang/el-GR.rc @@ -26,7 +26,7 @@ END IDD_PREFERENCES DIALOGEX 0, 0, 224, 250 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "" -FONT 8, "MS Shell Dlg", 0, 0, 0x0 +FONT 8, "MS Shell Dlg" BEGIN LTEXT "& :", -1, 7,8,48,9 COMBOBOX IDC_MIXERDEVICE, 55,8,162,80, CBS_DROPDOWNLIST | WS_TABSTOP @@ -41,3 +41,17 @@ BEGIN PUSHBUTTON "OK", IDOK, 114,226,50,14 PUSHBUTTON "", IDCANCEL, 168,226,50,14 END + +IDD_VOLUME_CTRL DIALOGEX 0, 0, 90, 150 +STYLE WS_POPUP | WS_BORDER +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Master", IDC_LINE_NAME, 4, 7, 100, 15 + CONTROL "", -1, "static", SS_ETCHEDHORZ | WS_CHILD | WS_VISIBLE, 4, 30, 82, 1 + LTEXT "Balance", -1, 4, 35, 80, 42 + LTEXT "Volume", -1, 4, 100, 77, 108 + CONTROL "", IDC_LINE_SLIDER_HORZ, "msctls_trackbar32", TBS_HORZ | TBS_AUTOTICKS | TBS_BOTH | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 25, 55, 85, 30 + CONTROL "", IDC_LINE_SLIDER_VERT, "msctls_trackbar32", TBS_VERT | TBS_AUTOTICKS | TBS_BOTH | TBS_DOWNISLEFT | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 32, 115, 30, 70 + CHECKBOX "&Mute", IDC_LINE_SWITCH, 4, 190, 90, 12, BS_AUTOCHECKBOX + CONTROL "", IDC_LINE_SEP, "static", SS_ETCHEDVERT | WS_CHILD | WS_VISIBLE, 130, 7, 1, 200 +END diff --git a/reactos/base/applications/sndvol32/lang/en-US.rc b/reactos/base/applications/sndvol32/lang/en-US.rc index 1ab09241de0..bc2a63ed644 100644 --- a/reactos/base/applications/sndvol32/lang/en-US.rc +++ b/reactos/base/applications/sndvol32/lang/en-US.rc @@ -26,7 +26,7 @@ END IDD_PREFERENCES DIALOGEX 0, 0, 224, 250 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Properties" -FONT 8, "MS Shell Dlg", 0, 0, 0x0 +FONT 8, "MS Shell Dlg" BEGIN LTEXT "&Mixer device:", -1, 7,8,48,9 COMBOBOX IDC_MIXERDEVICE, 55,8,162,80, CBS_DROPDOWNLIST | WS_TABSTOP @@ -42,10 +42,10 @@ BEGIN PUSHBUTTON "Cancel", IDCANCEL, 168,226,50,14 END -IDD_VOLUME_CTRL DIALOG 0, 0, 90, 150 +IDD_VOLUME_CTRL DIALOGEX 0, 0, 90, 150 STYLE WS_POPUP | WS_BORDER FONT 8, "MS Shell Dlg" -{ +BEGIN LTEXT "Master", IDC_LINE_NAME, 4, 7, 100, 15 CONTROL "", -1, "static", SS_ETCHEDHORZ | WS_CHILD | WS_VISIBLE, 4, 30, 82, 1 LTEXT "Balance", -1, 4, 35, 80, 42 @@ -54,4 +54,4 @@ FONT 8, "MS Shell Dlg" CONTROL "", IDC_LINE_SLIDER_VERT, "msctls_trackbar32", TBS_VERT | TBS_AUTOTICKS | TBS_BOTH | TBS_DOWNISLEFT | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 32, 115, 30, 70 CHECKBOX "&Mute", IDC_LINE_SWITCH, 4, 190, 90, 12, BS_AUTOCHECKBOX CONTROL "", IDC_LINE_SEP, "static", SS_ETCHEDVERT | WS_CHILD | WS_VISIBLE, 130, 7, 1, 200 -} +END diff --git a/reactos/base/applications/sndvol32/lang/es-ES.rc b/reactos/base/applications/sndvol32/lang/es-ES.rc index 40a2fb23ee0..fdbde68f3a9 100644 --- a/reactos/base/applications/sndvol32/lang/es-ES.rc +++ b/reactos/base/applications/sndvol32/lang/es-ES.rc @@ -30,7 +30,7 @@ END IDD_PREFERENCES DIALOGEX 0, 0, 224, 250 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Propiedades" -FONT 8, "MS Shell Dlg", 0, 0, 0x0 +FONT 8, "MS Shell Dlg" BEGIN LTEXT "&Dispositivo me&zclador:", -1, 7,8,48,9 COMBOBOX IDC_MIXERDEVICE, 55,8,162,80, CBS_DROPDOWNLIST | WS_TABSTOP @@ -45,3 +45,17 @@ BEGIN PUSHBUTTON "Aceptar", IDOK, 114,226,50,14 PUSHBUTTON "Cancelar", IDCANCEL, 168,226,50,14 END + +IDD_VOLUME_CTRL DIALOGEX 0, 0, 90, 150 +STYLE WS_POPUP | WS_BORDER +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Master", IDC_LINE_NAME, 4, 7, 100, 15 + CONTROL "", -1, "static", SS_ETCHEDHORZ | WS_CHILD | WS_VISIBLE, 4, 30, 82, 1 + LTEXT "Balance", -1, 4, 35, 80, 42 + LTEXT "Volume", -1, 4, 100, 77, 108 + CONTROL "", IDC_LINE_SLIDER_HORZ, "msctls_trackbar32", TBS_HORZ | TBS_AUTOTICKS | TBS_BOTH | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 25, 55, 85, 30 + CONTROL "", IDC_LINE_SLIDER_VERT, "msctls_trackbar32", TBS_VERT | TBS_AUTOTICKS | TBS_BOTH | TBS_DOWNISLEFT | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 32, 115, 30, 70 + CHECKBOX "&Mute", IDC_LINE_SWITCH, 4, 190, 90, 12, BS_AUTOCHECKBOX + CONTROL "", IDC_LINE_SEP, "static", SS_ETCHEDVERT | WS_CHILD | WS_VISIBLE, 130, 7, 1, 200 +END diff --git a/reactos/base/applications/sndvol32/lang/fr-FR.rc b/reactos/base/applications/sndvol32/lang/fr-FR.rc index 0831863728d..88040752989 100644 --- a/reactos/base/applications/sndvol32/lang/fr-FR.rc +++ b/reactos/base/applications/sndvol32/lang/fr-FR.rc @@ -26,7 +26,7 @@ END IDD_PREFERENCES DIALOGEX 0, 0, 224, 250 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Proprits" -FONT 8, "MS Shell Dlg", 0, 0, 0x0 +FONT 8, "MS Shell Dlg" BEGIN LTEXT "&Priphrique de mixage :", -1, 7,8,48,9 COMBOBOX IDC_MIXERDEVICE, 55,8,162,80, CBS_DROPDOWNLIST | WS_TABSTOP @@ -42,10 +42,10 @@ BEGIN PUSHBUTTON "Annuler", IDCANCEL, 168,226,50,14 END -IDD_VOLUME_CTRL DIALOG 0, 0, 90, 150 +IDD_VOLUME_CTRL DIALOGEX 0, 0, 90, 150 STYLE WS_POPUP | WS_BORDER FONT 8, "MS Shell Dlg" -{ +BEGIN LTEXT "Volume principal", IDC_LINE_NAME, 4, 7, 100, 15 CONTROL "", -1, "static", SS_ETCHEDHORZ | WS_CHILD | WS_VISIBLE, 4, 30, 82, 1 LTEXT "Balance", -1, 4, 35, 80, 42 @@ -54,4 +54,4 @@ FONT 8, "MS Shell Dlg" CONTROL "", IDC_LINE_SLIDER_VERT, "msctls_trackbar32", TBS_VERT | TBS_AUTOTICKS | TBS_BOTH | TBS_DOWNISLEFT | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 32, 115, 30, 70 CHECKBOX "&Muet", IDC_LINE_SWITCH, 4, 190, 90, 12, BS_AUTOCHECKBOX CONTROL "", IDC_LINE_SEP, "static", SS_ETCHEDVERT | WS_CHILD | WS_VISIBLE, 130, 7, 1, 200 -} +END diff --git a/reactos/base/applications/sndvol32/lang/hu-HU.rc b/reactos/base/applications/sndvol32/lang/hu-HU.rc index 0c6f2d99be2..0cf10ea2603 100644 --- a/reactos/base/applications/sndvol32/lang/hu-HU.rc +++ b/reactos/base/applications/sndvol32/lang/hu-HU.rc @@ -30,7 +30,7 @@ END IDD_PREFERENCES DIALOGEX 0, 0, 224, 250 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Tulajdonsgok" -FONT 8, "MS Shell Dlg", 0, 0, 0x0 +FONT 8, "MS Shell Dlg" BEGIN LTEXT "&Kever eszkz:", -1, 7,8,48,9 COMBOBOX IDC_MIXERDEVICE, 55,8,162,80, CBS_DROPDOWNLIST | WS_TABSTOP @@ -45,3 +45,17 @@ BEGIN PUSHBUTTON "OK", IDOK, 114,226,50,14 PUSHBUTTON "Mgse", IDCANCEL, 168,226,50,14 END + +IDD_VOLUME_CTRL DIALOGEX 0, 0, 90, 150 +STYLE WS_POPUP | WS_BORDER +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Master", IDC_LINE_NAME, 4, 7, 100, 15 + CONTROL "", -1, "static", SS_ETCHEDHORZ | WS_CHILD | WS_VISIBLE, 4, 30, 82, 1 + LTEXT "Balance", -1, 4, 35, 80, 42 + LTEXT "Volume", -1, 4, 100, 77, 108 + CONTROL "", IDC_LINE_SLIDER_HORZ, "msctls_trackbar32", TBS_HORZ | TBS_AUTOTICKS | TBS_BOTH | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 25, 55, 85, 30 + CONTROL "", IDC_LINE_SLIDER_VERT, "msctls_trackbar32", TBS_VERT | TBS_AUTOTICKS | TBS_BOTH | TBS_DOWNISLEFT | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 32, 115, 30, 70 + CHECKBOX "&Mute", IDC_LINE_SWITCH, 4, 190, 90, 12, BS_AUTOCHECKBOX + CONTROL "", IDC_LINE_SEP, "static", SS_ETCHEDVERT | WS_CHILD | WS_VISIBLE, 130, 7, 1, 200 +END diff --git a/reactos/base/applications/sndvol32/lang/id-ID.rc b/reactos/base/applications/sndvol32/lang/id-ID.rc index 532e7b6b9df..25f6a97daaf 100644 --- a/reactos/base/applications/sndvol32/lang/id-ID.rc +++ b/reactos/base/applications/sndvol32/lang/id-ID.rc @@ -26,7 +26,7 @@ END IDD_PREFERENCES DIALOGEX 0, 0, 224, 250 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Properti" -FONT 8, "MS Shell Dlg", 0, 0, 0x0 +FONT 8, "MS Shell Dlg" BEGIN LTEXT "&Mixer device:", -1, 7,8,48,9 COMBOBOX IDC_MIXERDEVICE, 55,8,162,80, CBS_DROPDOWNLIST | WS_TABSTOP @@ -41,3 +41,17 @@ BEGIN PUSHBUTTON "OK", IDOK, 114,226,50,14 PUSHBUTTON "Batal", IDCANCEL, 168,226,50,14 END + +IDD_VOLUME_CTRL DIALOGEX 0, 0, 90, 150 +STYLE WS_POPUP | WS_BORDER +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Master", IDC_LINE_NAME, 4, 7, 100, 15 + CONTROL "", -1, "static", SS_ETCHEDHORZ | WS_CHILD | WS_VISIBLE, 4, 30, 82, 1 + LTEXT "Balance", -1, 4, 35, 80, 42 + LTEXT "Volume", -1, 4, 100, 77, 108 + CONTROL "", IDC_LINE_SLIDER_HORZ, "msctls_trackbar32", TBS_HORZ | TBS_AUTOTICKS | TBS_BOTH | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 25, 55, 85, 30 + CONTROL "", IDC_LINE_SLIDER_VERT, "msctls_trackbar32", TBS_VERT | TBS_AUTOTICKS | TBS_BOTH | TBS_DOWNISLEFT | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 32, 115, 30, 70 + CHECKBOX "&Mute", IDC_LINE_SWITCH, 4, 190, 90, 12, BS_AUTOCHECKBOX + CONTROL "", IDC_LINE_SEP, "static", SS_ETCHEDVERT | WS_CHILD | WS_VISIBLE, 130, 7, 1, 200 +END diff --git a/reactos/base/applications/sndvol32/lang/it-IT.rc b/reactos/base/applications/sndvol32/lang/it-IT.rc index 90068a8648b..0897c1b922b 100644 --- a/reactos/base/applications/sndvol32/lang/it-IT.rc +++ b/reactos/base/applications/sndvol32/lang/it-IT.rc @@ -26,7 +26,7 @@ END IDD_PREFERENCES DIALOGEX 0, 0, 224, 250 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Propriet" -FONT 8, "MS Shell Dlg", 0, 0, 0x0 +FONT 8, "MS Shell Dlg" BEGIN LTEXT "&Mixer:", -1, 7,8,48,9 COMBOBOX IDC_MIXERDEVICE, 55,8,162,80, CBS_DROPDOWNLIST | WS_TABSTOP @@ -41,3 +41,17 @@ BEGIN PUSHBUTTON "OK", IDOK, 114,226,50,14 PUSHBUTTON "Annulla", IDCANCEL, 168,226,50,14 END + +IDD_VOLUME_CTRL DIALOGEX 0, 0, 90, 150 +STYLE WS_POPUP | WS_BORDER +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Master", IDC_LINE_NAME, 4, 7, 100, 15 + CONTROL "", -1, "static", SS_ETCHEDHORZ | WS_CHILD | WS_VISIBLE, 4, 30, 82, 1 + LTEXT "Balance", -1, 4, 35, 80, 42 + LTEXT "Volume", -1, 4, 100, 77, 108 + CONTROL "", IDC_LINE_SLIDER_HORZ, "msctls_trackbar32", TBS_HORZ | TBS_AUTOTICKS | TBS_BOTH | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 25, 55, 85, 30 + CONTROL "", IDC_LINE_SLIDER_VERT, "msctls_trackbar32", TBS_VERT | TBS_AUTOTICKS | TBS_BOTH | TBS_DOWNISLEFT | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 32, 115, 30, 70 + CHECKBOX "&Mute", IDC_LINE_SWITCH, 4, 190, 90, 12, BS_AUTOCHECKBOX + CONTROL "", IDC_LINE_SEP, "static", SS_ETCHEDVERT | WS_CHILD | WS_VISIBLE, 130, 7, 1, 200 +END diff --git a/reactos/base/applications/sndvol32/lang/ja-JP.rc b/reactos/base/applications/sndvol32/lang/ja-JP.rc index 3003db611fe..8e4955f2376 100644 --- a/reactos/base/applications/sndvol32/lang/ja-JP.rc +++ b/reactos/base/applications/sndvol32/lang/ja-JP.rc @@ -26,7 +26,7 @@ END IDD_PREFERENCES DIALOGEX 0, 0, 224, 250 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "vpeB" -FONT 9, "MS UI Gothic", 0, 0, 0x0 +FONT 9, "MS UI Gothic" BEGIN LTEXT "~LT[ foCX(&M):", -1, 7,8,48,9 COMBOBOX IDC_MIXERDEVICE, 55,8,162,80, CBS_DROPDOWNLIST | WS_TABSTOP @@ -41,3 +41,17 @@ BEGIN PUSHBUTTON "OK", IDOK, 114,226,50,14 PUSHBUTTON "LZ", IDCANCEL, 168,226,50,14 END + +IDD_VOLUME_CTRL DIALOGEX 0, 0, 90, 150 +STYLE WS_POPUP | WS_BORDER +FONT 9, "MS UI Gothic" +BEGIN + LTEXT "Master", IDC_LINE_NAME, 4, 7, 100, 15 + CONTROL "", -1, "static", SS_ETCHEDHORZ | WS_CHILD | WS_VISIBLE, 4, 30, 82, 1 + LTEXT "Balance", -1, 4, 35, 80, 42 + LTEXT "Volume", -1, 4, 100, 77, 108 + CONTROL "", IDC_LINE_SLIDER_HORZ, "msctls_trackbar32", TBS_HORZ | TBS_AUTOTICKS | TBS_BOTH | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 25, 55, 85, 30 + CONTROL "", IDC_LINE_SLIDER_VERT, "msctls_trackbar32", TBS_VERT | TBS_AUTOTICKS | TBS_BOTH | TBS_DOWNISLEFT | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 32, 115, 30, 70 + CHECKBOX "&Mute", IDC_LINE_SWITCH, 4, 190, 90, 12, BS_AUTOCHECKBOX + CONTROL "", IDC_LINE_SEP, "static", SS_ETCHEDVERT | WS_CHILD | WS_VISIBLE, 130, 7, 1, 200 +END diff --git a/reactos/base/applications/sndvol32/lang/ko-KR.rc b/reactos/base/applications/sndvol32/lang/ko-KR.rc index c03a63b592b..b537ff49d1a 100644 --- a/reactos/base/applications/sndvol32/lang/ko-KR.rc +++ b/reactos/base/applications/sndvol32/lang/ko-KR.rc @@ -29,7 +29,7 @@ END IDD_PREFERENCES DIALOGEX 0, 0, 224, 250 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Ӽ" -FONT 8, "MS Shell Dlg", 0, 0, 0x0 +FONT 8, "MS Shell Dlg" BEGIN LTEXT "ͼ ġ(&M):", -1, 7,8,48,9 COMBOBOX IDC_MIXERDEVICE, 55,8,162,80, CBS_DROPDOWNLIST | WS_TABSTOP @@ -44,3 +44,17 @@ BEGIN PUSHBUTTON "Ȯ", IDOK, 114,226,50,14 PUSHBUTTON "", IDCANCEL, 168,226,50,14 END + +IDD_VOLUME_CTRL DIALOGEX 0, 0, 90, 150 +STYLE WS_POPUP | WS_BORDER +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Master", IDC_LINE_NAME, 4, 7, 100, 15 + CONTROL "", -1, "static", SS_ETCHEDHORZ | WS_CHILD | WS_VISIBLE, 4, 30, 82, 1 + LTEXT "Balance", -1, 4, 35, 80, 42 + LTEXT "Volume", -1, 4, 100, 77, 108 + CONTROL "", IDC_LINE_SLIDER_HORZ, "msctls_trackbar32", TBS_HORZ | TBS_AUTOTICKS | TBS_BOTH | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 25, 55, 85, 30 + CONTROL "", IDC_LINE_SLIDER_VERT, "msctls_trackbar32", TBS_VERT | TBS_AUTOTICKS | TBS_BOTH | TBS_DOWNISLEFT | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 32, 115, 30, 70 + CHECKBOX "&Mute", IDC_LINE_SWITCH, 4, 190, 90, 12, BS_AUTOCHECKBOX + CONTROL "", IDC_LINE_SEP, "static", SS_ETCHEDVERT | WS_CHILD | WS_VISIBLE, 130, 7, 1, 200 +END diff --git a/reactos/base/applications/sndvol32/lang/lt-LT.rc b/reactos/base/applications/sndvol32/lang/lt-LT.rc index 0b1ad41922b..503990cdb3f 100644 --- a/reactos/base/applications/sndvol32/lang/lt-LT.rc +++ b/reactos/base/applications/sndvol32/lang/lt-LT.rc @@ -28,7 +28,7 @@ END IDD_PREFERENCES DIALOGEX 0, 0, 224, 250 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Nustatymai" -FONT 8, "MS Shell Dlg", 0, 0, 0x0 +FONT 8, "MS Shell Dlg" BEGIN LTEXT "&Gars maiymo renginys:", -1, 7,8,48,9 COMBOBOX IDC_MIXERDEVICE, 55,8,162,80, CBS_DROPDOWNLIST | WS_TABSTOP @@ -43,3 +43,17 @@ BEGIN PUSHBUTTON "Gerai", IDOK, 114,226,50,14 PUSHBUTTON "Atsisakyti", IDCANCEL, 168,226,50,14 END + +IDD_VOLUME_CTRL DIALOGEX 0, 0, 90, 150 +STYLE WS_POPUP | WS_BORDER +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Master", IDC_LINE_NAME, 4, 7, 100, 15 + CONTROL "", -1, "static", SS_ETCHEDHORZ | WS_CHILD | WS_VISIBLE, 4, 30, 82, 1 + LTEXT "Balance", -1, 4, 35, 80, 42 + LTEXT "Volume", -1, 4, 100, 77, 108 + CONTROL "", IDC_LINE_SLIDER_HORZ, "msctls_trackbar32", TBS_HORZ | TBS_AUTOTICKS | TBS_BOTH | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 25, 55, 85, 30 + CONTROL "", IDC_LINE_SLIDER_VERT, "msctls_trackbar32", TBS_VERT | TBS_AUTOTICKS | TBS_BOTH | TBS_DOWNISLEFT | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 32, 115, 30, 70 + CHECKBOX "&Mute", IDC_LINE_SWITCH, 4, 190, 90, 12, BS_AUTOCHECKBOX + CONTROL "", IDC_LINE_SEP, "static", SS_ETCHEDVERT | WS_CHILD | WS_VISIBLE, 130, 7, 1, 200 +END diff --git a/reactos/base/applications/sndvol32/lang/nl-NL.rc b/reactos/base/applications/sndvol32/lang/nl-NL.rc index 012d78ea774..b9d39dc92e0 100644 --- a/reactos/base/applications/sndvol32/lang/nl-NL.rc +++ b/reactos/base/applications/sndvol32/lang/nl-NL.rc @@ -26,7 +26,7 @@ END IDD_PREFERENCES DIALOGEX 0, 0, 224, 250 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Eigenschappen" -FONT 8, "MS Shell Dlg", 0, 0, 0x0 +FONT 8, "MS Shell Dlg" BEGIN LTEXT "&Mixerapparaat:", -1, 7,8,48,9 COMBOBOX IDC_MIXERDEVICE, 55,8,162,80, CBS_DROPDOWNLIST | WS_TABSTOP @@ -41,3 +41,17 @@ BEGIN PUSHBUTTON "OK", IDOK, 114,226,50,14 PUSHBUTTON "Annuleren", IDCANCEL, 168,226,50,14 END + +IDD_VOLUME_CTRL DIALOGEX 0, 0, 90, 150 +STYLE WS_POPUP | WS_BORDER +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Master", IDC_LINE_NAME, 4, 7, 100, 15 + CONTROL "", -1, "static", SS_ETCHEDHORZ | WS_CHILD | WS_VISIBLE, 4, 30, 82, 1 + LTEXT "Balance", -1, 4, 35, 80, 42 + LTEXT "Volume", -1, 4, 100, 77, 108 + CONTROL "", IDC_LINE_SLIDER_HORZ, "msctls_trackbar32", TBS_HORZ | TBS_AUTOTICKS | TBS_BOTH | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 25, 55, 85, 30 + CONTROL "", IDC_LINE_SLIDER_VERT, "msctls_trackbar32", TBS_VERT | TBS_AUTOTICKS | TBS_BOTH | TBS_DOWNISLEFT | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 32, 115, 30, 70 + CHECKBOX "&Mute", IDC_LINE_SWITCH, 4, 190, 90, 12, BS_AUTOCHECKBOX + CONTROL "", IDC_LINE_SEP, "static", SS_ETCHEDVERT | WS_CHILD | WS_VISIBLE, 130, 7, 1, 200 +END diff --git a/reactos/base/applications/sndvol32/lang/no-NO.rc b/reactos/base/applications/sndvol32/lang/no-NO.rc index a64e8591dc5..f124d3abaa7 100644 --- a/reactos/base/applications/sndvol32/lang/no-NO.rc +++ b/reactos/base/applications/sndvol32/lang/no-NO.rc @@ -26,7 +26,7 @@ END IDD_PREFERENCES DIALOGEX 0, 0, 224, 250 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Egenskaper" -FONT 8, "MS Shell Dlg", 0, 0, 0x0 +FONT 8, "MS Shell Dlg" BEGIN LTEXT "&Mikser enhet:", -1, 7,8,48,9 COMBOBOX IDC_MIXERDEVICE, 55,8,162,80, CBS_DROPDOWNLIST | WS_TABSTOP @@ -41,3 +41,17 @@ BEGIN PUSHBUTTON "OK", IDOK, 114,226,50,14 PUSHBUTTON "Avbryt", IDCANCEL, 168,226,50,14 END + +IDD_VOLUME_CTRL DIALOGEX 0, 0, 90, 150 +STYLE WS_POPUP | WS_BORDER +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Master", IDC_LINE_NAME, 4, 7, 100, 15 + CONTROL "", -1, "static", SS_ETCHEDHORZ | WS_CHILD | WS_VISIBLE, 4, 30, 82, 1 + LTEXT "Balance", -1, 4, 35, 80, 42 + LTEXT "Volume", -1, 4, 100, 77, 108 + CONTROL "", IDC_LINE_SLIDER_HORZ, "msctls_trackbar32", TBS_HORZ | TBS_AUTOTICKS | TBS_BOTH | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 25, 55, 85, 30 + CONTROL "", IDC_LINE_SLIDER_VERT, "msctls_trackbar32", TBS_VERT | TBS_AUTOTICKS | TBS_BOTH | TBS_DOWNISLEFT | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 32, 115, 30, 70 + CHECKBOX "&Mute", IDC_LINE_SWITCH, 4, 190, 90, 12, BS_AUTOCHECKBOX + CONTROL "", IDC_LINE_SEP, "static", SS_ETCHEDVERT | WS_CHILD | WS_VISIBLE, 130, 7, 1, 200 +END diff --git a/reactos/base/applications/sndvol32/lang/pl-PL.rc b/reactos/base/applications/sndvol32/lang/pl-PL.rc index ca2b80e7c3e..ee226dd2cac 100644 --- a/reactos/base/applications/sndvol32/lang/pl-PL.rc +++ b/reactos/base/applications/sndvol32/lang/pl-PL.rc @@ -34,7 +34,7 @@ END IDD_PREFERENCES DIALOGEX 0, 0, 224, 250 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Waciwoci" -FONT 8, "MS Shell Dlg", 0, 0, 0x0 +FONT 8, "MS Shell Dlg" BEGIN LTEXT "Urzdzenie &miksujce", -1, 7,8,48,9 COMBOBOX IDC_MIXERDEVICE, 55,8,162,80, CBS_DROPDOWNLIST | WS_TABSTOP @@ -50,10 +50,10 @@ BEGIN PUSHBUTTON "Anuluj", IDCANCEL, 168,226,50,14 END -IDD_VOLUME_CTRL DIALOG 0, 0, 90, 150 +IDD_VOLUME_CTRL DIALOGEX 0, 0, 90, 150 STYLE WS_POPUP | WS_BORDER FONT 8, "MS Shell Dlg" -{ +BEGIN LTEXT "Kana gwny", IDC_LINE_NAME, 4, 7, 100, 15 CONTROL "", -1, "static", SS_ETCHEDHORZ | WS_CHILD | WS_VISIBLE, 4, 30, 82, 1 LTEXT "Balans", -1, 4, 35, 80, 42 @@ -62,4 +62,4 @@ FONT 8, "MS Shell Dlg" CONTROL "", IDC_LINE_SLIDER_VERT, "msctls_trackbar32", TBS_VERT | TBS_AUTOTICKS | TBS_BOTH | TBS_DOWNISLEFT | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 32, 115, 30, 70 CHECKBOX "&Wycisz", IDC_LINE_SWITCH, 4, 190, 90, 12 CONTROL "", IDC_LINE_SEP, "static", SS_ETCHEDVERT | WS_CHILD | WS_VISIBLE, 130, 7, 1, 200 -} +END diff --git a/reactos/base/applications/sndvol32/lang/pt-BR.rc b/reactos/base/applications/sndvol32/lang/pt-BR.rc index 1ac83c3b29e..4e3587f9664 100644 --- a/reactos/base/applications/sndvol32/lang/pt-BR.rc +++ b/reactos/base/applications/sndvol32/lang/pt-BR.rc @@ -32,7 +32,7 @@ END IDD_PREFERENCES DIALOGEX 0, 0, 224, 250 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Propriedades" -FONT 8, "MS Shell Dlg", 0, 0, 0x0 +FONT 8, "MS Shell Dlg" BEGIN LTEXT "Dispositivo de &mixagem:", -1, 7,8,48,9 COMBOBOX IDC_MIXERDEVICE, 55,8,162,80, CBS_DROPDOWNLIST | WS_TABSTOP @@ -47,3 +47,17 @@ BEGIN PUSHBUTTON "OK", IDOK, 114,226,50,14 PUSHBUTTON "Cancelar", IDCANCEL, 168,226,50,14 END + +IDD_VOLUME_CTRL DIALOGEX 0, 0, 90, 150 +STYLE WS_POPUP | WS_BORDER +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Master", IDC_LINE_NAME, 4, 7, 100, 15 + CONTROL "", -1, "static", SS_ETCHEDHORZ | WS_CHILD | WS_VISIBLE, 4, 30, 82, 1 + LTEXT "Balance", -1, 4, 35, 80, 42 + LTEXT "Volume", -1, 4, 100, 77, 108 + CONTROL "", IDC_LINE_SLIDER_HORZ, "msctls_trackbar32", TBS_HORZ | TBS_AUTOTICKS | TBS_BOTH | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 25, 55, 85, 30 + CONTROL "", IDC_LINE_SLIDER_VERT, "msctls_trackbar32", TBS_VERT | TBS_AUTOTICKS | TBS_BOTH | TBS_DOWNISLEFT | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 32, 115, 30, 70 + CHECKBOX "&Mute", IDC_LINE_SWITCH, 4, 190, 90, 12, BS_AUTOCHECKBOX + CONTROL "", IDC_LINE_SEP, "static", SS_ETCHEDVERT | WS_CHILD | WS_VISIBLE, 130, 7, 1, 200 +END diff --git a/reactos/base/applications/sndvol32/lang/ru-RU.rc b/reactos/base/applications/sndvol32/lang/ru-RU.rc index 2df0d40ff4d..0e418146820 100644 --- a/reactos/base/applications/sndvol32/lang/ru-RU.rc +++ b/reactos/base/applications/sndvol32/lang/ru-RU.rc @@ -28,7 +28,7 @@ END IDD_PREFERENCES DIALOGEX 0, 0, 224, 250 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "" -FONT 8, "MS Shell Dlg", 0, 0, 0x0 +FONT 8, "MS Shell Dlg" BEGIN LTEXT "&:", -1, 7,8,48,9 COMBOBOX IDC_MIXERDEVICE, 55,8,162,80, CBS_DROPDOWNLIST | WS_TABSTOP @@ -43,3 +43,17 @@ BEGIN PUSHBUTTON "OK", IDOK, 114,226,50,14 PUSHBUTTON "", IDCANCEL, 168,226,50,14 END + +IDD_VOLUME_CTRL DIALOGEX 0, 0, 90, 150 +STYLE WS_POPUP | WS_BORDER +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Master", IDC_LINE_NAME, 4, 7, 100, 15 + CONTROL "", -1, "static", SS_ETCHEDHORZ | WS_CHILD | WS_VISIBLE, 4, 30, 82, 1 + LTEXT "Balance", -1, 4, 35, 80, 42 + LTEXT "Volume", -1, 4, 100, 77, 108 + CONTROL "", IDC_LINE_SLIDER_HORZ, "msctls_trackbar32", TBS_HORZ | TBS_AUTOTICKS | TBS_BOTH | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 25, 55, 85, 30 + CONTROL "", IDC_LINE_SLIDER_VERT, "msctls_trackbar32", TBS_VERT | TBS_AUTOTICKS | TBS_BOTH | TBS_DOWNISLEFT | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 32, 115, 30, 70 + CHECKBOX "&Mute", IDC_LINE_SWITCH, 4, 190, 90, 12, BS_AUTOCHECKBOX + CONTROL "", IDC_LINE_SEP, "static", SS_ETCHEDVERT | WS_CHILD | WS_VISIBLE, 130, 7, 1, 200 +END diff --git a/reactos/base/applications/sndvol32/lang/sk-SK.rc b/reactos/base/applications/sndvol32/lang/sk-SK.rc index dab622215d0..4235f12a9fe 100644 --- a/reactos/base/applications/sndvol32/lang/sk-SK.rc +++ b/reactos/base/applications/sndvol32/lang/sk-SK.rc @@ -30,7 +30,7 @@ END IDD_PREFERENCES DIALOGEX 0, 0, 224, 250 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Vlastnosti" -FONT 8, "MS Shell Dlg", 0, 0, 0x0 +FONT 8, "MS Shell Dlg" BEGIN LTEXT "&Zariadenie zmieavaa:", -1, 7,4,43,16 COMBOBOX IDC_MIXERDEVICE, 55,8,162,80, CBS_DROPDOWNLIST | WS_TABSTOP @@ -45,3 +45,17 @@ BEGIN PUSHBUTTON "OK", IDOK, 114,226,50,14 PUSHBUTTON "Zrui", IDCANCEL, 168,226,50,14 END + +IDD_VOLUME_CTRL DIALOGEX 0, 0, 90, 150 +STYLE WS_POPUP | WS_BORDER +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Master", IDC_LINE_NAME, 4, 7, 100, 15 + CONTROL "", -1, "static", SS_ETCHEDHORZ | WS_CHILD | WS_VISIBLE, 4, 30, 82, 1 + LTEXT "Balance", -1, 4, 35, 80, 42 + LTEXT "Volume", -1, 4, 100, 77, 108 + CONTROL "", IDC_LINE_SLIDER_HORZ, "msctls_trackbar32", TBS_HORZ | TBS_AUTOTICKS | TBS_BOTH | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 25, 55, 85, 30 + CONTROL "", IDC_LINE_SLIDER_VERT, "msctls_trackbar32", TBS_VERT | TBS_AUTOTICKS | TBS_BOTH | TBS_DOWNISLEFT | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 32, 115, 30, 70 + CHECKBOX "&Mute", IDC_LINE_SWITCH, 4, 190, 90, 12, BS_AUTOCHECKBOX + CONTROL "", IDC_LINE_SEP, "static", SS_ETCHEDVERT | WS_CHILD | WS_VISIBLE, 130, 7, 1, 200 +END diff --git a/reactos/base/applications/sndvol32/lang/sv-SE.rc b/reactos/base/applications/sndvol32/lang/sv-SE.rc index 14f7f493dde..ef9c1ed6558 100644 --- a/reactos/base/applications/sndvol32/lang/sv-SE.rc +++ b/reactos/base/applications/sndvol32/lang/sv-SE.rc @@ -46,7 +46,7 @@ END IDD_PREFERENCES DIALOGEX 0, 0, 224, 250 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Instllningar" -FONT 8, "MS Shell Dlg", 0, 0, 0x0 +FONT 8, "MS Shell Dlg" BEGIN LTEXT "&Mixerenhet:", -1, 7,8,48,9 COMBOBOX IDC_MIXERDEVICE, 55,8,162,80, CBS_DROPDOWNLIST | WS_TABSTOP @@ -61,3 +61,17 @@ BEGIN PUSHBUTTON "OK", IDOK, 114,226,50,14 PUSHBUTTON "Avbryt", IDCANCEL, 168,226,50,14 END + +IDD_VOLUME_CTRL DIALOGEX 0, 0, 90, 150 +STYLE WS_POPUP | WS_BORDER +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Master", IDC_LINE_NAME, 4, 7, 100, 15 + CONTROL "", -1, "static", SS_ETCHEDHORZ | WS_CHILD | WS_VISIBLE, 4, 30, 82, 1 + LTEXT "Balance", -1, 4, 35, 80, 42 + LTEXT "Volume", -1, 4, 100, 77, 108 + CONTROL "", IDC_LINE_SLIDER_HORZ, "msctls_trackbar32", TBS_HORZ | TBS_AUTOTICKS | TBS_BOTH | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 25, 55, 85, 30 + CONTROL "", IDC_LINE_SLIDER_VERT, "msctls_trackbar32", TBS_VERT | TBS_AUTOTICKS | TBS_BOTH | TBS_DOWNISLEFT | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 32, 115, 30, 70 + CHECKBOX "&Mute", IDC_LINE_SWITCH, 4, 190, 90, 12, BS_AUTOCHECKBOX + CONTROL "", IDC_LINE_SEP, "static", SS_ETCHEDVERT | WS_CHILD | WS_VISIBLE, 130, 7, 1, 200 +END diff --git a/reactos/base/applications/sndvol32/lang/th-TH.rc b/reactos/base/applications/sndvol32/lang/th-TH.rc index fa7a65ac1f6..185ccc3af59 100644 --- a/reactos/base/applications/sndvol32/lang/th-TH.rc +++ b/reactos/base/applications/sndvol32/lang/th-TH.rc @@ -34,7 +34,7 @@ END IDD_PREFERENCES DIALOGEX 0, 0, 224, 250 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "سѵ" -FONT 8, "MS Shell Dlg", 0, 0, 0x0 +FONT 8, "MS Shell Dlg" BEGIN LTEXT "ػó&Ѻ§:", -1, 7,8,48,9 COMBOBOX IDC_MIXERDEVICE, 55,8,162,80, CBS_DROPDOWNLIST | WS_TABSTOP @@ -49,3 +49,17 @@ BEGIN PUSHBUTTON "ŧ", IDOK, 114,226,50,14 PUSHBUTTON "¡ԡ", IDCANCEL, 168,226,50,14 END + +IDD_VOLUME_CTRL DIALOGEX 0, 0, 90, 150 +STYLE WS_POPUP | WS_BORDER +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Master", IDC_LINE_NAME, 4, 7, 100, 15 + CONTROL "", -1, "static", SS_ETCHEDHORZ | WS_CHILD | WS_VISIBLE, 4, 30, 82, 1 + LTEXT "Balance", -1, 4, 35, 80, 42 + LTEXT "Volume", -1, 4, 100, 77, 108 + CONTROL "", IDC_LINE_SLIDER_HORZ, "msctls_trackbar32", TBS_HORZ | TBS_AUTOTICKS | TBS_BOTH | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 25, 55, 85, 30 + CONTROL "", IDC_LINE_SLIDER_VERT, "msctls_trackbar32", TBS_VERT | TBS_AUTOTICKS | TBS_BOTH | TBS_DOWNISLEFT | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 32, 115, 30, 70 + CHECKBOX "&Mute", IDC_LINE_SWITCH, 4, 190, 90, 12, BS_AUTOCHECKBOX + CONTROL "", IDC_LINE_SEP, "static", SS_ETCHEDVERT | WS_CHILD | WS_VISIBLE, 130, 7, 1, 200 +END diff --git a/reactos/base/applications/sndvol32/lang/uk-UA.rc b/reactos/base/applications/sndvol32/lang/uk-UA.rc index 92ea581bf7d..332516c10e9 100644 --- a/reactos/base/applications/sndvol32/lang/uk-UA.rc +++ b/reactos/base/applications/sndvol32/lang/uk-UA.rc @@ -34,7 +34,7 @@ END IDD_PREFERENCES DIALOGEX 0, 0, 224, 250 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "" -FONT 8, "MS Shell Dlg", 0, 0, 0x0 +FONT 8, "MS Shell Dlg" BEGIN LTEXT "&̳:", -1, 7,8,48,9 COMBOBOX IDC_MIXERDEVICE, 55,8,162,80, CBS_DROPDOWNLIST | WS_TABSTOP @@ -49,3 +49,17 @@ BEGIN PUSHBUTTON "OK", IDOK, 114,226,50,14 PUSHBUTTON "", IDCANCEL, 168,226,50,14 END + +IDD_VOLUME_CTRL DIALOGEX 0, 0, 90, 150 +STYLE WS_POPUP | WS_BORDER +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Master", IDC_LINE_NAME, 4, 7, 100, 15 + CONTROL "", -1, "static", SS_ETCHEDHORZ | WS_CHILD | WS_VISIBLE, 4, 30, 82, 1 + LTEXT "Balance", -1, 4, 35, 80, 42 + LTEXT "Volume", -1, 4, 100, 77, 108 + CONTROL "", IDC_LINE_SLIDER_HORZ, "msctls_trackbar32", TBS_HORZ | TBS_AUTOTICKS | TBS_BOTH | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 25, 55, 85, 30 + CONTROL "", IDC_LINE_SLIDER_VERT, "msctls_trackbar32", TBS_VERT | TBS_AUTOTICKS | TBS_BOTH | TBS_DOWNISLEFT | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 32, 115, 30, 70 + CHECKBOX "&Mute", IDC_LINE_SWITCH, 4, 190, 90, 12, BS_AUTOCHECKBOX + CONTROL "", IDC_LINE_SEP, "static", SS_ETCHEDVERT | WS_CHILD | WS_VISIBLE, 130, 7, 1, 200 +END From bec28e056ef903050f3bfa24272102d586586b86 Mon Sep 17 00:00:00 2001 From: Daniel Reimer Date: Sat, 9 Apr 2011 15:21:22 +0000 Subject: [PATCH 114/317] Partial revert, as explained on ML. Sry... svn path=/trunk/; revision=51297 --- reactos/base/applications/sndvol32/lang/bg-BG.rc | 2 +- reactos/base/applications/sndvol32/lang/cs-CZ.rc | 2 +- reactos/base/applications/sndvol32/lang/de-DE.rc | 2 +- reactos/base/applications/sndvol32/lang/el-GR.rc | 2 +- reactos/base/applications/sndvol32/lang/en-US.rc | 2 +- reactos/base/applications/sndvol32/lang/es-ES.rc | 2 +- reactos/base/applications/sndvol32/lang/fr-FR.rc | 2 +- reactos/base/applications/sndvol32/lang/hu-HU.rc | 2 +- reactos/base/applications/sndvol32/lang/id-ID.rc | 2 +- reactos/base/applications/sndvol32/lang/it-IT.rc | 2 +- reactos/base/applications/sndvol32/lang/ja-JP.rc | 2 +- reactos/base/applications/sndvol32/lang/ko-KR.rc | 2 +- reactos/base/applications/sndvol32/lang/lt-LT.rc | 2 +- reactos/base/applications/sndvol32/lang/nl-NL.rc | 2 +- reactos/base/applications/sndvol32/lang/no-NO.rc | 2 +- reactos/base/applications/sndvol32/lang/pl-PL.rc | 2 +- reactos/base/applications/sndvol32/lang/pt-BR.rc | 2 +- reactos/base/applications/sndvol32/lang/ru-RU.rc | 2 +- reactos/base/applications/sndvol32/lang/sk-SK.rc | 2 +- reactos/base/applications/sndvol32/lang/sv-SE.rc | 2 +- reactos/base/applications/sndvol32/lang/th-TH.rc | 2 +- reactos/base/applications/sndvol32/lang/uk-UA.rc | 2 +- 22 files changed, 22 insertions(+), 22 deletions(-) diff --git a/reactos/base/applications/sndvol32/lang/bg-BG.rc b/reactos/base/applications/sndvol32/lang/bg-BG.rc index c1927f2d649..7b5f30b2e58 100644 --- a/reactos/base/applications/sndvol32/lang/bg-BG.rc +++ b/reactos/base/applications/sndvol32/lang/bg-BG.rc @@ -42,7 +42,7 @@ BEGIN PUSHBUTTON "", IDCANCEL, 168,226,50,14 END -IDD_VOLUME_CTRL DIALOGEX 0, 0, 90, 150 +IDD_VOLUME_CTRL DIALOGE0, 0, 90, 150 STYLE WS_POPUP | WS_BORDER FONT 8, "MS Shell Dlg" BEGIN diff --git a/reactos/base/applications/sndvol32/lang/cs-CZ.rc b/reactos/base/applications/sndvol32/lang/cs-CZ.rc index 9e737209577..59ea4472c47 100644 --- a/reactos/base/applications/sndvol32/lang/cs-CZ.rc +++ b/reactos/base/applications/sndvol32/lang/cs-CZ.rc @@ -48,7 +48,7 @@ BEGIN PUSHBUTTON "Storno", IDCANCEL, 168,226,50,14 END -IDD_VOLUME_CTRL DIALOGEX 0, 0, 90, 150 +IDD_VOLUME_CTRL DIALOG 0, 0, 90, 150 STYLE WS_POPUP | WS_BORDER FONT 8, "MS Shell Dlg" BEGIN diff --git a/reactos/base/applications/sndvol32/lang/de-DE.rc b/reactos/base/applications/sndvol32/lang/de-DE.rc index 8cdfa1058eb..62649adfdcb 100644 --- a/reactos/base/applications/sndvol32/lang/de-DE.rc +++ b/reactos/base/applications/sndvol32/lang/de-DE.rc @@ -42,7 +42,7 @@ BEGIN PUSHBUTTON "Abbrechen", IDCANCEL, 168,226,50,14 END -IDD_VOLUME_CTRL DIALOGEX 0, 0, 90, 150 +IDD_VOLUME_CTRL DIALOG 0, 0, 90, 150 STYLE WS_POPUP | WS_BORDER FONT 8, "MS Shell Dlg" BEGIN diff --git a/reactos/base/applications/sndvol32/lang/el-GR.rc b/reactos/base/applications/sndvol32/lang/el-GR.rc index a535250aaa7..494562634a5 100644 --- a/reactos/base/applications/sndvol32/lang/el-GR.rc +++ b/reactos/base/applications/sndvol32/lang/el-GR.rc @@ -42,7 +42,7 @@ BEGIN PUSHBUTTON "", IDCANCEL, 168,226,50,14 END -IDD_VOLUME_CTRL DIALOGEX 0, 0, 90, 150 +IDD_VOLUME_CTRL DIALOG 0, 0, 90, 150 STYLE WS_POPUP | WS_BORDER FONT 8, "MS Shell Dlg" BEGIN diff --git a/reactos/base/applications/sndvol32/lang/en-US.rc b/reactos/base/applications/sndvol32/lang/en-US.rc index bc2a63ed644..7cfb7463cff 100644 --- a/reactos/base/applications/sndvol32/lang/en-US.rc +++ b/reactos/base/applications/sndvol32/lang/en-US.rc @@ -42,7 +42,7 @@ BEGIN PUSHBUTTON "Cancel", IDCANCEL, 168,226,50,14 END -IDD_VOLUME_CTRL DIALOGEX 0, 0, 90, 150 +IDD_VOLUME_CTRL DIALOG 0, 0, 90, 150 STYLE WS_POPUP | WS_BORDER FONT 8, "MS Shell Dlg" BEGIN diff --git a/reactos/base/applications/sndvol32/lang/es-ES.rc b/reactos/base/applications/sndvol32/lang/es-ES.rc index fdbde68f3a9..87679de56a2 100644 --- a/reactos/base/applications/sndvol32/lang/es-ES.rc +++ b/reactos/base/applications/sndvol32/lang/es-ES.rc @@ -46,7 +46,7 @@ BEGIN PUSHBUTTON "Cancelar", IDCANCEL, 168,226,50,14 END -IDD_VOLUME_CTRL DIALOGEX 0, 0, 90, 150 +IDD_VOLUME_CTRL DIALOG 0, 0, 90, 150 STYLE WS_POPUP | WS_BORDER FONT 8, "MS Shell Dlg" BEGIN diff --git a/reactos/base/applications/sndvol32/lang/fr-FR.rc b/reactos/base/applications/sndvol32/lang/fr-FR.rc index 88040752989..b43fb850b10 100644 --- a/reactos/base/applications/sndvol32/lang/fr-FR.rc +++ b/reactos/base/applications/sndvol32/lang/fr-FR.rc @@ -42,7 +42,7 @@ BEGIN PUSHBUTTON "Annuler", IDCANCEL, 168,226,50,14 END -IDD_VOLUME_CTRL DIALOGEX 0, 0, 90, 150 +IDD_VOLUME_CTRL DIALOG 0, 0, 90, 150 STYLE WS_POPUP | WS_BORDER FONT 8, "MS Shell Dlg" BEGIN diff --git a/reactos/base/applications/sndvol32/lang/hu-HU.rc b/reactos/base/applications/sndvol32/lang/hu-HU.rc index 0cf10ea2603..22c9a1b5712 100644 --- a/reactos/base/applications/sndvol32/lang/hu-HU.rc +++ b/reactos/base/applications/sndvol32/lang/hu-HU.rc @@ -46,7 +46,7 @@ BEGIN PUSHBUTTON "Mgse", IDCANCEL, 168,226,50,14 END -IDD_VOLUME_CTRL DIALOGEX 0, 0, 90, 150 +IDD_VOLUME_CTRL DIALOG 0, 0, 90, 150 STYLE WS_POPUP | WS_BORDER FONT 8, "MS Shell Dlg" BEGIN diff --git a/reactos/base/applications/sndvol32/lang/id-ID.rc b/reactos/base/applications/sndvol32/lang/id-ID.rc index 25f6a97daaf..487e5fd7630 100644 --- a/reactos/base/applications/sndvol32/lang/id-ID.rc +++ b/reactos/base/applications/sndvol32/lang/id-ID.rc @@ -42,7 +42,7 @@ BEGIN PUSHBUTTON "Batal", IDCANCEL, 168,226,50,14 END -IDD_VOLUME_CTRL DIALOGEX 0, 0, 90, 150 +IDD_VOLUME_CTRL DIALOG 0, 0, 90, 150 STYLE WS_POPUP | WS_BORDER FONT 8, "MS Shell Dlg" BEGIN diff --git a/reactos/base/applications/sndvol32/lang/it-IT.rc b/reactos/base/applications/sndvol32/lang/it-IT.rc index 0897c1b922b..ad7733250e6 100644 --- a/reactos/base/applications/sndvol32/lang/it-IT.rc +++ b/reactos/base/applications/sndvol32/lang/it-IT.rc @@ -42,7 +42,7 @@ BEGIN PUSHBUTTON "Annulla", IDCANCEL, 168,226,50,14 END -IDD_VOLUME_CTRL DIALOGEX 0, 0, 90, 150 +IDD_VOLUME_CTRL DIALOG 0, 0, 90, 150 STYLE WS_POPUP | WS_BORDER FONT 8, "MS Shell Dlg" BEGIN diff --git a/reactos/base/applications/sndvol32/lang/ja-JP.rc b/reactos/base/applications/sndvol32/lang/ja-JP.rc index 8e4955f2376..fbc946cf7b9 100644 --- a/reactos/base/applications/sndvol32/lang/ja-JP.rc +++ b/reactos/base/applications/sndvol32/lang/ja-JP.rc @@ -42,7 +42,7 @@ BEGIN PUSHBUTTON "LZ", IDCANCEL, 168,226,50,14 END -IDD_VOLUME_CTRL DIALOGEX 0, 0, 90, 150 +IDD_VOLUME_CTRL DIALOG 0, 0, 90, 150 STYLE WS_POPUP | WS_BORDER FONT 9, "MS UI Gothic" BEGIN diff --git a/reactos/base/applications/sndvol32/lang/ko-KR.rc b/reactos/base/applications/sndvol32/lang/ko-KR.rc index b537ff49d1a..0a6458b4158 100644 --- a/reactos/base/applications/sndvol32/lang/ko-KR.rc +++ b/reactos/base/applications/sndvol32/lang/ko-KR.rc @@ -45,7 +45,7 @@ BEGIN PUSHBUTTON "", IDCANCEL, 168,226,50,14 END -IDD_VOLUME_CTRL DIALOGEX 0, 0, 90, 150 +IDD_VOLUME_CTRL DIALOG 0, 0, 90, 150 STYLE WS_POPUP | WS_BORDER FONT 8, "MS Shell Dlg" BEGIN diff --git a/reactos/base/applications/sndvol32/lang/lt-LT.rc b/reactos/base/applications/sndvol32/lang/lt-LT.rc index 503990cdb3f..00a5da58c75 100644 --- a/reactos/base/applications/sndvol32/lang/lt-LT.rc +++ b/reactos/base/applications/sndvol32/lang/lt-LT.rc @@ -44,7 +44,7 @@ BEGIN PUSHBUTTON "Atsisakyti", IDCANCEL, 168,226,50,14 END -IDD_VOLUME_CTRL DIALOGEX 0, 0, 90, 150 +IDD_VOLUME_CTRL DIALOG 0, 0, 90, 150 STYLE WS_POPUP | WS_BORDER FONT 8, "MS Shell Dlg" BEGIN diff --git a/reactos/base/applications/sndvol32/lang/nl-NL.rc b/reactos/base/applications/sndvol32/lang/nl-NL.rc index b9d39dc92e0..599f8f2ea8f 100644 --- a/reactos/base/applications/sndvol32/lang/nl-NL.rc +++ b/reactos/base/applications/sndvol32/lang/nl-NL.rc @@ -42,7 +42,7 @@ BEGIN PUSHBUTTON "Annuleren", IDCANCEL, 168,226,50,14 END -IDD_VOLUME_CTRL DIALOGEX 0, 0, 90, 150 +IDD_VOLUME_CTRL DIALOG 0, 0, 90, 150 STYLE WS_POPUP | WS_BORDER FONT 8, "MS Shell Dlg" BEGIN diff --git a/reactos/base/applications/sndvol32/lang/no-NO.rc b/reactos/base/applications/sndvol32/lang/no-NO.rc index f124d3abaa7..71157947276 100644 --- a/reactos/base/applications/sndvol32/lang/no-NO.rc +++ b/reactos/base/applications/sndvol32/lang/no-NO.rc @@ -42,7 +42,7 @@ BEGIN PUSHBUTTON "Avbryt", IDCANCEL, 168,226,50,14 END -IDD_VOLUME_CTRL DIALOGEX 0, 0, 90, 150 +IDD_VOLUME_CTRL DIALOG 0, 0, 90, 150 STYLE WS_POPUP | WS_BORDER FONT 8, "MS Shell Dlg" BEGIN diff --git a/reactos/base/applications/sndvol32/lang/pl-PL.rc b/reactos/base/applications/sndvol32/lang/pl-PL.rc index ee226dd2cac..293096030af 100644 --- a/reactos/base/applications/sndvol32/lang/pl-PL.rc +++ b/reactos/base/applications/sndvol32/lang/pl-PL.rc @@ -50,7 +50,7 @@ BEGIN PUSHBUTTON "Anuluj", IDCANCEL, 168,226,50,14 END -IDD_VOLUME_CTRL DIALOGEX 0, 0, 90, 150 +IDD_VOLUME_CTRL DIALOG 0, 0, 90, 150 STYLE WS_POPUP | WS_BORDER FONT 8, "MS Shell Dlg" BEGIN diff --git a/reactos/base/applications/sndvol32/lang/pt-BR.rc b/reactos/base/applications/sndvol32/lang/pt-BR.rc index 4e3587f9664..7e33c7a5ffa 100644 --- a/reactos/base/applications/sndvol32/lang/pt-BR.rc +++ b/reactos/base/applications/sndvol32/lang/pt-BR.rc @@ -48,7 +48,7 @@ BEGIN PUSHBUTTON "Cancelar", IDCANCEL, 168,226,50,14 END -IDD_VOLUME_CTRL DIALOGEX 0, 0, 90, 150 +IDD_VOLUME_CTRL DIALOG 0, 0, 90, 150 STYLE WS_POPUP | WS_BORDER FONT 8, "MS Shell Dlg" BEGIN diff --git a/reactos/base/applications/sndvol32/lang/ru-RU.rc b/reactos/base/applications/sndvol32/lang/ru-RU.rc index 0e418146820..1fc2c86b91b 100644 --- a/reactos/base/applications/sndvol32/lang/ru-RU.rc +++ b/reactos/base/applications/sndvol32/lang/ru-RU.rc @@ -44,7 +44,7 @@ BEGIN PUSHBUTTON "", IDCANCEL, 168,226,50,14 END -IDD_VOLUME_CTRL DIALOGEX 0, 0, 90, 150 +IDD_VOLUME_CTRL DIALOG 0, 0, 90, 150 STYLE WS_POPUP | WS_BORDER FONT 8, "MS Shell Dlg" BEGIN diff --git a/reactos/base/applications/sndvol32/lang/sk-SK.rc b/reactos/base/applications/sndvol32/lang/sk-SK.rc index 4235f12a9fe..8a9e1960bdc 100644 --- a/reactos/base/applications/sndvol32/lang/sk-SK.rc +++ b/reactos/base/applications/sndvol32/lang/sk-SK.rc @@ -46,7 +46,7 @@ BEGIN PUSHBUTTON "Zrui", IDCANCEL, 168,226,50,14 END -IDD_VOLUME_CTRL DIALOGEX 0, 0, 90, 150 +IDD_VOLUME_CTRL DIALOG 0, 0, 90, 150 STYLE WS_POPUP | WS_BORDER FONT 8, "MS Shell Dlg" BEGIN diff --git a/reactos/base/applications/sndvol32/lang/sv-SE.rc b/reactos/base/applications/sndvol32/lang/sv-SE.rc index ef9c1ed6558..f10445e2e95 100644 --- a/reactos/base/applications/sndvol32/lang/sv-SE.rc +++ b/reactos/base/applications/sndvol32/lang/sv-SE.rc @@ -62,7 +62,7 @@ BEGIN PUSHBUTTON "Avbryt", IDCANCEL, 168,226,50,14 END -IDD_VOLUME_CTRL DIALOGEX 0, 0, 90, 150 +IDD_VOLUME_CTRL DIALOG 0, 0, 90, 150 STYLE WS_POPUP | WS_BORDER FONT 8, "MS Shell Dlg" BEGIN diff --git a/reactos/base/applications/sndvol32/lang/th-TH.rc b/reactos/base/applications/sndvol32/lang/th-TH.rc index 185ccc3af59..6033a5210bd 100644 --- a/reactos/base/applications/sndvol32/lang/th-TH.rc +++ b/reactos/base/applications/sndvol32/lang/th-TH.rc @@ -50,7 +50,7 @@ BEGIN PUSHBUTTON "¡ԡ", IDCANCEL, 168,226,50,14 END -IDD_VOLUME_CTRL DIALOGEX 0, 0, 90, 150 +IDD_VOLUME_CTRL DIALOG 0, 0, 90, 150 STYLE WS_POPUP | WS_BORDER FONT 8, "MS Shell Dlg" BEGIN diff --git a/reactos/base/applications/sndvol32/lang/uk-UA.rc b/reactos/base/applications/sndvol32/lang/uk-UA.rc index 332516c10e9..8683013dab2 100644 --- a/reactos/base/applications/sndvol32/lang/uk-UA.rc +++ b/reactos/base/applications/sndvol32/lang/uk-UA.rc @@ -50,7 +50,7 @@ BEGIN PUSHBUTTON "", IDCANCEL, 168,226,50,14 END -IDD_VOLUME_CTRL DIALOGEX 0, 0, 90, 150 +IDD_VOLUME_CTRL DIALOG 0, 0, 90, 150 STYLE WS_POPUP | WS_BORDER FONT 8, "MS Shell Dlg" BEGIN From 057f63269309a6b70793568e155104775811d85a Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Sat, 9 Apr 2011 15:28:46 +0000 Subject: [PATCH 115/317] [SNDVOL32] - Remove 'E' svn path=/trunk/; revision=51298 --- reactos/base/applications/sndvol32/lang/bg-BG.rc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/base/applications/sndvol32/lang/bg-BG.rc b/reactos/base/applications/sndvol32/lang/bg-BG.rc index 7b5f30b2e58..89477525d07 100644 --- a/reactos/base/applications/sndvol32/lang/bg-BG.rc +++ b/reactos/base/applications/sndvol32/lang/bg-BG.rc @@ -42,7 +42,7 @@ BEGIN PUSHBUTTON "", IDCANCEL, 168,226,50,14 END -IDD_VOLUME_CTRL DIALOGE0, 0, 90, 150 +IDD_VOLUME_CTRL DIALOG 0, 0, 90, 150 STYLE WS_POPUP | WS_BORDER FONT 8, "MS Shell Dlg" BEGIN From e6b7c8a1e1437544e5efe7722e9aa007591f18f5 Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Sat, 9 Apr 2011 16:34:15 +0000 Subject: [PATCH 116/317] =?UTF-8?q?[EXPLORER=5FNEW]=20-=20Use=20ReactOS=20?= =?UTF-8?q?registry=20key=20for=20ReactOS=20features=20-=20Patch=20by=20Ed?= =?UTF-8?q?ijus=20Kolesnikovi=C3=84=C2=8Ds,=20terminedijs@yahoo.com?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit svn path=/trunk/; revision=51300 --- reactos/base/shell/explorer-new/trayntfy.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/reactos/base/shell/explorer-new/trayntfy.c b/reactos/base/shell/explorer-new/trayntfy.c index 086ba2257d2..5d8cb77c533 100644 --- a/reactos/base/shell/explorer-new/trayntfy.c +++ b/reactos/base/shell/explorer-new/trayntfy.c @@ -19,14 +19,13 @@ */ #include -#include /* * TrayClockWnd */ static const TCHAR szTrayClockWndClass[] = TEXT("TrayClockWClass"); -static LPCTSTR s_szRegistryKey = _T("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced"); +static LPCTSTR s_szRegistryKey = _T("Software\\ReactOS\\Features\\Explorer"); BOOL blShowSeconds; #define ID_TRAYCLOCK_TIMER 0 From 36147ed99d110c984569c29c36d9ddb6b4967ecd Mon Sep 17 00:00:00 2001 From: Giannis Adamopoulos Date: Sat, 9 Apr 2011 19:12:49 +0000 Subject: [PATCH 117/317] add some tests for GetKeyState and SetCursorPos svn path=/trunk/; revision=51304 --- rostests/apitests/user32/GetKeyState.c | 127 ++++++++++++++++++ rostests/apitests/user32/SetCursorPos.c | 41 ++++++ rostests/apitests/user32/testlist.c | 5 +- .../apitests/user32/user32_apitest.rbuild | 2 + 4 files changed, 174 insertions(+), 1 deletion(-) create mode 100644 rostests/apitests/user32/GetKeyState.c create mode 100644 rostests/apitests/user32/SetCursorPos.c diff --git a/rostests/apitests/user32/GetKeyState.c b/rostests/apitests/user32/GetKeyState.c new file mode 100644 index 00000000000..8bc2b9959d8 --- /dev/null +++ b/rostests/apitests/user32/GetKeyState.c @@ -0,0 +1,127 @@ +/* + * PROJECT: ReactOS api tests + * LICENSE: GPL - See COPYING in the top level directory + * PURPOSE: Test for GetKeyState + * PROGRAMMERS: Giannis Adamopoulos + */ + +#include +#include +#include +#include + +HHOOK hKbdHook, hKbdLLHook; + + +LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam) +{ + BOOL pressed = !(lParam & (1<<31)); + BOOL altPressed = lParam & (1<<29); + + if(pressed) + { + ok(altPressed,"\n"); + ok((GetKeyState(VK_MENU) & 0x8000), "Alt should not be pressed\n"); + } + else + { + ok(!altPressed,"\n"); + ok(!(GetKeyState(VK_MENU) & 0x8000), "Alt should be pressed\n"); + } + + return CallNextHookEx(hKbdHook, code, wParam, lParam); +} + +LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) +{ + PKBDLLHOOKSTRUCT pLLHook = (PKBDLLHOOKSTRUCT)lParam; + + if(wParam == WM_SYSKEYDOWN) + { + ok(pLLHook->flags & LLKHF_ALTDOWN,"Didn't get LLKHF_ALTDOWN flag\n"); + ok((GetAsyncKeyState (VK_MENU) & 0x8000), "Alt should not be pressed in global kbd status\n"); + ok(!(GetKeyState(VK_MENU) & 0x8000), "Alt should not be pressed in queue state\n"); + } + else if(wParam == WM_SYSKEYUP) + { + ok(!(pLLHook->flags & LLKHF_ALTDOWN),"got LLKHF_ALTDOWN flag\n"); + ok(!(GetAsyncKeyState (VK_MENU) & 0x8000), "Alt should not be pressed in global kbd status\n"); + ok((GetKeyState(VK_MENU) & 0x8000), "Alt should be pressed in queue state\n"); + } + + return CallNextHookEx(hKbdLLHook, nCode, wParam, lParam); +} + +static LRESULT CALLBACK WndProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam ) +{ + return DefWindowProcA( hWnd, msg, wParam, lParam ); +} + +static HWND CreateTestWindow() +{ + MSG msg; + WNDCLASSA wclass; + HANDLE hInstance = GetModuleHandleA( NULL ); + HWND hWndTest; + + wclass.lpszClassName = "InputSysKeyTestClass"; + wclass.style = CS_HREDRAW | CS_VREDRAW; + wclass.lpfnWndProc = WndProc; + wclass.hInstance = hInstance; + wclass.hIcon = LoadIconA( 0, IDI_APPLICATION ); + wclass.hCursor = LoadCursorA( NULL, IDC_ARROW ); + wclass.hbrBackground = (HBRUSH)( COLOR_WINDOW + 1 ); + wclass.lpszMenuName = 0; + wclass.cbClsExtra = 0; + wclass.cbWndExtra = 0; + RegisterClassA( &wclass ); + /* create the test window that will receive the keystrokes */ + hWndTest = CreateWindowA( wclass.lpszClassName, "InputSysKeyTest", + WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, 100, 100, + NULL, NULL, hInstance, NULL); + assert( hWndTest ); + ShowWindow( hWndTest, SW_SHOW); + SetWindowPos( hWndTest, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE|SWP_NOMOVE ); + SetForegroundWindow( hWndTest ); + UpdateWindow( hWndTest); + + /* flush pending messages */ + while (PeekMessage( &msg, 0, 0, 0, PM_REMOVE )) DispatchMessageA( &msg ); + + return hWndTest; +} + +void Test_GetKeyState() +{ + HWND hwnd; + MSG msg; + + hwnd = CreateTestWindow(); + + hKbdHook = SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, GetModuleHandleA( NULL ), 0); + hKbdLLHook = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, GetModuleHandleA( NULL ), 0); + + ok(hKbdHook!=NULL," \n"); + ok(hKbdLLHook!=NULL," \n"); + + keybd_event(VK_MENU, 0, 0,0); + + while (PeekMessage( &msg, 0, 0, 0, PM_REMOVE )) DispatchMessageA( &msg ); + + keybd_event(VK_MENU, 0, KEYEVENTF_KEYUP,0); + + //fixme this hangs the test + //while (PeekMessage( &msg, 0, 0, 0, PM_REMOVE|PM_NOYIELD )) DispatchMessageA( &msg ); + + DestroyWindow(hwnd); + + while (PeekMessage( &msg, 0, 0, 0, PM_REMOVE )) DispatchMessageA( &msg ); + + UnhookWindowsHookEx (hKbdHook); + UnhookWindowsHookEx (hKbdLLHook); +} + +START_TEST(GetKeyState) +{ + Test_GetKeyState(); +} \ No newline at end of file diff --git a/rostests/apitests/user32/SetCursorPos.c b/rostests/apitests/user32/SetCursorPos.c new file mode 100644 index 00000000000..8896f986f26 --- /dev/null +++ b/rostests/apitests/user32/SetCursorPos.c @@ -0,0 +1,41 @@ +/* + * PROJECT: ReactOS api tests + * LICENSE: GPL - See COPYING in the top level directory + * PURPOSE: Test for SetCursorPos + * PROGRAMMERS: Giannis Adamopoulos + */ + +#include +#include +#include +#include + +HHOOK hMouseHook; +int hook_calls = 0; + +LRESULT CALLBACK LowLevelMouseProc(int nCode, WPARAM wParam, LPARAM lParam) +{ + hook_calls++; + return CallNextHookEx(hMouseHook, nCode, wParam, lParam); +} + +void Test_SetCursorPos() +{ + hMouseHook = SetWindowsHookEx(WH_MOUSE_LL, LowLevelMouseProc, GetModuleHandleA( NULL ), 0); + ok(hMouseHook!=NULL,"failed to set hook\n"); + + /* try SetCursorPos */ + SetCursorPos(0,0); + ok (hook_calls == 0, "hooks shouldn't be called\n"); + + /* try mouse_event with MOUSEEVENTF_MOVE*/ + mouse_event(MOUSEEVENTF_MOVE, 100,100, 0,0); + ok (hook_calls == 1, "hooks should have been called\n"); + + UnhookWindowsHookEx (hMouseHook); +} + +START_TEST(SetCursorPos) +{ + Test_SetCursorPos(); +} \ No newline at end of file diff --git a/rostests/apitests/user32/testlist.c b/rostests/apitests/user32/testlist.c index f89be66ed15..cb95521ee22 100644 --- a/rostests/apitests/user32/testlist.c +++ b/rostests/apitests/user32/testlist.c @@ -13,6 +13,8 @@ extern void func_GetSystemMetrics(void); extern void func_GetIconInfo(void); extern void func_GetPeekMessage(void); extern void func_DeferWindowPos(void); +extern void func_GetKeyState(void); +extern void func_SetCursorPos(void); const struct test winetest_testlist[] = { @@ -24,7 +26,8 @@ const struct test winetest_testlist[] = { "GetIconInfo", func_GetIconInfo }, { "GetPeekMessage", func_GetPeekMessage }, { "DeferWindowPos", func_DeferWindowPos }, - + { "GetKeyState", func_GetKeyState }, + { "SetCursorPos", func_SetCursorPos }, { 0, 0 } }; diff --git a/rostests/apitests/user32/user32_apitest.rbuild b/rostests/apitests/user32/user32_apitest.rbuild index 6f5489c31d2..e703e7905ca 100644 --- a/rostests/apitests/user32/user32_apitest.rbuild +++ b/rostests/apitests/user32/user32_apitest.rbuild @@ -10,6 +10,7 @@ testlist.c user32_apitest.rc + GetKeyState.c InitializeLpkHooks.c RealGetWindowClass.c ScrollDC.c @@ -18,6 +19,7 @@ GetIconInfo.c GetPeekMessage.c DeferWindowPos.c + SetCursorPos.c From 86153cc8a83bfb0d3bf455686b24d0437a2c2778 Mon Sep 17 00:00:00 2001 From: James Tabor Date: Sat, 9 Apr 2011 20:32:52 +0000 Subject: [PATCH 118/317] [Win32k] - Revert parts of 51283, thanks to Giannis for setting me straight on SetCursorPos and without breaking setting the Track window for TrackMouseEvent. Pass the new SetCursorPos, and wine test_TrackMouseEvent and input test_mouse_ll_hook tests. svn path=/trunk/; revision=51305 --- .../win32/win32k/include/cursoricon.h | 2 +- .../win32/win32k/include/msgqueue.h | 2 +- .../win32/win32k/ntuser/cursoricon.c | 8 +++---- reactos/subsystems/win32/win32k/ntuser/hook.c | 4 +--- .../subsystems/win32/win32k/ntuser/input.c | 24 +++++++++---------- .../subsystems/win32/win32k/ntuser/msgqueue.c | 9 ++++--- .../win32/win32k/ntuser/simplecall.c | 2 +- 7 files changed, 26 insertions(+), 25 deletions(-) diff --git a/reactos/subsystems/win32/win32k/include/cursoricon.h b/reactos/subsystems/win32/win32k/include/cursoricon.h index 90cb134ddd3..f60023c5805 100644 --- a/reactos/subsystems/win32/win32k/include/cursoricon.h +++ b/reactos/subsystems/win32/win32k/include/cursoricon.h @@ -69,7 +69,7 @@ BOOL UserDrawIconEx(HDC hDc, INT xLeft, INT yTop, PCURICON_OBJECT pIcon, INT cxW INT cyHeight, UINT istepIfAniCur, HBRUSH hbrFlickerFreeDraw, UINT diFlags); PCURICON_OBJECT FASTCALL UserGetCurIconObject(HCURSOR hCurIcon); -BOOL UserSetCursorPos( INT x, INT y, DWORD flags, ULONG_PTR dwExtraInfo); +BOOL UserSetCursorPos( INT x, INT y, DWORD flags, ULONG_PTR dwExtraInfo, BOOL Hook); int UserShowCursor(BOOL bShow); diff --git a/reactos/subsystems/win32/win32k/include/msgqueue.h b/reactos/subsystems/win32/win32k/include/msgqueue.h index 870cf874527..8b6eeddf998 100644 --- a/reactos/subsystems/win32/win32k/include/msgqueue.h +++ b/reactos/subsystems/win32/win32k/include/msgqueue.h @@ -245,7 +245,7 @@ co_MsqPostKeyboardMessage(UINT uMsg, WPARAM wParam, LPARAM lParam); VOID FASTCALL MsqPostHotKeyMessage(PVOID Thread, HWND hWnd, WPARAM wParam, LPARAM lParam); VOID FASTCALL -co_MsqInsertMouseMessage(MSG* Msg, DWORD flags, ULONG_PTR dwExtraInfo); +co_MsqInsertMouseMessage(MSG* Msg, DWORD flags, ULONG_PTR dwExtraInfo, BOOL Hook); BOOL FASTCALL MsqIsClkLck(LPMSG Msg, BOOL Remove); BOOL FASTCALL diff --git a/reactos/subsystems/win32/win32k/ntuser/cursoricon.c b/reactos/subsystems/win32/win32k/ntuser/cursoricon.c index 54033c258ef..488c2f3ad40 100644 --- a/reactos/subsystems/win32/win32k/ntuser/cursoricon.c +++ b/reactos/subsystems/win32/win32k/ntuser/cursoricon.c @@ -159,7 +159,7 @@ UserSetCursor( return OldCursor; } -BOOL UserSetCursorPos( INT x, INT y, DWORD flags, ULONG_PTR dwExtraInfo) +BOOL UserSetCursorPos( INT x, INT y, DWORD flags, ULONG_PTR dwExtraInfo, BOOL Hook) { PWND DesktopWindow; PSYSTEM_CURSORINFO CurInfo; @@ -194,12 +194,12 @@ BOOL UserSetCursorPos( INT x, INT y, DWORD flags, ULONG_PTR dwExtraInfo) pt.x = x; pt.y = y; - /* 3. Generate a mouse move message, this sets the htEx. */ + /* 3. Generate a mouse move message, this sets the htEx and Track Window too. */ Msg.message = WM_MOUSEMOVE; Msg.wParam = CurInfo->ButtonsDown; Msg.lParam = MAKELPARAM(x, y); Msg.pt = pt; - co_MsqInsertMouseMessage(&Msg, flags, dwExtraInfo); + co_MsqInsertMouseMessage(&Msg, flags, dwExtraInfo, Hook); /* 1. Store the new cursor position */ gpsi->ptCursor = pt; @@ -677,7 +677,7 @@ UserClipCursor( { CurInfo->bClipped = TRUE; RECTL_bIntersectRect(&CurInfo->rcClip, prcl, &DesktopWindow->rcWindow); - UserSetCursorPos(gpsi->ptCursor.x, gpsi->ptCursor.y, 0, 0); + UserSetCursorPos(gpsi->ptCursor.x, gpsi->ptCursor.y, 0, 0, FALSE); } else { diff --git a/reactos/subsystems/win32/win32k/ntuser/hook.c b/reactos/subsystems/win32/win32k/ntuser/hook.c index e252716f921..466232d6b43 100644 --- a/reactos/subsystems/win32/win32k/ntuser/hook.c +++ b/reactos/subsystems/win32/win32k/ntuser/hook.c @@ -1046,7 +1046,7 @@ co_HOOK_CallHooks( INT HookId, ObDereferenceObject(Hook->Thread); } - if ( Global && !pti->sphkCurrent) + if ( Global ) { PTHREADINFO ptiHook; @@ -1061,7 +1061,6 @@ co_HOOK_CallHooks( INT HookId, * hook ID, this will have to post to each of the thread message queues * or make a direct call. */ - pti->sphkCurrent = Hook; // Prevent recursion within this thread. do { /* Hook->Thread is null, we hax around this with Hook->head.pti. */ @@ -1109,7 +1108,6 @@ co_HOOK_CallHooks( INT HookId, } while ( Hook ); DPRINT("Ret: Global HookId %d Result 0x%x\n", HookId,Result); - pti->sphkCurrent = NULL; } Exit: return Result; diff --git a/reactos/subsystems/win32/win32k/ntuser/input.c b/reactos/subsystems/win32/win32k/ntuser/input.c index 6d7d7eacbc3..8e627548112 100644 --- a/reactos/subsystems/win32/win32k/ntuser/input.c +++ b/reactos/subsystems/win32/win32k/ntuser/input.c @@ -1138,7 +1138,7 @@ IntMouseInput(MOUSEINPUT *mi, BOOL Injected) if(mi->dwFlags & MOUSEEVENTF_MOVE) { - UserSetCursorPos(MousePos.x, MousePos.y, Injected, mi->dwExtraInfo); + UserSetCursorPos(MousePos.x, MousePos.y, Injected, mi->dwExtraInfo, TRUE); } if(mi->dwFlags & MOUSEEVENTF_LEFTDOWN) { @@ -1146,7 +1146,7 @@ IntMouseInput(MOUSEINPUT *mi, BOOL Injected) Msg.message = SwapBtnMsg[0][SwapButtons]; CurInfo->ButtonsDown |= SwapBtn[SwapButtons]; Msg.wParam |= CurInfo->ButtonsDown; - co_MsqInsertMouseMessage(&Msg, Injected, mi->dwExtraInfo); + co_MsqInsertMouseMessage(&Msg, Injected, mi->dwExtraInfo, TRUE); } else if(mi->dwFlags & MOUSEEVENTF_LEFTUP) { @@ -1154,7 +1154,7 @@ IntMouseInput(MOUSEINPUT *mi, BOOL Injected) Msg.message = SwapBtnMsg[1][SwapButtons]; CurInfo->ButtonsDown &= ~SwapBtn[SwapButtons]; Msg.wParam |= CurInfo->ButtonsDown; - co_MsqInsertMouseMessage(&Msg, Injected, mi->dwExtraInfo); + co_MsqInsertMouseMessage(&Msg, Injected, mi->dwExtraInfo, TRUE); } if(mi->dwFlags & MOUSEEVENTF_MIDDLEDOWN) { @@ -1162,7 +1162,7 @@ IntMouseInput(MOUSEINPUT *mi, BOOL Injected) Msg.message = WM_MBUTTONDOWN; CurInfo->ButtonsDown |= MK_MBUTTON; Msg.wParam |= CurInfo->ButtonsDown; - co_MsqInsertMouseMessage(&Msg, Injected, mi->dwExtraInfo); + co_MsqInsertMouseMessage(&Msg, Injected, mi->dwExtraInfo, TRUE); } else if(mi->dwFlags & MOUSEEVENTF_MIDDLEUP) { @@ -1170,7 +1170,7 @@ IntMouseInput(MOUSEINPUT *mi, BOOL Injected) Msg.message = WM_MBUTTONUP; CurInfo->ButtonsDown &= ~MK_MBUTTON; Msg.wParam |= CurInfo->ButtonsDown; - co_MsqInsertMouseMessage(&Msg, Injected, mi->dwExtraInfo); + co_MsqInsertMouseMessage(&Msg, Injected, mi->dwExtraInfo, TRUE); } if(mi->dwFlags & MOUSEEVENTF_RIGHTDOWN) { @@ -1178,7 +1178,7 @@ IntMouseInput(MOUSEINPUT *mi, BOOL Injected) Msg.message = SwapBtnMsg[0][!SwapButtons]; CurInfo->ButtonsDown |= SwapBtn[!SwapButtons]; Msg.wParam |= CurInfo->ButtonsDown; - co_MsqInsertMouseMessage(&Msg, Injected, mi->dwExtraInfo); + co_MsqInsertMouseMessage(&Msg, Injected, mi->dwExtraInfo, TRUE); } else if(mi->dwFlags & MOUSEEVENTF_RIGHTUP) { @@ -1186,7 +1186,7 @@ IntMouseInput(MOUSEINPUT *mi, BOOL Injected) Msg.message = SwapBtnMsg[1][!SwapButtons]; CurInfo->ButtonsDown &= ~SwapBtn[!SwapButtons]; Msg.wParam |= CurInfo->ButtonsDown; - co_MsqInsertMouseMessage(&Msg, Injected, mi->dwExtraInfo); + co_MsqInsertMouseMessage(&Msg, Injected, mi->dwExtraInfo, TRUE); } if((mi->dwFlags & (MOUSEEVENTF_XDOWN | MOUSEEVENTF_XUP)) && @@ -1204,14 +1204,14 @@ IntMouseInput(MOUSEINPUT *mi, BOOL Injected) gQueueKeyStateTable[VK_XBUTTON1] |= 0xc0; CurInfo->ButtonsDown |= MK_XBUTTON1; Msg.wParam = MAKEWPARAM(CurInfo->ButtonsDown, XBUTTON1); - co_MsqInsertMouseMessage(&Msg, Injected, mi->dwExtraInfo); + co_MsqInsertMouseMessage(&Msg, Injected, mi->dwExtraInfo, TRUE); } if(mi->mouseData & XBUTTON2) { gQueueKeyStateTable[VK_XBUTTON2] |= 0xc0; CurInfo->ButtonsDown |= MK_XBUTTON2; Msg.wParam = MAKEWPARAM(CurInfo->ButtonsDown, XBUTTON2); - co_MsqInsertMouseMessage(&Msg, Injected, mi->dwExtraInfo); + co_MsqInsertMouseMessage(&Msg, Injected, mi->dwExtraInfo, TRUE); } } else if(mi->dwFlags & MOUSEEVENTF_XUP) @@ -1222,21 +1222,21 @@ IntMouseInput(MOUSEINPUT *mi, BOOL Injected) gQueueKeyStateTable[VK_XBUTTON1] &= ~0x80; CurInfo->ButtonsDown &= ~MK_XBUTTON1; Msg.wParam = MAKEWPARAM(CurInfo->ButtonsDown, XBUTTON1); - co_MsqInsertMouseMessage(&Msg, Injected, mi->dwExtraInfo); + co_MsqInsertMouseMessage(&Msg, Injected, mi->dwExtraInfo, TRUE); } if(mi->mouseData & XBUTTON2) { gQueueKeyStateTable[VK_XBUTTON2] &= ~0x80; CurInfo->ButtonsDown &= ~MK_XBUTTON2; Msg.wParam = MAKEWPARAM(CurInfo->ButtonsDown, XBUTTON2); - co_MsqInsertMouseMessage(&Msg, Injected, mi->dwExtraInfo); + co_MsqInsertMouseMessage(&Msg, Injected, mi->dwExtraInfo, TRUE); } } if(mi->dwFlags & MOUSEEVENTF_WHEEL) { Msg.message = WM_MOUSEWHEEL; Msg.wParam = MAKEWPARAM(CurInfo->ButtonsDown, mi->mouseData); - co_MsqInsertMouseMessage(&Msg, Injected, mi->dwExtraInfo); + co_MsqInsertMouseMessage(&Msg, Injected, mi->dwExtraInfo, TRUE); } return TRUE; diff --git a/reactos/subsystems/win32/win32k/ntuser/msgqueue.c b/reactos/subsystems/win32/win32k/ntuser/msgqueue.c index 2fb518dfed3..8c036a415e1 100644 --- a/reactos/subsystems/win32/win32k/ntuser/msgqueue.c +++ b/reactos/subsystems/win32/win32k/ntuser/msgqueue.c @@ -291,7 +291,7 @@ MsqPostMouseMove(PUSER_MESSAGE_QUEUE MessageQueue, MSG* Msg) } VOID FASTCALL -co_MsqInsertMouseMessage(MSG* Msg, DWORD flags, ULONG_PTR dwExtraInfo) +co_MsqInsertMouseMessage(MSG* Msg, DWORD flags, ULONG_PTR dwExtraInfo, BOOL Hook) { LARGE_INTEGER LargeTickCount; MSLLHOOKSTRUCT MouseHookData; @@ -326,8 +326,11 @@ co_MsqInsertMouseMessage(MSG* Msg, DWORD flags, ULONG_PTR dwExtraInfo) MouseHookData.dwExtraInfo = dwExtraInfo; /* If the hook procedure returned non zero, dont send the message */ - if (co_HOOK_CallHooks(WH_MOUSE_LL, HC_ACTION, Msg->message, (LPARAM) &MouseHookData)) - return; + if (Hook) + { + if (co_HOOK_CallHooks(WH_MOUSE_LL, HC_ACTION, Msg->message, (LPARAM) &MouseHookData)) + return; + } /* Get the desktop window */ pwndDesktop = UserGetDesktopWindow(); diff --git a/reactos/subsystems/win32/win32k/ntuser/simplecall.c b/reactos/subsystems/win32/win32k/ntuser/simplecall.c index c7de5ca265a..af25a1f1a97 100644 --- a/reactos/subsystems/win32/win32k/ntuser/simplecall.c +++ b/reactos/subsystems/win32/win32k/ntuser/simplecall.c @@ -473,7 +473,7 @@ NtUserCallTwoParam( RETURN( (DWORD_PTR)co_IntRegisterLogonProcess((HANDLE)Param1, (BOOL)Param2)); case TWOPARAM_ROUTINE_SETCURSORPOS: - RETURN( (DWORD_PTR)UserSetCursorPos((int)Param1, (int)Param2, 0, 0)); + RETURN( (DWORD_PTR)UserSetCursorPos((int)Param1, (int)Param2, 0, 0, FALSE)); case TWOPARAM_ROUTINE_UNHOOKWINDOWSHOOK: RETURN( IntUnhookWindowsHook((int)Param1, (HOOKPROC)Param2)); From e5989efb7f00abdffd78406cd5205c8c94b779ef Mon Sep 17 00:00:00 2001 From: James Tabor Date: Sat, 9 Apr 2011 20:41:04 +0000 Subject: [PATCH 119/317] - Fix build svn path=/trunk/; revision=51306 --- reactos/subsystems/win32/win32k/ntuser/window.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/subsystems/win32/win32k/ntuser/window.c b/reactos/subsystems/win32/win32k/ntuser/window.c index 52de61e35c2..d11c0df436c 100644 --- a/reactos/subsystems/win32/win32k/ntuser/window.c +++ b/reactos/subsystems/win32/win32k/ntuser/window.c @@ -2575,7 +2575,7 @@ BOOLEAN FASTCALL co_UserDestroyWindow(PWND Window) msg.wParam = IntGetSysCursorInfo()->ButtonsDown; msg.lParam = MAKELPARAM(gpsi->ptCursor.x, gpsi->ptCursor.y); msg.pt = gpsi->ptCursor; - co_MsqInsertMouseMessage(&msg, 0, 0); + co_MsqInsertMouseMessage(&msg, 0, 0, TRUE); if (!IntIsWindow(Window->head.h)) { From 588882aa0074349225487ac5c1b014fc7d6fc860 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Sat, 9 Apr 2011 21:02:25 +0000 Subject: [PATCH 120/317] [DOSKEY/SNDREC32] - Activate polish translations. Patch by Adam Stachowicz. svn path=/trunk/; revision=51307 --- reactos/base/applications/cmdutils/doskey/doskey.rc | 1 + reactos/base/applications/sndrec32/rsrc.rc | 1 + 2 files changed, 2 insertions(+) diff --git a/reactos/base/applications/cmdutils/doskey/doskey.rc b/reactos/base/applications/cmdutils/doskey/doskey.rc index 53772107152..d469d09fec8 100644 --- a/reactos/base/applications/cmdutils/doskey/doskey.rc +++ b/reactos/base/applications/cmdutils/doskey/doskey.rc @@ -9,4 +9,5 @@ #include "lang/bg-BG.rc" #include "lang/de-DE.rc" #include "lang/en-US.rc" +#include "lang/pl-PL.rc" #include "lang/uk-UA.rc" diff --git a/reactos/base/applications/sndrec32/rsrc.rc b/reactos/base/applications/sndrec32/rsrc.rc index a07dd405852..adc11abe1a4 100644 --- a/reactos/base/applications/sndrec32/rsrc.rc +++ b/reactos/base/applications/sndrec32/rsrc.rc @@ -21,6 +21,7 @@ IDB_BITMAP2_STOP_DIS BITMAP "resources/but_stop_dis.bmp" #include "lang/es-ES.rc" #include "lang/it-IT.rc" #include "lang/ja-JP.rc" +#include "lang/pl-PL.rc" #include "lang/sk-SK.rc" #include "lang/uk-UA.rc" From efe9675fbda383f0188ad9366114a102141ccd0e Mon Sep 17 00:00:00 2001 From: Olaf Siejka Date: Sun, 10 Apr 2011 08:49:31 +0000 Subject: [PATCH 121/317] [WIN32CSR] Polish translation of Command prompt window title svn path=/trunk/; revision=51308 --- reactos/subsystems/win32/csrss/win32csr/lang/pl-PL.rc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/reactos/subsystems/win32/csrss/win32csr/lang/pl-PL.rc b/reactos/subsystems/win32/csrss/win32csr/lang/pl-PL.rc index 8ca9f167e8a..3d9d5d2a318 100644 --- a/reactos/subsystems/win32/csrss/win32csr/lang/pl-PL.rc +++ b/reactos/subsystems/win32/csrss/win32csr/lang/pl-PL.rc @@ -2,6 +2,7 @@ * translated by xrogers (http://rogers.cyberdusk.pl/) * xxrogers@users.sourceforge.net * https://sourceforge.net/projects/reactospl +* translation update by Olaf Siejka (Caemyr), Apr 2011 */ LANGUAGE LANG_POLISH, SUBLANG_DEFAULT @@ -59,5 +60,5 @@ BEGIN IDS_SCROLLUP "Przewi do gry" IDS_SCROLLDOWN "Przewi na d" - IDS_COMMAND_PROMPT "Command Prompt" + IDS_COMMAND_PROMPT "Wiersz polecenia" END From d896f82fa7d0a00e7919a44fc49148eebf1928f3 Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Sun, 10 Apr 2011 10:44:05 +0000 Subject: [PATCH 122/317] [SHELL32] - Fix control style of property dialogs - Patch Edijs Kolesnikovics, terminedijs@yahoo.com, irc:Edijus svn path=/trunk/; revision=51309 --- reactos/dll/win32/shell32/lang/bg-BG.rc | 44 +++++++++++------------ reactos/dll/win32/shell32/lang/ca-ES.rc | 46 ++++++++++++------------- reactos/dll/win32/shell32/lang/cs-CZ.rc | 44 +++++++++++------------ reactos/dll/win32/shell32/lang/da-DK.rc | 44 +++++++++++------------ reactos/dll/win32/shell32/lang/de-DE.rc | 46 ++++++++++++------------- reactos/dll/win32/shell32/lang/el-GR.rc | 44 +++++++++++------------ reactos/dll/win32/shell32/lang/en-GB.rc | 44 +++++++++++------------ reactos/dll/win32/shell32/lang/en-US.rc | 44 +++++++++++------------ reactos/dll/win32/shell32/lang/es-ES.rc | 44 +++++++++++------------ reactos/dll/win32/shell32/lang/fi-FI.rc | 44 +++++++++++------------ reactos/dll/win32/shell32/lang/fr-FR.rc | 44 +++++++++++------------ reactos/dll/win32/shell32/lang/hu-HU.rc | 44 +++++++++++------------ reactos/dll/win32/shell32/lang/it-IT.rc | 44 +++++++++++------------ reactos/dll/win32/shell32/lang/ja-JP.rc | 44 +++++++++++------------ reactos/dll/win32/shell32/lang/ko-KR.rc | 44 +++++++++++------------ reactos/dll/win32/shell32/lang/nl-NL.rc | 44 +++++++++++------------ reactos/dll/win32/shell32/lang/no-NO.rc | 44 +++++++++++------------ reactos/dll/win32/shell32/lang/pl-PL.rc | 44 +++++++++++------------ reactos/dll/win32/shell32/lang/pt-BR.rc | 44 +++++++++++------------ reactos/dll/win32/shell32/lang/pt-PT.rc | 44 +++++++++++------------ reactos/dll/win32/shell32/lang/ro-RO.rc | 44 +++++++++++------------ reactos/dll/win32/shell32/lang/ru-RU.rc | 44 +++++++++++------------ reactos/dll/win32/shell32/lang/sk-SK.rc | 44 +++++++++++------------ reactos/dll/win32/shell32/lang/sl-SI.rc | 44 +++++++++++------------ reactos/dll/win32/shell32/lang/sv-SE.rc | 44 +++++++++++------------ reactos/dll/win32/shell32/lang/tr-TR.rc | 44 +++++++++++------------ reactos/dll/win32/shell32/lang/uk-UA.rc | 44 +++++++++++------------ reactos/dll/win32/shell32/lang/zh-CN.rc | 44 +++++++++++------------ reactos/dll/win32/shell32/lang/zh-TW.rc | 44 +++++++++++------------ 29 files changed, 640 insertions(+), 640 deletions(-) diff --git a/reactos/dll/win32/shell32/lang/bg-BG.rc b/reactos/dll/win32/shell32/lang/bg-BG.rc index 36a5cf5e23b..4f2b2f9eaa2 100644 --- a/reactos/dll/win32/shell32/lang/bg-BG.rc +++ b/reactos/dll/win32/shell32/lang/bg-BG.rc @@ -170,7 +170,7 @@ BEGIN LTEXT " :", 14004, 10, 30, 60, 10 LTEXT "", 14005, 70, 30, 150, 10 LTEXT " :", 14006, 10, 40, 60, 10 - LTEXT "", 14007, 70, 40, 150, 10 + EDITTEXT 14007, 70, 40, 150, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT ":", 14008, 10, 55, 55, 10 EDITTEXT 14009, 70, 55, 150, 10, ES_LEFT | ES_AUTOHSCROLL LTEXT " :",14010, 10, 65, 55, 10 @@ -209,13 +209,13 @@ BEGIN LTEXT " :", 14004, 8, 35, 50, 10 LTEXT "", 14005, 68, 35, 160, 10 LTEXT ":", 14006, 8, 53, 50, 10 - LTEXT "", 14007, 68, 53, 315, 10 + EDITTEXT 14007, 68, 53, 315, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT ":", 14008, 8, 72, 45, 10 - LTEXT "", 14009, 68, 72, 315, 10 + EDITTEXT 14009, 68, 72, 315, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT ":", 14010, 8, 93, 45, 10 - LTEXT "", 14011, 68, 93, 160, 10 + EDITTEXT 14011, 68, 93, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT ":", 14014, 8, 118, 45, 10 - LTEXT "", 14015, 68, 118, 160, 10 + EDITTEXT 14015, 68, 118, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER AUTOCHECKBOX "& ", 14021, 45, 150, 67, 10 AUTOCHECKBOX "&", 14022, 126, 150, 50, 10 END @@ -230,17 +230,17 @@ BEGIN LTEXT " :", 14004, 8, 35, 50, 10 LTEXT "", 14005, 68, 35, 160, 10 LTEXT " :", 14006, 8, 53, 50, 10 - LTEXT "", 14007, 68, 53, 160, 10 + EDITTEXT 14007, 68, 53, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT ":", 14008, 8, 72, 61, 10 - LTEXT "", 14009, 68, 72, 315, 10 + EDITTEXT 14009, 68, 72, 315, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT ":", 14010, 8, 93, 45, 10 - LTEXT "", 14011, 68, 93, 160, 10 + EDITTEXT 14011, 68, 93, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT ":", 14014, 8, 118, 45, 10 - LTEXT "", 14015, 68, 118, 160, 10 + EDITTEXT 14015, 68, 118, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT ":", 14016, 8, 140, 45, 10 - LTEXT "", 14017, 68, 140, 160, 10 + EDITTEXT 14017, 68, 140, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT ":", 14018, 8, 160, 45, 10 - LTEXT "", 14019, 68, 160, 160, 10 + EDITTEXT 14019, 68, 160, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "", 14020, 8, 189, 60, 10 CHECKBOX " &", 14021, 61, 189, 67, 10 CHECKBOX "&", 14022, 129, 189, 50, 10 @@ -253,11 +253,11 @@ CAPTION " FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN LTEXT " : ", 14000, 10, 10, 67, 10 - LTEXT "", 14001, 77, 10, 152, 10 + EDITTEXT 14001, 77, 10, 152, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT ": ", 14002, 10, 27, 45, 10 - LTEXT "", 14003, 77, 27, 152, 10 + EDITTEXT 14003, 77, 27, 152, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT " : ", 14004, 10, 46, 68, 16 - LTEXT "", 14005, 77, 46, 152, 10 + EDITTEXT 14005, 77, 46, 152, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER GROUPBOX " ", 14006, 6, 70, 222, 115 LTEXT " : ", 14007, 13, 82, 90, 10 LTEXT ": ", 14008, 112, 82, 45, 10 @@ -272,24 +272,24 @@ FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN EDITTEXT 14000, 40, 20, 190, 14, ES_LEFT|WS_BORDER|WS_GROUP LTEXT ":", -1, 15, 55, 40, 10 - LTEXT "", 14001, 110, 55, 100, 10 + EDITTEXT 14001, 110, 55, 100, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT " :", -1, 15, 70, 100, 10 - LTEXT "", 14002, 110, 70, 100, 10 + EDITTEXT 14002, 110, 70, 100, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER CONTROL "", 14013, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 5, 90, 10, 10 LTEXT " :", -1, 25, 90, 120, 10 - LTEXT "", 14003, 110, 90, 120, 10 - LTEXT "", 14004, 200, 90, 40, 10 + EDITTEXT 14003, 110, 90, 85, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER + EDITTEXT 14004, 200, 90, 40, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER CONTROL "", 14014, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 5, 105, 10, 10 LTEXT " :", -1, 25, 105, 70, 10 - LTEXT "", 14005, 110, 105, 120, 10 - LTEXT "", 14006, 200, 105, 40, 10 + EDITTEXT 14005, 110, 105, 85, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER + EDITTEXT 14006, 200, 105, 40, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT ":", -1, 25, 125, 80, 10 - LTEXT "", 14007, 110, 125, 120, 10 - LTEXT "", 14008, 200, 125, 40, 10 + EDITTEXT 14007, 110, 125, 85, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER + EDITTEXT 14008, 200, 125, 40, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER CONTROL "", 14015, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 20, 140, 200, 20 diff --git a/reactos/dll/win32/shell32/lang/ca-ES.rc b/reactos/dll/win32/shell32/lang/ca-ES.rc index 80f7cb41b05..978a58fb51e 100644 --- a/reactos/dll/win32/shell32/lang/ca-ES.rc +++ b/reactos/dll/win32/shell32/lang/ca-ES.rc @@ -168,9 +168,9 @@ FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN ICON "", 14000, 10, 4, 30, 30, WS_VISIBLE LTEXT "Target type:", 14004, 8, 38, 64, 10 - LTEXT "", 14005, 78, 38, 142, 10 + EDITTEXT 14005, 78, 38, 142, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Target location:", 14006, 8, 58, 64, 10 - LTEXT "", 14007, 79, 58, 141, 10 + EDITTEXT 14007, 79, 58, 141, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Target:", 14008, 8, 77, 45, 10 EDITTEXT 14009, 79, 75, 150, 14, ES_AUTOHSCROLL LTEXT "&Start in:", 14010, 8, 96, 57, 10 @@ -209,13 +209,13 @@ BEGIN LTEXT "Type of file:", 14004, 8, 35, 50, 10 LTEXT "Folder", 14005, 68, 35, 160, 10 LTEXT "Location:", 14006, 8, 53, 50, 10 - LTEXT "", 14007, 68, 53, 315, 10 + EDITTEXT 14007, 68, 53, 315, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Size:", 14008, 8, 72, 45, 10 - LTEXT "", 14009, 68, 72, 315, 10 + EDITTEXT 14009, 68, 72, 315, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Contains:", 14010, 8, 93, 45, 10 - LTEXT "", 14011, 68, 93, 160, 10 + EDITTEXT 14011, 68, 93, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Created:", 14014, 8, 118, 45, 10 - LTEXT "", 14015, 68, 118, 160, 10 + EDITTEXT 14015, 68, 118, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER AUTOCHECKBOX "&Read-only", 14021, 45, 150, 67, 10 AUTOCHECKBOX "&Hidden", 14022, 126, 150, 50, 10 END @@ -230,17 +230,17 @@ BEGIN LTEXT "Type of file:", 14004, 8, 35, 50, 10 LTEXT "File", 14005, 68, 35, 160, 10 LTEXT "Opens with:", 14006, 8, 53, 50, 10 - LTEXT "", 14007, 68, 53, 160, 10 + EDITTEXT 14007, 68, 53, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Location:", 14008, 8, 72, 45, 10 - LTEXT "", 14009, 68, 72, 315, 10 + EDITTEXT 14009, 68, 72, 315, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Size:", 14010, 8, 93, 45, 10 - LTEXT "", 14011, 68, 93, 160, 10 + EDITTEXT 14011, 68, 93, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Created:", 14014, 8, 118, 45, 10 - LTEXT "", 14015, 68, 118, 160, 10 + EDITTEXT 14015, 68, 118, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Modified:", 14016, 8, 140, 45, 10 - LTEXT "", 14017, 68, 140, 160, 10 + EDITTEXT 14017, 68, 140, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Accessed:", 14018, 8, 160, 45, 10 - LTEXT "", 14019, 68, 160, 160, 10 + EDITTEXT 14019, 68, 160, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Attributes:", 14020, 8, 189, 45, 10 CHECKBOX "&Read-only", 14021, 58, 189, 67, 10 CHECKBOX "&Hidden", 14022, 126, 189, 50, 10 @@ -253,11 +253,11 @@ CAPTION "Version" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN LTEXT "File version: ", 14000, 10, 10, 55, 10 - LTEXT "", 14001, 77, 10, 152, 10 + EDITTEXT 14001, 77, 10, 152, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Description: ", 14002, 10, 27, 45, 10 - LTEXT "", 14003, 77, 27, 152, 10 + EDITTEXT 14003, 77, 27, 152, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Copyright: ", 14004, 10, 46, 66, 10 - LTEXT "", 14005, 77, 46, 152, 10 + EDITTEXT 14005, 77, 46, 152, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER GROUPBOX "Other version information: ", 14006, 6, 70, 222, 115 LTEXT "Item name: ", 14007, 13, 82, 50, 10 LTEXT "Value: ", 14008, 112, 82, 45, 10 @@ -272,24 +272,24 @@ FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN EDITTEXT 14000, 40, 20, 190, 14, ES_LEFT|WS_BORDER|WS_GROUP LTEXT "Type:", -1, 15, 55, 40, 10 - LTEXT "", 14001, 110, 55, 100, 10 + EDITTEXT 14001, 110, 55, 100, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "File system:", -1, 15, 70, 100, 10 - LTEXT "", 14002, 110, 70, 100, 10 + EDITTEXT 14002, 110, 70, 100, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER CONTROL "", 14013, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 5, 90, 10, 10 LTEXT "Used space:", -1, 25, 90, 120, 10 - LTEXT "", 14003, 110, 90, 120, 10 - LTEXT "", 14004, 200, 90, 40, 10 + EDITTEXT 14003, 110, 90, 85, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER + EDITTEXT 14004, 200, 90, 40, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER CONTROL "", 14014, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 5, 105, 10, 10 LTEXT "Free space:", -1, 25, 105, 70, 10 - LTEXT "", 14005, 110, 105, 120, 10 - LTEXT "", 14006, 200, 105, 40, 10 + EDITTEXT 14005, 110, 105, 85, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER + EDITTEXT 14006, 200, 105, 40, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Capacity:", -1, 25, 125, 80, 10 - LTEXT "", 14007, 110, 125, 120, 10 - LTEXT "", 14008, 200, 125, 40, 10 + EDITTEXT 14007, 110, 125, 85, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER + EDITTEXT 14008, 200, 125, 40, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER CONTROL "", 14015, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 20, 140, 200, 20 diff --git a/reactos/dll/win32/shell32/lang/cs-CZ.rc b/reactos/dll/win32/shell32/lang/cs-CZ.rc index 7dbb4ebbd56..8914ee8a9a8 100644 --- a/reactos/dll/win32/shell32/lang/cs-CZ.rc +++ b/reactos/dll/win32/shell32/lang/cs-CZ.rc @@ -158,7 +158,7 @@ BEGIN LTEXT "Typ cle:", 14004, 8, 38, 64, 10 LTEXT "", 14005, 78, 38, 142, 10 LTEXT "Umstn cle:", 14006, 8, 58, 64, 10 - LTEXT "", 14007, 79, 58, 141, 10 + EDITTEXT 14007, 79, 58, 141, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "&Cl:", 14008, 8, 77, 45, 10 EDITTEXT 14009, 79, 75, 150, 14, ES_AUTOHSCROLL LTEXT "&Spustit v:", 14010, 8, 96, 57, 10 @@ -197,13 +197,13 @@ BEGIN LTEXT "Typ souboru:", 14004, 8, 35, 50, 10 LTEXT "Sloka", 14005, 68, 35, 160, 10 LTEXT "Umstn:", 14006, 8, 53, 50, 10 - LTEXT "", 14007, 68, 53, 315, 10 + EDITTEXT 14007, 68, 53, 315, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Velikost:", 14008, 8, 72, 45, 10 - LTEXT "", 14009, 68, 72, 315, 10 + EDITTEXT 14009, 68, 72, 315, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Obsahuje:", 14010, 8, 93, 45, 10 - LTEXT "", 14011, 68, 93, 160, 10 + EDITTEXT 14011, 68, 93, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Vytvoeno:", 14014, 8, 118, 45, 10 - LTEXT "", 14015, 68, 118, 160, 10 + EDITTEXT 14015, 68, 118, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER AUTOCHECKBOX "&Jen pro ten", 14021, 45, 150, 67, 10 AUTOCHECKBOX "&Skryt", 14022, 126, 150, 50, 10 END @@ -218,17 +218,17 @@ BEGIN LTEXT "Typ souboru:", 14004, 8, 35, 50, 10 LTEXT "Soubor", 14005, 68, 35, 160, 10 LTEXT "Otevrat v:", 14006, 8, 53, 50, 10 - LTEXT "", 14007, 68, 53, 160, 10 + EDITTEXT 14007, 68, 53, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Umstn:", 14008, 8, 72, 45, 10 - LTEXT "", 14009, 68, 72, 315, 10 + EDITTEXT 14009, 68, 72, 315, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Velikost:", 14010, 8, 93, 45, 10 - LTEXT "", 14011, 68, 93, 160, 10 + EDITTEXT 14011, 68, 93, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Vytvoeno:", 14014, 8, 118, 45, 10 - LTEXT "", 14015, 68, 118, 160, 10 + EDITTEXT 14015, 68, 118, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Zmnno:", 14016, 8, 140, 45, 10 - LTEXT "", 14017, 68, 140, 160, 10 + EDITTEXT 14017, 68, 140, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Oteveno:", 14018, 8, 160, 45, 10 - LTEXT "", 14019, 68, 160, 160, 10 + EDITTEXT 14019, 68, 160, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Atributy:", 14020, 8, 189, 45, 10 CHECKBOX "&Jen pro ten", 14021, 58, 189, 67, 10 CHECKBOX "&Skryt", 14022, 126, 189, 50, 10 @@ -241,11 +241,11 @@ CAPTION "Verze" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN LTEXT "Verze souboru: ", 14000, 10, 10, 55, 10 - LTEXT "", 14001, 77, 10, 152, 10 + EDITTEXT 14001, 77, 10, 152, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Popis: ", 14002, 10, 27, 45, 10 - LTEXT "", 14003, 77, 27, 152, 10 + EDITTEXT 14003, 77, 27, 152, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Copyright: ", 14004, 10, 46, 66, 10 - LTEXT "", 14005, 77, 46, 152, 10 + EDITTEXT 14005, 77, 46, 152, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER GROUPBOX "Dal informace o verzi: ", 14006, 6, 70, 222, 115 LTEXT "Nzev poloky: ", 14007, 13, 82, 50, 10 LTEXT "Hodnota: ", 14008, 112, 82, 45, 10 @@ -260,24 +260,24 @@ FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN EDITTEXT 14000, 40, 20, 190, 14, ES_LEFT|WS_BORDER|WS_GROUP LTEXT "Typ:", -1, 15, 55, 40, 10 - LTEXT "", 14001, 110, 55, 100, 10 + EDITTEXT 14001, 110, 55, 100, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Souborov systm:", -1, 15, 70, 100, 10 - LTEXT "", 14002, 110, 70, 100, 10 + EDITTEXT 14002, 110, 70, 100, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER CONTROL "", 14013, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 5, 90, 10, 10 LTEXT "Vyuit msto:", -1, 25, 90, 120, 10 - LTEXT "", 14003, 110, 90, 120, 10 - LTEXT "", 14004, 200, 90, 40, 10 + EDITTEXT 14003, 110, 90, 85, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER + EDITTEXT 14004, 200, 90, 40, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER CONTROL "", 14014, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 5, 105, 10, 10 LTEXT "Voln msto:", -1, 25, 105, 70, 10 - LTEXT "", 14005, 110, 105, 120, 10 - LTEXT "", 14006, 200, 105, 40, 10 + EDITTEXT 14005, 110, 105, 85, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER + EDITTEXT 14006, 200, 105, 40, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Kapacita:", -1, 25, 125, 80, 10 - LTEXT "", 14007, 110, 125, 120, 10 - LTEXT "", 14008, 200, 125, 40, 10 + EDITTEXT 14007, 110, 125, 85, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER + EDITTEXT 14008, 200, 125, 40, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER CONTROL "", 14015, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 20, 140, 200, 20 diff --git a/reactos/dll/win32/shell32/lang/da-DK.rc b/reactos/dll/win32/shell32/lang/da-DK.rc index 00472085917..e0f9152cf03 100644 --- a/reactos/dll/win32/shell32/lang/da-DK.rc +++ b/reactos/dll/win32/shell32/lang/da-DK.rc @@ -158,7 +158,7 @@ BEGIN LTEXT "Target type:", 14004, 8, 38, 64, 10 LTEXT "", 14005, 78, 38, 142, 10 LTEXT "Target location:", 14006, 8, 58, 64, 10 - LTEXT "", 14007, 79, 58, 141, 10 + EDITTEXT 14007, 79, 58, 141, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Target:", 14008, 8, 77, 45, 10 EDITTEXT 14009, 79, 75, 150, 14, ES_AUTOHSCROLL LTEXT "&Start in:", 14010, 8, 96, 57, 10 @@ -197,13 +197,13 @@ BEGIN LTEXT "Type of file:", 14004, 8, 35, 50, 10 LTEXT "Folder", 14005, 68, 35, 160, 10 LTEXT "Location:", 14006, 8, 53, 50, 10 - LTEXT "", 14007, 68, 53, 315, 10 + EDITTEXT 14007, 68, 53, 315, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Size:", 14008, 8, 72, 45, 10 - LTEXT "", 14009, 68, 72, 315, 10 + EDITTEXT 14009, 68, 72, 315, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Contains:", 14010, 8, 93, 45, 10 - LTEXT "", 14011, 68, 93, 160, 10 + EDITTEXT 14011, 68, 93, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Created:", 14014, 8, 118, 45, 10 - LTEXT "", 14015, 68, 118, 160, 10 + EDITTEXT 14015, 68, 118, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER AUTOCHECKBOX "&Read-only", 14021, 45, 150, 67, 10 AUTOCHECKBOX "&Hidden", 14022, 126, 150, 50, 10 END @@ -219,17 +219,17 @@ BEGIN LTEXT "Type of file:", 14004, 8, 35, 50, 10 LTEXT "File", 14005, 68, 35, 160, 10 LTEXT "Opens with:", 14006, 8, 53, 50, 10 - LTEXT "", 14007, 68, 53, 160, 10 + EDITTEXT 14007, 68, 53, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Location:", 14008, 8, 72, 45, 10 - LTEXT "", 14009, 68, 72, 315, 10 + EDITTEXT 14009, 68, 72, 315, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Size:", 14010, 8, 93, 45, 10 - LTEXT "", 14011, 68, 93, 160, 10 + EDITTEXT 14011, 68, 93, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Created:", 14014, 8, 118, 45, 10 - LTEXT "", 14015, 68, 118, 160, 10 + EDITTEXT 14015, 68, 118, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Modified:", 14016, 8, 140, 45, 10 - LTEXT "", 14017, 68, 140, 160, 10 + EDITTEXT 14017, 68, 140, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Accessed:", 14018, 8, 160, 45, 10 - LTEXT "", 14019, 68, 160, 160, 10 + EDITTEXT 14019, 68, 160, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Attributes:", 14020, 8, 189, 45, 10 CHECKBOX "&Read-only", 14021, 58, 189, 67, 10 CHECKBOX "&Hidden", 14022, 126, 189, 50, 10 @@ -242,11 +242,11 @@ CAPTION "Version" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN LTEXT "File version: ", 14000, 10, 10, 55, 10 - LTEXT "", 14001, 77, 10, 152, 10 + EDITTEXT 14001, 77, 10, 152, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Description: ", 14002, 10, 27, 45, 10 - LTEXT "", 14003, 77, 27, 152, 10 + EDITTEXT 14003, 77, 27, 152, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Copyright: ", 14004, 10, 46, 66, 10 - LTEXT "", 14005, 77, 46, 152, 10 + EDITTEXT 14005, 77, 46, 152, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER GROUPBOX "Other version information: ", 14006, 6, 70, 222, 115 LTEXT "Item name: ", 14007, 13, 82, 50, 10 LTEXT "Value: ", 14008, 112, 82, 45, 10 @@ -261,24 +261,24 @@ FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN EDITTEXT 14000, 40, 20, 190, 14, ES_LEFT|WS_BORDER|WS_GROUP LTEXT "Type:", -1, 15, 55, 40, 10 - LTEXT "", 14001, 110, 55, 100, 10 + EDITTEXT 14001, 110, 55, 100, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "File system:", -1, 15, 70, 100, 10 - LTEXT "", 14002, 110, 70, 100, 10 + EDITTEXT 14002, 110, 70, 100, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER CONTROL "", 14013, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 5, 90, 10, 10 LTEXT "Used space:", -1, 25, 90, 120, 10 - LTEXT "", 14003, 110, 90, 120, 10 - LTEXT "", 14004, 200, 90, 40, 10 + EDITTEXT 14003, 110, 90, 85, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER + EDITTEXT 14004, 200, 90, 40, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER CONTROL "", 14014, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 5, 105, 10, 10 LTEXT "Free space:", -1, 25, 105, 70, 10 - LTEXT "", 14005, 110, 105, 120, 10 - LTEXT "", 14006, 200, 105, 40, 10 + EDITTEXT 14005, 110, 105, 85, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER + EDITTEXT 14006, 200, 105, 40, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Capacity:", -1, 25, 125, 80, 10 - LTEXT "", 14007, 110, 125, 120, 10 - LTEXT "", 14008, 200, 125, 40, 10 + EDITTEXT 14007, 110, 125, 85, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER + EDITTEXT 14008, 200, 125, 40, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER CONTROL "", 14015, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 20, 140, 200, 20 diff --git a/reactos/dll/win32/shell32/lang/de-DE.rc b/reactos/dll/win32/shell32/lang/de-DE.rc index 62921561703..42cd6e5b0e5 100644 --- a/reactos/dll/win32/shell32/lang/de-DE.rc +++ b/reactos/dll/win32/shell32/lang/de-DE.rc @@ -170,9 +170,9 @@ FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN ICON "", 14000, 10, 4, 30, 30, WS_VISIBLE LTEXT "Zieltyp:", 14004, 8, 38, 64, 10 - LTEXT "", 14005, 78, 38, 142, 10 + LTEXT "", 14005, 78, 38, 142, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Zielpfad:", 14006, 8, 58, 64, 10 - LTEXT "", 14007, 79, 58, 141, 10 + EDITTEXT 14007, 79, 58, 141, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Ziel:", 14008, 8, 77, 45, 10 EDITTEXT 14009, 79, 75, 150, 14, ES_AUTOHSCROLL LTEXT "&Starten in:", 14010, 8, 96, 57, 10 @@ -211,13 +211,13 @@ BEGIN LTEXT "Typ:", 14004, 8, 35, 50, 10 LTEXT "Dateiordner", 14005, 68, 35, 160, 10 LTEXT "Ort:", 14006, 8, 53, 50, 10 - LTEXT "", 14007, 68, 53, 315, 10 + EDITTEXT 14007, 68, 53, 315, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Gre:", 14008, 8, 72, 45, 10 - LTEXT "", 14009, 68, 72, 315, 10 + EDITTEXT 14009, 68, 72, 315, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Inhalt:", 14010, 8, 93, 45, 10 - LTEXT "", 14011, 68, 93, 160, 10 + EDITTEXT 14011, 68, 93, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Erstellt:", 14014, 8, 118, 45, 10 - LTEXT "", 14015, 68, 118, 160, 10 + EDITTEXT 14015, 68, 118, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER AUTOCHECKBOX "&Schreibgeschtzt", 14021, 45, 150, 67, 10 AUTOCHECKBOX "&Versteckt", 14022, 126, 150, 50, 10 END @@ -233,17 +233,17 @@ BEGIN LTEXT "Dateityp:", 14004, 8, 35, 50, 10 LTEXT "Datei", 14005, 68, 35, 160, 10 LTEXT "ffnen mit:", 14006, 8, 53, 50, 10 - LTEXT "", 14007, 68, 53, 160, 10 + EDITTEXT 14007, 68, 53, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Pfad:", 14008, 8, 72, 45, 10 - LTEXT "", 14009, 68, 72, 315, 10 + EDITTEXT 14009, 68, 72, 315, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Gre:", 14010, 8, 93, 45, 10 - LTEXT "", 14011, 68, 93, 160, 10 + EDITTEXT 14011, 68, 93, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Erstellt:", 14014, 8, 118, 45, 10 - LTEXT "", 14015, 68, 118, 160, 10 + EDITTEXT 14015, 68, 118, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Gendert:", 14016, 8, 140, 45, 10 - LTEXT "", 14017, 68, 140, 160, 10 + EDITTEXT 14017, 68, 140, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Zugegriffen:", 14018, 8, 160, 45, 10 - LTEXT "", 14019, 68, 160, 160, 10 + EDITTEXT 14019, 68, 160, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Attribute:", 14020, 8, 189, 45, 10 CHECKBOX "&Schreibgeschtzt", 14021, 45, 189, 67, 10 CHECKBOX "&Versteckt", 14022, 126, 189, 50, 10 @@ -256,11 +256,11 @@ CAPTION "Version" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN LTEXT "Dateiversion: ", 14000, 10, 10, 55, 10 - LTEXT "", 14001, 77, 10, 152, 10 + EDITTEXT 14001, 77, 10, 152, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Beschreibung: ", 14002, 10, 27, 45, 10 - LTEXT "", 14003, 77, 27, 152, 10 + EDITTEXT 14003, 77, 27, 152, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Copyright: ", 14004, 10, 46, 66, 10 - LTEXT "", 14005, 77, 46, 152, 10 + EDITTEXT 14005, 77, 46, 152, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER GROUPBOX "Weitere Versionsinformationen: ", 14006, 6, 70, 222, 115 LTEXT "Elementname: ", 14007, 13, 82, 50, 10 LTEXT "Wert: ", 14008, 112, 82, 45, 10 @@ -275,24 +275,24 @@ FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN EDITTEXT 14000, 40, 20, 190, 14, ES_LEFT|WS_BORDER|WS_GROUP LTEXT "Typ:", -1, 15, 55, 40, 10 - LTEXT "", 14001, 110, 55, 100, 10 + EDITTEXT 14001, 110, 55, 100, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Dateisystem:", -1, 15, 70, 100, 10 - LTEXT "", 14002, 110, 70, 100, 10 + EDITTEXT 14002, 110, 70, 100, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER CONTROL "", 14013, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 5, 90, 10, 10 LTEXT "Belegter Speicher:", -1, 25, 90, 120, 10 - LTEXT "", 14003, 110, 90, 120, 10 - LTEXT "", 14004, 200, 90, 40, 10 + EDITTEXT 14003, 110, 90, 85, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER + EDITTEXT 14004, 200, 90, 40, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER CONTROL "", 14014, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 5, 105, 10, 10 LTEXT "Freier Speicher:", -1, 25, 105, 70, 10 - LTEXT "", 14005, 110, 105, 120, 10 - LTEXT "", 14006, 200, 105, 40, 10 + EDITTEXT 14005, 110, 105, 85, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER + EDITTEXT 14006, 200, 105, 40, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Speicherkapazitt:", -1, 25, 125, 80, 10 - LTEXT "", 14007, 110, 125, 120, 10 - LTEXT "", 14008, 200, 125, 40, 10 + EDITTEXT 14007, 110, 125, 85, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER + EDITTEXT 14008, 200, 125, 40, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER CONTROL "", 14015, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 20, 140, 200, 20 diff --git a/reactos/dll/win32/shell32/lang/el-GR.rc b/reactos/dll/win32/shell32/lang/el-GR.rc index 80506a2cedf..30542a021ec 100644 --- a/reactos/dll/win32/shell32/lang/el-GR.rc +++ b/reactos/dll/win32/shell32/lang/el-GR.rc @@ -170,7 +170,7 @@ BEGIN LTEXT " :", 14004, 10, 25, 50, 15 LTEXT "", 14005, 70, 30, 150, 10 LTEXT " :", 14006, 10, 40, 70, 10 - LTEXT "", 14007, 70, 40, 150, 10 + EDITTEXT 14007, 70, 40, 150, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT ":", 14008, 10, 55, 45, 10 EDITTEXT 14009, 70, 55, 150, 10, ES_LEFT | ES_AUTOHSCROLL LTEXT "& :",14010, 10, 65, 57, 10 @@ -209,13 +209,13 @@ BEGIN LTEXT "Type of file:", 14004, 8, 35, 50, 10 LTEXT "Folder", 14005, 68, 35, 160, 10 LTEXT "Location:", 14006, 8, 53, 50, 10 - LTEXT "", 14007, 68, 53, 315, 10 + EDITTEXT 14007, 68, 53, 315, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Size:", 14008, 8, 72, 45, 10 - LTEXT "", 14009, 68, 72, 315, 10 + EDITTEXT 14009, 68, 72, 315, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Contains:", 14010, 8, 93, 45, 10 - LTEXT "", 14011, 68, 93, 160, 10 + EDITTEXT 14011, 68, 93, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Created:", 14014, 8, 118, 45, 10 - LTEXT "", 14015, 68, 118, 160, 10 + EDITTEXT 14015, 68, 118, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER AUTOCHECKBOX "&Read-only", 14021, 45, 150, 67, 10 AUTOCHECKBOX "&Hidden", 14022, 126, 150, 50, 10 END @@ -230,17 +230,17 @@ BEGIN LTEXT " :", 14004, 10, 30, 50, 10 LTEXT "", 14005, 70, 30, 150, 10 LTEXT " :", 14006, 10, 40, 50, 10 - LTEXT "", 14007, 70, 40, 150, 10 + EDITTEXT 14007, 70, 40, 150, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT ":", 14008, 10, 55, 45, 10 - LTEXT "", 14009, 70, 55, 200, 10 + EDITTEXT 14009, 70, 55, 200, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT ":",14010, 10, 65, 45, 10 - LTEXT "", 14011, 70, 65, 150, 10 + EDITTEXT 14011, 70, 65, 150, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT ":", 14014, 10, 80, 65, 10 - LTEXT "", 14015, 70, 80, 150, 10 + EDITTEXT 14015, 70, 80, 150, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT ":", 14016, 10, 90, 65, 10 - LTEXT "", 14017, 70, 90, 150, 10 + EDITTEXT 14017, 70, 90, 150, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT ":", 14018, 10, 100, 65, 10 - LTEXT "", 14019, 70, 100, 150, 10 + EDITTEXT 14019, 70, 100, 150, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT ":", 14020, 10, 115, 70, 10 CHECKBOX "& ", 14021, 70, 115, 75, 10 CHECKBOX "&", 14022, 150, 115, 50, 10 @@ -253,11 +253,11 @@ CAPTION " FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN LTEXT " : ", 14000, 10, 10, 60, 10 - LTEXT "", 14001, 80, 10, 160, 10 + EDITTEXT 14001, 80, 10, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT ": ", 14002, 10, 20, 60, 10 - LTEXT "", 14003, 80, 20, 160, 10 + EDITTEXT 14003, 80, 20, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT " : ", 14004, 10, 30, 70, 10 - LTEXT "", 14005, 80, 30, 160, 10 + EDITTEXT 14005, 80, 30, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER GROUPBOX " : ", 14006, 10, 45, 220, 90 LTEXT " : ", 14007, 20, 55, 60, 10 LTEXT ": ", 14008, 130, 55, 45, 10 @@ -272,24 +272,24 @@ FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN EDITTEXT 14000, 40, 20, 190, 10, ES_LEFT|WS_BORDER|WS_GROUP LTEXT ":", -1, 15, 55, 40, 10 - LTEXT "", 14001, 110, 55, 100, 10 + EDITTEXT 14001, 110, 55, 100, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT " :", -1, 15, 70, 100, 10 - LTEXT "", 14002, 110, 70, 100, 10 + EDITTEXT 14002, 110, 70, 100, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER CONTROL "", 14013, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 5, 90, 10, 10 LTEXT " :", -1, 25, 90, 120, 10 - LTEXT "", 14003, 110, 90, 120, 10 - LTEXT "", 14004, 200, 90, 40, 10 + EDITTEXT 14003, 110, 90, 85, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER + EDITTEXT 14004, 200, 90, 40, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER CONTROL "", 14014, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 5, 105, 10, 10 LTEXT " :", -1, 25, 105, 70, 10 - LTEXT "", 14005, 110, 105, 120, 10 - LTEXT "", 14006, 200, 105, 40, 10 + EDITTEXT 14005, 110, 105, 85, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER + EDITTEXT 14006, 200, 105, 40, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT ":", -1, 25, 125, 80, 10 - LTEXT "", 14007, 110, 125, 120, 10 - LTEXT "", 14008, 200, 125, 40, 10 + EDITTEXT 14007, 110, 125, 85, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER + EDITTEXT 14008, 200, 125, 40, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER CONTROL "", 14015, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 20, 140, 200, 20 diff --git a/reactos/dll/win32/shell32/lang/en-GB.rc b/reactos/dll/win32/shell32/lang/en-GB.rc index 0b9ff3f713d..9880c9007d1 100644 --- a/reactos/dll/win32/shell32/lang/en-GB.rc +++ b/reactos/dll/win32/shell32/lang/en-GB.rc @@ -170,7 +170,7 @@ BEGIN LTEXT "Target type:", 14004, 8, 38, 64, 10 LTEXT "", 14005, 78, 38, 142, 10 LTEXT "Target location:", 14006, 8, 58, 64, 10 - LTEXT "", 14007, 79, 58, 141, 10 + EDITTEXT 14007, 79, 58, 141, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Target:", 14008, 8, 77, 45, 10 EDITTEXT 14009, 79, 75, 150, 14, ES_AUTOHSCROLL LTEXT "&Start in:", 14010, 8, 96, 57, 10 @@ -209,13 +209,13 @@ BEGIN LTEXT "Type of file:", 14004, 8, 35, 50, 10 LTEXT "Folder", 14005, 68, 35, 160, 10 LTEXT "Location:", 14006, 8, 53, 50, 10 - LTEXT "", 14007, 68, 53, 315, 10 + EDITTEXT 14007, 68, 53, 315, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Size:", 14008, 8, 72, 45, 10 - LTEXT "", 14009, 68, 72, 315, 10 + EDITTEXT 14009, 68, 72, 315, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Contains:", 14010, 8, 93, 45, 10 - LTEXT "", 14011, 68, 93, 160, 10 + EDITTEXT 14011, 68, 93, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Created:", 14014, 8, 118, 45, 10 - LTEXT "", 14015, 68, 118, 160, 10 + EDITTEXT 14015, 68, 118, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER AUTOCHECKBOX "&Read-only", 14021, 45, 150, 67, 10 AUTOCHECKBOX "&Hidden", 14022, 126, 150, 50, 10 END @@ -230,17 +230,17 @@ BEGIN LTEXT "Type of file:", 14004, 8, 35, 50, 10 LTEXT "File", 14005, 68, 35, 160, 10 LTEXT "Opens with:", 14006, 8, 53, 50, 10 - LTEXT "", 14007, 68, 53, 160, 10 + EDITTEXT 14007, 68, 53, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Location:", 14008, 8, 72, 45, 10 - LTEXT "", 14009, 68, 72, 315, 10 + EDITTEXT 14009, 68, 72, 315, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Size:", 14010, 8, 93, 45, 10 - LTEXT "", 14011, 68, 93, 160, 10 + EDITTEXT 14011, 68, 93, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Created:", 14014, 8, 118, 45, 10 - LTEXT "", 14015, 68, 118, 160, 10 + EDITTEXT 14015, 68, 118, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Modified:", 14016, 8, 140, 45, 10 - LTEXT "", 14017, 68, 140, 160, 10 + EDITTEXT 14017, 68, 140, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Accessed:", 14018, 8, 160, 45, 10 - LTEXT "", 14019, 68, 160, 160, 10 + EDITTEXT 14019, 68, 160, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Attributes:", 14020, 8, 189, 45, 10 CHECKBOX "&Read-only", 14021, 58, 189, 67, 10 CHECKBOX "&Hidden", 14022, 126, 189, 50, 10 @@ -253,11 +253,11 @@ CAPTION "Version" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN LTEXT "File version: ", 14000, 10, 10, 55, 10 - LTEXT "", 14001, 77, 10, 152, 10 + EDITTEXT 14001, 77, 10, 152, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Description: ", 14002, 10, 27, 45, 10 - LTEXT "", 14003, 77, 27, 152, 10 + EDITTEXT 14003, 77, 27, 152, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Copyright: ", 14004, 10, 46, 66, 10 - LTEXT "", 14005, 77, 46, 152, 10 + EDITTEXT 14005, 77, 46, 152, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER GROUPBOX "Other version information: ", 14006, 6, 70, 222, 115 LTEXT "Item name: ", 14007, 13, 82, 50, 10 LTEXT "Value: ", 14008, 112, 82, 45, 10 @@ -272,24 +272,24 @@ FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN EDITTEXT 14000, 40, 20, 190, 14, ES_LEFT|WS_BORDER|WS_GROUP LTEXT "Type:", -1, 15, 55, 40, 10 - LTEXT "", 14001, 110, 55, 100, 10 + EDITTEXT 14001, 110, 55, 100, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "File system:", -1, 15, 70, 100, 10 - LTEXT "", 14002, 110, 70, 100, 10 + EDITTEXT 14002, 110, 70, 100, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER CONTROL "", 14013, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 5, 90, 10, 10 LTEXT "Used space:", -1, 25, 90, 120, 10 - LTEXT "", 14003, 110, 90, 120, 10 - LTEXT "", 14004, 200, 90, 40, 10 + EDITTEXT 14003, 110, 90, 85, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER + EDITTEXT 14004, 200, 90, 40, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER CONTROL "", 14014, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 5, 105, 10, 10 LTEXT "Free space:", -1, 25, 105, 70, 10 - LTEXT "", 14005, 110, 105, 120, 10 - LTEXT "", 14006, 200, 105, 40, 10 + EDITTEXT 14005, 110, 105, 85, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER + EDITTEXT 14006, 200, 105, 40, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Capacity:", -1, 25, 125, 80, 10 - LTEXT "", 14007, 110, 125, 120, 10 - LTEXT "", 14008, 200, 125, 40, 10 + EDITTEXT 14007, 110, 125, 85, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER + EDITTEXT 14008, 200, 125, 40, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER CONTROL "", 14015, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 20, 140, 200, 20 diff --git a/reactos/dll/win32/shell32/lang/en-US.rc b/reactos/dll/win32/shell32/lang/en-US.rc index 6eaac708f7a..a7adfb3ea6e 100644 --- a/reactos/dll/win32/shell32/lang/en-US.rc +++ b/reactos/dll/win32/shell32/lang/en-US.rc @@ -170,7 +170,7 @@ BEGIN LTEXT "Target type:", 14004, 8, 38, 64, 10 LTEXT "", 14005, 78, 38, 142, 10 LTEXT "Target location:", 14006, 8, 58, 64, 10 - LTEXT "", 14007, 79, 58, 141, 10 + EDITTEXT 14007, 79, 58, 141, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Target:", 14008, 8, 77, 45, 10 EDITTEXT 14009, 79, 75, 150, 14, ES_AUTOHSCROLL LTEXT "&Start in:", 14010, 8, 96, 57, 10 @@ -209,13 +209,13 @@ BEGIN LTEXT "Type of file:", 14004, 8, 35, 50, 10 LTEXT "Folder", 14005, 68, 35, 160, 10 LTEXT "Location:", 14006, 8, 53, 50, 10 - LTEXT "", 14007, 68, 53, 315, 10 + EDITTEXT 14007, 68, 53, 315, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Size:", 14008, 8, 72, 45, 10 - LTEXT "", 14009, 68, 72, 315, 10 + EDITTEXT 14009, 68, 72, 315, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Contains:", 14010, 8, 93, 45, 10 - LTEXT "", 14011, 68, 93, 160, 10 + EDITTEXT 14011, 68, 93, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Created:", 14014, 8, 118, 45, 10 - LTEXT "", 14015, 68, 118, 160, 10 + EDITTEXT 14015, 68, 118, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER AUTOCHECKBOX "&Read-only", 14021, 45, 150, 67, 10 AUTOCHECKBOX "&Hidden", 14022, 126, 150, 50, 10 END @@ -230,17 +230,17 @@ BEGIN LTEXT "Type of file:", 14004, 8, 35, 50, 10 LTEXT "File", 14005, 68, 35, 160, 10 LTEXT "Opens with:", 14006, 8, 53, 50, 10 - LTEXT "", 14007, 68, 53, 160, 10 + EDITTEXT 14007, 68, 53, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Location:", 14008, 8, 72, 45, 10 - LTEXT "", 14009, 68, 72, 315, 10 + EDITTEXT 14009, 68, 72, 315, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Size:", 14010, 8, 93, 45, 10 - LTEXT "", 14011, 68, 93, 160, 10 + EDITTEXT 14011, 68, 93, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Created:", 14014, 8, 118, 45, 10 - LTEXT "", 14015, 68, 118, 160, 10 + EDITTEXT 14015, 68, 118, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Modified:", 14016, 8, 140, 45, 10 - LTEXT "", 14017, 68, 140, 160, 10 + EDITTEXT 14017, 68, 140, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Accessed:", 14018, 8, 160, 45, 10 - LTEXT "", 14019, 68, 160, 160, 10 + EDITTEXT 14019, 68, 160, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Attributes:", 14020, 8, 189, 45, 10 CHECKBOX "&Read-only", 14021, 58, 189, 67, 10 CHECKBOX "&Hidden", 14022, 126, 189, 50, 10 @@ -253,11 +253,11 @@ CAPTION "Version" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN LTEXT "File version: ", 14000, 10, 10, 55, 10 - LTEXT "", 14001, 77, 10, 152, 10 + EDITTEXT 14001, 77, 10, 152, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Description: ", 14002, 10, 27, 45, 10 - LTEXT "", 14003, 77, 27, 152, 10 + EDITTEXT 14003, 77, 27, 152, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Copyright: ", 14004, 10, 46, 66, 10 - LTEXT "", 14005, 77, 46, 152, 10 + EDITTEXT 14005, 77, 46, 152, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER GROUPBOX "Other version information: ", 14006, 6, 70, 222, 115 LTEXT "Item name: ", 14007, 13, 82, 50, 10 LTEXT "Value: ", 14008, 112, 82, 45, 10 @@ -272,24 +272,24 @@ FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN EDITTEXT 14000, 40, 20, 190, 14, ES_LEFT|WS_BORDER|WS_GROUP LTEXT "Type:", -1, 15, 55, 40, 10 - LTEXT "", 14001, 110, 55, 100, 10 + EDITTEXT 14001, 110, 55, 100, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "File system:", -1, 15, 70, 100, 10 - LTEXT "", 14002, 110, 70, 100, 10 + EDITTEXT 14002, 110, 70, 100, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER CONTROL "", 14013, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 5, 90, 10, 10 LTEXT "Used space:", -1, 25, 90, 120, 10 - LTEXT "", 14003, 110, 90, 120, 10 - LTEXT "", 14004, 200, 90, 40, 10 + EDITTEXT 14003, 110, 90, 85, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER + EDITTEXT 14004, 200, 90, 40, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER CONTROL "", 14014, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 5, 105, 10, 10 LTEXT "Free space:", -1, 25, 105, 70, 10 - LTEXT "", 14005, 110, 105, 120, 10 - LTEXT "", 14006, 200, 105, 40, 10 + EDITTEXT 14005, 110, 105, 85, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER + EDITTEXT 14006, 200, 105, 40, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Capacity:", -1, 25, 125, 80, 10 - LTEXT "", 14007, 110, 125, 120, 10 - LTEXT "", 14008, 200, 125, 40, 10 + EDITTEXT 14007, 110, 125, 85, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER + EDITTEXT 14008, 200, 125, 40, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER CONTROL "", 14015, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 20, 140, 200, 20 diff --git a/reactos/dll/win32/shell32/lang/es-ES.rc b/reactos/dll/win32/shell32/lang/es-ES.rc index 0bbfc4677c2..30e60b1a435 100644 --- a/reactos/dll/win32/shell32/lang/es-ES.rc +++ b/reactos/dll/win32/shell32/lang/es-ES.rc @@ -173,7 +173,7 @@ BEGIN LTEXT "Tipo de destino:", 14004, 8, 38, 64, 10 LTEXT "", 14005, 78, 38, 142, 10 LTEXT "Ubicacin de destino:", 14006, 8, 54, 64, 14 - LTEXT "", 14007, 79, 58, 141, 10 + EDITTEXT 14007, 79, 58, 141, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "&Destino:", 14008, 8, 77, 45, 10 EDITTEXT 14009, 79, 75, 150, 14, ES_AUTOHSCROLL LTEXT "I&niciar en:", 14010, 8, 96, 57, 10 @@ -212,13 +212,13 @@ BEGIN LTEXT "Tipo:", 14004, 8, 35, 50, 10 LTEXT "Carpeta de archivos", 14005, 68, 35, 160, 10 LTEXT "Ubicacin:", 14006, 8, 53, 50, 10 - LTEXT "", 14007, 68, 53, 315, 10 + EDITTEXT 14007, 68, 53, 315, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Tamao:", 14008, 8, 72, 45, 10 - LTEXT "", 14009, 68, 72, 315, 10 + EDITTEXT 14009, 68, 72, 315, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Contiene:", 14010, 8, 93, 45, 10 - LTEXT "", 14011, 68, 93, 160, 10 + EDITTEXT 14011, 68, 93, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Creado:", 14014, 8, 118, 45, 10 - LTEXT "", 14015, 68, 118, 160, 10 + EDITTEXT 14015, 68, 118, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER AUTOCHECKBOX "&Slo lectura", 14021, 45, 150, 67, 10 AUTOCHECKBOX "&Oculto", 14022, 126, 150, 50, 10 END @@ -233,17 +233,17 @@ BEGIN LTEXT "Tipo de archivo:", 14004, 8, 35, 55, 10 LTEXT "Archivo", 14005, 68, 35, 160, 10 LTEXT "Se abre con:", 14006, 8, 53, 50, 10 - LTEXT "", 14007, 68, 53, 160, 10 + EDITTEXT 14007, 68, 53, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Ubicacin:", 14008, 8, 72, 45, 10 - LTEXT "", 14009, 68, 72, 315, 10 + EDITTEXT 14009, 68, 72, 315, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Tamao:", 14010, 8, 93, 45, 10 - LTEXT "", 14011, 68, 93, 160, 10 + EDITTEXT 14011, 68, 93, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Creado:", 14014, 8, 118, 45, 10 - LTEXT "", 14015, 68, 118, 160, 10 + EDITTEXT 14015, 68, 118, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Modificado:", 14016, 8, 140, 45, 10 - LTEXT "", 14017, 68, 140, 160, 10 + EDITTEXT 14017, 68, 140, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "ltimo acceso:", 14018, 8, 160, 55, 10 - LTEXT "", 14019, 68, 160, 160, 10 + EDITTEXT 14019, 68, 160, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Atributos:", 14020, 8, 189, 45, 10 CHECKBOX "&Slo lectura", 14021, 58, 189, 67, 10 CHECKBOX "&Oculto", 14022, 126, 189, 50, 10 @@ -256,11 +256,11 @@ CAPTION "Versi FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN LTEXT "Versin del archivo: ", 14000, 10, 10, 62, 14 - LTEXT "", 14001, 77, 10, 152, 10 + EDITTEXT 14001, 77, 10, 152, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Descripcin: ", 14002, 10, 27, 45, 10 - LTEXT "", 14003, 77, 27, 152, 10 + EDITTEXT 14003, 77, 27, 152, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Copyright: ", 14004, 10, 46, 66, 10 - LTEXT "", 14005, 77, 46, 152, 10 + EDITTEXT 14005, 77, 46, 152, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER GROUPBOX "Ms informacin de la versin: ", 14006, 6, 70, 222, 115 LTEXT "Nombre del elemento:", 14007, 13, 82, 65, 10 LTEXT "Valor: ", 14008, 112, 82, 45, 10 @@ -275,24 +275,24 @@ FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN EDITTEXT 14000, 40, 20, 190, 14, ES_LEFT|WS_BORDER|WS_GROUP LTEXT "Tipo:", -1, 15, 55, 40, 10 - LTEXT "", 14001, 110, 55, 100, 10 + EDITTEXT 14001, 110, 55, 100, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Sistema de archivos:", -1, 15, 70, 100, 10 - LTEXT "", 14002, 110, 70, 100, 10 + EDITTEXT 14002, 110, 70, 100, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER CONTROL "", 14013, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 5, 90, 10, 10 LTEXT "Espacio ocupado:", -1, 25, 90, 120, 10 - LTEXT "", 14003, 110, 90, 120, 10 - LTEXT "", 14004, 200, 90, 40, 10 + EDITTEXT 14003, 110, 90, 85, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER + EDITTEXT 14004, 200, 90, 40, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER CONTROL "", 14014, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 5, 105, 10, 10 LTEXT "Espacio libre:", -1, 25, 105, 70, 10 - LTEXT "", 14005, 110, 105, 120, 10 - LTEXT "", 14006, 200, 105, 40, 10 + EDITTEXT 14005, 110, 105, 85, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER + EDITTEXT 14006, 200, 105, 40, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Capacidad:", -1, 25, 125, 80, 10 - LTEXT "", 14007, 110, 125, 120, 10 - LTEXT "", 14008, 200, 125, 40, 10 + EDITTEXT 14007, 110, 125, 85, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER + EDITTEXT 14008, 200, 125, 40, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER CONTROL "", 14015, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 20, 140, 200, 20 diff --git a/reactos/dll/win32/shell32/lang/fi-FI.rc b/reactos/dll/win32/shell32/lang/fi-FI.rc index 125a07d9c50..9526e498dcb 100644 --- a/reactos/dll/win32/shell32/lang/fi-FI.rc +++ b/reactos/dll/win32/shell32/lang/fi-FI.rc @@ -170,7 +170,7 @@ BEGIN LTEXT "Target type:", 14004, 8, 38, 64, 10 LTEXT "", 14005, 78, 38, 142, 10 LTEXT "Target location:", 14006, 8, 58, 64, 10 - LTEXT "", 14007, 79, 58, 141, 10 + EDITTEXT 14007, 79, 58, 141, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Target:", 14008, 8, 77, 45, 10 EDITTEXT 14009, 79, 75, 150, 14, ES_AUTOHSCROLL LTEXT "&Start in:", 14010, 8, 96, 57, 10 @@ -209,13 +209,13 @@ BEGIN LTEXT "Type of file:", 14004, 8, 35, 50, 10 LTEXT "Folder", 14005, 68, 35, 160, 10 LTEXT "Location:", 14006, 8, 53, 50, 10 - LTEXT "", 14007, 68, 53, 315, 10 + EDITTEXT 14007, 68, 53, 315, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Size:", 14008, 8, 72, 45, 10 - LTEXT "", 14009, 68, 72, 315, 10 + EDITTEXT 14009, 68, 72, 315, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Contains:", 14010, 8, 93, 45, 10 - LTEXT "", 14011, 68, 93, 160, 10 + EDITTEXT 14011, 68, 93, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Created:", 14014, 8, 118, 45, 10 - LTEXT "", 14015, 68, 118, 160, 10 + EDITTEXT 14015, 68, 118, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER AUTOCHECKBOX "&Read-only", 14021, 45, 150, 67, 10 AUTOCHECKBOX "&Hidden", 14022, 126, 150, 50, 10 END @@ -230,17 +230,17 @@ BEGIN LTEXT "Type of file:", 14004, 8, 35, 50, 10 LTEXT "File", 14005, 68, 35, 160, 10 LTEXT "Opens with:", 14006, 8, 53, 50, 10 - LTEXT "", 14007, 68, 53, 160, 10 + EDITTEXT 14007, 68, 53, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Location:", 14008, 8, 72, 45, 10 - LTEXT "", 14009, 68, 72, 315, 10 + EDITTEXT 14009, 68, 72, 315, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Size:", 14010, 8, 93, 45, 10 - LTEXT "", 14011, 68, 93, 160, 10 + EDITTEXT 14011, 68, 93, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Created:", 14014, 8, 118, 45, 10 - LTEXT "", 14015, 68, 118, 160, 10 + EDITTEXT 14015, 68, 118, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Modified:", 14016, 8, 140, 45, 10 - LTEXT "", 14017, 68, 140, 160, 10 + EDITTEXT 14017, 68, 140, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Accessed:", 14018, 8, 160, 45, 10 - LTEXT "", 14019, 68, 160, 160, 10 + EDITTEXT 14019, 68, 160, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Attributes:", 14020, 8, 189, 45, 10 CHECKBOX "&Read-only", 14021, 58, 189, 67, 10 CHECKBOX "&Hidden", 14022, 126, 189, 50, 10 @@ -253,11 +253,11 @@ CAPTION "Version" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN LTEXT "File version: ", 14000, 10, 10, 55, 10 - LTEXT "", 14001, 77, 10, 152, 10 + EDITTEXT 14001, 77, 10, 152, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Description: ", 14002, 10, 27, 45, 10 - LTEXT "", 14003, 77, 27, 152, 10 + EDITTEXT 14003, 77, 27, 152, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Copyright: ", 14004, 10, 46, 66, 10 - LTEXT "", 14005, 77, 46, 152, 10 + EDITTEXT 14005, 77, 46, 152, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER GROUPBOX "Other version information: ", 14006, 6, 70, 222, 115 LTEXT "Item name: ", 14007, 13, 82, 50, 10 LTEXT "Value: ", 14008, 112, 82, 45, 10 @@ -272,24 +272,24 @@ FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN EDITTEXT 14000, 40, 20, 190, 14, ES_LEFT|WS_BORDER|WS_GROUP LTEXT "Type:", -1, 15, 55, 40, 10 - LTEXT "", 14001, 110, 55, 100, 10 + EDITTEXT 14001, 110, 55, 100, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "File system:", -1, 15, 70, 100, 10 - LTEXT "", 14002, 110, 70, 100, 10 + EDITTEXT 14002, 110, 70, 100, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER CONTROL "", 14013, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 5, 90, 10, 10 LTEXT "Used space:", -1, 25, 90, 120, 10 - LTEXT "", 14003, 110, 90, 120, 10 - LTEXT "", 14004, 200, 90, 40, 10 + EDITTEXT 14003, 110, 90, 85, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER + EDITTEXT 14004, 200, 90, 40, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER CONTROL "", 14014, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 5, 105, 10, 10 LTEXT "Free space:", -1, 25, 105, 70, 10 - LTEXT "", 14005, 110, 105, 120, 10 - LTEXT "", 14006, 200, 105, 40, 10 + EDITTEXT 14005, 110, 105, 85, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER + EDITTEXT 14006, 200, 105, 40, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Capacity:", -1, 25, 125, 80, 10 - LTEXT "", 14007, 110, 125, 120, 10 - LTEXT "", 14008, 200, 125, 40, 10 + EDITTEXT 14007, 110, 125, 85, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER + EDITTEXT 14008, 200, 125, 40, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER CONTROL "", 14015, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 20, 140, 200, 20 diff --git a/reactos/dll/win32/shell32/lang/fr-FR.rc b/reactos/dll/win32/shell32/lang/fr-FR.rc index 4083d654d9a..998d9df7ff0 100644 --- a/reactos/dll/win32/shell32/lang/fr-FR.rc +++ b/reactos/dll/win32/shell32/lang/fr-FR.rc @@ -174,7 +174,7 @@ BEGIN LTEXT "Type de la cible :", 14004, 8, 38, 64, 10 LTEXT "", 14005, 78, 38, 142, 10 LTEXT "Localisation de la cible :", 14006, 8, 58, 64, 10 - LTEXT "", 14007, 79, 58, 141, 10 + EDITTEXT 14007, 79, 58, 141, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Cible :", 14008, 8, 77, 45, 10 EDITTEXT 14009, 79, 75, 150, 14, ES_AUTOHSCROLL LTEXT "Dmarrer dans :", 14010, 8, 96, 57, 10 @@ -213,13 +213,13 @@ BEGIN LTEXT "Type de fichier :", 14004, 8, 35, 50, 10 LTEXT "Dossier", 14005, 68, 35, 160, 10 LTEXT "Localisation :", 14006, 8, 53, 50, 10 - LTEXT "", 14007, 68, 53, 315, 10 + EDITTEXT 14007, 68, 53, 315, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Taille :", 14008, 8, 72, 45, 10 - LTEXT "", 14009, 68, 72, 315, 10 + EDITTEXT 14009, 68, 72, 315, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Contient :", 14010, 8, 93, 45, 10 - LTEXT "", 14011, 68, 93, 160, 10 + EDITTEXT 14011, 68, 93, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Cr :", 14014, 8, 118, 45, 10 - LTEXT "", 14015, 68, 118, 160, 10 + EDITTEXT 14015, 68, 118, 160, 10 AUTOCHECKBOX "Lectu&re-seule", 14021, 45, 150, 67, 10 AUTOCHECKBOX "Cac&h", 14022, 126, 150, 50, 10 END @@ -234,17 +234,17 @@ BEGIN LTEXT "Type de fichier :", 14004, 8, 35, 50, 10 LTEXT "Fichier", 14005, 68, 35, 160, 10 LTEXT "Ouvrir avec :", 14006, 8, 53, 50, 10 - LTEXT "", 14007, 68, 53, 160, 10 + EDITTEXT 14007, 68, 53, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Localisation :", 14008, 8, 72, 45, 10 - LTEXT "", 14009, 68, 72, 315, 10 + EDITTEXT 14009, 68, 72, 315, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Taille :", 14010, 8, 93, 45, 10 - LTEXT "", 14011, 68, 93, 160, 10 + EDITTEXT 14011, 68, 93, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Cr :", 14014, 8, 118, 45, 10 - LTEXT "", 14015, 68, 118, 160, 10 + EDITTEXT 14015, 68, 118, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Modifi :", 14016, 8, 140, 45, 10 - LTEXT "", 14017, 68, 140, 160, 10 + EDITTEXT 14017, 68, 140, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Accd :", 14018, 8, 160, 45, 10 - LTEXT "", 14019, 68, 160, 160, 10 + EDITTEXT 14019, 68, 160, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Attributs :", 14020, 8, 189, 45, 10 CHECKBOX "Lectu&re-seule", 14021, 58, 189, 67, 10 CHECKBOX "Cac&h", 14022, 126, 189, 50, 10 @@ -257,11 +257,11 @@ CAPTION "Version" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN LTEXT "Version du fichier : ", 14000, 10, 10, 55, 10 - LTEXT "", 14001, 77, 10, 152, 10 + EDITTEXT 14001, 77, 10, 152, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Description : ", 14002, 10, 27, 45, 10 - LTEXT "", 14003, 77, 27, 152, 10 + EDITTEXT 14003, 77, 27, 152, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Copyright : ", 14004, 10, 46, 66, 10 - LTEXT "", 14005, 77, 46, 152, 10 + EDITTEXT 14005, 77, 46, 152, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER GROUPBOX "Autres informations de version : ", 14006, 6, 70, 222, 115 LTEXT "Nom de l'lment : ", 14007, 13, 82, 50, 10 LTEXT "Valeur : ", 14008, 112, 82, 45, 10 @@ -276,24 +276,24 @@ FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN EDITTEXT 14000, 40, 20, 190, 14, ES_LEFT|WS_BORDER|WS_GROUP LTEXT "Type :", -1, 15, 55, 40, 10 - LTEXT "", 14001, 110, 55, 100, 10 + EDITTEXT 14001, 110, 55, 100, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Systme de fichiers :", -1, 15, 70, 100, 10 - LTEXT "", 14002, 110, 70, 100, 10 + EDITTEXT 14002, 110, 70, 100, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER CONTROL "", 14013, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 5, 90, 10, 10 LTEXT "Espace utilis :", -1, 25, 90, 120, 10 - LTEXT "", 14003, 110, 90, 120, 10 - LTEXT "", 14004, 200, 90, 40, 10 + EDITTEXT 14003, 110, 90, 85, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER + EDITTEXT 14004, 200, 90, 40, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER CONTROL "", 14014, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 5, 105, 10, 10 LTEXT "Espace libre :", -1, 25, 105, 70, 10 - LTEXT "", 14005, 110, 105, 120, 10 - LTEXT "", 14006, 200, 105, 40, 10 + EDITTEXT 14005, 110, 105, 85, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER + EDITTEXT 14006, 200, 105, 40, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Capacit :", -1, 25, 125, 80, 10 - LTEXT "", 14007, 110, 125, 120, 10 - LTEXT "", 14008, 200, 125, 40, 10 + EDITTEXT 14007, 110, 125, 85, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER + EDITTEXT 14008, 200, 125, 40, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER CONTROL "", 14015, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 20, 140, 200, 20 diff --git a/reactos/dll/win32/shell32/lang/hu-HU.rc b/reactos/dll/win32/shell32/lang/hu-HU.rc index 7eb015d8ced..e4929828594 100644 --- a/reactos/dll/win32/shell32/lang/hu-HU.rc +++ b/reactos/dll/win32/shell32/lang/hu-HU.rc @@ -173,7 +173,7 @@ BEGIN LTEXT "Target type:", 14004, 8, 38, 64, 10 LTEXT "", 14005, 78, 38, 142, 10 LTEXT "Target location:", 14006, 8, 58, 64, 10 - LTEXT "", 14007, 79, 58, 141, 10 + EDITTEXT 14007, 79, 58, 141, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Target:", 14008, 8, 77, 45, 10 EDITTEXT 14009, 79, 75, 150, 14, ES_AUTOHSCROLL LTEXT "&Start in:", 14010, 8, 96, 57, 10 @@ -212,13 +212,13 @@ BEGIN LTEXT "Type of file:", 14004, 8, 35, 50, 10 LTEXT "Folder", 14005, 68, 35, 160, 10 LTEXT "Location:", 14006, 8, 53, 50, 10 - LTEXT "", 14007, 68, 53, 315, 10 + EDITTEXT 14007, 68, 53, 315, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Size:", 14008, 8, 72, 45, 10 - LTEXT "", 14009, 68, 72, 315, 10 + EDITTEXT 14009, 68, 72, 315, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Contains:", 14010, 8, 93, 45, 10 - LTEXT "", 14011, 68, 93, 160, 10 + EDITTEXT 14011, 68, 93, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Created:", 14014, 8, 118, 45, 10 - LTEXT "", 14015, 68, 118, 160, 10 + EDITTEXT 14015, 68, 118, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER AUTOCHECKBOX "&Read-only", 14021, 45, 150, 67, 10 AUTOCHECKBOX "&Hidden", 14022, 126, 150, 50, 10 END @@ -233,17 +233,17 @@ BEGIN LTEXT "Type of file:", 14004, 8, 35, 50, 10 LTEXT "File", 14005, 68, 35, 160, 10 LTEXT "Opens with:", 14006, 8, 53, 50, 10 - LTEXT "", 14007, 68, 53, 160, 10 + EDITTEXT 14007, 68, 53, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Location:", 14008, 8, 72, 45, 10 - LTEXT "", 14009, 68, 72, 315, 10 + EDITTEXT 14009, 68, 72, 315, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Size:", 14010, 8, 93, 45, 10 - LTEXT "", 14011, 68, 93, 160, 10 + EDITTEXT 14011, 68, 93, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Created:", 14014, 8, 118, 45, 10 - LTEXT "", 14015, 68, 118, 160, 10 + EDITTEXT 14015, 68, 118, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Modified:", 14016, 8, 140, 45, 10 - LTEXT "", 14017, 68, 140, 160, 10 + EDITTEXT 14017, 68, 140, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Accessed:", 14018, 8, 160, 45, 10 - LTEXT "", 14019, 68, 160, 160, 10 + EDITTEXT 14019, 68, 160, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Attributes:", 14020, 8, 189, 45, 10 CHECKBOX "&Read-only", 14021, 58, 189, 67, 10 CHECKBOX "&Hidden", 14022, 126, 189, 50, 10 @@ -256,11 +256,11 @@ CAPTION "Version" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN LTEXT "File version: ", 14000, 10, 10, 55, 10 - LTEXT "", 14001, 77, 10, 152, 10 + EDITTEXT 14001, 77, 10, 152, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Description: ", 14002, 10, 27, 45, 10 - LTEXT "", 14003, 77, 27, 152, 10 + EDITTEXT 14003, 77, 27, 152, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Copyright: ", 14004, 10, 46, 66, 10 - LTEXT "", 14005, 77, 46, 152, 10 + EDITTEXT 14005, 77, 46, 152, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER GROUPBOX "Other version information: ", 14006, 6, 70, 222, 115 LTEXT "Item name: ", 14007, 13, 82, 50, 10 LTEXT "Value: ", 14008, 112, 82, 45, 10 @@ -275,24 +275,24 @@ FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN EDITTEXT 14000, 40, 20, 190, 14, ES_LEFT|WS_BORDER|WS_GROUP LTEXT "Type:", -1, 15, 55, 40, 10 - LTEXT "", 14001, 110, 55, 100, 10 + EDITTEXT 14001, 110, 55, 100, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "File system:", -1, 15, 70, 100, 10 - LTEXT "", 14002, 110, 70, 100, 10 + EDITTEXT 14002, 110, 70, 100, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER CONTROL "", 14013, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 5, 90, 10, 10 LTEXT "Used space:", -1, 25, 90, 120, 10 - LTEXT "", 14003, 110, 90, 120, 10 - LTEXT "", 14004, 200, 90, 40, 10 + EDITTEXT 14003, 110, 90, 85, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER + EDITTEXT 14004, 200, 90, 40, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER CONTROL "", 14014, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 5, 105, 10, 10 LTEXT "Free space:", -1, 25, 105, 70, 10 - LTEXT "", 14005, 110, 105, 120, 10 - LTEXT "", 14006, 200, 105, 40, 10 + EDITTEXT 14005, 110, 105, 85, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER + EDITTEXT 14006, 200, 105, 40, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Capacity:", -1, 25, 125, 80, 10 - LTEXT "", 14007, 110, 125, 120, 10 - LTEXT "", 14008, 200, 125, 40, 10 + EDITTEXT 14007, 110, 125, 85, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER + EDITTEXT 14008, 200, 125, 40, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER CONTROL "", 14015, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 20, 140, 200, 20 diff --git a/reactos/dll/win32/shell32/lang/it-IT.rc b/reactos/dll/win32/shell32/lang/it-IT.rc index 59d76488d56..d91d17c11f7 100644 --- a/reactos/dll/win32/shell32/lang/it-IT.rc +++ b/reactos/dll/win32/shell32/lang/it-IT.rc @@ -171,7 +171,7 @@ BEGIN LTEXT "Tipo:", 14004, 8, 38, 64, 10 LTEXT "", 14005, 78, 38, 142, 10 LTEXT "Posizione:", 14006, 8, 58, 64, 10 - LTEXT "", 14007, 79, 58, 141, 10 + EDITTEXT 14007, 79, 58, 141, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Nome:", 14008, 8, 77, 45, 10 EDITTEXT 14009, 79, 75, 150, 14, ES_AUTOHSCROLL LTEXT "&Eseguito in:", 14010, 8, 96, 57, 10 @@ -210,13 +210,13 @@ BEGIN LTEXT "Tipo del file:", 14004, 8, 35, 50, 10 LTEXT "Cartella", 14005, 68, 35, 160, 10 LTEXT "Posizione:", 14006, 8, 53, 50, 10 - LTEXT "", 14007, 68, 53, 315, 10 + EDITTEXT 14007, 68, 53, 315, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Dimensione:", 14008, 8, 72, 45, 10 - LTEXT "", 14009, 68, 72, 315, 10 + EDITTEXT 14009, 68, 72, 315, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Contenente:", 14010, 8, 93, 45, 10 - LTEXT "", 14011, 68, 93, 160, 10 + EDITTEXT 14011, 68, 93, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Creato:", 14014, 8, 118, 45, 10 - LTEXT "", 14015, 68, 118, 160, 10 + EDITTEXT 14015, 68, 118, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER AUTOCHECKBOX "&Sola lettura", 14021, 45, 150, 67, 10 AUTOCHECKBOX "&Nascosto", 14022, 126, 150, 50, 10 END @@ -231,17 +231,17 @@ BEGIN LTEXT "Tipo del file:", 14004, 8, 35, 50, 10 LTEXT "File", 14005, 68, 35, 160, 10 LTEXT "Si apre con:", 14006, 8, 53, 50, 10 - LTEXT "", 14007, 68, 53, 160, 10 + EDITTEXT 14007, 68, 53, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Posizione:", 14008, 8, 72, 45, 10 - LTEXT "", 14009, 68, 72, 315, 10 + EDITTEXT 14009, 68, 72, 315, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Dimensione:", 14010, 8, 93, 45, 10 - LTEXT "", 14011, 68, 93, 160, 10 + EDITTEXT 14011, 68, 93, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Creato:", 14014, 8, 118, 45, 10 - LTEXT "", 14015, 68, 118, 160, 10 + EDITTEXT 14015, 68, 118, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Modificato:", 14016, 8, 140, 45, 10 - LTEXT "", 14017, 68, 140, 160, 10 + EDITTEXT 14017, 68, 140, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Letto:", 14018, 8, 160, 45, 10 - LTEXT "", 14019, 68, 160, 160, 10 + EDITTEXT 14019, 68, 160, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Attributi:", 14020, 8, 189, 45, 10 CHECKBOX "&Sola lettura", 14021, 58, 189, 67, 10 CHECKBOX "&Nascosto", 14022, 126, 189, 50, 10 @@ -254,11 +254,11 @@ CAPTION "Versione" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN LTEXT "Versione: ", 14000, 10, 10, 55, 10 - LTEXT "", 14001, 77, 10, 152, 10 + EDITTEXT 14001, 77, 10, 152, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Descrizione: ", 14002, 10, 27, 45, 10 - LTEXT "", 14003, 77, 27, 152, 10 + EDITTEXT 14003, 77, 27, 152, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Copyright: ", 14004, 10, 46, 66, 10 - LTEXT "", 14005, 77, 46, 152, 10 + EDITTEXT 14005, 77, 46, 152, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER GROUPBOX "Altre informazioni sulla versione: ", 14006, 6, 70, 222, 115 LTEXT "Nome dell'elemento: ", 14007, 13, 82, 50, 10 LTEXT "Valore: ", 14008, 112, 82, 45, 10 @@ -273,24 +273,24 @@ FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN EDITTEXT 14000, 40, 20, 190, 14, ES_LEFT|WS_BORDER|WS_GROUP LTEXT "Tipo:", -1, 15, 55, 40, 10 - LTEXT "", 14001, 110, 55, 100, 10 + EDITTEXT 14001, 110, 55, 100, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "File system:", -1, 15, 70, 100, 10 - LTEXT "", 14002, 110, 70, 100, 10 + EDITTEXT 14002, 110, 70, 100, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER CONTROL "", 14013, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 5, 90, 10, 10 LTEXT "Spazio usato:", -1, 25, 90, 120, 10 - LTEXT "", 14003, 110, 90, 120, 10 - LTEXT "", 14004, 200, 90, 40, 10 + EDITTEXT 14003, 110, 90, 85, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER + EDITTEXT 14004, 200, 90, 40, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER CONTROL "", 14014, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 5, 105, 10, 10 LTEXT "Spazio libero:", -1, 25, 105, 70, 10 - LTEXT "", 14005, 110, 105, 120, 10 - LTEXT "", 14006, 200, 105, 40, 10 + EDITTEXT 14005, 110, 105, 85, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER + EDITTEXT 14006, 200, 105, 40, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Capacit:", -1, 25, 125, 80, 10 - LTEXT "", 14007, 110, 125, 120, 10 - LTEXT "", 14008, 200, 125, 40, 10 + EDITTEXT 14007, 110, 125, 85, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER + EDITTEXT 14008, 200, 125, 40, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER CONTROL "", 14015, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 20, 140, 200, 20 diff --git a/reactos/dll/win32/shell32/lang/ja-JP.rc b/reactos/dll/win32/shell32/lang/ja-JP.rc index a671c6137a2..6270d7df62e 100644 --- a/reactos/dll/win32/shell32/lang/ja-JP.rc +++ b/reactos/dll/win32/shell32/lang/ja-JP.rc @@ -170,7 +170,7 @@ BEGIN LTEXT "Ώۂ̎:", 14004, 8, 38, 64, 10 LTEXT "", 14005, 78, 38, 142, 10 LTEXT "Ώۂ̏ꏊ:", 14006, 8, 58, 64, 10 - LTEXT "", 14007, 79, 58, 141, 10 + EDITTEXT 14007, 79, 58, 141, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Ώ:", 14008, 8, 77, 45, 10 EDITTEXT 14009, 79, 75, 150, 14, ES_AUTOHSCROLL LTEXT "s(&S):", 14010, 8, 96, 57, 10 @@ -209,13 +209,13 @@ BEGIN LTEXT "t@C̎:", 14004, 8, 35, 50, 10 LTEXT "tH_", 14005, 68, 35, 160, 10 LTEXT "ꏊ:", 14006, 8, 53, 50, 10 - LTEXT "", 14007, 68, 53, 315, 10 + EDITTEXT 14007, 68, 53, 315, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "TCY:", 14008, 8, 72, 45, 10 - LTEXT "", 14009, 68, 72, 315, 10 + EDITTEXT 14009, 68, 72, 315, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "eTCY:", 14010, 8, 93, 45, 10 - LTEXT "", 14011, 68, 93, 160, 10 + EDITTEXT 14011, 68, 93, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "쐬:", 14014, 8, 118, 45, 10 - LTEXT "", 14015, 68, 118, 160, 10 + EDITTEXT 14015, 68, 118, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER AUTOCHECKBOX "ǂݎp(&R)", 14021, 45, 150, 67, 10 AUTOCHECKBOX "Bt@C(&H)", 14022, 126, 150, 50, 10 END @@ -230,17 +230,17 @@ BEGIN LTEXT "t@C̎:", 14004, 8, 35, 50, 10 LTEXT "t@C", 14005, 68, 35, 160, 10 LTEXT "svO:", 14006, 8, 53, 50, 10 - LTEXT "", 14007, 68, 53, 160, 10 + EDITTEXT 14007, 68, 53, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "ꏊ:", 14008, 8, 72, 45, 10 - LTEXT "", 14009, 68, 72, 315, 10 + EDITTEXT 14009, 68, 72, 315, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "TCY:", 14010, 8, 93, 45, 10 - LTEXT "", 14011, 68, 93, 160, 10 + EDITTEXT 14011, 68, 93, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "쐬:", 14014, 8, 118, 45, 10 - LTEXT "", 14015, 68, 118, 160, 10 + EDITTEXT 14015, 68, 118, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "ύX:", 14016, 8, 140, 45, 10 - LTEXT "", 14017, 68, 140, 160, 10 + EDITTEXT 14017, 68, 140, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "ANZX:", 14018, 8, 160, 45, 10 - LTEXT "", 14019, 68, 160, 160, 10 + EDITTEXT 14019, 68, 160, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT ":", 14020, 8, 189, 45, 10 CHECKBOX "ǂݎp(&R)", 14021, 58, 189, 67, 10 CHECKBOX "Bt@C(&H)", 14022, 126, 189, 50, 10 @@ -253,11 +253,11 @@ CAPTION " FONT 9, "MS UI Gothic", 0, 0, 0x0 BEGIN LTEXT "t@Co[W: ", 14000, 10, 10, 55, 10 - LTEXT "", 14001, 77, 10, 152, 10 + EDITTEXT 14001, 77, 10, 152, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT ": ", 14002, 10, 27, 45, 10 - LTEXT "", 14003, 77, 27, 152, 10 + EDITTEXT 14003, 77, 27, 152, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "쌠: ", 14004, 10, 46, 66, 10 - LTEXT "", 14005, 77, 46, 152, 10 + EDITTEXT 14005, 77, 46, 152, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER GROUPBOX "̑̃o[W: ", 14006, 6, 70, 222, 115 LTEXT "ږ: ", 14007, 13, 82, 50, 10 LTEXT "l: ", 14008, 112, 82, 45, 10 @@ -272,24 +272,24 @@ FONT 9, "MS UI Gothic", 0, 0, 0x0 BEGIN EDITTEXT 14000, 40, 20, 190, 14, ES_LEFT|WS_BORDER|WS_GROUP LTEXT ":", -1, 15, 55, 40, 10 - LTEXT "", 14001, 110, 55, 100, 10 + EDITTEXT 14001, 110, 55, 100, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "t@CVXe:", -1, 15, 70, 100, 10 - LTEXT "", 14002, 110, 70, 100, 10 + EDITTEXT 14002, 110, 70, 100, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER CONTROL "", 14013, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 5, 90, 10, 10 LTEXT "gp̈:", -1, 25, 90, 120, 10 - LTEXT "", 14003, 110, 90, 120, 10 - LTEXT "", 14004, 200, 90, 40, 10 + EDITTEXT 14003, 110, 90, 85, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER + EDITTEXT 14004, 200, 90, 40, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER CONTROL "", 14014, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 5, 105, 10, 10 LTEXT "󂫗̈:", -1, 25, 105, 70, 10 - LTEXT "", 14005, 110, 105, 120, 10 - LTEXT "", 14006, 200, 105, 40, 10 + EDITTEXT 14005, 110, 105, 85, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER + EDITTEXT 14006, 200, 105, 40, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "e:", -1, 25, 125, 80, 10 - LTEXT "", 14007, 110, 125, 120, 10 - LTEXT "", 14008, 200, 125, 40, 10 + EDITTEXT 14007, 110, 125, 85, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER + EDITTEXT 14008, 200, 125, 40, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER CONTROL "", 14015, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 20, 140, 200, 20 diff --git a/reactos/dll/win32/shell32/lang/ko-KR.rc b/reactos/dll/win32/shell32/lang/ko-KR.rc index b5d0dfa5c91..275849385a8 100644 --- a/reactos/dll/win32/shell32/lang/ko-KR.rc +++ b/reactos/dll/win32/shell32/lang/ko-KR.rc @@ -170,7 +170,7 @@ BEGIN LTEXT "Target type:", 14004, 8, 38, 64, 10 LTEXT "", 14005, 78, 38, 142, 10 LTEXT "Target location:", 14006, 8, 58, 64, 10 - LTEXT "", 14007, 79, 58, 141, 10 + EDITTEXT 14007, 79, 58, 141, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Target:", 14008, 8, 77, 45, 10 EDITTEXT 14009, 79, 75, 150, 14, ES_AUTOHSCROLL LTEXT "&Start in:", 14010, 8, 96, 57, 10 @@ -209,13 +209,13 @@ BEGIN LTEXT "Type of file:", 14004, 8, 35, 50, 10 LTEXT "Folder", 14005, 68, 35, 160, 10 LTEXT "Location:", 14006, 8, 53, 50, 10 - LTEXT "", 14007, 68, 53, 315, 10 + EDITTEXT 14007, 68, 53, 315, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Size:", 14008, 8, 72, 45, 10 - LTEXT "", 14009, 68, 72, 315, 10 + EDITTEXT 14009, 68, 72, 315, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Contains:", 14010, 8, 93, 45, 10 - LTEXT "", 14011, 68, 93, 160, 10 + EDITTEXT 14011, 68, 93, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Created:", 14014, 8, 118, 45, 10 - LTEXT "", 14015, 68, 118, 160, 10 + EDITTEXT 14015, 68, 118, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER AUTOCHECKBOX "&Read-only", 14021, 45, 150, 67, 10 AUTOCHECKBOX "&Hidden", 14022, 126, 150, 50, 10 END @@ -230,17 +230,17 @@ BEGIN LTEXT "Type of file:", 14004, 8, 35, 50, 10 LTEXT "File", 14005, 68, 35, 160, 10 LTEXT "Opens with:", 14006, 8, 53, 50, 10 - LTEXT "", 14007, 68, 53, 160, 10 + EDITTEXT 14007, 68, 53, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Location:", 14008, 8, 72, 45, 10 - LTEXT "", 14009, 68, 72, 315, 10 + EDITTEXT 14009, 68, 72, 315, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Size:", 14010, 8, 93, 45, 10 - LTEXT "", 14011, 68, 93, 160, 10 + EDITTEXT 14011, 68, 93, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Created:", 14014, 8, 118, 45, 10 - LTEXT "", 14015, 68, 118, 160, 10 + EDITTEXT 14015, 68, 118, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Modified:", 14016, 8, 140, 45, 10 - LTEXT "", 14017, 68, 140, 160, 10 + EDITTEXT 14017, 68, 140, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Accessed:", 14018, 8, 160, 45, 10 - LTEXT "", 14019, 68, 160, 160, 10 + EDITTEXT 14019, 68, 160, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Attributes:", 14020, 8, 189, 45, 10 CHECKBOX "&Read-only", 14021, 58, 189, 67, 10 CHECKBOX "&Hidden", 14022, 126, 189, 50, 10 @@ -253,11 +253,11 @@ CAPTION "Version" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN LTEXT "File version: ", 14000, 10, 10, 55, 10 - LTEXT "", 14001, 77, 10, 152, 10 + EDITTEXT 14001, 77, 10, 152, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Description: ", 14002, 10, 27, 45, 10 - LTEXT "", 14003, 77, 27, 152, 10 + EDITTEXT 14003, 77, 27, 152, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Copyright: ", 14004, 10, 46, 66, 10 - LTEXT "", 14005, 77, 46, 152, 10 + EDITTEXT 14005, 77, 46, 152, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER GROUPBOX "Other version information: ", 14006, 6, 70, 222, 115 LTEXT "Item name: ", 14007, 13, 82, 50, 10 LTEXT "Value: ", 14008, 112, 82, 45, 10 @@ -272,24 +272,24 @@ FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN EDITTEXT 14000, 40, 20, 190, 14, ES_LEFT|WS_BORDER|WS_GROUP LTEXT "Type:", -1, 15, 55, 40, 10 - LTEXT "", 14001, 110, 55, 100, 10 + EDITTEXT 14001, 110, 55, 100, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "File system:", -1, 15, 70, 100, 10 - LTEXT "", 14002, 110, 70, 100, 10 + EDITTEXT 14002, 110, 70, 100, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER CONTROL "", 14013, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 5, 90, 10, 10 LTEXT "Used space:", -1, 25, 90, 120, 10 - LTEXT "", 14003, 110, 90, 120, 10 - LTEXT "", 14004, 200, 90, 40, 10 + EDITTEXT 14003, 110, 90, 85, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER + EDITTEXT 14004, 200, 90, 40, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER CONTROL "", 14014, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 5, 105, 10, 10 LTEXT "Free space:", -1, 25, 105, 70, 10 - LTEXT "", 14005, 110, 105, 120, 10 - LTEXT "", 14006, 200, 105, 40, 10 + EDITTEXT 14005, 110, 105, 85, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER + EDITTEXT 14006, 200, 105, 40, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Capacity:", -1, 25, 125, 80, 10 - LTEXT "", 14007, 110, 125, 120, 10 - LTEXT "", 14008, 200, 125, 40, 10 + EDITTEXT 14007, 110, 125, 85, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER + EDITTEXT 14008, 200, 125, 40, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER CONTROL "", 14015, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 20, 140, 200, 20 diff --git a/reactos/dll/win32/shell32/lang/nl-NL.rc b/reactos/dll/win32/shell32/lang/nl-NL.rc index fa176ce352d..c754e703a4a 100644 --- a/reactos/dll/win32/shell32/lang/nl-NL.rc +++ b/reactos/dll/win32/shell32/lang/nl-NL.rc @@ -170,7 +170,7 @@ BEGIN LTEXT "Target type:", 14004, 8, 38, 64, 10 LTEXT "", 14005, 78, 38, 142, 10 LTEXT "Target location:", 14006, 8, 58, 64, 10 - LTEXT "", 14007, 79, 58, 141, 10 + EDITTEXT 14007, 79, 58, 141, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Target:", 14008, 8, 77, 45, 10 EDITTEXT 14009, 79, 75, 150, 14, ES_AUTOHSCROLL LTEXT "&Start in:", 14010, 8, 96, 57, 10 @@ -209,13 +209,13 @@ BEGIN LTEXT "Type of file:", 14004, 8, 35, 50, 10 LTEXT "Folder", 14005, 68, 35, 160, 10 LTEXT "Location:", 14006, 8, 53, 50, 10 - LTEXT "", 14007, 68, 53, 315, 10 + EDITTEXT 14007, 68, 53, 315, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Size:", 14008, 8, 72, 45, 10 - LTEXT "", 14009, 68, 72, 315, 10 + EDITTEXT 14009, 68, 72, 315, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Contains:", 14010, 8, 93, 45, 10 - LTEXT "", 14011, 68, 93, 160, 10 + EDITTEXT 14011, 68, 93, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Created:", 14014, 8, 118, 45, 10 - LTEXT "", 14015, 68, 118, 160, 10 + EDITTEXT 14015, 68, 118, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER AUTOCHECKBOX "&Read-only", 14021, 45, 150, 67, 10 AUTOCHECKBOX "&Hidden", 14022, 126, 150, 50, 10 END @@ -230,17 +230,17 @@ BEGIN LTEXT "Type of file:", 14004, 8, 35, 50, 10 LTEXT "File", 14005, 68, 35, 160, 10 LTEXT "Opens with:", 14006, 8, 53, 50, 10 - LTEXT "", 14007, 68, 53, 160, 10 + EDITTEXT 14007, 68, 53, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Location:", 14008, 8, 72, 45, 10 - LTEXT "", 14009, 68, 72, 315, 10 + EDITTEXT 14009, 68, 72, 315, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Size:", 14010, 8, 93, 45, 10 - LTEXT "", 14011, 68, 93, 160, 10 + EDITTEXT 14011, 68, 93, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Created:", 14014, 8, 118, 45, 10 - LTEXT "", 14015, 68, 118, 160, 10 + EDITTEXT 14015, 68, 118, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Modified:", 14016, 8, 140, 45, 10 - LTEXT "", 14017, 68, 140, 160, 10 + EDITTEXT 14017, 68, 140, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Accessed:", 14018, 8, 160, 45, 10 - LTEXT "", 14019, 68, 160, 160, 10 + EDITTEXT 14019, 68, 160, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Attributes:", 14020, 8, 189, 45, 10 CHECKBOX "&Read-only", 14021, 58, 189, 67, 10 CHECKBOX "&Hidden", 14022, 126, 189, 50, 10 @@ -253,11 +253,11 @@ CAPTION "Version" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN LTEXT "File version: ", 14000, 10, 10, 55, 10 - LTEXT "", 14001, 77, 10, 152, 10 + EDITTEXT 14001, 77, 10, 152, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Description: ", 14002, 10, 27, 45, 10 - LTEXT "", 14003, 77, 27, 152, 10 + EDITTEXT 14003, 77, 27, 152, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Copyright: ", 14004, 10, 46, 66, 10 - LTEXT "", 14005, 77, 46, 152, 10 + EDITTEXT 14005, 77, 46, 152, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER GROUPBOX "Other version information: ", 14006, 6, 70, 222, 115 LTEXT "Item name: ", 14007, 13, 82, 50, 10 LTEXT "Value: ", 14008, 112, 82, 45, 10 @@ -272,24 +272,24 @@ FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN EDITTEXT 14000, 40, 20, 190, 14, ES_LEFT|WS_BORDER|WS_GROUP LTEXT "Type:", -1, 15, 55, 40, 10 - LTEXT "", 14001, 110, 55, 100, 10 + EDITTEXT 14001, 110, 55, 100, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "File system:", -1, 15, 70, 100, 10 - LTEXT "", 14002, 110, 70, 100, 10 + EDITTEXT 14002, 110, 70, 100, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER CONTROL "", 14013, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 5, 90, 10, 10 LTEXT "Used space:", -1, 25, 90, 120, 10 - LTEXT "", 14003, 110, 90, 120, 10 - LTEXT "", 14004, 200, 90, 40, 10 + EDITTEXT 14003, 110, 90, 85, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER + EDITTEXT 14004, 200, 90, 40, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER CONTROL "", 14014, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 5, 105, 10, 10 LTEXT "Free space:", -1, 25, 105, 70, 10 - LTEXT "", 14005, 110, 105, 120, 10 - LTEXT "", 14006, 200, 105, 40, 10 + EDITTEXT 14005, 110, 105, 85, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER + EDITTEXT 14006, 200, 105, 40, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Capacity:", -1, 25, 125, 80, 10 - LTEXT "", 14007, 110, 125, 120, 10 - LTEXT "", 14008, 200, 125, 40, 10 + EDITTEXT 14007, 110, 125, 85, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER + EDITTEXT 14008, 200, 125, 40, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER CONTROL "", 14015, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 20, 140, 200, 20 diff --git a/reactos/dll/win32/shell32/lang/no-NO.rc b/reactos/dll/win32/shell32/lang/no-NO.rc index e576cb47d54..2f944c02902 100644 --- a/reactos/dll/win32/shell32/lang/no-NO.rc +++ b/reactos/dll/win32/shell32/lang/no-NO.rc @@ -170,7 +170,7 @@ BEGIN LTEXT "Plasseringstype:", 14004, 10, 30, 50, 10 LTEXT "", 14005, 70, 30, 150, 10 LTEXT "Plasseringssted:", 14006, 10, 40, 70, 10 - LTEXT "", 14007, 70, 40, 150, 10 + EDITTEXT 14007, 70, 40, 150, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Plassering:", 14008, 10, 55, 45, 10 EDITTEXT 14009, 70, 55, 150, 10, ES_LEFT | ES_AUTOHSCROLL LTEXT "&Start i:",14010, 10, 65, 57, 10 @@ -209,13 +209,13 @@ BEGIN LTEXT "Filtype:", 14004, 8, 35, 50, 10 LTEXT "Mappe", 14005, 68, 35, 160, 10 LTEXT "Lokalisjon:", 14006, 8, 53, 50, 10 - LTEXT "", 14007, 68, 53, 315, 10 + EDITTEXT 14007, 68, 53, 315, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Strrelse:", 14008, 8, 72, 45, 10 - LTEXT "", 14009, 68, 72, 315, 10 + EDITTEXT 14009, 68, 72, 315, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Inneholder:", 14010, 8, 93, 45, 10 - LTEXT "", 14011, 68, 93, 160, 10 + EDITTEXT 14011, 68, 93, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Opprettet:", 14014, 8, 118, 45, 10 - LTEXT "", 14015, 68, 118, 160, 10 + EDITTEXT 14015, 68, 118, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER AUTOCHECKBOX "&Bare-lesbar", 14021, 45, 150, 67, 10 AUTOCHECKBOX "&Skjult", 14022, 126, 150, 50, 10 END @@ -231,17 +231,17 @@ BEGIN LTEXT "Filtype:", 14004, 8, 35, 50, 10 LTEXT "Fil", 14005, 68, 35, 160, 10 LTEXT "pne med:", 14006, 8, 53, 50, 10 - LTEXT "", 14007, 68, 53, 160, 10 + EDITTEXT 14007, 68, 53, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Lokalisjon:", 14008, 8, 72, 45, 10 - LTEXT "", 14009, 68, 72, 315, 10 + EDITTEXT 14009, 68, 72, 315, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Strrelse:", 14010, 8, 93, 45, 10 - LTEXT "", 14011, 68, 93, 160, 10 + EDITTEXT 14011, 68, 93, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Opprettet:", 14014, 8, 118, 45, 10 - LTEXT "", 14015, 68, 118, 160, 10 + EDITTEXT 14015, 68, 118, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Modifisert:", 14016, 8, 140, 45, 10 - LTEXT "", 14017, 68, 140, 160, 10 + EDITTEXT 14017, 68, 140, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "pnet:", 14018, 8, 160, 45, 10 - LTEXT "", 14019, 68, 160, 160, 10 + EDITTEXT 14019, 68, 160, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Rettigheter:", 14020, 8, 189, 45, 10 CHECKBOX "&Bare-lesbar", 14021, 58, 189, 67, 10 CHECKBOX "&Skjult", 14022, 126, 189, 50, 10 @@ -254,11 +254,11 @@ CAPTION "Versjon" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN LTEXT "Filversjon: ", 14000, 10, 10, 55, 10 - LTEXT "", 14001, 77, 10, 152, 10 + EDITTEXT 14001, 77, 10, 152, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Beskrivelse: ", 14002, 10, 27, 45, 10 - LTEXT "", 14003, 77, 27, 152, 10 + EDITTEXT 14003, 77, 27, 152, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Enerett: ", 14004, 10, 46, 66, 10 - LTEXT "", 14005, 77, 46, 152, 10 + EDITTEXT 14005, 77, 46, 152, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER GROUPBOX "Annet versjon informasjon: ", 14006, 6, 70, 222, 115 LTEXT "Enhetsnavn: ", 14007, 13, 82, 50, 10 LTEXT "Verdi: ", 14008, 112, 82, 45, 10 @@ -273,24 +273,24 @@ FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN EDITTEXT 14000, 40, 20, 190, 14, ES_LEFT|WS_BORDER|WS_GROUP LTEXT "Type:", -1, 15, 55, 40, 10 - LTEXT "", 14001, 110, 55, 100, 10 + EDITTEXT 14001, 110, 55, 100, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Filsystem:", -1, 15, 70, 100, 10 - LTEXT "", 14002, 110, 70, 100, 10 + EDITTEXT 14002, 110, 70, 100, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER CONTROL "", 14013, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 5, 90, 10, 10 LTEXT "Brukt plass:", -1, 25, 90, 120, 10 - LTEXT "", 14003, 110, 90, 120, 10 - LTEXT "", 14004, 200, 90, 40, 10 + EDITTEXT 14003, 110, 90, 85, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER + EDITTEXT 14004, 200, 90, 40, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER CONTROL "", 14014, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 5, 105, 10, 10 LTEXT "Ledig plass:", -1, 25, 105, 70, 10 - LTEXT "", 14005, 110, 105, 120, 10 - LTEXT "", 14006, 200, 105, 40, 10 + EDITTEXT 14005, 110, 105, 85, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER + EDITTEXT 14006, 200, 105, 40, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Kapasitet:", -1, 25, 125, 80, 10 - LTEXT "", 14007, 110, 125, 120, 10 - LTEXT "", 14008, 200, 125, 40, 10 + EDITTEXT 14007, 110, 125, 85, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER + EDITTEXT 14008, 200, 125, 40, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER CONTROL "", 14015, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 20, 140, 200, 20 diff --git a/reactos/dll/win32/shell32/lang/pl-PL.rc b/reactos/dll/win32/shell32/lang/pl-PL.rc index 2b1615b9721..d41fb99f52c 100644 --- a/reactos/dll/win32/shell32/lang/pl-PL.rc +++ b/reactos/dll/win32/shell32/lang/pl-PL.rc @@ -178,7 +178,7 @@ BEGIN LTEXT "Typ docelowy:", 14004, 8, 38, 64, 10 LTEXT "", 14005, 78, 38, 142, 10 LTEXT "Lokalizacja:", 14006, 8, 58, 64, 10 - LTEXT "", 14007, 79, 58, 141, 10 + EDITTEXT 14007, 79, 58, 141, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Element docelowy:", 14008, 8, 77, 45, 10 EDITTEXT 14009, 79, 75, 150, 14, ES_AUTOHSCROLL LTEXT "&Uruchom w:", 14010, 8, 96, 57, 10 @@ -217,13 +217,13 @@ BEGIN LTEXT "Rozszerzenie:", 14004, 8, 35, 50, 10 LTEXT "Katalog", 14005, 68, 35, 160, 10 LTEXT "Lokalizacja:", 14006, 8, 53, 50, 10 - LTEXT "", 14007, 68, 53, 315, 10 + EDITTEXT 14007, 68, 53, 315, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Rozmiar:", 14008, 8, 72, 45, 10 - LTEXT "", 14009, 68, 72, 315, 10 + EDITTEXT 14009, 68, 72, 315, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Zawiera:", 14010, 8, 93, 45, 10 - LTEXT "", 14011, 68, 93, 160, 10 + EDITTEXT 14011, 68, 93, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Utworzony:", 14014, 8, 118, 45, 10 - LTEXT "", 14015, 68, 118, 160, 10 + EDITTEXT 14015, 68, 118, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER AUTOCHECKBOX "&Tylko do odczytu", 14021, 45, 150, 67, 10 AUTOCHECKBOX "&Ukryty", 14022, 126, 150, 50, 10 END @@ -238,17 +238,17 @@ BEGIN LTEXT "Typ pliku:", 14004, 8, 35, 50, 10 LTEXT "Plik", 14005, 68, 35, 160, 10 LTEXT "Otwierany za pomoc:", 14006, 8, 53, 50, 10 - LTEXT "", 14007, 68, 53, 160, 10 + EDITTEXT 14007, 68, 53, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Lokalizacja:", 14008, 8, 72, 45, 10 - LTEXT "", 14009, 68, 72, 315, 10 + EDITTEXT 14009, 68, 72, 315, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Rozmiar:", 14010, 8, 93, 45, 10 - LTEXT "", 14011, 68, 93, 160, 10 + EDITTEXT 14011, 68, 93, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Utworzony:", 14014, 8, 118, 45, 10 - LTEXT "", 14015, 68, 118, 160, 10 + EDITTEXT 14015, 68, 118, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Zmodyfikowany:", 14016, 8, 140, 45, 10 - LTEXT "", 14017, 68, 140, 160, 10 + EDITTEXT 14017, 68, 140, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Ostatnio uyty:", 14018, 8, 160, 45, 10 - LTEXT "", 14019, 68, 160, 160, 10 + EDITTEXT 14019, 68, 160, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Atrybuty:", 14020, 8, 189, 45, 10 CHECKBOX "&Tylko do odczytu", 14021, 58, 189, 67, 10 CHECKBOX "&Ukryty", 14022, 126, 189, 50, 10 @@ -261,11 +261,11 @@ CAPTION "Wersja" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN LTEXT "Wersja pliku: ", 14000, 10, 10, 55, 10 - LTEXT "", 14001, 77, 10, 152, 10 + EDITTEXT 14001, 77, 10, 152, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Opis: ", 14002, 10, 27, 45, 10 - LTEXT "", 14003, 77, 27, 152, 10 + EDITTEXT 14003, 77, 27, 152, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Prawa autorskie: ", 14004, 10, 46, 66, 10 - LTEXT "", 14005, 77, 46, 152, 10 + EDITTEXT 14005, 77, 46, 152, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER GROUPBOX "Pozostae informacje o wersji: ", 14006, 6, 70, 222, 115 LTEXT "Nazwa: ", 14007, 13, 82, 50, 10 LTEXT "Warto: ", 14008, 112, 82, 45, 10 @@ -280,24 +280,24 @@ FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN EDITTEXT 14000, 40, 20, 190, 14, ES_LEFT|WS_BORDER|WS_GROUP LTEXT "Typ:", -1, 15, 55, 40, 10 - LTEXT "", 14001, 110, 55, 100, 10 + EDITTEXT 14001, 110, 55, 100, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "System plikw:", -1, 15, 70, 100, 10 - LTEXT "", 14002, 110, 70, 100, 10 + EDITTEXT 14002, 110, 70, 100, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER CONTROL "", 14013, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 5, 90, 10, 10 LTEXT "Zajte miejsce:", -1, 25, 90, 120, 10 - LTEXT "", 14003, 110, 90, 120, 10 - LTEXT "", 14004, 200, 90, 40, 10 + EDITTEXT 14003, 110, 90, 85, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER + EDITTEXT 14004, 200, 90, 40, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER CONTROL "", 14014, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 5, 105, 10, 10 LTEXT "Wolne miejsce:", -1, 25, 105, 70, 10 - LTEXT "", 14005, 110, 105, 120, 10 - LTEXT "", 14006, 200, 105, 40, 10 + EDITTEXT 14005, 110, 105, 85, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER + EDITTEXT 14006, 200, 105, 40, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Pojemno:", -1, 25, 125, 80, 10 - LTEXT "", 14007, 110, 125, 120, 10 - LTEXT "", 14008, 200, 125, 40, 10 + EDITTEXT 14007, 110, 125, 85, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER + EDITTEXT 14008, 200, 125, 40, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER CONTROL "", 14015, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 20, 140, 200, 20 diff --git a/reactos/dll/win32/shell32/lang/pt-BR.rc b/reactos/dll/win32/shell32/lang/pt-BR.rc index ef97edbea18..e018066a89a 100644 --- a/reactos/dll/win32/shell32/lang/pt-BR.rc +++ b/reactos/dll/win32/shell32/lang/pt-BR.rc @@ -172,7 +172,7 @@ BEGIN LTEXT "Target type:", 14004, 8, 38, 64, 10 LTEXT "", 14005, 78, 38, 142, 10 LTEXT "Target location:", 14006, 8, 58, 64, 10 - LTEXT "", 14007, 79, 58, 141, 10 + EDITTEXT 14007, 79, 58, 141, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Target:", 14008, 8, 77, 45, 10 EDITTEXT 14009, 79, 75, 150, 14, ES_AUTOHSCROLL LTEXT "&Start in:", 14010, 8, 96, 57, 10 @@ -211,13 +211,13 @@ BEGIN LTEXT "Type of file:", 14004, 8, 35, 50, 10 LTEXT "Folder", 14005, 68, 35, 160, 10 LTEXT "Location:", 14006, 8, 53, 50, 10 - LTEXT "", 14007, 68, 53, 315, 10 + EDITTEXT 14007, 68, 53, 315, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Size:", 14008, 8, 72, 45, 10 - LTEXT "", 14009, 68, 72, 315, 10 + EDITTEXT 14009, 68, 72, 315, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Contains:", 14010, 8, 93, 45, 10 - LTEXT "", 14011, 68, 93, 160, 10 + EDITTEXT 14011, 68, 93, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Created:", 14014, 8, 118, 45, 10 - LTEXT "", 14015, 68, 118, 160, 10 + EDITTEXT 14015, 68, 118, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER AUTOCHECKBOX "&Read-only", 14021, 45, 150, 67, 10 AUTOCHECKBOX "&Hidden", 14022, 126, 150, 50, 10 END @@ -232,17 +232,17 @@ BEGIN LTEXT "Type of file:", 14004, 8, 35, 50, 10 LTEXT "File", 14005, 68, 35, 160, 10 LTEXT "Opens with:", 14006, 8, 53, 50, 10 - LTEXT "", 14007, 68, 53, 160, 10 + EDITTEXT 14007, 68, 53, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Location:", 14008, 8, 72, 45, 10 - LTEXT "", 14009, 68, 72, 315, 10 + EDITTEXT 14009, 68, 72, 315, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Size:", 14010, 8, 93, 45, 10 - LTEXT "", 14011, 68, 93, 160, 10 + EDITTEXT 14011, 68, 93, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Created:", 14014, 8, 118, 45, 10 - LTEXT "", 14015, 68, 118, 160, 10 + EDITTEXT 14015, 68, 118, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Modified:", 14016, 8, 140, 45, 10 - LTEXT "", 14017, 68, 140, 160, 10 + EDITTEXT 14017, 68, 140, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Accessed:", 14018, 8, 160, 45, 10 - LTEXT "", 14019, 68, 160, 160, 10 + EDITTEXT 14019, 68, 160, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Attributes:", 14020, 8, 189, 45, 10 CHECKBOX "&Read-only", 14021, 58, 189, 67, 10 CHECKBOX "&Hidden", 14022, 126, 189, 50, 10 @@ -255,11 +255,11 @@ CAPTION "Version" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN LTEXT "File version: ", 14000, 10, 10, 55, 10 - LTEXT "", 14001, 77, 10, 152, 10 + EDITTEXT 14001, 77, 10, 152, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Description: ", 14002, 10, 27, 45, 10 - LTEXT "", 14003, 77, 27, 152, 10 + EDITTEXT 14003, 77, 27, 152, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Copyright: ", 14004, 10, 46, 66, 10 - LTEXT "", 14005, 77, 46, 152, 10 + EDITTEXT 14005, 77, 46, 152, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER GROUPBOX "Other version information: ", 14006, 6, 70, 222, 115 LTEXT "Item name: ", 14007, 13, 82, 50, 10 LTEXT "Value: ", 14008, 112, 82, 45, 10 @@ -274,24 +274,24 @@ FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN EDITTEXT 14000, 40, 20, 190, 14, ES_LEFT|WS_BORDER|WS_GROUP LTEXT "Type:", -1, 15, 55, 40, 10 - LTEXT "", 14001, 110, 55, 100, 10 + EDITTEXT 14001, 110, 55, 100, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "File system:", -1, 15, 70, 100, 10 - LTEXT "", 14002, 110, 70, 100, 10 + EDITTEXT 14002, 110, 70, 100, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER CONTROL "", 14013, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 5, 90, 10, 10 LTEXT "Used space:", -1, 25, 90, 120, 10 - LTEXT "", 14003, 110, 90, 120, 10 - LTEXT "", 14004, 200, 90, 40, 10 + EDITTEXT 14003, 110, 90, 85, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER + EDITTEXT 14004, 200, 90, 40, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER CONTROL "", 14014, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 5, 105, 10, 10 LTEXT "Free space:", -1, 25, 105, 70, 10 - LTEXT "", 14005, 110, 105, 120, 10 - LTEXT "", 14006, 200, 105, 40, 10 + EDITTEXT 14005, 110, 105, 85, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER + EDITTEXT 14006, 200, 105, 40, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Capacity:", -1, 25, 125, 80, 10 - LTEXT "", 14007, 110, 125, 120, 10 - LTEXT "", 14008, 200, 125, 40, 10 + EDITTEXT 14007, 110, 125, 85, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER + EDITTEXT 14008, 200, 125, 40, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER CONTROL "", 14015, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 20, 140, 200, 20 diff --git a/reactos/dll/win32/shell32/lang/pt-PT.rc b/reactos/dll/win32/shell32/lang/pt-PT.rc index 6daead85f4a..25541f081a8 100644 --- a/reactos/dll/win32/shell32/lang/pt-PT.rc +++ b/reactos/dll/win32/shell32/lang/pt-PT.rc @@ -173,7 +173,7 @@ BEGIN LTEXT "Tipo de destino:", 14004, 8, 38, 64, 10 LTEXT "", 14005, 78, 38, 142, 10 LTEXT "Localizao do destino:", 14006, 8, 58, 64, 10 - LTEXT "", 14007, 79, 58, 141, 10 + EDITTEXT 14007, 79, 58, 141, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Destino:", 14008, 8, 77, 45, 10 EDITTEXT 14009, 79, 75, 150, 14, ES_AUTOHSCROLL LTEXT "&Iniciar em:", 14010, 8, 96, 57, 10 @@ -212,13 +212,13 @@ BEGIN LTEXT "Tipo de ficheiro:", 14004, 8, 35, 50, 10 LTEXT "Pasta", 14005, 68, 35, 160, 10 LTEXT "Localizao:", 14006, 8, 53, 50, 10 - LTEXT "", 14007, 68, 53, 315, 10 + EDITTEXT 14007, 68, 53, 315, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Tamanho:", 14008, 8, 72, 45, 10 - LTEXT "", 14009, 68, 72, 315, 10 + EDITTEXT 14009, 68, 72, 315, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Contm:", 14010, 8, 93, 45, 10 - LTEXT "", 14011, 68, 93, 160, 10 + EDITTEXT 14011, 68, 93, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Criado:", 14014, 8, 118, 45, 10 - LTEXT "", 14015, 68, 118, 160, 10 + EDITTEXT 14015, 68, 118, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER AUTOCHECKBOX "&Smente de Leitura", 14021, 45, 150, 67, 10 AUTOCHECKBOX "&Escondido", 14022, 126, 150, 50, 10 END @@ -233,17 +233,17 @@ BEGIN LTEXT "Tipo de Ficheiro:", 14004, 8, 35, 50, 10 LTEXT "Ficheiro", 14005, 68, 35, 160, 10 LTEXT "Abre com::", 14006, 8, 53, 50, 10 - LTEXT "", 14007, 68, 53, 160, 10 + EDITTEXT 14007, 68, 53, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Localizao:", 14008, 8, 72, 45, 10 - LTEXT "", 14009, 68, 72, 315, 10 + EDITTEXT 14009, 68, 72, 315, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Tamanho:", 14010, 8, 93, 45, 10 - LTEXT "", 14011, 68, 93, 160, 10 + EDITTEXT 14011, 68, 93, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Criado:", 14014, 8, 118, 45, 10 - LTEXT "", 14015, 68, 118, 160, 10 + EDITTEXT 14015, 68, 118, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Modificado:", 14016, 8, 140, 45, 10 - LTEXT "", 14017, 68, 140, 160, 10 + EDITTEXT 14017, 68, 140, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Acedido:", 14018, 8, 160, 45, 10 - LTEXT "", 14019, 68, 160, 160, 10 + EDITTEXT 14019, 68, 160, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "propriedades:", 14020, 8, 189, 45, 10 CHECKBOX "&Somente de Leitura", 14021, 58, 189, 67, 10 CHECKBOX "&Oculto", 14022, 126, 189, 50, 10 @@ -256,11 +256,11 @@ CAPTION "Vers FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN LTEXT "Verso do Ficheiro: ", 14000, 10, 10, 55, 10 - LTEXT "", 14001, 77, 10, 152, 10 + EDITTEXT 14001, 77, 10, 152, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Descrio: ", 14002, 10, 27, 45, 10 - LTEXT "", 14003, 77, 27, 152, 10 + EDITTEXT 14003, 77, 27, 152, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Copyright: ", 14004, 10, 46, 66, 10 - LTEXT "", 14005, 77, 46, 152, 10 + EDITTEXT 14005, 77, 46, 152, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER GROUPBOX "Outras informaes da verso: ", 14006, 6, 70, 222, 115 LTEXT "Nome do Item: ", 14007, 13, 82, 50, 10 LTEXT "Valor: ", 14008, 112, 82, 45, 10 @@ -275,24 +275,24 @@ FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN EDITTEXT 14000, 40, 20, 190, 14, ES_LEFT|WS_BORDER|WS_GROUP LTEXT "Tipo:", -1, 15, 55, 40, 10 - LTEXT "", 14001, 110, 55, 100, 10 + EDITTEXT 14001, 110, 55, 100, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Sistema de Ficheiros:", -1, 15, 70, 100, 10 - LTEXT "", 14002, 110, 70, 100, 10 + EDITTEXT 14002, 110, 70, 100, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER CONTROL "", 14013, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 5, 90, 10, 10 LTEXT "Espao utilizado:", -1, 25, 90, 120, 10 - LTEXT "", 14003, 110, 90, 120, 10 - LTEXT "", 14004, 200, 90, 40, 10 + EDITTEXT 14003, 110, 90, 85, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER + EDITTEXT 14004, 200, 90, 40, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER CONTROL "", 14014, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 5, 105, 10, 10 LTEXT "Espao livre:", -1, 25, 105, 70, 10 - LTEXT "", 14005, 110, 105, 120, 10 - LTEXT "", 14006, 200, 105, 40, 10 + EDITTEXT 14005, 110, 105, 85, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER + EDITTEXT 14006, 200, 105, 40, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Capacidade:", -1, 25, 125, 80, 10 - LTEXT "", 14007, 110, 125, 120, 10 - LTEXT "", 14008, 200, 125, 40, 10 + EDITTEXT 14007, 110, 125, 85, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER + EDITTEXT 14008, 200, 125, 40, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER CONTROL "", 14015, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 20, 140, 200, 20 diff --git a/reactos/dll/win32/shell32/lang/ro-RO.rc b/reactos/dll/win32/shell32/lang/ro-RO.rc index 47d05ffc62a..3a89641e619 100644 --- a/reactos/dll/win32/shell32/lang/ro-RO.rc +++ b/reactos/dll/win32/shell32/lang/ro-RO.rc @@ -172,7 +172,7 @@ BEGIN LTEXT "Tip țintă:", 14004, 8, 38, 64, 10 LTEXT "", 14005, 78, 38, 142, 10 LTEXT "Locație țintă:", 14006, 8, 58, 64, 10 - LTEXT "", 14007, 79, 58, 141, 10 + EDITTEXT 14007, 79, 58, 141, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Țintă:", 14008, 8, 77, 45, 10 EDITTEXT 14009, 79, 75, 150, 14, ES_AUTOHSCROLL LTEXT "&Pornire în:", 14010, 8, 96, 57, 10 @@ -211,13 +211,13 @@ BEGIN LTEXT "Tip fișier:", 14004, 8, 35, 50, 10 LTEXT "Folder", 14005, 68, 35, 160, 10 LTEXT "Locație:", 14006, 8, 53, 50, 10 - LTEXT "", 14007, 68, 53, 315, 10 + EDITTEXT 14007, 68, 53, 315, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Mărime:", 14008, 8, 72, 45, 10 - LTEXT "", 14009, 68, 72, 315, 10 + EDITTEXT 14009, 68, 72, 315, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Conține:", 14010, 8, 93, 45, 10 - LTEXT "", 14011, 68, 93, 160, 10 + EDITTEXT 14011, 68, 93, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Creat:", 14014, 8, 118, 45, 10 - LTEXT "", 14015, 68, 118, 160, 10 + EDITTEXT 14015, 68, 118, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER AUTOCHECKBOX "&Doar-în-citire", 14021, 45, 150, 67, 10 AUTOCHECKBOX "&Ascuns", 14022, 126, 150, 50, 10 END @@ -233,17 +233,17 @@ BEGIN LTEXT "Tip fișier:", 14004, 8, 35, 50, 10 LTEXT "Fișier", 14005, 68, 35, 160, 10 LTEXT "Se deschide cu:", 14006, 8, 53, 50, 10 - LTEXT "", 14007, 68, 53, 160, 10 + EDITTEXT 14007, 68, 53, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Locație:", 14008, 8, 72, 45, 10 - LTEXT "", 14009, 68, 72, 315, 10 + EDITTEXT 14009, 68, 72, 315, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Mărime:", 14010, 8, 93, 45, 10 - LTEXT "", 14011, 68, 93, 160, 10 + EDITTEXT 14011, 68, 93, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Creat:", 14014, 8, 118, 45, 10 - LTEXT "", 14015, 68, 118, 160, 10 + EDITTEXT 14015, 68, 118, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Modificat:", 14016, 8, 140, 45, 10 - LTEXT "", 14017, 68, 140, 160, 10 + EDITTEXT 14017, 68, 140, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Accesat:", 14018, 8, 160, 45, 10 - LTEXT "", 14019, 68, 160, 160, 10 + EDITTEXT 14019, 68, 160, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Atribute:", 14020, 8, 189, 45, 10 CHECKBOX "&Doar-în-citire", 14021, 58, 189, 67, 10 CHECKBOX "&Ascuns", 14022, 126, 189, 50, 10 @@ -256,11 +256,11 @@ CAPTION "Versiune" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN LTEXT "Versiune fișier: ", 14000, 10, 10, 55, 10 - LTEXT "", 14001, 77, 10, 152, 10 + EDITTEXT 14001, 77, 10, 152, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Descriere: ", 14002, 10, 27, 45, 10 - LTEXT "", 14003, 77, 27, 152, 10 + EDITTEXT 14003, 77, 27, 152, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Drept de autor: ", 14004, 10, 46, 66, 10 - LTEXT "", 14005, 77, 46, 152, 10 + EDITTEXT 14005, 77, 46, 152, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER GROUPBOX "Alte informații versiune", 14006, 6, 70, 222, 115 LTEXT "Nume element: ", 14007, 13, 82, 50, 10 LTEXT "Valoare: ", 14008, 112, 82, 45, 10 @@ -275,24 +275,24 @@ FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN EDITTEXT 14000, 40, 20, 190, 14, ES_LEFT|WS_BORDER|WS_GROUP LTEXT "Tip:", -1, 15, 55, 40, 10 - LTEXT "", 14001, 110, 55, 100, 10 + EDITTEXT 14001, 110, 55, 100, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Sistem de fișiere:", -1, 15, 70, 100, 10 - LTEXT "", 14002, 110, 70, 100, 10 + EDITTEXT 14002, 110, 70, 100, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER CONTROL "", 14013, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 5, 90, 10, 10 LTEXT "Spațiu folosit:", -1, 25, 90, 120, 10 - LTEXT "", 14003, 110, 90, 120, 10 - LTEXT "", 14004, 200, 90, 40, 10 + EDITTEXT 14003, 110, 90, 85, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER + EDITTEXT 14004, 200, 90, 40, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER CONTROL "", 14014, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 5, 105, 10, 10 LTEXT "Spațiu liber:", -1, 25, 105, 70, 10 - LTEXT "", 14005, 110, 105, 120, 10 - LTEXT "", 14006, 200, 105, 40, 10 + EDITTEXT 14005, 110, 105, 85, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER + EDITTEXT 14006, 200, 105, 40, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Capacitate:", -1, 25, 125, 80, 10 - LTEXT "", 14007, 110, 125, 120, 10 - LTEXT "", 14008, 200, 125, 40, 10 + EDITTEXT 14007, 110, 125, 85, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER + EDITTEXT 14008, 200, 125, 40, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER CONTROL "", 14015, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 20, 140, 200, 20 diff --git a/reactos/dll/win32/shell32/lang/ru-RU.rc b/reactos/dll/win32/shell32/lang/ru-RU.rc index b3ecbdb4909..64ccb664e6a 100644 --- a/reactos/dll/win32/shell32/lang/ru-RU.rc +++ b/reactos/dll/win32/shell32/lang/ru-RU.rc @@ -171,7 +171,7 @@ BEGIN LTEXT " :", 14004, 8, 38, 64, 10 LTEXT "", 14005, 78, 38, 142, 10 LTEXT ":", 14006, 8, 58, 64, 10 - LTEXT "", 14007, 79, 58, 141, 10 + EDITTEXT 14007, 79, 58, 141, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT ":", 14008, 8, 77, 45, 10 EDITTEXT 14009, 79, 75, 150, 14, ES_AUTOHSCROLL LTEXT "& :", 14010, 8, 96, 57, 10 @@ -210,13 +210,13 @@ BEGIN LTEXT " :", 14004, 8, 35, 50, 10 LTEXT "", 14005, 68, 35, 160, 10 LTEXT ":", 14006, 8, 53, 50, 10 - LTEXT "", 14007, 68, 53, 315, 10 + EDITTEXT 14007, 68, 53, 315, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT ":", 14008, 8, 72, 45, 10 - LTEXT "", 14009, 68, 72, 315, 10 + EDITTEXT 14009, 68, 72, 315, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT ":", 14010, 8, 93, 45, 10 - LTEXT "", 14011, 68, 93, 160, 10 + EDITTEXT 14011, 68, 93, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT ":", 14014, 8, 118, 45, 10 - LTEXT "", 14015, 68, 118, 160, 10 + EDITTEXT 14015, 68, 118, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER AUTOCHECKBOX "& ", 14021, 45, 150, 67, 10 AUTOCHECKBOX "&", 14022, 126, 150, 50, 10 END @@ -231,17 +231,17 @@ BEGIN LTEXT " :", 14004, 8, 35, 50, 10 LTEXT "", 14005, 68, 35, 160, 10 LTEXT ":", 14006, 8, 53, 50, 10 - LTEXT "", 14007, 68, 53, 160, 10 + EDITTEXT 14007, 68, 53, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT ":", 14008, 8, 72, 45, 10 - LTEXT "", 14009, 68, 72, 315, 10 + EDITTEXT 14009, 68, 72, 315, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT ":", 14010, 8, 93, 45, 10 - LTEXT "", 14011, 68, 93, 160, 10 + EDITTEXT 14011, 68, 93, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT ":", 14014, 8, 118, 45, 10 - LTEXT "", 14015, 68, 118, 160, 10 + EDITTEXT 14015, 68, 118, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT ":", 14016, 8, 140, 45, 10 - LTEXT "", 14017, 68, 140, 160, 10 + EDITTEXT 14017, 68, 140, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT ":", 14018, 8, 160, 45, 10 - LTEXT "", 14019, 68, 160, 160, 10 + EDITTEXT 14019, 68, 160, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT ":", 14020, 8, 189, 45, 10 CHECKBOX " &", 14021, 58, 189, 67, 10 CHECKBOX "&", 14022, 126, 189, 50, 10 @@ -254,11 +254,11 @@ CAPTION " FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN LTEXT " : ", 14000, 10, 10, 55, 10 - LTEXT "", 14001, 77, 10, 152, 10 + EDITTEXT 14001, 77, 10, 152, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT ": ", 14002, 10, 27, 45, 10 - LTEXT "", 14003, 77, 27, 152, 10 + EDITTEXT 14003, 77, 27, 152, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT " : ", 14004, 10, 46, 66, 10 - LTEXT "", 14005, 77, 46, 152, 10 + EDITTEXT 14005, 77, 46, 152, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER GROUPBOX " : ", 14006, 6, 70, 222, 115 LTEXT " : ", 14007, 13, 82, 63, 10 LTEXT ": ", 14008, 112, 82, 45, 10 @@ -273,24 +273,24 @@ FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN EDITTEXT 14000, 40, 20, 190, 14, ES_LEFT|WS_BORDER|WS_GROUP LTEXT ":", -1, 15, 49, 40, 10 - LTEXT "", 14001, 110, 49, 100, 10 + EDITTEXT 14001, 110, 49, 100, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT " :", -1, 15, 68, 86, 10 - LTEXT "", 14002, 110, 68, 100, 10 + EDITTEXT 14002, 110, 68, 100, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER CONTROL "", 14013, "STATIC", SS_OWNERDRAW | SS_NOTIFY | SS_SUNKEN, 5, 90, 10, 10 LTEXT ":", -1, 25, 90, 78, 10 - LTEXT "", 14003, 110, 90, 120, 10 - LTEXT "", 14004, 200, 90, 40, 10 + EDITTEXT 14003, 110, 90, 85, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER + EDITTEXT 14004, 200, 90, 40, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER CONTROL "", 14014, "STATIC", SS_OWNERDRAW | SS_NOTIFY | SS_SUNKEN, 5, 105, 10, 10 LTEXT ":", -1, 25, 105, 70, 10 - LTEXT "", 14005, 110, 105, 120, 10 - LTEXT "", 14006, 200, 105, 40, 10 + EDITTEXT 14005, 110, 105, 85, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER + EDITTEXT 14006, 200, 105, 40, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT ":", -1, 25, 125, 80, 10 - LTEXT "", 14007, 110, 125, 120, 10 - LTEXT "", 14008, 200, 125, 40, 10 + EDITTEXT 14007, 110, 125, 85, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER + EDITTEXT 14008, 200, 125, 40, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER CONTROL "", 14015, "STATIC", SS_OWNERDRAW | SS_NOTIFY | SS_SUNKEN, 20, 140, 200, 20 diff --git a/reactos/dll/win32/shell32/lang/sk-SK.rc b/reactos/dll/win32/shell32/lang/sk-SK.rc index 7620ce08536..2a5f7ed78d4 100644 --- a/reactos/dll/win32/shell32/lang/sk-SK.rc +++ b/reactos/dll/win32/shell32/lang/sk-SK.rc @@ -176,7 +176,7 @@ BEGIN LTEXT "Typ ciea:", 14004, 8, 38, 64, 10 LTEXT "", 14005, 78, 38, 142, 10 LTEXT "Umiestnenie ciea:", 14006, 8, 58, 64, 10 - LTEXT "", 14007, 79, 58, 141, 10 + EDITTEXT 14007, 79, 58, 141, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "&Cie:", 14008, 8, 77, 45, 10 EDITTEXT 14009, 79, 75, 150, 14, ES_AUTOHSCROLL LTEXT "Z&aa v prieinku:", 14010, 8, 96, 57, 10 @@ -215,13 +215,13 @@ BEGIN LTEXT "Typ:", 14004, 8, 35, 50, 10 LTEXT "Prieinok", 14005, 68, 35, 160, 10 LTEXT "Umiestnenie:", 14006, 8, 53, 50, 10 - LTEXT "", 14007, 68, 53, 315, 10 + EDITTEXT 14007, 68, 53, 315, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Vekos:", 14008, 8, 72, 45, 10 - LTEXT "", 14009, 68, 72, 315, 10 + EDITTEXT 14009, 68, 72, 315, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Obsahuje:", 14010, 8, 93, 45, 10 - LTEXT "", 14011, 68, 93, 160, 10 + EDITTEXT 14011, 68, 93, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Vytvoren:", 14014, 8, 118, 45, 10 - LTEXT "", 14015, 68, 118, 160, 10 + EDITTEXT 14015, 68, 118, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER AUTOCHECKBOX "&Iba na tanie", 14021, 45, 150, 67, 10 AUTOCHECKBOX "&Skryt", 14022, 126, 150, 50, 10 END @@ -236,17 +236,17 @@ BEGIN LTEXT "Typ sboru:", 14004, 8, 35, 50, 10 LTEXT "Sbor", 14005, 68, 35, 160, 10 LTEXT "Otvori programom:", 14006, 8, 53, 50, 10 - LTEXT "", 14007, 68, 53, 160, 10 + EDITTEXT 14007, 68, 53, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Umiestnenie:", 14008, 8, 72, 45, 10 - LTEXT "", 14009, 68, 72, 315, 10 + EDITTEXT 14009, 68, 72, 315, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Vekos:", 14010, 8, 93, 45, 10 - LTEXT "", 14011, 68, 93, 160, 10 + EDITTEXT 14011, 68, 93, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Vytvoren:", 14014, 8, 118, 45, 10 - LTEXT "", 14015, 68, 118, 160, 10 + EDITTEXT 14015, 68, 118, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Zmenen:", 14016, 8, 140, 45, 10 - LTEXT "", 14017, 68, 140, 160, 10 + EDITTEXT 14017, 68, 140, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Otvoren:", 14018, 8, 160, 45, 10 - LTEXT "", 14019, 68, 160, 160, 10 + EDITTEXT 14019, 68, 160, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Atribty:", 14020, 8, 189, 45, 10 CHECKBOX "&Iba na tanie", 14021, 58, 189, 67, 10 CHECKBOX "&Skryt", 14022, 126, 189, 50, 10 @@ -259,11 +259,11 @@ CAPTION "Verzia" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN LTEXT "Verzia sboru: ", 14000, 10, 10, 55, 10 - LTEXT "", 14001, 77, 10, 152, 10 + EDITTEXT 14001, 77, 10, 152, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Popis: ", 14002, 10, 27, 45, 10 - LTEXT "", 14003, 77, 27, 152, 10 + EDITTEXT 14003, 77, 27, 152, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Autorsk prva: ", 14004, 10, 46, 66, 10 //Copyright - LTEXT "", 14005, 77, 46, 152, 10 + EDITTEXT 14005, 77, 46, 152, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER GROUPBOX "In informcie o verzii: ", 14006, 6, 70, 222, 115 LTEXT "Nzov poloky: ", 14007, 13, 82, 50, 10 LTEXT "Hodnota: ", 14008, 112, 82, 45, 10 @@ -278,24 +278,24 @@ FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN EDITTEXT 14000, 40, 20, 190, 14, ES_LEFT|WS_BORDER|WS_GROUP LTEXT "Typ:", -1, 15, 55, 40, 10 - LTEXT "", 14001, 110, 55, 100, 10 + EDITTEXT 14001, 110, 55, 100, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Systm sborov:", -1, 15, 70, 100, 10 - LTEXT "", 14002, 110, 70, 100, 10 + EDITTEXT 14002, 110, 70, 100, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER CONTROL "", 14013, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 5, 90, 10, 10 LTEXT "Vyuit miesto:", -1, 25, 90, 120, 10 - LTEXT "", 14003, 110, 90, 120, 10 - LTEXT "", 14004, 200, 90, 40, 10 + EDITTEXT 14003, 110, 90, 85, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER + EDITTEXT 14004, 200, 90, 40, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER CONTROL "", 14014, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 5, 105, 10, 10 LTEXT "Von miesto:", -1, 25, 105, 70, 10 - LTEXT "", 14005, 110, 105, 120, 10 - LTEXT "", 14006, 200, 105, 40, 10 + EDITTEXT 14005, 110, 105, 85, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER + EDITTEXT 14006, 200, 105, 40, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Kapacita:", -1, 25, 125, 80, 10 - LTEXT "", 14007, 110, 125, 120, 10 - LTEXT "", 14008, 200, 125, 40, 10 + EDITTEXT 14007, 110, 125, 85, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER + EDITTEXT 14008, 200, 125, 40, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER CONTROL "", 14015, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 20, 140, 200, 20 diff --git a/reactos/dll/win32/shell32/lang/sl-SI.rc b/reactos/dll/win32/shell32/lang/sl-SI.rc index 594cdf88181..84513d4b97b 100644 --- a/reactos/dll/win32/shell32/lang/sl-SI.rc +++ b/reactos/dll/win32/shell32/lang/sl-SI.rc @@ -170,7 +170,7 @@ BEGIN LTEXT "Target type:", 14004, 8, 38, 64, 10 LTEXT "", 14005, 78, 38, 142, 10 LTEXT "Target location:", 14006, 8, 58, 64, 10 - LTEXT "", 14007, 79, 58, 141, 10 + EDITTEXT 14007, 79, 58, 141, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Target:", 14008, 8, 77, 45, 10 EDITTEXT 14009, 79, 75, 150, 14, ES_AUTOHSCROLL LTEXT "&Start in:", 14010, 8, 96, 57, 10 @@ -209,13 +209,13 @@ BEGIN LTEXT "Type of file:", 14004, 8, 35, 50, 10 LTEXT "Folder", 14005, 68, 35, 160, 10 LTEXT "Location:", 14006, 8, 53, 50, 10 - LTEXT "", 14007, 68, 53, 315, 10 + EDITTEXT 14007, 68, 53, 315, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Size:", 14008, 8, 72, 45, 10 - LTEXT "", 14009, 68, 72, 315, 10 + EDITTEXT 14009, 68, 72, 315, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Contains:", 14010, 8, 93, 45, 10 - LTEXT "", 14011, 68, 93, 160, 10 + EDITTEXT 14011, 68, 93, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Created:", 14014, 8, 118, 45, 10 - LTEXT "", 14015, 68, 118, 160, 10 + EDITTEXT 14015, 68, 118, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER AUTOCHECKBOX "&Read-only", 14021, 45, 150, 67, 10 AUTOCHECKBOX "&Hidden", 14022, 126, 150, 50, 10 END @@ -230,17 +230,17 @@ BEGIN LTEXT "Type of file:", 14004, 8, 35, 50, 10 LTEXT "File", 14005, 68, 35, 160, 10 LTEXT "Opens with:", 14006, 8, 53, 50, 10 - LTEXT "", 14007, 68, 53, 160, 10 + EDITTEXT 14007, 68, 53, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Location:", 14008, 8, 72, 45, 10 - LTEXT "", 14009, 68, 72, 315, 10 + EDITTEXT 14009, 68, 72, 315, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Size:", 14010, 8, 93, 45, 10 - LTEXT "", 14011, 68, 93, 160, 10 + EDITTEXT 14011, 68, 93, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Created:", 14014, 8, 118, 45, 10 - LTEXT "", 14015, 68, 118, 160, 10 + EDITTEXT 14015, 68, 118, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Modified:", 14016, 8, 140, 45, 10 - LTEXT "", 14017, 68, 140, 160, 10 + EDITTEXT 14017, 68, 140, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Accessed:", 14018, 8, 160, 45, 10 - LTEXT "", 14019, 68, 160, 160, 10 + EDITTEXT 14019, 68, 160, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Attributes:", 14020, 8, 189, 45, 10 CHECKBOX "&Read-only", 14021, 58, 189, 67, 10 CHECKBOX "&Hidden", 14022, 126, 189, 50, 10 @@ -253,11 +253,11 @@ CAPTION "Version" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN LTEXT "File version: ", 14000, 10, 10, 55, 10 - LTEXT "", 14001, 77, 10, 152, 10 + EDITTEXT 14001, 77, 10, 152, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Description: ", 14002, 10, 27, 45, 10 - LTEXT "", 14003, 77, 27, 152, 10 + EDITTEXT 14003, 77, 27, 152, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Copyright: ", 14004, 10, 46, 66, 10 - LTEXT "", 14005, 77, 46, 152, 10 + EDITTEXT 14005, 77, 46, 152, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER GROUPBOX "Other version information: ", 14006, 6, 70, 222, 115 LTEXT "Item name: ", 14007, 13, 82, 50, 10 LTEXT "Value: ", 14008, 112, 82, 45, 10 @@ -272,24 +272,24 @@ FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN EDITTEXT 14000, 40, 20, 190, 14, ES_LEFT|WS_BORDER|WS_GROUP LTEXT "Type:", -1, 15, 55, 40, 10 - LTEXT "", 14001, 110, 55, 100, 10 + EDITTEXT 14001, 110, 55, 100, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "File system:", -1, 15, 70, 100, 10 - LTEXT "", 14002, 110, 70, 100, 10 + EDITTEXT 14002, 110, 70, 100, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER CONTROL "", 14013, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 5, 90, 10, 10 LTEXT "Used space:", -1, 25, 90, 120, 10 - LTEXT "", 14003, 110, 90, 120, 10 - LTEXT "", 14004, 200, 90, 40, 10 + EDITTEXT 14003, 110, 90, 85, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER + EDITTEXT 14004, 200, 90, 40, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER CONTROL "", 14014, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 5, 105, 10, 10 LTEXT "Free space:", -1, 25, 105, 70, 10 - LTEXT "", 14005, 110, 105, 120, 10 - LTEXT "", 14006, 200, 105, 40, 10 + EDITTEXT 14005, 110, 105, 85, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER + EDITTEXT 14006, 200, 105, 40, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Capacity:", -1, 25, 125, 80, 10 - LTEXT "", 14007, 110, 125, 120, 10 - LTEXT "", 14008, 200, 125, 40, 10 + EDITTEXT 14007, 110, 125, 85, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER + EDITTEXT 14008, 200, 125, 40, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER CONTROL "", 14015, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 20, 140, 200, 20 diff --git a/reactos/dll/win32/shell32/lang/sv-SE.rc b/reactos/dll/win32/shell32/lang/sv-SE.rc index 0238edfae66..cc940c8460d 100644 --- a/reactos/dll/win32/shell32/lang/sv-SE.rc +++ b/reactos/dll/win32/shell32/lang/sv-SE.rc @@ -170,7 +170,7 @@ BEGIN LTEXT "Target type:", 14004, 8, 38, 64, 10 LTEXT "", 14005, 78, 38, 142, 10 LTEXT "Target location:", 14006, 8, 58, 64, 10 - LTEXT "", 14007, 79, 58, 141, 10 + EDITTEXT 14007, 79, 58, 141, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Target:", 14008, 8, 77, 45, 10 EDITTEXT 14009, 79, 75, 150, 14, ES_AUTOHSCROLL LTEXT "&Start in:", 14010, 8, 96, 57, 10 @@ -209,13 +209,13 @@ BEGIN LTEXT "Type of file:", 14004, 8, 35, 50, 10 LTEXT "Folder", 14005, 68, 35, 160, 10 LTEXT "Location:", 14006, 8, 53, 50, 10 - LTEXT "", 14007, 68, 53, 315, 10 + EDITTEXT 14007, 68, 53, 315, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Size:", 14008, 8, 72, 45, 10 - LTEXT "", 14009, 68, 72, 315, 10 + EDITTEXT 14009, 68, 72, 315, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Contains:", 14010, 8, 93, 45, 10 - LTEXT "", 14011, 68, 93, 160, 10 + EDITTEXT 14011, 68, 93, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Created:", 14014, 8, 118, 45, 10 - LTEXT "", 14015, 68, 118, 160, 10 + EDITTEXT 14015, 68, 118, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER AUTOCHECKBOX "&Read-only", 14021, 45, 150, 67, 10 AUTOCHECKBOX "&Hidden", 14022, 126, 150, 50, 10 END @@ -230,17 +230,17 @@ BEGIN LTEXT "Type of file:", 14004, 8, 35, 50, 10 LTEXT "File", 14005, 68, 35, 160, 10 LTEXT "Opens with:", 14006, 8, 53, 50, 10 - LTEXT "", 14007, 68, 53, 160, 10 + EDITTEXT 14007, 68, 53, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Location:", 14008, 8, 72, 45, 10 - LTEXT "", 14009, 68, 72, 315, 10 + EDITTEXT 14009, 68, 72, 315, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Size:", 14010, 8, 93, 45, 10 - LTEXT "", 14011, 68, 93, 160, 10 + EDITTEXT 14011, 68, 93, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Created:", 14014, 8, 118, 45, 10 - LTEXT "", 14015, 68, 118, 160, 10 + EDITTEXT 14015, 68, 118, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Modified:", 14016, 8, 140, 45, 10 - LTEXT "", 14017, 68, 140, 160, 10 + EDITTEXT 14017, 68, 140, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Accessed:", 14018, 8, 160, 45, 10 - LTEXT "", 14019, 68, 160, 160, 10 + EDITTEXT 14019, 68, 160, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Attributes:", 14020, 8, 189, 45, 10 CHECKBOX "&Read-only", 14021, 58, 189, 67, 10 CHECKBOX "&Hidden", 14022, 126, 189, 50, 10 @@ -253,11 +253,11 @@ CAPTION "Version" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN LTEXT "File version: ", 14000, 10, 10, 55, 10 - LTEXT "", 14001, 77, 10, 152, 10 + EDITTEXT 14001, 77, 10, 152, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Description: ", 14002, 10, 27, 45, 10 - LTEXT "", 14003, 77, 27, 152, 10 + EDITTEXT 14003, 77, 27, 152, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Copyright: ", 14004, 10, 46, 66, 10 - LTEXT "", 14005, 77, 46, 152, 10 + EDITTEXT 14005, 77, 46, 152, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER GROUPBOX "Other version information: ", 14006, 6, 70, 222, 115 LTEXT "Item name: ", 14007, 13, 82, 50, 10 LTEXT "Value: ", 14008, 112, 82, 45, 10 @@ -272,24 +272,24 @@ FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN EDITTEXT 14000, 40, 20, 190, 14, ES_LEFT|WS_BORDER|WS_GROUP LTEXT "Type:", -1, 15, 55, 40, 10 - LTEXT "", 14001, 110, 55, 100, 10 + EDITTEXT 14001, 110, 55, 100, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "File system:", -1, 15, 70, 100, 10 - LTEXT "", 14002, 110, 70, 100, 10 + EDITTEXT 14002, 110, 70, 100, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER CONTROL "", 14013, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 5, 90, 10, 10 LTEXT "Used space:", -1, 25, 90, 120, 10 - LTEXT "", 14003, 110, 90, 120, 10 - LTEXT "", 14004, 200, 90, 40, 10 + EDITTEXT 14003, 110, 90, 85, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER + EDITTEXT 14004, 200, 90, 40, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER CONTROL "", 14014, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 5, 105, 10, 10 LTEXT "Free space:", -1, 25, 105, 70, 10 - LTEXT "", 14005, 110, 105, 120, 10 - LTEXT "", 14006, 200, 105, 40, 10 + EDITTEXT 14005, 110, 105, 85, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER + EDITTEXT 14006, 200, 105, 40, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Capacity:", -1, 25, 125, 80, 10 - LTEXT "", 14007, 110, 125, 120, 10 - LTEXT "", 14008, 200, 125, 40, 10 + EDITTEXT 14007, 110, 125, 85, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER + EDITTEXT 14008, 200, 125, 40, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER CONTROL "", 14015, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 20, 140, 200, 20 diff --git a/reactos/dll/win32/shell32/lang/tr-TR.rc b/reactos/dll/win32/shell32/lang/tr-TR.rc index d5ca8c1fb25..b95063003fb 100644 --- a/reactos/dll/win32/shell32/lang/tr-TR.rc +++ b/reactos/dll/win32/shell32/lang/tr-TR.rc @@ -170,7 +170,7 @@ BEGIN LTEXT "Target type:", 14004, 8, 38, 64, 10 LTEXT "", 14005, 78, 38, 142, 10 LTEXT "Target location:", 14006, 8, 58, 64, 10 - LTEXT "", 14007, 79, 58, 141, 10 + EDITTEXT 14007, 79, 58, 141, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Target:", 14008, 8, 77, 45, 10 EDITTEXT 14009, 79, 75, 150, 14, ES_AUTOHSCROLL LTEXT "&Start in:", 14010, 8, 96, 57, 10 @@ -209,13 +209,13 @@ BEGIN LTEXT "Type of file:", 14004, 8, 35, 50, 10 LTEXT "Folder", 14005, 68, 35, 160, 10 LTEXT "Location:", 14006, 8, 53, 50, 10 - LTEXT "", 14007, 68, 53, 315, 10 + EDITTEXT 14007, 68, 53, 315, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Size:", 14008, 8, 72, 45, 10 - LTEXT "", 14009, 68, 72, 315, 10 + EDITTEXT 14009, 68, 72, 315, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Contains:", 14010, 8, 93, 45, 10 - LTEXT "", 14011, 68, 93, 160, 10 + EDITTEXT 14011, 68, 93, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Created:", 14014, 8, 118, 45, 10 - LTEXT "", 14015, 68, 118, 160, 10 + EDITTEXT 14015, 68, 118, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER AUTOCHECKBOX "&Read-only", 14021, 45, 150, 67, 10 AUTOCHECKBOX "&Hidden", 14022, 126, 150, 50, 10 END @@ -230,17 +230,17 @@ BEGIN LTEXT "Type of file:", 14004, 8, 35, 50, 10 LTEXT "File", 14005, 68, 35, 160, 10 LTEXT "Opens with:", 14006, 8, 53, 50, 10 - LTEXT "", 14007, 68, 53, 160, 10 + EDITTEXT 14007, 68, 53, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Location:", 14008, 8, 72, 45, 10 - LTEXT "", 14009, 68, 72, 315, 10 + EDITTEXT 14009, 68, 72, 315, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Size:", 14010, 8, 93, 45, 10 - LTEXT "", 14011, 68, 93, 160, 10 + EDITTEXT 14011, 68, 93, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Created:", 14014, 8, 118, 45, 10 - LTEXT "", 14015, 68, 118, 160, 10 + EDITTEXT 14015, 68, 118, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Modified:", 14016, 8, 140, 45, 10 - LTEXT "", 14017, 68, 140, 160, 10 + EDITTEXT 14017, 68, 140, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Accessed:", 14018, 8, 160, 45, 10 - LTEXT "", 14019, 68, 160, 160, 10 + EDITTEXT 14019, 68, 160, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Attributes:", 14020, 8, 189, 45, 10 CHECKBOX "&Read-only", 14021, 58, 189, 67, 10 CHECKBOX "&Hidden", 14022, 126, 189, 50, 10 @@ -253,11 +253,11 @@ CAPTION "Version" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN LTEXT "File version: ", 14000, 10, 10, 55, 10 - LTEXT "", 14001, 77, 10, 152, 10 + EDITTEXT 14001, 77, 10, 152, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Description: ", 14002, 10, 27, 45, 10 - LTEXT "", 14003, 77, 27, 152, 10 + EDITTEXT 14003, 77, 27, 152, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Copyright: ", 14004, 10, 46, 66, 10 - LTEXT "", 14005, 77, 46, 152, 10 + EDITTEXT 14005, 77, 46, 152, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER GROUPBOX "Other version information: ", 14006, 6, 70, 222, 115 LTEXT "Item name: ", 14007, 13, 82, 50, 10 LTEXT "Value: ", 14008, 112, 82, 45, 10 @@ -272,24 +272,24 @@ FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN EDITTEXT 14000, 40, 20, 190, 14, ES_LEFT|WS_BORDER|WS_GROUP LTEXT "Type:", -1, 15, 55, 40, 10 - LTEXT "", 14001, 110, 55, 100, 10 + EDITTEXT 14001, 110, 55, 100, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "File system:", -1, 15, 70, 100, 10 - LTEXT "", 14002, 110, 70, 100, 10 + EDITTEXT 14002, 110, 70, 100, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER CONTROL "", 14013, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 5, 90, 10, 10 LTEXT "Used space:", -1, 25, 90, 120, 10 - LTEXT "", 14003, 110, 90, 120, 10 - LTEXT "", 14004, 200, 90, 40, 10 + EDITTEXT 14003, 110, 90, 85, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER + EDITTEXT 14004, 200, 90, 40, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER CONTROL "", 14014, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 5, 105, 10, 10 LTEXT "Free space:", -1, 25, 105, 70, 10 - LTEXT "", 14005, 110, 105, 120, 10 - LTEXT "", 14006, 200, 105, 40, 10 + EDITTEXT 14005, 110, 105, 85, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER + EDITTEXT 14006, 200, 105, 40, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Capacity:", -1, 25, 125, 80, 10 - LTEXT "", 14007, 110, 125, 120, 10 - LTEXT "", 14008, 200, 125, 40, 10 + EDITTEXT 14007, 110, 125, 85, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER + EDITTEXT 14008, 200, 125, 40, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER CONTROL "", 14015, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 20, 140, 200, 20 diff --git a/reactos/dll/win32/shell32/lang/uk-UA.rc b/reactos/dll/win32/shell32/lang/uk-UA.rc index bd2cfda8c93..785a67567c5 100644 --- a/reactos/dll/win32/shell32/lang/uk-UA.rc +++ b/reactos/dll/win32/shell32/lang/uk-UA.rc @@ -172,7 +172,7 @@ BEGIN LTEXT " ':", 14004, 8, 38, 64, 10 LTEXT "", 14005, 78, 38, 142, 10 LTEXT ":", 14006, 8, 58, 64, 10 - LTEXT "", 14007, 79, 58, 141, 10 + EDITTEXT 14007, 79, 58, 141, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "&':", 14008, 8, 77, 45, 10 EDITTEXT 14009, 79, 75, 150, 14, ES_AUTOHSCROLL LTEXT "& :", 14010, 8, 96, 57, 10 @@ -211,13 +211,13 @@ BEGIN LTEXT " :", 14004, 8, 35, 50, 10 LTEXT "", 14005, 68, 35, 160, 10 LTEXT ":", 14006, 8, 53, 50, 10 - LTEXT "", 14007, 68, 53, 315, 10 + EDITTEXT 14007, 68, 53, 315, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT ":", 14008, 8, 72, 45, 10 - LTEXT "", 14009, 68, 72, 315, 10 + EDITTEXT 14009, 68, 72, 315, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "̳:", 14010, 8, 93, 45, 10 - LTEXT "", 14011, 68, 93, 160, 10 + EDITTEXT 14011, 68, 93, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT ":", 14014, 8, 118, 45, 10 - LTEXT "", 14015, 68, 118, 160, 10 + EDITTEXT 14015, 68, 118, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER AUTOCHECKBOX " &", 14021, 45, 150, 67, 10 AUTOCHECKBOX "&", 14022, 126, 150, 50, 10 END @@ -232,17 +232,17 @@ BEGIN LTEXT " :", 14004, 8, 35, 50, 10 LTEXT "", 14005, 68, 35, 160, 10 LTEXT ":", 14006, 8, 53, 50, 10 - LTEXT "", 14007, 68, 53, 160, 10 + EDITTEXT 14007, 68, 53, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT ":", 14008, 8, 72, 50, 10 - LTEXT "", 14009, 68, 72, 315, 10 + EDITTEXT 14009, 68, 72, 315, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT ":", 14010, 8, 93, 45, 10 - LTEXT "", 14011, 68, 93, 160, 10 + EDITTEXT 14011, 68, 93, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT ":", 14014, 8, 118, 45, 10 - LTEXT "", 14015, 68, 118, 160, 10 + EDITTEXT 14015, 68, 118, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT ":", 14016, 8, 140, 45, 10 - LTEXT "", 14017, 68, 140, 160, 10 + EDITTEXT 14017, 68, 140, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "³:", 14018, 8, 160, 45, 10 - LTEXT "", 14019, 68, 160, 160, 10 + EDITTEXT 14019, 68, 160, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT ":", 14020, 8, 189, 45, 10 CHECKBOX " &", 14021, 58, 189, 67, 10 CHECKBOX "&", 14022, 126, 189, 50, 10 @@ -255,11 +255,11 @@ CAPTION " FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN LTEXT " : ", 14000, 10, 10, 55, 10 - LTEXT "", 14001, 77, 10, 152, 10 + EDITTEXT 14001, 77, 10, 152, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT ": ", 14002, 10, 27, 45, 10 - LTEXT "", 14003, 77, 27, 152, 10 + EDITTEXT 14003, 77, 27, 152, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT " : ", 14004, 10, 46, 66, 10 - LTEXT "", 14005, 77, 46, 152, 10 + EDITTEXT 14005, 77, 46, 152, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER GROUPBOX " : ", 14006, 6, 70, 222, 115 LTEXT "' : ", 14007, 13, 82, 50, 10 LTEXT ": ", 14008, 112, 82, 45, 10 @@ -274,24 +274,24 @@ FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN EDITTEXT 14000, 40, 20, 190, 14, ES_LEFT|WS_BORDER|WS_GROUP LTEXT ":", -1, 15, 55, 40, 10 - LTEXT "", 14001, 110, 55, 100, 10 + EDITTEXT 14001, 110, 55, 100, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT " :", -1, 15, 70, 100, 10 - LTEXT "", 14002, 110, 70, 100, 10 + EDITTEXT 14002, 110, 70, 100, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER CONTROL "", 14013, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 5, 90, 10, 10 LTEXT ":", -1, 25, 90, 120, 10 - LTEXT "", 14003, 110, 90, 120, 10 - LTEXT "", 14004, 200, 90, 40, 10 + EDITTEXT 14003, 110, 90, 85, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER + EDITTEXT 14004, 200, 90, 40, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER CONTROL "", 14014, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 5, 105, 10, 10 LTEXT ":", -1, 25, 105, 70, 10 - LTEXT "", 14005, 110, 105, 120, 10 - LTEXT "", 14006, 200, 105, 40, 10 + EDITTEXT 14005, 110, 105, 85, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER + EDITTEXT 14006, 200, 105, 40, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "̳:", -1, 25, 125, 80, 10 - LTEXT "", 14007, 110, 125, 120, 10 - LTEXT "", 14008, 200, 125, 40, 10 + EDITTEXT 14007, 110, 125, 85, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER + EDITTEXT 14008, 200, 125, 40, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER CONTROL "", 14015, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 20, 140, 200, 20 diff --git a/reactos/dll/win32/shell32/lang/zh-CN.rc b/reactos/dll/win32/shell32/lang/zh-CN.rc index 693a2890407..7b25bb40007 100644 --- a/reactos/dll/win32/shell32/lang/zh-CN.rc +++ b/reactos/dll/win32/shell32/lang/zh-CN.rc @@ -159,7 +159,7 @@ BEGIN LTEXT "Target type:", 14004, 8, 38, 64, 10 LTEXT "", 14005, 78, 38, 142, 10 LTEXT "Target location:", 14006, 8, 58, 64, 10 - LTEXT "", 14007, 79, 58, 141, 10 + EDITTEXT 14007, 79, 58, 141, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Target:", 14008, 8, 77, 45, 10 EDITTEXT 14009, 79, 75, 150, 14, ES_AUTOHSCROLL LTEXT "&Start in:", 14010, 8, 96, 57, 10 @@ -198,13 +198,13 @@ BEGIN LTEXT "Type of file:", 14004, 8, 35, 50, 10 LTEXT "Folder", 14005, 68, 35, 160, 10 LTEXT "Location:", 14006, 8, 53, 50, 10 - LTEXT "", 14007, 68, 53, 315, 10 + EDITTEXT 14007, 68, 53, 315, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Size:", 14008, 8, 72, 45, 10 - LTEXT "", 14009, 68, 72, 315, 10 + EDITTEXT 14009, 68, 72, 315, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Contains:", 14010, 8, 93, 45, 10 - LTEXT "", 14011, 68, 93, 160, 10 + EDITTEXT 14011, 68, 93, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Created:", 14014, 8, 118, 45, 10 - LTEXT "", 14015, 68, 118, 160, 10 + EDITTEXT 14015, 68, 118, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER AUTOCHECKBOX "&Read-only", 14021, 45, 150, 67, 10 AUTOCHECKBOX "&Hidden", 14022, 126, 150, 50, 10 END @@ -219,17 +219,17 @@ BEGIN LTEXT "Type of file:", 14004, 8, 35, 50, 10 LTEXT "File", 14005, 68, 35, 160, 10 LTEXT "Opens with:", 14006, 8, 53, 50, 10 - LTEXT "", 14007, 68, 53, 160, 10 + EDITTEXT 14007, 68, 53, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Location:", 14008, 8, 72, 45, 10 - LTEXT "", 14009, 68, 72, 315, 10 + EDITTEXT 14009, 68, 72, 315, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Size:", 14010, 8, 93, 45, 10 - LTEXT "", 14011, 68, 93, 160, 10 + EDITTEXT 14011, 68, 93, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Created:", 14014, 8, 118, 45, 10 - LTEXT "", 14015, 68, 118, 160, 10 + EDITTEXT 14015, 68, 118, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Modified:", 14016, 8, 140, 45, 10 - LTEXT "", 14017, 68, 140, 160, 10 + EDITTEXT 14017, 68, 140, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Accessed:", 14018, 8, 160, 45, 10 - LTEXT "", 14019, 68, 160, 160, 10 + EDITTEXT 14019, 68, 160, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Attributes:", 14020, 8, 189, 45, 10 CHECKBOX "&Read-only", 14021, 58, 189, 67, 10 CHECKBOX "&Hidden", 14022, 126, 189, 50, 10 @@ -242,11 +242,11 @@ CAPTION "Version" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN LTEXT "File version: ", 14000, 10, 10, 55, 10 - LTEXT "", 14001, 77, 10, 152, 10 + EDITTEXT 14001, 77, 10, 152, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Description: ", 14002, 10, 27, 45, 10 - LTEXT "", 14003, 77, 27, 152, 10 + EDITTEXT 14003, 77, 27, 152, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Copyright: ", 14004, 10, 46, 66, 10 - LTEXT "", 14005, 77, 46, 152, 10 + EDITTEXT 14005, 77, 46, 152, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER GROUPBOX "Other version information: ", 14006, 6, 70, 222, 115 LTEXT "Item name: ", 14007, 13, 82, 50, 10 LTEXT "Value: ", 14008, 112, 82, 45, 10 @@ -261,24 +261,24 @@ FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN EDITTEXT 14000, 40, 20, 190, 14, ES_LEFT|WS_BORDER|WS_GROUP LTEXT "Type:", -1, 15, 55, 40, 10 - LTEXT "", 14001, 110, 55, 100, 10 + EDITTEXT 14001, 110, 55, 100, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "File system:", -1, 15, 70, 100, 10 - LTEXT "", 14002, 110, 70, 100, 10 + EDITTEXT 14002, 110, 70, 100, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER CONTROL "", 14013, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 5, 90, 10, 10 LTEXT "Used space:", -1, 25, 90, 120, 10 - LTEXT "", 14003, 110, 90, 120, 10 - LTEXT "", 14004, 200, 90, 40, 10 + EDITTEXT 14003, 110, 90, 85, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER + EDITTEXT 14004, 200, 90, 40, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER CONTROL "", 14014, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 5, 105, 10, 10 LTEXT "Free space:", -1, 25, 105, 70, 10 - LTEXT "", 14005, 110, 105, 120, 10 - LTEXT "", 14006, 200, 105, 40, 10 + EDITTEXT 14005, 110, 105, 85, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER + EDITTEXT 14006, 200, 105, 40, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Capacity:", -1, 25, 125, 80, 10 - LTEXT "", 14007, 110, 125, 120, 10 - LTEXT "", 14008, 200, 125, 40, 10 + EDITTEXT 14007, 110, 125, 85, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER + EDITTEXT 14008, 200, 125, 40, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER CONTROL "", 14015, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 20, 140, 200, 20 diff --git a/reactos/dll/win32/shell32/lang/zh-TW.rc b/reactos/dll/win32/shell32/lang/zh-TW.rc index ea14a6d300c..5e386cba010 100644 --- a/reactos/dll/win32/shell32/lang/zh-TW.rc +++ b/reactos/dll/win32/shell32/lang/zh-TW.rc @@ -171,7 +171,7 @@ BEGIN LTEXT "Target type:", 14004, 8, 38, 64, 10 LTEXT "", 14005, 78, 38, 142, 10 LTEXT "Target location:", 14006, 8, 58, 64, 10 - LTEXT "", 14007, 79, 58, 141, 10 + EDITTEXT 14007, 79, 58, 141, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Target:", 14008, 8, 77, 45, 10 EDITTEXT 14009, 79, 75, 150, 14, ES_AUTOHSCROLL LTEXT "&Start in:", 14010, 8, 96, 57, 10 @@ -210,13 +210,13 @@ BEGIN LTEXT "Type of file:", 14004, 8, 35, 50, 10 LTEXT "Folder", 14005, 68, 35, 160, 10 LTEXT "Location:", 14006, 8, 53, 50, 10 - LTEXT "", 14007, 68, 53, 315, 10 + EDITTEXT 14007, 68, 53, 315, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Size:", 14008, 8, 72, 45, 10 - LTEXT "", 14009, 68, 72, 315, 10 + EDITTEXT 14009, 68, 72, 315, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Contains:", 14010, 8, 93, 45, 10 - LTEXT "", 14011, 68, 93, 160, 10 + EDITTEXT 14011, 68, 93, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Created:", 14014, 8, 118, 45, 10 - LTEXT "", 14015, 68, 118, 160, 10 + EDITTEXT 14015, 68, 118, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER AUTOCHECKBOX "&Read-only", 14021, 45, 150, 67, 10 AUTOCHECKBOX "&Hidden", 14022, 126, 150, 50, 10 END @@ -231,17 +231,17 @@ BEGIN LTEXT "Type of file:", 14004, 8, 35, 50, 10 LTEXT "File", 14005, 68, 35, 160, 10 LTEXT "Opens with:", 14006, 8, 53, 50, 10 - LTEXT "", 14007, 68, 53, 160, 10 + EDITTEXT 14007, 68, 53, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Location:", 14008, 8, 72, 45, 10 - LTEXT "", 14009, 68, 72, 315, 10 + EDITTEXT 14009, 68, 72, 315, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Size:", 14010, 8, 93, 45, 10 - LTEXT "", 14011, 68, 93, 160, 10 + EDITTEXT 14011, 68, 93, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Created:", 14014, 8, 118, 45, 10 - LTEXT "", 14015, 68, 118, 160, 10 + EDITTEXT 14015, 68, 118, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Modified:", 14016, 8, 140, 45, 10 - LTEXT "", 14017, 68, 140, 160, 10 + EDITTEXT 14017, 68, 140, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Accessed:", 14018, 8, 160, 45, 10 - LTEXT "", 14019, 68, 160, 160, 10 + EDITTEXT 14019, 68, 160, 160, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Attributes:", 14020, 8, 189, 45, 10 CHECKBOX "&Read-only", 14021, 58, 189, 67, 10 CHECKBOX "&Hidden", 14022, 126, 189, 50, 10 @@ -254,11 +254,11 @@ CAPTION "Version" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN LTEXT "File version: ", 14000, 10, 10, 55, 10 - LTEXT "", 14001, 77, 10, 152, 10 + EDITTEXT 14001, 77, 10, 152, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Description: ", 14002, 10, 27, 45, 10 - LTEXT "", 14003, 77, 27, 152, 10 + EDITTEXT 14003, 77, 27, 152, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Copyright: ", 14004, 10, 46, 66, 10 - LTEXT "", 14005, 77, 46, 152, 10 + EDITTEXT 14005, 77, 46, 152, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER GROUPBOX "Other version information: ", 14006, 6, 70, 222, 115 LTEXT "Item name: ", 14007, 13, 82, 50, 10 LTEXT "Value: ", 14008, 112, 82, 45, 10 @@ -273,24 +273,24 @@ FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN EDITTEXT 14000, 40, 20, 190, 14, ES_LEFT|WS_BORDER|WS_GROUP LTEXT "Type:", -1, 15, 55, 40, 10 - LTEXT "", 14001, 110, 55, 100, 10 + EDITTEXT 14001, 110, 55, 100, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "File system:", -1, 15, 70, 100, 10 - LTEXT "", 14002, 110, 70, 100, 10 + EDITTEXT 14002, 110, 70, 100, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER CONTROL "", 14013, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 5, 90, 10, 10 LTEXT "Used space:", -1, 25, 90, 120, 10 - LTEXT "", 14003, 110, 90, 120, 10 - LTEXT "", 14004, 200, 90, 40, 10 + EDITTEXT 14003, 110, 90, 85, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER + EDITTEXT 14004, 200, 90, 40, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER CONTROL "", 14014, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 5, 105, 10, 10 LTEXT "Free space:", -1, 25, 105, 70, 10 - LTEXT "", 14005, 110, 105, 120, 10 - LTEXT "", 14006, 200, 105, 40, 10 + EDITTEXT 14005, 110, 105, 85, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER + EDITTEXT 14006, 200, 105, 40, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER LTEXT "Capacity:", -1, 25, 125, 80, 10 - LTEXT "", 14007, 110, 125, 120, 10 - LTEXT "", 14008, 200, 125, 40, 10 + EDITTEXT 14007, 110, 125, 85, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER + EDITTEXT 14008, 200, 125, 40, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER CONTROL "", 14015, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 20, 140, 200, 20 From 70bef06a004e4505e8d9687d2e6fe6d3f8a4dd3d Mon Sep 17 00:00:00 2001 From: Matthias Kupfer Date: Sun, 10 Apr 2011 13:19:01 +0000 Subject: [PATCH 123/317] Radek Liska - Czech translations for sndrec32 and sndvol32. - See issue #6098 for details. svn path=/trunk/; revision=51310 --- .../base/applications/sndrec32/lang/cs-CZ.rc | 59 +++++++++++++++++++ reactos/base/applications/sndrec32/rsrc.rc | 1 + .../base/applications/sndvol32/lang/cs-CZ.rc | 16 ++++- 3 files changed, 75 insertions(+), 1 deletion(-) create mode 100644 reactos/base/applications/sndrec32/lang/cs-CZ.rc diff --git a/reactos/base/applications/sndrec32/lang/cs-CZ.rc b/reactos/base/applications/sndrec32/lang/cs-CZ.rc new file mode 100644 index 00000000000..a45c7881ed9 --- /dev/null +++ b/reactos/base/applications/sndrec32/lang/cs-CZ.rc @@ -0,0 +1,59 @@ +/* FILE: applications/sndrec32/lang/cs-CZ.rc + * TRANSLATOR: Radek Liska aka Black_Fox (radekliska at gmail dot com) + * UPDATED: 2011-04-09 + */ + +LANGUAGE LANG_CZECH, SUBLANG_DEFAULT + +IDC_REACTOS_SNDREC32 ACCELERATORS +BEGIN + "?", IDM_ABOUT, ASCII, ALT + "/", IDM_ABOUT, ASCII, ALT +END + +IDD_ABOUTBOX DIALOGEX 0, 0, 196, 75 +STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "ReactOS Zznam zvuku" +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + ICON 128,IDC_REACTOS_SNDREC32,19,14,21,20 + LTEXT "ReactOS Zznam zvuku, verze 1.0",IDC_STATIC,56,16,114,8,SS_NOPREFIX + LTEXT "Copyright (C) 2009",IDC_STATIC,55,25,114,8 + DEFPUSHBUTTON "OK",IDOK,139,54,50,14,WS_GROUP +END + +IDR_MENU1 MENU +BEGIN + POPUP "Soubor" + BEGIN + MENUITEM "Nov", ID_NEW + MENUITEM "Otevt...", ID_FILE_OPEN + MENUITEM "Uloit", ID_FILE_SAVE, GRAYED + MENUITEM "Uloit jako...", ID_FILE_SAVEAS, GRAYED + MENUITEM SEPARATOR + MENUITEM "Konec", ID_EXIT + END + MENUITEM "todo1", 0 + MENUITEM "todo2", 0 + POPUP "?" + BEGIN + MENUITEM "O programu...", ID__ABOUT + END +END + +STRINGTABLE +BEGIN + IDS_APP_TITLE "Zznam zvuku" + IDC_REACTOS_SNDREC32 "REACTOS_SNDREC32" +END + +STRINGTABLE +BEGIN + IDS_STRPOS "Pozice: %.2f s" + IDS_STRDUR "Dlka: %.2f s" + IDS_STRBUF "Buffer: %.2f kb" + IDS_STRFMT "%.1f kHz %u bit" + IDS_STRMONO "mono" + IDS_STRSTEREO "stereo" + IDS_STRCHAN "%s" +END diff --git a/reactos/base/applications/sndrec32/rsrc.rc b/reactos/base/applications/sndrec32/rsrc.rc index adc11abe1a4..ed4864a701d 100644 --- a/reactos/base/applications/sndrec32/rsrc.rc +++ b/reactos/base/applications/sndrec32/rsrc.rc @@ -16,6 +16,7 @@ IDB_BITMAP2_REC_DIS BITMAP "resources/but_rec_dis.bmp" IDB_BITMAP2_START_DIS BITMAP "resources/but_start_dis.bmp" IDB_BITMAP2_STOP_DIS BITMAP "resources/but_stop_dis.bmp" +#include "lang/cs-CZ.rc" #include "lang/de-DE.rc" #include "lang/en-US.rc" #include "lang/es-ES.rc" diff --git a/reactos/base/applications/sndvol32/lang/cs-CZ.rc b/reactos/base/applications/sndvol32/lang/cs-CZ.rc index 59ea4472c47..f5a77469f70 100644 --- a/reactos/base/applications/sndvol32/lang/cs-CZ.rc +++ b/reactos/base/applications/sndvol32/lang/cs-CZ.rc @@ -1,7 +1,7 @@ /* FILE: applications/sndvol32/lang/cs-CZ.rc * TRANSLATOR: Radek Liska aka Black_Fox (radekliska at gmail dot com) * THANKS TO: Denzil, who translated major part of this file - * UPDATED: 2010-05-25 + * UPDATED: 2011-04-09 */ LANGUAGE LANG_CZECH, SUBLANG_DEFAULT @@ -48,6 +48,20 @@ BEGIN PUSHBUTTON "Storno", IDCANCEL, 168,226,50,14 END +IDD_VOLUME_CTRL DIALOG 0, 0, 90, 150 +STYLE WS_POPUP | WS_BORDER +FONT 8, "MS Shell Dlg" +{ + LTEXT "Celkov hlasitost", IDC_LINE_NAME, 4, 7, 100, 15 + CONTROL "", -1, "static", SS_ETCHEDHORZ | WS_CHILD | WS_VISIBLE, 4, 30, 82, 1 + LTEXT "Vyven", -1, 4, 35, 80, 42 + LTEXT "Hlasitost", -1, 4, 100, 77, 108 + CONTROL "", IDC_LINE_SLIDER_HORZ, "msctls_trackbar32", TBS_HORZ | TBS_AUTOTICKS | TBS_BOTH | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 25, 55, 85, 30 + CONTROL "", IDC_LINE_SLIDER_VERT, "msctls_trackbar32", TBS_VERT | TBS_AUTOTICKS | TBS_BOTH | TBS_DOWNISLEFT | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 32, 115, 30, 70 + CHECKBOX "&Ztlumit", IDC_LINE_SWITCH, 4, 190, 90, 12, BS_AUTOCHECKBOX + CONTROL "", IDC_LINE_SEP, "static", SS_ETCHEDVERT | WS_CHILD | WS_VISIBLE, 130, 7, 1, 200 +} + IDD_VOLUME_CTRL DIALOG 0, 0, 90, 150 STYLE WS_POPUP | WS_BORDER FONT 8, "MS Shell Dlg" From dcd0dff4cc6c103ab0f2a5aafa42db4da118ad92 Mon Sep 17 00:00:00 2001 From: Olaf Siejka Date: Sun, 10 Apr 2011 14:55:11 +0000 Subject: [PATCH 124/317] Fix build. The translation patch was outdated. svn path=/trunk/; revision=51311 --- .../base/applications/sndvol32/lang/cs-CZ.rc | 18 ++---------------- 1 file changed, 2 insertions(+), 16 deletions(-) diff --git a/reactos/base/applications/sndvol32/lang/cs-CZ.rc b/reactos/base/applications/sndvol32/lang/cs-CZ.rc index f5a77469f70..f0d7b66f42f 100644 --- a/reactos/base/applications/sndvol32/lang/cs-CZ.rc +++ b/reactos/base/applications/sndvol32/lang/cs-CZ.rc @@ -51,27 +51,13 @@ END IDD_VOLUME_CTRL DIALOG 0, 0, 90, 150 STYLE WS_POPUP | WS_BORDER FONT 8, "MS Shell Dlg" -{ +BEGIN LTEXT "Celkov hlasitost", IDC_LINE_NAME, 4, 7, 100, 15 - CONTROL "", -1, "static", SS_ETCHEDHORZ | WS_CHILD | WS_VISIBLE, 4, 30, 82, 1 + CONTROL "", -1, "static", SS_ETCHEDHORZ | WS_CHILD | WS_VISIBLE, 4, 30, 82, 1 LTEXT "Vyven", -1, 4, 35, 80, 42 LTEXT "Hlasitost", -1, 4, 100, 77, 108 CONTROL "", IDC_LINE_SLIDER_HORZ, "msctls_trackbar32", TBS_HORZ | TBS_AUTOTICKS | TBS_BOTH | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 25, 55, 85, 30 CONTROL "", IDC_LINE_SLIDER_VERT, "msctls_trackbar32", TBS_VERT | TBS_AUTOTICKS | TBS_BOTH | TBS_DOWNISLEFT | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 32, 115, 30, 70 CHECKBOX "&Ztlumit", IDC_LINE_SWITCH, 4, 190, 90, 12, BS_AUTOCHECKBOX - CONTROL "", IDC_LINE_SEP, "static", SS_ETCHEDVERT | WS_CHILD | WS_VISIBLE, 130, 7, 1, 200 -} - -IDD_VOLUME_CTRL DIALOG 0, 0, 90, 150 -STYLE WS_POPUP | WS_BORDER -FONT 8, "MS Shell Dlg" -BEGIN - LTEXT "Master", IDC_LINE_NAME, 4, 7, 100, 15 - CONTROL "", -1, "static", SS_ETCHEDHORZ | WS_CHILD | WS_VISIBLE, 4, 30, 82, 1 - LTEXT "Balance", -1, 4, 35, 80, 42 - LTEXT "Volume", -1, 4, 100, 77, 108 - CONTROL "", IDC_LINE_SLIDER_HORZ, "msctls_trackbar32", TBS_HORZ | TBS_AUTOTICKS | TBS_BOTH | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 25, 55, 85, 30 - CONTROL "", IDC_LINE_SLIDER_VERT, "msctls_trackbar32", TBS_VERT | TBS_AUTOTICKS | TBS_BOTH | TBS_DOWNISLEFT | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 32, 115, 30, 70 - CHECKBOX "&Mute", IDC_LINE_SWITCH, 4, 190, 90, 12, BS_AUTOCHECKBOX CONTROL "", IDC_LINE_SEP, "static", SS_ETCHEDVERT | WS_CHILD | WS_VISIBLE, 130, 7, 1, 200 END From c08567e81e9772b5913a2c3906004a8ca72c090c Mon Sep 17 00:00:00 2001 From: Giannis Adamopoulos Date: Sun, 10 Apr 2011 15:14:15 +0000 Subject: [PATCH 125/317] [user32_apitest] - Add some more tests for SetCursorPos svn path=/trunk/; revision=51312 --- rostests/apitests/user32/SetCursorPos.c | 156 +++++++++++++++++++++--- 1 file changed, 140 insertions(+), 16 deletions(-) diff --git a/rostests/apitests/user32/SetCursorPos.c b/rostests/apitests/user32/SetCursorPos.c index 8896f986f26..97970305fca 100644 --- a/rostests/apitests/user32/SetCursorPos.c +++ b/rostests/apitests/user32/SetCursorPos.c @@ -10,29 +10,153 @@ #include #include -HHOOK hMouseHook; -int hook_calls = 0; +HHOOK hMouseHookLL, hMouseHook; -LRESULT CALLBACK LowLevelMouseProc(int nCode, WPARAM wParam, LPARAM lParam) +struct _test_info { - hook_calls++; + int ll_hook_called; + int hook_called; + int mouse_move_called; +}; + +struct _test_info info[] = { {0,0,0}, /* SetCursorPos without a window */ + {1,2,0}, /* mouse_event without a window */ + {0,1,1}, /* SetCursorPos with a window */ + {1,1,1}, /* mouse_event with a window */ + {0,1,1}, /* multiple SetCursorPos with a window with coalescing */ + {0,2,2}, /* multiple SetCursorPos with a window without coalescing */ + {2,1,1}, /* multiple mouse_event with a window with coalescing */ + {2,2,2}, /* multiple mouse_event with a window without coalescing */ + }; + +struct _test_info results[8]; +int test_no = 0; + + +LRESULT CALLBACK MouseLLHookProc(int nCode, WPARAM wParam, LPARAM lParam) +{ + results[test_no].ll_hook_called++; + return CallNextHookEx(hMouseHookLL, nCode, wParam, lParam); +} + +LRESULT CALLBACK MouseHookProc(int nCode, WPARAM wParam, LPARAM lParam) +{ + results[test_no].hook_called++; return CallNextHookEx(hMouseHook, nCode, wParam, lParam); } +static LRESULT CALLBACK WndProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam ) +{ + if(msg == WM_MOUSEMOVE) + results[test_no].mouse_move_called++; + + return DefWindowProcA( hWnd, msg, wParam, lParam ); +} + +static HWND CreateTestWindow() +{ + MSG msg; + WNDCLASSA wclass; + HANDLE hInstance = GetModuleHandleA( NULL ); + HWND hWndTest; + + wclass.lpszClassName = "MouseInputTestClass"; + wclass.style = CS_HREDRAW | CS_VREDRAW; + wclass.lpfnWndProc = WndProc; + wclass.hInstance = hInstance; + wclass.hIcon = LoadIconA( 0, IDI_APPLICATION ); + wclass.hCursor = LoadCursorA( NULL, IDC_ARROW ); + wclass.hbrBackground = (HBRUSH)( COLOR_WINDOW + 1 ); + wclass.lpszMenuName = 0; + wclass.cbClsExtra = 0; + wclass.cbWndExtra = 0; + RegisterClassA( &wclass ); + /* create the test window that will receive the keystrokes */ + hWndTest = CreateWindowA( wclass.lpszClassName, "MouseInputTestTest", + WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, 100, 100, + NULL, NULL, hInstance, NULL); + assert( hWndTest ); + ShowWindow( hWndTest, SW_SHOWMAXIMIZED); + SetWindowPos( hWndTest, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE|SWP_NOMOVE ); + SetForegroundWindow( hWndTest ); + UpdateWindow( hWndTest); + SetFocus(hWndTest); + + /* flush pending messages */ + while (PeekMessage( &msg, 0, 0, 0, PM_REMOVE )) DispatchMessageA( &msg ); + + return hWndTest; +} + void Test_SetCursorPos() { - hMouseHook = SetWindowsHookEx(WH_MOUSE_LL, LowLevelMouseProc, GetModuleHandleA( NULL ), 0); - ok(hMouseHook!=NULL,"failed to set hook\n"); - - /* try SetCursorPos */ - SetCursorPos(0,0); - ok (hook_calls == 0, "hooks shouldn't be called\n"); - - /* try mouse_event with MOUSEEVENTF_MOVE*/ - mouse_event(MOUSEEVENTF_MOVE, 100,100, 0,0); - ok (hook_calls == 1, "hooks should have been called\n"); - - UnhookWindowsHookEx (hMouseHook); + HWND hwnd; + MSG msg; + int i; + + memset(results, sizeof(results), 0); + + hMouseHookLL = SetWindowsHookEx(WH_MOUSE_LL, MouseLLHookProc, GetModuleHandleA( NULL ), 0); + hMouseHook = SetWindowsHookEx(WH_MOUSE, MouseHookProc, GetModuleHandleA( NULL ), 0); + ok(hMouseHook!=NULL,"failed to set hook\n"); + ok(hMouseHookLL!=NULL,"failed to set hook\n"); + + test_no = 0; + SetCursorPos(1,1); + while (PeekMessage( &msg, 0, 0, 0, PM_REMOVE )) DispatchMessageA( &msg ); + + test_no = 1; + mouse_event(MOUSEEVENTF_MOVE, 2,2, 0,0); + while (PeekMessage( &msg, 0, 0, 0, PM_REMOVE )) DispatchMessageA( &msg ); + + hwnd = CreateTestWindow(); + SetCapture(hwnd); + + test_no = 2; + SetCursorPos(50,50); + while (PeekMessage( &msg, 0, 0, 0, PM_REMOVE )) DispatchMessageA( &msg ); + + test_no = 3; + mouse_event(MOUSEEVENTF_MOVE, 100,100, 0,0); + while (PeekMessage( &msg, 0, 0, 0, PM_REMOVE )) DispatchMessageA( &msg ); + + test_no = 4; + SetCursorPos(50,50); + SetCursorPos(60,60); + while (PeekMessage( &msg, 0, 0, 0, PM_REMOVE )) DispatchMessageA( &msg ); + + test_no = 5; + SetCursorPos(50,50); + while (PeekMessage( &msg, 0, 0, 0, PM_REMOVE )) DispatchMessageA( &msg ); + SetCursorPos(60,60); + while (PeekMessage( &msg, 0, 0, 0, PM_REMOVE )) DispatchMessageA( &msg ); + + test_no = 6; + mouse_event(MOUSEEVENTF_MOVE, 50,50, 0,0); + mouse_event(MOUSEEVENTF_MOVE, 60,60, 0,0); + while (PeekMessage( &msg, 0, 0, 0, PM_REMOVE )) DispatchMessageA( &msg ); + + test_no = 7; + mouse_event(MOUSEEVENTF_MOVE, 50,50, 0,0); + while (PeekMessage( &msg, 0, 0, 0, PM_REMOVE )) DispatchMessageA( &msg ); + mouse_event(MOUSEEVENTF_MOVE, 60,60, 0,0); + while (PeekMessage( &msg, 0, 0, 0, PM_REMOVE )) DispatchMessageA( &msg ); + + for(i = 0; i< 8; i++) + { +#define TEST(s,x,y) ok(y == x, "%d: %s called %d times instead of %d\n",i,s, y,x); + TEST("WH_MOUSE_LL", info[i].ll_hook_called, results[i].ll_hook_called); + /* WH_MOUSE results vary greatly among windows versions */ + //TEST("WH_MOUSE", info[i].hook_called, results[i].hook_called); + TEST("WM_MOUSEMOVE", info[i].mouse_move_called, results[i].mouse_move_called); + } + + SetCapture(NULL); + DestroyWindow(hwnd); + + UnhookWindowsHookEx (hMouseHook); + UnhookWindowsHookEx (hMouseHookLL); + } START_TEST(SetCursorPos) From 9f1ea5942e233d5050edd23c1ed2d8bc3f867612 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sun, 10 Apr 2011 15:42:55 +0000 Subject: [PATCH 126/317] [NETAPI32] NetUserModalsGet failed if the domain SID returned by LsaQueryInformationPolicy was NULL. Handle the NULL SID case correctly. See issue #6102 for more details. svn path=/trunk/; revision=51313 --- reactos/dll/win32/netapi32/access.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/reactos/dll/win32/netapi32/access.c b/reactos/dll/win32/netapi32/access.c index 71702597792..d2d2b79b136 100644 --- a/reactos/dll/win32/netapi32/access.c +++ b/reactos/dll/win32/netapi32/access.c @@ -793,7 +793,7 @@ NET_API_STATUS WINAPI NetUserModalsGet( PPOLICY_ACCOUNT_DOMAIN_INFO domainInfo; NTSTATUS ntStatus; PSID domainIdentifier = NULL; - int domainNameLen; + int domainNameLen, domainIdLen; ZeroMemory(&objectAttributes, sizeof(objectAttributes)); objectAttributes.Length = sizeof(objectAttributes); @@ -820,11 +820,12 @@ NET_API_STATUS WINAPI NetUserModalsGet( } domainIdentifier = domainInfo->DomainSid; + domainIdLen = (domainIdentifier) ? GetLengthSid(domainIdentifier) : 0; domainNameLen = lstrlenW(domainInfo->DomainName.Buffer) + 1; LsaClose(policyHandle); ntStatus = NetApiBufferAllocate(sizeof(USER_MODALS_INFO_2) + - GetLengthSid(domainIdentifier) + + domainIdLen + domainNameLen * sizeof(WCHAR), (LPVOID *)pbuffer); @@ -836,15 +837,16 @@ NET_API_STATUS WINAPI NetUserModalsGet( } umi = (USER_MODALS_INFO_2 *) *pbuffer; - umi->usrmod2_domain_id = *pbuffer + sizeof(USER_MODALS_INFO_2); + umi->usrmod2_domain_id = (domainIdLen > 0) ? (*pbuffer + sizeof(USER_MODALS_INFO_2)) : NULL; umi->usrmod2_domain_name = (LPWSTR)(*pbuffer + - sizeof(USER_MODALS_INFO_2) + GetLengthSid(domainIdentifier)); + sizeof(USER_MODALS_INFO_2) + domainIdLen); lstrcpynW(umi->usrmod2_domain_name, domainInfo->DomainName.Buffer, domainNameLen); - CopySid(GetLengthSid(domainIdentifier), umi->usrmod2_domain_id, - domainIdentifier); + if (domainIdLen > 0) + CopySid(GetLengthSid(domainIdentifier), umi->usrmod2_domain_id, + domainIdentifier); LsaFreeMemory(domainInfo); From 52ce60c8d8f28112ae919b9faf065bcdf4d41ff1 Mon Sep 17 00:00:00 2001 From: Rafal Harabien Date: Sun, 10 Apr 2011 21:24:49 +0000 Subject: [PATCH 127/317] [ADVAPI32] * Copy RegQueryValueExA from Wine. Fixes 24 winetests fails which appeared after r51222. They are caused by calling RegQueryValueExA with buffer size set to large value. Old implementation was allocating new buffer with specified size (it was failing) and using unicode function. New implementation use given buffer size only when coping data. See issue #6105 for more details. svn path=/trunk/; revision=51314 --- reactos/dll/win32/advapi32/reg/reg.c | 199 +++++++++++++-------------- 1 file changed, 99 insertions(+), 100 deletions(-) diff --git a/reactos/dll/win32/advapi32/reg/reg.c b/reactos/dll/win32/advapi32/reg/reg.c index cfc8ba1ea28..6f79ea466fc 100644 --- a/reactos/dll/win32/advapi32/reg/reg.c +++ b/reactos/dll/win32/advapi32/reg/reg.c @@ -3974,128 +3974,127 @@ RegQueryReflectionKey(IN HKEY hBase, } -/************************************************************************ - * RegQueryValueExA +/****************************************************************************** + * RegQueryValueExA [ADVAPI32.@] * - * @implemented + * Get the type and contents of a specified value under with a key. + * + * PARAMS + * hkey [I] Handle of the key to query + * name [I] Name of value under hkey to query + * reserved [I] Reserved - must be NULL + * type [O] Destination for the value type, or NULL if not required + * data [O] Destination for the values contents, or NULL if not required + * count [I/O] Size of data, updated with the number of bytes returned + * + * RETURNS + * Success: ERROR_SUCCESS. *count is updated with the number of bytes copied to data. + * Failure: ERROR_INVALID_HANDLE, if hkey is invalid. + * ERROR_INVALID_PARAMETER, if any other parameter is invalid. + * ERROR_MORE_DATA, if on input *count is too small to hold the contents. + * + * NOTES + * MSDN states that if data is too small it is partially filled. In reality + * it remains untouched. */ -LONG WINAPI -RegQueryValueExA(HKEY hKey, - LPCSTR lpValueName, - LPDWORD lpReserved, - LPDWORD lpType, - LPBYTE lpData, - LPDWORD lpcbData) +LONG +WINAPI +RegQueryValueExA(HKEY hkeyorg, + LPCSTR name, + LPDWORD reserved, + LPDWORD type, + LPBYTE data, + LPDWORD count) { - UNICODE_STRING ValueName; - LPWSTR lpValueBuffer; - LONG ErrorCode; - DWORD Length; - DWORD Type; - NTSTATUS Status; - ULONG Index; + HANDLE hkey; + NTSTATUS status; + ANSI_STRING nameA; + UNICODE_STRING nameW; + DWORD total_size, datalen = 0; + char buffer[256], *buf_ptr = buffer; + KEY_VALUE_PARTIAL_INFORMATION *info = (KEY_VALUE_PARTIAL_INFORMATION *)buffer; + static const int info_size = offsetof( KEY_VALUE_PARTIAL_INFORMATION, Data ); - TRACE("hKey 0x%X lpValueName %s lpData 0x%X lpcbData %d\n", - hKey, lpValueName, lpData, lpcbData ? *lpcbData : 0); + TRACE("(%p,%s,%p,%p,%p,%p=%d)\n", + hkey, debugstr_a(name), reserved, type, data, count, count ? *count : 0 ); - if (lpData != NULL && lpcbData == NULL) + if ((data && !count) || reserved) return ERROR_INVALID_PARAMETER; + status = MapDefaultKey(&hkey, hkeyorg); + if (!NT_SUCCESS(status)) { - return ERROR_INVALID_PARAMETER; + return RtlNtStatusToDosError(status); } - Length = (lpcbData == NULL || lpData == NULL) ? 0 : *lpcbData * sizeof(WCHAR); + if (count) datalen = *count; + if (!data && count) *count = 0; - if (lpData) + RtlInitAnsiString( &nameA, name ); + if ((status = RtlAnsiStringToUnicodeString( &nameW, &nameA, TRUE ))) { - lpValueBuffer = RtlAllocateHeap(ProcessHeap, - 0, - Length + sizeof(WCHAR)); - if (!lpValueBuffer) + return RtlNtStatusToDosError(status); + ClosePredefKey(hkey); + } + + status = NtQueryValueKey( hkey, &nameW, KeyValuePartialInformation, + buffer, sizeof(buffer), &total_size ); + if (status && status != STATUS_BUFFER_OVERFLOW) goto done; + + /* we need to fetch the contents for a string type even if not requested, + * because we need to compute the length of the ASCII string. */ + if (data || is_string(info->Type)) + { + /* retry with a dynamically allocated buffer */ + while (status == STATUS_BUFFER_OVERFLOW) { - return ERROR_OUTOFMEMORY; - } - } - else - { - lpValueBuffer = NULL; - - if (lpcbData) - *lpcbData = 0; - } - - if(!RtlCreateUnicodeStringFromAsciiz(&ValueName, - (LPSTR)lpValueName)) - { - ERR("RtlCreateUnicodeStringFromAsciiz failed!\n"); - ErrorCode = ERROR_OUTOFMEMORY; - goto cleanup; - } - - ErrorCode = RegQueryValueExW(hKey, - ValueName.Buffer, - lpReserved, - &Type, - (LPBYTE)lpValueBuffer, - &Length); - TRACE("ErrorCode %lu\n", ErrorCode); - - RtlFreeUnicodeString(&ValueName); - - if (ErrorCode == ERROR_SUCCESS || - ErrorCode == ERROR_MORE_DATA) - { - - if (is_string(Type)) - { - if (ErrorCode == ERROR_SUCCESS && lpValueBuffer != NULL) + if (buf_ptr != buffer) HeapFree( GetProcessHeap(), 0, buf_ptr ); + if (!(buf_ptr = HeapAlloc( GetProcessHeap(), 0, total_size ))) { - Status = RtlUnicodeToMultiByteN((PCHAR)lpData, *lpcbData, &Index, (PWCHAR)lpValueBuffer, Length); - if (NT_SUCCESS(Status)) - { - PCHAR szData = (PCHAR)lpData; - if(&szData[Index] < (PCHAR)(lpData + *lpcbData)) - { - szData[Index] = '\0'; - } - } + status = STATUS_NO_MEMORY; + goto done; + } + info = (KEY_VALUE_PARTIAL_INFORMATION *)buf_ptr; + status = NtQueryValueKey( hkey, &nameW, KeyValuePartialInformation, + buf_ptr, total_size, &total_size ); + } + + if (status) goto done; + + if (is_string(info->Type)) + { + DWORD len; + + RtlUnicodeToMultiByteSize( &len, (WCHAR *)(buf_ptr + info_size), + total_size - info_size ); + if (data && len) + { + if (len > datalen) status = STATUS_BUFFER_OVERFLOW; else { - ErrorCode = RtlNtStatusToDosError(Status); + RtlUnicodeToMultiByteN( (char*)data, len, NULL, (WCHAR *)(buf_ptr + info_size), + total_size - info_size ); + /* if the type is REG_SZ and data is not 0-terminated + * and there is enough space in the buffer NT appends a \0 */ + if (len < datalen && data[len-1]) data[len] = 0; } } - - Length = Length / sizeof(WCHAR); + total_size = len + info_size; } - else if (ErrorCode == ERROR_SUCCESS && lpValueBuffer != NULL) + else if (data) { - if (*lpcbData < Length) - { - ErrorCode = ERROR_MORE_DATA; - } - else - { - RtlMoveMemory(lpData, lpValueBuffer, Length); - } - } - - if (lpcbData != NULL) - { - *lpcbData = Length; + if (total_size - info_size > datalen) status = STATUS_BUFFER_OVERFLOW; + else memcpy( data, buf_ptr + info_size, total_size - info_size ); } } + else status = STATUS_SUCCESS; - if (lpType != NULL) - { - *lpType = Type; - } + if (type) *type = info->Type; + if (count) *count = total_size - info_size; -cleanup: - if (lpValueBuffer != NULL) - { - RtlFreeHeap(ProcessHeap, 0, lpValueBuffer); - } - - return ErrorCode; + done: + if (buf_ptr != buffer) HeapFree( GetProcessHeap(), 0, buf_ptr ); + RtlFreeUnicodeString( &nameW ); + ClosePredefKey(hkey); + return RtlNtStatusToDosError(status); } From e059680feab2cf5cee82b5870219575525fb78a5 Mon Sep 17 00:00:00 2001 From: James Tabor Date: Mon, 11 Apr 2011 03:24:14 +0000 Subject: [PATCH 128/317] [Win32k] - PATCH: Arty's fixes based on CMake branch testing. Just the timer code. See bug 6103. svn path=/trunk/; revision=51315 --- .../subsystems/win32/win32k/ntuser/timer.c | 25 +++++++++++-------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/reactos/subsystems/win32/win32k/ntuser/timer.c b/reactos/subsystems/win32/win32k/ntuser/timer.c index 05a7cb649a6..b7c4a32277b 100644 --- a/reactos/subsystems/win32/win32k/ntuser/timer.c +++ b/reactos/subsystems/win32/win32k/ntuser/timer.c @@ -107,10 +107,11 @@ FindTimer(PWND Window, UINT_PTR nID, UINT flags) { - PLIST_ENTRY pLE = TimersListHead.Flink; + PLIST_ENTRY pLE; PTIMER pTmr, RetTmr = NULL; TimerEnterExclusive(); + pLE = TimersListHead.Flink; while (pLE != &TimersListHead) { pTmr = CONTAINING_RECORD(pLE, TIMER, ptmrList); @@ -134,10 +135,11 @@ PTIMER FASTCALL FindSystemTimer(PMSG pMsg) { - PLIST_ENTRY pLE = TimersListHead.Flink; + PLIST_ENTRY pLE; PTIMER pTmr = NULL; TimerEnterExclusive(); + pLE = TimersListHead.Flink; while (pLE != &TimersListHead) { pTmr = CONTAINING_RECORD(pLE, TIMER, ptmrList); @@ -158,11 +160,12 @@ FASTCALL ValidateTimerCallback(PTHREADINFO pti, LPARAM lParam) { - PLIST_ENTRY pLE = TimersListHead.Flink; + PLIST_ENTRY pLE; BOOL Ret = FALSE; PTIMER pTmr; TimerEnterExclusive(); + pLE = TimersListHead.Flink; while (pLE != &TimersListHead) { pTmr = CONTAINING_RECORD(pLE, TIMER, ptmrList); @@ -389,7 +392,7 @@ BOOL FASTCALL PostTimerMessages(PWND Window) { - PLIST_ENTRY pLE = TimersListHead.Flink; + PLIST_ENTRY pLE; PUSER_MESSAGE_QUEUE ThreadQueue; MSG Msg; PTHREADINFO pti; @@ -400,7 +403,7 @@ PostTimerMessages(PWND Window) ThreadQueue = pti->MessageQueue; TimerEnterExclusive(); - + pLE = TimersListHead.Flink; while(pLE != &TimersListHead) { pTmr = CONTAINING_RECORD(pLE, TIMER, ptmrList); @@ -441,12 +444,12 @@ ProcessTimers(VOID) { LARGE_INTEGER TickCount, DueTime; LONG Time; - PLIST_ENTRY pLE = TimersListHead.Flink; + PLIST_ENTRY pLE; PTIMER pTmr; LONG TimerCount = 0; TimerEnterExclusive(); - + pLE = TimersListHead.Flink; KeQueryTickCount(&TickCount); Time = MsqCalculateMessageTime(&TickCount); @@ -515,7 +518,7 @@ ProcessTimers(VOID) BOOL FASTCALL DestroyTimersForWindow(PTHREADINFO pti, PWND Window) { - PLIST_ENTRY pLE = TimersListHead.Flink; + PLIST_ENTRY pLE; PTIMER pTmr; BOOL TimersRemoved = FALSE; @@ -523,7 +526,7 @@ DestroyTimersForWindow(PTHREADINFO pti, PWND Window) return FALSE; TimerEnterExclusive(); - + pLE = TimersListHead.Flink; while(pLE != &TimersListHead) { pTmr = CONTAINING_RECORD(pLE, TIMER, ptmrList); @@ -570,14 +573,14 @@ IntKillTimer(PWND Window, UINT_PTR IDEvent, BOOL SystemTimer) DPRINT("IntKillTimer Window %x id %p systemtimer %s\n", Window, IDEvent, SystemTimer ? "TRUE" : "FALSE"); + TimerEnterExclusive(); pTmr = FindTimer(Window, IDEvent, SystemTimer ? TMRF_SYSTEM : 0); if (pTmr) { - TimerEnterExclusive(); RemoveTimer(pTmr); - TimerLeave(); } + TimerLeave(); return pTmr ? TRUE : FALSE; } From e52e2fbef685423e15e4ac093fb1645a171794ee Mon Sep 17 00:00:00 2001 From: Gabriel Ilardi Date: Mon, 11 Apr 2011 10:56:45 +0000 Subject: [PATCH 129/317] [WIN32CSR] Italian translation of command prompt's window title svn path=/trunk/; revision=51316 --- reactos/subsystems/win32/csrss/win32csr/lang/it-IT.rc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/subsystems/win32/csrss/win32csr/lang/it-IT.rc b/reactos/subsystems/win32/csrss/win32csr/lang/it-IT.rc index dbc75bf515a..a6402c1b5e4 100644 --- a/reactos/subsystems/win32/csrss/win32csr/lang/it-IT.rc +++ b/reactos/subsystems/win32/csrss/win32csr/lang/it-IT.rc @@ -63,5 +63,5 @@ BEGIN IDS_SCROLLUP "Scorri s" IDS_SCROLLDOWN "Scorri gi" - IDS_COMMAND_PROMPT "Command Prompt" + IDS_COMMAND_PROMPT "Prompt dei commandi" END From 728183867040452cf2e496881f5f9c876c5855af Mon Sep 17 00:00:00 2001 From: Gabriel Ilardi Date: Mon, 11 Apr 2011 12:26:16 +0000 Subject: [PATCH 130/317] [SNDVOL32] Italian and Spanish translation updates. svn path=/trunk/; revision=51317 --- reactos/base/applications/sndvol32/lang/es-ES.rc | 4 ++-- reactos/base/applications/sndvol32/lang/it-IT.rc | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/reactos/base/applications/sndvol32/lang/es-ES.rc b/reactos/base/applications/sndvol32/lang/es-ES.rc index 87679de56a2..94e33ff4eb6 100644 --- a/reactos/base/applications/sndvol32/lang/es-ES.rc +++ b/reactos/base/applications/sndvol32/lang/es-ES.rc @@ -53,9 +53,9 @@ BEGIN LTEXT "Master", IDC_LINE_NAME, 4, 7, 100, 15 CONTROL "", -1, "static", SS_ETCHEDHORZ | WS_CHILD | WS_VISIBLE, 4, 30, 82, 1 LTEXT "Balance", -1, 4, 35, 80, 42 - LTEXT "Volume", -1, 4, 100, 77, 108 + LTEXT "Volumen", -1, 4, 100, 77, 108 CONTROL "", IDC_LINE_SLIDER_HORZ, "msctls_trackbar32", TBS_HORZ | TBS_AUTOTICKS | TBS_BOTH | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 25, 55, 85, 30 CONTROL "", IDC_LINE_SLIDER_VERT, "msctls_trackbar32", TBS_VERT | TBS_AUTOTICKS | TBS_BOTH | TBS_DOWNISLEFT | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 32, 115, 30, 70 - CHECKBOX "&Mute", IDC_LINE_SWITCH, 4, 190, 90, 12, BS_AUTOCHECKBOX + CHECKBOX "&Silencio", IDC_LINE_SWITCH, 4, 190, 90, 12, BS_AUTOCHECKBOX CONTROL "", IDC_LINE_SEP, "static", SS_ETCHEDVERT | WS_CHILD | WS_VISIBLE, 130, 7, 1, 200 END diff --git a/reactos/base/applications/sndvol32/lang/it-IT.rc b/reactos/base/applications/sndvol32/lang/it-IT.rc index ad7733250e6..6766c7300bd 100644 --- a/reactos/base/applications/sndvol32/lang/it-IT.rc +++ b/reactos/base/applications/sndvol32/lang/it-IT.rc @@ -48,10 +48,10 @@ FONT 8, "MS Shell Dlg" BEGIN LTEXT "Master", IDC_LINE_NAME, 4, 7, 100, 15 CONTROL "", -1, "static", SS_ETCHEDHORZ | WS_CHILD | WS_VISIBLE, 4, 30, 82, 1 - LTEXT "Balance", -1, 4, 35, 80, 42 + LTEXT "Bilanciamento", -1, 4, 35, 80, 42 LTEXT "Volume", -1, 4, 100, 77, 108 CONTROL "", IDC_LINE_SLIDER_HORZ, "msctls_trackbar32", TBS_HORZ | TBS_AUTOTICKS | TBS_BOTH | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 25, 55, 85, 30 CONTROL "", IDC_LINE_SLIDER_VERT, "msctls_trackbar32", TBS_VERT | TBS_AUTOTICKS | TBS_BOTH | TBS_DOWNISLEFT | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 32, 115, 30, 70 - CHECKBOX "&Mute", IDC_LINE_SWITCH, 4, 190, 90, 12, BS_AUTOCHECKBOX + CHECKBOX "&Disattiva", IDC_LINE_SWITCH, 4, 190, 90, 12, BS_AUTOCHECKBOX CONTROL "", IDC_LINE_SEP, "static", SS_ETCHEDVERT | WS_CHILD | WS_VISIBLE, 130, 7, 1, 200 END From bdf1dd886498668a1dd405e644c8469fccb9d55f Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Mon, 11 Apr 2011 17:03:20 +0000 Subject: [PATCH 131/317] [WIN32CSR] - Swedish translation by Jan Blomqvist-Kinander. svn path=/trunk/; revision=51318 --- .../win32/csrss/win32csr/lang/sv-SE.rc | 63 +++++++++++++++++++ .../subsystems/win32/csrss/win32csr/rsrc.rc | 1 + 2 files changed, 64 insertions(+) create mode 100644 reactos/subsystems/win32/csrss/win32csr/lang/sv-SE.rc diff --git a/reactos/subsystems/win32/csrss/win32csr/lang/sv-SE.rc b/reactos/subsystems/win32/csrss/win32csr/lang/sv-SE.rc new file mode 100644 index 00000000000..0c1379b9be2 --- /dev/null +++ b/reactos/subsystems/win32/csrss/win32csr/lang/sv-SE.rc @@ -0,0 +1,63 @@ +/* + * PROJECT: ReactOS CSRSS subsystem + * FILE: subsystems/win32/csrss/win32csr/lang/sv-SE.rc + * PURPOSE: Swedish resource file + * Translation: Jaix Bly + */ + +LANGUAGE LANG_SWEDISH, SUBLANG_NEUTRAL + +IDD_END_NOW DIALOGEX DISCARDABLE 0, 0, 200, 95 +STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "End Program - " +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Avsluta Program... Var vnlig vnta",IDC_STATIC,7,7,186,11 + CONTROL "Progress",IDC_PROGRESS,"msctls_progress32",WS_BORDER, + 7,20,186,13 + LTEXT "Om du vljer att avsluta programmet omedelbart kommer du att frlora all osparad data. Fr att avsluta programmet, klicka Avsluta nu.", + IDC_STATIC,7,40,186,26 + DEFPUSHBUTTON "&Avsluta Nu",IDC_END_NOW,150,71,43,17 +END + +IDD_NOT_RESPONDING DIALOGEX DISCARDABLE 0, 0, 192, 122 +STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Avsluta Program - " +FONT 8, "MS Shell Dlg" +BEGIN + DEFPUSHBUTTON "Avbryt",IDCANCEL,142,98,43,17 + PUSHBUTTON "&Avsluta Nu",IDC_END_NOW,78,98,43,17 + LTEXT "Detta programmet svarar inte",IDC_STATIC,7,7,178,8 + LTEXT "Fr att terg till ReactOS och underska programmets status klicka Avbryt", + IDC_STATIC,7,26,178,16 + LTEXT "m du vljer att avsluta programmet omedelbart kommer du att frlora all osparad data. Fr att avsluta programmet, klicka Avsluta nu.", + IDC_STATIC,7,53,178,26 +END + +IDD_SWITCH_APP DIALOGEX 90, 90, 265, 170 +STYLE DS_SYSMODAL | DS_SETFONT | DS_SETFOREGROUND | DS_3DLOOK | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE +EXSTYLE WS_EX_TOPMOST | WS_EX_WINDOWEDGE +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + LTEXT "",IDC_STATIC_CUR_APP,39,139,204,16,SS_SUNKEN,WS_EX_STATICEDGE +END + +STRINGTABLE +BEGIN + IDS_EDIT "Redigera" + IDS_MARK "Markera" + IDS_COPY "Kopiera\tEnter" + IDS_PASTE "Klistra in" + IDS_SELECTALL "Markera Allt" + IDS_SCROLL "Skrolla" + IDS_FIND "Sk..." + IDS_DEFAULTS "Ursprunglig" + IDS_PROPERTIES "Egenskaper" + IDS_SCROLLHERE "Skrolla hit" + IDS_SCROLLTOP "Skrolla till topp" + IDS_SCROLLBOTTOM "Skrolla till botten" + IDS_SCROLLPAGE_UP "Sida upp" + IDS_SCROLLPAGE_DOWN "Sida ner" + IDS_SCROLLUP "Skrolla upp" + IDS_SCROLLDOWN "Skrolla ner" +END diff --git a/reactos/subsystems/win32/csrss/win32csr/rsrc.rc b/reactos/subsystems/win32/csrss/win32csr/rsrc.rc index 5a26ab8f442..bf2ce4067a4 100644 --- a/reactos/subsystems/win32/csrss/win32csr/rsrc.rc +++ b/reactos/subsystems/win32/csrss/win32csr/rsrc.rc @@ -18,6 +18,7 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL #include "lang/pl-PL.rc" #include "lang/ru-RU.rc" #include "lang/sk-SK.rc" +#include "lang/sv-SE.rc" #include "lang/uk-UA.rc" #include "lang/zh-CN.rc" #include "lang/zh-TW.rc" From 0669ecfaf393aa16d3706754ea0a9f469c1f9d71 Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Mon, 11 Apr 2011 17:36:44 +0000 Subject: [PATCH 132/317] [RAPPS] - Swedish translation by Jan Blomqvist-Kinander. svn path=/trunk/; revision=51319 --- reactos/base/applications/rapps/lang/sv-SE.rc | 199 ++++++++++++++++++ reactos/base/applications/rapps/rsrc.rc | 1 + 2 files changed, 200 insertions(+) create mode 100644 reactos/base/applications/rapps/lang/sv-SE.rc diff --git a/reactos/base/applications/rapps/lang/sv-SE.rc b/reactos/base/applications/rapps/lang/sv-SE.rc new file mode 100644 index 00000000000..929fb9ab63f --- /dev/null +++ b/reactos/base/applications/rapps/lang/sv-SE.rc @@ -0,0 +1,199 @@ +/* + * PROJECT: ReactOS RAPPS + * FILE: \base\applications\rapps\lang\sv-SE.rc + * PURPOSE: Swedish resource file + * Translation: Jaix Bly + */ +LANGUAGE LANG_SWEDISH, SUBLANG_NEUTRAL + +IDR_MAINMENU MENU +BEGIN + POPUP "&Arkiv" + BEGIN + MENUITEM "&Instllningar", ID_SETTINGS + MENUITEM SEPARATOR + MENUITEM "A&vsluta", ID_EXIT + END + POPUP "&Program" + BEGIN + MENUITEM "&Installera", ID_INSTALL + MENUITEM "&Avinstallera",ID_UNINSTALL + MENUITEM "&ndra", ID_MODIFY + MENUITEM SEPARATOR + MENUITEM "&Ta bort frn Registret", ID_REGREMOVE + MENUITEM SEPARATOR + MENUITEM "&Uppdatere", ID_REFRESH + END + POPUP "Hjlp" + BEGIN + MENUITEM "Hjlp", ID_HELP, GRAYED + MENUITEM "Om...", ID_ABOUT + END +END + +IDR_LINKMENU MENU +BEGIN + POPUP "popup" + BEGIN + MENUITEM "&ppne lnk i weblsare", ID_OPEN_LINK + MENUITEM "&Kopier lnk till urklipp", ID_COPY_LINK + END +END + +IDR_APPLICATIONMENU MENU +BEGIN + POPUP "popup" + BEGIN + MENUITEM "&Installera", ID_INSTALL + MENUITEM "&Avinstallera", ID_UNINSTALL + MENUITEM "&ndre", ID_MODIFY + MENUITEM SEPARATOR + MENUITEM "&Ta bort frn Registret", ID_REGREMOVE + MENUITEM SEPARATOR + MENUITEM "&Uppdatera", ID_REFRESH + END +END + +IDD_SETTINGS_DIALOG DIALOGEX DISCARDABLE 0, 0, 250, 144 +STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "Instllningar" +FONT 8, "MS Shell Dlg" +BEGIN + GROUPBOX "Allmnna", -1, 4, 2, 240, 61 + AUTOCHECKBOX "&Spara fnster position", IDC_SAVE_WINDOW_POS, 15, 12, 219, 12 + AUTOCHECKBOX "&Uppdatera listan med tillgngliga program vid start", IDC_UPDATE_AVLIST, 15, 29, 219, 12 + AUTOCHECKBOX "&Logga ur installation och borttagning program", IDC_LOG_ENABLED, 15, 46, 219, 12 + + GROUPBOX "Nerladding", -1, 4, 65, 240, 51 + LTEXT "Mapp fr nerladdningar:", -1, 16, 75, 100, 9 + EDITTEXT IDC_DOWNLOAD_DIR_EDIT, 15, 86, 166, 12, WS_CHILD | WS_VISIBLE | WS_GROUP + PUSHBUTTON "&Vlj", IDC_CHOOSE, 187, 85, 50, 14 + AUTOCHECKBOX "&Ta bort programms installerare efter installation", IDC_DEL_AFTER_INSTALL, 16, 100, 218, 12 + + PUSHBUTTON "Frinstlld", IDC_DEFAULT_SETTINGS, 8, 124, 60, 14 + PUSHBUTTON "OK", IDOK, 116, 124, 60, 14 + PUSHBUTTON "Avbryt", IDCANCEL, 181, 124, 60, 14 +END + +IDD_INSTALL_DIALOG DIALOGEX DISCARDABLE 0, 0, 216, 97 +STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "Programinstallation" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "...", IDC_INSTALL_TEXT, 4, 5, 209, 35 + + AUTORADIOBUTTON "&Installera frn disk (CD or DVD)", IDC_CD_INSTALL, 10, 46, 197, 11, WS_GROUP + AUTORADIOBUTTON "&Ladda ner och installera", IDC_DOWNLOAD_INSTALL, 10, 59, 197, 11, NOT WS_TABSTOP + + PUSHBUTTON "OK", IDOK, 86, 78, 60, 14 + PUSHBUTTON "Avbryt", IDCANCEL, 150, 78, 60, 14 +END + +IDD_DOWNLOAD_DIALOG DIALOGEX LOADONCALL MOVEABLE DISCARDABLE 0, 0, 220, 76 +STYLE DS_SHELLFONT | DS_CENTER | WS_BORDER | WS_CAPTION | WS_POPUP | WS_SYSMENU | WS_VISIBLE +CAPTION "Ladda ner..." +FONT 8, "MS Shell Dlg" +BEGIN + CONTROL "Progress1", IDC_DOWNLOAD_PROGRESS, "msctls_progress32", WS_BORDER | PBS_SMOOTH, 10, 10, 200, 12 + LTEXT "", IDC_DOWNLOAD_STATUS, 10, 30, 200, 10, SS_CENTER + PUSHBUTTON "Avbryt", IDCANCEL, 85, 58, 50, 15, WS_GROUP | WS_TABSTOP +END + +IDD_ABOUT_DIALOG DIALOGEX 22, 16, 190, 66 +STYLE DS_SHELLFONT | WS_BORDER | WS_DLGFRAME | WS_SYSMENU | DS_MODALFRAME +CAPTION "Om" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "ReactOS Programhanterare\nCopyright (C) 2009\nav Dmitry Chapyshev (dmitry@reactos.org)", IDC_STATIC, 48, 7, 130, 39 + PUSHBUTTON "Stng", IDOK, 133, 46, 50, 14 + ICON IDI_MAIN, IDC_STATIC, 10, 10, 7, 30 +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_TOOLTIP_INSTALL "Installera" + IDS_TOOLTIP_UNINSTALL "Avinstallera" + IDS_TOOLTIP_MODIFY "Redigera" + IDS_TOOLTIP_SETTINGS "Instllingar" + IDS_TOOLTIP_REFRESH "Uppdatera" + IDS_TOOLTIP_EXIT "Avsluta" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_APP_NAME "Namn" + IDS_APP_INST_VERSION "Version" + IDS_APP_DESCRIPTION "Beskrivning" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_INFO_VERSION "\nVersion: " + IDS_INFO_DESCRIPTION "\nBeskrivning: " + IDS_INFO_PUBLISHER "\nUtgivare: " + IDS_INFO_HELPLINK "\nHjlplnk: " + IDS_INFO_HELPPHONE "\nHjlptelefon: " + IDS_INFO_README "\nLs mig: " + IDS_INFO_REGOWNER "\nRegistrerad gare: " + IDS_INFO_PRODUCTID "\nProdukt ID: " + IDS_INFO_CONTACT "\nKontakt: " + IDS_INFO_UPDATEINFO "\nUppdaterinsinformation: " + IDS_INFO_INFOABOUT "\nInformation om: " + IDS_INFO_COMMENTS "\nKommentarer: " + IDS_INFO_INSTLOCATION "\nInstallationsplacering: " + IDS_INFO_INSTALLSRC "\nInstallationsklla: " + IDS_INFO_UNINSTALLSTR "\nAvinstallationsstrng: " + IDS_INFO_MODIFYPATH "\nndra skvg: " + IDS_INFO_INSTALLDATE "\nInstallationsdatum: " +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_AINFO_VERSION "\nVersion: " + IDS_AINFO_DESCRIPTION "\nBeskrivning: " + IDS_AINFO_SIZE "\nStorlek: " + IDS_AINFO_URLSITE "\nHemsida: " + IDS_AINFO_LICENCE "\nLicens: " +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_CAT_AUDIO "Audio" + IDS_CAT_DEVEL "Utveckling" + IDS_CAT_DRIVERS "Drivrutiner" + IDS_CAT_EDU "Edutainment" + IDS_CAT_ENGINEER "Engineering" + IDS_CAT_FINANCE "Finans" + IDS_CAT_GAMES "Spel & kul" + IDS_CAT_GRAPHICS "Grafik" + IDS_CAT_INTERNET "Internet & Ntverk" + IDS_CAT_LIBS "Bibliotek" + IDS_CAT_OFFICE "Kontor" + IDS_CAT_OTHER "Annat" + IDS_CAT_SCIENCE "Vetenskap" + IDS_CAT_TOOLS "Verktyg" + IDS_CAT_VIDEO "Video" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_APPTITLE "ReactOS programhanterare" + IDS_SEARCH_TEXT "Sk..." + IDS_INSTALL "Installera" + IDS_UNINSTALL "Avinstallera" + IDS_MODIFY "ndra" + IDS_APPS_COUNT "Programantal: %d" + IDS_WELCOME_TITLE "Vlkommen till ReactOS programhanterare!\n\n" + IDS_WELCOME_TEXT "Vlj en kategori till vnstre, och sedan ett program fr att installera eller avinstallera.\nReactOS Web sida: " + IDS_WELCOME_URL "http://www.reactos.org" + IDS_INSTALLED "Installerat" + IDS_AVAILABLEFORINST "Tillgngliga for installation" + IDS_UPDATES "Uppdateringar" + IDS_APPLICATIONS "Program" + IDS_CHOOSE_FOLDER_TEXT "Vlj en mapp som kommer att anvndas fr nerladdning av program:" + IDS_CHOOSE_FOLDER_ERROR "Du har specificrat en obefintlig mapp!" + IDS_USER_NOT_ADMIN "Du mste vara administratr fr att starta ""ReactOS programhanterare""!" + IDS_APP_REG_REMOVE "r du sker p att du vill ta bort data det installerade programmets data frn registret?" + IDS_INFORMATION "Information" + IDS_UNABLE_TO_REMOVE "Det gick ej att ta bort programmets data frn registret!" +END diff --git a/reactos/base/applications/rapps/rsrc.rc b/reactos/base/applications/rapps/rsrc.rc index 470e2588ee3..bd235c70f2f 100644 --- a/reactos/base/applications/rapps/rsrc.rc +++ b/reactos/base/applications/rapps/rsrc.rc @@ -10,4 +10,5 @@ #include "lang/pl-PL.rc" #include "lang/ru-RU.rc" #include "lang/sk-SK.rc" +#include "lang/sv-SE.rc" #include "lang/uk-UA.rc" From 0dda24faeadf7dd622cd7fa65374f2beec2cd098 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Mon, 11 Apr 2011 17:52:06 +0000 Subject: [PATCH 133/317] [NPFS] PATCH: Arty's fixes based on CMake branch testing. Just the NPFS code. See issue #6103 for more details. svn path=/trunk/; revision=51320 --- reactos/drivers/filesystems/npfs/create.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/drivers/filesystems/npfs/create.c b/reactos/drivers/filesystems/npfs/create.c index fe6834a04ca..5a53f556300 100644 --- a/reactos/drivers/filesystems/npfs/create.c +++ b/reactos/drivers/filesystems/npfs/create.c @@ -937,10 +937,10 @@ NpfsClose(PDEVICE_OBJECT DeviceObject, if (IsListEmpty(&Fcb->ServerCcbListHead) && IsListEmpty(&Fcb->ClientCcbListHead)) { - RtlFreeUnicodeString(&Fcb->PipeName); KeLockMutex(&Vcb->PipeListLock); RemoveEntryList(&Fcb->PipeListEntry); KeUnlockMutex(&Vcb->PipeListLock); + RtlFreeUnicodeString(&Fcb->PipeName); ExFreePool(Fcb); FileObject->FsContext = NULL; } From 7db2a95a8041a54c1f7cf0faea6ed371fff4eb98 Mon Sep 17 00:00:00 2001 From: Rafal Harabien Date: Tue, 12 Apr 2011 18:38:38 +0000 Subject: [PATCH 134/317] [COMCTL32] * Sync listview to Wine 1.3.17 * Set background and text color before calling DrawFocusRect. Those colors are used by monochrome brush during painting. Tested this function in Windows and our implementation is correct. Wine has DrawFocusRect not correctly implemented and that's why they don't see this bug. Should be sent to wine (tm). svn path=/trunk/; revision=51321 --- reactos/dll/win32/comctl32/comctl32_ros.diff | 38 ++++++++++++++++++++ reactos/dll/win32/comctl32/listview.c | 27 +++++++++++--- 2 files changed, 60 insertions(+), 5 deletions(-) diff --git a/reactos/dll/win32/comctl32/comctl32_ros.diff b/reactos/dll/win32/comctl32/comctl32_ros.diff index 8b0db1fae71..079c5972367 100644 --- a/reactos/dll/win32/comctl32/comctl32_ros.diff +++ b/reactos/dll/win32/comctl32/comctl32_ros.diff @@ -139,3 +139,41 @@ Index: treeview.c if (infoPtr->cdmode & CDRF_NOTIFYPOSTPAINT) infoPtr->cdmode = +Index: listview.c +=================================================================== +--- listview.c (revision 51320) ++++ listview.c (working copy) +@@ -1634,8 +1635,19 @@ + /* used to handle collapse main item column case */ + static inline BOOL LISTVIEW_DrawFocusRect(const LISTVIEW_INFO *infoPtr, HDC hdc) + { +- return (infoPtr->rcFocus.left < infoPtr->rcFocus.right) ? +- DrawFocusRect(hdc, &infoPtr->rcFocus) : FALSE; ++ BOOL Ret = FALSE; ++ ++ if (infoPtr->rcFocus.left < infoPtr->rcFocus.right) ++ { ++ DWORD dwOldBkColor, dwOldTextColor; ++ ++ dwOldBkColor = SetBkColor(hdc, RGB(255, 255, 255)); ++ dwOldTextColor = SetBkColor(hdc, RGB(0, 0, 0)); ++ Ret = DrawFocusRect(hdc, &infoPtr->rcFocus); ++ SetBkColor(hdc, dwOldBkColor); ++ SetBkColor(hdc, dwOldTextColor); ++ } ++ return Ret; + } + + /* Listview invalidation functions: use _only_ these functions to invalidate */ +@@ -5041,7 +5053,11 @@ + + /* Draw marquee rectangle if appropriate */ + if (infoPtr->bMarqueeSelect) ++ { ++ SetBkColor(hdc, RGB(255, 255, 255)); ++ SetTextColor(hdc, RGB(0, 0, 0)); + DrawFocusRect(hdc, &infoPtr->marqueeDrawRect); ++ } + + if (cdmode & CDRF_NOTIFYPOSTPAINT) + notify_postpaint(infoPtr, &nmlvcd); diff --git a/reactos/dll/win32/comctl32/listview.c b/reactos/dll/win32/comctl32/listview.c index dc96200ee35..d545044ad86 100644 --- a/reactos/dll/win32/comctl32/listview.c +++ b/reactos/dll/win32/comctl32/listview.c @@ -360,7 +360,7 @@ typedef struct tagLISTVIEW_INFO #define SB_INTERNAL -1 /* maximum size of a label */ -#define DISP_TEXT_SIZE 512 +#define DISP_TEXT_SIZE 260 /* padding for items in list and small icon display modes */ #define WIDTH_PADDING 12 @@ -543,7 +543,7 @@ static BOOL textsetptrT(LPWSTR *dest, LPCWSTR src, BOOL isW) static inline int textcmpWT(LPCWSTR aw, LPCWSTR bt, BOOL isW) { if (!aw) return bt ? -1 : 0; - if (!bt) return aw ? 1 : 0; + if (!bt) return 1; if (aw == LPSTR_TEXTCALLBACKW) return bt == LPSTR_TEXTCALLBACKW ? 1 : -1; if (bt != LPSTR_TEXTCALLBACKW) @@ -865,6 +865,7 @@ static inline void notify_itemactivate(const LISTVIEW_INFO *infoPtr, const LVHIT item.mask = LVIF_PARAM|LVIF_STATE; item.iItem = htInfo->iItem; item.iSubItem = 0; + item.stateMask = (UINT)-1; if (LISTVIEW_GetItemT(infoPtr, &item, TRUE)) { nmia.lParam = item.lParam; nmia.uOldState = item.state; @@ -1634,8 +1635,19 @@ static inline BOOL LISTVIEW_GetItemW(const LISTVIEW_INFO *infoPtr, LPLVITEMW lpL /* used to handle collapse main item column case */ static inline BOOL LISTVIEW_DrawFocusRect(const LISTVIEW_INFO *infoPtr, HDC hdc) { - return (infoPtr->rcFocus.left < infoPtr->rcFocus.right) ? - DrawFocusRect(hdc, &infoPtr->rcFocus) : FALSE; + BOOL Ret = FALSE; + + if (infoPtr->rcFocus.left < infoPtr->rcFocus.right) + { + DWORD dwOldBkColor, dwOldTextColor; + + dwOldBkColor = SetBkColor(hdc, RGB(255, 255, 255)); + dwOldTextColor = SetBkColor(hdc, RGB(0, 0, 0)); + Ret = DrawFocusRect(hdc, &infoPtr->rcFocus); + SetBkColor(hdc, dwOldBkColor); + SetBkColor(hdc, dwOldTextColor); + } + return Ret; } /* Listview invalidation functions: use _only_ these functions to invalidate */ @@ -5041,7 +5053,11 @@ enddraw: /* Draw marquee rectangle if appropriate */ if (infoPtr->bMarqueeSelect) + { + SetBkColor(hdc, RGB(255, 255, 255)); + SetTextColor(hdc, RGB(0, 0, 0)); DrawFocusRect(hdc, &infoPtr->marqueeDrawRect); + } if (cdmode & CDRF_NOTIFYPOSTPAINT) notify_postpaint(infoPtr, &nmlvcd); @@ -5878,6 +5894,7 @@ static HWND CreateEditLabelT(LISTVIEW_INFO *infoPtr, LPCWSTR text, BOOL isW) SetWindowLongPtrA(hedit, GWLP_WNDPROC, (DWORD_PTR)EditLblWndProcA) ); SendMessageW(hedit, WM_SETFONT, (WPARAM)infoPtr->hFont, FALSE); + SendMessageW(hedit, EM_SETLIMITTEXT, DISP_TEXT_SIZE-1, 0); return hedit; } @@ -6743,7 +6760,7 @@ static BOOL LISTVIEW_GetItemExtT(const LISTVIEW_INFO *infoPtr, LPLVITEMW lpLVIte pszText = lpLVItem->pszText; bResult = LISTVIEW_GetItemT(infoPtr, lpLVItem, isW); - if (bResult && lpLVItem->pszText != pszText) + if (bResult && (lpLVItem->mask & LVIF_TEXT) && lpLVItem->pszText != pszText) { if (lpLVItem->pszText != LPSTR_TEXTCALLBACKW) textcpynT(pszText, isW, lpLVItem->pszText, isW, lpLVItem->cchTextMax); From e58c66359af893a59ed38403eb00af1e7edd74d2 Mon Sep 17 00:00:00 2001 From: Rafal Harabien Date: Tue, 12 Apr 2011 18:45:06 +0000 Subject: [PATCH 135/317] [SHELL32] * Return 1 in WM_ERASEBKGND when desktop is painted * Fix background for desktop icons and their labels * Moreover fixes explorer_new background svn path=/trunk/; revision=51322 --- reactos/dll/win32/shell32/desktop.c | 3 +-- reactos/dll/win32/shell32/shlview.c | 9 ++++++--- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/reactos/dll/win32/shell32/desktop.c b/reactos/dll/win32/shell32/desktop.c index 131e3cc263e..cd21bcbae2a 100644 --- a/reactos/dll/win32/shell32/desktop.c +++ b/reactos/dll/win32/shell32/desktop.c @@ -586,8 +586,7 @@ ProgmanWindowProc(IN HWND hwnd, switch (uMsg) { case WM_ERASEBKGND: - PaintDesktop((HDC)wParam); - break; + return (LRESULT)PaintDesktop((HDC)wParam); case WM_GETISHELLBROWSER: Ret = (LRESULT)IShellBrowser_from_impl(This); diff --git a/reactos/dll/win32/shell32/shlview.c b/reactos/dll/win32/shell32/shlview.c index 335524548ab..924d76e8cfa 100644 --- a/reactos/dll/win32/shell32/shlview.c +++ b/reactos/dll/win32/shell32/shlview.c @@ -324,8 +324,11 @@ static BOOL ShellView_CreateList (IShellViewImpl * This) * HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced\ListviewShadow * and activate drop shadows if necessary */ - if (0) + if (1) + { SendMessageW(This->hWndList, LVM_SETTEXTBKCOLOR, 0, CLR_NONE); + SendMessageW(This->hWndList, LVM_SETBKCOLOR, 0, CLR_NONE); + } else { SendMessageW(This->hWndList, LVM_SETTEXTBKCOLOR, 0, GetSysColor(COLOR_DESKTOP)); @@ -1833,7 +1836,7 @@ static LRESULT CALLBACK ShellView_WndProc(HWND hWnd, UINT uMessage, WPARAM wPara case WM_SHOWWINDOW: UpdateWindow(pThis->hWndList); break; - case WM_GETDLGCODE: return SendMessageA(pThis->hWndList,uMessage,0,0); + case WM_GETDLGCODE: return SendMessageW(pThis->hWndList,uMessage,0,0); case WM_DESTROY: RevokeDragDrop(pThis->hWnd); @@ -1843,7 +1846,7 @@ static LRESULT CALLBACK ShellView_WndProc(HWND hWnd, UINT uMessage, WPARAM wPara case WM_ERASEBKGND: if ((pThis->FolderSettings.fFlags & FWF_DESKTOP) || (pThis->FolderSettings.fFlags & FWF_TRANSPARENT)) - return 1; + return SendMessageW(pThis->hWndParent, WM_ERASEBKGND, wParam, lParam); /* redirect to parent */ break; case CWM_GETISHELLBROWSER: return (LRESULT)pThis->pShellBrowser; From 9c9874002e3036384976786184f0fd9a09a10a36 Mon Sep 17 00:00:00 2001 From: Giannis Adamopoulos Date: Tue, 12 Apr 2011 20:59:50 +0000 Subject: [PATCH 136/317] [shell32] - Properly arrange icons in explorer shell view window. This also fixes navigating in files with keyboard arrows svn path=/trunk/; revision=51323 --- reactos/dll/win32/shell32/shlview.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/reactos/dll/win32/shell32/shlview.c b/reactos/dll/win32/shell32/shlview.c index 924d76e8cfa..ff05864eb80 100644 --- a/reactos/dll/win32/shell32/shlview.c +++ b/reactos/dll/win32/shell32/shlview.c @@ -282,9 +282,14 @@ static BOOL ShellView_CreateList (IShellViewImpl * This) TRACE("%p\n",This); dwStyle = WS_TABSTOP | WS_VISIBLE | WS_CHILDWINDOW | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | - LVS_SHAREIMAGELISTS | LVS_EDITLABELS | LVS_ALIGNLEFT | LVS_AUTOARRANGE; + LVS_SHAREIMAGELISTS | LVS_EDITLABELS | LVS_AUTOARRANGE; dwExStyle = WS_EX_CLIENTEDGE; + if (This->FolderSettings.fFlags & FWF_DESKTOP) + dwStyle |= LVS_ALIGNLEFT; + else + dwStyle |= LVS_ALIGNTOP; + switch (This->FolderSettings.ViewMode) { case FVM_ICON: dwStyle |= LVS_ICON; break; From b6256418e9e291d5c1d1e52c36ebb0517c32d0c5 Mon Sep 17 00:00:00 2001 From: Michael Martin Date: Wed, 13 Apr 2011 04:33:14 +0000 Subject: [PATCH 137/317] [USB\USBEHCI] - Fix linking of QueueHeads. Implement LinkQueueHeadToCompletedList and CleanupAsyncList. These functions are used to software link the completed queueheads to a completed list. Only after the driver handshakes with the controller can this memory be freed. Fix a few incorrect values for QueueHead. - EhciDefferedRoutine: Implement handling of completed QueueHeads by removing them from the AnsycList and setting any errors for failure. - Reserved a QueueHead that will always be in the AsyncList Address Register. By setting it as the Head of Reclamation the controller can know when it has reached the end of the QueueHead list. - Remove all code from FdoDispatchInternalDeviceControl. This should never be called by upper level drivers. Change 1 of 3. svn path=/trunk/; revision=51325 --- reactos/drivers/usb/usbehci/fdo.c | 628 +++++++++---------------- reactos/drivers/usb/usbehci/hardware.h | 30 +- reactos/drivers/usb/usbehci/hwiface.c | 103 +++- reactos/drivers/usb/usbehci/hwiface.h | 9 +- 4 files changed, 341 insertions(+), 429 deletions(-) diff --git a/reactos/drivers/usb/usbehci/fdo.c b/reactos/drivers/usb/usbehci/fdo.c index 645f4cb6e24..805d43ebd2a 100644 --- a/reactos/drivers/usb/usbehci/fdo.c +++ b/reactos/drivers/usb/usbehci/fdo.c @@ -21,10 +21,11 @@ EhciDefferedRoutine(PKDPC Dpc, PVOID DeferredContext, PVOID SystemArgument1, PVO ULONG tmp; ULONG OpRegisters; PEHCI_HOST_CONTROLLER hcd; - LONG i; + int i; FdoDeviceExtension = (PFDO_DEVICE_EXTENSION) DeferredContext; + /* Nothing is valid if the Pdo is NULL */ if (!FdoDeviceExtension->Pdo) { DPRINT1("PDO not set yet!\n"); @@ -36,127 +37,183 @@ EhciDefferedRoutine(PKDPC Dpc, PVOID DeferredContext, PVOID SystemArgument1, PVO OpRegisters = (ULONG)FdoDeviceExtension->hcd.OpRegisters; hcd = &FdoDeviceExtension->hcd; - + CStatus = (ULONG) SystemArgument2; - - /* TD retired or Error */ - if (CStatus & (EHCI_STS_INT | EHCI_ERROR_INT)) + /* If Reclamation (The QueueHead list has been transveresed twice), + look through the queuehead list and find queue heads that have been + 1. Halted due to error + 2. Transfer completion. + Move these QueueHeads to a temporary list that is used to pend memory release. + Either an Event is signalled or an Irp is completed depending on what was set during transfer request + setup. Next software issue a "DoorBell" that informs the controller the Asynchronous List is about to + be modified. + After the controller acks this with interrupt, the memory for queueheads are released. */ + + if (CStatus & (EHCI_STS_RECL| EHCI_STS_INT | EHCI_ERROR_INT)) { - DPRINT("Asyn Complete!\n"); - ULONG CurrentAddr, OffSet; - PQUEUE_HEAD CompletedQH, NextQH; - PQUEUE_TRANSFER_DESCRIPTOR CompletedTD, NextTD; - - /* AsyncListAddr Register will have the next QueueHead to execute */ - CurrentAddr = GetAsyncListQueueRegister(hcd); + PQUEUE_HEAD CurrentQH; + PQUEUE_TRANSFER_DESCRIPTOR CurrentTD; + BOOLEAN QueueHeadCompleted; - /* Calculate the VA for the next QueueHead */ - OffSet = CurrentAddr - (ULONG)FdoDeviceExtension->hcd.CommonBufferPA.LowPart; - NextQH = (PQUEUE_HEAD)((ULONG)FdoDeviceExtension->hcd.CommonBufferVA + OffSet); + /* Go through the list and delink completed (not active) QueueHeads */ + CurrentQH = hcd->AsyncListQueue; + CurrentQH = CurrentQH->NextQueueHead; - /* Get the previous QueueHead which is the QueueHead just completed */ - CompletedQH = NextQH->PreviousQueueHead; - ASSERT(CompletedQH); - DPRINT("CompletedQH %x\n", CompletedQH); - - //DumpQueueHead(CompletedQH); - - /* Free memory for the Descriptors */ - CompletedTD = CompletedQH->TransferDescriptor; - NextTD = CompletedTD; - while (NextTD) + while ((CurrentQH) && (CurrentQH != hcd->AsyncListQueue)) { - CompletedTD = NextTD; - NextTD = NextTD->NextDescriptor; - FreeDescriptor(CompletedTD); - } - - /* If the Event is set then release waiter */ - if (CompletedQH->Event) - { - KeSetEvent(CompletedQH->Event, IO_NO_INCREMENT, FALSE); - } + DPRINT1("Checking QueueHead %x, Next %x\n", CurrentQH, CurrentQH->NextQueueHead); + DPRINT1("Active %d, Halted %d\n", CurrentQH->Token.Bits.Active, CurrentQH->Token.Bits.Halted); - /* Free the Mdl if there was one */ - if(CompletedQH->MdlToFree) - IoFreeMdl(CompletedQH->MdlToFree); - - /* Is there an IRP that needs to be completed */ - if (CompletedQH->IrpToComplete) - { - PIRP Irp; - PIO_STACK_LOCATION Stack; - PURB Urb; - - Irp = CompletedQH->IrpToComplete; - Stack = IoGetCurrentIrpStackLocation(Irp); - ASSERT(Stack); - Urb = (PURB) Stack->Parameters.Others.Argument1; - - /* Check for error */ - if (CStatus & EHCI_ERROR_INT) + /* if the QueueHead has completed */ + if (!CurrentQH->Token.Bits.Active) { - /* Haled bit should be set */ - if (CompletedQH->Token.Bits.Halted) + /* Assume success */ + USBD_STATUS UrbStatus = USBD_STATUS_SUCCESS; + + QueueHeadCompleted = TRUE; + + /* Check the Status of the QueueHead */ + if (CurrentQH->Token.Bits.Halted) { - if (CompletedQH->Token.Bits.DataBufferError) + if (CurrentQH->Token.Bits.DataBufferError) { DPRINT1("Data buffer error\n"); - Urb->UrbHeader.Status = USBD_STATUS_DATA_BUFFER_ERROR; - Irp->IoStatus.Status = STATUS_UNSUCCESSFUL; - Irp->IoStatus.Information = 0; + UrbStatus = USBD_STATUS_DATA_BUFFER_ERROR; } - else if (CompletedQH->Token.Bits.BabbleDetected) + else if (CurrentQH->Token.Bits.BabbleDetected) { DPRINT1("Babble Detected\n"); - Urb->UrbHeader.Status = USBD_STATUS_BABBLE_DETECTED; - Irp->IoStatus.Status = STATUS_UNSUCCESSFUL; - Irp->IoStatus.Information = 0; + UrbStatus = USBD_STATUS_BABBLE_DETECTED; } else { DPRINT1("Stall PID\n"); - Urb->UrbHeader.Status = USBD_STATUS_STALL_PID; - Irp->IoStatus.Status = STATUS_UNSUCCESSFUL; - Irp->IoStatus.Information = 0; + UrbStatus = USBD_STATUS_STALL_PID; } } - } - else - { - Irp->IoStatus.Status = STATUS_SUCCESS; - Irp->IoStatus.Information = 0; - DPRINT1("Completing Irp\n"); + + /* Check the Descriptors */ + CurrentTD = CurrentQH->FirstTransferDescriptor; + while (CurrentTD) + { + /* FIXME: What needs to happen if the QueueHead was marked as complete but descriptors was not */ + if ((CurrentTD->Token.Bits.Active) || (CurrentTD->Token.Bits.Halted)) + { + /* The descriptor was not completed */ + QueueHeadCompleted = FALSE; + DPRINT1("QueueHead was marked as completed but contains descriptors that were not completed\n"); + ASSERT(FALSE); + break; + } + CurrentTD = CurrentTD->NextDescriptor; + } + if ((QueueHeadCompleted) || (CurrentQH->Token.Bits.Halted)) + { + PQUEUE_HEAD FreeQH; + + FreeQH = CurrentQH; + CurrentQH = CurrentQH->NextQueueHead; + DPRINT1("QueueHead %x has completed. Removing\n", FreeQH); + /* Move it into the completed list */ + UnlinkQueueHead(hcd, FreeQH); + LinkQueueHeadToCompletedList(hcd, FreeQH); + DPRINT1("Remove done\n"); + + /* If the Event is set then the caller is waiting on completion */ + if (FreeQH->Event) + { + KeSetEvent(FreeQH->Event, IO_NO_INCREMENT, FALSE); + } + + /* If there is an IrpToComplete then the caller did not wait on completion + and the IRP was marked as PENDING. Complete it now. */ + if (FreeQH->IrpToComplete) + { + PIRP Irp; + PIO_STACK_LOCATION Stack; + PURB Urb; + + Irp = FreeQH->IrpToComplete; + Stack = IoGetCurrentIrpStackLocation(Irp); + ASSERT(Stack); + Urb = (PURB) Stack->Parameters.Others.Argument1; + ASSERT(Urb); + + /* Check for error */ + if (CStatus & EHCI_ERROR_INT) + { + Irp->IoStatus.Status = STATUS_UNSUCCESSFUL; + Irp->IoStatus.Information = 0; + /* Set BufferLength to 0 as there was error */ + if (Urb->UrbHeader.Function == URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE) + { + Urb->UrbControlDescriptorRequest.TransferBufferLength = 0; + } + DPRINT1("There was an Error, TransferBufferLength set to 0\n"); + } + else + { + if (Urb->UrbHeader.Function == URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE) + { + if (Urb->UrbControlDescriptorRequest.TransferBufferLength >= + ((PUSB_COMMON_DESCRIPTOR)(Urb->UrbControlDescriptorRequest.TransferBuffer))->bLength) + { + Urb->UrbControlDescriptorRequest.TransferBufferLength = + ((PUSB_COMMON_DESCRIPTOR)(Urb->UrbControlDescriptorRequest.TransferBuffer))->bLength; + } + } + + Irp->IoStatus.Status = STATUS_SUCCESS; + Irp->IoStatus.Information = 0; + DPRINT1("Completing Irp\n"); + } + Urb->UrbHeader.Status = UrbStatus; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + } + + /* FIXME: Move to static function */ + PEHCI_USBCMD_CONTENT UsbCmd; + /* Ring the DoorBell so that host controller knows a QueueHead was removed */ + DPRINT1("Ringing Doorbell\n"); + tmp = READ_REGISTER_ULONG((PULONG) (OpRegisters + EHCI_USBCMD)); + UsbCmd = (PEHCI_USBCMD_CONTENT) &tmp; + UsbCmd->DoorBell = TRUE; + WRITE_REGISTER_ULONG((PULONG) (OpRegisters + EHCI_USBCMD), tmp); + continue; + } } - IoCompleteRequest(Irp, IO_NO_INCREMENT); + + CurrentQH = CurrentQH->NextQueueHead; } - - /* Unlink QueueHead */ - UnlinkQueueHead(hcd, CompletedQH); - /* Wait for a complete AsnycList tranversal before deleting? */ - DeleteQueueHead(CompletedQH); } - /* Port Change */ + + /* Port Change. */ + /* FIXME: Use EnumControllerPorts instead */ if (CStatus & EHCI_STS_PCD) { /* Loop through the ports */ - for (i = 0; i < FdoDeviceExtension->hcd.ECHICaps.HCSParams.PortCount; i++) + for (i = 0; i < hcd->ECHICaps.HCSParams.PortCount; i++) { tmp = READ_REGISTER_ULONG((PULONG) ((OpRegisters + EHCI_PORTSC) + (4 * i))); /* Check for port change on this port */ if (tmp & 0x02) { + /* Clear status change */ + tmp = READ_REGISTER_ULONG((PULONG)((OpRegisters + EHCI_PORTSC) + (4 * i))); + tmp |= 0x02; + WRITE_REGISTER_ULONG((PULONG) ((OpRegisters + EHCI_PORTSC) + (4 * i)), tmp); + /* Connect or Disconnect? */ if (tmp & 0x01) { DPRINT1("Device connected on port %d\n", i); /* Check if a companion host controller exists */ - if (FdoDeviceExtension->hcd.ECHICaps.HCSParams.CHCCount) + if (hcd->ECHICaps.HCSParams.CHCCount) { tmp = READ_REGISTER_ULONG((PULONG)((OpRegisters + EHCI_PORTSC) + (4 * i))); @@ -178,6 +235,7 @@ EhciDefferedRoutine(PKDPC Dpc, PVOID DeferredContext, PVOID SystemArgument1, PVO KeStallExecutionProcessor(30); + /* FIXME: Hub driver does this also, is it needed here? */ /* As per USB 2.0 Specs, 9.1.2. Reset the port and clear the status change */ //tmp |= 0x100 | 0x02; /* Sanity, Disable port */ @@ -190,21 +248,16 @@ EhciDefferedRoutine(PKDPC Dpc, PVOID DeferredContext, PVOID SystemArgument1, PVO tmp = READ_REGISTER_ULONG((PULONG)((OpRegisters + EHCI_PORTSC) + (4 * i))); PdoDeviceExtension->ChildDeviceCount++; - PdoDeviceExtension->Ports[i].PortStatus &= ~0x8000; - PdoDeviceExtension->Ports[i].PortStatus |= USB_PORT_STATUS_HIGH_SPEED; - PdoDeviceExtension->Ports[i].PortStatus |= USB_PORT_STATUS_CONNECT; - PdoDeviceExtension->Ports[i].PortChange |= USB_PORT_STATUS_CONNECT; + hcd->Ports[i].PortStatus &= ~0x8000; + hcd->Ports[i].PortStatus |= USB_PORT_STATUS_HIGH_SPEED; + hcd->Ports[i].PortStatus |= USB_PORT_STATUS_CONNECT; + hcd->Ports[i].PortChange |= USB_PORT_STATUS_CONNECT; DPRINT1("Completing URB\n"); CompletePendingURBRequest(PdoDeviceExtension); } else { DPRINT1("Device disconnected on port %d\n", i); - - /* Clear status change */ - tmp = READ_REGISTER_ULONG((PULONG)((OpRegisters + EHCI_PORTSC) + (4 * i))); - tmp |= 0x02; - WRITE_REGISTER_ULONG((PULONG) ((OpRegisters + EHCI_PORTSC) + (4 * i)), tmp); } } } @@ -214,6 +267,7 @@ EhciDefferedRoutine(PKDPC Dpc, PVOID DeferredContext, PVOID SystemArgument1, PVO if (CStatus & EHCI_STS_IAA) { DPRINT1("Async Advance!\n"); + CleanupAsyncList(hcd); } } @@ -232,7 +286,7 @@ InterruptService(PKINTERRUPT Interrupt, PVOID ServiceContext) /* Read device status */ CStatus = ReadControllerStatus(hcd); - CStatus &= (EHCI_ERROR_INT | EHCI_STS_INT | EHCI_STS_IAA | EHCI_STS_PCD | EHCI_STS_FLR); + CStatus &= (EHCI_ERROR_INT | EHCI_STS_INT | EHCI_STS_IAA | EHCI_STS_PCD | EHCI_STS_FLR | EHCI_STS_RECL); if ((!CStatus) || (FdoDeviceExtension->DeviceState == 0)) { @@ -243,9 +297,22 @@ InterruptService(PKINTERRUPT Interrupt, PVOID ServiceContext) /* Clear status */ ClearControllerStatus(hcd, CStatus); + if (CStatus & EHCI_STS_RECL) + { + DPRINT("Reclamation\n"); + } + if (CStatus & EHCI_ERROR_INT) { DPRINT1("EHCI Status=0x%x\n", CStatus); + /* This check added in case the NT USB Driver is still loading. + It will cause this error condition at every device connect. */ + if(CStatus & EHCI_STS_PCD) + { + DPRINT1("EHCI Error: Another driver may be interfering with proper operation of this driver\n"); + DPRINT1(" Hint: Ensure that the old NT Usb Driver has been removed!\n"); + ASSERT(FALSE); + } } if (CStatus & EHCI_STS_FATAL) @@ -270,6 +337,7 @@ StartDevice(PDEVICE_OBJECT DeviceObject, PCM_PARTIAL_RESOURCE_LIST raw, PCM_PART PFDO_DEVICE_EXTENSION FdoDeviceExtension; PCM_PARTIAL_RESOURCE_DESCRIPTOR resource; DEVICE_DESCRIPTION DeviceDescription; + PEHCI_HOST_CONTROLLER hcd; ULONG NumberResources; ULONG iCount; ULONG DeviceAddress; @@ -278,26 +346,21 @@ StartDevice(PDEVICE_OBJECT DeviceObject, PCM_PARTIAL_RESOURCE_LIST raw, PCM_PART NTSTATUS Status; FdoDeviceExtension = (PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension; + hcd = &FdoDeviceExtension->hcd; + /* Sanity Checks */ Status = IoGetDeviceProperty(FdoDeviceExtension->LowerDevice, DevicePropertyAddress, sizeof(ULONG), &DeviceAddress, &PropertySize); - if (NT_SUCCESS(Status)) - { - DPRINT1("--->DeviceAddress: %x\n", DeviceAddress); - } Status = IoGetDeviceProperty(FdoDeviceExtension->LowerDevice, DevicePropertyBusNumber, sizeof(ULONG), &BusNumber, &PropertySize); - if (NT_SUCCESS(Status)) - { - DPRINT1("--->BusNumber: %x\n", BusNumber); - } + /* Get the resources the PNP Manager gave */ NumberResources = translated->Count; @@ -364,11 +427,21 @@ StartDevice(PDEVICE_OBJECT DeviceObject, PCM_PARTIAL_RESOURCE_LIST raw, PCM_PART } } + for (iCount = 0; iCount < hcd->ECHICaps.HCSParams.PortCount; iCount++) + { + hcd->Ports[iCount].PortStatus = 0x8000; + hcd->Ports[iCount].PortChange = 0; + + if (hcd->ECHICaps.HCSParams.PortPowerControl) + hcd->Ports[iCount].PortStatus |= USB_PORT_STATUS_POWER; + } + KeInitializeDpc(&FdoDeviceExtension->DpcObject, EhciDefferedRoutine, FdoDeviceExtension); RtlZeroMemory(&DeviceDescription, sizeof(DEVICE_DESCRIPTION)); + DeviceDescription.Version = DEVICE_DESCRIPTION_VERSION; DeviceDescription.Master = TRUE; DeviceDescription.ScatterGather = TRUE; @@ -377,20 +450,24 @@ StartDevice(PDEVICE_OBJECT DeviceObject, PCM_PARTIAL_RESOURCE_LIST raw, PCM_PART DeviceDescription.InterfaceType = PCIBus; DeviceDescription.MaximumLength = EHCI_MAX_SIZE_TRANSFER; - FdoDeviceExtension->pDmaAdapter = IoGetDmaAdapter(FdoDeviceExtension->LowerDevice, - &DeviceDescription, - &FdoDeviceExtension->MapRegisters); + hcd->pDmaAdapter = IoGetDmaAdapter(FdoDeviceExtension->LowerDevice, + &DeviceDescription, + &hcd->MapRegisters); - if (FdoDeviceExtension->pDmaAdapter == NULL) + if (hcd->pDmaAdapter == NULL) { DPRINT1("Ehci: IoGetDmaAdapter failed!\n"); ASSERT(FALSE); } + DPRINT1("MapRegisters %x\n", hcd->MapRegisters); + /* Allocate Common Buffer for Periodic Frame List */ FdoDeviceExtension->PeriodicFrameList.VirtualAddr = - FdoDeviceExtension->pDmaAdapter->DmaOperations->AllocateCommonBuffer(FdoDeviceExtension->pDmaAdapter, - sizeof(ULONG) * 1024, &FdoDeviceExtension->PeriodicFrameList.PhysicalAddr, FALSE); + hcd->pDmaAdapter->DmaOperations->AllocateCommonBuffer(hcd->pDmaAdapter, + sizeof(ULONG) * 1024, + &FdoDeviceExtension->PeriodicFrameList.PhysicalAddr, + FALSE); if (FdoDeviceExtension->PeriodicFrameList.VirtualAddr == NULL) { @@ -403,36 +480,53 @@ StartDevice(PDEVICE_OBJECT DeviceObject, PCM_PARTIAL_RESOURCE_LIST raw, PCM_PART ExInitializeFastMutex(&FdoDeviceExtension->FrameListMutex); - /* Allocate pages for queueheads and descriptors */ - FdoDeviceExtension->hcd.CommonBufferVA = - FdoDeviceExtension->pDmaAdapter->DmaOperations->AllocateCommonBuffer(FdoDeviceExtension->pDmaAdapter, - PAGE_SIZE * 16, - &FdoDeviceExtension->hcd.CommonBufferPA, - FALSE); + /* Allocate initial page for queueheads and descriptors */ + FdoDeviceExtension->hcd.CommonBufferVA[0] = + hcd->pDmaAdapter->DmaOperations->AllocateCommonBuffer(hcd->pDmaAdapter, + PAGE_SIZE, + &FdoDeviceExtension->hcd.CommonBufferPA[0], + FALSE); - if (FdoDeviceExtension->hcd.CommonBufferVA == 0) + if (FdoDeviceExtension->hcd.CommonBufferVA[0] == 0) { DPRINT1("Ehci: Failed to allocate common buffer!\n"); return STATUS_UNSUCCESSFUL; } - FdoDeviceExtension->hcd.CommonBufferSize = PAGE_SIZE * 16; + hcd->CommonBufferSize = PAGE_SIZE * 16; /* Zeroize it */ - RtlZeroMemory(FdoDeviceExtension->hcd.CommonBufferVA, - PAGE_SIZE * 16); + RtlZeroMemory(FdoDeviceExtension->hcd.CommonBufferVA[0], + PAGE_SIZE); /* Init SpinLock for host controller device lock */ - KeInitializeSpinLock(&FdoDeviceExtension->hcd.Lock); + KeInitializeSpinLock(&hcd->Lock); - /* Reserved a Queue Head that will always be in the AsyncList Address Register */ - FdoDeviceExtension->hcd.AsyncListQueue = CreateQueueHead(&FdoDeviceExtension->hcd); - FdoDeviceExtension->hcd.AsyncListQueue->HorizontalLinkPointer = FdoDeviceExtension->hcd.AsyncListQueue->PhysicalAddr | QH_TYPE_QH; - FdoDeviceExtension->hcd.AsyncListQueue->EndPointCharacteristics.QEDTDataToggleControl = FALSE; - FdoDeviceExtension->hcd.AsyncListQueue->Token.Bits.InterruptOnComplete = FALSE; + /* Reserved a Queue Head that will always be in the AsyncList Address Register. By setting it as the Head of Reclamation + the controller can know when it has reached the end of the QueueHead list */ + hcd->AsyncListQueue = CreateQueueHead(hcd); + hcd->AsyncListQueue->HorizontalLinkPointer = hcd->AsyncListQueue->PhysicalAddr | QH_TYPE_QH; + hcd->AsyncListQueue->EndPointCharacteristics.QEDTDataToggleControl = FALSE; + hcd->AsyncListQueue->Token.Bits.InterruptOnComplete = FALSE; + hcd->AsyncListQueue->EndPointCharacteristics.HeadOfReclamation = TRUE; + hcd->AsyncListQueue->Token.Bits.Halted = TRUE; + hcd->AsyncListQueue->NextQueueHead = hcd->AsyncListQueue; + hcd->AsyncListQueue->PreviousQueueHead = hcd->AsyncListQueue; + + /* Reserve a Queue Head thats only purpose is for linking completed Queue Heads. + Completed QueueHeads are moved to this temporary. As the memory must still be valid + up until the controllers doorbell is rang to let it know info has been removed from QueueHead list */ + hcd->CompletedListQueue = CreateQueueHead(hcd); + hcd->CompletedListQueue->NextQueueHead = hcd->CompletedListQueue; + hcd->CompletedListQueue->PreviousQueueHead = hcd->CompletedListQueue; + /* Ensure the controller is stopped */ - StopEhci(&FdoDeviceExtension->hcd); + StopEhci(hcd); + + SetAsyncListQueueRegister(hcd, hcd->AsyncListQueue->PhysicalAddr); + + /* FIXME: Implement Periodic Frame List */ Status = IoConnectInterrupt(&FdoDeviceExtension->EhciInterrupt, InterruptService, @@ -446,10 +540,8 @@ StartDevice(PDEVICE_OBJECT DeviceObject, PCM_PARTIAL_RESOURCE_LIST raw, PCM_PART FdoDeviceExtension->Affinity, FALSE); - StartEhci(&FdoDeviceExtension->hcd); - DPRINT1("AsycnAddr %x\n", GetAsyncListQueueRegister(&FdoDeviceExtension->hcd)); + StartEhci(hcd); FdoDeviceExtension->DeviceState = DEVICESTARTED; - return STATUS_SUCCESS; } @@ -472,6 +564,10 @@ FdoQueryBusRelations( DPRINT1("Ehci: QueryBusRelations\n"); + /* FIXME: Currently only support for one ehci controller */ + if (DeviceExtension->Pdo) + goto Done; + /* Create the PDO with the next available number */ while (TRUE) { @@ -513,9 +609,10 @@ FdoQueryBusRelations( PdoDeviceExtension->ControllerFdo = DeviceObject; PdoDeviceExtension->DeviceObject = Pdo; - PdoDeviceExtension->NumberOfPorts = DeviceExtension->hcd.ECHICaps.HCSParams.PortCount; + //PdoDeviceExtension->NumberOfPorts = DeviceExtension->hcd.ECHICaps.HCSParams.PortCount; InitializeListHead(&PdoDeviceExtension->IrpQueue); + KeInitializeSpinLock(&PdoDeviceExtension->IrpQueueLock); KeInitializeEvent(&PdoDeviceExtension->QueueDrainedEvent, SynchronizationEvent, TRUE); @@ -525,7 +622,7 @@ FdoQueryBusRelations( Pdo->Flags &= ~DO_DEVICE_INITIALIZING; DeviceExtension->Pdo = Pdo; - +Done: DeviceRelations = (PDEVICE_RELATIONS)ExAllocatePool(PagedPool, sizeof(DEVICE_RELATIONS)); if (!DeviceRelations) @@ -534,8 +631,8 @@ FdoQueryBusRelations( } DeviceRelations->Count = 1; - DeviceRelations->Objects[0] = Pdo; - ObReferenceObject(Pdo); + DeviceRelations->Objects[0] = DeviceExtension->Pdo; + ObReferenceObject(DeviceExtension->Pdo); *pDeviceRelations = DeviceRelations; return STATUS_SUCCESS; @@ -705,6 +802,7 @@ AddDevice(PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT Pdo) ASSERT(FdoDeviceExtension->LowerDevice == Pdo); + /* Get the EHCI Device ID and Vendor ID */ Status = GetBusInterface(FdoDeviceExtension->LowerDevice, &FdoDeviceExtension->BusInterface); if (!NT_SUCCESS(Status)) @@ -772,270 +870,8 @@ AddDevice(PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT Pdo) NTSTATUS NTAPI FdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp) { - PFDO_DEVICE_EXTENSION FdoDeviceExtension; - PPDO_DEVICE_EXTENSION PdoDeviceExtension; - PIO_STACK_LOCATION Stack = NULL; - NTSTATUS Status = STATUS_UNSUCCESSFUL; - ULONG_PTR Information = 0; - PUSB_DEVICE UsbDevice = NULL; - URB *Urb; - - /*FIXME: This should never be called by upper drivers as they should only be dealing with the pdo */ - - FdoDeviceExtension = (PFDO_DEVICE_EXTENSION) DeviceObject->DeviceExtension; - PdoDeviceExtension = (PPDO_DEVICE_EXTENSION) FdoDeviceExtension->Pdo->DeviceExtension; - - ASSERT(FdoDeviceExtension->Common.IsFdo == TRUE); - - Stack = IoGetCurrentIrpStackLocation(Irp); - - ASSERT(Stack->Parameters.DeviceIoControl.IoControlCode == IOCTL_INTERNAL_USB_SUBMIT_URB); - - Urb = (PURB) Stack->Parameters.Others.Argument1; - DPRINT("Header Length %d\n", Urb->UrbHeader.Length); - DPRINT("Header Function %d\n", Urb->UrbHeader.Function); - - UsbDevice = DeviceHandleToUsbDevice(PdoDeviceExtension, Urb->UrbHeader.UsbdDeviceHandle); - - if (!UsbDevice) - { - DPRINT1("Ehci: Invalid DeviceHandle or device not connected\n"); - return STATUS_DEVICE_NOT_CONNECTED; - } - switch (Urb->UrbHeader.Function) - { - case URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER: - { - DPRINT1("Ehci: URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER:\n"); - break; - } - case URB_FUNCTION_GET_STATUS_FROM_DEVICE: - { - DPRINT1("Ehci: URB_FUNCTION_GET_STATUS_FROM_DEVICE\n"); - break; - } - case URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE: - { - DPRINT1("Ehci: URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE\n"); - switch(Urb->UrbControlDescriptorRequest.DescriptorType) - { - case USB_DEVICE_DESCRIPTOR_TYPE: - { - DPRINT1("USB DEVICE DESC\n"); - break; - } - case USB_CONFIGURATION_DESCRIPTOR_TYPE: - DPRINT1("USB CONFIG DESC\n"); - //break; - case USB_STRING_DESCRIPTOR_TYPE: - { - DPRINT1("Usb String Descriptor\n"); - break; - } - default: - { - DPRINT1("Ehci: Descriptor Type %x not supported!\n", Urb->UrbControlDescriptorRequest.DescriptorType); - } - } - break; - } - case URB_FUNCTION_SELECT_CONFIGURATION: - { - DPRINT1("Ehci: URB_FUNCTION_SELECT_CONFIGURATION\n"); - DPRINT1("Urb->UrbSelectConfiguration.ConfigurationHandle %x\n",Urb->UrbSelectConfiguration.ConfigurationHandle); - break; - } - case URB_FUNCTION_CLASS_DEVICE: - { - DPRINT1("Ehci: URB_FUNCTION_CLASS_DEVICE %x\n",Urb->UrbControlVendorClassRequest.Request); - switch (Urb->UrbControlVendorClassRequest.Request) - { - case USB_REQUEST_GET_DESCRIPTOR: - { - DPRINT1("TransferFlags %x\n", Urb->UrbControlVendorClassRequest.TransferFlags); - DPRINT1("Urb->UrbControlVendorClassRequest.Value %x\n", Urb->UrbControlVendorClassRequest.Value); - - switch (Urb->UrbControlVendorClassRequest.Value >> 8) - { - case USB_DEVICE_CLASS_AUDIO: - { - DPRINT1("USB_DEVICE_CLASS_AUDIO\n"); - break; - } - case USB_DEVICE_CLASS_COMMUNICATIONS: - { - DPRINT1("USB_DEVICE_CLASS_COMMUNICATIONS\n"); - break; - } - case USB_DEVICE_CLASS_HUMAN_INTERFACE: - { - DPRINT1("USB_DEVICE_CLASS_HUMAN_INTERFACE\n"); - break; - } - case USB_DEVICE_CLASS_MONITOR: - { - DPRINT1("USB_DEVICE_CLASS_MONITOR\n"); - break; - } - case USB_DEVICE_CLASS_PHYSICAL_INTERFACE: - { - DPRINT1("USB_DEVICE_CLASS_PHYSICAL_INTERFACE\n"); - break; - } - case USB_DEVICE_CLASS_POWER: - { - DPRINT1("USB_DEVICE_CLASS_POWER\n"); - break; - } - case USB_DEVICE_CLASS_PRINTER: - { - DPRINT1("USB_DEVICE_CLASS_PRINTER\n"); - break; - } - case USB_DEVICE_CLASS_STORAGE: - { - DPRINT1("USB_DEVICE_CLASS_STORAGE\n"); - break; - } - case USB_DEVICE_CLASS_RESERVED: - DPRINT1("Reserved!!!\n"); - case USB_DEVICE_CLASS_HUB: - { - DPRINT1("USB_DEVICE_CLASS_HUB request\n"); - break; - } - default: - { - DPRINT1("Unknown UrbControlVendorClassRequest Value\n"); - } - } - break; - } - case USB_REQUEST_GET_STATUS: - { - DPRINT1("DEVICE: USB_REQUEST_GET_STATUS for port %d\n", Urb->UrbControlVendorClassRequest.Index); - break; - } - default: - { - DPRINT1("Unhandled URB request for class device\n"); - //Urb->UrbHeader.Status = USBD_STATUS_INVALID_URB_FUNCTION; - } - } - break; - } - case URB_FUNCTION_CLASS_OTHER: - { - DPRINT1("Ehci: URB_FUNCTION_CLASS_OTHER\n"); - switch (Urb->UrbControlVendorClassRequest.Request) - { - case USB_REQUEST_GET_STATUS: - { - DPRINT1("OTHER: USB_REQUEST_GET_STATUS for port %d\n", Urb->UrbControlVendorClassRequest.Index); - break; - } - case USB_REQUEST_CLEAR_FEATURE: - { - DPRINT1("USB_REQUEST_CLEAR_FEATURE Port %d, value %x\n", Urb->UrbControlVendorClassRequest.Index, - Urb->UrbControlVendorClassRequest.Value); - switch (Urb->UrbControlVendorClassRequest.Value) - { - case C_PORT_CONNECTION: - DPRINT1("Clearing Connect\n"); - break; - case C_PORT_RESET: - DPRINT1("Clearing Reset\n"); - break; - default: - DPRINT1("Unknown Value for Clear Feature %x \n", Urb->UrbControlVendorClassRequest.Value); - break; - } - break; - } - case USB_REQUEST_SET_FEATURE: - { - DPRINT1("USB_REQUEST_SET_FEATURE Port %d, value %x\n", Urb->UrbControlVendorClassRequest.Index, - Urb->UrbControlVendorClassRequest.Value); - - switch(Urb->UrbControlVendorClassRequest.Value) - { - case PORT_RESET: - { - DPRINT1("Port reset\n"); - break; - } - case PORT_ENABLE: - { - DPRINT1("Unhandled Set Feature\n"); - break; - } - default: - { - DPRINT1("Unknown Set Feature!\n"); - break; - } - } - break; - } - case USB_REQUEST_SET_ADDRESS: - { - DPRINT1("USB_REQUEST_SET_ADDRESS\n"); - break; - } - case USB_REQUEST_GET_DESCRIPTOR: - { - DPRINT1("USB_REQUEST_GET_DESCRIPTOR\n"); - break; - } - case USB_REQUEST_SET_DESCRIPTOR: - { - DPRINT1("USB_REQUEST_SET_DESCRIPTOR\n"); - break; - } - case USB_REQUEST_GET_CONFIGURATION: - { - DPRINT1("USB_REQUEST_GET_CONFIGURATION\n"); - break; - } - case USB_REQUEST_SET_CONFIGURATION: - { - DPRINT1("USB_REQUEST_SET_CONFIGURATION\n"); - break; - } - case USB_REQUEST_GET_INTERFACE: - { - DPRINT1("USB_REQUEST_GET_INTERFACE\n"); - break; - } - case USB_REQUEST_SET_INTERFACE: - { - DPRINT1("USB_REQUEST_SET_INTERFACE\n"); - break; - } - case USB_REQUEST_SYNC_FRAME: - { - DPRINT1("USB_REQUEST_SYNC_FRAME\n"); - break; - } - default: - { - DPRINT1("Unknown Function Class Unknown request\n"); - break; - } - } - break; - } - default: - { - DPRINT1("Ehci: Unhandled URB %x\n", Urb->UrbHeader.Function); - //Urb->UrbHeader.Status = USBD_STATUS_INVALID_URB_FUNCTION; - } - } - - Irp->IoStatus.Information = Information; - - if (Status != STATUS_PENDING) - IoCompleteRequest(Irp, IO_NO_INCREMENT); - - return Status; + /*FIXME: This should never be called by upper drivers as they should only be dealing with the pdo. */ + DPRINT1("Upper Level Device Object shouldnt be calling this!!!!!!!!!!!!\n"); + ASSERT(FALSE); + return STATUS_UNSUCCESSFUL; } diff --git a/reactos/drivers/usb/usbehci/hardware.h b/reactos/drivers/usb/usbehci/hardware.h index bc9d1d3e9f1..211c578ae93 100644 --- a/reactos/drivers/usb/usbehci/hardware.h +++ b/reactos/drivers/usb/usbehci/hardware.h @@ -1,6 +1,7 @@ #pragma once #include +#include /* USB Command Register */ #define EHCI_USBCMD 0x00 @@ -98,8 +99,9 @@ typedef struct _QUEUE_TRANSFER_DESCRIPTOR ULONG DWord; } Token; ULONG BufferPointer[5]; - + //Software + ULONG BufferPointerVA[5]; ULONG PhysicalAddr; struct _QUEUE_TRANSFER_DESCRIPTOR *PreviousDescriptor; struct _QUEUE_TRANSFER_DESCRIPTOR *NextDescriptor; @@ -167,10 +169,13 @@ typedef struct _QUEUE_HEAD ULONG PhysicalAddr; struct _QUEUE_HEAD *PreviousQueueHead; struct _QUEUE_HEAD *NextQueueHead; - PQUEUE_TRANSFER_DESCRIPTOR TransferDescriptor; + ULONG NumberOfTransferDescriptors; + PQUEUE_TRANSFER_DESCRIPTOR FirstTransferDescriptor; + PQUEUE_TRANSFER_DESCRIPTOR DeadDescriptor; PIRP IrpToComplete; - PMDL MdlToFree; PKEVENT Event; + PMDL Mdl; + BOOLEAN FreeMdl; } QUEUE_HEAD, *PQUEUE_HEAD; /* USBCMD register 32 bits */ @@ -264,14 +269,27 @@ typedef struct _EHCI_CAPS { UCHAR PortRoute [8]; } EHCI_CAPS, *PEHCI_CAPS; +typedef struct _EHCIPORTS +{ + ULONG PortNumber; + ULONG PortType; + USHORT PortStatus; + USHORT PortChange; +} EHCIPORTS, *PEHCIPORTS; + typedef struct _EHCI_HOST_CONTROLLER { + PDMA_ADAPTER pDmaAdapter; + ULONG MapRegisters; ULONG OpRegisters; EHCI_CAPS ECHICaps; - PVOID CommonBufferVA; - PHYSICAL_ADDRESS CommonBufferPA; + ULONG NumberOfPorts; + EHCIPORTS Ports[127]; + PVOID CommonBufferVA[16]; + PHYSICAL_ADDRESS CommonBufferPA[16]; ULONG CommonBufferSize; PQUEUE_HEAD AsyncListQueue; + PQUEUE_HEAD CompletedListQueue; KSPIN_LOCK Lock; } EHCI_HOST_CONTROLLER, *PEHCI_HOST_CONTROLLER; @@ -305,3 +323,5 @@ SetPeriodicFrameListRegister(PEHCI_HOST_CONTROLLER hcd, ULONG PhysicalAddr); ULONG GetPeriodicFrameListRegister(PEHCI_HOST_CONTROLLER hcd); +BOOLEAN +EnumControllerPorts(PEHCI_HOST_CONTROLLER hcd); diff --git a/reactos/drivers/usb/usbehci/hwiface.c b/reactos/drivers/usb/usbehci/hwiface.c index 92313ee13aa..aae5157f116 100644 --- a/reactos/drivers/usb/usbehci/hwiface.c +++ b/reactos/drivers/usb/usbehci/hwiface.c @@ -32,7 +32,6 @@ CreateDescriptor(PEHCI_HOST_CONTROLLER hcd, UCHAR PIDCode, ULONG TotalBytesToTra Descriptor->NextPointer = TERMINATE_POINTER; Descriptor->AlternateNextPointer = TERMINATE_POINTER; Descriptor->Token.Bits.DataToggle = TRUE; - Descriptor->Token.Bits.InterruptOnComplete = TRUE; Descriptor->Token.Bits.ErrorCounter = 0x03; Descriptor->Token.Bits.Active = TRUE; Descriptor->Token.Bits.PIDCode = PIDCode; @@ -47,9 +46,9 @@ CreateDescriptor(PEHCI_HOST_CONTROLLER hcd, UCHAR PIDCode, ULONG TotalBytesToTra } VOID -FreeDescriptor(PQUEUE_TRANSFER_DESCRIPTOR Descriptor) +FreeDescriptor(PEHCI_HOST_CONTROLLER hcd, PQUEUE_TRANSFER_DESCRIPTOR Descriptor) { - ReleaseMemory((ULONG)Descriptor); + ReleaseMemory(hcd, (ULONG)Descriptor); } /* Queue Head */ @@ -87,14 +86,12 @@ CreateQueueHead(PEHCI_HOST_CONTROLLER hcd) KIRQL OldIrql; KeAcquireSpinLock(&hcd->Lock, &OldIrql); - CurrentQH = (PQUEUE_HEAD)AllocateMemory(hcd, sizeof(QUEUE_HEAD), &PhysicalAddress); RtlZeroMemory(CurrentQH, sizeof(QUEUE_HEAD)); ASSERT(CurrentQH); CurrentQH->PhysicalAddr = PhysicalAddress; CurrentQH->HorizontalLinkPointer = TERMINATE_POINTER; - CurrentQH->CurrentLinkPointer = TERMINATE_POINTER; CurrentQH->AlternateNextPointer = TERMINATE_POINTER; CurrentQH->NextPointer = TERMINATE_POINTER; @@ -107,7 +104,7 @@ CreateQueueHead(PEHCI_HOST_CONTROLLER hcd) CurrentQH->EndPointCharacteristics.NakCountReload = 0xF; /* Get the Initial Data Toggle from the QEDT */ - CurrentQH->EndPointCharacteristics.QEDTDataToggleControl = TRUE; + CurrentQH->EndPointCharacteristics.QEDTDataToggleControl = FALSE; /* High Speed Device */ CurrentQH->EndPointCharacteristics.EndPointSpeed = QH_ENDPOINT_HIGHSPEED; @@ -120,7 +117,7 @@ CreateQueueHead(PEHCI_HOST_CONTROLLER hcd) for (i=0; i<5; i++) CurrentQH->BufferPointer[i] = 0; - CurrentQH->Token.Bits.InterruptOnComplete = TRUE; + CurrentQH->Token.Bits.InterruptOnComplete = FALSE; KeReleaseSpinLock(&hcd->Lock, OldIrql); return CurrentQH; @@ -131,19 +128,17 @@ LinkQueueHead(PEHCI_HOST_CONTROLLER hcd, PQUEUE_HEAD QueueHead) { KIRQL OldIrql; PQUEUE_HEAD CurrentHead = (PQUEUE_HEAD)hcd->AsyncListQueue; - PQUEUE_HEAD PreviousHead = CurrentHead->PreviousQueueHead; + PQUEUE_HEAD PreviousHead; KeAcquireSpinLock(&hcd->Lock, &OldIrql); - - QueueHead->HorizontalLinkPointer = (CurrentHead->HorizontalLinkPointer | QH_TYPE_QH) & ~TERMINATE_POINTER; + PreviousHead = CurrentHead->PreviousQueueHead; QueueHead->NextQueueHead = CurrentHead; QueueHead->PreviousQueueHead = PreviousHead; - + PreviousHead->NextQueueHead = QueueHead; CurrentHead->PreviousQueueHead = QueueHead; - if (PreviousHead) - PreviousHead->NextQueueHead = QueueHead; - - CurrentHead->HorizontalLinkPointer = QueueHead->PhysicalAddr | QH_TYPE_QH; + + QueueHead->HorizontalLinkPointer = (CurrentHead->HorizontalLinkPointer | QH_TYPE_QH) & ~TERMINATE_POINTER; + PreviousHead->HorizontalLinkPointer = QueueHead->PhysicalAddr| QH_TYPE_QH; KeReleaseSpinLock(&hcd->Lock, OldIrql); } @@ -152,24 +147,80 @@ VOID UnlinkQueueHead(PEHCI_HOST_CONTROLLER hcd, PQUEUE_HEAD QueueHead) { KIRQL OldIrql; - PQUEUE_HEAD PreviousHead = QueueHead->PreviousQueueHead; - PQUEUE_HEAD NextHead = QueueHead->NextQueueHead; + PQUEUE_HEAD PreviousHead; + PQUEUE_HEAD NextHead; KeAcquireSpinLock(&hcd->Lock, &OldIrql); - if (PreviousHead) - { - PreviousHead->NextQueueHead = NextHead; - PreviousHead->HorizontalLinkPointer = QueueHead->HorizontalLinkPointer; - } - if (NextHead) - NextHead->PreviousQueueHead = PreviousHead; + PreviousHead = QueueHead->PreviousQueueHead; + NextHead = QueueHead->NextQueueHead; + PreviousHead->NextQueueHead = NextHead; + NextHead->PreviousQueueHead = PreviousHead; + + PreviousHead->HorizontalLinkPointer = NextHead->HorizontalLinkPointer; KeReleaseSpinLock(&hcd->Lock, OldIrql); } VOID -DeleteQueueHead(PQUEUE_HEAD QueueHead) +LinkQueueHeadToCompletedList(PEHCI_HOST_CONTROLLER hcd, PQUEUE_HEAD QueueHead) { - ReleaseMemory((ULONG)QueueHead); + KIRQL OldIrql; + PQUEUE_HEAD CurrentHead = (PQUEUE_HEAD)hcd->CompletedListQueue; + PQUEUE_HEAD PreviousHead; + + KeAcquireSpinLock(&hcd->Lock, &OldIrql); + + PreviousHead = CurrentHead->PreviousQueueHead; + QueueHead->NextQueueHead = CurrentHead; + QueueHead->PreviousQueueHead = PreviousHead; + PreviousHead->NextQueueHead = QueueHead; + CurrentHead->PreviousQueueHead = QueueHead; + + KeReleaseSpinLock(&hcd->Lock, OldIrql); + +} + +VOID +DeleteQueueHead(PEHCI_HOST_CONTROLLER hcd, PQUEUE_HEAD QueueHead) +{ + ReleaseMemory(hcd, (ULONG)QueueHead); +} + +VOID +CleanupAsyncList(PEHCI_HOST_CONTROLLER hcd) +{ + PQUEUE_TRANSFER_DESCRIPTOR Descriptor; + PQUEUE_HEAD QueueHead; + KIRQL OldIrql; + + KeAcquireSpinLock(&hcd->Lock, &OldIrql); + + QueueHead = hcd->CompletedListQueue; + QueueHead = QueueHead->NextQueueHead; + + while (QueueHead != hcd->CompletedListQueue) + { + Descriptor = QueueHead->FirstTransferDescriptor; + while (Descriptor) + { + if (Descriptor->Token.Bits.PIDCode == PID_CODE_SETUP_TOKEN) + ReleaseMemory(hcd, Descriptor->BufferPointerVA[0]); + FreeDescriptor(hcd, Descriptor); + Descriptor = Descriptor->NextDescriptor; + } + + if (QueueHead->FreeMdl) + { + DPRINT("Freeing Mdl %x, StartVA %x\n", QueueHead->Mdl, QueueHead->Mdl->StartVa); + IoFreeMdl(QueueHead->Mdl); + } + + QueueHead = QueueHead->NextQueueHead; + } + + hcd->CompletedListQueue->NextQueueHead = hcd->CompletedListQueue; + hcd->CompletedListQueue->PreviousQueueHead = hcd->CompletedListQueue; + + KeReleaseSpinLock(&hcd->Lock, OldIrql); } diff --git a/reactos/drivers/usb/usbehci/hwiface.h b/reactos/drivers/usb/usbehci/hwiface.h index 4fbf22dea96..aa961e6f80e 100644 --- a/reactos/drivers/usb/usbehci/hwiface.h +++ b/reactos/drivers/usb/usbehci/hwiface.h @@ -5,7 +5,7 @@ PQUEUE_TRANSFER_DESCRIPTOR CreateDescriptor(PEHCI_HOST_CONTROLLER hcd, UCHAR PIDCode, ULONG TotalBytesToTransfer); VOID -FreeDescriptor(PQUEUE_TRANSFER_DESCRIPTOR Descriptor); +FreeDescriptor(PEHCI_HOST_CONTROLLER hcd, PQUEUE_TRANSFER_DESCRIPTOR Descriptor); VOID DumpQueueHeadList(PEHCI_HOST_CONTROLLER hcd); @@ -20,5 +20,10 @@ VOID UnlinkQueueHead(PEHCI_HOST_CONTROLLER hcd, PQUEUE_HEAD QueueHead); VOID -DeleteQueueHead(PQUEUE_HEAD QueueHead); +DeleteQueueHead(PEHCI_HOST_CONTROLLER hcd, PQUEUE_HEAD QueueHead); +VOID +LinkQueueHeadToCompletedList(PEHCI_HOST_CONTROLLER hcd, PQUEUE_HEAD QueueHead); + +VOID +CleanupAsyncList(PEHCI_HOST_CONTROLLER hcd); From fe97558adf0e7d93cc73ee43f4fab72ff0469225 Mon Sep 17 00:00:00 2001 From: Michael Martin Date: Wed, 13 Apr 2011 04:43:25 +0000 Subject: [PATCH 138/317] [USB\USBEHCI] - For common buffer memory, only allocate one page and allocate more as needed. This implementation will most likely be replaced with janderwalds. - Use a safecount while attempting to stop and start the controller, so that an error can be displayed vice doing endless loop for controllers that are misbehaving. - Reorganize a few structuers and remove members of structures that are not used. - Add comments for some of the DirectCall Interface Functions. Change 2 of 3. svn path=/trunk/; revision=51326 --- reactos/drivers/usb/usbehci/common.c | 2 +- reactos/drivers/usb/usbehci/hardware.c | 113 ++++++++++-- reactos/drivers/usb/usbehci/physmem.c | 57 ++++++- reactos/drivers/usb/usbehci/physmem.h | 3 +- reactos/drivers/usb/usbehci/usbehci.c | 4 +- reactos/drivers/usb/usbehci/usbehci.h | 17 -- reactos/drivers/usb/usbehci/usbiffn.c | 227 ++++++++++++++++++------- 7 files changed, 321 insertions(+), 102 deletions(-) diff --git a/reactos/drivers/usb/usbehci/common.c b/reactos/drivers/usb/usbehci/common.c index 5fb0cc6fe08..f31eb9be50f 100644 --- a/reactos/drivers/usb/usbehci/common.c +++ b/reactos/drivers/usb/usbehci/common.c @@ -98,7 +98,7 @@ DumpQueueHead(PQUEUE_HEAD QueueHead) DPRINT1(" PingState %x\n", QueueHead->Token.Bits.PingState); DPRINT1(" SplitTransactionState %x\n", QueueHead->Token.Bits.SplitTransactionState); DPRINT1(" ErrorCounter %x\n", QueueHead->Token.Bits.ErrorCounter); - DPRINT1(" First TransferDescriptor %x\n", QueueHead->TransferDescriptor); + DPRINT1(" First TransferDescriptor %x\n", QueueHead->FirstTransferDescriptor); } VOID diff --git a/reactos/drivers/usb/usbehci/hardware.c b/reactos/drivers/usb/usbehci/hardware.c index 0adf59e5e3b..8e9c6d58e2b 100644 --- a/reactos/drivers/usb/usbehci/hardware.c +++ b/reactos/drivers/usb/usbehci/hardware.c @@ -64,7 +64,7 @@ ResetPort(PEHCI_HOST_CONTROLLER hcd, UCHAR Port) { ULONG tmp; ULONG OpRegisters = hcd->OpRegisters; - DPRINT1("Reset Port %x\n", Port); + DPRINT("Reset Port %x\n", Port); tmp = READ_REGISTER_ULONG((PULONG) ((OpRegisters + EHCI_PORTSC) + (4 * Port))); if (tmp & 0x400) @@ -95,7 +95,9 @@ ResetPort(PEHCI_HOST_CONTROLLER hcd, UCHAR Port) if (tmp & 0x100) { DPRINT1("EHCI ERROR: Port Reset did not complete!\n"); + ASSERT(FALSE); } + DPRINT("Reset complete\n"); } VOID @@ -107,7 +109,7 @@ StopEhci(PEHCI_HOST_CONTROLLER hcd) LONG FailSafe; LONG tmp; - DPRINT1("Stopping Ehci controller\n"); + DPRINT("Stopping Ehci controller\n"); WRITE_REGISTER_ULONG((PULONG) (OpRegisters + EHCI_USBINTR), 0); @@ -117,7 +119,7 @@ StopEhci(PEHCI_HOST_CONTROLLER hcd) WRITE_REGISTER_ULONG((PULONG) (OpRegisters + EHCI_USBCMD), tmp); /* Wait for the device to stop */ - for (FailSafe = 100; FailSafe > 1; FailSafe++) + for (FailSafe = 0; FailSafe < 1000; FailSafe++) { KeStallExecutionProcessor(10); tmp = READ_REGISTER_ULONG((PULONG)(OpRegisters + EHCI_USBSTS)); @@ -129,7 +131,10 @@ StopEhci(PEHCI_HOST_CONTROLLER hcd) } } if (!UsbSts->HCHalted) + { DPRINT1("EHCI ERROR: Controller is not responding to Stop request!\n"); + ASSERT(FALSE); + } } VOID @@ -138,7 +143,7 @@ StartEhci(PEHCI_HOST_CONTROLLER hcd) ULONG OpRegisters = hcd->OpRegisters; PEHCI_USBCMD_CONTENT UsbCmd; PEHCI_USBSTS_CONTEXT UsbSts; - LONG FailSafe; + LONG failSafe; LONG tmp; LONG tmp2; @@ -160,7 +165,7 @@ StartEhci(PEHCI_HOST_CONTROLLER hcd) WRITE_REGISTER_ULONG ((PULONG)(OpRegisters + EHCI_USBCMD), tmp); /* Wait for the device to reset */ - for (FailSafe = 100; FailSafe > 1; FailSafe++) + for (failSafe = 0; failSafe < 1000; failSafe++) { KeStallExecutionProcessor(10); tmp = READ_REGISTER_ULONG((PULONG)(OpRegisters + EHCI_USBCMD)); @@ -176,6 +181,7 @@ StartEhci(PEHCI_HOST_CONTROLLER hcd) if (UsbCmd->HCReset) { DPRINT1("EHCI ERROR: Controller failed to reset! Will attempt to continue.\n"); + ASSERT(FALSE); } UsbCmd = (PEHCI_USBCMD_CONTENT) &tmp; @@ -209,7 +215,7 @@ StartEhci(PEHCI_HOST_CONTROLLER hcd) WRITE_REGISTER_ULONG((PULONG)(OpRegisters + EHCI_USBCMD), tmp); /* Wait for the device to start */ - for (;;) + for (failSafe = 0; failSafe < 1000; failSafe++) { KeStallExecutionProcessor(10); tmp2 = READ_REGISTER_ULONG((PULONG)(OpRegisters + EHCI_USBSTS)); @@ -222,10 +228,95 @@ StartEhci(PEHCI_HOST_CONTROLLER hcd) DPRINT("Waiting for start, USBSTS: %x\n", READ_REGISTER_ULONG ((PULONG)(OpRegisters + EHCI_USBSTS))); } + if (UsbSts->HCHalted) + { + DPRINT1("EHCI ERROR: Controller failed to start!!!\n"); + ASSERT(FALSE); + } /* Set all port routing to ECHI controller */ WRITE_REGISTER_ULONG((PULONG)(OpRegisters + EHCI_CONFIGFLAG), 1); } +BOOLEAN +EnumControllerPorts(PEHCI_HOST_CONTROLLER hcd) +{ + ULONG tmp, i, OpRegisters, ChildDeviceCount = 0; + BOOLEAN PortChange = FALSE; + + OpRegisters = (ULONG)hcd->OpRegisters; + /* Loop through the ports */ + for (i = 0; i < hcd->ECHICaps.HCSParams.PortCount; i++) + { + tmp = READ_REGISTER_ULONG((PULONG) ((OpRegisters + EHCI_PORTSC) + (4 * i))); + + /* Check for port change on this port */ + if (tmp & 0x02) + { + DPRINT1("Port Change\n"); + + /* Clear status change */ + tmp = READ_REGISTER_ULONG((PULONG)((OpRegisters + EHCI_PORTSC) + (4 * i))); + tmp |= 0x02; + WRITE_REGISTER_ULONG((PULONG) ((OpRegisters + EHCI_PORTSC) + (4 * i)), tmp); + + PortChange = TRUE; + /* Connect or Disconnect? */ + if (tmp & 0x01) + { + DPRINT1("Device connected on port %d\n", i); + + /* Check if a companion host controller exists */ + if (hcd->ECHICaps.HCSParams.CHCCount) + { + tmp = READ_REGISTER_ULONG((PULONG)((OpRegisters + EHCI_PORTSC) + (4 * i))); + + /* Port should be in disabled state, as per USB 2.0 specs */ + if (tmp & 0x04) + { + DPRINT1("Warning: The port the device has just connected to is not disabled!\n"); + } + + /* Is this non high speed device */ + if (tmp & 0x400) + { + DPRINT1("Non HighSpeed device connected. Releasing ownership.\n"); + /* Release ownership to companion host controller */ + WRITE_REGISTER_ULONG((PULONG) ((OpRegisters + EHCI_PORTSC) + (4 * i)), 0x2000); + continue; + } + } + + KeStallExecutionProcessor(30); + + /* As per USB 2.0 Specs, 9.1.2. Reset the port and clear the status change */ + //tmp |= 0x100 | 0x02; + /* Sanity, Disable port */ + //tmp &= ~0x04; + + //WRITE_REGISTER_ULONG((PULONG) ((Base + EHCI_PORTSC) + (4 * i)), tmp); + + //KeStallExecutionProcessor(20); + + tmp = READ_REGISTER_ULONG((PULONG)((OpRegisters + EHCI_PORTSC) + (4 * i))); + + ChildDeviceCount++; + hcd->Ports[i].PortStatus &= ~0x8000; + DPRINT1("Removed 0x8000\n"); + ASSERT(FALSE); + hcd->Ports[i].PortStatus |= USB_PORT_STATUS_HIGH_SPEED; + hcd->Ports[i].PortStatus |= USB_PORT_STATUS_CONNECT; + hcd->Ports[i].PortChange |= USB_PORT_STATUS_CONNECT; + } + else + { + DPRINT1("Device disconnected on port %d\n", i); + ChildDeviceCount--; + } + } + } + return PortChange; +} + VOID GetCapabilities(PEHCI_CAPS PCap, ULONG CapRegister) { @@ -241,11 +332,11 @@ GetCapabilities(PEHCI_CAPS PCap, ULONG CapRegister) PCap->HCSParamsLong = READ_REGISTER_ULONG((PULONG)(CapRegister + 4)); PCap->HCCParams = READ_REGISTER_ULONG((PULONG)(CapRegister + 8)); - DPRINT1("Length %d\n", PCap->Length); - DPRINT1("Reserved %d\n", PCap->Reserved); - DPRINT1("HCIVersion %x\n", PCap->HCIVersion); - DPRINT1("HCSParams %x\n", PCap->HCSParamsLong); - DPRINT1("HCCParams %x\n", PCap->HCCParams); + DPRINT("Length %d\n", PCap->Length); + DPRINT("Reserved %d\n", PCap->Reserved); + DPRINT("HCIVersion %x\n", PCap->HCIVersion); + DPRINT("HCSParams %x\n", PCap->HCSParamsLong); + DPRINT("HCCParams %x\n", PCap->HCCParams); if (PCap->HCCParams & 0x02) DPRINT1("Frame list size is configurable\n"); diff --git a/reactos/drivers/usb/usbehci/physmem.c b/reactos/drivers/usb/usbehci/physmem.c index eb696da9f09..09a964ff32e 100644 --- a/reactos/drivers/usb/usbehci/physmem.c +++ b/reactos/drivers/usb/usbehci/physmem.c @@ -22,21 +22,32 @@ DumpPages() ULONG AllocateMemory(PEHCI_HOST_CONTROLLER hcd, ULONG Size, ULONG *PhysicalAddress) { - PMEM_HEADER MemoryPage = (PMEM_HEADER)hcd->CommonBufferVA; + PMEM_HEADER MemoryPage = NULL; ULONG PageCount = 0; ULONG NumberOfPages = hcd->CommonBufferSize / PAGE_SIZE; - ULONG BlocksNeeded; + ULONG BlocksNeeded = 0; ULONG i,j, freeCount; ULONG RetAddr = 0; + MemoryPage = (PMEM_HEADER)hcd->CommonBufferVA[0]; Size = ((Size + SMALL_ALLOCATION_SIZE - 1) / SMALL_ALLOCATION_SIZE) * SMALL_ALLOCATION_SIZE; BlocksNeeded = Size / SMALL_ALLOCATION_SIZE; + do { if (MemoryPage->IsFull) { PageCount++; - MemoryPage = (PMEM_HEADER)((ULONG)MemoryPage + PAGE_SIZE); + + if (!(PMEM_HEADER)hcd->CommonBufferVA[PageCount]) + { + hcd->CommonBufferVA[PageCount] = + hcd->pDmaAdapter->DmaOperations->AllocateCommonBuffer(hcd->pDmaAdapter, + PAGE_SIZE, + &hcd->CommonBufferPA[PageCount], + FALSE); + } + MemoryPage = (PMEM_HEADER)hcd->CommonBufferVA[PageCount]; continue; } freeCount = 0; @@ -54,8 +65,9 @@ AllocateMemory(PEHCI_HOST_CONTROLLER hcd, ULONG Size, ULONG *PhysicalAddress) if ((i-freeCount+1 + BlocksNeeded) > sizeof(MemoryPage->Entry)) { freeCount = 0; - continue; + break; } + if (freeCount == BlocksNeeded) { for (j = 0; j < freeCount; j++) @@ -68,20 +80,35 @@ AllocateMemory(PEHCI_HOST_CONTROLLER hcd, ULONG Size, ULONG *PhysicalAddress) RetAddr = (ULONG)MemoryPage + (SMALL_ALLOCATION_SIZE * (i - freeCount + 1)) + sizeof(MEM_HEADER); - *PhysicalAddress = (ULONG)hcd->CommonBufferPA.LowPart + (RetAddr - (ULONG)hcd->CommonBufferVA); + *(ULONG*)PhysicalAddress = (ULONG)hcd->CommonBufferPA[PageCount].LowPart + (RetAddr - (ULONG)hcd->CommonBufferVA[PageCount]); + return RetAddr; } } PageCount++; - MemoryPage = (PMEM_HEADER)((ULONG)MemoryPage + PAGE_SIZE); + if (!(PMEM_HEADER)hcd->CommonBufferVA[PageCount]) + { + + hcd->CommonBufferVA[PageCount] = + hcd->pDmaAdapter->DmaOperations->AllocateCommonBuffer(hcd->pDmaAdapter, + PAGE_SIZE, + &hcd->CommonBufferPA[PageCount], + FALSE); + DPRINT1("Allocated CommonBuffer VA %x, PA %x\n", hcd->CommonBufferVA[PageCount], hcd->CommonBufferPA[PageCount]); + } + MemoryPage = (PMEM_HEADER)hcd->CommonBufferVA[PageCount]; + } while (PageCount < NumberOfPages); + if (PageCount == NumberOfPages) + ASSERT(FALSE); + return 0; } VOID -ReleaseMemory(ULONG Address) +ReleaseMemory(PEHCI_HOST_CONTROLLER hcd, ULONG Address) { PMEM_HEADER MemoryPage; ULONG Index, i, BlockSize; @@ -90,9 +117,25 @@ ReleaseMemory(ULONG Address) Index = (Address - ((ULONG)MemoryPage + sizeof(MEM_HEADER))) / SMALL_ALLOCATION_SIZE; BlockSize = MemoryPage->Entry[Index].Blocks; + for (i = 0; i < BlockSize; i++) { MemoryPage->Entry[Index + i].InUse = 0; MemoryPage->Entry[Index + i].Blocks = 0; } + + if (MemoryPage != (PMEM_HEADER)hcd->CommonBufferVA[0]) + { + for (i=0; i < sizeof(MemoryPage->Entry) / 2; i++) + { + if ((MemoryPage->Entry[i].InUse) || (MemoryPage->Entry[sizeof(MemoryPage->Entry) - i].InUse)) + return; + } + DPRINT1("Freeing CommonBuffer VA %x, PA %x\n", MemoryPage, MmGetPhysicalAddress(MemoryPage)); + hcd->pDmaAdapter->DmaOperations->FreeCommonBuffer(hcd->pDmaAdapter, + PAGE_SIZE, + MmGetPhysicalAddress(MemoryPage), + MemoryPage, + FALSE); + } } diff --git a/reactos/drivers/usb/usbehci/physmem.h b/reactos/drivers/usb/usbehci/physmem.h index a49f1bbda6d..b88f702ba0b 100644 --- a/reactos/drivers/usb/usbehci/physmem.h +++ b/reactos/drivers/usb/usbehci/physmem.h @@ -22,5 +22,4 @@ ULONG AllocateMemory(PEHCI_HOST_CONTROLLER hcd, ULONG Size, ULONG *PhysicalAddress); VOID -ReleaseMemory(ULONG Address); - +ReleaseMemory(PEHCI_HOST_CONTROLLER hcd, ULONG Address); diff --git a/reactos/drivers/usb/usbehci/usbehci.c b/reactos/drivers/usb/usbehci/usbehci.c index f88cde8b886..d4e85be245a 100644 --- a/reactos/drivers/usb/usbehci/usbehci.c +++ b/reactos/drivers/usb/usbehci/usbehci.c @@ -69,7 +69,7 @@ UsbEhciClose(PDEVICE_OBJECT DeviceObject, PIRP Irp) VOID NTAPI DriverUnload(PDRIVER_OBJECT DriverObject) { - DPRINT1("Unloading Driver\n"); + DPRINT("Unloading Driver\n"); /* FIXME: Clean up */ } @@ -94,7 +94,7 @@ DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath) DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DispatchDeviceControl; DriverObject->MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL] = DispatchInternalDeviceControl; DriverObject->MajorFunction[IRP_MJ_PNP] = DispatchPnp; - + DriverObject->DriverUnload = DriverUnload; DPRINT1("Driver entry done\n"); diff --git a/reactos/drivers/usb/usbehci/usbehci.h b/reactos/drivers/usb/usbehci/usbehci.h index 210d9194d57..09e29479111 100644 --- a/reactos/drivers/usb/usbehci/usbehci.h +++ b/reactos/drivers/usb/usbehci/usbehci.h @@ -93,14 +93,6 @@ typedef struct _COMMON_DEVICE_EXTENSION PDEVICE_OBJECT DeviceObject; } COMMON_DEVICE_EXTENSION, *PCOMMON_DEVICE_EXTENSION; -typedef struct _EHCIPORTS -{ - ULONG PortNumber; - ULONG PortType; - USHORT PortStatus; - USHORT PortChange; -} EHCIPORTS, *PEHCIPORTS; - typedef struct _FDO_DEVICE_EXTENSION { COMMON_DEVICE_EXTENSION Common; @@ -109,10 +101,7 @@ typedef struct _FDO_DEVICE_EXTENSION PDEVICE_OBJECT LowerDevice; PDEVICE_OBJECT Pdo; ULONG DeviceState; - PVOID RootHubDeviceHandle; - PDMA_ADAPTER pDmaAdapter; - ULONG Vector; KIRQL Irql; @@ -125,8 +114,6 @@ typedef struct _FDO_DEVICE_EXTENSION KAFFINITY Affinity; - ULONG MapRegisters; - ULONG BusNumber; ULONG BusAddress; ULONG PCIAddress; @@ -148,8 +135,6 @@ typedef struct _FDO_DEVICE_EXTENSION BOOLEAN AsyncComplete; - //PULONG ResourceBase; - //ULONG Size; } FDO_DEVICE_EXTENSION, *PFDO_DEVICE_EXTENSION; typedef struct _PDO_DEVICE_EXTENSION @@ -168,8 +153,6 @@ typedef struct _PDO_DEVICE_EXTENSION RH_INIT_CALLBACK *CallbackRoutine; USB_IDLE_CALLBACK IdleCallback; PVOID IdleContext; - ULONG NumberOfPorts; - EHCIPORTS Ports[32]; KTIMER Timer; KEVENT QueueDrainedEvent; FAST_MUTEX ListLock; diff --git a/reactos/drivers/usb/usbehci/usbiffn.c b/reactos/drivers/usb/usbehci/usbiffn.c index 6f4932091fd..1bc74d6878f 100644 --- a/reactos/drivers/usb/usbehci/usbiffn.c +++ b/reactos/drivers/usb/usbehci/usbiffn.c @@ -7,12 +7,15 @@ * Michael Martin (michael.martin@reactos.org) */ +/* Many of these direct calls are documented on http://www.osronline.com */ + #include "usbehci.h" #include #include +#include "hardware.h" #include "transfer.h" -PVOID InternalCreateUsbDevice(UCHAR DeviceNumber, ULONG Port, PUSB_DEVICE Parent, BOOLEAN Hub) +PVOID InternalCreateUsbDevice(ULONG Port, PUSB_DEVICE Parent, BOOLEAN Hub) { PUSB_DEVICE UsbDevicePointer = NULL; @@ -31,7 +34,6 @@ PVOID InternalCreateUsbDevice(UCHAR DeviceNumber, ULONG Port, PUSB_DEVICE Parent DPRINT1("This is the root hub\n"); } - UsbDevicePointer->Address = 0;//DeviceNumber; UsbDevicePointer->Port = Port - 1; UsbDevicePointer->ParentDevice = Parent; @@ -57,6 +59,11 @@ InterfaceDereference(PVOID BusContext) /* Bus Interface Hub V5 Functions */ +/* Hub Driver calls this routine for each new device it is informed about on USB Bus + osronline documents that this is where the device address is assigned. It also + states the same for InitializeUsbDevice. This function only gets the device descriptor + from the device and checks that the members for device are correct. */ + NTSTATUS USB_BUSIFFN CreateUsbDevice(PVOID BusContext, @@ -65,11 +72,18 @@ CreateUsbDevice(PVOID BusContext, USHORT PortStatus, USHORT PortNumber) { PPDO_DEVICE_EXTENSION PdoDeviceExtension; + PFDO_DEVICE_EXTENSION FdoDeviceExtension; + USB_DEFAULT_PIPE_SETUP_PACKET CtrlSetup; + PEHCI_HOST_CONTROLLER hcd; PUSB_DEVICE UsbDevice; - LONG i = 0; + LONG i; - PdoDeviceExtension = (PPDO_DEVICE_EXTENSION)((PDEVICE_OBJECT)BusContext)->DeviceExtension; DPRINT1("Ehci: CreateUsbDevice: HubDeviceHandle %x, PortStatus %x, PortNumber %x\n", HubDeviceHandle, PortStatus, PortNumber); + + PdoDeviceExtension = (PPDO_DEVICE_EXTENSION)((PDEVICE_OBJECT)BusContext)->DeviceExtension; + FdoDeviceExtension = (PFDO_DEVICE_EXTENSION)PdoDeviceExtension->ControllerFdo->DeviceExtension; + + hcd = &FdoDeviceExtension->hcd; if (PdoDeviceExtension->UsbDevices[0] != HubDeviceHandle) { @@ -77,29 +91,62 @@ CreateUsbDevice(PVOID BusContext, return STATUS_DEVICE_NOT_CONNECTED; } - UsbDevice = InternalCreateUsbDevice(PdoDeviceExtension->ChildDeviceCount, PortNumber, HubDeviceHandle, FALSE); - - if (!UsbDevice) - return STATUS_INSUFFICIENT_RESOURCES; - + UsbDevice = NULL; /* Add it to the list */ - while (TRUE) + for (i=0; i < MAX_USB_DEVICES; i++) { if (PdoDeviceExtension->UsbDevices[i] == NULL) { - PdoDeviceExtension->UsbDevices[i] = (PUSB_DEVICE)UsbDevice; + PdoDeviceExtension->UsbDevices[i] = InternalCreateUsbDevice(PortNumber, HubDeviceHandle, FALSE); + + if (!PdoDeviceExtension->UsbDevices[i]) + return STATUS_INSUFFICIENT_RESOURCES; + UsbDevice = PdoDeviceExtension->UsbDevices[i]; break; } - i++; } - PdoDeviceExtension->Ports[PortNumber - 1].PortStatus = PortStatus; + /* Check that a device was created */ + if (!UsbDevice) + { + DPRINT1("Too many usb devices attached. Max is %d\n", MAX_USB_DEVICES); + return STATUS_UNSUCCESSFUL; + } + + hcd->Ports[PortNumber - 1].PortStatus = PortStatus; + + /* Get the device descriptor */ + CtrlSetup.bRequest = USB_REQUEST_GET_DESCRIPTOR; + CtrlSetup.wValue.LowByte = 0; + CtrlSetup.wValue.HiByte = USB_DEVICE_DESCRIPTOR_TYPE; + CtrlSetup.wIndex.W = 0; + CtrlSetup.wLength = sizeof(USB_DEVICE_DESCRIPTOR); + CtrlSetup.bmRequestType.B = 0x80; + ExecuteTransfer(FdoDeviceExtension->DeviceObject, + UsbDevice, + 0, + &CtrlSetup, + 0, + &UsbDevice->DeviceDescriptor, + sizeof(USB_DEVICE_DESCRIPTOR), + NULL); + + /* Check status and bLength and bDescriptor members */ + if ((UsbDevice->DeviceDescriptor.bLength != 0x12) || (UsbDevice->DeviceDescriptor.bDescriptorType != 0x1)) + { + return STATUS_DEVICE_DATA_ERROR; + } + + DumpDeviceDescriptor(&UsbDevice->DeviceDescriptor); /* Return it */ *NewDevice = UsbDevice; return STATUS_SUCCESS; } +/* Assigns the device an address, gets the configuration, interface, and endpoint descriptors + from the device. All this data is saved as part of this driver */ + NTSTATUS USB_BUSIFFN InitializeUsbDevice(PVOID BusContext, PUSB_DEVICE_HANDLE DeviceHandle) @@ -107,13 +154,16 @@ InitializeUsbDevice(PVOID BusContext, PUSB_DEVICE_HANDLE DeviceHandle) PPDO_DEVICE_EXTENSION PdoDeviceExtension; PFDO_DEVICE_EXTENSION FdoDeviceExtension; USB_DEFAULT_PIPE_SETUP_PACKET CtrlSetup; + USB_DEVICE_DESCRIPTOR DeviceDesc; PUSB_CONFIGURATION_DESCRIPTOR ConfigDesc; PUSB_INTERFACE_DESCRIPTOR InterfaceDesc; PUSB_ENDPOINT_DESCRIPTOR EndpointDesc; PUSB_DEVICE UsbDevice; PVOID Buffer; PUCHAR Ptr; - LONG i, j, k; + UCHAR NewAddress = 0; + + LONG i, j, k, InitAttept; PdoDeviceExtension = (PPDO_DEVICE_EXTENSION)((PDEVICE_OBJECT)BusContext)->DeviceExtension; FdoDeviceExtension = (PFDO_DEVICE_EXTENSION)PdoDeviceExtension->ControllerFdo->DeviceExtension; @@ -126,30 +176,90 @@ InitializeUsbDevice(PVOID BusContext, PUSB_DEVICE_HANDLE DeviceHandle) return STATUS_DEVICE_NOT_CONNECTED; } - CtrlSetup.bRequest = USB_REQUEST_GET_DESCRIPTOR; - CtrlSetup.wValue.LowByte = 0; - CtrlSetup.wValue.HiByte = USB_DEVICE_DESCRIPTOR_TYPE; - CtrlSetup.wIndex.W = 0; - CtrlSetup.wLength = sizeof(USB_DEVICE_DESCRIPTOR); - CtrlSetup.bmRequestType.B = 0x80; - - SubmitControlTransfer(&FdoDeviceExtension->hcd, - &CtrlSetup, - &UsbDevice->DeviceDescriptor, - sizeof(USB_DEVICE_DESCRIPTOR), - NULL); - - //DumpDeviceDescriptor(&UsbDevice->DeviceDescriptor); - - if (UsbDevice->DeviceDescriptor.bLength != 0x12) + for (i=0; i<127; i++) { - DPRINT1("Failed to get Device Descriptor from device connected on port %d\n", UsbDevice->Port); + if (UsbDevice == PdoDeviceExtension->UsbDevices[i]) + { + NewAddress = i; + break; + } + } + + ASSERT(NewAddress); + + /* Linux drivers make 3 attemps to set the device address because of problems with some devices. Do the same */ + InitAttept = 0; + while (InitAttept < 3) + { + /* Set the device address */ + CtrlSetup.bmRequestType.B = 0x00; + CtrlSetup.bRequest = USB_REQUEST_SET_ADDRESS; + CtrlSetup.wValue.W = NewAddress; + CtrlSetup.wIndex.W = 0; + CtrlSetup.wLength = 0; + + DPRINT1("Setting Address to %x\n", NewAddress); + ExecuteTransfer(PdoDeviceExtension->ControllerFdo, + UsbDevice, + 0, + &CtrlSetup, + 0, + NULL, + 0, + NULL); + + KeStallExecutionProcessor(300 * InitAttept); + + /* Send 0 length packet to endpoint 0 for ack */ +/* + ExecuteTransfer(PdoDeviceExtension->ControllerFdo, + UsbDevice, + 0, + NULL, + 0, + NULL, + 0, + NULL); +*/ + + CtrlSetup.bRequest = USB_REQUEST_GET_DESCRIPTOR; + CtrlSetup.wValue.LowByte = 0; + CtrlSetup.wValue.HiByte = USB_DEVICE_DESCRIPTOR_TYPE; + CtrlSetup.wIndex.W = 0; + CtrlSetup.wLength = sizeof(USB_DEVICE_DESCRIPTOR); + CtrlSetup.bmRequestType.B = 0x80; + + UsbDevice->Address = NewAddress; + ExecuteTransfer(FdoDeviceExtension->DeviceObject, + UsbDevice, + 0, + &CtrlSetup, + 0, + &DeviceDesc, + sizeof(USB_DEVICE_DESCRIPTOR), + NULL); + + DPRINT1("Length %d, DescriptorType %d\n", DeviceDesc.bLength, DeviceDesc.bDescriptorType); + if ((DeviceDesc.bLength == 0x12) && (DeviceDesc.bDescriptorType == 0x01)) + break; + + /* If the descriptor was not gotten */ + UsbDevice->Address = 0; + InitAttept++; + } + + if (InitAttept == 3) + { + DPRINT1("Unable to initialize usb device connected on port %d!\n", UsbDevice->Port); + /* FIXME: Should the memory allocated for this device be deleted? */ return STATUS_DEVICE_DATA_ERROR; } + DumpDeviceDescriptor(&DeviceDesc); if (UsbDevice->DeviceDescriptor.bNumConfigurations == 0) { DPRINT1("Device on port %d has no configurations!\n", UsbDevice->Port); + /* FIXME: Should the memory allocated for this device be deleted? */ return STATUS_DEVICE_DATA_ERROR; } UsbDevice->Configs = ExAllocatePoolWithTag(NonPagedPool, @@ -159,6 +269,7 @@ InitializeUsbDevice(PVOID BusContext, PUSB_DEVICE_HANDLE DeviceHandle) if (!UsbDevice->Configs) { DPRINT1("Out of memory\n"); + /* FIXME: Should the memory allocated for this device be deleted? */ return STATUS_NO_MEMORY; } @@ -167,6 +278,7 @@ InitializeUsbDevice(PVOID BusContext, PUSB_DEVICE_HANDLE DeviceHandle) if (!Buffer) { DPRINT1("Out of memory\n"); + /* FIXME: Should the memory allocated for this device be deleted? */ return STATUS_NO_MEMORY; } @@ -184,16 +296,18 @@ InitializeUsbDevice(PVOID BusContext, PUSB_DEVICE_HANDLE DeviceHandle) CtrlSetup.wValue.HiByte = USB_CONFIGURATION_DESCRIPTOR_TYPE; CtrlSetup.wIndex.W = 0; CtrlSetup.wLength = PAGE_SIZE; - - SubmitControlTransfer(&FdoDeviceExtension->hcd, - &CtrlSetup, - Buffer, - PAGE_SIZE, - NULL); + ExecuteTransfer(PdoDeviceExtension->ControllerFdo, + UsbDevice, + 0, + &CtrlSetup, + 0, + Buffer, + PAGE_SIZE, + NULL); ConfigDesc = (PUSB_CONFIGURATION_DESCRIPTOR)Ptr; - //DumpFullConfigurationDescriptor(ConfigDesc); + DumpFullConfigurationDescriptor(ConfigDesc); ASSERT(ConfigDesc->wTotalLength <= PAGE_SIZE); UsbDevice->Configs[i] = ExAllocatePoolWithTag(NonPagedPool, @@ -230,30 +344,13 @@ InitializeUsbDevice(PVOID BusContext, PUSB_DEVICE_HANDLE DeviceHandle) UsbDevice->ActiveConfig = UsbDevice->Configs[0]; UsbDevice->ActiveInterface = UsbDevice->Configs[0]->Interfaces[0]; - return STATUS_SUCCESS; - /* Set the device address */ - CtrlSetup.bmRequestType._BM.Recipient = BMREQUEST_TO_DEVICE; - CtrlSetup.bmRequestType._BM.Type = BMREQUEST_STANDARD; - CtrlSetup.bmRequestType._BM.Reserved = 0; - CtrlSetup.bmRequestType._BM.Dir = BMREQUEST_HOST_TO_DEVICE; - CtrlSetup.bRequest = USB_REQUEST_SET_ADDRESS; - CtrlSetup.wValue.W = UsbDevice->Address; - CtrlSetup.wIndex.W = 0; - CtrlSetup.wLength = 0; + UsbDevice->DeviceState = DEVICEINTIALIZED; - DPRINT1("Setting Address to %x\n", UsbDevice->Address); - - SubmitControlTransfer(&FdoDeviceExtension->hcd, - &CtrlSetup, - NULL, - 0, - NULL); - - PdoDeviceExtension->UsbDevices[i]->DeviceState = DEVICEINTIALIZED; return STATUS_SUCCESS; } +/* Return the descriptors that will fit. Descriptors were saved when the InitializeUsbDevice function was called */ NTSTATUS USB_BUSIFFN GetUsbDescriptors(PVOID BusContext, @@ -290,6 +387,7 @@ GetUsbDescriptors(PVOID BusContext, return STATUS_SUCCESS; } +/* Documented http://www.osronline.com/ddkx/buses/usbinterkr_1m7m.htm */ NTSTATUS USB_BUSIFFN RemoveUsbDevice(PVOID BusContext, PUSB_DEVICE_HANDLE DeviceHandle, ULONG Flags) @@ -347,15 +445,18 @@ RemoveUsbDevice(PVOID BusContext, PUSB_DEVICE_HANDLE DeviceHandle, ULONG Flags) return STATUS_SUCCESS; } +/* Documented at http://www.osronline.com/ddkx/buses/usbinterkr_01te.htm */ NTSTATUS USB_BUSIFFN RestoreUsbDevice(PVOID BusContext, PUSB_DEVICE_HANDLE OldDeviceHandle, PUSB_DEVICE_HANDLE NewDeviceHandle) { PUSB_DEVICE OldUsbDevice; PUSB_DEVICE NewUsbDevice; + PUSB_CONFIGURATION ConfigToDelete; + int i; DPRINT1("Ehci: RestoreUsbDevice %x, %x, %x\n", BusContext, OldDeviceHandle, NewDeviceHandle); - +ASSERT(FALSE); OldUsbDevice = DeviceHandleToUsbDevice(BusContext, OldDeviceHandle); NewUsbDevice = DeviceHandleToUsbDevice(BusContext, NewDeviceHandle); @@ -380,9 +481,6 @@ RestoreUsbDevice(PVOID BusContext, PUSB_DEVICE_HANDLE OldDeviceHandle, PUSB_DEVI if ((OldUsbDevice->DeviceDescriptor.idVendor == NewUsbDevice->DeviceDescriptor.idVendor) && (OldUsbDevice->DeviceDescriptor.idProduct == NewUsbDevice->DeviceDescriptor.idProduct)) { - PUSB_CONFIGURATION ConfigToDelete; - int i; - NewUsbDevice->DeviceState &= ~DEVICEBUSY; NewUsbDevice->DeviceState &= ~DEVICEREMOVED; @@ -407,6 +505,7 @@ RestoreUsbDevice(PVOID BusContext, PUSB_DEVICE_HANDLE OldDeviceHandle, PUSB_DEVI } } +/* FIXME: Research this */ NTSTATUS USB_BUSIFFN GetPortHackFlags(PVOID BusContext, PULONG Flags) @@ -497,6 +596,9 @@ GetControllerInformation(PVOID BusContext, DPRINT1("Ehci: GetControllerInformation called\n"); + if (!LengthReturned) + return STATUS_INVALID_PARAMETER; + ControllerInfo = ControllerInformationBuffer; if (ControllerInformationBufferLength < sizeof(USB_CONTROLLER_INFORMATION_0)) @@ -653,7 +755,7 @@ FlushTransfers(PVOID BusContext, PVOID DeviceHandle) DPRINT1("Invalid DeviceHandle or device not connected\n"); } - DPRINT1("FlushTransfers\n"); + DPRINT1("FlushTransfers not implemented.\n"); } VOID @@ -725,5 +827,6 @@ USB_BUSIFFN EnumLogEntry(PVOID BusContext, ULONG DriverTag, ULONG EnumTag, ULONG P1, ULONG P2) { DPRINT1("Ehci: EnumLogEntry called %x, %x, %x, %x\n", DriverTag, EnumTag, P1, P2); + return STATUS_SUCCESS; } From 35e6c5fe822bafea844aff8fa74ce7bc7c7c2f82 Mon Sep 17 00:00:00 2001 From: Michael Martin Date: Wed, 13 Apr 2011 04:48:50 +0000 Subject: [PATCH 139/317] [USB\USBEHCI] - Implement ExecuteTransfer to replace SubmitTransfer. - Start implentation for BulkTransfers and needed DMA. This needs much more work to be done correctly. We will get to it. - Implement URB_FUNCTION_CLASS_INTERFACE. - Add comments. Change 3 of 3. svn path=/trunk/; revision=51327 --- reactos/drivers/usb/usbehci/irp.c | 221 +++++++++---- reactos/drivers/usb/usbehci/pdo.c | 85 +++-- reactos/drivers/usb/usbehci/transfer.c | 416 +++++++++++++++++++++---- reactos/drivers/usb/usbehci/transfer.h | 31 +- 4 files changed, 592 insertions(+), 161 deletions(-) diff --git a/reactos/drivers/usb/usbehci/irp.c b/reactos/drivers/usb/usbehci/irp.c index fa77f1cdd48..605041fa502 100644 --- a/reactos/drivers/usb/usbehci/irp.c +++ b/reactos/drivers/usb/usbehci/irp.c @@ -70,13 +70,17 @@ QueueURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension, PIRP Irp) NTSTATUS HandleUrbRequest(PPDO_DEVICE_EXTENSION PdoDeviceExtension, PIRP Irp) { NTSTATUS Status = STATUS_UNSUCCESSFUL; + USB_DEFAULT_PIPE_SETUP_PACKET CtrlSetup; ULONG_PTR Information = 0; PIO_STACK_LOCATION Stack; PUSB_DEVICE UsbDevice = NULL; + PEHCI_HOST_CONTROLLER hcd; URB *Urb; PFDO_DEVICE_EXTENSION FdoDeviceExtension; FdoDeviceExtension = (PFDO_DEVICE_EXTENSION) PdoDeviceExtension->ControllerFdo->DeviceExtension; + hcd = &FdoDeviceExtension->hcd; + Stack = IoGetCurrentIrpStackLocation(Irp); ASSERT(Stack); @@ -105,16 +109,62 @@ NTSTATUS HandleUrbRequest(PPDO_DEVICE_EXTENSION PdoDeviceExtension, PIRP Irp) { case URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER: { - DPRINT1("URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER UsbDevice %x\n", UsbDevice); + PUSB_ENDPOINT_DESCRIPTOR EndPointDesc; + int i; + + for (i = 0; i < UsbDevice->ActiveInterface->InterfaceDescriptor.bNumEndpoints; i++) + { + EndPointDesc = (PUSB_ENDPOINT_DESCRIPTOR)&UsbDevice->ActiveInterface->EndPoints[i]->EndPointDescriptor; + DPRINT("EndPoint %d Handle %x\n", i, &UsbDevice->ActiveInterface->EndPoints[i]->EndPointDescriptor); + DPRINT("bmAttributes %x\n", EndPointDesc->bmAttributes); + DPRINT("EndPoint is transfer type %x\n", EndPointDesc->bmAttributes & 0x0F); + } + DPRINT("UsbDevice %x, Handle %x\n", UsbDevice, Urb->UrbBulkOrInterruptTransfer.PipeHandle); if (&UsbDevice->ActiveInterface->EndPoints[0]->EndPointDescriptor != Urb->UrbBulkOrInterruptTransfer.PipeHandle) { - DPRINT1("Invalid Parameter, Expected EndPointDescriptor of %x, but got %x\n", &UsbDevice->ActiveInterface->EndPoints[0]->EndPointDescriptor, Urb->UrbBulkOrInterruptTransfer.PipeHandle); - Status = STATUS_INVALID_PARAMETER; + DPRINT("HubDevice %x, UsbDevice %x\n", PdoDeviceExtension->UsbDevices[0], UsbDevice); + if (Urb->UrbBulkOrInterruptTransfer.TransferFlags & USBD_TRANSFER_DIRECTION_IN) + DPRINT1("USBD_TRANSFER_DIRECTION_IN\n"); + if (Urb->UrbBulkOrInterruptTransfer.TransferFlags & USBD_TRANSFER_DIRECTION_OUT) + DPRINT1("USBD_TRANSFER_DIRECTION_OUT\n"); + if (Urb->UrbBulkOrInterruptTransfer.TransferFlags & USBD_SHORT_TRANSFER_OK) + DPRINT1("USBD_SHORT_TRANSFER_OK\n"); + EndPointDesc = (PUSB_ENDPOINT_DESCRIPTOR)Urb->UrbBulkOrInterruptTransfer.PipeHandle; + DPRINT("EndPoint is transfer type %x\n", EndPointDesc->bmAttributes & 0x0F); + DPRINT("Endpoint Address %x\n", EndPointDesc->bEndpointAddress & 0x0F); + if ((EndPointDesc->bmAttributes & 0x0F) == USB_ENDPOINT_TYPE_BULK) + { + IoMarkIrpPending(Irp); + Status = STATUS_PENDING; + + ExecuteTransfer(FdoDeviceExtension->DeviceObject, + UsbDevice, + Urb->UrbBulkOrInterruptTransfer.PipeHandle, + NULL, + Urb->UrbBulkOrInterruptTransfer.TransferFlags, + Urb->UrbBulkOrInterruptTransfer.TransferBuffer ? + Urb->UrbBulkOrInterruptTransfer.TransferBuffer : + (PVOID)Urb->UrbBulkOrInterruptTransfer.TransferBufferMDL, + Urb->UrbBulkOrInterruptTransfer.TransferBuffer ? + Urb->UrbBulkOrInterruptTransfer.TransferBufferLength : 0, + Irp); + } + else + { + DPRINT1("Transfer Type not implemented yet!\n"); + /* FAKE IT */ + Status = STATUS_SUCCESS; + } + + break; + } + if (!Urb->UrbBulkOrInterruptTransfer.TransferBuffer) + { + DPRINT1("TransferBuffer is NULL!\n"); ASSERT(FALSE); break; } - ASSERT(Urb->UrbBulkOrInterruptTransfer.TransferBuffer != NULL); RtlZeroMemory(Urb->UrbBulkOrInterruptTransfer.TransferBuffer, Urb->UrbBulkOrInterruptTransfer.TransferBufferLength); if (UsbDevice == PdoDeviceExtension->UsbDevices[0]) @@ -122,9 +172,9 @@ NTSTATUS HandleUrbRequest(PPDO_DEVICE_EXTENSION PdoDeviceExtension, PIRP Irp) if (Urb->UrbBulkOrInterruptTransfer.TransferFlags & (USBD_TRANSFER_DIRECTION_IN | USBD_SHORT_TRANSFER_OK)) { LONG i; - for (i = 0; i < PdoDeviceExtension->NumberOfPorts; i++) + for (i = 0; i < hcd->ECHICaps.HCSParams.PortCount; i++) { - if (PdoDeviceExtension->Ports[i].PortChange) + if (hcd->Ports[i].PortChange) { DPRINT1("Inform hub driver that port %d has changed\n", i+1); ((PUCHAR)Urb->UrbBulkOrInterruptTransfer.TransferBuffer)[0] = 1 << ((i + 1) & 7); @@ -177,11 +227,8 @@ NTSTATUS HandleUrbRequest(PPDO_DEVICE_EXTENSION PdoDeviceExtension, PIRP Irp) } if (UsbDevice == PdoDeviceExtension->UsbDevices[0]) { - DPRINT1("ROOTHUB!\n"); BufPtr = (PUCHAR)Urb->UrbControlDescriptorRequest.TransferBuffer; - DPRINT1("Length %x\n", Urb->UrbControlDescriptorRequest.TransferBufferLength); - /* Copy the Device Descriptor */ RtlCopyMemory(BufPtr, &UsbDevice->DeviceDescriptor, sizeof(USB_DEVICE_DESCRIPTOR)); DumpDeviceDescriptor((PUSB_DEVICE_DESCRIPTOR)Urb->UrbControlDescriptorRequest.TransferBuffer); @@ -193,11 +240,17 @@ NTSTATUS HandleUrbRequest(PPDO_DEVICE_EXTENSION PdoDeviceExtension, PIRP Irp) BuildSetupPacketFromURB(&FdoDeviceExtension->hcd, Urb, &CtrlSetup); IoMarkIrpPending(Irp); Status = STATUS_PENDING; - SubmitControlTransfer(&FdoDeviceExtension->hcd, - &CtrlSetup, - Urb->UrbControlDescriptorRequest.TransferBuffer, - Urb->UrbControlDescriptorRequest.TransferBufferLength, - Irp); + ExecuteTransfer(FdoDeviceExtension->DeviceObject, + UsbDevice, + 0, + &CtrlSetup, + 0, + Urb->UrbControlDescriptorRequest.TransferBuffer ? + Urb->UrbControlDescriptorRequest.TransferBuffer : + (PVOID)Urb->UrbControlDescriptorRequest.TransferBufferMDL, + Urb->UrbControlDescriptorRequest.TransferBuffer ? + Urb->UrbControlDescriptorRequest.TransferBufferLength : 0, + Irp); break; } case USB_CONFIGURATION_DESCRIPTOR_TYPE: @@ -270,12 +323,17 @@ NTSTATUS HandleUrbRequest(PPDO_DEVICE_EXTENSION PdoDeviceExtension, PIRP Irp) BuildSetupPacketFromURB(&FdoDeviceExtension->hcd, Urb, &CtrlSetup); IoMarkIrpPending(Irp); Status = STATUS_PENDING; - - SubmitControlTransfer(&FdoDeviceExtension->hcd, - &CtrlSetup, - Urb->UrbControlDescriptorRequest.TransferBuffer, - Urb->UrbControlDescriptorRequest.TransferBufferLength, - Irp); + ExecuteTransfer(FdoDeviceExtension->DeviceObject, + UsbDevice, + 0, + &CtrlSetup, + 0, + Urb->UrbControlDescriptorRequest.TransferBuffer ? + Urb->UrbControlDescriptorRequest.TransferBuffer : + (PVOID)Urb->UrbControlDescriptorRequest.TransferBufferMDL, + Urb->UrbControlDescriptorRequest.TransferBuffer ? + Urb->UrbControlDescriptorRequest.TransferBufferLength : 0, + Irp); break; } default: @@ -290,17 +348,17 @@ NTSTATUS HandleUrbRequest(PPDO_DEVICE_EXTENSION PdoDeviceExtension, PIRP Irp) PUSBD_INTERFACE_INFORMATION InterfaceInfo; LONG iCount, pCount; - DPRINT1("Selecting Configuration\n"); - DPRINT1("ConfigurationHandle %x\n",Urb->UrbSelectConfiguration.ConfigurationHandle); + DPRINT("Selecting Configuration\n"); + DPRINT("ConfigurationHandle %x\n",Urb->UrbSelectConfiguration.ConfigurationHandle); + if (Urb->UrbSelectConfiguration.ConfigurationDescriptor) { Urb->UrbSelectConfiguration.ConfigurationHandle = &UsbDevice->ActiveConfig->ConfigurationDescriptor; - DPRINT1("ConfigHandle %x\n", Urb->UrbSelectConfiguration.ConfigurationHandle); - ASSERT(FALSE); + DPRINT("ConfigHandle %x\n", Urb->UrbSelectConfiguration.ConfigurationHandle); InterfaceInfo = &Urb->UrbSelectConfiguration.Interface; - DPRINT1("Length %x\n", InterfaceInfo->Length); - DPRINT1("NumberOfPipes %x\n", InterfaceInfo->NumberOfPipes); + DPRINT("Length %x\n", InterfaceInfo->Length); + DPRINT("NumberOfPipes %x\n", InterfaceInfo->NumberOfPipes); for (iCount = 0; iCount < Urb->UrbSelectConfiguration.ConfigurationDescriptor->bNumInterfaces; iCount++) { @@ -324,6 +382,29 @@ NTSTATUS HandleUrbRequest(PPDO_DEVICE_EXTENSION PdoDeviceExtension, PIRP Irp) InterfaceInfo = (PUSBD_INTERFACE_INFORMATION)((PUCHAR)InterfaceInfo + InterfaceInfo->Length); if (InterfaceInfo->Length == 0) break; } + + if (UsbDevice != PdoDeviceExtension->UsbDevices[0]) + { + DPRINT("Setting Configuration!\n"); + BuildSetupPacketFromURB(&FdoDeviceExtension->hcd, Urb, &CtrlSetup); + IoMarkIrpPending(Irp); + Status = STATUS_PENDING; + DPRINT1("Input Buffer %x, MDL %x\n", Urb->UrbBulkOrInterruptTransfer.TransferBuffer, (PVOID)Urb->UrbBulkOrInterruptTransfer.TransferBufferMDL); + + ExecuteTransfer(FdoDeviceExtension->DeviceObject, + UsbDevice, + 0, + &CtrlSetup, + 0, + NULL, + 0, + Irp); + break; + } + else + { + DPRINT1("Hub only has one configuration.\n"); + } } else { @@ -334,7 +415,6 @@ NTSTATUS HandleUrbRequest(PPDO_DEVICE_EXTENSION PdoDeviceExtension, PIRP Irp) } case URB_FUNCTION_SELECT_INTERFACE: { - USB_DEFAULT_PIPE_SETUP_PACKET CtrlSetup; PUSBD_INTERFACE_INFORMATION InterfaceInfo; int i; @@ -353,12 +433,14 @@ NTSTATUS HandleUrbRequest(PPDO_DEVICE_EXTENSION PdoDeviceExtension, PIRP Irp) BuildSetupPacketFromURB(&FdoDeviceExtension->hcd, Urb, &CtrlSetup); IoMarkIrpPending(Irp); Status = STATUS_PENDING; - - SubmitControlTransfer(&FdoDeviceExtension->hcd, - &CtrlSetup, - NULL, - 0, - Irp); + ExecuteTransfer(FdoDeviceExtension->DeviceObject, + UsbDevice, + 0, + &CtrlSetup, + 0, + NULL, + 0, + Irp); break; } case URB_FUNCTION_CLASS_DEVICE: @@ -425,7 +507,6 @@ NTSTATUS HandleUrbRequest(PPDO_DEVICE_EXTENSION PdoDeviceExtension, PIRP Irp) } else { - /* FIXME: Handle this correctly */ UsbHubDescr->bDescriptorLength = sizeof(USB_HUB_DESCRIPTOR); UsbHubDescr->bDescriptorType = 0x29; break; @@ -433,7 +514,7 @@ NTSTATUS HandleUrbRequest(PPDO_DEVICE_EXTENSION PdoDeviceExtension, PIRP Irp) DPRINT1("USB_DEVICE_CLASS_HUB request\n"); UsbHubDescr->bDescriptorLength = sizeof(USB_HUB_DESCRIPTOR); UsbHubDescr->bDescriptorType = 0x29; - UsbHubDescr->bNumberOfPorts = PdoDeviceExtension->NumberOfPorts; + UsbHubDescr->bNumberOfPorts = hcd->ECHICaps.HCSParams.PortCount; UsbHubDescr->wHubCharacteristics = 0x0012; UsbHubDescr->bPowerOnToPowerGood = 0x01; UsbHubDescr->bHubControlCurrent = 0x00; @@ -480,10 +561,10 @@ NTSTATUS HandleUrbRequest(PPDO_DEVICE_EXTENSION PdoDeviceExtension, PIRP Irp) DPRINT("USB_REQUEST_GET_STATUS Port %d\n", Urb->UrbControlVendorClassRequest.Index); ASSERT(Urb->UrbControlVendorClassRequest.TransferBuffer != 0); - DPRINT("PortStatus %x\n", PdoDeviceExtension->Ports[Urb->UrbControlVendorClassRequest.Index-1].PortStatus); - DPRINT("PortChange %x\n", PdoDeviceExtension->Ports[Urb->UrbControlVendorClassRequest.Index-1].PortChange); - ((PUSHORT)Urb->UrbControlVendorClassRequest.TransferBuffer)[0] = PdoDeviceExtension->Ports[Urb->UrbControlVendorClassRequest.Index-1].PortStatus; - ((PUSHORT)Urb->UrbControlVendorClassRequest.TransferBuffer)[1] = PdoDeviceExtension->Ports[Urb->UrbControlVendorClassRequest.Index-1].PortChange; + DPRINT("PortStatus %x\n", hcd->Ports[Urb->UrbControlVendorClassRequest.Index-1].PortStatus); + DPRINT("PortChange %x\n", hcd->Ports[Urb->UrbControlVendorClassRequest.Index-1].PortChange); + ((PUSHORT)Urb->UrbControlVendorClassRequest.TransferBuffer)[0] = hcd->Ports[Urb->UrbControlVendorClassRequest.Index-1].PortStatus; + ((PUSHORT)Urb->UrbControlVendorClassRequest.TransferBuffer)[1] = hcd->Ports[Urb->UrbControlVendorClassRequest.Index-1].PortChange; break; } case USB_REQUEST_CLEAR_FEATURE: @@ -492,12 +573,12 @@ NTSTATUS HandleUrbRequest(PPDO_DEVICE_EXTENSION PdoDeviceExtension, PIRP Irp) { case C_PORT_CONNECTION: DPRINT("C_PORT_CONNECTION\n"); - PdoDeviceExtension->Ports[Urb->UrbControlVendorClassRequest.Index-1].PortChange &= ~USB_PORT_STATUS_CONNECT; + hcd->Ports[Urb->UrbControlVendorClassRequest.Index-1].PortChange &= ~USB_PORT_STATUS_CONNECT; break; case C_PORT_RESET: DPRINT("C_PORT_RESET\n"); - PdoDeviceExtension->Ports[Urb->UrbControlVendorClassRequest.Index-1].PortChange &= ~USB_PORT_STATUS_RESET; - PdoDeviceExtension->Ports[Urb->UrbControlVendorClassRequest.Index-1].PortStatus |= USB_PORT_STATUS_ENABLE; + hcd->Ports[Urb->UrbControlVendorClassRequest.Index-1].PortChange &= ~USB_PORT_STATUS_RESET; + hcd->Ports[Urb->UrbControlVendorClassRequest.Index-1].PortStatus |= USB_PORT_STATUS_ENABLE; break; default: DPRINT("Unknown Value for Clear Feature %x \n", Urb->UrbControlVendorClassRequest.Value); @@ -507,46 +588,49 @@ NTSTATUS HandleUrbRequest(PPDO_DEVICE_EXTENSION PdoDeviceExtension, PIRP Irp) } case USB_REQUEST_SET_FEATURE: { - DPRINT("USB_REQUEST_SET_FEATURE Port %d, value %x\n", Urb->UrbControlVendorClassRequest.Index, + DPRINT1("USB_REQUEST_SET_FEATURE Port %d, value %x\n", Urb->UrbControlVendorClassRequest.Index, Urb->UrbControlVendorClassRequest.Value); switch(Urb->UrbControlVendorClassRequest.Value) { case PORT_RESET: { - DPRINT("Port Reset %d\n", Urb->UrbControlVendorClassRequest.Index-1); - PdoDeviceExtension->Ports[Urb->UrbControlVendorClassRequest.Index-1].PortChange |= USB_PORT_STATUS_RESET; - PdoDeviceExtension->Ports[Urb->UrbControlVendorClassRequest.Index-1].PortStatus &= ~USB_PORT_STATUS_ENABLE; - ResetPort(&FdoDeviceExtension->hcd, Urb->UrbControlVendorClassRequest.Index-1); + DPRINT1("Port Reset %d\n", Urb->UrbControlVendorClassRequest.Index-1); + hcd->Ports[Urb->UrbControlVendorClassRequest.Index-1].PortChange |= USB_PORT_STATUS_RESET; + hcd->Ports[Urb->UrbControlVendorClassRequest.Index-1].PortStatus &= ~USB_PORT_STATUS_ENABLE; + ResetPort(hcd, Urb->UrbControlVendorClassRequest.Index-1); break; } case PORT_ENABLE: { - DPRINT("PORT_ENABLE not implemented\n"); + DPRINT1("PORT_ENABLE not implemented\n"); break; } case PORT_POWER: { - DPRINT("PORT_POWER not implemented\n"); + DPRINT1("PORT_POWER not implemented\n"); break; } default: { - DPRINT("Unknown Set Feature!\n"); + DPRINT1("Unknown Set Feature!\n"); break; } } - if (!(PdoDeviceExtension->Ports[Urb->UrbControlVendorClassRequest.Index-1].PortStatus & 0x8000)) + if (!(hcd->Ports[Urb->UrbControlVendorClassRequest.Index-1].PortStatus & 0x8000)) + { + DPRINT1("------ PortStatus %x\n", hcd->Ports[Urb->UrbControlVendorClassRequest.Index-1].PortStatus); + DPRINT1("Calling CompletePendingURBRequest\n"); + CompletePendingURBRequest(PdoDeviceExtension); - + } break; } case USB_REQUEST_SET_ADDRESS: { DPRINT1("USB_REQUEST_SET_ADDRESS\n"); - ASSERT(FALSE); break; } case USB_REQUEST_GET_DESCRIPTOR: @@ -606,7 +690,35 @@ NTSTATUS HandleUrbRequest(PPDO_DEVICE_EXTENSION PdoDeviceExtension, PIRP Irp) } case URB_FUNCTION_CLASS_INTERFACE: { + USB_DEFAULT_PIPE_SETUP_PACKET CtrlSetup; DPRINT1("URB_FUNCTION_CLASS_INTERFACE\n"); + DPRINT1("TransferFlags %x\n", Urb->UrbControlVendorClassRequest.TransferFlags); + DPRINT1("TransferBufferLength %x\n", Urb->UrbControlVendorClassRequest.TransferBufferLength); + DPRINT1("TransferBuffer %x\n", Urb->UrbControlVendorClassRequest.TransferBuffer); + DPRINT1("TransferBufferMDL %x\n", Urb->UrbControlVendorClassRequest.TransferBufferMDL); + DPRINT1("RequestTypeReservedBits %x\n", Urb->UrbControlVendorClassRequest.RequestTypeReservedBits); + DPRINT1("Request %x\n", Urb->UrbControlVendorClassRequest.Request); + DPRINT1("Value %x\n", Urb->UrbControlVendorClassRequest.Value); + DPRINT1("Index %x\n", Urb->UrbControlVendorClassRequest.Index); + CtrlSetup.bmRequestType.B = 0xa1; //FIXME: Const. + CtrlSetup.bRequest = Urb->UrbControlVendorClassRequest.Request; + CtrlSetup.wValue.W = Urb->UrbControlVendorClassRequest.Value; + CtrlSetup.wIndex.W = Urb->UrbControlVendorClassRequest.Index; + CtrlSetup.wLength = Urb->UrbControlVendorClassRequest.TransferBufferLength; + + IoMarkIrpPending(Irp); + Status = STATUS_PENDING; + ExecuteTransfer(FdoDeviceExtension->DeviceObject, + UsbDevice, + 0, + &CtrlSetup, + 0, + Urb->UrbControlVendorClassRequest.TransferBuffer ? + Urb->UrbControlVendorClassRequest.TransferBuffer : + (PVOID)Urb->UrbControlVendorClassRequest.TransferBufferMDL, + Urb->UrbControlVendorClassRequest.TransferBuffer ? + Urb->UrbControlVendorClassRequest.TransferBufferLength : 0, + Irp); break; } default: @@ -632,8 +744,9 @@ CompletePendingURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension) if (IsListEmpty(&DeviceExtension->IrpQueue)) { - DPRINT1("There should have been one SCE request pending\n"); + DPRINT1("There should have been one SCE request pending. Did the usbhub driver load?\n"); KeReleaseSpinLock(&DeviceExtension->IrpQueueLock, oldIrql); + ASSERT(FALSE); return; } NextIrp = RemoveHeadList(&DeviceExtension->IrpQueue); diff --git a/reactos/drivers/usb/usbehci/pdo.c b/reactos/drivers/usb/usbehci/pdo.c index 0254fcc8204..0181628c952 100644 --- a/reactos/drivers/usb/usbehci/pdo.c +++ b/reactos/drivers/usb/usbehci/pdo.c @@ -47,12 +47,8 @@ const UCHAR ROOTHUB2_CONFIGURATION_DESCRIPTOR [] = 0x01, /* bNumInterfaces; (1) */ 0x23, /* bConfigurationValue; */ 0x00, /* iConfiguration; */ - 0x40, /* bmAttributes; - Bit 7: must be set, - 6: Self-powered, - 5: Remote wakeup, - 4..0: reserved */ - 0x00 /* MaxPower; */ + 0x40, /* bmAttributes; */ + 0x00 /* MaxPower; */ }; const UCHAR ROOTHUB2_INTERFACE_DESCRIPTOR [] = @@ -66,7 +62,7 @@ const UCHAR ROOTHUB2_INTERFACE_DESCRIPTOR [] = 0x09, /* bInterfaceClass; HUB_CLASSCODE */ 0x01, /* bInterfaceSubClass; */ 0x00, /* bInterfaceProtocol: */ - 0x00 /* iInterface; */ + 0x00 /* iInterface; */ }; const UCHAR ROOTHUB2_ENDPOINT_DESCRIPTOR [] = @@ -88,12 +84,14 @@ PdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp) PIO_STACK_LOCATION Stack = NULL; NTSTATUS Status = STATUS_UNSUCCESSFUL; ULONG_PTR Information = 0; + PEHCI_HOST_CONTROLLER hcd; PdoDeviceExtension = (PPDO_DEVICE_EXTENSION) DeviceObject->DeviceExtension; FdoDeviceExtension = (PFDO_DEVICE_EXTENSION) PdoDeviceExtension->ControllerFdo->DeviceExtension; ASSERT(PdoDeviceExtension->Common.IsFdo == FALSE); + hcd = &FdoDeviceExtension->hcd; Stack = IoGetCurrentIrpStackLocation(Irp); switch(Stack->Parameters.DeviceIoControl.IoControlCode) @@ -108,13 +106,18 @@ PdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp) UsbDevice = Urb->UrbHeader.UsbdDeviceHandle; + /* If there was no device passed then this URB is for the RootHub */ if (UsbDevice == NULL) UsbDevice = PdoDeviceExtension->UsbDevices[0]; + /* Check if it is a Status Change Endpoint (SCE). The Hub Driver sends this request and miniports mark the IRP pending + if there is no changes on any of the ports. When the DPC of miniport routine detects changes this IRP will be completed. + Based on XEN PV Usb Drivers */ + if ((Urb->UrbHeader.Function == URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER) && (UsbDevice == PdoDeviceExtension->UsbDevices[0])) { - DPRINT1("URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER on SCE\n"); + DPRINT("URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER on SCE\n"); if (Urb->UrbBulkOrInterruptTransfer.PipeHandle != &UsbDevice->ActiveInterface->EndPoints[0]->EndPointDescriptor) { DPRINT1("PipeHandle doesnt match SCE PipeHandle\n"); @@ -123,12 +126,23 @@ PdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp) /* Queue the Irp first */ QueueURBRequest(PdoDeviceExtension, Irp); - /* Check if there is any connected devices */ - for (i = 0; i < PdoDeviceExtension->NumberOfPorts; i++) + /* Check for port changes */ + if (EnumControllerPorts(hcd) == FALSE) { - if (PdoDeviceExtension->Ports[i].PortChange == 0x01) + DPRINT("No port change\n"); + Status = STATUS_PENDING; + IoMarkIrpPending(Irp); + break; + } + + /* If we reached this point then port status has changed, so check + which port */ + for (i = 0; i < hcd->ECHICaps.HCSParams.PortCount; i++) + { + if (hcd->Ports[i].PortChange == 0x01) { - DPRINT1("Inform hub driver that port %d has changed\n", i+1); + DPRINT1("On SCE request: Inform hub driver that port %d has changed\n", i+1); + ASSERT(FALSE); ((PUCHAR)Urb->UrbBulkOrInterruptTransfer.TransferBuffer)[0] = 1 << ((i + 1) & 7); Information = 0; Status = STATUS_SUCCESS; @@ -143,15 +157,11 @@ PdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp) } } if (Status == STATUS_SUCCESS) break; - DPRINT1("Queueing IRP\n"); + IoMarkIrpPending(Irp); Status = STATUS_PENDING; break; } - else - { - DPRINT1("IOCTL_INTERNAL_USB_SUBMIT_URB send to device %x\n", UsbDevice); - } Status = HandleUrbRequest(PdoDeviceExtension, Irp); @@ -186,7 +196,7 @@ PdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp) } case IOCTL_INTERNAL_USB_GET_DEVICE_HANDLE: { - DPRINT("Ehci: IOCTL_INTERNAL_USB_GET_DEVICE_HANDLE %x\n", Stack->Parameters.Others.Argument2); + DPRINT1("Ehci: IOCTL_INTERNAL_USB_GET_DEVICE_HANDLE %x\n", Stack->Parameters.Others.Argument2); if (Stack->Parameters.Others.Argument1) { /* Return the root hubs devicehandle */ @@ -202,12 +212,12 @@ PdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp) } case IOCTL_INTERNAL_USB_GET_HUB_COUNT: { - DPRINT("Ehci: IOCTL_INTERNAL_USB_GET_HUB_COUNT %x\n", IOCTL_INTERNAL_USB_GET_HUB_COUNT); + DPRINT1("Ehci: IOCTL_INTERNAL_USB_GET_HUB_COUNT %x\n", IOCTL_INTERNAL_USB_GET_HUB_COUNT); ASSERT(Stack->Parameters.Others.Argument1 != NULL); if (Stack->Parameters.Others.Argument1) { - /* FIXME: Determine the number of hubs between the usb device and root hub */ - DPRINT1("RootHubCount %x\n", *(PULONG)Stack->Parameters.Others.Argument1); + /* FIXME: Determine the number of hubs between the usb device and root hub. + For now we have at least one. */ *(PULONG)Stack->Parameters.Others.Argument1 = 1; } Status = STATUS_SUCCESS; @@ -235,15 +245,14 @@ PdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp) } case IOCTL_INTERNAL_USB_GET_ROOTHUB_PDO: { - DPRINT("Ehci: IOCTL_INTERNAL_USB_GET_ROOTHUB_PDO Arg1 %x, Arg2 %x\n", Stack->Parameters.Others.Argument1, Stack->Parameters.Others.Argument2); + DPRINT("IOCTL_INTERNAL_USB_GET_ROOTHUB_PDO\n"); + /* DDK documents that both the PDO and FDO are returned. However, while writing the UsbHub driver it was determine + that this was not the case. Windows usbehci driver gives the Pdo in both Arguments. Which makes sense as upper level + drivers should not be communicating with FDO. */ if (Stack->Parameters.Others.Argument1) *(PVOID *)Stack->Parameters.Others.Argument1 = FdoDeviceExtension->Pdo; - - /* Windows usbehci driver gives the Pdo in both Arguments. */ if (Stack->Parameters.Others.Argument2) - //*(PVOID *)Stack->Parameters.Others.Argument2 = IoGetAttachedDeviceReference(FdoDeviceExtension->DeviceObject); *(PVOID *)Stack->Parameters.Others.Argument2 = FdoDeviceExtension->Pdo; - Information = 0; Status = STATUS_SUCCESS; break; @@ -254,8 +263,6 @@ PdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp) DPRINT1("Ehci: IOCTL_INTERNAL_USB_SUBMIT_IDLE_NOTIFICATION\n"); /* FIXME: Set Callback for safe power down */ CallBackInfo = Stack->Parameters.DeviceIoControl.Type3InputBuffer; - DPRINT1("IdleCallback %x\n", CallBackInfo->IdleCallback); - DPRINT1("IdleContext %x\n", CallBackInfo->IdleContext); PdoDeviceExtension->IdleCallback = CallBackInfo->IdleCallback; PdoDeviceExtension->IdleContext = CallBackInfo->IdleContext; @@ -300,6 +307,7 @@ PdoQueryId(PDEVICE_OBJECT DeviceObject, PIRP Irp, ULONG_PTR* Information) } case BusQueryHardwareIDs: { + /* FIXME: Build from Device Vendor and Device ID */ Index += swprintf(&Buffer[Index], L"USB\\ROOT_HUB20&VID8086&PID265C&REV0000") + 1; Index += swprintf(&Buffer[Index], L"USB\\ROOT_HUB20&VID8086&PID265C") + 1; Index += swprintf(&Buffer[Index], L"USB\\ROOT_HUB20") + 1; @@ -388,7 +396,6 @@ PdoDispatchPnp( PPDO_DEVICE_EXTENSION PdoDeviceExtension; PFDO_DEVICE_EXTENSION FdoDeviceExtension; UNICODE_STRING InterfaceSymLinkName; - LONG i; DPRINT1("Ehci: PDO StartDevice\n"); PdoDeviceExtension = (PPDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension; @@ -397,15 +404,6 @@ PdoDispatchPnp( /* Create the root hub */ RootHubDevice = InternalCreateUsbDevice(1, 0, NULL, TRUE); - for (i = 0; i < PdoDeviceExtension->NumberOfPorts; i++) - { - PdoDeviceExtension->Ports[i].PortStatus = 0x8000; - PdoDeviceExtension->Ports[i].PortChange = 0; - - if (!FdoDeviceExtension->hcd.ECHICaps.HCSParams.PortPowerControl) - PdoDeviceExtension->Ports[i].PortStatus |= USB_PORT_STATUS_POWER; - } - RtlCopyMemory(&RootHubDevice->DeviceDescriptor, ROOTHUB2_DEVICE_DESCRIPTOR, sizeof(ROOTHUB2_DEVICE_DESCRIPTOR)); @@ -413,7 +411,8 @@ PdoDispatchPnp( RootHubDevice->DeviceDescriptor.idVendor = FdoDeviceExtension->VendorId; RootHubDevice->DeviceDescriptor.idProduct = FdoDeviceExtension->DeviceId; - /* FIXME: Do something better below */ + /* Here config, interfaces and descriptors are stored. This was duplicated from XEN PV Usb Drivers implementation. + Not sure that it is really needed as the information can be queueried from the device. */ RootHubDevice->Configs = ExAllocatePoolWithTag(NonPagedPool, sizeof(PVOID) * RootHubDevice->DeviceDescriptor.bNumConfigurations, @@ -483,11 +482,11 @@ PdoDispatchPnp( PPDO_DEVICE_EXTENSION PdoDeviceExtension; PdoDeviceExtension = (PPDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension; - DPRINT1("BusRelations!!!!!\n"); + DPRINT("BusRelations!!!!!\n"); /* The hub driver has created the new device object and reported to pnp, as a result the pnp manager - has resent this IRP and type, so leave the next SCE request pending until a new device arrives. - Is there a better way to do this */ + has sent this IRP and type, so leave the next SCE request pending until a new device arrives. + Is there a better way to do this? */ ExAcquireFastMutex(&PdoDeviceExtension->ListLock); PdoDeviceExtension->HaltQueue = TRUE; ExReleaseFastMutex(&PdoDeviceExtension->ListLock); @@ -531,7 +530,7 @@ PdoDispatchPnp( DeviceCapabilities->UINumber = 0; DeviceCapabilities->DeviceD2 = 1; - /* FIXME */ + /* FIXME: Verify these settings are correct */ DeviceCapabilities->HardwareDisabled = FALSE; //DeviceCapabilities->NoDisplayInUI = FALSE; DeviceCapabilities->DeviceState[0] = PowerDeviceD0; diff --git a/reactos/drivers/usb/usbehci/transfer.c b/reactos/drivers/usb/usbehci/transfer.c index d129b0073cf..0f94a133875 100644 --- a/reactos/drivers/usb/usbehci/transfer.c +++ b/reactos/drivers/usb/usbehci/transfer.c @@ -7,9 +7,20 @@ * Michael Martin (michael.martin@reactos.org) */ +/* All QueueHeads, Descriptors and pipe setup packets used by control transfers are allocated from common buffer. + The routines in physmem manages this buffer. Each allocation is aligned to 32bits, which is requirement of USB 2.0. */ + #include "transfer.h" #include + +typedef struct _MAPREGISTERCALLBACKINFO +{ + PVOID MapRegisterBase; + KEVENT Event; +}MAPREGISTERCALLBACKINFO, *PMAPREGISTERCALLBACKINFO; + +/* Fills CtrlSetup parameter with values based on Urb */ VOID BuildSetupPacketFromURB(PEHCI_HOST_CONTROLLER hcd, PURB Urb, PUSB_DEFAULT_PIPE_SETUP_PACKET CtrlSetup) { @@ -76,6 +87,7 @@ BuildSetupPacketFromURB(PEHCI_HOST_CONTROLLER hcd, PURB Urb, PUSB_DEFAULT_PIPE_S /* SET CONFIG */ case URB_FUNCTION_SELECT_CONFIGURATION: + DPRINT1("Bulding data for Select Config\n"); CtrlSetup->bRequest = USB_REQUEST_SET_CONFIGURATION; CtrlSetup->wValue.W = Urb->UrbSelectConfiguration.ConfigurationDescriptor->bConfigurationValue; CtrlSetup->wIndex.W = 0; @@ -131,18 +143,86 @@ BuildSetupPacketFromURB(PEHCI_HOST_CONTROLLER hcd, PURB Urb, PUSB_DEFAULT_PIPE_S } } -BOOLEAN -SubmitControlTransfer(PEHCI_HOST_CONTROLLER hcd, - PUSB_DEFAULT_PIPE_SETUP_PACKET CtrlSetup, - PVOID TransferBuffer, - ULONG TransferBufferLength, - PIRP IrpToComplete) +/* Build a Bulk Transfer with a max transfer of 3 descriptors which each has 5 pointers to one page of memory, paged align of course */ +PQUEUE_HEAD +BuildBulkTransfer(PEHCI_HOST_CONTROLLER hcd, + ULONG DeviceAddress, + USBD_PIPE_HANDLE PipeHandle, + UCHAR PidDirection, + PMDL pMdl, + BOOLEAN FreeMdl) +{ + PQUEUE_HEAD QueueHead; + PQUEUE_TRANSFER_DESCRIPTOR Descriptor[3]; + ULONG MdlByteCount = MmGetMdlByteCount(pMdl); + ULONG NeededDescriptorCount = 1; + int i; + + QueueHead = CreateQueueHead(hcd); + QueueHead->EndPointCharacteristics.DeviceAddress = DeviceAddress; + + if (PipeHandle) + { + QueueHead->EndPointCharacteristics.EndPointNumber = ((PUSB_ENDPOINT_DESCRIPTOR)PipeHandle)->bEndpointAddress & 0x0F; + QueueHead->EndPointCharacteristics.MaximumPacketLength = ((PUSB_ENDPOINT_DESCRIPTOR)PipeHandle)->wMaxPacketSize; + } + + QueueHead->FreeMdl = FreeMdl; + QueueHead->Mdl = pMdl; + + /* FIXME: This is totally screwed */ + /* Calculate how many descriptors would be needed to transfer this buffer */ + if (pMdl) + { + if (MdlByteCount < (PAGE_SIZE * 5)) + NeededDescriptorCount = 1; + else if (MdlByteCount < (PAGE_SIZE * 10)) + NeededDescriptorCount = 2; + else if (MdlByteCount < (PAGE_SIZE * 15)) + NeededDescriptorCount = 3; + else + ASSERT(FALSE); + } + /* Limiter Transfers to PAGE_SIZE * 5 * 3, Three Descriptors */ + + QueueHead->NumberOfTransferDescriptors = NeededDescriptorCount; + for (i=0; i< NeededDescriptorCount;i++) + { + Descriptor[i] = CreateDescriptor(hcd, + PidDirection, + 0); + Descriptor[i]->AlternateNextPointer = QueueHead->DeadDescriptor->PhysicalAddr; + + if (i > 0) + { + Descriptor[i-1]->NextDescriptor = Descriptor[i]; + Descriptor[i]->PreviousDescriptor = Descriptor[i-1]; + Descriptor[i-1]->NextPointer = Descriptor[i]->PhysicalAddr; + } + } + + Descriptor[0]->Token.Bits.InterruptOnComplete = TRUE; + + /* Save the first descriptor in the QueueHead */ + QueueHead->FirstTransferDescriptor = Descriptor[0]; + QueueHead->NextPointer = Descriptor[0]->PhysicalAddr; + + return QueueHead; +} + + +/* Builds a QueueHead with 2 to 3 descriptors needed for control transfer + 2 descriptors used for and control request that doesnt return data, such as SetAddress */ +PQUEUE_HEAD +BuildControlTransfer(PEHCI_HOST_CONTROLLER hcd, + ULONG DeviceAddress, + USBD_PIPE_HANDLE PipeHandle, + PUSB_DEFAULT_PIPE_SETUP_PACKET CtrlSetup, + PMDL pMdl, + BOOLEAN FreeMdl) { PQUEUE_HEAD QueueHead; PQUEUE_TRANSFER_DESCRIPTOR Descriptor[3]; - ULONG MdlPhysicalAddr; - PKEVENT Event = NULL; - PMDL pMdl = NULL; PUSB_DEFAULT_PIPE_SETUP_PACKET CtrlSetupVA, CtrlPhysicalPA; CtrlSetupVA = (PUSB_DEFAULT_PIPE_SETUP_PACKET)AllocateMemory(hcd, @@ -150,57 +230,45 @@ SubmitControlTransfer(PEHCI_HOST_CONTROLLER hcd, (ULONG*)&CtrlPhysicalPA); RtlCopyMemory(CtrlSetupVA, CtrlSetup, sizeof(USB_DEFAULT_PIPE_SETUP_PACKET)); - /* If no Irp then wait on completion */ - if (IrpToComplete == NULL) - { - Event = ExAllocatePool(NonPagedPool, sizeof(KEVENT)); - KeInitializeEvent(Event, NotificationEvent, FALSE); - } - - if (TransferBuffer) - { - /* Allocate Mdl for Buffer */ - pMdl = IoAllocateMdl(TransferBuffer, - TransferBufferLength, - FALSE, - FALSE, - NULL); - - /* Lock Physical Pages */ - MmBuildMdlForNonPagedPool(pMdl); - //MmProbeAndLockPages(pMdl, KernelMode, IoReadAccess); - - MdlPhysicalAddr = MmGetPhysicalAddress((PVOID)TransferBuffer).LowPart; - } QueueHead = CreateQueueHead(hcd); + QueueHead->EndPointCharacteristics.DeviceAddress = DeviceAddress; + if (PipeHandle) + QueueHead->EndPointCharacteristics.EndPointNumber = ((PUSB_ENDPOINT_DESCRIPTOR)PipeHandle)->bEndpointAddress & 0x0F; + + QueueHead->Token.Bits.DataToggle = TRUE; + QueueHead->FreeMdl = FreeMdl; + QueueHead->Mdl = pMdl; Descriptor[0] = CreateDescriptor(hcd, PID_CODE_SETUP_TOKEN, sizeof(USB_DEFAULT_PIPE_SETUP_PACKET)); - Descriptor[0]->Token.Bits.InterruptOnComplete = FALSE; Descriptor[0]->Token.Bits.DataToggle = FALSE; - /* Save the first descriptor */ - QueueHead->TransferDescriptor = Descriptor[0]; + QueueHead->FirstTransferDescriptor = Descriptor[0]; - if (TransferBuffer) + if (pMdl) { Descriptor[1] = CreateDescriptor(hcd, PID_CODE_IN_TOKEN, - TransferBufferLength); + MmGetMdlByteCount(pMdl)); + + Descriptor[2] = CreateDescriptor(hcd, + PID_CODE_OUT_TOKEN, + 0); + } + else + { + Descriptor[2] = CreateDescriptor(hcd, + PID_CODE_IN_TOKEN, + 0); } - Descriptor[2] = CreateDescriptor(hcd, - PID_CODE_OUT_TOKEN, - 0); - - Descriptor[1]->Token.Bits.InterruptOnComplete = FALSE; + Descriptor[2]->Token.Bits.InterruptOnComplete = TRUE; /* Link the descriptors */ - - if (TransferBuffer) + if (pMdl) { Descriptor[0]->NextDescriptor = Descriptor[1]; Descriptor[1]->NextDescriptor = Descriptor[2]; @@ -213,35 +281,267 @@ SubmitControlTransfer(PEHCI_HOST_CONTROLLER hcd, Descriptor[2]->PreviousDescriptor = Descriptor[0]; } - /* Assign the descritors buffers */ + /* Assign the descriptor buffers */ Descriptor[0]->BufferPointer[0] = (ULONG)CtrlPhysicalPA; - - if (TransferBuffer) - { - Descriptor[1]->BufferPointer[0] = MdlPhysicalAddr; + Descriptor[0]->BufferPointerVA[0] = (ULONG)CtrlSetupVA; + + if (pMdl) + { Descriptor[0]->NextPointer = Descriptor[1]->PhysicalAddr; - Descriptor[1]->NextPointer = Descriptor[2]->PhysicalAddr; + Descriptor[0]->AlternateNextPointer = Descriptor[2]->PhysicalAddr; + Descriptor[1]->NextPointer = Descriptor[2]->PhysicalAddr; + Descriptor[1]->AlternateNextPointer = Descriptor[2]->PhysicalAddr; } else { Descriptor[0]->NextPointer = Descriptor[2]->PhysicalAddr; + Descriptor[0]->AlternateNextPointer = Descriptor[2]->PhysicalAddr; } QueueHead->NextPointer = Descriptor[0]->PhysicalAddr; + if (pMdl) + QueueHead->NumberOfTransferDescriptors = 3; + else + QueueHead->NumberOfTransferDescriptors = 2; + return QueueHead; +} - QueueHead->IrpToComplete = IrpToComplete; - QueueHead->MdlToFree = pMdl; - QueueHead->Event = Event; - /* Link in the QueueHead */ - LinkQueueHead(hcd, QueueHead); +IO_ALLOCATION_ACTION NTAPI MapRegisterCallBack(PDEVICE_OBJECT DeviceObject, + PIRP Irp, + PVOID MapRegisterBase, + PVOID Context) +{ + PMAPREGISTERCALLBACKINFO CallBackInfo = (PMAPREGISTERCALLBACKINFO)Context; + + CallBackInfo->MapRegisterBase = MapRegisterBase; + + KeSetEvent(&CallBackInfo->Event, IO_NO_INCREMENT, FALSE); + return KeepObject; +} + +NTSTATUS +ExecuteTransfer(PDEVICE_OBJECT DeviceObject, + PUSB_DEVICE UsbDevice, + USBD_PIPE_HANDLE PipeHandle, + PUSB_DEFAULT_PIPE_SETUP_PACKET CtrlSetup, + ULONG TransferFlags, + PVOID TransferBufferOrMdl, + ULONG TransferBufferLength, + PIRP IrpToComplete) +{ + PUSB_ENDPOINT_DESCRIPTOR EndPointDesc = NULL; + PEHCI_HOST_CONTROLLER hcd; + PQUEUE_HEAD QueueHead; + PKEVENT CompleteEvent = NULL; + PMAPREGISTERCALLBACKINFO CallBackInfo; + LARGE_INTEGER TimeOut; + PMDL pMdl = NULL; + BOOLEAN FreeMdl = FALSE; + PVOID VirtualAddressOfMdl; + ULONG NumberOfMapRegisters; + KIRQL OldIrql; + NTSTATUS Status = STATUS_SUCCESS; + UCHAR EndPointType, PidDirection; + BOOLEAN IsReadOp = TRUE; + ULONG TransferBtyesOffset, CurrentTransferBytes; + PQUEUE_TRANSFER_DESCRIPTOR Descriptor; + PHYSICAL_ADDRESS PhysicalAddr; + int i,j; + + hcd = &((PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->hcd; + + /* If no Irp then we will need to wait on completion */ if (IrpToComplete == NULL) { - DPRINT1("Waiting For Completion %x!\n", Event); - KeWaitForSingleObject(Event, Suspended, KernelMode, FALSE, NULL); - ExFreePool(Event); + CompleteEvent = ExAllocatePool(NonPagedPool, sizeof(KEVENT)); + KeInitializeEvent(CompleteEvent, NotificationEvent, FALSE); } - return TRUE; + CallBackInfo = ExAllocatePool(NonPagedPool, sizeof(MAPREGISTERCALLBACKINFO)); + CallBackInfo->MapRegisterBase = 0; + + KeInitializeEvent(&CallBackInfo->Event, NotificationEvent, FALSE); + + /* Determine EndPoint Type */ + if (!PipeHandle) + { + EndPointType = USB_ENDPOINT_TYPE_CONTROL; + } + else + { + EndPointDesc = (PUSB_ENDPOINT_DESCRIPTOR)PipeHandle; + EndPointType = EndPointDesc->bmAttributes & 0x0F; + } + + if (TransferBufferOrMdl) + { + /* Create MDL for Buffer */ + if (TransferBufferLength) + { + pMdl = IoAllocateMdl(TransferBufferOrMdl, + TransferBufferLength, + FALSE, + FALSE, + NULL); + /* UEHCI created the MDL so it needs to free it */ + FreeMdl = TRUE; + } + else + { + pMdl = TransferBufferOrMdl; + } + MmBuildMdlForNonPagedPool(pMdl); + } + + switch (EndPointType) + { + case USB_ENDPOINT_TYPE_CONTROL: + { + QueueHead = BuildControlTransfer(hcd, + UsbDevice->Address, + PipeHandle, + CtrlSetup, + pMdl, + FreeMdl); + IsReadOp = TRUE; + break; + } + case USB_ENDPOINT_TYPE_BULK: + { + PidDirection = EndPointDesc->bEndpointAddress >> 7; + if (PidDirection) + IsReadOp = FALSE; + + QueueHead = BuildBulkTransfer(hcd, + UsbDevice->Address, + PipeHandle, + PidDirection, + pMdl, + FreeMdl); + + break; + } + case USB_ENDPOINT_TYPE_INTERRUPT: + { + DPRINT1("Interrupt Endpoints not implemented yet!\n"); + break; + } + case USB_ENDPOINT_TYPE_ISOCHRONOUS: + { + DPRINT1("Isochronous Endpoints not implemented yet!\n"); + break; + } + default: + { + DPRINT1("Unknown Endpoint type!!\n"); + break; + } + } + + QueueHead->IrpToComplete = IrpToComplete; + QueueHead->Event = CompleteEvent; + + if (!pMdl) + { + ASSERT(QueueHead->NumberOfTransferDescriptors == 2); + LinkQueueHead(hcd, QueueHead); + if (IrpToComplete == NULL) + { + DPRINT1("Waiting For Completion %x!\n", CompleteEvent); + TimeOut.QuadPart = -10000000; + KeWaitForSingleObject(CompleteEvent, Suspended, KernelMode, FALSE, NULL);//&TimeOut); + DPRINT1("Request Completed\n"); + ExFreePool(CompleteEvent); + } + return Status; + } + //ASSERT(FALSE); + + KeFlushIoBuffers(pMdl, IsReadOp, TRUE); + NumberOfMapRegisters = 15; + + KeRaiseIrql(DISPATCH_LEVEL, &OldIrql); + hcd->pDmaAdapter->DmaOperations->AllocateAdapterChannel(hcd->pDmaAdapter, + ((PPDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->ControllerFdo, + NumberOfMapRegisters, + MapRegisterCallBack, + (PVOID)CallBackInfo); + KeLowerIrql(OldIrql); + DPRINT1("Waiting for AdapterChannel\n"); + KeWaitForSingleObject(&CallBackInfo->Event, Suspended, KernelMode, FALSE, NULL); + DPRINT1("Dma controller ready!\n"); + DPRINT1("Getting address for MDL %x\n", pMdl); + + VirtualAddressOfMdl = MmGetMdlVirtualAddress(pMdl); + + TransferBtyesOffset = 0; + while (TransferBtyesOffset < MmGetMdlByteCount(pMdl)) + { + CurrentTransferBytes = MmGetMdlByteCount(pMdl); + Descriptor = QueueHead->FirstTransferDescriptor; + if ((Descriptor->Token.Bits.PIDCode == PID_CODE_SETUP_TOKEN) && (QueueHead->NumberOfTransferDescriptors == 3)) + { + DPRINT1("QueueHead is for endpoint 0\n"); + DPRINT1("MapRegisterBase %x\n", CallBackInfo->MapRegisterBase); + DPRINT1("VirtualAddressOfMdl %x, TransferBytesOffset %x\n", VirtualAddressOfMdl, TransferBtyesOffset); + Descriptor = Descriptor->NextDescriptor; + PhysicalAddr = hcd->pDmaAdapter->DmaOperations->MapTransfer(hcd->pDmaAdapter, + pMdl, + CallBackInfo->MapRegisterBase, + (PVOID)((ULONG_PTR)VirtualAddressOfMdl + TransferBtyesOffset), + &CurrentTransferBytes, + !IsReadOp); + DPRINT1("BufferPointer[0] = %x\n", PhysicalAddr.LowPart); + Descriptor->BufferPointer[0] = PhysicalAddr.LowPart; + DPRINT1("CurrentTransferBytes %x\n", CurrentTransferBytes); + TransferBtyesOffset += CurrentTransferBytes; + LinkQueueHead(hcd, QueueHead); + break; + } + DPRINT1("PID_CODE_SETUP_TOKEN %x, PidDirection %x, NumDesc %x\n", PID_CODE_SETUP_TOKEN, PidDirection, QueueHead->NumberOfTransferDescriptors); + for (i=0; iNumberOfTransferDescriptors; i++) + { + if (Descriptor->Token.Bits.PIDCode != PID_CODE_SETUP_TOKEN) + { + for (j=0; j<5; j++) + { + PhysicalAddr = hcd->pDmaAdapter->DmaOperations->MapTransfer(hcd->pDmaAdapter, + pMdl, + CallBackInfo->MapRegisterBase, + (PVOID)((ULONG_PTR)VirtualAddressOfMdl + TransferBtyesOffset), + &CurrentTransferBytes, + !IsReadOp); + DPRINT1("BufferPointer[%d] = %x\n", j, PhysicalAddr.LowPart); + Descriptor->BufferPointer[j] = PhysicalAddr.LowPart; + TransferBtyesOffset += CurrentTransferBytes; + if (TransferBtyesOffset >= MmGetMdlByteCount(pMdl)) + break; + } + } + Descriptor = Descriptor->NextDescriptor; + } + LinkQueueHead(hcd, QueueHead); + break; + } + + if (TransferBtyesOffset < MmGetMdlByteCount(pMdl)) ASSERT(FALSE); + if (IrpToComplete == NULL) + { + DPRINT1("Waiting For Completion %x!\n", CompleteEvent); + TimeOut.QuadPart = -10000000; + KeWaitForSingleObject(CompleteEvent, Suspended, KernelMode, FALSE, NULL);//&TimeOut); + DPRINT1("Request Completed\n"); + ExFreePool(CompleteEvent); + } + + KeRaiseIrql(DISPATCH_LEVEL, &OldIrql); + hcd->pDmaAdapter->DmaOperations->FreeMapRegisters(hcd->pDmaAdapter, + CallBackInfo->MapRegisterBase, + NumberOfMapRegisters); + + hcd->pDmaAdapter->DmaOperations->FreeAdapterChannel (hcd->pDmaAdapter); + KeLowerIrql(OldIrql); + return Status; } diff --git a/reactos/drivers/usb/usbehci/transfer.h b/reactos/drivers/usb/usbehci/transfer.h index eebffd921fa..a7d6f40d87b 100644 --- a/reactos/drivers/usb/usbehci/transfer.h +++ b/reactos/drivers/usb/usbehci/transfer.h @@ -3,18 +3,37 @@ #include "hardware.h" #include "hwiface.h" #include "physmem.h" +#include "usbehci.h" #include #include -BOOLEAN -SubmitControlTransfer(PEHCI_HOST_CONTROLLER hcd, - PUSB_DEFAULT_PIPE_SETUP_PACKET CtrlSetup, - PVOID TransferBuffer, - ULONG TransferBufferLength, - PIRP IrpToComplete); +PQUEUE_HEAD +BuildControlTransfer(PEHCI_HOST_CONTROLLER hcd, + ULONG DeviceAddress, + USBD_PIPE_HANDLE PipeHandle, + PUSB_DEFAULT_PIPE_SETUP_PACKET CtrlSetup, + PMDL pMdl, + BOOLEAN FreeMdl); + +PQUEUE_HEAD +BuildBulkTransfer(PEHCI_HOST_CONTROLLER hcd, + ULONG DeviceAddress, + USBD_PIPE_HANDLE PipeHandle, + UCHAR PidDirection, + PMDL pMdl, + BOOLEAN FreeMdl); VOID BuildSetupPacketFromURB(PEHCI_HOST_CONTROLLER hcd, PURB Urb, PUSB_DEFAULT_PIPE_SETUP_PACKET CtrlSetup); +NTSTATUS +ExecuteTransfer(PDEVICE_OBJECT DeviceObject, + PUSB_DEVICE UsbDevice, + USBD_PIPE_HANDLE PipeHandle, + PUSB_DEFAULT_PIPE_SETUP_PACKET CtrlSetup, + ULONG TransferFlags, + PVOID TransferBufferOrMdl, + ULONG TransferBufferLength, + PIRP IrpToComplete); From b69fae78dbcf8795c66e705eefa5a64956e2d553 Mon Sep 17 00:00:00 2001 From: Rafal Harabien Date: Wed, 13 Apr 2011 08:14:37 +0000 Subject: [PATCH 140/317] [GDI32] * DPtoLP/LPtoDP functions should return TRUE even if they get 0 or less points or if pointer to points is invalid. See gdi32:DPtoLP apitest. * Fixes 24 gdi32:DPtoLP apitests. svn path=/trunk/; revision=51328 --- .../subsystems/win32/win32k/objects/coord.c | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/reactos/subsystems/win32/win32k/objects/coord.c b/reactos/subsystems/win32/win32k/objects/coord.c index 634320a1600..67b57b366eb 100644 --- a/reactos/subsystems/win32/win32k/objects/coord.c +++ b/reactos/subsystems/win32/win32k/objects/coord.c @@ -256,18 +256,14 @@ NtGdiTransformPoints( PDC pdc; LPPOINT Points; ULONG Size; - BOOL ret; + BOOL ret = TRUE; + + if (Count <= 0) + return TRUE; pdc = DC_LockDc(hDC); if (!pdc) { - EngSetLastError(ERROR_INVALID_HANDLE); - return FALSE; - } - - if (!UnsafePtsIn || !UnsafePtOut || Count <= 0) - { - DC_UnlockDc(pdc); EngSetLastError(ERROR_INVALID_PARAMETER); return FALSE; } @@ -291,8 +287,7 @@ NtGdiTransformPoints( } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { - SetLastNtError(_SEH2_GetExceptionCode()); - ret = FALSE; + /* Do not set last error */ _SEH2_YIELD(goto leave;) } _SEH2_END; @@ -323,8 +318,7 @@ NtGdiTransformPoints( } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { - SetLastNtError(_SEH2_GetExceptionCode()); - ret = FALSE; + /* Do not set last error */ } _SEH2_END; From 45fc0e0951fbc3c79ef5e4002a55b5dfb0d6e88f Mon Sep 17 00:00:00 2001 From: Giannis Adamopoulos Date: Wed, 13 Apr 2011 18:25:58 +0000 Subject: [PATCH 141/317] [explorer] - Use the shell default auto-arrangement positioning. Aloow using custom positioning when configured. This fixes the positioning of icons of the desktop to look like windows svn path=/trunk/; revision=51330 --- reactos/base/shell/explorer/desktop/desktop.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/reactos/base/shell/explorer/desktop/desktop.cpp b/reactos/base/shell/explorer/desktop/desktop.cpp index 99b990bec39..e7787055b8d 100644 --- a/reactos/base/shell/explorer/desktop/desktop.cpp +++ b/reactos/base/shell/explorer/desktop/desktop.cpp @@ -496,8 +496,6 @@ DesktopShellView::DesktopShellView(HWND hwnd, IShellView* pShellView) { _hwndListView = GetNextWindow(hwnd, GW_CHILD); - SetWindowStyle(_hwndListView, GetWindowStyle(_hwndListView)&~LVS_ALIGNMASK);//|LVS_ALIGNTOP|LVS_AUTOARRANGE); - // work around for Windows NT, Win 98, ... // Without this the desktop has mysteriously only a size of 800x600 pixels. ClientRect rect(hwnd); @@ -506,9 +504,8 @@ DesktopShellView::DesktopShellView(HWND hwnd, IShellView* pShellView) // subclass background window new BackgroundWindow(_hwndListView); - _icon_algo = 1; // default icon arrangement + _icon_algo = 0; // default icon arrangement - PositionIcons(); InitDragDrop(); } @@ -737,6 +734,9 @@ void DesktopShellView::PositionIcons(int dir) RECT work_area; SystemParametersInfo(SPI_GETWORKAREA, 0, &work_area, 0); + /* disable default allignment */ + SetWindowStyle(_hwndListView, GetWindowStyle(_hwndListView)&~LVS_ALIGNMASK);//|LVS_ALIGNTOP|LVS_AUTOARRANGE); + const POINTS& dir1 = s_align_dir1[_icon_algo]; const POINTS& dir2 = s_align_dir2[_icon_algo]; const POINTS& start_pos = s_align_start[_icon_algo]; From 1968375672f90beb9211ab0bcdb8c1406101f46a Mon Sep 17 00:00:00 2001 From: Matthias Kupfer Date: Wed, 13 Apr 2011 20:20:16 +0000 Subject: [PATCH 142/317] remove obsolete object handling svn path=/trunk/; revision=51331 --- reactos/base/applications/taskmgr/trayicon.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/reactos/base/applications/taskmgr/trayicon.c b/reactos/base/applications/taskmgr/trayicon.c index c48222dd6fd..92617e6556d 100644 --- a/reactos/base/applications/taskmgr/trayicon.c +++ b/reactos/base/applications/taskmgr/trayicon.c @@ -113,8 +113,6 @@ done: */ if (hScreenDC) ReleaseDC(NULL, hScreenDC); - if (hOldBitmap) - hBitmap = SelectObject(hDC, hOldBitmap); if (hDC) DeleteDC(hDC); if (hBitmapBrush) From 3203ddd6e15bbe66b18615d31b1248256fbb13e4 Mon Sep 17 00:00:00 2001 From: Michael Martin Date: Thu, 14 Apr 2011 01:21:38 +0000 Subject: [PATCH 143/317] [Win32k] - Fix implementation of message callbacks, now callbacks can be called across processes. - Fix some comments. svn path=/trunk/; revision=51332 --- .../subsystems/win32/win32k/ntuser/message.c | 24 ++++-- .../subsystems/win32/win32k/ntuser/msgqueue.c | 76 +++++++++++++++---- 2 files changed, 79 insertions(+), 21 deletions(-) diff --git a/reactos/subsystems/win32/win32k/ntuser/message.c b/reactos/subsystems/win32/win32k/ntuser/message.c index ed7c718eea8..2a2097f6703 100644 --- a/reactos/subsystems/win32/win32k/ntuser/message.c +++ b/reactos/subsystems/win32/win32k/ntuser/message.c @@ -1425,8 +1425,8 @@ co_IntSendMessageWithCallBack( HWND hWnd, RETURN( FALSE); } - /* If this is not a callback and it can be sent now, then send it. */ - if ((Window->head.pti->MessageQueue == Win32Thread->MessageQueue) && (CompletionCallback == NULL)) + /* If it can be sent now, then send it. */ + if (Window->head.pti->MessageQueue == Win32Thread->MessageQueue) { if (Win32Thread->TIF_flags & TIF_INCLEANUP) { @@ -1452,11 +1452,20 @@ co_IntSendMessageWithCallBack( HWND hWnd, ObDereferenceObject(Win32Thread->pEThread); IntCallWndProcRet( Window, hWnd, Msg, wParam, lParam, (LRESULT *)uResult); + + if (CompletionCallback) + { + co_IntCallSentMessageCallback(CompletionCallback, + hWnd, + Msg, + CompletionCallbackContext, + Result); + } } - if ((Window->head.pti->MessageQueue == Win32Thread->MessageQueue) && (CompletionCallback == NULL)) + if (Window->head.pti->MessageQueue == Win32Thread->MessageQueue) { if (! NT_SUCCESS(UnpackParam(lParamPacked, Msg, wParam, lParam, FALSE))) { @@ -1471,6 +1480,12 @@ co_IntSendMessageWithCallBack( HWND hWnd, RETURN( FALSE); } + IntReferenceMessageQueue(Window->head.pti->MessageQueue); + /* Take reference on this MessageQueue if its a callback. It will be released + when message is processed or removed from target hwnd MessageQueue */ + if (CompletionCallback) + IntReferenceMessageQueue(Win32Thread->MessageQueue); + Message->Msg.hwnd = hWnd; Message->Msg.message = Msg; Message->Msg.wParam = wParam; @@ -1482,8 +1497,6 @@ co_IntSendMessageWithCallBack( HWND hWnd, Message->SenderQueue = NULL; // mjmartin, you are right! This is null. Message->CallBackSenderQueue = Win32Thread->MessageQueue; Message->DispatchingListEntry.Flink = NULL; - - IntReferenceMessageQueue(Window->head.pti->MessageQueue); Message->CompletionCallback = CompletionCallback; Message->CompletionCallbackContext = CompletionCallbackContext; Message->HookMessage = MSQ_NORMAL; @@ -1492,7 +1505,6 @@ co_IntSendMessageWithCallBack( HWND hWnd, InsertTailList(&Window->head.pti->MessageQueue->SentMessagesListHead, &Message->ListEntry); MsqWakeQueue(Window->head.pti->MessageQueue, QS_SENDMESSAGE, TRUE); - IntDereferenceMessageQueue(Window->head.pti->MessageQueue); RETURN(TRUE); diff --git a/reactos/subsystems/win32/win32k/ntuser/msgqueue.c b/reactos/subsystems/win32/win32k/ntuser/msgqueue.c index 8c036a415e1..f5f678d3120 100644 --- a/reactos/subsystems/win32/win32k/ntuser/msgqueue.c +++ b/reactos/subsystems/win32/win32k/ntuser/msgqueue.c @@ -588,6 +588,28 @@ co_MsqDispatchOneSentMessage(PUSER_MESSAGE_QUEUE MessageQueue) Message->Msg.wParam, Message->Msg.lParam); } + else if ((Message->CompletionCallback) + && (Message->CallBackSenderQueue == MessageQueue)) + { /* Call the callback routine */ + if (Message->QS_Flags & QS_SMRESULT) + { + co_IntCallSentMessageCallback(Message->CompletionCallback, + Message->Msg.hwnd, + Message->Msg.message, + Message->CompletionCallbackContext, + Message->lResult); + /* Set callback to NULL to prevent reentry */ + Message->CompletionCallback = NULL; + } + else + { + /* The message has not been processed yet, reinsert it. */ + RemoveEntryList(&Message->ListEntry); + InsertTailList(&Message->CallBackSenderQueue->SentMessagesListHead, &Message->ListEntry); + DPRINT("Callback Message not processed yet. Requeuing the message\n"); + return (FALSE); + } + } else { /* Call the window procedure. */ Result = co_IntSendMessage( Message->Msg.hwnd, @@ -600,6 +622,22 @@ co_MsqDispatchOneSentMessage(PUSER_MESSAGE_QUEUE MessageQueue) to be cleaned up on thread termination anymore */ RemoveEntryList(&Message->ListEntry); + /* If the message is a callback, insert it in the callback senders MessageQueue */ + if (Message->CompletionCallback) + { + if (Message->CallBackSenderQueue) + { + Message->lResult = Result; + Message->QS_Flags |= QS_SMRESULT; + + /* insert it in the callers message queue */ + InsertTailList(&Message->CallBackSenderQueue->SentMessagesListHead, &Message->ListEntry); + MsqWakeQueue(Message->CallBackSenderQueue, QS_SENDMESSAGE, TRUE); + IntDereferenceMessageQueue(Message->CallBackSenderQueue); + } + return (TRUE); + } + /* remove the message from the dispatching list if needed, so lock the sender's message queue */ if (Message->SenderQueue) { @@ -635,19 +673,10 @@ co_MsqDispatchOneSentMessage(PUSER_MESSAGE_QUEUE MessageQueue) KeSetEvent(Message->CompletionEvent, IO_NO_INCREMENT, FALSE); } - /* Call the callback if the message was sent with SendMessageCallback */ - if (Message->CompletionCallback != NULL) - { - co_IntCallSentMessageCallback(Message->CompletionCallback, - Message->Msg.hwnd, - Message->Msg.message, - Message->CompletionCallbackContext, - Result); - } - - /* Only if the message has a sender was the queue referenced */ + /* if the message has a sender */ if (Message->SenderQueue) { + /* dereference our and the sender's message queue */ IntDereferenceMessageQueue(Message->SenderQueue); IntDereferenceMessageQueue(MessageQueue); } @@ -710,6 +739,11 @@ MsqRemoveWindowMessagesFromQueue(PVOID pWindow) RemoveEntryList(&SentMessage->ListEntry); ClearMsgBitsMask(MessageQueue, SentMessage->QS_Flags); + /* if it is a callback and this queue is not the sender queue, dereference queue */ + if ((SentMessage->CompletionCallback) && (SentMessage->CallBackSenderQueue != MessageQueue)) + { + IntDereferenceMessageQueue(SentMessage->CallBackSenderQueue); + } /* Only if the message has a sender was the queue referenced */ if ((SentMessage->SenderQueue) && (SentMessage->DispatchingListEntry.Flink != NULL)) @@ -729,7 +763,7 @@ MsqRemoveWindowMessagesFromQueue(PVOID pWindow) ExFreePool((PVOID)SentMessage->Msg.lParam); } - /* Only if the message has a sender was the queue referenced */ + /* if the message has a sender */ if (SentMessage->SenderQueue) { /* dereference our and the sender's message queue */ @@ -1573,8 +1607,14 @@ MsqCleanupMessageQueue(PUSER_MESSAGE_QUEUE MessageQueue) CurrentSentMessage = CONTAINING_RECORD(CurrentEntry, USER_SENT_MESSAGE, ListEntry); + /* if it is a callback and this queue is not the sender queue, dereference queue */ + if ((CurrentSentMessage->CompletionCallback) && (CurrentSentMessage->CallBackSenderQueue != MessageQueue)) + { + IntDereferenceMessageQueue(CurrentSentMessage->CallBackSenderQueue); + } + DPRINT("Notify the sender and remove a message from the queue that had not been dispatched\n"); - /* Only if the message has a sender was the queue referenced */ + /* Only if the message has a sender was the message in the DispatchingList */ if ((CurrentSentMessage->SenderQueue) && (CurrentSentMessage->DispatchingListEntry.Flink != NULL)) { @@ -1593,7 +1633,7 @@ MsqCleanupMessageQueue(PUSER_MESSAGE_QUEUE MessageQueue) ExFreePool((PVOID)CurrentSentMessage->Msg.lParam); } - /* Only if the message has a sender was the queue referenced */ + /* if the message has a sender */ if (CurrentSentMessage->SenderQueue) { /* dereference our and the sender's message queue */ @@ -1613,6 +1653,12 @@ MsqCleanupMessageQueue(PUSER_MESSAGE_QUEUE MessageQueue) CurrentSentMessage = CONTAINING_RECORD(CurrentEntry, USER_SENT_MESSAGE, ListEntry); + /* if it is a callback and this queue is not the sender queue, dereference queue */ + if ((CurrentSentMessage->CompletionCallback) && (CurrentSentMessage->CallBackSenderQueue != MessageQueue)) + { + IntDereferenceMessageQueue(CurrentSentMessage->CallBackSenderQueue); + } + /* remove the message from the dispatching list */ if(CurrentSentMessage->DispatchingListEntry.Flink != NULL) { @@ -1633,7 +1679,7 @@ MsqCleanupMessageQueue(PUSER_MESSAGE_QUEUE MessageQueue) ExFreePool((PVOID)CurrentSentMessage->Msg.lParam); } - /* Only if the message has a sender was the queue referenced */ + /* if the message has a sender */ if (CurrentSentMessage->SenderQueue) { /* dereference our and the sender's message queue */ From 95618801634b8924ea4d15d8e039b61571d66710 Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Thu, 14 Apr 2011 09:57:08 +0000 Subject: [PATCH 144/317] [RTL] - Properly check parameters in RtlFindActivationContextSectionString. Almost the same as Wine did, but factored out into a standalone function, improved undocumented flags checks and allowing null data pointer in certain cases. svn path=/trunk/; revision=51333 --- reactos/lib/rtl/actctx.c | 52 +++++++++++++++++++++++++++------------- 1 file changed, 35 insertions(+), 17 deletions(-) diff --git a/reactos/lib/rtl/actctx.c b/reactos/lib/rtl/actctx.c index 1a6dc569178..562240c2b61 100644 --- a/reactos/lib/rtl/actctx.c +++ b/reactos/lib/rtl/actctx.c @@ -2667,30 +2667,48 @@ RtlQueryInformationActivationContext( ULONG flags, HANDLE handle, PVOID subinst, return STATUS_SUCCESS; } +#define FIND_ACTCTX_RETURN_FLAGS 0x00000002 +#define FIND_ACTCTX_RETURN_ASSEMBLY_METADATA 0x00000004 +#define FIND_ACTCTX_VALID_MASK (FIND_ACTCTX_SECTION_KEY_RETURN_HACTCTX | FIND_ACTCTX_RETURN_FLAGS | FIND_ACTCTX_RETURN_ASSEMBLY_METADATA) + +NTSTATUS +NTAPI +RtlpFindActivationContextSection_CheckParameters( ULONG flags, const GUID *guid, ULONG section_kind, + UNICODE_STRING *section_name, PACTCTX_SECTION_KEYED_DATA data ) +{ + /* Check general parameter combinations */ + if (!section_name || + (flags & ~FIND_ACTCTX_VALID_MASK) || + ((flags & FIND_ACTCTX_VALID_MASK) && !data) || + (data && data->cbSize < offsetof(ACTCTX_SECTION_KEYED_DATA, ulAssemblyRosterIndex))) + { + DPRINT1("invalid parameter\n"); + return STATUS_INVALID_PARAMETER; + } + + /* TODO */ + if (flags & FIND_ACTCTX_RETURN_FLAGS || + flags & FIND_ACTCTX_RETURN_ASSEMBLY_METADATA) + { + DPRINT1("unknown flags %08x\n", flags); + return STATUS_INVALID_PARAMETER; + } + + return STATUS_SUCCESS; +} + NTSTATUS NTAPI RtlFindActivationContextSectionString( ULONG flags, const GUID *guid, ULONG section_kind, UNICODE_STRING *section_name, PVOID ptr ) { PACTCTX_SECTION_KEYED_DATA data = ptr; - NTSTATUS status = STATUS_SXS_KEY_NOT_FOUND; + NTSTATUS status; - if (guid) - { - DPRINT1("expected guid == NULL\n"); - return STATUS_INVALID_PARAMETER; - } - if (flags & ~FIND_ACTCTX_SECTION_KEY_RETURN_HACTCTX) - { - DPRINT1("unknown flags %08x\n", flags); - return STATUS_INVALID_PARAMETER; - } - if (!data || data->cbSize < offsetof(ACTCTX_SECTION_KEYED_DATA, ulAssemblyRosterIndex) || - !section_name || !section_name->Buffer) - { - DPRINT1("invalid parameter\n"); - return STATUS_INVALID_PARAMETER; - } + status = RtlpFindActivationContextSection_CheckParameters(flags, guid, section_kind, section_name, data); + if (!NT_SUCCESS(status)) return status; + + status = STATUS_SXS_KEY_NOT_FOUND; ASSERT(NtCurrentTeb()); ASSERT(NtCurrentTeb()->ActivationContextStackPointer); From 4ae88bb7a4b83f998715a50aa2fcdad9dd2d4927 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Thu, 14 Apr 2011 11:55:40 +0000 Subject: [PATCH 145/317] [CMAKE] - Reflect the recent user32_apitest changes. Please consider updating the cmake files when you alter the rbuild files in the future. svn path=/trunk/; revision=51336 --- rostests/apitests/user32/CMakeLists.txt | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/rostests/apitests/user32/CMakeLists.txt b/rostests/apitests/user32/CMakeLists.txt index 9fc9374db52..4be297e2f49 100644 --- a/rostests/apitests/user32/CMakeLists.txt +++ b/rostests/apitests/user32/CMakeLists.txt @@ -2,14 +2,16 @@ add_definitions(-D_DLL -D__USE_CRTIMP) list(APPEND SOURCE + DeferWindowPos.c + GetIconInfo.c + GetKeyState.c + GetPeekMessage.c + GetSystemMetrics.c InitializeLpkHooks.c RealGetWindowClass.c ScrollDC.c ScrollWindowEx.c - GetSystemMetrics.c - GetIconInfo.c - GetPeekMessage.c - DeferWindowPos.c + SetCursorPos.c testlist.c user32_apitest.rc) From c512ea5c43861a7dd5980beeb8f250eee9ec5992 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Thu, 14 Apr 2011 12:13:38 +0000 Subject: [PATCH 146/317] [TRANSLATIONS] Igor Paliychuk (mansonigor at gmail dot com): * Update Ukrainian localization. * Leftover from r51055: Update reactos.exe strings and resource sizes. * Fix displaying of doskey localizations. svn path=/trunk/; revision=51338 --- .../applications/cmdutils/doskey/doskey.c | 3 + .../cmdutils/doskey/lang/uk-UA.rc | 32 +-- .../applications/cmdutils/more/lang/uk-UA.rc | 12 +- .../base/applications/dxdiag/lang/ua-UA.rc | 4 +- .../base/applications/fontview/lang/uk-UA.rc | 2 +- reactos/base/applications/mmc/lang/uk-UA.rc | 2 +- .../applications/network/ping/lang/uk-UA.rc | 6 +- .../base/applications/sndvol32/lang/uk-UA.rc | 8 +- reactos/base/setup/reactos/lang/bg-BG.rc | 13 +- reactos/base/setup/reactos/lang/cs-CZ.rc | 8 +- reactos/base/setup/reactos/lang/de-DE.rc | 8 +- reactos/base/setup/reactos/lang/el-GR.rc | 13 +- reactos/base/setup/reactos/lang/en-US.rc | 8 +- reactos/base/setup/reactos/lang/es-ES.rc | 13 +- reactos/base/setup/reactos/lang/et-EE.rc | 13 +- reactos/base/setup/reactos/lang/fi-FI.rc | 13 +- reactos/base/setup/reactos/lang/fr-FR.rc | 8 +- reactos/base/setup/reactos/lang/hu-HU.rc | 13 +- reactos/base/setup/reactos/lang/it-IT.rc | 13 +- reactos/base/setup/reactos/lang/no-NO.rc | 13 +- reactos/base/setup/reactos/lang/pl-PL.rc | 10 +- reactos/base/setup/reactos/lang/pt-BR.rc | 13 +- reactos/base/setup/reactos/lang/ro-RO.rc | 13 +- reactos/base/setup/reactos/lang/ru-RU.rc | 13 +- reactos/base/setup/reactos/lang/sk-SK.rc | 8 +- reactos/base/setup/reactos/lang/uk-UA.rc | 25 +- reactos/base/setup/vmwinst/lang/uk-UA.rc | 54 ++--- reactos/base/shell/explorer-new/lang/uk-UA.rc | 2 +- reactos/base/shell/explorer/explorer-uk.rc | 22 +- reactos/base/system/format/lang/uk-UA.rc | 2 +- reactos/dll/cpl/usrmgr/lang/uk-UA.rc | 223 ++++++++++++++++++ reactos/dll/cpl/usrmgr/rsrc.rc | 1 + .../win32/csrss/win32csr/lang/uk-UA.rc | 2 +- 33 files changed, 417 insertions(+), 176 deletions(-) create mode 100644 reactos/dll/cpl/usrmgr/lang/uk-UA.rc diff --git a/reactos/base/applications/cmdutils/doskey/doskey.c b/reactos/base/applications/cmdutils/doskey/doskey.c index 1f1b86370da..14237f90f16 100644 --- a/reactos/base/applications/cmdutils/doskey/doskey.c +++ b/reactos/base/applications/cmdutils/doskey/doskey.c @@ -2,6 +2,7 @@ #include #include #include +#include #include "doskey.h" #define MAX_STRING 2000 @@ -190,6 +191,8 @@ static LPWSTR RemoveQuotes(LPWSTR str) int wmain(VOID) { + setlocale(LC_ALL, ""); + /* Get the full command line using GetCommandLine(). We can't just use argv, * because then a parameter like "gotoroot=cd \" wouldn't be passed completely. */ WCHAR *pArgStart; diff --git a/reactos/base/applications/cmdutils/doskey/lang/uk-UA.rc b/reactos/base/applications/cmdutils/doskey/lang/uk-UA.rc index 259f63b7db5..3655d47f57d 100644 --- a/reactos/base/applications/cmdutils/doskey/lang/uk-UA.rc +++ b/reactos/base/applications/cmdutils/doskey/lang/uk-UA.rc @@ -3,7 +3,7 @@ * LICENSE: GPL - See COPYING in the top level directory * FILE: base/applications/cmdutils/doskey/lang/uk-UA.rc * PURPOSE: Ukraianian Language File for ReactOS DOSKey - * TRANSLATOR: Sakara Yevhen + * TRANSLATOR: Sakara Yevhen, Igor Paliychuk */ LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT @@ -11,25 +11,25 @@ LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT STRINGTABLE DISCARDABLE BEGIN -IDS_HELP, " , .\n\ +IDS_HELP, " , ii i.\n\ \n\ DOSKEY [/INSERT | /OVERSTRIKE] [/EXENAME=exe] [/HISTORY] [/LISTSIZE=size]\n\ [/REINSTALL] [/MACROS[:exe | :ALL]] [/MACROFILE=file] [macroname=[text]]\n\ \n\ - /INSERT .\n\ - /OVERSTRIKE .\n\ - /EXENAME=exename ' / \n\ - . cmd.exe.\n\ - /HISTORY ³ .\n\ - /LISTSIZE=size .\n\ - /REINSTALL .\n\ - /MACROS ³ .\n\ - /MACROS:exename ³ .\n\ - /MACROS:ALL ³ .\n\ - /MACROFILE=filename .\n\ - macroname ' .\n\ - text .\n" + /INSERT .\n\ + /OVERSTRIKE i .\n\ + /EXENAME=exename /i ii\n\ + i i. cmd.exe.\n\ + /HISTORY i ii .\n\ + /LISTSIZE=size ii ii.\n\ + /REINSTALL ii .\n\ + /MACROS i i.\n\ + /MACROS:exename i i .\n\ + /MACROS:ALL i i i .\n\ + /MACROFILE=filename i .\n\ + macroname ii .\n\ + text i i.\n" -IDS_INVALID_MACRO_DEF, " : %s\n" +IDS_INVALID_MACRO_DEF, "i : %s\n" END diff --git a/reactos/base/applications/cmdutils/more/lang/uk-UA.rc b/reactos/base/applications/cmdutils/more/lang/uk-UA.rc index 918fafb5528..5a930bb8449 100644 --- a/reactos/base/applications/cmdutils/more/lang/uk-UA.rc +++ b/reactos/base/applications/cmdutils/more/lang/uk-UA.rc @@ -9,15 +9,15 @@ LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT STRINGTABLE DISCARDABLE BEGIN - IDS_USAGE, " . :\n\n\ - MORE < [Drive:][Path]'_\n\ + IDS_USAGE, " i . :\n\n\ + MORE < [:][]I'_\n\ Command | MORE \n\ - MORE [Drive:][Path]'_\n\n\ + MORE [:][]I'_\n\n\ : \n\ - [Drive:][Path]'_ , .\n\ + [:][]'_ , i .\n\ Command\t\t , .\n\n\ - ""-- --"" - .\n" + ""-- i --"" - i i.\n" - IDS_CONTINUE, " -- (100%) -- " + IDS_CONTINUE, " -- i (100%) -- " IDS_FILE_ACCESS, " %s." END diff --git a/reactos/base/applications/dxdiag/lang/ua-UA.rc b/reactos/base/applications/dxdiag/lang/ua-UA.rc index 4acffc0173d..0cd5c0aa74c 100644 --- a/reactos/base/applications/dxdiag/lang/ua-UA.rc +++ b/reactos/base/applications/dxdiag/lang/ua-UA.rc @@ -219,7 +219,7 @@ BEGIN IDS_REG_SUCCESS "" IDS_REG_FAIL "" IDS_DDTEST_ERROR " !" - IDS_DDTEST_DESCRIPTION " DirecDraw . ?" + IDS_DDTEST_DESCRIPTION " DirecDraw. ?" IDS_DDPRIMARY_DESCRIPTION " DirectDraw . . ?" IDS_DDPRIMARY_RESULT " ?" IDS_DDOFFSCREEN_DESCRIPTION " DirectDraw . . ?" @@ -229,4 +229,6 @@ BEGIN IDS_FORMAT_ADAPTER_MEM "%u " IDS_FORMAT_ADAPTER_MODE "%04u x %04u (%u )(%u)" IDS_OPTION_NO "ͳ" + IDS_D3DTEST_DESCRIPTION " Direct3D. ?" + IDS_D3DTEST_D3Dx " - Direct3D %u." END diff --git a/reactos/base/applications/fontview/lang/uk-UA.rc b/reactos/base/applications/fontview/lang/uk-UA.rc index 3290c0010db..5ba42fa40eb 100644 --- a/reactos/base/applications/fontview/lang/uk-UA.rc +++ b/reactos/base/applications/fontview/lang/uk-UA.rc @@ -14,7 +14,7 @@ BEGIN IDS_PRINT, "" IDS_STRING, "Jackdaws love my big sphinx of quartz. 1234567890" IDS_ERROR, "" - IDS_ERROR_NOMEM, " ' ." + IDS_ERROR_NOMEM, " ' ." IDS_ERROR_NOFONT, " %1 ." IDS_ERROR_NOCLASS, " ." IDS_ERROR_BADCMD, " .\n:\n fontview.exe < >" diff --git a/reactos/base/applications/mmc/lang/uk-UA.rc b/reactos/base/applications/mmc/lang/uk-UA.rc index d13444a7973..1e8190b78d4 100644 --- a/reactos/base/applications/mmc/lang/uk-UA.rc +++ b/reactos/base/applications/mmc/lang/uk-UA.rc @@ -25,5 +25,5 @@ END STRINGTABLE DISCARDABLE BEGIN IDS_APPTITLE " ReactOS" - IDS_CONSOLETITLE "Console%1!u!" + IDS_CONSOLETITLE "%1!u!" END diff --git a/reactos/base/applications/network/ping/lang/uk-UA.rc b/reactos/base/applications/network/ping/lang/uk-UA.rc index eb0523a771f..95ef509d7a5 100644 --- a/reactos/base/applications/network/ping/lang/uk-UA.rc +++ b/reactos/base/applications/network/ping/lang/uk-UA.rc @@ -12,9 +12,9 @@ STRINGTABLE DISCARDABLE BEGIN IDS_USAGE "\n: ping [-t] [-n count] [-l size] [-w timeout] \n\n\ :\n\ - -t ϳ .\n\ + -t ϳ .\n\ Control-C.\n\ - -n count , .\n\ + -n count ʳ , .\n\ -l size .\n\ -w timeout .\n\n\0" @@ -28,7 +28,7 @@ BEGIN IDS_SETSOCKOPT_FAILED "setsockopt (%1!d!).\n\0" IDS_COULD_NOT_CREATE_SOCKET " (#%1!d!).\n\0" IDS_COULD_NOT_INIT_WINSOCK " winsock dll.\n\0" - IDS_DEST_MUST_BE_SPECIFIED "' IP- .\n\0" + IDS_DEST_MUST_BE_SPECIFIED "' IP- .\n\0" IDS_BAD_PARAMETER " %1.\n\0" IDS_BAD_OPTION_FORMAT " %1.\n\0" IDS_BAD_OPTION " %1.\n\0" diff --git a/reactos/base/applications/sndvol32/lang/uk-UA.rc b/reactos/base/applications/sndvol32/lang/uk-UA.rc index 8683013dab2..c993a77a357 100644 --- a/reactos/base/applications/sndvol32/lang/uk-UA.rc +++ b/reactos/base/applications/sndvol32/lang/uk-UA.rc @@ -54,12 +54,12 @@ IDD_VOLUME_CTRL DIALOG 0, 0, 90, 150 STYLE WS_POPUP | WS_BORDER FONT 8, "MS Shell Dlg" BEGIN - LTEXT "Master", IDC_LINE_NAME, 4, 7, 100, 15 + LTEXT "", IDC_LINE_NAME, 4, 7, 100, 15 CONTROL "", -1, "static", SS_ETCHEDHORZ | WS_CHILD | WS_VISIBLE, 4, 30, 82, 1 - LTEXT "Balance", -1, 4, 35, 80, 42 - LTEXT "Volume", -1, 4, 100, 77, 108 + LTEXT "", -1, 4, 35, 80, 42 + LTEXT "", -1, 4, 100, 77, 108 CONTROL "", IDC_LINE_SLIDER_HORZ, "msctls_trackbar32", TBS_HORZ | TBS_AUTOTICKS | TBS_BOTH | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 25, 55, 85, 30 CONTROL "", IDC_LINE_SLIDER_VERT, "msctls_trackbar32", TBS_VERT | TBS_AUTOTICKS | TBS_BOTH | TBS_DOWNISLEFT | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 32, 115, 30, 70 - CHECKBOX "&Mute", IDC_LINE_SWITCH, 4, 190, 90, 12, BS_AUTOCHECKBOX + CHECKBOX "&", IDC_LINE_SWITCH, 4, 190, 90, 12, BS_AUTOCHECKBOX CONTROL "", IDC_LINE_SEP, "static", SS_ETCHEDVERT | WS_CHILD | WS_VISIBLE, 130, 7, 1, 200 END diff --git a/reactos/base/setup/reactos/lang/bg-BG.rc b/reactos/base/setup/reactos/lang/bg-BG.rc index 7854b217ec1..8bd5990ad93 100644 --- a/reactos/base/setup/reactos/lang/bg-BG.rc +++ b/reactos/base/setup/reactos/lang/bg-BG.rc @@ -81,7 +81,7 @@ BEGIN PUSHBUTTON "&",IDCANCEL,87,68,47,15, WS_VISIBLE|WS_TABSTOP END -IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 105 +IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 116 STYLE WS_VISIBLE|WS_CAPTION|WS_THICKFRAME CAPTION " " FONT 8, "MS Shell Dlg" @@ -89,12 +89,13 @@ BEGIN CONTROL " ", IDC_STATIC, "Button", BS_GROUPBOX, 4,1,298,30 EDITTEXT IDC_PATH, 10,11,278,13, WS_VISIBLE - CONTROL " ", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,41 + CONTROL " ", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,52 - CONTROL " (MBR) ", IDC_INSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,46,278,11 - CONTROL " ", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,57,278,11 - PUSHBUTTON "&", IDOK, 180,83,50,15, WS_TABSTOP | WS_VISIBLE - PUSHBUTTON "&", IDCANCEL, 240,83,50,15, WS_TABSTOP | WS_VISIBLE + CONTROL " (MBR VBR) ", IDC_INSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,46,278,11 + CONTROL " ( VBR) ", IDC_INSTVBRONLY, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,57,278,11 + CONTROL " ", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,68,278,11 + PUSHBUTTON "&", IDOK, 180,94,50,15, WS_TABSTOP | WS_VISIBLE + PUSHBUTTON "&", IDCANCEL, 240,94,50,15, WS_TABSTOP | WS_VISIBLE END IDD_SUMMARYPAGE DIALOGEX 0, 0, 317, 193 diff --git a/reactos/base/setup/reactos/lang/cs-CZ.rc b/reactos/base/setup/reactos/lang/cs-CZ.rc index 7ba1456c1a3..b5d6d723611 100644 --- a/reactos/base/setup/reactos/lang/cs-CZ.rc +++ b/reactos/base/setup/reactos/lang/cs-CZ.rc @@ -85,7 +85,7 @@ BEGIN PUSHBUTTON "&Storno",IDCANCEL,87,68,47,15, WS_VISIBLE|WS_TABSTOP END -IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 105 +IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 116 STYLE WS_VISIBLE|WS_CAPTION|WS_THICKFRAME CAPTION "Pokroil nastaven oddlu" FONT 8, "MS Shell Dlg" @@ -93,13 +93,13 @@ BEGIN CONTROL "Instalan sloka", IDC_STATIC, "Button", BS_GROUPBOX, 4,1,298,30 EDITTEXT IDC_PATH, 10,11,278,13, WS_VISIBLE - CONTROL "Instalace zavade", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,41 + CONTROL "Instalace zavade", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,52 CONTROL "Nainstalovat zavad na pevn disk (MBR a VBR)", IDC_INSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,46,278,11 CONTROL "Nainstalovat zavad na pevn disk (jen VBR)", IDC_INSTVBRONLY, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,57,278,11 CONTROL "Zavad neinstalovat", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,68,278,11 - PUSHBUTTON "&OK", IDOK, 180,83,50,15, WS_TABSTOP | WS_VISIBLE - PUSHBUTTON "&Storno", IDCANCEL, 240,83,50,15, WS_TABSTOP | WS_VISIBLE + PUSHBUTTON "&OK", IDOK, 180,94,50,15, WS_TABSTOP | WS_VISIBLE + PUSHBUTTON "&Storno", IDCANCEL, 240,94,50,15, WS_TABSTOP | WS_VISIBLE END IDD_SUMMARYPAGE DIALOGEX 0, 0, 317, 193 diff --git a/reactos/base/setup/reactos/lang/de-DE.rc b/reactos/base/setup/reactos/lang/de-DE.rc index 1c8a1f4fb0e..500a03f810e 100644 --- a/reactos/base/setup/reactos/lang/de-DE.rc +++ b/reactos/base/setup/reactos/lang/de-DE.rc @@ -81,7 +81,7 @@ BEGIN PUSHBUTTON "&Abbrechen",IDCANCEL,87,68,47,15, WS_VISIBLE|WS_TABSTOP END -IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 105 +IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 116 STYLE WS_VISIBLE|WS_CAPTION|WS_THICKFRAME CAPTION "Erweiterte Partitionseinstellungen" FONT 8, "MS Shell Dlg" @@ -89,13 +89,13 @@ BEGIN CONTROL "Installationsverzeichnis", IDC_STATIC, "Button", BS_GROUPBOX, 4,1,298,30 EDITTEXT IDC_PATH, 10,11,278,13, WS_VISIBLE - CONTROL "Bootloader-Installation", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,41 + CONTROL "Bootloader-Installation", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,52 CONTROL "Installiere Bootloader auf Festplatte (MBR und VBR)", IDC_INSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,46,278,11 CONTROL "Installiere Bootloader auf Festplatte (VBR nur)", IDC_INSTVBRONLY, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,57,278,11 CONTROL "Keine Bootloader-Installation", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,68,278,11 - PUSHBUTTON "&OK", IDOK, 180,83,50,15, WS_TABSTOP | WS_VISIBLE - PUSHBUTTON "&Abbrechen", IDCANCEL, 240,83,50,15, WS_TABSTOP | WS_VISIBLE + PUSHBUTTON "&OK", IDOK, 180,94,50,15, WS_TABSTOP | WS_VISIBLE + PUSHBUTTON "&Abbrechen", IDCANCEL, 240,94,50,15, WS_TABSTOP | WS_VISIBLE END IDD_SUMMARYPAGE DIALOGEX 0, 0, 317, 193 diff --git a/reactos/base/setup/reactos/lang/el-GR.rc b/reactos/base/setup/reactos/lang/el-GR.rc index fde44aed901..1f32e36947a 100644 --- a/reactos/base/setup/reactos/lang/el-GR.rc +++ b/reactos/base/setup/reactos/lang/el-GR.rc @@ -79,7 +79,7 @@ BEGIN PUSHBUTTON "&",IDCANCEL,87,68,47,15, WS_VISIBLE|WS_TABSTOP END -IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 105 +IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 116 STYLE WS_VISIBLE|WS_CAPTION|WS_THICKFRAME CAPTION " Partition " FONT 8, "MS Shell Dlg" @@ -87,12 +87,13 @@ BEGIN CONTROL " ", IDC_STATIC, "Button", BS_GROUPBOX, 4,1,298,30 EDITTEXT IDC_PATH, 10,11,278,13, WS_VISIBLE - CONTROL " Boot loader", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,41 + CONTROL " Boot loader", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,52 - CONTROL " boot loader (MBR)", IDC_INSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,46,278,11 - CONTROL " bootloader", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,57,278,11 - PUSHBUTTON "&OK", IDOK, 180,83,50,15, WS_TABSTOP | WS_VISIBLE - PUSHBUTTON "&", IDCANCEL, 240,83,50,15, WS_TABSTOP | WS_VISIBLE + CONTROL " boot loader (MBR and VBR)", IDC_INSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,46,278,11 + CONTROL " boot loader (VBR only)", IDC_INSTVBRONLY, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,57,278,11 + CONTROL " bootloader", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,68,278,11 + PUSHBUTTON "&OK", IDOK, 180,94,50,15, WS_TABSTOP | WS_VISIBLE + PUSHBUTTON "&", IDCANCEL, 240,94,50,15, WS_TABSTOP | WS_VISIBLE END IDD_SUMMARYPAGE DIALOGEX 0, 0, 317, 193 diff --git a/reactos/base/setup/reactos/lang/en-US.rc b/reactos/base/setup/reactos/lang/en-US.rc index e0f4eccf865..036ec468700 100644 --- a/reactos/base/setup/reactos/lang/en-US.rc +++ b/reactos/base/setup/reactos/lang/en-US.rc @@ -81,7 +81,7 @@ BEGIN PUSHBUTTON "&Cancel",IDCANCEL,87,68,47,15, WS_VISIBLE|WS_TABSTOP END -IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 105 +IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 116 STYLE WS_VISIBLE|WS_CAPTION|WS_THICKFRAME CAPTION "Advanced Partition Settings" FONT 8, "MS Shell Dlg" @@ -89,13 +89,13 @@ BEGIN CONTROL "Installation folder", IDC_STATIC, "Button", BS_GROUPBOX, 4,1,298,30 EDITTEXT IDC_PATH, 10,11,278,13, WS_VISIBLE - CONTROL "Boot loader installation", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,41 + CONTROL "Boot loader installation", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,52 CONTROL "Install boot loader on the hard disk (MBR and VBR)", IDC_INSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,46,278,11 CONTROL "Install boot loader on the hard disk (VBR only)", IDC_INSTVBRONLY, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,57,278,11 CONTROL "No installation of bootloader", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,68,278,11 - PUSHBUTTON "&OK", IDOK, 180,83,50,15, WS_TABSTOP | WS_VISIBLE - PUSHBUTTON "&Cancel", IDCANCEL, 240,83,50,15, WS_TABSTOP | WS_VISIBLE + PUSHBUTTON "&OK", IDOK, 180,94,50,15, WS_TABSTOP | WS_VISIBLE + PUSHBUTTON "&Cancel", IDCANCEL, 240,94,50,15, WS_TABSTOP | WS_VISIBLE END IDD_SUMMARYPAGE DIALOGEX 0, 0, 317, 193 diff --git a/reactos/base/setup/reactos/lang/es-ES.rc b/reactos/base/setup/reactos/lang/es-ES.rc index 91f685c6447..cc440ed16eb 100644 --- a/reactos/base/setup/reactos/lang/es-ES.rc +++ b/reactos/base/setup/reactos/lang/es-ES.rc @@ -83,7 +83,7 @@ BEGIN PUSHBUTTON "&Cancelar",IDCANCEL,87,68,47,15, WS_VISIBLE|WS_TABSTOP END -IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 105 +IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 116 STYLE WS_VISIBLE|WS_CAPTION|WS_THICKFRAME CAPTION "Ajustes avanzados de la particin" FONT 8, "MS Shell Dlg" @@ -91,12 +91,13 @@ BEGIN CONTROL "Carpeta de instalacin", IDC_STATIC, "Button", BS_GROUPBOX, 4,1,298,30 EDITTEXT IDC_PATH, 10,11,278,13, WS_VISIBLE - CONTROL "Instalacin del cargador de arranque", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,41 + CONTROL "Instalacin del cargador de arranque", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,52 - CONTROL "Instalar el cargador de arranque en el disco duro (MBR)", IDC_INSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,46,278,11 - CONTROL "No instalar el cargador de arranque", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,57,278,11 - PUSHBUTTON "&Aceptar", IDOK, 180,83,50,15, WS_TABSTOP | WS_VISIBLE - PUSHBUTTON "&Cancelar", IDCANCEL, 240,83,50,15, WS_TABSTOP | WS_VISIBLE + CONTROL "Instalar el cargador de arranque en el disco duro (MBR y VBR)", IDC_INSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,46,278,11 + CONTROL "Instalar el cargador de arranque en el disco duro (solo VBR)", IDC_INSTVBRONLY, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,57,278,11 + CONTROL "No instalar el cargador de arranque", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,68,278,11 + PUSHBUTTON "&Aceptar", IDOK, 180,94,50,15, WS_TABSTOP | WS_VISIBLE + PUSHBUTTON "&Cancelar", IDCANCEL, 240,94,50,15, WS_TABSTOP | WS_VISIBLE END IDD_SUMMARYPAGE DIALOGEX 0, 0, 317, 193 diff --git a/reactos/base/setup/reactos/lang/et-EE.rc b/reactos/base/setup/reactos/lang/et-EE.rc index 938f67989ba..e7d446a8dd5 100644 --- a/reactos/base/setup/reactos/lang/et-EE.rc +++ b/reactos/base/setup/reactos/lang/et-EE.rc @@ -79,7 +79,7 @@ BEGIN PUSHBUTTON "&Thista",IDCANCEL,87,68,47,15, WS_VISIBLE|WS_TABSTOP END -IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 105 +IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 116 STYLE WS_VISIBLE|WS_CAPTION|WS_THICKFRAME CAPTION "Tpsemad vormindamise seaded" FONT 8, "MS Shell Dlg" @@ -87,12 +87,13 @@ BEGIN CONTROL "Paigaldamise kaust", IDC_STATIC, "Button", BS_GROUPBOX, 4,1,298,30 EDITTEXT IDC_PATH, 10,11,278,13, WS_VISIBLE - CONTROL "Alglaaduri paigaldamine", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,41 + CONTROL "Alglaaduri paigaldamine", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,52 - CONTROL "Paigalda alglaadur kvakettale (MBR)", IDC_INSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,46,278,11 - CONTROL "ra paigalda alglaadurit", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,57,278,11 - PUSHBUTTON "&Olgu", IDOK, 180,83,50,15, WS_TABSTOP | WS_VISIBLE - PUSHBUTTON "&Thista", IDCANCEL, 240,83,50,15, WS_TABSTOP | WS_VISIBLE + CONTROL "Paigalda alglaadur kvakettale (MBR and VBR)", IDC_INSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,46,278,11 + CONTROL "Paigalda alglaadur kvakettale (VBR only)", IDC_INSTVBRONLY, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,57,278,11 + CONTROL "ra paigalda alglaadurit", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,68,278,11 + PUSHBUTTON "&Olgu", IDOK, 180,94,50,15, WS_TABSTOP | WS_VISIBLE + PUSHBUTTON "&Thista", IDCANCEL, 240,94,50,15, WS_TABSTOP | WS_VISIBLE END IDD_SUMMARYPAGE DIALOGEX 0, 0, 317, 193 diff --git a/reactos/base/setup/reactos/lang/fi-FI.rc b/reactos/base/setup/reactos/lang/fi-FI.rc index 3581e1f4b0c..e30ec8ddc8d 100644 --- a/reactos/base/setup/reactos/lang/fi-FI.rc +++ b/reactos/base/setup/reactos/lang/fi-FI.rc @@ -79,7 +79,7 @@ BEGIN PUSHBUTTON "&Cancel",IDCANCEL,87,68,47,15, WS_VISIBLE|WS_TABSTOP END -IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 105 +IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 116 STYLE WS_VISIBLE|WS_CAPTION|WS_THICKFRAME CAPTION "Advanced Partition Settings" FONT 8, "MS Shell Dlg" @@ -87,12 +87,13 @@ BEGIN CONTROL "Installation folder", IDC_STATIC, "Button", BS_GROUPBOX, 4,1,298,30 EDITTEXT IDC_PATH, 10,11,278,13, WS_VISIBLE - CONTROL "Boot loader installation", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,41 + CONTROL "Boot loader installation", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,52 - CONTROL "Install boot loader on the hard disk (MBR)", IDC_INSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,46,278,11 - CONTROL "No installation of bootloader", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,57,278,11 - PUSHBUTTON "&OK", IDOK, 180,83,50,15, WS_TABSTOP | WS_VISIBLE - PUSHBUTTON "&Cancel", IDCANCEL, 240,83,50,15, WS_TABSTOP | WS_VISIBLE + CONTROL "Install boot loader on the hard disk (MBR and VBR)", IDC_INSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,46,278,11 + CONTROL "Install boot loader on the hard disk (VBR only)", IDC_INSTVBRONLY, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,57,278,11 + CONTROL "No installation of bootloader", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,68,278,11 + PUSHBUTTON "&OK", IDOK, 180,94,50,15, WS_TABSTOP | WS_VISIBLE + PUSHBUTTON "&Cancel", IDCANCEL, 240,94,50,15, WS_TABSTOP | WS_VISIBLE END IDD_SUMMARYPAGE DIALOGEX 0, 0, 317, 193 diff --git a/reactos/base/setup/reactos/lang/fr-FR.rc b/reactos/base/setup/reactos/lang/fr-FR.rc index 68e3cc1a41a..5a8019096d5 100644 --- a/reactos/base/setup/reactos/lang/fr-FR.rc +++ b/reactos/base/setup/reactos/lang/fr-FR.rc @@ -79,7 +79,7 @@ BEGIN PUSHBUTTON "&Cancel",IDCANCEL,87,68,47,15, WS_VISIBLE|WS_TABSTOP END -IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 105 +IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 116 STYLE WS_VISIBLE|WS_CAPTION|WS_THICKFRAME CAPTION "Advanced Partition Settings" FONT 8, "MS Shell Dlg" @@ -87,13 +87,13 @@ BEGIN CONTROL "Installation folder", IDC_STATIC, "Button", BS_GROUPBOX, 4,1,298,30 EDITTEXT IDC_PATH, 10,11,278,13, WS_VISIBLE - CONTROL "Boot loader installation", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,41 + CONTROL "Boot loader installation", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,52 CONTROL "Install boot loader on the hard disk (MBR and VBR)", IDC_INSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,46,278,11 CONTROL "Install boot loader on the hard disk (VBR only)", IDC_INSTVBRONLY, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,57,278,11 CONTROL "No installation of bootloader", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,68,278,11 - PUSHBUTTON "&OK", IDOK, 180,83,50,15, WS_TABSTOP | WS_VISIBLE - PUSHBUTTON "&Cancel", IDCANCEL, 240,83,50,15, WS_TABSTOP | WS_VISIBLE + PUSHBUTTON "&OK", IDOK, 180,94,50,15, WS_TABSTOP | WS_VISIBLE + PUSHBUTTON "&Cancel", IDCANCEL, 240,94,50,15, WS_TABSTOP | WS_VISIBLE END IDD_SUMMARYPAGE DIALOGEX 0, 0, 317, 193 diff --git a/reactos/base/setup/reactos/lang/hu-HU.rc b/reactos/base/setup/reactos/lang/hu-HU.rc index 573cb8f9fb9..cf13733d859 100644 --- a/reactos/base/setup/reactos/lang/hu-HU.rc +++ b/reactos/base/setup/reactos/lang/hu-HU.rc @@ -81,7 +81,7 @@ BEGIN PUSHBUTTON "&Cancel",IDCANCEL,87,68,47,15, WS_VISIBLE|WS_TABSTOP END -IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 105 +IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 116 STYLE WS_VISIBLE|WS_CAPTION|WS_THICKFRAME CAPTION "Advanced Partition Settings" FONT 8, "MS Shell Dlg" @@ -89,12 +89,13 @@ BEGIN CONTROL "Installation folder", IDC_STATIC, "Button", BS_GROUPBOX, 4,1,298,30 EDITTEXT IDC_PATH, 10,11,278,13, WS_VISIBLE - CONTROL "Boot loader installation", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,41 + CONTROL "Boot loader installation", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,52 - CONTROL "Install boot loader on the hard disk (MBR)", IDC_INSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,46,278,11 - CONTROL "No installation of bootloader", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,57,278,11 - PUSHBUTTON "&OK", IDOK, 180,83,50,15, WS_TABSTOP | WS_VISIBLE - PUSHBUTTON "&Cancel", IDCANCEL, 240,83,50,15, WS_TABSTOP | WS_VISIBLE + CONTROL "Install boot loader on the hard disk (MBR and VBR)", IDC_INSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,46,278,11 + CONTROL "Install boot loader on the hard disk (VBR only)", IDC_INSTVBRONLY, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,57,278,11 + CONTROL "No installation of bootloader", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,68,278,11 + PUSHBUTTON "&OK", IDOK, 180,94,50,15, WS_TABSTOP | WS_VISIBLE + PUSHBUTTON "&Cancel", IDCANCEL, 240,94,50,15, WS_TABSTOP | WS_VISIBLE END IDD_SUMMARYPAGE DIALOGEX 0, 0, 317, 193 diff --git a/reactos/base/setup/reactos/lang/it-IT.rc b/reactos/base/setup/reactos/lang/it-IT.rc index 6337058194e..bdcd461daf7 100644 --- a/reactos/base/setup/reactos/lang/it-IT.rc +++ b/reactos/base/setup/reactos/lang/it-IT.rc @@ -79,7 +79,7 @@ BEGIN PUSHBUTTON "&Annulla",IDCANCEL,87,68,47,15, WS_VISIBLE|WS_TABSTOP END -IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 105 +IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 116 STYLE WS_VISIBLE|WS_CAPTION|WS_THICKFRAME CAPTION "Impostazioni avanzate delle partizioni" FONT 8, "MS Shell Dlg" @@ -87,12 +87,13 @@ BEGIN CONTROL "Cartella di installazione", IDC_STATIC, "Button", BS_GROUPBOX, 4,1,298,30 EDITTEXT IDC_PATH, 10,11,278,13, WS_VISIBLE - CONTROL "Installazione del Boot loader", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,41 + CONTROL "Installazione del Boot loader", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,52 - CONTROL "Installazione del Boot loader sul disco fisso (MBR)", IDC_INSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,46,278,11 - CONTROL "Non installare il Boot loader", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,57,278,11 - PUSHBUTTON "&OK", IDOK, 180,83,50,15, WS_TABSTOP | WS_VISIBLE - PUSHBUTTON "&Annulla", IDCANCEL, 240,83,50,15, WS_TABSTOP | WS_VISIBLE + CONTROL "Installazione del Boot loader sul disco fisso (MBR e VBR)", IDC_INSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,46,278,11 + CONTROL "Installazione del Boot loader sul disco fisso (solo VBR)", IDC_INSTVBRONLY, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,57,278,11 + CONTROL "Non installare il Boot loader", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,68,278,11 + PUSHBUTTON "&OK", IDOK, 180,94,50,15, WS_TABSTOP | WS_VISIBLE + PUSHBUTTON "&Annulla", IDCANCEL, 240,94,50,15, WS_TABSTOP | WS_VISIBLE END IDD_SUMMARYPAGE DIALOGEX 0, 0, 317, 193 diff --git a/reactos/base/setup/reactos/lang/no-NO.rc b/reactos/base/setup/reactos/lang/no-NO.rc index cad018c8e25..a152f312bb0 100644 --- a/reactos/base/setup/reactos/lang/no-NO.rc +++ b/reactos/base/setup/reactos/lang/no-NO.rc @@ -79,7 +79,7 @@ BEGIN PUSHBUTTON "&Avbryt",IDCANCEL,87,68,47,15, WS_VISIBLE|WS_TABSTOP END -IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 105 +IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 116 STYLE WS_VISIBLE|WS_CAPTION|WS_THICKFRAME CAPTION "Avansert partisjon innstillinger" FONT 8, "MS Shell Dlg" @@ -87,12 +87,13 @@ BEGIN CONTROL "Installasjon mappe", IDC_STATIC, "Button", BS_GROUPBOX, 4,1,298,30 EDITTEXT IDC_PATH, 10,11,278,13, WS_VISIBLE - CONTROL "Oppstartslaster installasjon", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,41 + CONTROL "Oppstartslaster installasjon", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,52 - CONTROL "Installer oppstartslaster p harddiskens (MBR)", IDC_INSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,46,278,11 - CONTROL "Ikke installer oppstartslaster", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,57,278,11 - PUSHBUTTON "&OK", IDOK, 180,83,50,15, WS_TABSTOP | WS_VISIBLE - PUSHBUTTON "&Avbryt", IDCANCEL, 240,83,50,15, WS_TABSTOP | WS_VISIBLE + CONTROL "Installer oppstartslaster p harddiskens (MBR og VBR)", IDC_INSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,46,278,11 + CONTROL "Installer oppstartslaster p harddiskens (bare VBR)", IDC_INSTVBRONLY, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,57,278,11 + CONTROL "Ikke installer oppstartslaster", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,68,278,11 + PUSHBUTTON "&OK", IDOK, 180,94,50,15, WS_TABSTOP | WS_VISIBLE + PUSHBUTTON "&Avbryt", IDCANCEL, 240,94,50,15, WS_TABSTOP | WS_VISIBLE END IDD_SUMMARYPAGE DIALOGEX 0, 0, 317, 193 diff --git a/reactos/base/setup/reactos/lang/pl-PL.rc b/reactos/base/setup/reactos/lang/pl-PL.rc index 2a3a4ea6bad..dbb342a0167 100644 --- a/reactos/base/setup/reactos/lang/pl-PL.rc +++ b/reactos/base/setup/reactos/lang/pl-PL.rc @@ -88,7 +88,7 @@ BEGIN PUSHBUTTON "&Anuluj",IDCANCEL,87,68,47,15, WS_VISIBLE|WS_TABSTOP END -IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 105 +IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 116 STYLE WS_VISIBLE|WS_CAPTION|WS_THICKFRAME CAPTION "Zaawansowane ustawienia partycji" FONT 8, "MS Shell Dlg" @@ -96,13 +96,13 @@ BEGIN CONTROL "Folder instalacji", IDC_STATIC, "Button", BS_GROUPBOX, 4,1,298,30 EDITTEXT IDC_PATH, 10,11,278,13, WS_VISIBLE - CONTROL "Instalacja bootloadera", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,41 + CONTROL "Instalacja bootloadera", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,52 CONTROL "Wgraj bootloader na dysk twardy (MBR i VBR)", IDC_INSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,46,278,11 CONTROL "Wgraj bootloader na dysk twardy (tylko VBR)", IDC_INSTVBRONLY, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,57,278,11 - CONTROL "Pomi wgrywanie bootloadera", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,57,278,11 - PUSHBUTTON "&OK", IDOK, 180,83,50,15, WS_TABSTOP | WS_VISIBLE - PUSHBUTTON "&Anuluj", IDCANCEL, 240,83,50,15, WS_TABSTOP | WS_VISIBLE + CONTROL "Pomi wgrywanie bootloadera", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,68,278,11 + PUSHBUTTON "&OK", IDOK, 180,94,50,15, WS_TABSTOP | WS_VISIBLE + PUSHBUTTON "&Anuluj", IDCANCEL, 240,94,50,15, WS_TABSTOP | WS_VISIBLE END IDD_SUMMARYPAGE DIALOGEX 0, 0, 317, 193 diff --git a/reactos/base/setup/reactos/lang/pt-BR.rc b/reactos/base/setup/reactos/lang/pt-BR.rc index 3ed304ce173..22d7a649e89 100644 --- a/reactos/base/setup/reactos/lang/pt-BR.rc +++ b/reactos/base/setup/reactos/lang/pt-BR.rc @@ -79,7 +79,7 @@ BEGIN PUSHBUTTON "&Cancel",IDCANCEL,87,68,47,15, WS_VISIBLE|WS_TABSTOP END -IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 105 +IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 116 STYLE WS_VISIBLE|WS_CAPTION|WS_THICKFRAME CAPTION "Advanced Partition Settings" FONT 8, "MS Shell Dlg" @@ -87,12 +87,13 @@ BEGIN CONTROL "Installation folder", IDC_STATIC, "Button", BS_GROUPBOX, 4,1,298,30 EDITTEXT IDC_PATH, 10,11,278,13, WS_VISIBLE - CONTROL "Boot loader installation", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,41 + CONTROL "Boot loader installation", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,52 - CONTROL "Install boot loader on the hard disk (MBR)", IDC_INSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,46,278,11 - CONTROL "No installation of bootloader", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,57,278,11 - PUSHBUTTON "&OK", IDOK, 180,83,50,15, WS_TABSTOP | WS_VISIBLE - PUSHBUTTON "&Cancel", IDCANCEL, 240,83,50,15, WS_TABSTOP | WS_VISIBLE + CONTROL "Install boot loader on the hard disk (MBR and VBR)", IDC_INSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,46,278,11 + CONTROL "Install boot loader on the hard disk (VBR only)", IDC_INSTVBRONLY, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,57,278,11 + CONTROL "No installation of bootloader", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,68,278,11 + PUSHBUTTON "&OK", IDOK, 180,94,50,15, WS_TABSTOP | WS_VISIBLE + PUSHBUTTON "&Cancel", IDCANCEL, 240,94,50,15, WS_TABSTOP | WS_VISIBLE END IDD_SUMMARYPAGE DIALOGEX 0, 0, 317, 193 diff --git a/reactos/base/setup/reactos/lang/ro-RO.rc b/reactos/base/setup/reactos/lang/ro-RO.rc index c1ffceded5f..2006d93c172 100644 --- a/reactos/base/setup/reactos/lang/ro-RO.rc +++ b/reactos/base/setup/reactos/lang/ro-RO.rc @@ -79,7 +79,7 @@ BEGIN PUSHBUTTON "&Revocare",IDCANCEL,87,68,47,15, WS_VISIBLE|WS_TABSTOP END -IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 105 +IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 116 STYLE WS_VISIBLE|WS_CAPTION|WS_THICKFRAME CAPTION "Setari avansate partitie" FONT 8, "MS Shell Dlg" @@ -87,12 +87,13 @@ BEGIN CONTROL "Folder instalare", IDC_STATIC, "Button", BS_GROUPBOX, 4,1,298,30 EDITTEXT IDC_PATH, 10,11,278,13, WS_VISIBLE - CONTROL "Instalare incarcator", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,41 + CONTROL "Instalare incarcator", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,52 - CONTROL "Instalare incarcator pe hard disc (MBR)", IDC_INSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,46,278,11 - CONTROL "Nu se instaleaza incarcator", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,57,278,11 - PUSHBUTTON "&OK", IDOK, 180,83,50,15, WS_TABSTOP | WS_VISIBLE - PUSHBUTTON "&Revocare", IDCANCEL, 240,83,50,15, WS_TABSTOP | WS_VISIBLE + CONTROL "Instalare incarcator pe hard disc (MBR si VBR)", IDC_INSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,46,278,11 + CONTROL "Instalare incarcator pe hard disc (numai VBR)", IDC_INSTVBRONLY, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,57,278,11 + CONTROL "Nu se instaleaza incarcator", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,68,278,11 + PUSHBUTTON "&OK", IDOK, 180,94,50,15, WS_TABSTOP | WS_VISIBLE + PUSHBUTTON "&Revocare", IDCANCEL, 240,94,50,15, WS_TABSTOP | WS_VISIBLE END IDD_SUMMARYPAGE DIALOGEX 0, 0, 317, 193 diff --git a/reactos/base/setup/reactos/lang/ru-RU.rc b/reactos/base/setup/reactos/lang/ru-RU.rc index 2e49613fb87..c50cc7392f8 100644 --- a/reactos/base/setup/reactos/lang/ru-RU.rc +++ b/reactos/base/setup/reactos/lang/ru-RU.rc @@ -81,7 +81,7 @@ BEGIN PUSHBUTTON "&",IDCANCEL,87,68,47,15, WS_VISIBLE|WS_TABSTOP END -IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 105 +IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 116 STYLE WS_VISIBLE|WS_CAPTION|WS_THICKFRAME CAPTION " " FONT 8, "MS Shell Dlg" @@ -89,12 +89,13 @@ BEGIN CONTROL " ", IDC_STATIC, "Button", BS_GROUPBOX, 4,1,298,30 EDITTEXT IDC_PATH, 10,12,283,14, WS_VISIBLE - CONTROL " ", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,41 + CONTROL " ", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,52 - CONTROL " (MBR)", IDC_INSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,49,278,11 - CONTROL " ", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,60,278,11 - PUSHBUTTON "&OK", IDOK, 180,83,50,15, WS_TABSTOP | WS_VISIBLE - PUSHBUTTON "&", IDCANCEL, 240,83,50,15, WS_TABSTOP | WS_VISIBLE + CONTROL " (MBR VBR)", IDC_INSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,49,278,11 + CONTROL " ( VBR)", IDC_INSTVBRONLY, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,57,278,11 + CONTROL " ", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,68,278,11 + PUSHBUTTON "&OK", IDOK, 180,94,50,15, WS_TABSTOP | WS_VISIBLE + PUSHBUTTON "&", IDCANCEL, 240,94,50,15, WS_TABSTOP | WS_VISIBLE END IDD_SUMMARYPAGE DIALOGEX 0, 0, 317, 193 diff --git a/reactos/base/setup/reactos/lang/sk-SK.rc b/reactos/base/setup/reactos/lang/sk-SK.rc index 6cbeb134664..d28bba3ebfe 100644 --- a/reactos/base/setup/reactos/lang/sk-SK.rc +++ b/reactos/base/setup/reactos/lang/sk-SK.rc @@ -84,7 +84,7 @@ BEGIN PUSHBUTTON "&Zrui",IDCANCEL,87,68,47,15, WS_VISIBLE|WS_TABSTOP END -IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 105 +IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 116 STYLE WS_VISIBLE|WS_CAPTION|WS_THICKFRAME CAPTION "Rozren nastavenia partcie" FONT 8, "MS Shell Dlg" @@ -92,13 +92,13 @@ BEGIN CONTROL "Intalan prieinok", IDC_STATIC, "Button", BS_GROUPBOX, 4,1,298,30 EDITTEXT IDC_PATH, 10,11,278,13, WS_VISIBLE - CONTROL "Intalcia zavdzaa systmu", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,41 + CONTROL "Intalcia zavdzaa systmu", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,52 CONTROL "Naintalova zavdza systmu na pevn disk (MBR a VBR)", IDC_INSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,46,278,11 CONTROL "Naintalova zavdza systmu na pevn disk (iba VBR)", IDC_INSTVBRONLY, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,57,278,11 CONTROL "Nenaintalova zavdza systmu", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,68,278,11 - PUSHBUTTON "&OK", IDOK, 180,83,50,15, WS_TABSTOP | WS_VISIBLE - PUSHBUTTON "&Zrui", IDCANCEL, 240,83,50,15, WS_TABSTOP | WS_VISIBLE + PUSHBUTTON "&OK", IDOK, 180,94,50,15, WS_TABSTOP | WS_VISIBLE + PUSHBUTTON "&Zrui", IDCANCEL, 240,94,50,15, WS_TABSTOP | WS_VISIBLE END IDD_SUMMARYPAGE DIALOGEX 0, 0, 317, 193 diff --git a/reactos/base/setup/reactos/lang/uk-UA.rc b/reactos/base/setup/reactos/lang/uk-UA.rc index 0a5c407f4d1..7e52e71b499 100644 --- a/reactos/base/setup/reactos/lang/uk-UA.rc +++ b/reactos/base/setup/reactos/lang/uk-UA.rc @@ -67,7 +67,7 @@ BEGIN PUSHBUTTON "&", IDC_PARTCREATE, 20,155,50,15 PUSHBUTTON "&", IDC_PARTDELETE, 76,155,50,15 PUSHBUTTON "&", IDC_DEVICEDRIVER, 162,155,50,15, WS_DISABLED - PUSHBUTTON "& ...", IDC_PARTMOREOPTS, 218,155,80,15 + PUSHBUTTON "& ...", IDC_PARTMOREOPTS, 218,155,80,15 LTEXT " ", IDC_STATIC, 10, 180 ,277, 20 END @@ -87,20 +87,21 @@ BEGIN PUSHBUTTON "&",IDCANCEL,87,68,47,15, WS_VISIBLE|WS_TABSTOP END -IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 105 +IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 116 STYLE WS_VISIBLE|WS_CAPTION|WS_THICKFRAME -CAPTION " " +CAPTION " " FONT 8, "MS Shell Dlg" BEGIN - CONTROL " ", IDC_STATIC, "Button", BS_GROUPBOX, 4,1,298,30 + CONTROL " ", IDC_STATIC, "Button", BS_GROUPBOX, 4,1,298,30 EDITTEXT IDC_PATH, 10,11,278,13, WS_VISIBLE - CONTROL " ", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,41 + CONTROL " ", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,52 - CONTROL " (MBR)", IDC_INSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,46,278,11 - CONTROL " ", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,57,278,11 - PUSHBUTTON "&OK", IDOK, 180,83,50,15, WS_TABSTOP | WS_VISIBLE - PUSHBUTTON "&", IDCANCEL, 240,83,50,15, WS_TABSTOP | WS_VISIBLE + CONTROL " (MBR VBR)", IDC_INSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,46,278,11 + CONTROL " ( VBR)", IDC_INSTVBRONLY, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,57,278,11 + CONTROL " ", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,68,278,11 + PUSHBUTTON "&OK", IDOK, 180,94,50,15, WS_TABSTOP | WS_VISIBLE + PUSHBUTTON "&", IDCANCEL, 240,94,50,15, WS_TABSTOP | WS_VISIBLE END IDD_SUMMARYPAGE DIALOGEX 0, 0, 317, 193 @@ -108,7 +109,7 @@ STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYS CAPTION " ReactOS" FONT 8, "MS Shell Dlg" BEGIN - CONTROL " ", IDC_ACTION, "Button", BS_GROUPBOX, 10,0,297,172 + CONTROL " ", IDC_ACTION, "Button", BS_GROUPBOX, 10,0,297,172 LTEXT " .", IDC_STATIC, 10, 180 ,277, 20 END @@ -151,8 +152,8 @@ BEGIN IDS_PROCESSSUBTITLE " , , " IDS_RESTARTTITLE " " IDS_RESTARTSUBTITLE " , " - IDS_SUMMARYTITLE " " - IDS_SUMMARYSUBTITLE " , " + IDS_SUMMARYTITLE " " + IDS_SUMMARYSUBTITLE " , " IDS_ABORTSETUP "ReactOS ' . , ReactOS. , ?" IDS_ABORTSETUP2 " ?" END diff --git a/reactos/base/setup/vmwinst/lang/uk-UA.rc b/reactos/base/setup/vmwinst/lang/uk-UA.rc index 9f8ffceaacd..f7178e79aa7 100644 --- a/reactos/base/setup/vmwinst/lang/uk-UA.rc +++ b/reactos/base/setup/vmwinst/lang/uk-UA.rc @@ -10,24 +10,24 @@ LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT IDD_WELCOMEPAGE DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION " " +CAPTION " " FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN - LTEXT " ReactOS , ReactOS VMware(r).", -1, 117, 8, 140, 24 - LTEXT " SVGA VMware(r), """", """".", -1, 117, 140, 140, 17 + LTEXT " ReactOS , ReactOS VMware(r).", -1, 117, 8, 140, 24 + LTEXT " SVGA VMware(r), """", """".", -1, 117, 140, 140, 24 END IDD_INSERT_VMWARE_TOOLS DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION " " +CAPTION " " FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN - LTEXT " ReactOS SVGA VMware(r).\n\n ""VM"" VMware(r) workstation ""Install VMware tools...""\n\n\n """" """", SVGA .",-1,25,25,225,85 + LTEXT " ReactOS SVGA VMware(r).\n\n ""VM"" VMware(r) workstation ""Install VMware tools...""\n\n\n """" """", SVGA .",-1,25,25,225,85 END IDD_INSTALLING_VMWARE_TOOLS DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION " " +CAPTION " " FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN LTEXT "{STATUS}",IDC_INSTALLINGSTATUS,25,68,225,8 @@ -36,10 +36,10 @@ END IDD_CONFIG DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION " " +CAPTION " " FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN - LTEXT " SVGA VMware(r) . :",-1,25,5,225,20 + LTEXT " SVGA VMware(r) . :",-1,25,5,225,20 PUSHBUTTON "640x480", 1120, 25, 30, 65, 15, BS_AUTORADIOBUTTON PUSHBUTTON "800x600", 1400, 25, 45, 65, 15, BS_AUTORADIOBUTTON PUSHBUTTON "1024x768", 1792, 25, 60, 65, 15, BS_AUTORADIOBUTTON @@ -57,48 +57,48 @@ END IDD_INSTALLATION_FAILED DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION " " +CAPTION " " FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN - LTEXT " ReactOS SVGA VMware(r).\n\n\n """" .",-1,25,25,225,85 + LTEXT " ReactOS SVGA VMware(r).\n\n\n """" .",-1,25,25,225,85 END IDD_CHOOSEACTION DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION " " +CAPTION " " FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN LTEXT "SVGA VMware(r) SVGA .\n\n, :",-1,25,5,225,30 PUSHBUTTON " ", IDC_CONFIGSETTINGS, 25, 40, 200, 15, BS_AUTORADIOBUTTON PUSHBUTTON " ", IDC_USEOTHERDRIVER, 25, 55, 200, 15, BS_AUTORADIOBUTTON PUSHBUTTON " SVGA VMware(r)", IDC_UNINSTALL, 25, 70, 200, 15, BS_AUTORADIOBUTTON - LTEXT " """" """" .", -1, 25, 93, 225, 12 + LTEXT " """" """" .", -1, 25, 93, 225, 17 END IDD_SELECTDRIVER DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION " " +CAPTION " " FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN LTEXT " , :",-1,25,25,225,15 PUSHBUTTON "ReactOS VGA ", IDC_VGA, 25, 40, 225, 15, BS_AUTORADIOBUTTON PUSHBUTTON "ReactOS VBE (SVGA)", IDC_VBE, 25, 55, 225, 15, BS_AUTORADIOBUTTON - LTEXT " """" """" .", -1, 25, 93, 225, 20 + LTEXT " """" """" .", -1, 25, 93, 225, 20 END IDD_DOUNINSTALL DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION " " +CAPTION " " FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN - LTEXT " ReactOS SVGA VMWare(r)!!!\n\n\n """" """" .",-1,25,25,225,85 + LTEXT " ReactOS SVGA VMWare(r)!!!\n\n\n """" """" .",-1,25,25,225,85 END STRINGTABLE BEGIN IDS_WIZARD_NAME " VMware(r)" - IDS_FAILEDTOLOCATEDRIVERS " ReactOS .\n, CD-ROM VMware(r) tools ." - IDS_FAILEDTOCOPYFILES " ReactOS .\n, CD-ROM VMware(r) tools .\n" + IDS_FAILEDTOLOCATEDRIVERS " ReactOS .\n, CD-ROM VMware(r) tools ." + IDS_FAILEDTOCOPYFILES " ReactOS .\n, CD-ROM VMware(r) tools .\n" IDS_FAILEDTOACTIVATEDRIVER " SVGA VMware(r)!" IDS_FAILEDTOSELVGADRIVER " ReactOS VGA !" IDS_FAILEDTOSELVBEDRIVER " ReactOS VBE !" @@ -122,18 +122,18 @@ END STRINGTABLE BEGIN - IDD_INSERT_VMWARE_TOOLSTITLE " SVGA VMware (r)" + IDD_INSERT_VMWARE_TOOLSTITLE " SVGA VMware (r)" IDD_INSERT_VMWARE_TOOLSSUBTITLE " VMware tools." - IDD_INSTALLING_VMWARE_TOOLSTITLE " SVGA VMware (r)" + IDD_INSTALLING_VMWARE_TOOLSTITLE " SVGA VMware (r)" IDD_INSTALLING_VMWARE_TOOLSSUBTITLE " SVGA VMware (r)." - IDD_CONFIGTITLE " SVGA VMware (r)" - IDD_CONFIGSUBTITLE " ." - IDD_INSTALLATION_FAILEDTITLE " SVGA VMware (r)" - IDD_INSTALLATION_FAILEDSUBTITLE " SVGA VMware (r) ." - IDD_CHOOSEACTIONTITLE " SVGA VMware (r)" + IDD_CONFIGTITLE " SVGA VMware (r)" + IDD_CONFIGSUBTITLE " ." + IDD_INSTALLATION_FAILEDTITLE " SVGA VMware (r)" + IDD_INSTALLATION_FAILEDSUBTITLE " SVGA VMware (r) ." + IDD_CHOOSEACTIONTITLE " SVGA VMware (r)" IDD_CHOOSEACTIONSUBTITLE ", ." - IDD_SELECTDRIVERTITLE " SVGA VMware (r)" + IDD_SELECTDRIVERTITLE " SVGA VMware (r)" IDD_SELECTDRIVERSUBTITLE " ." - IDD_DOUNINSTALLTITLE " SVGA VMware (r)" + IDD_DOUNINSTALLTITLE " SVGA VMware (r)" IDD_DOUNINSTALLSUBTITLE " ." END diff --git a/reactos/base/shell/explorer-new/lang/uk-UA.rc b/reactos/base/shell/explorer-new/lang/uk-UA.rc index 65462be70a4..71e96fe477a 100644 --- a/reactos/base/shell/explorer-new/lang/uk-UA.rc +++ b/reactos/base/shell/explorer-new/lang/uk-UA.rc @@ -128,7 +128,7 @@ BEGIN IDS_PROPERTIES "&" IDS_OPEN_ALL_USERS "& " IDS_EXPLORE_ALL_USERS "& " - IDS_STARTUP_ERROR "The system cannot start explorer because the registry is corrupted or unavailable." + IDS_STARTUP_ERROR " explorer, ." END STRINGTABLE DISCARDABLE diff --git a/reactos/base/shell/explorer/explorer-uk.rc b/reactos/base/shell/explorer/explorer-uk.rc index 271ba94ccfd..1d3f8ae757e 100644 --- a/reactos/base/shell/explorer/explorer-uk.rc +++ b/reactos/base/shell/explorer/explorer-uk.rc @@ -174,27 +174,27 @@ FONT 8, "MS Shell Dlg" BEGIN LTEXT " :", IDC_STATIC,7,7,166,16 - CONTROL "left/top dwn",IDC_ICON_ALIGN_0,"Button",BS_OWNERDRAW | + CONTROL "/ ",IDC_ICON_ALIGN_0,"Button",BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,7,25,46,44 - CONTROL "left/top right",IDC_ICON_ALIGN_1,"Button",BS_OWNERDRAW | + CONTROL "/ ",IDC_ICON_ALIGN_1,"Button",BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,57,25,46,44 - CONTROL "right/top left",IDC_ICON_ALIGN_2,"Button",BS_OWNERDRAW | + CONTROL "/ ",IDC_ICON_ALIGN_2,"Button",BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,110,25,46,44 - CONTROL "rig./top dwn",IDC_ICON_ALIGN_3,"Button",BS_OWNERDRAW | + CONTROL "/ ",IDC_ICON_ALIGN_3,"Button",BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,159,25,46,44 - CONTROL "left/bot. up",IDC_ICON_ALIGN_4,"Button",BS_OWNERDRAW | + CONTROL "/ ",IDC_ICON_ALIGN_4,"Button",BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,7,73,46,44 - CONTROL "left/bot. right",IDC_ICON_ALIGN_5,"Button",BS_OWNERDRAW | + CONTROL "/ ",IDC_ICON_ALIGN_5,"Button",BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,57,73,46,44 - CONTROL "right/bot. left",IDC_ICON_ALIGN_6,"Button",BS_OWNERDRAW | + CONTROL "/ ",IDC_ICON_ALIGN_6,"Button",BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,110,73,46,44 - CONTROL "rig./bot. dwn",IDC_ICON_ALIGN_7,"Button",BS_OWNERDRAW | + CONTROL "/ ",IDC_ICON_ALIGN_7,"Button",BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,159,73,46,44 - CONTROL "border down",IDC_ICON_ALIGN_8,"Button",BS_OWNERDRAW | + CONTROL " ",IDC_ICON_ALIGN_8,"Button",BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,7,121,46,44 - CONTROL "border H/V",IDC_ICON_ALIGN_9,"Button",BS_OWNERDRAW | + CONTROL " ",IDC_ICON_ALIGN_9,"Button",BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,57,121,46,44 - CONTROL "round about",IDC_ICON_ALIGN_10,"Button",BS_OWNERDRAW | + CONTROL "",IDC_ICON_ALIGN_10,"Button",BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,110,121,46,44 CONTROL "",IDC_ICON_ALIGN_11,"Button",BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,159,121,46,44 diff --git a/reactos/base/system/format/lang/uk-UA.rc b/reactos/base/system/format/lang/uk-UA.rc index eac761efea2..d54b4a00f10 100644 --- a/reactos/base/system/format/lang/uk-UA.rc +++ b/reactos/base/system/format/lang/uk-UA.rc @@ -69,7 +69,7 @@ STRING_ENTER_LABEL "̳ STRING_NO_LABEL " " -STRING_FREE_SPACE "\n%I64d .\n%I64d .\n" +STRING_FREE_SPACE "\n%I64d .\n%I64d .\n" STRING_SERIAL_NUMBER "\n - %04X-%04X\n" END diff --git a/reactos/dll/cpl/usrmgr/lang/uk-UA.rc b/reactos/dll/cpl/usrmgr/lang/uk-UA.rc new file mode 100644 index 00000000000..36c118c9b1d --- /dev/null +++ b/reactos/dll/cpl/usrmgr/lang/uk-UA.rc @@ -0,0 +1,223 @@ +LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT + +/* + * Attention Translators: + * DO NOT TRANSLATE THESE RESOURCES YET! + */ + +/* Dialogs */ + +IDD_USERS DIALOGEX DISCARDABLE 0, 0, 252, 223 +STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "" +FONT 8, "MS Shell Dlg" +BEGIN + CONTROL "", IDC_USERS_LIST, "SysListView32", LVS_REPORT | LVS_EDITLABELS | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SORTASCENDING | WS_BORDER | WS_TABSTOP, + 7, 7, 238, 85, WS_EX_CLIENTEDGE +END + + +IDD_GROUPS DIALOGEX DISCARDABLE 0, 0, 252, 223 +STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "" +FONT 8, "MS Shell Dlg" +BEGIN + CONTROL "", IDC_GROUPS_LIST, "SysListView32", LVS_REPORT | LVS_EDITLABELS | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SORTASCENDING | WS_BORDER | WS_TABSTOP, + 7, 7, 238, 85, WS_EX_CLIENTEDGE +END + + +IDD_EXTRA DIALOGEX DISCARDABLE 0, 0, 252, 223 +STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT " ", IDC_STATIC, 66, 90, 112, 8 +END + + +IDD_USER_GENERAL DIALOGEX DISCARDABLE 0, 0, 252, 223 +STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "", IDC_USER_GENERAL_NAME, 7, 12, 112, 8 + LTEXT " ':", -1, 7, 46, 63, 8 + EDITTEXT IDC_USER_GENERAL_FULL_NAME,77,43,168,13,ES_AUTOHSCROLL + LTEXT ":", -1, 7, 64, 63, 8 + EDITTEXT IDC_USER_GENERAL_DESCRIPTION,77,61,168,13,ES_AUTOHSCROLL + AUTOCHECKBOX " ",IDC_USER_GENERAL_FORCE_CHANGE,7,82,210,10 + AUTOCHECKBOX " ",IDC_USER_GENERAL_CANNOT_CHANGE,7,95,210,10 + AUTOCHECKBOX " 䳿 ",IDC_USER_GENERAL_NEVER_EXPIRES,7,108,210,10 + AUTOCHECKBOX " ",IDC_USER_GENERAL_DISABLED,7,121,210,10 + AUTOCHECKBOX " ",IDC_USER_GENERAL_LOCKED,7,134,210,10 +END + + +IDD_USER_MEMBERSHIP DIALOGEX DISCARDABLE 0, 0, 252, 223 +STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT " :", -1, 7, 7, 56, 8 + CONTROL "", IDC_USER_MEMBERSHIP_LIST, "SysListView32", LVS_REPORT | LVS_NOCOLUMNHEADER | LVS_SORTASCENDING | WS_BORDER | WS_TABSTOP, + 7, 18, 238, 173, WS_EX_CLIENTEDGE + PUSHBUTTON "...", IDC_USER_MEMBERSHIP_ADD, 7, 197, 50, 14 + PUSHBUTTON "", IDC_USER_MEMBERSHIP_REMOVE, 61, 197, 50, 14, WS_DISABLED +END + + +IDD_USER_PROFILE DIALOGEX DISCARDABLE 0, 0, 252, 223 +STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "" +FONT 8, "MS Shell Dlg" +BEGIN + GROUPBOX " ", -1, 7, 7, 238, 54 + LTEXT " :", -1, 16, 22, 55, 8 + EDITTEXT IDC_USER_PROFILE_PATH, 78, 19, 160, 13, ES_AUTOHSCROLL + LTEXT " :", -1, 16, 40, 55, 8 + EDITTEXT IDC_USER_PROFILE_SCRIPT, 78, 37, 160, 13, ES_AUTOHSCROLL + + GROUPBOX " ", -1, 7, 68, 238, 54 + AUTORADIOBUTTON " :", IDC_USER_PROFILE_LOCAL, 16, 83, 60, 10 + AUTORADIOBUTTON "ϳ':", IDC_USER_PROFILE_REMOTE, 16, 100, 60, 10 + EDITTEXT IDC_USER_PROFILE_LOCAL_PATH, 78, 81, 160, 13, ES_AUTOHSCROLL + COMBOBOX IDC_USER_PROFILE_DRIVE, 78, 99, 26, 160, CBS_DROPDOWNLIST | CBS_SORT | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL + LTEXT ":", -1, 112, 101, 12, 8 + EDITTEXT IDC_USER_PROFILE_REMOTE_PATH, 130, 99, 108, 13, ES_AUTOHSCROLL +END + + +IDD_GROUP_GENERAL DIALOGEX DISCARDABLE 0, 0, 252, 223 +STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "", IDC_GROUP_GENERAL_NAME, 7, 12, 112, 8 + LTEXT ":", -1, 7, 45, 46, 8 + EDITTEXT IDC_GROUP_GENERAL_DESCRIPTION,65,42,180,13,ES_AUTOHSCROLL + LTEXT ":", -1, 7, 63, 45, 8 + CONTROL "", IDC_GROUP_GENERAL_MEMBERS, "SysListView32", LVS_REPORT | LVS_NOCOLUMNHEADER | LVS_SORTASCENDING | WS_BORDER | WS_TABSTOP, + 7, 74, 238, 117, WS_EX_CLIENTEDGE + PUSHBUTTON "...", IDC_GROUP_GENERAL_ADD, 7, 197, 50, 14 + PUSHBUTTON "", IDC_GROUP_GENERAL_REMOVE, 61, 197, 50, 14, WS_DISABLED +END + + +IDD_CHANGE_PASSWORD DIALOGEX DISCARDABLE 0, 0, 267, 74 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | DS_SHELLFONT +CAPTION " " +FONT 8, "MS Shell Dlg" +BEGIN + EDITTEXT IDC_EDIT_PASSWORD1,107,7,153,14,ES_AUTOHSCROLL | ES_PASSWORD + RTEXT " :", -1,7,10,96,8 + EDITTEXT IDC_EDIT_PASSWORD2,107,25,153,14,ES_AUTOHSCROLL | ES_PASSWORD + RTEXT " :", -1,7,28,96,8 + DEFPUSHBUTTON "OK",IDOK,156,53,50,14 + PUSHBUTTON "",IDCANCEL,210,53,50,14 +END + + +IDD_USER_NEW DIALOGEX DISCARDABLE 0, 0, 267, 200 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | DS_SHELLFONT +CAPTION " " +FONT 8, "MS Shell Dlg" +BEGIN + EDITTEXT IDC_USER_NEW_NAME,107,7,153,14,ES_AUTOHSCROLL + RTEXT "' :", -1,7,10,96,8 + EDITTEXT IDC_USER_NEW_FULL_NAME,107,25,153,14,ES_AUTOHSCROLL + RTEXT " ' :", -1,7,28,96,8 + EDITTEXT IDC_USER_NEW_DESCRIPTION,107,43,153,14,ES_AUTOHSCROLL + RTEXT ":", -1,7,46,96,8 + EDITTEXT IDC_USER_NEW_PASSWORD1,107,67,153,14,ES_AUTOHSCROLL | ES_PASSWORD + RTEXT ":", -1,7,70,96,8 + EDITTEXT IDC_USER_NEW_PASSWORD2,107,85,153,14,ES_AUTOHSCROLL | ES_PASSWORD + RTEXT " :", -1,7,88,96,8 + AUTOCHECKBOX " ",IDC_USER_NEW_FORCE_CHANGE,7,109,200,10 + AUTOCHECKBOX " ",IDC_USER_NEW_CANNOT_CHANGE,7,123,200,10,WS_DISABLED + AUTOCHECKBOX " 䳿 ",IDC_USER_NEW_NEVER_EXPIRES,7,137,200,10,WS_DISABLED + AUTOCHECKBOX " ",IDC_USER_NEW_DISABLED,7,151,200,10 + DEFPUSHBUTTON "OK",IDOK,156,179,50,14,WS_DISABLED + PUSHBUTTON "",IDCANCEL,210,179,50,14 +END + + +IDD_GROUP_NEW DIALOGEX DISCARDABLE 0, 0, 267, 74 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | DS_SHELLFONT +CAPTION " " +FONT 8, "MS Shell Dlg" +BEGIN + EDITTEXT IDC_GROUP_NEW_NAME,107,7,153,14,ES_AUTOHSCROLL + RTEXT " :", -1,7,10,96,8 + EDITTEXT IDC_GROUP_NEW_DESCRIPTION,107,25,153,14,ES_AUTOHSCROLL + RTEXT ":", -1,7,28,96,8 + DEFPUSHBUTTON "OK",IDOK,156,53,50,14,WS_DISABLED + PUSHBUTTON "",IDCANCEL,210,53,50,14 +END + + +IDD_USER_ADD_MEMBERSHIP DIALOGEX DISCARDABLE 0, 0, 252, 223 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | DS_SHELLFONT +CAPTION " " +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT " :", -1, 7, 7, 56, 8 + CONTROL "", IDC_USER_ADD_MEMBERSHIP_LIST, "SysListView32", LVS_REPORT | LVS_SHOWSELALWAYS | LVS_SORTASCENDING | WS_BORDER | WS_TABSTOP, + 7, 18, 238, 173, WS_EX_CLIENTEDGE + DEFPUSHBUTTON "OK",IDOK,141,197,50,14 + PUSHBUTTON "",IDCANCEL,195,197,50,14 +END + + +/* Menus */ + +IDM_POPUP_GROUP MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM " ...", IDM_GROUP_NEW + END + POPUP "" + BEGIN + MENUITEM " ", IDM_GROUP_ADD_MEMBER, GRAYED + MENUITEM SEPARATOR + MENUITEM "", IDM_GROUP_DELETE + MENUITEM "", IDM_GROUP_RENAME + MENUITEM SEPARATOR + MENUITEM "", IDM_GROUP_PROPERTIES + END +END + + +IDM_POPUP_USER MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM " ...", IDM_USER_NEW + END + POPUP "" + BEGIN + MENUITEM " ", IDM_USER_CHANGE_PASSWORD + MENUITEM SEPARATOR + MENUITEM "", IDM_USER_DELETE + MENUITEM "", IDM_USER_RENAME + MENUITEM SEPARATOR + MENUITEM "", IDM_USER_PROPERTIES + END +END + + +/* Strings */ + +STRINGTABLE +BEGIN + IDS_CPLNAME " " + IDS_CPLDESCRIPTION " ." +END + +STRINGTABLE +BEGIN + IDS_NAME "'" + IDS_FULLNAME " '" + IDS_DESCRIPTION "" +END diff --git a/reactos/dll/cpl/usrmgr/rsrc.rc b/reactos/dll/cpl/usrmgr/rsrc.rc index 7f2108c7e81..42a24ad3303 100644 --- a/reactos/dll/cpl/usrmgr/rsrc.rc +++ b/reactos/dll/cpl/usrmgr/rsrc.rc @@ -7,3 +7,4 @@ #include "lang/fr-FR.rc" #include "lang/pl-PL.rc" #include "lang/ru-RU.rc" +#include "lang/uk-UA.rc" diff --git a/reactos/subsystems/win32/csrss/win32csr/lang/uk-UA.rc b/reactos/subsystems/win32/csrss/win32csr/lang/uk-UA.rc index 213de546b40..f419341da73 100644 --- a/reactos/subsystems/win32/csrss/win32csr/lang/uk-UA.rc +++ b/reactos/subsystems/win32/csrss/win32csr/lang/uk-UA.rc @@ -62,5 +62,5 @@ BEGIN IDS_SCROLLUP " " IDS_SCROLLDOWN " " - IDS_COMMAND_PROMPT "Command Prompt" + IDS_COMMAND_PROMPT " " END From 1b2e00d581c321f464bdb72777493ca8a7831f96 Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Thu, 14 Apr 2011 12:20:47 +0000 Subject: [PATCH 147/317] [RTL] - If there is no data provided and parameters are valid, fail with STATUS_SXS_KEY_NOT_FOUND. svn path=/trunk/; revision=51339 --- reactos/lib/rtl/actctx.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/reactos/lib/rtl/actctx.c b/reactos/lib/rtl/actctx.c index 562240c2b61..2abea6e172c 100644 --- a/reactos/lib/rtl/actctx.c +++ b/reactos/lib/rtl/actctx.c @@ -2710,6 +2710,10 @@ RtlFindActivationContextSectionString( ULONG flags, const GUID *guid, ULONG sect status = STATUS_SXS_KEY_NOT_FOUND; + /* if there is no data, but params are valid, + we return that sxs key is not found to be at least somehow compatible */ + if (!data) return status; + ASSERT(NtCurrentTeb()); ASSERT(NtCurrentTeb()->ActivationContextStackPointer); From 3b717045b6d4510280f5dba6895d9890985455b0 Mon Sep 17 00:00:00 2001 From: Michael Martin Date: Fri, 15 Apr 2011 06:44:13 +0000 Subject: [PATCH 148/317] [usbdriver] - KbdDispatch: Set Status vice IoStatus.Status for all branches of switch. Use break instead of goto intcontfailure. The previous code would set Status to what ever was in the IoStatus.Status of the IRP and return that Status. Some times this would be STATUS_PENDING, which IIRC is a no-no. This caused the kbdclass to enter into a wait that would never be satisifed hence blocking the keyboard thread. This should fix the failure of keyboard input bugs. svn path=/trunk/; revision=51344 --- .../usb/nt4compat/usbdriver/keyboard.c | 25 ++++++++----------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/reactos/drivers/usb/nt4compat/usbdriver/keyboard.c b/reactos/drivers/usb/nt4compat/usbdriver/keyboard.c index 4194dcf0655..cc61daac0c9 100644 --- a/reactos/drivers/usb/nt4compat/usbdriver/keyboard.c +++ b/reactos/drivers/usb/nt4compat/usbdriver/keyboard.c @@ -392,8 +392,8 @@ KbdDispatch(PDEVICE_OBJECT DeviceObject, PIRP Irp) if (Stack->Parameters.DeviceIoControl.InputBufferLength < sizeof(CONNECT_DATA)) { usb_dbg_print(DBGLVL_MAXIMUM, ("Keyboard IOCTL_INTERNAL_KEYBOARD_CONNECT " "invalid buffer size\n")); - Irp->IoStatus.Status = STATUS_INVALID_PARAMETER; - goto intcontfailure; + Status = STATUS_INVALID_PARAMETER; + break; } RtlCopyMemory(&DeviceExtension->ConnectData, @@ -408,14 +408,14 @@ KbdDispatch(PDEVICE_OBJECT DeviceObject, PIRP Irp) sizeof(KEYBOARD_ATTRIBUTES)) { usb_dbg_print(DBGLVL_MAXIMUM, ("Keyboard IOCTL_KEYBOARD_QUERY_ATTRIBUTES: " "invalid buffer size\n")); - Irp->IoStatus.Status = STATUS_BUFFER_TOO_SMALL; - goto intcontfailure; + Status = STATUS_BUFFER_TOO_SMALL; + break; } /*RtlCopyMemory(Irp->AssociatedIrp.SystemBuffer, &DevExt->KeyboardAttributes, sizeof(KEYBOARD_ATTRIBUTES));*/ - Irp->IoStatus.Status = STATUS_SUCCESS; + Status = STATUS_SUCCESS; break; case IOCTL_KEYBOARD_QUERY_INDICATORS: usb_dbg_print(DBGLVL_MAXIMUM, ("IOCTL_KEYBOARD_QUERY_INDICATORS\n")); @@ -439,8 +439,8 @@ KbdDispatch(PDEVICE_OBJECT DeviceObject, PIRP Irp) sizeof(KEYBOARD_TYPEMATIC_PARAMETERS)) { usb_dbg_print(DBGLVL_MAXIMUM, ("Keyboard IOCTL_KEYBOARD_QUERY_TYPEMATIC: " "invalid buffer size\n")); - Irp->IoStatus.Status = STATUS_BUFFER_TOO_SMALL; - goto intcontfailure; + Status = STATUS_BUFFER_TOO_SMALL; + break; } /*RtlCopyMemory(Irp->AssociatedIrp.SystemBuffer, &DevExt->KeyboardTypematic, @@ -454,8 +454,8 @@ KbdDispatch(PDEVICE_OBJECT DeviceObject, PIRP Irp) sizeof(KEYBOARD_INDICATOR_PARAMETERS)) { usb_dbg_print(DBGLVL_MAXIMUM, ("Keyboard IOCTL_KEYBOARD_SET_INDICTATORS: " "invalid buffer size\n")); - Irp->IoStatus.Status = STATUS_BUFFER_TOO_SMALL; - goto intcontfailure; + Status = STATUS_BUFFER_TOO_SMALL; + break; } RtlCopyMemory(&DeviceExtension->KeyboardIndicators, @@ -472,8 +472,8 @@ KbdDispatch(PDEVICE_OBJECT DeviceObject, PIRP Irp) sizeof(KEYBOARD_TYPEMATIC_PARAMETERS)) { usb_dbg_print(DBGLVL_MAXIMUM, ("Keyboard IOCTL_KEYBOARD_SET_TYPEMATIC " "invalid buffer size\n")); - Irp->IoStatus.Status = STATUS_BUFFER_TOO_SMALL; - goto intcontfailure; + Status = STATUS_BUFFER_TOO_SMALL; + break; } /*RtlCopyMemory(&DevExt->KeyboardTypematic, @@ -501,11 +501,8 @@ KbdDispatch(PDEVICE_OBJECT DeviceObject, PIRP Irp) Status = STATUS_SUCCESS;//STATUS_INVALID_DEVICE_REQUEST; break; } -intcontfailure: - Status = Irp->IoStatus.Status; } - if (Status == STATUS_INVALID_DEVICE_REQUEST) { usb_dbg_print(DBGLVL_MINIMUM, ("Invalid internal device request!\n")); From a2b8986a0dc357f011fbb0522533121058de6e5a Mon Sep 17 00:00:00 2001 From: Michael Martin Date: Fri, 15 Apr 2011 07:10:00 +0000 Subject: [PATCH 149/317] [win32k] - Move dereferencing of the MessageQueue from co_UserDestroyWindow to co_UserFreeWindow. A reference is added to the MessageQueue for all windows created.co_UserFreeWindow is called for all windows and needs to be where the dereferencing of MessageQueue occurs. This fixes NonPagedPool memory leak. See bug 6112 for more info. svn path=/trunk/; revision=51345 --- reactos/subsystems/win32/win32k/ntuser/window.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/subsystems/win32/win32k/ntuser/window.c b/reactos/subsystems/win32/win32k/ntuser/window.c index d11c0df436c..fe362174aa9 100644 --- a/reactos/subsystems/win32/win32k/ntuser/window.c +++ b/reactos/subsystems/win32/win32k/ntuser/window.c @@ -448,6 +448,8 @@ static LRESULT co_UserFreeWindow(PWND Window, /* flush the message queue */ MsqRemoveWindowMessagesFromQueue(Window); + IntDereferenceMessageQueue(Window->head.pti->MessageQueue); + /* from now on no messages can be sent to this window anymore */ Window->state |= WNDS_DESTROYED; Window->fnid |= FNID_FREED; @@ -2508,8 +2510,6 @@ BOOLEAN FASTCALL co_UserDestroyWindow(PWND Window) } } - IntDereferenceMessageQueue(Window->head.pti->MessageQueue); - IntEngWindowChanged(Window, WOC_DELETE); if (!IntIsWindow(Window->head.h)) From 706a9911e23ef8f6b0ab15328a06d7a831cbf04a Mon Sep 17 00:00:00 2001 From: Matthias Kupfer Date: Fri, 15 Apr 2011 12:16:26 +0000 Subject: [PATCH 150/317] potential memory problem fixed, obsolete assignment removed svn path=/trunk/; revision=51346 --- reactos/base/applications/taskmgr/trayicon.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/reactos/base/applications/taskmgr/trayicon.c b/reactos/base/applications/taskmgr/trayicon.c index 92617e6556d..42d27822772 100644 --- a/reactos/base/applications/taskmgr/trayicon.c +++ b/reactos/base/applications/taskmgr/trayicon.c @@ -100,8 +100,6 @@ HICON TrayIcon_GetProcessorUsageIcon(void) hOldBitmap = NULL; iconInfo.fIcon = TRUE; - iconInfo.xHotspot = 0; - iconInfo.yHotspot = 0; iconInfo.hbmMask = hBitmapMask; iconInfo.hbmColor = hBitmap; @@ -133,7 +131,7 @@ BOOL TrayIcon_ShellAddTrayIcon(void) NOTIFYICONDATAW nid; HICON hIcon = NULL; BOOL bRetVal; - WCHAR szMsg[256]; + WCHAR szMsg[64]; memset(&nid, 0, sizeof(NOTIFYICONDATAW)); @@ -181,7 +179,7 @@ BOOL TrayIcon_ShellUpdateTrayIcon(void) NOTIFYICONDATAW nid; HICON hIcon = NULL; BOOL bRetVal; - WCHAR szTemp[256]; + WCHAR szTemp[64]; memset(&nid, 0, sizeof(NOTIFYICONDATAW)); @@ -193,7 +191,7 @@ BOOL TrayIcon_ShellUpdateTrayIcon(void) nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP; nid.uCallbackMessage = WM_ONTRAYICON; nid.hIcon = hIcon; - LoadStringW(hInst, IDS_MSG_TRAYICONCPUUSAGE, szTemp, 256); + LoadStringW(hInst, IDS_MSG_TRAYICONCPUUSAGE, szTemp, sizeof(szTemp)/sizeof(szTemp[0])); wsprintfW(nid.szTip, szTemp, PerfDataGetProcessorUsage()); bRetVal = Shell_NotifyIconW(NIM_MODIFY, &nid); From ae8ebc72e4ccb88138dc3259c52404ddb18201f7 Mon Sep 17 00:00:00 2001 From: Matthias Kupfer Date: Fri, 15 Apr 2011 12:17:50 +0000 Subject: [PATCH 151/317] property svn:executable removed svn path=/trunk/; revision=51347 --- reactos/subsystems/win32/win32k/objects/drawing.c | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 reactos/subsystems/win32/win32k/objects/drawing.c diff --git a/reactos/subsystems/win32/win32k/objects/drawing.c b/reactos/subsystems/win32/win32k/objects/drawing.c old mode 100755 new mode 100644 From ce720bbf52694a90320adba7834dd1c89e39a453 Mon Sep 17 00:00:00 2001 From: Rafal Harabien Date: Fri, 15 Apr 2011 14:29:14 +0000 Subject: [PATCH 152/317] [SYSSETUP] * Computer name length is limited to 15 characters, not 63. Fixes possible buffer overflow * Spotted by Victor Martinez svn path=/trunk/; revision=51349 --- reactos/dll/win32/syssetup/globals.h | 2 +- reactos/dll/win32/syssetup/wizard.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/reactos/dll/win32/syssetup/globals.h b/reactos/dll/win32/syssetup/globals.h index 0e94ff1a776..fe60318234e 100644 --- a/reactos/dll/win32/syssetup/globals.h +++ b/reactos/dll/win32/syssetup/globals.h @@ -43,7 +43,7 @@ typedef struct _SETUPDATA WCHAR OwnerName[51]; WCHAR OwnerOrganization[51]; - WCHAR ComputerName[MAX_COMPUTERNAME_LENGTH + 1]; /* max. 63 characters */ + WCHAR ComputerName[MAX_COMPUTERNAME_LENGTH + 1]; /* max. 15 characters */ WCHAR AdminPassword[15]; /* max. 14 characters */ BOOL UnattendSetup; BOOL DisableVmwInst; diff --git a/reactos/dll/win32/syssetup/wizard.c b/reactos/dll/win32/syssetup/wizard.c index de46e556ad5..fc37c40e368 100644 --- a/reactos/dll/win32/syssetup/wizard.c +++ b/reactos/dll/win32/syssetup/wizard.c @@ -596,7 +596,7 @@ ComputerPageDlgProc(HWND hwndDlg, SetDlgItemTextW(hwndDlg, IDC_COMPUTERNAME, ComputerName); /* Set text limits */ - SendDlgItemMessage(hwndDlg, IDC_COMPUTERNAME, EM_LIMITTEXT, 64, 0); + SendDlgItemMessage(hwndDlg, IDC_COMPUTERNAME, EM_LIMITTEXT, MAX_COMPUTERNAME_LENGTH, 0); SendDlgItemMessage(hwndDlg, IDC_ADMINPASSWORD1, EM_LIMITTEXT, 14, 0); SendDlgItemMessage(hwndDlg, IDC_ADMINPASSWORD2, EM_LIMITTEXT, 14, 0); @@ -630,7 +630,7 @@ ComputerPageDlgProc(HWND hwndDlg, break; case PSN_WIZNEXT: - if (GetDlgItemTextW(hwndDlg, IDC_COMPUTERNAME, ComputerName, 64) == 0) + if (0 == GetDlgItemTextW(hwndDlg, IDC_COMPUTERNAME, ComputerName, MAX_COMPUTERNAME_LENGTH + 1)) { if (0 == LoadStringW(hDllInstance, IDS_WZD_COMPUTERNAME, EmptyComputerName, sizeof(EmptyComputerName) / sizeof(EmptyComputerName[0]))) From 8357192be75d3996abdf6e9c69cb444d21c4ae09 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Fri, 15 Apr 2011 15:20:17 +0000 Subject: [PATCH 153/317] [WIN32K] - Use shared locks for surfaces and palettes - Unimplement NtGdiEngUnlockSurface, it was wrong svn path=/trunk/; revision=51351 --- reactos/subsystems/win32/win32k/eng/mouse.c | 4 ++-- reactos/subsystems/win32/win32k/eng/surface.c | 20 +++++++++---------- 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/reactos/subsystems/win32/win32k/eng/mouse.c b/reactos/subsystems/win32/win32k/eng/mouse.c index 00dc0333ccb..42a8aea1634 100644 --- a/reactos/subsystems/win32/win32k/eng/mouse.c +++ b/reactos/subsystems/win32/win32k/eng/mouse.c @@ -390,7 +390,7 @@ EngSetPointerShape( if (!psurfMask) goto failure; /* Initialize an EXLATEOBJ */ - ppal = PALETTE_LockPalette(ppdev->devinfo.hpalDefault); + ppal = PALETTE_ShareLockPalette(ppdev->devinfo.hpalDefault); EXLATEOBJ_vInitialize(&exlo, &gpalMono, ppal, @@ -409,7 +409,7 @@ EngSetPointerShape( /* Cleanup */ EXLATEOBJ_vCleanup(&exlo); - if (ppal) PALETTE_UnlockPalette(ppal); + if (ppal) PALETTE_ShareUnlockPalette(ppal); } /* Hide mouse pointer */ diff --git a/reactos/subsystems/win32/win32k/eng/surface.c b/reactos/subsystems/win32/win32k/eng/surface.c index 6493671a6d8..8e9c62871fc 100644 --- a/reactos/subsystems/win32/win32k/eng/surface.c +++ b/reactos/subsystems/win32/win32k/eng/surface.c @@ -376,7 +376,7 @@ EngAssociateSurface( ppdev = (PDEVOBJ*)hdev; /* Lock the surface */ - psurf = SURFACE_LockSurface(hsurf); + psurf = SURFACE_ShareLockSurface(hsurf); if (!psurf) { return FALSE; @@ -394,7 +394,7 @@ EngAssociateSurface( /* Get palette */ psurf->ppal = PALETTE_ShareLockPalette(ppdev->devinfo.hpalDefault); - SURFACE_UnlockSurface(psurf); + SURFACE_ShareUnlockSurface(psurf); return TRUE; } @@ -415,7 +415,7 @@ EngModifySurface( PSURFACE psurf; PDEVOBJ* ppdev; - psurf = SURFACE_LockSurface(hsurf); + psurf = SURFACE_ShareLockSurface(hsurf); if (psurf == NULL) { return FALSE; @@ -438,7 +438,7 @@ EngModifySurface( /* Get palette */ psurf->ppal = PALETTE_ShareLockPalette(ppdev->devinfo.hpalDefault); - SURFACE_UnlockSurface(psurf); + SURFACE_ShareUnlockSurface(psurf); return TRUE; } @@ -479,19 +479,17 @@ SURFOBJ * APIENTRY EngLockSurface(IN HSURF hsurf) { - SURFACE *psurf = GDIOBJ_ShareLockObj(hsurf, GDI_OBJECT_TYPE_BITMAP); + SURFACE *psurf = SURFACE_ShareLockSurface(hsurf); - if (psurf != NULL) - return &psurf->SurfObj; - - return NULL; + return psurf ? &psurf->SurfObj : NULL; } VOID APIENTRY NtGdiEngUnlockSurface(IN SURFOBJ *pso) { - EngUnlockSurface(pso); + UNIMPLEMENTED; + ASSERT(FALSE); } VOID @@ -501,7 +499,7 @@ EngUnlockSurface(IN SURFOBJ *pso) if (pso != NULL) { SURFACE *psurf = CONTAINING_RECORD(pso, SURFACE, SurfObj); - GDIOBJ_ShareUnlockObjByPtr((POBJ)psurf); + SURFACE_ShareUnlockSurface(psurf); } } From 197cf31913c02e80869aa23b6c8f9bb75f17a0dd Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Fri, 15 Apr 2011 15:29:08 +0000 Subject: [PATCH 154/317] [WIN32K] - Use shared locks for surfaces and palettes svn path=/trunk/; revision=51352 --- .../subsystems/win32/win32k/ntddraw/dxeng.c | 2 +- .../win32/win32k/ntuser/cursoricon.c | 8 ++-- .../subsystems/win32/win32k/objects/bitmaps.c | 6 +-- .../subsystems/win32/win32k/objects/dibobj.c | 8 ++-- .../subsystems/win32/win32k/objects/palette.c | 38 +++++++++---------- 5 files changed, 31 insertions(+), 31 deletions(-) diff --git a/reactos/subsystems/win32/win32k/ntddraw/dxeng.c b/reactos/subsystems/win32/win32k/ntddraw/dxeng.c index 135c048b07b..0f9a1a797a1 100644 --- a/reactos/subsystems/win32/win32k/ntddraw/dxeng.c +++ b/reactos/subsystems/win32/win32k/ntddraw/dxeng.c @@ -743,7 +743,7 @@ DxEngSetDCState(HDC hDC, DWORD SetType, DWORD Set) if (pDC) { if (SetType == 1) - { + { if ( Set ) pDC->fs |= DC_FLAG_FULLSCREEN; else diff --git a/reactos/subsystems/win32/win32k/ntuser/cursoricon.c b/reactos/subsystems/win32/win32k/ntuser/cursoricon.c index 488c2f3ad40..d0322c72b5c 100644 --- a/reactos/subsystems/win32/win32k/ntuser/cursoricon.c +++ b/reactos/subsystems/win32/win32k/ntuser/cursoricon.c @@ -934,24 +934,24 @@ NtUserSetCursorContents( /* Copy new IconInfo field */ CurIcon->IconInfo = IconInfo; - psurfBmp = SURFACE_LockSurface(CurIcon->IconInfo.hbmColor); + psurfBmp = SURFACE_ShareLockSurface(CurIcon->IconInfo.hbmColor); if (psurfBmp) { CurIcon->Size.cx = psurfBmp->SurfObj.sizlBitmap.cx; CurIcon->Size.cy = psurfBmp->SurfObj.sizlBitmap.cy; - SURFACE_UnlockSurface(psurfBmp); + SURFACE_ShareUnlockSurface(psurfBmp); GDIOBJ_SetOwnership(CurIcon->IconInfo.hbmColor, NULL); } else { - psurfBmp = SURFACE_LockSurface(CurIcon->IconInfo.hbmMask); + psurfBmp = SURFACE_ShareLockSurface(CurIcon->IconInfo.hbmMask); if (!psurfBmp) goto done; CurIcon->Size.cx = psurfBmp->SurfObj.sizlBitmap.cx; CurIcon->Size.cy = psurfBmp->SurfObj.sizlBitmap.cy / 2; - SURFACE_UnlockSurface(psurfBmp); + SURFACE_ShareUnlockSurface(psurfBmp); } GDIOBJ_SetOwnership(CurIcon->IconInfo.hbmMask, NULL); diff --git a/reactos/subsystems/win32/win32k/objects/bitmaps.c b/reactos/subsystems/win32/win32k/objects/bitmaps.c index f97462594bd..4d17fecf827 100644 --- a/reactos/subsystems/win32/win32k/objects/bitmaps.c +++ b/reactos/subsystems/win32/win32k/objects/bitmaps.c @@ -119,7 +119,7 @@ GreCreateBitmapEx( } DecompressBitmap(sizl, pvCompressedBits, pvBits, lDelta, iFormat); fjBitmap |= BMF_RLE_HACK; - + iFormat = iFormat == BMF_4RLE ? BMF_4BPP : BMF_8BPP; psurf->SurfObj.iBitmapFormat = iFormat; } @@ -201,7 +201,7 @@ NtGdiCreateBitmap( if (pUnsafeBits && hbmp) { - PSURFACE psurf = SURFACE_LockSurface(hbmp); + PSURFACE psurf = SURFACE_ShareLockSurface(hbmp); _SEH2_TRY { ProbeForRead(pUnsafeBits, cjSize, 1); @@ -215,7 +215,7 @@ NtGdiCreateBitmap( } _SEH2_END - SURFACE_UnlockSurface(psurf); + SURFACE_ShareUnlockSurface(psurf); } return hbmp; diff --git a/reactos/subsystems/win32/win32k/objects/dibobj.c b/reactos/subsystems/win32/win32k/objects/dibobj.c index 2fe1e4ccb00..dfd45ee1541 100644 --- a/reactos/subsystems/win32/win32k/objects/dibobj.c +++ b/reactos/subsystems/win32/win32k/objects/dibobj.c @@ -514,7 +514,7 @@ NtGdiSetDIBitsToDeviceInternal( } /* Lock the DIB palette */ - ppalDIB = PALETTE_LockPalette(hpalDIB); + ppalDIB = PALETTE_ShareLockPalette(hpalDIB); if (!ppalDIB) { EngSetLastError(ERROR_INVALID_HANDLE); @@ -555,7 +555,7 @@ Exit: ret = ScanLines; } - if (ppalDIB) PALETTE_UnlockPalette(ppalDIB); + if (ppalDIB) PALETTE_ShareUnlockPalette(ppalDIB); if (pSourceSurf) EngUnlockSurface(pSourceSurf); if (hSourceBitmap) EngDeleteSurface((HSURF)hSourceBitmap); @@ -1590,7 +1590,7 @@ DIB_CreateDIBSection( EngSetLastError(ERROR_NO_SYSTEM_RESOURCES); goto cleanup; } - bmp = SURFACE_LockSurface(res); + bmp = SURFACE_ShareLockSurface(res); // HACK if (NULL == bmp) { DPRINT1("SURFACE_LockSurface failed\n"); @@ -1646,7 +1646,7 @@ cleanup: if (bmp) { - SURFACE_UnlockSurface(bmp); + SURFACE_ShareUnlockSurface(bmp); } // Return BITMAP handle and storage location diff --git a/reactos/subsystems/win32/win32k/objects/palette.c b/reactos/subsystems/win32/win32k/objects/palette.c index c7656e03d1c..cb1cdd22789 100644 --- a/reactos/subsystems/win32/win32k/objects/palette.c +++ b/reactos/subsystems/win32/win32k/objects/palette.c @@ -469,11 +469,11 @@ NtGdiCreatePaletteInternal ( IN LPLOGPALETTE pLogPal, IN UINT cEntries ) return NULL; } - PalGDI = (PPALETTE) PALETTE_LockPalette(NewPalette); + PalGDI = (PPALETTE) PALETTE_ShareLockPalette(NewPalette); if (PalGDI != NULL) { PALETTE_ValidateFlags(PalGDI->IndexedColors, PalGDI->NumColors); - PALETTE_UnlockPalette(PalGDI); + PALETTE_ShareUnlockPalette(PalGDI); } else { @@ -664,7 +664,7 @@ COLORREF APIENTRY NtGdiGetNearestColor(HDC hDC, COLORREF Color) if (NULL != dc) { HPALETTE hpal = dc->dclevel.hpal; - palGDI = (PPALETTE) PALETTE_LockPalette(hpal); + palGDI = PALETTE_ShareLockPalette(hpal); if (!palGDI) { DC_UnlockDc(dc); @@ -691,7 +691,7 @@ COLORREF APIENTRY NtGdiGetNearestColor(HDC hDC, COLORREF Color) (GetGValue(Color) >> GBits) << GBits, (GetBValue(Color) >> BBits) << BBits); } - PALETTE_UnlockPalette(palGDI); + PALETTE_ShareUnlockPalette(palGDI); DC_UnlockDc(dc); } @@ -704,7 +704,7 @@ NtGdiGetNearestPaletteIndex( HPALETTE hpal, COLORREF crColor) { - PPALETTE ppal = (PPALETTE) PALETTE_LockPalette(hpal); + PPALETTE ppal = PALETTE_ShareLockPalette(hpal); UINT index = 0; if (ppal) @@ -715,7 +715,7 @@ NtGdiGetNearestPaletteIndex( index = PALETTE_ulGetNearestPaletteIndex(ppal, crColor); } // else SetLastError ? - PALETTE_UnlockPalette(ppal); + PALETTE_ShareUnlockPalette(ppal); } return index; @@ -777,13 +777,13 @@ IntAnimatePalette(HPALETTE hPal, PWND Wnd; const PALETTEENTRY *pptr = PaletteColors; - palPtr = (PPALETTE)PALETTE_LockPalette(hPal); + palPtr = PALETTE_ShareLockPalette(hPal); if (!palPtr) return FALSE; pal_entries = palPtr->NumColors; if (StartIndex >= pal_entries) { - PALETTE_UnlockPalette(palPtr); + PALETTE_ShareUnlockPalette(palPtr); return FALSE; } if (StartIndex+NumEntries > pal_entries) NumEntries = pal_entries - StartIndex; @@ -800,7 +800,7 @@ IntAnimatePalette(HPALETTE hPal, } } - PALETTE_UnlockPalette(palPtr); + PALETTE_ShareUnlockPalette(palPtr); /* Immediately apply the new palette if current window uses it */ Wnd = UserGetDesktopWindow(); @@ -831,7 +831,7 @@ IntGetPaletteEntries( PPALETTE palGDI; UINT numEntries; - palGDI = (PPALETTE) PALETTE_LockPalette(hpal); + palGDI = (PPALETTE) PALETTE_ShareLockPalette(hpal); if (NULL == palGDI) { return 0; @@ -846,7 +846,7 @@ IntGetPaletteEntries( } if (numEntries <= StartIndex) { - PALETTE_UnlockPalette(palGDI); + PALETTE_ShareUnlockPalette(palGDI); return 0; } memcpy(pe, palGDI->IndexedColors + StartIndex, Entries * sizeof(PALETTEENTRY)); @@ -856,7 +856,7 @@ IntGetPaletteEntries( Entries = numEntries; } - PALETTE_UnlockPalette(palGDI); + PALETTE_ShareUnlockPalette(palGDI); return Entries; } @@ -894,7 +894,7 @@ IntGetSystemPaletteEntries(HDC hDC, return 0; } - palGDI = PALETTE_LockPalette(dc->dclevel.hpal); + palGDI = PALETTE_ShareLockPalette(dc->dclevel.hpal); if (palGDI != NULL) { if (pe != NULL) @@ -917,7 +917,7 @@ IntGetSystemPaletteEntries(HDC hDC, } if (palGDI != NULL) - PALETTE_UnlockPalette(palGDI); + PALETTE_ShareUnlockPalette(palGDI); if (dc != NULL) DC_UnlockDc(dc); @@ -941,13 +941,13 @@ IntSetPaletteEntries( return 0; } - palGDI = PALETTE_LockPalette(hpal); + palGDI = PALETTE_ShareLockPalette(hpal); if (!palGDI) return 0; numEntries = palGDI->NumColors; if (Start >= numEntries) { - PALETTE_UnlockPalette(palGDI); + PALETTE_ShareUnlockPalette(palGDI); return 0; } if (numEntries < Start + Entries) @@ -955,7 +955,7 @@ IntSetPaletteEntries( Entries = numEntries - Start; } memcpy(palGDI->IndexedColors + Start, pe, Entries * sizeof(PALETTEENTRY)); - PALETTE_UnlockPalette(palGDI); + PALETTE_ShareUnlockPalette(palGDI); return Entries; } @@ -1138,7 +1138,7 @@ NtGdiUnrealizeObject(HGDIOBJ hgdiobj) !GDI_HANDLE_IS_TYPE(hgdiobj, GDI_OBJECT_TYPE_PALETTE) ) return Ret; - palGDI = PALETTE_LockPalette(hgdiobj); + palGDI = PALETTE_ShareLockPalette(hgdiobj); if (!palGDI) return FALSE; // FIXME!! @@ -1146,7 +1146,7 @@ NtGdiUnrealizeObject(HGDIOBJ hgdiobj) // Zero out Current and Old Translated pointers? // Ret = TRUE; - PALETTE_UnlockPalette(palGDI); + PALETTE_ShareUnlockPalette(palGDI); return Ret; } From 423497b1b23aa5fcc3bbba09e0ab39dd1cc9d37a Mon Sep 17 00:00:00 2001 From: Rafal Harabien Date: Fri, 15 Apr 2011 16:54:25 +0000 Subject: [PATCH 155/317] [SYSSETUP] * Fix information about computer name length limit in Setup. Translators: please review svn path=/trunk/; revision=51354 --- reactos/dll/win32/syssetup/lang/bg-BG.rc | 2 +- reactos/dll/win32/syssetup/lang/cs-CZ.rc | 2 +- reactos/dll/win32/syssetup/lang/de-DE.rc | 2 +- reactos/dll/win32/syssetup/lang/el-GR.rc | 2 +- reactos/dll/win32/syssetup/lang/en-US.rc | 2 +- reactos/dll/win32/syssetup/lang/es-ES.rc | 2 +- reactos/dll/win32/syssetup/lang/et-EE.rc | 2 +- reactos/dll/win32/syssetup/lang/fr-FR.rc | 2 +- reactos/dll/win32/syssetup/lang/hu-HU.rc | 2 +- reactos/dll/win32/syssetup/lang/id-ID.rc | 2 +- reactos/dll/win32/syssetup/lang/it-IT.rc | 2 +- reactos/dll/win32/syssetup/lang/no-NO.rc | 2 +- reactos/dll/win32/syssetup/lang/pl-PL.rc | 2 +- reactos/dll/win32/syssetup/lang/pt-BR.rc | 2 +- reactos/dll/win32/syssetup/lang/ro-RO.rc | 2 +- reactos/dll/win32/syssetup/lang/ru-RU.rc | 2 +- reactos/dll/win32/syssetup/lang/sk-SK.rc | 2 +- reactos/dll/win32/syssetup/lang/uk-UA.rc | 2 +- 18 files changed, 18 insertions(+), 18 deletions(-) diff --git a/reactos/dll/win32/syssetup/lang/bg-BG.rc b/reactos/dll/win32/syssetup/lang/bg-BG.rc index a07591c578d..44bd6211055 100644 --- a/reactos/dll/win32/syssetup/lang/bg-BG.rc +++ b/reactos/dll/win32/syssetup/lang/bg-BG.rc @@ -74,7 +74,7 @@ CAPTION " FONT 8, "MS Shell Dlg" BEGIN ICON IDI_ICON1, IDC_STATIC, 21, 7, 20, 20 - LTEXT " 63 . "\ + LTEXT " 15 . "\ " , .", IDC_STATIC, 45, 7, 250, 24 LTEXT " &:", IDC_STATIC, 45, 38, 75, 8 diff --git a/reactos/dll/win32/syssetup/lang/cs-CZ.rc b/reactos/dll/win32/syssetup/lang/cs-CZ.rc index be2cd75176e..3a334191b55 100644 --- a/reactos/dll/win32/syssetup/lang/cs-CZ.rc +++ b/reactos/dll/win32/syssetup/lang/cs-CZ.rc @@ -59,7 +59,7 @@ CAPTION "ReactOS Instal FONT 8, "MS Shell Dlg" BEGIN ICON IDI_ICON1, IDC_STATIC, 21, 7, 20, 20 - LTEXT "Napite jmno Vaeho potae o dlce 63 znak nebo mn. "\ + LTEXT "Napite jmno Vaeho potae o dlce 15 znak nebo mn. "\ "Pokud je pota pipojen k sti, mus bt jeho jmno uniktn.", IDC_STATIC, 54, 7, 250, 24 LTEXT "&Jmno potae:", IDC_STATIC, 54, 38, 75, 8 diff --git a/reactos/dll/win32/syssetup/lang/de-DE.rc b/reactos/dll/win32/syssetup/lang/de-DE.rc index e895338c6ed..95441e76417 100644 --- a/reactos/dll/win32/syssetup/lang/de-DE.rc +++ b/reactos/dll/win32/syssetup/lang/de-DE.rc @@ -73,7 +73,7 @@ CAPTION "ReactOS-Setup" FONT 8, "MS Shell Dlg" BEGIN ICON IDI_ICON1, IDC_STATIC, 21, 7, 20, 20 - LTEXT "Bitte geben sie einen Computernamen ein (maximal 63 Zeichen). "\ + LTEXT "Bitte geben sie einen Computernamen ein (maximal 15 Zeichen). "\ "Wenn Sie im Netzwerk sind, muss dieser Name einmalig sein.", IDC_STATIC, 54, 7, 250, 24 LTEXT "&Computername:", IDC_STATIC, 54, 38, 75, 8 diff --git a/reactos/dll/win32/syssetup/lang/el-GR.rc b/reactos/dll/win32/syssetup/lang/el-GR.rc index 90a323f1ade..5b4da9111f6 100644 --- a/reactos/dll/win32/syssetup/lang/el-GR.rc +++ b/reactos/dll/win32/syssetup/lang/el-GR.rc @@ -73,7 +73,7 @@ CAPTION " FONT 8, "MS Shell Dlg" BEGIN ICON IDI_ICON1, IDC_STATIC, 21, 7, 20, 20 - LTEXT " , 63 . "\ + LTEXT " , 15 . "\ " , .", IDC_STATIC, 54, 7, 250, 24 LTEXT "& :", IDC_STATIC, 54, 38, 75, 8 diff --git a/reactos/dll/win32/syssetup/lang/en-US.rc b/reactos/dll/win32/syssetup/lang/en-US.rc index 35aa74394f8..bd0d16410a0 100644 --- a/reactos/dll/win32/syssetup/lang/en-US.rc +++ b/reactos/dll/win32/syssetup/lang/en-US.rc @@ -73,7 +73,7 @@ CAPTION "ReactOS Setup" FONT 8, "MS Shell Dlg" BEGIN ICON IDI_ICON1, IDC_STATIC, 21, 7, 20, 20 - LTEXT "Type a name for your computer that is 63 characters or less. "\ + LTEXT "Type a name for your computer that is 15 characters or less. "\ "If you are on a network, your computer name must be unique.", IDC_STATIC, 54, 7, 250, 24 LTEXT "&Computer Name:", IDC_STATIC, 54, 38, 75, 8 diff --git a/reactos/dll/win32/syssetup/lang/es-ES.rc b/reactos/dll/win32/syssetup/lang/es-ES.rc index 878aa3b8e43..081d5fdc4cd 100644 --- a/reactos/dll/win32/syssetup/lang/es-ES.rc +++ b/reactos/dll/win32/syssetup/lang/es-ES.rc @@ -81,7 +81,7 @@ CAPTION "Instalaci FONT 8, "MS Shell Dlg" BEGIN ICON IDI_ICON1, IDC_STATIC, 21, 7, 20, 20 - LTEXT "Escriba un nombre para su equipo que sea de 63 caracteres o menos. "\ + LTEXT "Escriba un nombre para su equipo que sea de 15 caracteres o menos. "\ "Si se encuentra conectado a una red, el nombre debe ser nico.", IDC_STATIC, 54, 7, 250, 24 LTEXT "Nombre del &Equipo:", IDC_STATIC, 54, 38, 75, 8 diff --git a/reactos/dll/win32/syssetup/lang/et-EE.rc b/reactos/dll/win32/syssetup/lang/et-EE.rc index b1ccca119db..98a931bb47b 100644 --- a/reactos/dll/win32/syssetup/lang/et-EE.rc +++ b/reactos/dll/win32/syssetup/lang/et-EE.rc @@ -73,7 +73,7 @@ CAPTION "ReactOSi paigaldamine" FONT 8, "MS Shell Dlg" BEGIN ICON IDI_ICON1, IDC_STATIC, 21, 7, 20, 20 - LTEXT "Anna oma arvutile nimi. See ei tohi olla pikem kui 63 themrki. "\ + LTEXT "Anna oma arvutile nimi. See ei tohi olla pikem kui 15 themrki. "\ "Vrgus peab arvuti nimi olema unikaalne.", IDC_STATIC, 54, 7, 250, 24 LTEXT "&Arvuti nimi:", IDC_STATIC, 54, 38, 75, 8 diff --git a/reactos/dll/win32/syssetup/lang/fr-FR.rc b/reactos/dll/win32/syssetup/lang/fr-FR.rc index 94dbb5a1afb..8ab886be23d 100644 --- a/reactos/dll/win32/syssetup/lang/fr-FR.rc +++ b/reactos/dll/win32/syssetup/lang/fr-FR.rc @@ -74,7 +74,7 @@ CAPTION "Installation de ReactOS" FONT 8, "MS Shell Dlg" BEGIN ICON IDI_ICON1, IDC_STATIC, 21, 7, 20, 20 - LTEXT "Entrez un nom pour votre ordinateur de 63 caractres ou moins. "\ + LTEXT "Entrez un nom pour votre ordinateur de 15 caractres ou moins. "\ "Si vous tes sur un rseau, le nom saisi doit tre unique.", IDC_STATIC, 54, 7, 250, 24 LTEXT "&Nom de l'ordinateur :", IDC_STATIC, 54, 38, 75, 8 diff --git a/reactos/dll/win32/syssetup/lang/hu-HU.rc b/reactos/dll/win32/syssetup/lang/hu-HU.rc index d77107e9194..33cc05b16dd 100644 --- a/reactos/dll/win32/syssetup/lang/hu-HU.rc +++ b/reactos/dll/win32/syssetup/lang/hu-HU.rc @@ -71,7 +71,7 @@ CAPTION "ReactOS Telep FONT 8, "MS Shell Dlg" BEGIN ICON IDI_ICON1, IDC_STATIC, 21, 7, 20, 20 - LTEXT "Adj egy nevet a szmtgpednek, ami nem tbb mint 63 bet. "\ + LTEXT "Adj egy nevet a szmtgpednek, ami nem tbb mint 15 bet. "\ "Ha hlzaton vagy, akkor ennek a nvnek egyedinek kell lennie.", IDC_STATIC, 54, 7, 250, 24 LTEXT "&Szmtgp nv:", IDC_STATIC, 54, 38, 75, 8 diff --git a/reactos/dll/win32/syssetup/lang/id-ID.rc b/reactos/dll/win32/syssetup/lang/id-ID.rc index 9ede7806019..c42d42bd9ea 100644 --- a/reactos/dll/win32/syssetup/lang/id-ID.rc +++ b/reactos/dll/win32/syssetup/lang/id-ID.rc @@ -71,7 +71,7 @@ CAPTION "ReactOS Setup" FONT 8, "MS Shell Dlg" BEGIN ICON IDI_ICON1, IDC_STATIC, 21, 7, 20, 20 - LTEXT "Type a name for your computer that is 63 characters or less. "\ + LTEXT "Type a name for your computer that is 15 characters or less. "\ "If you are on a network, your computer name must be unique.", IDC_STATIC, 54, 7, 250, 24 LTEXT "&Computer Name:", IDC_STATIC, 54, 38, 75, 8 diff --git a/reactos/dll/win32/syssetup/lang/it-IT.rc b/reactos/dll/win32/syssetup/lang/it-IT.rc index 693ab3eeaa7..d6603962a0a 100644 --- a/reactos/dll/win32/syssetup/lang/it-IT.rc +++ b/reactos/dll/win32/syssetup/lang/it-IT.rc @@ -64,7 +64,7 @@ CAPTION "Installazione di ReactOS" FONT 8, "MS Shell Dlg" BEGIN ICON IDI_ICON1, IDC_STATIC, 21, 7, 20, 20 - LTEXT "Scrivere un nome per il computer che sia lungo al massimo 63 caratteri.\n"\ + LTEXT "Scrivere un nome per il computer che sia lungo al massimo 15 caratteri.\n"\ "Se si in rete, il nome del computer deve essere univoco.", IDC_STATIC, 54, 7, 250, 24 LTEXT "Nome del &computer:", IDC_STATIC, 29, 38, 75, 8 diff --git a/reactos/dll/win32/syssetup/lang/no-NO.rc b/reactos/dll/win32/syssetup/lang/no-NO.rc index f0af8e5a144..2ce6965bf56 100644 --- a/reactos/dll/win32/syssetup/lang/no-NO.rc +++ b/reactos/dll/win32/syssetup/lang/no-NO.rc @@ -76,7 +76,7 @@ CAPTION "ReactOS installasjon" FONT 8, "MS Shell Dlg" BEGIN ICON IDI_ICON1, IDC_STATIC, 21, 7, 20, 20 - LTEXT "Skriv inn et navn for din datamaskin som er 63 karakterer eller mindre. "\ + LTEXT "Skriv inn et navn for din datamaskin som er 15 karakterer eller mindre. "\ "Hvis du er p et nettverk, s m ditt datamaskin navn vre unikt.", IDC_STATIC, 54, 7, 250, 24 LTEXT "&Datamaskin navn:", IDC_STATIC, 54, 38, 75, 8 diff --git a/reactos/dll/win32/syssetup/lang/pl-PL.rc b/reactos/dll/win32/syssetup/lang/pl-PL.rc index 4f632f5a6df..57a8613cbb3 100644 --- a/reactos/dll/win32/syssetup/lang/pl-PL.rc +++ b/reactos/dll/win32/syssetup/lang/pl-PL.rc @@ -81,7 +81,7 @@ CAPTION "Instalator ReactOS" FONT 8, "MS Shell Dlg" BEGIN ICON IDI_ICON1, IDC_STATIC, 21, 7, 20, 20 - LTEXT "Podaj nazw komputera, nie dusz ni 63 znaki. "\ + LTEXT "Podaj nazw komputera, nie dusz ni 15 znakw. "\ "Jeli chcesz pracowa w sieci, nazwa musi pozosta unikalna.", IDC_STATIC, 54, 7, 250, 24 LTEXT "&Nazwa komputera:", IDC_STATIC, 54, 38, 75, 8 diff --git a/reactos/dll/win32/syssetup/lang/pt-BR.rc b/reactos/dll/win32/syssetup/lang/pt-BR.rc index 9474e3556cc..c8ca8e9d3b1 100644 --- a/reactos/dll/win32/syssetup/lang/pt-BR.rc +++ b/reactos/dll/win32/syssetup/lang/pt-BR.rc @@ -71,7 +71,7 @@ CAPTION "Instala FONT 8, "MS Shell Dlg" BEGIN ICON IDI_ICON1, IDC_STATIC, 21, 7, 20, 20 - LTEXT "Digite um nome para o seu computador com 63 caracteres ou menos. "\ + LTEXT "Digite um nome para o seu computador com 15 caracteres ou menos. "\ "Se voc est em uma rede, o nome do computador deve ser exclusivo.", IDC_STATIC, 54, 7, 250, 24 LTEXT "Nome do &Computador:", IDC_STATIC, 54, 38, 75, 8 diff --git a/reactos/dll/win32/syssetup/lang/ro-RO.rc b/reactos/dll/win32/syssetup/lang/ro-RO.rc index 5e9b8431e1c..35ff476c2e1 100644 --- a/reactos/dll/win32/syssetup/lang/ro-RO.rc +++ b/reactos/dll/win32/syssetup/lang/ro-RO.rc @@ -74,7 +74,7 @@ CAPTION "Instalare ReactOS" FONT 8, "MS Shell Dlg" BEGIN ICON IDI_ICON1, IDC_STATIC, 21, 7, 20, 20 - LTEXT "Scrieți un nume pentru computer de maxim 63 de caractere. "\ + LTEXT "Scrieți un nume pentru computer de maxim 15 de caractere. "\ "Dacă sunteți în rețea, numele computerului trebuie să fie unic.", IDC_STATIC, 54, 7, 250, 24 LTEXT "&Nume:", IDC_STATIC, 54, 38, 75, 8 diff --git a/reactos/dll/win32/syssetup/lang/ru-RU.rc b/reactos/dll/win32/syssetup/lang/ru-RU.rc index eccc74c6690..769cfcb7885 100644 --- a/reactos/dll/win32/syssetup/lang/ru-RU.rc +++ b/reactos/dll/win32/syssetup/lang/ru-RU.rc @@ -55,7 +55,7 @@ CAPTION " FONT 8, "MS Shell Dlg" BEGIN ICON IDI_ICON1, IDC_STATIC, 21, 7, 20, 20 - LTEXT " ( 63 ). "\ + LTEXT " ( 15 ). "\ " , .", IDC_STATIC, 54, 7, 250, 24 LTEXT "& :", IDC_STATIC, 54, 38, 75, 8 diff --git a/reactos/dll/win32/syssetup/lang/sk-SK.rc b/reactos/dll/win32/syssetup/lang/sk-SK.rc index c5f7ccdd070..7804ec23e59 100644 --- a/reactos/dll/win32/syssetup/lang/sk-SK.rc +++ b/reactos/dll/win32/syssetup/lang/sk-SK.rc @@ -59,7 +59,7 @@ CAPTION "In FONT 8, "MS Shell Dlg" BEGIN ICON IDI_ICON1, IDC_STATIC, 21, 7, 20, 20 - LTEXT "Napte nzov Vho potaa v dke 63 znakov alebo menej. "\ + LTEXT "Napte nzov Vho potaa v dke 15 znakov alebo menej. "\ "Ak je pota pripojen k sieti, mus b jeho nzov uniktny.", IDC_STATIC, 54, 7, 250, 24 LTEXT "&Nzov potaa:", IDC_STATIC, 54, 38, 75, 8 diff --git a/reactos/dll/win32/syssetup/lang/uk-UA.rc b/reactos/dll/win32/syssetup/lang/uk-UA.rc index 888a1a83225..7d10b8b8845 100644 --- a/reactos/dll/win32/syssetup/lang/uk-UA.rc +++ b/reactos/dll/win32/syssetup/lang/uk-UA.rc @@ -62,7 +62,7 @@ CAPTION " FONT 8, "MS Shell Dlg" BEGIN ICON IDI_ICON1, IDC_STATIC, 21, 7, 20, 20 - LTEXT " ' ' 63 . "\ + LTEXT " ' ' 15 . "\ " , ' ' .", IDC_STATIC, 54, 7, 250, 24 LTEXT "&' ':", IDC_STATIC, 54, 38, 75, 8 From 99c3b4ec5718c48dc76d3ca04f10aa94a7e76172 Mon Sep 17 00:00:00 2001 From: Rafal Harabien Date: Fri, 15 Apr 2011 20:03:44 +0000 Subject: [PATCH 156/317] [WIN32K] * Revert part of 37148. One FontGDI is used for fonts with different sizes. Do not cache font metrics then and instead calculate them every time when needed. It fixes spacing in menus if some application uses default GUI font with size other than 11. See issue #4106 for more details. svn path=/trunk/; revision=51356 --- .../win32/win32k/include/engobjects.h | 5 --- .../win32/win32k/objects/freetype.c | 40 ++----------------- 2 files changed, 4 insertions(+), 41 deletions(-) diff --git a/reactos/subsystems/win32/win32k/include/engobjects.h b/reactos/subsystems/win32/win32k/include/engobjects.h index afb09204874..d26e18eef15 100644 --- a/reactos/subsystems/win32/win32k/include/engobjects.h +++ b/reactos/subsystems/win32/win32k/include/engobjects.h @@ -88,9 +88,6 @@ typedef struct _FLOATGDI { ULONG Dummy; } FLOATGDI; - -#define FDM_TYPE_TEXT_METRIC 0x80000000 - typedef struct _FONTGDI { FONTOBJ FontObj; ULONG iUnique; @@ -99,13 +96,11 @@ typedef struct _FONTGDI { DHPDEV dhpdev; FT_Face face; }; - FLONG flRealizedType; LONG lMaxNegA; LONG lMaxNegC; LONG lMinWidthD; - TEXTMETRICW TextMetric; LPWSTR Filename; BYTE Underline; BYTE StrikeOut; diff --git a/reactos/subsystems/win32/win32k/objects/freetype.c b/reactos/subsystems/win32/win32k/objects/freetype.c index c7086fd39d4..994d513f32f 100644 --- a/reactos/subsystems/win32/win32k/objects/freetype.c +++ b/reactos/subsystems/win32/win32k/objects/freetype.c @@ -302,9 +302,6 @@ IntGdiAddFontResource(PUNICODE_STRING FileName, DWORD Characteristics) PSECTION_OBJECT SectionObject; ULONG ViewSize = 0; LARGE_INTEGER SectionSize; -#if 0 // Wine code - FT_Fixed XScale, YScale; -#endif UNICODE_STRING FontRegPath = RTL_CONSTANT_STRING(L"\\REGISTRY\\Machine\\Software\\Microsoft\\Windows NT\\CurrentVersion\\Fonts"); /* Open the font file */ @@ -396,22 +393,6 @@ IntGdiAddFontResource(PUNICODE_STRING FileName, DWORD Characteristics) FontGDI->Filename[FileName->Length / sizeof(WCHAR)] = L'\0'; FontGDI->face = Face; - /* FIXME: Complete text metrics */ -#if 0 /* This (Wine) code doesn't seem to work correctly for us */ - XScale = Face->size->metrics.x_scale; - YScale = Face->size->metrics.y_scale; - FontGDI->TextMetric.tmAscent = (FT_MulFix(Face->ascender, YScale) + 32) >> 6; - FontGDI->TextMetric.tmDescent = (FT_MulFix(Face->descender, YScale) + 32) >> 6; - FontGDI->TextMetric.tmHeight = (FT_MulFix(Face->ascender, YScale) - - FT_MulFix(Face->descender, YScale)) >> 6; -#else - FontGDI->TextMetric.tmAscent = (Face->size->metrics.ascender + 32) >> 6; /* units above baseline */ - FontGDI->TextMetric.tmDescent = (32 - Face->size->metrics.descender) >> 6; /* units below baseline */ - FontGDI->TextMetric.tmHeight = (Face->size->metrics.ascender - Face->size->metrics.descender) >> 6; -#endif - - - DPRINT("Font loaded: %s (%s)\n", Face->family_name, Face->style_name); DPRINT("Num glyphs: %u\n", Face->num_glyphs); @@ -856,14 +837,7 @@ IntGetOutlineTextMetrics(PFONTGDI FontGDI, Otm->otmSize = Needed; -// FillTM(&Otm->otmTextMetrics, FontGDI, pOS2, pHori, !Error ? &Win : 0); - if (!(FontGDI->flRealizedType & FDM_TYPE_TEXT_METRIC)) - { - FillTM(&FontGDI->TextMetric, FontGDI, pOS2, pHori, !Error ? &Win : 0); - FontGDI->flRealizedType |= FDM_TYPE_TEXT_METRIC; - } - - RtlCopyMemory(&Otm->otmTextMetrics, &FontGDI->TextMetric, sizeof(TEXTMETRICW)); + FillTM(&Otm->otmTextMetrics, FontGDI, pOS2, pHori, !Error ? &Win : 0); Otm->otmFiller = 0; RtlCopyMemory(&Otm->otmPanoseNumber, pOS2->panose, PANOSE_COUNT); @@ -882,8 +856,8 @@ IntGetOutlineTextMetrics(PFONTGDI FontGDI, Otm->otmrcFontBox.right = (FT_MulFix(FontGDI->face->bbox.xMax, XScale) + 32) >> 6; Otm->otmrcFontBox.top = (FT_MulFix(FontGDI->face->bbox.yMax, YScale) + 32) >> 6; Otm->otmrcFontBox.bottom = (FT_MulFix(FontGDI->face->bbox.yMin, YScale) + 32) >> 6; - Otm->otmMacAscent = FontGDI->TextMetric.tmAscent; - Otm->otmMacDescent = -FontGDI->TextMetric.tmDescent; + Otm->otmMacAscent = Otm->otmTextMetrics.tmAscent; + Otm->otmMacDescent = -Otm->otmTextMetrics.tmDescent; Otm->otmMacLineGap = Otm->otmLineGap; Otm->otmusMinimumPPEM = 0; /* TT Header */ Otm->otmptSubscriptSize.x = (FT_MulFix(pOS2->ySubscriptXSize, XScale) + 32) >> 6; @@ -2512,13 +2486,8 @@ ftGdiGetTextMetricsW( if (NT_SUCCESS(Status)) { - if (!(FontGDI->flRealizedType & FDM_TYPE_TEXT_METRIC)) - { - FillTM(&FontGDI->TextMetric, FontGDI, pOS2, pHori, !Error ? &Win : 0); - FontGDI->flRealizedType |= FDM_TYPE_TEXT_METRIC; - } + FillTM(&ptmwi->TextMetric, FontGDI, pOS2, pHori, !Error ? &Win : 0); - RtlCopyMemory(&ptmwi->TextMetric, &FontGDI->TextMetric, sizeof(TEXTMETRICW)); /* FIXME: Fill Diff member */ RtlZeroMemory(&ptmwi->Diff, sizeof(ptmwi->Diff)); } @@ -2814,7 +2783,6 @@ TextIntRealizeFont(HFONT FontHandle, PTEXTOBJ pTextObj) TextObj->Font->iUniq = 1; // Now it can be cached. IntFontType(FontGdi); FontGdi->flType = TextObj->Font->flFontType; - FontGdi->flRealizedType = 0; FontGdi->Underline = TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfUnderline ? 0xff : 0; FontGdi->StrikeOut = TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfStrikeOut ? 0xff : 0; TextObj->fl |= TEXTOBJECT_INIT; From 46a8c8f9fabe057b245535430b9186e579c13231 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Fri, 15 Apr 2011 20:14:44 +0000 Subject: [PATCH 157/317] [WIN32K] Implement gdi pool. An allocator for user mode gdi object attributes. The old method allocated a 4k page for every object, wasting 4k physical memory and 64k address space (allcoation granularity) The new allocator creates a per process pool for each object attribute type. Allocations are done from "sections" that start with 1 page and grow dynamically up to 64k, if neccessary a new section is allocated. This will use about 1/10 of memory for dc attributes and 1/512 for brush attributes. Also allocation is way faster. Caching object attributes is not neccessary anymore. svn path=/trunk/; revision=51357 --- .../subsystems/win32/win32k/objects/gdipool.c | 336 ++++++++++++++++++ 1 file changed, 336 insertions(+) create mode 100644 reactos/subsystems/win32/win32k/objects/gdipool.c diff --git a/reactos/subsystems/win32/win32k/objects/gdipool.c b/reactos/subsystems/win32/win32k/objects/gdipool.c new file mode 100644 index 00000000000..ebe81f25208 --- /dev/null +++ b/reactos/subsystems/win32/win32k/objects/gdipool.c @@ -0,0 +1,336 @@ +/* + * PROJECT: ReactOS win32 kernel mode subsystem + * LICENSE: GPL - See COPYING in the top level directory + * FILE: subsystems/win32/win32k/objects/gdiobj.c + * PURPOSE: Static size allocator for user mode object attributes + * PROGRAMMERS: Timo Kreuzer + */ + +/* INCLUDES ******************************************************************/ + +#include +#define NDEBUG +#include + +typedef struct _GDI_POOL_SECTION +{ + LIST_ENTRY leInUseLink; + LIST_ENTRY leReadyLink; + + PVOID pvBaseAddress; + + ULONG ulCommitBitmap; + ULONG cAllocCount; + + RTL_BITMAP bitmap; + ULONG aulBits[1]; +} GDI_POOL_SECTION, *PGDI_POOL_SECTION; + +typedef struct _GDI_POOL +{ + ULONG ulTag; + ULONG cjAllocSize; + ULONG cjSectionSize; // 32 * cjAllocSize, rounded up to pages + ULONG cSlotsPerSection; + ULONG cEmptySections; + EX_PUSH_LOCK pushlock; // for pool growth + + LIST_ENTRY leInUseList; + LIST_ENTRY leEmptyList; + LIST_ENTRY leReadyList; +} GDI_POOL; + +#define GDI_POOL_ALLOCATION_GRANULARITY 64 * 1024 + +static +PGDI_POOL_SECTION +GdiPoolAllocateSection(PGDI_POOL pPool) +{ + PGDI_POOL_SECTION pSection; + PVOID pvBaseAddress; + SIZE_T cjSize; + NTSTATUS status; + + /* Allocate a section object */ + cjSize = sizeof(GDI_POOL_SECTION) + pPool->cSlotsPerSection / sizeof(ULONG); + pSection = EngAllocMem(0, cjSize, pPool->ulTag); + if (!pSection) + { + return NULL; + } + + /* Reserve user mode memory */ + cjSize = GDI_POOL_ALLOCATION_GRANULARITY; + pvBaseAddress = NULL; + status = ZwAllocateVirtualMemory(NtCurrentProcess(), + &pvBaseAddress, + 0, + &cjSize, + MEM_RESERVE, + PAGE_READWRITE); + if (!NT_SUCCESS(status)) + { + EngFreeMem(pSection); + return NULL; + } + + /* Initialize the section */ + pSection->pvBaseAddress = pvBaseAddress; + pSection->ulCommitBitmap = 0; + pSection->cAllocCount = 0; + RtlInitializeBitMap(&pSection->bitmap, + pSection->aulBits, + pPool->cSlotsPerSection); + RtlClearAllBits(&pSection->bitmap); + + /* Return the section */ + return pSection; +} + +static +VOID +GdiPoolDeleteSection(PGDI_POOL pPool, PGDI_POOL_SECTION pSection) +{ + NTSTATUS status; + SIZE_T cjSize = 0; + + /* Should not have any allocations */ + ASSERT(pSection->cAllocCount == 0); + + /* Release the virtual memory */ + status = ZwFreeVirtualMemory(NtCurrentProcess(), + &pSection->pvBaseAddress, + &cjSize, + MEM_RELEASE); + ASSERT(NT_SUCCESS(status)); + + /* Free the section object */ + EngFreeMem(pSection); +} + +PVOID +NTAPI +GdiPoolAllocate( + PGDI_POOL pPool) +{ + PGDI_POOL_SECTION pSection; + ULONG ulIndex, cjOffset, ulPageBit; + PLIST_ENTRY ple; + PVOID pvAlloc, pvBaseAddress; + SIZE_T cjSize; + NTSTATUS status; + + /* Disable APCs and acquire the pool lock */ + KeEnterCriticalRegion(); + ExAcquirePushLockExclusive(&pPool->pushlock); + + /* Check if we have a ready section */ + if (!IsListEmpty(&pPool->leReadyList)) + { + /* Get a free section */ + ple = pPool->leReadyList.Flink; + pSection = CONTAINING_RECORD(ple, GDI_POOL_SECTION, leReadyLink); + ASSERT(pSection->cAllocCount < pPool->cSlotsPerSection); + } + else + { + /* No, check if we have something on the empty list */ + if (!IsListEmpty(&pPool->leEmptyList)) + { + /* Yes, remove it from the empty list */ + ple = RemoveHeadList(&pPool->leEmptyList); + pSection = CONTAINING_RECORD(ple, GDI_POOL_SECTION, leInUseLink); + } + else + { + /* No, allocate a new section */ + pSection = GdiPoolAllocateSection(pPool); + if (!pSection) + { + DPRINT1("Couldn't allocate a section\n"); + pvAlloc = NULL; + goto done; + } + + /* Insert it into the ready list */ + InsertHeadList(&pPool->leReadyList, &pSection->leReadyLink); + } + + /* Insert it into the in-use list */ + InsertHeadList(&pPool->leInUseList, &pSection->leInUseLink); + } + + /* Find and set a single bit */ + ulIndex = RtlFindClearBitsAndSet(&pSection->bitmap, 1, 0); + ASSERT(ulIndex != MAXULONG); + + /* Calculate the allocation address */ + cjOffset = ulIndex * pPool->cjAllocSize; + pvAlloc = (PVOID)((ULONG_PTR)pSection->pvBaseAddress + cjOffset); + + /* Check if memory is comitted */ + ulPageBit = 1 << (cjOffset / PAGE_SIZE); + ulPageBit |= 1 << ((cjOffset + pPool->cjAllocSize - 1) / PAGE_SIZE); + if ((pSection->ulCommitBitmap & ulPageBit) != ulPageBit) + { + /* Commit the pages */ + pvBaseAddress = PAGE_ALIGN(pvAlloc); + cjSize = ADDRESS_AND_SIZE_TO_SPAN_PAGES(pvAlloc, pPool->cjAllocSize) * PAGE_SIZE; + status = ZwAllocateVirtualMemory(NtCurrentProcess(), + &pvBaseAddress, + 0, + &cjSize, + MEM_COMMIT, + PAGE_READWRITE); + + pSection->ulCommitBitmap |= ulPageBit; + } + + /* Increase alloc count and check if section is now busy */ + pSection->cAllocCount++; + if (pSection->cAllocCount == pPool->cSlotsPerSection) + { + /* Remove the section from the ready list */ + RemoveEntryList(&pSection->leReadyLink); + } + +done: + /* Release the pool lock and enable APCs */ + ExReleasePushLockExclusive(&pPool->pushlock); + KeLeaveCriticalRegion(); +DPRINT1("GdiPoolallocate: %p\n", pvAlloc); + + return pvAlloc; +} + + +VOID +NTAPI +GdiPoolFree( + PGDI_POOL pPool, + PVOID pvAlloc) +{ + PLIST_ENTRY ple; + PGDI_POOL_SECTION pSection; + ULONG_PTR cjOffset; + ULONG ulIndex; +DPRINT1("GdiPoolFree: %p\n", pvAlloc); + + /* Disable APCs and acquire the pool lock */ + KeEnterCriticalRegion(); + ExAcquirePushLockExclusive(&pPool->pushlock); + + /* Loop all used sections */ + for (ple = pPool->leInUseList.Flink; + ple != &pPool->leInUseList; + ple = ple->Flink) + { + /* Get the pointer to the section */ + pSection = CONTAINING_RECORD(ple, GDI_POOL_SECTION, leInUseLink); + + /* Calculate offset */ + cjOffset = (ULONG_PTR)pvAlloc - (ULONG_PTR)pSection->pvBaseAddress; + + /* Check if the allocation is from this section */ + if (cjOffset < pPool->cjSectionSize) + { + /* Calculate the index of the allocation */ + ulIndex = cjOffset / pPool->cjAllocSize; + + /* Mark it as free */ + ASSERT(RtlTestBit(&pSection->bitmap, ulIndex) == TRUE); + RtlClearBit(&pSection->bitmap, ulIndex); + + /* Decrease allocation count */ + pSection->cAllocCount--; + + /* Check if the section got valid now */ + if (pSection->cAllocCount == pPool->cSlotsPerSection - 1) + { + /* Insert it into the ready list */ + InsertTailList(&pPool->leReadyList, &pSection->leReadyLink); + } + /* Check if it got empty now */ + else if (pSection->cAllocCount == 0) + { + /* Remove the section from the lists */ + RemoveEntryList(&pSection->leInUseLink); + RemoveEntryList(&pSection->leReadyLink); + + if (pPool->cEmptySections > 1) + { + /* Delete the section */ + GdiPoolDeleteSection(pPool, pSection); + } + else + { + /* Insert it into the empty list */ + InsertHeadList(&pPool->leEmptyList, &pSection->leInUseLink); + pPool->cEmptySections++; + } + } + + goto done; + } + } + + ASSERT(FALSE); + // KeBugCheck() + +done: + /* Release the pool lock and enable APCs */ + ExReleasePushLockExclusive(&pPool->pushlock); + KeLeaveCriticalRegion(); +} + +PGDI_POOL +NTAPI +GdiPoolCreate( + ULONG cjAllocSize, + ULONG ulTag) +{ + PGDI_POOL pPool; + + /* Allocate a pool object */ + pPool = EngAllocMem(0, sizeof(GDI_POOL), 'lopG'); + if (!pPool) return NULL; + + /* Initialize the object */ + ExInitializePushLock(&pPool->pushlock); + InitializeListHead(&pPool->leInUseList); + InitializeListHead(&pPool->leReadyList); + InitializeListHead(&pPool->leEmptyList); + pPool->cEmptySections = 0; + pPool->cjAllocSize = cjAllocSize; + pPool->ulTag = ulTag; + pPool->cjSectionSize = GDI_POOL_ALLOCATION_GRANULARITY; + pPool->cSlotsPerSection = pPool->cjSectionSize / cjAllocSize; + + return pPool; +} + +VOID +NTAPI +GdiPoolDestroy(PGDI_POOL pPool) +{ + PGDI_POOL_SECTION pSection; + PLIST_ENTRY ple; + + /* Loop all empty sections, removing them */ + while ((ple = RemoveHeadList(&pPool->leEmptyList))) + { + /* Delete the section */ + pSection = CONTAINING_RECORD(ple, GDI_POOL_SECTION, leInUseLink); + GdiPoolDeleteSection(pPool, pSection); + } + + /* Loop all ready sections, removing them */ + while ((ple = RemoveHeadList(&pPool->leInUseList))) + { + /* Delete the section */ + pSection = CONTAINING_RECORD(ple, GDI_POOL_SECTION, leInUseLink); + GdiPoolDeleteSection(pPool, pSection); + } + + EngFreeMem(pPool); +} From 66a33a524654a6d115b2f79e410198a6680969cf Mon Sep 17 00:00:00 2001 From: Rafal Harabien Date: Fri, 15 Apr 2011 20:42:07 +0000 Subject: [PATCH 158/317] [SYSSETUP] * Generate random computer name (REACTOS-xxxxxxx) in Setup. Patch by David Quintana modified by me See issue #6099 for more details. svn path=/trunk/; revision=51358 --- reactos/dll/win32/syssetup/wizard.c | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/reactos/dll/win32/syssetup/wizard.c b/reactos/dll/win32/syssetup/wizard.c index fc37c40e368..db554312af0 100644 --- a/reactos/dll/win32/syssetup/wizard.c +++ b/reactos/dll/win32/syssetup/wizard.c @@ -564,6 +564,25 @@ WriteComputerSettings(WCHAR * ComputerName, HWND hwndDlg) return TRUE; } +/* lpBuffer will be filled with a 15-char string (plus the null terminator) */ +static void +GenerateComputerName(LPWSTR lpBuffer) +{ + static const WCHAR Chars[] = L"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + static const unsigned cChars = sizeof(Chars) / sizeof(WCHAR) - 1; + unsigned i; + + wcscpy(lpBuffer, L"REACTOS-"); + + srand(GetTickCount()); + + /* fill in 7 characters */ + for (i = 8; i < 15; i++) + lpBuffer[i] = Chars[rand() % cChars]; + + lpBuffer[15] = UNICODE_NULL; /* NULL-terminate */ +} + static INT_PTR CALLBACK ComputerPageDlgProc(HWND hwndDlg, UINT uMsg, @@ -576,7 +595,6 @@ ComputerPageDlgProc(HWND hwndDlg, PWCHAR Password; WCHAR Title[64]; WCHAR EmptyComputerName[256], NotMatchPassword[256], WrongPassword[256]; - DWORD Length; LPNMHDR lpnm; if (0 == LoadStringW(hDllInstance, IDS_REACTOS_SETUP, Title, sizeof(Title) / sizeof(Title[0]))) @@ -588,9 +606,8 @@ ComputerPageDlgProc(HWND hwndDlg, { case WM_INITDIALOG: { - /* Retrieve current computer name */ - Length = MAX_COMPUTERNAME_LENGTH + 1; - GetComputerNameW(ComputerName, &Length); + /* Generate a new pseudo-random computer name */ + GenerateComputerName(ComputerName); /* Display current computer name */ SetDlgItemTextW(hwndDlg, IDC_COMPUTERNAME, ComputerName); From 7de326fe0e447a224d44c83f49d905784ed1c79e Mon Sep 17 00:00:00 2001 From: Olaf Siejka Date: Sat, 16 Apr 2011 22:16:25 +0000 Subject: [PATCH 159/317] [VIDEOPRT] - Fix whitespace and logic order (formatting only). Patch by Thomas Faber See issue #6123 for more details. svn path=/trunk/; revision=51370 --- reactos/drivers/video/videoprt/videoprt.c | 24 +++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/reactos/drivers/video/videoprt/videoprt.c b/reactos/drivers/video/videoprt/videoprt.c index 73976f8b39d..063d2cb3c89 100644 --- a/reactos/drivers/video/videoprt/videoprt.c +++ b/reactos/drivers/video/videoprt/videoprt.c @@ -89,13 +89,13 @@ IntCreateRegistryPath( AfterControlSet = *DriverRegistryPath; /* Check if path begins with \\REGISTRY\\MACHINE\\SYSTEM\\ */ Valid = (DriverRegistryPath->Length > sizeof(RegistryMachineSystem) && - 0 == _wcsnicmp(DriverRegistryPath->Buffer, RegistryMachineSystem, + 0 == _wcsnicmp(DriverRegistryPath->Buffer, RegistryMachineSystem, wcslen(RegistryMachineSystem))); if (Valid) { AfterControlSet.Buffer += wcslen(RegistryMachineSystem); AfterControlSet.Length -= sizeof(RegistryMachineSystem) - sizeof(UNICODE_NULL); - + /* Check if path contains CURRENTCONTROLSET */ if (AfterControlSet.Length > sizeof(CurrentControlSet) && 0 == _wcsnicmp(AfterControlSet.Buffer, CurrentControlSet, wcslen(CurrentControlSet))) @@ -110,8 +110,8 @@ IntCreateRegistryPath( AfterControlSet.Buffer += wcslen(ControlSet); AfterControlSet.Length -= sizeof(ControlSet) - sizeof(UNICODE_NULL); while (AfterControlSet.Length > 0 && - L'0' <= *AfterControlSet.Buffer && - L'9' <= *AfterControlSet.Buffer) + *AfterControlSet.Buffer >= L'0' && + *AfterControlSet.Buffer >= L'9') { AfterControlSet.Buffer++; AfterControlSet.Length -= sizeof(WCHAR); @@ -133,21 +133,21 @@ IntCreateRegistryPath( DeviceRegistryPath->Buffer = ExAllocatePoolWithTag(PagedPool, DeviceRegistryPath->MaximumLength, TAG_VIDEO_PORT); - if (NULL != DeviceRegistryPath->Buffer) + if (DeviceRegistryPath->Buffer != NULL) { /* Build device path */ - wcsncpy(DeviceRegistryPath->Buffer, + wcsncpy(DeviceRegistryPath->Buffer, DriverRegistryPath->Buffer, AfterControlSet.Buffer - DriverRegistryPath->Buffer); DeviceRegistryPath->Length = (AfterControlSet.Buffer - DriverRegistryPath->Buffer) * sizeof(WCHAR); RtlAppendUnicodeToString(DeviceRegistryPath, Insert1); RtlAppendUnicodeStringToString(DeviceRegistryPath, &AfterControlSet); RtlAppendUnicodeToString(DeviceRegistryPath, Insert2); - + /* Check if registry key exists */ Valid = NT_SUCCESS(RtlCheckRegistryKey(RTL_REGISTRY_ABSOLUTE, DriverRegistryPath->Buffer)); - - if(!Valid) + + if (!Valid) ExFreePoolWithTag(DeviceRegistryPath->Buffer, TAG_VIDEO_PORT); } else @@ -168,14 +168,14 @@ IntCreateRegistryPath( NonPagedPool, DeviceRegistryPath->MaximumLength, TAG_VIDEO_PORT); - + if (!DeviceRegistryPath->Buffer) return STATUS_NO_MEMORY; - + RtlCopyUnicodeString(DeviceRegistryPath, DriverRegistryPath); RtlAppendUnicodeToString(DeviceRegistryPath, Insert2); } - + return STATUS_SUCCESS; } From 04603e0af6c39bdf2485c7b272f5f6f8e6a9adfe Mon Sep 17 00:00:00 2001 From: Olaf Siejka Date: Sat, 16 Apr 2011 22:29:55 +0000 Subject: [PATCH 160/317] [CALC] - Swedish translation by Jaix Bly. See issue #6113 for more details. svn path=/trunk/; revision=51371 --- reactos/base/applications/calc/lang/sv-SE.rc | 738 +++++++++++++++++++ reactos/base/applications/calc/resource.rc | 1 + 2 files changed, 739 insertions(+) create mode 100644 reactos/base/applications/calc/lang/sv-SE.rc diff --git a/reactos/base/applications/calc/lang/sv-SE.rc b/reactos/base/applications/calc/lang/sv-SE.rc new file mode 100644 index 00000000000..a875ed0e8c2 --- /dev/null +++ b/reactos/base/applications/calc/lang/sv-SE.rc @@ -0,0 +1,738 @@ +/* + * PROJECT: ReactOS RAPPS + * FILE: \base\applications\calc\lang\sv-SE.rc + * PURPOSE: Swedish resource file + * Translation: Jaix Bly + */ +LANGUAGE LANG_SWEDISH, SUBLANG_NEUTRAL + +// Dialog + +IDD_DIALOG_SCIENTIFIC DIALOGEX 0, 0, 316, 161 +STYLE DS_SHELLFONT | WS_MINIMIZEBOX | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "ReactOS Kalkylator" +MENU IDR_MENU_SCIENTIFIC_1 +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + GROUPBOX "",IDC_STATIC,4,16,132,21 + CONTROL "Hex",IDC_RADIO_HEX,"Button",BS_AUTORADIOBUTTON,8,24,29,10 + CONTROL "Dec",IDC_RADIO_DEC,"Button",BS_AUTORADIOBUTTON,40,24,29,10 + CONTROL "Okt",IDC_RADIO_OCT,"Button",BS_AUTORADIOBUTTON,72,24,27,10 + CONTROL "Bin",IDC_RADIO_BIN,"Button",BS_AUTORADIOBUTTON,100,24,26,10 + GROUPBOX "",IDC_STATIC,4,36,76,21 + CONTROL "Inv",IDC_CHECK_INV,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,8,44,26,10 + CONTROL "Hyp",IDC_CHECK_HYP,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,40,44,29,10 + CTEXT "",IDC_TEXT_PARENT,84,40,24,17,SS_CENTERIMAGE, + WS_EX_CLIENTEDGE + CTEXT "",IDC_TEXT_MEMORY,112,40,24,17,SS_CENTERIMAGE, + WS_EX_CLIENTEDGE + PUSHBUTTON "Sta",IDC_BUTTON_STA,4,64,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "Ave",IDC_BUTTON_AVE,4,83,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | WS_DISABLED | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "Sum",IDC_BUTTON_SUM,4,102,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | WS_DISABLED | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "s",IDC_BUTTON_S,4,121,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | WS_DISABLED | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "Dat",IDC_BUTTON_DAT,4,140,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | WS_DISABLED | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "F-E",IDC_BUTTON_FE,38,64,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "dms",IDC_BUTTON_DMS,38,83,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "sin",IDC_BUTTON_SIN,38,102,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "cos",IDC_BUTTON_COS,38,121,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "tan",IDC_BUTTON_TAN,38,140,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "(",IDC_BUTTON_LEFTPAR,64,64,24,17,BS_CENTER | + BS_VCENTER | BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "Exp",IDC_BUTTON_EXP,64,83,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "x^y",IDC_BUTTON_XeY,64,102,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "x^2",IDC_BUTTON_Xe2,64,121,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "x^3",IDC_BUTTON_Xe3,64,140,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON ")",IDC_BUTTON_RIGHTPAR,90,64,24,17,BS_CENTER | + BS_VCENTER | BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "ln",IDC_BUTTON_LN,90,83,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "log",IDC_BUTTON_LOG,90,102,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "n!",IDC_BUTTON_NF,90,121,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "1/x",IDC_BUTTON_RX,90,140,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "MC",IDC_BUTTON_MC,124,64,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "MR",IDC_BUTTON_MR,124,83,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "MS",IDC_BUTTON_MS,124,102,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "M+",IDC_BUTTON_MP,124,121,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "pi",IDC_BUTTON_PI,124,140,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "7",IDC_BUTTON_7,158,64,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "4",IDC_BUTTON_4,158,83,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "1",IDC_BUTTON_1,158,102,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "0",IDC_BUTTON_0,158,121,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "A",IDC_BUTTON_A,158,140,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "8",IDC_BUTTON_8,184,64,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "5",IDC_BUTTON_5,184,83,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "2",IDC_BUTTON_2,184,102,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "+/-",IDC_BUTTON_SIGN,184,121,24,17,BS_CENTER | + BS_VCENTER | BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "B",IDC_BUTTON_B,184,140,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "9",IDC_BUTTON_9,210,64,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "6",IDC_BUTTON_6,210,83,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "3",IDC_BUTTON_3,210,102,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON ",",IDC_BUTTON_DOT,210,121,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "C",IDC_BUTTON_C,210,140,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "/",IDC_BUTTON_DIV,236,64,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "*",IDC_BUTTON_MULT,236,83,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "-",IDC_BUTTON_SUB,236,102,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "+",IDC_BUTTON_ADD,236,121,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "D",IDC_BUTTON_D,236,140,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "Mod",IDC_BUTTON_MOD,262,64,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "Or",IDC_BUTTON_OR,262,83,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "Lsh",IDC_BUTTON_LSH,262,102,24,17,BS_CENTER | + BS_VCENTER | BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "=",IDC_BUTTON_EQU,262,121,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "E",IDC_BUTTON_E,262,140,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "And",IDC_BUTTON_AND,288,64,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "Xor",IDC_BUTTON_XOR,288,83,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "Not",IDC_BUTTON_NOT,288,102,24,17,BS_CENTER | + BS_VCENTER | BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "Int",IDC_BUTTON_INT,288,121,24,17,BS_CENTER | + BS_VCENTER | BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "F",IDC_BUTTON_F,288,140,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + GROUPBOX "",IDC_STATIC,140,16,172,21 + CONTROL "Qword",IDC_RADIO_QWORD,"Button",BS_AUTORADIOBUTTON | + NOT WS_VISIBLE,148,24,37,10 + CONTROL "Dword",IDC_RADIO_DWORD,"Button",BS_AUTORADIOBUTTON | + NOT WS_VISIBLE,188,24,37,10 + CONTROL "Word",IDC_RADIO_WORD,"Button",BS_AUTORADIOBUTTON | NOT + WS_VISIBLE,232,24,33,10 + CONTROL "Byte",IDC_RADIO_BYTE,"Button",BS_AUTORADIOBUTTON | NOT + WS_VISIBLE,272,24,30,10 + CONTROL "Grader",IDC_RADIO_DEG,"Button",BS_AUTORADIOBUTTON,148,24, + 42,10 + CONTROL "Radianer",IDC_RADIO_RAD,"Button",BS_AUTORADIOBUTTON,192, + 24,42,10 + CONTROL "Gradienter",IDC_RADIO_GRAD,"Button",BS_AUTORADIOBUTTON, + 236,24,48,10 + PUSHBUTTON "C",IDC_BUTTON_CANC,272,40,40,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "CE",IDC_BUTTON_CE,228,40,40,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "Backsteg",IDC_BUTTON_BACK,184,40,40,17,BS_CENTER | + BS_VCENTER | BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + RTEXT "",IDC_TEXT_OUTPUT,4,4,308,12,SS_CENTERIMAGE, + WS_EX_CLIENTEDGE + DEFPUSHBUTTON "",IDC_BUTTON_FOCUS,0,0,5,5, NOT WS_VISIBLE +END + +IDD_DIALOG_STANDARD DIALOGEX 0, 0, 172, 127 +STYLE DS_SHELLFONT | WS_MINIMIZEBOX | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "ReactOS Kalkylator" +MENU IDR_MENU_STANDARD +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + PUSHBUTTON "C",IDC_BUTTON_CANC,128,24,40,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "CE",IDC_BUTTON_CE,84,24,40,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "Backsteg",IDC_BUTTON_BACK,40,24,40,17,BS_CENTER | + BS_VCENTER | BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + RTEXT "",IDC_TEXT_OUTPUT,4,4,164,12,SS_CENTERIMAGE, + WS_EX_CLIENTEDGE + PUSHBUTTON "7",IDC_BUTTON_7,40,48,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "4",IDC_BUTTON_4,40,67,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "1",IDC_BUTTON_1,40,86,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "0",IDC_BUTTON_0,40,105,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "8",IDC_BUTTON_8,66,48,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "5",IDC_BUTTON_5,66,67,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "2",IDC_BUTTON_2,66,86,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "+/-",IDC_BUTTON_SIGN,66,105,24,17,BS_CENTER | + BS_VCENTER | BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "9",IDC_BUTTON_9,92,48,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "6",IDC_BUTTON_6,92,67,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "3",IDC_BUTTON_3,92,86,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON ",",IDC_BUTTON_DOT,92,105,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "/",IDC_BUTTON_DIV,118,48,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "*",IDC_BUTTON_MULT,118,67,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "-",IDC_BUTTON_SUB,118,86,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "+",IDC_BUTTON_ADD,118,105,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "Sqrt",IDC_BUTTON_SQRT,144,48,24,17,BS_CENTER | + BS_VCENTER | BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "%",IDC_BUTTON_PERCENT,144,67,24,17,BS_CENTER | + BS_VCENTER | BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "1/x",IDC_BUTTON_RX,144,86,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "=",IDC_BUTTON_EQU,144,105,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + CTEXT "",IDC_TEXT_MEMORY,4,24,24,17,SS_CENTERIMAGE, + WS_EX_CLIENTEDGE + PUSHBUTTON "MC",IDC_BUTTON_MC,4,48,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "MR",IDC_BUTTON_MR,4,67,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "MS",IDC_BUTTON_MS,4,86,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "M+",IDC_BUTTON_MP,4,105,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + DEFPUSHBUTTON "",IDC_BUTTON_FOCUS,0,0,5,5, NOT WS_VISIBLE +END + +IDD_DIALOG_CONVERSION DIALOGEX 0, 0, 320, 130 +STYLE DS_SHELLFONT | WS_MINIMIZEBOX | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "ReactOS Kalkylator" +MENU IDR_MENU_STANDARD +FONT 8, "MS Shell Dlg" +BEGIN + PUSHBUTTON "Konvertera",IDC_BUTTON_CONVERT,35,105,76,17 + COMBOBOX IDC_COMBO_CATEGORY,4,31,140,168,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP | CBS_SORT + LTEXT "Kategori:",IDC_STATIC,4,20,56,8 + COMBOBOX IDC_COMBO_FROM,4,60,140,168,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP | CBS_SORT + LTEXT "Konvertera frn:",IDC_STATIC,4,49,56,8 + COMBOBOX IDC_COMBO_TO,4,87,140,168,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP | CBS_SORT + LTEXT "Konvertera till:",IDC_STATIC,4,76,56,8 + CONTROL "C",IDC_BUTTON_CANC,"Button",BS_OWNERDRAW | BS_CENTER | + BS_VCENTER | BS_NOTIFY | WS_TABSTOP,276,24,40,17 + CONTROL "CE",IDC_BUTTON_CE,"Button",BS_OWNERDRAW | BS_CENTER | + BS_VCENTER | BS_NOTIFY | WS_TABSTOP,232,24,40,17 + CONTROL "Backsteg",IDC_BUTTON_BACK,"Button",BS_OWNERDRAW | + BS_CENTER | BS_VCENTER | BS_NOTIFY | WS_TABSTOP,188,24, + 40,17 + RTEXT "",IDC_TEXT_OUTPUT,4,4,312,12,SS_CENTERIMAGE, + WS_EX_CLIENTEDGE + CONTROL "7",IDC_BUTTON_7,"Button",BS_OWNERDRAW | BS_CENTER | + BS_VCENTER | BS_NOTIFY | WS_TABSTOP,188,48,24,17 + CONTROL "4",IDC_BUTTON_4,"Button",BS_OWNERDRAW | BS_CENTER | + BS_VCENTER | BS_NOTIFY | WS_TABSTOP,188,67,24,17 + CONTROL "1",IDC_BUTTON_1,"Button",BS_OWNERDRAW | BS_CENTER | + BS_VCENTER | BS_NOTIFY | WS_TABSTOP,188,86,24,17 + CONTROL "0",IDC_BUTTON_0,"Button",BS_OWNERDRAW | BS_CENTER | + BS_VCENTER | BS_NOTIFY | WS_TABSTOP,188,105,24,17 + CONTROL "8",IDC_BUTTON_8,"Button",BS_OWNERDRAW | BS_CENTER | + BS_VCENTER | BS_NOTIFY | WS_TABSTOP,214,48,24,17 + CONTROL "5",IDC_BUTTON_5,"Button",BS_OWNERDRAW | BS_CENTER | + BS_VCENTER | BS_NOTIFY | WS_TABSTOP,214,67,24,17 + CONTROL "2",IDC_BUTTON_2,"Button",BS_OWNERDRAW | BS_CENTER | + BS_VCENTER | BS_NOTIFY | WS_TABSTOP,214,86,24,17 + CONTROL "+/-",IDC_BUTTON_SIGN,"Button",BS_OWNERDRAW | BS_CENTER | + BS_VCENTER | BS_NOTIFY | WS_TABSTOP,214,105,24,17 + CONTROL "9",IDC_BUTTON_9,"Button",BS_OWNERDRAW | BS_CENTER | + BS_VCENTER | BS_NOTIFY | WS_TABSTOP,240,48,24,17 + CONTROL "6",IDC_BUTTON_6,"Button",BS_OWNERDRAW | BS_CENTER | + BS_VCENTER | BS_NOTIFY | WS_TABSTOP,240,67,24,17 + CONTROL "3",IDC_BUTTON_3,"Button",BS_OWNERDRAW | BS_CENTER | + BS_VCENTER | BS_NOTIFY | WS_TABSTOP,240,86,24,17 + CONTROL ",",IDC_BUTTON_DOT,"Button",BS_OWNERDRAW | BS_CENTER | + BS_VCENTER | BS_NOTIFY | WS_TABSTOP,240,105,24,17 + CONTROL "/",IDC_BUTTON_DIV,"Button",BS_OWNERDRAW | BS_CENTER | + BS_VCENTER | BS_NOTIFY | WS_TABSTOP,266,48,24,17 + CONTROL "*",IDC_BUTTON_MULT,"Button",BS_OWNERDRAW | BS_CENTER | + BS_VCENTER | BS_NOTIFY | WS_TABSTOP,266,67,24,17 + CONTROL "-",IDC_BUTTON_SUB,"Button",BS_OWNERDRAW | BS_CENTER | + BS_VCENTER | BS_NOTIFY | WS_TABSTOP,266,86,24,17 + CONTROL "+",IDC_BUTTON_ADD,"Button",BS_OWNERDRAW | BS_CENTER | + BS_VCENTER | BS_NOTIFY | WS_TABSTOP,266,105,24,17 + CONTROL "sqrt",IDC_BUTTON_SQRT,"Button",BS_OWNERDRAW | BS_CENTER | + BS_VCENTER | BS_NOTIFY | WS_TABSTOP,292,48,24,17 + CONTROL "%",IDC_BUTTON_PERCENT,"Button",BS_OWNERDRAW | BS_CENTER | + BS_VCENTER | BS_NOTIFY | WS_TABSTOP,292,67,24,17 + CONTROL "1/x",IDC_BUTTON_RX,"Button",BS_OWNERDRAW | BS_CENTER | + BS_VCENTER | BS_NOTIFY | WS_TABSTOP,292,86,24,17 + CONTROL "=",IDC_BUTTON_EQU,"Button",BS_OWNERDRAW | BS_CENTER | + BS_VCENTER | BS_NOTIFY | WS_TABSTOP,292,105,24,17 + CTEXT "",IDC_TEXT_MEMORY,152,24,24,17,SS_CENTERIMAGE, + WS_EX_CLIENTEDGE + CONTROL "MC",IDC_BUTTON_MC,"Button",BS_OWNERDRAW | BS_CENTER | + BS_VCENTER | BS_NOTIFY | WS_TABSTOP,152,48,24,17 + CONTROL "MR",IDC_BUTTON_MR,"Button",BS_OWNERDRAW | BS_CENTER | + BS_VCENTER | BS_NOTIFY | WS_TABSTOP,152,67,24,17 + CONTROL "MS",IDC_BUTTON_MS,"Button",BS_OWNERDRAW | BS_CENTER | + BS_VCENTER | BS_NOTIFY | WS_TABSTOP,152,86,24,17 + CONTROL "M+",IDC_BUTTON_MP,"Button",BS_OWNERDRAW | BS_CENTER | + BS_VCENTER | BS_NOTIFY | WS_TABSTOP,152,105,24,17 + DEFPUSHBUTTON "",IDC_BUTTON_FOCUS,0,0,5,5,NOT WS_VISIBLE +END + +IDD_DIALOG_ABOUT DIALOGEX DISCARDABLE 0, 0, 264, 169 +STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "Om ReactOS Kalkylator" +FONT 8, "MS Shell Dlg" +BEGIN + DEFPUSHBUTTON "OK",IDOK,105,148,52,16 + CONTROL IDB_BITMAP_ROS,IDC_STATIC,"Static",SS_BITMAP | SS_CENTERIMAGE | + SS_REALSIZEIMAGE | WS_BORDER,4,4,104,48 + LTEXT "ReactOS Kalkylator",IDC_STATIC,120,12,132,8, + SS_CENTERIMAGE + LTEXT "Version ",IDC_TEXT_VERSION,120,20,132,8,SS_CENTERIMAGE + LTEXT "Skriven av Carlo Bramini",IDC_STATIC,120,32,132,8, + SS_CENTERIMAGE + GROUPBOX "",IDC_STATIC,112,0,148,52 + GROUPBOX "",IDC_STATIC,4,56,256,88 + EDITTEXT IDC_EDIT_LICENSE,12,68,240,68,ES_MULTILINE | ES_READONLY | + WS_VSCROLL +END + +IDD_DIALOG_STAT DIALOGEX DISCARDABLE 0, 0, 163, 85 +STYLE DS_SHELLFONT | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "Statistik box" +FONT 8, "MS Shell Dlg" +BEGIN + LISTBOX IDC_LIST_STAT,4,4,156,40,LBS_NOINTEGRALHEIGHT | + WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "RET",IDC_BUTTON_RET,4,48,36,16 + PUSHBUTTON "LOAD",IDC_BUTTON_LOAD,44,48,36,16 + PUSHBUTTON "CD",IDC_BUTTON_CD,84,48,36,16 + PUSHBUTTON "CAD",IDC_BUTTON_CAD,124,48,36,16 + CTEXT "n=0",IDC_TEXT_NITEMS,4,68,156,12,SS_CENTERIMAGE | + SS_SUNKEN +END + +// Menus + +IDR_MENU_SCIENTIFIC_1 MENU DISCARDABLE +BEGIN + POPUP "Redigera" + BEGIN + MENUITEM "Kopiera\tCTRL-C", IDM_EDIT_COPY + MENUITEM "Klistra in\tCTRL-V", IDM_EDIT_PASTE + END + POPUP "Visa" + BEGIN + MENUITEM "Standard", IDM_VIEW_STANDARD, CHECKED + MENUITEM "Vetenskaplig", IDM_VIEW_SCIENTIFIC, CHECKED + MENUITEM "Konvertering", IDM_VIEW_CONVERSION + MENUITEM SEPARATOR + MENUITEM "Hexadecimal\tF5", IDM_VIEW_HEX, CHECKED + MENUITEM "Desimal\tF6", IDM_VIEW_DEC, CHECKED + MENUITEM "Oktal\tF7", IDM_VIEW_OCT, CHECKED + MENUITEM "Binr\tF8", IDM_VIEW_BIN, CHECKED + MENUITEM SEPARATOR + MENUITEM "Grader\tF2", IDM_VIEW_DEG, CHECKED + MENUITEM "Radianer\tF3", IDM_VIEW_RAD, CHECKED + MENUITEM "Gradienter\tF4", IDM_VIEW_GRAD, CHECKED + MENUITEM SEPARATOR + MENUITEM "Siffergruppering", IDM_VIEW_GROUP, CHECKED + END + POPUP "Hjlp" + BEGIN + MENUITEM "Visa hjlp", IDM_HELP_HELP + MENUITEM SEPARATOR + MENUITEM "Om ReactOS Kalkylator", IDM_HELP_ABOUT + END +END + +IDR_MENU_SCIENTIFIC_2 MENU DISCARDABLE +BEGIN + POPUP "Redigera" + BEGIN + MENUITEM "Kopiera\tCTRL-C", IDM_EDIT_COPY + MENUITEM "Klistra in\tCTRL-V", IDM_EDIT_PASTE + END + POPUP "Vis" + BEGIN + MENUITEM "Standard", IDM_VIEW_STANDARD, CHECKED + MENUITEM "Vetenskaplig", IDM_VIEW_SCIENTIFIC, CHECKED + MENUITEM "Konvertering", IDM_VIEW_CONVERSION + MENUITEM SEPARATOR + MENUITEM "Hexadecimal\tF5", IDM_VIEW_HEX, CHECKED + MENUITEM "Desimal\tF6", IDM_VIEW_DEC, CHECKED + MENUITEM "Oktal\tF7", IDM_VIEW_OCT, CHECKED + MENUITEM "Binr\tF8", IDM_VIEW_BIN, CHECKED + MENUITEM SEPARATOR + MENUITEM "Qword\tF12", IDM_VIEW_QWORD, CHECKED + MENUITEM "Dword\tF2", IDM_VIEW_DWORD, CHECKED + MENUITEM "Word\tF3", IDM_VIEW_WORD, CHECKED + MENUITEM "Byte\tF4", IDM_VIEW_BYTE, CHECKED + MENUITEM SEPARATOR + MENUITEM "Siffergruppering", IDM_VIEW_GROUP, CHECKED + END + POPUP "Hjlp" + BEGIN + MENUITEM "Visa hjlp", IDM_HELP_HELP + MENUITEM SEPARATOR + MENUITEM "Om ReactOS Kalkylator", IDM_HELP_ABOUT + END +END + +IDR_MENU_STANDARD MENU DISCARDABLE +BEGIN + POPUP "Redigera" + BEGIN + MENUITEM "Kopiera\tCTRL-C", IDM_EDIT_COPY + MENUITEM "Klistra in\tCTRL-V", IDM_EDIT_PASTE + END + POPUP "Visa" + BEGIN + MENUITEM "Standard", IDM_VIEW_STANDARD, CHECKED + MENUITEM "Vetenskapelig", IDM_VIEW_SCIENTIFIC, CHECKED + MENUITEM "Konvertering", IDM_VIEW_CONVERSION + MENUITEM SEPARATOR + MENUITEM "Siffergruppering", IDM_VIEW_GROUP, CHECKED + END + POPUP "Hjlp" + BEGIN + MENUITEM "Visa hjlp", IDM_HELP_HELP + MENUITEM SEPARATOR + MENUITEM "Om Reactos Kalkylator", IDM_HELP_ABOUT + END +END + +// String Tables + +STRINGTABLE DISCARDABLE +BEGIN + IDS_STRING_LICENSE "ReactOS Kalkylator r gratis programvara utgivet under GNU GPL licensen.\r\n\r\nDu kan f en kopia av GNU GPL licensen her:\r\nhttp://www.gnu.org/licenses/gpl.html\r\n\r\nDu kan ocks f en versttning av GNU GPL lisensen her:\r\nhttp://www.gnu.org/licenses/translations.html" + IDS_MATH_ERROR "Fel" + IDS_QUICKHELP "Snabb hjlp" +END + +// Types of conversion +STRINGTABLE DISCARDABLE +BEGIN + IDS_CONV_ANGLE "Vinkel" + IDS_CONV_AREA "Omrde" + IDS_CONV_CONSUMPTION "Frbrukning (motor)" + IDS_CONV_CURRENCY "Valuta" + IDS_CONV_ENERGY "Energi" + IDS_CONV_LENGTH "Lngd" + IDS_CONV_POWER "Strm" + IDS_CONV_PRESSURE "Tryck" + IDS_CONV_TEMPERATURE "Temperatur" + IDS_CONV_TIME "Tid" + IDS_CONV_VELOCITY "Hastighet" + IDS_CONV_VOLUME "Volym" + IDS_CONV_WEIGHT "Vikt" +END + +// TYPES OF ANGLES +STRINGTABLE DISCARDABLE +BEGIN + IDS_ANGLE_DEGREES "Grader" + IDS_ANGLE_GRADIANS "Gradianer" + IDS_ANGLE_RADIANS "Radianer" +END + +// TYPES OF AREAS +STRINGTABLE DISCARDABLE +BEGIN + IDS_AREA_ACRES "Tunnland" + IDS_AREA_ACRES_BRAZIL "Tunnland (Brasil)" + IDS_AREA_ACRES_FRANCE "Tunnland (France)" + IDS_AREA_ACRES_SCOTS "Tunnland (Scots)" + IDS_AREA_ACRES_US "Tunnland (US)" + IDS_AREA_ARES "Tunnland" + IDS_AREA_CHOU "Chou" + IDS_AREA_DANBO "Danbo" + IDS_AREA_HECTARES "Hektar" + IDS_AREA_JEONGBO "Jeongbo" + IDS_AREA_MORGEN_HUNGARY "Morgen (Hungary)" + IDS_AREA_MU "Mu" + IDS_AREA_PING "Ping" + IDS_AREA_PYEONG "Pyeong" + IDS_AREA_PYEONGBANGJA "Pyeongbangja" + IDS_AREA_RAI "Rai" + IDS_AREA_SE "Se" + IDS_AREA_SQUARE_CENTIMETERS "Kvadrat centimeter" + IDS_AREA_SQUARE_CHR "Kvadrat chr" + IDS_AREA_SQUARE_FATHOMS "Kvadrat fathoms" + IDS_AREA_SQUARE_FATHOMS_HUNGARY "Kvadrat fathoms (Hungary)" + IDS_AREA_SQUARE_FEET "Kvadrat fot" + IDS_AREA_SQUARE_INCHES "Kvadrat tum" + IDS_AREA_SQUARE_KILOMETERS "Kvadrat kilometer" + IDS_AREA_SQUARE_LAR "kvadrat lar" + IDS_AREA_SQUARE_METER "Kvadrat meter" + IDS_AREA_SQUARE_MILES "Kvadrat mil" + IDS_AREA_SQUARE_MILLIMETERS "Kvadrat millimeter" + IDS_AREA_SQUARE_SHAKU "Kvadrat shaku" + IDS_AREA_SQUARE_TSUEN "Kvadrat tsuen" + IDS_AREA_SQUARE_VA "Kvadrat va" + IDS_AREA_SQUARE_YARD "Kvadrat yard" + IDS_AREA_TAN "Tan" + IDS_AREA_TSUBO "Tsubo" +END + +// TYPES OF COMSUMPTIONS +STRINGTABLE DISCARDABLE +BEGIN + IDS_CONSUMPTION_KM_PER_L "Kilometer/liter" + IDS_CONSUMPTION_L_PER_100_KM "Liter/100 kilometer" + IDS_CONSUMPTION_MILES_GALLON_UK "Mil/gallon (UK)" + IDS_CONSUMPTION_MILES_GALLON_US "Mil/gallon (US)" +END + +// TYPES OF CURRENCIES +STRINGTABLE DISCARDABLE +BEGIN + IDS_CURRENCY_AUSTRIAN_SCHILLING "sterriksk schilling" + IDS_CURRENCY_BELGIAN_FRANC "Belgisk franc" + IDS_CURRENCY_CYPRIOT_POUND "Cypriotisk pound" + IDS_CURRENCY_CZECH_KORUNA "Tjeckisk koruna" + IDS_CURRENCY_DEUTSCHE_MARK "Tysk Mark" + IDS_CURRENCY_DUTCH_GUILDER "Nederlnsk guilder" + IDS_CURRENCY_EURO "Euro" + IDS_CURRENCY_FINNISH_MARKKA "Finisk mark" + IDS_CURRENCY_FRENCH_FRANC "Fransk franc" + IDS_CURRENCY_GREEK_DRACHMA "Gresk Drachma" + IDS_CURRENCY_IRISH_POUND "Irisk pound" + IDS_CURRENCY_ITALIAN_LIRA "Italiask lire" + IDS_CURRENCY_LUXEMBOURG_FRANC "Luxembourg franc" + IDS_CURRENCY_MALTESE_LIRA "Maltesisk lire" + IDS_CURRENCY_PORTOGUESE_ESCUDO "Portogisisk escudo" + IDS_CURRENCY_SLOVAK_KORUNA "Slovansk koruna" + IDS_CURRENCY_SLOVENIAN_TOLAR "Slovenansk tolar" + IDS_CURRENCY_SPANISH_PESETA "Spansk peseta" +END + +// TYPES OF ENERGIES +STRINGTABLE DISCARDABLE +BEGIN + IDS_ENERGY_15_C_CALORIES "15 C calories" + IDS_ENERGY_BTUS "Britisk vrme-enhet" + IDS_ENERGY_ERGS "Ergs" + IDS_ENERGY_EVS "Electron-Volt" + IDS_ENERGY_FOOT_POUNDS "Fot-Pound" + IDS_ENERGY_IT_CALORIES "International Table Calories" + IDS_ENERGY_IT_KILOCALORIES "International Table Kilocalories" + IDS_ENERGY_JOULES "Joules" + IDS_ENERGY_KILOJOULES "Kilojoules" + IDS_ENERGY_KILOWATT_HOURS "Kilowatt timmar" + IDS_ENERGY_NUTRITION_CALORIES "Nrings kalorier" + IDS_ENERGY_TH_CALORIES "Termokemiska kalorier" +END + +// TYPES OF LENGTHS +STRINGTABLE DISCARDABLE +BEGIN + IDS_LENGTH_ANGSTROMS "ngstrm" + IDS_LENGTH_ASTRONOMICAL_UNITS "Astronomical units" + IDS_LENGTH_BARLEYCORNS "Barleycorns" + IDS_LENGTH_CENTIMETERS "Centimeter" + IDS_LENGTH_CHAINS_UK "Chains (UK)" + IDS_LENGTH_CHI "Chi" + IDS_LENGTH_CHOU "Chou" + IDS_LENGTH_CHR "Chr" + IDS_LENGTH_CUN "Cun" + IDS_LENGTH_FATHOMS "Fathoms" + IDS_LENGTH_FATHOMS_HUNGARY "Fathoms (Ungarn)" + IDS_LENGTH_FEET "Fot" + IDS_LENGTH_FURLONGS "Furlongs" + IDS_LENGTH_GAN "Gan" + IDS_LENGTH_HANDS "Hand" + IDS_LENGTH_HUNH "Hunh" + IDS_LENGTH_INCHES "Tum" + IDS_LENGTH_JA "Ja" + IDS_LENGTH_JEONG "Jeong" + IDS_LENGTH_KABIET "Kabiet" + IDS_LENGTH_KEN "Ken" + IDS_LENGTH_KEUB "Keub" + IDS_LENGTH_KILOMETERS "Kilometer" + IDS_LENGTH_LAR "Lar" + IDS_LENGTH_LIGHT_YEARS "Ljus r" + IDS_LENGTH_LINKS_UK "Linker (UK)" + IDS_LENGTH_METERS "Meter" + IDS_LENGTH_MICRONS "Micron" + IDS_LENGTH_MILES "Mil" + IDS_LENGTH_MILLIMETERS "Millimeter" + IDS_LENGTH_NAUTICAL_MILES "Nautisk mil" + IDS_LENGTH_NIEU "Nieu" + IDS_LENGTH_PARSECS "Parsecs" + IDS_LENGTH_PICAS "Picas" + IDS_LENGTH_RI_JAPAN "Ri (Japan)" + IDS_LENGTH_RI_KOREA "Ri (Korea)" + IDS_LENGTH_RODS "Rods" + IDS_LENGTH_SAWK "Sawk" + IDS_LENGTH_SEN "Sen" + IDS_LENGTH_SHAKU "Shaku" + IDS_LENGTH_SPAN "Span" + IDS_LENGTH_SUN "Sun" + IDS_LENGTH_TSUEN "Tsuen" + IDS_LENGTH_VA "Va" + IDS_LENGTH_YARDS "Yard" + IDS_LENGTH_YOTE "Yote" + IDS_LENGTH_ZHANG "Zhang" +END + +// TYPES OF POWERS +STRINGTABLE DISCARDABLE +BEGIN + IDS_POWER_BTUS_PER_MINUTE "Britisk vrme-enhet per minut" + IDS_POWER_FPS_PER_MINUTE "Fot-pund per minut" + IDS_POWER_HORSEPOWER "Hstekrafter" + IDS_POWER_KILOWATTS "Kilowatt" + IDS_POWER_MEGAWATTS "Megawatt" + IDS_POWER_WATTS "Watt" +END + +// TYPE OF PRESSURES +STRINGTABLE DISCARDABLE +BEGIN + IDS_PRESSURE_ATMOSPHERES "Atmosfr" + IDS_PRESSURE_BARS "Bar" + IDS_PRESSURE_HECTOPASCALS "Hectopascal" + IDS_PRESSURE_KILOPASCALS "Kilopascal" + IDS_PRESSURE_MM_OF_MERCURY "Millimeters kvicksilver" + IDS_PRESSURE_PASCALS "Pascal" + IDS_PRESSURE_PSI "Pond per kvadrattum" +END + +// TYPES OF TEMPERATURES +STRINGTABLE DISCARDABLE +BEGIN + IDS_TEMPERATURE_CELSIUS "Celsius" + IDS_TEMPERATURE_FAHRENHEIT "Fahrenheit" + IDS_TEMPERATURE_KELVIN "Kelvin" + IDS_TEMPERATURE_RANKINE "Rankine" +END + +// TYPES OF TIME +STRINGTABLE DISCARDABLE +BEGIN + IDS_TIME_DAYS "**" + IDS_TIME_HOURS "**" + IDS_TIME_NANOSECONDS "Nanoseconds" + IDS_TIME_MICROSECONDS "**" + IDS_TIME_MILLISECONDS "**" + IDS_TIME_MINUTES "**" + IDS_TIME_SECONDS "**" + IDS_TIME_WEEKS "**" + IDS_TIME_YEARS "**" +END + +// TYPES OF VELOCITIES +STRINGTABLE DISCARDABLE +BEGIN + IDS_VELOCITY_CMS_SECOND "Centimeter/time" + IDS_VELOCITY_FEET_HOUR "Fot/timme" + IDS_VELOCITY_FEET_SECOND "Fot/sekund" + IDS_VELOCITY_KILOMETERS_HOUR "Kilometer/timme" + IDS_VELOCITY_KNOTS "Knop" + IDS_VELOCITY_MACH "Mach" + IDS_VELOCITY_METERS_SECOND "Meter/sekund" + IDS_VELOCITY_MILES_HOUR "Mil/timme" +END + +// TYPES OF VOLUMES +STRINGTABLE DISCARDABLE +BEGIN + IDS_VOLUME_BARRELS_UK "Barrels (UK)" + IDS_VOLUME_BARRELS_OIL "Barrels oil" + IDS_VOLUME_BUN "Bun" + IDS_VOLUME_BUSHELS_UK "Bushels (UK)" + IDS_VOLUME_BUSHELS_US "Bushels (US)" + IDS_VOLUME_CUBIC_CENTIMETERS "Kubikcentimeter" + IDS_VOLUME_CUBIC_FEET "Kubikfot" + IDS_VOLUME_CUBIC_INCHES "Kubiktumm" + IDS_VOLUME_CUBIC_METERS "Kubikmeter" + IDS_VOLUME_CUBIC_YARDS "Kubikyards" + IDS_VOLUME_DOE "Doe" + IDS_VOLUME_FLUID_OUNCES_UK "Fluid ounces (UK)" + IDS_VOLUME_FLUID_OUNCES_US "Fluid ounces (US)" + IDS_VOLUME_GALLONS_UK "Gallons (UK)" + IDS_VOLUME_GALLONS_DRY_US "Gallons, dry (US)" + IDS_VOLUME_GALLONS_LIQUID_US "Gallons, liquid (US)" + IDS_VOLUME_GOU "Gou" + IDS_VOLUME_HOP "Hop" + IDS_VOLUME_ICCE "Icce" + IDS_VOLUME_KWIAN "Kwian" + IDS_VOLUME_LITERS "Liter" + IDS_VOLUME_MAL "Mal" + IDS_VOLUME_MILLILITERS "Milliliter" + IDS_VOLUME_PINTS_UK "Pints (UK)" + IDS_VOLUME_PINTS_DRY_US "Pints, dry (US)" + IDS_VOLUME_PINTS_LIQUID_US "Pints, liquid (US)" + IDS_VOLUME_QUARTS_UK "Quarts (UK)" + IDS_VOLUME_QUARTS_DRY_US "Quarts, dry (US)" + IDS_VOLUME_QUARTS_LIQUID_US "Quarts, liquid (US)" + IDS_VOLUME_SEKI "Seki" + IDS_VOLUME_SYOU "Syou" + IDS_VOLUME_TANANLOUNG "Tananloung" + IDS_VOLUME_TANG "Tang" + IDS_VOLUME_TO "To" +END + +// TYPES OF WEIGHTS +STRINGTABLE DISCARDABLE +BEGIN + IDS_WEIGHT_BAHT "Baht" + IDS_WEIGHT_CARATS "Carats" + IDS_WEIGHT_CHUNG "Chung" + IDS_WEIGHT_DON "Don" + IDS_WEIGHT_GEUN "Geun" + IDS_WEIGHT_GRAMS "Gram" + IDS_WEIGHT_GWAN "Gwan" + IDS_WEIGHT_HARB "Harb" + IDS_WEIGHT_JIN_CHINA "Jin (Kina)" + IDS_WEIGHT_JIN_TAIWAN "Jin (Taiwaner)" + IDS_WEIGHT_KAN "Kan" + IDS_WEIGHT_KILOGRAMS "Kilogram" + IDS_WEIGHT_KIN "Kin" + IDS_WEIGHT_LIANG_CHINA "Liang (Kina)" + IDS_WEIGHT_LIANG_TAIWAN "Liang (Taiwaner)" + IDS_WEIGHT_MONME "Monme" + IDS_WEIGHT_OUNCES_AVOIRDUPOIS "Ounces, avoirdupois" + IDS_WEIGHT_OUNCES_TROY "Ounces, troy" + IDS_WEIGHT_POUNDS "Pund" + IDS_WEIGHT_QUINTAL_METRIC "Quintal (metric)" + IDS_WEIGHT_SALOUNG "Saloung" + IDS_WEIGHT_STONES "Sten" + IDS_WEIGHT_TAMLUNG "Tamlung" + IDS_WEIGHT_TONNES "Ton" + IDS_WEIGHT_TONS_UK "Ton (UK)" + IDS_WEIGHT_TONS_US "Ton (US)" +END diff --git a/reactos/base/applications/calc/resource.rc b/reactos/base/applications/calc/resource.rc index 945df68922a..fa35d39ce5b 100644 --- a/reactos/base/applications/calc/resource.rc +++ b/reactos/base/applications/calc/resource.rc @@ -60,5 +60,6 @@ IDB_BITMAP_ROS BITMAP DISCARDABLE "res/ROS_logo.bmp" #include "lang/ro-RO.rc" #include "lang/ru-RU.rc" #include "lang/sk-SK.rc" +#include "lang/sv-SE.rc" #include "lang/th-TH.rc" #include "lang/uk-UA.rc" From 7ce75cdf13520aef7b126995c9b7ad954b98b445 Mon Sep 17 00:00:00 2001 From: Matthias Kupfer Date: Sun, 17 Apr 2011 09:50:07 +0000 Subject: [PATCH 161/317] fix accidentally set property svn:executable svn path=/trunk/; revision=51374 --- reactos/apistatus.lst | 0 reactos/base/setup/welcome/res/title.bmp | Bin reactos/base/setup/welcome/resource.h | 0 reactos/base/setup/welcome/welcome.c | 0 reactos/base/setup/welcome/welcome.rc | 0 reactos/base/system/format/format.c | 0 reactos/boot/armllb/hw/keyboard.c | 0 reactos/boot/armllb/hw/matrix.c | 0 reactos/boot/armllb/hw/omap3-beagle/hwinfo.c | 0 reactos/boot/armllb/hw/omap3-beagle/hwinit.c | 0 reactos/boot/armllb/hw/omap3-beagle/hwuart.c | 0 reactos/boot/armllb/hw/omap3-zoom2/hwinfo.c | 0 reactos/boot/armllb/hw/omap3-zoom2/hwinit.c | 0 reactos/boot/armllb/hw/omap3-zoom2/hwlcd.c | 0 reactos/boot/armllb/hw/omap3-zoom2/hwsynkp.c | 0 reactos/boot/armllb/hw/omap3-zoom2/hwtwl40x.c | 0 reactos/boot/armllb/hw/omap3-zoom2/hwuart.c | 0 reactos/boot/armllb/hw/serial.c | 0 reactos/boot/armllb/hw/time.c | 0 reactos/boot/armllb/hw/versatile/hwclcd.c | 0 reactos/boot/armllb/hw/versatile/hwinfo.c | 0 reactos/boot/armllb/hw/versatile/hwinit.c | 0 reactos/boot/armllb/hw/versatile/hwkmi.c | 0 reactos/boot/armllb/hw/versatile/hwuart.c | 0 reactos/boot/armllb/inc/envir.h | 0 reactos/boot/armllb/inc/fw.h | 0 reactos/boot/armllb/inc/hw.h | 0 reactos/boot/armllb/inc/keyboard.h | 0 reactos/boot/armllb/inc/omap3.h | 0 reactos/boot/armllb/inc/precomp.h | 0 reactos/boot/armllb/inc/serial.h | 0 reactos/boot/armllb/inc/versa.h | 0 reactos/boot/armllb/inc/video.h | 0 reactos/boot/armllb/main.c | 0 reactos/boot/armllb/os/loader.c | 0 reactos/boot/bootdata/autorun.inf | 0 reactos/boot/bootdata/icon.ico | Bin reactos/dll/win32/aclui/aclui_Fr.rc | 0 reactos/dll/win32/dhcpcsvc/dhcpcsvc.rc | 0 reactos/dll/win32/kernel32/include/kernel32.h | 0 reactos/dll/win32/kernel32/k32.h | 0 reactos/dll/win32/msafd/msafd.h | 0 .../shell32/res/bitmaps/shell_about_logo_24bpp.bmp | Bin reactos/drivers/bluetooth/fbtusb/fbtdev.c | 0 reactos/drivers/bluetooth/fbtusb/fbtpnp.c | 0 reactos/drivers/bluetooth/fbtusb/fbtpwr.c | 0 reactos/drivers/bluetooth/fbtusb/fbtrwr.c | 0 reactos/drivers/bluetooth/fbtusb/fbtusb.c | 0 reactos/drivers/bluetooth/fbtusb/fbtwmi.c | 0 .../bluetooth/fbtusb/include/fbtHciCmdStructs.h | 0 .../drivers/bluetooth/fbtusb/include/fbtHciCmds.h | 0 .../drivers/bluetooth/fbtusb/include/fbtHciDefs.h | 0 .../drivers/bluetooth/fbtusb/include/fbtHciErrors.h | 0 .../bluetooth/fbtusb/include/fbtHciEventStructs.h | 0 .../drivers/bluetooth/fbtusb/include/fbtHciEvents.h | 0 .../drivers/bluetooth/fbtusb/include/fbtHciLocal.h | 0 .../bluetooth/fbtusb/include/fbtHciOpCodes.h | 0 .../drivers/bluetooth/fbtusb/include/fbtHciParms.h | 0 .../bluetooth/fbtusb/include/fbtHciRoundTrip.h | 0 .../drivers/bluetooth/fbtusb/include/fbtHciSizes.h | 0 .../drivers/bluetooth/fbtusb/include/fbtSeXcpt.h | 0 reactos/drivers/bluetooth/fbtusb/include/fbtdev.h | 0 reactos/drivers/bluetooth/fbtusb/include/fbthci.h | 0 reactos/drivers/bluetooth/fbtusb/include/fbthw.h | 0 reactos/drivers/bluetooth/fbtusb/include/fbtlog.h | 0 reactos/drivers/bluetooth/fbtusb/include/fbtpnp.h | 0 reactos/drivers/bluetooth/fbtusb/include/fbtpwr.h | 0 reactos/drivers/bluetooth/fbtusb/include/fbtreg.h | 0 reactos/drivers/bluetooth/fbtusb/include/fbtrwr.h | 0 reactos/drivers/bluetooth/fbtusb/include/fbtusb.h | 0 reactos/drivers/bluetooth/fbtusb/include/fbtusr.h | 0 reactos/drivers/bluetooth/fbtusb/include/fbtutil.h | 0 reactos/drivers/bluetooth/fbtusb/include/fbtwmi.h | 0 reactos/drivers/bluetooth/fbtusb/include/fbtxcpt.h | 0 reactos/drivers/filesystems/ntfs/close.c | 0 reactos/drivers/filesystems/ntfs/notes.txt | 0 reactos/drivers/filesystems/ntfs/rw.c | 0 reactos/drivers/multimedia/README | 0 reactos/drivers/multimedia/directory.rbuild | 0 reactos/drivers/network/tcpip/include/linux.h | 0 reactos/drivers/network/tcpip/include/tcpcore.h | 0 reactos/drivers/network/tcpip/include/tcpdef.h | 0 reactos/drivers/video/displays/framebuf_new/debug.c | 0 reactos/drivers/video/displays/framebuf_new/debug.h | 0 .../drivers/video/displays/framebuf_new/driver.h | 0 .../drivers/video/displays/framebuf_new/palette.c | 0 .../drivers/video/displays/framebuf_new/pointer.c | 0 .../drivers/video/displays/framebuf_new/screen.c | 0 reactos/drivers/video/displays/vga_new/debug.c | 0 reactos/drivers/video/displays/vga_new/debug.h | 0 reactos/drivers/video/displays/vga_new/driver.h | 0 reactos/drivers/video/displays/vga_new/palette.c | 0 reactos/drivers/video/displays/vga_new/screen.c | 0 reactos/include/reactos/libs/fslib/vfatlib.h | 0 reactos/lib/3rdparty/adns/install-sh | 0 reactos/lib/fslib/vfatlib/check/vfat.h | 0 reactos/lib/fslib/vfatlib/vfatlib.c | 0 reactos/lib/fslib/vfatlib/vfatlib.h | 0 reactos/lib/inflib/inflib.mak | 0 reactos/lib/sdk/crt/wine/undname.c | 0 reactos/ntoskrnl/io/iomgr/rawfs.c | 0 reactos/tools/cabman/cabinet.cxx | 0 reactos/tools/cabman/cabinet.h | 0 reactos/tools/cabman/cabman.h | 0 reactos/tools/cabman/dff.txt | 0 reactos/tools/cabman/dfp.cxx | 0 reactos/tools/cabman/dfp.h | 0 reactos/tools/cabman/main.cxx | 0 reactos/tools/cabman/makefile.win32 | 0 reactos/tools/cabman/mszip.cxx | 0 reactos/tools/cabman/mszip.h | 0 reactos/tools/cabman/raw.cxx | 0 reactos/tools/cabman/raw.h | 0 reactos/tools/rgenstat/llmosrt.c | 0 reactos/tools/rgenstat/rgenstat.c | 0 reactos/tools/rgenstat/web/c.gif | Bin reactos/tools/rgenstat/web/f.gif | Bin reactos/tools/rgenstat/web/i.gif | Bin reactos/tools/rgenstat/web/rapistatus.css | 0 reactos/tools/rgenstat/web/rapistatus.js | 0 reactos/tools/rgenstat/web/rapistatus.xsl | 0 reactos/tools/rgenstat/web/sc.gif | Bin reactos/tools/rgenstat/web/tb.gif | Bin reactos/tools/rgenstat/web/tm.gif | Bin reactos/tools/rgenstat/web/tp.gif | Bin reactos/tools/rgenstat/web/u.gif | Bin 126 files changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 reactos/apistatus.lst mode change 100755 => 100644 reactos/base/setup/welcome/res/title.bmp mode change 100755 => 100644 reactos/base/setup/welcome/resource.h mode change 100755 => 100644 reactos/base/setup/welcome/welcome.c mode change 100755 => 100644 reactos/base/setup/welcome/welcome.rc mode change 100755 => 100644 reactos/base/system/format/format.c mode change 100755 => 100644 reactos/boot/armllb/hw/keyboard.c mode change 100755 => 100644 reactos/boot/armllb/hw/matrix.c mode change 100755 => 100644 reactos/boot/armllb/hw/omap3-beagle/hwinfo.c mode change 100755 => 100644 reactos/boot/armllb/hw/omap3-beagle/hwinit.c mode change 100755 => 100644 reactos/boot/armllb/hw/omap3-beagle/hwuart.c mode change 100755 => 100644 reactos/boot/armllb/hw/omap3-zoom2/hwinfo.c mode change 100755 => 100644 reactos/boot/armllb/hw/omap3-zoom2/hwinit.c mode change 100755 => 100644 reactos/boot/armllb/hw/omap3-zoom2/hwlcd.c mode change 100755 => 100644 reactos/boot/armllb/hw/omap3-zoom2/hwsynkp.c mode change 100755 => 100644 reactos/boot/armllb/hw/omap3-zoom2/hwtwl40x.c mode change 100755 => 100644 reactos/boot/armllb/hw/omap3-zoom2/hwuart.c mode change 100755 => 100644 reactos/boot/armllb/hw/serial.c mode change 100755 => 100644 reactos/boot/armllb/hw/time.c mode change 100755 => 100644 reactos/boot/armllb/hw/versatile/hwclcd.c mode change 100755 => 100644 reactos/boot/armllb/hw/versatile/hwinfo.c mode change 100755 => 100644 reactos/boot/armllb/hw/versatile/hwinit.c mode change 100755 => 100644 reactos/boot/armllb/hw/versatile/hwkmi.c mode change 100755 => 100644 reactos/boot/armllb/hw/versatile/hwuart.c mode change 100755 => 100644 reactos/boot/armllb/inc/envir.h mode change 100755 => 100644 reactos/boot/armllb/inc/fw.h mode change 100755 => 100644 reactos/boot/armllb/inc/hw.h mode change 100755 => 100644 reactos/boot/armllb/inc/keyboard.h mode change 100755 => 100644 reactos/boot/armllb/inc/omap3.h mode change 100755 => 100644 reactos/boot/armllb/inc/precomp.h mode change 100755 => 100644 reactos/boot/armllb/inc/serial.h mode change 100755 => 100644 reactos/boot/armllb/inc/versa.h mode change 100755 => 100644 reactos/boot/armllb/inc/video.h mode change 100755 => 100644 reactos/boot/armllb/main.c mode change 100755 => 100644 reactos/boot/armllb/os/loader.c mode change 100755 => 100644 reactos/boot/bootdata/autorun.inf mode change 100755 => 100644 reactos/boot/bootdata/icon.ico mode change 100755 => 100644 reactos/dll/win32/aclui/aclui_Fr.rc mode change 100755 => 100644 reactos/dll/win32/dhcpcsvc/dhcpcsvc.rc mode change 100755 => 100644 reactos/dll/win32/kernel32/include/kernel32.h mode change 100755 => 100644 reactos/dll/win32/kernel32/k32.h mode change 100755 => 100644 reactos/dll/win32/msafd/msafd.h mode change 100755 => 100644 reactos/dll/win32/shell32/res/bitmaps/shell_about_logo_24bpp.bmp mode change 100755 => 100644 reactos/drivers/bluetooth/fbtusb/fbtdev.c mode change 100755 => 100644 reactos/drivers/bluetooth/fbtusb/fbtpnp.c mode change 100755 => 100644 reactos/drivers/bluetooth/fbtusb/fbtpwr.c mode change 100755 => 100644 reactos/drivers/bluetooth/fbtusb/fbtrwr.c mode change 100755 => 100644 reactos/drivers/bluetooth/fbtusb/fbtusb.c mode change 100755 => 100644 reactos/drivers/bluetooth/fbtusb/fbtwmi.c mode change 100755 => 100644 reactos/drivers/bluetooth/fbtusb/include/fbtHciCmdStructs.h mode change 100755 => 100644 reactos/drivers/bluetooth/fbtusb/include/fbtHciCmds.h mode change 100755 => 100644 reactos/drivers/bluetooth/fbtusb/include/fbtHciDefs.h mode change 100755 => 100644 reactos/drivers/bluetooth/fbtusb/include/fbtHciErrors.h mode change 100755 => 100644 reactos/drivers/bluetooth/fbtusb/include/fbtHciEventStructs.h mode change 100755 => 100644 reactos/drivers/bluetooth/fbtusb/include/fbtHciEvents.h mode change 100755 => 100644 reactos/drivers/bluetooth/fbtusb/include/fbtHciLocal.h mode change 100755 => 100644 reactos/drivers/bluetooth/fbtusb/include/fbtHciOpCodes.h mode change 100755 => 100644 reactos/drivers/bluetooth/fbtusb/include/fbtHciParms.h mode change 100755 => 100644 reactos/drivers/bluetooth/fbtusb/include/fbtHciRoundTrip.h mode change 100755 => 100644 reactos/drivers/bluetooth/fbtusb/include/fbtHciSizes.h mode change 100755 => 100644 reactos/drivers/bluetooth/fbtusb/include/fbtSeXcpt.h mode change 100755 => 100644 reactos/drivers/bluetooth/fbtusb/include/fbtdev.h mode change 100755 => 100644 reactos/drivers/bluetooth/fbtusb/include/fbthci.h mode change 100755 => 100644 reactos/drivers/bluetooth/fbtusb/include/fbthw.h mode change 100755 => 100644 reactos/drivers/bluetooth/fbtusb/include/fbtlog.h mode change 100755 => 100644 reactos/drivers/bluetooth/fbtusb/include/fbtpnp.h mode change 100755 => 100644 reactos/drivers/bluetooth/fbtusb/include/fbtpwr.h mode change 100755 => 100644 reactos/drivers/bluetooth/fbtusb/include/fbtreg.h mode change 100755 => 100644 reactos/drivers/bluetooth/fbtusb/include/fbtrwr.h mode change 100755 => 100644 reactos/drivers/bluetooth/fbtusb/include/fbtusb.h mode change 100755 => 100644 reactos/drivers/bluetooth/fbtusb/include/fbtusr.h mode change 100755 => 100644 reactos/drivers/bluetooth/fbtusb/include/fbtutil.h mode change 100755 => 100644 reactos/drivers/bluetooth/fbtusb/include/fbtwmi.h mode change 100755 => 100644 reactos/drivers/bluetooth/fbtusb/include/fbtxcpt.h mode change 100755 => 100644 reactos/drivers/filesystems/ntfs/close.c mode change 100755 => 100644 reactos/drivers/filesystems/ntfs/notes.txt mode change 100755 => 100644 reactos/drivers/filesystems/ntfs/rw.c mode change 100755 => 100644 reactos/drivers/multimedia/README mode change 100755 => 100644 reactos/drivers/multimedia/directory.rbuild mode change 100755 => 100644 reactos/drivers/network/tcpip/include/linux.h mode change 100755 => 100644 reactos/drivers/network/tcpip/include/tcpcore.h mode change 100755 => 100644 reactos/drivers/network/tcpip/include/tcpdef.h mode change 100755 => 100644 reactos/drivers/video/displays/framebuf_new/debug.c mode change 100755 => 100644 reactos/drivers/video/displays/framebuf_new/debug.h mode change 100755 => 100644 reactos/drivers/video/displays/framebuf_new/driver.h mode change 100755 => 100644 reactos/drivers/video/displays/framebuf_new/palette.c mode change 100755 => 100644 reactos/drivers/video/displays/framebuf_new/pointer.c mode change 100755 => 100644 reactos/drivers/video/displays/framebuf_new/screen.c mode change 100755 => 100644 reactos/drivers/video/displays/vga_new/debug.c mode change 100755 => 100644 reactos/drivers/video/displays/vga_new/debug.h mode change 100755 => 100644 reactos/drivers/video/displays/vga_new/driver.h mode change 100755 => 100644 reactos/drivers/video/displays/vga_new/palette.c mode change 100755 => 100644 reactos/drivers/video/displays/vga_new/screen.c mode change 100755 => 100644 reactos/include/reactos/libs/fslib/vfatlib.h mode change 100755 => 100644 reactos/lib/3rdparty/adns/install-sh mode change 100755 => 100644 reactos/lib/fslib/vfatlib/check/vfat.h mode change 100755 => 100644 reactos/lib/fslib/vfatlib/vfatlib.c mode change 100755 => 100644 reactos/lib/fslib/vfatlib/vfatlib.h mode change 100755 => 100644 reactos/lib/inflib/inflib.mak mode change 100755 => 100644 reactos/lib/sdk/crt/wine/undname.c mode change 100755 => 100644 reactos/ntoskrnl/io/iomgr/rawfs.c mode change 100755 => 100644 reactos/tools/cabman/cabinet.cxx mode change 100755 => 100644 reactos/tools/cabman/cabinet.h mode change 100755 => 100644 reactos/tools/cabman/cabman.h mode change 100755 => 100644 reactos/tools/cabman/dff.txt mode change 100755 => 100644 reactos/tools/cabman/dfp.cxx mode change 100755 => 100644 reactos/tools/cabman/dfp.h mode change 100755 => 100644 reactos/tools/cabman/main.cxx mode change 100755 => 100644 reactos/tools/cabman/makefile.win32 mode change 100755 => 100644 reactos/tools/cabman/mszip.cxx mode change 100755 => 100644 reactos/tools/cabman/mszip.h mode change 100755 => 100644 reactos/tools/cabman/raw.cxx mode change 100755 => 100644 reactos/tools/cabman/raw.h mode change 100755 => 100644 reactos/tools/rgenstat/llmosrt.c mode change 100755 => 100644 reactos/tools/rgenstat/rgenstat.c mode change 100755 => 100644 reactos/tools/rgenstat/web/c.gif mode change 100755 => 100644 reactos/tools/rgenstat/web/f.gif mode change 100755 => 100644 reactos/tools/rgenstat/web/i.gif mode change 100755 => 100644 reactos/tools/rgenstat/web/rapistatus.css mode change 100755 => 100644 reactos/tools/rgenstat/web/rapistatus.js mode change 100755 => 100644 reactos/tools/rgenstat/web/rapistatus.xsl mode change 100755 => 100644 reactos/tools/rgenstat/web/sc.gif mode change 100755 => 100644 reactos/tools/rgenstat/web/tb.gif mode change 100755 => 100644 reactos/tools/rgenstat/web/tm.gif mode change 100755 => 100644 reactos/tools/rgenstat/web/tp.gif mode change 100755 => 100644 reactos/tools/rgenstat/web/u.gif diff --git a/reactos/apistatus.lst b/reactos/apistatus.lst old mode 100755 new mode 100644 diff --git a/reactos/base/setup/welcome/res/title.bmp b/reactos/base/setup/welcome/res/title.bmp old mode 100755 new mode 100644 diff --git a/reactos/base/setup/welcome/resource.h b/reactos/base/setup/welcome/resource.h old mode 100755 new mode 100644 diff --git a/reactos/base/setup/welcome/welcome.c b/reactos/base/setup/welcome/welcome.c old mode 100755 new mode 100644 diff --git a/reactos/base/setup/welcome/welcome.rc b/reactos/base/setup/welcome/welcome.rc old mode 100755 new mode 100644 diff --git a/reactos/base/system/format/format.c b/reactos/base/system/format/format.c old mode 100755 new mode 100644 diff --git a/reactos/boot/armllb/hw/keyboard.c b/reactos/boot/armllb/hw/keyboard.c old mode 100755 new mode 100644 diff --git a/reactos/boot/armllb/hw/matrix.c b/reactos/boot/armllb/hw/matrix.c old mode 100755 new mode 100644 diff --git a/reactos/boot/armllb/hw/omap3-beagle/hwinfo.c b/reactos/boot/armllb/hw/omap3-beagle/hwinfo.c old mode 100755 new mode 100644 diff --git a/reactos/boot/armllb/hw/omap3-beagle/hwinit.c b/reactos/boot/armllb/hw/omap3-beagle/hwinit.c old mode 100755 new mode 100644 diff --git a/reactos/boot/armllb/hw/omap3-beagle/hwuart.c b/reactos/boot/armllb/hw/omap3-beagle/hwuart.c old mode 100755 new mode 100644 diff --git a/reactos/boot/armllb/hw/omap3-zoom2/hwinfo.c b/reactos/boot/armllb/hw/omap3-zoom2/hwinfo.c old mode 100755 new mode 100644 diff --git a/reactos/boot/armllb/hw/omap3-zoom2/hwinit.c b/reactos/boot/armllb/hw/omap3-zoom2/hwinit.c old mode 100755 new mode 100644 diff --git a/reactos/boot/armllb/hw/omap3-zoom2/hwlcd.c b/reactos/boot/armllb/hw/omap3-zoom2/hwlcd.c old mode 100755 new mode 100644 diff --git a/reactos/boot/armllb/hw/omap3-zoom2/hwsynkp.c b/reactos/boot/armllb/hw/omap3-zoom2/hwsynkp.c old mode 100755 new mode 100644 diff --git a/reactos/boot/armllb/hw/omap3-zoom2/hwtwl40x.c b/reactos/boot/armllb/hw/omap3-zoom2/hwtwl40x.c old mode 100755 new mode 100644 diff --git a/reactos/boot/armllb/hw/omap3-zoom2/hwuart.c b/reactos/boot/armllb/hw/omap3-zoom2/hwuart.c old mode 100755 new mode 100644 diff --git a/reactos/boot/armllb/hw/serial.c b/reactos/boot/armllb/hw/serial.c old mode 100755 new mode 100644 diff --git a/reactos/boot/armllb/hw/time.c b/reactos/boot/armllb/hw/time.c old mode 100755 new mode 100644 diff --git a/reactos/boot/armllb/hw/versatile/hwclcd.c b/reactos/boot/armllb/hw/versatile/hwclcd.c old mode 100755 new mode 100644 diff --git a/reactos/boot/armllb/hw/versatile/hwinfo.c b/reactos/boot/armllb/hw/versatile/hwinfo.c old mode 100755 new mode 100644 diff --git a/reactos/boot/armllb/hw/versatile/hwinit.c b/reactos/boot/armllb/hw/versatile/hwinit.c old mode 100755 new mode 100644 diff --git a/reactos/boot/armllb/hw/versatile/hwkmi.c b/reactos/boot/armllb/hw/versatile/hwkmi.c old mode 100755 new mode 100644 diff --git a/reactos/boot/armllb/hw/versatile/hwuart.c b/reactos/boot/armllb/hw/versatile/hwuart.c old mode 100755 new mode 100644 diff --git a/reactos/boot/armllb/inc/envir.h b/reactos/boot/armllb/inc/envir.h old mode 100755 new mode 100644 diff --git a/reactos/boot/armllb/inc/fw.h b/reactos/boot/armllb/inc/fw.h old mode 100755 new mode 100644 diff --git a/reactos/boot/armllb/inc/hw.h b/reactos/boot/armllb/inc/hw.h old mode 100755 new mode 100644 diff --git a/reactos/boot/armllb/inc/keyboard.h b/reactos/boot/armllb/inc/keyboard.h old mode 100755 new mode 100644 diff --git a/reactos/boot/armllb/inc/omap3.h b/reactos/boot/armllb/inc/omap3.h old mode 100755 new mode 100644 diff --git a/reactos/boot/armllb/inc/precomp.h b/reactos/boot/armllb/inc/precomp.h old mode 100755 new mode 100644 diff --git a/reactos/boot/armllb/inc/serial.h b/reactos/boot/armllb/inc/serial.h old mode 100755 new mode 100644 diff --git a/reactos/boot/armllb/inc/versa.h b/reactos/boot/armllb/inc/versa.h old mode 100755 new mode 100644 diff --git a/reactos/boot/armllb/inc/video.h b/reactos/boot/armllb/inc/video.h old mode 100755 new mode 100644 diff --git a/reactos/boot/armllb/main.c b/reactos/boot/armllb/main.c old mode 100755 new mode 100644 diff --git a/reactos/boot/armllb/os/loader.c b/reactos/boot/armllb/os/loader.c old mode 100755 new mode 100644 diff --git a/reactos/boot/bootdata/autorun.inf b/reactos/boot/bootdata/autorun.inf old mode 100755 new mode 100644 diff --git a/reactos/boot/bootdata/icon.ico b/reactos/boot/bootdata/icon.ico old mode 100755 new mode 100644 diff --git a/reactos/dll/win32/aclui/aclui_Fr.rc b/reactos/dll/win32/aclui/aclui_Fr.rc old mode 100755 new mode 100644 diff --git a/reactos/dll/win32/dhcpcsvc/dhcpcsvc.rc b/reactos/dll/win32/dhcpcsvc/dhcpcsvc.rc old mode 100755 new mode 100644 diff --git a/reactos/dll/win32/kernel32/include/kernel32.h b/reactos/dll/win32/kernel32/include/kernel32.h old mode 100755 new mode 100644 diff --git a/reactos/dll/win32/kernel32/k32.h b/reactos/dll/win32/kernel32/k32.h old mode 100755 new mode 100644 diff --git a/reactos/dll/win32/msafd/msafd.h b/reactos/dll/win32/msafd/msafd.h old mode 100755 new mode 100644 diff --git a/reactos/dll/win32/shell32/res/bitmaps/shell_about_logo_24bpp.bmp b/reactos/dll/win32/shell32/res/bitmaps/shell_about_logo_24bpp.bmp old mode 100755 new mode 100644 diff --git a/reactos/drivers/bluetooth/fbtusb/fbtdev.c b/reactos/drivers/bluetooth/fbtusb/fbtdev.c old mode 100755 new mode 100644 diff --git a/reactos/drivers/bluetooth/fbtusb/fbtpnp.c b/reactos/drivers/bluetooth/fbtusb/fbtpnp.c old mode 100755 new mode 100644 diff --git a/reactos/drivers/bluetooth/fbtusb/fbtpwr.c b/reactos/drivers/bluetooth/fbtusb/fbtpwr.c old mode 100755 new mode 100644 diff --git a/reactos/drivers/bluetooth/fbtusb/fbtrwr.c b/reactos/drivers/bluetooth/fbtusb/fbtrwr.c old mode 100755 new mode 100644 diff --git a/reactos/drivers/bluetooth/fbtusb/fbtusb.c b/reactos/drivers/bluetooth/fbtusb/fbtusb.c old mode 100755 new mode 100644 diff --git a/reactos/drivers/bluetooth/fbtusb/fbtwmi.c b/reactos/drivers/bluetooth/fbtusb/fbtwmi.c old mode 100755 new mode 100644 diff --git a/reactos/drivers/bluetooth/fbtusb/include/fbtHciCmdStructs.h b/reactos/drivers/bluetooth/fbtusb/include/fbtHciCmdStructs.h old mode 100755 new mode 100644 diff --git a/reactos/drivers/bluetooth/fbtusb/include/fbtHciCmds.h b/reactos/drivers/bluetooth/fbtusb/include/fbtHciCmds.h old mode 100755 new mode 100644 diff --git a/reactos/drivers/bluetooth/fbtusb/include/fbtHciDefs.h b/reactos/drivers/bluetooth/fbtusb/include/fbtHciDefs.h old mode 100755 new mode 100644 diff --git a/reactos/drivers/bluetooth/fbtusb/include/fbtHciErrors.h b/reactos/drivers/bluetooth/fbtusb/include/fbtHciErrors.h old mode 100755 new mode 100644 diff --git a/reactos/drivers/bluetooth/fbtusb/include/fbtHciEventStructs.h b/reactos/drivers/bluetooth/fbtusb/include/fbtHciEventStructs.h old mode 100755 new mode 100644 diff --git a/reactos/drivers/bluetooth/fbtusb/include/fbtHciEvents.h b/reactos/drivers/bluetooth/fbtusb/include/fbtHciEvents.h old mode 100755 new mode 100644 diff --git a/reactos/drivers/bluetooth/fbtusb/include/fbtHciLocal.h b/reactos/drivers/bluetooth/fbtusb/include/fbtHciLocal.h old mode 100755 new mode 100644 diff --git a/reactos/drivers/bluetooth/fbtusb/include/fbtHciOpCodes.h b/reactos/drivers/bluetooth/fbtusb/include/fbtHciOpCodes.h old mode 100755 new mode 100644 diff --git a/reactos/drivers/bluetooth/fbtusb/include/fbtHciParms.h b/reactos/drivers/bluetooth/fbtusb/include/fbtHciParms.h old mode 100755 new mode 100644 diff --git a/reactos/drivers/bluetooth/fbtusb/include/fbtHciRoundTrip.h b/reactos/drivers/bluetooth/fbtusb/include/fbtHciRoundTrip.h old mode 100755 new mode 100644 diff --git a/reactos/drivers/bluetooth/fbtusb/include/fbtHciSizes.h b/reactos/drivers/bluetooth/fbtusb/include/fbtHciSizes.h old mode 100755 new mode 100644 diff --git a/reactos/drivers/bluetooth/fbtusb/include/fbtSeXcpt.h b/reactos/drivers/bluetooth/fbtusb/include/fbtSeXcpt.h old mode 100755 new mode 100644 diff --git a/reactos/drivers/bluetooth/fbtusb/include/fbtdev.h b/reactos/drivers/bluetooth/fbtusb/include/fbtdev.h old mode 100755 new mode 100644 diff --git a/reactos/drivers/bluetooth/fbtusb/include/fbthci.h b/reactos/drivers/bluetooth/fbtusb/include/fbthci.h old mode 100755 new mode 100644 diff --git a/reactos/drivers/bluetooth/fbtusb/include/fbthw.h b/reactos/drivers/bluetooth/fbtusb/include/fbthw.h old mode 100755 new mode 100644 diff --git a/reactos/drivers/bluetooth/fbtusb/include/fbtlog.h b/reactos/drivers/bluetooth/fbtusb/include/fbtlog.h old mode 100755 new mode 100644 diff --git a/reactos/drivers/bluetooth/fbtusb/include/fbtpnp.h b/reactos/drivers/bluetooth/fbtusb/include/fbtpnp.h old mode 100755 new mode 100644 diff --git a/reactos/drivers/bluetooth/fbtusb/include/fbtpwr.h b/reactos/drivers/bluetooth/fbtusb/include/fbtpwr.h old mode 100755 new mode 100644 diff --git a/reactos/drivers/bluetooth/fbtusb/include/fbtreg.h b/reactos/drivers/bluetooth/fbtusb/include/fbtreg.h old mode 100755 new mode 100644 diff --git a/reactos/drivers/bluetooth/fbtusb/include/fbtrwr.h b/reactos/drivers/bluetooth/fbtusb/include/fbtrwr.h old mode 100755 new mode 100644 diff --git a/reactos/drivers/bluetooth/fbtusb/include/fbtusb.h b/reactos/drivers/bluetooth/fbtusb/include/fbtusb.h old mode 100755 new mode 100644 diff --git a/reactos/drivers/bluetooth/fbtusb/include/fbtusr.h b/reactos/drivers/bluetooth/fbtusb/include/fbtusr.h old mode 100755 new mode 100644 diff --git a/reactos/drivers/bluetooth/fbtusb/include/fbtutil.h b/reactos/drivers/bluetooth/fbtusb/include/fbtutil.h old mode 100755 new mode 100644 diff --git a/reactos/drivers/bluetooth/fbtusb/include/fbtwmi.h b/reactos/drivers/bluetooth/fbtusb/include/fbtwmi.h old mode 100755 new mode 100644 diff --git a/reactos/drivers/bluetooth/fbtusb/include/fbtxcpt.h b/reactos/drivers/bluetooth/fbtusb/include/fbtxcpt.h old mode 100755 new mode 100644 diff --git a/reactos/drivers/filesystems/ntfs/close.c b/reactos/drivers/filesystems/ntfs/close.c old mode 100755 new mode 100644 diff --git a/reactos/drivers/filesystems/ntfs/notes.txt b/reactos/drivers/filesystems/ntfs/notes.txt old mode 100755 new mode 100644 diff --git a/reactos/drivers/filesystems/ntfs/rw.c b/reactos/drivers/filesystems/ntfs/rw.c old mode 100755 new mode 100644 diff --git a/reactos/drivers/multimedia/README b/reactos/drivers/multimedia/README old mode 100755 new mode 100644 diff --git a/reactos/drivers/multimedia/directory.rbuild b/reactos/drivers/multimedia/directory.rbuild old mode 100755 new mode 100644 diff --git a/reactos/drivers/network/tcpip/include/linux.h b/reactos/drivers/network/tcpip/include/linux.h old mode 100755 new mode 100644 diff --git a/reactos/drivers/network/tcpip/include/tcpcore.h b/reactos/drivers/network/tcpip/include/tcpcore.h old mode 100755 new mode 100644 diff --git a/reactos/drivers/network/tcpip/include/tcpdef.h b/reactos/drivers/network/tcpip/include/tcpdef.h old mode 100755 new mode 100644 diff --git a/reactos/drivers/video/displays/framebuf_new/debug.c b/reactos/drivers/video/displays/framebuf_new/debug.c old mode 100755 new mode 100644 diff --git a/reactos/drivers/video/displays/framebuf_new/debug.h b/reactos/drivers/video/displays/framebuf_new/debug.h old mode 100755 new mode 100644 diff --git a/reactos/drivers/video/displays/framebuf_new/driver.h b/reactos/drivers/video/displays/framebuf_new/driver.h old mode 100755 new mode 100644 diff --git a/reactos/drivers/video/displays/framebuf_new/palette.c b/reactos/drivers/video/displays/framebuf_new/palette.c old mode 100755 new mode 100644 diff --git a/reactos/drivers/video/displays/framebuf_new/pointer.c b/reactos/drivers/video/displays/framebuf_new/pointer.c old mode 100755 new mode 100644 diff --git a/reactos/drivers/video/displays/framebuf_new/screen.c b/reactos/drivers/video/displays/framebuf_new/screen.c old mode 100755 new mode 100644 diff --git a/reactos/drivers/video/displays/vga_new/debug.c b/reactos/drivers/video/displays/vga_new/debug.c old mode 100755 new mode 100644 diff --git a/reactos/drivers/video/displays/vga_new/debug.h b/reactos/drivers/video/displays/vga_new/debug.h old mode 100755 new mode 100644 diff --git a/reactos/drivers/video/displays/vga_new/driver.h b/reactos/drivers/video/displays/vga_new/driver.h old mode 100755 new mode 100644 diff --git a/reactos/drivers/video/displays/vga_new/palette.c b/reactos/drivers/video/displays/vga_new/palette.c old mode 100755 new mode 100644 diff --git a/reactos/drivers/video/displays/vga_new/screen.c b/reactos/drivers/video/displays/vga_new/screen.c old mode 100755 new mode 100644 diff --git a/reactos/include/reactos/libs/fslib/vfatlib.h b/reactos/include/reactos/libs/fslib/vfatlib.h old mode 100755 new mode 100644 diff --git a/reactos/lib/3rdparty/adns/install-sh b/reactos/lib/3rdparty/adns/install-sh old mode 100755 new mode 100644 diff --git a/reactos/lib/fslib/vfatlib/check/vfat.h b/reactos/lib/fslib/vfatlib/check/vfat.h old mode 100755 new mode 100644 diff --git a/reactos/lib/fslib/vfatlib/vfatlib.c b/reactos/lib/fslib/vfatlib/vfatlib.c old mode 100755 new mode 100644 diff --git a/reactos/lib/fslib/vfatlib/vfatlib.h b/reactos/lib/fslib/vfatlib/vfatlib.h old mode 100755 new mode 100644 diff --git a/reactos/lib/inflib/inflib.mak b/reactos/lib/inflib/inflib.mak old mode 100755 new mode 100644 diff --git a/reactos/lib/sdk/crt/wine/undname.c b/reactos/lib/sdk/crt/wine/undname.c old mode 100755 new mode 100644 diff --git a/reactos/ntoskrnl/io/iomgr/rawfs.c b/reactos/ntoskrnl/io/iomgr/rawfs.c old mode 100755 new mode 100644 diff --git a/reactos/tools/cabman/cabinet.cxx b/reactos/tools/cabman/cabinet.cxx old mode 100755 new mode 100644 diff --git a/reactos/tools/cabman/cabinet.h b/reactos/tools/cabman/cabinet.h old mode 100755 new mode 100644 diff --git a/reactos/tools/cabman/cabman.h b/reactos/tools/cabman/cabman.h old mode 100755 new mode 100644 diff --git a/reactos/tools/cabman/dff.txt b/reactos/tools/cabman/dff.txt old mode 100755 new mode 100644 diff --git a/reactos/tools/cabman/dfp.cxx b/reactos/tools/cabman/dfp.cxx old mode 100755 new mode 100644 diff --git a/reactos/tools/cabman/dfp.h b/reactos/tools/cabman/dfp.h old mode 100755 new mode 100644 diff --git a/reactos/tools/cabman/main.cxx b/reactos/tools/cabman/main.cxx old mode 100755 new mode 100644 diff --git a/reactos/tools/cabman/makefile.win32 b/reactos/tools/cabman/makefile.win32 old mode 100755 new mode 100644 diff --git a/reactos/tools/cabman/mszip.cxx b/reactos/tools/cabman/mszip.cxx old mode 100755 new mode 100644 diff --git a/reactos/tools/cabman/mszip.h b/reactos/tools/cabman/mszip.h old mode 100755 new mode 100644 diff --git a/reactos/tools/cabman/raw.cxx b/reactos/tools/cabman/raw.cxx old mode 100755 new mode 100644 diff --git a/reactos/tools/cabman/raw.h b/reactos/tools/cabman/raw.h old mode 100755 new mode 100644 diff --git a/reactos/tools/rgenstat/llmosrt.c b/reactos/tools/rgenstat/llmosrt.c old mode 100755 new mode 100644 diff --git a/reactos/tools/rgenstat/rgenstat.c b/reactos/tools/rgenstat/rgenstat.c old mode 100755 new mode 100644 diff --git a/reactos/tools/rgenstat/web/c.gif b/reactos/tools/rgenstat/web/c.gif old mode 100755 new mode 100644 diff --git a/reactos/tools/rgenstat/web/f.gif b/reactos/tools/rgenstat/web/f.gif old mode 100755 new mode 100644 diff --git a/reactos/tools/rgenstat/web/i.gif b/reactos/tools/rgenstat/web/i.gif old mode 100755 new mode 100644 diff --git a/reactos/tools/rgenstat/web/rapistatus.css b/reactos/tools/rgenstat/web/rapistatus.css old mode 100755 new mode 100644 diff --git a/reactos/tools/rgenstat/web/rapistatus.js b/reactos/tools/rgenstat/web/rapistatus.js old mode 100755 new mode 100644 diff --git a/reactos/tools/rgenstat/web/rapistatus.xsl b/reactos/tools/rgenstat/web/rapistatus.xsl old mode 100755 new mode 100644 diff --git a/reactos/tools/rgenstat/web/sc.gif b/reactos/tools/rgenstat/web/sc.gif old mode 100755 new mode 100644 diff --git a/reactos/tools/rgenstat/web/tb.gif b/reactos/tools/rgenstat/web/tb.gif old mode 100755 new mode 100644 diff --git a/reactos/tools/rgenstat/web/tm.gif b/reactos/tools/rgenstat/web/tm.gif old mode 100755 new mode 100644 diff --git a/reactos/tools/rgenstat/web/tp.gif b/reactos/tools/rgenstat/web/tp.gif old mode 100755 new mode 100644 diff --git a/reactos/tools/rgenstat/web/u.gif b/reactos/tools/rgenstat/web/u.gif old mode 100755 new mode 100644 From 9c44037679eaa10c8e419bd1c48fae410b4d0985 Mon Sep 17 00:00:00 2001 From: Olaf Siejka Date: Sun, 17 Apr 2011 10:20:22 +0000 Subject: [PATCH 162/317] [VIDEOPRT] - Check for the correct, just created, registry key. Fix a wrong comparison. Patch by Thomas Faber. See issue #6123 for more details. svn path=/trunk/; revision=51375 --- reactos/drivers/video/videoprt/videoprt.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/drivers/video/videoprt/videoprt.c b/reactos/drivers/video/videoprt/videoprt.c index 063d2cb3c89..2fe1870ad53 100644 --- a/reactos/drivers/video/videoprt/videoprt.c +++ b/reactos/drivers/video/videoprt/videoprt.c @@ -111,7 +111,7 @@ IntCreateRegistryPath( AfterControlSet.Length -= sizeof(ControlSet) - sizeof(UNICODE_NULL); while (AfterControlSet.Length > 0 && *AfterControlSet.Buffer >= L'0' && - *AfterControlSet.Buffer >= L'9') + *AfterControlSet.Buffer <= L'9') { AfterControlSet.Buffer++; AfterControlSet.Length -= sizeof(WCHAR); @@ -145,7 +145,7 @@ IntCreateRegistryPath( RtlAppendUnicodeToString(DeviceRegistryPath, Insert2); /* Check if registry key exists */ - Valid = NT_SUCCESS(RtlCheckRegistryKey(RTL_REGISTRY_ABSOLUTE, DriverRegistryPath->Buffer)); + Valid = NT_SUCCESS(RtlCheckRegistryKey(RTL_REGISTRY_ABSOLUTE, DeviceRegistryPath->Buffer)); if (!Valid) ExFreePoolWithTag(DeviceRegistryPath->Buffer, TAG_VIDEO_PORT); From c280a2b6ae6701f3911b905ff2ad3680e7c1a723 Mon Sep 17 00:00:00 2001 From: Giannis Adamopoulos Date: Sun, 17 Apr 2011 10:35:09 +0000 Subject: [PATCH 163/317] [user32_apitest] - Some more tests for GetKeyState svn path=/trunk/; revision=51376 --- rostests/apitests/user32/GetKeyState.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/rostests/apitests/user32/GetKeyState.c b/rostests/apitests/user32/GetKeyState.c index 8bc2b9959d8..759457675d5 100644 --- a/rostests/apitests/user32/GetKeyState.c +++ b/rostests/apitests/user32/GetKeyState.c @@ -21,12 +21,14 @@ LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam) if(pressed) { ok(altPressed,"\n"); - ok((GetKeyState(VK_MENU) & 0x8000), "Alt should not be pressed\n"); + ok((GetKeyState(VK_MENU) & 0x8000), "Alt should not be pressed\n");\ + ok((GetKeyState(VK_LMENU) & 0x8000), "Left alt should not be pressed\n");\ } else { ok(!altPressed,"\n"); ok(!(GetKeyState(VK_MENU) & 0x8000), "Alt should be pressed\n"); + ok(!(GetKeyState(VK_LMENU) & 0x8000), "Left alt should be pressed\n"); } return CallNextHookEx(hKbdHook, code, wParam, lParam); @@ -41,12 +43,16 @@ LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) ok(pLLHook->flags & LLKHF_ALTDOWN,"Didn't get LLKHF_ALTDOWN flag\n"); ok((GetAsyncKeyState (VK_MENU) & 0x8000), "Alt should not be pressed in global kbd status\n"); ok(!(GetKeyState(VK_MENU) & 0x8000), "Alt should not be pressed in queue state\n"); + ok(!(GetAsyncKeyState (VK_LMENU) & 0x8000), "Left alt should not be pressed in global kbd status\n"); + ok(!(GetKeyState(VK_LMENU) & 0x8000), "Left alt should not be pressed in queue state\n"); } else if(wParam == WM_SYSKEYUP) { ok(!(pLLHook->flags & LLKHF_ALTDOWN),"got LLKHF_ALTDOWN flag\n"); ok(!(GetAsyncKeyState (VK_MENU) & 0x8000), "Alt should not be pressed in global kbd status\n"); ok((GetKeyState(VK_MENU) & 0x8000), "Alt should be pressed in queue state\n"); + ok(!(GetAsyncKeyState (VK_LMENU) & 0x8000), "Left alt should not be pressed in global kbd status\n"); + ok((GetKeyState(VK_LMENU) & 0x8000), "Left alt should be pressed in queue state\n"); } return CallNextHookEx(hKbdLLHook, nCode, wParam, lParam); @@ -54,6 +60,10 @@ LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) static LRESULT CALLBACK WndProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam ) { + if(msg == WM_SYSKEYDOWN) + { + ok(wParam == VK_MENU, "Got wrong wParam in WM_SYSKEYDOWN (%d instead of %d)\n", wParam, VK_MENU ); + } return DefWindowProcA( hWnd, msg, wParam, lParam ); } @@ -104,11 +114,11 @@ void Test_GetKeyState() ok(hKbdHook!=NULL," \n"); ok(hKbdLLHook!=NULL," \n"); - keybd_event(VK_MENU, 0, 0,0); + keybd_event(VK_LMENU, 0, 0,0); while (PeekMessage( &msg, 0, 0, 0, PM_REMOVE )) DispatchMessageA( &msg ); - keybd_event(VK_MENU, 0, KEYEVENTF_KEYUP,0); + keybd_event(VK_LMENU, 0, KEYEVENTF_KEYUP,0); //fixme this hangs the test //while (PeekMessage( &msg, 0, 0, 0, PM_REMOVE|PM_NOYIELD )) DispatchMessageA( &msg ); From cde9d99bc3b184372b0e82b6c4f496aaa070fb58 Mon Sep 17 00:00:00 2001 From: Giannis Adamopoulos Date: Sun, 17 Apr 2011 10:38:06 +0000 Subject: [PATCH 164/317] [win32k] - Do not distinguish left and right keys in WH_KEYBOARD and key messages. Based on wine Fixes several tests svn path=/trunk/; revision=51377 --- .../subsystems/win32/win32k/ntuser/msgqueue.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/reactos/subsystems/win32/win32k/ntuser/msgqueue.c b/reactos/subsystems/win32/win32k/ntuser/msgqueue.c index f5f678d3120..136effff6e5 100644 --- a/reactos/subsystems/win32/win32k/ntuser/msgqueue.c +++ b/reactos/subsystems/win32/win32k/ntuser/msgqueue.c @@ -1307,6 +1307,23 @@ BOOL co_IntProcessKeyboardMessage(MSG* Msg, BOOL* RemoveMessages) { EVENTMSG Event; + if (Msg->message == WM_KEYDOWN || Msg->message == WM_SYSKEYDOWN || + Msg->message == WM_KEYUP || Msg->message == WM_SYSKEYUP) + { + switch (Msg->wParam) + { + case VK_LSHIFT: case VK_RSHIFT: + Msg->wParam = VK_SHIFT; + break; + case VK_LCONTROL: case VK_RCONTROL: + Msg->wParam = VK_CONTROL; + break; + case VK_LMENU: case VK_RMENU: + Msg->wParam = VK_MENU; + break; + } + } + Event.message = Msg->message; Event.hwnd = Msg->hwnd; Event.time = Msg->time; From 4321ac7baa43ebddde43b0114ed109fcc995a3b5 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sun, 17 Apr 2011 11:58:26 +0000 Subject: [PATCH 165/317] [EVENTVWR] - Change string resource id prefix from IDC to IDS. - Add missing string resources. svn path=/trunk/; revision=51378 --- .../applications/mscutils/eventvwr/eventvwr.c | 18 ++++++++-------- .../mscutils/eventvwr/lang/bg-BG.rc | 11 ++++++++-- .../mscutils/eventvwr/lang/de-DE.rc | 16 +++++++------- .../mscutils/eventvwr/lang/el-GR.rc | 16 +++++++------- .../mscutils/eventvwr/lang/en-US.rc | 18 ++++++++-------- .../mscutils/eventvwr/lang/es-ES.rc | 16 +++++++------- .../mscutils/eventvwr/lang/fr-FR.rc | 16 +++++++------- .../mscutils/eventvwr/lang/it-IT.rc | 16 +++++++------- .../mscutils/eventvwr/lang/ja-JP.rc | 16 +++++++------- .../mscutils/eventvwr/lang/ko-KR.rc | 16 +++++++------- .../mscutils/eventvwr/lang/no-NO.rc | 16 +++++++------- .../mscutils/eventvwr/lang/pl-PL.rc | 16 +++++++------- .../mscutils/eventvwr/lang/ro-RO.rc | 16 +++++++------- .../mscutils/eventvwr/lang/ru-RU.rc | 16 +++++++------- .../mscutils/eventvwr/lang/sk-SK.rc | 16 +++++++------- .../mscutils/eventvwr/lang/uk-UA.rc | 16 +++++++------- .../applications/mscutils/eventvwr/resource.h | 21 +++++++++++-------- 17 files changed, 143 insertions(+), 133 deletions(-) diff --git a/reactos/base/applications/mscutils/eventvwr/eventvwr.c b/reactos/base/applications/mscutils/eventvwr/eventvwr.c index 6a116ac3d00..658e4c280c4 100644 --- a/reactos/base/applications/mscutils/eventvwr/eventvwr.c +++ b/reactos/base/applications/mscutils/eventvwr/eventvwr.c @@ -385,7 +385,7 @@ GetEventMessage(IN LPCWSTR KeyName, if (!bDone) { - LoadStringW(hInst, IDC_EVENTSTRINGIDNOTFOUND, szStringIDNotFound, MAX_LOADSTRING); + LoadStringW(hInst, IDS_EVENTSTRINGIDNOTFOUND, szStringIDNotFound, MAX_LOADSTRING); swprintf(EventText, szStringIDNotFound, (DWORD)(pevlr->EventID & 0xFFFF), SourceName); } @@ -395,7 +395,7 @@ GetEventMessage(IN LPCWSTR KeyName, return bDone; } - LoadStringW(hInst, IDC_EVENTSTRINGIDNOTFOUND, szStringIDNotFound, MAX_LOADSTRING); + LoadStringW(hInst, IDS_EVENTSTRINGIDNOTFOUND, szStringIDNotFound, MAX_LOADSTRING); swprintf(EventText, szStringIDNotFound, (DWORD)(pevlr->EventID & 0xFFFF), SourceName); return FALSE; @@ -409,25 +409,25 @@ GetEventType(IN WORD dwEventType, switch (dwEventType) { case EVENTLOG_ERROR_TYPE: - LoadStringW(hInst, IDC_EVENTLOG_ERROR_TYPE, eventTypeText, MAX_LOADSTRING); + LoadStringW(hInst, IDS_EVENTLOG_ERROR_TYPE, eventTypeText, MAX_LOADSTRING); break; case EVENTLOG_WARNING_TYPE: - LoadStringW(hInst, IDC_EVENTLOG_WARNING_TYPE, eventTypeText, MAX_LOADSTRING); + LoadStringW(hInst, IDS_EVENTLOG_WARNING_TYPE, eventTypeText, MAX_LOADSTRING); break; case EVENTLOG_INFORMATION_TYPE: - LoadStringW(hInst, IDC_EVENTLOG_INFORMATION_TYPE, eventTypeText, MAX_LOADSTRING); + LoadStringW(hInst, IDS_EVENTLOG_INFORMATION_TYPE, eventTypeText, MAX_LOADSTRING); break; case EVENTLOG_AUDIT_SUCCESS: - LoadStringW(hInst, IDC_EVENTLOG_AUDIT_SUCCESS, eventTypeText, MAX_LOADSTRING); + LoadStringW(hInst, IDS_EVENTLOG_AUDIT_SUCCESS, eventTypeText, MAX_LOADSTRING); break; case EVENTLOG_AUDIT_FAILURE: - LoadStringW(hInst, IDC_EVENTLOG_AUDIT_FAILURE, eventTypeText, MAX_LOADSTRING); + LoadStringW(hInst, IDS_EVENTLOG_AUDIT_FAILURE, eventTypeText, MAX_LOADSTRING); break; case EVENTLOG_SUCCESS: - LoadStringW(hInst, IDC_EVENTLOG_SUCCESS, eventTypeText, MAX_LOADSTRING); + LoadStringW(hInst, IDS_EVENTLOG_SUCCESS, eventTypeText, MAX_LOADSTRING); break; default: - LoadStringW(hInst, IDC_EVENTLOG_UNKNOWN_TYPE, eventTypeText, MAX_LOADSTRING); + LoadStringW(hInst, IDS_EVENTLOG_UNKNOWN_TYPE, eventTypeText, MAX_LOADSTRING); break; } } diff --git a/reactos/base/applications/mscutils/eventvwr/lang/bg-BG.rc b/reactos/base/applications/mscutils/eventvwr/lang/bg-BG.rc index 64fcd4c3293..c8e9e673a85 100644 --- a/reactos/base/applications/mscutils/eventvwr/lang/bg-BG.rc +++ b/reactos/base/applications/mscutils/eventvwr/lang/bg-BG.rc @@ -85,8 +85,15 @@ END STRINGTABLE BEGIN - IDS_APP_TITLE " " - IDC_EVENTSTRINGIDNOTFOUND " ( %lu ) ( %s ). DLL , ." + IDS_APP_TITLE " " + IDS_EVENTSTRINGIDNOTFOUND " ( %lu ) ( %s ). DLL , ." + IDS_EVENTLOG_ERROR_TYPE "Error" + IDS_EVENTLOG_WARNING_TYPE "Warning" + IDS_EVENTLOG_INFORMATION_TYPE "Information" + IDS_EVENTLOG_AUDIT_SUCCESS "Audit Success" + IDS_EVENTLOG_AUDIT_FAILURE "Audit Failure" + IDS_EVENTLOG_SUCCESS "Success" + IDS_EVENTLOG_UNKNOWN_TYPE "Unknown Event" END STRINGTABLE diff --git a/reactos/base/applications/mscutils/eventvwr/lang/de-DE.rc b/reactos/base/applications/mscutils/eventvwr/lang/de-DE.rc index f94062b474f..58dada9aa8b 100644 --- a/reactos/base/applications/mscutils/eventvwr/lang/de-DE.rc +++ b/reactos/base/applications/mscutils/eventvwr/lang/de-DE.rc @@ -93,14 +93,14 @@ END STRINGTABLE BEGIN IDS_APP_TITLE "Ereignisanzeige" - IDC_EVENTSTRINGIDNOTFOUND "Die Bezeichnung fr die Ereignis-ID ( %lu ) in der Quelle ( %s ) kann nicht gefunden werden. Es knnte sein, dass der Lokale Computer die notwendigen Registry Eintrge oder Nachrichten DLLs, um Nachrichten von Remoten Computern anzuzeigen, nicht besitzt." - IDC_EVENTLOG_ERROR_TYPE "Fehler" - IDC_EVENTLOG_WARNING_TYPE "Warnung" - IDC_EVENTLOG_INFORMATION_TYPE "Informationen" - IDC_EVENTLOG_AUDIT_SUCCESS "Audit Erfolgreich" - IDC_EVENTLOG_AUDIT_FAILURE "Audit Fehlgeschlagen" - IDC_EVENTLOG_SUCCESS "Erfolgreich" - IDC_EVENTLOG_UNKNOWN_TYPE "Unbekanntes Ereignis" + IDS_EVENTSTRINGIDNOTFOUND "Die Bezeichnung fr die Ereignis-ID ( %lu ) in der Quelle ( %s ) kann nicht gefunden werden. Es knnte sein, dass der Lokale Computer die notwendigen Registry Eintrge oder Nachrichten DLLs, um Nachrichten von Remoten Computern anzuzeigen, nicht besitzt." + IDS_EVENTLOG_ERROR_TYPE "Fehler" + IDS_EVENTLOG_WARNING_TYPE "Warnung" + IDS_EVENTLOG_INFORMATION_TYPE "Informationen" + IDS_EVENTLOG_AUDIT_SUCCESS "Audit Erfolgreich" + IDS_EVENTLOG_AUDIT_FAILURE "Audit Fehlgeschlagen" + IDS_EVENTLOG_SUCCESS "Erfolgreich" + IDS_EVENTLOG_UNKNOWN_TYPE "Unbekanntes Ereignis" END STRINGTABLE diff --git a/reactos/base/applications/mscutils/eventvwr/lang/el-GR.rc b/reactos/base/applications/mscutils/eventvwr/lang/el-GR.rc index 8a2df37476b..abbd7922319 100644 --- a/reactos/base/applications/mscutils/eventvwr/lang/el-GR.rc +++ b/reactos/base/applications/mscutils/eventvwr/lang/el-GR.rc @@ -93,14 +93,14 @@ END STRINGTABLE BEGIN IDS_APP_TITLE "Event Viewer" - IDC_EVENTSTRINGIDNOTFOUND "The description for Event ID ( %lu ) in Source ( %s ) cannot be found. The local computer may not have the necessary registry information or message DLL files to display messages from a remote computer." - IDC_EVENTLOG_ERROR_TYPE "" - IDC_EVENTLOG_WARNING_TYPE "" - IDC_EVENTLOG_INFORMATION_TYPE "" - IDC_EVENTLOG_AUDIT_SUCCESS "Audit Success" - IDC_EVENTLOG_AUDIT_FAILURE "Audit Failure" - IDC_EVENTLOG_SUCCESS "" - IDC_EVENTLOG_UNKNOWN_TYPE " " + IDS_EVENTSTRINGIDNOTFOUND "The description for Event ID ( %lu ) in Source ( %s ) cannot be found. The local computer may not have the necessary registry information or message DLL files to display messages from a remote computer." + IDS_EVENTLOG_ERROR_TYPE "" + IDS_EVENTLOG_WARNING_TYPE "" + IDS_EVENTLOG_INFORMATION_TYPE "" + IDS_EVENTLOG_AUDIT_SUCCESS "Audit Success" + IDS_EVENTLOG_AUDIT_FAILURE "Audit Failure" + IDS_EVENTLOG_SUCCESS "" + IDS_EVENTLOG_UNKNOWN_TYPE " " END STRINGTABLE diff --git a/reactos/base/applications/mscutils/eventvwr/lang/en-US.rc b/reactos/base/applications/mscutils/eventvwr/lang/en-US.rc index 68ae4ba4743..fc19d72139f 100644 --- a/reactos/base/applications/mscutils/eventvwr/lang/en-US.rc +++ b/reactos/base/applications/mscutils/eventvwr/lang/en-US.rc @@ -92,15 +92,15 @@ END STRINGTABLE BEGIN - IDS_APP_TITLE "Event Viewer" - IDC_EVENTSTRINGIDNOTFOUND "The description for Event ID ( %lu ) in Source ( %s ) cannot be found. The local computer may not have the necessary registry information or message DLL files to display messages from a remote computer." - IDC_EVENTLOG_ERROR_TYPE "Error" - IDC_EVENTLOG_WARNING_TYPE "Warning" - IDC_EVENTLOG_INFORMATION_TYPE "Information" - IDC_EVENTLOG_AUDIT_SUCCESS "Audit Success" - IDC_EVENTLOG_AUDIT_FAILURE "Audit Failure" - IDC_EVENTLOG_SUCCESS "Success" - IDC_EVENTLOG_UNKNOWN_TYPE "Unknown Event" + IDS_APP_TITLE "Event Viewer" + IDS_EVENTSTRINGIDNOTFOUND "The description for Event ID ( %lu ) in Source ( %s ) cannot be found. The local computer may not have the necessary registry information or message DLL files to display messages from a remote computer." + IDS_EVENTLOG_ERROR_TYPE "Error" + IDS_EVENTLOG_WARNING_TYPE "Warning" + IDS_EVENTLOG_INFORMATION_TYPE "Information" + IDS_EVENTLOG_AUDIT_SUCCESS "Audit Success" + IDS_EVENTLOG_AUDIT_FAILURE "Audit Failure" + IDS_EVENTLOG_SUCCESS "Success" + IDS_EVENTLOG_UNKNOWN_TYPE "Unknown Event" END STRINGTABLE diff --git a/reactos/base/applications/mscutils/eventvwr/lang/es-ES.rc b/reactos/base/applications/mscutils/eventvwr/lang/es-ES.rc index a6339abd744..2de3ec360b8 100644 --- a/reactos/base/applications/mscutils/eventvwr/lang/es-ES.rc +++ b/reactos/base/applications/mscutils/eventvwr/lang/es-ES.rc @@ -93,14 +93,14 @@ END STRINGTABLE BEGIN IDS_APP_TITLE "Visor de sucesos" - IDC_EVENTSTRINGIDNOTFOUND "La descripcin para el evento con ID ( %lu ) y origen ( %s ) no pudo ser recuperada.El equipo local puede no tener la informacin necesaria en el registro o las DLLs requeridas para mostrar los mensajes de un equipo remoto." - IDC_EVENTLOG_ERROR_TYPE "Error" - IDC_EVENTLOG_WARNING_TYPE "Advertencia" - IDC_EVENTLOG_INFORMATION_TYPE "Informacin" - IDC_EVENTLOG_AUDIT_SUCCESS "Auditoria Satisfactoria" - IDC_EVENTLOG_AUDIT_FAILURE "Auditoria Fallida" - IDC_EVENTLOG_SUCCESS "Acierto" - IDC_EVENTLOG_UNKNOWN_TYPE "Evento Desconocido" + IDS_EVENTSTRINGIDNOTFOUND "La descripcin para el evento con ID ( %lu ) y origen ( %s ) no pudo ser recuperada.El equipo local puede no tener la informacin necesaria en el registro o las DLLs requeridas para mostrar los mensajes de un equipo remoto." + IDS_EVENTLOG_ERROR_TYPE "Error" + IDS_EVENTLOG_WARNING_TYPE "Advertencia" + IDS_EVENTLOG_INFORMATION_TYPE "Informacin" + IDS_EVENTLOG_AUDIT_SUCCESS "Auditoria Satisfactoria" + IDS_EVENTLOG_AUDIT_FAILURE "Auditoria Fallida" + IDS_EVENTLOG_SUCCESS "Acierto" + IDS_EVENTLOG_UNKNOWN_TYPE "Evento Desconocido" END STRINGTABLE diff --git a/reactos/base/applications/mscutils/eventvwr/lang/fr-FR.rc b/reactos/base/applications/mscutils/eventvwr/lang/fr-FR.rc index 76612a0d58d..54ad9cae749 100644 --- a/reactos/base/applications/mscutils/eventvwr/lang/fr-FR.rc +++ b/reactos/base/applications/mscutils/eventvwr/lang/fr-FR.rc @@ -93,14 +93,14 @@ END STRINGTABLE BEGIN IDS_APP_TITLE "Visionneuse d'vnements" - IDC_EVENTSTRINGIDNOTFOUND "La description pour l'vnement d'ID ( %lu ) dans la source ( %s ) ne peut tre trouve. L'ordinateur local pourrait ne pas avoir les informations registres ncssaires ou les fichiers DLL de message pour afficher les messages depuis un ordinateur distant." - IDC_EVENTLOG_ERROR_TYPE "Erreur" - IDC_EVENTLOG_WARNING_TYPE "Avertissement" - IDC_EVENTLOG_INFORMATION_TYPE "Informations" - IDC_EVENTLOG_AUDIT_SUCCESS "Succs de l'audit" - IDC_EVENTLOG_AUDIT_FAILURE "chec de l'audit" - IDC_EVENTLOG_SUCCESS "Succs" - IDC_EVENTLOG_UNKNOWN_TYPE "vnement Inconnu" + IDS_EVENTSTRINGIDNOTFOUND "La description pour l'vnement d'ID ( %lu ) dans la source ( %s ) ne peut tre trouve. L'ordinateur local pourrait ne pas avoir les informations registres ncssaires ou les fichiers DLL de message pour afficher les messages depuis un ordinateur distant." + IDS_EVENTLOG_ERROR_TYPE "Erreur" + IDS_EVENTLOG_WARNING_TYPE "Avertissement" + IDS_EVENTLOG_INFORMATION_TYPE "Informations" + IDS_EVENTLOG_AUDIT_SUCCESS "Succs de l'audit" + IDS_EVENTLOG_AUDIT_FAILURE "chec de l'audit" + IDS_EVENTLOG_SUCCESS "Succs" + IDS_EVENTLOG_UNKNOWN_TYPE "vnement Inconnu" END STRINGTABLE diff --git a/reactos/base/applications/mscutils/eventvwr/lang/it-IT.rc b/reactos/base/applications/mscutils/eventvwr/lang/it-IT.rc index 708fb416a28..6bfa290275c 100644 --- a/reactos/base/applications/mscutils/eventvwr/lang/it-IT.rc +++ b/reactos/base/applications/mscutils/eventvwr/lang/it-IT.rc @@ -93,14 +93,14 @@ END STRINGTABLE BEGIN IDS_APP_TITLE "Visualizzatore eventi" - IDC_EVENTSTRINGIDNOTFOUND "La descrizione per l'ID evento ( %lu ) proveniente da ( %s ) non pu essere trovata. Il computer locale potrebbe non avere le informazioni sul registry necessarie o i file DLL con i messaggi necessari per la visualizzazione da un computer remoto." - IDC_EVENTLOG_ERROR_TYPE "Errore" - IDC_EVENTLOG_WARNING_TYPE "Avviso" - IDC_EVENTLOG_INFORMATION_TYPE "Informazione" - IDC_EVENTLOG_AUDIT_SUCCESS "Audit riuscita" - IDC_EVENTLOG_AUDIT_FAILURE "Audit fallita" - IDC_EVENTLOG_SUCCESS "Successo" - IDC_EVENTLOG_UNKNOWN_TYPE "Evento sconosciuto" + IDS_EVENTSTRINGIDNOTFOUND "La descrizione per l'ID evento ( %lu ) proveniente da ( %s ) non pu essere trovata. Il computer locale potrebbe non avere le informazioni sul registry necessarie o i file DLL con i messaggi necessari per la visualizzazione da un computer remoto." + IDS_EVENTLOG_ERROR_TYPE "Errore" + IDS_EVENTLOG_WARNING_TYPE "Avviso" + IDS_EVENTLOG_INFORMATION_TYPE "Informazione" + IDS_EVENTLOG_AUDIT_SUCCESS "Audit riuscita" + IDS_EVENTLOG_AUDIT_FAILURE "Audit fallita" + IDS_EVENTLOG_SUCCESS "Successo" + IDS_EVENTLOG_UNKNOWN_TYPE "Evento sconosciuto" END STRINGTABLE diff --git a/reactos/base/applications/mscutils/eventvwr/lang/ja-JP.rc b/reactos/base/applications/mscutils/eventvwr/lang/ja-JP.rc index 8c250a3c686..ffd1e6a86e5 100644 --- a/reactos/base/applications/mscutils/eventvwr/lang/ja-JP.rc +++ b/reactos/base/applications/mscutils/eventvwr/lang/ja-JP.rc @@ -93,14 +93,14 @@ END STRINGTABLE BEGIN IDS_APP_TITLE "Cxg r[A" - IDC_EVENTSTRINGIDNOTFOUND "Cxg ID (%lu) (\\[X %s ) Ɋւ‚܂łB [g Rs[^烁bZ[W\\邽߂ɕKvȃWXg܂̓bZ[W DLL t@C[J Rs[^ɂȂ”\\܂B" - IDC_EVENTLOG_ERROR_TYPE "G[" - IDC_EVENTLOG_WARNING_TYPE "x" - IDC_EVENTLOG_INFORMATION_TYPE "" - IDC_EVENTLOG_AUDIT_SUCCESS "̊č" - IDC_EVENTLOG_AUDIT_FAILURE "s̊č" - IDC_EVENTLOG_SUCCESS "" - IDC_EVENTLOG_UNKNOWN_TYPE "sȃCxg" + IDS_EVENTSTRINGIDNOTFOUND "Cxg ID (%lu) (\\[X %s ) Ɋւ‚܂łB [g Rs[^烁bZ[W\\邽߂ɕKvȃWXg܂̓bZ[W DLL t@C[J Rs[^ɂȂ”\\܂B" + IDS_EVENTLOG_ERROR_TYPE "G[" + IDS_EVENTLOG_WARNING_TYPE "x" + IDS_EVENTLOG_INFORMATION_TYPE "" + IDS_EVENTLOG_AUDIT_SUCCESS "̊č" + IDS_EVENTLOG_AUDIT_FAILURE "s̊č" + IDS_EVENTLOG_SUCCESS "" + IDS_EVENTLOG_UNKNOWN_TYPE "sȃCxg" END STRINGTABLE diff --git a/reactos/base/applications/mscutils/eventvwr/lang/ko-KR.rc b/reactos/base/applications/mscutils/eventvwr/lang/ko-KR.rc index 682e625d421..ba1228a040d 100644 --- a/reactos/base/applications/mscutils/eventvwr/lang/ko-KR.rc +++ b/reactos/base/applications/mscutils/eventvwr/lang/ko-KR.rc @@ -89,14 +89,14 @@ END STRINGTABLE BEGIN IDS_APP_TITLE "̺Ʈ " - IDC_EVENTSTRINGIDNOTFOUND "( %s ) ̺ƮID ( %lu ) ã ϴ. ǻͰ ǻ ޼ ǥϴµ ʿ Ʈ DLL ʰ ֽϴ." - IDC_EVENTLOG_ERROR_TYPE "" - IDC_EVENTLOG_WARNING_TYPE "" - IDC_EVENTLOG_INFORMATION_TYPE "" - IDC_EVENTLOG_AUDIT_SUCCESS " " - IDC_EVENTLOG_AUDIT_FAILURE " " - IDC_EVENTLOG_SUCCESS "" - IDC_EVENTLOG_UNKNOWN_TYPE "˷ ̺Ʈ" + IDS_EVENTSTRINGIDNOTFOUND "( %s ) ̺ƮID ( %lu ) ã ϴ. ǻͰ ǻ ޼ ǥϴµ ʿ Ʈ DLL ʰ ֽϴ." + IDS_EVENTLOG_ERROR_TYPE "" + IDS_EVENTLOG_WARNING_TYPE "" + IDS_EVENTLOG_INFORMATION_TYPE "" + IDS_EVENTLOG_AUDIT_SUCCESS " " + IDS_EVENTLOG_AUDIT_FAILURE " " + IDS_EVENTLOG_SUCCESS "" + IDS_EVENTLOG_UNKNOWN_TYPE "˷ ̺Ʈ" END STRINGTABLE diff --git a/reactos/base/applications/mscutils/eventvwr/lang/no-NO.rc b/reactos/base/applications/mscutils/eventvwr/lang/no-NO.rc index acc715446e2..3c6561bb9e7 100644 --- a/reactos/base/applications/mscutils/eventvwr/lang/no-NO.rc +++ b/reactos/base/applications/mscutils/eventvwr/lang/no-NO.rc @@ -93,14 +93,14 @@ END STRINGTABLE BEGIN IDS_APP_TITLE "Hendelseliste" - IDC_EVENTSTRINGIDNOTFOUND "Beskrivelsen for Hendelse ID ( %lu ) i kilden ( %s ) kan ikke bli finnet. Lokale datamaskinen har ikke ndvendige register informasjon eller melding DLL filer for vise melding fra en fjern datamaskin." - IDC_EVENTLOG_ERROR_TYPE "Feil" - IDC_EVENTLOG_WARNING_TYPE "Advarseler" - IDC_EVENTLOG_INFORMATION_TYPE "Informasjon" - IDC_EVENTLOG_AUDIT_SUCCESS "Revisjon suksess" - IDC_EVENTLOG_AUDIT_FAILURE "Revisjon misslykkes" - IDC_EVENTLOG_SUCCESS "Suksess" - IDC_EVENTLOG_UNKNOWN_TYPE "Ukjent hendelse" + IDS_EVENTSTRINGIDNOTFOUND "Beskrivelsen for Hendelse ID ( %lu ) i kilden ( %s ) kan ikke bli finnet. Lokale datamaskinen har ikke ndvendige register informasjon eller melding DLL filer for vise melding fra en fjern datamaskin." + IDS_EVENTLOG_ERROR_TYPE "Feil" + IDS_EVENTLOG_WARNING_TYPE "Advarseler" + IDS_EVENTLOG_INFORMATION_TYPE "Informasjon" + IDS_EVENTLOG_AUDIT_SUCCESS "Revisjon suksess" + IDS_EVENTLOG_AUDIT_FAILURE "Revisjon misslykkes" + IDS_EVENTLOG_SUCCESS "Suksess" + IDS_EVENTLOG_UNKNOWN_TYPE "Ukjent hendelse" END STRINGTABLE diff --git a/reactos/base/applications/mscutils/eventvwr/lang/pl-PL.rc b/reactos/base/applications/mscutils/eventvwr/lang/pl-PL.rc index 9a14b680348..05c7c256f08 100644 --- a/reactos/base/applications/mscutils/eventvwr/lang/pl-PL.rc +++ b/reactos/base/applications/mscutils/eventvwr/lang/pl-PL.rc @@ -97,14 +97,14 @@ END STRINGTABLE BEGIN IDS_APP_TITLE "Podgld zdarze" - IDC_EVENTSTRINGIDNOTFOUND "Opis zdarzenia dla danego numeru ID: ( %lu ) nie zosta odnaleziony w rdle: ( %s ). Ten komputer moe nie miec wystarczajcych informacji w rejestrze albo bibliotek DLL, aby wywietli wiadomoci z komputera zdalnego." - IDC_EVENTLOG_ERROR_TYPE "Bd" - IDC_EVENTLOG_WARNING_TYPE "Ostrzeenie" - IDC_EVENTLOG_INFORMATION_TYPE "Informacja" - IDC_EVENTLOG_AUDIT_SUCCESS "Udany Audyt" - IDC_EVENTLOG_AUDIT_FAILURE "Nieudany Audyt" - IDC_EVENTLOG_SUCCESS "Sukces" - IDC_EVENTLOG_UNKNOWN_TYPE "Zdarzenie nieznane" + IDS_EVENTSTRINGIDNOTFOUND "Opis zdarzenia dla danego numeru ID: ( %lu ) nie zosta odnaleziony w rdle: ( %s ). Ten komputer moe nie miec wystarczajcych informacji w rejestrze albo bibliotek DLL, aby wywietli wiadomoci z komputera zdalnego." + IDS_EVENTLOG_ERROR_TYPE "Bd" + IDS_EVENTLOG_WARNING_TYPE "Ostrzeenie" + IDS_EVENTLOG_INFORMATION_TYPE "Informacja" + IDS_EVENTLOG_AUDIT_SUCCESS "Udany Audyt" + IDS_EVENTLOG_AUDIT_FAILURE "Nieudany Audyt" + IDS_EVENTLOG_SUCCESS "Sukces" + IDS_EVENTLOG_UNKNOWN_TYPE "Zdarzenie nieznane" END STRINGTABLE diff --git a/reactos/base/applications/mscutils/eventvwr/lang/ro-RO.rc b/reactos/base/applications/mscutils/eventvwr/lang/ro-RO.rc index 90779956fdf..7014f5b4937 100644 --- a/reactos/base/applications/mscutils/eventvwr/lang/ro-RO.rc +++ b/reactos/base/applications/mscutils/eventvwr/lang/ro-RO.rc @@ -93,14 +93,14 @@ END STRINGTABLE BEGIN IDS_APP_TITLE "Vizualizator evenimente" - IDC_EVENTSTRINGIDNOTFOUND "Descrierea pentru ID-ul de eveniment ( %lu ) n sursa ( %s ) nu poate fi gsit. Computerul local este posibil s nu aib informaiile sau fiierele DLL pentru a afia mesajele de pe un computer la distan." - IDC_EVENTLOG_ERROR_TYPE "Eroare" - IDC_EVENTLOG_WARNING_TYPE "Avertisment" - IDC_EVENTLOG_INFORMATION_TYPE "Informaie" - IDC_EVENTLOG_AUDIT_SUCCESS "Succes audit" - IDC_EVENTLOG_AUDIT_FAILURE "Eec audit" - IDC_EVENTLOG_SUCCESS "Succes" - IDC_EVENTLOG_UNKNOWN_TYPE "Eveniment necunoscut" + IDS_EVENTSTRINGIDNOTFOUND "Descrierea pentru ID-ul de eveniment ( %lu ) n sursa ( %s ) nu poate fi gsit. Computerul local este posibil s nu aib informaiile sau fiierele DLL pentru a afia mesajele de pe un computer la distan." + IDS_EVENTLOG_ERROR_TYPE "Eroare" + IDS_EVENTLOG_WARNING_TYPE "Avertisment" + IDS_EVENTLOG_INFORMATION_TYPE "Informaie" + IDS_EVENTLOG_AUDIT_SUCCESS "Succes audit" + IDS_EVENTLOG_AUDIT_FAILURE "Eec audit" + IDS_EVENTLOG_SUCCESS "Succes" + IDS_EVENTLOG_UNKNOWN_TYPE "Eveniment necunoscut" END STRINGTABLE diff --git a/reactos/base/applications/mscutils/eventvwr/lang/ru-RU.rc b/reactos/base/applications/mscutils/eventvwr/lang/ru-RU.rc index a215c1579f6..59dce435d37 100644 --- a/reactos/base/applications/mscutils/eventvwr/lang/ru-RU.rc +++ b/reactos/base/applications/mscutils/eventvwr/lang/ru-RU.rc @@ -93,14 +93,14 @@ END STRINGTABLE BEGIN IDS_APP_TITLE " " - IDC_EVENTSTRINGIDNOTFOUND " ( %lu ) ( %s ). , DLL ." - IDC_EVENTLOG_ERROR_TYPE "" - IDC_EVENTLOG_WARNING_TYPE "" - IDC_EVENTLOG_INFORMATION_TYPE "" - IDC_EVENTLOG_AUDIT_SUCCESS " " - IDC_EVENTLOG_AUDIT_FAILURE " " - IDC_EVENTLOG_SUCCESS "" - IDC_EVENTLOG_UNKNOWN_TYPE " " + IDS_EVENTSTRINGIDNOTFOUND " ( %lu ) ( %s ). , DLL ." + IDS_EVENTLOG_ERROR_TYPE "" + IDS_EVENTLOG_WARNING_TYPE "" + IDS_EVENTLOG_INFORMATION_TYPE "" + IDS_EVENTLOG_AUDIT_SUCCESS " " + IDS_EVENTLOG_AUDIT_FAILURE " " + IDS_EVENTLOG_SUCCESS "" + IDS_EVENTLOG_UNKNOWN_TYPE " " END STRINGTABLE diff --git a/reactos/base/applications/mscutils/eventvwr/lang/sk-SK.rc b/reactos/base/applications/mscutils/eventvwr/lang/sk-SK.rc index 71d5da8ed93..a0a6817edf3 100644 --- a/reactos/base/applications/mscutils/eventvwr/lang/sk-SK.rc +++ b/reactos/base/applications/mscutils/eventvwr/lang/sk-SK.rc @@ -90,14 +90,14 @@ END STRINGTABLE BEGIN IDS_APP_TITLE "Zobrazova udalost" - IDC_EVENTSTRINGIDNOTFOUND "Popis pre udalos ID ( %lu ) zo zdroja ( %s ) nebol njden. The local computer may not have the necessary registry information or message DLL files to display messages from a remote computer." - IDC_EVENTLOG_ERROR_TYPE "Chyba" - IDC_EVENTLOG_WARNING_TYPE "Upozornenie" - IDC_EVENTLOG_INFORMATION_TYPE "Informcia" - IDC_EVENTLOG_AUDIT_SUCCESS "Kontrola uspen" - IDC_EVENTLOG_AUDIT_FAILURE "Kontrola zlyhala" - IDC_EVENTLOG_SUCCESS "spech" //Success - IDC_EVENTLOG_UNKNOWN_TYPE "Neznma udalos" + IDS_EVENTSTRINGIDNOTFOUND "Popis pre udalos ID ( %lu ) zo zdroja ( %s ) nebol njden. The local computer may not have the necessary registry information or message DLL files to display messages from a remote computer." + IDS_EVENTLOG_ERROR_TYPE "Chyba" + IDS_EVENTLOG_WARNING_TYPE "Upozornenie" + IDS_EVENTLOG_INFORMATION_TYPE "Informcia" + IDS_EVENTLOG_AUDIT_SUCCESS "Kontrola uspen" + IDS_EVENTLOG_AUDIT_FAILURE "Kontrola zlyhala" + IDS_EVENTLOG_SUCCESS "spech" //Success + IDS_EVENTLOG_UNKNOWN_TYPE "Neznma udalos" END STRINGTABLE diff --git a/reactos/base/applications/mscutils/eventvwr/lang/uk-UA.rc b/reactos/base/applications/mscutils/eventvwr/lang/uk-UA.rc index a79a3fbfe9c..55f31d90528 100644 --- a/reactos/base/applications/mscutils/eventvwr/lang/uk-UA.rc +++ b/reactos/base/applications/mscutils/eventvwr/lang/uk-UA.rc @@ -93,14 +93,14 @@ END STRINGTABLE BEGIN IDS_APP_TITLE " " - IDC_EVENTSTRINGIDNOTFOUND " 䳿( %lu ) ( %s ) . ' DLL , '." - IDC_EVENTLOG_ERROR_TYPE "" - IDC_EVENTLOG_WARNING_TYPE "" - IDC_EVENTLOG_INFORMATION_TYPE "" - IDC_EVENTLOG_AUDIT_SUCCESS " " - IDC_EVENTLOG_AUDIT_FAILURE " " - IDC_EVENTLOG_SUCCESS "" - IDC_EVENTLOG_UNKNOWN_TYPE " " + IDS_EVENTSTRINGIDNOTFOUND " 䳿( %lu ) ( %s ) . ' DLL , '." + IDS_EVENTLOG_ERROR_TYPE "" + IDS_EVENTLOG_WARNING_TYPE "" + IDS_EVENTLOG_INFORMATION_TYPE "" + IDS_EVENTLOG_AUDIT_SUCCESS " " + IDS_EVENTLOG_AUDIT_FAILURE " " + IDS_EVENTLOG_SUCCESS "" + IDS_EVENTLOG_UNKNOWN_TYPE " " END STRINGTABLE diff --git a/reactos/base/applications/mscutils/eventvwr/resource.h b/reactos/base/applications/mscutils/eventvwr/resource.h index 40a9b97082d..b6869b22fc0 100644 --- a/reactos/base/applications/mscutils/eventvwr/resource.h +++ b/reactos/base/applications/mscutils/eventvwr/resource.h @@ -2,22 +2,13 @@ #define IDNEXT 3 #define IDD_EVENTVWR_DIALOG 102 #define IDD_PROGRESSBOX 150 -#define IDS_APP_TITLE 103 #define IDD_ABOUTBOX 103 #define IDM_ABOUT 104 #define IDM_EXIT 105 #define IDI_EVENTVWR 107 #define IDI_SMALL 108 #define IDC_EVENTVWR 109 -#define IDC_EVENTSTRINGIDNOTFOUND 209 #define IDC_PROCESSPROGRESS 250 -#define IDC_EVENTLOG_ERROR_TYPE 251 -#define IDC_EVENTLOG_WARNING_TYPE 252 -#define IDC_EVENTLOG_INFORMATION_TYPE 253 -#define IDC_EVENTLOG_AUDIT_SUCCESS 254 -#define IDC_EVENTLOG_AUDIT_FAILURE 255 -#define IDC_EVENTLOG_SUCCESS 256 -#define IDC_EVENTLOG_UNKNOWN_TYPE 257 #define IDR_MAINFRAME 128 #define IDI_WARNINGICON 129 #define IDI_INFORMATIONICON 130 @@ -51,6 +42,18 @@ #define IDC_STATIC -1 +/* String IDs */ +#define IDS_APP_TITLE 103 +#define IDS_EVENTSTRINGIDNOTFOUND 209 +#define IDS_EVENTLOG_ERROR_TYPE 251 +#define IDS_EVENTLOG_WARNING_TYPE 252 +#define IDS_EVENTLOG_INFORMATION_TYPE 253 +#define IDS_EVENTLOG_AUDIT_SUCCESS 254 +#define IDS_EVENTLOG_AUDIT_FAILURE 255 +#define IDS_EVENTLOG_SUCCESS 256 +#define IDS_EVENTLOG_UNKNOWN_TYPE 257 + + #define IDS_COLUMNTYPE 300 #define IDS_COLUMNDATE 301 #define IDS_COLUMNTIME 302 From 3026082bded444475544e39e2812aad6472e7fa6 Mon Sep 17 00:00:00 2001 From: Giannis Adamopoulos Date: Sun, 17 Apr 2011 12:33:29 +0000 Subject: [PATCH 166/317] [win32k] - Improve IS_KBD_MESSAGE macro. Should fix some more tests svn path=/trunk/; revision=51379 --- reactos/subsystems/win32/win32k/include/msgqueue.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/subsystems/win32/win32k/include/msgqueue.h b/reactos/subsystems/win32/win32k/include/msgqueue.h index 8b6eeddf998..fd11f162409 100644 --- a/reactos/subsystems/win32/win32k/include/msgqueue.h +++ b/reactos/subsystems/win32/win32k/include/msgqueue.h @@ -301,7 +301,7 @@ VOID APIENTRY MsqRemoveWindowMessagesFromQueue(PVOID pWindow); /* F*(&$ headers, (message >= WM_MOUSEFIRST && message <= WM_MOUSELAST)) #define IS_KBD_MESSAGE(message) \ - (message == WM_KEYDOWN || message == WM_KEYUP) + (message >= WM_KEYFIRST && message <= WM_KEYLAST) HANDLE FASTCALL IntMsqSetWakeMask(DWORD WakeMask); From 1b2a6e5f37dcafba12ff2a56079a41834fc9faa1 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sun, 17 Apr 2011 14:43:32 +0000 Subject: [PATCH 167/317] [ADVAPI32] Implement EnumServiceGroupW. svn path=/trunk/; revision=51380 --- reactos/dll/win32/advapi32/service/scm.c | 98 ++++++++++++++++++++---- 1 file changed, 82 insertions(+), 16 deletions(-) diff --git a/reactos/dll/win32/advapi32/service/scm.c b/reactos/dll/win32/advapi32/service/scm.c index ccd3e677986..69710625498 100644 --- a/reactos/dll/win32/advapi32/service/scm.c +++ b/reactos/dll/win32/advapi32/service/scm.c @@ -862,24 +862,90 @@ EnumDependentServicesW(SC_HANDLE hService, /********************************************************************** * EnumServiceGroupW * - * @unimplemented + * @implemented */ -BOOL -WINAPI -EnumServiceGroupW( - SC_HANDLE hSCManager, - DWORD dwServiceType, - DWORD dwServiceState, - LPENUM_SERVICE_STATUSW lpServices, - DWORD cbBufSize, - LPDWORD pcbBytesNeeded, - LPDWORD lpServicesReturned, - LPDWORD lpResumeHandle, - LPCWSTR lpGroup) +BOOL WINAPI +EnumServiceGroupW(SC_HANDLE hSCManager, + DWORD dwServiceType, + DWORD dwServiceState, + LPENUM_SERVICE_STATUSW lpServices, + DWORD cbBufSize, + LPDWORD pcbBytesNeeded, + LPDWORD lpServicesReturned, + LPDWORD lpResumeHandle, + LPCWSTR lpGroup) { - FIXME("EnumServiceGroupW is unimplemented\n"); - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return FALSE; + LPENUM_SERVICE_STATUSW lpStatusPtr; + DWORD dwError; + DWORD dwCount; + + TRACE("EnumServiceGroupW() called\n"); + + if (!hSCManager) + { + SetLastError(ERROR_INVALID_HANDLE); + return FALSE; + } + + RpcTryExcept + { + if (lpGroup == NULL) + { + dwError = REnumServicesStatusW((SC_RPC_HANDLE)hSCManager, + dwServiceType, + dwServiceState, + (LPBYTE)lpServices, + cbBufSize, + pcbBytesNeeded, + lpServicesReturned, + lpResumeHandle); + } + else + { + dwError = REnumServiceGroupW((SC_RPC_HANDLE)hSCManager, + dwServiceType, + dwServiceState, + (LPBYTE)lpServices, + cbBufSize, + pcbBytesNeeded, + lpServicesReturned, + lpResumeHandle, + lpGroup); + } + } + RpcExcept(EXCEPTION_EXECUTE_HANDLER) + { + dwError = ScmRpcStatusToWinError(RpcExceptionCode()); + } + RpcEndExcept; + + if (dwError == ERROR_SUCCESS || dwError == ERROR_MORE_DATA) + { + lpStatusPtr = (LPENUM_SERVICE_STATUSW)lpServices; + for (dwCount = 0; dwCount < *lpServicesReturned; dwCount++) + { + if (lpStatusPtr->lpServiceName) + lpStatusPtr->lpServiceName = + (LPWSTR)((ULONG_PTR)lpServices + (ULONG_PTR)lpStatusPtr->lpServiceName); + + if (lpStatusPtr->lpDisplayName) + lpStatusPtr->lpDisplayName = + (LPWSTR)((ULONG_PTR)lpServices + (ULONG_PTR)lpStatusPtr->lpDisplayName); + + lpStatusPtr++; + } + } + + if (dwError != ERROR_SUCCESS) + { + TRACE("REnumServiceGroupW() failed (Error %lu)\n", dwError); + SetLastError(dwError); + return FALSE; + } + + TRACE("EnumServiceGroupW() done\n"); + + return TRUE; } From e564c595f26cd864c3f8c5e314599b2698a2be01 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Sun, 17 Apr 2011 16:55:24 +0000 Subject: [PATCH 168/317] [CMAKE] * Addendum to the previous commit. svn path=/trunk/; revision=51382 --- rostests/apitests/user32/CMakeLists.txt | 2 ++ rostests/apitests/w32knapi/CMakeLists.txt | 2 ++ rostests/winetests/comctl32/CMakeLists.txt | 2 ++ rostests/winetests/itss/CMakeLists.txt | 2 ++ rostests/winetests/jscript/CMakeLists.txt | 2 ++ rostests/winetests/kernel32/CMakeLists.txt | 2 ++ rostests/winetests/mshtml/CMakeLists.txt | 2 ++ rostests/winetests/user32/CMakeLists.txt | 2 ++ 8 files changed, 16 insertions(+) diff --git a/rostests/apitests/user32/CMakeLists.txt b/rostests/apitests/user32/CMakeLists.txt index 4be297e2f49..f13bab460b0 100644 --- a/rostests/apitests/user32/CMakeLists.txt +++ b/rostests/apitests/user32/CMakeLists.txt @@ -1,6 +1,8 @@ add_definitions(-D_DLL -D__USE_CRTIMP) +set_rc_compiler() + list(APPEND SOURCE DeferWindowPos.c GetIconInfo.c diff --git a/rostests/apitests/w32knapi/CMakeLists.txt b/rostests/apitests/w32knapi/CMakeLists.txt index 21e1e5fd0c1..77dd4528800 100644 --- a/rostests/apitests/w32knapi/CMakeLists.txt +++ b/rostests/apitests/w32knapi/CMakeLists.txt @@ -1,6 +1,8 @@ add_definitions(-D_DLL -D__USE_CRTIMP) +set_rc_compiler() + list(APPEND SOURCE osver.c testlist.c diff --git a/rostests/winetests/comctl32/CMakeLists.txt b/rostests/winetests/comctl32/CMakeLists.txt index ff47bca7dc4..f5e93b17fc1 100644 --- a/rostests/winetests/comctl32/CMakeLists.txt +++ b/rostests/winetests/comctl32/CMakeLists.txt @@ -9,6 +9,8 @@ add_definitions(-D_WIN32_WINNT=0x600) remove_definitions(-D_WIN32_IE=0x600) add_definitions(-D_WIN32_IE=0x500) +set_rc_compiler() + list(APPEND SOURCE comboex.c datetime.c diff --git a/rostests/winetests/itss/CMakeLists.txt b/rostests/winetests/itss/CMakeLists.txt index 10a7130aaa5..dff3b5f070e 100644 --- a/rostests/winetests/itss/CMakeLists.txt +++ b/rostests/winetests/itss/CMakeLists.txt @@ -3,6 +3,8 @@ add_definitions( -D__ROS_LONG64__ -D_DLL -D__USE_CRTIMP) +set_rc_compiler() + add_executable(itss_winetest protocol.c testlist.c rsrc.rc) target_link_libraries(itss_winetest wine) set_module_type(itss_winetest win32cui) diff --git a/rostests/winetests/jscript/CMakeLists.txt b/rostests/winetests/jscript/CMakeLists.txt index 347519d5f7d..89215dc9d2d 100644 --- a/rostests/winetests/jscript/CMakeLists.txt +++ b/rostests/winetests/jscript/CMakeLists.txt @@ -3,6 +3,8 @@ add_definitions( -D__ROS_LONG64__ -D_DLL -D__USE_CRTIMP) +set_rc_compiler() + list(APPEND SOURCE activex.c jscript.c diff --git a/rostests/winetests/kernel32/CMakeLists.txt b/rostests/winetests/kernel32/CMakeLists.txt index 9094a050c45..00f3fbb46ee 100644 --- a/rostests/winetests/kernel32/CMakeLists.txt +++ b/rostests/winetests/kernel32/CMakeLists.txt @@ -3,6 +3,8 @@ add_definitions( -D__ROS_LONG64__ -D_DLL -D__USE_CRTIMP) +set_rc_compiler() + list(APPEND SOURCE actctx.c alloc.c diff --git a/rostests/winetests/mshtml/CMakeLists.txt b/rostests/winetests/mshtml/CMakeLists.txt index bdf2c46d140..cf4bb120631 100644 --- a/rostests/winetests/mshtml/CMakeLists.txt +++ b/rostests/winetests/mshtml/CMakeLists.txt @@ -1,4 +1,6 @@ +set_rc_compiler() + add_definitions( -D__ROS_LONG64__ -D_DLL -D__USE_CRTIMP) diff --git a/rostests/winetests/user32/CMakeLists.txt b/rostests/winetests/user32/CMakeLists.txt index 6b36fe307b6..3a254e5d1ea 100644 --- a/rostests/winetests/user32/CMakeLists.txt +++ b/rostests/winetests/user32/CMakeLists.txt @@ -3,6 +3,8 @@ add_definitions( -D__ROS_LONG64__ -D_DLL -D__USE_CRTIMP) +set_rc_compiler() + list(APPEND SOURCE broadcast.c class.c From f53d1fd40776fe36bd1fc665728bc1649c91bac7 Mon Sep 17 00:00:00 2001 From: Giannis Adamopoulos Date: Mon, 18 Apr 2011 09:13:31 +0000 Subject: [PATCH 169/317] [win32k] - GetKeyboardState and SetKeyboardState should use the thread key state and not the global key state svn path=/trunk/; revision=51389 --- .../subsystems/win32/win32k/ntuser/keyboard.c | 49 --------------- .../subsystems/win32/win32k/ntuser/msgqueue.c | 62 +++++++++++++++++++ 2 files changed, 62 insertions(+), 49 deletions(-) diff --git a/reactos/subsystems/win32/win32k/ntuser/keyboard.c b/reactos/subsystems/win32/win32k/ntuser/keyboard.c index c4ef0430555..0583b0c9841 100644 --- a/reactos/subsystems/win32/win32k/ntuser/keyboard.c +++ b/reactos/subsystems/win32/win32k/ntuser/keyboard.c @@ -486,55 +486,6 @@ IntTranslateKbdMessage(LPMSG lpMsg, return Result; } -DWORD -APIENTRY -NtUserGetKeyboardState( - LPBYTE lpKeyState) -{ - BOOL Result = TRUE; - DECLARE_RETURN(DWORD); - - DPRINT("Enter NtUserGetKeyboardState\n"); - UserEnterShared(); - - if (lpKeyState) - { - if(!NT_SUCCESS(MmCopyToCaller(lpKeyState, gQueueKeyStateTable, 256))) - Result = FALSE; - } - - RETURN(Result); - -CLEANUP: - DPRINT("Leave NtUserGetKeyboardState, ret=%i\n",_ret_); - UserLeave(); - END_CLEANUP; -} - -BOOL -APIENTRY -NtUserSetKeyboardState(LPBYTE lpKeyState) -{ - BOOL Result = TRUE; - DECLARE_RETURN(DWORD); - - DPRINT("Enter NtUserSetKeyboardState\n"); - UserEnterExclusive(); - - if (lpKeyState) - { - if(! NT_SUCCESS(MmCopyFromCaller(gQueueKeyStateTable, lpKeyState, 256))) - Result = FALSE; - } - - RETURN(Result); - -CLEANUP: - DPRINT("Leave NtUserSetKeyboardState, ret=%i\n",_ret_); - UserLeave(); - END_CLEANUP; -} - static UINT VkToScan( UINT Code, BOOL ExtCode, PKBDTABLES pkKT ) { int i; diff --git a/reactos/subsystems/win32/win32k/ntuser/msgqueue.c b/reactos/subsystems/win32/win32k/ntuser/msgqueue.c index 136effff6e5..90b11a9f017 100644 --- a/reactos/subsystems/win32/win32k/ntuser/msgqueue.c +++ b/reactos/subsystems/win32/win32k/ntuser/msgqueue.c @@ -1896,4 +1896,66 @@ NtUserGetKeyState(INT key) return Ret; } + +DWORD +APIENTRY +NtUserGetKeyboardState(LPBYTE lpKeyState) +{ + DWORD ret = TRUE; + PTHREADINFO pti; + PUSER_MESSAGE_QUEUE MessageQueue; + + UserEnterShared(); + + pti = PsGetCurrentThreadWin32Thread(); + MessageQueue = pti->MessageQueue; + + _SEH2_TRY + { + ProbeForWrite(lpKeyState,sizeof(MessageQueue->KeyState) ,1); + RtlCopyMemory(lpKeyState,MessageQueue->KeyState,sizeof(MessageQueue->KeyState)); + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + SetLastNtError(_SEH2_GetExceptionCode()); + ret = FALSE; + } + _SEH2_END; + + UserLeave(); + + return ret; +} + +BOOL +APIENTRY +NtUserSetKeyboardState(LPBYTE lpKeyState) +{ + DWORD ret = TRUE; + PTHREADINFO pti; + PUSER_MESSAGE_QUEUE MessageQueue; + + UserEnterExclusive(); + + pti = PsGetCurrentThreadWin32Thread(); + MessageQueue = pti->MessageQueue; + + _SEH2_TRY + { + ProbeForRead(lpKeyState,sizeof(MessageQueue->KeyState) ,1); + RtlCopyMemory(MessageQueue->KeyState,lpKeyState,sizeof(MessageQueue->KeyState)); + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + SetLastNtError(_SEH2_GetExceptionCode()); + ret = FALSE; + } + _SEH2_END; + + UserLeave(); + + return ret; +} + + /* EOF */ From 186ed6e13df12b5a39420f269c95dc4fc93230e0 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Mon, 18 Apr 2011 14:15:18 +0000 Subject: [PATCH 170/317] [WIN32K] Set ulShareCount of static palettes to 1, so they won't get dereferenced to 0 svn path=/trunk/; revision=51391 --- reactos/subsystems/win32/win32k/objects/palette.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/reactos/subsystems/win32/win32k/objects/palette.c b/reactos/subsystems/win32/win32k/objects/palette.c index cb1cdd22789..a283a85732c 100644 --- a/reactos/subsystems/win32/win32k/objects/palette.c +++ b/reactos/subsystems/win32/win32k/objects/palette.c @@ -92,33 +92,33 @@ InitPaletteImpl() gpalRGB.RedMask = RGB(0xFF, 0x00, 0x00); gpalRGB.GreenMask = RGB(0x00, 0xFF, 0x00); gpalRGB.BlueMask = RGB(0x00, 0x00, 0xFF); - gpalRGB.BaseObject.ulShareCount = 0; + gpalRGB.BaseObject.ulShareCount = 1; gpalRGB.BaseObject.BaseFlags = 0 ; gpalBGR.flFlags = PAL_BGR; gpalBGR.RedMask = RGB(0x00, 0x00, 0xFF); gpalBGR.GreenMask = RGB(0x00, 0xFF, 0x00); gpalBGR.BlueMask = RGB(0xFF, 0x00, 0x00); - gpalBGR.BaseObject.ulShareCount = 0; + gpalBGR.BaseObject.ulShareCount = 1; gpalBGR.BaseObject.BaseFlags = 0 ; gpalRGB555.flFlags = PAL_RGB16_555 | PAL_BITFIELDS; gpalRGB555.RedMask = 0x7C00; gpalRGB555.GreenMask = 0x3E0; gpalRGB555.BlueMask = 0x1F; - gpalRGB555.BaseObject.ulShareCount = 0; + gpalRGB555.BaseObject.ulShareCount = 1; gpalRGB555.BaseObject.BaseFlags = 0 ; gpalRGB565.flFlags = PAL_RGB16_565 | PAL_BITFIELDS; gpalRGB565.RedMask = 0xF800; gpalRGB565.GreenMask = 0x7E0; gpalRGB565.BlueMask = 0x1F; - gpalRGB565.BaseObject.ulShareCount = 0; + gpalRGB565.BaseObject.ulShareCount = 1; gpalRGB565.BaseObject.BaseFlags = 0 ; memset(&gpalMono, 0, sizeof(PALETTE)); gpalMono.flFlags = PAL_MONOCHROME; - gpalMono.BaseObject.ulShareCount = 0; + gpalMono.BaseObject.ulShareCount = 1; gpalMono.BaseObject.BaseFlags = 0 ; /* Initialize default surface palettes */ From 46662954bd37f3eca5eebb67ac831d589681a8a5 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Mon, 18 Apr 2011 19:09:05 +0000 Subject: [PATCH 171/317] [WIN32K] - Use shared locks for surfaces and palettes svn path=/trunk/; revision=51392 --- reactos/subsystems/win32/win32k/eng/bitblt.c | 8 ++--- .../subsystems/win32/win32k/eng/stretchblt.c | 4 +-- .../win32/win32k/ntuser/clipboard.c | 4 +-- .../win32/win32k/ntuser/cursoricon.c | 12 +++---- .../win32/win32k/ntuser/sysparams.c | 6 ++-- .../subsystems/win32/win32k/objects/bitmaps.c | 34 +++++++++---------- .../subsystems/win32/win32k/objects/dibobj.c | 24 ++++++------- reactos/subsystems/win32/win32k/objects/icm.c | 4 +-- 8 files changed, 48 insertions(+), 48 deletions(-) diff --git a/reactos/subsystems/win32/win32k/eng/bitblt.c b/reactos/subsystems/win32/win32k/eng/bitblt.c index 6b6ee51f9f1..2c620ca2207 100644 --- a/reactos/subsystems/win32/win32k/eng/bitblt.c +++ b/reactos/subsystems/win32/win32k/eng/bitblt.c @@ -66,7 +66,7 @@ BltMask(SURFOBJ* psoDest, pebo = CONTAINING_RECORD(pbo, EBRUSHOBJ, BrushObject); hbmPattern = EBRUSHOBJ_pvGetEngBrush(pebo); - psurfPattern = SURFACE_LockSurface(hbmPattern); + psurfPattern = SURFACE_ShareLockSurface(hbmPattern); if (psurfPattern != NULL) { psoPattern = &psurfPattern->SurfObj; @@ -168,7 +168,7 @@ BltMask(SURFOBJ* psoDest, } if (psurfPattern) - SURFACE_UnlockSurface(psurfPattern); + SURFACE_ShareUnlockSurface(psurfPattern); return TRUE; } @@ -230,7 +230,7 @@ CallDibBitBlt(SURFOBJ* OutputObj, { GdiBrush = CONTAINING_RECORD(pbo, EBRUSHOBJ, BrushObject); hbmPattern = EBRUSHOBJ_pvGetEngBrush(GdiBrush); - psurfPattern = SURFACE_LockSurface(hbmPattern); + psurfPattern = SURFACE_ShareLockSurface(hbmPattern); if (psurfPattern) { BltInfo.PatternSurface = &psurfPattern->SurfObj; @@ -250,7 +250,7 @@ CallDibBitBlt(SURFOBJ* OutputObj, /* Pattern brush */ if (psurfPattern) { - SURFACE_UnlockSurface(psurfPattern); + SURFACE_ShareUnlockSurface(psurfPattern); } return Result; diff --git a/reactos/subsystems/win32/win32k/eng/stretchblt.c b/reactos/subsystems/win32/win32k/eng/stretchblt.c index 1b4a7f99ea6..e18086d013a 100644 --- a/reactos/subsystems/win32/win32k/eng/stretchblt.c +++ b/reactos/subsystems/win32/win32k/eng/stretchblt.c @@ -55,7 +55,7 @@ CallDibStretchBlt(SURFOBJ* psoDest, { GdiBrush = CONTAINING_RECORD(pbo, EBRUSHOBJ, BrushObject); hbmPattern = EBRUSHOBJ_pvGetEngBrush(GdiBrush); - psurfPattern = SURFACE_LockSurface(hbmPattern); + psurfPattern = SURFACE_ShareLockSurface(hbmPattern); if (psurfPattern) { PatternSurface = &psurfPattern->SurfObj; @@ -78,7 +78,7 @@ CallDibStretchBlt(SURFOBJ* psoDest, /* Pattern brush */ if (psurfPattern) { - SURFACE_UnlockSurface(psurfPattern); + SURFACE_ShareUnlockSurface(psurfPattern); } return bResult; diff --git a/reactos/subsystems/win32/win32k/ntuser/clipboard.c b/reactos/subsystems/win32/win32k/ntuser/clipboard.c index 121d7af06ae..1c4e64670b3 100644 --- a/reactos/subsystems/win32/win32k/ntuser/clipboard.c +++ b/reactos/subsystems/win32/win32k/ntuser/clipboard.c @@ -984,11 +984,11 @@ NtUserSetClipboardData(UINT uFormat, HANDLE hMem, DWORD size) hdc = UserGetDCEx(NULL, NULL, DCX_USESTYLE); - psurf = SURFACE_LockSurface(hMem); + psurf = SURFACE_ShareLockSurface(hMem); BITMAP_GetObject(psurf, sizeof(BITMAP), (PVOID)&bm); if(psurf) { - SURFACE_UnlockSurface(psurf); + SURFACE_ShareUnlockSurface(psurf); } bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); diff --git a/reactos/subsystems/win32/win32k/ntuser/cursoricon.c b/reactos/subsystems/win32/win32k/ntuser/cursoricon.c index d0322c72b5c..131d912cfc0 100644 --- a/reactos/subsystems/win32/win32k/ntuser/cursoricon.c +++ b/reactos/subsystems/win32/win32k/ntuser/cursoricon.c @@ -508,11 +508,11 @@ NtUserGetIconInfo( { PSURFACE psurfBmp; - psurfBmp = SURFACE_LockSurface(CurIcon->IconInfo.hbmColor); + psurfBmp = SURFACE_ShareLockSurface(CurIcon->IconInfo.hbmColor); if (psurfBmp) { colorBpp = BitsPerFormat(psurfBmp->SurfObj.iBitmapFormat); - SURFACE_UnlockSurface(psurfBmp); + SURFACE_ShareUnlockSurface(psurfBmp); } } @@ -1197,7 +1197,7 @@ UserDrawIconEx( /* In order to correctly display 32 bit icons Windows first scans the image, because information about transparency is not stored in any image's headers */ - psurfOff = SURFACE_LockSurface(hbmColor); + psurfOff = SURFACE_ShareLockSurface(hbmColor); if (psurfOff) { fnSource_GetPixel = DibFunctionsForBitmapFormat[psurfOff->SurfObj.iBitmapFormat].DIB_GetPixel; @@ -1215,7 +1215,7 @@ UserDrawIconEx( break; } } - SURFACE_UnlockSurface(psurfOff); + SURFACE_ShareUnlockSurface(psurfOff); } } @@ -1272,7 +1272,7 @@ UserDrawIconEx( goto CleanupAlpha; } - psurf = SURFACE_LockSurface(hMemBmp); + psurf = SURFACE_ShareLockSurface(hMemBmp); if(!psurf) { DPRINT1("SURFACE_LockSurface failed!\n"); @@ -1294,7 +1294,7 @@ UserDrawIconEx( } } - SURFACE_UnlockSurface(psurf); + SURFACE_ShareUnlockSurface(psurf); hTmpBmp = NtGdiSelectBitmap(hMemDC, hMemBmp); diff --git a/reactos/subsystems/win32/win32k/ntuser/sysparams.c b/reactos/subsystems/win32/win32k/ntuser/sysparams.c index f4f6dfbb688..518eb9955d5 100644 --- a/reactos/subsystems/win32/win32k/ntuser/sysparams.c +++ b/reactos/subsystems/win32/win32k/ntuser/sysparams.c @@ -634,7 +634,7 @@ SpiSetWallpaper(PVOID pvParam, FLONG fl) } /* Try to get the size of the wallpaper */ - if(!(psurfBmp = SURFACE_LockSurface(hbmp))) + if(!(psurfBmp = SURFACE_ShareLockSurface(hbmp))) { GreDeleteObject(hbmp); return 0; @@ -644,7 +644,7 @@ SpiSetWallpaper(PVOID pvParam, FLONG fl) gpwinstaCurrent->cyWallpaper = psurfBmp->SurfObj.sizlBitmap.cy; gpwinstaCurrent->WallpaperMode = wmCenter; - SURFACE_UnlockSurface(psurfBmp); + SURFACE_ShareUnlockSurface(psurfBmp); /* Change the bitmap's ownership */ GDIOBJ_SetOwnership(hbmp, NULL); @@ -907,7 +907,7 @@ SpiGetSet(UINT uiAction, UINT uiParam, PVOID pvParam, FLONG fl) case SPI_SETWORKAREA: { - /*FIXME: we should set the work area of the monitor + /*FIXME: we should set the work area of the monitor that contains the specified rectangle*/ PMONITOR pmonitor = IntGetPrimaryMonitor(); RECT rcWorkArea; diff --git a/reactos/subsystems/win32/win32k/objects/bitmaps.c b/reactos/subsystems/win32/win32k/objects/bitmaps.c index 4d17fecf827..f99d1b4eab5 100644 --- a/reactos/subsystems/win32/win32k/objects/bitmaps.c +++ b/reactos/subsystems/win32/win32k/objects/bitmaps.c @@ -270,7 +270,7 @@ IntCreateCompatibleBitmap( 1, dibs.dsBm.bmBitsPixel, NULL); - psurfBmp = SURFACE_LockSurface(Bmp); + psurfBmp = SURFACE_ShareLockSurface(Bmp); ASSERT(psurfBmp); /* Assign palette */ psurfBmp->ppal = psurf->ppal; @@ -278,7 +278,7 @@ IntCreateCompatibleBitmap( /* Set flags */ psurfBmp->flags = API_BITMAP; psurfBmp->hdc = NULL; // Fixme - SURFACE_UnlockSurface(psurfBmp); + SURFACE_ShareUnlockSurface(psurfBmp); } else if (Count == sizeof(DIBSECTION)) { @@ -316,7 +316,7 @@ IntCreateCompatibleBitmap( return 0; } - PalGDI = PALETTE_LockPalette(psurf->ppal->BaseObject.hHmgr); + PalGDI = PALETTE_ShareLockPalette(psurf->ppal->BaseObject.hHmgr); for (Index = 0; Index < 256 && Index < PalGDI->NumColors; @@ -327,7 +327,7 @@ IntCreateCompatibleBitmap( bi->bmiColors[Index].rgbBlue = PalGDI->IndexedColors[Index].peBlue; bi->bmiColors[Index].rgbReserved = 0; } - PALETTE_UnlockPalette(PalGDI); + PALETTE_ShareUnlockPalette(PalGDI); } Bmp = DIB_CreateDIBSection(Dc, @@ -390,7 +390,7 @@ NtGdiGetBitmapDimension( if (hBitmap == NULL) return FALSE; - psurfBmp = SURFACE_LockSurface(hBitmap); + psurfBmp = SURFACE_ShareLockSurface(hBitmap); if (psurfBmp == NULL) { EngSetLastError(ERROR_INVALID_HANDLE); @@ -408,7 +408,7 @@ NtGdiGetBitmapDimension( } _SEH2_END - SURFACE_UnlockSurface(psurfBmp); + SURFACE_ShareUnlockSurface(psurfBmp); return Ret; } @@ -496,12 +496,12 @@ NtGdiGetPixel(HDC hDC, INT XPos, INT YPos) NtGdiSelectBitmap(hDCTmp, hBmpOld); // our bitmap is no longer selected, so we can access it's stuff... - psurf = SURFACE_LockSurface(hBmpTmp); + psurf = SURFACE_ShareLockSurface(hBmpTmp); if (psurf) { // Dont you need to convert something here? Result = *(COLORREF*)psurf->SurfObj.pvScan0; - SURFACE_UnlockSurface(psurf); + SURFACE_ShareUnlockSurface(psurf); } } GreDeleteObject(hBmpTmp); @@ -598,7 +598,7 @@ NtGdiGetBitmapBits( return 0; } - psurf = SURFACE_LockSurface(hBitmap); + psurf = SURFACE_ShareLockSurface(hBitmap); if (!psurf) { EngSetLastError(ERROR_INVALID_HANDLE); @@ -612,7 +612,7 @@ NtGdiGetBitmapBits( /* If the bits vector is null, the function should return the read size */ if (pUnsafeBits == NULL) { - SURFACE_UnlockSurface(psurf); + SURFACE_ShareUnlockSurface(psurf); return bmSize; } @@ -632,7 +632,7 @@ NtGdiGetBitmapBits( } _SEH2_END - SURFACE_UnlockSurface(psurf); + SURFACE_ShareUnlockSurface(psurf); return ret; } @@ -652,7 +652,7 @@ NtGdiSetBitmapBits( return 0; } - psurf = SURFACE_LockSurface(hBitmap); + psurf = SURFACE_ShareLockSurface(hBitmap); if (psurf == NULL) { EngSetLastError(ERROR_INVALID_HANDLE); @@ -671,7 +671,7 @@ NtGdiSetBitmapBits( } _SEH2_END - SURFACE_UnlockSurface(psurf); + SURFACE_ShareUnlockSurface(psurf); return ret; } @@ -689,7 +689,7 @@ NtGdiSetBitmapDimension( if (hBitmap == NULL) return FALSE; - psurf = SURFACE_LockSurface(hBitmap); + psurf = SURFACE_ShareLockSurface(hBitmap); if (psurf == NULL) { EngSetLastError(ERROR_INVALID_HANDLE); @@ -714,7 +714,7 @@ NtGdiSetBitmapDimension( psurf->sizlDim.cx = Width; psurf->sizlDim.cy = Height; - SURFACE_UnlockSurface(psurf); + SURFACE_ShareUnlockSurface(psurf); return Ret; } @@ -998,11 +998,11 @@ NtGdiGetDCforBitmap( IN HBITMAP hsurf) { HDC hdc = NULL; - PSURFACE psurf = SURFACE_LockSurface(hsurf); + PSURFACE psurf = SURFACE_ShareLockSurface(hsurf); if (psurf) { hdc = psurf->hdc; - SURFACE_UnlockSurface(psurf); + SURFACE_ShareUnlockSurface(psurf); } return hdc; } diff --git a/reactos/subsystems/win32/win32k/objects/dibobj.c b/reactos/subsystems/win32/win32k/objects/dibobj.c index dfd45ee1541..452e03d13fc 100644 --- a/reactos/subsystems/win32/win32k/objects/dibobj.c +++ b/reactos/subsystems/win32/win32k/objects/dibobj.c @@ -164,7 +164,7 @@ IntSetDIBColorTable( return 0; } - PalGDI = PALETTE_LockPalette(psurf->ppal->BaseObject.hHmgr); + PalGDI = PALETTE_ShareLockPalette(psurf->ppal->BaseObject.hHmgr); for (Index = StartIndex; Index < StartIndex + Entries && Index < PalGDI->NumColors; @@ -174,7 +174,7 @@ IntSetDIBColorTable( PalGDI->IndexedColors[Index].peGreen = Colors[Index - StartIndex].rgbGreen; PalGDI->IndexedColors[Index].peBlue = Colors[Index - StartIndex].rgbBlue; } - PALETTE_UnlockPalette(PalGDI); + PALETTE_ShareUnlockPalette(PalGDI); } else Entries = 0; @@ -277,8 +277,8 @@ IntSetDIBits( bmi->bmiHeader.biHeight, bmi->bmiHeader.biBitCount)); - psurfDst = SURFACE_LockSurface(hBitmap); - psurfSrc = SURFACE_LockSurface(SourceBitmap); + psurfDst = SURFACE_ShareLockSurface(hBitmap); + psurfSrc = SURFACE_ShareLockSurface(SourceBitmap); if(!(psurfSrc && psurfDst)) { @@ -311,11 +311,11 @@ IntSetDIBits( cleanup: if(psurfSrc) { - SURFACE_UnlockSurface(psurfSrc); + SURFACE_ShareUnlockSurface(psurfSrc); } if(psurfDst) { - SURFACE_UnlockSurface(psurfDst); + SURFACE_ShareUnlockSurface(psurfDst); } GreDeleteObject(SourceBitmap); @@ -766,7 +766,7 @@ NtGdiGetDIBitsInternal( /* For color DDBs in native depth (mono DDBs always have a black/white palette): Generate the color map from the selected palette */ - PPALETTE pDcPal = PALETTE_LockPalette(pDC->dclevel.hpal); + PPALETTE pDcPal = PALETTE_ShareLockPalette(pDC->dclevel.hpal); if(!pDcPal) { ScanLines = 0 ; @@ -786,7 +786,7 @@ NtGdiGetDIBitsInternal( rgbQuads[i].rgbBlue = pDcPal->IndexedColors[i].peBlue; rgbQuads[i].rgbReserved = 0; } - PALETTE_UnlockPalette(pDcPal); + PALETTE_ShareUnlockPalette(pDcPal); } else { @@ -1548,10 +1548,10 @@ DIB_CreateDIBSection( { if(dc) { - PPALETTE pdcPal ; - pdcPal = PALETTE_LockPalette(dc->dclevel.hpal); - hpal = DIB_MapPaletteColors(pdcPal, bmi); - PALETTE_UnlockPalette(pdcPal); + PPALETTE ppalDc; + ppalDc = PALETTE_ShareLockPalette(dc->dclevel.hpal); + hpal = DIB_MapPaletteColors(ppalDc, bmi); + PALETTE_ShareUnlockPalette(ppalDc); } else { diff --git a/reactos/subsystems/win32/win32k/objects/icm.c b/reactos/subsystems/win32/win32k/objects/icm.c index 104cefa99a7..f67ff9ca61a 100644 --- a/reactos/subsystems/win32/win32k/objects/icm.c +++ b/reactos/subsystems/win32/win32k/objects/icm.c @@ -251,7 +251,7 @@ UpdateDeviceGammaRamp( HDEV hPDev ) if (!(pGDev->flFlags & PDEV_GAMMARAMP_TABLE)) return FALSE; - palGDI = PALETTE_LockPalette(pGDev->devinfo.hpalDefault); + palGDI = PALETTE_ShareLockPalette(pGDev->devinfo.hpalDefault); if(!palGDI) return FALSE; palPtr = (PALOBJ*) palGDI; @@ -272,7 +272,7 @@ UpdateDeviceGammaRamp( HDEV hPDev ) 0, palGDI->NumColors); } - PALETTE_UnlockPalette(palGDI); + PALETTE_ShareUnlockPalette(palGDI); return Ret; } else From a63e424516e4f7dfdd994bada9f9b5b31686e39a Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Mon, 18 Apr 2011 21:48:19 +0000 Subject: [PATCH 172/317] Sam Arun Raj Seeniraj: [KERNEL32] - DefineDosDeviceW() is implemented and calls into csrss.exe CsrDefineDosDevice(). - Fixed a minor bug in DefineDosDeviceA(), as calling RtlCreateUnicodeStringFromAsciiz() prevented NULL lpTargetPath to be passed down to DefineDosDeviceW(). - Fixed a minor bug in QueryDosDeviceW() that causes lpTargetPath buffer to be returned with NULL string terminator placed at the wrong point in the buffer. [WIN32CSR.DLL] - Implemented CsrDefineDosDevice() in win32csr.dll, the symbolic links are created in global name space currently. [SUBST.EXE] - Implemented a subst.exe clone. See issue #993 for more details. svn path=/trunk/; revision=51393 --- reactos/base/system/subst/subst.c | 257 +++++++++ reactos/base/system/subst/subst.rbuild | 9 + reactos/base/system/subst/subst.rc | 5 + reactos/base/system/system.rbuild | 3 + reactos/boot/bootdata/packages/reactos.dff | 1 + reactos/dll/win32/kernel32/file/dosdev.c | 222 ++++++-- reactos/include/reactos/subsys/csrss/csrss.h | 9 + .../subsystems/win32/csrss/win32csr/dllmain.c | 10 + .../subsystems/win32/csrss/win32csr/file.c | 509 +++++++++++++++++- .../subsystems/win32/csrss/win32csr/file.h | 11 + 10 files changed, 1003 insertions(+), 33 deletions(-) create mode 100644 reactos/base/system/subst/subst.c create mode 100644 reactos/base/system/subst/subst.rbuild create mode 100644 reactos/base/system/subst/subst.rc diff --git a/reactos/base/system/subst/subst.c b/reactos/base/system/subst/subst.c new file mode 100644 index 00000000000..7cb92563eb8 --- /dev/null +++ b/reactos/base/system/subst/subst.c @@ -0,0 +1,257 @@ +/* PROJECT: ReactOS Kernel + * LICENSE: GPL - See COPYING in the top level directory + * FILE: base/system/subst/subst.c + * PURPOSE: Associates a path with a drive letter + * PROGRAMMERS: Sam Arun Raj + */ + +/* INCLUDES *****************************************************************/ + +#define LEAN_AND_MEAN +#include +#include +#include +#include +#define NDEBUG +#include + +/* FUNCTIONS ****************************************************************/ + +void PrintError(DWORD ErrCode) +{ + TCHAR *buffer = (TCHAR*) calloc(2048, + sizeof(TCHAR)); + TCHAR *msg = NULL; + + if (buffer) + { + FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, + NULL, + ErrCode, + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + (TCHAR*)&msg, + 0, + NULL); + _sntprintf(buffer, + 2048, + _T("Failed with error code 0x%x: %s\n"), + ErrCode, + msg); + _tprintf(_T("%s"), + buffer); + if (msg) + LocalFree(msg); + free(buffer); + } +} + +void DisplaySubstUsage() +{ + _tprintf(_T("Associates a path with a drive letter.\n\n")); + _tprintf(_T("SUBST [drive1: [drive2:]path]\n")); + _tprintf(_T("SUBST drive1: /D\n\n")); + _tprintf(_T(" drive1: Specifies a virtual drive to which you want to assign a path.\n")); + _tprintf(_T(" [drive2:]path Specifies a physical drive and path you want to assign to\n")); + _tprintf(_T(" a virtual drive.\n")); + _tprintf(_T(" /D Deletes a substituted (virtual) drive.\n\n")); + _tprintf(_T("Type SUBST with no parameters to display a list of current virtual drives.\n")); +} + +BOOLEAN IsSubstedDrive(TCHAR *Drive) +{ + BOOLEAN Result = FALSE; + LPTSTR lpTargetPath = NULL; + DWORD CharCount, dwSize; + + if (_tcslen(Drive) > 2) + return FALSE; + + dwSize = sizeof(TCHAR) * MAX_PATH; + lpTargetPath = (LPTSTR) malloc(sizeof(TCHAR) * MAX_PATH); + if ( lpTargetPath) + { + CharCount = QueryDosDevice(Drive, + lpTargetPath, + dwSize / sizeof(TCHAR)); + while (! CharCount && + GetLastError() == ERROR_INSUFFICIENT_BUFFER) + { + free(lpTargetPath); + dwSize *= 2; + lpTargetPath = (LPTSTR) malloc(dwSize); + if (lpTargetPath) + { + CharCount = QueryDosDevice(Drive, + lpTargetPath, + dwSize / sizeof(TCHAR)); + } + } + + if (CharCount) + { + if ( _tcsncmp(lpTargetPath, _T("\\??\\"), 4) == 0 && + ( (lpTargetPath[4] >= _T('A') && + lpTargetPath[4] <= _T('Z')) || + (lpTargetPath[4] >= _T('a') && + lpTargetPath[4] <= _T('z')) ) ) + { + Result = TRUE; + } + } + free(lpTargetPath); + } + return Result; +} + +void DumpSubstedDrives() +{ + TCHAR Drive[3] = _T("A:"); + LPTSTR lpTargetPath = NULL; + DWORD CharCount, dwSize; + INT i = 0; + + dwSize = sizeof(TCHAR) * MAX_PATH; + lpTargetPath = (LPTSTR) malloc(sizeof(TCHAR) * MAX_PATH); + if (! lpTargetPath) + return; + + while (i < 26) + { + Drive[0] = _T('A') + i; + CharCount = QueryDosDevice(Drive, + lpTargetPath, + dwSize / sizeof(TCHAR)); + while (! CharCount && + GetLastError() == ERROR_INSUFFICIENT_BUFFER) + { + free(lpTargetPath); + dwSize *= 2; + lpTargetPath = (LPTSTR) malloc(dwSize); + if (lpTargetPath) + { + CharCount = QueryDosDevice(Drive, + lpTargetPath, + dwSize / sizeof(TCHAR)); + } + } + + if (! CharCount) + { + i++; + continue; + } + else + { + if ( _tcsncmp(lpTargetPath, _T("\\??\\"), 4) == 0 && + ( (lpTargetPath[4] >= _T('A') && + lpTargetPath[4] <= _T('Z')) || + (lpTargetPath[4] >= _T('a') && + lpTargetPath[4] <= _T('z')) ) ) + { + _tprintf(_T("%s\\: => %s\n"), + Drive, + lpTargetPath + 4); + } + } + i++; + } + free(lpTargetPath); +} + +int DeleteSubst(TCHAR* Drive) +{ + BOOL Result; + + if (_tcslen(Drive) > 2) + { + _tprintf(_T("Invalid parameter - %s\n"), + Drive); + return 1; + } + + if (! IsSubstedDrive(Drive)) + { + _tprintf(_T("Invalid Parameter - %s\n"), + Drive); + return 1; + } + + Result = DefineDosDevice(DDD_REMOVE_DEFINITION, + Drive, + NULL); + if (! Result) + { + PrintError(GetLastError()); + return 1; + } + return 0; +} + +int AddSubst(TCHAR* Drive, TCHAR *Path) +{ + BOOL Result; + + if (_tcslen(Drive) > 2) + { + _tprintf(_T("Invalid parameter - %s\n"), + Drive); + return 1; + } + + if (IsSubstedDrive(Drive)) + { + _tprintf(_T("Drive already SUBSTed\n")); + return 1; + } + + Result = DefineDosDevice(0, + Drive, + Path); + if (! Result) + { + PrintError(GetLastError()); + return 1; + } + return 0; +} + +int _tmain(int argc, TCHAR* argv[]) +{ + INT i; + + for (i = 0; i < argc; i++) + { + if (!_tcsicmp(argv[i], _T("/?"))) + { + DisplaySubstUsage(); + return 0; + } + } + + if (argc < 3) + { + if (argc >= 2) + { + _tprintf(_T("Invalid parameter - %s\n"), + argv[1]); + return 1; + } + DumpSubstedDrives(); + return 0; + } + + if (argc > 3) + { + _tprintf(_T("Incorrect number of parameters - %s\n"), + argv[3]); + return 1; + } + + if (! _tcsicmp(argv[1], _T("/D"))) + return DeleteSubst(argv[2]); + if (! _tcsicmp(argv[2], _T("/D"))) + return DeleteSubst(argv[1]); + return AddSubst(argv[1], argv[2]); +} + +/* EOF */ diff --git a/reactos/base/system/subst/subst.rbuild b/reactos/base/system/subst/subst.rbuild new file mode 100644 index 00000000000..fe93acb95e1 --- /dev/null +++ b/reactos/base/system/subst/subst.rbuild @@ -0,0 +1,9 @@ + + + + include/reactos/wine + . + kernel32 + subst.c + subst.rc + diff --git a/reactos/base/system/subst/subst.rc b/reactos/base/system/subst/subst.rc new file mode 100644 index 00000000000..b81ea2c6a7b --- /dev/null +++ b/reactos/base/system/subst/subst.rc @@ -0,0 +1,5 @@ +#include +#define REACTOS_STR_FILE_DESCRIPTION "ReactOS Virtual Drive Utility Version 1.0 \0" +#define REACTOS_STR_INTERNAL_NAME "subst\0" +#define REACTOS_STR_ORIGINAL_FILENAME "subst.exe\0" +#include diff --git a/reactos/base/system/system.rbuild b/reactos/base/system/system.rbuild index 8dd6d2aa0a4..7e7d348a6b0 100644 --- a/reactos/base/system/system.rbuild +++ b/reactos/base/system/system.rbuild @@ -10,6 +10,9 @@ + + + diff --git a/reactos/boot/bootdata/packages/reactos.dff b/reactos/boot/bootdata/packages/reactos.dff index 778dac88b98..85f7955fdc8 100644 --- a/reactos/boot/bootdata/packages/reactos.dff +++ b/reactos/boot/bootdata/packages/reactos.dff @@ -115,6 +115,7 @@ base\shell\explorer-new\explorer_new.exe 4 optional base\system\autochk\autochk.exe 1 base\system\bootok\bootok.exe 1 base\system\expand\expand.exe 1 +base\system\subst\subst.exe 1 base\system\format\format.exe 1 base\system\lsass\lsass.exe 1 base\system\msiexec\msiexec.exe 1 diff --git a/reactos/dll/win32/kernel32/file/dosdev.c b/reactos/dll/win32/kernel32/file/dosdev.c index 1e15166bb64..0d65a74140c 100644 --- a/reactos/dll/win32/kernel32/file/dosdev.c +++ b/reactos/dll/win32/kernel32/file/dosdev.c @@ -14,6 +14,7 @@ #include #define NDEBUG #include +#include DEBUG_CHANNEL(kernel32file); /* FUNCTIONS *****************************************************************/ @@ -29,44 +30,55 @@ DefineDosDeviceA( LPCSTR lpTargetPath ) { - UNICODE_STRING DeviceNameU; - UNICODE_STRING TargetPathU; - BOOL Result; + UNICODE_STRING DeviceNameU = {0}; + UNICODE_STRING TargetPathU = {0}; + BOOL Result; - if (!RtlCreateUnicodeStringFromAsciiz (&DeviceNameU, - (LPSTR)lpDeviceName)) - { - SetLastError (ERROR_NOT_ENOUGH_MEMORY); - return 0; - } + if (lpDeviceName && + ! RtlCreateUnicodeStringFromAsciiz(&DeviceNameU, + (LPSTR)lpDeviceName)) + { + SetLastError(ERROR_NOT_ENOUGH_MEMORY); + return 0; + } - if (!RtlCreateUnicodeStringFromAsciiz (&TargetPathU, - (LPSTR)lpTargetPath)) - { - RtlFreeHeap (RtlGetProcessHeap (), - 0, - DeviceNameU.Buffer); - SetLastError (ERROR_NOT_ENOUGH_MEMORY); - return 0; - } + if (lpTargetPath && + ! RtlCreateUnicodeStringFromAsciiz(&TargetPathU, + (LPSTR)lpTargetPath)) + { + if (DeviceNameU.Buffer) + { + RtlFreeHeap(RtlGetProcessHeap (), + 0, + DeviceNameU.Buffer); + } + SetLastError(ERROR_NOT_ENOUGH_MEMORY); + return 0; + } - Result = DefineDosDeviceW (dwFlags, - DeviceNameU.Buffer, - TargetPathU.Buffer); + Result = DefineDosDeviceW(dwFlags, + DeviceNameU.Buffer, + TargetPathU.Buffer); - RtlFreeHeap (RtlGetProcessHeap (), - 0, - TargetPathU.Buffer); - RtlFreeHeap (RtlGetProcessHeap (), - 0, - DeviceNameU.Buffer); + if (TargetPathU.Buffer) + { + RtlFreeHeap(RtlGetProcessHeap (), + 0, + TargetPathU.Buffer); + } - return Result; + if (DeviceNameU.Buffer) + { + RtlFreeHeap(RtlGetProcessHeap (), + 0, + DeviceNameU.Buffer); + } + return Result; } /* - * @unimplemented + * @implemented */ BOOL WINAPI @@ -76,8 +88,154 @@ DefineDosDeviceW( LPCWSTR lpTargetPath ) { - UNIMPLEMENTED; - return FALSE; + ULONG ArgumentCount; + ULONG BufferSize; + PCSR_CAPTURE_BUFFER CaptureBuffer; + CSR_API_MESSAGE Request; + NTSTATUS Status; + UNICODE_STRING NtTargetPathU; + UNICODE_STRING DeviceNameU; + UNICODE_STRING DeviceUpcaseNameU; + HANDLE hUser32; + DEV_BROADCAST_VOLUME dbcv; + BOOL Result = TRUE; + DWORD dwRecipients; + typedef long (WINAPI *BSM_type)(DWORD,LPDWORD,UINT,WPARAM,LPARAM); + BSM_type BSM_ptr; + + if ( (dwFlags & 0xFFFFFFF0) || + ((dwFlags & DDD_EXACT_MATCH_ON_REMOVE) && + ! (dwFlags & DDD_REMOVE_DEFINITION)) ) + { + SetLastError(ERROR_INVALID_PARAMETER); + return FALSE; + } + + ArgumentCount = 1; + BufferSize = 0; + if (! lpTargetPath) + { + RtlInitUnicodeString(&NtTargetPathU, + NULL); + } + else + { + if (dwFlags & DDD_RAW_TARGET_PATH) + { + RtlInitUnicodeString(&NtTargetPathU, + lpTargetPath); + } + else + { + if (! RtlDosPathNameToNtPathName_U(lpTargetPath, + &NtTargetPathU, + 0, + 0)) + { + WARN("RtlDosPathNameToNtPathName_U() failed\n"); + BaseSetLastNTError(STATUS_OBJECT_NAME_INVALID); + return FALSE; + } + } + ArgumentCount = 2; + BufferSize += NtTargetPathU.Length; + } + + RtlInitUnicodeString(&DeviceNameU, + lpDeviceName); + RtlUpcaseUnicodeString(&DeviceUpcaseNameU, + &DeviceNameU, + TRUE); + BufferSize += DeviceUpcaseNameU.Length; + + CaptureBuffer = CsrAllocateCaptureBuffer(ArgumentCount, + BufferSize); + if (! CaptureBuffer) + { + SetLastError(ERROR_NOT_ENOUGH_MEMORY); + Result = FALSE; + } + else + { + Request.Data.DefineDosDeviceRequest.dwFlags = dwFlags; + + CsrCaptureMessageBuffer(CaptureBuffer, + (PVOID)DeviceUpcaseNameU.Buffer, + DeviceUpcaseNameU.Length, + (PVOID*)&Request.Data.DefineDosDeviceRequest.DeviceName.Buffer); + + Request.Data.DefineDosDeviceRequest.DeviceName.Length = + DeviceUpcaseNameU.Length; + Request.Data.DefineDosDeviceRequest.DeviceName.MaximumLength = + DeviceUpcaseNameU.Length; + + if (NtTargetPathU.Buffer) + { + CsrCaptureMessageBuffer(CaptureBuffer, + (PVOID)NtTargetPathU.Buffer, + NtTargetPathU.Length, + (PVOID*)&Request.Data.DefineDosDeviceRequest.TargetName.Buffer); + } + Request.Data.DefineDosDeviceRequest.TargetName.Length = + NtTargetPathU.Length; + Request.Data.DefineDosDeviceRequest.TargetName.MaximumLength = + NtTargetPathU.Length; + + Status = CsrClientCallServer(&Request, + CaptureBuffer, + MAKE_CSR_API(DEFINE_DOS_DEVICE, CSR_CONSOLE), + sizeof(CSR_API_MESSAGE)); + CsrFreeCaptureBuffer(CaptureBuffer); + + if (! NT_SUCCESS(Status) || + ! NT_SUCCESS(Status = Request.Status)) + { + WARN("CsrClientCallServer() failed (Status %lx)\n", + Status); + SetLastErrorByStatus(Status); + Result = FALSE; + } + else + { + if (! (dwFlags & DDD_NO_BROADCAST_SYSTEM) && + DeviceUpcaseNameU.Length == 2 * sizeof(WCHAR) && + DeviceUpcaseNameU.Buffer[1] == L':' && + ( (DeviceUpcaseNameU.Buffer[0] - L'A') < 26 )) + { + hUser32 = LoadLibraryA("user32.dll"); + if (hUser32) + { + BSM_ptr = (BSM_type) + GetProcAddress(hUser32, "BroadcastSystemMessageW"); + if (BSM_ptr) + { + dwRecipients = BSM_APPLICATIONS; + dbcv.dbcv_size = sizeof(DEV_BROADCAST_VOLUME); + dbcv.dbcv_devicetype = DBT_DEVTYP_VOLUME; + dbcv.dbcv_reserved = 0; + dbcv.dbcv_unitmask |= + (1 << (DeviceUpcaseNameU.Buffer[0] - L'A')); + dbcv.dbcv_flags = DBTF_NET; + (void) BSM_ptr(BSF_SENDNOTIFYMESSAGE | BSF_FLUSHDISK, + &dwRecipients, + WM_DEVICECHANGE, + (WPARAM)DBT_DEVICEARRIVAL, + (LPARAM)&dbcv); + } + FreeLibrary(hUser32); + } + } + } + } + + if (NtTargetPathU.Buffer) + { + RtlFreeHeap(RtlGetProcessHeap(), + 0, + NtTargetPathU.Buffer); + } + RtlFreeUnicodeString(&DeviceUpcaseNameU); + return Result; } @@ -250,7 +408,7 @@ QueryDosDeviceW( TRACE ("TargetLength: %hu\n", UnicodeString.Length); TRACE ("Target: '%wZ'\n", &UnicodeString); - Length = ReturnLength / sizeof(WCHAR); + Length = UnicodeString.Length / sizeof(WCHAR); if (Length < ucchMax) { /* Append null-charcter */ diff --git a/reactos/include/reactos/subsys/csrss/csrss.h b/reactos/include/reactos/subsys/csrss/csrss.h index 47c5addc8b8..4c9f44fd43c 100644 --- a/reactos/include/reactos/subsys/csrss/csrss.h +++ b/reactos/include/reactos/subsys/csrss/csrss.h @@ -518,6 +518,13 @@ typedef struct UINT UniqueID; } CSRSS_GET_TEMP_FILE, *PCSRSS_GET_TEMP_FILE; +typedef struct +{ + UNICODE_STRING DeviceName; + UNICODE_STRING TargetName; + DWORD dwFlags; +} CSRSS_DEFINE_DOS_DEVICE, *PCSRSS_DEFINE_DOS_DEVICE; + #define CSR_API_MESSAGE_HEADER_SIZE(Type) (FIELD_OFFSET(CSR_API_MESSAGE, Data) + sizeof(Type)) #define CSRSS_MAX_WRITE_CONSOLE (LPC_MAX_DATA_LENGTH - CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE)) #define CSRSS_MAX_WRITE_CONSOLE_OUTPUT_CHAR (LPC_MAX_DATA_LENGTH - CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE_OUTPUT_CHAR)) @@ -598,6 +605,7 @@ typedef struct #define GET_HISTORY_INFO (0x46) #define SET_HISTORY_INFO (0x47) #define GET_TEMP_FILE (0x48) +#define DEFINE_DOS_DEVICE (0X49) /* Keep in sync with definition below. */ #define CSRSS_HEADER_SIZE (sizeof(PORT_MESSAGE) + sizeof(ULONG) + sizeof(NTSTATUS)) @@ -680,6 +688,7 @@ typedef struct _CSR_API_MESSAGE CSRSS_GET_HISTORY_INFO GetHistoryInfo; CSRSS_SET_HISTORY_INFO SetHistoryInfo; CSRSS_GET_TEMP_FILE GetTempFile; + CSRSS_DEFINE_DOS_DEVICE DefineDosDeviceRequest; } Data; } CSR_API_MESSAGE, *PCSR_API_MESSAGE; diff --git a/reactos/subsystems/win32/csrss/win32csr/dllmain.c b/reactos/subsystems/win32/csrss/win32csr/dllmain.c index 06112ab1f42..013b8b8556d 100644 --- a/reactos/subsystems/win32/csrss/win32csr/dllmain.c +++ b/reactos/subsystems/win32/csrss/win32csr/dllmain.c @@ -9,11 +9,14 @@ /* INCLUDES ******************************************************************/ #define NDEBUG #include "w32csr.h" +#include "file.h" #include /* Not defined in any header file */ extern VOID WINAPI PrivateCsrssManualGuiCheck(LONG Check); extern VOID WINAPI InitializeAppSwitchHook(); +extern LIST_ENTRY DosDeviceHistory; +extern RTL_CRITICAL_SECTION Win32CsrDefineDosDeviceCritSec; /* GLOBALS *******************************************************************/ @@ -88,6 +91,7 @@ static CSRSS_API_DEFINITION Win32CsrApiDefinitions[] = CSRSS_DEFINE_API(GET_HISTORY_INFO, CsrGetHistoryInfo), CSRSS_DEFINE_API(SET_HISTORY_INFO, CsrSetHistoryInfo), CSRSS_DEFINE_API(GET_TEMP_FILE, CsrGetTempFile), + CSRSS_DEFINE_API(DEFINE_DOS_DEVICE, CsrDefineDosDevice), { 0, 0, NULL } }; @@ -104,6 +108,10 @@ DllMain(HANDLE hDll, InitializeAppSwitchHook(); } + if (DLL_PROCESS_DETACH == dwReason) + { + CsrCleanupDefineDosDevice(); + } return TRUE; } @@ -174,6 +182,8 @@ Win32CsrInitialization(PCSRSS_API_DEFINITION *ApiDefinitions, ServerProcs->ProcessInheritProc = Win32CsrDuplicateHandleTable; ServerProcs->ProcessDeletedProc = Win32CsrReleaseConsole; + Status = RtlInitializeCriticalSection(&Win32CsrDefineDosDeviceCritSec); + InitializeListHead(&DosDeviceHistory); return TRUE; } diff --git a/reactos/subsystems/win32/csrss/win32csr/file.c b/reactos/subsystems/win32/csrss/win32csr/file.c index d7e8414b0dd..8a6ba73b3c7 100644 --- a/reactos/subsystems/win32/csrss/win32csr/file.c +++ b/reactos/subsystems/win32/csrss/win32csr/file.c @@ -10,13 +10,15 @@ /* INCLUDES ******************************************************************/ #include - #define NDEBUG #include +#include "file.h" /* GLOBALS *******************************************************************/ UINT CsrGetTempFileUnique; +LIST_ENTRY DosDeviceHistory; +RTL_CRITICAL_SECTION Win32CsrDefineDosDeviceCritSec; /* FUNCTIONS *****************************************************************/ @@ -31,3 +33,508 @@ CSR_API(CsrGetTempFile) return STATUS_SUCCESS; } + +CSR_API(CsrDefineDosDevice) +{ + OBJECT_ATTRIBUTES ObjectAttributes; + HANDLE LinkHandle = NULL; + NTSTATUS Status; + UNICODE_STRING DeviceName = {0}; + UNICODE_STRING RequestDeviceName = {0}; + UNICODE_STRING LinkTarget = {0}; + PUNICODE_STRING RequestLinkTarget; + ULONG Length; + SID_IDENTIFIER_AUTHORITY WorldAuthority = {SECURITY_WORLD_SID_AUTHORITY}; + SID_IDENTIFIER_AUTHORITY SystemAuthority = {SECURITY_NT_AUTHORITY}; + PSECURITY_DESCRIPTOR SecurityDescriptor; + PACL Dacl; + PSID AdminSid; + PSID SystemSid; + PSID WorldSid; + ULONG SidLength; + PCSRSS_DOS_DEVICE_HISTORY_ENTRY HistoryEntry; + PLIST_ENTRY Entry; + PLIST_ENTRY ListHead; + BOOLEAN Matched, AddHistory; + DWORD dwFlags; + PWSTR lpBuffer; + + DPRINT("CsrDefineDosDevice entered, Flags:%d, DeviceName:%wZ, TargetName:%wZ\n", + Request->Data.DefineDosDeviceRequest.dwFlags, + &Request->Data.DefineDosDeviceRequest.DeviceName, + &Request->Data.DefineDosDeviceRequest.TargetName); + + Matched = AddHistory = FALSE; + HistoryEntry = NULL; + AdminSid = SystemSid = WorldSid = NULL; + SecurityDescriptor = NULL; + ListHead = &DosDeviceHistory; + dwFlags = Request->Data.DefineDosDeviceRequest.dwFlags; + + /* Validate the flags */ + if ( (dwFlags & 0xFFFFFFF0) || + ((dwFlags & DDD_EXACT_MATCH_ON_REMOVE) && + ! (dwFlags & DDD_REMOVE_DEFINITION)) ) + { + return STATUS_INVALID_PARAMETER; + } + + Status = RtlEnterCriticalSection(&Win32CsrDefineDosDeviceCritSec); + if (! NT_SUCCESS(Status)) + { + DPRINT1("RtlEnterCriticalSection() failed (Status %lx)", + Status); + return Status; + } + + _SEH2_TRY + { + Status = + RtlUpcaseUnicodeString(&RequestDeviceName, + &Request->Data.DefineDosDeviceRequest.DeviceName, + TRUE); + if (! NT_SUCCESS(Status)) + _SEH2_LEAVE; + + RequestLinkTarget = + &Request->Data.DefineDosDeviceRequest.TargetName; + lpBuffer = (PWSTR) RtlAllocateHeap(Win32CsrApiHeap, + HEAP_ZERO_MEMORY, + RequestDeviceName.MaximumLength + 5 * sizeof(WCHAR)); + if (! lpBuffer) + { + DPRINT1("Failed to allocate memory\n"); + Status = STATUS_NO_MEMORY; + _SEH2_LEAVE; + } + + swprintf(lpBuffer, + L"\\??\\%wZ", + &RequestDeviceName); + RtlInitUnicodeString(&DeviceName, + lpBuffer); + InitializeObjectAttributes(&ObjectAttributes, + &DeviceName, + OBJ_CASE_INSENSITIVE, + NULL, + NULL); + Status = NtOpenSymbolicLinkObject(&LinkHandle, + DELETE | 0x1, + &ObjectAttributes); + if (NT_SUCCESS(Status)) + { + Status = NtQuerySymbolicLinkObject(LinkHandle, + &LinkTarget, + &Length); + if (! NT_SUCCESS(Status) && + Status == STATUS_BUFFER_TOO_SMALL) + { + LinkTarget.Length = 0; + LinkTarget.MaximumLength = Length; + LinkTarget.Buffer = (PWSTR) + RtlAllocateHeap(Win32CsrApiHeap, + HEAP_ZERO_MEMORY, + Length); + if (! LinkTarget.Buffer) + { + DPRINT1("Failed to allocate memory\n"); + Status = STATUS_NO_MEMORY; + _SEH2_LEAVE; + } + + Status = NtQuerySymbolicLinkObject(LinkHandle, + &LinkTarget, + &Length); + } + + if (! NT_SUCCESS(Status)) + { + DPRINT1("NtQuerySymbolicLinkObject(%wZ) failed (Status %lx)", + &DeviceName, Status); + _SEH2_LEAVE; + } + + if ((dwFlags & DDD_REMOVE_DEFINITION)) + { + /* If no target name specified we remove the current symlink target */ + if (RequestLinkTarget->Length == 0) + Matched = TRUE; + else + { + if (dwFlags & DDD_EXACT_MATCH_ON_REMOVE) + Matched = ! RtlCompareUnicodeString(RequestLinkTarget, + &LinkTarget, + TRUE); + else + Matched = RtlPrefixUnicodeString(RequestLinkTarget, + &LinkTarget, + TRUE); + } + + if (Matched && IsListEmpty(ListHead)) + { + /* Current symlink target macthed and there is nothing to revert to */ + RequestLinkTarget = NULL; + } + else if (Matched && ! IsListEmpty(ListHead)) + { + /* Fetch the first history entry we come across for the device name */ + /* This will become the current symlink target for the device name */ + Matched = FALSE; + Entry = ListHead->Flink; + while (Entry != ListHead) + { + HistoryEntry = (PCSRSS_DOS_DEVICE_HISTORY_ENTRY) + CONTAINING_RECORD(Entry, + CSRSS_DOS_DEVICE_HISTORY_ENTRY, + Entry); + Matched = + ! RtlCompareUnicodeString(&RequestDeviceName, + &HistoryEntry->Device, + FALSE); + if (Matched) + { + RemoveEntryList(&HistoryEntry->Entry); + RequestLinkTarget = &HistoryEntry->Target; + break; + } + Entry = Entry->Flink; + HistoryEntry = NULL; + } + + /* Nothing to revert to so delete the symlink */ + if (! Matched) + RequestLinkTarget = NULL; + } + else if (! Matched) + { + /* Locate a previous symlink target as we did not get a hit earlier */ + /* If we find one we need to remove it */ + Entry = ListHead->Flink; + while (Entry != ListHead) + { + HistoryEntry = (PCSRSS_DOS_DEVICE_HISTORY_ENTRY) + CONTAINING_RECORD(Entry, + CSRSS_DOS_DEVICE_HISTORY_ENTRY, + Entry); + Matched = + ! RtlCompareUnicodeString(&RequestDeviceName, + &HistoryEntry->Device, + FALSE); + if (! Matched) + { + HistoryEntry = NULL; + Entry = Entry->Flink; + continue; + } + + Matched = FALSE; + if (dwFlags & DDD_EXACT_MATCH_ON_REMOVE) + { + if (! RtlCompareUnicodeString(RequestLinkTarget, + &HistoryEntry->Target, + TRUE)) + { + Matched = TRUE; + } + } + else if (RtlPrefixUnicodeString(RequestLinkTarget, + &HistoryEntry->Target, + TRUE)) + { + Matched = TRUE; + } + + if (Matched) + { + RemoveEntryList(&HistoryEntry->Entry); + break; + } + Entry = Entry->Flink; + HistoryEntry = NULL; + } + + /* Leave existing symlink as is */ + if (! Matched) + Status = STATUS_OBJECT_NAME_NOT_FOUND; + else + Status = STATUS_SUCCESS; + _SEH2_LEAVE; + } + } + else + { + AddHistory = TRUE; + } + + Status = NtMakeTemporaryObject(LinkHandle); + if (! NT_SUCCESS(Status)) + { + DPRINT1("NtMakeTemporaryObject(%wZ) failed (Status %lx)", + &DeviceName, Status); + _SEH2_LEAVE; + } + + Status = NtClose(LinkHandle); + LinkHandle = NULL; + if (! NT_SUCCESS(Status)) + { + DPRINT1("NtClose(%wZ) failed (Status %lx)", + &DeviceName, Status); + _SEH2_LEAVE; + } + } + + /* Don't create symlink if we don't have a target */ + if (! RequestLinkTarget || RequestLinkTarget->Length == 0) + _SEH2_LEAVE; + + if (AddHistory) + { + HistoryEntry = (PCSRSS_DOS_DEVICE_HISTORY_ENTRY) + RtlAllocateHeap(Win32CsrApiHeap, + HEAP_ZERO_MEMORY, + sizeof(CSRSS_DOS_DEVICE_HISTORY_ENTRY)); + if (! HistoryEntry) + { + DPRINT1("Failed to allocate memory\n"); + Status = STATUS_NO_MEMORY; + _SEH2_LEAVE; + } + + HistoryEntry->Target.Buffer = + RtlAllocateHeap(Win32CsrApiHeap, + HEAP_ZERO_MEMORY, + LinkTarget.Length); + if (! HistoryEntry->Target.Buffer) + { + DPRINT1("Failed to allocate memory\n"); + Status = STATUS_NO_MEMORY; + _SEH2_LEAVE; + } + HistoryEntry->Target.Length = + HistoryEntry->Target.MaximumLength = + LinkTarget.Length; + RtlCopyUnicodeString(&HistoryEntry->Target, + &LinkTarget); + + HistoryEntry->Device.Buffer = + RtlAllocateHeap(Win32CsrApiHeap, + HEAP_ZERO_MEMORY, + RequestDeviceName.Length); + if (! HistoryEntry->Device.Buffer) + { + DPRINT1("Failed to allocate memory\n"); + Status = STATUS_NO_MEMORY; + _SEH2_LEAVE; + } + HistoryEntry->Device.Length = + HistoryEntry->Device.MaximumLength = + RequestDeviceName.Length; + RtlCopyUnicodeString(&HistoryEntry->Device, + &RequestDeviceName); + + /* Remember previous symlink target for this device */ + InsertHeadList(ListHead, + &HistoryEntry->Entry); + HistoryEntry = NULL; + } + + RtlAllocateAndInitializeSid(&WorldAuthority, + 1, + SECURITY_WORLD_RID, + SECURITY_NULL_RID, + SECURITY_NULL_RID, + SECURITY_NULL_RID, + SECURITY_NULL_RID, + SECURITY_NULL_RID, + SECURITY_NULL_RID, + SECURITY_NULL_RID, + &WorldSid); + + RtlAllocateAndInitializeSid(&SystemAuthority, + 1, + SECURITY_LOCAL_SYSTEM_RID, + SECURITY_NULL_RID, + SECURITY_NULL_RID, + SECURITY_NULL_RID, + SECURITY_NULL_RID, + SECURITY_NULL_RID, + SECURITY_NULL_RID, + SECURITY_NULL_RID, + &SystemSid); + + RtlAllocateAndInitializeSid(&SystemAuthority, + 2, + SECURITY_BUILTIN_DOMAIN_RID, + DOMAIN_ALIAS_RID_ADMINS, + SECURITY_NULL_RID, + SECURITY_NULL_RID, + SECURITY_NULL_RID, + SECURITY_NULL_RID, + SECURITY_NULL_RID, + SECURITY_NULL_RID, + &AdminSid); + + SidLength = RtlLengthSid(SystemSid) + + RtlLengthSid(AdminSid) + + RtlLengthSid(WorldSid); + Length = sizeof(ACL) + SidLength + 3 * sizeof(ACCESS_ALLOWED_ACE); + + SecurityDescriptor = RtlAllocateHeap(Win32CsrApiHeap, + 0, + SECURITY_DESCRIPTOR_MIN_LENGTH + Length); + if (! SecurityDescriptor) + { + DPRINT1("Failed to allocate memory\n"); + Status = STATUS_NO_MEMORY; + _SEH2_LEAVE; + } + + Dacl = (PACL)((ULONG_PTR)SecurityDescriptor + SECURITY_DESCRIPTOR_MIN_LENGTH); + Status = RtlCreateSecurityDescriptor(SecurityDescriptor, + SECURITY_DESCRIPTOR_REVISION); + if (! NT_SUCCESS(Status)) + { + DPRINT1("RtlCreateSecurityDescriptor() failed (Status %lx)", + Status); + _SEH2_LEAVE; + } + + Status = RtlCreateAcl(Dacl, + Length, + ACL_REVISION); + if (! NT_SUCCESS(Status)) + { + DPRINT1("RtlCreateAcl() failed (Status %lx)", + Status); + _SEH2_LEAVE; + } + + (void) RtlAddAccessAllowedAce(Dacl, + ACL_REVISION, + GENERIC_ALL, + SystemSid); + (void) RtlAddAccessAllowedAce(Dacl, + ACL_REVISION, + GENERIC_ALL, + AdminSid); + (void) RtlAddAccessAllowedAce(Dacl, + ACL_REVISION, + STANDARD_RIGHTS_READ, + WorldSid); + + Status = RtlSetDaclSecurityDescriptor(SecurityDescriptor, + TRUE, + Dacl, + FALSE); + if (! NT_SUCCESS(Status)) + { + DPRINT1("RtlSetDaclSecurityDescriptor() failed (Status %lx)", + Status); + _SEH2_LEAVE; + } + + InitializeObjectAttributes(&ObjectAttributes, + &DeviceName, + OBJ_CASE_INSENSITIVE, + NULL, + SecurityDescriptor); + Status = NtCreateSymbolicLinkObject(&LinkHandle, + SYMBOLIC_LINK_ALL_ACCESS, + &ObjectAttributes, + RequestLinkTarget); + if (NT_SUCCESS(Status)) + { + Status = NtMakePermanentObject(LinkHandle); + if (! NT_SUCCESS(Status)) + { + DPRINT1("NtMakePermanentObject(%wZ) failed (Status %lx)", + &DeviceName, Status); + } + } + else + { + DPRINT1("NtCreateSymbolicLinkObject(%wZ) failed (Status %lx)", + &DeviceName, Status); + } + } + _SEH2_FINALLY + { + (void) RtlLeaveCriticalSection(&Win32CsrDefineDosDeviceCritSec); + if (DeviceName.Buffer) + (void) RtlFreeHeap(Win32CsrApiHeap, + 0, + DeviceName.Buffer); + if (LinkTarget.Buffer) + (void) RtlFreeHeap(Win32CsrApiHeap, + 0, + LinkTarget.Buffer); + if (SecurityDescriptor) + (void) RtlFreeHeap(Win32CsrApiHeap, + 0, + SecurityDescriptor); + if (LinkHandle) + (void) NtClose(LinkHandle); + if (SystemSid) + (void) RtlFreeSid(SystemSid); + if (AdminSid) + (void) RtlFreeSid(AdminSid); + if (WorldSid) + (void) RtlFreeSid(WorldSid); + RtlFreeUnicodeString(&RequestDeviceName); + if (HistoryEntry) + { + if (HistoryEntry->Target.Buffer) + (void) RtlFreeHeap(Win32CsrApiHeap, + 0, + HistoryEntry->Target.Buffer); + if (HistoryEntry->Device.Buffer) + (void) RtlFreeHeap(Win32CsrApiHeap, + 0, + HistoryEntry->Device.Buffer); + (void) RtlFreeHeap(Win32CsrApiHeap, + 0, + HistoryEntry); + } + } + _SEH2_END + + DPRINT("CsrDefineDosDevice Exit, Statux: 0x%x\n", Status); + return Status; +} + +void CsrCleanupDefineDosDevice() +{ + PLIST_ENTRY Entry, ListHead; + PCSRSS_DOS_DEVICE_HISTORY_ENTRY HistoryEntry; + + (void) RtlDeleteCriticalSection(&Win32CsrDefineDosDeviceCritSec); + + ListHead = &DosDeviceHistory; + Entry = ListHead->Flink; + while (Entry != ListHead) + { + HistoryEntry = (PCSRSS_DOS_DEVICE_HISTORY_ENTRY) + CONTAINING_RECORD(Entry, + CSRSS_DOS_DEVICE_HISTORY_ENTRY, + Entry); + Entry = Entry->Flink; + + if (HistoryEntry) + { + if (HistoryEntry->Target.Buffer) + (void) RtlFreeHeap(Win32CsrApiHeap, + 0, + HistoryEntry->Target.Buffer); + if (HistoryEntry->Device.Buffer) + (void) RtlFreeHeap(Win32CsrApiHeap, + 0, + HistoryEntry->Device.Buffer); + (void) RtlFreeHeap(Win32CsrApiHeap, + 0, + HistoryEntry); + } + } +} +/* EOF */ diff --git a/reactos/subsystems/win32/csrss/win32csr/file.h b/reactos/subsystems/win32/csrss/win32csr/file.h index c163ee53254..fa33b62efd2 100644 --- a/reactos/subsystems/win32/csrss/win32csr/file.h +++ b/reactos/subsystems/win32/csrss/win32csr/file.h @@ -11,7 +11,18 @@ #include "api.h" +typedef struct tagCSRSS_DOS_DEVICE_HISTORY_ENTRY +{ + UNICODE_STRING Device; + UNICODE_STRING Target; + LIST_ENTRY Entry; +} CSRSS_DOS_DEVICE_HISTORY_ENTRY, *PCSRSS_DOS_DEVICE_HISTORY_ENTRY; + /* Api functions */ CSR_API(CsrGetTempFile); +CSR_API(CsrDefineDosDevice); + +/* functions */ +void CsrCleanupDefineDosDevice(); /* EOF */ From d4a462fbad8ccde3a0565d7b252d912628f6aa89 Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Mon, 18 Apr 2011 21:56:44 +0000 Subject: [PATCH 173/317] [KERNEL32_WINETEST] - Sam Arun Raj Seeniraj: Added new test cases to QueryDosDevice(). Should be sent to Wine (tm). See issue #993 for more details. svn path=/trunk/; revision=51394 --- rostests/winetests/kernel32/CMakeLists.txt | 1 + rostests/winetests/kernel32/dosdev.c | 228 ++++++++++++++++++++ rostests/winetests/kernel32/kernel32.rbuild | 1 + rostests/winetests/kernel32/testlist.c | 2 + 4 files changed, 232 insertions(+) create mode 100644 rostests/winetests/kernel32/dosdev.c diff --git a/rostests/winetests/kernel32/CMakeLists.txt b/rostests/winetests/kernel32/CMakeLists.txt index 00f3fbb46ee..9ad88ff3862 100644 --- a/rostests/winetests/kernel32/CMakeLists.txt +++ b/rostests/winetests/kernel32/CMakeLists.txt @@ -40,6 +40,7 @@ list(APPEND SOURCE version.c virtual.c volume.c + dosdev.c testlist.c resource.rc) diff --git a/rostests/winetests/kernel32/dosdev.c b/rostests/winetests/kernel32/dosdev.c new file mode 100644 index 00000000000..50684da4200 --- /dev/null +++ b/rostests/winetests/kernel32/dosdev.c @@ -0,0 +1,228 @@ +/* + * Unit test suite for virtual substituted drive functions. + * + * Copyright 2011 Sam Arun Raj + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include + +#include "wine/test.h" +#include "windef.h" +#include "winbase.h" +#include "winerror.h" + +static void test_DefineDosDeviceA1(void) +{ + /* Test using lowercase drive letters */ + CHAR Target[MAX_PATH]; + CHAR Drive[] = "m:"; + BOOL Result; + + Result = DefineDosDeviceA(0, Drive, "C:\\temp"); + ok(Result, "Failed to subst drive using lowercase drive letter"); + + Result = DefineDosDeviceA(DDD_REMOVE_DEFINITION | DDD_EXACT_MATCH_ON_REMOVE, Drive, "C:\\temp"); + ok(Result, "Failed to remove subst drive using lowercase drive letter"); + + Result = QueryDosDeviceA(Drive, Target, MAX_PATH); + ok(!Result, "Subst drive is present even after remove attempt"); +} + +static void test_DefineDosDeviceA2(void) +{ + /* Test using trailing \ against drive letter */ + CHAR Target[MAX_PATH]; + CHAR Drive[] = "Q:\\"; + BOOL Result; + + Result = DefineDosDeviceA(0, Drive, "C:\\temp"); + ok(!Result, "Subst drive using trailing path seperator"); + + Result = DefineDosDeviceA(DDD_REMOVE_DEFINITION | DDD_EXACT_MATCH_ON_REMOVE, Drive, "C:\\temp"); + ok(!Result, "Subst drive using trailing path seperator"); + + Result = QueryDosDeviceA(Drive, Target, MAX_PATH); + ok(!Result, "Subst drive is present when it should not be created in the first place"); +} + +static void test_DefineDosDeviceA3(void) +{ + /* Test using arbitary string, not necessarily a DOS drive letter */ + CHAR Target[MAX_PATH]; + CHAR Drive[] = "!QHello:"; + BOOL Result; + + Result = DefineDosDeviceA(0, Drive, "C:\\temp"); + ok(Result, "Failed to subst drive using non-DOS drive name"); + + Result = DefineDosDeviceA(DDD_REMOVE_DEFINITION | DDD_EXACT_MATCH_ON_REMOVE, Drive, "C:\\temp"); + ok(Result, "Failed to subst drive using non-DOS drive name"); + + Result = QueryDosDeviceA(Drive, Target, MAX_PATH); + ok(!Result, "Subst drive is present even after remove attempt"); +} + +static void test_DefineDosDeviceA4(void) +{ + /* Test remove without using DDD_EXACT_MATCH_ON_REMOVE */ + CHAR Target[MAX_PATH]; + CHAR Drive[] = "M:"; + BOOL Result; + + Result = DefineDosDeviceA(0, Drive, "C:\\temp"); + ok(Result, "Failed to subst drive"); + + Result = DefineDosDeviceA(DDD_REMOVE_DEFINITION, Drive, NULL); + ok(Result, "Failed to remove subst drive using NULL Target name"); + + Result = QueryDosDeviceA(Drive, Target, MAX_PATH); + ok(!Result, "Subst drive is present even after remove attempt"); +} + +static void test_DefineDosDeviceA5(void) +{ + /* Test multiple adds and multiple removes in add order */ + CHAR Target[MAX_PATH]; + CHAR Drive[] = "M:"; + BOOL Result; + + Result = DefineDosDeviceA(0, Drive, "C:\\temp1"); + ok(Result, "Failed to subst drive"); + Result = DefineDosDeviceA(0, Drive, "C:\\temp2"); + ok(Result, "Failed to subst drive"); + Result = DefineDosDeviceA(0, Drive, "C:\\temp3"); + ok(Result, "Failed to subst drive"); + + Result = DefineDosDeviceA(DDD_REMOVE_DEFINITION | DDD_EXACT_MATCH_ON_REMOVE, Drive, "C:\\temp1"); + ok(Result, "Failed to remove subst drive"); + Result = QueryDosDeviceA(Drive, Target, MAX_PATH); + ok(Result, "Failed to query subst drive"); + if (Result) + ok((_stricmp(Target, "\\??\\C:\\temp3") == 0), "Subst drive is not pointing to correct target"); + + Result = DefineDosDeviceA(DDD_REMOVE_DEFINITION | DDD_EXACT_MATCH_ON_REMOVE, Drive, "C:\\temp2"); + ok(Result, "Failed to remove subst drive"); + Result = QueryDosDeviceA(Drive, Target, MAX_PATH); + ok(Result, "Failed to query subst drive"); + if (Result) + ok((_stricmp(Target, "\\??\\C:\\temp3") == 0), "Subst drive is not pointing to correct target"); + + Result = DefineDosDeviceA(DDD_REMOVE_DEFINITION | DDD_EXACT_MATCH_ON_REMOVE, Drive, "C:\\temp3"); + ok(Result, "Failed to remove subst drive"); + + Result = QueryDosDeviceA(Drive, Target, MAX_PATH); + ok(!Result, "Subst drive is present even after remove attempt"); +} + +static void test_DefineDosDeviceA6(void) +{ + /* Test multiple adds and multiple removes in reverse order */ + CHAR Target[MAX_PATH]; + CHAR Drive[] = "M:"; + BOOL Result; + + Result = DefineDosDeviceA(0, Drive, "C:\\temp1"); + ok(Result, "Failed to subst drive"); + Result = DefineDosDeviceA(0, Drive, "C:\\temp2"); + ok(Result, "Failed to subst drive"); + Result = DefineDosDeviceA(0, Drive, "C:\\temp3"); + ok(Result, "Failed to subst drive"); + + Result = DefineDosDeviceA(DDD_REMOVE_DEFINITION | DDD_EXACT_MATCH_ON_REMOVE, Drive, "C:\\temp3"); + ok(Result, "Failed to remove subst drive"); + Result = QueryDosDeviceA(Drive, Target, MAX_PATH); + ok(Result, "Failed to query subst drive"); + if (Result) + ok((_stricmp(Target, "\\??\\C:\\temp2") == 0), "Subst drive is not pointing to correct target"); + + Result = DefineDosDeviceA(DDD_REMOVE_DEFINITION | DDD_EXACT_MATCH_ON_REMOVE, Drive, "C:\\temp2"); + ok(Result, "Failed to remove subst drive"); + Result = QueryDosDeviceA(Drive, Target, MAX_PATH); + ok(Result, "Failed to query subst drive"); + if (Result) + ok((_stricmp(Target, "\\??\\C:\\temp1") == 0), "Subst drive is not pointing to correct target"); + + Result = DefineDosDeviceA(DDD_REMOVE_DEFINITION | DDD_EXACT_MATCH_ON_REMOVE, Drive, "C:\\temp1"); + ok(Result, "Failed to remove subst drive"); + + Result = QueryDosDeviceA(Drive, Target, MAX_PATH); + ok(!Result, "Subst drive is present even after remove attempt"); +} + +static void test_DefineDosDeviceA7(void) +{ + /* Test multiple adds and multiple removes out of order */ + CHAR Target[MAX_PATH]; + CHAR Drive[] = "M:"; + BOOL Result; + + Result = DefineDosDeviceA(0, Drive, "C:\\temp1"); + ok(Result, "Failed to subst drive"); + Result = DefineDosDeviceA(0, Drive, "C:\\temp2"); + ok(Result, "Failed to subst drive"); + Result = DefineDosDeviceA(0, Drive, "C:\\temp3"); + ok(Result, "Failed to subst drive"); + Result = DefineDosDeviceA(0, Drive, "C:\\temp4"); + ok(Result, "Failed to subst drive"); + Result = DefineDosDeviceA(0, Drive, "C:\\temp5"); + ok(Result, "Failed to subst drive"); + + Result = DefineDosDeviceA(DDD_REMOVE_DEFINITION | DDD_EXACT_MATCH_ON_REMOVE, Drive, "C:\\temp2"); + ok(Result, "Failed to remove subst drive"); + Result = QueryDosDeviceA(Drive, Target, MAX_PATH); + ok(Result, "Failed to query subst drive"); + if (Result) + ok((_stricmp(Target, "\\??\\C:\\temp5") == 0), "Subst drive is not pointing to correct target"); + + Result = DefineDosDeviceA(DDD_REMOVE_DEFINITION | DDD_EXACT_MATCH_ON_REMOVE, Drive, "C:\\temp5"); + ok(Result, "Failed to remove subst drive"); + Result = QueryDosDeviceA(Drive, Target, MAX_PATH); + ok(Result, "Failed to query subst drive"); + if (Result) + ok((_stricmp(Target, "\\??\\C:\\temp4") == 0), "Subst drive is not pointing to correct target"); + + Result = DefineDosDeviceA(DDD_REMOVE_DEFINITION | DDD_EXACT_MATCH_ON_REMOVE, Drive, "C:\\temp1"); + ok(Result, "Failed to remove subst drive"); + Result = QueryDosDeviceA(Drive, Target, MAX_PATH); + ok(Result, "Failed to query subst drive"); + if (Result) + ok((_stricmp(Target, "\\??\\C:\\temp4") == 0), "Subst drive is not pointing to correct target"); + + Result = DefineDosDeviceA(DDD_REMOVE_DEFINITION | DDD_EXACT_MATCH_ON_REMOVE, Drive, "C:\\temp3"); + ok(Result, "Failed to remove subst drive"); + Result = QueryDosDeviceA(Drive, Target, MAX_PATH); + ok(Result, "Failed to query subst drive"); + if (Result) + ok((_stricmp(Target, "\\??\\C:\\temp4") == 0), "Subst drive is not pointing to correct target"); + + Result = DefineDosDeviceA(DDD_REMOVE_DEFINITION | DDD_EXACT_MATCH_ON_REMOVE, Drive, "C:\\temp4"); + ok(Result, "Failed to remove subst drive"); + + Result = QueryDosDeviceA(Drive, Target, MAX_PATH); + ok(!Result, "Subst drive is present even after remove attempt"); +} + +START_TEST(dosdev) +{ + test_DefineDosDeviceA1(); + test_DefineDosDeviceA2(); + test_DefineDosDeviceA3(); + test_DefineDosDeviceA4(); + test_DefineDosDeviceA5(); + test_DefineDosDeviceA6(); + test_DefineDosDeviceA7(); +} diff --git a/rostests/winetests/kernel32/kernel32.rbuild b/rostests/winetests/kernel32/kernel32.rbuild index 1b87f4b5414..03e64f87615 100644 --- a/rostests/winetests/kernel32/kernel32.rbuild +++ b/rostests/winetests/kernel32/kernel32.rbuild @@ -40,6 +40,7 @@ version.c virtual.c volume.c + dosdev.c testlist.c resource.rc diff --git a/rostests/winetests/kernel32/testlist.c b/rostests/winetests/kernel32/testlist.c index 0102ea70159..0b8317136ba 100755 --- a/rostests/winetests/kernel32/testlist.c +++ b/rostests/winetests/kernel32/testlist.c @@ -42,6 +42,7 @@ extern void func_toolhelp(void); extern void func_virtual(void); extern void func_version(void); extern void func_volume(void); +extern void func_dosdev(void); const struct test winetest_testlist[] = { @@ -78,6 +79,7 @@ const struct test winetest_testlist[] = { "virtual", func_virtual }, { "version", func_version }, { "volume", func_volume }, + { "dosdev", func_dosdev }, { 0, 0 } }; From 27bd630de06ecb483639e7d9e3823f2e61d7deaf Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Mon, 18 Apr 2011 22:17:25 +0000 Subject: [PATCH 174/317] * Fix build. svn path=/trunk/; revision=51395 --- reactos/dll/win32/kernel32/file/dosdev.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/dll/win32/kernel32/file/dosdev.c b/reactos/dll/win32/kernel32/file/dosdev.c index 0d65a74140c..c94adbcfc12 100644 --- a/reactos/dll/win32/kernel32/file/dosdev.c +++ b/reactos/dll/win32/kernel32/file/dosdev.c @@ -14,7 +14,7 @@ #include #define NDEBUG #include -#include +#include DEBUG_CHANNEL(kernel32file); /* FUNCTIONS *****************************************************************/ From e3c5f3cdd8382e77364c48881ac893b8292e42d8 Mon Sep 17 00:00:00 2001 From: Gabriel Ilardi Date: Tue, 19 Apr 2011 07:59:23 +0000 Subject: [PATCH 175/317] [win32csr/file.c] Add missing new lines to some DPRINT1 svn path=/trunk/; revision=51399 --- reactos/subsystems/win32/csrss/win32csr/file.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/reactos/subsystems/win32/csrss/win32csr/file.c b/reactos/subsystems/win32/csrss/win32csr/file.c index 8a6ba73b3c7..862a01480f3 100644 --- a/reactos/subsystems/win32/csrss/win32csr/file.c +++ b/reactos/subsystems/win32/csrss/win32csr/file.c @@ -82,7 +82,7 @@ CSR_API(CsrDefineDosDevice) Status = RtlEnterCriticalSection(&Win32CsrDefineDosDeviceCritSec); if (! NT_SUCCESS(Status)) { - DPRINT1("RtlEnterCriticalSection() failed (Status %lx)", + DPRINT1("RtlEnterCriticalSection() failed (Status %lx)\n", Status); return Status; } @@ -149,7 +149,7 @@ CSR_API(CsrDefineDosDevice) if (! NT_SUCCESS(Status)) { - DPRINT1("NtQuerySymbolicLinkObject(%wZ) failed (Status %lx)", + DPRINT1("NtQuerySymbolicLinkObject(%wZ) failed (Status %lx)\n", &DeviceName, Status); _SEH2_LEAVE; } @@ -270,7 +270,7 @@ CSR_API(CsrDefineDosDevice) Status = NtMakeTemporaryObject(LinkHandle); if (! NT_SUCCESS(Status)) { - DPRINT1("NtMakeTemporaryObject(%wZ) failed (Status %lx)", + DPRINT1("NtMakeTemporaryObject(%wZ) failed (Status %lx)\n", &DeviceName, Status); _SEH2_LEAVE; } @@ -279,7 +279,7 @@ CSR_API(CsrDefineDosDevice) LinkHandle = NULL; if (! NT_SUCCESS(Status)) { - DPRINT1("NtClose(%wZ) failed (Status %lx)", + DPRINT1("NtClose(%wZ) failed (Status %lx)\n", &DeviceName, Status); _SEH2_LEAVE; } @@ -396,7 +396,7 @@ CSR_API(CsrDefineDosDevice) SECURITY_DESCRIPTOR_REVISION); if (! NT_SUCCESS(Status)) { - DPRINT1("RtlCreateSecurityDescriptor() failed (Status %lx)", + DPRINT1("RtlCreateSecurityDescriptor() failed (Status %lx)\n", Status); _SEH2_LEAVE; } @@ -406,7 +406,7 @@ CSR_API(CsrDefineDosDevice) ACL_REVISION); if (! NT_SUCCESS(Status)) { - DPRINT1("RtlCreateAcl() failed (Status %lx)", + DPRINT1("RtlCreateAcl() failed (Status %lx)\n", Status); _SEH2_LEAVE; } @@ -430,7 +430,7 @@ CSR_API(CsrDefineDosDevice) FALSE); if (! NT_SUCCESS(Status)) { - DPRINT1("RtlSetDaclSecurityDescriptor() failed (Status %lx)", + DPRINT1("RtlSetDaclSecurityDescriptor() failed (Status %lx)\n", Status); _SEH2_LEAVE; } @@ -449,13 +449,13 @@ CSR_API(CsrDefineDosDevice) Status = NtMakePermanentObject(LinkHandle); if (! NT_SUCCESS(Status)) { - DPRINT1("NtMakePermanentObject(%wZ) failed (Status %lx)", + DPRINT1("NtMakePermanentObject(%wZ) failed (Status %lx)\n", &DeviceName, Status); } } else { - DPRINT1("NtCreateSymbolicLinkObject(%wZ) failed (Status %lx)", + DPRINT1("NtCreateSymbolicLinkObject(%wZ) failed (Status %lx)\n", &DeviceName, Status); } } From dc2b96f14f8dc5b5c9265ad860a597fb8fb70fa6 Mon Sep 17 00:00:00 2001 From: Gabriel Ilardi Date: Tue, 19 Apr 2011 09:15:05 +0000 Subject: [PATCH 176/317] [winetests] Add new lines to test results for kernel32/dosdev.c svn path=/trunk/; revision=51400 --- rostests/winetests/kernel32/dosdev.c | 104 +++++++++++++-------------- 1 file changed, 52 insertions(+), 52 deletions(-) diff --git a/rostests/winetests/kernel32/dosdev.c b/rostests/winetests/kernel32/dosdev.c index 50684da4200..55bb9818ba6 100644 --- a/rostests/winetests/kernel32/dosdev.c +++ b/rostests/winetests/kernel32/dosdev.c @@ -33,13 +33,13 @@ static void test_DefineDosDeviceA1(void) BOOL Result; Result = DefineDosDeviceA(0, Drive, "C:\\temp"); - ok(Result, "Failed to subst drive using lowercase drive letter"); + ok(Result, "Failed to subst drive using lowercase drive letter\n"); Result = DefineDosDeviceA(DDD_REMOVE_DEFINITION | DDD_EXACT_MATCH_ON_REMOVE, Drive, "C:\\temp"); - ok(Result, "Failed to remove subst drive using lowercase drive letter"); + ok(Result, "Failed to remove subst drive using lowercase drive letter\n"); Result = QueryDosDeviceA(Drive, Target, MAX_PATH); - ok(!Result, "Subst drive is present even after remove attempt"); + ok(!Result, "Subst drive is present even after remove attempt\n"); } static void test_DefineDosDeviceA2(void) @@ -50,13 +50,13 @@ static void test_DefineDosDeviceA2(void) BOOL Result; Result = DefineDosDeviceA(0, Drive, "C:\\temp"); - ok(!Result, "Subst drive using trailing path seperator"); + ok(!Result, "Subst drive using trailing path seperator\n"); Result = DefineDosDeviceA(DDD_REMOVE_DEFINITION | DDD_EXACT_MATCH_ON_REMOVE, Drive, "C:\\temp"); - ok(!Result, "Subst drive using trailing path seperator"); + ok(!Result, "Subst drive using trailing path seperator\n"); Result = QueryDosDeviceA(Drive, Target, MAX_PATH); - ok(!Result, "Subst drive is present when it should not be created in the first place"); + ok(!Result, "Subst drive is present when it should not be created in the first place\n"); } static void test_DefineDosDeviceA3(void) @@ -67,13 +67,13 @@ static void test_DefineDosDeviceA3(void) BOOL Result; Result = DefineDosDeviceA(0, Drive, "C:\\temp"); - ok(Result, "Failed to subst drive using non-DOS drive name"); + ok(Result, "Failed to subst drive using non-DOS drive name\n"); Result = DefineDosDeviceA(DDD_REMOVE_DEFINITION | DDD_EXACT_MATCH_ON_REMOVE, Drive, "C:\\temp"); - ok(Result, "Failed to subst drive using non-DOS drive name"); + ok(Result, "Failed to subst drive using non-DOS drive name\n"); Result = QueryDosDeviceA(Drive, Target, MAX_PATH); - ok(!Result, "Subst drive is present even after remove attempt"); + ok(!Result, "Subst drive is present even after remove attempt\n"); } static void test_DefineDosDeviceA4(void) @@ -84,13 +84,13 @@ static void test_DefineDosDeviceA4(void) BOOL Result; Result = DefineDosDeviceA(0, Drive, "C:\\temp"); - ok(Result, "Failed to subst drive"); + ok(Result, "Failed to subst drive\n"); Result = DefineDosDeviceA(DDD_REMOVE_DEFINITION, Drive, NULL); - ok(Result, "Failed to remove subst drive using NULL Target name"); + ok(Result, "Failed to remove subst drive using NULL Target name\n"); Result = QueryDosDeviceA(Drive, Target, MAX_PATH); - ok(!Result, "Subst drive is present even after remove attempt"); + ok(!Result, "Subst drive is present even after remove attempt\n"); } static void test_DefineDosDeviceA5(void) @@ -101,31 +101,31 @@ static void test_DefineDosDeviceA5(void) BOOL Result; Result = DefineDosDeviceA(0, Drive, "C:\\temp1"); - ok(Result, "Failed to subst drive"); + ok(Result, "Failed to subst drive\n"); Result = DefineDosDeviceA(0, Drive, "C:\\temp2"); - ok(Result, "Failed to subst drive"); + ok(Result, "Failed to subst drive\n"); Result = DefineDosDeviceA(0, Drive, "C:\\temp3"); - ok(Result, "Failed to subst drive"); + ok(Result, "Failed to subst drive\n"); Result = DefineDosDeviceA(DDD_REMOVE_DEFINITION | DDD_EXACT_MATCH_ON_REMOVE, Drive, "C:\\temp1"); - ok(Result, "Failed to remove subst drive"); + ok(Result, "Failed to remove subst drive\n"); Result = QueryDosDeviceA(Drive, Target, MAX_PATH); - ok(Result, "Failed to query subst drive"); + ok(Result, "Failed to query subst drive\n"); if (Result) - ok((_stricmp(Target, "\\??\\C:\\temp3") == 0), "Subst drive is not pointing to correct target"); + ok((_stricmp(Target, "\\??\\C:\\temp3") == 0), "Subst drive is not pointing to correct target\n"); Result = DefineDosDeviceA(DDD_REMOVE_DEFINITION | DDD_EXACT_MATCH_ON_REMOVE, Drive, "C:\\temp2"); - ok(Result, "Failed to remove subst drive"); + ok(Result, "Failed to remove subst drive\n"); Result = QueryDosDeviceA(Drive, Target, MAX_PATH); - ok(Result, "Failed to query subst drive"); + ok(Result, "Failed to query subst drive\n"); if (Result) - ok((_stricmp(Target, "\\??\\C:\\temp3") == 0), "Subst drive is not pointing to correct target"); + ok((_stricmp(Target, "\\??\\C:\\temp3") == 0), "Subst drive is not pointing to correct target\n"); Result = DefineDosDeviceA(DDD_REMOVE_DEFINITION | DDD_EXACT_MATCH_ON_REMOVE, Drive, "C:\\temp3"); - ok(Result, "Failed to remove subst drive"); + ok(Result, "Failed to remove subst drive\n"); Result = QueryDosDeviceA(Drive, Target, MAX_PATH); - ok(!Result, "Subst drive is present even after remove attempt"); + ok(!Result, "Subst drive is present even after remove attempt\n"); } static void test_DefineDosDeviceA6(void) @@ -136,31 +136,31 @@ static void test_DefineDosDeviceA6(void) BOOL Result; Result = DefineDosDeviceA(0, Drive, "C:\\temp1"); - ok(Result, "Failed to subst drive"); + ok(Result, "Failed to subst drive\n"); Result = DefineDosDeviceA(0, Drive, "C:\\temp2"); - ok(Result, "Failed to subst drive"); + ok(Result, "Failed to subst drive\n"); Result = DefineDosDeviceA(0, Drive, "C:\\temp3"); - ok(Result, "Failed to subst drive"); + ok(Result, "Failed to subst drive\n"); Result = DefineDosDeviceA(DDD_REMOVE_DEFINITION | DDD_EXACT_MATCH_ON_REMOVE, Drive, "C:\\temp3"); - ok(Result, "Failed to remove subst drive"); + ok(Result, "Failed to remove subst drive\n"); Result = QueryDosDeviceA(Drive, Target, MAX_PATH); - ok(Result, "Failed to query subst drive"); + ok(Result, "Failed to query subst drive\n"); if (Result) - ok((_stricmp(Target, "\\??\\C:\\temp2") == 0), "Subst drive is not pointing to correct target"); + ok((_stricmp(Target, "\\??\\C:\\temp2") == 0), "Subst drive is not pointing to correct target\n"); Result = DefineDosDeviceA(DDD_REMOVE_DEFINITION | DDD_EXACT_MATCH_ON_REMOVE, Drive, "C:\\temp2"); - ok(Result, "Failed to remove subst drive"); + ok(Result, "Failed to remove subst drive\n"); Result = QueryDosDeviceA(Drive, Target, MAX_PATH); - ok(Result, "Failed to query subst drive"); + ok(Result, "Failed to query subst drive\n"); if (Result) - ok((_stricmp(Target, "\\??\\C:\\temp1") == 0), "Subst drive is not pointing to correct target"); + ok((_stricmp(Target, "\\??\\C:\\temp1") == 0), "Subst drive is not pointing to correct target\n"); Result = DefineDosDeviceA(DDD_REMOVE_DEFINITION | DDD_EXACT_MATCH_ON_REMOVE, Drive, "C:\\temp1"); - ok(Result, "Failed to remove subst drive"); + ok(Result, "Failed to remove subst drive\n"); Result = QueryDosDeviceA(Drive, Target, MAX_PATH); - ok(!Result, "Subst drive is present even after remove attempt"); + ok(!Result, "Subst drive is present even after remove attempt\n"); } static void test_DefineDosDeviceA7(void) @@ -171,49 +171,49 @@ static void test_DefineDosDeviceA7(void) BOOL Result; Result = DefineDosDeviceA(0, Drive, "C:\\temp1"); - ok(Result, "Failed to subst drive"); + ok(Result, "Failed to subst drive\n"); Result = DefineDosDeviceA(0, Drive, "C:\\temp2"); - ok(Result, "Failed to subst drive"); + ok(Result, "Failed to subst drive\n"); Result = DefineDosDeviceA(0, Drive, "C:\\temp3"); - ok(Result, "Failed to subst drive"); + ok(Result, "Failed to subst drive\n"); Result = DefineDosDeviceA(0, Drive, "C:\\temp4"); - ok(Result, "Failed to subst drive"); + ok(Result, "Failed to subst drive\n"); Result = DefineDosDeviceA(0, Drive, "C:\\temp5"); - ok(Result, "Failed to subst drive"); + ok(Result, "Failed to subst drive\n"); Result = DefineDosDeviceA(DDD_REMOVE_DEFINITION | DDD_EXACT_MATCH_ON_REMOVE, Drive, "C:\\temp2"); - ok(Result, "Failed to remove subst drive"); + ok(Result, "Failed to remove subst drive\n"); Result = QueryDosDeviceA(Drive, Target, MAX_PATH); - ok(Result, "Failed to query subst drive"); + ok(Result, "Failed to query subst drive\n"); if (Result) - ok((_stricmp(Target, "\\??\\C:\\temp5") == 0), "Subst drive is not pointing to correct target"); + ok((_stricmp(Target, "\\??\\C:\\temp5") == 0), "Subst drive is not pointing to correct target\n"); Result = DefineDosDeviceA(DDD_REMOVE_DEFINITION | DDD_EXACT_MATCH_ON_REMOVE, Drive, "C:\\temp5"); - ok(Result, "Failed to remove subst drive"); + ok(Result, "Failed to remove subst drive\n"); Result = QueryDosDeviceA(Drive, Target, MAX_PATH); - ok(Result, "Failed to query subst drive"); + ok(Result, "Failed to query subst drive\n"); if (Result) - ok((_stricmp(Target, "\\??\\C:\\temp4") == 0), "Subst drive is not pointing to correct target"); + ok((_stricmp(Target, "\\??\\C:\\temp4") == 0), "Subst drive is not pointing to correct target\n"); Result = DefineDosDeviceA(DDD_REMOVE_DEFINITION | DDD_EXACT_MATCH_ON_REMOVE, Drive, "C:\\temp1"); - ok(Result, "Failed to remove subst drive"); + ok(Result, "Failed to remove subst drive\n"); Result = QueryDosDeviceA(Drive, Target, MAX_PATH); - ok(Result, "Failed to query subst drive"); + ok(Result, "Failed to query subst drive\n"); if (Result) - ok((_stricmp(Target, "\\??\\C:\\temp4") == 0), "Subst drive is not pointing to correct target"); + ok((_stricmp(Target, "\\??\\C:\\temp4") == 0), "Subst drive is not pointing to correct target\n"); Result = DefineDosDeviceA(DDD_REMOVE_DEFINITION | DDD_EXACT_MATCH_ON_REMOVE, Drive, "C:\\temp3"); - ok(Result, "Failed to remove subst drive"); + ok(Result, "Failed to remove subst drive\n"); Result = QueryDosDeviceA(Drive, Target, MAX_PATH); - ok(Result, "Failed to query subst drive"); + ok(Result, "Failed to query subst drive\n"); if (Result) ok((_stricmp(Target, "\\??\\C:\\temp4") == 0), "Subst drive is not pointing to correct target"); Result = DefineDosDeviceA(DDD_REMOVE_DEFINITION | DDD_EXACT_MATCH_ON_REMOVE, Drive, "C:\\temp4"); - ok(Result, "Failed to remove subst drive"); + ok(Result, "Failed to remove subst drive\n"); Result = QueryDosDeviceA(Drive, Target, MAX_PATH); - ok(!Result, "Subst drive is present even after remove attempt"); + ok(!Result, "Subst drive is present even after remove attempt\n"); } START_TEST(dosdev) From b307a60502207da54293d963c48e9d8d5581209b Mon Sep 17 00:00:00 2001 From: James Tabor Date: Tue, 19 Apr 2011 17:18:05 +0000 Subject: [PATCH 177/317] [Win32k] - Replace patch point for forced DC removal. See bug 6119. svn path=/trunk/; revision=51403 --- reactos/subsystems/win32/win32k/objects/gdiobj.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/reactos/subsystems/win32/win32k/objects/gdiobj.c b/reactos/subsystems/win32/win32k/objects/gdiobj.c index 6c6be35895c..a6d470a5aa2 100644 --- a/reactos/subsystems/win32/win32k/objects/gdiobj.c +++ b/reactos/subsystems/win32/win32k/objects/gdiobj.c @@ -868,6 +868,10 @@ GreDeleteObject(HGDIOBJ hObject) Entry->UserData = NULL; } break; + + case GDI_OBJECT_TYPE_DC: +// DC_FreeDcAttr(hObject); + break; } return NULL != hObject From 81a19f5ad53607e81ef7708de43c2924c9086e4e Mon Sep 17 00:00:00 2001 From: James Tabor Date: Tue, 19 Apr 2011 18:18:19 +0000 Subject: [PATCH 178/317] [Win32k] - This should fix the dcattr leaked when deleting a DC, See bug 6119. svn path=/trunk/; revision=51405 --- reactos/subsystems/win32/win32k/objects/dclife.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/reactos/subsystems/win32/win32k/objects/dclife.c b/reactos/subsystems/win32/win32k/objects/dclife.c index b83c6f039fd..d0c86c88c3a 100644 --- a/reactos/subsystems/win32/win32k/objects/dclife.c +++ b/reactos/subsystems/win32/win32k/objects/dclife.c @@ -827,6 +827,8 @@ IntGdiDeleteDC(HDC hDC, BOOL Force) if (!IsObjectDead(hDC)) { + DC_vFreeDcAttr(DCToDelete); // Plug a leak see bug 6119! + if (!GDIOBJ_FreeObjByHandle(hDC, GDI_OBJECT_TYPE_DC)) { DPRINT1("DC_FreeDC failed\n"); From a75c77dfa72ca828f1c691f134bb17ebe52dfb3f Mon Sep 17 00:00:00 2001 From: James Tabor Date: Wed, 20 Apr 2011 04:55:08 +0000 Subject: [PATCH 179/317] [Unicows] - Import wine unicows for Adobe Reader 7.1.0. See bug 5560. svn path=/trunk/; revision=51408 --- reactos/dll/win32/unicows/unicows.rbuild | 18 + reactos/dll/win32/unicows/unicows.spec | 507 +++++++++++++++++++++++ reactos/dll/win32/win32.rbuild | 3 + 3 files changed, 528 insertions(+) create mode 100644 reactos/dll/win32/unicows/unicows.rbuild create mode 100644 reactos/dll/win32/unicows/unicows.spec diff --git a/reactos/dll/win32/unicows/unicows.rbuild b/reactos/dll/win32/unicows/unicows.rbuild new file mode 100644 index 00000000000..8b1acd1d351 --- /dev/null +++ b/reactos/dll/win32/unicows/unicows.rbuild @@ -0,0 +1,18 @@ + + + avicap32 + msvfw32 + oledlg + comdlg32 + shell32 + winmm + winspool + rasapi32 + secur32 + sensapi + version + user32 + mpr + gdi32 + advapi32 + diff --git a/reactos/dll/win32/unicows/unicows.spec b/reactos/dll/win32/unicows/unicows.spec new file mode 100644 index 00000000000..47ba26fdda0 --- /dev/null +++ b/reactos/dll/win32/unicows/unicows.spec @@ -0,0 +1,507 @@ +@ stdcall AcquireCredentialsHandleW(wstr wstr long ptr ptr ptr ptr ptr ptr) +@ stdcall AddAtomW(wstr) +@ stdcall AddFontResourceW(wstr) +@ stdcall AddJobW(long long ptr long ptr) +@ stdcall AddMonitorW(wstr long ptr) +@ stdcall AddPortW(wstr long wstr) +@ stdcall AddPrintProcessorW(wstr wstr wstr wstr) +@ stdcall AddPrintProvidorW(wstr long ptr) +@ stdcall AddPrinterDriverW(wstr long ptr) +@ stdcall AddPrinterW(wstr long ptr) +@ stdcall AdvancedDocumentPropertiesW(long long wstr ptr ptr) +@ stdcall AppendMenuW(long long long ptr) +@ stdcall BeginUpdateResourceA(str long) +@ stdcall BeginUpdateResourceW(wstr long) +@ stdcall BroadcastSystemMessageW(long ptr long long long) +@ stdcall BuildCommDCBAndTimeoutsW(wstr ptr ptr) +@ stdcall BuildCommDCBW(wstr ptr) +@ stdcall CallMsgFilterW(ptr long) +@ stdcall CallNamedPipeW(wstr ptr long ptr long ptr long) +@ stdcall CallWindowProcA(ptr long long long long) +@ stdcall CallWindowProcW(ptr long long long long) +@ stdcall ChangeDisplaySettingsExW(wstr ptr long long ptr) +@ stdcall ChangeDisplaySettingsW(ptr long) +@ stdcall ChangeMenuW(long long ptr long long) +@ stdcall CharLowerBuffW(wstr long) +@ stdcall CharLowerW(wstr) +@ stdcall CharNextW(wstr) +@ stdcall CharPrevW(wstr wstr) +@ stdcall CharToOemBuffW(wstr ptr long) +@ stdcall CharToOemW(wstr ptr) +@ stdcall CharUpperBuffW(wstr long) +@ stdcall CharUpperW(wstr) +@ stdcall ChooseColorW(ptr) +@ stdcall ChooseFontW(ptr) +@ stdcall CommConfigDialogW(wstr long ptr) +@ stdcall CompareStringW(long long wstr long wstr long) +@ stdcall ConfigurePortW(wstr long wstr) +@ stdcall CopyAcceleratorTableW(long ptr long) +@ stdcall CopyEnhMetaFileW(long wstr) +@ stdcall CopyFileExW (wstr wstr ptr ptr ptr long) +@ stdcall CopyFileW(wstr wstr long) +@ stdcall CopyMetaFileW(long wstr) +@ stdcall CreateAcceleratorTableW(ptr long) +@ stdcall CreateColorSpaceW(ptr) +@ stdcall CreateDCW(wstr wstr wstr ptr) +@ stdcall CreateDialogIndirectParamW(long ptr long ptr long) +@ stdcall CreateDialogParamW(long ptr long ptr long) +@ stdcall CreateDirectoryExW(wstr wstr ptr) +@ stdcall CreateDirectoryW(wstr ptr) +@ stdcall CreateEnhMetaFileW(long wstr ptr wstr) +@ stdcall CreateEventW(ptr long long wstr) +@ stdcall CreateFileMappingW(long ptr long long long wstr) +@ stdcall CreateFileW(wstr long long ptr long long long) +@ stdcall CreateFontIndirectW(ptr) +@ stdcall CreateFontW(long long long long long long long long long long long long long wstr) +@ stdcall CreateICW(wstr wstr wstr ptr) +@ stdcall CreateMDIWindowW(ptr ptr long long long long long long long long) +@ stdcall CreateMailslotW(ptr long long ptr) +@ stdcall CreateMetaFileW(wstr) +@ stdcall CreateMutexW(ptr long wstr) +@ stdcall CreateNamedPipeW(wstr long long long long long long ptr) +@ stdcall CreateProcessW(wstr wstr ptr ptr long long ptr wstr ptr ptr) +@ stdcall CreateScalableFontResourceW(long wstr wstr wstr) +@ stdcall CreateSemaphoreW(ptr long long wstr) +@ stub CreateStdAccessibleProxyW +@ stdcall CreateWaitableTimerW(ptr long wstr) +@ stdcall CreateWindowExW(long wstr wstr long long long long long long long long ptr) +@ stdcall CryptAcquireContextW(ptr wstr wstr long long) +@ stdcall CryptEnumProviderTypesW(long ptr long ptr ptr ptr) +@ stdcall CryptEnumProvidersW(long ptr long ptr ptr ptr) +@ stdcall CryptGetDefaultProviderW(long ptr long ptr ptr) +@ stdcall CryptSetProviderExW(wstr long ptr long) +@ stdcall CryptSetProviderW(wstr long) +@ stdcall CryptSignHashW(long long ptr long ptr ptr) +@ stdcall CryptVerifySignatureW(long ptr long long ptr long) +@ stdcall DdeConnect(long long long ptr) +@ stdcall DdeConnectList(long long long long ptr) +@ stdcall DdeCreateStringHandleW(long ptr long) +@ stdcall DdeInitializeW(ptr ptr long long) +@ stdcall DdeQueryConvInfo(long long ptr) +@ stdcall DdeQueryStringW(long long ptr long long) +@ stdcall DefDlgProcW(long long long long) +@ stdcall DefFrameProcW(long long long long long) +@ stdcall DefMDIChildProcW(long long long long) +@ stdcall DefWindowProcW(long long long long) +@ stdcall DeleteFileW(wstr) +@ stdcall DeleteMonitorW(wstr wstr wstr) +@ stdcall DeletePortW(wstr long wstr) +@ stdcall DeletePrintProcessorW(wstr wstr wstr) +@ stdcall DeletePrintProvidorW(wstr wstr wstr) +@ stdcall DeletePrinterDriverW(wstr wstr wstr) +@ stdcall DeviceCapabilitiesW(wstr wstr long wstr ptr) +@ stdcall DialogBoxIndirectParamW(long ptr long ptr long) +@ stdcall DialogBoxParamW(long wstr long ptr long) +@ stdcall DispatchMessageW(ptr) +@ stdcall DlgDirListComboBoxW(long ptr long long long) +@ stdcall DlgDirListW(long wstr long long long) +@ stdcall DlgDirSelectComboBoxExW(long ptr long long) +@ stdcall DlgDirSelectExW(long ptr long long) +@ stdcall DocumentPropertiesW(long long ptr ptr ptr long) +@ stdcall DragQueryFileW(long long ptr long) +@ stdcall DrawStateW(long long ptr long long long long long long long) +@ stdcall DrawTextExW(long wstr long ptr long ptr) +@ stdcall DrawTextW(long wstr long ptr long) +@ stdcall EnableWindow(long long) +@ stdcall EndUpdateResourceA(long long) +@ stdcall EndUpdateResourceW(long long) +@ stdcall EnumCalendarInfoExW(ptr long long long) +@ stdcall EnumCalendarInfoW(ptr long long long) +@ stdcall EnumClipboardFormats(long) +@ stdcall EnumDateFormatsExW(ptr long long) +@ stdcall EnumDateFormatsW(ptr long long) +@ stdcall EnumDisplayDevicesW(ptr long ptr long) +@ stdcall EnumDisplaySettingsExW(wstr long ptr long) +@ stdcall EnumDisplaySettingsW(wstr long ptr ) +@ stdcall EnumFontFamiliesExW(long ptr ptr long long) +@ stdcall EnumFontFamiliesW(long wstr ptr long) +@ stdcall EnumFontsW(long wstr ptr long) +@ stdcall EnumICMProfilesW(long ptr long) +@ stdcall EnumMonitorsW(wstr long ptr long long long) +@ stdcall EnumPortsW(wstr long ptr long ptr ptr) +@ stdcall EnumPrintProcessorDatatypesW(wstr wstr long ptr long ptr ptr) +@ stdcall EnumPrintProcessorsW(wstr wstr long ptr long ptr ptr) +@ stdcall EnumPrinterDriversW(wstr wstr long ptr long ptr ptr) +@ stdcall EnumPrintersW(long ptr long ptr long ptr ptr) +@ stdcall EnumPropsA(long ptr) +@ stdcall EnumPropsExA(long ptr long) +@ stdcall EnumPropsExW(long ptr long) +@ stdcall EnumPropsW(long ptr) +@ stdcall EnumSystemCodePagesW(ptr long) +@ stdcall EnumSystemLocalesW(ptr long) +@ stdcall EnumTimeFormatsW(ptr long long) +@ stdcall EnumerateSecurityPackagesW(ptr ptr) +@ stdcall ExpandEnvironmentStringsW(wstr ptr long) +@ stdcall ExtTextOutW(long long long long ptr wstr long ptr) +@ stdcall ExtractIconExW(wstr long ptr ptr long) +@ stdcall ExtractIconW(long wstr long) +@ stdcall FatalAppExitW(long wstr) +@ stdcall FillConsoleOutputCharacterW(long long long long ptr) +@ stdcall FindAtomW(wstr) +@ stdcall FindExecutableW(wstr wstr wstr) +@ stdcall FindFirstChangeNotificationW(wstr long long) +@ stdcall FindFirstFileW(wstr ptr) +@ stdcall FindNextFileW(long ptr) +@ stdcall FindResourceExW(long wstr wstr long) +@ stdcall FindResourceW(long wstr wstr) +@ stdcall FindTextW(ptr) +@ stdcall FindWindowExW(long long wstr wstr) +@ stdcall FindWindowW(wstr wstr) +@ stdcall FormatMessageW(long ptr long long ptr long ptr) +@ stdcall FreeContextBuffer(ptr) +@ stdcall FreeEnvironmentStringsW(ptr) +@ stdcall GetAltTabInfoW(long long ptr ptr long) +@ stdcall GetAtomNameW(long ptr long) +@ stdcall GetCPInfo(long ptr) +@ stdcall GetCPInfoExW(long long ptr) +@ stdcall GetCalendarInfoW(long long long ptr long ptr) +@ stdcall GetCharABCWidthsFloatW(long long long ptr) +@ stdcall GetCharABCWidthsW(long long long ptr) +@ stdcall GetCharWidth32W(long long long long) +@ stdcall GetCharWidthFloatW(long long long ptr) +@ stdcall GetCharWidthW(long long long long) +@ stdcall GetCharacterPlacementW(long wstr long long ptr long) +@ stdcall GetClassInfoExW(long wstr ptr) +@ stdcall GetClassInfoW(long wstr ptr) +@ stdcall GetClassLongW(long long) +@ stdcall GetClassNameW(long ptr long) +@ stdcall GetClipboardData(long) +@ stdcall GetClipboardFormatNameW(long ptr long) +@ stdcall GetComputerNameW(ptr ptr) +@ stdcall GetConsoleTitleW(ptr long) +@ stdcall GetCurrencyFormatW(long long str ptr str long) +@ stdcall GetCurrentDirectoryW(long ptr) +@ stdcall GetCurrentHwProfileW(ptr) +@ stdcall GetDateFormatW(long long ptr wstr ptr long) +@ stdcall GetDefaultCommConfigW(wstr ptr long) +@ stdcall GetDiskFreeSpaceExW (wstr ptr ptr ptr) +@ stdcall GetDiskFreeSpaceW(wstr ptr ptr ptr ptr) +@ stdcall GetDlgItemTextW(long long ptr long) +@ stdcall GetDriveTypeW(wstr) +@ stdcall GetEnhMetaFileDescriptionW(long long ptr) +@ stdcall GetEnhMetaFileW(wstr) +@ stdcall GetEnvironmentStringsW() +@ stdcall GetEnvironmentVariableW(wstr ptr long) +@ stdcall GetFileAttributesExW(wstr long ptr) +@ stdcall GetFileAttributesW(wstr) +@ stdcall GetFileTitleW(wstr ptr long) +@ stdcall GetFileVersionInfoSizeW(wstr ptr) +@ stdcall GetFileVersionInfoW(wstr long long ptr) +@ stdcall GetFullPathNameW(wstr long ptr ptr) +@ stdcall GetGlyphOutlineW(long long long ptr long ptr ptr) +@ stdcall GetICMProfileW(long ptr wstr) +@ stdcall GetJobW(long long long ptr long ptr) +@ stdcall GetKerningPairsW(long long ptr) +@ stdcall GetKeyNameTextW(long ptr long) +@ stdcall GetKeyboardLayoutNameW(ptr) +@ stdcall GetLocaleInfoW(long long ptr long) +@ stdcall GetLogColorSpaceW(long ptr long) +@ stdcall GetLogicalDriveStringsW(long ptr) +@ stdcall GetLongPathNameW (wstr long long) +@ stdcall GetMenuItemInfoW(long long long ptr) +@ stdcall GetMenuStringW(long long ptr long long) +@ stdcall GetMessageW(ptr long long long) +@ stdcall GetMetaFileW(wstr) +@ stdcall GetModuleFileNameW(long ptr long) +@ stdcall GetModuleHandleW(wstr) +@ stdcall GetMonitorInfoW(long ptr) +@ stdcall GetNamedPipeHandleStateW(long ptr ptr ptr ptr wstr long) +@ stdcall GetNumberFormatW(long long wstr ptr ptr long) +@ stdcall GetObjectW(long long ptr) +@ stdcall GetOpenFileNamePreviewW(ptr) +@ stdcall GetOpenFileNameW(ptr) +@ stdcall GetOutlineTextMetricsW(long long ptr) +@ stdcall GetPrintProcessorDirectoryW(wstr wstr long ptr long ptr) +@ stdcall GetPrinterDataW(long wstr ptr ptr long ptr) +@ stdcall GetPrinterDriverDirectoryW(wstr wstr long ptr long ptr) +@ stdcall GetPrinterDriverW(long str long ptr long ptr) +@ stdcall GetPrinterW(long long ptr long ptr) +@ stdcall GetPrivateProfileIntW(wstr wstr long wstr) +@ stdcall GetPrivateProfileSectionNamesW(ptr long wstr) +@ stdcall GetPrivateProfileSectionW(wstr ptr long wstr) +@ stdcall GetPrivateProfileStringW(wstr wstr wstr ptr long wstr) +@ stdcall GetPrivateProfileStructW(wstr wstr ptr long wstr) +@ stdcall GetProcAddress(long str) +@ stdcall GetProfileIntW(wstr wstr long) +@ stdcall GetProfileSectionW(wstr ptr long) +@ stdcall GetProfileStringW(wstr wstr wstr ptr long) +@ stdcall GetPropA(long str) +@ stdcall GetPropW(long wstr) +@ stub GetRoleTextW +@ stdcall GetSaveFileNamePreviewW(ptr) +@ stdcall GetSaveFileNameW(ptr) +@ stdcall GetShortPathNameW(wstr ptr long) +@ stdcall GetStartupInfoW(ptr) +@ stub GetStateTextW +@ stdcall GetStringTypeExW(long long wstr long ptr) +@ stdcall GetStringTypeW(long wstr long ptr) +@ stdcall GetSystemDirectoryW(ptr long) +@ stdcall GetSystemWindowsDirectoryW(ptr long) +@ stdcall GetTabbedTextExtentW(long wstr long long ptr) +@ stdcall GetTempFileNameW(wstr wstr long ptr) +@ stdcall GetTempPathW(long ptr) +@ stdcall GetTextExtentExPointW(long wstr long long ptr ptr ptr) +@ stdcall GetTextExtentPoint32W(long wstr long ptr) +@ stdcall GetTextExtentPointW(long wstr long ptr) +@ stdcall GetTextFaceW(long long ptr) +@ stdcall GetTextMetricsW(long ptr) +@ stdcall GetTimeFormatW(long long ptr wstr ptr long) +@ stdcall GetUserNameW(ptr ptr) +@ stdcall GetVersionExW(ptr) +@ stdcall GetVolumeInformationW(wstr ptr long ptr ptr ptr ptr long) +@ stdcall GetWindowLongA(long long) +@ stdcall GetWindowLongW(long long) +@ stdcall GetWindowModuleFileNameW(long ptr long) +@ stdcall GetWindowTextLengthW(long) +@ stdcall GetWindowTextW(long ptr long) +@ stdcall GetWindowsDirectoryW(ptr long) +@ stdcall GlobalAddAtomW(wstr) +@ stdcall GlobalFindAtomW(wstr) +@ stdcall GlobalGetAtomNameW(long ptr long) +@ stdcall GrayStringW(long long ptr long long long long long long) +@ stdcall InitSecurityInterfaceW() +@ stdcall InitializeSecurityContextW(ptr ptr wstr long long long ptr long ptr ptr ptr ptr) +@ stdcall InsertMenuItemW(long long long ptr) +@ stdcall InsertMenuW(long long long long ptr) +@ stdcall IsBadStringPtrW(ptr long) +@ stdcall IsCharAlphaNumericW(long) +@ stdcall IsCharAlphaW(long) +@ stdcall IsCharLowerW(long) +@ stdcall IsCharUpperW(long) +@ stdcall IsClipboardFormatAvailable(long) +@ stdcall IsDestinationReachableW(wstr ptr) +@ stdcall IsDialogMessageW(long ptr) +@ stdcall IsTextUnicode(ptr long ptr) +@ stdcall IsValidCodePage(long) +@ stdcall IsWindowUnicode(long) +@ stdcall LCMapStringW(long long wstr long ptr long) +@ stdcall LoadAcceleratorsW(long wstr) +@ stdcall LoadBitmapW(long wstr) +@ stdcall LoadCursorFromFileW(wstr) +@ stdcall LoadCursorW(long wstr) +@ stdcall LoadIconW(long wstr) +@ stdcall LoadImageW(long wstr long long long long) +@ stdcall LoadKeyboardLayoutW(wstr long) +@ stdcall LoadLibraryExW(wstr long long) +@ stdcall LoadLibraryW(wstr) +@ stdcall LoadMenuIndirectW(ptr) +@ stdcall LoadMenuW(long wstr) +@ stdcall LoadStringW(long long ptr long) +@ cdecl MCIWndCreateW(long long long wstr) +@ stdcall MapVirtualKeyExW(long long long) +@ stdcall MapVirtualKeyW(long long) +@ stdcall MessageBoxExW(long wstr wstr long long) +@ stdcall MessageBoxIndirectW(ptr) +@ stdcall MessageBoxW(long wstr wstr long) +@ stdcall ModifyMenuW(long long long long ptr) +@ stdcall MoveFileW(wstr wstr) +@ stdcall MultiByteToWideChar(long long str long ptr long) +@ stdcall MultinetGetConnectionPerformanceW(ptr ptr) +@ stdcall OemToCharBuffW(ptr ptr long) +@ stdcall OemToCharW(ptr ptr) +@ stdcall OleUIAddVerbMenuW(ptr wstr long long long long long long ptr) +@ stdcall OleUIBusyW(ptr) +@ stdcall OleUIChangeIconW(ptr) +@ stdcall OleUIChangeSourceW(ptr) +@ stdcall OleUIConvertW(ptr) +@ stdcall OleUIEditLinksW(ptr) +@ stdcall OleUIInsertObjectW(ptr) +@ stdcall OleUIObjectPropertiesW(ptr) +@ stdcall OleUIPasteSpecialW(ptr) +@ varargs OleUIPromptUserW(long long) +@ stdcall OleUIUpdateLinksW(ptr long wstr long) +@ stdcall OpenEventW(long long wstr) +@ stdcall OpenFileMappingW(long long wstr) +@ stdcall OpenMutexW(long long wstr) +@ stdcall OpenPrinterW(wstr ptr ptr) +@ stdcall OpenSemaphoreW(long long wstr) +@ stdcall OpenWaitableTimerW(long long wstr) +@ stdcall OutputDebugStringW(wstr) +@ stdcall PageSetupDlgW(ptr) +@ stdcall PeekConsoleInputW(ptr ptr long ptr) +@ stdcall PeekMessageW(ptr long long long long) +@ stdcall PlaySoundW(ptr long long) +@ stdcall PolyTextOutW(long ptr long) +@ stdcall PostMessageW(long long long long) +@ stdcall PostThreadMessageW(long long long long) +@ stdcall PrintDlgW(ptr) +@ stdcall QueryContextAttributesW(ptr long ptr) +@ stdcall QueryCredentialsAttributesW(ptr long ptr) +@ stdcall QueryDosDeviceW(wstr ptr long) +@ stdcall QuerySecurityPackageInfoW(wstr ptr) +@ stdcall RasConnectionNotificationW(long long long) +@ stdcall RasCreatePhonebookEntryW(long wstr) +@ stdcall RasDeleteEntryW(wstr wstr) +@ stdcall RasDeleteSubEntryW(wstr wstr long) +@ stdcall RasDialW(ptr wstr ptr long ptr ptr) +@ stdcall RasEditPhonebookEntryW(long wstr wstr) +@ stdcall RasEnumConnectionsW(ptr ptr ptr) +@ stdcall RasEnumDevicesW(ptr ptr ptr) +@ stdcall RasEnumEntriesW(str str ptr ptr ptr) +@ stdcall RasGetConnectStatusW(long ptr) +@ stdcall RasGetEntryDialParamsW(wstr ptr ptr) +@ stdcall RasGetEntryPropertiesW(wstr wstr ptr ptr ptr ptr) +@ stdcall RasGetErrorStringW(long ptr long) +@ stdcall RasGetProjectionInfoW(long long ptr ptr) +@ stdcall RasHangUpW(long) +@ stdcall RasRenameEntryW(wstr wstr wstr) +@ stdcall RasSetEntryDialParamsW(wstr ptr long) +@ stdcall RasSetEntryPropertiesW(wstr wstr ptr long ptr long) +@ stdcall RasSetSubEntryPropertiesW(wstr wstr long ptr long ptr long) +@ stdcall RasValidateEntryNameW(wstr wstr) +@ stdcall ReadConsoleInputW(long ptr long ptr) +@ stdcall ReadConsoleOutputCharacterW(long ptr long long ptr) +@ stdcall ReadConsoleOutputW(long ptr long long ptr) +@ stdcall ReadConsoleW(long ptr long ptr ptr) +@ stdcall RegConnectRegistryW(wstr long ptr) +@ stdcall RegCreateKeyExW(long wstr long ptr long long ptr ptr ptr) +@ stdcall RegCreateKeyW(long wstr ptr) +@ stdcall RegDeleteKeyW(long wstr) +@ stdcall RegDeleteValueW(long wstr) +@ stdcall RegEnumKeyExW(long long ptr ptr ptr ptr ptr ptr) +@ stdcall RegEnumKeyW(long long ptr long) +@ stdcall RegEnumValueW(long long ptr ptr ptr ptr ptr ptr) +@ stdcall RegLoadKeyW(long wstr wstr) +@ stdcall RegOpenKeyExW(long wstr long long ptr) +@ stdcall RegOpenKeyW(long wstr ptr) +@ stdcall RegQueryInfoKeyW(long ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr) +@ stdcall RegQueryMultipleValuesW(long ptr long ptr ptr) +@ stdcall RegQueryValueExW(long wstr ptr ptr ptr ptr) +@ stdcall RegQueryValueW(long wstr ptr ptr) +@ stdcall RegReplaceKeyW(long wstr wstr wstr) +@ stdcall RegSaveKeyW(long ptr ptr) +@ stdcall RegSetValueExW(long wstr long long ptr long) +@ stdcall RegSetValueW(long wstr long ptr long) +@ stdcall RegUnLoadKeyW(long wstr) +@ stdcall RegisterClassExW(ptr) +@ stdcall RegisterClassW(ptr) +@ stdcall RegisterClipboardFormatW(wstr) +@ stdcall RegisterDeviceNotificationW(long ptr long) +@ stdcall RegisterWindowMessageW(wstr) +@ stdcall RemoveDirectoryW(wstr) +@ stdcall RemoveFontResourceW(wstr) +@ stdcall RemovePropA(long str) +@ stdcall RemovePropW(long wstr) +@ stdcall ReplaceTextW(ptr) +@ stdcall ResetDCW(long ptr) +@ stdcall ResetPrinterW(long ptr) +@ stdcall SHBrowseForFolderW(ptr) +@ stdcall SHChangeNotify (long long ptr ptr) +@ stdcall SHFileOperationW(ptr) +@ stdcall SHGetFileInfoW(ptr long ptr long long) +@ stdcall SHGetNewLinkInfoW(wstr wstr ptr long long) +@ stdcall SHGetPathFromIDListW(ptr ptr) +@ stdcall ScrollConsoleScreenBufferW(long ptr ptr ptr ptr) +@ stdcall SearchPathW(wstr wstr wstr long ptr ptr) +@ stdcall SendDlgItemMessageW(long long long long long) +@ stdcall SendMessageCallbackW(long long long long ptr long) +@ stdcall SendMessageTimeoutW(long long long long long long ptr) +@ stdcall SendMessageW(long long long long) +@ stdcall SendNotifyMessageW(long long long long) +@ stdcall SetCalendarInfoW(long long long wstr) +@ stdcall SetClassLongW(long long long) +@ stdcall SetComputerNameW(wstr) +@ stdcall SetConsoleTitleW(wstr) +@ stdcall SetCurrentDirectoryW(wstr) +@ stdcall SetDefaultCommConfigW(wstr ptr long) +@ stdcall SetDlgItemTextW(long long wstr) +@ stdcall SetEnvironmentVariableW(wstr wstr) +@ stdcall SetFileAttributesW(wstr long) +@ stdcall SetICMProfileW(long wstr) +@ stdcall SetJobW(long long long ptr long) +@ stdcall SetLocaleInfoW(long long wstr) +@ stdcall SetMenuItemInfoW(long long long ptr) +@ stdcall SetPrinterDataW(long wstr long ptr long) +@ stdcall SetPrinterW(long long ptr long) +@ stdcall SetPropA(long str long) +@ stdcall SetPropW(long wstr long) +@ stdcall SetVolumeLabelW(wstr wstr) +@ stdcall SetWindowLongA(long long long) +@ stdcall SetWindowLongW(long long long) +@ stdcall SetWindowTextW(long wstr) +@ stdcall SetWindowsHookExW(long long long long) +@ stdcall SetWindowsHookW(long ptr) +@ stdcall ShellAboutW(long wstr wstr long) +@ stdcall ShellExecuteExW (long) +@ stdcall ShellExecuteW (long wstr wstr wstr wstr long) +@ stdcall Shell_NotifyIconW(long ptr) +@ stdcall StartDocPrinterW(long long ptr) +@ stdcall StartDocW(long ptr) +@ stdcall SystemParametersInfoW(long long ptr long) +@ stdcall TabbedTextOutW(long long long wstr long long ptr long) +@ stdcall TextOutW(long long long wstr long) +@ stdcall TranslateAcceleratorW(long long ptr) +@ stdcall UnregisterClassW(wstr long) +@ stdcall UpdateICMRegKeyW(long wstr wstr long) +@ stdcall UpdateResourceA(long str str long ptr long) +@ stdcall UpdateResourceW(long wstr wstr long ptr long) +@ stdcall VerFindFileW(long wstr wstr wstr ptr ptr ptr ptr) +@ stdcall VerInstallFileW(long wstr wstr wstr wstr wstr ptr ptr) +@ stdcall VerLanguageNameW(long wstr long) +@ stdcall VerQueryValueW(ptr wstr ptr ptr) +@ stdcall VkKeyScanExW(long long) +@ stdcall VkKeyScanW(long) +@ stdcall WNetAddConnection2W(ptr wstr wstr long) +@ stdcall WNetAddConnection3W(long ptr wstr wstr long) +@ stdcall WNetAddConnectionW(wstr wstr wstr) +@ stdcall WNetCancelConnection2W(wstr long long) +@ stdcall WNetCancelConnectionW(wstr long) +@ stdcall WNetConnectionDialog1W(ptr) +@ stdcall WNetDisconnectDialog1W(ptr) +@ stdcall WNetEnumResourceW(long ptr ptr ptr) +@ stdcall WNetGetConnectionW(wstr ptr ptr) +@ stdcall WNetGetLastErrorW(ptr ptr long ptr long) +@ stdcall WNetGetNetworkInformationW(wstr ptr) +@ stdcall WNetGetProviderNameW(long ptr ptr) +@ stdcall WNetGetResourceInformationW(ptr ptr ptr ptr) +@ stdcall WNetGetResourceParentW(ptr ptr ptr) +@ stdcall WNetGetUniversalNameW (wstr long ptr ptr) +@ stdcall WNetGetUserW(wstr wstr ptr) +@ stdcall WNetOpenEnumW(long long long ptr ptr) +@ stdcall WNetUseConnectionW(long ptr wstr wstr long wstr ptr ptr) +@ stdcall WaitNamedPipeW (wstr long) +@ stdcall WideCharToMultiByte(long long wstr long ptr long ptr ptr) +@ stdcall WinHelpW(long wstr long long) +@ stdcall WriteConsoleInputW(long ptr long ptr) +@ stdcall WriteConsoleOutputCharacterW(long ptr long long ptr) +@ stdcall WriteConsoleOutputW(long ptr long long ptr) +@ stdcall WriteConsoleW(long ptr long ptr ptr) +@ stdcall WritePrivateProfileSectionW(wstr wstr wstr) +@ stdcall WritePrivateProfileStringW(wstr wstr wstr wstr) +@ stdcall WritePrivateProfileStructW(wstr wstr ptr long wstr) +@ stdcall WriteProfileSectionW(str str) +@ stdcall WriteProfileStringW(wstr wstr wstr) +@ stub __FreeAllLibrariesInMsluDll +@ stdcall auxGetDevCapsW(long ptr long) +@ stdcall capCreateCaptureWindowW(wstr long long long long long long long) +@ stdcall capGetDriverDescriptionW(long ptr long ptr long) +@ stdcall joyGetDevCapsW(long ptr long) +@ stdcall lstrcatW(wstr wstr) +@ stdcall lstrcmpW(wstr wstr) +@ stdcall lstrcmpiW(wstr wstr) +@ stdcall lstrcpyW(ptr wstr) +@ stdcall lstrcpynW(ptr wstr long) +@ stdcall lstrlenW(wstr) +@ stdcall mciGetDeviceIDW(str) +@ stdcall mciGetErrorStringW(long ptr long) +@ stdcall mciSendCommandW(long long long long) +@ stdcall mciSendStringW(wstr ptr long long) +@ stdcall midiInGetDevCapsW(long ptr long) +@ stdcall midiInGetErrorTextW(long ptr long) +@ stdcall midiOutGetDevCapsW(long ptr long) +@ stdcall midiOutGetErrorTextW(long ptr long) +@ stdcall mixerGetControlDetailsW(long ptr long) +@ stdcall mixerGetDevCapsW(long ptr long) +@ stdcall mixerGetLineControlsW(long ptr long) +@ stdcall mixerGetLineInfoW(long ptr long) +@ stdcall mmioInstallIOProcW(long ptr long) +@ stdcall mmioOpenW(wstr ptr long) +@ stdcall mmioRenameW(wstr wstr ptr long) +@ stdcall mmioStringToFOURCCW(wstr long) +@ stdcall sndPlaySoundW(ptr long) +@ stdcall waveInGetDevCapsW(long ptr long) +@ stdcall waveInGetErrorTextW(long ptr long) +@ stdcall waveOutGetDevCapsW(long ptr long) +@ stdcall waveOutGetErrorTextW(long ptr long) +@ varargs wsprintfW(wstr wstr) +@ stdcall wvsprintfW(ptr wstr ptr) diff --git a/reactos/dll/win32/win32.rbuild b/reactos/dll/win32/win32.rbuild index 30dbf94704c..be69caf5573 100644 --- a/reactos/dll/win32/win32.rbuild +++ b/reactos/dll/win32/win32.rbuild @@ -562,6 +562,9 @@ + + + From 057f42a55429af11ccb2558b50ac3f6ac9031fe7 Mon Sep 17 00:00:00 2001 From: Rafal Harabien Date: Wed, 20 Apr 2011 17:44:12 +0000 Subject: [PATCH 180/317] [FLOPPY] Increase floppy drives count in global ConfigurationInformation. Fixes not working floppies in explorer. See issue #4236 for more details. svn path=/trunk/; revision=51409 --- reactos/drivers/storage/floppy/floppy.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/reactos/drivers/storage/floppy/floppy.c b/reactos/drivers/storage/floppy/floppy.c index 05d15983fe9..f8c8ab1c34c 100644 --- a/reactos/drivers/storage/floppy/floppy.c +++ b/reactos/drivers/storage/floppy/floppy.c @@ -971,22 +971,25 @@ static BOOLEAN NTAPI AddControllers(PDRIVER_OBJECT DriverObject) continue; /* continue to next drive */ } - /* 3e: Set up the DPC */ + /* 3e: Increase global floppy drives count */ + IoGetConfigurationInformation()->FloppyCount++; + + /* 3f: Set up the DPC */ IoInitializeDpcRequest(gControllerInfo[i].DriveInfo[j].DeviceObject, (PIO_DPC_ROUTINE)DpcForIsr); - /* 3f: Point the device extension at our DriveInfo struct */ + /* 3g: Point the device extension at our DriveInfo struct */ gControllerInfo[i].DriveInfo[j].DeviceObject->DeviceExtension = &gControllerInfo[i].DriveInfo[j]; - /* 3g: neat comic strip */ + /* 3h: neat comic strip */ - /* 3h: set the initial media type to unknown */ + /* 3i: set the initial media type to unknown */ memset(&gControllerInfo[i].DriveInfo[j].DiskGeometry, 0, sizeof(DISK_GEOMETRY)); gControllerInfo[i].DriveInfo[j].DiskGeometry.MediaType = Unknown; - /* 3i: Now that we're done, set the Initialized flag so we know to free this in Unload */ + /* 3j: Now that we're done, set the Initialized flag so we know to free this in Unload */ gControllerInfo[i].DriveInfo[j].Initialized = TRUE; - /* 3j: Clear the DO_DEVICE_INITIALIZING flag */ + /* 3k: Clear the DO_DEVICE_INITIALIZING flag */ gControllerInfo[i].DriveInfo[j].DeviceObject->Flags &= ~DO_DEVICE_INITIALIZING; } } From 1e27c057e4ce88e46e54a5cd91b908463c95904b Mon Sep 17 00:00:00 2001 From: Rafal Harabien Date: Wed, 20 Apr 2011 18:13:27 +0000 Subject: [PATCH 181/317] [FLOPPY] Formatting only, no code changes. svn path=/trunk/; revision=51410 --- reactos/drivers/storage/floppy/csqrtns.c | 89 +- reactos/drivers/storage/floppy/csqrtns.h | 25 +- reactos/drivers/storage/floppy/floppy.c | 1296 ++++++++++---------- reactos/drivers/storage/floppy/floppy.h | 98 +- reactos/drivers/storage/floppy/hardware.c | 919 +++++++------- reactos/drivers/storage/floppy/hardware.h | 122 +- reactos/drivers/storage/floppy/ioctl.c | 292 ++--- reactos/drivers/storage/floppy/ioctl.h | 9 +- reactos/drivers/storage/floppy/readwrite.c | 962 +++++++-------- reactos/drivers/storage/floppy/readwrite.h | 8 +- 10 files changed, 1936 insertions(+), 1884 deletions(-) diff --git a/reactos/drivers/storage/floppy/csqrtns.c b/reactos/drivers/storage/floppy/csqrtns.c index 7c705b9541d..e6b84257b03 100644 --- a/reactos/drivers/storage/floppy/csqrtns.c +++ b/reactos/drivers/storage/floppy/csqrtns.c @@ -56,9 +56,9 @@ KSEMAPHORE QueueSemaphore; * CSQ Callbacks */ - -VOID NTAPI CsqRemoveIrp(PIO_CSQ UnusedCsq, - PIRP Irp) + +VOID NTAPI +CsqRemoveIrp(PIO_CSQ UnusedCsq, PIRP Irp) /* * FUNCTION: Remove an IRP from the queue * ARGUMENTS: @@ -68,15 +68,14 @@ VOID NTAPI CsqRemoveIrp(PIO_CSQ UnusedCsq, * - Called under the protection of the queue lock */ { - UNREFERENCED_PARAMETER(UnusedCsq); - TRACE_(FLOPPY, "CSQ: Removing IRP 0x%p\n", Irp); - RemoveEntryList(&Irp->Tail.Overlay.ListEntry); + UNREFERENCED_PARAMETER(UnusedCsq); + TRACE_(FLOPPY, "CSQ: Removing IRP 0x%p\n", Irp); + RemoveEntryList(&Irp->Tail.Overlay.ListEntry); } - -PIRP NTAPI CsqPeekNextIrp(PIO_CSQ UnusedCsq, - PIRP Irp, - PVOID PeekContext) + +PIRP NTAPI +CsqPeekNextIrp(PIO_CSQ UnusedCsq, PIRP Irp, PVOID PeekContext) /* * FUNCTION: Find the next matching IRP in the queue * ARGUMENTS: @@ -90,22 +89,22 @@ PIRP NTAPI CsqPeekNextIrp(PIO_CSQ UnusedCsq, * - Called under the protection of the queue lock */ { - UNREFERENCED_PARAMETER(UnusedCsq); - UNREFERENCED_PARAMETER(PeekContext); - TRACE_(FLOPPY, "CSQ: Peeking for next IRP\n"); + UNREFERENCED_PARAMETER(UnusedCsq); + UNREFERENCED_PARAMETER(PeekContext); + TRACE_(FLOPPY, "CSQ: Peeking for next IRP\n"); - if(Irp) - return CONTAINING_RECORD(&Irp->Tail.Overlay.ListEntry.Flink, IRP, Tail.Overlay.ListEntry); + if(Irp) + return CONTAINING_RECORD(&Irp->Tail.Overlay.ListEntry.Flink, IRP, Tail.Overlay.ListEntry); - if(IsListEmpty(&IrpQueue)) - return NULL; + if(IsListEmpty(&IrpQueue)) + return NULL; - return CONTAINING_RECORD(IrpQueue.Flink, IRP, Tail.Overlay.ListEntry); + return CONTAINING_RECORD(IrpQueue.Flink, IRP, Tail.Overlay.ListEntry); } - -VOID NTAPI CsqAcquireLock(PIO_CSQ UnusedCsq, - PKIRQL Irql) + +VOID NTAPI +CsqAcquireLock(PIO_CSQ UnusedCsq, PKIRQL Irql) /* * FUNCTION: Acquire the queue lock * ARGUMENTS: @@ -113,14 +112,14 @@ VOID NTAPI CsqAcquireLock(PIO_CSQ UnusedCsq, * Irql: Pointer to a variable to store the old irql into */ { - UNREFERENCED_PARAMETER(UnusedCsq); - INFO_(FLOPPY, "CSQ: Acquiring spin lock\n"); - KeAcquireSpinLock(&IrpQueueLock, Irql); + UNREFERENCED_PARAMETER(UnusedCsq); + INFO_(FLOPPY, "CSQ: Acquiring spin lock\n"); + KeAcquireSpinLock(&IrpQueueLock, Irql); } - -VOID NTAPI CsqReleaseLock(PIO_CSQ UnusedCsq, - KIRQL Irql) + +VOID NTAPI +CsqReleaseLock(PIO_CSQ UnusedCsq, KIRQL Irql) /* * FUNCTION: Release the queue lock * ARGUMENTS: @@ -128,14 +127,14 @@ VOID NTAPI CsqReleaseLock(PIO_CSQ UnusedCsq, * Irql: IRQL to lower to on release */ { - UNREFERENCED_PARAMETER(UnusedCsq); - INFO_(FLOPPY, "CSQ: Releasing spin lock\n"); - KeReleaseSpinLock(&IrpQueueLock, Irql); + UNREFERENCED_PARAMETER(UnusedCsq); + INFO_(FLOPPY, "CSQ: Releasing spin lock\n"); + KeReleaseSpinLock(&IrpQueueLock, Irql); } - -VOID NTAPI CsqCompleteCanceledIrp(PIO_CSQ UnusedCsq, - PIRP Irp) + +VOID NTAPI +CsqCompleteCanceledIrp(PIO_CSQ UnusedCsq, PIRP Irp) /* * FUNCTION: Complete a canceled IRP * ARGUMENTS: @@ -146,16 +145,16 @@ VOID NTAPI CsqCompleteCanceledIrp(PIO_CSQ UnusedCsq, * - MS misspelled CANCELLED... sigh... */ { - UNREFERENCED_PARAMETER(UnusedCsq); - TRACE_(FLOPPY, "CSQ: Canceling irp 0x%p\n", Irp); - Irp->IoStatus.Status = STATUS_CANCELLED; - Irp->IoStatus.Information = 0; - IoCompleteRequest(Irp, IO_NO_INCREMENT); + UNREFERENCED_PARAMETER(UnusedCsq); + TRACE_(FLOPPY, "CSQ: Canceling irp 0x%p\n", Irp); + Irp->IoStatus.Status = STATUS_CANCELLED; + Irp->IoStatus.Information = 0; + IoCompleteRequest(Irp, IO_NO_INCREMENT); } - -VOID NTAPI CsqInsertIrp(PIO_CSQ UnusedCsq, - PIRP Irp) + +VOID NTAPI +CsqInsertIrp(PIO_CSQ UnusedCsq, PIRP Irp) /* * FUNCTION: Queue an IRP * ARGUMENTS: @@ -171,9 +170,9 @@ VOID NTAPI CsqInsertIrp(PIO_CSQ UnusedCsq, * that at least one IRP is canceled at some point */ { - UNREFERENCED_PARAMETER(UnusedCsq); - TRACE_(FLOPPY, "CSQ: Inserting IRP 0x%p\n", Irp); - InsertTailList(&IrpQueue, &Irp->Tail.Overlay.ListEntry); - KeReleaseSemaphore(&QueueSemaphore, 0, 1, FALSE); + UNREFERENCED_PARAMETER(UnusedCsq); + TRACE_(FLOPPY, "CSQ: Inserting IRP 0x%p\n", Irp); + InsertTailList(&IrpQueue, &Irp->Tail.Overlay.ListEntry); + KeReleaseSemaphore(&QueueSemaphore, 0, 1, FALSE); } diff --git a/reactos/drivers/storage/floppy/csqrtns.h b/reactos/drivers/storage/floppy/csqrtns.h index 14574c7d1de..af6193faa1c 100644 --- a/reactos/drivers/storage/floppy/csqrtns.h +++ b/reactos/drivers/storage/floppy/csqrtns.h @@ -38,22 +38,21 @@ extern LIST_ENTRY IrpQueue; extern KSPIN_LOCK IrpQueueLock; extern KSEMAPHORE QueueSemaphore; -VOID NTAPI CsqInsertIrp(PIO_CSQ Csq, - PIRP Irp); +VOID NTAPI +CsqInsertIrp(PIO_CSQ Csq, PIRP Irp); -VOID NTAPI CsqRemoveIrp(PIO_CSQ Csq, - PIRP Irp); +VOID NTAPI +CsqRemoveIrp(PIO_CSQ Csq, PIRP Irp); -PIRP NTAPI CsqPeekNextIrp(PIO_CSQ Csq, - PIRP Irp, - PVOID PeekContext); +PIRP NTAPI +CsqPeekNextIrp(PIO_CSQ Csq, PIRP Irp, PVOID PeekContext); -VOID NTAPI CsqAcquireLock(PIO_CSQ Csq, - PKIRQL Irql); +VOID NTAPI +CsqAcquireLock(PIO_CSQ Csq, PKIRQL Irql); -VOID NTAPI CsqReleaseLock(PIO_CSQ Csq, - KIRQL Irql); +VOID NTAPI +CsqReleaseLock(PIO_CSQ Csq, KIRQL Irql); -VOID NTAPI CsqCompleteCanceledIrp(PIO_CSQ Csq, - PIRP Irp); +VOID NTAPI +CsqCompleteCanceledIrp(PIO_CSQ Csq, PIRP Irp); diff --git a/reactos/drivers/storage/floppy/floppy.c b/reactos/drivers/storage/floppy/floppy.c index f8c8ab1c34c..24e74400e0a 100644 --- a/reactos/drivers/storage/floppy/floppy.c +++ b/reactos/drivers/storage/floppy/floppy.c @@ -61,11 +61,9 @@ static ULONG gNumberOfControllers = 0; static KEVENT QueueThreadTerminate; static PVOID QueueThreadObject; - -static VOID NTAPI MotorStopDpcFunc(PKDPC UnusedDpc, - PVOID DeferredContext, - PVOID SystemArgument1, - PVOID SystemArgument2) + +static VOID NTAPI +MotorStopDpcFunc(PKDPC UnusedDpc, PVOID DeferredContext, PVOID SystemArgument1, PVOID SystemArgument2) /* * FUNCTION: Stop the floppy motor * ARGUMENTS: @@ -78,24 +76,25 @@ static VOID NTAPI MotorStopDpcFunc(PKDPC UnusedDpc, * - Called back at DISPATCH_LEVEL */ { - PCONTROLLER_INFO ControllerInfo = (PCONTROLLER_INFO)DeferredContext; + PCONTROLLER_INFO ControllerInfo = (PCONTROLLER_INFO)DeferredContext; - UNREFERENCED_PARAMETER(SystemArgument1); - UNREFERENCED_PARAMETER(SystemArgument2); - UNREFERENCED_PARAMETER(UnusedDpc); + UNREFERENCED_PARAMETER(SystemArgument1); + UNREFERENCED_PARAMETER(SystemArgument2); + UNREFERENCED_PARAMETER(UnusedDpc); - ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL); - ASSERT(ControllerInfo); + ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL); + ASSERT(ControllerInfo); - TRACE_(FLOPPY, "MotorStopDpcFunc called\n"); + TRACE_(FLOPPY, "MotorStopDpcFunc called\n"); - HwTurnOffMotor(ControllerInfo); - ControllerInfo->StopDpcQueued = FALSE; - KeSetEvent(&ControllerInfo->MotorStoppedEvent, EVENT_INCREMENT, FALSE); + HwTurnOffMotor(ControllerInfo); + ControllerInfo->StopDpcQueued = FALSE; + KeSetEvent(&ControllerInfo->MotorStoppedEvent, EVENT_INCREMENT, FALSE); } - -VOID NTAPI StartMotor(PDRIVE_INFO DriveInfo) + +VOID NTAPI +StartMotor(PDRIVE_INFO DriveInfo) /* * FUNCTION: Start the motor, taking into account proper handling of the timer race * ARGUMENTS: @@ -111,29 +110,30 @@ VOID NTAPI StartMotor(PDRIVE_INFO DriveInfo) * - PAGED_CODE because we wait */ { - PAGED_CODE(); - ASSERT(DriveInfo); + PAGED_CODE(); + ASSERT(DriveInfo); - TRACE_(FLOPPY, "StartMotor called\n"); + TRACE_(FLOPPY, "StartMotor called\n"); - if(DriveInfo->ControllerInfo->StopDpcQueued && !KeCancelTimer(&DriveInfo->ControllerInfo->MotorTimer)) + if(DriveInfo->ControllerInfo->StopDpcQueued && !KeCancelTimer(&DriveInfo->ControllerInfo->MotorTimer)) { - /* Motor turner-offer is already running; wait for it to finish */ - INFO_(FLOPPY, "StartMotor: motor turner-offer is already running; waiting for it\n"); - KeWaitForSingleObject(&DriveInfo->ControllerInfo->MotorStoppedEvent, Executive, KernelMode, FALSE, NULL); - INFO_(FLOPPY, "StartMotor: wait satisfied\n"); + /* Motor turner-offer is already running; wait for it to finish */ + INFO_(FLOPPY, "StartMotor: motor turner-offer is already running; waiting for it\n"); + KeWaitForSingleObject(&DriveInfo->ControllerInfo->MotorStoppedEvent, Executive, KernelMode, FALSE, NULL); + INFO_(FLOPPY, "StartMotor: wait satisfied\n"); } - DriveInfo->ControllerInfo->StopDpcQueued = FALSE; + DriveInfo->ControllerInfo->StopDpcQueued = FALSE; - if(HwTurnOnMotor(DriveInfo) != STATUS_SUCCESS) - { - WARN_(FLOPPY, "StartMotor(): warning: HwTurnOnMotor failed\n"); - } + if(HwTurnOnMotor(DriveInfo) != STATUS_SUCCESS) + { + WARN_(FLOPPY, "StartMotor(): warning: HwTurnOnMotor failed\n"); + } } - -VOID NTAPI StopMotor(PCONTROLLER_INFO ControllerInfo) + +VOID NTAPI +StopMotor(PCONTROLLER_INFO ControllerInfo) /* * FUNCTION: Stop all motors on the controller * ARGUMENTS: @@ -144,23 +144,24 @@ VOID NTAPI StopMotor(PCONTROLLER_INFO ControllerInfo) * All we have to do is set up a timer. */ { - LARGE_INTEGER StopTime; + LARGE_INTEGER StopTime; - ASSERT(ControllerInfo); + ASSERT(ControllerInfo); - TRACE_(FLOPPY, "StopMotor called\n"); + TRACE_(FLOPPY, "StopMotor called\n"); - /* one relative second, in 100-ns units */ - StopTime.QuadPart = 10000000; - StopTime.QuadPart *= -1; + /* one relative second, in 100-ns units */ + StopTime.QuadPart = 10000000; + StopTime.QuadPart *= -1; - KeClearEvent(&ControllerInfo->MotorStoppedEvent); - KeSetTimer(&ControllerInfo->MotorTimer, StopTime, &ControllerInfo->MotorStopDpc); - ControllerInfo->StopDpcQueued = TRUE; + KeClearEvent(&ControllerInfo->MotorStoppedEvent); + KeSetTimer(&ControllerInfo->MotorTimer, StopTime, &ControllerInfo->MotorStopDpc); + ControllerInfo->StopDpcQueued = TRUE; } - -VOID NTAPI WaitForControllerInterrupt(PCONTROLLER_INFO ControllerInfo) + +VOID NTAPI +WaitForControllerInterrupt(PCONTROLLER_INFO ControllerInfo) /* * FUNCTION: Wait for the controller to interrupt, and then clear the event * ARGUMENTS: @@ -173,11 +174,11 @@ VOID NTAPI WaitForControllerInterrupt(PCONTROLLER_INFO ControllerInfo) * - PAGED_CODE because it waits */ { - PAGED_CODE(); - ASSERT(ControllerInfo); + PAGED_CODE(); + ASSERT(ControllerInfo); - KeWaitForSingleObject(&ControllerInfo->SynchEvent, Executive, KernelMode, FALSE, NULL); - KeClearEvent(&ControllerInfo->SynchEvent); + KeWaitForSingleObject(&ControllerInfo->SynchEvent, Executive, KernelMode, FALSE, NULL); + KeClearEvent(&ControllerInfo->SynchEvent); } static DRIVER_DISPATCH CreateClose; @@ -199,20 +200,21 @@ static NTSTATUS NTAPI CreateClose(PDEVICE_OBJECT DeviceObject, * TODO: Figure out why this isn't getting called */ { - UNREFERENCED_PARAMETER(DeviceObject); + UNREFERENCED_PARAMETER(DeviceObject); - TRACE_(FLOPPY, "CreateClose called\n"); + TRACE_(FLOPPY, "CreateClose called\n"); - Irp->IoStatus.Status = STATUS_SUCCESS; - Irp->IoStatus.Information = FILE_OPENED; + Irp->IoStatus.Status = STATUS_SUCCESS; + Irp->IoStatus.Information = FILE_OPENED; - IoCompleteRequest(Irp, IO_DISK_INCREMENT); + IoCompleteRequest(Irp, IO_DISK_INCREMENT); - return STATUS_SUCCESS; + return STATUS_SUCCESS; } - -static NTSTATUS NTAPI Recalibrate(PDRIVE_INFO DriveInfo) + +static NTSTATUS NTAPI +Recalibrate(PDRIVE_INFO DriveInfo) /* * FUNCTION: Start the recalibration process * ARGUMENTS: @@ -225,63 +227,64 @@ static NTSTATUS NTAPI Recalibrate(PDRIVE_INFO DriveInfo) * - PAGED_CODE because we wait */ { - NTSTATUS Status; - ULONG i; + NTSTATUS Status; + ULONG i; - PAGED_CODE(); - ASSERT(DriveInfo); + PAGED_CODE(); + ASSERT(DriveInfo); - /* first turn on the motor */ - /* Must stop after every start, prior to return */ - StartMotor(DriveInfo); + /* first turn on the motor */ + /* Must stop after every start, prior to return */ + StartMotor(DriveInfo); - /* set the data rate */ - WARN_(FLOPPY, "FIXME: UN-HARDCODE DATA RATE\n"); - if(HwSetDataRate(DriveInfo->ControllerInfo, 0) != STATUS_SUCCESS) + /* set the data rate */ + WARN_(FLOPPY, "FIXME: UN-HARDCODE DATA RATE\n"); + if(HwSetDataRate(DriveInfo->ControllerInfo, 0) != STATUS_SUCCESS) { - WARN_(FLOPPY, "Recalibrate: HwSetDataRate failed\n"); - StopMotor(DriveInfo->ControllerInfo); - return STATUS_IO_DEVICE_ERROR; + WARN_(FLOPPY, "Recalibrate: HwSetDataRate failed\n"); + StopMotor(DriveInfo->ControllerInfo); + return STATUS_IO_DEVICE_ERROR; } - /* clear the event just in case the last call forgot */ - KeClearEvent(&DriveInfo->ControllerInfo->SynchEvent); + /* clear the event just in case the last call forgot */ + KeClearEvent(&DriveInfo->ControllerInfo->SynchEvent); - /* sometimes you have to do this twice; we'll just do it twice all the time since - * we don't know if the people calling this Recalibrate routine expect a disk to - * even be in the drive, and if so, if that disk is formatted. - */ - for(i = 0; i < 2; i++) + /* sometimes you have to do this twice; we'll just do it twice all the time since + * we don't know if the people calling this Recalibrate routine expect a disk to + * even be in the drive, and if so, if that disk is formatted. + */ + for(i = 0; i < 2; i++) { - /* Send the command */ - Status = HwRecalibrate(DriveInfo); - if(Status != STATUS_SUCCESS) - { - WARN_(FLOPPY, "Recalibrate: HwRecalibrate returned error\n"); - continue; - } + /* Send the command */ + Status = HwRecalibrate(DriveInfo); + if(Status != STATUS_SUCCESS) + { + WARN_(FLOPPY, "Recalibrate: HwRecalibrate returned error\n"); + continue; + } - WaitForControllerInterrupt(DriveInfo->ControllerInfo); + WaitForControllerInterrupt(DriveInfo->ControllerInfo); - /* Get the results */ - Status = HwRecalibrateResult(DriveInfo->ControllerInfo); - if(Status != STATUS_SUCCESS) - { - WARN_(FLOPPY, "Recalibrate: HwRecalibrateResult returned error\n"); - break; + /* Get the results */ + Status = HwRecalibrateResult(DriveInfo->ControllerInfo); + if(Status != STATUS_SUCCESS) + { + WARN_(FLOPPY, "Recalibrate: HwRecalibrateResult returned error\n"); + break; } } - KeClearEvent(&DriveInfo->ControllerInfo->SynchEvent); + KeClearEvent(&DriveInfo->ControllerInfo->SynchEvent); - /* Must stop after every start, prior to return */ - StopMotor(DriveInfo->ControllerInfo); + /* Must stop after every start, prior to return */ + StopMotor(DriveInfo->ControllerInfo); - return Status; + return Status; } - -NTSTATUS NTAPI ResetChangeFlag(PDRIVE_INFO DriveInfo) + +NTSTATUS NTAPI +ResetChangeFlag(PDRIVE_INFO DriveInfo) /* * FUNCTION: Reset the drive's change flag (as reflected in the DIR) * ARGUMENTS: @@ -297,139 +300,141 @@ NTSTATUS NTAPI ResetChangeFlag(PDRIVE_INFO DriveInfo) * - PAGED_CODE because we wait */ { - BOOLEAN DiskChanged; + BOOLEAN DiskChanged; - PAGED_CODE(); - ASSERT(DriveInfo); + PAGED_CODE(); + ASSERT(DriveInfo); - TRACE_(FLOPPY, "ResetChangeFlag called\n"); + TRACE_(FLOPPY, "ResetChangeFlag called\n"); - /* Try to recalibrate. We don't care if it works. */ - Recalibrate(DriveInfo); + /* Try to recalibrate. We don't care if it works. */ + Recalibrate(DriveInfo); - /* clear spurious interrupts in prep for seeks */ - KeClearEvent(&DriveInfo->ControllerInfo->SynchEvent); + /* clear spurious interrupts in prep for seeks */ + KeClearEvent(&DriveInfo->ControllerInfo->SynchEvent); - /* must re-start the drive because Recalibrate() stops it */ - StartMotor(DriveInfo); + /* must re-start the drive because Recalibrate() stops it */ + StartMotor(DriveInfo); - /* Seek to 1 */ - if(HwSeek(DriveInfo, 1) != STATUS_SUCCESS) + /* Seek to 1 */ + if(HwSeek(DriveInfo, 1) != STATUS_SUCCESS) { - WARN_(FLOPPY, "ResetChangeFlag(): HwSeek failed; returning STATUS_IO_DEVICE_ERROR\n"); - StopMotor(DriveInfo->ControllerInfo); - return STATUS_IO_DEVICE_ERROR; + WARN_(FLOPPY, "ResetChangeFlag(): HwSeek failed; returning STATUS_IO_DEVICE_ERROR\n"); + StopMotor(DriveInfo->ControllerInfo); + return STATUS_IO_DEVICE_ERROR; } - WaitForControllerInterrupt(DriveInfo->ControllerInfo); + WaitForControllerInterrupt(DriveInfo->ControllerInfo); - if(HwSenseInterruptStatus(DriveInfo->ControllerInfo) != STATUS_SUCCESS) + if(HwSenseInterruptStatus(DriveInfo->ControllerInfo) != STATUS_SUCCESS) { - WARN_(FLOPPY, "ResetChangeFlag(): HwSenseInterruptStatus failed; bailing out\n"); - StopMotor(DriveInfo->ControllerInfo); - return STATUS_IO_DEVICE_ERROR; + WARN_(FLOPPY, "ResetChangeFlag(): HwSenseInterruptStatus failed; bailing out\n"); + StopMotor(DriveInfo->ControllerInfo); + return STATUS_IO_DEVICE_ERROR; } - /* Seek back to 0 */ - if(HwSeek(DriveInfo, 0) != STATUS_SUCCESS) + /* Seek back to 0 */ + if(HwSeek(DriveInfo, 0) != STATUS_SUCCESS) { - WARN_(FLOPPY, "ResetChangeFlag(): HwSeek failed; returning STATUS_IO_DEVICE_ERROR\n"); - StopMotor(DriveInfo->ControllerInfo); - return STATUS_IO_DEVICE_ERROR; + WARN_(FLOPPY, "ResetChangeFlag(): HwSeek failed; returning STATUS_IO_DEVICE_ERROR\n"); + StopMotor(DriveInfo->ControllerInfo); + return STATUS_IO_DEVICE_ERROR; } - WaitForControllerInterrupt(DriveInfo->ControllerInfo); + WaitForControllerInterrupt(DriveInfo->ControllerInfo); - if(HwSenseInterruptStatus(DriveInfo->ControllerInfo) != STATUS_SUCCESS) + if(HwSenseInterruptStatus(DriveInfo->ControllerInfo) != STATUS_SUCCESS) { - WARN_(FLOPPY, "ResetChangeFlag(): HwSenseInterruptStatus #2 failed; bailing\n"); - StopMotor(DriveInfo->ControllerInfo); - return STATUS_IO_DEVICE_ERROR; + WARN_(FLOPPY, "ResetChangeFlag(): HwSenseInterruptStatus #2 failed; bailing\n"); + StopMotor(DriveInfo->ControllerInfo); + return STATUS_IO_DEVICE_ERROR; } - /* Check the change bit */ - if(HwDiskChanged(DriveInfo, &DiskChanged) != STATUS_SUCCESS) + /* Check the change bit */ + if(HwDiskChanged(DriveInfo, &DiskChanged) != STATUS_SUCCESS) { - WARN_(FLOPPY, "ResetChangeFlag(): HwDiskChanged failed; returning STATUS_IO_DEVICE_ERROR\n"); - StopMotor(DriveInfo->ControllerInfo); - return STATUS_IO_DEVICE_ERROR; + WARN_(FLOPPY, "ResetChangeFlag(): HwDiskChanged failed; returning STATUS_IO_DEVICE_ERROR\n"); + StopMotor(DriveInfo->ControllerInfo); + return STATUS_IO_DEVICE_ERROR; } - StopMotor(DriveInfo->ControllerInfo); + StopMotor(DriveInfo->ControllerInfo); - /* if the change flag is still set, there's probably no media in the drive. */ - if(DiskChanged) - return STATUS_NO_MEDIA_IN_DEVICE; + /* if the change flag is still set, there's probably no media in the drive. */ + if(DiskChanged) + return STATUS_NO_MEDIA_IN_DEVICE; - /* else we're done! */ - return STATUS_SUCCESS; + /* else we're done! */ + return STATUS_SUCCESS; } - -static VOID NTAPI Unload(PDRIVER_OBJECT DriverObject) + +static VOID NTAPI +Unload(PDRIVER_OBJECT DriverObject) /* * FUNCTION: Unload the driver from memory * ARGUMENTS: * DriverObject - The driver that is being unloaded */ { - ULONG i,j; + ULONG i,j; - PAGED_CODE(); - UNREFERENCED_PARAMETER(DriverObject); + PAGED_CODE(); + UNREFERENCED_PARAMETER(DriverObject); - TRACE_(FLOPPY, "unloading\n"); + TRACE_(FLOPPY, "unloading\n"); - KeSetEvent(&QueueThreadTerminate, 0, FALSE); - KeWaitForSingleObject(QueueThreadObject, Executive, KernelMode, FALSE, 0); - ObDereferenceObject(QueueThreadObject); + KeSetEvent(&QueueThreadTerminate, 0, FALSE); + KeWaitForSingleObject(QueueThreadObject, Executive, KernelMode, FALSE, 0); + ObDereferenceObject(QueueThreadObject); - for(i = 0; i < gNumberOfControllers; i++) + for(i = 0; i < gNumberOfControllers; i++) { - if(!gControllerInfo[i].Initialized) - continue; + if(!gControllerInfo[i].Initialized) + continue; - for(j = 0; j < gControllerInfo[i].NumberOfDrives; j++) - { - if(!gControllerInfo[i].DriveInfo[j].Initialized) - continue; + for(j = 0; j < gControllerInfo[i].NumberOfDrives; j++) + { + if(!gControllerInfo[i].DriveInfo[j].Initialized) + continue; - if(gControllerInfo[i].DriveInfo[j].DeviceObject) + if(gControllerInfo[i].DriveInfo[j].DeviceObject) { - UNICODE_STRING Link; + UNICODE_STRING Link; - RtlInitUnicodeString(&Link, gControllerInfo[i].DriveInfo[j].SymLinkBuffer); - IoDeleteSymbolicLink(&Link); + RtlInitUnicodeString(&Link, gControllerInfo[i].DriveInfo[j].SymLinkBuffer); + IoDeleteSymbolicLink(&Link); - RtlInitUnicodeString(&Link, gControllerInfo[i].DriveInfo[j].ArcPathBuffer); - IoDeassignArcName(&Link); + RtlInitUnicodeString(&Link, gControllerInfo[i].DriveInfo[j].ArcPathBuffer); + IoDeassignArcName(&Link); - IoDeleteDevice(gControllerInfo[i].DriveInfo[j].DeviceObject); + IoDeleteDevice(gControllerInfo[i].DriveInfo[j].DeviceObject); } - } + } - IoDisconnectInterrupt(gControllerInfo[i].InterruptObject); + IoDisconnectInterrupt(gControllerInfo[i].InterruptObject); - /* Power down the controller */ - if(HwPowerOff(&gControllerInfo[i]) != STATUS_SUCCESS) - { - WARN_(FLOPPY, "unload: warning: HwPowerOff failed\n"); - } + /* Power down the controller */ + if(HwPowerOff(&gControllerInfo[i]) != STATUS_SUCCESS) + { + WARN_(FLOPPY, "unload: warning: HwPowerOff failed\n"); + } } } - -static NTSTATUS NTAPI ConfigCallback(PVOID Context, - PUNICODE_STRING PathName, - INTERFACE_TYPE BusType, - ULONG BusNumber, - PKEY_VALUE_FULL_INFORMATION *BusInformation, - CONFIGURATION_TYPE ControllerType, - ULONG ControllerNumber, - PKEY_VALUE_FULL_INFORMATION *ControllerInformation, - CONFIGURATION_TYPE PeripheralType, - ULONG PeripheralNumber, - PKEY_VALUE_FULL_INFORMATION *PeripheralInformation) + +static NTSTATUS NTAPI +ConfigCallback(PVOID Context, + PUNICODE_STRING PathName, + INTERFACE_TYPE BusType, + ULONG BusNumber, + PKEY_VALUE_FULL_INFORMATION *BusInformation, + CONFIGURATION_TYPE ControllerType, + ULONG ControllerNumber, + PKEY_VALUE_FULL_INFORMATION *ControllerInformation, + CONFIGURATION_TYPE PeripheralType, + ULONG PeripheralNumber, + PKEY_VALUE_FULL_INFORMATION *PeripheralInformation) /* * FUNCTION: Callback to IoQueryDeviceDescription, which tells us about our controllers * ARGUMENTS: @@ -461,118 +466,118 @@ static NTSTATUS NTAPI ConfigCallback(PVOID Context, * drives. */ { - PKEY_VALUE_FULL_INFORMATION ControllerFullDescriptor = ControllerInformation[IoQueryDeviceConfigurationData]; - PCM_FULL_RESOURCE_DESCRIPTOR ControllerResourceDescriptor = (PCM_FULL_RESOURCE_DESCRIPTOR)((PCHAR)ControllerFullDescriptor + - ControllerFullDescriptor->DataOffset); + PKEY_VALUE_FULL_INFORMATION ControllerFullDescriptor = ControllerInformation[IoQueryDeviceConfigurationData]; + PCM_FULL_RESOURCE_DESCRIPTOR ControllerResourceDescriptor = (PCM_FULL_RESOURCE_DESCRIPTOR)((PCHAR)ControllerFullDescriptor + + ControllerFullDescriptor->DataOffset); - PKEY_VALUE_FULL_INFORMATION PeripheralFullDescriptor = PeripheralInformation[IoQueryDeviceConfigurationData]; - PCM_FULL_RESOURCE_DESCRIPTOR PeripheralResourceDescriptor = (PCM_FULL_RESOURCE_DESCRIPTOR)((PCHAR)PeripheralFullDescriptor + - PeripheralFullDescriptor->DataOffset); + PKEY_VALUE_FULL_INFORMATION PeripheralFullDescriptor = PeripheralInformation[IoQueryDeviceConfigurationData]; + PCM_FULL_RESOURCE_DESCRIPTOR PeripheralResourceDescriptor = (PCM_FULL_RESOURCE_DESCRIPTOR)((PCHAR)PeripheralFullDescriptor + + PeripheralFullDescriptor->DataOffset); - PCM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptor; - PCM_FLOPPY_DEVICE_DATA FloppyDeviceData; - UCHAR i; + PCM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptor; + PCM_FLOPPY_DEVICE_DATA FloppyDeviceData; + UCHAR i; - PAGED_CODE(); - UNREFERENCED_PARAMETER(PeripheralType); - UNREFERENCED_PARAMETER(PeripheralNumber); - UNREFERENCED_PARAMETER(BusInformation); - UNREFERENCED_PARAMETER(Context); - UNREFERENCED_PARAMETER(ControllerType); - UNREFERENCED_PARAMETER(PathName); + PAGED_CODE(); + UNREFERENCED_PARAMETER(PeripheralType); + UNREFERENCED_PARAMETER(PeripheralNumber); + UNREFERENCED_PARAMETER(BusInformation); + UNREFERENCED_PARAMETER(Context); + UNREFERENCED_PARAMETER(ControllerType); + UNREFERENCED_PARAMETER(PathName); - TRACE_(FLOPPY, "ConfigCallback called with ControllerNumber %d\n", ControllerNumber); + TRACE_(FLOPPY, "ConfigCallback called with ControllerNumber %d\n", ControllerNumber); - gControllerInfo[gNumberOfControllers].ControllerNumber = ControllerNumber; - gControllerInfo[gNumberOfControllers].InterfaceType = BusType; - gControllerInfo[gNumberOfControllers].BusNumber = BusNumber; + gControllerInfo[gNumberOfControllers].ControllerNumber = ControllerNumber; + gControllerInfo[gNumberOfControllers].InterfaceType = BusType; + gControllerInfo[gNumberOfControllers].BusNumber = BusNumber; - /* Get controller interrupt level/vector, dma channel, and port base */ - for(i = 0; i < ControllerResourceDescriptor->PartialResourceList.Count; i++) + /* Get controller interrupt level/vector, dma channel, and port base */ + for(i = 0; i < ControllerResourceDescriptor->PartialResourceList.Count; i++) { - KeInitializeEvent(&gControllerInfo[gNumberOfControllers].SynchEvent, NotificationEvent, FALSE); + KeInitializeEvent(&gControllerInfo[gNumberOfControllers].SynchEvent, NotificationEvent, FALSE); - PartialDescriptor = &ControllerResourceDescriptor->PartialResourceList.PartialDescriptors[i]; + PartialDescriptor = &ControllerResourceDescriptor->PartialResourceList.PartialDescriptors[i]; - if(PartialDescriptor->Type == CmResourceTypeInterrupt) + if(PartialDescriptor->Type == CmResourceTypeInterrupt) { - gControllerInfo[gNumberOfControllers].Level = PartialDescriptor->u.Interrupt.Level; - gControllerInfo[gNumberOfControllers].Vector = PartialDescriptor->u.Interrupt.Vector; + gControllerInfo[gNumberOfControllers].Level = PartialDescriptor->u.Interrupt.Level; + gControllerInfo[gNumberOfControllers].Vector = PartialDescriptor->u.Interrupt.Vector; - if(PartialDescriptor->Flags & CM_RESOURCE_INTERRUPT_LATCHED) - gControllerInfo[gNumberOfControllers].InterruptMode = Latched; - else - gControllerInfo[gNumberOfControllers].InterruptMode = LevelSensitive; + if(PartialDescriptor->Flags & CM_RESOURCE_INTERRUPT_LATCHED) + gControllerInfo[gNumberOfControllers].InterruptMode = Latched; + else + gControllerInfo[gNumberOfControllers].InterruptMode = LevelSensitive; } - else if(PartialDescriptor->Type == CmResourceTypePort) + else if(PartialDescriptor->Type == CmResourceTypePort) { - PHYSICAL_ADDRESS TranslatedAddress; - ULONG AddressSpace = 0x1; /* I/O Port Range */ + PHYSICAL_ADDRESS TranslatedAddress; + ULONG AddressSpace = 0x1; /* I/O Port Range */ - if(!HalTranslateBusAddress(BusType, BusNumber, PartialDescriptor->u.Port.Start, &AddressSpace, &TranslatedAddress)) - { - WARN_(FLOPPY, "HalTranslateBusAddress failed; returning\n"); - return STATUS_IO_DEVICE_ERROR; - } + if(!HalTranslateBusAddress(BusType, BusNumber, PartialDescriptor->u.Port.Start, &AddressSpace, &TranslatedAddress)) + { + WARN_(FLOPPY, "HalTranslateBusAddress failed; returning\n"); + return STATUS_IO_DEVICE_ERROR; + } - if(AddressSpace == 0) - gControllerInfo[gNumberOfControllers].BaseAddress = MmMapIoSpace(TranslatedAddress, FDC_PORT_BYTES, MmNonCached); - else - gControllerInfo[gNumberOfControllers].BaseAddress = (PUCHAR)(ULONG_PTR)TranslatedAddress.QuadPart; + if(AddressSpace == 0) + gControllerInfo[gNumberOfControllers].BaseAddress = MmMapIoSpace(TranslatedAddress, FDC_PORT_BYTES, MmNonCached); + else + gControllerInfo[gNumberOfControllers].BaseAddress = (PUCHAR)(ULONG_PTR)TranslatedAddress.QuadPart; } - else if(PartialDescriptor->Type == CmResourceTypeDma) - gControllerInfo[gNumberOfControllers].Dma = PartialDescriptor->u.Dma.Channel; + else if(PartialDescriptor->Type == CmResourceTypeDma) + gControllerInfo[gNumberOfControllers].Dma = PartialDescriptor->u.Dma.Channel; } - /* Start with 0 drives, then go looking */ - gControllerInfo[gNumberOfControllers].NumberOfDrives = 0; + /* Start with 0 drives, then go looking */ + gControllerInfo[gNumberOfControllers].NumberOfDrives = 0; - /* learn about drives attached to controller */ - for(i = 0; i < PeripheralResourceDescriptor->PartialResourceList.Count; i++) + /* learn about drives attached to controller */ + for(i = 0; i < PeripheralResourceDescriptor->PartialResourceList.Count; i++) { - PDRIVE_INFO DriveInfo = &gControllerInfo[gNumberOfControllers].DriveInfo[i]; + PDRIVE_INFO DriveInfo = &gControllerInfo[gNumberOfControllers].DriveInfo[i]; - PartialDescriptor = &PeripheralResourceDescriptor->PartialResourceList.PartialDescriptors[i]; + PartialDescriptor = &PeripheralResourceDescriptor->PartialResourceList.PartialDescriptors[i]; - if(PartialDescriptor->Type != CmResourceTypeDeviceSpecific) - continue; + if(PartialDescriptor->Type != CmResourceTypeDeviceSpecific) + continue; - FloppyDeviceData = (PCM_FLOPPY_DEVICE_DATA)(PartialDescriptor + 1); + FloppyDeviceData = (PCM_FLOPPY_DEVICE_DATA)(PartialDescriptor + 1); - DriveInfo->ControllerInfo = &gControllerInfo[gNumberOfControllers]; - DriveInfo->UnitNumber = i; + DriveInfo->ControllerInfo = &gControllerInfo[gNumberOfControllers]; + DriveInfo->UnitNumber = i; - DriveInfo->FloppyDeviceData.MaxDensity = FloppyDeviceData->MaxDensity; - DriveInfo->FloppyDeviceData.MountDensity = FloppyDeviceData->MountDensity; - DriveInfo->FloppyDeviceData.StepRateHeadUnloadTime = FloppyDeviceData->StepRateHeadUnloadTime; - DriveInfo->FloppyDeviceData.HeadLoadTime = FloppyDeviceData->HeadLoadTime; - DriveInfo->FloppyDeviceData.MotorOffTime = FloppyDeviceData->MotorOffTime; - DriveInfo->FloppyDeviceData.SectorLengthCode = FloppyDeviceData->SectorLengthCode; - DriveInfo->FloppyDeviceData.SectorPerTrack = FloppyDeviceData->SectorPerTrack; - DriveInfo->FloppyDeviceData.ReadWriteGapLength = FloppyDeviceData->ReadWriteGapLength; - DriveInfo->FloppyDeviceData.FormatGapLength = FloppyDeviceData->FormatGapLength; - DriveInfo->FloppyDeviceData.FormatFillCharacter = FloppyDeviceData->FormatFillCharacter; - DriveInfo->FloppyDeviceData.HeadSettleTime = FloppyDeviceData->HeadSettleTime; - DriveInfo->FloppyDeviceData.MotorSettleTime = FloppyDeviceData->MotorSettleTime; - DriveInfo->FloppyDeviceData.MaximumTrackValue = FloppyDeviceData->MaximumTrackValue; - DriveInfo->FloppyDeviceData.DataTransferLength = FloppyDeviceData->DataTransferLength; + DriveInfo->FloppyDeviceData.MaxDensity = FloppyDeviceData->MaxDensity; + DriveInfo->FloppyDeviceData.MountDensity = FloppyDeviceData->MountDensity; + DriveInfo->FloppyDeviceData.StepRateHeadUnloadTime = FloppyDeviceData->StepRateHeadUnloadTime; + DriveInfo->FloppyDeviceData.HeadLoadTime = FloppyDeviceData->HeadLoadTime; + DriveInfo->FloppyDeviceData.MotorOffTime = FloppyDeviceData->MotorOffTime; + DriveInfo->FloppyDeviceData.SectorLengthCode = FloppyDeviceData->SectorLengthCode; + DriveInfo->FloppyDeviceData.SectorPerTrack = FloppyDeviceData->SectorPerTrack; + DriveInfo->FloppyDeviceData.ReadWriteGapLength = FloppyDeviceData->ReadWriteGapLength; + DriveInfo->FloppyDeviceData.FormatGapLength = FloppyDeviceData->FormatGapLength; + DriveInfo->FloppyDeviceData.FormatFillCharacter = FloppyDeviceData->FormatFillCharacter; + DriveInfo->FloppyDeviceData.HeadSettleTime = FloppyDeviceData->HeadSettleTime; + DriveInfo->FloppyDeviceData.MotorSettleTime = FloppyDeviceData->MotorSettleTime; + DriveInfo->FloppyDeviceData.MaximumTrackValue = FloppyDeviceData->MaximumTrackValue; + DriveInfo->FloppyDeviceData.DataTransferLength = FloppyDeviceData->DataTransferLength; - /* Once it's all set up, acknowledge its existance in the controller info object */ - gControllerInfo[gNumberOfControllers].NumberOfDrives++; + /* Once it's all set up, acknowledge its existance in the controller info object */ + gControllerInfo[gNumberOfControllers].NumberOfDrives++; } - gControllerInfo[gNumberOfControllers].Populated = TRUE; - gNumberOfControllers++; + gControllerInfo[gNumberOfControllers].Populated = TRUE; + gNumberOfControllers++; - return STATUS_SUCCESS; + return STATUS_SUCCESS; } - -static BOOLEAN NTAPI Isr(PKINTERRUPT Interrupt, - PVOID ServiceContext) + +static BOOLEAN NTAPI +Isr(PKINTERRUPT Interrupt, PVOID ServiceContext) /* * FUNCTION: Interrupt service routine for the controllers * ARGUMENTS: @@ -599,31 +604,29 @@ static BOOLEAN NTAPI Isr(PKINTERRUPT Interrupt, * - Called at DIRQL */ { - PCONTROLLER_INFO ControllerInfo = (PCONTROLLER_INFO)ServiceContext; + PCONTROLLER_INFO ControllerInfo = (PCONTROLLER_INFO)ServiceContext; - UNREFERENCED_PARAMETER(Interrupt); + UNREFERENCED_PARAMETER(Interrupt); - ASSERT(ControllerInfo); + ASSERT(ControllerInfo); - TRACE_(FLOPPY, "ISR called\n"); + TRACE_(FLOPPY, "ISR called\n"); - /* - * Due to the stupidity of the drive/controller relationship on the floppy drive, only one device object - * can have an active interrupt pending. Due to the nature of these IRPs, though, there will only ever - * be one thread expecting an interrupt at a time, and furthermore, Interrupts (outside of spurious ones) - * won't ever happen unless a thread is expecting them. Therefore, all we have to do is signal an event - * and we're done. Queue a DPC and leave. - */ - KeInsertQueueDpc(&ControllerInfo->Dpc, NULL, NULL); + /* + * Due to the stupidity of the drive/controller relationship on the floppy drive, only one device object + * can have an active interrupt pending. Due to the nature of these IRPs, though, there will only ever + * be one thread expecting an interrupt at a time, and furthermore, Interrupts (outside of spurious ones) + * won't ever happen unless a thread is expecting them. Therefore, all we have to do is signal an event + * and we're done. Queue a DPC and leave. + */ + KeInsertQueueDpc(&ControllerInfo->Dpc, NULL, NULL); - return TRUE; + return TRUE; } - -VOID NTAPI DpcForIsr(PKDPC UnusedDpc, - PVOID Context, - PVOID SystemArgument1, - PVOID SystemArgument2) + +VOID NTAPI +DpcForIsr(PKDPC UnusedDpc, PVOID Context, PVOID SystemArgument1, PVOID SystemArgument2) /* * FUNCTION: This DPC gets queued by every ISR. Does the real per-interrupt work. * ARGUMENTS: @@ -641,21 +644,22 @@ VOID NTAPI DpcForIsr(PKDPC UnusedDpc, * - Called at DISPATCH_LEVEL */ { - PCONTROLLER_INFO ControllerInfo = (PCONTROLLER_INFO)Context; + PCONTROLLER_INFO ControllerInfo = (PCONTROLLER_INFO)Context; - UNREFERENCED_PARAMETER(UnusedDpc); - UNREFERENCED_PARAMETER(SystemArgument1); - UNREFERENCED_PARAMETER(SystemArgument2); + UNREFERENCED_PARAMETER(UnusedDpc); + UNREFERENCED_PARAMETER(SystemArgument1); + UNREFERENCED_PARAMETER(SystemArgument2); - ASSERT(ControllerInfo); + ASSERT(ControllerInfo); - TRACE_(FLOPPY, "DpcForIsr called\n"); + TRACE_(FLOPPY, "DpcForIsr called\n"); - KeSetEvent(&ControllerInfo->SynchEvent, EVENT_INCREMENT, FALSE); + KeSetEvent(&ControllerInfo->SynchEvent, EVENT_INCREMENT, FALSE); } - -static NTSTATUS NTAPI InitController(PCONTROLLER_INFO ControllerInfo) + +static NTSTATUS NTAPI +InitController(PCONTROLLER_INFO ControllerInfo) /* * FUNCTION: Initialize a newly-found controller * ARGUMENTS: @@ -665,153 +669,154 @@ static NTSTATUS NTAPI InitController(PCONTROLLER_INFO ControllerInfo) * STATUS_IO_DEVICE_ERROR otherwise */ { - int i; - UCHAR HeadLoadTime; - UCHAR HeadUnloadTime; - UCHAR StepRateTime; + int i; + UCHAR HeadLoadTime; + UCHAR HeadUnloadTime; + UCHAR StepRateTime; - PAGED_CODE(); - ASSERT(ControllerInfo); + PAGED_CODE(); + ASSERT(ControllerInfo); - TRACE_(FLOPPY, "InitController called with Controller 0x%p\n", ControllerInfo); + TRACE_(FLOPPY, "InitController called with Controller 0x%p\n", ControllerInfo); - KeClearEvent(&ControllerInfo->SynchEvent); + KeClearEvent(&ControllerInfo->SynchEvent); - INFO_(FLOPPY, "InitController: resetting the controller\n"); + INFO_(FLOPPY, "InitController: resetting the controller\n"); - /* Reset the controller */ - if(HwReset(ControllerInfo) != STATUS_SUCCESS) + /* Reset the controller */ + if(HwReset(ControllerInfo) != STATUS_SUCCESS) { - WARN_(FLOPPY, "InitController: unable to reset controller\n"); - return STATUS_IO_DEVICE_ERROR; + WARN_(FLOPPY, "InitController: unable to reset controller\n"); + return STATUS_IO_DEVICE_ERROR; } - /* All controllers should support this so - * if we get something strange back then we - * know that this isn't a floppy controller - */ - if (HwGetVersion(ControllerInfo) <= 0) + /* All controllers should support this so + * if we get something strange back then we + * know that this isn't a floppy controller + */ + if (HwGetVersion(ControllerInfo) <= 0) { - WARN_(FLOPPY, "InitController: unable to contact controller\n"); - return STATUS_NO_SUCH_DEVICE; + WARN_(FLOPPY, "InitController: unable to contact controller\n"); + return STATUS_NO_SUCH_DEVICE; } - /* Reset the controller to avoid interrupt garbage on certain controllers */ - if(HwReset(ControllerInfo) != STATUS_SUCCESS) + /* Reset the controller to avoid interrupt garbage on certain controllers */ + if(HwReset(ControllerInfo) != STATUS_SUCCESS) { - WARN_(FLOPPY, "InitController: unable to reset controller #2\n"); - return STATUS_IO_DEVICE_ERROR; + WARN_(FLOPPY, "InitController: unable to reset controller #2\n"); + return STATUS_IO_DEVICE_ERROR; } - INFO_(FLOPPY, "InitController: setting data rate\n"); + INFO_(FLOPPY, "InitController: setting data rate\n"); - /* Set data rate */ - if(HwSetDataRate(ControllerInfo, DRSR_DSEL_500KBPS) != STATUS_SUCCESS) + /* Set data rate */ + if(HwSetDataRate(ControllerInfo, DRSR_DSEL_500KBPS) != STATUS_SUCCESS) { - WARN_(FLOPPY, "InitController: unable to set data rate\n"); - return STATUS_IO_DEVICE_ERROR; + WARN_(FLOPPY, "InitController: unable to set data rate\n"); + return STATUS_IO_DEVICE_ERROR; } - INFO_(FLOPPY, "InitController: waiting for initial interrupt\n"); + INFO_(FLOPPY, "InitController: waiting for initial interrupt\n"); - /* Wait for an interrupt */ - WaitForControllerInterrupt(ControllerInfo); + /* Wait for an interrupt */ + WaitForControllerInterrupt(ControllerInfo); - /* Reset means you have to clear each of the four interrupts (one per drive) */ - for(i = 0; i < MAX_DRIVES_PER_CONTROLLER; i++) + /* Reset means you have to clear each of the four interrupts (one per drive) */ + for(i = 0; i < MAX_DRIVES_PER_CONTROLLER; i++) { - INFO_(FLOPPY, "InitController: Sensing interrupt %d\n", i); + INFO_(FLOPPY, "InitController: Sensing interrupt %d\n", i); - if(HwSenseInterruptStatus(ControllerInfo) != STATUS_SUCCESS) - { - WARN_(FLOPPY, "InitController: Unable to clear interrupt 0x%x\n", i); - return STATUS_IO_DEVICE_ERROR; - } + if(HwSenseInterruptStatus(ControllerInfo) != STATUS_SUCCESS) + { + WARN_(FLOPPY, "InitController: Unable to clear interrupt 0x%x\n", i); + return STATUS_IO_DEVICE_ERROR; + } } - INFO_(FLOPPY, "InitController: done sensing interrupts\n"); + INFO_(FLOPPY, "InitController: done sensing interrupts\n"); - /* Next, see if we have the right version to do implied seek */ - if(HwGetVersion(ControllerInfo) == VERSION_ENHANCED) + /* Next, see if we have the right version to do implied seek */ + if(HwGetVersion(ControllerInfo) == VERSION_ENHANCED) { - /* If so, set that up -- all defaults below except first TRUE for EIS */ - if(HwConfigure(ControllerInfo, TRUE, TRUE, FALSE, 0, 0) != STATUS_SUCCESS) - { - WARN_(FLOPPY, "InitController: unable to set up implied seek\n"); - ControllerInfo->ImpliedSeeks = FALSE; - } - else - { - INFO_(FLOPPY, "InitController: implied seeks set!\n"); - ControllerInfo->ImpliedSeeks = TRUE; - } + /* If so, set that up -- all defaults below except first TRUE for EIS */ + if(HwConfigure(ControllerInfo, TRUE, TRUE, FALSE, 0, 0) != STATUS_SUCCESS) + { + WARN_(FLOPPY, "InitController: unable to set up implied seek\n"); + ControllerInfo->ImpliedSeeks = FALSE; + } + else + { + INFO_(FLOPPY, "InitController: implied seeks set!\n"); + ControllerInfo->ImpliedSeeks = TRUE; + } - /* - * FIXME: Figure out the answer to the below - * - * I must admit that I'm really confused about the Model 30 issue. At least one - * important bit (the disk change bit in the DIR) is flipped if this is a Model 30 - * controller. However, at least one other floppy driver believes that there are only - * two computers that are guaranteed to have a Model 30 controller: - * - IBM Thinkpad 750 - * - IBM PS2e - * - * ...and another driver only lists a config option for "thinkpad", that flips - * the change line. A third driver doesn't mention the Model 30 issue at all. - * - * What I can't tell is whether or not the average, run-of-the-mill computer now has - * a Model 30 controller. For the time being, I'm going to wire this to FALSE, - * and just not support the computers mentioned above, while I try to figure out - * how ubiquitous these newfangled 30 thingies are. - */ - //ControllerInfo->Model30 = TRUE; - ControllerInfo->Model30 = FALSE; + /* + * FIXME: Figure out the answer to the below + * + * I must admit that I'm really confused about the Model 30 issue. At least one + * important bit (the disk change bit in the DIR) is flipped if this is a Model 30 + * controller. However, at least one other floppy driver believes that there are only + * two computers that are guaranteed to have a Model 30 controller: + * - IBM Thinkpad 750 + * - IBM PS2e + * + * ...and another driver only lists a config option for "thinkpad", that flips + * the change line. A third driver doesn't mention the Model 30 issue at all. + * + * What I can't tell is whether or not the average, run-of-the-mill computer now has + * a Model 30 controller. For the time being, I'm going to wire this to FALSE, + * and just not support the computers mentioned above, while I try to figure out + * how ubiquitous these newfangled 30 thingies are. + */ + //ControllerInfo->Model30 = TRUE; + ControllerInfo->Model30 = FALSE; } - else + else { - INFO_(FLOPPY, "InitController: enhanced version not supported; disabling implied seeks\n"); - ControllerInfo->ImpliedSeeks = FALSE; - ControllerInfo->Model30 = FALSE; + INFO_(FLOPPY, "InitController: enhanced version not supported; disabling implied seeks\n"); + ControllerInfo->ImpliedSeeks = FALSE; + ControllerInfo->Model30 = FALSE; } - /* Specify */ - WARN_(FLOPPY, "FIXME: Figure out speed\n"); - HeadLoadTime = SPECIFY_HLT_500K; - HeadUnloadTime = SPECIFY_HUT_500K; - StepRateTime = SPECIFY_SRT_500K; + /* Specify */ + WARN_(FLOPPY, "FIXME: Figure out speed\n"); + HeadLoadTime = SPECIFY_HLT_500K; + HeadUnloadTime = SPECIFY_HUT_500K; + StepRateTime = SPECIFY_SRT_500K; - INFO_(FLOPPY, "InitController: issuing specify command to controller\n"); + INFO_(FLOPPY, "InitController: issuing specify command to controller\n"); - /* Don't disable DMA --> enable dma (dumb & confusing) */ - if(HwSpecify(ControllerInfo, HeadLoadTime, HeadUnloadTime, StepRateTime, FALSE) != STATUS_SUCCESS) + /* Don't disable DMA --> enable dma (dumb & confusing) */ + if(HwSpecify(ControllerInfo, HeadLoadTime, HeadUnloadTime, StepRateTime, FALSE) != STATUS_SUCCESS) { - WARN_(FLOPPY, "InitController: unable to specify options\n"); - return STATUS_IO_DEVICE_ERROR; + WARN_(FLOPPY, "InitController: unable to specify options\n"); + return STATUS_IO_DEVICE_ERROR; } - /* Init the stop stuff */ - KeInitializeDpc(&ControllerInfo->MotorStopDpc, MotorStopDpcFunc, ControllerInfo); - KeInitializeTimer(&ControllerInfo->MotorTimer); - KeInitializeEvent(&ControllerInfo->MotorStoppedEvent, NotificationEvent, FALSE); - ControllerInfo->StopDpcQueued = FALSE; + /* Init the stop stuff */ + KeInitializeDpc(&ControllerInfo->MotorStopDpc, MotorStopDpcFunc, ControllerInfo); + KeInitializeTimer(&ControllerInfo->MotorTimer); + KeInitializeEvent(&ControllerInfo->MotorStoppedEvent, NotificationEvent, FALSE); + ControllerInfo->StopDpcQueued = FALSE; - /* - * Recalibrate each drive on the controller (depends on StartMotor, which depends on the timer stuff above) - * We don't even know if there is a disk in the drive, so this may not work, but that's OK. - */ - for(i = 0; i < ControllerInfo->NumberOfDrives; i++) + /* + * Recalibrate each drive on the controller (depends on StartMotor, which depends on the timer stuff above) + * We don't even know if there is a disk in the drive, so this may not work, but that's OK. + */ + for(i = 0; i < ControllerInfo->NumberOfDrives; i++) { - INFO_(FLOPPY, "InitController: recalibrating drive 0x%x on controller 0x%p\n", i, ControllerInfo); - Recalibrate(&ControllerInfo->DriveInfo[i]); + INFO_(FLOPPY, "InitController: recalibrating drive 0x%x on controller 0x%p\n", i, ControllerInfo); + Recalibrate(&ControllerInfo->DriveInfo[i]); } - INFO_(FLOPPY, "InitController: done initializing; returning STATUS_SUCCESS\n"); + INFO_(FLOPPY, "InitController: done initializing; returning STATUS_SUCCESS\n"); - return STATUS_SUCCESS; + return STATUS_SUCCESS; } - -static BOOLEAN NTAPI AddControllers(PDRIVER_OBJECT DriverObject) + +static BOOLEAN NTAPI +AddControllers(PDRIVER_OBJECT DriverObject) /* * FUNCTION: Called on initialization to find our controllers and build device and controller objects for them * ARGUMENTS: @@ -828,180 +833,180 @@ static BOOLEAN NTAPI AddControllers(PDRIVER_OBJECT DriverObject) * - Report resource usage to the HAL */ { - INTERFACE_TYPE InterfaceType = Isa; - CONFIGURATION_TYPE ControllerType = DiskController; - CONFIGURATION_TYPE PeripheralType = FloppyDiskPeripheral; - KAFFINITY Affinity; - DEVICE_DESCRIPTION DeviceDescription; - UCHAR i; - UCHAR j; + INTERFACE_TYPE InterfaceType = Isa; + CONFIGURATION_TYPE ControllerType = DiskController; + CONFIGURATION_TYPE PeripheralType = FloppyDiskPeripheral; + KAFFINITY Affinity; + DEVICE_DESCRIPTION DeviceDescription; + UCHAR i; + UCHAR j; - PAGED_CODE(); + PAGED_CODE(); - /* Find our controllers on all ISA buses */ - IoQueryDeviceDescription(&InterfaceType, 0, &ControllerType, 0, &PeripheralType, 0, ConfigCallback, 0); + /* Find our controllers on all ISA buses */ + IoQueryDeviceDescription(&InterfaceType, 0, &ControllerType, 0, &PeripheralType, 0, ConfigCallback, 0); - /* - * w2k breaks the return val from ConfigCallback, so we have to hack around it, rather than just - * looking for a return value from ConfigCallback. We expect at least one controller. - */ - if(!gControllerInfo[0].Populated) + /* + * w2k breaks the return val from ConfigCallback, so we have to hack around it, rather than just + * looking for a return value from ConfigCallback. We expect at least one controller. + */ + if(!gControllerInfo[0].Populated) { - WARN_(FLOPPY, "AddControllers: failed to get controller info from registry\n"); - return FALSE; + WARN_(FLOPPY, "AddControllers: failed to get controller info from registry\n"); + return FALSE; } - /* Now that we have a controller, set it up with the system */ - for(i = 0; i < gNumberOfControllers; i++) + /* Now that we have a controller, set it up with the system */ + for(i = 0; i < gNumberOfControllers; i++) { - /* 0: Report resource usage to the kernel, to make sure they aren't assigned to anyone else */ - /* FIXME: Implement me. */ + /* 0: Report resource usage to the kernel, to make sure they aren't assigned to anyone else */ + /* FIXME: Implement me. */ - /* 1: Set up interrupt */ - gControllerInfo[i].MappedVector = HalGetInterruptVector(gControllerInfo[i].InterfaceType, gControllerInfo[i].BusNumber, - gControllerInfo[i].Level, gControllerInfo[i].Vector, - &gControllerInfo[i].MappedLevel, &Affinity); + /* 1: Set up interrupt */ + gControllerInfo[i].MappedVector = HalGetInterruptVector(gControllerInfo[i].InterfaceType, gControllerInfo[i].BusNumber, + gControllerInfo[i].Level, gControllerInfo[i].Vector, + &gControllerInfo[i].MappedLevel, &Affinity); - /* Must set up the DPC before we connect the interrupt */ - KeInitializeDpc(&gControllerInfo[i].Dpc, DpcForIsr, &gControllerInfo[i]); + /* Must set up the DPC before we connect the interrupt */ + KeInitializeDpc(&gControllerInfo[i].Dpc, DpcForIsr, &gControllerInfo[i]); - INFO_(FLOPPY, "Connecting interrupt %d to controller%d (object 0x%p)\n", gControllerInfo[i].MappedVector, - i, &gControllerInfo[i]); + INFO_(FLOPPY, "Connecting interrupt %d to controller%d (object 0x%p)\n", gControllerInfo[i].MappedVector, + i, &gControllerInfo[i]); - /* NOTE: We cannot share our interrupt, even on level-triggered buses. See Isr() for details. */ - if(IoConnectInterrupt(&gControllerInfo[i].InterruptObject, Isr, &gControllerInfo[i], 0, gControllerInfo[i].MappedVector, - gControllerInfo[i].MappedLevel, gControllerInfo[i].MappedLevel, gControllerInfo[i].InterruptMode, - FALSE, Affinity, 0) != STATUS_SUCCESS) + /* NOTE: We cannot share our interrupt, even on level-triggered buses. See Isr() for details. */ + if(IoConnectInterrupt(&gControllerInfo[i].InterruptObject, Isr, &gControllerInfo[i], 0, gControllerInfo[i].MappedVector, + gControllerInfo[i].MappedLevel, gControllerInfo[i].MappedLevel, gControllerInfo[i].InterruptMode, + FALSE, Affinity, 0) != STATUS_SUCCESS) { - WARN_(FLOPPY, "AddControllers: unable to connect interrupt\n"); - continue; + WARN_(FLOPPY, "AddControllers: unable to connect interrupt\n"); + continue; } - /* 2: Set up DMA */ - memset(&DeviceDescription, 0, sizeof(DeviceDescription)); - DeviceDescription.Version = DEVICE_DESCRIPTION_VERSION; - DeviceDescription.DmaChannel = gControllerInfo[i].Dma; - DeviceDescription.InterfaceType = gControllerInfo[i].InterfaceType; - DeviceDescription.BusNumber = gControllerInfo[i].BusNumber; - DeviceDescription.MaximumLength = 2*18*512; /* based on a 1.44MB floppy */ + /* 2: Set up DMA */ + memset(&DeviceDescription, 0, sizeof(DeviceDescription)); + DeviceDescription.Version = DEVICE_DESCRIPTION_VERSION; + DeviceDescription.DmaChannel = gControllerInfo[i].Dma; + DeviceDescription.InterfaceType = gControllerInfo[i].InterfaceType; + DeviceDescription.BusNumber = gControllerInfo[i].BusNumber; + DeviceDescription.MaximumLength = 2*18*512; /* based on a 1.44MB floppy */ - /* DMA 0,1,2,3 are 8-bit; 4,5,6,7 are 16-bit (4 is chain i think) */ - DeviceDescription.DmaWidth = gControllerInfo[i].Dma > 3 ? Width16Bits: Width8Bits; + /* DMA 0,1,2,3 are 8-bit; 4,5,6,7 are 16-bit (4 is chain i think) */ + DeviceDescription.DmaWidth = gControllerInfo[i].Dma > 3 ? Width16Bits: Width8Bits; - gControllerInfo[i].AdapterObject = HalGetAdapter(&DeviceDescription, &gControllerInfo[i].MapRegisters); + gControllerInfo[i].AdapterObject = HalGetAdapter(&DeviceDescription, &gControllerInfo[i].MapRegisters); - if(!gControllerInfo[i].AdapterObject) + if(!gControllerInfo[i].AdapterObject) { - WARN_(FLOPPY, "AddControllers: unable to allocate an adapter object\n"); - IoDisconnectInterrupt(gControllerInfo[i].InterruptObject); - continue; + WARN_(FLOPPY, "AddControllers: unable to allocate an adapter object\n"); + IoDisconnectInterrupt(gControllerInfo[i].InterruptObject); + continue; } - /* 2b: Initialize the new controller */ - if(InitController(&gControllerInfo[i]) != STATUS_SUCCESS) - { - WARN_(FLOPPY, "AddControllers(): Unable to set up controller %d - initialization failed\n", i); - IoDisconnectInterrupt(gControllerInfo[i].InterruptObject); - continue; - } - - /* 2c: Set the controller's initlized flag so we know to release stuff in Unload */ - gControllerInfo[i].Initialized = TRUE; - - /* 3: per-drive setup */ - for(j = 0; j < gControllerInfo[i].NumberOfDrives; j++) + /* 2b: Initialize the new controller */ + if(InitController(&gControllerInfo[i]) != STATUS_SUCCESS) { - WCHAR DeviceNameBuf[MAX_DEVICE_NAME]; - UNICODE_STRING DeviceName; - UNICODE_STRING LinkName; - UNICODE_STRING ArcPath; - UCHAR DriveNumber; + WARN_(FLOPPY, "AddControllers(): Unable to set up controller %d - initialization failed\n", i); + IoDisconnectInterrupt(gControllerInfo[i].InterruptObject); + continue; + } - INFO_(FLOPPY, "AddControllers(): Configuring drive %d on controller %d\n", i, j); + /* 2c: Set the controller's initlized flag so we know to release stuff in Unload */ + gControllerInfo[i].Initialized = TRUE; - /* - * 3a: create a device object for the drive - * Controllers and drives are 0-based, so the combos are: - * 0: 0,0 - * 1: 0,1 - * 2: 0,2 - * 3: 0,3 - * 4: 1,0 - * 5: 1,1 - * ... - * 14: 3,2 - * 15: 3,3 - */ + /* 3: per-drive setup */ + for(j = 0; j < gControllerInfo[i].NumberOfDrives; j++) + { + WCHAR DeviceNameBuf[MAX_DEVICE_NAME]; + UNICODE_STRING DeviceName; + UNICODE_STRING LinkName; + UNICODE_STRING ArcPath; + UCHAR DriveNumber; - DriveNumber = (UCHAR)(i*4 + j); /* loss of precision is OK; there are only 16 of 'em */ + INFO_(FLOPPY, "AddControllers(): Configuring drive %d on controller %d\n", i, j); - RtlZeroMemory(&DeviceNameBuf, MAX_DEVICE_NAME * sizeof(WCHAR)); - swprintf(DeviceNameBuf, L"\\Device\\Floppy%d", DriveNumber); - RtlInitUnicodeString(&DeviceName, DeviceNameBuf); + /* + * 3a: create a device object for the drive + * Controllers and drives are 0-based, so the combos are: + * 0: 0,0 + * 1: 0,1 + * 2: 0,2 + * 3: 0,3 + * 4: 1,0 + * 5: 1,1 + * ... + * 14: 3,2 + * 15: 3,3 + */ - if(IoCreateDevice(DriverObject, sizeof(PVOID), &DeviceName, - FILE_DEVICE_DISK, FILE_REMOVABLE_MEDIA | FILE_FLOPPY_DISKETTE, FALSE, - &gControllerInfo[i].DriveInfo[j].DeviceObject) != STATUS_SUCCESS) + DriveNumber = (UCHAR)(i*4 + j); /* loss of precision is OK; there are only 16 of 'em */ + + RtlZeroMemory(&DeviceNameBuf, MAX_DEVICE_NAME * sizeof(WCHAR)); + swprintf(DeviceNameBuf, L"\\Device\\Floppy%d", DriveNumber); + RtlInitUnicodeString(&DeviceName, DeviceNameBuf); + + if(IoCreateDevice(DriverObject, sizeof(PVOID), &DeviceName, + FILE_DEVICE_DISK, FILE_REMOVABLE_MEDIA | FILE_FLOPPY_DISKETTE, FALSE, + &gControllerInfo[i].DriveInfo[j].DeviceObject) != STATUS_SUCCESS) { - WARN_(FLOPPY, "AddControllers: unable to register a Device object\n"); - IoDisconnectInterrupt(gControllerInfo[i].InterruptObject); - continue; /* continue on to next drive */ + WARN_(FLOPPY, "AddControllers: unable to register a Device object\n"); + IoDisconnectInterrupt(gControllerInfo[i].InterruptObject); + continue; /* continue on to next drive */ } - INFO_(FLOPPY, "AddControllers: New device: %S (0x%p)\n", DeviceNameBuf, gControllerInfo[i].DriveInfo[j].DeviceObject); + INFO_(FLOPPY, "AddControllers: New device: %S (0x%p)\n", DeviceNameBuf, gControllerInfo[i].DriveInfo[j].DeviceObject); - /* 3b.5: Create an ARC path in case we're booting from this drive */ - swprintf(gControllerInfo[i].DriveInfo[j].ArcPathBuffer, - L"\\ArcName\\multi(%d)disk(%d)fdisk(%d)", gControllerInfo[i].BusNumber, i, DriveNumber); + /* 3b.5: Create an ARC path in case we're booting from this drive */ + swprintf(gControllerInfo[i].DriveInfo[j].ArcPathBuffer, + L"\\ArcName\\multi(%d)disk(%d)fdisk(%d)", gControllerInfo[i].BusNumber, i, DriveNumber); - RtlInitUnicodeString(&ArcPath, gControllerInfo[i].DriveInfo[j].ArcPathBuffer); - IoAssignArcName(&ArcPath, &DeviceName); + RtlInitUnicodeString(&ArcPath, gControllerInfo[i].DriveInfo[j].ArcPathBuffer); + IoAssignArcName(&ArcPath, &DeviceName); - /* 3c: Set flags up */ - gControllerInfo[i].DriveInfo[j].DeviceObject->Flags |= DO_DIRECT_IO; + /* 3c: Set flags up */ + gControllerInfo[i].DriveInfo[j].DeviceObject->Flags |= DO_DIRECT_IO; - /* 3d: Create a symlink */ - swprintf(gControllerInfo[i].DriveInfo[j].SymLinkBuffer, L"\\DosDevices\\%c:", DriveNumber + 'A'); - RtlInitUnicodeString(&LinkName, gControllerInfo[i].DriveInfo[j].SymLinkBuffer); - if(IoCreateSymbolicLink(&LinkName, &DeviceName) != STATUS_SUCCESS) - { - WARN_(FLOPPY, "AddControllers: Unable to create a symlink for drive %d\n", DriveNumber); - IoDisconnectInterrupt(gControllerInfo[i].InterruptObject); - IoDeassignArcName(&ArcPath); - continue; /* continue to next drive */ - } + /* 3d: Create a symlink */ + swprintf(gControllerInfo[i].DriveInfo[j].SymLinkBuffer, L"\\DosDevices\\%c:", DriveNumber + 'A'); + RtlInitUnicodeString(&LinkName, gControllerInfo[i].DriveInfo[j].SymLinkBuffer); + if(IoCreateSymbolicLink(&LinkName, &DeviceName) != STATUS_SUCCESS) + { + WARN_(FLOPPY, "AddControllers: Unable to create a symlink for drive %d\n", DriveNumber); + IoDisconnectInterrupt(gControllerInfo[i].InterruptObject); + IoDeassignArcName(&ArcPath); + continue; /* continue to next drive */ + } - /* 3e: Increase global floppy drives count */ - IoGetConfigurationInformation()->FloppyCount++; + /* 3e: Increase global floppy drives count */ + IoGetConfigurationInformation()->FloppyCount++; - /* 3f: Set up the DPC */ - IoInitializeDpcRequest(gControllerInfo[i].DriveInfo[j].DeviceObject, (PIO_DPC_ROUTINE)DpcForIsr); + /* 3f: Set up the DPC */ + IoInitializeDpcRequest(gControllerInfo[i].DriveInfo[j].DeviceObject, (PIO_DPC_ROUTINE)DpcForIsr); - /* 3g: Point the device extension at our DriveInfo struct */ - gControllerInfo[i].DriveInfo[j].DeviceObject->DeviceExtension = &gControllerInfo[i].DriveInfo[j]; + /* 3g: Point the device extension at our DriveInfo struct */ + gControllerInfo[i].DriveInfo[j].DeviceObject->DeviceExtension = &gControllerInfo[i].DriveInfo[j]; - /* 3h: neat comic strip */ + /* 3h: neat comic strip */ - /* 3i: set the initial media type to unknown */ - memset(&gControllerInfo[i].DriveInfo[j].DiskGeometry, 0, sizeof(DISK_GEOMETRY)); - gControllerInfo[i].DriveInfo[j].DiskGeometry.MediaType = Unknown; + /* 3i: set the initial media type to unknown */ + memset(&gControllerInfo[i].DriveInfo[j].DiskGeometry, 0, sizeof(DISK_GEOMETRY)); + gControllerInfo[i].DriveInfo[j].DiskGeometry.MediaType = Unknown; - /* 3j: Now that we're done, set the Initialized flag so we know to free this in Unload */ - gControllerInfo[i].DriveInfo[j].Initialized = TRUE; + /* 3j: Now that we're done, set the Initialized flag so we know to free this in Unload */ + gControllerInfo[i].DriveInfo[j].Initialized = TRUE; - /* 3k: Clear the DO_DEVICE_INITIALIZING flag */ - gControllerInfo[i].DriveInfo[j].DeviceObject->Flags &= ~DO_DEVICE_INITIALIZING; + /* 3k: Clear the DO_DEVICE_INITIALIZING flag */ + gControllerInfo[i].DriveInfo[j].DeviceObject->Flags &= ~DO_DEVICE_INITIALIZING; } } - INFO_(FLOPPY, "AddControllers: --------------------------------------------> finished adding controllers\n"); + INFO_(FLOPPY, "AddControllers: --------------------------------------------> finished adding controllers\n"); - return TRUE; + return TRUE; } - -VOID NTAPI SignalMediaChanged(PDEVICE_OBJECT DeviceObject, - PIRP Irp) + +VOID NTAPI +SignalMediaChanged(PDEVICE_OBJECT DeviceObject, PIRP Irp) /* * FUNCTION: Process an IRP when the media has changed, and possibly notify the user * ARGUMENTS: @@ -1013,106 +1018,107 @@ VOID NTAPI SignalMediaChanged(PDEVICE_OBJECT DeviceObject, * - Callable at <= DISPATCH_LEVEL */ { - PDRIVE_INFO DriveInfo = DeviceObject->DeviceExtension; + PDRIVE_INFO DriveInfo = DeviceObject->DeviceExtension; - TRACE_(FLOPPY, "SignalMediaChanged called\n"); + TRACE_(FLOPPY, "SignalMediaChanged called\n"); - DriveInfo->DiskChangeCount++; + DriveInfo->DiskChangeCount++; - /* If volume is not mounted, do NOT set verify and return STATUS_IO_DEVICE_ERROR */ - if(!(DeviceObject->Vpb->Flags & VPB_MOUNTED)) + /* If volume is not mounted, do NOT set verify and return STATUS_IO_DEVICE_ERROR */ + if(!(DeviceObject->Vpb->Flags & VPB_MOUNTED)) { - Irp->IoStatus.Status = STATUS_IO_DEVICE_ERROR; - Irp->IoStatus.Information = 0; - return; + Irp->IoStatus.Status = STATUS_IO_DEVICE_ERROR; + Irp->IoStatus.Information = 0; + return; } - /* Notify the filesystem that it will need to verify the volume */ - DeviceObject->Flags |= DO_VERIFY_VOLUME; - Irp->IoStatus.Status = STATUS_VERIFY_REQUIRED; - Irp->IoStatus.Information = 0; + /* Notify the filesystem that it will need to verify the volume */ + DeviceObject->Flags |= DO_VERIFY_VOLUME; + Irp->IoStatus.Status = STATUS_VERIFY_REQUIRED; + Irp->IoStatus.Information = 0; - /* - * If this is a user-based, threaded request, let the IO manager know to pop up a box asking - * the user to supply the correct media, but only if the error (which we just picked out above) - * is deemed by the IO manager to be "user induced". The reason we don't just unconditionally - * call IoSetHardError... is because MS might change the definition of "user induced" some day, - * and we don't want to have to remember to re-code this. - */ - if(Irp->Tail.Overlay.Thread && IoIsErrorUserInduced(Irp->IoStatus.Status)) - IoSetHardErrorOrVerifyDevice(Irp, DeviceObject); + /* + * If this is a user-based, threaded request, let the IO manager know to pop up a box asking + * the user to supply the correct media, but only if the error (which we just picked out above) + * is deemed by the IO manager to be "user induced". The reason we don't just unconditionally + * call IoSetHardError... is because MS might change the definition of "user induced" some day, + * and we don't want to have to remember to re-code this. + */ + if(Irp->Tail.Overlay.Thread && IoIsErrorUserInduced(Irp->IoStatus.Status)) + IoSetHardErrorOrVerifyDevice(Irp, DeviceObject); } - -static VOID NTAPI QueueThread(PVOID Context) + +static VOID NTAPI +QueueThread(PVOID Context) /* * FUNCTION: Thread that manages the queue and dispatches any queued requests * ARGUMENTS: * Context: unused */ { - PIRP Irp; - PIO_STACK_LOCATION Stack; - PDEVICE_OBJECT DeviceObject; - PVOID Objects[2]; + PIRP Irp; + PIO_STACK_LOCATION Stack; + PDEVICE_OBJECT DeviceObject; + PVOID Objects[2]; - PAGED_CODE(); - UNREFERENCED_PARAMETER(Context); + PAGED_CODE(); + UNREFERENCED_PARAMETER(Context); - Objects[0] = &QueueSemaphore; - Objects[1] = &QueueThreadTerminate; + Objects[0] = &QueueSemaphore; + Objects[1] = &QueueThreadTerminate; - for(;;) + for(;;) { - KeWaitForMultipleObjects(2, Objects, WaitAny, Executive, KernelMode, FALSE, NULL, NULL); + KeWaitForMultipleObjects(2, Objects, WaitAny, Executive, KernelMode, FALSE, NULL, NULL); - if(KeReadStateEvent(&QueueThreadTerminate)) - { - INFO_(FLOPPY, "QueueThread terminating\n"); - return; - } + if(KeReadStateEvent(&QueueThreadTerminate)) + { + INFO_(FLOPPY, "QueueThread terminating\n"); + return; + } - INFO_(FLOPPY, "QueueThread: servicing an IRP\n"); + INFO_(FLOPPY, "QueueThread: servicing an IRP\n"); - Irp = IoCsqRemoveNextIrp(&Csq, 0); + Irp = IoCsqRemoveNextIrp(&Csq, 0); - /* we won't get an irp if it was canceled */ - if(!Irp) - { - INFO_(FLOPPY, "QueueThread: IRP queue empty\n"); - continue; - } + /* we won't get an irp if it was canceled */ + if(!Irp) + { + INFO_(FLOPPY, "QueueThread: IRP queue empty\n"); + continue; + } - DeviceObject = (PDEVICE_OBJECT)Irp->Tail.Overlay.DriverContext[0]; + DeviceObject = (PDEVICE_OBJECT)Irp->Tail.Overlay.DriverContext[0]; - ASSERT(DeviceObject); + ASSERT(DeviceObject); - Stack = IoGetCurrentIrpStackLocation(Irp); + Stack = IoGetCurrentIrpStackLocation(Irp); - /* Decide what to do with the IRP */ - switch(Stack->MajorFunction) - { - case IRP_MJ_READ: - case IRP_MJ_WRITE: - ReadWritePassive(DeviceObject->DeviceExtension, Irp); - break; + /* Decide what to do with the IRP */ + switch(Stack->MajorFunction) + { + case IRP_MJ_READ: + case IRP_MJ_WRITE: + ReadWritePassive(DeviceObject->DeviceExtension, Irp); + break; - case IRP_MJ_DEVICE_CONTROL: - DeviceIoctlPassive(DeviceObject->DeviceExtension, Irp); - break; + case IRP_MJ_DEVICE_CONTROL: + DeviceIoctlPassive(DeviceObject->DeviceExtension, Irp); + break; - default: - WARN_(FLOPPY, "QueueThread(): Unrecognized irp: mj: 0x%x\n", Stack->MajorFunction); - Irp->IoStatus.Status = STATUS_NOT_SUPPORTED; - Irp->IoStatus.Information = 0; - IoCompleteRequest(Irp, IO_NO_INCREMENT); - } + default: + WARN_(FLOPPY, "QueueThread(): Unrecognized irp: mj: 0x%x\n", Stack->MajorFunction); + Irp->IoStatus.Status = STATUS_NOT_SUPPORTED; + Irp->IoStatus.Information = 0; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + } } } - -NTSTATUS NTAPI DriverEntry(PDRIVER_OBJECT DriverObject, - PUNICODE_STRING RegistryPath) + +NTSTATUS NTAPI +DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath) /* * FUNCTION: Entry-point for the driver * ARGUMENTS: @@ -1124,85 +1130,85 @@ NTSTATUS NTAPI DriverEntry(PDRIVER_OBJECT DriverObject, * STATUS_UNSUCCESSFUL otherwise */ { - HANDLE ThreadHandle; + HANDLE ThreadHandle; - UNREFERENCED_PARAMETER(RegistryPath); + UNREFERENCED_PARAMETER(RegistryPath); - /* - * Set up dispatch routines - */ - DriverObject->MajorFunction[IRP_MJ_CREATE] = (PDRIVER_DISPATCH)CreateClose; - DriverObject->MajorFunction[IRP_MJ_CLOSE] = (PDRIVER_DISPATCH)CreateClose; - DriverObject->MajorFunction[IRP_MJ_READ] = (PDRIVER_DISPATCH)ReadWrite; - DriverObject->MajorFunction[IRP_MJ_WRITE] = (PDRIVER_DISPATCH)ReadWrite; - DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = (PDRIVER_DISPATCH)DeviceIoctl; + /* + * Set up dispatch routines + */ + DriverObject->MajorFunction[IRP_MJ_CREATE] = (PDRIVER_DISPATCH)CreateClose; + DriverObject->MajorFunction[IRP_MJ_CLOSE] = (PDRIVER_DISPATCH)CreateClose; + DriverObject->MajorFunction[IRP_MJ_READ] = (PDRIVER_DISPATCH)ReadWrite; + DriverObject->MajorFunction[IRP_MJ_WRITE] = (PDRIVER_DISPATCH)ReadWrite; + DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = (PDRIVER_DISPATCH)DeviceIoctl; - DriverObject->DriverUnload = Unload; + DriverObject->DriverUnload = Unload; - /* - * We depend on some zeroes in these structures. I know this is supposed to be - * initialized to 0 by the complier but this makes me feel beter. - */ - memset(&gControllerInfo, 0, sizeof(gControllerInfo)); + /* + * We depend on some zeroes in these structures. I know this is supposed to be + * initialized to 0 by the complier but this makes me feel beter. + */ + memset(&gControllerInfo, 0, sizeof(gControllerInfo)); - /* - * Set up queue. This routine cannot fail (trust me, I wrote it). - */ - IoCsqInitialize(&Csq, CsqInsertIrp, CsqRemoveIrp, CsqPeekNextIrp, - CsqAcquireLock, CsqReleaseLock, CsqCompleteCanceledIrp); + /* + * Set up queue. This routine cannot fail (trust me, I wrote it). + */ + IoCsqInitialize(&Csq, CsqInsertIrp, CsqRemoveIrp, CsqPeekNextIrp, + CsqAcquireLock, CsqReleaseLock, CsqCompleteCanceledIrp); - /* - * ...and its lock - */ - KeInitializeSpinLock(&IrpQueueLock); + /* + * ...and its lock + */ + KeInitializeSpinLock(&IrpQueueLock); - /* - * ...and the queue list itself - */ - InitializeListHead(&IrpQueue); + /* + * ...and the queue list itself + */ + InitializeListHead(&IrpQueue); - /* - * The queue is counted by a semaphore. The queue management thread - * blocks on this semaphore, so if requests come in faster than the queue - * thread can handle them, the semaphore count goes up. - */ - KeInitializeSemaphore(&QueueSemaphore, 0, 0x7fffffff); + /* + * The queue is counted by a semaphore. The queue management thread + * blocks on this semaphore, so if requests come in faster than the queue + * thread can handle them, the semaphore count goes up. + */ + KeInitializeSemaphore(&QueueSemaphore, 0, 0x7fffffff); - /* - * Event to terminate that thread - */ - KeInitializeEvent(&QueueThreadTerminate, NotificationEvent, FALSE); + /* + * Event to terminate that thread + */ + KeInitializeEvent(&QueueThreadTerminate, NotificationEvent, FALSE); - /* - * Create the queue processing thread. Save its handle in the global variable - * ThreadHandle so we can wait on its termination during Unload. - */ - if(PsCreateSystemThread(&ThreadHandle, THREAD_ALL_ACCESS, 0, 0, 0, QueueThread, 0) != STATUS_SUCCESS) + /* + * Create the queue processing thread. Save its handle in the global variable + * ThreadHandle so we can wait on its termination during Unload. + */ + if(PsCreateSystemThread(&ThreadHandle, THREAD_ALL_ACCESS, 0, 0, 0, QueueThread, 0) != STATUS_SUCCESS) { - WARN_(FLOPPY, "Unable to create system thread; failing init\n"); - return STATUS_INSUFFICIENT_RESOURCES; + WARN_(FLOPPY, "Unable to create system thread; failing init\n"); + return STATUS_INSUFFICIENT_RESOURCES; } - if(ObReferenceObjectByHandle(ThreadHandle, STANDARD_RIGHTS_ALL, NULL, KernelMode, &QueueThreadObject, NULL) != STATUS_SUCCESS) + if(ObReferenceObjectByHandle(ThreadHandle, STANDARD_RIGHTS_ALL, NULL, KernelMode, &QueueThreadObject, NULL) != STATUS_SUCCESS) { - WARN_(FLOPPY, "Unable to reference returned thread handle; failing init\n"); - return STATUS_UNSUCCESSFUL; + WARN_(FLOPPY, "Unable to reference returned thread handle; failing init\n"); + return STATUS_UNSUCCESSFUL; } - /* - * Close the handle, now that we have the object pointer and a reference of our own. - * The handle will certainly not be valid in the context of the caller next time we - * need it, as handles are process-specific. - */ - ZwClose(ThreadHandle); + /* + * Close the handle, now that we have the object pointer and a reference of our own. + * The handle will certainly not be valid in the context of the caller next time we + * need it, as handles are process-specific. + */ + ZwClose(ThreadHandle); - /* - * Start the device discovery proces. Returns STATUS_SUCCESS if - * it finds even one drive attached to one controller. - */ - if(!AddControllers(DriverObject)) - return STATUS_NO_SUCH_DEVICE; + /* + * Start the device discovery proces. Returns STATUS_SUCCESS if + * it finds even one drive attached to one controller. + */ + if(!AddControllers(DriverObject)) + return STATUS_NO_SUCH_DEVICE; - return STATUS_SUCCESS; + return STATUS_SUCCESS; } diff --git a/reactos/drivers/storage/floppy/floppy.h b/reactos/drivers/storage/floppy/floppy.h index 7ce707f3c99..13f6a5ff8a4 100644 --- a/reactos/drivers/storage/floppy/floppy.h +++ b/reactos/drivers/storage/floppy/floppy.h @@ -39,64 +39,68 @@ struct _CONTROLLER_INFO; typedef struct _DRIVE_INFO { - struct _CONTROLLER_INFO *ControllerInfo; - UCHAR UnitNumber; /* 0,1,2,3 */ - LARGE_INTEGER MotorStartTime; - PDEVICE_OBJECT DeviceObject; - CM_FLOPPY_DEVICE_DATA FloppyDeviceData; - DISK_GEOMETRY DiskGeometry; - UCHAR BytesPerSectorCode; - WCHAR SymLinkBuffer[MAX_DEVICE_NAME]; - WCHAR ArcPathBuffer[MAX_ARC_PATH_LEN]; - ULONG DiskChangeCount; - BOOLEAN Initialized; + struct _CONTROLLER_INFO *ControllerInfo; + UCHAR UnitNumber; /* 0,1,2,3 */ + LARGE_INTEGER MotorStartTime; + PDEVICE_OBJECT DeviceObject; + CM_FLOPPY_DEVICE_DATA FloppyDeviceData; + DISK_GEOMETRY DiskGeometry; + UCHAR BytesPerSectorCode; + WCHAR SymLinkBuffer[MAX_DEVICE_NAME]; + WCHAR ArcPathBuffer[MAX_ARC_PATH_LEN]; + ULONG DiskChangeCount; + BOOLEAN Initialized; } DRIVE_INFO, *PDRIVE_INFO; typedef struct _CONTROLLER_INFO { - BOOLEAN Populated; - BOOLEAN Initialized; - ULONG ControllerNumber; - INTERFACE_TYPE InterfaceType; - ULONG BusNumber; - ULONG Level; - KIRQL MappedLevel; - ULONG Vector; - ULONG MappedVector; - KINTERRUPT_MODE InterruptMode; - PUCHAR BaseAddress; - ULONG Dma; - ULONG MapRegisters; - PVOID MapRegisterBase; - BOOLEAN Master; - KEVENT SynchEvent; - KDPC Dpc; - PKINTERRUPT InterruptObject; - PADAPTER_OBJECT AdapterObject; - UCHAR NumberOfDrives; - BOOLEAN ImpliedSeeks; - DRIVE_INFO DriveInfo[MAX_DRIVES_PER_CONTROLLER]; - PDRIVE_INFO CurrentDrive; - BOOLEAN Model30; - KEVENT MotorStoppedEvent; - KTIMER MotorTimer; - KDPC MotorStopDpc; - BOOLEAN StopDpcQueued; + BOOLEAN Populated; + BOOLEAN Initialized; + ULONG ControllerNumber; + INTERFACE_TYPE InterfaceType; + ULONG BusNumber; + ULONG Level; + KIRQL MappedLevel; + ULONG Vector; + ULONG MappedVector; + KINTERRUPT_MODE InterruptMode; + PUCHAR BaseAddress; + ULONG Dma; + ULONG MapRegisters; + PVOID MapRegisterBase; + BOOLEAN Master; + KEVENT SynchEvent; + KDPC Dpc; + PKINTERRUPT InterruptObject; + PADAPTER_OBJECT AdapterObject; + UCHAR NumberOfDrives; + BOOLEAN ImpliedSeeks; + DRIVE_INFO DriveInfo[MAX_DRIVES_PER_CONTROLLER]; + PDRIVE_INFO CurrentDrive; + BOOLEAN Model30; + KEVENT MotorStoppedEvent; + KTIMER MotorTimer; + KDPC MotorStopDpc; + BOOLEAN StopDpcQueued; } CONTROLLER_INFO, *PCONTROLLER_INFO; -NTSTATUS NTAPI DriverEntry(PDRIVER_OBJECT DriverObject, - PUNICODE_STRING RegistryPath); +NTSTATUS NTAPI +DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath); -VOID NTAPI SignalMediaChanged(PDEVICE_OBJECT DeviceObject, - PIRP Irp); +VOID NTAPI +SignalMediaChanged(PDEVICE_OBJECT DeviceObject, PIRP Irp); -VOID NTAPI WaitForControllerInterrupt(PCONTROLLER_INFO ControllerInfo); +VOID NTAPI +WaitForControllerInterrupt(PCONTROLLER_INFO ControllerInfo); -NTSTATUS NTAPI ResetChangeFlag(PDRIVE_INFO DriveInfo); +NTSTATUS NTAPI +ResetChangeFlag(PDRIVE_INFO DriveInfo); -VOID NTAPI StartMotor(PDRIVE_INFO DriveInfo); +VOID NTAPI +StartMotor(PDRIVE_INFO DriveInfo); -VOID NTAPI StopMotor(PCONTROLLER_INFO ControllerInfo); +VOID NTAPI +StopMotor(PCONTROLLER_INFO ControllerInfo); /* * MEDIA TYPES diff --git a/reactos/drivers/storage/floppy/hardware.c b/reactos/drivers/storage/floppy/hardware.c index d89b5dc9224..b0780759240 100644 --- a/reactos/drivers/storage/floppy/hardware.c +++ b/reactos/drivers/storage/floppy/hardware.c @@ -57,8 +57,9 @@ * Hardware Support Routines */ - -static BOOLEAN NTAPI ReadyForWrite(PCONTROLLER_INFO ControllerInfo) + +static BOOLEAN NTAPI +ReadyForWrite(PCONTROLLER_INFO ControllerInfo) /* * FUNCTION: Determine of the controller is ready to accept a byte on the FIFO * ARGUMENTS: @@ -71,19 +72,20 @@ static BOOLEAN NTAPI ReadyForWrite(PCONTROLLER_INFO ControllerInfo) * and that the "ready for i/o" bit is set. */ { - UCHAR Status = READ_PORT_UCHAR(ControllerInfo->BaseAddress + MAIN_STATUS_REGISTER); + UCHAR Status = READ_PORT_UCHAR(ControllerInfo->BaseAddress + MAIN_STATUS_REGISTER); - if(Status & MSR_IO_DIRECTION) /* 0 for out */ - return FALSE; + if(Status & MSR_IO_DIRECTION) /* 0 for out */ + return FALSE; - if(!(Status & MSR_DATA_REG_READY_FOR_IO)) - return FALSE; + if(!(Status & MSR_DATA_REG_READY_FOR_IO)) + return FALSE; - return TRUE; + return TRUE; } - -static BOOLEAN NTAPI ReadyForRead(PCONTROLLER_INFO ControllerInfo) + +static BOOLEAN NTAPI +ReadyForRead(PCONTROLLER_INFO ControllerInfo) /* * FUNCTION: Determine of the controller is ready to read a byte on the FIFO * ARGUMENTS: @@ -96,20 +98,20 @@ static BOOLEAN NTAPI ReadyForRead(PCONTROLLER_INFO ControllerInfo) * and that the "ready for i/o" bit is set. */ { - UCHAR Status = READ_PORT_UCHAR(ControllerInfo->BaseAddress + MAIN_STATUS_REGISTER); + UCHAR Status = READ_PORT_UCHAR(ControllerInfo->BaseAddress + MAIN_STATUS_REGISTER); - if(!(Status & MSR_IO_DIRECTION)) /* Read = 1 */ - return FALSE; + if(!(Status & MSR_IO_DIRECTION)) /* Read = 1 */ + return FALSE; - if(!(Status & MSR_DATA_REG_READY_FOR_IO)) - return FALSE; + if(!(Status & MSR_DATA_REG_READY_FOR_IO)) + return FALSE; - return TRUE; + return TRUE; } - -static NTSTATUS NTAPI Send_Byte(PCONTROLLER_INFO ControllerInfo, - UCHAR Byte) + +static NTSTATUS NTAPI +Send_Byte(PCONTROLLER_INFO ControllerInfo, UCHAR Byte) /* * FUNCTION: Send a byte from the host to the controller's FIFO * ARGUMENTS: @@ -129,34 +131,34 @@ static NTSTATUS NTAPI Send_Byte(PCONTROLLER_INFO ControllerInfo, * and isn't yet ready to read or write the next byte */ { - int i; + int i; - PAGED_CODE(); + PAGED_CODE(); - for(i = 0; i < 5; i++) + for(i = 0; i < 5; i++) { - if(ReadyForWrite(ControllerInfo)) - break; + if(ReadyForWrite(ControllerInfo)) + break; - KeStallExecutionProcessor(50); + KeStallExecutionProcessor(50); } - if (i < 5) - { - WRITE_PORT_UCHAR(ControllerInfo->BaseAddress + FIFO, Byte); - return STATUS_SUCCESS; - } - else - { - INFO_(FLOPPY, "Send_Byte: timed out trying to write\n"); - HwDumpRegisters(ControllerInfo); - return STATUS_UNSUCCESSFUL; - } + if (i < 5) + { + WRITE_PORT_UCHAR(ControllerInfo->BaseAddress + FIFO, Byte); + return STATUS_SUCCESS; + } + else + { + INFO_(FLOPPY, "Send_Byte: timed out trying to write\n"); + HwDumpRegisters(ControllerInfo); + return STATUS_UNSUCCESSFUL; + } } - -static NTSTATUS NTAPI Get_Byte(PCONTROLLER_INFO ControllerInfo, - PUCHAR Byte) + +static NTSTATUS NTAPI +Get_Byte(PCONTROLLER_INFO ControllerInfo, PUCHAR Byte) /* * FUNCTION: Read a byte from the controller to the host * ARGUMENTS: @@ -175,34 +177,34 @@ static NTSTATUS NTAPI Get_Byte(PCONTROLLER_INFO ControllerInfo, * - PAGED_CODE because we spin for longer than Microsoft recommends */ { - int i; + int i; - PAGED_CODE(); + PAGED_CODE(); - for(i = 0; i < 5; i++) + for(i = 0; i < 5; i++) { - if(ReadyForRead(ControllerInfo)) - break; + if(ReadyForRead(ControllerInfo)) + break; - KeStallExecutionProcessor(50); + KeStallExecutionProcessor(50); } - if (i < 5) - { - *Byte = READ_PORT_UCHAR(ControllerInfo->BaseAddress + FIFO); - return STATUS_SUCCESS; - } - else - { - INFO_(FLOPPY, "Get_Byte: timed out trying to write\n"); - HwDumpRegisters(ControllerInfo); - return STATUS_UNSUCCESSFUL; - } + if (i < 5) + { + *Byte = READ_PORT_UCHAR(ControllerInfo->BaseAddress + FIFO); + return STATUS_SUCCESS; + } + else + { + INFO_(FLOPPY, "Get_Byte: timed out trying to write\n"); + HwDumpRegisters(ControllerInfo); + return STATUS_UNSUCCESSFUL; + } } - -NTSTATUS NTAPI HwSetDataRate(PCONTROLLER_INFO ControllerInfo, - UCHAR DataRate) + +NTSTATUS NTAPI +HwSetDataRate(PCONTROLLER_INFO ControllerInfo, UCHAR DataRate) /* * FUNCTION: Set the data rte on a controller * ARGUMENTS: @@ -212,15 +214,16 @@ NTSTATUS NTAPI HwSetDataRate(PCONTROLLER_INFO ControllerInfo, * STATUS_SUCCESS */ { - TRACE_(FLOPPY, "HwSetDataRate called; writing rate code 0x%x to offset 0x%x\n", DataRate, DATA_RATE_SELECT_REGISTER); + TRACE_(FLOPPY, "HwSetDataRate called; writing rate code 0x%x to offset 0x%x\n", DataRate, DATA_RATE_SELECT_REGISTER); - WRITE_PORT_UCHAR(ControllerInfo->BaseAddress + DATA_RATE_SELECT_REGISTER, DataRate); + WRITE_PORT_UCHAR(ControllerInfo->BaseAddress + DATA_RATE_SELECT_REGISTER, DataRate); - return STATUS_SUCCESS; + return STATUS_SUCCESS; } - -NTSTATUS NTAPI HwTurnOffMotor(PCONTROLLER_INFO ControllerInfo) + +NTSTATUS NTAPI +HwTurnOffMotor(PCONTROLLER_INFO ControllerInfo) /* * FUNCTION: Turn off all motors * ARGUMENTS: @@ -233,15 +236,16 @@ NTSTATUS NTAPI HwTurnOffMotor(PCONTROLLER_INFO ControllerInfo) * - Called at DISPATCH_LEVEL */ { - TRACE_(FLOPPY, "HwTurnOffMotor: writing byte 0x%x to offset 0x%x\n", DOR_FDC_ENABLE|DOR_DMA_IO_INTERFACE_ENABLE, DIGITAL_OUTPUT_REGISTER); + TRACE_(FLOPPY, "HwTurnOffMotor: writing byte 0x%x to offset 0x%x\n", DOR_FDC_ENABLE|DOR_DMA_IO_INTERFACE_ENABLE, DIGITAL_OUTPUT_REGISTER); - WRITE_PORT_UCHAR(ControllerInfo->BaseAddress + DIGITAL_OUTPUT_REGISTER, DOR_FDC_ENABLE|DOR_DMA_IO_INTERFACE_ENABLE); + WRITE_PORT_UCHAR(ControllerInfo->BaseAddress + DIGITAL_OUTPUT_REGISTER, DOR_FDC_ENABLE|DOR_DMA_IO_INTERFACE_ENABLE); - return STATUS_SUCCESS; + return STATUS_SUCCESS; } - -NTSTATUS NTAPI HwTurnOnMotor(PDRIVE_INFO DriveInfo) + +NTSTATUS NTAPI +HwTurnOnMotor(PDRIVE_INFO DriveInfo) /* * FUNCTION: Turn on the motor on the selected drive * ARGUMENTS: @@ -254,35 +258,36 @@ NTSTATUS NTAPI HwTurnOnMotor(PDRIVE_INFO DriveInfo) * - Currently cannot fail */ { - PCONTROLLER_INFO ControllerInfo = DriveInfo->ControllerInfo; - UCHAR Unit = DriveInfo->UnitNumber; - UCHAR Buffer; + PCONTROLLER_INFO ControllerInfo = DriveInfo->ControllerInfo; + UCHAR Unit = DriveInfo->UnitNumber; + UCHAR Buffer; - PAGED_CODE(); + PAGED_CODE(); - /* turn on motor */ - Buffer = Unit; + /* turn on motor */ + Buffer = Unit; - Buffer |= DOR_FDC_ENABLE; - Buffer |= DOR_DMA_IO_INTERFACE_ENABLE; + Buffer |= DOR_FDC_ENABLE; + Buffer |= DOR_DMA_IO_INTERFACE_ENABLE; - if(Unit == 0) - Buffer |= DOR_FLOPPY_MOTOR_ON_A; - else if (Unit == 1) - Buffer |= DOR_FLOPPY_MOTOR_ON_B; - else if (Unit == 2) - Buffer |= DOR_FLOPPY_MOTOR_ON_C; - else if (Unit == 3) - Buffer |= DOR_FLOPPY_MOTOR_ON_D; + if(Unit == 0) + Buffer |= DOR_FLOPPY_MOTOR_ON_A; + else if (Unit == 1) + Buffer |= DOR_FLOPPY_MOTOR_ON_B; + else if (Unit == 2) + Buffer |= DOR_FLOPPY_MOTOR_ON_C; + else if (Unit == 3) + Buffer |= DOR_FLOPPY_MOTOR_ON_D; - TRACE_(FLOPPY, "HwTurnOnMotor: writing byte 0x%x to offset 0x%x\n", Buffer, DIGITAL_OUTPUT_REGISTER); - WRITE_PORT_UCHAR(ControllerInfo->BaseAddress + DIGITAL_OUTPUT_REGISTER, Buffer); + TRACE_(FLOPPY, "HwTurnOnMotor: writing byte 0x%x to offset 0x%x\n", Buffer, DIGITAL_OUTPUT_REGISTER); + WRITE_PORT_UCHAR(ControllerInfo->BaseAddress + DIGITAL_OUTPUT_REGISTER, Buffer); - return STATUS_SUCCESS; + return STATUS_SUCCESS; } - -NTSTATUS NTAPI HwSenseDriveStatus(PDRIVE_INFO DriveInfo) + +NTSTATUS NTAPI +HwSenseDriveStatus(PDRIVE_INFO DriveInfo) /* * FUNCTION: Start a sense status command * ARGUMENTS: @@ -295,37 +300,38 @@ NTSTATUS NTAPI HwSenseDriveStatus(PDRIVE_INFO DriveInfo) * - hard-wired to head 0 */ { - UCHAR Buffer[2]; - int i; + UCHAR Buffer[2]; + int i; - PAGED_CODE(); + PAGED_CODE(); - TRACE_(FLOPPY, "HwSenseDriveStatus called\n"); + TRACE_(FLOPPY, "HwSenseDriveStatus called\n"); - Buffer[0] = COMMAND_SENSE_DRIVE_STATUS; - Buffer[1] = DriveInfo->UnitNumber; /* hard-wired to head 0 for now */ + Buffer[0] = COMMAND_SENSE_DRIVE_STATUS; + Buffer[1] = DriveInfo->UnitNumber; /* hard-wired to head 0 for now */ - for(i = 0; i < 2; i++) - if(Send_Byte(DriveInfo->ControllerInfo, Buffer[i]) != STATUS_SUCCESS) - { - WARN_(FLOPPY, "HwSenseDriveStatus: failed to write FIFO\n"); - return STATUS_UNSUCCESSFUL; - } + for(i = 0; i < 2; i++) + if(Send_Byte(DriveInfo->ControllerInfo, Buffer[i]) != STATUS_SUCCESS) + { + WARN_(FLOPPY, "HwSenseDriveStatus: failed to write FIFO\n"); + return STATUS_UNSUCCESSFUL; + } - return STATUS_SUCCESS; + return STATUS_SUCCESS; } - -NTSTATUS NTAPI HwReadWriteData(PCONTROLLER_INFO ControllerInfo, - BOOLEAN Read, - UCHAR Unit, - UCHAR Cylinder, - UCHAR Head, - UCHAR Sector, - UCHAR BytesPerSector, - UCHAR EndOfTrack, - UCHAR Gap3Length, - UCHAR DataLength) + +NTSTATUS NTAPI +HwReadWriteData(PCONTROLLER_INFO ControllerInfo, + BOOLEAN Read, + UCHAR Unit, + UCHAR Cylinder, + UCHAR Head, + UCHAR Sector, + UCHAR BytesPerSector, + UCHAR EndOfTrack, + UCHAR Gap3Length, + UCHAR DataLength) /* * FUNCTION: Read or write data to the drive * ARGUMENTS: @@ -346,48 +352,49 @@ NTSTATUS NTAPI HwReadWriteData(PCONTROLLER_INFO ControllerInfo, * - Generates an interrupt */ { - UCHAR Buffer[9]; - int i; + UCHAR Buffer[9]; + int i; - PAGED_CODE(); + PAGED_CODE(); - /* Shouldn't be using DataLength in this driver */ - ASSERT(DataLength == 0xff); + /* Shouldn't be using DataLength in this driver */ + ASSERT(DataLength == 0xff); - /* Build the command to send */ - if(Read) - Buffer[0] = COMMAND_READ_DATA; - else - Buffer[0] = COMMAND_WRITE_DATA; + /* Build the command to send */ + if(Read) + Buffer[0] = COMMAND_READ_DATA; + else + Buffer[0] = COMMAND_WRITE_DATA; - Buffer[0] |= READ_DATA_MFM | READ_DATA_MT; + Buffer[0] |= READ_DATA_MFM | READ_DATA_MT; - Buffer[1] = (Head << COMMAND_HEAD_NUMBER_SHIFT) | Unit; - Buffer[2] = Cylinder; - Buffer[3] = Head; - Buffer[4] = Sector; - Buffer[5] = BytesPerSector; - Buffer[6] = EndOfTrack; - Buffer[7] = Gap3Length; - Buffer[8] = DataLength; + Buffer[1] = (Head << COMMAND_HEAD_NUMBER_SHIFT) | Unit; + Buffer[2] = Cylinder; + Buffer[3] = Head; + Buffer[4] = Sector; + Buffer[5] = BytesPerSector; + Buffer[6] = EndOfTrack; + Buffer[7] = Gap3Length; + Buffer[8] = DataLength; - /* Send the command */ - for(i = 0; i < 9; i++) + /* Send the command */ + for(i = 0; i < 9; i++) { INFO_(FLOPPY, "HwReadWriteData: Sending a command byte to the FIFO: 0x%x\n", Buffer[i]); - if(Send_Byte(ControllerInfo, Buffer[i]) != STATUS_SUCCESS) - { - WARN_(FLOPPY, "HwReadWriteData: Unable to write to the FIFO\n"); - return STATUS_UNSUCCESSFUL; - } + if(Send_Byte(ControllerInfo, Buffer[i]) != STATUS_SUCCESS) + { + WARN_(FLOPPY, "HwReadWriteData: Unable to write to the FIFO\n"); + return STATUS_UNSUCCESSFUL; + } } - return STATUS_SUCCESS; + return STATUS_SUCCESS; } - -NTSTATUS NTAPI HwRecalibrateResult(PCONTROLLER_INFO ControllerInfo) + +NTSTATUS NTAPI +HwRecalibrateResult(PCONTROLLER_INFO ControllerInfo) /* * FUNCTION: Get the result of a recalibrate command * ARGUMENTS: @@ -403,55 +410,56 @@ NTSTATUS NTAPI HwRecalibrateResult(PCONTROLLER_INFO ControllerInfo) * - perhaps handle more status */ { - UCHAR Buffer[2]; - int i; + UCHAR Buffer[2]; + int i; - PAGED_CODE(); + PAGED_CODE(); - if(Send_Byte(ControllerInfo, COMMAND_SENSE_INTERRUPT_STATUS) != STATUS_SUCCESS) + if(Send_Byte(ControllerInfo, COMMAND_SENSE_INTERRUPT_STATUS) != STATUS_SUCCESS) { - WARN_(FLOPPY, "HwRecalibrateResult: Unable to write the controller\n"); - return STATUS_UNSUCCESSFUL; - } - - for(i = 0; i < 2; i++) - if(Get_Byte(ControllerInfo, &Buffer[i]) != STATUS_SUCCESS) - { - WARN_(FLOPPY, "HwRecalibrateResult: unable to read FIFO\n"); + WARN_(FLOPPY, "HwRecalibrateResult: Unable to write the controller\n"); return STATUS_UNSUCCESSFUL; - } - - /* Validate that it did what we told it to */ - INFO_(FLOPPY, "HwRecalibrateResult results: ST0: 0x%x PCN: 0x%x\n", Buffer[0], Buffer[1]); - - /* - * Buffer[0] = ST0 - * Buffer[1] = PCN - */ - - /* Is the PCN 0? */ - if(Buffer[1] != 0) - { - WARN_(FLOPPY, "HwRecalibrateResult: PCN not 0\n"); - return STATUS_UNSUCCESSFUL; } - /* test seek complete */ - if((Buffer[0] & SR0_SEEK_COMPLETE) != SR0_SEEK_COMPLETE) + for(i = 0; i < 2; i++) + if(Get_Byte(ControllerInfo, &Buffer[i]) != STATUS_SUCCESS) + { + WARN_(FLOPPY, "HwRecalibrateResult: unable to read FIFO\n"); + return STATUS_UNSUCCESSFUL; + } + + /* Validate that it did what we told it to */ + INFO_(FLOPPY, "HwRecalibrateResult results: ST0: 0x%x PCN: 0x%x\n", Buffer[0], Buffer[1]); + + /* + * Buffer[0] = ST0 + * Buffer[1] = PCN + */ + + /* Is the PCN 0? */ + if(Buffer[1] != 0) { - WARN_(FLOPPY, "HwRecalibrateResult: Failed to complete the seek\n"); - return STATUS_UNSUCCESSFUL; + WARN_(FLOPPY, "HwRecalibrateResult: PCN not 0\n"); + return STATUS_UNSUCCESSFUL; } - /* Is the equipment check flag set? Could be no disk in drive... */ - if((Buffer[0] & SR0_EQUIPMENT_CHECK) == SR0_EQUIPMENT_CHECK) - INFO_(FLOPPY, "HwRecalibrateResult: Seeked to track 0 successfully, but EC is set; returning STATUS_SUCCESS anyway\n"); + /* test seek complete */ + if((Buffer[0] & SR0_SEEK_COMPLETE) != SR0_SEEK_COMPLETE) + { + WARN_(FLOPPY, "HwRecalibrateResult: Failed to complete the seek\n"); + return STATUS_UNSUCCESSFUL; + } - return STATUS_SUCCESS; + /* Is the equipment check flag set? Could be no disk in drive... */ + if((Buffer[0] & SR0_EQUIPMENT_CHECK) == SR0_EQUIPMENT_CHECK) + INFO_(FLOPPY, "HwRecalibrateResult: Seeked to track 0 successfully, but EC is set; returning STATUS_SUCCESS anyway\n"); + + return STATUS_SUCCESS; } - -NTSTATUS NTAPI HwReadWriteResult(PCONTROLLER_INFO ControllerInfo) + +NTSTATUS NTAPI +HwReadWriteResult(PCONTROLLER_INFO ControllerInfo) /* * FUNCTION: Get the result of a read or write from the controller * ARGUMENTS: @@ -467,31 +475,32 @@ NTSTATUS NTAPI HwReadWriteResult(PCONTROLLER_INFO ControllerInfo) * - perhaps handle more status */ { - UCHAR Buffer[7]; - int i; + UCHAR Buffer[7]; + int i; - PAGED_CODE(); + PAGED_CODE(); - for(i = 0; i < 7; i++) - if(Get_Byte(ControllerInfo, &Buffer[i]) != STATUS_SUCCESS) - { - WARN_(FLOPPY, "HwReadWriteResult: unable to read fifo\n"); + for(i = 0; i < 7; i++) + if(Get_Byte(ControllerInfo, &Buffer[i]) != STATUS_SUCCESS) + { + WARN_(FLOPPY, "HwReadWriteResult: unable to read fifo\n"); + return STATUS_UNSUCCESSFUL; + } + + /* Validate that it did what we told it to */ + INFO_(FLOPPY, "HwReadWriteResult results: 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n", Buffer[0], Buffer[1], Buffer[2], Buffer[3], + Buffer[4], Buffer[5], Buffer[6]); + + /* Last command successful? */ + if((Buffer[0] & SR0_LAST_COMMAND_STATUS) != SR0_LCS_SUCCESS) return STATUS_UNSUCCESSFUL; - } - /* Validate that it did what we told it to */ - INFO_(FLOPPY, "HwReadWriteResult results: 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n", Buffer[0], Buffer[1], Buffer[2], Buffer[3], - Buffer[4], Buffer[5], Buffer[6]); - - /* Last command successful? */ - if((Buffer[0] & SR0_LAST_COMMAND_STATUS) != SR0_LCS_SUCCESS) - return STATUS_UNSUCCESSFUL; - - return STATUS_SUCCESS; + return STATUS_SUCCESS; } - -NTSTATUS NTAPI HwRecalibrate(PDRIVE_INFO DriveInfo) + +NTSTATUS NTAPI +HwRecalibrate(PDRIVE_INFO DriveInfo) /* * FUNCTION: Start a recalibration of a drive * ARGUMENTS: @@ -503,30 +512,31 @@ NTSTATUS NTAPI HwRecalibrate(PDRIVE_INFO DriveInfo) * - Generates an interrupt */ { - PCONTROLLER_INFO ControllerInfo = DriveInfo->ControllerInfo; - UCHAR Unit = DriveInfo->UnitNumber; - UCHAR Buffer[2]; - int i; + PCONTROLLER_INFO ControllerInfo = DriveInfo->ControllerInfo; + UCHAR Unit = DriveInfo->UnitNumber; + UCHAR Buffer[2]; + int i; - TRACE_(FLOPPY, "HwRecalibrate called\n"); + TRACE_(FLOPPY, "HwRecalibrate called\n"); - PAGED_CODE(); + PAGED_CODE(); - Buffer[0] = COMMAND_RECALIBRATE; - Buffer[1] = Unit; + Buffer[0] = COMMAND_RECALIBRATE; + Buffer[1] = Unit; - for(i = 0; i < 2; i++) - if(Send_Byte(ControllerInfo, Buffer[i]) != STATUS_SUCCESS) - { - WARN_(FLOPPY, "HwRecalibrate: unable to write FIFO\n"); - return STATUS_UNSUCCESSFUL; - } + for(i = 0; i < 2; i++) + if(Send_Byte(ControllerInfo, Buffer[i]) != STATUS_SUCCESS) + { + WARN_(FLOPPY, "HwRecalibrate: unable to write FIFO\n"); + return STATUS_UNSUCCESSFUL; + } - return STATUS_SUCCESS; + return STATUS_SUCCESS; } - -NTSTATUS NTAPI HwSenseInterruptStatus(PCONTROLLER_INFO ControllerInfo) + +NTSTATUS NTAPI +HwSenseInterruptStatus(PCONTROLLER_INFO ControllerInfo) /* * FUNCTION: Send a sense interrupt status command to a controller * ARGUMENTS: @@ -536,33 +546,34 @@ NTSTATUS NTAPI HwSenseInterruptStatus(PCONTROLLER_INFO ControllerInfo) * STATUS_UNSUCCESSFUL if not */ { - UCHAR Buffer[2]; - int i; + UCHAR Buffer[2]; + int i; - PAGED_CODE(); + PAGED_CODE(); - if(Send_Byte(ControllerInfo, COMMAND_SENSE_INTERRUPT_STATUS) != STATUS_SUCCESS) + if(Send_Byte(ControllerInfo, COMMAND_SENSE_INTERRUPT_STATUS) != STATUS_SUCCESS) { - WARN_(FLOPPY, "HwSenseInterruptStatus: failed to write controller\n"); - return STATUS_UNSUCCESSFUL; + WARN_(FLOPPY, "HwSenseInterruptStatus: failed to write controller\n"); + return STATUS_UNSUCCESSFUL; } - for(i = 0; i < 2; i++) + for(i = 0; i < 2; i++) { - if(Get_Byte(ControllerInfo, &Buffer[i]) != STATUS_SUCCESS) - { - WARN_(FLOPPY, "HwSenseInterruptStatus: failed to read controller\n"); - return STATUS_UNSUCCESSFUL; - } + if(Get_Byte(ControllerInfo, &Buffer[i]) != STATUS_SUCCESS) + { + WARN_(FLOPPY, "HwSenseInterruptStatus: failed to read controller\n"); + return STATUS_UNSUCCESSFUL; + } } - INFO_(FLOPPY, "HwSenseInterruptStatus returned 0x%x 0x%x\n", Buffer[0], Buffer[1]); + INFO_(FLOPPY, "HwSenseInterruptStatus returned 0x%x 0x%x\n", Buffer[0], Buffer[1]); - return STATUS_SUCCESS; + return STATUS_SUCCESS; } - -NTSTATUS NTAPI HwReadId(PDRIVE_INFO DriveInfo, UCHAR Head) + +NTSTATUS NTAPI +HwReadId(PDRIVE_INFO DriveInfo, UCHAR Head) /* * FUNCTION: Issue a read id command to the drive * ARGUMENTS: @@ -575,34 +586,35 @@ NTSTATUS NTAPI HwReadId(PDRIVE_INFO DriveInfo, UCHAR Head) * - Generates an interrupt */ { - UCHAR Buffer[2]; - int i; + UCHAR Buffer[2]; + int i; - TRACE_(FLOPPY, "HwReadId called\n"); + TRACE_(FLOPPY, "HwReadId called\n"); - PAGED_CODE(); + PAGED_CODE(); - Buffer[0] = COMMAND_READ_ID | READ_ID_MFM; - Buffer[1] = (Head << COMMAND_HEAD_NUMBER_SHIFT) | DriveInfo->UnitNumber; + Buffer[0] = COMMAND_READ_ID | READ_ID_MFM; + Buffer[1] = (Head << COMMAND_HEAD_NUMBER_SHIFT) | DriveInfo->UnitNumber; - for(i = 0; i < 2; i++) - if(Send_Byte(DriveInfo->ControllerInfo, Buffer[i]) != STATUS_SUCCESS) - { - WARN_(FLOPPY, "HwReadId: unable to send bytes to fifo\n"); - return STATUS_UNSUCCESSFUL; - } + for(i = 0; i < 2; i++) + if(Send_Byte(DriveInfo->ControllerInfo, Buffer[i]) != STATUS_SUCCESS) + { + WARN_(FLOPPY, "HwReadId: unable to send bytes to fifo\n"); + return STATUS_UNSUCCESSFUL; + } - return STATUS_SUCCESS; + return STATUS_SUCCESS; } - -NTSTATUS NTAPI HwFormatTrack(PCONTROLLER_INFO ControllerInfo, - UCHAR Unit, - UCHAR Head, - UCHAR BytesPerSector, - UCHAR SectorsPerTrack, - UCHAR Gap3Length, - UCHAR FillerPattern) + +NTSTATUS NTAPI +HwFormatTrack(PCONTROLLER_INFO ControllerInfo, + UCHAR Unit, + UCHAR Head, + UCHAR BytesPerSector, + UCHAR SectorsPerTrack, + UCHAR Gap3Length, + UCHAR FillerPattern) /* * FUNCTION: Format a track * ARGUMENTS: @@ -618,33 +630,33 @@ NTSTATUS NTAPI HwFormatTrack(PCONTROLLER_INFO ControllerInfo, * STATUS_UNSUCCESSFUL otherwise */ { - UCHAR Buffer[6]; - int i; + UCHAR Buffer[6]; + int i; - TRACE_(FLOPPY, "HwFormatTrack called\n"); + TRACE_(FLOPPY, "HwFormatTrack called\n"); - PAGED_CODE(); + PAGED_CODE(); - Buffer[0] = COMMAND_FORMAT_TRACK; - Buffer[1] = (Head << COMMAND_HEAD_NUMBER_SHIFT) | Unit; - Buffer[2] = BytesPerSector; - Buffer[3] = SectorsPerTrack; - Buffer[4] = Gap3Length; - Buffer[5] = FillerPattern; + Buffer[0] = COMMAND_FORMAT_TRACK; + Buffer[1] = (Head << COMMAND_HEAD_NUMBER_SHIFT) | Unit; + Buffer[2] = BytesPerSector; + Buffer[3] = SectorsPerTrack; + Buffer[4] = Gap3Length; + Buffer[5] = FillerPattern; - for(i = 0; i < 6; i++) - if(Send_Byte(ControllerInfo, Buffer[i]) != STATUS_SUCCESS) - { - WARN_(FLOPPY, "HwFormatTrack: unable to send bytes to floppy\n"); - return STATUS_UNSUCCESSFUL; - } + for(i = 0; i < 6; i++) + if(Send_Byte(ControllerInfo, Buffer[i]) != STATUS_SUCCESS) + { + WARN_(FLOPPY, "HwFormatTrack: unable to send bytes to floppy\n"); + return STATUS_UNSUCCESSFUL; + } - return STATUS_SUCCESS; + return STATUS_SUCCESS; } - -NTSTATUS NTAPI HwSeek(PDRIVE_INFO DriveInfo, - UCHAR Cylinder) + +NTSTATUS NTAPI +HwSeek(PDRIVE_INFO DriveInfo, UCHAR Cylinder) /* * FUNCTION: Seek the heads to a particular cylinder * ARGUMENTS: @@ -657,42 +669,43 @@ NTSTATUS NTAPI HwSeek(PDRIVE_INFO DriveInfo, * - Generates an interrupt */ { - LARGE_INTEGER Delay; - UCHAR Buffer[3]; - int i; + LARGE_INTEGER Delay; + UCHAR Buffer[3]; + int i; - TRACE_(FLOPPY, "HwSeek called for cyl 0x%x\n", Cylinder); + TRACE_(FLOPPY, "HwSeek called for cyl 0x%x\n", Cylinder); - PAGED_CODE(); + PAGED_CODE(); - Buffer[0] = COMMAND_SEEK; - Buffer[1] = DriveInfo->UnitNumber; - Buffer[2] = Cylinder; + Buffer[0] = COMMAND_SEEK; + Buffer[1] = DriveInfo->UnitNumber; + Buffer[2] = Cylinder; - for(i = 0; i < 3; i++) - if(Send_Byte(DriveInfo->ControllerInfo, Buffer[i]) != STATUS_SUCCESS) - { - WARN_(FLOPPY, "HwSeek: failed to write fifo\n"); - return STATUS_UNSUCCESSFUL; - } + for(i = 0; i < 3; i++) + if(Send_Byte(DriveInfo->ControllerInfo, Buffer[i]) != STATUS_SUCCESS) + { + WARN_(FLOPPY, "HwSeek: failed to write fifo\n"); + return STATUS_UNSUCCESSFUL; + } - /* Wait for the head to settle */ - Delay.QuadPart = 10 * 1000; - Delay.QuadPart *= -1; - Delay.QuadPart *= DriveInfo->FloppyDeviceData.HeadSettleTime; + /* Wait for the head to settle */ + Delay.QuadPart = 10 * 1000; + Delay.QuadPart *= -1; + Delay.QuadPart *= DriveInfo->FloppyDeviceData.HeadSettleTime; - KeDelayExecutionThread(KernelMode, FALSE, &Delay); + KeDelayExecutionThread(KernelMode, FALSE, &Delay); - return STATUS_SUCCESS; + return STATUS_SUCCESS; } - -NTSTATUS NTAPI HwConfigure(PCONTROLLER_INFO ControllerInfo, - BOOLEAN EIS, - BOOLEAN EFIFO, - BOOLEAN POLL, - UCHAR FIFOTHR, - UCHAR PRETRK) + +NTSTATUS NTAPI +HwConfigure(PCONTROLLER_INFO ControllerInfo, + BOOLEAN EIS, + BOOLEAN EFIFO, + BOOLEAN POLL, + UCHAR FIFOTHR, + UCHAR PRETRK) /* * FUNCTION: Sends configuration to the drive * ARGUMENTS: @@ -709,30 +722,31 @@ NTSTATUS NTAPI HwConfigure(PCONTROLLER_INFO ControllerInfo, * - No interrupt */ { - UCHAR Buffer[4]; - int i; + UCHAR Buffer[4]; + int i; - TRACE_(FLOPPY, "HwConfigure called\n"); + TRACE_(FLOPPY, "HwConfigure called\n"); - PAGED_CODE(); + PAGED_CODE(); - Buffer[0] = COMMAND_CONFIGURE; - Buffer[1] = 0; - Buffer[2] = (EIS * CONFIGURE_EIS) + (EFIFO * CONFIGURE_EFIFO) + (POLL * CONFIGURE_POLL) + (FIFOTHR); - Buffer[3] = PRETRK; + Buffer[0] = COMMAND_CONFIGURE; + Buffer[1] = 0; + Buffer[2] = (EIS * CONFIGURE_EIS) + (EFIFO * CONFIGURE_EFIFO) + (POLL * CONFIGURE_POLL) + (FIFOTHR); + Buffer[3] = PRETRK; - for(i = 0; i < 4; i++) - if(Send_Byte(ControllerInfo, Buffer[i]) != STATUS_SUCCESS) - { - WARN_(FLOPPY, "HwConfigure: failed to write the fifo\n"); - return STATUS_UNSUCCESSFUL; - } + for(i = 0; i < 4; i++) + if(Send_Byte(ControllerInfo, Buffer[i]) != STATUS_SUCCESS) + { + WARN_(FLOPPY, "HwConfigure: failed to write the fifo\n"); + return STATUS_UNSUCCESSFUL; + } - return STATUS_SUCCESS; + return STATUS_SUCCESS; } - -NTSTATUS NTAPI HwGetVersion(PCONTROLLER_INFO ControllerInfo) + +NTSTATUS NTAPI +HwGetVersion(PCONTROLLER_INFO ControllerInfo) /* * FUNCTION: Gets the version of the controller * ARGUMENTS: @@ -746,29 +760,29 @@ NTSTATUS NTAPI HwGetVersion(PCONTROLLER_INFO ControllerInfo) * we issue the command */ { - UCHAR Buffer; + UCHAR Buffer; - PAGED_CODE(); + PAGED_CODE(); - if(Send_Byte(ControllerInfo, COMMAND_VERSION) != STATUS_SUCCESS) + if(Send_Byte(ControllerInfo, COMMAND_VERSION) != STATUS_SUCCESS) { - WARN_(FLOPPY, "HwGetVersion: unable to write fifo\n"); - return STATUS_UNSUCCESSFUL; + WARN_(FLOPPY, "HwGetVersion: unable to write fifo\n"); + return STATUS_UNSUCCESSFUL; } - if(Get_Byte(ControllerInfo, &Buffer) != STATUS_SUCCESS) + if(Get_Byte(ControllerInfo, &Buffer) != STATUS_SUCCESS) { - WARN_(FLOPPY, "HwGetVersion: unable to write fifo\n"); - return STATUS_UNSUCCESSFUL; + WARN_(FLOPPY, "HwGetVersion: unable to write fifo\n"); + return STATUS_UNSUCCESSFUL; } - INFO_(FLOPPY, "HwGetVersion returning version 0x%x\n", Buffer); + INFO_(FLOPPY, "HwGetVersion returning version 0x%x\n", Buffer); - return Buffer; + return Buffer; } -NTSTATUS NTAPI HwDiskChanged(PDRIVE_INFO DriveInfo, - PBOOLEAN DiskChanged) +NTSTATUS NTAPI +HwDiskChanged(PDRIVE_INFO DriveInfo, PBOOLEAN DiskChanged) /* * FUNCTION: Detect whether the hardware has sensed a disk change * ARGUMENTS: @@ -781,45 +795,45 @@ NTSTATUS NTAPI HwDiskChanged(PDRIVE_INFO DriveInfo, * - Guessing a bit at the Model30 stuff */ { - UCHAR Buffer; - PCONTROLLER_INFO ControllerInfo = (PCONTROLLER_INFO) DriveInfo->ControllerInfo; + UCHAR Buffer; + PCONTROLLER_INFO ControllerInfo = (PCONTROLLER_INFO) DriveInfo->ControllerInfo; - Buffer = READ_PORT_UCHAR(ControllerInfo->BaseAddress + DIGITAL_INPUT_REGISTER); + Buffer = READ_PORT_UCHAR(ControllerInfo->BaseAddress + DIGITAL_INPUT_REGISTER); - TRACE_(FLOPPY, "HwDiskChanged: read 0x%x from DIR\n", Buffer); + TRACE_(FLOPPY, "HwDiskChanged: read 0x%x from DIR\n", Buffer); - if(ControllerInfo->Model30) + if(ControllerInfo->Model30) { - if(!(Buffer & DIR_DISKETTE_CHANGE)) - { - INFO_(FLOPPY, "HdDiskChanged - Model30 - returning TRUE\n"); - *DiskChanged = TRUE; - } - else - { - INFO_(FLOPPY, "HdDiskChanged - Model30 - returning FALSE\n"); - *DiskChanged = FALSE; - } + if(!(Buffer & DIR_DISKETTE_CHANGE)) + { + INFO_(FLOPPY, "HdDiskChanged - Model30 - returning TRUE\n"); + *DiskChanged = TRUE; + } + else + { + INFO_(FLOPPY, "HdDiskChanged - Model30 - returning FALSE\n"); + *DiskChanged = FALSE; + } } - else + else { - if(Buffer & DIR_DISKETTE_CHANGE) - { - INFO_(FLOPPY, "HdDiskChanged - PS2 - returning TRUE\n"); - *DiskChanged = TRUE; - } - else - { - INFO_(FLOPPY, "HdDiskChanged - PS2 - returning FALSE\n"); - *DiskChanged = FALSE; - } + if(Buffer & DIR_DISKETTE_CHANGE) + { + INFO_(FLOPPY, "HdDiskChanged - PS2 - returning TRUE\n"); + *DiskChanged = TRUE; + } + else + { + INFO_(FLOPPY, "HdDiskChanged - PS2 - returning FALSE\n"); + *DiskChanged = FALSE; + } } - return STATUS_SUCCESS; + return STATUS_SUCCESS; } -NTSTATUS NTAPI HwSenseDriveStatusResult(PCONTROLLER_INFO ControllerInfo, - PUCHAR Status) +NTSTATUS NTAPI +HwSenseDriveStatusResult(PCONTROLLER_INFO ControllerInfo, PUCHAR Status) /* * FUNCTION: Get the result of a sense drive status command * ARGUMENTS: @@ -832,23 +846,24 @@ NTSTATUS NTAPI HwSenseDriveStatusResult(PCONTROLLER_INFO ControllerInfo, * - Called post-interrupt; does not interrupt */ { - PAGED_CODE(); + PAGED_CODE(); - if(Get_Byte(ControllerInfo, Status) != STATUS_SUCCESS) + if(Get_Byte(ControllerInfo, Status) != STATUS_SUCCESS) { - WARN_(FLOPPY, "HwSenseDriveStatus: unable to read fifo\n"); - return STATUS_UNSUCCESSFUL; + WARN_(FLOPPY, "HwSenseDriveStatus: unable to read fifo\n"); + return STATUS_UNSUCCESSFUL; } - TRACE_(FLOPPY, "HwSenseDriveStatusResult: ST3: 0x%x\n", *Status); + TRACE_(FLOPPY, "HwSenseDriveStatusResult: ST3: 0x%x\n", *Status); - return STATUS_SUCCESS; + return STATUS_SUCCESS; } - -NTSTATUS NTAPI HwReadIdResult(PCONTROLLER_INFO ControllerInfo, - PUCHAR CurCylinder, - PUCHAR CurHead) + +NTSTATUS NTAPI +HwReadIdResult(PCONTROLLER_INFO ControllerInfo, + PUCHAR CurCylinder, + PUCHAR CurHead) /* * FUNCTION: Get the result of a read id command * ARGUMENTS: @@ -866,51 +881,52 @@ NTSTATUS NTAPI HwReadIdResult(PCONTROLLER_INFO ControllerInfo, * - perhaps handle more status */ { - UCHAR Buffer[7] = {0,0,0,0,0,0,0}; - int i; + UCHAR Buffer[7] = {0,0,0,0,0,0,0}; + int i; - PAGED_CODE(); + PAGED_CODE(); - for(i = 0; i < 7; i++) - if(Get_Byte(ControllerInfo, &Buffer[i]) != STATUS_SUCCESS) - { - WARN_(FLOPPY, "ReadIdResult(): can't read from the controller\n"); + for(i = 0; i < 7; i++) + if(Get_Byte(ControllerInfo, &Buffer[i]) != STATUS_SUCCESS) + { + WARN_(FLOPPY, "ReadIdResult(): can't read from the controller\n"); + return STATUS_UNSUCCESSFUL; + } + + /* Validate that it did what we told it to */ + INFO_(FLOPPY, "ReadId results: 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n", Buffer[0], Buffer[1], Buffer[2], Buffer[3], + Buffer[4], Buffer[5], Buffer[6]); + + /* Last command successful? */ + if((Buffer[0] & SR0_LAST_COMMAND_STATUS) != SR0_LCS_SUCCESS) + { + WARN_(FLOPPY, "ReadId didn't return last command success\n"); return STATUS_UNSUCCESSFUL; - } - - /* Validate that it did what we told it to */ - INFO_(FLOPPY, "ReadId results: 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n", Buffer[0], Buffer[1], Buffer[2], Buffer[3], - Buffer[4], Buffer[5], Buffer[6]); - - /* Last command successful? */ - if((Buffer[0] & SR0_LAST_COMMAND_STATUS) != SR0_LCS_SUCCESS) - { - WARN_(FLOPPY, "ReadId didn't return last command success\n"); - return STATUS_UNSUCCESSFUL; } - /* ID mark found? */ - if(Buffer[1] & SR1_CANNOT_FIND_ID_ADDRESS) + /* ID mark found? */ + if(Buffer[1] & SR1_CANNOT_FIND_ID_ADDRESS) { - WARN_(FLOPPY, "ReadId didn't find an address mark\n"); - return STATUS_UNSUCCESSFUL; + WARN_(FLOPPY, "ReadId didn't find an address mark\n"); + return STATUS_UNSUCCESSFUL; } - if(CurCylinder) - *CurCylinder = Buffer[3]; + if(CurCylinder) + *CurCylinder = Buffer[3]; - if(CurHead) - *CurHead = Buffer[4]; + if(CurHead) + *CurHead = Buffer[4]; - return STATUS_SUCCESS; + return STATUS_SUCCESS; } - -NTSTATUS NTAPI HwSpecify(PCONTROLLER_INFO ControllerInfo, - UCHAR HeadLoadTime, - UCHAR HeadUnloadTime, - UCHAR StepRateTime, - BOOLEAN NonDma) + +NTSTATUS NTAPI +HwSpecify(PCONTROLLER_INFO ControllerInfo, + UCHAR HeadLoadTime, + UCHAR HeadUnloadTime, + UCHAR StepRateTime, + BOOLEAN NonDma) /* * FUNCTION: Set up timing and DMA mode for the controller * ARGUMENTS: @@ -928,32 +944,33 @@ NTSTATUS NTAPI HwSpecify(PCONTROLLER_INFO ControllerInfo, * TODO: Figure out timings */ { - UCHAR Buffer[3]; - int i; + UCHAR Buffer[3]; + int i; - Buffer[0] = COMMAND_SPECIFY; - /* - Buffer[1] = (StepRateTime << 4) + HeadUnloadTime; - Buffer[2] = (HeadLoadTime << 1) + (NonDma ? 1 : 0); - */ - Buffer[1] = 0xdf; - Buffer[2] = 0x2; + Buffer[0] = COMMAND_SPECIFY; + /* + Buffer[1] = (StepRateTime << 4) + HeadUnloadTime; + Buffer[2] = (HeadLoadTime << 1) + (NonDma ? 1 : 0); + */ + Buffer[1] = 0xdf; + Buffer[2] = 0x2; - //INFO_(FLOPPY, "HwSpecify: sending 0x%x 0x%x 0x%x to FIFO\n", Buffer[0], Buffer[1], Buffer[2]); - WARN_(FLOPPY, "HWSPECIFY: FIXME - sending 0x3 0xd1 0x2 to FIFO\n"); + //INFO_(FLOPPY, "HwSpecify: sending 0x%x 0x%x 0x%x to FIFO\n", Buffer[0], Buffer[1], Buffer[2]); + WARN_(FLOPPY, "HWSPECIFY: FIXME - sending 0x3 0xd1 0x2 to FIFO\n"); - for(i = 0; i < 3; i++) - if(Send_Byte(ControllerInfo, Buffer[i]) != STATUS_SUCCESS) - { - WARN_(FLOPPY, "HwSpecify: unable to write to controller\n"); - return STATUS_UNSUCCESSFUL; - } + for(i = 0; i < 3; i++) + if(Send_Byte(ControllerInfo, Buffer[i]) != STATUS_SUCCESS) + { + WARN_(FLOPPY, "HwSpecify: unable to write to controller\n"); + return STATUS_UNSUCCESSFUL; + } - return STATUS_SUCCESS; + return STATUS_SUCCESS; } - -NTSTATUS NTAPI HwReset(PCONTROLLER_INFO ControllerInfo) + +NTSTATUS NTAPI +HwReset(PCONTROLLER_INFO ControllerInfo) /* * FUNCTION: Reset the controller * ARGUMENTS: @@ -964,32 +981,33 @@ NTSTATUS NTAPI HwReset(PCONTROLLER_INFO ControllerInfo) * - Generates an interrupt that must be serviced four times (one per drive) */ { - TRACE_(FLOPPY, "HwReset called\n"); + TRACE_(FLOPPY, "HwReset called\n"); - /* Write the reset bit in the DRSR */ - WRITE_PORT_UCHAR(ControllerInfo->BaseAddress + DATA_RATE_SELECT_REGISTER, DRSR_SW_RESET); + /* Write the reset bit in the DRSR */ + WRITE_PORT_UCHAR(ControllerInfo->BaseAddress + DATA_RATE_SELECT_REGISTER, DRSR_SW_RESET); - /* Check for the reset bit in the DOR and set it if necessary (see Intel doc) */ - if(!(READ_PORT_UCHAR(ControllerInfo->BaseAddress + DIGITAL_OUTPUT_REGISTER) & DOR_RESET)) + /* Check for the reset bit in the DOR and set it if necessary (see Intel doc) */ + if(!(READ_PORT_UCHAR(ControllerInfo->BaseAddress + DIGITAL_OUTPUT_REGISTER) & DOR_RESET)) { - HwDumpRegisters(ControllerInfo); - INFO_(FLOPPY, "HwReset: Setting Enable bit\n"); - WRITE_PORT_UCHAR(ControllerInfo->BaseAddress + DIGITAL_OUTPUT_REGISTER, DOR_DMA_IO_INTERFACE_ENABLE|DOR_RESET); - HwDumpRegisters(ControllerInfo); + HwDumpRegisters(ControllerInfo); + INFO_(FLOPPY, "HwReset: Setting Enable bit\n"); + WRITE_PORT_UCHAR(ControllerInfo->BaseAddress + DIGITAL_OUTPUT_REGISTER, DOR_DMA_IO_INTERFACE_ENABLE|DOR_RESET); + HwDumpRegisters(ControllerInfo); - if(!(READ_PORT_UCHAR(ControllerInfo->BaseAddress + DIGITAL_OUTPUT_REGISTER) & DOR_RESET)) - { - WARN_(FLOPPY, "HwReset: failed to set the DOR enable bit!\n"); - HwDumpRegisters(ControllerInfo); - return STATUS_UNSUCCESSFUL; - } + if(!(READ_PORT_UCHAR(ControllerInfo->BaseAddress + DIGITAL_OUTPUT_REGISTER) & DOR_RESET)) + { + WARN_(FLOPPY, "HwReset: failed to set the DOR enable bit!\n"); + HwDumpRegisters(ControllerInfo); + return STATUS_UNSUCCESSFUL; + } } - return STATUS_SUCCESS; + return STATUS_SUCCESS; } - -NTSTATUS NTAPI HwPowerOff(PCONTROLLER_INFO ControllerInfo) + +NTSTATUS NTAPI +HwPowerOff(PCONTROLLER_INFO ControllerInfo) /* * FUNCTION: Power down a controller * ARGUMENTS: @@ -1000,27 +1018,28 @@ NTSTATUS NTAPI HwPowerOff(PCONTROLLER_INFO ControllerInfo) * - Wake up with a hardware reset */ { - TRACE_(FLOPPY, "HwPowerOff called on controller 0x%p\n", ControllerInfo); + TRACE_(FLOPPY, "HwPowerOff called on controller 0x%p\n", ControllerInfo); - WRITE_PORT_UCHAR(ControllerInfo->BaseAddress + DATA_RATE_SELECT_REGISTER, DRSR_POWER_DOWN); + WRITE_PORT_UCHAR(ControllerInfo->BaseAddress + DATA_RATE_SELECT_REGISTER, DRSR_POWER_DOWN); - return STATUS_SUCCESS; + return STATUS_SUCCESS; } -VOID NTAPI HwDumpRegisters(PCONTROLLER_INFO ControllerInfo) +VOID NTAPI +HwDumpRegisters(PCONTROLLER_INFO ControllerInfo) /* * FUNCTION: Dump all readable registers from the floppy controller * ARGUMENTS: * ControllerInfo: Controller to dump registers from */ { - UNREFERENCED_PARAMETER(ControllerInfo); + UNREFERENCED_PARAMETER(ControllerInfo); - INFO_(FLOPPY, "STATUS:\n"); - INFO_(FLOPPY, "STATUS_REGISTER_A = 0x%x\n", READ_PORT_UCHAR(ControllerInfo->BaseAddress + STATUS_REGISTER_A)); - INFO_(FLOPPY, "STATUS_REGISTER_B = 0x%x\n", READ_PORT_UCHAR(ControllerInfo->BaseAddress + STATUS_REGISTER_B)); - INFO_(FLOPPY, "DIGITAL_OUTPUT_REGISTER = 0x%x\n", READ_PORT_UCHAR(ControllerInfo->BaseAddress + DIGITAL_OUTPUT_REGISTER)); - INFO_(FLOPPY, "MAIN_STATUS_REGISTER =0x%x\n", READ_PORT_UCHAR(ControllerInfo->BaseAddress + MAIN_STATUS_REGISTER)); - INFO_(FLOPPY, "DIGITAL_INPUT_REGISTER = 0x%x\n", READ_PORT_UCHAR(ControllerInfo->BaseAddress + DIGITAL_INPUT_REGISTER)); + INFO_(FLOPPY, "STATUS:\n"); + INFO_(FLOPPY, "STATUS_REGISTER_A = 0x%x\n", READ_PORT_UCHAR(ControllerInfo->BaseAddress + STATUS_REGISTER_A)); + INFO_(FLOPPY, "STATUS_REGISTER_B = 0x%x\n", READ_PORT_UCHAR(ControllerInfo->BaseAddress + STATUS_REGISTER_B)); + INFO_(FLOPPY, "DIGITAL_OUTPUT_REGISTER = 0x%x\n", READ_PORT_UCHAR(ControllerInfo->BaseAddress + DIGITAL_OUTPUT_REGISTER)); + INFO_(FLOPPY, "MAIN_STATUS_REGISTER =0x%x\n", READ_PORT_UCHAR(ControllerInfo->BaseAddress + MAIN_STATUS_REGISTER)); + INFO_(FLOPPY, "DIGITAL_INPUT_REGISTER = 0x%x\n", READ_PORT_UCHAR(ControllerInfo->BaseAddress + DIGITAL_INPUT_REGISTER)); } diff --git a/reactos/drivers/storage/floppy/hardware.h b/reactos/drivers/storage/floppy/hardware.h index 2939178bea9..720c828d3f6 100644 --- a/reactos/drivers/storage/floppy/hardware.h +++ b/reactos/drivers/storage/floppy/hardware.h @@ -260,76 +260,94 @@ /* * FUNCTIONS */ -NTSTATUS NTAPI HwTurnOnMotor(PDRIVE_INFO DriveInfo); +NTSTATUS NTAPI +HwTurnOnMotor(PDRIVE_INFO DriveInfo); -NTSTATUS NTAPI HwSenseDriveStatus(PDRIVE_INFO DriveInfo); +NTSTATUS NTAPI +HwSenseDriveStatus(PDRIVE_INFO DriveInfo); -NTSTATUS NTAPI HwReadWriteData(PCONTROLLER_INFO ControllerInfo, - BOOLEAN Read, - UCHAR Unit, - UCHAR Cylinder, - UCHAR Head, - UCHAR Sector, - UCHAR BytesPerSector, - UCHAR EndOfTrack, - UCHAR Gap3Length, - UCHAR DataLength); +NTSTATUS NTAPI +HwReadWriteData(PCONTROLLER_INFO ControllerInfo, + BOOLEAN Read, + UCHAR Unit, + UCHAR Cylinder, + UCHAR Head, + UCHAR Sector, + UCHAR BytesPerSector, + UCHAR EndOfTrack, + UCHAR Gap3Length, + UCHAR DataLength); -NTSTATUS NTAPI HwRecalibrate(PDRIVE_INFO DriveInfo); +NTSTATUS NTAPI +HwRecalibrate(PDRIVE_INFO DriveInfo); -NTSTATUS NTAPI HwSenseInterruptStatus(PCONTROLLER_INFO ControllerInfo); +NTSTATUS NTAPI +HwSenseInterruptStatus(PCONTROLLER_INFO ControllerInfo); -NTSTATUS NTAPI HwReadId(PDRIVE_INFO DriveInfo, - UCHAR Head); +NTSTATUS NTAPI +HwReadId(PDRIVE_INFO DriveInfo, UCHAR Head); -NTSTATUS NTAPI HwFormatTrack(PCONTROLLER_INFO ControllerInfo, - UCHAR Unit, - UCHAR Head, - UCHAR BytesPerSector, - UCHAR SectorsPerTrack, - UCHAR Gap3Length, - UCHAR FillerPattern); +NTSTATUS NTAPI +HwFormatTrack(PCONTROLLER_INFO ControllerInfo, + UCHAR Unit, + UCHAR Head, + UCHAR BytesPerSector, + UCHAR SectorsPerTrack, + UCHAR Gap3Length, + UCHAR FillerPattern); -NTSTATUS NTAPI HwSeek(PDRIVE_INFO DriveInfo, - UCHAR Cylinder); +NTSTATUS NTAPI +HwSeek(PDRIVE_INFO DriveInfo, UCHAR Cylinder); -NTSTATUS NTAPI HwReadWriteResult(PCONTROLLER_INFO ControllerInfo); +NTSTATUS NTAPI +HwReadWriteResult(PCONTROLLER_INFO ControllerInfo); -NTSTATUS NTAPI HwGetVersion(PCONTROLLER_INFO ControllerInfo); +NTSTATUS NTAPI +HwGetVersion(PCONTROLLER_INFO ControllerInfo); -NTSTATUS NTAPI HwConfigure(PCONTROLLER_INFO ControllerInfo, - BOOLEAN EIS, - BOOLEAN EFIFO, - BOOLEAN POLL, - UCHAR FIFOTHR, - UCHAR PRETRK) ; +NTSTATUS NTAPI +HwConfigure(PCONTROLLER_INFO ControllerInfo, + BOOLEAN EIS, + BOOLEAN EFIFO, + BOOLEAN POLL, + UCHAR FIFOTHR, + UCHAR PRETRK) ; -NTSTATUS NTAPI HwRecalibrateResult(PCONTROLLER_INFO ControllerInfo); +NTSTATUS NTAPI +HwRecalibrateResult(PCONTROLLER_INFO ControllerInfo); -NTSTATUS NTAPI HwDiskChanged(PDRIVE_INFO DriveInfo, - PBOOLEAN DiskChanged); +NTSTATUS NTAPI +HwDiskChanged(PDRIVE_INFO DriveInfo, + PBOOLEAN DiskChanged); -NTSTATUS NTAPI HwSenseDriveStatusResult(PCONTROLLER_INFO ControllerInfo, - PUCHAR Status); +NTSTATUS NTAPI +HwSenseDriveStatusResult(PCONTROLLER_INFO ControllerInfo, + PUCHAR Status); -NTSTATUS NTAPI HwSpecify(PCONTROLLER_INFO ControllerInfo, - UCHAR HeadLoadTime, - UCHAR HeadUnloadTime, - UCHAR StepRateTime, - BOOLEAN NonDma); +NTSTATUS NTAPI +HwSpecify(PCONTROLLER_INFO ControllerInfo, + UCHAR HeadLoadTime, + UCHAR HeadUnloadTime, + UCHAR StepRateTime, + BOOLEAN NonDma); -NTSTATUS NTAPI HwReadIdResult(PCONTROLLER_INFO ControllerInfo, - PUCHAR CurCylinder, - PUCHAR CurHead); +NTSTATUS NTAPI +HwReadIdResult(PCONTROLLER_INFO ControllerInfo, + PUCHAR CurCylinder, + PUCHAR CurHead); -NTSTATUS NTAPI HwSetDataRate(PCONTROLLER_INFO ControllerInfo, - UCHAR DataRate); +NTSTATUS NTAPI +HwSetDataRate(PCONTROLLER_INFO ControllerInfo, UCHAR DataRate); -NTSTATUS NTAPI HwReset(PCONTROLLER_INFO Controller); +NTSTATUS NTAPI +HwReset(PCONTROLLER_INFO Controller); -NTSTATUS NTAPI HwPowerOff(PCONTROLLER_INFO ControllerInfo); +NTSTATUS NTAPI +HwPowerOff(PCONTROLLER_INFO ControllerInfo); -VOID NTAPI HwDumpRegisters(PCONTROLLER_INFO ControllerInfo); +VOID NTAPI +HwDumpRegisters(PCONTROLLER_INFO ControllerInfo); -NTSTATUS NTAPI HwTurnOffMotor(PCONTROLLER_INFO ControllerInfo); +NTSTATUS NTAPI +HwTurnOffMotor(PCONTROLLER_INFO ControllerInfo); diff --git a/reactos/drivers/storage/floppy/ioctl.c b/reactos/drivers/storage/floppy/ioctl.c index 54749e84f8c..d172a4dfab3 100644 --- a/reactos/drivers/storage/floppy/ioctl.c +++ b/reactos/drivers/storage/floppy/ioctl.c @@ -39,9 +39,9 @@ #include "csqrtns.h" #include "ioctl.h" - -NTSTATUS NTAPI DeviceIoctl(PDEVICE_OBJECT DeviceObject, - PIRP Irp) + +NTSTATUS NTAPI +DeviceIoctl(PDEVICE_OBJECT DeviceObject, PIRP Irp) /* * FUNCTION: Queue IOCTL IRPs * ARGUMENTS: @@ -55,18 +55,18 @@ NTSTATUS NTAPI DeviceIoctl(PDEVICE_OBJECT DeviceObject, * read/write or ioctl irps. */ { - ASSERT(DeviceObject); - ASSERT(Irp); + ASSERT(DeviceObject); + ASSERT(Irp); - Irp->Tail.Overlay.DriverContext[0] = DeviceObject; - IoCsqInsertIrp(&Csq, Irp, NULL); + Irp->Tail.Overlay.DriverContext[0] = DeviceObject; + IoCsqInsertIrp(&Csq, Irp, NULL); - return STATUS_PENDING; + return STATUS_PENDING; } - -VOID NTAPI DeviceIoctlPassive(PDRIVE_INFO DriveInfo, - PIRP Irp) + +VOID NTAPI +DeviceIoctlPassive(PDRIVE_INFO DriveInfo, PIRP Irp) /* * FUNCTION: Handlees IOCTL requests at PASSIVE_LEVEL * ARGUMENTS: @@ -74,108 +74,108 @@ VOID NTAPI DeviceIoctlPassive(PDRIVE_INFO DriveInfo, * Irp: IRP with the request in it */ { - PIO_STACK_LOCATION Stack = IoGetCurrentIrpStackLocation(Irp); - ULONG OutputLength = Stack->Parameters.DeviceIoControl.OutputBufferLength; - PVOID OutputBuffer = Irp->AssociatedIrp.SystemBuffer; - ULONG Code = Stack->Parameters.DeviceIoControl.IoControlCode; - BOOLEAN DiskChanged; + PIO_STACK_LOCATION Stack = IoGetCurrentIrpStackLocation(Irp); + ULONG OutputLength = Stack->Parameters.DeviceIoControl.OutputBufferLength; + PVOID OutputBuffer = Irp->AssociatedIrp.SystemBuffer; + ULONG Code = Stack->Parameters.DeviceIoControl.IoControlCode; + BOOLEAN DiskChanged; - TRACE_(FLOPPY, "DeviceIoctl called\n"); - Irp->IoStatus.Status = STATUS_SUCCESS; - Irp->IoStatus.Information = 0; + TRACE_(FLOPPY, "DeviceIoctl called\n"); + Irp->IoStatus.Status = STATUS_SUCCESS; + Irp->IoStatus.Information = 0; - /* - * First the non-change-sensitive ioctls - */ - if(Code == IOCTL_DISK_GET_MEDIA_TYPES) + /* + * First the non-change-sensitive ioctls + */ + if(Code == IOCTL_DISK_GET_MEDIA_TYPES) { - PDISK_GEOMETRY Geometry = OutputBuffer; - INFO_(FLOPPY, "IOCTL_DISK_GET_MEDIA_TYPES Called\n"); + PDISK_GEOMETRY Geometry = OutputBuffer; + INFO_(FLOPPY, "IOCTL_DISK_GET_MEDIA_TYPES Called\n"); - if(OutputLength < sizeof(DISK_GEOMETRY)) + if(OutputLength < sizeof(DISK_GEOMETRY)) { - INFO_(FLOPPY, "IOCTL_DISK_GET_MEDIA_TYPES: insufficient buffer; returning STATUS_INVALID_PARAMETER\n"); - Irp->IoStatus.Status = STATUS_INVALID_PARAMETER; - IoCompleteRequest(Irp, IO_NO_INCREMENT); - return; + INFO_(FLOPPY, "IOCTL_DISK_GET_MEDIA_TYPES: insufficient buffer; returning STATUS_INVALID_PARAMETER\n"); + Irp->IoStatus.Status = STATUS_INVALID_PARAMETER; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + return; } - /* - * for now, this driver only supports 3.5" HD media - */ - Geometry->MediaType = F3_1Pt44_512; - Geometry->Cylinders.QuadPart = 80; - Geometry->TracksPerCylinder = 2 * 18; - Geometry->SectorsPerTrack = 18; - Geometry->BytesPerSector = 512; + /* + * for now, this driver only supports 3.5" HD media + */ + Geometry->MediaType = F3_1Pt44_512; + Geometry->Cylinders.QuadPart = 80; + Geometry->TracksPerCylinder = 2 * 18; + Geometry->SectorsPerTrack = 18; + Geometry->BytesPerSector = 512; - Irp->IoStatus.Status = STATUS_SUCCESS; - Irp->IoStatus.Information = sizeof(DISK_GEOMETRY); - INFO_(FLOPPY, "Ioctl: completing with STATUS_SUCCESS\n"); - IoCompleteRequest(Irp, IO_NO_INCREMENT); + Irp->IoStatus.Status = STATUS_SUCCESS; + Irp->IoStatus.Information = sizeof(DISK_GEOMETRY); + INFO_(FLOPPY, "Ioctl: completing with STATUS_SUCCESS\n"); + IoCompleteRequest(Irp, IO_NO_INCREMENT); - return; + return; } - /* - * Now, check to see if the volume needs to be verified. If so, - * return STATUS_VERIFY_REQUIRED. - * - * NOTE: This code, which is outside of the switch and if/else blocks, - * will implicity catch and correctly service IOCTL_DISK_CHECK_VERIFY. - * Therefore if we see one below in the switch, we can return STATUS_SUCCESS - * immediately. - */ - if(DriveInfo->DeviceObject->Flags & DO_VERIFY_VOLUME && !(DriveInfo->DeviceObject->Flags & SL_OVERRIDE_VERIFY_VOLUME)) + /* + * Now, check to see if the volume needs to be verified. If so, + * return STATUS_VERIFY_REQUIRED. + * + * NOTE: This code, which is outside of the switch and if/else blocks, + * will implicity catch and correctly service IOCTL_DISK_CHECK_VERIFY. + * Therefore if we see one below in the switch, we can return STATUS_SUCCESS + * immediately. + */ + if(DriveInfo->DeviceObject->Flags & DO_VERIFY_VOLUME && !(DriveInfo->DeviceObject->Flags & SL_OVERRIDE_VERIFY_VOLUME)) { - INFO_(FLOPPY, "DeviceIoctl(): completing with STATUS_VERIFY_REQUIRED\n"); - Irp->IoStatus.Status = STATUS_VERIFY_REQUIRED; - Irp->IoStatus.Information = 0; - IoCompleteRequest(Irp, IO_NO_INCREMENT); - return; + INFO_(FLOPPY, "DeviceIoctl(): completing with STATUS_VERIFY_REQUIRED\n"); + Irp->IoStatus.Status = STATUS_VERIFY_REQUIRED; + Irp->IoStatus.Information = 0; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + return; } - /* - * Start the drive to see if the disk has changed - */ - StartMotor(DriveInfo); + /* + * Start the drive to see if the disk has changed + */ + StartMotor(DriveInfo); - /* - * Check the change line, and if it's set, return - */ - if(HwDiskChanged(DriveInfo, &DiskChanged) != STATUS_SUCCESS) + /* + * Check the change line, and if it's set, return + */ + if(HwDiskChanged(DriveInfo, &DiskChanged) != STATUS_SUCCESS) { - WARN_(FLOPPY, "DeviceIoctl(): unable to sense disk change; completing with STATUS_UNSUCCESSFUL\n"); - Irp->IoStatus.Status = STATUS_UNSUCCESSFUL; - Irp->IoStatus.Information = 0; - IoCompleteRequest(Irp, IO_NO_INCREMENT); - StopMotor(DriveInfo->ControllerInfo); - return; + WARN_(FLOPPY, "DeviceIoctl(): unable to sense disk change; completing with STATUS_UNSUCCESSFUL\n"); + Irp->IoStatus.Status = STATUS_UNSUCCESSFUL; + Irp->IoStatus.Information = 0; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + StopMotor(DriveInfo->ControllerInfo); + return; } - if(DiskChanged) + if(DiskChanged) { - INFO_(FLOPPY, "DeviceIoctl(): detected disk changed; signalling media change and completing\n"); - SignalMediaChanged(DriveInfo->DeviceObject, Irp); + INFO_(FLOPPY, "DeviceIoctl(): detected disk changed; signalling media change and completing\n"); + SignalMediaChanged(DriveInfo->DeviceObject, Irp); - /* - * Just guessing here - I have a choice of returning NO_MEDIA or VERIFY_REQUIRED. If there's - * really no disk in the drive, I'm thinking I can save time by just reporting that fact, rather - * than forcing windows to ask me twice. If this doesn't work, we'll need to split this up and - * handle the CHECK_VERIFY IOCTL separately. - */ - if(ResetChangeFlag(DriveInfo) == STATUS_NO_MEDIA_IN_DEVICE) - Irp->IoStatus.Status = STATUS_NO_MEDIA_IN_DEVICE; + /* + * Just guessing here - I have a choice of returning NO_MEDIA or VERIFY_REQUIRED. If there's + * really no disk in the drive, I'm thinking I can save time by just reporting that fact, rather + * than forcing windows to ask me twice. If this doesn't work, we'll need to split this up and + * handle the CHECK_VERIFY IOCTL separately. + */ + if(ResetChangeFlag(DriveInfo) == STATUS_NO_MEDIA_IN_DEVICE) + Irp->IoStatus.Status = STATUS_NO_MEDIA_IN_DEVICE; - IoCompleteRequest(Irp, IO_NO_INCREMENT); - StopMotor(DriveInfo->ControllerInfo); - return; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + StopMotor(DriveInfo->ControllerInfo); + return; } - switch(Code) + switch(Code) { case IOCTL_DISK_IS_WRITABLE: - { + { UCHAR Status; INFO_(FLOPPY, "IOCTL_DISK_IS_WRITABLE Called\n"); @@ -184,93 +184,93 @@ VOID NTAPI DeviceIoctlPassive(PDRIVE_INFO DriveInfo, Irp->IoStatus.Information = 0; if(HwSenseDriveStatus(DriveInfo) != STATUS_SUCCESS) - { - WARN_(FLOPPY, "IoctlDiskIsWritable(): unable to sense drive status\n"); - Irp->IoStatus.Status = STATUS_IO_DEVICE_ERROR; - break; - } + { + WARN_(FLOPPY, "IoctlDiskIsWritable(): unable to sense drive status\n"); + Irp->IoStatus.Status = STATUS_IO_DEVICE_ERROR; + break; + } - /* Now, read the drive's status back */ - if(HwSenseDriveStatusResult(DriveInfo->ControllerInfo, &Status) != STATUS_SUCCESS) - { - WARN_(FLOPPY, "IoctlDiskIsWritable(): unable to read drive status result\n"); - Irp->IoStatus.Status = STATUS_IO_DEVICE_ERROR; - break; - } + /* Now, read the drive's status back */ + if(HwSenseDriveStatusResult(DriveInfo->ControllerInfo, &Status) != STATUS_SUCCESS) + { + WARN_(FLOPPY, "IoctlDiskIsWritable(): unable to read drive status result\n"); + Irp->IoStatus.Status = STATUS_IO_DEVICE_ERROR; + break; + } /* Check to see if the write flag is set. */ if(Status & SR3_WRITE_PROTECT_STATUS_SIGNAL) - { + { INFO_(FLOPPY, "IOCTL_DISK_IS_WRITABLE: disk is write protected\n"); Irp->IoStatus.Status = STATUS_MEDIA_WRITE_PROTECTED; - } + } else - Irp->IoStatus.Status = STATUS_SUCCESS; - } - break; + Irp->IoStatus.Status = STATUS_SUCCESS; + } + break; case IOCTL_DISK_CHECK_VERIFY: - INFO_(FLOPPY, "IOCTL_DISK_CHECK_VERIFY called\n"); - if (OutputLength != 0) + INFO_(FLOPPY, "IOCTL_DISK_CHECK_VERIFY called\n"); + if (OutputLength != 0) { - if (OutputLength < sizeof(ULONG)) - { - Irp->IoStatus.Status = STATUS_BUFFER_TOO_SMALL; - Irp->IoStatus.Information = 0; - } - else - { - *((PULONG)OutputBuffer) = DriveInfo->DiskChangeCount; - Irp->IoStatus.Status = STATUS_SUCCESS; - Irp->IoStatus.Information = sizeof(ULONG); - } - } - else + if (OutputLength < sizeof(ULONG)) + { + Irp->IoStatus.Status = STATUS_BUFFER_TOO_SMALL; + Irp->IoStatus.Information = 0; + } + else + { + *((PULONG)OutputBuffer) = DriveInfo->DiskChangeCount; + Irp->IoStatus.Status = STATUS_SUCCESS; + Irp->IoStatus.Information = sizeof(ULONG); + } + } + else { - Irp->IoStatus.Status = STATUS_SUCCESS; - Irp->IoStatus.Information = 0; - } - break; + Irp->IoStatus.Status = STATUS_SUCCESS; + Irp->IoStatus.Information = 0; + } + break; case IOCTL_DISK_GET_DRIVE_GEOMETRY: - { + { INFO_(FLOPPY, "IOCTL_DISK_GET_DRIVE_GEOMETRY Called\n"); if(OutputLength < sizeof(DISK_GEOMETRY)) - { + { Irp->IoStatus.Status = STATUS_INVALID_PARAMETER; break; - } + } - /* This still works right even if DriveInfo->DiskGeometry->MediaType = Unknown */ - memcpy(OutputBuffer, &DriveInfo->DiskGeometry, sizeof(DISK_GEOMETRY)); + /* This still works right even if DriveInfo->DiskGeometry->MediaType = Unknown */ + memcpy(OutputBuffer, &DriveInfo->DiskGeometry, sizeof(DISK_GEOMETRY)); Irp->IoStatus.Information = sizeof(DISK_GEOMETRY); break; - } + } case IOCTL_DISK_FORMAT_TRACKS: case IOCTL_DISK_FORMAT_TRACKS_EX: - ERR_(FLOPPY, "Format called; not supported yet\n"); - Irp->IoStatus.Status = STATUS_NOT_IMPLEMENTED; - Irp->IoStatus.Information = 0; - break; + ERR_(FLOPPY, "Format called; not supported yet\n"); + Irp->IoStatus.Status = STATUS_NOT_IMPLEMENTED; + Irp->IoStatus.Information = 0; + break; case IOCTL_DISK_GET_PARTITION_INFO: - INFO_(FLOPPY, "IOCTL_DISK_GET_PARTITION_INFO Called; not supported by a floppy driver\n"); - Irp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST; - Irp->IoStatus.Information = 0; - break; + INFO_(FLOPPY, "IOCTL_DISK_GET_PARTITION_INFO Called; not supported by a floppy driver\n"); + Irp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST; + Irp->IoStatus.Information = 0; + break; default: - ERR_(FLOPPY, "UNKNOWN IOCTL CODE: 0x%x\n", Code); - Irp->IoStatus.Status = STATUS_NOT_SUPPORTED; - Irp->IoStatus.Information = 0; - break; + ERR_(FLOPPY, "UNKNOWN IOCTL CODE: 0x%x\n", Code); + Irp->IoStatus.Status = STATUS_NOT_SUPPORTED; + Irp->IoStatus.Information = 0; + break; } - INFO_(FLOPPY, "ioctl: completing with status 0x%x\n", Irp->IoStatus.Status); - IoCompleteRequest(Irp, IO_NO_INCREMENT); + INFO_(FLOPPY, "ioctl: completing with status 0x%x\n", Irp->IoStatus.Status); + IoCompleteRequest(Irp, IO_NO_INCREMENT); - StopMotor(DriveInfo->ControllerInfo); - return; + StopMotor(DriveInfo->ControllerInfo); + return; } diff --git a/reactos/drivers/storage/floppy/ioctl.h b/reactos/drivers/storage/floppy/ioctl.h index e595be3317c..386d5db6a94 100644 --- a/reactos/drivers/storage/floppy/ioctl.h +++ b/reactos/drivers/storage/floppy/ioctl.h @@ -25,9 +25,10 @@ */ DRIVER_DISPATCH DeviceIoctl; -NTSTATUS NTAPI DeviceIoctl(PDEVICE_OBJECT DeviceObject, - PIRP Irp); -VOID NTAPI DeviceIoctlPassive(PDRIVE_INFO DriveInfo, - PIRP Irp); +NTSTATUS NTAPI +DeviceIoctl(PDEVICE_OBJECT DeviceObject, PIRP Irp); + +VOID NTAPI +DeviceIoctlPassive(PDRIVE_INFO DriveInfo, PIRP Irp); diff --git a/reactos/drivers/storage/floppy/readwrite.c b/reactos/drivers/storage/floppy/readwrite.c index 898df8dcf6f..49030d3c14d 100644 --- a/reactos/drivers/storage/floppy/readwrite.c +++ b/reactos/drivers/storage/floppy/readwrite.c @@ -60,11 +60,12 @@ #include "hardware.h" #include "readwrite.h" - -static IO_ALLOCATION_ACTION NTAPI MapRegisterCallback(PDEVICE_OBJECT DeviceObject, - PIRP Irp, - PVOID MapRegisterBase, - PVOID Context) + +static IO_ALLOCATION_ACTION NTAPI +MapRegisterCallback(PDEVICE_OBJECT DeviceObject, + PIRP Irp, + PVOID MapRegisterBase, + PVOID Context) /* * FUNCTION: Acquire map registers in prep for DMA * ARGUMENTS: @@ -77,21 +78,21 @@ static IO_ALLOCATION_ACTION NTAPI MapRegisterCallback(PDEVICE_OBJECT DeviceObjec * KeepObject, because that's what the DDK says to do */ { - PCONTROLLER_INFO ControllerInfo = (PCONTROLLER_INFO)Context; - UNREFERENCED_PARAMETER(DeviceObject); - UNREFERENCED_PARAMETER(Irp); + PCONTROLLER_INFO ControllerInfo = (PCONTROLLER_INFO)Context; + UNREFERENCED_PARAMETER(DeviceObject); + UNREFERENCED_PARAMETER(Irp); - TRACE_(FLOPPY, "MapRegisterCallback Called\n"); + TRACE_(FLOPPY, "MapRegisterCallback Called\n"); - ControllerInfo->MapRegisterBase = MapRegisterBase; - KeSetEvent(&ControllerInfo->SynchEvent, 0, FALSE); + ControllerInfo->MapRegisterBase = MapRegisterBase; + KeSetEvent(&ControllerInfo->SynchEvent, 0, FALSE); - return KeepObject; + return KeepObject; } - -NTSTATUS NTAPI ReadWrite(PDEVICE_OBJECT DeviceObject, - PIRP Irp) + +NTSTATUS NTAPI +ReadWrite(PDEVICE_OBJECT DeviceObject, PIRP Irp) /* * FUNCTION: Dispatch routine called for read or write IRPs * ARGUMENTS: @@ -107,32 +108,33 @@ NTSTATUS NTAPI ReadWrite(PDEVICE_OBJECT DeviceObject, * it onto the irp queue */ { - TRACE_(FLOPPY, "ReadWrite called\n"); + TRACE_(FLOPPY, "ReadWrite called\n"); - ASSERT(DeviceObject); - ASSERT(Irp); + ASSERT(DeviceObject); + ASSERT(Irp); - if(!Irp->MdlAddress) + if(!Irp->MdlAddress) { - WARN_(FLOPPY, "ReadWrite(): MDL not found in IRP - Completing with STATUS_INVALID_PARAMETER\n"); - Irp->IoStatus.Status = STATUS_INVALID_PARAMETER; - Irp->IoStatus.Information = 0; - IoCompleteRequest(Irp, IO_NO_INCREMENT); - return STATUS_INVALID_PARAMETER; + WARN_(FLOPPY, "ReadWrite(): MDL not found in IRP - Completing with STATUS_INVALID_PARAMETER\n"); + Irp->IoStatus.Status = STATUS_INVALID_PARAMETER; + Irp->IoStatus.Information = 0; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + return STATUS_INVALID_PARAMETER; } - /* - * Queue the irp to the thread. - * The de-queue thread will look in DriverContext[0] for the Device Object. - */ - Irp->Tail.Overlay.DriverContext[0] = DeviceObject; - IoCsqInsertIrp(&Csq, Irp, NULL); + /* + * Queue the irp to the thread. + * The de-queue thread will look in DriverContext[0] for the Device Object. + */ + Irp->Tail.Overlay.DriverContext[0] = DeviceObject; + IoCsqInsertIrp(&Csq, Irp, NULL); - return STATUS_PENDING; + return STATUS_PENDING; } - -static VOID NTAPI RWFreeAdapterChannel(PADAPTER_OBJECT AdapterObject) + +static VOID NTAPI +RWFreeAdapterChannel(PADAPTER_OBJECT AdapterObject) /* * FUNCTION: Free the adapter DMA channel that we allocated * ARGUMENTS: @@ -142,17 +144,18 @@ static VOID NTAPI RWFreeAdapterChannel(PADAPTER_OBJECT AdapterObject) * be called at DISPATCH_LEVEL */ { - KIRQL Irql; + KIRQL Irql; - ASSERT(KeGetCurrentIrql() <= DISPATCH_LEVEL); + ASSERT(KeGetCurrentIrql() <= DISPATCH_LEVEL); - KeRaiseIrql(DISPATCH_LEVEL, &Irql); - IoFreeAdapterChannel(AdapterObject); - KeLowerIrql(Irql); + KeRaiseIrql(DISPATCH_LEVEL, &Irql); + IoFreeAdapterChannel(AdapterObject); + KeLowerIrql(Irql); } - -static NTSTATUS NTAPI RWDetermineMediaType(PDRIVE_INFO DriveInfo) + +static NTSTATUS NTAPI +RWDetermineMediaType(PDRIVE_INFO DriveInfo) /* * FUNCTION: Determine the media type of the disk in the drive and fill in the geometry * ARGUMENTS: @@ -169,111 +172,111 @@ static NTSTATUS NTAPI RWDetermineMediaType(PDRIVE_INFO DriveInfo) * - Support more disk types */ { - UCHAR HeadLoadTime; - UCHAR HeadUnloadTime; - UCHAR StepRateTime; + UCHAR HeadLoadTime; + UCHAR HeadUnloadTime; + UCHAR StepRateTime; - PAGED_CODE(); + PAGED_CODE(); - TRACE_(FLOPPY, "RWDetermineMediaType called\n"); + TRACE_(FLOPPY, "RWDetermineMediaType called\n"); - /* - * This algorithm assumes that a 1.44MB floppy is in the drive. If it's not, - * it works backwards until the read works. Note that only 1.44 has been tested - * at all. - */ + /* + * This algorithm assumes that a 1.44MB floppy is in the drive. If it's not, + * it works backwards until the read works. Note that only 1.44 has been tested + * at all. + */ - do + do { - int i; + int i; - /* Program data rate */ - if(HwSetDataRate(DriveInfo->ControllerInfo, DRSR_DSEL_500KBPS) != STATUS_SUCCESS) - { - WARN_(FLOPPY, "RWDetermineMediaType(): unable to set data rate\n"); - return STATUS_UNSUCCESSFUL; - } + /* Program data rate */ + if(HwSetDataRate(DriveInfo->ControllerInfo, DRSR_DSEL_500KBPS) != STATUS_SUCCESS) + { + WARN_(FLOPPY, "RWDetermineMediaType(): unable to set data rate\n"); + return STATUS_UNSUCCESSFUL; + } - /* Specify */ - HeadLoadTime = SPECIFY_HLT_500K; - HeadUnloadTime = SPECIFY_HUT_500K; - StepRateTime = SPECIFY_SRT_500K; + /* Specify */ + HeadLoadTime = SPECIFY_HLT_500K; + HeadUnloadTime = SPECIFY_HUT_500K; + StepRateTime = SPECIFY_SRT_500K; - /* Don't disable DMA --> enable dma (dumb & confusing) */ - if(HwSpecify(DriveInfo->ControllerInfo, HeadLoadTime, HeadUnloadTime, StepRateTime, FALSE) != STATUS_SUCCESS) - { - WARN_(FLOPPY, "RWDetermineMediaType(): specify failed\n"); - return STATUS_UNSUCCESSFUL; - } + /* Don't disable DMA --> enable dma (dumb & confusing) */ + if(HwSpecify(DriveInfo->ControllerInfo, HeadLoadTime, HeadUnloadTime, StepRateTime, FALSE) != STATUS_SUCCESS) + { + WARN_(FLOPPY, "RWDetermineMediaType(): specify failed\n"); + return STATUS_UNSUCCESSFUL; + } - /* clear any spurious interrupts in preparation for recalibrate */ - KeClearEvent(&DriveInfo->ControllerInfo->SynchEvent); + /* clear any spurious interrupts in preparation for recalibrate */ + KeClearEvent(&DriveInfo->ControllerInfo->SynchEvent); - /* Recalibrate --> head over first track */ - for(i=0; i < 2; i++) - { - NTSTATUS RecalStatus; + /* Recalibrate --> head over first track */ + for(i=0; i < 2; i++) + { + NTSTATUS RecalStatus; - if(HwRecalibrate(DriveInfo) != STATUS_SUCCESS) - { - WARN_(FLOPPY, "RWDetermineMediaType(): Recalibrate failed\n"); - return STATUS_UNSUCCESSFUL; - } + if(HwRecalibrate(DriveInfo) != STATUS_SUCCESS) + { + WARN_(FLOPPY, "RWDetermineMediaType(): Recalibrate failed\n"); + return STATUS_UNSUCCESSFUL; + } - /* Wait for the recalibrate to finish */ - WaitForControllerInterrupt(DriveInfo->ControllerInfo); + /* Wait for the recalibrate to finish */ + WaitForControllerInterrupt(DriveInfo->ControllerInfo); - RecalStatus = HwRecalibrateResult(DriveInfo->ControllerInfo); + RecalStatus = HwRecalibrateResult(DriveInfo->ControllerInfo); - if(RecalStatus == STATUS_SUCCESS) - break; + if(RecalStatus == STATUS_SUCCESS) + break; - if(i == 1) /* failed for 2nd time */ - { - WARN_(FLOPPY, "RWDetermineMediaType(): RecalibrateResult failed\n"); - return STATUS_UNSUCCESSFUL; - } - } + if(i == 1) /* failed for 2nd time */ + { + WARN_(FLOPPY, "RWDetermineMediaType(): RecalibrateResult failed\n"); + return STATUS_UNSUCCESSFUL; + } + } - /* clear any spurious interrupts */ - KeClearEvent(&DriveInfo->ControllerInfo->SynchEvent); + /* clear any spurious interrupts */ + KeClearEvent(&DriveInfo->ControllerInfo->SynchEvent); - /* Try to read an ID */ - if(HwReadId(DriveInfo, 0) != STATUS_SUCCESS) /* read the first ID we find, from head 0 */ - { - WARN_(FLOPPY, "RWDetermineMediaType(): ReadId failed\n"); - return STATUS_UNSUCCESSFUL; /* if we can't even write to the controller, it's hopeless */ - } + /* Try to read an ID */ + if(HwReadId(DriveInfo, 0) != STATUS_SUCCESS) /* read the first ID we find, from head 0 */ + { + WARN_(FLOPPY, "RWDetermineMediaType(): ReadId failed\n"); + return STATUS_UNSUCCESSFUL; /* if we can't even write to the controller, it's hopeless */ + } - /* Wait for the ReadID to finish */ - WaitForControllerInterrupt(DriveInfo->ControllerInfo); + /* Wait for the ReadID to finish */ + WaitForControllerInterrupt(DriveInfo->ControllerInfo); - if(HwReadIdResult(DriveInfo->ControllerInfo, NULL, NULL) != STATUS_SUCCESS) - { - WARN_(FLOPPY, "RWDetermineMediaType(): ReadIdResult failed; continuing\n"); - continue; - } + if(HwReadIdResult(DriveInfo->ControllerInfo, NULL, NULL) != STATUS_SUCCESS) + { + WARN_(FLOPPY, "RWDetermineMediaType(): ReadIdResult failed; continuing\n"); + continue; + } - /* Found the media; populate the geometry now */ - WARN_(FLOPPY, "Hardcoded media type!\n"); - INFO_(FLOPPY, "RWDetermineMediaType(): Found 1.44 media; returning success\n"); - DriveInfo->DiskGeometry.MediaType = GEOMETRY_144_MEDIATYPE; - DriveInfo->DiskGeometry.Cylinders.QuadPart = GEOMETRY_144_CYLINDERS; - DriveInfo->DiskGeometry.TracksPerCylinder = GEOMETRY_144_TRACKSPERCYLINDER; - DriveInfo->DiskGeometry.SectorsPerTrack = GEOMETRY_144_SECTORSPERTRACK; - DriveInfo->DiskGeometry.BytesPerSector = GEOMETRY_144_BYTESPERSECTOR; - DriveInfo->BytesPerSectorCode = HW_512_BYTES_PER_SECTOR; - return STATUS_SUCCESS; + /* Found the media; populate the geometry now */ + WARN_(FLOPPY, "Hardcoded media type!\n"); + INFO_(FLOPPY, "RWDetermineMediaType(): Found 1.44 media; returning success\n"); + DriveInfo->DiskGeometry.MediaType = GEOMETRY_144_MEDIATYPE; + DriveInfo->DiskGeometry.Cylinders.QuadPart = GEOMETRY_144_CYLINDERS; + DriveInfo->DiskGeometry.TracksPerCylinder = GEOMETRY_144_TRACKSPERCYLINDER; + DriveInfo->DiskGeometry.SectorsPerTrack = GEOMETRY_144_SECTORSPERTRACK; + DriveInfo->DiskGeometry.BytesPerSector = GEOMETRY_144_BYTESPERSECTOR; + DriveInfo->BytesPerSectorCode = HW_512_BYTES_PER_SECTOR; + return STATUS_SUCCESS; } - while(FALSE); + while(FALSE); - TRACE_(FLOPPY, "RWDetermineMediaType(): failed to find media\n"); - return STATUS_UNRECOGNIZED_MEDIA; + TRACE_(FLOPPY, "RWDetermineMediaType(): failed to find media\n"); + return STATUS_UNRECOGNIZED_MEDIA; } - -static NTSTATUS NTAPI RWSeekToCylinder(PDRIVE_INFO DriveInfo, - UCHAR Cylinder) + +static NTSTATUS NTAPI +RWSeekToCylinder(PDRIVE_INFO DriveInfo, UCHAR Cylinder) /* * FUNCTION: Seek a particular drive to a particular track * ARGUMENTS: @@ -286,62 +289,63 @@ static NTSTATUS NTAPI RWSeekToCylinder(PDRIVE_INFO DriveInfo, * - PAGED_CODE because it blocks */ { - UCHAR CurCylinder; + UCHAR CurCylinder; - PAGED_CODE(); + PAGED_CODE(); - TRACE_(FLOPPY, "RWSeekToCylinder called drive 0x%p cylinder %d\n", DriveInfo, Cylinder); + TRACE_(FLOPPY, "RWSeekToCylinder called drive 0x%p cylinder %d\n", DriveInfo, Cylinder); - /* Clear any spurious interrupts */ - KeClearEvent(&DriveInfo->ControllerInfo->SynchEvent); + /* Clear any spurious interrupts */ + KeClearEvent(&DriveInfo->ControllerInfo->SynchEvent); - /* queue seek command */ - if(HwSeek(DriveInfo, Cylinder) != STATUS_SUCCESS) + /* queue seek command */ + if(HwSeek(DriveInfo, Cylinder) != STATUS_SUCCESS) { - WARN_(FLOPPY, "RWSeekToTrack(): unable to seek\n"); - return STATUS_UNSUCCESSFUL; + WARN_(FLOPPY, "RWSeekToTrack(): unable to seek\n"); + return STATUS_UNSUCCESSFUL; } - WaitForControllerInterrupt(DriveInfo->ControllerInfo); + WaitForControllerInterrupt(DriveInfo->ControllerInfo); - if(HwSenseInterruptStatus(DriveInfo->ControllerInfo) != STATUS_SUCCESS) + if(HwSenseInterruptStatus(DriveInfo->ControllerInfo) != STATUS_SUCCESS) { - WARN_(FLOPPY, "RWSeekToTrack(): unable to get seek results\n"); - return STATUS_UNSUCCESSFUL; + WARN_(FLOPPY, "RWSeekToTrack(): unable to get seek results\n"); + return STATUS_UNSUCCESSFUL; } - /* read ID mark from head 0 to verify */ - if(HwReadId(DriveInfo, 0) != STATUS_SUCCESS) + /* read ID mark from head 0 to verify */ + if(HwReadId(DriveInfo, 0) != STATUS_SUCCESS) { - WARN_(FLOPPY, "RWSeekToTrack(): unable to queue ReadId\n"); - return STATUS_UNSUCCESSFUL; + WARN_(FLOPPY, "RWSeekToTrack(): unable to queue ReadId\n"); + return STATUS_UNSUCCESSFUL; } - WaitForControllerInterrupt(DriveInfo->ControllerInfo); + WaitForControllerInterrupt(DriveInfo->ControllerInfo); - if(HwReadIdResult(DriveInfo->ControllerInfo, &CurCylinder, NULL) != STATUS_SUCCESS) + if(HwReadIdResult(DriveInfo->ControllerInfo, &CurCylinder, NULL) != STATUS_SUCCESS) { - WARN_(FLOPPY, "RWSeekToTrack(): unable to get ReadId result\n"); - return STATUS_UNSUCCESSFUL; + WARN_(FLOPPY, "RWSeekToTrack(): unable to get ReadId result\n"); + return STATUS_UNSUCCESSFUL; } - if(CurCylinder != Cylinder) + if(CurCylinder != Cylinder) { - WARN_(FLOPPY, "RWSeekToTrack(): Seeek to track failed; current cylinder is 0x%x\n", CurCylinder); - return STATUS_UNSUCCESSFUL; + WARN_(FLOPPY, "RWSeekToTrack(): Seeek to track failed; current cylinder is 0x%x\n", CurCylinder); + return STATUS_UNSUCCESSFUL; } - INFO_(FLOPPY, "RWSeekToCylinder: returning successfully, now on cyl %d\n", Cylinder); + INFO_(FLOPPY, "RWSeekToCylinder: returning successfully, now on cyl %d\n", Cylinder); - return STATUS_SUCCESS; + return STATUS_SUCCESS; } - -static NTSTATUS NTAPI RWComputeCHS(PDRIVE_INFO IN DriveInfo, - ULONG IN DiskByteOffset, - PUCHAR OUT Cylinder, - PUCHAR OUT Head, - PUCHAR OUT Sector) + +static NTSTATUS NTAPI +RWComputeCHS(PDRIVE_INFO IN DriveInfo, + ULONG IN DiskByteOffset, + PUCHAR OUT Cylinder, + PUCHAR OUT Head, + PUCHAR OUT Sector) /* * FUNCTION: Compute the CHS from the absolute byte offset on disk * ARGUMENTS: @@ -359,42 +363,42 @@ static NTSTATUS NTAPI RWComputeCHS(PDRIVE_INFO IN DriveInfo, * - This is really crummy code. Please FIXME. */ { - ULONG AbsoluteSector; - UCHAR SectorsPerCylinder = (UCHAR)DriveInfo->DiskGeometry.SectorsPerTrack * (UCHAR)DriveInfo->DiskGeometry.TracksPerCylinder; + ULONG AbsoluteSector; + UCHAR SectorsPerCylinder = (UCHAR)DriveInfo->DiskGeometry.SectorsPerTrack * (UCHAR)DriveInfo->DiskGeometry.TracksPerCylinder; - TRACE_(FLOPPY, "RWComputeCHS: Called with offset 0x%x\n", DiskByteOffset); + TRACE_(FLOPPY, "RWComputeCHS: Called with offset 0x%x\n", DiskByteOffset); - /* First calculate the 1-based "absolute sector" based on the byte offset */ - ASSERT(!(DiskByteOffset % DriveInfo->DiskGeometry.BytesPerSector)); /* FIXME: Only handle full sector transfers atm */ + /* First calculate the 1-based "absolute sector" based on the byte offset */ + ASSERT(!(DiskByteOffset % DriveInfo->DiskGeometry.BytesPerSector)); /* FIXME: Only handle full sector transfers atm */ - /* AbsoluteSector is zero-based to make the math a little easier */ - AbsoluteSector = DiskByteOffset / DriveInfo->DiskGeometry.BytesPerSector; /* Num full sectors */ + /* AbsoluteSector is zero-based to make the math a little easier */ + AbsoluteSector = DiskByteOffset / DriveInfo->DiskGeometry.BytesPerSector; /* Num full sectors */ - /* Cylinder number is floor(AbsoluteSector / SectorsPerCylinder) */ - *Cylinder = (CHAR)(AbsoluteSector / SectorsPerCylinder); + /* Cylinder number is floor(AbsoluteSector / SectorsPerCylinder) */ + *Cylinder = (CHAR)(AbsoluteSector / SectorsPerCylinder); - /* Head number is 0 if the sector within the cylinder < SectorsPerTrack; 1 otherwise */ - *Head = AbsoluteSector % SectorsPerCylinder < DriveInfo->DiskGeometry.SectorsPerTrack ? 0 : 1; + /* Head number is 0 if the sector within the cylinder < SectorsPerTrack; 1 otherwise */ + *Head = AbsoluteSector % SectorsPerCylinder < DriveInfo->DiskGeometry.SectorsPerTrack ? 0 : 1; - /* - * Sector number is the sector within the cylinder if on head 0; that minus SectorsPerTrack if it's on head 1 - * (lots of casts to placate msvc). 1-based! - */ - *Sector = ((UCHAR)(AbsoluteSector % SectorsPerCylinder) + 1) - ((*Head) * (UCHAR)DriveInfo->DiskGeometry.SectorsPerTrack); + /* + * Sector number is the sector within the cylinder if on head 0; that minus SectorsPerTrack if it's on head 1 + * (lots of casts to placate msvc). 1-based! + */ + *Sector = ((UCHAR)(AbsoluteSector % SectorsPerCylinder) + 1) - ((*Head) * (UCHAR)DriveInfo->DiskGeometry.SectorsPerTrack); - INFO_(FLOPPY, "RWComputeCHS: offset 0x%x is c:0x%x h:0x%x s:0x%x\n", DiskByteOffset, *Cylinder, *Head, *Sector); + INFO_(FLOPPY, "RWComputeCHS: offset 0x%x is c:0x%x h:0x%x s:0x%x\n", DiskByteOffset, *Cylinder, *Head, *Sector); - /* Sanity checking */ - ASSERT(*Cylinder <= DriveInfo->DiskGeometry.Cylinders.QuadPart); - ASSERT(*Head <= DriveInfo->DiskGeometry.TracksPerCylinder); - ASSERT(*Sector <= DriveInfo->DiskGeometry.SectorsPerTrack); + /* Sanity checking */ + ASSERT(*Cylinder <= DriveInfo->DiskGeometry.Cylinders.QuadPart); + ASSERT(*Head <= DriveInfo->DiskGeometry.TracksPerCylinder); + ASSERT(*Sector <= DriveInfo->DiskGeometry.SectorsPerTrack); - return STATUS_SUCCESS; + return STATUS_SUCCESS; } - -VOID NTAPI ReadWritePassive(PDRIVE_INFO DriveInfo, - PIRP Irp) + +VOID NTAPI +ReadWritePassive(PDRIVE_INFO DriveInfo, PIRP Irp) /* * FUNCTION: Handle the first phase of a read or write IRP * ARGUMENTS: @@ -423,342 +427,342 @@ VOID NTAPI ReadWritePassive(PDRIVE_INFO DriveInfo, * f) Read the results of the command */ { - PDEVICE_OBJECT DeviceObject = DriveInfo->DeviceObject; - PIO_STACK_LOCATION Stack = IoGetCurrentIrpStackLocation(Irp); - BOOLEAN WriteToDevice; - ULONG Length; - ULONG DiskByteOffset; - KIRQL OldIrql; - NTSTATUS Status; - BOOLEAN DiskChanged; - ULONG_PTR TransferByteOffset; - UCHAR Gap; + PDEVICE_OBJECT DeviceObject = DriveInfo->DeviceObject; + PIO_STACK_LOCATION Stack = IoGetCurrentIrpStackLocation(Irp); + BOOLEAN WriteToDevice; + ULONG Length; + ULONG DiskByteOffset; + KIRQL OldIrql; + NTSTATUS Status; + BOOLEAN DiskChanged; + ULONG_PTR TransferByteOffset; + UCHAR Gap; - PAGED_CODE(); + PAGED_CODE(); - TRACE_(FLOPPY, "ReadWritePassive called to %s 0x%x bytes from offset 0x%x\n", - (Stack->MajorFunction == IRP_MJ_READ ? "read" : "write"), - (Stack->MajorFunction == IRP_MJ_READ ? Stack->Parameters.Read.Length : Stack->Parameters.Write.Length), - (Stack->MajorFunction == IRP_MJ_READ ? Stack->Parameters.Read.ByteOffset.u.LowPart : - Stack->Parameters.Write.ByteOffset.u.LowPart)); + TRACE_(FLOPPY, "ReadWritePassive called to %s 0x%x bytes from offset 0x%x\n", + (Stack->MajorFunction == IRP_MJ_READ ? "read" : "write"), + (Stack->MajorFunction == IRP_MJ_READ ? Stack->Parameters.Read.Length : Stack->Parameters.Write.Length), + (Stack->MajorFunction == IRP_MJ_READ ? Stack->Parameters.Read.ByteOffset.u.LowPart : + Stack->Parameters.Write.ByteOffset.u.LowPart)); - /* Default return codes */ - Irp->IoStatus.Status = STATUS_UNSUCCESSFUL; - Irp->IoStatus.Information = 0; + /* Default return codes */ + Irp->IoStatus.Status = STATUS_UNSUCCESSFUL; + Irp->IoStatus.Information = 0; - /* - * Check to see if the volume needs to be verified. If so, - * we can get out of here quickly. - */ - if(DeviceObject->Flags & DO_VERIFY_VOLUME && !(DeviceObject->Flags & SL_OVERRIDE_VERIFY_VOLUME)) + /* + * Check to see if the volume needs to be verified. If so, + * we can get out of here quickly. + */ + if(DeviceObject->Flags & DO_VERIFY_VOLUME && !(DeviceObject->Flags & SL_OVERRIDE_VERIFY_VOLUME)) { - INFO_(FLOPPY, "ReadWritePassive(): DO_VERIFY_VOLUME set; Completing with STATUS_VERIFY_REQUIRED\n"); - Irp->IoStatus.Status = STATUS_VERIFY_REQUIRED; - IoCompleteRequest(Irp, IO_NO_INCREMENT); - return; + INFO_(FLOPPY, "ReadWritePassive(): DO_VERIFY_VOLUME set; Completing with STATUS_VERIFY_REQUIRED\n"); + Irp->IoStatus.Status = STATUS_VERIFY_REQUIRED; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + return; } - /* - * Check the change line, and if it's set, return - */ - StartMotor(DriveInfo); - if(HwDiskChanged(DeviceObject->DeviceExtension, &DiskChanged) != STATUS_SUCCESS) + /* + * Check the change line, and if it's set, return + */ + StartMotor(DriveInfo); + if(HwDiskChanged(DeviceObject->DeviceExtension, &DiskChanged) != STATUS_SUCCESS) { - WARN_(FLOPPY, "ReadWritePassive(): unable to detect disk change; Completing with STATUS_UNSUCCESSFUL\n"); - IoCompleteRequest(Irp, IO_NO_INCREMENT); - StopMotor(DriveInfo->ControllerInfo); - return; + WARN_(FLOPPY, "ReadWritePassive(): unable to detect disk change; Completing with STATUS_UNSUCCESSFUL\n"); + IoCompleteRequest(Irp, IO_NO_INCREMENT); + StopMotor(DriveInfo->ControllerInfo); + return; } - if(DiskChanged) + if(DiskChanged) { - INFO_(FLOPPY, "ReadWritePhase1(): signalling media changed; Completing with STATUS_MEDIA_CHANGED\n"); + INFO_(FLOPPY, "ReadWritePhase1(): signalling media changed; Completing with STATUS_MEDIA_CHANGED\n"); - /* The following call sets IoStatus.Status and IoStatus.Information */ - SignalMediaChanged(DeviceObject, Irp); + /* The following call sets IoStatus.Status and IoStatus.Information */ + SignalMediaChanged(DeviceObject, Irp); - /* - * Guessing at something... see ioctl.c for more info - */ - if(ResetChangeFlag(DriveInfo) == STATUS_NO_MEDIA_IN_DEVICE) - Irp->IoStatus.Status = STATUS_NO_MEDIA_IN_DEVICE; + /* + * Guessing at something... see ioctl.c for more info + */ + if(ResetChangeFlag(DriveInfo) == STATUS_NO_MEDIA_IN_DEVICE) + Irp->IoStatus.Status = STATUS_NO_MEDIA_IN_DEVICE; - IoCompleteRequest(Irp, IO_NO_INCREMENT); - StopMotor(DriveInfo->ControllerInfo); - return; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + StopMotor(DriveInfo->ControllerInfo); + return; } - /* - * Figure out the media type, if we don't know it already - */ - if(DriveInfo->DiskGeometry.MediaType == Unknown) + /* + * Figure out the media type, if we don't know it already + */ + if(DriveInfo->DiskGeometry.MediaType == Unknown) { - if(RWDetermineMediaType(DriveInfo) != STATUS_SUCCESS) - { - WARN_(FLOPPY, "ReadWritePassive(): unable to determine media type; completing with STATUS_UNSUCCESSFUL\n"); - IoCompleteRequest(Irp, IO_NO_INCREMENT); - StopMotor(DriveInfo->ControllerInfo); - return; - } - - if(DriveInfo->DiskGeometry.MediaType == Unknown) - { - WARN_(FLOPPY, "ReadWritePassive(): Unknown media in drive; completing with STATUS_UNRECOGNIZED_MEDIA\n"); - Irp->IoStatus.Status = STATUS_UNRECOGNIZED_MEDIA; - IoCompleteRequest(Irp, IO_NO_INCREMENT); - StopMotor(DriveInfo->ControllerInfo); - return; - } - } - - /* Set up parameters for read or write */ - if(Stack->MajorFunction == IRP_MJ_READ) - { - Length = Stack->Parameters.Read.Length; - DiskByteOffset = Stack->Parameters.Read.ByteOffset.u.LowPart; - WriteToDevice = FALSE; - } - else - { - Length = Stack->Parameters.Write.Length; - DiskByteOffset = Stack->Parameters.Write.ByteOffset.u.LowPart; - WriteToDevice = TRUE; - } - - /* - * FIXME: - * FloppyDeviceData.ReadWriteGapLength specify the value for the physical drive. - * We should set this value depend on the format of the inserted disk and possible - * depend on the request (read or write). A value of 0 results in one rotation - * between the sectors (7.2sec for reading a track). - */ - Gap = DriveInfo->FloppyDeviceData.ReadWriteGapLength; - - /* - * Set up DMA transfer - * - * This is as good of a place as any to document something that used to confuse me - * greatly (and I even wrote some of the kernel's DMA code, so if it confuses me, it - * probably confuses at least a couple of other people too). - * - * MmGetMdlVirtualAddress() returns the virtal address, as mapped in the buffer's original - * process context, of the MDL. In other words: say you start with a buffer at address X, then - * you build an MDL out of that buffer called Mdl. If you call MmGetMdlVirtualAddress(Mdl), it - * will return X. - * - * There are two parameters that the function looks at to produce X again, given the MDL: the - * first is the StartVa, which is the base virtual address of the page that the buffer starts - * in. If your buffer's virtual address is 0x12345678, StartVa will be 0x12345000, assuming 4K pages - * (which is (almost) always the case on x86). Note well: this address is only valid in the - * process context that you initially built the MDL from. The physical pages that make up - * the MDL might perhaps be mapped in other process contexts too (or even in the system space, - * above 0x80000000 (default; 0xc0000000 on current ReactOS or /3GB Windows)), but it will - * (possibly) be mapped at a different address. - * - * The second parameter is the ByteOffset. Given an original buffer address of 0x12345678, - * the ByteOffset would be 0x678. Because MDLs can only describe full pages (and therefore - * StartVa always points to the start address of a page), the ByteOffset must be used to - * find the real start of the buffer. - * - * In general, if you add the StartVa and ByteOffset together, you get back your original - * buffer pointer, which you are free to use if you're sure you're in the right process - * context. You could tell by accessing the (hidden and not-to-be-used) Process member of - * the MDL, but in general, if you have to ask whether or not you are in the right context, - * then you shouldn't be using this address for anything anyway. There are also security implications - * (big ones, really, I wouldn't kid about this) to directly accessing a user's buffer by VA, so - * Don't Do That. - * - * There is a somewhat weird but very common use of the virtual address associated with a MDL - * that pops up often in the context of DMA. DMA APIs (particularly MapTransfer()) need to - * know where the memory is that they should DMA into and out of. This memory is described - * by a MDL. The controller eventually needs to know a physical address on the host side, - * which is generally a 32-bit linear address (on x86), and not just a page address. Therefore, - * the DMA APIs look at the ByteOffset field of the MDL to reconstruct the real address that - * should be programmed into the DMA controller. - * - * It is often the case that a transfer needs to be broken down over more than one DMA operation, - * particularly when it is a big transfer and the HAL doesn't give you enough map registers - * to map the whole thing at once. Therefore, the APIs need a way to tell how far into the MDL - * they should look to transfer the next chunk of bytes. Now, Microsoft could have designed - * MapTransfer to take a "MDL offset" argument, starting with 0, for how far into the buffer to - * start, but it didn't. Instead, MapTransfer asks for the virtual address of the MDL as an "index" into - * the MDL. The way it computes how far into the page to start the transfer is by masking off all but - * the bottom 12 bits (on x86) of the number you supply as the CurrentVa and using *that* as the - * ByteOffset instead of the one in the MDL. (OK, this varies a bit by OS and version, but this - * is the effect). - * - * In other words, you get a number back from MmGetMdlVirtualAddress that represents the start of your - * buffer, and you pass it to the first MapTransfer call. Then, for each successive operation - * on the same buffer, you increment that address to point to the next spot in the MDL that - * you want to DMA to/from. The fact that the virtual address you're manipulating is probably not - * mapped into the process context that you're running in is irrelevant, since it's only being - * used to index into the MDL. - */ - - /* Get map registers for DMA */ - KeRaiseIrql(DISPATCH_LEVEL, &OldIrql); - Status = IoAllocateAdapterChannel(DriveInfo->ControllerInfo->AdapterObject, DeviceObject, - DriveInfo->ControllerInfo->MapRegisters, MapRegisterCallback, DriveInfo->ControllerInfo); - KeLowerIrql(OldIrql); - - if(Status != STATUS_SUCCESS) - { - WARN_(FLOPPY, "ReadWritePassive(): unable allocate an adapter channel; completing with STATUS_UNSUCCESSFUL\n"); - IoCompleteRequest(Irp, IO_NO_INCREMENT); - StopMotor(DriveInfo->ControllerInfo); - return ; - } - - - /* - * Read from (or write to) the device - * - * This has to be called in a loop, as you can only transfer data to/from a single track at - * a time. - */ - TransferByteOffset = 0; - while(TransferByteOffset < Length) - { - UCHAR Cylinder; - UCHAR Head; - UCHAR StartSector; - ULONG CurrentTransferBytes; - UCHAR CurrentTransferSectors; - - INFO_(FLOPPY, "ReadWritePassive(): iterating in while (TransferByteOffset = 0x%x of 0x%x total) - allocating %d registers\n", - TransferByteOffset, Length, DriveInfo->ControllerInfo->MapRegisters); - - KeClearEvent(&DriveInfo->ControllerInfo->SynchEvent); - - /* - * Compute starting CHS - */ - if(RWComputeCHS(DriveInfo, DiskByteOffset+TransferByteOffset, &Cylinder, &Head, &StartSector) != STATUS_SUCCESS) - { - WARN_(FLOPPY, "ReadWritePassive(): unable to compute CHS; completing with STATUS_UNSUCCESSFUL\n"); - RWFreeAdapterChannel(DriveInfo->ControllerInfo->AdapterObject); - IoCompleteRequest(Irp, IO_NO_INCREMENT); - StopMotor(DriveInfo->ControllerInfo); - return; - } - - /* - * Seek to the right track - */ - if(!DriveInfo->ControllerInfo->ImpliedSeeks) + if(RWDetermineMediaType(DriveInfo) != STATUS_SUCCESS) { - if(RWSeekToCylinder(DriveInfo, Cylinder) != STATUS_SUCCESS) + WARN_(FLOPPY, "ReadWritePassive(): unable to determine media type; completing with STATUS_UNSUCCESSFUL\n"); + IoCompleteRequest(Irp, IO_NO_INCREMENT); + StopMotor(DriveInfo->ControllerInfo); + return; + } + + if(DriveInfo->DiskGeometry.MediaType == Unknown) + { + WARN_(FLOPPY, "ReadWritePassive(): Unknown media in drive; completing with STATUS_UNRECOGNIZED_MEDIA\n"); + Irp->IoStatus.Status = STATUS_UNRECOGNIZED_MEDIA; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + StopMotor(DriveInfo->ControllerInfo); + return; + } + } + + /* Set up parameters for read or write */ + if(Stack->MajorFunction == IRP_MJ_READ) + { + Length = Stack->Parameters.Read.Length; + DiskByteOffset = Stack->Parameters.Read.ByteOffset.u.LowPart; + WriteToDevice = FALSE; + } + else + { + Length = Stack->Parameters.Write.Length; + DiskByteOffset = Stack->Parameters.Write.ByteOffset.u.LowPart; + WriteToDevice = TRUE; + } + + /* + * FIXME: + * FloppyDeviceData.ReadWriteGapLength specify the value for the physical drive. + * We should set this value depend on the format of the inserted disk and possible + * depend on the request (read or write). A value of 0 results in one rotation + * between the sectors (7.2sec for reading a track). + */ + Gap = DriveInfo->FloppyDeviceData.ReadWriteGapLength; + + /* + * Set up DMA transfer + * + * This is as good of a place as any to document something that used to confuse me + * greatly (and I even wrote some of the kernel's DMA code, so if it confuses me, it + * probably confuses at least a couple of other people too). + * + * MmGetMdlVirtualAddress() returns the virtal address, as mapped in the buffer's original + * process context, of the MDL. In other words: say you start with a buffer at address X, then + * you build an MDL out of that buffer called Mdl. If you call MmGetMdlVirtualAddress(Mdl), it + * will return X. + * + * There are two parameters that the function looks at to produce X again, given the MDL: the + * first is the StartVa, which is the base virtual address of the page that the buffer starts + * in. If your buffer's virtual address is 0x12345678, StartVa will be 0x12345000, assuming 4K pages + * (which is (almost) always the case on x86). Note well: this address is only valid in the + * process context that you initially built the MDL from. The physical pages that make up + * the MDL might perhaps be mapped in other process contexts too (or even in the system space, + * above 0x80000000 (default; 0xc0000000 on current ReactOS or /3GB Windows)), but it will + * (possibly) be mapped at a different address. + * + * The second parameter is the ByteOffset. Given an original buffer address of 0x12345678, + * the ByteOffset would be 0x678. Because MDLs can only describe full pages (and therefore + * StartVa always points to the start address of a page), the ByteOffset must be used to + * find the real start of the buffer. + * + * In general, if you add the StartVa and ByteOffset together, you get back your original + * buffer pointer, which you are free to use if you're sure you're in the right process + * context. You could tell by accessing the (hidden and not-to-be-used) Process member of + * the MDL, but in general, if you have to ask whether or not you are in the right context, + * then you shouldn't be using this address for anything anyway. There are also security implications + * (big ones, really, I wouldn't kid about this) to directly accessing a user's buffer by VA, so + * Don't Do That. + * + * There is a somewhat weird but very common use of the virtual address associated with a MDL + * that pops up often in the context of DMA. DMA APIs (particularly MapTransfer()) need to + * know where the memory is that they should DMA into and out of. This memory is described + * by a MDL. The controller eventually needs to know a physical address on the host side, + * which is generally a 32-bit linear address (on x86), and not just a page address. Therefore, + * the DMA APIs look at the ByteOffset field of the MDL to reconstruct the real address that + * should be programmed into the DMA controller. + * + * It is often the case that a transfer needs to be broken down over more than one DMA operation, + * particularly when it is a big transfer and the HAL doesn't give you enough map registers + * to map the whole thing at once. Therefore, the APIs need a way to tell how far into the MDL + * they should look to transfer the next chunk of bytes. Now, Microsoft could have designed + * MapTransfer to take a "MDL offset" argument, starting with 0, for how far into the buffer to + * start, but it didn't. Instead, MapTransfer asks for the virtual address of the MDL as an "index" into + * the MDL. The way it computes how far into the page to start the transfer is by masking off all but + * the bottom 12 bits (on x86) of the number you supply as the CurrentVa and using *that* as the + * ByteOffset instead of the one in the MDL. (OK, this varies a bit by OS and version, but this + * is the effect). + * + * In other words, you get a number back from MmGetMdlVirtualAddress that represents the start of your + * buffer, and you pass it to the first MapTransfer call. Then, for each successive operation + * on the same buffer, you increment that address to point to the next spot in the MDL that + * you want to DMA to/from. The fact that the virtual address you're manipulating is probably not + * mapped into the process context that you're running in is irrelevant, since it's only being + * used to index into the MDL. + */ + + /* Get map registers for DMA */ + KeRaiseIrql(DISPATCH_LEVEL, &OldIrql); + Status = IoAllocateAdapterChannel(DriveInfo->ControllerInfo->AdapterObject, DeviceObject, + DriveInfo->ControllerInfo->MapRegisters, MapRegisterCallback, DriveInfo->ControllerInfo); + KeLowerIrql(OldIrql); + + if(Status != STATUS_SUCCESS) + { + WARN_(FLOPPY, "ReadWritePassive(): unable allocate an adapter channel; completing with STATUS_UNSUCCESSFUL\n"); + IoCompleteRequest(Irp, IO_NO_INCREMENT); + StopMotor(DriveInfo->ControllerInfo); + return ; + } + + + /* + * Read from (or write to) the device + * + * This has to be called in a loop, as you can only transfer data to/from a single track at + * a time. + */ + TransferByteOffset = 0; + while(TransferByteOffset < Length) + { + UCHAR Cylinder; + UCHAR Head; + UCHAR StartSector; + ULONG CurrentTransferBytes; + UCHAR CurrentTransferSectors; + + INFO_(FLOPPY, "ReadWritePassive(): iterating in while (TransferByteOffset = 0x%x of 0x%x total) - allocating %d registers\n", + TransferByteOffset, Length, DriveInfo->ControllerInfo->MapRegisters); + + KeClearEvent(&DriveInfo->ControllerInfo->SynchEvent); + + /* + * Compute starting CHS + */ + if(RWComputeCHS(DriveInfo, DiskByteOffset+TransferByteOffset, &Cylinder, &Head, &StartSector) != STATUS_SUCCESS) + { + WARN_(FLOPPY, "ReadWritePassive(): unable to compute CHS; completing with STATUS_UNSUCCESSFUL\n"); + RWFreeAdapterChannel(DriveInfo->ControllerInfo->AdapterObject); + IoCompleteRequest(Irp, IO_NO_INCREMENT); + StopMotor(DriveInfo->ControllerInfo); + return; + } + + /* + * Seek to the right track + */ + if(!DriveInfo->ControllerInfo->ImpliedSeeks) + { + if(RWSeekToCylinder(DriveInfo, Cylinder) != STATUS_SUCCESS) { - WARN_(FLOPPY, "ReadWritePassive(): unable to seek; completing with STATUS_UNSUCCESSFUL\n"); - RWFreeAdapterChannel(DriveInfo->ControllerInfo->AdapterObject); - IoCompleteRequest(Irp, IO_NO_INCREMENT); - StopMotor(DriveInfo->ControllerInfo); - return ; - } + WARN_(FLOPPY, "ReadWritePassive(): unable to seek; completing with STATUS_UNSUCCESSFUL\n"); + RWFreeAdapterChannel(DriveInfo->ControllerInfo->AdapterObject); + IoCompleteRequest(Irp, IO_NO_INCREMENT); + StopMotor(DriveInfo->ControllerInfo); + return ; + } } - /* - * Compute last sector - * - * We can only ask for a transfer up to the end of the track. Then we have to re-seek and do more. - * TODO: Support the MT bit - */ - INFO_(FLOPPY, "ReadWritePassive(): computing number of sectors to transfer (StartSector 0x%x): ", StartSector); + /* + * Compute last sector + * + * We can only ask for a transfer up to the end of the track. Then we have to re-seek and do more. + * TODO: Support the MT bit + */ + INFO_(FLOPPY, "ReadWritePassive(): computing number of sectors to transfer (StartSector 0x%x): ", StartSector); - /* 1-based sector number */ - if( (((DriveInfo->DiskGeometry.TracksPerCylinder - Head) * DriveInfo->DiskGeometry.SectorsPerTrack - StartSector) + 1 ) < - (Length - TransferByteOffset) / DriveInfo->DiskGeometry.BytesPerSector) - { - CurrentTransferSectors = (UCHAR)((DriveInfo->DiskGeometry.TracksPerCylinder - Head) * DriveInfo->DiskGeometry.SectorsPerTrack - StartSector) + 1; - } - else - { - CurrentTransferSectors = (UCHAR)((Length - TransferByteOffset) / DriveInfo->DiskGeometry.BytesPerSector); - } - - INFO_(FLOPPY, "0x%x\n", CurrentTransferSectors); - - CurrentTransferBytes = CurrentTransferSectors * DriveInfo->DiskGeometry.BytesPerSector; - - /* - * Adjust to map registers - * BUG: Does this take into account page crossings? - */ - INFO_(FLOPPY, "ReadWritePassive(): Trying to transfer 0x%x bytes\n", CurrentTransferBytes); - - ASSERT(CurrentTransferBytes); - - if(BYTES_TO_PAGES(CurrentTransferBytes) > DriveInfo->ControllerInfo->MapRegisters) + /* 1-based sector number */ + if( (((DriveInfo->DiskGeometry.TracksPerCylinder - Head) * DriveInfo->DiskGeometry.SectorsPerTrack - StartSector) + 1 ) < + (Length - TransferByteOffset) / DriveInfo->DiskGeometry.BytesPerSector) { - CurrentTransferSectors = (UCHAR)((DriveInfo->ControllerInfo->MapRegisters * PAGE_SIZE) / - DriveInfo->DiskGeometry.BytesPerSector); - - CurrentTransferBytes = CurrentTransferSectors * DriveInfo->DiskGeometry.BytesPerSector; - - INFO_(FLOPPY, "ReadWritePassive: limiting transfer to 0x%x bytes (0x%x sectors) due to map registers\n", - CurrentTransferBytes, CurrentTransferSectors); + CurrentTransferSectors = (UCHAR)((DriveInfo->DiskGeometry.TracksPerCylinder - Head) * DriveInfo->DiskGeometry.SectorsPerTrack - StartSector) + 1; + } + else + { + CurrentTransferSectors = (UCHAR)((Length - TransferByteOffset) / DriveInfo->DiskGeometry.BytesPerSector); } - /* set up this round's dma operation */ - /* param 2 is ReadOperation --> opposite of WriteToDevice that IoMapTransfer takes. BAD MS. */ - KeFlushIoBuffers(Irp->MdlAddress, !WriteToDevice, TRUE); + INFO_(FLOPPY, "0x%x\n", CurrentTransferSectors); - IoMapTransfer(DriveInfo->ControllerInfo->AdapterObject, Irp->MdlAddress, - DriveInfo->ControllerInfo->MapRegisterBase, - (PVOID)((ULONG_PTR)MmGetMdlVirtualAddress(Irp->MdlAddress) + TransferByteOffset), - &CurrentTransferBytes, WriteToDevice); + CurrentTransferBytes = CurrentTransferSectors * DriveInfo->DiskGeometry.BytesPerSector; - /* - * Read or Write - */ - KeClearEvent(&DriveInfo->ControllerInfo->SynchEvent); + /* + * Adjust to map registers + * BUG: Does this take into account page crossings? + */ + INFO_(FLOPPY, "ReadWritePassive(): Trying to transfer 0x%x bytes\n", CurrentTransferBytes); - /* Issue the read/write command to the controller. Note that it expects the opposite of WriteToDevice. */ - if(HwReadWriteData(DriveInfo->ControllerInfo, !WriteToDevice, DriveInfo->UnitNumber, Cylinder, Head, StartSector, - DriveInfo->BytesPerSectorCode, DriveInfo->DiskGeometry.SectorsPerTrack, Gap, 0xff) != STATUS_SUCCESS) - { - WARN_(FLOPPY, "ReadWritePassive(): HwReadWriteData returned failure; unable to read; completing with STATUS_UNSUCCESSFUL\n"); - RWFreeAdapterChannel(DriveInfo->ControllerInfo->AdapterObject); - IoCompleteRequest(Irp, IO_NO_INCREMENT); - StopMotor(DriveInfo->ControllerInfo); - return ; - } + ASSERT(CurrentTransferBytes); - INFO_(FLOPPY, "ReadWritePassive(): HwReadWriteData returned -- waiting on event\n"); + if(BYTES_TO_PAGES(CurrentTransferBytes) > DriveInfo->ControllerInfo->MapRegisters) + { + CurrentTransferSectors = (UCHAR)((DriveInfo->ControllerInfo->MapRegisters * PAGE_SIZE) / + DriveInfo->DiskGeometry.BytesPerSector); - /* - * At this point, we block and wait for an interrupt - * FIXME: this seems to take too long - */ - WaitForControllerInterrupt(DriveInfo->ControllerInfo); + CurrentTransferBytes = CurrentTransferSectors * DriveInfo->DiskGeometry.BytesPerSector; - /* Read is complete; flush & free adapter channel */ - IoFlushAdapterBuffers(DriveInfo->ControllerInfo->AdapterObject, Irp->MdlAddress, - DriveInfo->ControllerInfo->MapRegisterBase, - (PVOID)((ULONG_PTR)MmGetMdlVirtualAddress(Irp->MdlAddress) + TransferByteOffset), - CurrentTransferBytes, WriteToDevice); + INFO_(FLOPPY, "ReadWritePassive: limiting transfer to 0x%x bytes (0x%x sectors) due to map registers\n", + CurrentTransferBytes, CurrentTransferSectors); + } - /* Read the results from the drive */ - if(HwReadWriteResult(DriveInfo->ControllerInfo) != STATUS_SUCCESS) - { - WARN_(FLOPPY, "ReadWritePassive(): HwReadWriteResult returned failure; unable to read; completing with STATUS_UNSUCCESSFUL\n"); - HwDumpRegisters(DriveInfo->ControllerInfo); - RWFreeAdapterChannel(DriveInfo->ControllerInfo->AdapterObject); - IoCompleteRequest(Irp, IO_NO_INCREMENT); - StopMotor(DriveInfo->ControllerInfo); - return ; - } + /* set up this round's dma operation */ + /* param 2 is ReadOperation --> opposite of WriteToDevice that IoMapTransfer takes. BAD MS. */ + KeFlushIoBuffers(Irp->MdlAddress, !WriteToDevice, TRUE); - TransferByteOffset += CurrentTransferBytes; + IoMapTransfer(DriveInfo->ControllerInfo->AdapterObject, Irp->MdlAddress, + DriveInfo->ControllerInfo->MapRegisterBase, + (PVOID)((ULONG_PTR)MmGetMdlVirtualAddress(Irp->MdlAddress) + TransferByteOffset), + &CurrentTransferBytes, WriteToDevice); + + /* + * Read or Write + */ + KeClearEvent(&DriveInfo->ControllerInfo->SynchEvent); + + /* Issue the read/write command to the controller. Note that it expects the opposite of WriteToDevice. */ + if(HwReadWriteData(DriveInfo->ControllerInfo, !WriteToDevice, DriveInfo->UnitNumber, Cylinder, Head, StartSector, + DriveInfo->BytesPerSectorCode, DriveInfo->DiskGeometry.SectorsPerTrack, Gap, 0xff) != STATUS_SUCCESS) + { + WARN_(FLOPPY, "ReadWritePassive(): HwReadWriteData returned failure; unable to read; completing with STATUS_UNSUCCESSFUL\n"); + RWFreeAdapterChannel(DriveInfo->ControllerInfo->AdapterObject); + IoCompleteRequest(Irp, IO_NO_INCREMENT); + StopMotor(DriveInfo->ControllerInfo); + return ; + } + + INFO_(FLOPPY, "ReadWritePassive(): HwReadWriteData returned -- waiting on event\n"); + + /* + * At this point, we block and wait for an interrupt + * FIXME: this seems to take too long + */ + WaitForControllerInterrupt(DriveInfo->ControllerInfo); + + /* Read is complete; flush & free adapter channel */ + IoFlushAdapterBuffers(DriveInfo->ControllerInfo->AdapterObject, Irp->MdlAddress, + DriveInfo->ControllerInfo->MapRegisterBase, + (PVOID)((ULONG_PTR)MmGetMdlVirtualAddress(Irp->MdlAddress) + TransferByteOffset), + CurrentTransferBytes, WriteToDevice); + + /* Read the results from the drive */ + if(HwReadWriteResult(DriveInfo->ControllerInfo) != STATUS_SUCCESS) + { + WARN_(FLOPPY, "ReadWritePassive(): HwReadWriteResult returned failure; unable to read; completing with STATUS_UNSUCCESSFUL\n"); + HwDumpRegisters(DriveInfo->ControllerInfo); + RWFreeAdapterChannel(DriveInfo->ControllerInfo->AdapterObject); + IoCompleteRequest(Irp, IO_NO_INCREMENT); + StopMotor(DriveInfo->ControllerInfo); + return ; + } + + TransferByteOffset += CurrentTransferBytes; } - RWFreeAdapterChannel(DriveInfo->ControllerInfo->AdapterObject); + RWFreeAdapterChannel(DriveInfo->ControllerInfo->AdapterObject); - /* That's all folks! */ - INFO_(FLOPPY, "ReadWritePassive(): success; Completing with STATUS_SUCCESS\n"); - Irp->IoStatus.Status = STATUS_SUCCESS; - Irp->IoStatus.Information = Length; - IoCompleteRequest(Irp, IO_DISK_INCREMENT); - StopMotor(DriveInfo->ControllerInfo); + /* That's all folks! */ + INFO_(FLOPPY, "ReadWritePassive(): success; Completing with STATUS_SUCCESS\n"); + Irp->IoStatus.Status = STATUS_SUCCESS; + Irp->IoStatus.Information = Length; + IoCompleteRequest(Irp, IO_DISK_INCREMENT); + StopMotor(DriveInfo->ControllerInfo); } diff --git a/reactos/drivers/storage/floppy/readwrite.h b/reactos/drivers/storage/floppy/readwrite.h index 8168560f66a..c427a8086d5 100644 --- a/reactos/drivers/storage/floppy/readwrite.h +++ b/reactos/drivers/storage/floppy/readwrite.h @@ -25,8 +25,10 @@ */ DRIVER_DISPATCH ReadWrite; -NTSTATUS NTAPI ReadWrite(PDEVICE_OBJECT DeviceObject, - PIRP Irp); -VOID NTAPI ReadWritePassive(PDRIVE_INFO DriveInfo, PIRP Irp); +NTSTATUS NTAPI +ReadWrite(PDEVICE_OBJECT DeviceObject, PIRP Irp); + +VOID NTAPI +ReadWritePassive(PDRIVE_INFO DriveInfo, PIRP Irp); From be4bb69ef8982b04b130663a8823cb37b0c0e5f5 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Wed, 20 Apr 2011 21:10:13 +0000 Subject: [PATCH 182/317] [WIN32K] Don't try to lock a dcs clip region if its NULL svn path=/trunk/; revision=51411 --- reactos/subsystems/win32/win32k/objects/cliprgn.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/subsystems/win32/win32k/objects/cliprgn.c b/reactos/subsystems/win32/win32k/objects/cliprgn.c index 7294f2b31fd..bfe5248d10e 100644 --- a/reactos/subsystems/win32/win32k/objects/cliprgn.c +++ b/reactos/subsystems/win32/win32k/objects/cliprgn.c @@ -192,7 +192,7 @@ GdiGetClipBox(HDC hDC, PRECTL rc) { pRgn = dc->dclevel.prgnMeta; } - else + else if (dc->rosdc.hClipRgn) { Unlock = TRUE ; pRgn = REGION_LockRgn(dc->rosdc.hClipRgn); // CLIPRGN From a861f7c282ed95e5a79a055ad6f4f99eddccaf02 Mon Sep 17 00:00:00 2001 From: Rafal Harabien Date: Wed, 20 Apr 2011 21:31:41 +0000 Subject: [PATCH 183/317] [KERNEL32] * Properly check if buffer given to GetComputerName is too small. Fixes hostname.exe if computer name is MAX_COMPUTERNAME_LENGTH long (the default for bootcd since it's generated randomly in Setup). * Simplify it a bit svn path=/trunk/; revision=51412 --- .../dll/win32/kernel32/misc/computername.c | 61 ++++++++++--------- 1 file changed, 33 insertions(+), 28 deletions(-) diff --git a/reactos/dll/win32/kernel32/misc/computername.c b/reactos/dll/win32/kernel32/misc/computername.c index fcaf9f38a59..d04172d6a6a 100644 --- a/reactos/dll/win32/kernel32/misc/computername.c +++ b/reactos/dll/win32/kernel32/misc/computername.c @@ -39,7 +39,7 @@ BOOL GetComputerNameFromRegistry(LPWSTR RegistryKey, LPWSTR ValueNameStr, LPWSTR lpBuffer, - LPDWORD nSize ) + LPDWORD nSize) { PKEY_VALUE_PARTIAL_INFORMATION KeyInfo; OBJECT_ATTRIBUTES ObjectAttributes; @@ -50,7 +50,7 @@ GetComputerNameFromRegistry(LPWSTR RegistryKey, ULONG ReturnSize; NTSTATUS Status; - RtlInitUnicodeString(&KeyName,RegistryKey); + RtlInitUnicodeString(&KeyName, RegistryKey); InitializeObjectAttributes(&ObjectAttributes, &KeyName, OBJ_CASE_INSENSITIVE, @@ -75,7 +75,7 @@ GetComputerNameFromRegistry(LPWSTR RegistryKey, return FALSE; } - RtlInitUnicodeString(&ValueName,ValueNameStr); + RtlInitUnicodeString(&ValueName, ValueNameStr); Status = ZwQueryValueKey(KeyHandle, &ValueName, @@ -83,35 +83,40 @@ GetComputerNameFromRegistry(LPWSTR RegistryKey, KeyInfo, KeyInfoSize, &ReturnSize); - if (!NT_SUCCESS(Status)) - { - RtlFreeHeap(RtlGetProcessHeap(), 0, KeyInfo); - ZwClose(KeyHandle); - *nSize = ReturnSize; - SetLastErrorByStatus(Status); - return FALSE; - } - if (lpBuffer && *nSize > (KeyInfo->DataLength / sizeof(WCHAR))) - { - *nSize = KeyInfo->DataLength / sizeof(WCHAR) - 1; - lpBuffer[*nSize] = 0; - } - else - { - RtlFreeHeap(RtlGetProcessHeap(), 0, KeyInfo); - ZwClose(KeyHandle); - *nSize = ReturnSize; - SetLastErrorByStatus(STATUS_BUFFER_OVERFLOW); - return FALSE; - } - - RtlCopyMemory(lpBuffer, KeyInfo->Data, *nSize * sizeof(WCHAR)); - - RtlFreeHeap(RtlGetProcessHeap(), 0, KeyInfo); ZwClose(KeyHandle); + if (!NT_SUCCESS(Status)) + { + *nSize = ReturnSize; + goto failed; + } + + if (KeyInfo->Type != REG_SZ) + { + Status = STATUS_UNSUCCESSFUL; + goto failed; + } + + if (!lpBuffer || *nSize < (KeyInfo->DataLength / sizeof(WCHAR))) + { + *nSize = ReturnSize; + Status = STATUS_BUFFER_OVERFLOW; + goto failed; + } + + *nSize = KeyInfo->DataLength / sizeof(WCHAR) - 1; + RtlCopyMemory(lpBuffer, KeyInfo->Data, KeyInfo->DataLength); + lpBuffer[*nSize] = 0; + + RtlFreeHeap(RtlGetProcessHeap(), 0, KeyInfo); + return TRUE; + +failed: + RtlFreeHeap(RtlGetProcessHeap(), 0, KeyInfo); + SetLastErrorByStatus(Status); + return FALSE; } /* From a6294542d07840414bb4761933a3a352431c81cf Mon Sep 17 00:00:00 2001 From: James Tabor Date: Thu, 21 Apr 2011 16:43:52 +0000 Subject: [PATCH 184/317] - Add Unicows to packing list. svn path=/trunk/; revision=51414 --- reactos/boot/bootdata/packages/reactos.dff | 1 + 1 file changed, 1 insertion(+) diff --git a/reactos/boot/bootdata/packages/reactos.dff b/reactos/boot/bootdata/packages/reactos.dff index 85f7955fdc8..9019e79d2e7 100644 --- a/reactos/boot/bootdata/packages/reactos.dff +++ b/reactos/boot/bootdata/packages/reactos.dff @@ -447,6 +447,7 @@ dll\win32\twain_32\twain_32.dll 1 dll\win32\uext2\uext2.dll 1 dll\win32\ufat\ufat.dll 1 dll\win32\ufatx\ufatx.dll 1 optional +dll\win32\unicows\unicows.dll 1 dll\win32\untfs\untfs.dll 1 dll\win32\updspapi\updspapi.dll 1 dll\win32\url\url.dll 1 From f3aa24aa4f4e1c2da56f521253c1d05436499570 Mon Sep 17 00:00:00 2001 From: Gregor Schneider Date: Thu, 21 Apr 2011 21:05:47 +0000 Subject: [PATCH 185/317] Rename paint to mspaint to maintain script compatibility See issue #6071 for more details. svn path=/trunk/; revision=51415 --- reactos/base/applications/applications.rbuild | 6 +++--- .../applications/{paint => mspaint}/definitions.h | 0 .../base/applications/{paint => mspaint}/dialogs.c | 0 .../base/applications/{paint => mspaint}/dialogs.h | 0 reactos/base/applications/{paint => mspaint}/dib.c | 0 reactos/base/applications/{paint => mspaint}/dib.h | 0 .../base/applications/{paint => mspaint}/drawing.c | 0 .../base/applications/{paint => mspaint}/drawing.h | 0 .../applications/{paint => mspaint}/globalvar.h | 0 .../applications/{paint => mspaint}/help/Paint.chm | Bin .../applications/{paint => mspaint}/help/Paint.hhp | 0 .../{paint => mspaint}/help/Table of Contents.hhc | 0 .../{paint => mspaint}/help/airbrush.png | Bin .../{paint => mspaint}/help/appwindow.png | Bin .../applications/{paint => mspaint}/help/bezier.png | Bin .../applications/{paint => mspaint}/help/brush.png | Bin .../applications/{paint => mspaint}/help/color.png | Bin .../{paint => mspaint}/help/ellipse.png | Bin .../applications/{paint => mspaint}/help/fill.png | Bin .../{paint => mspaint}/help/freesel.png | Bin .../applications/{paint => mspaint}/help/line.png | Bin .../{paint => mspaint}/help/palette.png | Bin .../applications/{paint => mspaint}/help/pen.png | Bin .../applications/{paint => mspaint}/help/rect.png | Bin .../{paint => mspaint}/help/rectsel.png | Bin .../applications/{paint => mspaint}/help/rrect.png | Bin .../applications/{paint => mspaint}/help/rubber.png | Bin .../{paint => mspaint}/help/settings.html | 0 .../{paint => mspaint}/help/settings1.png | Bin .../{paint => mspaint}/help/settings2.png | Bin .../{paint => mspaint}/help/settings3.png | Bin .../{paint => mspaint}/help/settings4.png | Bin .../{paint => mspaint}/help/settings5.png | Bin .../{paint => mspaint}/help/settings6.png | Bin .../applications/{paint => mspaint}/help/shape.png | Bin .../applications/{paint => mspaint}/help/text.png | Bin .../{paint => mspaint}/help/toolbox.png | Bin .../applications/{paint => mspaint}/help/tools.html | 0 .../applications/{paint => mspaint}/help/usage.html | 0 .../applications/{paint => mspaint}/help/zoom.png | Bin .../base/applications/{paint => mspaint}/history.c | 0 .../base/applications/{paint => mspaint}/history.h | 0 .../base/applications/{paint => mspaint}/icons.rc | 0 .../{paint => mspaint}/icons/airbrush_cur.ico | Bin .../{paint => mspaint}/icons/color_cur.ico | Bin .../{paint => mspaint}/icons/fill_cur.ico | Bin .../{paint => mspaint}/icons/horzstretch.ico | Bin .../{paint => mspaint}/icons/iconbar.bmp | Bin .../{paint => mspaint}/icons/nontransparent.ico | Bin .../applications/{paint => mspaint}/icons/paint.ico | Bin .../applications/{paint => mspaint}/icons/paint.svg | 0 .../{paint => mspaint}/icons/pen_cur.ico | Bin .../{paint => mspaint}/icons/transparency.xcf | Bin .../{paint => mspaint}/icons/transparent.ico | Bin .../{paint => mspaint}/icons/vertstretch.ico | Bin .../{paint => mspaint}/icons/zoom_cur.ico | Bin .../applications/{paint => mspaint}/lang/bg-BG.rc | 0 .../applications/{paint => mspaint}/lang/cs-CZ.rc | 0 .../applications/{paint => mspaint}/lang/de-DE.rc | 0 .../applications/{paint => mspaint}/lang/en-GB.rc | 0 .../applications/{paint => mspaint}/lang/en-US.rc | 0 .../applications/{paint => mspaint}/lang/es-ES.rc | 0 .../applications/{paint => mspaint}/lang/eu-ES.rc | 0 .../applications/{paint => mspaint}/lang/fr-FR.rc | 0 .../applications/{paint => mspaint}/lang/hu-HU.rc | 0 .../applications/{paint => mspaint}/lang/it-IT.rc | 0 .../applications/{paint => mspaint}/lang/ja-JP.rc | 0 .../applications/{paint => mspaint}/lang/nl-NL.rc | 0 .../applications/{paint => mspaint}/lang/no-NO.rc | 0 .../applications/{paint => mspaint}/lang/pl-PL.rc | 0 .../applications/{paint => mspaint}/lang/pt-BR.rc | 0 .../applications/{paint => mspaint}/lang/pt-PT.rc | 0 .../applications/{paint => mspaint}/lang/ro-RO.rc | 0 .../applications/{paint => mspaint}/lang/ru-RU.rc | 0 .../applications/{paint => mspaint}/lang/sk-SK.rc | 0 .../applications/{paint => mspaint}/lang/uk-UA.rc | 0 reactos/base/applications/{paint => mspaint}/main.c | 0 .../base/applications/{paint => mspaint}/mouse.c | 0 .../base/applications/{paint => mspaint}/mouse.h | 0 .../mspaint.exe.amd64.manifest} | 0 .../mspaint.exe.manifest} | 0 .../{paint/paint.rbuild => mspaint/mspaint.rbuild} | 4 ++-- .../base/applications/{paint => mspaint}/palette.c | 0 .../base/applications/{paint => mspaint}/palette.h | 0 .../base/applications/{paint => mspaint}/registry.c | 0 .../base/applications/{paint => mspaint}/registry.h | 0 .../base/applications/{paint => mspaint}/rsrc.rc | 0 .../applications/{paint => mspaint}/selection.c | 0 .../applications/{paint => mspaint}/selection.h | 0 .../base/applications/{paint => mspaint}/sizebox.c | 0 .../base/applications/{paint => mspaint}/sizebox.h | 0 .../applications/{paint => mspaint}/toolsettings.c | 0 .../applications/{paint => mspaint}/toolsettings.h | 0 .../base/applications/{paint => mspaint}/winproc.c | 0 .../base/applications/{paint => mspaint}/winproc.h | 0 reactos/boot/bootdata/packages/reactos.dff | 2 +- reactos/dll/win32/syssetup/install.c | 2 +- 97 files changed, 7 insertions(+), 7 deletions(-) rename reactos/base/applications/{paint => mspaint}/definitions.h (100%) rename reactos/base/applications/{paint => mspaint}/dialogs.c (100%) rename reactos/base/applications/{paint => mspaint}/dialogs.h (100%) rename reactos/base/applications/{paint => mspaint}/dib.c (100%) rename reactos/base/applications/{paint => mspaint}/dib.h (100%) rename reactos/base/applications/{paint => mspaint}/drawing.c (100%) rename reactos/base/applications/{paint => mspaint}/drawing.h (100%) rename reactos/base/applications/{paint => mspaint}/globalvar.h (100%) rename reactos/base/applications/{paint => mspaint}/help/Paint.chm (100%) rename reactos/base/applications/{paint => mspaint}/help/Paint.hhp (100%) rename reactos/base/applications/{paint => mspaint}/help/Table of Contents.hhc (100%) rename reactos/base/applications/{paint => mspaint}/help/airbrush.png (100%) rename reactos/base/applications/{paint => mspaint}/help/appwindow.png (100%) rename reactos/base/applications/{paint => mspaint}/help/bezier.png (100%) rename reactos/base/applications/{paint => mspaint}/help/brush.png (100%) rename reactos/base/applications/{paint => mspaint}/help/color.png (100%) rename reactos/base/applications/{paint => mspaint}/help/ellipse.png (100%) rename reactos/base/applications/{paint => mspaint}/help/fill.png (100%) rename reactos/base/applications/{paint => mspaint}/help/freesel.png (100%) rename reactos/base/applications/{paint => mspaint}/help/line.png (100%) rename reactos/base/applications/{paint => mspaint}/help/palette.png (100%) rename reactos/base/applications/{paint => mspaint}/help/pen.png (100%) rename reactos/base/applications/{paint => mspaint}/help/rect.png (100%) rename reactos/base/applications/{paint => mspaint}/help/rectsel.png (100%) rename reactos/base/applications/{paint => mspaint}/help/rrect.png (100%) rename reactos/base/applications/{paint => mspaint}/help/rubber.png (100%) rename reactos/base/applications/{paint => mspaint}/help/settings.html (100%) rename reactos/base/applications/{paint => mspaint}/help/settings1.png (100%) rename reactos/base/applications/{paint => mspaint}/help/settings2.png (100%) rename reactos/base/applications/{paint => mspaint}/help/settings3.png (100%) rename reactos/base/applications/{paint => mspaint}/help/settings4.png (100%) rename reactos/base/applications/{paint => mspaint}/help/settings5.png (100%) rename reactos/base/applications/{paint => mspaint}/help/settings6.png (100%) rename reactos/base/applications/{paint => mspaint}/help/shape.png (100%) rename reactos/base/applications/{paint => mspaint}/help/text.png (100%) rename reactos/base/applications/{paint => mspaint}/help/toolbox.png (100%) rename reactos/base/applications/{paint => mspaint}/help/tools.html (100%) rename reactos/base/applications/{paint => mspaint}/help/usage.html (100%) rename reactos/base/applications/{paint => mspaint}/help/zoom.png (100%) rename reactos/base/applications/{paint => mspaint}/history.c (100%) rename reactos/base/applications/{paint => mspaint}/history.h (100%) rename reactos/base/applications/{paint => mspaint}/icons.rc (100%) rename reactos/base/applications/{paint => mspaint}/icons/airbrush_cur.ico (100%) rename reactos/base/applications/{paint => mspaint}/icons/color_cur.ico (100%) rename reactos/base/applications/{paint => mspaint}/icons/fill_cur.ico (100%) rename reactos/base/applications/{paint => mspaint}/icons/horzstretch.ico (100%) rename reactos/base/applications/{paint => mspaint}/icons/iconbar.bmp (100%) rename reactos/base/applications/{paint => mspaint}/icons/nontransparent.ico (100%) rename reactos/base/applications/{paint => mspaint}/icons/paint.ico (100%) rename reactos/base/applications/{paint => mspaint}/icons/paint.svg (100%) rename reactos/base/applications/{paint => mspaint}/icons/pen_cur.ico (100%) rename reactos/base/applications/{paint => mspaint}/icons/transparency.xcf (100%) rename reactos/base/applications/{paint => mspaint}/icons/transparent.ico (100%) rename reactos/base/applications/{paint => mspaint}/icons/vertstretch.ico (100%) rename reactos/base/applications/{paint => mspaint}/icons/zoom_cur.ico (100%) rename reactos/base/applications/{paint => mspaint}/lang/bg-BG.rc (100%) rename reactos/base/applications/{paint => mspaint}/lang/cs-CZ.rc (100%) rename reactos/base/applications/{paint => mspaint}/lang/de-DE.rc (100%) rename reactos/base/applications/{paint => mspaint}/lang/en-GB.rc (100%) rename reactos/base/applications/{paint => mspaint}/lang/en-US.rc (100%) rename reactos/base/applications/{paint => mspaint}/lang/es-ES.rc (100%) rename reactos/base/applications/{paint => mspaint}/lang/eu-ES.rc (100%) rename reactos/base/applications/{paint => mspaint}/lang/fr-FR.rc (100%) rename reactos/base/applications/{paint => mspaint}/lang/hu-HU.rc (100%) rename reactos/base/applications/{paint => mspaint}/lang/it-IT.rc (100%) rename reactos/base/applications/{paint => mspaint}/lang/ja-JP.rc (100%) rename reactos/base/applications/{paint => mspaint}/lang/nl-NL.rc (100%) rename reactos/base/applications/{paint => mspaint}/lang/no-NO.rc (100%) rename reactos/base/applications/{paint => mspaint}/lang/pl-PL.rc (100%) rename reactos/base/applications/{paint => mspaint}/lang/pt-BR.rc (100%) rename reactos/base/applications/{paint => mspaint}/lang/pt-PT.rc (100%) rename reactos/base/applications/{paint => mspaint}/lang/ro-RO.rc (100%) rename reactos/base/applications/{paint => mspaint}/lang/ru-RU.rc (100%) rename reactos/base/applications/{paint => mspaint}/lang/sk-SK.rc (100%) rename reactos/base/applications/{paint => mspaint}/lang/uk-UA.rc (100%) rename reactos/base/applications/{paint => mspaint}/main.c (100%) rename reactos/base/applications/{paint => mspaint}/mouse.c (100%) rename reactos/base/applications/{paint => mspaint}/mouse.h (100%) rename reactos/base/applications/{paint/paint.exe.amd64.manifest => mspaint/mspaint.exe.amd64.manifest} (100%) rename reactos/base/applications/{paint/paint.exe.manifest => mspaint/mspaint.exe.manifest} (100%) rename reactos/base/applications/{paint/paint.rbuild => mspaint/mspaint.rbuild} (77%) rename reactos/base/applications/{paint => mspaint}/palette.c (100%) rename reactos/base/applications/{paint => mspaint}/palette.h (100%) rename reactos/base/applications/{paint => mspaint}/registry.c (100%) rename reactos/base/applications/{paint => mspaint}/registry.h (100%) rename reactos/base/applications/{paint => mspaint}/rsrc.rc (100%) rename reactos/base/applications/{paint => mspaint}/selection.c (100%) rename reactos/base/applications/{paint => mspaint}/selection.h (100%) rename reactos/base/applications/{paint => mspaint}/sizebox.c (100%) rename reactos/base/applications/{paint => mspaint}/sizebox.h (100%) rename reactos/base/applications/{paint => mspaint}/toolsettings.c (100%) rename reactos/base/applications/{paint => mspaint}/toolsettings.h (100%) rename reactos/base/applications/{paint => mspaint}/winproc.c (100%) rename reactos/base/applications/{paint => mspaint}/winproc.h (100%) diff --git a/reactos/base/applications/applications.rbuild b/reactos/base/applications/applications.rbuild index 0a1265ce571..8255a9c61ad 100644 --- a/reactos/base/applications/applications.rbuild +++ b/reactos/base/applications/applications.rbuild @@ -55,6 +55,9 @@ + + + @@ -64,9 +67,6 @@ - - - diff --git a/reactos/base/applications/paint/definitions.h b/reactos/base/applications/mspaint/definitions.h similarity index 100% rename from reactos/base/applications/paint/definitions.h rename to reactos/base/applications/mspaint/definitions.h diff --git a/reactos/base/applications/paint/dialogs.c b/reactos/base/applications/mspaint/dialogs.c similarity index 100% rename from reactos/base/applications/paint/dialogs.c rename to reactos/base/applications/mspaint/dialogs.c diff --git a/reactos/base/applications/paint/dialogs.h b/reactos/base/applications/mspaint/dialogs.h similarity index 100% rename from reactos/base/applications/paint/dialogs.h rename to reactos/base/applications/mspaint/dialogs.h diff --git a/reactos/base/applications/paint/dib.c b/reactos/base/applications/mspaint/dib.c similarity index 100% rename from reactos/base/applications/paint/dib.c rename to reactos/base/applications/mspaint/dib.c diff --git a/reactos/base/applications/paint/dib.h b/reactos/base/applications/mspaint/dib.h similarity index 100% rename from reactos/base/applications/paint/dib.h rename to reactos/base/applications/mspaint/dib.h diff --git a/reactos/base/applications/paint/drawing.c b/reactos/base/applications/mspaint/drawing.c similarity index 100% rename from reactos/base/applications/paint/drawing.c rename to reactos/base/applications/mspaint/drawing.c diff --git a/reactos/base/applications/paint/drawing.h b/reactos/base/applications/mspaint/drawing.h similarity index 100% rename from reactos/base/applications/paint/drawing.h rename to reactos/base/applications/mspaint/drawing.h diff --git a/reactos/base/applications/paint/globalvar.h b/reactos/base/applications/mspaint/globalvar.h similarity index 100% rename from reactos/base/applications/paint/globalvar.h rename to reactos/base/applications/mspaint/globalvar.h diff --git a/reactos/base/applications/paint/help/Paint.chm b/reactos/base/applications/mspaint/help/Paint.chm similarity index 100% rename from reactos/base/applications/paint/help/Paint.chm rename to reactos/base/applications/mspaint/help/Paint.chm diff --git a/reactos/base/applications/paint/help/Paint.hhp b/reactos/base/applications/mspaint/help/Paint.hhp similarity index 100% rename from reactos/base/applications/paint/help/Paint.hhp rename to reactos/base/applications/mspaint/help/Paint.hhp diff --git a/reactos/base/applications/paint/help/Table of Contents.hhc b/reactos/base/applications/mspaint/help/Table of Contents.hhc similarity index 100% rename from reactos/base/applications/paint/help/Table of Contents.hhc rename to reactos/base/applications/mspaint/help/Table of Contents.hhc diff --git a/reactos/base/applications/paint/help/airbrush.png b/reactos/base/applications/mspaint/help/airbrush.png similarity index 100% rename from reactos/base/applications/paint/help/airbrush.png rename to reactos/base/applications/mspaint/help/airbrush.png diff --git a/reactos/base/applications/paint/help/appwindow.png b/reactos/base/applications/mspaint/help/appwindow.png similarity index 100% rename from reactos/base/applications/paint/help/appwindow.png rename to reactos/base/applications/mspaint/help/appwindow.png diff --git a/reactos/base/applications/paint/help/bezier.png b/reactos/base/applications/mspaint/help/bezier.png similarity index 100% rename from reactos/base/applications/paint/help/bezier.png rename to reactos/base/applications/mspaint/help/bezier.png diff --git a/reactos/base/applications/paint/help/brush.png b/reactos/base/applications/mspaint/help/brush.png similarity index 100% rename from reactos/base/applications/paint/help/brush.png rename to reactos/base/applications/mspaint/help/brush.png diff --git a/reactos/base/applications/paint/help/color.png b/reactos/base/applications/mspaint/help/color.png similarity index 100% rename from reactos/base/applications/paint/help/color.png rename to reactos/base/applications/mspaint/help/color.png diff --git a/reactos/base/applications/paint/help/ellipse.png b/reactos/base/applications/mspaint/help/ellipse.png similarity index 100% rename from reactos/base/applications/paint/help/ellipse.png rename to reactos/base/applications/mspaint/help/ellipse.png diff --git a/reactos/base/applications/paint/help/fill.png b/reactos/base/applications/mspaint/help/fill.png similarity index 100% rename from reactos/base/applications/paint/help/fill.png rename to reactos/base/applications/mspaint/help/fill.png diff --git a/reactos/base/applications/paint/help/freesel.png b/reactos/base/applications/mspaint/help/freesel.png similarity index 100% rename from reactos/base/applications/paint/help/freesel.png rename to reactos/base/applications/mspaint/help/freesel.png diff --git a/reactos/base/applications/paint/help/line.png b/reactos/base/applications/mspaint/help/line.png similarity index 100% rename from reactos/base/applications/paint/help/line.png rename to reactos/base/applications/mspaint/help/line.png diff --git a/reactos/base/applications/paint/help/palette.png b/reactos/base/applications/mspaint/help/palette.png similarity index 100% rename from reactos/base/applications/paint/help/palette.png rename to reactos/base/applications/mspaint/help/palette.png diff --git a/reactos/base/applications/paint/help/pen.png b/reactos/base/applications/mspaint/help/pen.png similarity index 100% rename from reactos/base/applications/paint/help/pen.png rename to reactos/base/applications/mspaint/help/pen.png diff --git a/reactos/base/applications/paint/help/rect.png b/reactos/base/applications/mspaint/help/rect.png similarity index 100% rename from reactos/base/applications/paint/help/rect.png rename to reactos/base/applications/mspaint/help/rect.png diff --git a/reactos/base/applications/paint/help/rectsel.png b/reactos/base/applications/mspaint/help/rectsel.png similarity index 100% rename from reactos/base/applications/paint/help/rectsel.png rename to reactos/base/applications/mspaint/help/rectsel.png diff --git a/reactos/base/applications/paint/help/rrect.png b/reactos/base/applications/mspaint/help/rrect.png similarity index 100% rename from reactos/base/applications/paint/help/rrect.png rename to reactos/base/applications/mspaint/help/rrect.png diff --git a/reactos/base/applications/paint/help/rubber.png b/reactos/base/applications/mspaint/help/rubber.png similarity index 100% rename from reactos/base/applications/paint/help/rubber.png rename to reactos/base/applications/mspaint/help/rubber.png diff --git a/reactos/base/applications/paint/help/settings.html b/reactos/base/applications/mspaint/help/settings.html similarity index 100% rename from reactos/base/applications/paint/help/settings.html rename to reactos/base/applications/mspaint/help/settings.html diff --git a/reactos/base/applications/paint/help/settings1.png b/reactos/base/applications/mspaint/help/settings1.png similarity index 100% rename from reactos/base/applications/paint/help/settings1.png rename to reactos/base/applications/mspaint/help/settings1.png diff --git a/reactos/base/applications/paint/help/settings2.png b/reactos/base/applications/mspaint/help/settings2.png similarity index 100% rename from reactos/base/applications/paint/help/settings2.png rename to reactos/base/applications/mspaint/help/settings2.png diff --git a/reactos/base/applications/paint/help/settings3.png b/reactos/base/applications/mspaint/help/settings3.png similarity index 100% rename from reactos/base/applications/paint/help/settings3.png rename to reactos/base/applications/mspaint/help/settings3.png diff --git a/reactos/base/applications/paint/help/settings4.png b/reactos/base/applications/mspaint/help/settings4.png similarity index 100% rename from reactos/base/applications/paint/help/settings4.png rename to reactos/base/applications/mspaint/help/settings4.png diff --git a/reactos/base/applications/paint/help/settings5.png b/reactos/base/applications/mspaint/help/settings5.png similarity index 100% rename from reactos/base/applications/paint/help/settings5.png rename to reactos/base/applications/mspaint/help/settings5.png diff --git a/reactos/base/applications/paint/help/settings6.png b/reactos/base/applications/mspaint/help/settings6.png similarity index 100% rename from reactos/base/applications/paint/help/settings6.png rename to reactos/base/applications/mspaint/help/settings6.png diff --git a/reactos/base/applications/paint/help/shape.png b/reactos/base/applications/mspaint/help/shape.png similarity index 100% rename from reactos/base/applications/paint/help/shape.png rename to reactos/base/applications/mspaint/help/shape.png diff --git a/reactos/base/applications/paint/help/text.png b/reactos/base/applications/mspaint/help/text.png similarity index 100% rename from reactos/base/applications/paint/help/text.png rename to reactos/base/applications/mspaint/help/text.png diff --git a/reactos/base/applications/paint/help/toolbox.png b/reactos/base/applications/mspaint/help/toolbox.png similarity index 100% rename from reactos/base/applications/paint/help/toolbox.png rename to reactos/base/applications/mspaint/help/toolbox.png diff --git a/reactos/base/applications/paint/help/tools.html b/reactos/base/applications/mspaint/help/tools.html similarity index 100% rename from reactos/base/applications/paint/help/tools.html rename to reactos/base/applications/mspaint/help/tools.html diff --git a/reactos/base/applications/paint/help/usage.html b/reactos/base/applications/mspaint/help/usage.html similarity index 100% rename from reactos/base/applications/paint/help/usage.html rename to reactos/base/applications/mspaint/help/usage.html diff --git a/reactos/base/applications/paint/help/zoom.png b/reactos/base/applications/mspaint/help/zoom.png similarity index 100% rename from reactos/base/applications/paint/help/zoom.png rename to reactos/base/applications/mspaint/help/zoom.png diff --git a/reactos/base/applications/paint/history.c b/reactos/base/applications/mspaint/history.c similarity index 100% rename from reactos/base/applications/paint/history.c rename to reactos/base/applications/mspaint/history.c diff --git a/reactos/base/applications/paint/history.h b/reactos/base/applications/mspaint/history.h similarity index 100% rename from reactos/base/applications/paint/history.h rename to reactos/base/applications/mspaint/history.h diff --git a/reactos/base/applications/paint/icons.rc b/reactos/base/applications/mspaint/icons.rc similarity index 100% rename from reactos/base/applications/paint/icons.rc rename to reactos/base/applications/mspaint/icons.rc diff --git a/reactos/base/applications/paint/icons/airbrush_cur.ico b/reactos/base/applications/mspaint/icons/airbrush_cur.ico similarity index 100% rename from reactos/base/applications/paint/icons/airbrush_cur.ico rename to reactos/base/applications/mspaint/icons/airbrush_cur.ico diff --git a/reactos/base/applications/paint/icons/color_cur.ico b/reactos/base/applications/mspaint/icons/color_cur.ico similarity index 100% rename from reactos/base/applications/paint/icons/color_cur.ico rename to reactos/base/applications/mspaint/icons/color_cur.ico diff --git a/reactos/base/applications/paint/icons/fill_cur.ico b/reactos/base/applications/mspaint/icons/fill_cur.ico similarity index 100% rename from reactos/base/applications/paint/icons/fill_cur.ico rename to reactos/base/applications/mspaint/icons/fill_cur.ico diff --git a/reactos/base/applications/paint/icons/horzstretch.ico b/reactos/base/applications/mspaint/icons/horzstretch.ico similarity index 100% rename from reactos/base/applications/paint/icons/horzstretch.ico rename to reactos/base/applications/mspaint/icons/horzstretch.ico diff --git a/reactos/base/applications/paint/icons/iconbar.bmp b/reactos/base/applications/mspaint/icons/iconbar.bmp similarity index 100% rename from reactos/base/applications/paint/icons/iconbar.bmp rename to reactos/base/applications/mspaint/icons/iconbar.bmp diff --git a/reactos/base/applications/paint/icons/nontransparent.ico b/reactos/base/applications/mspaint/icons/nontransparent.ico similarity index 100% rename from reactos/base/applications/paint/icons/nontransparent.ico rename to reactos/base/applications/mspaint/icons/nontransparent.ico diff --git a/reactos/base/applications/paint/icons/paint.ico b/reactos/base/applications/mspaint/icons/paint.ico similarity index 100% rename from reactos/base/applications/paint/icons/paint.ico rename to reactos/base/applications/mspaint/icons/paint.ico diff --git a/reactos/base/applications/paint/icons/paint.svg b/reactos/base/applications/mspaint/icons/paint.svg similarity index 100% rename from reactos/base/applications/paint/icons/paint.svg rename to reactos/base/applications/mspaint/icons/paint.svg diff --git a/reactos/base/applications/paint/icons/pen_cur.ico b/reactos/base/applications/mspaint/icons/pen_cur.ico similarity index 100% rename from reactos/base/applications/paint/icons/pen_cur.ico rename to reactos/base/applications/mspaint/icons/pen_cur.ico diff --git a/reactos/base/applications/paint/icons/transparency.xcf b/reactos/base/applications/mspaint/icons/transparency.xcf similarity index 100% rename from reactos/base/applications/paint/icons/transparency.xcf rename to reactos/base/applications/mspaint/icons/transparency.xcf diff --git a/reactos/base/applications/paint/icons/transparent.ico b/reactos/base/applications/mspaint/icons/transparent.ico similarity index 100% rename from reactos/base/applications/paint/icons/transparent.ico rename to reactos/base/applications/mspaint/icons/transparent.ico diff --git a/reactos/base/applications/paint/icons/vertstretch.ico b/reactos/base/applications/mspaint/icons/vertstretch.ico similarity index 100% rename from reactos/base/applications/paint/icons/vertstretch.ico rename to reactos/base/applications/mspaint/icons/vertstretch.ico diff --git a/reactos/base/applications/paint/icons/zoom_cur.ico b/reactos/base/applications/mspaint/icons/zoom_cur.ico similarity index 100% rename from reactos/base/applications/paint/icons/zoom_cur.ico rename to reactos/base/applications/mspaint/icons/zoom_cur.ico diff --git a/reactos/base/applications/paint/lang/bg-BG.rc b/reactos/base/applications/mspaint/lang/bg-BG.rc similarity index 100% rename from reactos/base/applications/paint/lang/bg-BG.rc rename to reactos/base/applications/mspaint/lang/bg-BG.rc diff --git a/reactos/base/applications/paint/lang/cs-CZ.rc b/reactos/base/applications/mspaint/lang/cs-CZ.rc similarity index 100% rename from reactos/base/applications/paint/lang/cs-CZ.rc rename to reactos/base/applications/mspaint/lang/cs-CZ.rc diff --git a/reactos/base/applications/paint/lang/de-DE.rc b/reactos/base/applications/mspaint/lang/de-DE.rc similarity index 100% rename from reactos/base/applications/paint/lang/de-DE.rc rename to reactos/base/applications/mspaint/lang/de-DE.rc diff --git a/reactos/base/applications/paint/lang/en-GB.rc b/reactos/base/applications/mspaint/lang/en-GB.rc similarity index 100% rename from reactos/base/applications/paint/lang/en-GB.rc rename to reactos/base/applications/mspaint/lang/en-GB.rc diff --git a/reactos/base/applications/paint/lang/en-US.rc b/reactos/base/applications/mspaint/lang/en-US.rc similarity index 100% rename from reactos/base/applications/paint/lang/en-US.rc rename to reactos/base/applications/mspaint/lang/en-US.rc diff --git a/reactos/base/applications/paint/lang/es-ES.rc b/reactos/base/applications/mspaint/lang/es-ES.rc similarity index 100% rename from reactos/base/applications/paint/lang/es-ES.rc rename to reactos/base/applications/mspaint/lang/es-ES.rc diff --git a/reactos/base/applications/paint/lang/eu-ES.rc b/reactos/base/applications/mspaint/lang/eu-ES.rc similarity index 100% rename from reactos/base/applications/paint/lang/eu-ES.rc rename to reactos/base/applications/mspaint/lang/eu-ES.rc diff --git a/reactos/base/applications/paint/lang/fr-FR.rc b/reactos/base/applications/mspaint/lang/fr-FR.rc similarity index 100% rename from reactos/base/applications/paint/lang/fr-FR.rc rename to reactos/base/applications/mspaint/lang/fr-FR.rc diff --git a/reactos/base/applications/paint/lang/hu-HU.rc b/reactos/base/applications/mspaint/lang/hu-HU.rc similarity index 100% rename from reactos/base/applications/paint/lang/hu-HU.rc rename to reactos/base/applications/mspaint/lang/hu-HU.rc diff --git a/reactos/base/applications/paint/lang/it-IT.rc b/reactos/base/applications/mspaint/lang/it-IT.rc similarity index 100% rename from reactos/base/applications/paint/lang/it-IT.rc rename to reactos/base/applications/mspaint/lang/it-IT.rc diff --git a/reactos/base/applications/paint/lang/ja-JP.rc b/reactos/base/applications/mspaint/lang/ja-JP.rc similarity index 100% rename from reactos/base/applications/paint/lang/ja-JP.rc rename to reactos/base/applications/mspaint/lang/ja-JP.rc diff --git a/reactos/base/applications/paint/lang/nl-NL.rc b/reactos/base/applications/mspaint/lang/nl-NL.rc similarity index 100% rename from reactos/base/applications/paint/lang/nl-NL.rc rename to reactos/base/applications/mspaint/lang/nl-NL.rc diff --git a/reactos/base/applications/paint/lang/no-NO.rc b/reactos/base/applications/mspaint/lang/no-NO.rc similarity index 100% rename from reactos/base/applications/paint/lang/no-NO.rc rename to reactos/base/applications/mspaint/lang/no-NO.rc diff --git a/reactos/base/applications/paint/lang/pl-PL.rc b/reactos/base/applications/mspaint/lang/pl-PL.rc similarity index 100% rename from reactos/base/applications/paint/lang/pl-PL.rc rename to reactos/base/applications/mspaint/lang/pl-PL.rc diff --git a/reactos/base/applications/paint/lang/pt-BR.rc b/reactos/base/applications/mspaint/lang/pt-BR.rc similarity index 100% rename from reactos/base/applications/paint/lang/pt-BR.rc rename to reactos/base/applications/mspaint/lang/pt-BR.rc diff --git a/reactos/base/applications/paint/lang/pt-PT.rc b/reactos/base/applications/mspaint/lang/pt-PT.rc similarity index 100% rename from reactos/base/applications/paint/lang/pt-PT.rc rename to reactos/base/applications/mspaint/lang/pt-PT.rc diff --git a/reactos/base/applications/paint/lang/ro-RO.rc b/reactos/base/applications/mspaint/lang/ro-RO.rc similarity index 100% rename from reactos/base/applications/paint/lang/ro-RO.rc rename to reactos/base/applications/mspaint/lang/ro-RO.rc diff --git a/reactos/base/applications/paint/lang/ru-RU.rc b/reactos/base/applications/mspaint/lang/ru-RU.rc similarity index 100% rename from reactos/base/applications/paint/lang/ru-RU.rc rename to reactos/base/applications/mspaint/lang/ru-RU.rc diff --git a/reactos/base/applications/paint/lang/sk-SK.rc b/reactos/base/applications/mspaint/lang/sk-SK.rc similarity index 100% rename from reactos/base/applications/paint/lang/sk-SK.rc rename to reactos/base/applications/mspaint/lang/sk-SK.rc diff --git a/reactos/base/applications/paint/lang/uk-UA.rc b/reactos/base/applications/mspaint/lang/uk-UA.rc similarity index 100% rename from reactos/base/applications/paint/lang/uk-UA.rc rename to reactos/base/applications/mspaint/lang/uk-UA.rc diff --git a/reactos/base/applications/paint/main.c b/reactos/base/applications/mspaint/main.c similarity index 100% rename from reactos/base/applications/paint/main.c rename to reactos/base/applications/mspaint/main.c diff --git a/reactos/base/applications/paint/mouse.c b/reactos/base/applications/mspaint/mouse.c similarity index 100% rename from reactos/base/applications/paint/mouse.c rename to reactos/base/applications/mspaint/mouse.c diff --git a/reactos/base/applications/paint/mouse.h b/reactos/base/applications/mspaint/mouse.h similarity index 100% rename from reactos/base/applications/paint/mouse.h rename to reactos/base/applications/mspaint/mouse.h diff --git a/reactos/base/applications/paint/paint.exe.amd64.manifest b/reactos/base/applications/mspaint/mspaint.exe.amd64.manifest similarity index 100% rename from reactos/base/applications/paint/paint.exe.amd64.manifest rename to reactos/base/applications/mspaint/mspaint.exe.amd64.manifest diff --git a/reactos/base/applications/paint/paint.exe.manifest b/reactos/base/applications/mspaint/mspaint.exe.manifest similarity index 100% rename from reactos/base/applications/paint/paint.exe.manifest rename to reactos/base/applications/mspaint/mspaint.exe.manifest diff --git a/reactos/base/applications/paint/paint.rbuild b/reactos/base/applications/mspaint/mspaint.rbuild similarity index 77% rename from reactos/base/applications/paint/paint.rbuild rename to reactos/base/applications/mspaint/mspaint.rbuild index f20fc0ac9ec..7f1c410c66c 100644 --- a/reactos/base/applications/paint/paint.rbuild +++ b/reactos/base/applications/mspaint/mspaint.rbuild @@ -1,7 +1,7 @@ - - . + + . comdlg32 shell32 user32 diff --git a/reactos/base/applications/paint/palette.c b/reactos/base/applications/mspaint/palette.c similarity index 100% rename from reactos/base/applications/paint/palette.c rename to reactos/base/applications/mspaint/palette.c diff --git a/reactos/base/applications/paint/palette.h b/reactos/base/applications/mspaint/palette.h similarity index 100% rename from reactos/base/applications/paint/palette.h rename to reactos/base/applications/mspaint/palette.h diff --git a/reactos/base/applications/paint/registry.c b/reactos/base/applications/mspaint/registry.c similarity index 100% rename from reactos/base/applications/paint/registry.c rename to reactos/base/applications/mspaint/registry.c diff --git a/reactos/base/applications/paint/registry.h b/reactos/base/applications/mspaint/registry.h similarity index 100% rename from reactos/base/applications/paint/registry.h rename to reactos/base/applications/mspaint/registry.h diff --git a/reactos/base/applications/paint/rsrc.rc b/reactos/base/applications/mspaint/rsrc.rc similarity index 100% rename from reactos/base/applications/paint/rsrc.rc rename to reactos/base/applications/mspaint/rsrc.rc diff --git a/reactos/base/applications/paint/selection.c b/reactos/base/applications/mspaint/selection.c similarity index 100% rename from reactos/base/applications/paint/selection.c rename to reactos/base/applications/mspaint/selection.c diff --git a/reactos/base/applications/paint/selection.h b/reactos/base/applications/mspaint/selection.h similarity index 100% rename from reactos/base/applications/paint/selection.h rename to reactos/base/applications/mspaint/selection.h diff --git a/reactos/base/applications/paint/sizebox.c b/reactos/base/applications/mspaint/sizebox.c similarity index 100% rename from reactos/base/applications/paint/sizebox.c rename to reactos/base/applications/mspaint/sizebox.c diff --git a/reactos/base/applications/paint/sizebox.h b/reactos/base/applications/mspaint/sizebox.h similarity index 100% rename from reactos/base/applications/paint/sizebox.h rename to reactos/base/applications/mspaint/sizebox.h diff --git a/reactos/base/applications/paint/toolsettings.c b/reactos/base/applications/mspaint/toolsettings.c similarity index 100% rename from reactos/base/applications/paint/toolsettings.c rename to reactos/base/applications/mspaint/toolsettings.c diff --git a/reactos/base/applications/paint/toolsettings.h b/reactos/base/applications/mspaint/toolsettings.h similarity index 100% rename from reactos/base/applications/paint/toolsettings.h rename to reactos/base/applications/mspaint/toolsettings.h diff --git a/reactos/base/applications/paint/winproc.c b/reactos/base/applications/mspaint/winproc.c similarity index 100% rename from reactos/base/applications/paint/winproc.c rename to reactos/base/applications/mspaint/winproc.c diff --git a/reactos/base/applications/paint/winproc.h b/reactos/base/applications/mspaint/winproc.h similarity index 100% rename from reactos/base/applications/paint/winproc.h rename to reactos/base/applications/mspaint/winproc.h diff --git a/reactos/boot/bootdata/packages/reactos.dff b/reactos/boot/bootdata/packages/reactos.dff index 9019e79d2e7..47d5ee45c8c 100644 --- a/reactos/boot/bootdata/packages/reactos.dff +++ b/reactos/boot/bootdata/packages/reactos.dff @@ -60,6 +60,7 @@ base\applications\msconfig\msconfig.exe 1 base\applications\mscutils\devmgmt\devmgmt.exe 1 base\applications\mscutils\eventvwr\eventvwr.exe 1 base\applications\mscutils\servman\servman.exe 1 +base\applications\mspaint\mspaint.exe 1 base\applications\mstsc\mstsc.exe 1 base\applications\network\arp\arp.exe 1 base\applications\network\dwnl\dwnl.exe 1 @@ -75,7 +76,6 @@ base\applications\network\telnet\telnet.exe 1 base\applications\network\tracert\tracert.exe 1 base\applications\network\whois\whois.exe 1 base\applications\notepad\notepad.exe 1 -base\applications\paint\paint.exe 1 base\applications\rapps\rapps.exe 1 base\applications\regedit\regedit.exe 4 base\applications\regedit\clb\clb.dll 1 diff --git a/reactos/dll/win32/syssetup/install.c b/reactos/dll/win32/syssetup/install.c index 59b32470bc4..fb3a5808e9f 100644 --- a/reactos/dll/win32/syssetup/install.c +++ b/reactos/dll/win32/syssetup/install.c @@ -793,7 +793,7 @@ CreateShortcuts(VOID) CreateShortcut(CSIDL_PROGRAMS, szFolder, IDS_SHORT_RDESKTOP, _T("%SystemRoot%\\system32\\mstsc.exe"), IDS_CMT_RDESKTOP, TRUE); CreateShortcut(CSIDL_PROGRAMS, szFolder, IDS_SHORT_SNAP, _T("%SystemRoot%\\system32\\screenshot.exe"), IDS_CMT_SCREENSHOT, TRUE); CreateShortcut(CSIDL_PROGRAMS, szFolder, IDS_SHORT_WORDPAD, _T("%SystemRoot%\\system32\\wordpad.exe"), IDS_CMT_WORDPAD, TRUE); - CreateShortcut(CSIDL_PROGRAMS, szFolder, IDS_SHORT_PAINT, _T("%SystemRoot%\\system32\\paint.exe"), IDS_CMT_PAINT, TRUE); + CreateShortcut(CSIDL_PROGRAMS, szFolder, IDS_SHORT_PAINT, _T("%SystemRoot%\\system32\\mspaint.exe"), IDS_CMT_PAINT, TRUE); } /* Create System Tools subfolder and fill if the exe is available */ From 7037613d3de644b11895da27efca291df56364d1 Mon Sep 17 00:00:00 2001 From: Gregor Schneider Date: Thu, 21 Apr 2011 21:25:30 +0000 Subject: [PATCH 186/317] [cardlib] Install a button release callback [spider] Use the button release callback instead of button click callbacks See issue #6125 for more details. svn path=/trunk/; revision=51416 --- reactos/base/applications/games/spider/spigame.cpp | 3 +-- reactos/lib/3rdparty/cardlib/cardregion.cpp | 6 ++++++ reactos/lib/3rdparty/cardlib/cardregion.h | 3 +++ reactos/lib/3rdparty/cardlib/cardrgnmouse.cpp | 8 ++++++++ reactos/lib/3rdparty/cardlib/cardwindow.cpp | 6 ++++++ 5 files changed, 24 insertions(+), 2 deletions(-) diff --git a/reactos/base/applications/games/spider/spigame.cpp b/reactos/base/applications/games/spider/spigame.cpp index d3717207f7f..7521bdd5bdb 100644 --- a/reactos/base/applications/games/spider/spigame.cpp +++ b/reactos/base/applications/games/spider/spigame.cpp @@ -294,8 +294,7 @@ void CreateSpider() pDeck->SetPlacement(CS_XJUST_RIGHT, CS_YJUST_BOTTOM, - X_BORDER, - Y_BORDER); pDeck->SetDragRule(CS_DRAG_NONE, 0); pDeck->SetDropRule(CS_DROP_NONE, 0); - pDeck->SetClickProc(DeckClickProc); - pDeck->SetDblClickProc(DeckClickProc); + pDeck->SetClickReleaseProc(DeckClickProc); /* Create the row stacks */ for (i = 0; i < NUM_STACKS; i++) diff --git a/reactos/lib/3rdparty/cardlib/cardregion.cpp b/reactos/lib/3rdparty/cardlib/cardregion.cpp index 30af44b2e49..c47b6cf5e08 100644 --- a/reactos/lib/3rdparty/cardlib/cardregion.cpp +++ b/reactos/lib/3rdparty/cardlib/cardregion.cpp @@ -46,6 +46,7 @@ CardRegion::CardRegion(CardWindow &parent, int Id, bool visible, int x, int y, i AddCallback = 0; RemoveCallback = 0; ClickCallback = 0; + ClickReleaseCallback = 0; DblClickCallback = 0; uDragRule = CS_DRAG_ALL; @@ -187,6 +188,11 @@ void CardRegion::SetClickProc(pClickProc proc) ClickCallback = proc; } +void CardRegion::SetClickReleaseProc(pClickProc proc) +{ + ClickReleaseCallback = proc; +} + void CardRegion::SetDblClickProc(pClickProc proc) { DblClickCallback = proc; diff --git a/reactos/lib/3rdparty/cardlib/cardregion.h b/reactos/lib/3rdparty/cardlib/cardregion.h index a6058f5b479..e81999764f4 100644 --- a/reactos/lib/3rdparty/cardlib/cardregion.h +++ b/reactos/lib/3rdparty/cardlib/cardregion.h @@ -40,6 +40,7 @@ public: bool SetDropRule(UINT uDropType, pCanDropProc proc = 0); void SetClickProc (pClickProc proc); + void SetClickReleaseProc (pClickProc proc); void SetDblClickProc (pClickProc proc); void SetAddCardProc (pAddProc proc); @@ -132,6 +133,7 @@ private: bool OnLButtonDblClk(int x, int y); bool OnMouseMove(int x, int y); bool OnLButtonUp(int x, int y); + void ClickRelease(int x, int y); // @@ -204,6 +206,7 @@ private: pCanDragProc CanDragCallback; pCanDropProc CanDropCallback; pClickProc ClickCallback; + pClickProc ClickReleaseCallback; pClickProc DblClickCallback; pAddProc AddCallback; pRemoveProc RemoveCallback; diff --git a/reactos/lib/3rdparty/cardlib/cardrgnmouse.cpp b/reactos/lib/3rdparty/cardlib/cardrgnmouse.cpp index c8cdf4a3aff..b8da01b33b1 100644 --- a/reactos/lib/3rdparty/cardlib/cardrgnmouse.cpp +++ b/reactos/lib/3rdparty/cardlib/cardrgnmouse.cpp @@ -279,6 +279,14 @@ bool CardRegion::OnLButtonDown(int x, int y) return false; } +void CardRegion::ClickRelease(int x, int y) +{ + iNumDragCards = GetNumDragCards(x, y); + + if (ClickReleaseCallback) + ClickReleaseCallback(*this, iNumDragCards); +} + bool CardRegion::OnLButtonUp(int x, int y) { CardRegion *pDestStack = 0; diff --git a/reactos/lib/3rdparty/cardlib/cardwindow.cpp b/reactos/lib/3rdparty/cardlib/cardwindow.cpp index cb03193aa15..b1ff6336857 100644 --- a/reactos/lib/3rdparty/cardlib/cardwindow.cpp +++ b/reactos/lib/3rdparty/cardlib/cardwindow.cpp @@ -501,6 +501,12 @@ LRESULT CALLBACK CardWindow::WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM return 0; } + if ((stackptr = CardRegionFromPoint(x, y)) != 0) + { + stackptr->ClickRelease(x, y); + stackptr = 0; + } + return 0; case WM_MOUSEMOVE: From 35a1d66de73d4cc5c91b8b1663493c874be712ed Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Thu, 21 Apr 2011 21:48:24 +0000 Subject: [PATCH 187/317] [WIN32K/GDI32] Add official ENTRY structure definition svn path=/trunk/; revision=51417 --- reactos/include/reactos/win32k/ntgdihdl.h | 24 +++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/reactos/include/reactos/win32k/ntgdihdl.h b/reactos/include/reactos/win32k/ntgdihdl.h index 718cb6724ce..1b5d270d40b 100644 --- a/reactos/include/reactos/win32k/ntgdihdl.h +++ b/reactos/include/reactos/win32k/ntgdihdl.h @@ -229,6 +229,30 @@ typedef struct _GDI_TABLE_ENTRY PVOID UserData; /* pUser Points to the user mode structure, usually NULL though */ } GDI_TABLE_ENTRY, *PGDI_TABLE_ENTRY; +typedef struct _ENTRY +{ + union _EINFO + { + struct _BASEOBJECT *pobj; + HGDIOBJ hFree; + } einfo; + + union _OBJECTOWNER + { + struct _OBJECTOWNER_S + { + unsigned Lock:1; + unsigned Pid_Shifted:31; + } Share; + ULONG ulObj; + } ObjectOwner; + + USHORT FullUnique; + UCHAR Objt; + UCHAR Flags; + PVOID pUser; +} ENTRY, *PENTRY; + /* * User space only structure! */ From 3b11a6bdbc1caa3976feaa2af95b7bd616d0ce76 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Thu, 21 Apr 2011 21:49:46 +0000 Subject: [PATCH 188/317] [CRT] Fix a typo in a comment svn path=/trunk/; revision=51418 --- reactos/lib/sdk/crt/stdio/_flsbuf.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/lib/sdk/crt/stdio/_flsbuf.c b/reactos/lib/sdk/crt/stdio/_flsbuf.c index eb31137a7a5..c2b7df29d4c 100644 --- a/reactos/lib/sdk/crt/stdio/_flsbuf.c +++ b/reactos/lib/sdk/crt/stdio/_flsbuf.c @@ -24,7 +24,7 @@ _flsbuf(int ch, FILE *stream) return EOF; } - /* Is this was a read buffer */ + /* Check if this was a read buffer */ if (stream->_flag & _IOREAD) { /* Must be at the end of the file */ From 0314742b01973a2b5e45a25aef80ee4d42d6b70e Mon Sep 17 00:00:00 2001 From: Gregor Schneider Date: Thu, 21 Apr 2011 21:59:17 +0000 Subject: [PATCH 189/317] [kernel32] Radek Liska: sync czech NLS resources to Wine See issue #6122 for more details. svn path=/trunk/; revision=51419 --- reactos/dll/win32/kernel32/nls/csy.nls | 42 +++++++++++++------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/reactos/dll/win32/kernel32/nls/csy.nls b/reactos/dll/win32/kernel32/nls/csy.nls index 95e3783b331..03a0e61d206 100644 --- a/reactos/dll/win32/kernel32/nls/csy.nls +++ b/reactos/dll/win32/kernel32/nls/csy.nls @@ -64,10 +64,10 @@ STRINGTABLE LANGUAGE LANG_CZECH, SUBLANG_DEFAULT LOCALE_S2359 "odp." LOCALE_SABBREVCTRYNAME "CZE" LOCALE_SABBREVDAYNAME1 "po" - LOCALE_SABBREVDAYNAME2 "\x00FAt" + LOCALE_SABBREVDAYNAME2 "t" LOCALE_SABBREVDAYNAME3 "st" - LOCALE_SABBREVDAYNAME4 "\x00E8t" - LOCALE_SABBREVDAYNAME5 "p\x00E1" + LOCALE_SABBREVDAYNAME4 "t" + LOCALE_SABBREVDAYNAME5 "p" LOCALE_SABBREVDAYNAME6 "so" LOCALE_SABBREVDAYNAME7 "ne" LOCALE_SABBREVLANGNAME "CSY" @@ -85,13 +85,13 @@ STRINGTABLE LANGUAGE LANG_CZECH, SUBLANG_DEFAULT LOCALE_SABBREVMONTHNAME12 "XII" LOCALE_SABBREVMONTHNAME13 "" LOCALE_SCOUNTRY "Czech Republic" - LOCALE_SCURRENCY "K\x00E8" + LOCALE_SCURRENCY "K" LOCALE_SDATE "." - LOCALE_SDAYNAME1 "pond\x00ECl\x00EC" - LOCALE_SDAYNAME2 "\x00FAter\x00FD" - LOCALE_SDAYNAME3 "st\x00F8eda" - LOCALE_SDAYNAME4 "\x00E8tvrtek" - LOCALE_SDAYNAME5 "p\x00E1tek" + LOCALE_SDAYNAME1 "pondl" + LOCALE_SDAYNAME2 "ter" + LOCALE_SDAYNAME3 "steda" + LOCALE_SDAYNAME4 "tvrtek" + LOCALE_SDAYNAME5 "ptek" LOCALE_SDAYNAME6 "sobota" LOCALE_SDAYNAME7 "nedle" LOCALE_SDECIMAL "," @@ -108,30 +108,30 @@ STRINGTABLE LANGUAGE LANG_CZECH, SUBLANG_DEFAULT LOCALE_SMONDECIMALSEP "," LOCALE_SMONGROUPING "3;0" LOCALE_SMONTHNAME1 "leden" - LOCALE_SMONTHNAME2 "\x00FAnor" - LOCALE_SMONTHNAME3 "b\x00F8ezen" + LOCALE_SMONTHNAME2 "nor" + LOCALE_SMONTHNAME3 "bezen" LOCALE_SMONTHNAME4 "duben" LOCALE_SMONTHNAME5 "kvten" - LOCALE_SMONTHNAME6 "\x00E8erven" - LOCALE_SMONTHNAME7 "\x00E8ervenec" + LOCALE_SMONTHNAME6 "erven" + LOCALE_SMONTHNAME7 "ervenec" LOCALE_SMONTHNAME8 "srpen" - LOCALE_SMONTHNAME9 "z\x00E1\x00F8\x00ED" - LOCALE_SMONTHNAME10 "\x00F8\x00EDjen" + LOCALE_SMONTHNAME9 "z" + LOCALE_SMONTHNAME10 "jen" LOCALE_SMONTHNAME11 "listopad" LOCALE_SMONTHNAME12 "prosinec" LOCALE_SMONTHNAME13 "" - LOCALE_SMONTHOUSANDSEP " " + LOCALE_SMONTHOUSANDSEP "" LOCALE_SNAME "cs-CZ" - LOCALE_SNATIVECTRYNAME "\x00C8esk\x00E1republika" - LOCALE_SNATIVECURRNAME "Koruna \x00C8esk\x00E1" + LOCALE_SNATIVECTRYNAME "eskrepublika" + LOCALE_SNATIVECURRNAME "Koruna esk" LOCALE_SNATIVEDIGITS "0123456789" - LOCALE_SNATIVELANGNAME "\x00E8e\x009Atina" + LOCALE_SNATIVELANGNAME "etina" LOCALE_SNEGATIVESIGN "-" LOCALE_SPOSITIVESIGN "" LOCALE_SSCRIPTS "Latn;" LOCALE_SSHORTDATE "d.M.yyyy" LOCALE_SSORTNAME "Default" - LOCALE_STHOUSAND " " + LOCALE_STHOUSAND "" LOCALE_STIME ":" LOCALE_STIMEFORMAT "H:mm:ss" LOCALE_SYEARMONTH "MMMM yyyy" @@ -148,7 +148,7 @@ STRINGTABLE LANGUAGE LANG_CZECH, SUBLANG_DEFAULT LGRPID_SIMPLIFIED_CHINESE+LGRPID_RES_BASE "Simplified Chinese" LGRPID_THAI+LGRPID_RES_BASE "Thai" LGRPID_HEBREW+LGRPID_RES_BASE "Hebrew" - LGRPID_ARABIC+LGRPID_RES_BASE "Arabic" + LGRPID_ARABIC+LGRPID_RES_BASE "Arabic" LGRPID_VIETNAMESE+LGRPID_RES_BASE "Vietnamese" LGRPID_INDIC+LGRPID_RES_BASE "Indic" LGRPID_GEORGIAN+LGRPID_RES_BASE "Georgian" From d8e1c6609bc4037a2075226e98dcb803cc8f3812 Mon Sep 17 00:00:00 2001 From: Rafal Harabien Date: Fri, 22 Apr 2011 11:51:08 +0000 Subject: [PATCH 190/317] [MPLAY32] * Move "Play" string from shell32. It will be used in audio files context menu in explorer [SHIMGVW] * Move "Preview" string from shell32. It will be used in image files context menu in explorer * Add Polish translation [SHELL32] * Remove "Play" and "Preview" translations - they shouldn't be in shell32 * Add "explore" translation for folder context menu svn path=/trunk/; revision=51423 --- .../base/applications/mplay32/lang/bg-BG.rc | 1 + .../base/applications/mplay32/lang/cs-CZ.rc | 1 + .../base/applications/mplay32/lang/de-DE.rc | 1 + .../base/applications/mplay32/lang/en-US.rc | 1 + .../base/applications/mplay32/lang/es-ES.rc | 1 + .../base/applications/mplay32/lang/fr-FR.rc | 1 + .../base/applications/mplay32/lang/it-IT.rc | 1 + .../base/applications/mplay32/lang/ja-JP.rc | 1 + .../base/applications/mplay32/lang/nl-NL.rc | 1 + .../base/applications/mplay32/lang/no-NO.rc | 1 + .../base/applications/mplay32/lang/pl-PL.rc | 1 + .../base/applications/mplay32/lang/ru-RU.rc | 1 + .../base/applications/mplay32/lang/sk-SK.rc | 1 + .../base/applications/mplay32/lang/uk-UA.rc | 1 + reactos/base/applications/mplay32/resource.h | 3 ++- reactos/dll/win32/shell32/lang/bg-BG.rc | 3 +-- reactos/dll/win32/shell32/lang/ca-ES.rc | 3 +-- reactos/dll/win32/shell32/lang/cs-CZ.rc | 3 +-- reactos/dll/win32/shell32/lang/da-DK.rc | 3 +-- reactos/dll/win32/shell32/lang/de-DE.rc | 3 +-- reactos/dll/win32/shell32/lang/el-GR.rc | 3 +-- reactos/dll/win32/shell32/lang/en-GB.rc | 3 +-- reactos/dll/win32/shell32/lang/en-US.rc | 3 +-- reactos/dll/win32/shell32/lang/es-ES.rc | 3 +-- reactos/dll/win32/shell32/lang/fi-FI.rc | 3 +-- reactos/dll/win32/shell32/lang/fr-FR.rc | 3 +-- reactos/dll/win32/shell32/lang/hu-HU.rc | 3 +-- reactos/dll/win32/shell32/lang/it-IT.rc | 3 +-- reactos/dll/win32/shell32/lang/ja-JP.rc | 3 +-- reactos/dll/win32/shell32/lang/ko-KR.rc | 3 +-- reactos/dll/win32/shell32/lang/nl-NL.rc | 3 +-- reactos/dll/win32/shell32/lang/no-NO.rc | 3 +-- reactos/dll/win32/shell32/lang/pl-PL.rc | 3 +-- reactos/dll/win32/shell32/lang/pt-BR.rc | 3 +-- reactos/dll/win32/shell32/lang/pt-PT.rc | 3 +-- reactos/dll/win32/shell32/lang/ro-RO.rc | 3 +-- reactos/dll/win32/shell32/lang/ru-RU.rc | 3 +-- reactos/dll/win32/shell32/lang/sk-SK.rc | 3 +-- reactos/dll/win32/shell32/lang/sl-SI.rc | 3 +-- reactos/dll/win32/shell32/lang/sv-SE.rc | 3 +-- reactos/dll/win32/shell32/lang/tr-TR.rc | 3 +-- reactos/dll/win32/shell32/lang/uk-UA.rc | 3 +-- reactos/dll/win32/shell32/lang/zh-CN.rc | 3 +-- reactos/dll/win32/shell32/lang/zh-TW.rc | 3 +-- reactos/dll/win32/shell32/shresdef.h | 12 ++++++------ reactos/dll/win32/shell32/shv_def_cmenu.c | 6 ++---- reactos/dll/win32/shimgvw/lang/bg-BG.rc | 1 + reactos/dll/win32/shimgvw/lang/cs-CZ.rc | 3 ++- reactos/dll/win32/shimgvw/lang/de-DE.rc | 3 ++- reactos/dll/win32/shimgvw/lang/en-US.rc | 3 ++- reactos/dll/win32/shimgvw/lang/es-ES.rc | 5 +++-- reactos/dll/win32/shimgvw/lang/lt-LT.rc | 3 ++- reactos/dll/win32/shimgvw/lang/no-NO.rc | 3 ++- reactos/dll/win32/shimgvw/lang/pl-PL.rc | 18 ++++++++++++++++++ reactos/dll/win32/shimgvw/lang/ru-RU.rc | 3 ++- reactos/dll/win32/shimgvw/lang/sk-SK.rc | 3 ++- reactos/dll/win32/shimgvw/lang/uk-UA.rc | 3 ++- reactos/dll/win32/shimgvw/resource.h | 1 + reactos/dll/win32/shimgvw/rsrc.rc | 1 + 59 files changed, 93 insertions(+), 79 deletions(-) create mode 100644 reactos/dll/win32/shimgvw/lang/pl-PL.rc diff --git a/reactos/base/applications/mplay32/lang/bg-BG.rc b/reactos/base/applications/mplay32/lang/bg-BG.rc index 254470b3c3d..aa02baf525f 100644 --- a/reactos/base/applications/mplay32/lang/bg-BG.rc +++ b/reactos/base/applications/mplay32/lang/bg-BG.rc @@ -26,4 +26,5 @@ BEGIN IDS_TOOLTIP_SEEKFORW " " IDS_TOOLTIP_FORWARD " " IDS_APPTITLE " " + IDS_PLAY "" END diff --git a/reactos/base/applications/mplay32/lang/cs-CZ.rc b/reactos/base/applications/mplay32/lang/cs-CZ.rc index 15763cc81d7..7733e843e9d 100644 --- a/reactos/base/applications/mplay32/lang/cs-CZ.rc +++ b/reactos/base/applications/mplay32/lang/cs-CZ.rc @@ -31,4 +31,5 @@ BEGIN IDS_TOOLTIP_SEEKFORW "Posunout vped" IDS_TOOLTIP_FORWARD "Peskoit vped" IDS_APPTITLE "ReactOS Pehrva multimdi" + IDS_PLAY "Pehrt" END diff --git a/reactos/base/applications/mplay32/lang/de-DE.rc b/reactos/base/applications/mplay32/lang/de-DE.rc index 470413c555e..4e9ea833cad 100644 --- a/reactos/base/applications/mplay32/lang/de-DE.rc +++ b/reactos/base/applications/mplay32/lang/de-DE.rc @@ -26,4 +26,5 @@ BEGIN IDS_TOOLTIP_SEEKFORW "Schneller Vorlauf" IDS_TOOLTIP_FORWARD "Weiter" IDS_APPTITLE "ReactOS Multimedia Player" + IDS_PLAY "Abspielen" END diff --git a/reactos/base/applications/mplay32/lang/en-US.rc b/reactos/base/applications/mplay32/lang/en-US.rc index eee4109d702..81380b18cca 100644 --- a/reactos/base/applications/mplay32/lang/en-US.rc +++ b/reactos/base/applications/mplay32/lang/en-US.rc @@ -26,4 +26,5 @@ BEGIN IDS_TOOLTIP_SEEKFORW "Seek Forward" IDS_TOOLTIP_FORWARD "Skip Forward" IDS_APPTITLE "ReactOS Multimedia Player" + IDS_PLAY "Play" END diff --git a/reactos/base/applications/mplay32/lang/es-ES.rc b/reactos/base/applications/mplay32/lang/es-ES.rc index 281a05bc834..5de4134e488 100644 --- a/reactos/base/applications/mplay32/lang/es-ES.rc +++ b/reactos/base/applications/mplay32/lang/es-ES.rc @@ -26,4 +26,5 @@ BEGIN IDS_TOOLTIP_SEEKFORW "Avance rpido" IDS_TOOLTIP_FORWARD "Marca siguiente" IDS_APPTITLE "Reproductor Multimedia de ReactOS" + IDS_PLAY "Reproducir" END diff --git a/reactos/base/applications/mplay32/lang/fr-FR.rc b/reactos/base/applications/mplay32/lang/fr-FR.rc index 3bda9e18ba3..0b952720908 100644 --- a/reactos/base/applications/mplay32/lang/fr-FR.rc +++ b/reactos/base/applications/mplay32/lang/fr-FR.rc @@ -26,4 +26,5 @@ BEGIN IDS_TOOLTIP_SEEKFORW "Avance rapide" IDS_TOOLTIP_FORWARD "Suivant" IDS_APPTITLE "ReactOS Multimedia Player" + IDS_PLAY "Lire" END diff --git a/reactos/base/applications/mplay32/lang/it-IT.rc b/reactos/base/applications/mplay32/lang/it-IT.rc index eba064ae4e9..a2e19d652d0 100644 --- a/reactos/base/applications/mplay32/lang/it-IT.rc +++ b/reactos/base/applications/mplay32/lang/it-IT.rc @@ -26,4 +26,5 @@ BEGIN IDS_TOOLTIP_SEEKFORW "Avanzamento rapido" IDS_TOOLTIP_FORWARD "Successivo" IDS_APPTITLE "Riproduttore multimediale ReactOS" + IDS_PLAY "Mostra" END diff --git a/reactos/base/applications/mplay32/lang/ja-JP.rc b/reactos/base/applications/mplay32/lang/ja-JP.rc index 94f4a1d34e2..3995bccb724 100644 --- a/reactos/base/applications/mplay32/lang/ja-JP.rc +++ b/reactos/base/applications/mplay32/lang/ja-JP.rc @@ -26,4 +26,5 @@ BEGIN IDS_TOOLTIP_SEEKFORW "OփV[N" IDS_TOOLTIP_FORWARD "OփXLbv" IDS_APPTITLE "ReactOS }`fBA v[[" + IDS_PLAY "Đ" END diff --git a/reactos/base/applications/mplay32/lang/nl-NL.rc b/reactos/base/applications/mplay32/lang/nl-NL.rc index aaa5572db10..0e05627681e 100644 --- a/reactos/base/applications/mplay32/lang/nl-NL.rc +++ b/reactos/base/applications/mplay32/lang/nl-NL.rc @@ -26,4 +26,5 @@ BEGIN IDS_TOOLTIP_SEEKFORW "Vooruitspoelen" IDS_TOOLTIP_FORWARD "Volgende" IDS_APPTITLE "ReactOS Multimedia Player" + IDS_PLAY "Play" END diff --git a/reactos/base/applications/mplay32/lang/no-NO.rc b/reactos/base/applications/mplay32/lang/no-NO.rc index 210137bc7af..af6e3cf1d45 100644 --- a/reactos/base/applications/mplay32/lang/no-NO.rc +++ b/reactos/base/applications/mplay32/lang/no-NO.rc @@ -26,4 +26,5 @@ BEGIN IDS_TOOLTIP_SEEKFORW "Ske fremover" IDS_TOOLTIP_FORWARD "Spole fremover" IDS_APPTITLE "ReactOS Multimedia avspiller" + IDS_PLAY "Spill" END diff --git a/reactos/base/applications/mplay32/lang/pl-PL.rc b/reactos/base/applications/mplay32/lang/pl-PL.rc index f7d308ec7b4..5d13afa4678 100644 --- a/reactos/base/applications/mplay32/lang/pl-PL.rc +++ b/reactos/base/applications/mplay32/lang/pl-PL.rc @@ -28,4 +28,5 @@ BEGIN IDS_TOOLTIP_SEEKFORW "Przewi do przodu" IDS_TOOLTIP_FORWARD "Przeskocz do przodu" IDS_APPTITLE "ReactOS Multimedia Player" + IDS_PLAY "Odtwrz" END diff --git a/reactos/base/applications/mplay32/lang/ru-RU.rc b/reactos/base/applications/mplay32/lang/ru-RU.rc index 3bdb9a7497d..639506f9daf 100644 --- a/reactos/base/applications/mplay32/lang/ru-RU.rc +++ b/reactos/base/applications/mplay32/lang/ru-RU.rc @@ -26,4 +26,5 @@ BEGIN IDS_TOOLTIP_SEEKFORW " " IDS_TOOLTIP_FORWARD "" IDS_APPTITLE " ReactOS" + IDS_PLAY "" END diff --git a/reactos/base/applications/mplay32/lang/sk-SK.rc b/reactos/base/applications/mplay32/lang/sk-SK.rc index 273304b01bf..e8e7df918bd 100644 --- a/reactos/base/applications/mplay32/lang/sk-SK.rc +++ b/reactos/base/applications/mplay32/lang/sk-SK.rc @@ -31,4 +31,5 @@ BEGIN IDS_TOOLTIP_SEEKFORW "Vyhada dopredu" IDS_TOOLTIP_FORWARD "Preskoi dopredu" IDS_APPTITLE "Multimedilny prehrva systmu ReactOS" + IDS_PLAY "Prehra" END diff --git a/reactos/base/applications/mplay32/lang/uk-UA.rc b/reactos/base/applications/mplay32/lang/uk-UA.rc index 3dc0d0800c9..4ba0f32f1af 100644 --- a/reactos/base/applications/mplay32/lang/uk-UA.rc +++ b/reactos/base/applications/mplay32/lang/uk-UA.rc @@ -34,4 +34,5 @@ BEGIN IDS_TOOLTIP_SEEKFORW " " IDS_TOOLTIP_FORWARD "" IDS_APPTITLE " ReactOS" + IDS_PLAY "³" END diff --git a/reactos/base/applications/mplay32/resource.h b/reactos/base/applications/mplay32/resource.h index 77100332800..43bff490e23 100644 --- a/reactos/base/applications/mplay32/resource.h +++ b/reactos/base/applications/mplay32/resource.h @@ -22,7 +22,8 @@ #define IDS_TOOLTIP_SEEKBACK 105 #define IDS_TOOLTIP_SEEKFORW 106 #define IDS_TOOLTIP_FORWARD 107 -#define IDS_ALL_TYPES_FILTER 108 +#define IDS_ALL_TYPES_FILTER 108 +#define IDS_PLAY 109 /* Menu */ #define IDR_MAINMENU 500 diff --git a/reactos/dll/win32/shell32/lang/bg-BG.rc b/reactos/dll/win32/shell32/lang/bg-BG.rc index 4f2b2f9eaa2..4f199976db9 100644 --- a/reactos/dll/win32/shell32/lang/bg-BG.rc +++ b/reactos/dll/win32/shell32/lang/bg-BG.rc @@ -744,12 +744,11 @@ BEGIN IDS_SYS_FILE " " IDS_OPEN_VERB "" + IDS_EXPLORE_VERB "Explore" IDS_RUNAS_VERB " " IDS_EDIT_VERB "" IDS_FIND_VERB "" IDS_PRINT_VERB "" - IDS_PLAY_VERB "" - IDS_PREVIEW_VERB "" IDS_FILE_FOLDER "%u , %u " IDS_PRINTERS "" diff --git a/reactos/dll/win32/shell32/lang/ca-ES.rc b/reactos/dll/win32/shell32/lang/ca-ES.rc index 978a58fb51e..bf4f9402ae4 100644 --- a/reactos/dll/win32/shell32/lang/ca-ES.rc +++ b/reactos/dll/win32/shell32/lang/ca-ES.rc @@ -743,12 +743,11 @@ BEGIN IDS_SYS_FILE "System file" IDS_OPEN_VERB "Open" + IDS_EXPLORE_VERB "Explore" IDS_RUNAS_VERB "Run as " IDS_EDIT_VERB "Edit" IDS_FIND_VERB "Find" IDS_PRINT_VERB "Print" - IDS_PLAY_VERB "Play" - IDS_PREVIEW_VERB "Preview" IDS_FILE_FOLDER "%u Files, %u Folders" IDS_PRINTERS "Printers" diff --git a/reactos/dll/win32/shell32/lang/cs-CZ.rc b/reactos/dll/win32/shell32/lang/cs-CZ.rc index 8914ee8a9a8..c160a1c26d4 100644 --- a/reactos/dll/win32/shell32/lang/cs-CZ.rc +++ b/reactos/dll/win32/shell32/lang/cs-CZ.rc @@ -730,12 +730,11 @@ BEGIN IDS_SYS_FILE "Systmov soubor" IDS_OPEN_VERB "Otevt" + IDS_EXPLORE_VERB "Explore" IDS_RUNAS_VERB "Spustit jako " IDS_EDIT_VERB "Upravit" IDS_FIND_VERB "Najt" IDS_PRINT_VERB "Tisknout" - IDS_PLAY_VERB "Pehrt" - IDS_PREVIEW_VERB "Nhled" IDS_FILE_FOLDER "%u soubor, %u sloek" IDS_PRINTERS "Tiskrny" diff --git a/reactos/dll/win32/shell32/lang/da-DK.rc b/reactos/dll/win32/shell32/lang/da-DK.rc index e0f9152cf03..0e0616499b5 100644 --- a/reactos/dll/win32/shell32/lang/da-DK.rc +++ b/reactos/dll/win32/shell32/lang/da-DK.rc @@ -732,12 +732,11 @@ BEGIN IDS_SYS_FILE "System file" IDS_OPEN_VERB "Open" + IDS_EXPLORE_VERB "Explore" IDS_RUNAS_VERB "Run as " IDS_EDIT_VERB "Edit" IDS_FIND_VERB "Find" IDS_PRINT_VERB "Print" - IDS_PLAY_VERB "Play" - IDS_PREVIEW_VERB "Preview" IDS_FILE_FOLDER "%u Files, %u Folders" IDS_PRINTERS "Printers" diff --git a/reactos/dll/win32/shell32/lang/de-DE.rc b/reactos/dll/win32/shell32/lang/de-DE.rc index 42cd6e5b0e5..bf4ccfa66f2 100644 --- a/reactos/dll/win32/shell32/lang/de-DE.rc +++ b/reactos/dll/win32/shell32/lang/de-DE.rc @@ -747,12 +747,11 @@ BEGIN IDS_SYS_FILE "Systemdatei" IDS_OPEN_VERB "ffnen" + IDS_EXPLORE_VERB "Explore" IDS_RUNAS_VERB "Ausfhren als " IDS_EDIT_VERB "Bearbeiten" IDS_FIND_VERB "Finden" IDS_PRINT_VERB "Drucken" - IDS_PLAY_VERB "Abspielen" - IDS_PREVIEW_VERB "Vorschau" IDS_FILE_FOLDER "%u Dateien, %u Ordner" IDS_PRINTERS "Drucker" diff --git a/reactos/dll/win32/shell32/lang/el-GR.rc b/reactos/dll/win32/shell32/lang/el-GR.rc index 30542a021ec..f47854c8841 100644 --- a/reactos/dll/win32/shell32/lang/el-GR.rc +++ b/reactos/dll/win32/shell32/lang/el-GR.rc @@ -744,12 +744,11 @@ BEGIN IDS_SYS_FILE "System file" IDS_OPEN_VERB "Open" + IDS_EXPLORE_VERB "Explore" IDS_RUNAS_VERB "Run as " IDS_EDIT_VERB "Edit" IDS_FIND_VERB "Find" IDS_PRINT_VERB "Print" - IDS_PLAY_VERB "Play" - IDS_PREVIEW_VERB "Preview" IDS_FILE_FOLDER "%u Files, %u Folders" IDS_PRINTERS "Printers" diff --git a/reactos/dll/win32/shell32/lang/en-GB.rc b/reactos/dll/win32/shell32/lang/en-GB.rc index 9880c9007d1..5e693394fc5 100644 --- a/reactos/dll/win32/shell32/lang/en-GB.rc +++ b/reactos/dll/win32/shell32/lang/en-GB.rc @@ -743,12 +743,11 @@ BEGIN IDS_SYS_FILE "System file" IDS_OPEN_VERB "Open" + IDS_EXPLORE_VERB "Explore" IDS_RUNAS_VERB "Run as " IDS_EDIT_VERB "Edit" IDS_FIND_VERB "Find" IDS_PRINT_VERB "Print" - IDS_PLAY_VERB "Play" - IDS_PREVIEW_VERB "Preview" IDS_FILE_FOLDER "%u Files, %u Folders" IDS_PRINTERS "Printers" diff --git a/reactos/dll/win32/shell32/lang/en-US.rc b/reactos/dll/win32/shell32/lang/en-US.rc index a7adfb3ea6e..946a4ebcdcb 100644 --- a/reactos/dll/win32/shell32/lang/en-US.rc +++ b/reactos/dll/win32/shell32/lang/en-US.rc @@ -754,12 +754,11 @@ BEGIN IDS_SYS_FILE "System file" IDS_OPEN_VERB "Open" + IDS_EXPLORE_VERB "Explore" IDS_RUNAS_VERB "Run as " IDS_EDIT_VERB "Edit" IDS_FIND_VERB "Find" IDS_PRINT_VERB "Print" - IDS_PLAY_VERB "Play" - IDS_PREVIEW_VERB "Preview" IDS_FILE_FOLDER "%u Files, %u Folders" IDS_PRINTERS "Printers" diff --git a/reactos/dll/win32/shell32/lang/es-ES.rc b/reactos/dll/win32/shell32/lang/es-ES.rc index 30e60b1a435..95dd072026a 100644 --- a/reactos/dll/win32/shell32/lang/es-ES.rc +++ b/reactos/dll/win32/shell32/lang/es-ES.rc @@ -756,12 +756,11 @@ BEGIN IDS_SYS_FILE "Archivo del sistema" IDS_OPEN_VERB "Abrir" + IDS_EXPLORE_VERB "Explore" IDS_RUNAS_VERB "Ejecutar como ..." IDS_EDIT_VERB "Editar" IDS_FIND_VERB "Buscar" IDS_PRINT_VERB "Imprimir" - IDS_PLAY_VERB "Reproducir" - IDS_PREVIEW_VERB "Vista previa" IDS_FILE_FOLDER "%u Archivos, %u Carpetas" IDS_PRINTERS "Impresoras" diff --git a/reactos/dll/win32/shell32/lang/fi-FI.rc b/reactos/dll/win32/shell32/lang/fi-FI.rc index 9526e498dcb..f8958cfa903 100644 --- a/reactos/dll/win32/shell32/lang/fi-FI.rc +++ b/reactos/dll/win32/shell32/lang/fi-FI.rc @@ -743,12 +743,11 @@ BEGIN IDS_SYS_FILE "System file" IDS_OPEN_VERB "Open" + IDS_EXPLORE_VERB "Explore" IDS_RUNAS_VERB "Run as " IDS_EDIT_VERB "Edit" IDS_FIND_VERB "Find" IDS_PRINT_VERB "Print" - IDS_PLAY_VERB "Play" - IDS_PREVIEW_VERB "Preview" IDS_FILE_FOLDER "%u Files, %u Folders" IDS_PRINTERS "Printers" diff --git a/reactos/dll/win32/shell32/lang/fr-FR.rc b/reactos/dll/win32/shell32/lang/fr-FR.rc index 998d9df7ff0..3b2c1fdba51 100644 --- a/reactos/dll/win32/shell32/lang/fr-FR.rc +++ b/reactos/dll/win32/shell32/lang/fr-FR.rc @@ -747,12 +747,11 @@ BEGIN IDS_SYS_FILE "Fichier systme" IDS_OPEN_VERB "Ouvrir" + IDS_EXPLORE_VERB "Explore" IDS_RUNAS_VERB "Lancer en tant que " IDS_EDIT_VERB "diter" IDS_FIND_VERB "Chercher" IDS_PRINT_VERB "Imprimer" - IDS_PLAY_VERB "Lire" - IDS_PREVIEW_VERB "Apercevoir" IDS_FILE_FOLDER "%u fichiers, %u rpertoires" IDS_PRINTERS "Imprimantes" diff --git a/reactos/dll/win32/shell32/lang/hu-HU.rc b/reactos/dll/win32/shell32/lang/hu-HU.rc index e4929828594..e9f12f71ed3 100644 --- a/reactos/dll/win32/shell32/lang/hu-HU.rc +++ b/reactos/dll/win32/shell32/lang/hu-HU.rc @@ -746,12 +746,11 @@ BEGIN IDS_SYS_FILE "System file" IDS_OPEN_VERB "Open" + IDS_EXPLORE_VERB "Explore" IDS_RUNAS_VERB "Run as " IDS_EDIT_VERB "Edit" IDS_FIND_VERB "Find" IDS_PRINT_VERB "Print" - IDS_PLAY_VERB "Play" - IDS_PREVIEW_VERB "Preview" IDS_FILE_FOLDER "%u Files, %u Folders" IDS_PRINTERS "Printers" diff --git a/reactos/dll/win32/shell32/lang/it-IT.rc b/reactos/dll/win32/shell32/lang/it-IT.rc index d91d17c11f7..134c6979aa5 100644 --- a/reactos/dll/win32/shell32/lang/it-IT.rc +++ b/reactos/dll/win32/shell32/lang/it-IT.rc @@ -754,12 +754,11 @@ BEGIN IDS_SYS_FILE "File di sistema" IDS_OPEN_VERB "Apri" + IDS_EXPLORE_VERB "Explore" IDS_RUNAS_VERB "Eseguire come " IDS_EDIT_VERB "Modifica" IDS_FIND_VERB "Cerca" IDS_PRINT_VERB "Stampa" - IDS_PLAY_VERB "Mostra" - IDS_PREVIEW_VERB "Anteprima" IDS_FILE_FOLDER "%u File, %u Cartelle" IDS_PRINTERS "Stampanti" diff --git a/reactos/dll/win32/shell32/lang/ja-JP.rc b/reactos/dll/win32/shell32/lang/ja-JP.rc index 6270d7df62e..9545f6c9c67 100644 --- a/reactos/dll/win32/shell32/lang/ja-JP.rc +++ b/reactos/dll/win32/shell32/lang/ja-JP.rc @@ -743,12 +743,11 @@ BEGIN IDS_SYS_FILE "VXe t@C" IDS_OPEN_VERB "J" + IDS_EXPLORE_VERB "Explore" IDS_RUNAS_VERB "ʂ̃[U[ƂĎs " IDS_EDIT_VERB "ҏW" IDS_FIND_VERB "" IDS_PRINT_VERB "" - IDS_PLAY_VERB "Đ" - IDS_PREVIEW_VERB "vr[" IDS_FILE_FOLDER "%u ‚̃t@CA %u ‚̃tH_" IDS_PRINTERS "v^" diff --git a/reactos/dll/win32/shell32/lang/ko-KR.rc b/reactos/dll/win32/shell32/lang/ko-KR.rc index 275849385a8..37565bd4f39 100644 --- a/reactos/dll/win32/shell32/lang/ko-KR.rc +++ b/reactos/dll/win32/shell32/lang/ko-KR.rc @@ -743,12 +743,11 @@ BEGIN IDS_SYS_FILE "System file" IDS_OPEN_VERB "Open" + IDS_EXPLORE_VERB "Explore" IDS_RUNAS_VERB "Run as " IDS_EDIT_VERB "Edit" IDS_FIND_VERB "Find" IDS_PRINT_VERB "Print" - IDS_PLAY_VERB "Play" - IDS_PREVIEW_VERB "Preview" IDS_FILE_FOLDER "%u Files, %u Folders" IDS_PRINTERS "Printers" diff --git a/reactos/dll/win32/shell32/lang/nl-NL.rc b/reactos/dll/win32/shell32/lang/nl-NL.rc index c754e703a4a..5e957b7485a 100644 --- a/reactos/dll/win32/shell32/lang/nl-NL.rc +++ b/reactos/dll/win32/shell32/lang/nl-NL.rc @@ -743,12 +743,11 @@ BEGIN IDS_SYS_FILE "System file" IDS_OPEN_VERB "Open" + IDS_EXPLORE_VERB "Explore" IDS_RUNAS_VERB "Run as " IDS_EDIT_VERB "Edit" IDS_FIND_VERB "Find" IDS_PRINT_VERB "Print" - IDS_PLAY_VERB "Play" - IDS_PREVIEW_VERB "Preview" IDS_FILE_FOLDER "%u Files, %u Folders" IDS_PRINTERS "Printers" diff --git a/reactos/dll/win32/shell32/lang/no-NO.rc b/reactos/dll/win32/shell32/lang/no-NO.rc index 2f944c02902..e204a77d957 100644 --- a/reactos/dll/win32/shell32/lang/no-NO.rc +++ b/reactos/dll/win32/shell32/lang/no-NO.rc @@ -746,12 +746,11 @@ BEGIN IDS_SYS_FILE "Systemfil" IDS_OPEN_VERB "pne" + IDS_EXPLORE_VERB "Explore" IDS_RUNAS_VERB "Kjr som" IDS_EDIT_VERB "Rediger" IDS_FIND_VERB "Finn" IDS_PRINT_VERB "Skriv ut" - IDS_PLAY_VERB "Spill" - IDS_PREVIEW_VERB "Forhndsvis" IDS_FILE_FOLDER "%u filer, %u mapper" IDS_PRINTERS "Skrivere" diff --git a/reactos/dll/win32/shell32/lang/pl-PL.rc b/reactos/dll/win32/shell32/lang/pl-PL.rc index d41fb99f52c..65e85133323 100644 --- a/reactos/dll/win32/shell32/lang/pl-PL.rc +++ b/reactos/dll/win32/shell32/lang/pl-PL.rc @@ -751,12 +751,11 @@ BEGIN IDS_SYS_FILE "Plik systemowy" IDS_OPEN_VERB "Otwrz" + IDS_EXPLORE_VERB "Eksploruj" IDS_RUNAS_VERB "Uruchom jako " IDS_EDIT_VERB "Edytuj" IDS_FIND_VERB "Wyszukaj" IDS_PRINT_VERB "Drukuj" - IDS_PLAY_VERB "Odtwrz" - IDS_PREVIEW_VERB "Podgld" IDS_FILE_FOLDER "%u Plikw, %u Katalogw" IDS_PRINTERS "Drukarki" diff --git a/reactos/dll/win32/shell32/lang/pt-BR.rc b/reactos/dll/win32/shell32/lang/pt-BR.rc index e018066a89a..c06bf15c70c 100644 --- a/reactos/dll/win32/shell32/lang/pt-BR.rc +++ b/reactos/dll/win32/shell32/lang/pt-BR.rc @@ -745,12 +745,11 @@ BEGIN IDS_SYS_FILE "System file" IDS_OPEN_VERB "Open" + IDS_EXPLORE_VERB "Explore" IDS_RUNAS_VERB "Run as " IDS_EDIT_VERB "Edit" IDS_FIND_VERB "Find" IDS_PRINT_VERB "Print" - IDS_PLAY_VERB "Play" - IDS_PREVIEW_VERB "Preview" IDS_FILE_FOLDER "%u Files, %u Folders" IDS_PRINTERS "Printers" diff --git a/reactos/dll/win32/shell32/lang/pt-PT.rc b/reactos/dll/win32/shell32/lang/pt-PT.rc index 25541f081a8..e34e5567909 100644 --- a/reactos/dll/win32/shell32/lang/pt-PT.rc +++ b/reactos/dll/win32/shell32/lang/pt-PT.rc @@ -746,12 +746,11 @@ BEGIN IDS_SYS_FILE "Ficheiro de Sistema" IDS_OPEN_VERB "Abrir" + IDS_EXPLORE_VERB "Explore" IDS_RUNAS_VERB "Executar como " IDS_EDIT_VERB "Editar" IDS_FIND_VERB "Procurar" IDS_PRINT_VERB "Imprimir" - IDS_PLAY_VERB "Reproduzir" - IDS_PREVIEW_VERB "Previzualizar" IDS_FILE_FOLDER "%u Ficheiros, %u Pastas" IDS_PRINTERS "Impressoras" diff --git a/reactos/dll/win32/shell32/lang/ro-RO.rc b/reactos/dll/win32/shell32/lang/ro-RO.rc index 3a89641e619..ef9e21361f0 100644 --- a/reactos/dll/win32/shell32/lang/ro-RO.rc +++ b/reactos/dll/win32/shell32/lang/ro-RO.rc @@ -746,12 +746,11 @@ BEGIN IDS_SYS_FILE "Fișier de sistem" IDS_OPEN_VERB "Deschidere" + IDS_EXPLORE_VERB "Explore" IDS_RUNAS_VERB "Rulare ca " IDS_EDIT_VERB "Editare" IDS_FIND_VERB "Căutare" IDS_PRINT_VERB "Imprimare" - IDS_PLAY_VERB "Redare" - IDS_PREVIEW_VERB "Previzualizare" IDS_FILE_FOLDER "%u fișiere, %u dosare" IDS_PRINTERS "Imprimante" diff --git a/reactos/dll/win32/shell32/lang/ru-RU.rc b/reactos/dll/win32/shell32/lang/ru-RU.rc index 64ccb664e6a..c01ac6335da 100644 --- a/reactos/dll/win32/shell32/lang/ru-RU.rc +++ b/reactos/dll/win32/shell32/lang/ru-RU.rc @@ -742,12 +742,11 @@ BEGIN IDS_SYS_FILE " " IDS_OPEN_VERB "" + IDS_EXPLORE_VERB "Explore" IDS_RUNAS_VERB " " IDS_EDIT_VERB "" IDS_FIND_VERB "" IDS_PRINT_VERB "" - IDS_PLAY_VERB "" - IDS_PREVIEW_VERB "" IDS_FILE_FOLDER "%u , %u " IDS_PRINTERS "" diff --git a/reactos/dll/win32/shell32/lang/sk-SK.rc b/reactos/dll/win32/shell32/lang/sk-SK.rc index 2a5f7ed78d4..084351ce91f 100644 --- a/reactos/dll/win32/shell32/lang/sk-SK.rc +++ b/reactos/dll/win32/shell32/lang/sk-SK.rc @@ -749,12 +749,11 @@ BEGIN IDS_SYS_FILE "Systmov sbor" IDS_OPEN_VERB "Otvori" + IDS_EXPLORE_VERB "Explore" IDS_RUNAS_VERB "Spusti ako " IDS_EDIT_VERB "Upravi" IDS_FIND_VERB "Find" //Njs, Hada, Vyhada ??? IDS_PRINT_VERB "Tlai" - IDS_PLAY_VERB "Prehra" - IDS_PREVIEW_VERB "Preview" //Nhad, Ukka, Prezrie ??? IDS_FILE_FOLDER "sbory: %u, prieinky: %u" IDS_PRINTERS "Tlaiarne" diff --git a/reactos/dll/win32/shell32/lang/sl-SI.rc b/reactos/dll/win32/shell32/lang/sl-SI.rc index 84513d4b97b..79bd536fe1b 100644 --- a/reactos/dll/win32/shell32/lang/sl-SI.rc +++ b/reactos/dll/win32/shell32/lang/sl-SI.rc @@ -743,12 +743,11 @@ BEGIN IDS_SYS_FILE "System file" IDS_OPEN_VERB "Open" + IDS_EXPLORE_VERB "Explore" IDS_RUNAS_VERB "Run as " IDS_EDIT_VERB "Edit" IDS_FIND_VERB "Find" IDS_PRINT_VERB "Print" - IDS_PLAY_VERB "Play" - IDS_PREVIEW_VERB "Preview" IDS_FILE_FOLDER "%u Files, %u Folders" IDS_PRINTERS "Printers" diff --git a/reactos/dll/win32/shell32/lang/sv-SE.rc b/reactos/dll/win32/shell32/lang/sv-SE.rc index cc940c8460d..6bfcf61da75 100644 --- a/reactos/dll/win32/shell32/lang/sv-SE.rc +++ b/reactos/dll/win32/shell32/lang/sv-SE.rc @@ -743,12 +743,11 @@ BEGIN IDS_SYS_FILE "System file" IDS_OPEN_VERB "Open" + IDS_EXPLORE_VERB "Explore" IDS_RUNAS_VERB "Run as " IDS_EDIT_VERB "Edit" IDS_FIND_VERB "Find" IDS_PRINT_VERB "Print" - IDS_PLAY_VERB "Play" - IDS_PREVIEW_VERB "Preview" IDS_FILE_FOLDER "%u Files, %u Folders" IDS_PRINTERS "Printers" diff --git a/reactos/dll/win32/shell32/lang/tr-TR.rc b/reactos/dll/win32/shell32/lang/tr-TR.rc index b95063003fb..b5f8e6258e3 100644 --- a/reactos/dll/win32/shell32/lang/tr-TR.rc +++ b/reactos/dll/win32/shell32/lang/tr-TR.rc @@ -743,12 +743,11 @@ BEGIN IDS_SYS_FILE "System file" IDS_OPEN_VERB "Open" + IDS_EXPLORE_VERB "Explore" IDS_RUNAS_VERB "Run as " IDS_EDIT_VERB "Edit" IDS_FIND_VERB "Find" IDS_PRINT_VERB "Print" - IDS_PLAY_VERB "Play" - IDS_PREVIEW_VERB "Preview" IDS_FILE_FOLDER "%u Files, %u Folders" IDS_PRINTERS "Printers" diff --git a/reactos/dll/win32/shell32/lang/uk-UA.rc b/reactos/dll/win32/shell32/lang/uk-UA.rc index 785a67567c5..772a268ebb7 100644 --- a/reactos/dll/win32/shell32/lang/uk-UA.rc +++ b/reactos/dll/win32/shell32/lang/uk-UA.rc @@ -756,12 +756,11 @@ BEGIN IDS_SYS_FILE " " IDS_OPEN_VERB "³" + IDS_EXPLORE_VERB "Explore" IDS_RUNAS_VERB " " IDS_EDIT_VERB "" IDS_FIND_VERB "" IDS_PRINT_VERB "" - IDS_PLAY_VERB "³" - IDS_PREVIEW_VERB "" IDS_FILE_FOLDER "%u , %u " IDS_PRINTERS "" diff --git a/reactos/dll/win32/shell32/lang/zh-CN.rc b/reactos/dll/win32/shell32/lang/zh-CN.rc index 7b25bb40007..ba4d7c8de10 100644 --- a/reactos/dll/win32/shell32/lang/zh-CN.rc +++ b/reactos/dll/win32/shell32/lang/zh-CN.rc @@ -731,12 +731,11 @@ BEGIN IDS_SYS_FILE "System file" IDS_OPEN_VERB "Open" + IDS_EXPLORE_VERB "Explore" IDS_RUNAS_VERB "Run as " IDS_EDIT_VERB "Edit" IDS_FIND_VERB "Find" IDS_PRINT_VERB "Print" - IDS_PLAY_VERB "Play" - IDS_PREVIEW_VERB "Preview" IDS_FILE_FOLDER "%u Files, %u Folders" IDS_PRINTERS "Printers" diff --git a/reactos/dll/win32/shell32/lang/zh-TW.rc b/reactos/dll/win32/shell32/lang/zh-TW.rc index 5e386cba010..22dd7afc4d2 100644 --- a/reactos/dll/win32/shell32/lang/zh-TW.rc +++ b/reactos/dll/win32/shell32/lang/zh-TW.rc @@ -744,12 +744,11 @@ BEGIN IDS_SYS_FILE "System file" IDS_OPEN_VERB "Open" + IDS_EXPLORE_VERB "Explore" IDS_RUNAS_VERB "Run as " IDS_EDIT_VERB "Edit" IDS_FIND_VERB "Find" IDS_PRINT_VERB "Print" - IDS_PLAY_VERB "Play" - IDS_PREVIEW_VERB "Preview" IDS_FILE_FOLDER "%u Files, %u Folders" IDS_PRINTERS "Printers" diff --git a/reactos/dll/win32/shell32/shresdef.h b/reactos/dll/win32/shell32/shresdef.h index 23ff1ecfd2c..1cb3903ee85 100644 --- a/reactos/dll/win32/shell32/shresdef.h +++ b/reactos/dll/win32/shell32/shresdef.h @@ -148,12 +148,12 @@ #define IDS_RUNDLG_BROWSE_FILTER 183 #define IDS_OPEN_VERB 300 -#define IDS_RUNAS_VERB 301 -#define IDS_EDIT_VERB 302 -#define IDS_FIND_VERB 303 -#define IDS_PRINT_VERB 304 -#define IDS_PLAY_VERB 305 -#define IDS_PREVIEW_VERB 306 +#define IDS_EXPLORE_VERB 301 +#define IDS_RUNAS_VERB 302 +#define IDS_EDIT_VERB 303 +#define IDS_FIND_VERB 304 +#define IDS_PRINT_VERB 305 + #define IDS_FILE_FOLDER 307 #define IDS_CREATELINK 308 #define IDS_INSTALLNEWFONT 309 diff --git a/reactos/dll/win32/shell32/shv_def_cmenu.c b/reactos/dll/win32/shell32/shv_def_cmenu.c index 08c9c3c9c74..701a3caffb6 100644 --- a/reactos/dll/win32/shell32/shv_def_cmenu.c +++ b/reactos/dll/win32/shell32/shv_def_cmenu.c @@ -644,6 +644,8 @@ AddStaticContextMenusToMenu( fState |= MFS_DEFAULT; idResource = IDS_OPEN_VERB; } + else if (!wcsicmp(curEntry->szVerb, L"explore")) + idResource = IDS_EXPLORE_VERB; else if (!wcsicmp(curEntry->szVerb, L"runas")) idResource = IDS_RUNAS_VERB; else if (!wcsicmp(curEntry->szVerb, L"edit")) @@ -652,10 +654,6 @@ AddStaticContextMenusToMenu( idResource = IDS_FIND_VERB; else if (!wcsicmp(curEntry->szVerb, L"print")) idResource = IDS_PRINT_VERB; - else if (!wcsicmp(curEntry->szVerb, L"play")) - idResource = IDS_PLAY_VERB; - else if (!wcsicmp(curEntry->szVerb, L"preview")) - idResource = IDS_PREVIEW_VERB; else idResource = 0; diff --git a/reactos/dll/win32/shimgvw/lang/bg-BG.rc b/reactos/dll/win32/shimgvw/lang/bg-BG.rc index d429ddd7f68..765764bcd11 100644 --- a/reactos/dll/win32/shimgvw/lang/bg-BG.rc +++ b/reactos/dll/win32/shimgvw/lang/bg-BG.rc @@ -4,6 +4,7 @@ STRINGTABLE BEGIN IDS_APPTITLE " " IDS_SETASDESKBG " " + IDS_PREVIEW "" /* Tooltips */ IDS_TOOLTIP_NEXT_PIC " " diff --git a/reactos/dll/win32/shimgvw/lang/cs-CZ.rc b/reactos/dll/win32/shimgvw/lang/cs-CZ.rc index 205667f9014..1da7f30aee5 100644 --- a/reactos/dll/win32/shimgvw/lang/cs-CZ.rc +++ b/reactos/dll/win32/shimgvw/lang/cs-CZ.rc @@ -7,8 +7,9 @@ LANGUAGE LANG_CZECH, SUBLANG_DEFAULT STRINGTABLE BEGIN - IDS_APPTITLE "ReactOS prohle obrzk a fax" + IDS_APPTITLE "ReactOS prohle obrzk a fax" IDS_SETASDESKBG "Nastavit jako pozad plochy" + IDS_PREVIEW "Nhled" /* Tooltips */ IDS_TOOLTIP_NEXT_PIC "Dal obrzek" diff --git a/reactos/dll/win32/shimgvw/lang/de-DE.rc b/reactos/dll/win32/shimgvw/lang/de-DE.rc index 32c716beafa..229c0bcc8a0 100644 --- a/reactos/dll/win32/shimgvw/lang/de-DE.rc +++ b/reactos/dll/win32/shimgvw/lang/de-DE.rc @@ -2,8 +2,9 @@ LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL STRINGTABLE BEGIN - IDS_APPTITLE "ReactOS-Bild- und Faxansicht" + IDS_APPTITLE "ReactOS-Bild- und Faxansicht" IDS_SETASDESKBG "Als Desktophintergrund setzen" + IDS_PREVIEW "Vorschau" /* Tooltips */ IDS_TOOLTIP_NEXT_PIC "Nchstes Bild" diff --git a/reactos/dll/win32/shimgvw/lang/en-US.rc b/reactos/dll/win32/shimgvw/lang/en-US.rc index af6bde0b4d7..d8980c9cc43 100644 --- a/reactos/dll/win32/shimgvw/lang/en-US.rc +++ b/reactos/dll/win32/shimgvw/lang/en-US.rc @@ -2,8 +2,9 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US STRINGTABLE BEGIN - IDS_APPTITLE "ReactOS Picture and Fax Viewer" + IDS_APPTITLE "ReactOS Picture and Fax Viewer" IDS_SETASDESKBG "Set as Desktop Background" + IDS_PREVIEW "Preview" /* Tooltips */ IDS_TOOLTIP_NEXT_PIC "Next Picture" diff --git a/reactos/dll/win32/shimgvw/lang/es-ES.rc b/reactos/dll/win32/shimgvw/lang/es-ES.rc index 3e475b1003f..1421cff7f94 100644 --- a/reactos/dll/win32/shimgvw/lang/es-ES.rc +++ b/reactos/dll/win32/shimgvw/lang/es-ES.rc @@ -2,8 +2,9 @@ LANGUAGE LANG_SPANISH, SUBLANG_NEUTRAL STRINGTABLE BEGIN - IDS_APPTITLE "Visor de imgenes y fax de ReactOS" - IDS_SETASDESKBG "Establecer como fondo de escritorio" + IDS_APPTITLE "Visor de imgenes y fax de ReactOS" + IDS_SETASDESKBG "Establecer como fondo de escritorio" + IDS_PREVIEW "Vista previa" /* Tooltips */ IDS_TOOLTIP_NEXT_PIC "Imagen siguiente" diff --git a/reactos/dll/win32/shimgvw/lang/lt-LT.rc b/reactos/dll/win32/shimgvw/lang/lt-LT.rc index 1c1b376b2b7..c5451eb0869 100644 --- a/reactos/dll/win32/shimgvw/lang/lt-LT.rc +++ b/reactos/dll/win32/shimgvw/lang/lt-LT.rc @@ -6,8 +6,9 @@ LANGUAGE LANG_LITHUANIAN, SUBLANG_DEFAULT STRINGTABLE BEGIN - IDS_APPTITLE "ReactOS paveikslli ir faksogram periros programa" + IDS_APPTITLE "ReactOS paveikslli ir faksogram periros programa" IDS_SETASDESKBG "Nustatyti kaip darbalaukio fon" + IDS_PREVIEW "Preview" /* Tooltips */ IDS_TOOLTIP_NEXT_PIC "Tolesnis paveiksllis" diff --git a/reactos/dll/win32/shimgvw/lang/no-NO.rc b/reactos/dll/win32/shimgvw/lang/no-NO.rc index 5acffadc7a5..a07d1b9a633 100644 --- a/reactos/dll/win32/shimgvw/lang/no-NO.rc +++ b/reactos/dll/win32/shimgvw/lang/no-NO.rc @@ -2,8 +2,9 @@ LANGUAGE LANG_NORWEGIAN, SUBLANG_NEUTRAL STRINGTABLE BEGIN - IDS_APPTITLE "ReactOS bilde og Faks Viser" + IDS_APPTITLE "ReactOS bilde og Faks Viser" IDS_SETASDESKBG "Sett som skrivebord bakgrunn" + IDS_PREVIEW "Skriv ut" /* Tooltips */ IDS_TOOLTIP_NEXT_PIC "Neste bilde" diff --git a/reactos/dll/win32/shimgvw/lang/pl-PL.rc b/reactos/dll/win32/shimgvw/lang/pl-PL.rc new file mode 100644 index 00000000000..1237b398840 --- /dev/null +++ b/reactos/dll/win32/shimgvw/lang/pl-PL.rc @@ -0,0 +1,18 @@ +LANGUAGE LANG_POLISH, SUBLANG_DEFAULT + +STRINGTABLE +BEGIN + IDS_APPTITLE "Przegldarka obrazw i faxw ReactOS" + IDS_SETASDESKBG "Ustaw jako to pulpitu" + IDS_PREVIEW "Podgld" + + /* Tooltips */ + IDS_TOOLTIP_NEXT_PIC "Nastpny obraz" + IDS_TOOLTIP_PREV_PIC "Poprzedni obraz" + IDS_TOOLTIP_ZOOM_IN "Powiksz (+)" + IDS_TOOLTIP_ZOOM_OUT "Pomniejsz (-)" + IDS_TOOLTIP_ROT_CLOCKW "Obr zgodnie z ruchem wskazwek zegara (Ctrl+K)" + IDS_TOOLTIP_ROT_COUNCW "Obr przeciwnie do ruchu wskazwek zegara (Ctrl+L)" + IDS_TOOLTIP_PRINT "Drukuj (Ctrl+P)" + IDS_TOOLTIP_SAVEAS "Zapisz jako... (Ctrl+S)" +END diff --git a/reactos/dll/win32/shimgvw/lang/ru-RU.rc b/reactos/dll/win32/shimgvw/lang/ru-RU.rc index 55110addeb5..27ae9d88042 100644 --- a/reactos/dll/win32/shimgvw/lang/ru-RU.rc +++ b/reactos/dll/win32/shimgvw/lang/ru-RU.rc @@ -2,8 +2,9 @@ LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT STRINGTABLE BEGIN - IDS_APPTITLE " " + IDS_APPTITLE " " IDS_SETASDESKBG " " + IDS_PREVIEW "" /* Tooltips */ IDS_TOOLTIP_NEXT_PIC " " diff --git a/reactos/dll/win32/shimgvw/lang/sk-SK.rc b/reactos/dll/win32/shimgvw/lang/sk-SK.rc index 3af4fb03c97..a0181f351a4 100644 --- a/reactos/dll/win32/shimgvw/lang/sk-SK.rc +++ b/reactos/dll/win32/shimgvw/lang/sk-SK.rc @@ -6,8 +6,9 @@ LANGUAGE LANG_SLOVAK, SUBLANG_DEFAULT STRINGTABLE BEGIN - IDS_APPTITLE "Zobrazova obrzkov a faxov systmu ReactOS" + IDS_APPTITLE "Zobrazova obrzkov a faxov systmu ReactOS" IDS_SETASDESKBG "Nastavi ako pozadie pracovnej plochy" + IDS_PREVIEW "Preview" //Nhad, Ukka, Prezrie ??? /* Tooltips */ IDS_TOOLTIP_NEXT_PIC "Nasledujci obrzok" diff --git a/reactos/dll/win32/shimgvw/lang/uk-UA.rc b/reactos/dll/win32/shimgvw/lang/uk-UA.rc index 848eec90ae5..3c323fc2e4e 100644 --- a/reactos/dll/win32/shimgvw/lang/uk-UA.rc +++ b/reactos/dll/win32/shimgvw/lang/uk-UA.rc @@ -10,8 +10,9 @@ LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT STRINGTABLE BEGIN - IDS_APPTITLE " ReactOS" + IDS_APPTITLE " ReactOS" IDS_SETASDESKBG " " + IDS_PREVIEW "" /* Tooltips */ IDS_TOOLTIP_NEXT_PIC " " diff --git a/reactos/dll/win32/shimgvw/resource.h b/reactos/dll/win32/shimgvw/resource.h index 9ef15eda193..83603f1267d 100644 --- a/reactos/dll/win32/shimgvw/resource.h +++ b/reactos/dll/win32/shimgvw/resource.h @@ -39,6 +39,7 @@ /* Strings */ #define IDS_APPTITLE 100 #define IDS_SETASDESKBG 101 +#define IDS_PREVIEW 550 /* Tooltips strings */ #define IDS_TOOLTIP_NEXT_PIC 300 diff --git a/reactos/dll/win32/shimgvw/rsrc.rc b/reactos/dll/win32/shimgvw/rsrc.rc index 5268b49dbca..147d41dd3ff 100644 --- a/reactos/dll/win32/shimgvw/rsrc.rc +++ b/reactos/dll/win32/shimgvw/rsrc.rc @@ -8,6 +8,7 @@ #include "lang/es-ES.rc" #include "lang/no-NO.rc" #include "lang/lt-LT.rc" +#include "lang/pl-PL.rc" #include "lang/ru-RU.rc" #include "lang/sk-SK.rc" #include "lang/uk-UA.rc" From b0d903363812a7463cc50e7f5125492333f646fc Mon Sep 17 00:00:00 2001 From: Gabriel Ilardi Date: Fri, 22 Apr 2011 12:30:50 +0000 Subject: [PATCH 191/317] [shimgvw] Add Italian translation. [mplay32] Fix Italian translation for play. svn path=/trunk/; revision=51424 --- .../base/applications/mplay32/lang/it-IT.rc | 2 +- reactos/dll/win32/shimgvw/lang/it-IT.rc | 18 ++++++++++++++++++ reactos/dll/win32/shimgvw/rsrc.rc | 1 + 3 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 reactos/dll/win32/shimgvw/lang/it-IT.rc diff --git a/reactos/base/applications/mplay32/lang/it-IT.rc b/reactos/base/applications/mplay32/lang/it-IT.rc index a2e19d652d0..6a599662957 100644 --- a/reactos/base/applications/mplay32/lang/it-IT.rc +++ b/reactos/base/applications/mplay32/lang/it-IT.rc @@ -26,5 +26,5 @@ BEGIN IDS_TOOLTIP_SEEKFORW "Avanzamento rapido" IDS_TOOLTIP_FORWARD "Successivo" IDS_APPTITLE "Riproduttore multimediale ReactOS" - IDS_PLAY "Mostra" + IDS_PLAY "Riproduci" END diff --git a/reactos/dll/win32/shimgvw/lang/it-IT.rc b/reactos/dll/win32/shimgvw/lang/it-IT.rc new file mode 100644 index 00000000000..e48d6e08b28 --- /dev/null +++ b/reactos/dll/win32/shimgvw/lang/it-IT.rc @@ -0,0 +1,18 @@ +LANGUAGE LANG_ITALIAN, SUBLANG_NEUTRAL + +STRINGTABLE +BEGIN + IDS_APPTITLE "Visualizzatore immagini e fax di ReactOS" + IDS_SETASDESKBG "Imposta come sfondo del desktop" + IDS_PREVIEW "Anteprima" + + /* Tooltips */ + IDS_TOOLTIP_NEXT_PIC "Immagine successiva" + IDS_TOOLTIP_PREV_PIC "Immagine precedente" + IDS_TOOLTIP_ZOOM_IN "Zoom avanti (+)" + IDS_TOOLTIP_ZOOM_OUT "Zoom indietro (-)" + IDS_TOOLTIP_ROT_CLOCKW "Ruotare in senso orario (Ctrl+K)" + IDS_TOOLTIP_ROT_COUNCW "Ruotare in senso antiorario (Ctrl+L)" + IDS_TOOLTIP_PRINT "Stampare (Ctrl+P)" + IDS_TOOLTIP_SAVEAS "Salva in... (Ctrl+S)" +END diff --git a/reactos/dll/win32/shimgvw/rsrc.rc b/reactos/dll/win32/shimgvw/rsrc.rc index 147d41dd3ff..3f4e96012fd 100644 --- a/reactos/dll/win32/shimgvw/rsrc.rc +++ b/reactos/dll/win32/shimgvw/rsrc.rc @@ -6,6 +6,7 @@ #include "lang/de-DE.rc" #include "lang/en-US.rc" #include "lang/es-ES.rc" +#include "lang/it-IT.rc" #include "lang/no-NO.rc" #include "lang/lt-LT.rc" #include "lang/pl-PL.rc" From 295e7d388cb8d85ca11eee8d4b0ef0fda333d101 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Fri, 22 Apr 2011 14:07:22 +0000 Subject: [PATCH 192/317] [Translations] * explorer-new: Fix some wrong UK and RU translations. * shell32: Update UK and RU translations. * Patch by Igor Paliychuk svn path=/trunk/; revision=51426 --- reactos/base/shell/explorer-new/lang/ru-RU.rc | 2 +- reactos/base/shell/explorer-new/lang/uk-UA.rc | 2 +- reactos/dll/win32/shell32/lang/ru-RU.rc | 14 +++++++------- reactos/dll/win32/shell32/lang/uk-UA.rc | 14 +++++++------- 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/reactos/base/shell/explorer-new/lang/ru-RU.rc b/reactos/base/shell/explorer-new/lang/ru-RU.rc index 7a21b150a74..29fb95ebbd2 100644 --- a/reactos/base/shell/explorer-new/lang/ru-RU.rc +++ b/reactos/base/shell/explorer-new/lang/ru-RU.rc @@ -7,7 +7,7 @@ BEGIN POPUP "" BEGIN MENUITEM SEPARATOR - MENUITEM " ", ID_SHELL_CMD_OPEN_TASKMGR + MENUITEM " ", ID_SHELL_CMD_OPEN_TASKMGR MENUITEM SEPARATOR MENUITEM "& ", ID_LOCKTASKBAR MENUITEM "&", ID_SHELL_CMD_PROPERTIES diff --git a/reactos/base/shell/explorer-new/lang/uk-UA.rc b/reactos/base/shell/explorer-new/lang/uk-UA.rc index 71e96fe477a..0811238087d 100644 --- a/reactos/base/shell/explorer-new/lang/uk-UA.rc +++ b/reactos/base/shell/explorer-new/lang/uk-UA.rc @@ -13,7 +13,7 @@ BEGIN POPUP "" BEGIN MENUITEM SEPARATOR - MENUITEM " ", ID_SHELL_CMD_OPEN_TASKMGR + MENUITEM " ", ID_SHELL_CMD_OPEN_TASKMGR MENUITEM SEPARATOR MENUITEM "& ", ID_LOCKTASKBAR MENUITEM "&", ID_SHELL_CMD_PROPERTIES diff --git a/reactos/dll/win32/shell32/lang/ru-RU.rc b/reactos/dll/win32/shell32/lang/ru-RU.rc index c01ac6335da..62a4167f921 100644 --- a/reactos/dll/win32/shell32/lang/ru-RU.rc +++ b/reactos/dll/win32/shell32/lang/ru-RU.rc @@ -668,10 +668,10 @@ BEGIN IDS_LOGOFF_PROMPT "Do you want to log off?" /* Run File dialog */ - IDS_RUNDLG_ERROR "Unable to display Run File dialog box (internal error)" - IDS_RUNDLG_BROWSE_ERROR "Unable to display Browse dialog box (internal error)" - IDS_RUNDLG_BROWSE_CAPTION "Browse" - IDS_RUNDLG_BROWSE_FILTER "Executable Files (*.exe)\0*.exe\0All Files (*.*)\0*.*\0" + IDS_RUNDLG_ERROR " ( )" + IDS_RUNDLG_BROWSE_ERROR " ( )" + IDS_RUNDLG_BROWSE_CAPTION "" + IDS_RUNDLG_BROWSE_FILTER " (*.exe)\0*.exe\0 (*.*)\0*.*\0" /* shell folder path default values */ IDS_PROGRAMS " \\" @@ -722,8 +722,8 @@ BEGIN IDS_RECYCLEBIN_DISKSPACE " " IDS_EMPTY_BITBUCKET " " IDS_PICK_ICON_TITLE " " - IDS_PICK_ICON_FILTER " (*.ico, *.icl, *.exe, *.dll)\0*.ico;*.icl;*.exe;*.dll\0All Files (*.*)\0*.*\0" - IDS_OPEN_WITH_FILTER " (*.exe)\0*.exe\0All Files (*.*)\0*.*\0" + IDS_PICK_ICON_FILTER " (*.ico, *.icl, *.exe, *.dll)\0*.ico;*.icl;*.exe;*.dll\0 (*.*)\0*.*\0" + IDS_OPEN_WITH_FILTER " (*.exe)\0*.exe\0 (*.*)\0*.*\0" IDS_DIRECTORY "" IDS_VIRTUAL_DRIVER " " IDS_BAT_FILE " ReactOS" @@ -742,7 +742,7 @@ BEGIN IDS_SYS_FILE " " IDS_OPEN_VERB "" - IDS_EXPLORE_VERB "Explore" + IDS_EXPLORE_VERB " " IDS_RUNAS_VERB " " IDS_EDIT_VERB "" IDS_FIND_VERB "" diff --git a/reactos/dll/win32/shell32/lang/uk-UA.rc b/reactos/dll/win32/shell32/lang/uk-UA.rc index 772a268ebb7..181df04df91 100644 --- a/reactos/dll/win32/shell32/lang/uk-UA.rc +++ b/reactos/dll/win32/shell32/lang/uk-UA.rc @@ -682,10 +682,10 @@ BEGIN IDS_LOGOFF_PROMPT " ?" /* Run File dialog */ - IDS_RUNDLG_ERROR "Unable to display Run File dialog box (internal error)" - IDS_RUNDLG_BROWSE_ERROR "Unable to display Browse dialog box (internal error)" - IDS_RUNDLG_BROWSE_CAPTION "Browse" - IDS_RUNDLG_BROWSE_FILTER "Executable Files (*.exe)\0*.exe\0All Files (*.*)\0*.*\0" + IDS_RUNDLG_ERROR " ij ( )" + IDS_RUNDLG_BROWSE_ERROR " ij ( )" + IDS_RUNDLG_BROWSE_CAPTION "" + IDS_RUNDLG_BROWSE_FILTER " (*.exe)\0*.exe\0 (*.*)\0*.*\0" /* shell folder path default values */ IDS_PROGRAMS "Start Menu\\Programs" @@ -736,8 +736,8 @@ BEGIN IDS_RECYCLEBIN_DISKSPACE " " IDS_EMPTY_BITBUCKET " " IDS_PICK_ICON_TITLE " " - IDS_PICK_ICON_FILTER " (*.ico, *.icl, *.exe, *.dll)\0*.ico;*.icl;*.exe;*.dll\0All Files (*.*)\0*.*\0" - IDS_OPEN_WITH_FILTER " (*.exe)\0*.exe\0All Files (*.*)\0*.*\0" + IDS_PICK_ICON_FILTER " (*.ico, *.icl, *.exe, *.dll)\0*.ico;*.icl;*.exe;*.dll\0 (*.*)\0*.*\0" + IDS_OPEN_WITH_FILTER " (*.exe)\0*.exe\0 (*.*)\0*.*\0" IDS_DIRECTORY "" IDS_VIRTUAL_DRIVER " " IDS_BAT_FILE " ReactOS" @@ -756,7 +756,7 @@ BEGIN IDS_SYS_FILE " " IDS_OPEN_VERB "³" - IDS_EXPLORE_VERB "Explore" + IDS_EXPLORE_VERB "³ " IDS_RUNAS_VERB " " IDS_EDIT_VERB "" IDS_FIND_VERB "" From d58660ce714cfe52d744700ec0b54f385061f951 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Fri, 22 Apr 2011 14:09:21 +0000 Subject: [PATCH 193/317] [SERVICES] Lock the service database in order to protect it from concurrent access. svn path=/trunk/; revision=51427 --- reactos/base/system/services/rpcserver.c | 130 ++++++++++++++++------- 1 file changed, 90 insertions(+), 40 deletions(-) diff --git a/reactos/base/system/services/rpcserver.c b/reactos/base/system/services/rpcserver.c index 9c42b81cfa0..c1c717e79cd 100644 --- a/reactos/base/system/services/rpcserver.c +++ b/reactos/base/system/services/rpcserver.c @@ -455,6 +455,8 @@ DWORD RCloseServiceHandle( HeapFree(GetProcessHeap(), 0, hManager); hManager = NULL; + *hSCObject = NULL; + DPRINT("RCloseServiceHandle() done\n"); return ERROR_SUCCESS; } @@ -462,6 +464,9 @@ DWORD RCloseServiceHandle( { DPRINT("Found service handle\n"); + /* Lock the service database exlusively */ + ScmLockDatabaseExclusive(); + /* Get the pointer to the service record */ lpService = hService->ServiceEntry; @@ -491,6 +496,7 @@ DWORD RCloseServiceHandle( if (dwError != ERROR_SUCCESS) { DPRINT("Failed to open services key\n"); + ScmUnlockDatabase(); return dwError; } @@ -507,6 +513,7 @@ DWORD RCloseServiceHandle( { DPRINT("Deletion failed due to running dependencies.\n"); RegCloseKey(hServicesKey); + ScmUnlockDatabase(); return ERROR_SUCCESS; } @@ -522,6 +529,7 @@ DWORD RCloseServiceHandle( if (dwError != ERROR_SUCCESS) { DPRINT("Failed to Delete the Service Registry key\n"); + ScmUnlockDatabase(); return dwError; } @@ -530,6 +538,10 @@ DWORD RCloseServiceHandle( } } + ScmUnlockDatabase(); + + *hSCObject = NULL; + DPRINT("RCloseServiceHandle() done\n"); return ERROR_SUCCESS; } @@ -755,12 +767,14 @@ DWORD RDeleteService( return ERROR_INVALID_HANDLE; } - /* FIXME: Acquire service database lock exclusively */ + /* Lock the service database exclusively */ + ScmLockDatabaseExclusive(); if (lpService->bDeleted) { DPRINT("The service has already been marked for delete!\n"); - return ERROR_SERVICE_MARKED_FOR_DELETE; + dwError = ERROR_SERVICE_MARKED_FOR_DELETE; + goto Done; } /* Mark service for delete */ @@ -768,7 +782,9 @@ DWORD RDeleteService( dwError = ScmMarkServiceForDelete(lpService); - /* FIXME: Release service database lock */ +Done:; + /* Unlock the service database */ + ScmUnlockDatabase(); DPRINT("RDeleteService() done\n"); @@ -1047,6 +1063,7 @@ DWORD RQueryServiceStatus( return ERROR_INVALID_HANDLE; } + /* Lock the srevice database shared */ ScmLockDatabaseShared(); /* Return service status information */ @@ -1054,6 +1071,7 @@ DWORD RQueryServiceStatus( &lpService->Status, sizeof(SERVICE_STATUS)); + /* Unlock the service database */ ScmUnlockDatabase(); return ERROR_SUCCESS; @@ -1132,12 +1150,14 @@ DWORD RSetServiceStatus( return ERROR_INVALID_DATA; } + /* Lock the service database exclusively */ ScmLockDatabaseExclusive(); RtlCopyMemory(&lpService->Status, lpServiceStatus, sizeof(SERVICE_STATUS)); + /* Unlock the service database */ ScmUnlockDatabase(); DPRINT("Set %S to %lu\n", lpService->lpDisplayName, lpService->Status.dwCurrentState); @@ -1233,13 +1253,14 @@ DWORD RChangeServiceConfigW( return ERROR_INVALID_HANDLE; } - /* FIXME: Lock database exclusively */ + /* Lock the service database exclusively */ + ScmLockDatabaseExclusive(); if (lpService->bDeleted) { - /* FIXME: Unlock database */ DPRINT("The service has already been marked for delete!\n"); - return ERROR_SERVICE_MARKED_FOR_DELETE; + dwError = ERROR_SERVICE_MARKED_FOR_DELETE; + goto done; } /* Open the service key */ @@ -1406,12 +1427,13 @@ DWORD RChangeServiceConfigW( /* FIXME: Write password */ } - /* FIXME: Unlock database */ - done: if (hServiceKey != NULL) RegCloseKey(hServiceKey); + /* Unlock the service database */ + ScmUnlockDatabase(); + DPRINT("RChangeServiceConfigW() done (Error %lu)\n", dwError); return dwError; @@ -2326,7 +2348,8 @@ DWORD REnumServicesStatusW( if (lpResumeHandle) dwLastResumeCount = *lpResumeHandle; - /* FIXME: Lock the service list shared */ + /* Lock the service database shared */ + ScmLockDatabaseShared(); lpService = ScmGetServiceEntryByResumeCount(dwLastResumeCount); if (lpService == NULL) @@ -2464,7 +2487,8 @@ DWORD REnumServicesStatusW( } Done:; - /* FIXME: Unlock the service list */ + /* Unlock the service database */ + ScmUnlockDatabase(); DPRINT("REnumServicesStatusW() done (Error %lu)\n", dwError); @@ -2532,7 +2556,7 @@ DWORD ROpenServiceW( PSERVICE lpService; PMANAGER_HANDLE hManager; SC_HANDLE hHandle; - DWORD dwError; + DWORD dwError = ERROR_SUCCESS; DPRINT("ROpenServiceW() called\n"); DPRINT("hSCManager = %p\n", hSCManager); @@ -2556,14 +2580,16 @@ DWORD ROpenServiceW( if (!lpServiceName) return ERROR_INVALID_ADDRESS; - /* FIXME: Lock the service list */ + /* Lock the service database exclusive */ + ScmLockDatabaseExclusive(); /* Get service database entry */ lpService = ScmGetServiceEntryByName(lpServiceName); if (lpService == NULL) { DPRINT("Could not find a service!\n"); - return ERROR_SERVICE_DOES_NOT_EXIST; + dwError = ERROR_SERVICE_DOES_NOT_EXIST; + goto Done; } /* Create a service handle */ @@ -2572,7 +2598,7 @@ DWORD ROpenServiceW( if (dwError != ERROR_SUCCESS) { DPRINT("ScmCreateServiceHandle() failed (Error %lu)\n", dwError); - return dwError; + goto Done; } /* Check the desired access */ @@ -2582,7 +2608,7 @@ DWORD ROpenServiceW( { DPRINT("ScmCheckAccess() failed (Error %lu)\n", dwError); HeapFree(GetProcessHeap(), 0, hHandle); - return dwError; + goto Done; } lpService->dwRefCount++; @@ -2591,9 +2617,13 @@ DWORD ROpenServiceW( *lpServiceHandle = (SC_RPC_HANDLE)hHandle; DPRINT("*hService = %p\n", *lpServiceHandle); +Done:; + /* Unlock the service database */ + ScmUnlockDatabase(); + DPRINT("ROpenServiceW() done\n"); - return ERROR_SUCCESS; + return dwError; } @@ -2644,7 +2674,8 @@ DWORD RQueryServiceConfigW( return ERROR_INVALID_HANDLE; } - /* FIXME: Lock the service database shared */ + /* Lock the service database shared */ + ScmLockDatabaseShared(); dwError = ScmOpenServiceKey(lpService->lpServiceName, KEY_READ, @@ -2784,6 +2815,9 @@ DWORD RQueryServiceConfigW( *pcbBytesNeeded = dwRequiredSize; Done:; + /* Unlock the service database */ + ScmUnlockDatabase(); + if (lpImagePath != NULL) HeapFree(GetProcessHeap(), 0, lpImagePath); @@ -2796,8 +2830,6 @@ Done:; if (hServiceKey != NULL) RegCloseKey(hServiceKey); - /* FIXME: Unlock the service database */ - DPRINT("RQueryServiceConfigW() done\n"); return dwError; @@ -3078,13 +3110,14 @@ DWORD RChangeServiceConfigA( return ERROR_INVALID_HANDLE; } - /* FIXME: Lock database exclusively */ + /* Lock the service database exclusively */ + ScmLockDatabaseExclusive(); if (lpService->bDeleted) { - /* FIXME: Unlock database */ DPRINT("The service has already been marked for delete!\n"); - return ERROR_SERVICE_MARKED_FOR_DELETE; + dwError = ERROR_SERVICE_MARKED_FOR_DELETE; + goto done; } /* Open the service key */ @@ -3299,9 +3332,10 @@ DWORD RChangeServiceConfigA( /* FIXME: Write password */ } - /* FIXME: Unlock database */ - done: + /* Unlock the service database */ + ScmUnlockDatabase(); + if (hServiceKey != NULL) RegCloseKey(hServiceKey); @@ -3822,7 +3856,8 @@ DWORD RQueryServiceConfigA( return ERROR_INVALID_HANDLE; } - /* FIXME: Lock the service database shared */ + /* Lock the service database shared */ + ScmLockDatabaseShared(); dwError = ScmOpenServiceKey(lpService->lpServiceName, KEY_READ, @@ -3995,6 +4030,9 @@ DWORD RQueryServiceConfigA( *pcbBytesNeeded = dwRequiredSize; Done:; + /* Unlock the service database */ + ScmUnlockDatabase(); + if (lpImagePath != NULL) HeapFree(GetProcessHeap(), 0, lpImagePath); @@ -4007,8 +4045,6 @@ Done:; if (hServiceKey != NULL) RegCloseKey(hServiceKey); - /* FIXME: Unlock the service database */ - DPRINT("RQueryServiceConfigA() done\n"); return dwError; @@ -4444,13 +4480,14 @@ DWORD RChangeServiceConfig2W( return ERROR_INVALID_HANDLE; } - /* FIXME: Lock database exclusively */ + /* Lock the service database exclusively */ + ScmLockDatabaseExclusive(); if (lpService->bDeleted) { - /* FIXME: Unlock database */ DPRINT("The service has already been marked for delete!\n"); - return ERROR_SERVICE_MARKED_FOR_DELETE; + dwError = ERROR_SERVICE_MARKED_FOR_DELETE; + goto done; } /* Open the service key */ @@ -4490,7 +4527,9 @@ DWORD RChangeServiceConfig2W( } done: - /* FIXME: Unlock database */ + /* Unlock the service database */ + ScmUnlockDatabase(); + if (hServiceKey != NULL) RegCloseKey(hServiceKey); @@ -4545,7 +4584,8 @@ DWORD RQueryServiceConfig2A( return ERROR_INVALID_HANDLE; } - /* FIXME: Lock the service database shared */ + /* Lock the service database shared */ + ScmLockDatabaseShared(); dwError = ScmOpenServiceKey(lpService->lpServiceName, KEY_READ, @@ -4603,14 +4643,15 @@ DWORD RQueryServiceConfig2A( } done: + /* Unlock the service database */ + ScmUnlockDatabase(); + if (lpDescription != NULL) HeapFree(GetProcessHeap(), 0, lpDescription); if (hServiceKey != NULL) RegCloseKey(hServiceKey); - /* FIXME: Unlock database */ - DPRINT("RQueryServiceConfig2W() done (Error %lu)\n", dwError); return dwError; @@ -4663,7 +4704,8 @@ DWORD RQueryServiceConfig2W( return ERROR_INVALID_HANDLE; } - /* FIXME: Lock the service database shared */ + /* Lock the service database shared */ + ScmLockDatabaseShared(); dwError = ScmOpenServiceKey(lpService->lpServiceName, KEY_READ, @@ -4759,6 +4801,9 @@ DWORD RQueryServiceConfig2W( } done: + /* Unlock the service database */ + ScmUnlockDatabase(); + if (lpDescription != NULL) HeapFree(GetProcessHeap(), 0, lpDescription); @@ -4771,8 +4816,6 @@ done: if (hServiceKey != NULL) RegCloseKey(hServiceKey); - /* FIXME: Unlock database */ - DPRINT("RQueryServiceConfig2W() done (Error %lu)\n", dwError); return dwError; @@ -4825,6 +4868,9 @@ DWORD RQueryServiceStatusEx( return ERROR_INVALID_HANDLE; } + /* Lock the service database shared */ + ScmLockDatabaseShared(); + lpStatus = (LPSERVICE_STATUS_PROCESS)lpBuffer; /* Return service status information */ @@ -4835,6 +4881,9 @@ DWORD RQueryServiceStatusEx( lpStatus->dwProcessId = lpService->ProcessId; /* FIXME */ lpStatus->dwServiceFlags = 0; /* FIXME */ + /* Unlock the service database */ + ScmUnlockDatabase(); + return ERROR_SUCCESS; } @@ -5028,9 +5077,10 @@ DWORD REnumServicesStatusExW( return ERROR_ACCESS_DENIED; } - if (lpResumeIndex) dwLastResumeCount = *lpResumeIndex; + if (lpResumeIndex) + dwLastResumeCount = *lpResumeIndex; - /* Lock the service list shared */ + /* FIXME: Lock the service list shared */ lpService = ScmGetServiceEntryByResumeCount(dwLastResumeCount); if (lpService == NULL) @@ -5232,7 +5282,7 @@ DWORD REnumServicesStatusExW( } Done:; - /* Unlock the service list */ + /* FIXME: Unlock the service list */ DPRINT("REnumServicesStatusExW() done (Error %lu)\n", dwError); From d05dbec4a3d9914c615c5ad667c57266bb280827 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Fri, 22 Apr 2011 14:23:49 +0000 Subject: [PATCH 194/317] [NETID] * Use EDITTEXT instead of LTEXT. Patch by Edijs Kolesnikovics See issue #6129 for more details. svn path=/trunk/; revision=51428 --- reactos/dll/win32/netid/lang/bg-BG.rc | 4 ++-- reactos/dll/win32/netid/lang/cs-CZ.rc | 4 ++-- reactos/dll/win32/netid/lang/de-DE.rc | 4 ++-- reactos/dll/win32/netid/lang/el-GR.rc | 4 ++-- reactos/dll/win32/netid/lang/en-US.rc | 4 ++-- reactos/dll/win32/netid/lang/es-ES.rc | 4 ++-- reactos/dll/win32/netid/lang/fr-FR.rc | 4 ++-- reactos/dll/win32/netid/lang/id-ID.rc | 4 ++-- reactos/dll/win32/netid/lang/it-IT.rc | 4 ++-- reactos/dll/win32/netid/lang/ja-JP.rc | 4 ++-- reactos/dll/win32/netid/lang/nl-NL.rc | 4 ++-- reactos/dll/win32/netid/lang/no-NO.rc | 4 ++-- reactos/dll/win32/netid/lang/pl-PL.rc | 4 ++-- reactos/dll/win32/netid/lang/ru-RU.rc | 4 ++-- reactos/dll/win32/netid/lang/sk-SK.rc | 4 ++-- reactos/dll/win32/netid/lang/uk-UA.rc | 4 ++-- 16 files changed, 32 insertions(+), 32 deletions(-) diff --git a/reactos/dll/win32/netid/lang/bg-BG.rc b/reactos/dll/win32/netid/lang/bg-BG.rc index fab90537574..715f542dcc8 100644 --- a/reactos/dll/win32/netid/lang/bg-BG.rc +++ b/reactos/dll/win32/netid/lang/bg-BG.rc @@ -10,9 +10,9 @@ BEGIN LTEXT " :", IDC_STATIC, 6, 40, 90, 9 EDITTEXT IDC_COMPDESC, 98, 38, 146, 13, WS_CHILD | WS_VISIBLE | WS_TABSTOP LTEXT " :", IDC_STATIC, 6, 68, 94, 9 - LTEXT "()", IDC_COMPUTERNAME, 100, 68, 144, 11 + EDITTEXT IDC_COMPUTERNAME, 98, 68, 144, 12, ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP LTEXT " :", IDC_WORKGROUPDOMAIN, 6, 84, 94, 9 - LTEXT "()", IDC_WORKGROUPDOMAIN_NAME, 100, 84, 144, 9 + EDITTEXT IDC_WORKGROUPDOMAIN_NAME, 98, 84, 144, 12, ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP LTEXT " , ....", IDC_STATIC, 6, 108, 172, 24 PUSHBUTTON "& ...", IDC_NETWORK_ID, 170, 114, 85, 15 LTEXT " , .", IDC_STATIC, 6, 149, 170, 24 diff --git a/reactos/dll/win32/netid/lang/cs-CZ.rc b/reactos/dll/win32/netid/lang/cs-CZ.rc index f6a857744d6..5484b737f8d 100644 --- a/reactos/dll/win32/netid/lang/cs-CZ.rc +++ b/reactos/dll/win32/netid/lang/cs-CZ.rc @@ -15,9 +15,9 @@ BEGIN LTEXT "Popis potae:", IDC_STATIC, 6, 40, 90, 9 EDITTEXT IDC_COMPDESC, 98, 38, 146, 13, WS_CHILD | WS_VISIBLE | WS_TABSTOP LTEXT "pln nzev potae:", IDC_STATIC, 6, 68, 85, 9 - LTEXT "(Implicitn)", IDC_COMPUTERNAME, 98, 68, 144, 11 + EDITTEXT IDC_COMPUTERNAME, 98, 68, 144, 12, ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP LTEXT "Pracovn skupina:", IDC_WORKGROUPDOMAIN, 6, 84, 64, 9 - LTEXT "(przdn)", IDC_WORKGROUPDOMAIN_NAME, 98, 84, 144, 9 + EDITTEXT IDC_WORKGROUPDOMAIN_NAME, 98, 84, 144, 12, ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP LTEXT "Kliknutm na ""Sov ID"" lze pout Prvodce sovou identifikac k pipojen se k domn a vytvoen mstnho uivatele.", IDC_STATIC, 6, 113, 172, 24 PUSHBUTTON "&Sov ID...", IDC_NETWORK_ID, 190, 114, 58, 15 //FIXME nic vic nez "sitova ID" se nevejde na tlacitko! LTEXT "Kliknutm na ""Zmnit"" lze pejmenovat tento pota nebo se pipojit k domn.", IDC_STATIC, 6, 149, 170, 17 diff --git a/reactos/dll/win32/netid/lang/de-DE.rc b/reactos/dll/win32/netid/lang/de-DE.rc index 920658c8459..b27f943f0eb 100644 --- a/reactos/dll/win32/netid/lang/de-DE.rc +++ b/reactos/dll/win32/netid/lang/de-DE.rc @@ -18,9 +18,9 @@ BEGIN LTEXT "Computerbeschreibung:", IDC_STATIC, 6, 40, 80, 9 EDITTEXT IDC_COMPDESC, 98, 38, 146, 13, WS_CHILD | WS_VISIBLE | WS_TABSTOP LTEXT "Computername:", IDC_STATIC, 6, 68, 64, 9 - LTEXT "(Standard)", IDC_COMPUTERNAME, 98, 68, 144, 11 + EDITTEXT IDC_COMPUTERNAME, 98, 68, 144, 12, ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP LTEXT "Arbeitsgruppe:", IDC_WORKGROUPDOMAIN, 6, 84, 64, 9 - LTEXT "(leer)", IDC_WORKGROUPDOMAIN_NAME, 98, 84, 144, 9 + EDITTEXT IDC_WORKGROUPDOMAIN_NAME, 98, 84, 144, 12, ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP LTEXT "Um den Netzwerk-Identifikations-Assistenten zum Anmelden an einer Domne und dem Erstellen eines lokalen Benutzers aufzurufen, klicken Sie auf ""Netzwerk-ID"".", IDC_STATIC, 6, 108, 172, 32 PUSHBUTTON "&Netzwerk-ID...", IDC_NETWORK_ID, 190, 114, 58, 15 LTEXT "Um diesen Computer umzubenennen oder sich an einer Domne anzumelden, klicken Sie auf ""ndern"".", IDC_STATIC, 6, 149, 170, 17 diff --git a/reactos/dll/win32/netid/lang/el-GR.rc b/reactos/dll/win32/netid/lang/el-GR.rc index 09c43174f65..ef447d8bd19 100644 --- a/reactos/dll/win32/netid/lang/el-GR.rc +++ b/reactos/dll/win32/netid/lang/el-GR.rc @@ -10,9 +10,9 @@ BEGIN LTEXT " :", IDC_STATIC, 6, 40, 70, 9 EDITTEXT IDC_COMPDESC, 98, 38, 146, 13, WS_CHILD | WS_VISIBLE | WS_TABSTOP LTEXT " :", IDC_STATIC, 6, 68, 64, 9 - LTEXT "()", IDC_COMPUTERNAME, 98, 68, 144, 11 + EDITTEXT IDC_COMPUTERNAME, 98, 68, 144, 12, ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP LTEXT " :", IDC_WORKGROUPDOMAIN, 6, 84, 64, 9 - LTEXT "()", IDC_WORKGROUPDOMAIN_NAME, 98, 84, 144, 9 + EDITTEXT IDC_WORKGROUPDOMAIN_NAME, 98, 84, 144, 12, ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP LTEXT " Network Identfication domain , ""Network ID"".", IDC_STATIC, 6, 108, 172, 24 PUSHBUTTON "&Network ID...", IDC_NETWORK_ID, 190, 114, 58, 15 LTEXT " , """".", IDC_STATIC, 6, 149, 170, 17 diff --git a/reactos/dll/win32/netid/lang/en-US.rc b/reactos/dll/win32/netid/lang/en-US.rc index fc9064053e6..17ffa82e340 100644 --- a/reactos/dll/win32/netid/lang/en-US.rc +++ b/reactos/dll/win32/netid/lang/en-US.rc @@ -10,9 +10,9 @@ BEGIN LTEXT "Computer Description:", IDC_STATIC, 6, 40, 90, 9 EDITTEXT IDC_COMPDESC, 98, 38, 146, 13, WS_CHILD | WS_VISIBLE | WS_TABSTOP LTEXT "Full computer name:", IDC_STATIC, 6, 68, 85, 9 - LTEXT "(Default)", IDC_COMPUTERNAME, 98, 68, 144, 11 + EDITTEXT IDC_COMPUTERNAME, 98, 68, 144, 12, ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP LTEXT "Workgroup:", IDC_WORKGROUPDOMAIN, 6, 84, 64, 9 - LTEXT "(empty)", IDC_WORKGROUPDOMAIN_NAME, 98, 84, 144, 9 + EDITTEXT IDC_WORKGROUPDOMAIN_NAME, 98, 84, 144, 12, ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP LTEXT "To use the Network Identfication Wizard to join a domain and create a local user, click ""Network ID"".", IDC_STATIC, 6, 113, 172, 24 PUSHBUTTON "&Network ID...", IDC_NETWORK_ID, 190, 114, 58, 15 LTEXT "To rename this computer or join a domain, click ""Change"".", IDC_STATIC, 6, 149, 170, 17 diff --git a/reactos/dll/win32/netid/lang/es-ES.rc b/reactos/dll/win32/netid/lang/es-ES.rc index 1fedc9f35b2..7c2c8ca6c6b 100644 --- a/reactos/dll/win32/netid/lang/es-ES.rc +++ b/reactos/dll/win32/netid/lang/es-ES.rc @@ -15,9 +15,9 @@ BEGIN LTEXT "Descripcin del equipo:", IDC_STATIC, 6, 40, 85, 9 EDITTEXT IDC_COMPDESC, 98, 38, 146, 13, WS_CHILD | WS_VISIBLE | WS_TABSTOP LTEXT "Nombre completo del equipo:", IDC_STATIC, 6, 66, 64, 16 - LTEXT "(Defecto)", IDC_COMPUTERNAME, 98, 68, 144, 11 + EDITTEXT IDC_COMPUTERNAME, 98, 68, 144, 12, ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP LTEXT "Grupo de trabajo:", IDC_WORKGROUPDOMAIN, 6, 84, 64, 9 - LTEXT "(vaco)", IDC_WORKGROUPDOMAIN_NAME, 98, 84, 144, 9 + EDITTEXT IDC_WORKGROUPDOMAIN_NAME, 98, 84, 144, 12, ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP LTEXT "Para usar el Asistente para identificacin de red para unirse a un dominio y crear una cuenta de usuario local, haga clic en ""Id de red"".", IDC_STATIC, 6, 108, 172, 24 PUSHBUTTON "&Id de red...", IDC_NETWORK_ID, 190, 114, 58, 15 LTEXT "Para cambiar el nombre de este equipo o unirse a un dominio, haga clic en ""Cambiar"".", IDC_STATIC, 6, 149, 170, 17 diff --git a/reactos/dll/win32/netid/lang/fr-FR.rc b/reactos/dll/win32/netid/lang/fr-FR.rc index ee2f5c62f09..2a3657fdac5 100644 --- a/reactos/dll/win32/netid/lang/fr-FR.rc +++ b/reactos/dll/win32/netid/lang/fr-FR.rc @@ -10,9 +10,9 @@ BEGIN LTEXT "Description de l'ordinateur :", IDC_STATIC, 6, 40, 70, 9 EDITTEXT IDC_COMPDESC, 98, 38, 146, 13, WS_CHILD | WS_VISIBLE | WS_TABSTOP LTEXT "Nom complet de l'ordinateur :", IDC_STATIC, 6, 68, 64, 9 - LTEXT "(Dfaut)", IDC_COMPUTERNAME, 98, 68, 144, 11 + EDITTEXT IDC_COMPUTERNAME, 98, 68, 144, 12, ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP LTEXT "Groupe de travail :", IDC_WORKGROUPDOMAIN, 6, 84, 64, 9 - LTEXT "(Vide)", IDC_WORKGROUPDOMAIN_NAME, 98, 84, 144, 9 + EDITTEXT IDC_WORKGROUPDOMAIN_NAME, 98, 84, 144, 12, ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP LTEXT "Pour utiliser l'Assistant Rseau, afin de rejoindre un domaine ou crer un utilisateur local, cliquez sur Identification Rseau.", IDC_STATIC, 6, 108, 172, 24 PUSHBUTTON "&Identification &rseau...", IDC_NETWORK_ID, 190, 114, 58, 15 LTEXT "Pour changer le nom de cet ordinateur ou rejoindre un domaine, cliquez sur Changer.", IDC_STATIC, 6, 149, 170, 17 diff --git a/reactos/dll/win32/netid/lang/id-ID.rc b/reactos/dll/win32/netid/lang/id-ID.rc index 465d36d523d..e9c9eea1624 100644 --- a/reactos/dll/win32/netid/lang/id-ID.rc +++ b/reactos/dll/win32/netid/lang/id-ID.rc @@ -10,9 +10,9 @@ BEGIN LTEXT "Deskripsi Komputer:", IDC_STATIC, 6, 40, 70, 9 EDITTEXT IDC_COMPDESC, 98, 38, 146, 13, WS_CHILD | WS_VISIBLE | WS_TABSTOP LTEXT "Nama lengkap komputer:", IDC_STATIC, 6, 68, 64, 9 - LTEXT "(Standar)", IDC_COMPUTERNAME, 98, 68, 144, 11 + EDITTEXT IDC_COMPUTERNAME, 98, 68, 144, 12, ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP LTEXT "Workgroup:", IDC_WORKGROUPDOMAIN, 6, 84, 64, 9 - LTEXT "(kosong)", IDC_WORKGROUPDOMAIN_NAME, 98, 84, 144, 9 + EDITTEXT IDC_WORKGROUPDOMAIN_NAME, 98, 84, 144, 12, ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP LTEXT "Untuk menggunakan Bimbingan Identifikasi Jaringan untuk bergabung dengan domain dan membuat pengguna lokal, klik ""Network ID"".", IDC_STATIC, 6, 108, 172, 24 PUSHBUTTON "&Network ID...", IDC_NETWORK_ID, 190, 114, 58, 15 LTEXT "Untuk mengganti nama komputer ini atau bergabung dengan domain, klik ""Ubah"".", IDC_STATIC, 6, 149, 170, 17 diff --git a/reactos/dll/win32/netid/lang/it-IT.rc b/reactos/dll/win32/netid/lang/it-IT.rc index e9c823310fb..85d4ffb15a8 100644 --- a/reactos/dll/win32/netid/lang/it-IT.rc +++ b/reactos/dll/win32/netid/lang/it-IT.rc @@ -11,9 +11,9 @@ BEGIN LTEXT "Descrizione del computer:", IDC_STATIC, 6, 37, 78, 16 EDITTEXT IDC_COMPDESC, 98, 38, 146, 13, WS_CHILD | WS_VISIBLE | WS_TABSTOP LTEXT "Nome esteso del computer:", IDC_STATIC, 6, 67, 78, 16 - LTEXT "(Predefinito)", IDC_COMPUTERNAME, 98, 68, 144, 11 + EDITTEXT IDC_COMPUTERNAME, 98, 68, 144, 12, ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP LTEXT "Gruppo di lavoro:", IDC_WORKGROUPDOMAIN, 6, 84, 64, 9 - LTEXT "(vuoto)", IDC_WORKGROUPDOMAIN_NAME, 98, 84, 144, 9 + EDITTEXT IDC_WORKGROUPDOMAIN_NAME, 98, 84, 144, 12, ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP LTEXT "Per usare il wizard per la Identificazione in rete per collegarsi a un dominio e creare un utente locale, click ""Network ID"".", IDC_STATIC, 6, 108, 172, 24 PUSHBUTTON "&ID di rete...", IDC_NETWORK_ID, 190, 114, 58, 15 LTEXT "Per cambiare il nome a questo computer o collegarsi a un dominio, clicca ""Modifica"".", IDC_STATIC, 6, 149, 170, 17 diff --git a/reactos/dll/win32/netid/lang/ja-JP.rc b/reactos/dll/win32/netid/lang/ja-JP.rc index 7af040427b6..736172b8e72 100644 --- a/reactos/dll/win32/netid/lang/ja-JP.rc +++ b/reactos/dll/win32/netid/lang/ja-JP.rc @@ -10,9 +10,9 @@ BEGIN LTEXT "Rs[^̐:", IDC_STATIC, 6, 40, 90, 9 EDITTEXT IDC_COMPDESC, 98, 38, 146, 13, WS_CHILD | WS_VISIBLE | WS_TABSTOP LTEXT "t Rs[^:", IDC_STATIC, 6, 68, 85, 9 - LTEXT "(l)", IDC_COMPUTERNAME, 98, 68, 144, 11 + EDITTEXT IDC_COMPUTERNAME, 98, 68, 144, 12, ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP LTEXT "[NO[v:", IDC_WORKGROUPDOMAIN, 6, 84, 64, 9 - LTEXT "(Ȃ)", IDC_WORKGROUPDOMAIN_NAME, 98, 84, 144, 9 + EDITTEXT IDC_WORKGROUPDOMAIN_NAME, 98, 84, 144, 12, ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP LTEXT "lbg[N ID EBU[hgăhCւ̎Qу[J [U[̍쐬sɂ́A[lbg[N ID] NbNĂB", IDC_STATIC, 6, 113, 172, 24 PUSHBUTTON "lbg[N ID(&N)...", IDC_NETWORK_ID, 190, 114, 58, 15 LTEXT "Rs[^ύXhCɎQ肷ɂ [ύX] NbNĂB", IDC_STATIC, 6, 149, 170, 17 diff --git a/reactos/dll/win32/netid/lang/nl-NL.rc b/reactos/dll/win32/netid/lang/nl-NL.rc index 1e9c591ba73..116324a59c5 100644 --- a/reactos/dll/win32/netid/lang/nl-NL.rc +++ b/reactos/dll/win32/netid/lang/nl-NL.rc @@ -10,9 +10,9 @@ BEGIN LTEXT "Computerbeschrijving:", IDC_STATIC, 6, 40, 90, 9 EDITTEXT IDC_COMPDESC, 98, 38, 146, 13, WS_CHILD | WS_VISIBLE | WS_TABSTOP LTEXT "Volledige computernaam:", IDC_STATIC, 6, 68, 85, 9 - LTEXT "(Standaard)", IDC_COMPUTERNAME, 98, 68, 144, 11 + EDITTEXT IDC_COMPUTERNAME, 98, 68, 144, 12, ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP LTEXT "Werkgroep:", IDC_WORKGROUPDOMAIN, 6, 84, 64, 9 - LTEXT "(leeg)", IDC_WORKGROUPDOMAIN_NAME, 98, 84, 144, 9 + EDITTEXT IDC_WORKGROUPDOMAIN_NAME, 98, 84, 144, 12, ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP LTEXT "Om de Netwerk Indentificatie wizard te gebruiken, word lid van een domein en maak een lokale gebruiker aan en klik op ""Network ID"".", IDC_STATIC, 6, 113, 172, 24 PUSHBUTTON "&Netwerk ID...", IDC_NETWORK_ID, 190, 114, 58, 15 LTEXT "Om deze computer te hernoemen of om lid te worden van een domein, klik op ""Change"".", IDC_STATIC, 6, 149, 170, 17 diff --git a/reactos/dll/win32/netid/lang/no-NO.rc b/reactos/dll/win32/netid/lang/no-NO.rc index b07ad3dd4df..005096b82c7 100644 --- a/reactos/dll/win32/netid/lang/no-NO.rc +++ b/reactos/dll/win32/netid/lang/no-NO.rc @@ -10,9 +10,9 @@ BEGIN LTEXT "Beskrivelse av datamaskinen:", IDC_STATIC, 6, 40, 135, 9 EDITTEXT IDC_COMPDESC, 110, 38, 136, 13, WS_CHILD | WS_VISIBLE | WS_TABSTOP LTEXT "Fullt datamaskinnavn:", IDC_STATIC, 6, 68, 85, 9 - LTEXT "(Standard)", IDC_COMPUTERNAME, 110, 68, 144, 11 + EDITTEXT IDC_COMPUTERNAME, 98, 68, 144, 12, ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP LTEXT "Arbeidsgruppe:", IDC_WORKGROUPDOMAIN, 6, 84, 64, 9 - LTEXT "(Tom)", IDC_WORKGROUPDOMAIN_NAME, 110, 84, 144, 9 + EDITTEXT IDC_WORKGROUPDOMAIN_NAME, 98, 84, 144, 12, ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP LTEXT "Klikk nettverks-ID for bruke veiviseren for nettverksidentifikasjon til bli med i et domene og opprette en lokal brukerkonto.", IDC_STATIC, 6, 113, 172, 24 PUSHBUTTON "&Nettverk-ID...", IDC_NETWORK_ID, 190, 114, 58, 15 LTEXT "Klikk Endre for gi datamaskinen et nytt navn eller bli med i et domenet.", IDC_STATIC, 6, 149, 170, 17 diff --git a/reactos/dll/win32/netid/lang/pl-PL.rc b/reactos/dll/win32/netid/lang/pl-PL.rc index 48646ad67ac..30bf2adc226 100644 --- a/reactos/dll/win32/netid/lang/pl-PL.rc +++ b/reactos/dll/win32/netid/lang/pl-PL.rc @@ -18,9 +18,9 @@ BEGIN LTEXT "Opis komputera:", IDC_STATIC, 6, 40, 70, 9 EDITTEXT IDC_COMPDESC, 98, 38, 146, 13, WS_CHILD | WS_VISIBLE | WS_TABSTOP LTEXT "Pena nazwa komputera:", IDC_STATIC, 6, 68, 64, 9 - LTEXT "(domylna)", IDC_COMPUTERNAME, 98, 68, 144, 11 + EDITTEXT IDC_COMPUTERNAME, 98, 68, 144, 12, ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP LTEXT "Grupa robocza:", IDC_WORKGROUPDOMAIN, 6, 84, 64, 9 - LTEXT "(pusta)", IDC_WORKGROUPDOMAIN_NAME, 98, 84, 144, 9 + EDITTEXT IDC_WORKGROUPDOMAIN_NAME, 98, 84, 144, 12, ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP LTEXT "Aby uy Kreatora identyfikacji sieciowej do doczenia do domeny i stworzy lokalnego uytkownika, wcinij ID sieciowe.", IDC_STATIC, 6, 108, 172, 24 PUSHBUTTON "&ID sieciowe...", IDC_NETWORK_ID, 190, 114, 58, 15 LTEXT "Aby zmieni nazw tego komputera lub przyczy si do grupy roboczej, kliknij przycisk Zmie.", IDC_STATIC, 6, 149, 170, 17 diff --git a/reactos/dll/win32/netid/lang/ru-RU.rc b/reactos/dll/win32/netid/lang/ru-RU.rc index 946b09f1932..df4d340d2b4 100644 --- a/reactos/dll/win32/netid/lang/ru-RU.rc +++ b/reactos/dll/win32/netid/lang/ru-RU.rc @@ -10,9 +10,9 @@ BEGIN LTEXT ":", IDC_STATIC, 6, 40, 70, 9 EDITTEXT IDC_COMPDESC, 98, 38, 146, 13, WS_CHILD | WS_VISIBLE | WS_TABSTOP LTEXT " :", IDC_STATIC, 6, 68, 64, 9 - LTEXT "( )", IDC_COMPUTERNAME, 98, 68, 144, 11 + EDITTEXT IDC_COMPUTERNAME, 98, 68, 144, 12, ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP LTEXT " :", IDC_WORKGROUPDOMAIN, 6, 84, 64, 9 - LTEXT "()", IDC_WORKGROUPDOMAIN_NAME, 98, 84, 144, 9 + EDITTEXT IDC_WORKGROUPDOMAIN_NAME, 98, 84, 144, 12, ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP LTEXT " , """".", IDC_STATIC, 6, 113, 172, 24 PUSHBUTTON "&...", IDC_NETWORK_ID, 180, 114, 72, 15 LTEXT " """".", IDC_STATIC, 6, 149, 170, 17 diff --git a/reactos/dll/win32/netid/lang/sk-SK.rc b/reactos/dll/win32/netid/lang/sk-SK.rc index 63d34fb760b..025fece2714 100644 --- a/reactos/dll/win32/netid/lang/sk-SK.rc +++ b/reactos/dll/win32/netid/lang/sk-SK.rc @@ -17,9 +17,9 @@ BEGIN LTEXT "&Popis potaa:", IDC_STATIC, 6, 40, 70, 9 EDITTEXT IDC_COMPDESC, 98, 38, 146, 13, WS_CHILD | WS_VISIBLE | WS_TABSTOP LTEXT "pln nzov potaa:", IDC_STATIC, 6, 68, 75, 9 - LTEXT "(Predvolen)", IDC_COMPUTERNAME, 98, 68, 144, 11 + EDITTEXT IDC_COMPUTERNAME, 98, 68, 144, 12, ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP LTEXT "Pracovn skupina:", IDC_WORKGROUPDOMAIN, 6, 84, 70, 9 - LTEXT "(przdne)", IDC_WORKGROUPDOMAIN_NAME, 98, 84, 144, 9 + EDITTEXT IDC_WORKGROUPDOMAIN_NAME, 98, 84, 144, 12, ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP LTEXT "Ak sa chcete pripoji pomocou Sprievodcu identifikciou v sieti na domnu a vytvori loklne pouvatesk konto, kliknite na tlaidlo Sieov identifikcia.", IDC_STATIC, 6, 108, 160, 33 PUSHBUTTON "&Sieov identifikcia", IDC_NETWORK_ID, 176, 114, 72, 15 LTEXT "Ak chcete zmeni nzov potaa alebo sa pripoji na domnu, kliknite na tlaidlo Zmeni.", IDC_STATIC, 6, 149, 160, 17 diff --git a/reactos/dll/win32/netid/lang/uk-UA.rc b/reactos/dll/win32/netid/lang/uk-UA.rc index 134217eecf4..72dbe3a7465 100644 --- a/reactos/dll/win32/netid/lang/uk-UA.rc +++ b/reactos/dll/win32/netid/lang/uk-UA.rc @@ -18,9 +18,9 @@ BEGIN LTEXT ":", IDC_STATIC, 6, 40, 70, 9 EDITTEXT IDC_COMPDESC, 98, 38, 146, 13, WS_CHILD | WS_VISIBLE | WS_TABSTOP LTEXT " ':", IDC_STATIC, 6, 68, 64, 9 - LTEXT "( )", IDC_COMPUTERNAME, 98, 68, 144, 11 + EDITTEXT IDC_COMPUTERNAME, 98, 68, 144, 12, ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP LTEXT " :", IDC_WORKGROUPDOMAIN, 6, 84, 64, 9 - LTEXT "()", IDC_WORKGROUPDOMAIN_NAME, 98, 84, 144, 9 + EDITTEXT IDC_WORKGROUPDOMAIN_NAME, 98, 84, 144, 12, ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP LTEXT " , """".", IDC_STATIC, 6, 108, 172, 32 PUSHBUTTON "&...", IDC_NETWORK_ID, 190, 114, 60, 15 LTEXT " ' , """".", IDC_STATIC, 6, 149, 170, 17 From 63bd3c88e9a42409aaea5734957e97362d9241f6 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Fri, 22 Apr 2011 15:18:31 +0000 Subject: [PATCH 195/317] [SERVICES] RChangeServiceConfig2W: Use the error code of a call to RegSetValueExW. svn path=/trunk/; revision=51429 --- reactos/base/system/services/rpcserver.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/reactos/base/system/services/rpcserver.c b/reactos/base/system/services/rpcserver.c index c1c717e79cd..8e5da237f53 100644 --- a/reactos/base/system/services/rpcserver.c +++ b/reactos/base/system/services/rpcserver.c @@ -4508,13 +4508,12 @@ DWORD RChangeServiceConfig2W( lpServiceDescription->lpDescription != NULL) { DPRINT("Setting value %S\n", lpServiceDescription->lpDescription); - RegSetValueExW(hServiceKey, - L"Description", - 0, - REG_SZ, - (LPBYTE)lpServiceDescription->lpDescription, - (wcslen(lpServiceDescription->lpDescription) + 1) * sizeof(WCHAR)); - + dwError = RegSetValueExW(hServiceKey, + L"Description", + 0, + REG_SZ, + (LPBYTE)lpServiceDescription->lpDescription, + (wcslen(lpServiceDescription->lpDescription) + 1) * sizeof(WCHAR)); if (dwError != ERROR_SUCCESS) goto done; } From 6a89b41bfff53bb78d3ef8019389990af9c6cf61 Mon Sep 17 00:00:00 2001 From: Gregor Schneider Date: Fri, 22 Apr 2011 21:29:30 +0000 Subject: [PATCH 196/317] [ipconfig] Respect the size parameter in the LoadStringAndOem helper function, fixes "ipconfig /?" See issue #6146 for more details. svn path=/trunk/; revision=51434 --- .../applications/network/ipconfig/ipconfig.c | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/reactos/base/applications/network/ipconfig/ipconfig.c b/reactos/base/applications/network/ipconfig/ipconfig.c index 26576144190..2561b3601a9 100644 --- a/reactos/base/applications/network/ipconfig/ipconfig.c +++ b/reactos/base/applications/network/ipconfig/ipconfig.c @@ -28,13 +28,21 @@ HANDLE ProcessHeap; int LoadStringAndOem(HINSTANCE hInst, UINT uID, LPTSTR szNode, - int Siz -) + int byteSize +) { - TCHAR szTmp[25]; - int res = LoadString(hInst, uID, szTmp, sizeof(szTmp)); + TCHAR *szTmp; + int res; + + szTmp = (LPTSTR)HeapAlloc(ProcessHeap, 0, byteSize); + if (szTmp == NULL) + { + return 0; + } + res = LoadString(hInst, uID, szTmp, byteSize); CharToOem(szTmp, szNode); - return(res); + HeapFree(ProcessHeap, 0, szTmp); + return res; } LPTSTR GetNodeTypeName(UINT NodeType) @@ -702,7 +710,7 @@ VOID Usage(VOID) Size)) { _tprintf(_T("%s"), lpUsage); - } + } } } From 2fda6e7d2a107276d8285aef87d9c497905590f9 Mon Sep 17 00:00:00 2001 From: Gregor Schneider Date: Fri, 22 Apr 2011 22:53:31 +0000 Subject: [PATCH 197/317] [shell32] Pass an argument array to FormatMessage to insert the filename details into error messages (instead of failing) See issue #5977 for more details. svn path=/trunk/; revision=51435 --- reactos/dll/win32/shell32/shlexec.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/reactos/dll/win32/shell32/shlexec.c b/reactos/dll/win32/shell32/shlexec.c index 252d6792213..8c851c19b58 100644 --- a/reactos/dll/win32/shell32/shlexec.c +++ b/reactos/dll/win32/shell32/shlexec.c @@ -1426,15 +1426,22 @@ static UINT_PTR SHELL_execute_url( LPCWSTR lpFile, LPCWSTR wFile, LPCWSTR wcmd, return retval; } -void do_error_dialog( UINT_PTR retval, HWND hwnd ) +void do_error_dialog( UINT_PTR retval, HWND hwnd, WCHAR* filename) { WCHAR msg[2048]; - int error_code=GetLastError(); + DWORD error_code = GetLastError(); + DWORD_PTR msgArguments[3] = { (DWORD_PTR)filename, 0, 0 }; if (retval == SE_ERR_NOASSOC) LoadStringW(shell32_hInstance, IDS_SHLEXEC_NOASSOC, msg, sizeof(msg)/sizeof(WCHAR)); else - FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM, NULL, error_code, 0, msg, sizeof(msg)/sizeof(WCHAR), NULL); + FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ARGUMENT_ARRAY, + NULL, + error_code, + LANG_USER_DEFAULT, + msg, + sizeof(msg)/sizeof(WCHAR), + (va_list*)msgArguments); MessageBoxW(hwnd, msg, NULL, MB_ICONERROR); } @@ -1596,7 +1603,7 @@ BOOL SHELL_execute( LPSHELLEXECUTEINFOW sei, SHELL_ExecuteW32 execfunc ) Info.oaifInFlags = OAIF_ALLOW_REGISTRATION | OAIF_EXEC; //if (SHOpenWithDialog(sei_tmp.hwnd, &Info) != S_OK) - do_error_dialog(retval, sei_tmp.hwnd); + do_error_dialog(retval, sei_tmp.hwnd, wszApplicationName); } HeapFree(GetProcessHeap(), 0, wszApplicationName); if (wszParameters != parametersBuffer) @@ -1824,7 +1831,7 @@ BOOL SHELL_execute( LPSHELLEXECUTEINFOW sei, SHELL_ExecuteW32 execfunc ) Info.oaifInFlags = OAIF_ALLOW_REGISTRATION | OAIF_EXEC; //if (SHOpenWithDialog(sei_tmp.hwnd, &Info) != S_OK) - do_error_dialog(retval, sei_tmp.hwnd); + do_error_dialog(retval, sei_tmp.hwnd, wszApplicationName); } HeapFree(GetProcessHeap(), 0, wszApplicationName); From 87a668d95f3d7db1477d8ef57fc3227663ac8e77 Mon Sep 17 00:00:00 2001 From: Gregor Schneider Date: Fri, 22 Apr 2011 22:58:09 +0000 Subject: [PATCH 198/317] [shell32] Split declarations and operations, in case any pure C compiler cares svn path=/trunk/; revision=51436 --- reactos/dll/win32/shell32/shlexec.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/reactos/dll/win32/shell32/shlexec.c b/reactos/dll/win32/shell32/shlexec.c index 8c851c19b58..e1f183fc96e 100644 --- a/reactos/dll/win32/shell32/shlexec.c +++ b/reactos/dll/win32/shell32/shlexec.c @@ -1429,8 +1429,10 @@ static UINT_PTR SHELL_execute_url( LPCWSTR lpFile, LPCWSTR wFile, LPCWSTR wcmd, void do_error_dialog( UINT_PTR retval, HWND hwnd, WCHAR* filename) { WCHAR msg[2048]; - DWORD error_code = GetLastError(); DWORD_PTR msgArguments[3] = { (DWORD_PTR)filename, 0, 0 }; + DWORD error_code; + + error_code = GetLastError(); if (retval == SE_ERR_NOASSOC) LoadStringW(shell32_hInstance, IDS_SHLEXEC_NOASSOC, msg, sizeof(msg)/sizeof(WCHAR)); From 2ec4368714c7c9673d86cc839607523b45a7ef91 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sat, 23 Apr 2011 10:52:01 +0000 Subject: [PATCH 199/317] [CLASS2] Prepare ReactOS for the change from the ancient 32 sectors / 64 tracks disk layout (used until Windows NT4) to the modern 63 sectors / 255 tracks disk layout (used since Windows 2000). svn path=/trunk/; revision=51437 --- reactos/drivers/storage/class/class2/class2.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/reactos/drivers/storage/class/class2/class2.c b/reactos/drivers/storage/class/class2/class2.c index befd6656010..93a8a462347 100644 --- a/reactos/drivers/storage/class/class2/class2.c +++ b/reactos/drivers/storage/class/class2/class2.c @@ -28,6 +28,14 @@ #define INQUIRY_DATA_SIZE 2048 #define START_UNIT_TIMEOUT 30 +/* Disk layout used by Windows NT4 and earlier versions. */ +#define DEFAULT_SECTORS_PER_TRACK 32 +#define DEFAULT_TRACKS_PER_CYLINDER 64 + +/* Disk layout used by Windows 2000 and later versions. */ +//#define DEFAULT_SECTORS_PER_TRACK 63 +//#define DEFAULT_TRACKS_PER_CYLINDER 255 + NTSTATUS NTAPI ScsiClassCreateClose( @@ -798,7 +806,7 @@ Retry: // Calculate number of cylinders. // - deviceExtension->DiskGeometry->Geometry.Cylinders.QuadPart = (LONGLONG)((lastSector + 1)/(32 * 64)); + deviceExtension->DiskGeometry->Geometry.Cylinders.QuadPart = (LONGLONG)((lastSector + 1)/(DEFAULT_SECTORS_PER_TRACK * DEFAULT_TRACKS_PER_CYLINDER)); deviceExtension->PartitionLength.QuadPart = (deviceExtension->PartitionLength.QuadPart << deviceExtension->SectorShift); @@ -821,16 +829,16 @@ Retry: } // - // Assume sectors per track are 32; + // Assume sectors per track are DEFAULT_SECTORS_PER_TRACK; // - deviceExtension->DiskGeometry->Geometry.SectorsPerTrack = 32; + deviceExtension->DiskGeometry->Geometry.SectorsPerTrack = DEFAULT_SECTORS_PER_TRACK; // - // Assume tracks per cylinder (number of heads) is 64. + // Assume tracks per cylinder (number of heads) is DEFAULT_TRACKS_PER_CYLINDER. // - deviceExtension->DiskGeometry->Geometry.TracksPerCylinder = 64; + deviceExtension->DiskGeometry->Geometry.TracksPerCylinder = DEFAULT_TRACKS_PER_CYLINDER; } if (status == STATUS_VERIFY_REQUIRED) { From 5e449dfe39e19bf70e9bb7a9ad50ec745a0d21b7 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sat, 23 Apr 2011 11:26:16 +0000 Subject: [PATCH 200/317] [NPFS] Silence some debug messages. svn path=/trunk/; revision=51438 --- reactos/drivers/filesystems/npfs/fsctrl.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/reactos/drivers/filesystems/npfs/fsctrl.c b/reactos/drivers/filesystems/npfs/fsctrl.c index e7085af0610..4a325c28908 100644 --- a/reactos/drivers/filesystems/npfs/fsctrl.c +++ b/reactos/drivers/filesystems/npfs/fsctrl.c @@ -98,14 +98,14 @@ NpfsConnectPipe(PIRP Irp, /* Fail, if the CCB is not a pipe CCB */ if (Ccb->Type != CCB_PIPE) { - DPRINT1("Not a pipe\n"); + DPRINT("Not a pipe\n"); return STATUS_ILLEGAL_FUNCTION; } /* Fail, if the CCB is not a server end CCB */ if (Ccb->PipeEnd != FILE_PIPE_SERVER_END) { - DPRINT1("Not the server end\n"); + DPRINT("Not the server end\n"); return STATUS_ILLEGAL_FUNCTION; } @@ -209,14 +209,14 @@ NpfsDisconnectPipe(PNPFS_CCB Ccb) /* Fail, if the CCB is not a pipe CCB */ if (Ccb->Type != CCB_PIPE) { - DPRINT1("Not a pipe\n"); + DPRINT("Not a pipe\n"); return STATUS_ILLEGAL_FUNCTION; } /* Fail, if the CCB is not a server end CCB */ if (Ccb->PipeEnd != FILE_PIPE_SERVER_END) { - DPRINT1("Not the server end\n"); + DPRINT("Not the server end\n"); return STATUS_ILLEGAL_FUNCTION; } @@ -336,7 +336,7 @@ NpfsWaitPipe(PIRP Irp, FileObject = IoStack->FileObject; ASSERT(FileObject); - DPRINT1("Waiting on Pipe %wZ\n", &FileObject->FileName); + DPRINT("Waiting on Pipe %wZ\n", &FileObject->FileName); WaitPipe = (PFILE_PIPE_WAIT_FOR_BUFFER)Irp->AssociatedIrp.SystemBuffer; @@ -359,7 +359,7 @@ NpfsWaitPipe(PIRP Irp, /* Fail if not pipe was found */ if (Fcb == NULL) { - DPRINT1("No pipe found!\n", Fcb); + DPRINT("No pipe found!\n", Fcb); return STATUS_OBJECT_NAME_NOT_FOUND; } From 39eeae29f816690b2132ece7aad9574fe8180580 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sat, 23 Apr 2011 14:40:30 +0000 Subject: [PATCH 201/317] [SERVICES] Disable more debug messages. svn path=/trunk/; revision=51439 --- reactos/base/system/services/database.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/reactos/base/system/services/database.c b/reactos/base/system/services/database.c index 02afda3a8f1..b8d0a4be3d4 100644 --- a/reactos/base/system/services/database.c +++ b/reactos/base/system/services/database.c @@ -923,7 +923,7 @@ ScmStartUserModeService(PSERVICE Service, /* Create '\\.\pipe\net\NtControlPipeXXX' instance */ swprintf(NtControlPipeName, L"\\\\.\\pipe\\net\\NtControlPipe%u", ServiceCurrent); - DPRINT1("Service: %p ImagePath: %wZ PipeName: %S\n", Service, &ImagePath, NtControlPipeName); + DPRINT("Service: %p ImagePath: %wZ PipeName: %S\n", Service, &ImagePath, NtControlPipeName); Service->ControlPipeHandle = CreateNamedPipeW(NtControlPipeName, PIPE_ACCESS_DUPLEX, @@ -1039,13 +1039,13 @@ ScmStartService(PSERVICE Service, DWORD argc, LPWSTR *argv) DPRINT("ScmStartService() called\n"); - DPRINT1("Start Service %p (%S)\n", Service, Service->lpServiceName); + DPRINT("Start Service %p (%S)\n", Service, Service->lpServiceName); EnterCriticalSection(&ControlServiceCriticalSection); if (Service->Status.dwCurrentState != SERVICE_STOPPED) { - DPRINT1("Service %S is already running!\n", Service->lpServiceName); + DPRINT("Service %S is already running!\n", Service->lpServiceName); LeaveCriticalSection(&ControlServiceCriticalSection); return ERROR_SERVICE_ALREADY_RUNNING; } From 7e9f462dbd7c4344d1a85a1cc333135407ba24bc Mon Sep 17 00:00:00 2001 From: Michael Martin Date: Sun, 24 Apr 2011 06:48:50 +0000 Subject: [PATCH 202/317] [ntoskrnl] - Fix a type from rev 19847. Only if the KernelMode List is not empty are there pending APCs. svn path=/trunk/; revision=51442 --- reactos/ntoskrnl/ke/procobj.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/ntoskrnl/ke/procobj.c b/reactos/ntoskrnl/ke/procobj.c index ce337feab2a..5b149493b0f 100644 --- a/reactos/ntoskrnl/ke/procobj.c +++ b/reactos/ntoskrnl/ke/procobj.c @@ -538,7 +538,7 @@ KeDetachProcess(VOID) KiExitDispatcher(ApcLock.OldIrql); /* Check if we have pending APCs */ - if (IsListEmpty(&Thread->ApcState.ApcListHead[KernelMode])) + if (!(IsListEmpty(&Thread->ApcState.ApcListHead[KernelMode]))) { /* What do you know, we do! Request them to be delivered */ Thread->ApcState.KernelApcPending = TRUE; @@ -705,7 +705,7 @@ KeUnstackDetachProcess(IN PRKAPC_STATE ApcState) KiExitDispatcher(ApcLock.OldIrql); /* Check if we have pending APCs */ - if (IsListEmpty(&Thread->ApcState.ApcListHead[KernelMode])) + if (!(IsListEmpty(&Thread->ApcState.ApcListHead[KernelMode]))) { /* What do you know, we do! Request them to be delivered */ Thread->ApcState.KernelApcPending = TRUE; From 28b188a8e98cdf8c3a68778466f4b7460deea558 Mon Sep 17 00:00:00 2001 From: Olaf Siejka Date: Sun, 24 Apr 2011 10:05:12 +0000 Subject: [PATCH 203/317] - Swedish translation of calcs, charmap, doskey, more, dxdiag, fontview, kbswitch, logoff, magnify and mmc - Swedish translation adjustments of calc and find - Fix comments in magnify Patch by Jan Blomqvist Kinander (JaixBly [at] spray [dot] se) svn path=/trunk/; revision=51444 --- reactos/base/applications/cacls/lang/sv-SE.rc | 80 ++++++ reactos/base/applications/cacls/rsrc.rc | 1 + reactos/base/applications/calc/lang/sv-SE.rc | 20 +- .../base/applications/charmap/lang/sv-SE.rc | 40 +++ reactos/base/applications/charmap/rsrc.rc | 1 + .../applications/cmdutils/doskey/doskey.rc | 1 + .../cmdutils/doskey/lang/sv-SE.rc | 33 +++ .../applications/cmdutils/more/lang/sv-SE.rc | 21 ++ .../base/applications/cmdutils/more/rsrc.rc | 1 + .../base/applications/dxdiag/lang/sv-SE.rc | 232 ++++++++++++++++++ reactos/base/applications/dxdiag/rsrc.rc | 1 + .../base/applications/findstr/lang/sv-SE.rc | 2 +- .../base/applications/fontview/fontview.rc | 1 + .../base/applications/fontview/lang/sv-SE.rc | 22 ++ .../base/applications/kbswitch/lang/sv-SE.rc | 17 ++ reactos/base/applications/kbswitch/rsrc.rc | 1 + .../base/applications/logoff/lang/sv-SE.rc | 22 ++ reactos/base/applications/logoff/rsrc.rc | 1 + .../base/applications/magnify/lang/sv-SE.rc | 64 +++++ reactos/base/applications/magnify/magnifier.c | 68 ++--- reactos/base/applications/magnify/rsrc.rc | 1 + reactos/base/applications/mmc/lang/sv-SE.rc | 21 ++ reactos/base/applications/mmc/rsrc.rc | 1 + 23 files changed, 607 insertions(+), 45 deletions(-) create mode 100644 reactos/base/applications/cacls/lang/sv-SE.rc create mode 100644 reactos/base/applications/charmap/lang/sv-SE.rc create mode 100644 reactos/base/applications/cmdutils/doskey/lang/sv-SE.rc create mode 100644 reactos/base/applications/cmdutils/more/lang/sv-SE.rc create mode 100644 reactos/base/applications/dxdiag/lang/sv-SE.rc create mode 100644 reactos/base/applications/fontview/lang/sv-SE.rc create mode 100644 reactos/base/applications/kbswitch/lang/sv-SE.rc create mode 100644 reactos/base/applications/logoff/lang/sv-SE.rc create mode 100644 reactos/base/applications/magnify/lang/sv-SE.rc create mode 100644 reactos/base/applications/mmc/lang/sv-SE.rc diff --git a/reactos/base/applications/cacls/lang/sv-SE.rc b/reactos/base/applications/cacls/lang/sv-SE.rc new file mode 100644 index 00000000000..1984661ff60 --- /dev/null +++ b/reactos/base/applications/cacls/lang/sv-SE.rc @@ -0,0 +1,80 @@ +/* + * PROJECT: ReactOS RAPPS + * FILE: \base\applications\cacls\lang\sv-SE.rc + * PURPOSE: Swedish resource file + * Translation: Jaix Bly + */ +LANGUAGE LANG_SWEDISH, SUBLANG_NEUTRAL + +STRINGTABLE DISCARDABLE +BEGIN + +IDS_HELP, "Visar eller ndrar rttighets-kontroll-listor (ACL) av filer\n\n\ +CACLS filnamn [/T] [/E] [/C] [/G anvndare:rttighet [...]] [/R anvndare [...]]\n\ + [/P anvndare:rttighet [...]] [/D anvndare [...]]\n\ + filnamn Visar ACL.\n\ + /T ndrer ACL av specificerade filer i\n\ + nuvarende katalog och alla undermapper.\n\ + /E Redigera ACL istllet fr ersttta den.\n\ + /C Fortstt vid nekad tkomst fel.\n\ + /G anvndare:rttighet Medge specificerad anvndar rttigheter.\n\ + rttighet kan vara: L Ls\n\ + S Skriv\n\ + E ndra (skriv)\n\ + F Full kontroll\n\ + /R anvndare terkkalla specificerad anvndarrttighet (endast giltig med /E).\n\ + /P anvndare:rttighet Ersttt specificerad anvndar rttighet.\n\ + rttighet kan vara: I Ingen\n\ + L Ls\n\ + S Skrive\n\ + E ndra (skriv)\n\ + F Full kontroll\n\ + /D anvndare Avsl specificerad anvndare tillgng.\n\ +Wildcards kan anvndas fr att specificere mer n en fil i ett kommando.\n\ +Du kan spesifisere mere enn en anvndare i en kommando.\n\n\ +Frkortningar:\n\ + CI - Container Inherit.\n\ + ACE kommer att bli rvd av mappar.\n\ + OI - Object Inherit.\n\ + ACE kommer att bli rvd av filer.\n\ + IO - Inherit Only.\n\ + ACE gller inte nuvarende fil/katalog.\n" + +IDS_ABBR_CI, "(CI)" +IDS_ABBR_OI, "(OI)" +IDS_ABBR_IO, "(IO)" +IDS_ABBR_FULL, "F" +IDS_ABBR_READ, "R" +IDS_ABBR_WRITE, "W" +IDS_ABBR_CHANGE, "C" +IDS_ABBR_NONE, "N" +IDS_ALLOW, "" +IDS_DENY, "(NEKA)" +IDS_SPECIAL_ACCESS, "(speciell rttighet:)" +IDS_GENERIC_READ, "GENERISK_LSNING" +IDS_GENERIC_WRITE, "GENERISK_SKRIVNING" +IDS_GENERIC_EXECUTE, "GENERISK_KRNING" +IDS_GENERIC_ALL, "GENERISK_ALLT" +IDS_FILE_GENERIC_EXECUTE, "FIL_GENERISK_KJRE" +IDS_FILE_GENERIC_READ, "FIL_GENERISK_LSNING" +IDS_FILE_GENERIC_WRITE, "FIL_GENERISK_SKRIVNING" +IDS_FILE_READ_DATA, "FIL_LS_DATA" +IDS_FILE_WRITE_DATA, "FIL_SKRIV_DATA" +IDS_FILE_APPEND_DATA, "FIL_TILLFRA_DATA" +IDS_FILE_READ_EA, "FIL_LS_EA" +IDS_FILE_WRITE_EA, "FIL_SKRIVA_EA" +IDS_FILE_EXECUTE, "FIL_KRA" +IDS_FILE_DELETE_CHILD, "FIL_RADERA_BARN" +IDS_FILE_READ_ATTRIBUTES, "FIL_LSA_ATTRIBUT" +IDS_FILE_WRITE_ATTRIBUTES, "FIL_SKRIVA_ATTRIBUT" +IDS_MAXIMUM_ALLOWED, "MAXIMALT_TILLTNA" +IDS_ACCESS_SYSTEM_SECURITY, "TILLGNG_SYSTEM_SKERHET" +IDS_SPECIFIC_RIGHTS_ALL, "SPECIFIKA_RTTIGHETER_ALLT" +IDS_STANDARD_RIGHTS_REQUIRED, "STANDARD_RTTIGHETER_KRVS" +IDS_SYNCHRONIZE, "SYNKRONISERA" +IDS_WRITE_OWNER, "SKRIVA_GARE" +IDS_WRITE_DAC, "SKRIVA_DAC" +IDS_READ_CONTROL, "LSE_KONTROLL" +IDS_DELETE, "RADERA" +IDS_STANDARD_RIGHTS_ALL, "STANDARD_RTTIGHETER_ALLT" +END diff --git a/reactos/base/applications/cacls/rsrc.rc b/reactos/base/applications/cacls/rsrc.rc index 2585185bb37..d06caca82a8 100644 --- a/reactos/base/applications/cacls/rsrc.rc +++ b/reactos/base/applications/cacls/rsrc.rc @@ -20,6 +20,7 @@ #include "lang/pt-BR.rc" #include "lang/ru-RU.rc" #include "lang/sk-SK.rc" +#include "lang/sv-SE.rc" #include "lang/uk-UA.rc" #include "lang/zh-CN.rc" #include "lang/zh-TW.rc" diff --git a/reactos/base/applications/calc/lang/sv-SE.rc b/reactos/base/applications/calc/lang/sv-SE.rc index a875ed0e8c2..2072e9cf64d 100644 --- a/reactos/base/applications/calc/lang/sv-SE.rc +++ b/reactos/base/applications/calc/lang/sv-SE.rc @@ -1,8 +1,8 @@ /* * PROJECT: ReactOS RAPPS - * FILE: \base\applications\calc\lang\sv-SE.rc + * FILE: \base\applications\calc\lang\sv-SE.rc * PURPOSE: Swedish resource file - * Translation: Jaix Bly + * Translation: Jaix Bly */ LANGUAGE LANG_SWEDISH, SUBLANG_NEUTRAL @@ -320,7 +320,7 @@ BEGIN LTEXT "ReactOS Kalkylator",IDC_STATIC,120,12,132,8, SS_CENTERIMAGE LTEXT "Version ",IDC_TEXT_VERSION,120,20,132,8,SS_CENTERIMAGE - LTEXT "Skriven av Carlo Bramini",IDC_STATIC,120,32,132,8, + LTEXT "Skriven av Carlo Bramini, vers.: Jaix Bly",IDC_STATIC,120,32,132,8, SS_CENTERIMAGE GROUPBOX "",IDC_STATIC,112,0,148,52 GROUPBOX "",IDC_STATIC,4,56,256,88 @@ -359,7 +359,7 @@ BEGIN MENUITEM "Konvertering", IDM_VIEW_CONVERSION MENUITEM SEPARATOR MENUITEM "Hexadecimal\tF5", IDM_VIEW_HEX, CHECKED - MENUITEM "Desimal\tF6", IDM_VIEW_DEC, CHECKED + MENUITEM "Decimal\tF6", IDM_VIEW_DEC, CHECKED MENUITEM "Oktal\tF7", IDM_VIEW_OCT, CHECKED MENUITEM "Binr\tF8", IDM_VIEW_BIN, CHECKED MENUITEM SEPARATOR @@ -391,7 +391,7 @@ BEGIN MENUITEM "Konvertering", IDM_VIEW_CONVERSION MENUITEM SEPARATOR MENUITEM "Hexadecimal\tF5", IDM_VIEW_HEX, CHECKED - MENUITEM "Desimal\tF6", IDM_VIEW_DEC, CHECKED + MENUITEM "Decimal\tF6", IDM_VIEW_DEC, CHECKED MENUITEM "Oktal\tF7", IDM_VIEW_OCT, CHECKED MENUITEM "Binr\tF8", IDM_VIEW_BIN, CHECKED MENUITEM SEPARATOR @@ -437,7 +437,7 @@ END STRINGTABLE DISCARDABLE BEGIN - IDS_STRING_LICENSE "ReactOS Kalkylator r gratis programvara utgivet under GNU GPL licensen.\r\n\r\nDu kan f en kopia av GNU GPL licensen her:\r\nhttp://www.gnu.org/licenses/gpl.html\r\n\r\nDu kan ocks f en versttning av GNU GPL lisensen her:\r\nhttp://www.gnu.org/licenses/translations.html" + IDS_STRING_LICENSE "ReactOS Kalkylator r gratis programvara utgivet under GNU GPL licensen.\r\n\r\nDu kan f en kopia av GNU GPL licensen hr:\r\nhttp://www.gnu.org/licenses/gpl.html\r\n\r\nDu kan ocks f en versttning av GNU GPL lisensen hr:\r\nhttp://www.gnu.org/licenses/translations.html" IDS_MATH_ERROR "Fel" IDS_QUICKHELP "Snabb hjlp" END @@ -549,10 +549,10 @@ BEGIN IDS_ENERGY_FOOT_POUNDS "Fot-Pound" IDS_ENERGY_IT_CALORIES "International Table Calories" IDS_ENERGY_IT_KILOCALORIES "International Table Kilocalories" - IDS_ENERGY_JOULES "Joules" - IDS_ENERGY_KILOJOULES "Kilojoules" - IDS_ENERGY_KILOWATT_HOURS "Kilowatt timmar" - IDS_ENERGY_NUTRITION_CALORIES "Nrings kalorier" + IDS_ENERGY_JOULES "Joule" + IDS_ENERGY_KILOJOULES "Kilojoule" + IDS_ENERGY_KILOWATT_HOURS "Kilowattimmar" + IDS_ENERGY_NUTRITION_CALORIES "Nringskalorier" IDS_ENERGY_TH_CALORIES "Termokemiska kalorier" END diff --git a/reactos/base/applications/charmap/lang/sv-SE.rc b/reactos/base/applications/charmap/lang/sv-SE.rc new file mode 100644 index 00000000000..3b314d05fe7 --- /dev/null +++ b/reactos/base/applications/charmap/lang/sv-SE.rc @@ -0,0 +1,40 @@ +/* + * PROJECT: ReactOS RAPPS + * FILE: \base\applications\charmap\lang\sv-SE.rc + * PURPOSE: Swedish resource file + * Translation: Jaix Bly + */LANGUAGE LANG_SWEDISH, SUBLANG_NEUTRAL + +IDD_CHARMAP DIALOGEX 6, 6, 293, 205 //233 +CAPTION "Teckenuppsttning" +FONT 8,"MS Shell Dlg",0,0 +STYLE DS_SHELLFONT | WS_BORDER | WS_VISIBLE | WS_SYSMENU | WS_MINIMIZEBOX +BEGIN + LTEXT "Typsnitt:", IDC_STATIC, 6, 7, 24, 9 + COMBOBOX IDC_FONTCOMBO, 36, 5, 210, 210, WS_CHILD | WS_VISIBLE | WS_VSCROLL | CBS_DROPDOWNLIST | CBS_SORT | CBS_HASSTRINGS + PUSHBUTTON "Hjlp", IDC_CMHELP, 249, 5, 35, 13 + CONTROL "", IDC_FONTMAP, "FontMapWnd", WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL, 20, 22, 266, 156 + LTEXT "Kopiera tecken:", IDC_STATIC, 6, 188, 66, 9 + CONTROL "",IDC_TEXTBOX,RICHEDIT_CLASS,ES_AUTOHSCROLL | WS_BORDER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 74, 186, 114, 13 + DEFPUSHBUTTON "Vlj", IDC_SELECT, 194, 186, 44, 13 + PUSHBUTTON "Kopiera", IDC_COPY, 242, 186, 44, 13, WS_DISABLED + //AUTOCHECKBOX "Avansert visning", IDC_ADVVIEW, 10, 204, 64, 9, WS_CHILD | WS_VISIBLE | WS_TABSTOP + //EDITTEXT IDC_DISPLAY, 8, 217, 278, 13, WS_VISIBLE | WS_TABSTOP | ES_READONLY +END + +IDD_ABOUTBOX DIALOGEX 22,16,210,182 +CAPTION "Om Teckenuppsttning" +FONT 8,"MS Shell Dlg",0,0 +STYLE DS_SHELLFONT | WS_BORDER | WS_DLGFRAME | WS_SYSMENU | DS_MODALFRAME +BEGIN + LTEXT "Teckenuppsttning v0.1\nCopyright (C) 2007 Ged Murphy (gedmurphy@reactos.org)", IDC_STATIC, 48, 7, 150, 36 + PUSHBUTTON "Stng", IDOK, 75, 162, 44, 15 + ICON IDI_ICON, IDC_STATIC, 10, 10, 7, 30 + EDITTEXT IDC_LICENSE_EDIT, 8, 44, 194, 107, WS_VISIBLE | WS_VSCROLL | WS_TABSTOP | ES_READONLY | ES_MULTILINE +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_LICENSE "Detta programmet r fri programvara; du kan distribuera det och/eller ndra det under villkoren enligt GNU General Public License som r utgivet av Free Software Foundation; version 2, eller (om du s nskar) alla senare versioner.\r\n\r\nDette programmet er utgivet i hopp om att det skall kunne anvndas, men DET FINNS INGA GARANTIER; ven utan underfrstdd garanti om SLJBARHET eller LMPLIGHET FR ETT VISST NDAML. Se p GNU General Public Licensen fr mer detaljer.\r\n\r\nDu skall ha motagit en kopia av GNU General Public Licensen tillsammans med detta programmet; om du inte har ftt det, skriv til Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA." + IDS_ABOUT "O&m..." +END diff --git a/reactos/base/applications/charmap/rsrc.rc b/reactos/base/applications/charmap/rsrc.rc index 045d05cb884..9d902e47f02 100644 --- a/reactos/base/applications/charmap/rsrc.rc +++ b/reactos/base/applications/charmap/rsrc.rc @@ -24,6 +24,7 @@ IDI_ICON ICON "res/charmap.ico" #include "lang/pt-BR.rc" #include "lang/ru-RU.rc" #include "lang/sk-SK.rc" +#include "lang/sv-SE.rc" #include "lang/uk-UA.rc" #include "lang/zh-CN.rc" #include "lang/zh-TW.rc" diff --git a/reactos/base/applications/cmdutils/doskey/doskey.rc b/reactos/base/applications/cmdutils/doskey/doskey.rc index d469d09fec8..80cb5baea6b 100644 --- a/reactos/base/applications/cmdutils/doskey/doskey.rc +++ b/reactos/base/applications/cmdutils/doskey/doskey.rc @@ -10,4 +10,5 @@ #include "lang/de-DE.rc" #include "lang/en-US.rc" #include "lang/pl-PL.rc" +#include "lang/sv-SE.rc" #include "lang/uk-UA.rc" diff --git a/reactos/base/applications/cmdutils/doskey/lang/sv-SE.rc b/reactos/base/applications/cmdutils/doskey/lang/sv-SE.rc new file mode 100644 index 00000000000..a03b80a450a --- /dev/null +++ b/reactos/base/applications/cmdutils/doskey/lang/sv-SE.rc @@ -0,0 +1,33 @@ +/* + * PROJECT: ReactOS RAPPS + * FILE: \base\applications\cmdutils\doskey\lang\sv-SE.rc + * PURPOSE: Swedish resource file + * Translation: Jaix Bly + */ + LANGUAGE LANG_SWEDISH, SUBLANG_NEUTRAL + +STRINGTABLE DISCARDABLE +BEGIN + +IDS_HELP, "Hanterar commandoradseditering; settings, history, and macros.\n\ +\n\ +DOSKEY [/INSERT | /OVERSTRIKE] [/EXENAME=exe] [/HISTORY] [/LISTSIZE=size]\n\ + [/REINSTALL] [/MACROS[:exe | :ALL]] [/MACROFILE=file] [macroname=[text]]\n\ +\n\ + /INSERT Stter p insert mode.\n\ + /OVERSTRIKE Stnger av insert mode.\n\ + /EXENAME=exename Stller in vilket program som ska visas/ndra historia\n\ + och macros fr. Standardinstllning r cmd.exe.\n\ + /HISTORY Visar kommando historian.\n\ + /LISTSIZE=size Stller in antal kommandon per historebuffer.\n\ + /REINSTALL Rensar kommandohistorien.\n\ + /MACROS Visa makrodefinitioner.\n\ + /MACROS:exename Visa makrodefinitioner fr ett specifikt program.\n\ + /MACROS:ALL Visa makrodefinitioner fr all program.\n\ + /MACROFILE=file Laddar makrodefinitioner frn file.\n\ + macroname Specificerar namnet p ett makro man vill skapa.\n\ + text Specificerar utbytestexten fr macrot.\n" + +IDS_INVALID_MACRO_DEF, "Ogiltig makrodefinition: %s\n" + +END diff --git a/reactos/base/applications/cmdutils/more/lang/sv-SE.rc b/reactos/base/applications/cmdutils/more/lang/sv-SE.rc new file mode 100644 index 00000000000..81aa7bdc99f --- /dev/null +++ b/reactos/base/applications/cmdutils/more/lang/sv-SE.rc @@ -0,0 +1,21 @@ +/* + * PROJECT: ReactOS RAPPS + * FILE: \reactos\base\applications\cmdutils\more\lang\sv-SE.rc + * PURPOSE: Swedish resource file + * Translation: Jaix Bly + */ +LANGUAGE LANG_SWEDISH, SUBLANG_NEUTRAL + +STRINGTABLE DISCARDABLE +BEGIN + IDS_USAGE, "Visa data sida-efter-sida p skrmen.\n\n\ + MORE < [Enhet:][Mapp]Filnamn\n\ + Kommando | MORE \n\ + MORE [Enhet:][Mapp]Filnamn\n\n\ + [Enhet:][Mapp]Filnamn En fil, Vlj innehll som skall visas.\n\ + Kommando\t\t Ett kommando, Vlj vad som skall visas.\n\n\ + vid prompten ""-- Fortstt --"" du kan trycka valfri knapp fr att visa nsta sida.\n" + + IDS_CONTINUE, " -- Fortstt (100%) -- " + IDS_FILE_ACCESS, "Fr inte tillgng till filen %s." +END diff --git a/reactos/base/applications/cmdutils/more/rsrc.rc b/reactos/base/applications/cmdutils/more/rsrc.rc index 7ef6cef3090..5677c450130 100644 --- a/reactos/base/applications/cmdutils/more/rsrc.rc +++ b/reactos/base/applications/cmdutils/more/rsrc.rc @@ -15,4 +15,5 @@ #include "lang/pl-PL.rc" #include "lang/ru-RU.rc" #include "lang/sk-SK.rc" +#include "lang/sv-SE.rc" #include "lang/uk-UA.rc" diff --git a/reactos/base/applications/dxdiag/lang/sv-SE.rc b/reactos/base/applications/dxdiag/lang/sv-SE.rc new file mode 100644 index 00000000000..eb27eb55359 --- /dev/null +++ b/reactos/base/applications/dxdiag/lang/sv-SE.rc @@ -0,0 +1,232 @@ +/* + * PROJECT: ReactOS RAPPS + * FILE: \base\applications\dxdiag\lang\sv-SE.rc + * PURPOSE: Swedish resource file + * Translation: Jaix Bly + */ + LANGUAGE LANG_SWEDISH, SUBLANG_NEUTRAL + +IDD_MAIN_DIALOG DIALOGEX DISCARDABLE 0, 0, 478, 280 +STYLE DS_SHELLFONT | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | + WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU | + WS_THICKFRAME +CAPTION "ReactX-diagnos program" +FONT 8, "MS Shell Dlg" +BEGIN + CONTROL "Tab1",IDC_TAB_CONTROL,"SysTabControl32",WS_TABSTOP,2,2,474,250 + PUSHBUTTON "&Hjlp", IDC_BUTTON_HELP, 2, 261, 50, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP + DEFPUSHBUTTON "&Nsta sida", IDC_BUTTON_NEXT, 257, 261, 50, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP + PUSHBUTTON "&Spara all information...", IDC_BUTTON_SAVE_INFO, 311, 261, 110, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP + PUSHBUTTON "&Avsluta", IDC_BUTTON_EXIT, 425, 261, 50, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP +END + +IDD_SYSTEM_DIALOG DIALOGEX DISCARDABLE 0, 0, 462, 220 +STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Detta verktyget rapporterar detaljerad information om ReactX komponenter och enheter som r installerade p ditt system.", -1, 10, 10, 443, 17 + LTEXT "Om du vet vilket omrde som skapar problemer, vlger du den aktuella kategorin ovanfr. Om inte, kan du anvnda knappen ""Nsta sida"" nedanfr fr att beska alla sidorna sekventiellt.", -1, 10, 30, 443, 25 + GROUPBOX "System Information", -1, 10, 55, 443, 130, SS_RIGHT + LTEXT "Nuvarende Datum/Tid:", -1, 70, 70, 80, 10, SS_RIGHT + LTEXT "Datornamn:", -1, 70, 80, 80, 10, SS_RIGHT + LTEXT "Operativsystem:", -1, 70, 90, 80, 10, SS_RIGHT + LTEXT "Sprk:", -1, 70, 100, 80, 10, SS_RIGHT + LTEXT "Systemtillverkare:", -1, 70, 110, 80, 10, SS_RIGHT + LTEXT "Systemmodell:", -1, 70, 120, 80, 10, SS_RIGHT + LTEXT "BIOS:", -1, 70, 130, 80, 10, SS_RIGHT + LTEXT "Processor:", -1, 70, 140, 80, 10, SS_RIGHT + LTEXT "Minne:", -1, 70, 150, 80, 10, SS_RIGHT + LTEXT "Vxlingsfil:", -1, 70, 160, 80, 10, SS_RIGHT + LTEXT "ReactX-version:", -1, 70, 170, 80, 10, SS_RIGHT + LTEXT "", IDC_STATIC_TIME, 155, 70, 195, 10, SS_LEFT + LTEXT "", IDC_STATIC_COMPUTER, 155, 80, 195, 10, SS_LEFT + LTEXT "", IDC_STATIC_OS, 155, 90, 195, 10, SS_LEFT + LTEXT "", IDC_STATIC_LANG, 155, 100, 195, 10, SS_LEFT + LTEXT "", IDC_STATIC_MANU, 155, 110, 195, 10, SS_LEFT + LTEXT "", IDC_STATIC_MODEL, 155, 120, 195, 10, SS_LEFT + LTEXT "", IDC_STATIC_BIOS, 155, 130, 195, 10, SS_LEFT + LTEXT "", IDC_STATIC_PROC, 155, 140, 195, 10, SS_LEFT + LTEXT "", IDC_STATIC_MEM, 155, 150, 195, 10, SS_LEFT + LTEXT "", IDC_STATIC_SWAP, 155, 160, 195, 10, SS_LEFT + LTEXT "", IDC_STATIC_VERSION, 155, 170, 195, 10, SS_LEFT +END + +IDD_DISPLAY_DIALOG DIALOGEX DISCARDABLE 0, 0, 462, 220 +STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN +FONT 8, "MS Shell Dlg" +BEGIN + GROUPBOX "Enhet", -1, 10, 10, 250, 100 + RTEXT "Namn:", -1, 20, 25, 70, 10 + RTEXT "Fabrikat:", -1, 20, 35, 70, 10 + RTEXT "Chip typ:", -1, 20, 45, 70, 10 + RTEXT "DAC type:", -1, 20, 55, 70, 10 + RTEXT "Uppskattat total minne:", -1, 20, 65, 70, 10 + RTEXT "Aktuellt Bildskrmslge:", -1, 20, 75, 70, 10 + RTEXT "Bildskrm:", -1, 20, 85, 70, 10 + LTEXT "", IDC_STATIC_ADAPTER_ID, 95, 25, 150, 10 + LTEXT "", IDC_STATIC_ADAPTER_VENDOR, 95, 35, 150, 10 + LTEXT "", IDC_STATIC_ADAPTER_CHIP, 95, 45, 150, 10 + LTEXT "", IDC_STATIC_ADAPTER_DAC, 95, 55, 150, 10 + LTEXT "", IDC_STATIC_ADAPTER_MEM, 95, 65, 150, 10 + LTEXT "", IDC_STATIC_ADAPTER_MODE, 95, 75, 150, 10 + LTEXT "", IDC_STATIC_ADAPTER_MONITOR, 95, 85, 150, 10 + + GROUPBOX "Drivrutiner", -1, 270, 10, 190, 100 + RTEXT "Huvuddrivrutin:", -1, 275, 25, 55, 10 + RTEXT "Version:", -1, 275, 35, 55, 10 + RTEXT "Datum:", -1, 275, 45, 55, 10 + RTEXT "WHQL-Logo:", -1, 275, 55, 55, 10 + RTEXT "Mini-VDD:", -1, 275, 65, 55, 10 + RTEXT " vvdddVDD:", -1, 275, 75, 55, 10 + RTEXT "DDI Version:", -1, 275, 85, 55, 10 + LTEXT "", IDC_STATIC_ADAPTER_DRIVER, 335, 35, 100, 10 + LTEXT "", IDC_STATIC_ADAPTER_VERSION, 335, 35, 100, 10 + LTEXT "", IDC_STATIC_ADAPTER_DATE, 335, 45, 100, 10 + LTEXT "", IDC_STATIC_ADAPTER_LOGO, 335, 55, 100, 10 + LTEXT "", IDC_STATIC_ADAPTER_MINIVDD, 335, 65, 100, 10 + LTEXT "", IDC_STATIC_ADAPTER_VDD, 335, 75, 100, 10 + LTEXT "", IDC_STATIC_ADAPTER_DDI, 335, 85, 100, 10 + + GROUPBOX "ReactX-Funktioner", -1, 10, 115, 450, 60 + RTEXT "DirectDraw-accelerasjon:", -1, 15, 130, 110, 12 + RTEXT "Direct3D-accelerasjon:", -1, 15, 145, 110, 12 + RTEXT "AGP-strukturaccelleration:", -1, 15, 160, 110, 12 + LTEXT "", IDC_STATIC_DDSTATE, 130, 130, 40, 10 + LTEXT "", IDC_STATIC_D3DSTATE, 130, 145, 40, 10 + LTEXT "", IDC_STATIC_AGPSTATE, 130, 160, 40, 10 + PUSHBUTTON "Aktiverad", IDC_BUTTON_DDRAW, 170, 124, 60, 14, WS_DISABLED + PUSHBUTTON "Aktiverad", IDC_BUTTON_D3D, 170, 140, 60, 14, WS_DISABLED + PUSHBUTTON "Aktiverad", IDC_BUTTON_AGP, 170, 156, 60, 14, WS_DISABLED + PUSHBUTTON "Testa DirectDraw", IDC_BUTTON_TESTDD, 250, 124, 80, 14 + PUSHBUTTON "Testa Direct3D", IDC_BUTTON_TEST3D, 250, 140, 80, 14, WS_DISABLED + + GROUPBOX "Anmrkningar", -1, 10, 180, 450, 40 + EDITTEXT IDC_TEXT_INFO, 20, 192, 432, 20, WS_DISABLED | WS_TABSTOP +END + + +IDD_SOUND_DIALOG DIALOGEX DISCARDABLE 0, 0, 462, 220 +STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN +FONT 8, "MS Shell Dlg" +BEGIN + GROUPBOX "Enhet", -1, 10, 10, 250, 100 + RTEXT "Namn:", -1, 20, 25, 70, 10 + RTEXT "Maskinvaru-ID:", -1, 20, 35, 70, 10 + RTEXT "Tillverkarens ID:", -1, 20, 45, 70, 10 + RTEXT "Produkt-ID:", -1, 20, 55, 70, 10 + RTEXT "Typ:", -1, 20, 65, 70, 10 + RTEXT "Standard enhet:", -1, 20, 75, 70, 10 + LTEXT "", IDC_STATIC_DSOUND_NAME, 95, 25, 150, 10 + LTEXT "", IDC_STATIC_DSOUND_DEVICEID, 95, 35, 150, 10 + LTEXT "", IDC_STATIC_DSOUND_VENDORID, 95, 45, 150, 10 + LTEXT "", IDC_STATIC_DSOUND_PRODUCTID, 95, 55, 150, 10 + LTEXT "", IDC_STATIC_DSOUND_TYPE, 95, 65, 150, 10 + LTEXT "", IDC_STATIC_DSOUND_STANDARD, 95, 75, 150, 10 + GROUPBOX "Drivrutiner", -1, 270, 10, 190, 100 + RTEXT "Namn:", -1, 275, 25, 55, 10 + RTEXT "Version:", -1, 275, 35, 55, 10 + RTEXT "Datum:", -1, 275, 45, 55, 10 + RTEXT "WHQL-Logo:", -1, 275, 55, 55, 10 + RTEXT "Andra filer:", -1, 275, 65, 55, 10 + RTEXT "Leverantr:", -1, 275, 75, 55, 10 + LTEXT "", IDC_STATIC_DSOUND_DRIVER, 335, 25, 100, 10 + LTEXT "", IDC_STATIC_DSOUND_VERSION, 335, 35, 100, 10 + LTEXT "", IDC_STATIC_DSOUND_DATE, 335, 45, 100, 10 + LTEXT "", IDC_STATIC_DSOUND_LOGO, 335, 55, 100, 10 + LTEXT "", IDC_STATIC_DSOUND_FILES, 335, 65, 100, 10 + LTEXT "", IDC_STATIC_ADAPTER_PROVIDER, 335, 75, 100, 10 + GROUPBOX "ReactX-Funktioner", -1, 10, 115, 450, 60 + CONTROL "", IDC_SLIDER_DSOUND, "msctls_trackbar32", TBS_BOTTOM | TBS_AUTOTICKS | WS_TABSTOP, 120, 135, 80, 17 + RTEXT "Maskinvara ljud\nAccelerationsniv:", -1, 20, 135, 90, 20 + PUSHBUTTON "Testa DirectSound", IDC_BUTTON_TESTDSOUND, 270, 134, 80, 14 + GROUPBOX "Anmrkningar", -1, 10, 180, 450, 40 + EDITTEXT IDC_TEXT_DSOUNDINFO, 20, 192, 432, 20, WS_DISABLED | WS_TABSTOP +END + +IDD_MUSIC_DIALOG DIALOGEX DISCARDABLE 0, 0, 462, 220 +STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN +FONT 8, "MS Shell Dlg" +BEGIN +END + + +IDD_INPUT_DIALOG DIALOGEX DISCARDABLE 0, 0, 462, 220 +STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN +FONT 8, "MS Shell Dlg" +BEGIN + GROUPBOX "DirektInput-enheter", -1, 10, 10, 452, 80 + CONTROL "", IDC_LIST_DEVICE, "SysListView32", LVS_REPORT | WS_CHILD | WS_BORDER | WS_TABSTOP, 20, 22, 432, 60 + GROUPBOX "Indata enheter", -1, 10, 100, 452, 60 + CONTROL "", IDC_TREE_PORT, "SysTreeView32", TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | TVS_DISABLEDRAGDROP | TVS_SHOWSELALWAYS | WS_VISIBLE | WS_BORDER | WS_TABSTOP, 20, 112, 432, 40, 0x00000200 + GROUPBOX "Information", -1, 10, 170, 452, 50 + EDITTEXT IDC_RICH_INFO, 20, 182, 432, 30, WS_DISABLED | WS_TABSTOP +END + +IDD_NETWORK_DIALOG DIALOGEX DISCARDABLE 0, 0, 462, 220 +STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN +FONT 8, "MS Shell Dlg" +BEGIN + GROUPBOX "Registad DirectPlay tjnesteleverantr", -1, 10, 10, 452, 80 + CONTROL "", IDC_LIST_PROVIDER, "SysListView32", LVS_REPORT | WS_CHILD | WS_BORDER | WS_TABSTOP, 20, 22, 432, 60 +END + +IDD_HELP_DIALOG DIALOGEX DISCARDABLE 0, 0, 462, 220 +STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN +FONT 8, "MS Shell Dlg" +BEGIN +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_MAIN_DIALOG "ReactX diagnostikverktyg" + IDS_SYSTEM_DIALOG "System" + IDS_DISPLAY_DIALOG "Skrm" + IDS_SOUND_DIALOG "Ljud" + IDS_MUSIC_DIALOG "Musik" + IDS_INPUT_DIALOG "Indata" + IDS_NETWORK_DIALOG "Ntverk" + IDS_HELP_DIALOG "Hjlp" + IDS_FORMAT_MB "%I64uMB RAM" + IDS_FORMAT_SWAP "%I64u MB anvnt, %I64u MB tillgngligt" + IDS_FORMAT_UNIPROC "%s (%u processor)" + IDS_FORMAT_MPPROC "%s (%u procesorer)" + IDS_VERSION_UNKNOWN "Oknd version" + IDS_DEVICE_STATUS_ATTACHED "Kopplad till" + IDS_DEVICE_STATUS_MISSING "Kopplad frn" + IDS_DEVICE_STATUS_UNKNOWN "Oknd" + IDS_DEVICE_NAME "Enhetsnamn" + IDS_DEVICE_STATUS "Status" + IDS_DEVICE_CONTROLLER "Kontroller ID" + IDS_DEVICE_MANUFACTURER "Tillverkarens ID" + IDS_DEVICE_PRODUCT "Produkt ID" + IDS_DEVICE_FORCEFEEDBACK "Force Feedback-driver" + IDS_NOT_APPLICABLE "Icke applicerbar" + IDS_OPTION_YES "Ja" + IDS_DIRECTPLAY_COL_NAME1 "Namn" + IDS_DIRECTPLAY_COL_NAME2 "Register" + IDS_DIRECTPLAY_COL_NAME3 "Fil" + IDS_DIRECTPLAY_COL_NAME4 "Version" + IDS_DIRECTPLAY8_MODEMSP "DirectPlay8-Modem Service Provider" + IDS_DIRECTPLAY8_SERIALSP "DirectPlay8 Serial Service Provider" + IDS_DIRECTPLAY8_IPXSP "DirectPlay8 IPX Service Provider" + IDS_DIRECTPLAY8_TCPSP "DirectPlay8-TCP/IP Service Provider" + IDS_DIRECTPLAY_TCPCONN "Internet TCP/IP koppling for DirectPlay" + IDS_DIRECTPLAY_IPXCONN "IPX koppling for DirectPlay" + IDS_DIRECTPLAY_MODEMCONN "Modem koppling for DirectPlay" + IDS_DIRECTPLAY_SERIALCONN "Serial kopplig for DirectPlay" + IDS_REG_SUCCESS "OK" + IDS_REG_FAIL "Fel" + IDS_DDTEST_ERROR "Testet misslyckes!" + IDS_DDTEST_DESCRIPTION "Detta kommer att starta DirecDraw enhetstest. Fortstta?" + IDS_DDPRIMARY_DESCRIPTION "Denna testen kommer att anvnda DirectDraw fr att rita svarta och vita rektangular primra ytan. Fortstta?" + IDS_DDPRIMARY_RESULT "Sg du svarta och vite rektanglar?" + IDS_DDOFFSCREEN_DESCRIPTION "Denna testen kommer att anvnda DirectDraw fr att rita i en offscreen buffert. En animerad vit rektangel kommer att ritas. Fortstta?" + IDS_DDOFFSCREEN_RESULT "Sg du en vit animerad rektangel?" + IDS_DDFULLSCREEN_DESCRIPTION "Denna testen kommer att anvnda DirectDraw fr att rita i fullskrmslge. En animerad vit rektangel kommer att ritas. Fortstta?" + IDS_DDFULLSCREEN_RESULT "Sg du en vit animerad rektangel i fullskrmslge?" + IDS_FORMAT_ADAPTER_MEM "%u MB" + IDS_FORMAT_ADAPTER_MODE "%04u x %04u (%u bit)(%uHz)" + IDS_OPTION_NO "Nej" + IDS_D3DTEST_DESCRIPTION "Detta kommer att starta Direct3D enhetstest. Fortstt?" + IDS_D3DTEST_D3Dx "Detta testet kommer att anvnda hrdvaruaccellererad Direct3D %u enheten." +END diff --git a/reactos/base/applications/dxdiag/rsrc.rc b/reactos/base/applications/dxdiag/rsrc.rc index eef95d5cc9b..b0539e32d04 100644 --- a/reactos/base/applications/dxdiag/rsrc.rc +++ b/reactos/base/applications/dxdiag/rsrc.rc @@ -17,6 +17,7 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL #include "lang/pl-PL.rc" #include "lang/ru-RU.rc" #include "lang/sk-SK.rc" +#include "lang/sv-SE.rc" #include "lang/ua-UA.rc" #include "lang/zh-CN.rc" //#include "lang/zh-TW.rc" diff --git a/reactos/base/applications/findstr/lang/sv-SE.rc b/reactos/base/applications/findstr/lang/sv-SE.rc index 12b9fa58391..c70cddd055c 100644 --- a/reactos/base/applications/findstr/lang/sv-SE.rc +++ b/reactos/base/applications/findstr/lang/sv-SE.rc @@ -5,7 +5,7 @@ BEGIN IDS_USAGE, "FIND: Skriver ut alla rader i en fil som innehller en strng.\n\n\ FIND [ /C ] [ /I ] [ /N ] [ /V ] ""strng"" [ fil... ]\n\ - /C Rkna nummren av linjer som innehller en strngen\n\ + /C Rkna antalet linjer som innehller en strngen\n\ /I Ignorera skiftlge\n\ /N Antal visade rader, brjar p 1\n\ /V Skriver ut rader som inte innehller strngen" diff --git a/reactos/base/applications/fontview/fontview.rc b/reactos/base/applications/fontview/fontview.rc index b6b325b1b4e..ff75e1dc45a 100644 --- a/reactos/base/applications/fontview/fontview.rc +++ b/reactos/base/applications/fontview/fontview.rc @@ -23,6 +23,7 @@ END #include "lang/ro-RO.rc" #include "lang/ru-RU.rc" #include "lang/sk-SK.rc" +#include "lang/sv-SE.rc" #include "lang/uk-UA.rc" #include "lang/no-NO.rc" #include "lang/zh-CN.rc" diff --git a/reactos/base/applications/fontview/lang/sv-SE.rc b/reactos/base/applications/fontview/lang/sv-SE.rc new file mode 100644 index 00000000000..5756fbe216d --- /dev/null +++ b/reactos/base/applications/fontview/lang/sv-SE.rc @@ -0,0 +1,22 @@ +/* + * PROJECT: ReactOS RAPPS + * FILE: \base\applications\fontview\lang\sv-SE.rc + * PURPOSE: Swedish resource file + * Translation: Jaix Bly + */ +LANGUAGE LANG_SWEDISH, SUBLANG_NEUTRAL + +STRINGTABLE DISCARDABLE +BEGIN + IDS_QUIT, "Avsluta" + IDS_PRINT, "Skriv ut" + IDS_STRING, "Jackdaws love my big sphinx of quartz. 1234567890" + IDS_ERROR, "Fel" + IDS_ERROR_NOMEM, "Det er inte nog minne fr att slutfre operationen." + IDS_ERROR_NOFONT, "Filen %1 r inte en giltig typsnittsfil." + IDS_ERROR_NOCLASS, "Kunde inte initialisera Windows klassen." + IDS_ERROR_BADCMD, "Ingen typsnittsfil r angiven.\nSyntaxs:\n fontview.exe " +END + + + diff --git a/reactos/base/applications/kbswitch/lang/sv-SE.rc b/reactos/base/applications/kbswitch/lang/sv-SE.rc new file mode 100644 index 00000000000..74f63bb7bc5 --- /dev/null +++ b/reactos/base/applications/kbswitch/lang/sv-SE.rc @@ -0,0 +1,17 @@ +/* + * PROJECT: ReactOS RAPPS + * FILE: \base\applications\dxdiag\lang\sv-SE.rc + * PURPOSE: Swedish resource file + * Translation: Jaix Bly + */ +LANGUAGE LANG_SWEDISH, SUBLANG_NEUTRAL + +IDR_POPUP MENU +BEGIN + POPUP "popup" + BEGIN + MENUITEM "&Instllingar...", ID_PREFERENCES + MENUITEM SEPARATOR + MENUITEM "&Avsluta", ID_EXIT + END +END diff --git a/reactos/base/applications/kbswitch/rsrc.rc b/reactos/base/applications/kbswitch/rsrc.rc index b3a70f284d5..08c162e64e6 100644 --- a/reactos/base/applications/kbswitch/rsrc.rc +++ b/reactos/base/applications/kbswitch/rsrc.rc @@ -11,6 +11,7 @@ #include "lang/pl-PL.rc" #include "lang/ru-RU.rc" #include "lang/sk-SK.rc" +#include "lang/sv-SE.rc" #include "lang/uk-UA.rc" #include "lang/zh-CN.rc" #include "lang/zh-TW.rc" diff --git a/reactos/base/applications/logoff/lang/sv-SE.rc b/reactos/base/applications/logoff/lang/sv-SE.rc new file mode 100644 index 00000000000..37d8f9efec4 --- /dev/null +++ b/reactos/base/applications/logoff/lang/sv-SE.rc @@ -0,0 +1,22 @@ +/* + * PROJECT: ReactOS RAPPS + * FILE: \base\applications\logoff\lang\sv-SE.rc + * PURPOSE: Swedish resource file + * Translation: Jaix Bly + */ +LANGUAGE LANG_SWEDISH, SUBLANG_NEUTRAL + +STRINGTABLE DISCARDABLE +BEGIN + +IDS_USAGE, "Avbryter en session.\n\n\ + /v\t\tVisar information om de utfrda handlingarna.\n\ + /?\t\tViser denne informationen.\n\n" + +IDS_LOGOFF_REMOTE, "Avbryter session p en fjrrdatorn" +IDS_LOGOFF_LOCAL, "Avbryter session p denna datorn." + +IDS_ILLEGAL_PARAM, "En eller flera ogiltiga parametrar.\n" +END + +/* EOF */ diff --git a/reactos/base/applications/logoff/rsrc.rc b/reactos/base/applications/logoff/rsrc.rc index d215ef61a3d..ac8804a4442 100644 --- a/reactos/base/applications/logoff/rsrc.rc +++ b/reactos/base/applications/logoff/rsrc.rc @@ -17,6 +17,7 @@ #include "lang/pl-PL.rc" #include "lang/ru-RU.rc" #include "lang/sk-SK.rc" +#include "lang/sv-SE.rc" #include "lang/uk-UA.rc" #include "lang/zh-CN.rc" #include "lang/zh-TW.rc" diff --git a/reactos/base/applications/magnify/lang/sv-SE.rc b/reactos/base/applications/magnify/lang/sv-SE.rc new file mode 100644 index 00000000000..941808ec06c --- /dev/null +++ b/reactos/base/applications/magnify/lang/sv-SE.rc @@ -0,0 +1,64 @@ +LANGUAGE LANG_SWEDISH, SUBLANG_NEUTRAL + +IDC_MAGNIFIER MENU +BEGIN + POPUP "&Arkiv" + BEGIN + MENUITEM "A&vsluta", IDM_EXIT + MENUITEM "&Instllningar", IDM_OPTIONS + MENUITEM SEPARATOR + MENUITEM "&Om...", IDM_ABOUT + END +END + +IDC_MAGNIFIER ACCELERATORS +BEGIN + "?", IDM_ABOUT, ASCII, ALT + "/", IDM_ABOUT, ASCII, ALT +END + +IDD_ABOUTBOX DIALOGEX 22, 17, 220, 75 +STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_CAPTION | WS_SYSMENU +CAPTION "Om" +FONT 8, "MS Shell Dlg", 0, 0, 0x0 +BEGIN + ICON IDI_ICON,IDC_MYICON,14,9,20,20 + LTEXT "Forstoringsglaset Version 1.0",IDC_STATIC,49,10,119,8,SS_NOPREFIX + LTEXT "Copyright (C) 2007 Marc Piulachs (marc.piulachs@codexchange.net)\n versatt: Jaix Bly",IDC_STATIC,48,24,125,22 + PUSHBUTTON "OK",IDOK,162,48,50,14 +END + +IDD_DIALOGOPTIONS DIALOGEX 0, 0, 153, 182 +STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Frstoringsglaset Instllning" +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + DEFPUSHBUTTON "Stng",IDOK,96,161,50,14 + PUSHBUTTON "Hjlp",IDC_BUTTON_HELP,38,161,50,14 + LTEXT "Forstorings niv:",IDC_STATIC,6,8,68,8 + COMBOBOX IDC_ZOOM,72,6,63,66,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP + GROUPBOX "Sprning",IDC_STATIC,7,25,139,59 + GROUPBOX "Precentation",IDC_STATIC,7,87,139,57 + CONTROL "Flj muspekaren",IDC_FOLLOWMOUSECHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,42,114,10 + CONTROL "Flj tangentmarkren",IDC_FOLLOWKEYBOARDCHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,54,114,10 + CONTROL "Flj textredigering",IDC_FOLLOWTEXTEDITINGCHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,66,114,10 + CONTROL "Invertera Frger",IDC_INVERTCOLORSCHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,102,114,10 + CONTROL "Starta minimerad",IDC_STARTMINIMIZEDCHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,114,114,10 + CONTROL "Visa frstoring",IDC_SHOWMAGNIFIERCHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,126,114,10 +END + +IDD_WARNINGDIALOG DIALOGEX 0, 0, 250, 97 +STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION +CAPTION "ReactOS Frstoringsglas" +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + DEFPUSHBUTTON "OK",IDOK,193,76,50,14 + ICON IDI_ICON,IDC_STATIC,7,17,20,20 + LTEXT "Frstoringsglaset r mnad att ge en en minimum niv av funktionalitet for anvndare med ngot frsvagad syn. De flesta anvndare med frsvagad syn behver ett forstoringsprogram med fler funktioner fr dagligt bruk.",IDC_STATIC,36,7,207,33 + CONTROL "Visa inte detta meddelande igen",IDC_SHOWWARNINGCHECK, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,43,80,137,10 +END + +STRINGTABLE +BEGIN + IDS_APP_TITLE "Frstoringsglaset" +END diff --git a/reactos/base/applications/magnify/magnifier.c b/reactos/base/applications/magnify/magnifier.c index 4c2b4f623e9..af0358639a9 100644 --- a/reactos/base/applications/magnify/magnifier.c +++ b/reactos/base/applications/magnify/magnifier.c @@ -2,7 +2,7 @@ * PROJECT: ReactOS Magnify * LICENSE: GPL - See COPYING in the top level directory * FILE: base/applications/magnify/magnifier.c - * PURPOSE: + * PURPOSE: Magnification of parts of the screen. * COPYRIGHT: Copyright 2007 Marc Piulachs * */ @@ -78,19 +78,19 @@ int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLin -// -// FUNCTION: MyRegisterClass() -// -// PURPOSE: Registers the window class. -// -// COMMENTS: -// -// This function and its usage are only necessary if you want this code -// to be compatible with Win32 systems prior to the 'RegisterClassEx' -// function that was added to Windows 95. It is important to call this function -// so that the application will get 'well formed' small icons associated -// with it. -// +/* + * FUNCTION: MyRegisterClass() + * + * PURPOSE: Registers the window class. + * + * COMMENTS: + * + * This function and its usage are only necessary if you want this code + * to be compatible with Win32 systems prior to the 'RegisterClassEx' + * function that was added to Windows 95. It is important to call this function + * so that the application will get 'well formed' small icons associated + * with it. + */ ATOM MyRegisterClass(HINSTANCE hInstance) { WNDCLASS wc; @@ -109,16 +109,16 @@ ATOM MyRegisterClass(HINSTANCE hInstance) return RegisterClass(&wc); } -// -// FUNCTION: InitInstance(HINSTANCE, int) -// -// PURPOSE: Saves instance handle and creates main window -// -// COMMENTS: -// -// In this function, we save the instance handle in a global variable and -// create and display the main program window. -// +/* + * FUNCTION: InitInstance(HINSTANCE, int) + * + * PURPOSE: Saves instance handle and creates main window + * + * COMMENTS: + * + * In this function, we save the instance handle in a global variable and + * create and display the main program window. + */ BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) { hInst = hInstance; // Store instance handle in our global variable @@ -283,16 +283,16 @@ void Draw(HDC aDc) ReleaseDC(hDesktopWindow, desktopHdc); } -// -// FUNCTION: WndProc(HWND, UINT, WPARAM, LPARAM) -// -// PURPOSE: Processes messages for the main window. -// -// WM_COMMAND - process the application menu -// WM_PAINT - Paint the main window -// WM_DESTROY - post a quit message and return -// -// +/* + * FUNCTION: WndProc(HWND, UINT, WPARAM, LPARAM) + * + * PURPOSE: Processes messages for the main window. + * + * WM_COMMAND - process the application menu + * WM_PAINT - Paint the main window + * WM_DESTROY - post a quit message and return + * + */ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { int wmId; diff --git a/reactos/base/applications/magnify/rsrc.rc b/reactos/base/applications/magnify/rsrc.rc index 848be8c5415..97722000f63 100644 --- a/reactos/base/applications/magnify/rsrc.rc +++ b/reactos/base/applications/magnify/rsrc.rc @@ -13,6 +13,7 @@ #include "lang/ro-RO.rc" #include "lang/ru-RU.rc" #include "lang/sk-SK.rc" +#include "lang/sv-SE.rc" #include "lang/uk-UA.rc" #include "lang/zh-CN.rc" #include "lang/zh-TW.rc" diff --git a/reactos/base/applications/mmc/lang/sv-SE.rc b/reactos/base/applications/mmc/lang/sv-SE.rc new file mode 100644 index 00000000000..cefb5e91c68 --- /dev/null +++ b/reactos/base/applications/mmc/lang/sv-SE.rc @@ -0,0 +1,21 @@ +LANGUAGE LANG_NORWEGIAN, SUBLANG_NEUTRAL + +IDM_CONSOLEROOT MENU DISCARDABLE +BEGIN + POPUP "&Arkiv" + BEGIN + MENUITEM SEPARATOR + MENUITEM "&Avsluta\tAlt+F4", ID_FILE_EXIT + END + + POPUP "&Hjlp" + BEGIN + MENUITEM "&Om ReactOS Management Console...", ID_HELP_ABOUT + END +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_APPTITLE "ReactOS Management Console" + IDS_CONSOLETITLE "Konsoll%1!u!" +END diff --git a/reactos/base/applications/mmc/rsrc.rc b/reactos/base/applications/mmc/rsrc.rc index c50e9794730..0a5becd750d 100644 --- a/reactos/base/applications/mmc/rsrc.rc +++ b/reactos/base/applications/mmc/rsrc.rc @@ -17,6 +17,7 @@ #include "lang/pt-BR.rc" #include "lang/ru-RU.rc" #include "lang/sk-SK.rc" +#include "lang/sv-SE.rc" #include "lang/uk-UA.rc" #include "lang/zh-CN.rc" #include "lang/zh-TW.rc" From 0e5118d97bd0b0cdb6bfc502d80c3ad6c1b119f9 Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Sun, 24 Apr 2011 11:24:37 +0000 Subject: [PATCH 204/317] [NTOSKRNL/KE] - Correctly return whether there is a kernel APC pending in KiSwapContextExit. Fixes IRQL asserts seen in bugs 5955 and 5777. Michael Martin's help in finding and fixing this bug was invaluable. Also thanks to Art Yerkes and testing team for additional information. See issue #5955 for more details. svn path=/trunk/; revision=51445 --- reactos/ntoskrnl/ke/i386/thrdini.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/reactos/ntoskrnl/ke/i386/thrdini.c b/reactos/ntoskrnl/ke/i386/thrdini.c index 07da5ab1fa3..5a083d386fb 100644 --- a/reactos/ntoskrnl/ke/i386/thrdini.c +++ b/reactos/ntoskrnl/ke/i386/thrdini.c @@ -397,12 +397,14 @@ KiSwapContextExit(IN PKTHREAD OldThread, if (!NewThread->SpecialApcDisable) { /* Request APC delivery */ - if (SwitchFrame->ApcBypassDisable) HalRequestSoftwareInterrupt(APC_LEVEL); - return TRUE; + if (SwitchFrame->ApcBypassDisable) + HalRequestSoftwareInterrupt(APC_LEVEL); + else + return TRUE; } } - /* Return */ + /* Return stating that no kernel APCs are pending*/ return FALSE; } From 2a9813d0154191048f00af9dc5922e79935a896b Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Sun, 24 Apr 2011 17:15:23 +0000 Subject: [PATCH 205/317] [PEFIXUP] * Set IMAGE_SCN_MEM_NOT_PAGED flag for read-only data section (.rdata). Patch by Pavel Pisa. See issue #5618 for more details. svn path=/trunk/; revision=51447 --- reactos/tools/pefixup.c | 1 + 1 file changed, 1 insertion(+) diff --git a/reactos/tools/pefixup.c b/reactos/tools/pefixup.c index f908a9a94e3..d6ec1f47700 100644 --- a/reactos/tools/pefixup.c +++ b/reactos/tools/pefixup.c @@ -381,6 +381,7 @@ int main(int argc, char **argv) if (!strcmp((char*)section_header->Name, ".text") || !strcmp((char*)section_header->Name, ".data") || !strcmp((char*)section_header->Name, ".idata") || + !strcmp((char*)section_header->Name, ".rdata") || !strcmp((char*)section_header->Name, ".bss")) { section_header->Characteristics |= htodl(IMAGE_SCN_MEM_NOT_PAGED); From 6b21aeb9a36e9bd84b7c8c8f96bc9b5709d7704f Mon Sep 17 00:00:00 2001 From: Olaf Siejka Date: Mon, 25 Apr 2011 11:32:28 +0000 Subject: [PATCH 206/317] - Slovakian translation updates for rapps, shell32 and win32csr. [CALC] - Conversion fix for Farenheit. Patches by Mario Kacmar svn path=/trunk/; revision=51448 --- reactos/base/applications/calc/convert.c | 2 +- .../base/applications/rapps/rapps/firefox2.txt | 6 ++++++ .../base/applications/rapps/rapps/firefox3.txt | 6 ++++++ .../applications/rapps/rapps/firefox36.txt | 6 ++++++ reactos/base/applications/rapps/rapps/mpc.txt | 3 +++ reactos/base/applications/rapps/rapps/vlc.txt | 3 +++ reactos/base/applications/rapps/rapps/wme9.txt | 3 +++ reactos/dll/win32/shell32/lang/sk-SK.rc | 18 +++++++++--------- .../win32/csrss/win32csr/lang/sk-SK.rc | 3 ++- 9 files changed, 39 insertions(+), 11 deletions(-) diff --git a/reactos/base/applications/calc/convert.c b/reactos/base/applications/calc/convert.c index 26383080328..22966dff0fc 100644 --- a/reactos/base/applications/calc/convert.c +++ b/reactos/base/applications/calc/convert.c @@ -355,7 +355,7 @@ static const conv_t conv_TIME[] = { */ static const conv_t conv_TEMPERATURE[] = { DECLARE_CONV_UNIT(TEMPERATURE, CELSIUS, "$+273.15", "$-273.15") - DECLARE_CONV_UNIT(TEMPERATURE, FAHRENHEIT, "($-459.67)*5/9", "$*9/5-459.67") + DECLARE_CONV_UNIT(TEMPERATURE, FAHRENHEIT, "($+459.67)*5/9", "$*9/5-459.67") DECLARE_CONV_UNIT(TEMPERATURE, KELVIN, "$", "$") DECLARE_CONV_UNIT(TEMPERATURE, RANKINE, "$*5/9", "$*9/5") DECLARE_CONV_END diff --git a/reactos/base/applications/rapps/rapps/firefox2.txt b/reactos/base/applications/rapps/rapps/firefox2.txt index efb7f8b514c..ec5e692fb83 100644 --- a/reactos/base/applications/rapps/rapps/firefox2.txt +++ b/reactos/base/applications/rapps/rapps/firefox2.txt @@ -39,6 +39,12 @@ URLSite = http://www.mozilla-europe.org/pl/ Description = Один из самых популярных и лучших бесплатных браузеров. URLSite = http://www.mozilla-europe.org/ru/ +[Section.041b] +Description = Najpopulárnejší a jeden z najlepších slobodný webových prehliadačov. +Size = 6,1 MB +URLSite = http://www.mozilla-europe.org/sk/ +URLDownload = http://mozilla.mirrors.skynet.be/pub/ftp.mozilla.org/firefox/releases/2.0.0.20/win32/sk/Firefox%20Setup%202.0.0.20.exe + [Section.0422] Description = Найпопулярніший та один з кращих безплатних веб-браузерів. URLSite = http://www.mozilla-europe.org/uk/ diff --git a/reactos/base/applications/rapps/rapps/firefox3.txt b/reactos/base/applications/rapps/rapps/firefox3.txt index 065202dd921..52e8bc64f44 100644 --- a/reactos/base/applications/rapps/rapps/firefox3.txt +++ b/reactos/base/applications/rapps/rapps/firefox3.txt @@ -45,6 +45,12 @@ Description = Один из самых популярных и лучших бе Size = 7.8M URLSite = http://www.mozilla-europe.org/ru/ +[Section.041b] +Description = Najpopulárnejší a jeden z najlepších slobodný webových prehliadačov. +Size = 7,5 MB +URLSite = http://www.mozilla-europe.org/sk/ +URLDownload = http://hyperion.zih.tu-dresden.de/moz/firefox/releases/3.0.19-real-real/win32/sk/Firefox%20Setup%203.0.19.exe + [Section.0422] Description = Найпопулярніший та один з кращих безплатних веб-браузерів. Size = 7.4M diff --git a/reactos/base/applications/rapps/rapps/firefox36.txt b/reactos/base/applications/rapps/rapps/firefox36.txt index 207565f77b1..af292db6042 100644 --- a/reactos/base/applications/rapps/rapps/firefox36.txt +++ b/reactos/base/applications/rapps/rapps/firefox36.txt @@ -47,6 +47,12 @@ Size = 8.5M URLSite = http://www.mozilla-europe.org/ru/ URLDownload = http://mozilla.cdn.leaseweb.com/firefox/releases/3.6.16/win32/ru/Firefox%20Setup%203.6.16.exe +[Section.041b] +Description = Najpopulárnejší a jeden z najlepších slobodný webových prehliadačov. +Size = 8,5 MB +URLSite = http://www.mozilla-europe.org/sk/ +URLDownload = http://mozilla.cdn.leaseweb.com/firefox/releases/3.6.16/win32/sk/Firefox%20Setup%203.6.16.exe + [Section.0422] Description = Найпопулярніший та один з кращих безплатних веб-браузерів. Size = 8.5M diff --git a/reactos/base/applications/rapps/rapps/mpc.txt b/reactos/base/applications/rapps/rapps/mpc.txt index 5c369cf8fd9..d844b2392c3 100644 --- a/reactos/base/applications/rapps/rapps/mpc.txt +++ b/reactos/base/applications/rapps/rapps/mpc.txt @@ -26,5 +26,8 @@ Description = Мультимедийный проигрыватель. [Section.0415] Description = Odtwarzacz multimediów. +[Section.041b] +Description = Multimediálny prehrávač. + [Section.0422] Description = Мультимедійний програвач. diff --git a/reactos/base/applications/rapps/rapps/vlc.txt b/reactos/base/applications/rapps/rapps/vlc.txt index 0e35475c489..a5cf92e77c4 100644 --- a/reactos/base/applications/rapps/rapps/vlc.txt +++ b/reactos/base/applications/rapps/rapps/vlc.txt @@ -26,5 +26,8 @@ Description = Odtwarzacz multimediów. [Section.0419] Description = Мультимедийный проигрыватель. +[Section.041b] +Description = Multimediálny prehrávač. + [Section.0422] Description = Мультимедійний програвач. diff --git a/reactos/base/applications/rapps/rapps/wme9.txt b/reactos/base/applications/rapps/rapps/wme9.txt index 994896f5907..a17de0a8797 100644 --- a/reactos/base/applications/rapps/rapps/wme9.txt +++ b/reactos/base/applications/rapps/rapps/wme9.txt @@ -23,5 +23,8 @@ Licence = Inconnue [Section.0415] Licence = Nieznana +[Section.041b] +Description = Neznáma + [Section.0422] Licence = Невідома diff --git a/reactos/dll/win32/shell32/lang/sk-SK.rc b/reactos/dll/win32/shell32/lang/sk-SK.rc index 084351ce91f..dde08bb84d5 100644 --- a/reactos/dll/win32/shell32/lang/sk-SK.rc +++ b/reactos/dll/win32/shell32/lang/sk-SK.rc @@ -1,7 +1,7 @@ /* TRANSLATOR : Mrio Kamr /Mario Kacmar/ aka Kario (kario@szm.sk) * NOTE : partially translated * TRANSLATED : 26-12-2007 - * LAST CHANGE: 31-05-2010 + * LAST CHANGE: 27-03-2011 */ /* @@ -336,7 +336,7 @@ BEGIN LTEXT "Ktor pouvatesk konto chcete poui k spusteniu tohto programu?", -1, 10, 20, 220, 20 CHECKBOX "Aktulny pouvate %s", 14000, 10, 45, 150, 10 LTEXT "Chrni pota a daje pred neoprvnenmi aktivitami programu", -1, 25, 57, 200, 10, WS_DISABLED - CHECKBOX "This option can prevent computer viruses from harming your computer or personal data, but selecting it might cause the program to function improperly.", 14001, 25, 68, 200, 30, WS_DISABLED | BS_MULTILINE + CHECKBOX "Tto monos me zabrni potaovm vrusom aby pokodili pota alebo osobn daje, ale jej zvolenie me spsobi, e program nebude sprvne fungova.", 14001, 25, 68, 200, 30, WS_DISABLED | BS_MULTILINE CHECKBOX "Nasledujci pouvate:", 14002, 10, 100, 90, 10 LTEXT "Meno pouvatea:", -1, 20, 118, 54, 10 COMBOBOX 14003, 75, 115, 100, 15, CBS_DROPDOWNLIST | WS_VSCROLL | WS_VISIBLE | WS_TABSTOP @@ -675,10 +675,10 @@ BEGIN IDS_LOGOFF_PROMPT "Naozaj sa chcete odhlsi?" /* Run File dialog */ - IDS_RUNDLG_ERROR "Unable to display Run File dialog box (internal error)" - IDS_RUNDLG_BROWSE_ERROR "Unable to display Browse dialog box (internal error)" - IDS_RUNDLG_BROWSE_CAPTION "Browse" - IDS_RUNDLG_BROWSE_FILTER "Executable Files (*.exe)\0*.exe\0All Files (*.*)\0*.*\0" + IDS_RUNDLG_ERROR "Nemono zobrazi dialogov okno Spusti sbor (vntorn chyba)" + IDS_RUNDLG_BROWSE_ERROR "Nemono zobrazi dialogov okno Prehadva (vntorn chyba)" + IDS_RUNDLG_BROWSE_CAPTION "Prehadva" + IDS_RUNDLG_BROWSE_FILTER "Spustiten sbory (*.exe)\0*.exe\0Vetky sbory (*.*)\0*.*\0" /* shell folder path default values */ IDS_PROGRAMS "Ponuka tart\\Programy" @@ -729,10 +729,10 @@ BEGIN IDS_RECYCLEBIN_DISKSPACE "Dostupn miesto" IDS_EMPTY_BITBUCKET "Vyprzdni K" IDS_PICK_ICON_TITLE "Choose Icon" - IDS_PICK_ICON_FILTER "Sbory ikon (*.ico, *.icl, *.exe, *.dll)\0*.ico;*.icl;*.exe;*.dll\0All Files (*.*)\0*.*\0" - IDS_OPEN_WITH_FILTER "Spustiten sbory (*.exe)\0*.exe\0All Files (*.*)\0*.*\0" + IDS_PICK_ICON_FILTER "Sbory ikon (*.ico, *.icl, *.exe, *.dll)\0*.ico;*.icl;*.exe;*.dll\0Vetky sbory (*.*)\0*.*\0" + IDS_OPEN_WITH_FILTER "Spustiten sbory (*.exe)\0*.exe\0Vetky sbory (*.*)\0*.*\0" IDS_DIRECTORY "Prieinok" - IDS_VIRTUAL_DRIVER "Virtual Device Driver" + IDS_VIRTUAL_DRIVER "Ovlda virtulneho zariadenia" IDS_BAT_FILE "Dvkov sbor systmu ReactOS" IDS_CMD_FILE "Prkazov skript systmu ReactOS" IDS_COM_FILE "DOS aplikcia" diff --git a/reactos/subsystems/win32/csrss/win32csr/lang/sk-SK.rc b/reactos/subsystems/win32/csrss/win32csr/lang/sk-SK.rc index 3b9bcaa0483..6a0d7663c42 100644 --- a/reactos/subsystems/win32/csrss/win32csr/lang/sk-SK.rc +++ b/reactos/subsystems/win32/csrss/win32csr/lang/sk-SK.rc @@ -1,5 +1,6 @@ /* TRANSLATOR: Mrio Kamr /Mario Kacmar/ aka Kario (kario@szm.sk) * DATE OF TR: 29-05-2008 + * LastChange: 12-04-2011 */ LANGUAGE LANG_SLOVAK, SUBLANG_DEFAULT @@ -58,5 +59,5 @@ BEGIN IDS_SCROLLUP "Rolova nahor" IDS_SCROLLDOWN "Rolova nadol" - IDS_COMMAND_PROMPT "Command Prompt" + IDS_COMMAND_PROMPT "Prkazov riadok" END From 30fde9e8165acd973a02241738b4d1fb878eed88 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Mon, 25 Apr 2011 14:01:54 +0000 Subject: [PATCH 207/317] [PSDK] Add some missing device class GUIDs. svn path=/trunk/; revision=51449 --- reactos/include/psdk/devguid.h | 56 +++++++++++++++++++++++++++------- 1 file changed, 45 insertions(+), 11 deletions(-) diff --git a/reactos/include/psdk/devguid.h b/reactos/include/psdk/devguid.h index 9f4f9b0f51c..62bdcdc3f53 100644 --- a/reactos/include/psdk/devguid.h +++ b/reactos/include/psdk/devguid.h @@ -15,14 +15,48 @@ * */ -DEFINE_GUID(GUID_DEVCLASS_CDROM, 0x4D36E965, 0xE325, 0x11CE, 0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18); -DEFINE_GUID(GUID_DEVCLASS_DISPLAY, 0x4D36E968, 0xE325, 0x11CE, 0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18); -DEFINE_GUID(GUID_DEVCLASS_KEYBOARD, 0x4D36E96B, 0xE325, 0x11CE, 0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18); -DEFINE_GUID(GUID_DEVCLASS_MEDIA, 0x4D36E96C, 0xE325, 0x11CE, 0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18); -DEFINE_GUID(GUID_DEVCLASS_MOUSE, 0x4D36E96F, 0xE325, 0x11CE, 0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18); -DEFINE_GUID(GUID_DEVCLASS_NET, 0x4D36E972, 0xE325, 0x11CE, 0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18); -DEFINE_GUID(GUID_DEVCLASS_NETCLIENT, 0x4D36E973, 0xE325, 0x11CE, 0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18); -DEFINE_GUID(GUID_DEVCLASS_NETSERVICE, 0x4D36E974, 0xE325, 0x11CE, 0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18); -DEFINE_GUID(GUID_DEVCLASS_NETTRANS, 0x4D36E975, 0xE325, 0x11CE, 0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18); -DEFINE_GUID(GUID_DEVCLASS_DISKDRIVE, 0x4D36E967, 0xE325, 0x11CE, 0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18); -DEFINE_GUID(GUID_DEVCLASS_SOUND, 0x4d36e97C, 0xe325, 0x11CE, 0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18); +DEFINE_GUID(GUID_DEVCLASS_1394, 0x6BDD1FC1, 0x810F, 0x11D0, 0xBE, 0xC7, 0x08, 0x00, 0x2B, 0xE2, 0x09, 0x2F); +DEFINE_GUID(GUID_DEVCLASS_ADAPTER, 0x4D36E964, 0xE325, 0x11CE, 0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18); +DEFINE_GUID(GUID_DEVCLASS_APMSUPPORT, 0xD45B1C18, 0xC8FA, 0x11D1, 0x9F, 0x77, 0x00, 0x00, 0xF8, 0x05, 0xF5, 0x30); +DEFINE_GUID(GUID_DEVCLASS_BATTERY, 0x72631E54, 0x78A4, 0x11D0, 0xBC, 0xF7, 0x00, 0xAA, 0x00, 0xB7, 0xB3, 0x2A); +DEFINE_GUID(GUID_DEVCLASS_BLUETOOTH, 0xE0CBF06C, 0xCD8B, 0x4647, 0xBB, 0x8A, 0x26, 0x3B, 0x43, 0xF0, 0xF9, 0x74); +DEFINE_GUID(GUID_DEVCLASS_CDROM, 0x4D36E965, 0xE325, 0x11CE, 0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18); +DEFINE_GUID(GUID_DEVCLASS_COMPUTER, 0x4D36E966, 0xE325, 0x11CE, 0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18); +DEFINE_GUID(GUID_DEVCLASS_DECODER, 0x6BDD1FC2, 0x810F, 0x11D0, 0xBE, 0xC7, 0x08, 0x00, 0x2B, 0xE2, 0x09, 0x2F); +DEFINE_GUID(GUID_DEVCLASS_DISKDRIVE, 0x4D36E967, 0xE325, 0x11CE, 0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18); +DEFINE_GUID(GUID_DEVCLASS_DISPLAY, 0x4D36E968, 0xE325, 0x11CE, 0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18); +DEFINE_GUID(GUID_DEVCLASS_FDC, 0x4D36E969, 0xE325, 0x11CE, 0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18); +DEFINE_GUID(GUID_DEVCLASS_FLOPPYDISK, 0x4D36E980, 0xE325, 0x11CE, 0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18); +DEFINE_GUID(GUID_DEVCLASS_GPS, 0x6BDD1FC3, 0x810F, 0x11D0, 0xBE, 0xC7, 0x08, 0x00, 0x2B, 0xE2, 0x09, 0x2F); +DEFINE_GUID(GUID_DEVCLASS_HDC, 0x4D36E96A, 0xE325, 0x11CE, 0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18); +DEFINE_GUID(GUID_DEVCLASS_HIDCLASS, 0x745A17A0, 0x74D3, 0x11D0, 0xB6, 0xFE, 0x00, 0xA0, 0xC9, 0x0F, 0x57, 0xDA); +DEFINE_GUID(GUID_DEVCLASS_IMAGE, 0x6BDD1FC6, 0x810F, 0x11D0, 0xBE, 0xC7, 0x08, 0x00, 0x2B, 0xE2, 0x09, 0x2F); +DEFINE_GUID(GUID_DEVCLASS_INFRARED, 0x6BDD1FC5, 0x810F, 0x11D0, 0xBE, 0xC7, 0x08, 0x00, 0x2B, 0xE2, 0x09, 0x2F); +DEFINE_GUID(GUID_DEVCLASS_KEYBOARD, 0x4D36E96B, 0xE325, 0x11CE, 0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18); +DEFINE_GUID(GUID_DEVCLASS_LEGACYDRIVER, 0x8ECC055D, 0x047F, 0x11D1, 0xA5, 0x37, 0x00, 0x00, 0xF8, 0x75, 0x3E, 0xD1); +DEFINE_GUID(GUID_DEVCLASS_MEDIA, 0x4D36E96C, 0xE325, 0x11CE, 0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18); +DEFINE_GUID(GUID_DEVCLASS_MEDIUM_CHANGER, 0xCE5939AE, 0xEBDE, 0x11D0, 0xB1, 0x81, 0x00, 0x00, 0xF8, 0x75, 0x3E, 0xC4); +DEFINE_GUID(GUID_DEVCLASS_MODEM, 0x4D36E96D, 0xE325, 0x11CE, 0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18); +DEFINE_GUID(GUID_DEVCLASS_MONITOR, 0x4D36E96E, 0xE325, 0x11CE, 0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18); +DEFINE_GUID(GUID_DEVCLASS_MOUSE, 0x4D36E96F, 0xE325, 0x11CE, 0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18); +DEFINE_GUID(GUID_DEVCLASS_MTD, 0x4D36E970, 0xE325, 0x11CE, 0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18); +DEFINE_GUID(GUID_DEVCLASS_MULTIFUNCTION, 0x4D36E971, 0xE325, 0x11CE, 0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18); +DEFINE_GUID(GUID_DEVCLASS_MULTIPORTSERIAL, 0x50906CB8, 0xBA12, 0x11D1, 0xBF, 0x5D, 0x00, 0x00, 0xF8, 0x05, 0xF5, 0x30); +DEFINE_GUID(GUID_DEVCLASS_NET, 0x4D36E972, 0xE325, 0x11CE, 0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18); +DEFINE_GUID(GUID_DEVCLASS_NETCLIENT, 0x4D36E973, 0xE325, 0x11CE, 0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18); +DEFINE_GUID(GUID_DEVCLASS_NETSERVICE, 0x4D36E974, 0xE325, 0x11CE, 0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18); +DEFINE_GUID(GUID_DEVCLASS_NETTRANS, 0x4D36E975, 0xE325, 0x11CE, 0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18); +DEFINE_GUID(GUID_DEVCLASS_NODRIVER, 0x4D36E976, 0xE325, 0x11CE, 0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18); +DEFINE_GUID(GUID_DEVCLASS_PCMCIA, 0x4D36E977, 0xE325, 0x11CE, 0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18); +DEFINE_GUID(GUID_DEVCLASS_PORTS, 0x4D36E978, 0xE325, 0x11CE, 0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18); +DEFINE_GUID(GUID_DEVCLASS_PRINTER, 0x4D36E979, 0xE325, 0x11CE, 0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18); +DEFINE_GUID(GUID_DEVCLASS_PRINTERUPGRADE, 0x4D36E97A, 0xE325, 0x11CE, 0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18); +DEFINE_GUID(GUID_DEVCLASS_PROCESSOR, 0x50127DC3, 0x0F36, 0x415E, 0xA6, 0xCC, 0x4C, 0xB3, 0xBE, 0x91, 0x0B, 0x65); +DEFINE_GUID(GUID_DEVCLASS_SCSIADAPTER, 0x4D36E97B, 0xE325, 0x11CE, 0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18); +DEFINE_GUID(GUID_DEVCLASS_SMARTCARDREADER, 0x50DD5230, 0xBA8A, 0x11D1, 0xBF, 0x5D, 0x00, 0x00, 0xF8, 0x05, 0xF5, 0x30); +DEFINE_GUID(GUID_DEVCLASS_SOUND, 0x4D36E97C, 0xE325, 0x11CE, 0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18); +DEFINE_GUID(GUID_DEVCLASS_SYSTEM, 0x4D36E97D, 0xE325, 0x11CE, 0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18); +DEFINE_GUID(GUID_DEVCLASS_TAPEDRIVE, 0x6D807884, 0x7D21, 0x11CF, 0x80, 0x1C, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18); +DEFINE_GUID(GUID_DEVCLASS_UNKNOWN, 0x4D36E97E, 0xE325, 0x11CE, 0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18); +DEFINE_GUID(GUID_DEVCLASS_USB, 0x36FC9E60, 0xC465, 0x11CF, 0x80, 0x56, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00); +DEFINE_GUID(GUID_DEVCLASS_VOLUME, 0x71A27CDD, 0x812A, 0x11D0, 0xBE, 0xC7, 0x08, 0x00, 0x2B, 0xE2, 0x09, 0x2F); From 6c4a25f3865668e57165033bcc1b693f0577ba4b Mon Sep 17 00:00:00 2001 From: James Tabor Date: Mon, 25 Apr 2011 15:18:39 +0000 Subject: [PATCH 208/317] [User32|Win32k] - Isolated Alt-Tab/Esc issues. Placed update_input_key_state when posting to a queue like wine. This fixed the shift key checks. The Alt-Space is handled after a Translate Message call (WM_SYSCHAR), developers need to check application code to help support it (ConCtrl32). Will move AltSwitch.c from win32csr and port patch from bug 5378 to User32. ReactOS registers the Switch Class in Win32k and it is not used. - Implemented the rest of HotKey Support. ReactOS Explorer does not save hotkey actions. - See related bugs 1091. svn path=/trunk/; revision=51450 --- reactos/dll/win32/user32/windows/defwnd.c | 130 +++++++++++------- .../subsystems/win32/win32k/include/hotkey.h | 6 + .../subsystems/win32/win32k/ntuser/defwnd.c | 36 ++++- .../subsystems/win32/win32k/ntuser/hotkey.c | 109 ++++++++++++++- .../subsystems/win32/win32k/ntuser/message.c | 3 +- .../subsystems/win32/win32k/ntuser/msgqueue.c | 30 ++-- 6 files changed, 250 insertions(+), 64 deletions(-) diff --git a/reactos/dll/win32/user32/windows/defwnd.c b/reactos/dll/win32/user32/windows/defwnd.c index edee49dac73..83155b66ca6 100644 --- a/reactos/dll/win32/user32/windows/defwnd.c +++ b/reactos/dll/win32/user32/windows/defwnd.c @@ -753,12 +753,12 @@ DefWndHandleSysCommand(HWND hWnd, WPARAM wParam, LPARAM lParam) { WINDOWPLACEMENT wp; POINT Pt; + LRESULT lResult; if (!IsWindowEnabled( hWnd )) return 0; if (ISITHOOKED(WH_CBT)) { - LRESULT lResult; NtUserMessageCall( hWnd, WM_SYSCOMMAND, wParam, lParam, (ULONG_PTR)&lResult, FNID_DEFWINDOWPROC, FALSE); if (lResult) return 0; } @@ -795,7 +795,7 @@ DefWndHandleSysCommand(HWND hWnd, WPARAM wParam, LPARAM lParam) break; case SC_CLOSE: return SendMessageW(hWnd, WM_CLOSE, 0, 0); - +// case SC_DEFAULT: case SC_MOUSEMENU: { Pt.x = (short)LOWORD(lParam); @@ -815,9 +815,40 @@ DefWndHandleSysCommand(HWND hWnd, WPARAM wParam, LPARAM lParam) } break; + case SC_SCREENSAVE: + NtUserMessageCall( hWnd, WM_SYSCOMMAND, wParam, lParam, (ULONG_PTR)&lResult, FNID_DEFWINDOWPROC, FALSE); + break; + + case SC_NEXTWINDOW: + case SC_PREVWINDOW: + FIXME("Implement Alt-Tab!!! wParam 0x%x lParam 0x%x\n",wParam,lParam); + break; + + case SC_HOTKEY: + { + HWND hwnd, hWndLastActive; + + hwnd = (HWND)lParam; + PWND pWnd = ValidateHwnd(hwnd); + if (pWnd) + { + hWndLastActive = GetLastActivePopup(hwnd); + if (hWndLastActive) + { + hwnd = hWndLastActive; + pWnd = ValidateHwnd(hwnd); + } + SetForegroundWindow(hwnd); + if (pWnd->style & WS_MINIMIZE) + { + PostMessage(hwnd, WM_SYSCOMMAND, SC_RESTORE, 0); + } + } + } + break; + default: - /* FIXME: Implement */ - UNIMPLEMENTED; + FIXME("Unimplemented DefWndHandleSysCommand wParam 0x%x\n",wParam); break; } @@ -1380,39 +1411,49 @@ User32DefWindowProc(HWND hWnd, if(wParam == VK_F10) iF10Key = VK_F10; break; - /* FIXME: This is also incomplete. */ case WM_SYSKEYDOWN: { if (HIWORD(lParam) & KEYDATA_ALT) - { - HWND top = GetAncestor(hWnd, GA_ROOT); - /* if( HIWORD(lParam) & ~KEYDATA_PREVSTATE ) */ - if ( (wParam == VK_MENU || wParam == VK_LMENU - || wParam == VK_RMENU) && !iMenuSysKey ) - iMenuSysKey = 1; - else - iMenuSysKey = 0; + { /* Previous state, if the key was down before this message, + this is a cheap way to ignore autorepeat keys. */ + if ( !(HIWORD(lParam) & KEYDATA_PREVSTATE) ) + { + if ( ( wParam == VK_MENU || + wParam == VK_LMENU || + wParam == VK_RMENU ) && !iMenuSysKey ) + iMenuSysKey = 1; + else + iMenuSysKey = 0; + } iF10Key = 0; if (wParam == VK_F4) /* Try to close the window */ { - if (!(GetClassLongPtrW(top, GCL_STYLE) & CS_NOCLOSE)) - { - if (bUnicode) - PostMessageW(top, WM_SYSCOMMAND, SC_CLOSE, 0); - else - PostMessageA(top, WM_SYSCOMMAND, SC_CLOSE, 0); - } + HWND top = GetAncestor(hWnd, GA_ROOT); + if (!(GetClassLongPtrW(top, GCL_STYLE) & CS_NOCLOSE)) + PostMessageW(top, WM_SYSCOMMAND, SC_CLOSE, 0); } - else if (wParam == VK_SNAPSHOT) + else if (wParam == VK_SNAPSHOT) // Alt-VK_SNAPSHOT? { - HWND hwnd = hWnd; - while (GetParent(hwnd) != NULL) - { - hwnd = GetParent(hwnd); - } - DefWndScreenshot(hwnd); + HWND hwnd = hWnd; + while (GetParent(hwnd) != NULL) + { + hwnd = GetParent(hwnd); + } + DefWndScreenshot(hwnd); + } + else if ( wParam == VK_ESCAPE || wParam == VK_TAB ) // Alt-Tab/ESC Alt-Shift-Tab/ESC + { + WPARAM wParamTmp; + HWND Active = GetActiveWindow(); // Noticed MDI problem. + if (!Active) + { + FIXME("WM_SYSKEYDOWN VK_ESCAPE no active\n"); + break; + } + wParamTmp = GetKeyState(VK_SHIFT) & 0x8000 ? SC_PREVWINDOW : SC_NEXTWINDOW; + SendMessageW( Active, WM_SYSCOMMAND, wParamTmp, wParam ); } } else if( wParam == VK_F10 ) @@ -1421,8 +1462,6 @@ User32DefWindowProc(HWND hWnd, SendMessageW( hWnd, WM_CONTEXTMENU, (WPARAM)hWnd, MAKELPARAM(-1, -1) ); iF10Key = 1; } - else if( wParam == VK_ESCAPE && (GetKeyState(VK_SHIFT) & 0x8000)) - SendMessageW( hWnd, WM_SYSCOMMAND, SC_KEYMENU, ' ' ); break; } @@ -1440,38 +1479,24 @@ User32DefWindowProc(HWND hWnd, case WM_SYSCHAR: { iMenuSysKey = 0; - if (wParam == '\r' && IsIconic(hWnd)) + if (wParam == VK_RETURN && IsIconic(hWnd)) { PostMessageW( hWnd, WM_SYSCOMMAND, SC_RESTORE, 0L ); break; } if ((HIWORD(lParam) & KEYDATA_ALT) && wParam) { - if (wParam == '\t' || wParam == '\x1b') break; - if (wParam == ' ' && (GetWindowLongPtrW( hWnd, GWL_STYLE ) & WS_CHILD)) + if (wParam == VK_TAB || wParam == VK_ESCAPE) break; + if (wParam == VK_SPACE && (GetWindowLongPtrW( hWnd, GWL_STYLE ) & WS_CHILD)) SendMessageW( GetParent(hWnd), Msg, wParam, lParam ); else SendMessageW( hWnd, WM_SYSCOMMAND, SC_KEYMENU, wParam ); } else /* check for Ctrl-Esc */ - if (wParam != '\x1b') MessageBeep(0); + if (wParam != VK_ESCAPE) MessageBeep(0); break; } - case WM_SHOWWINDOW: - { - if (lParam) // Call when it is necessary. - NtUserMessageCall( hWnd, Msg, wParam, lParam, 0, FNID_DEFWINDOWPROC, FALSE); - break; - } - - case WM_CLIENTSHUTDOWN: - { - LRESULT lResult; - NtUserMessageCall( hWnd, Msg, wParam, lParam, (ULONG_PTR)&lResult, FNID_DEFWINDOWPROC, FALSE); - return lResult; - } - case WM_CANCELMODE: { iMenuSysKey = 0; @@ -1800,6 +1825,17 @@ User32DefWindowProc(HWND hWnd, break; } +/* Move to win32k !*/ + case WM_SHOWWINDOW: + if (!lParam) break; // Call when it is necessary. + case WM_CLIENTSHUTDOWN: + case WM_GETHOTKEY: + case WM_SETHOTKEY: + { + LRESULT lResult; + NtUserMessageCall( hWnd, Msg, wParam, lParam, (ULONG_PTR)&lResult, FNID_DEFWINDOWPROC, !bUnicode); + return lResult; + } } return 0; } diff --git a/reactos/subsystems/win32/win32k/include/hotkey.h b/reactos/subsystems/win32/win32k/include/hotkey.h index 74f19a2b2a7..b8bbee9eb78 100644 --- a/reactos/subsystems/win32/win32k/include/hotkey.h +++ b/reactos/subsystems/win32/win32k/include/hotkey.h @@ -13,6 +13,8 @@ typedef struct _HOT_KEY_ITEM UINT vk; } HOT_KEY_ITEM, *PHOT_KEY_ITEM; +#define IDHOT_REACTOS (-9) + INIT_FUNCTION NTSTATUS NTAPI @@ -33,5 +35,9 @@ UnregisterWindowHotKeys(PWND Window); VOID FASTCALL UnregisterThreadHotKeys(struct _ETHREAD *Thread); +UINT FASTCALL +DefWndGetHotKey(HWND hwnd); +INT FASTCALL +DefWndSetHotKey( PWND pWnd, WPARAM wParam); /* EOF */ diff --git a/reactos/subsystems/win32/win32k/ntuser/defwnd.c b/reactos/subsystems/win32/win32k/ntuser/defwnd.c index 88d82802f8f..f64caeb52c4 100644 --- a/reactos/subsystems/win32/win32k/ntuser/defwnd.c +++ b/reactos/subsystems/win32/win32k/ntuser/defwnd.c @@ -97,6 +97,34 @@ IntClientShutdown( return lResult; } +LRESULT FASTCALL +DefWndHandleSysCommand(PWND pWnd, WPARAM wParam, LPARAM lParam) +{ + LRESULT lResult = 0; + BOOL Hook = FALSE; + + if (ISITHOOKED(WH_CBT) || (pWnd->head.rpdesk->pDeskInfo->fsHooks & HOOKID_TO_FLAG(WH_CBT))) + { + Hook = TRUE; + lResult = co_HOOK_CallHooks(WH_CBT, HCBT_SYSCOMMAND, wParam, lParam); + + if (lResult) return lResult; + } + + switch (wParam & 0xfff0) + { + case SC_SCREENSAVE: + DPRINT1("Screensaver Called!\n"); + break; + + default: + UNIMPLEMENTED; + break; + } + + return(Hook ? 1 : 0); // Don't call us again from user space. +} + /* Win32k counterpart of User DefWindowProc */ @@ -117,7 +145,7 @@ IntDefWindowProc( case WM_SYSCOMMAND: { DPRINT1("hwnd %p WM_SYSCOMMAND %lx %lx\n", Wnd->head.h, wParam, lParam ); - lResult = co_HOOK_CallHooks(WH_CBT, HCBT_SYSCOMMAND, wParam, lParam); + lResult = DefWndHandleSysCommand(Wnd, wParam, lParam); break; } case WM_SHOWWINDOW: @@ -142,6 +170,12 @@ IntDefWindowProc( case WM_CLIENTSHUTDOWN: return IntClientShutdown(Wnd, wParam, lParam); + case WM_GETHOTKEY: + return DefWndGetHotKey(UserHMGetHandle(Wnd)); + case WM_SETHOTKEY: + return DefWndSetHotKey(Wnd, wParam); + + /* ReactOS only. */ case WM_CBT: { switch (wParam) diff --git a/reactos/subsystems/win32/win32k/ntuser/hotkey.c b/reactos/subsystems/win32/win32k/ntuser/hotkey.c index 1d5322e1a8a..7f20d32464a 100644 --- a/reactos/subsystems/win32/win32k/ntuser/hotkey.c +++ b/reactos/subsystems/win32/win32k/ntuser/hotkey.c @@ -61,7 +61,6 @@ InitHotkeyImpl(VOID) return STATUS_SUCCESS; } - #if 0 //not used NTSTATUS FASTCALL CleanupHotKeys(VOID) @@ -71,7 +70,6 @@ CleanupHotKeys(VOID) } #endif - BOOL FASTCALL GetHotKey (UINT fsModifiers, UINT vk, @@ -102,7 +100,6 @@ GetHotKey (UINT fsModifiers, return FALSE; } - VOID FASTCALL UnregisterWindowHotKeys(PWND Window) { @@ -119,7 +116,6 @@ UnregisterWindowHotKeys(PWND Window) } - VOID FASTCALL UnregisterThreadHotKeys(struct _ETHREAD *Thread) { @@ -136,7 +132,6 @@ UnregisterThreadHotKeys(struct _ETHREAD *Thread) } - static BOOL FASTCALL IsHotKey (UINT fsModifiers, UINT vk) @@ -154,7 +149,111 @@ IsHotKey (UINT fsModifiers, UINT vk) return FALSE; } +// +// Get/SetHotKey message support. +// +UINT FASTCALL +DefWndGetHotKey( HWND hwnd ) +{ + PHOT_KEY_ITEM HotKeyItem; + DPRINT1("DefWndGetHotKey\n"); + + if (IsListEmpty(&gHotkeyList)) return 0; + + LIST_FOR_EACH(HotKeyItem, &gHotkeyList, HOT_KEY_ITEM, ListEntry) + { + if ( HotKeyItem->hWnd == hwnd && + HotKeyItem->id == IDHOT_REACTOS ) + { + return MAKELONG(HotKeyItem->vk, HotKeyItem->fsModifiers); + } + } + return 0; +} + +INT FASTCALL +DefWndSetHotKey( PWND pWnd, WPARAM wParam ) +{ + UINT fsModifiers, vk; + PHOT_KEY_ITEM HotKeyItem; + HWND hWnd; + BOOL HaveSameWnd = FALSE; + INT Ret = 1; + + DPRINT1("DefWndSetHotKey wParam 0x%x\n", wParam); + + // A hot key cannot be associated with a child window. + if (pWnd->style & WS_CHILD) return 0; + + // VK_ESCAPE, VK_SPACE, and VK_TAB are invalid hot keys. + if ( LOWORD(wParam) == VK_ESCAPE || + LOWORD(wParam) == VK_SPACE || + LOWORD(wParam) == VK_TAB ) return -1; + + vk = LOWORD(wParam); + fsModifiers = HIWORD(wParam); + hWnd = UserHMGetHandle(pWnd); + + if (wParam) + { + LIST_FOR_EACH(HotKeyItem, &gHotkeyList, HOT_KEY_ITEM, ListEntry) + { + if ( HotKeyItem->fsModifiers == fsModifiers && + HotKeyItem->vk == vk && + HotKeyItem->id == IDHOT_REACTOS ) + { + if (HotKeyItem->hWnd != hWnd) + Ret = 2; // Another window already has the same hot key. + break; + } + } + } + + LIST_FOR_EACH(HotKeyItem, &gHotkeyList, HOT_KEY_ITEM, ListEntry) + { + if ( HotKeyItem->hWnd == hWnd && + HotKeyItem->id == IDHOT_REACTOS ) + { + HaveSameWnd = TRUE; + break; + } + } + + if (HaveSameWnd) + { + if (wParam == 0) + { // Setting wParam to NULL removes the hot key associated with a window. + UnregisterWindowHotKeys(pWnd); + } + else + { /* A window can only have one hot key. If the window already has a hot key + associated with it, the new hot key replaces the old one. */ + HotKeyItem->fsModifiers = fsModifiers; + HotKeyItem->vk = vk; + } + } + else // + { + if (wParam == 0) + return 1; // Do nothing, exit. + + HotKeyItem = ExAllocatePoolWithTag (PagedPool, sizeof(HOT_KEY_ITEM), USERTAG_HOTKEY); + if (HotKeyItem == NULL) + { + return 0; + } + + HotKeyItem->Thread = pWnd->head.pti->pEThread; + HotKeyItem->hWnd = hWnd; + HotKeyItem->id = IDHOT_REACTOS; // Don't care, these hot keys are unrelated to the hot keys set by RegisterHotKey. + HotKeyItem->fsModifiers = fsModifiers; + HotKeyItem->vk = vk; + + InsertHeadList (&gHotkeyList, &HotKeyItem->ListEntry); + } + return Ret; +} /* SYSCALLS *****************************************************************/ diff --git a/reactos/subsystems/win32/win32k/ntuser/message.c b/reactos/subsystems/win32/win32k/ntuser/message.c index 2a2097f6703..030b1c9536f 100644 --- a/reactos/subsystems/win32/win32k/ntuser/message.c +++ b/reactos/subsystems/win32/win32k/ntuser/message.c @@ -735,7 +735,8 @@ co_IntPeekMessage( PMSG Msg, } /* Now check for normal messages. */ - if ((ProcessMask & QS_POSTMESSAGE) && + if (( (ProcessMask & QS_POSTMESSAGE) || + (ProcessMask & QS_HOTKEY) ) && MsqPeekMessage( ThreadQueue, RemoveMessages, Window, diff --git a/reactos/subsystems/win32/win32k/ntuser/msgqueue.c b/reactos/subsystems/win32/win32k/ntuser/msgqueue.c index 90b11a9f017..e7371277601 100644 --- a/reactos/subsystems/win32/win32k/ntuser/msgqueue.c +++ b/reactos/subsystems/win32/win32k/ntuser/msgqueue.c @@ -463,6 +463,7 @@ co_MsqPostKeyboardMessage(UINT uMsg, WPARAM wParam, LPARAM lParam) FocusMessageQueue->Desktop->pDeskInfo->LastInputWasKbd = TRUE; Msg.pt = gpsi->ptCursor; + update_input_key_state(FocusMessageQueue, &Msg); MsqPostMessage(FocusMessageQueue, &Msg, TRUE, QS_KEY); } else @@ -481,6 +482,8 @@ MsqPostHotKeyMessage(PVOID Thread, HWND hWnd, WPARAM wParam, LPARAM lParam) MSG Mesg; LARGE_INTEGER LargeTickCount; NTSTATUS Status; + INT id; + DWORD Type; Status = ObReferenceObjectByPointer (Thread, THREAD_ALL_ACCESS, @@ -503,14 +506,17 @@ MsqPostHotKeyMessage(PVOID Thread, HWND hWnd, WPARAM wParam, LPARAM lParam) return; } - Mesg.hwnd = hWnd; - Mesg.message = WM_HOTKEY; - Mesg.wParam = wParam; - Mesg.lParam = lParam; + id = wParam; // Check for hot keys unrelated to the hot keys set by RegisterHotKey. + + Mesg.hwnd = hWnd; + Mesg.message = id != IDHOT_REACTOS ? WM_HOTKEY : WM_SYSCOMMAND; + Mesg.wParam = id != IDHOT_REACTOS ? wParam : SC_HOTKEY; + Mesg.lParam = id != IDHOT_REACTOS ? lParam : (LPARAM)hWnd; + Type = id != IDHOT_REACTOS ? QS_HOTKEY : QS_POSTMESSAGE; KeQueryTickCount(&LargeTickCount); - Mesg.time = MsqCalculateMessageTime(&LargeTickCount); - Mesg.pt = gpsi->ptCursor; - MsqPostMessage(Window->head.pti->MessageQueue, &Mesg, FALSE, QS_HOTKEY); + Mesg.time = MsqCalculateMessageTime(&LargeTickCount); + Mesg.pt = gpsi->ptCursor; + MsqPostMessage(Window->head.pti->MessageQueue, &Mesg, FALSE, Type); UserDereferenceObject(Window); ObDereferenceObject (Thread); @@ -543,8 +549,8 @@ co_MsqDispatchOneSentMessage(PUSER_MESSAGE_QUEUE MessageQueue) { PUSER_SENT_MESSAGE SaveMsg, Message; PLIST_ENTRY Entry; - LRESULT Result; PTHREADINFO pti; + LRESULT Result = 0; if (IsListEmpty(&MessageQueue->SentMessagesListHead)) { @@ -1321,6 +1327,10 @@ BOOL co_IntProcessKeyboardMessage(MSG* Msg, BOOL* RemoveMessages) case VK_LMENU: case VK_RMENU: Msg->wParam = VK_MENU; break; + case VK_F10: + if (Msg->message == WM_KEYUP) Msg->message = WM_SYSKEYUP; + if (Msg->message == WM_KEYDOWN) Msg->message = WM_SYSKEYDOWN; + break; } } @@ -1450,7 +1460,7 @@ co_MsqPeekHardwareMessage(IN PUSER_MESSAGE_QUEUE MessageQueue, { update_input_key_state(MessageQueue, pMsg); RemoveEntryList(&CurrentMessage->ListEntry); - ClearMsgBitsMask(MessageQueue, QS_INPUT); + ClearMsgBitsMask(MessageQueue, CurrentMessage->QS_Flags); MsqDestroyMessage(CurrentMessage); } @@ -1510,7 +1520,7 @@ MsqPeekMessage(IN PUSER_MESSAGE_QUEUE MessageQueue, if (Remove) { RemoveEntryList(&CurrentMessage->ListEntry); - ClearMsgBitsMask(MessageQueue, QS_POSTMESSAGE); + ClearMsgBitsMask(MessageQueue, CurrentMessage->QS_Flags); MsqDestroyMessage(CurrentMessage); } return(TRUE); From f34a5b0b2d09a0c75b71149ea7fdf21747130d5d Mon Sep 17 00:00:00 2001 From: James Tabor Date: Mon, 25 Apr 2011 15:31:49 +0000 Subject: [PATCH 209/317] [Win32k] - Need this file too. svn path=/trunk/; revision=51451 --- reactos/subsystems/win32/win32k/ntuser/input.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/subsystems/win32/win32k/ntuser/input.c b/reactos/subsystems/win32/win32k/ntuser/input.c index 8e627548112..5c7a108e33f 100644 --- a/reactos/subsystems/win32/win32k/ntuser/input.c +++ b/reactos/subsystems/win32/win32k/ntuser/input.c @@ -482,7 +482,7 @@ static VOID APIENTRY co_IntKeyboardSendAltKeyMsg() { DPRINT1("co_IntKeyboardSendAltKeyMsg\n"); - co_MsqPostKeyboardMessage(WM_SYSCOMMAND,SC_KEYMENU,0); +// co_MsqPostKeyboardMessage(WM_SYSCOMMAND,SC_KEYMENU,0); This sends everything into a msg loop! } static VOID APIENTRY @@ -794,7 +794,7 @@ KeyboardThreadMain(PVOID StartContext) if (ModifierState & MOD_ALT) { - lParam |= (1 << 29); + lParam |= (1 << 29); // wine -> (HIWORD(lParam) & KEYDATA_ALT) #define KEYDATA_ALT 0x2000 if (!(KeyInput.Flags & KEY_BREAK)) msg.message = WM_SYSKEYDOWN; From 3d60cef1931e2c6f5cfade6546595c994c743241 Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Mon, 25 Apr 2011 16:08:00 +0000 Subject: [PATCH 210/317] Sam Arun Raj Seeniraj: [NTOSKRNL.EXE] - Complemented existing stub routines ObpDeleteSymbolicLinkName() and ObpCreateSymbolicLinkName(). Now when symbolic links are created, they are checked for dos drive mapping and ObSystemDeviceMap is updated accordingly. - Updates to ObpDeviceMapLock are protected by a guarded mutex (changed from fast mutex by Aleksey Bragin). - Aleksey Bragin: Fix concurrent access issues in ObDereferenceDeviceMap. The DeviceMap read/write operation must be atomic (within the ObpDeviceMapLock region). [SUBST.EXE] - Removed hard coded strings and moved it to resource file. [WIN32CSR.DLL] - Added a workaround, when target path end with a trailing '\', the substituted drive fails to parse to the target, this is a bug in the object manager, but working around it in CsrDefineDosDevice() by stripping trailing '\'. See issue #993 for more details. svn path=/trunk/; revision=51452 --- reactos/base/system/subst/lang/en-US.rc | 16 ++ reactos/base/system/subst/resource.h | 11 + reactos/base/system/subst/rsrc.rc | 6 + reactos/base/system/subst/subst.c | 72 +++-- reactos/base/system/subst/subst.rbuild | 3 +- reactos/base/system/subst/subst.rc | 2 + reactos/ntoskrnl/fstub/disksup.c | 10 +- reactos/ntoskrnl/include/internal/ob.h | 1 + reactos/ntoskrnl/ob/obinit.c | 3 + reactos/ntoskrnl/ob/oblife.c | 9 +- reactos/ntoskrnl/ob/oblink.c | 269 +++++++++++++++++- reactos/ntoskrnl/ob/obname.c | 32 +-- .../subsystems/win32/csrss/win32csr/file.c | 23 +- 13 files changed, 399 insertions(+), 58 deletions(-) create mode 100644 reactos/base/system/subst/lang/en-US.rc create mode 100644 reactos/base/system/subst/resource.h create mode 100644 reactos/base/system/subst/rsrc.rc diff --git a/reactos/base/system/subst/lang/en-US.rc b/reactos/base/system/subst/lang/en-US.rc new file mode 100644 index 00000000000..790555b2db2 --- /dev/null +++ b/reactos/base/system/subst/lang/en-US.rc @@ -0,0 +1,16 @@ +#include "resource.h" +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US + +STRINGTABLE +BEGIN + IDS_INCORRECT_PARAMETER_COUNT "Incorrect number of parameters - %s\n" + IDS_INVALID_PARAMETER "Incorrect number of parameters - %s\n" + IDS_INVALID_PARAMETER2 "Invalid parameter - %s\n" + IDS_DRIVE_ALREAD_SUBSTED "Drive already SUBSTed\n" + IDS_FAILED_WITH_ERROCODE "Failed with error code 0x%x: %s\n" + IDS_USAGE "Associates a path with a drive letter.\n\nSUBST [drive1: [drive2:]path]\nSUBST drive1: /D\n\n drive1: \ + Specifies a virtual drive to which you want to assign a path.\n \ + [drive2:]path Specifies a physical drive and path you want to assign to\n \ + a virtual drive.\n /D \ + Deletes a substituted (virtual) drive.\n\nType SUBST with no parameters to display a list of current virtual drives.\n" +END diff --git a/reactos/base/system/subst/resource.h b/reactos/base/system/subst/resource.h new file mode 100644 index 00000000000..9baa5b31a61 --- /dev/null +++ b/reactos/base/system/subst/resource.h @@ -0,0 +1,11 @@ +#define RC_STRING_MAX_SIZE 2048 + +/* Strings */ +#define IDS_FAILED_WITH_ERROCODE 1001 +#define IDS_USAGE 1002 +#define IDS_INCORRECT_PARAMETER_COUNT 1003 +#define IDS_INVALID_PARAMETER 1004 +#define IDS_INVALID_PARAMETER2 1005 +#define IDS_DRIVE_ALREAD_SUBSTED 1006 + +/* EOF */ diff --git a/reactos/base/system/subst/rsrc.rc b/reactos/base/system/subst/rsrc.rc new file mode 100644 index 00000000000..a6f84e411dc --- /dev/null +++ b/reactos/base/system/subst/rsrc.rc @@ -0,0 +1,6 @@ +#include +#include "resource.h" + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL + +#include "lang/en-US.rc" diff --git a/reactos/base/system/subst/subst.c b/reactos/base/system/subst/subst.c index 7cb92563eb8..3bfad0cae3e 100644 --- a/reactos/base/system/subst/subst.c +++ b/reactos/base/system/subst/subst.c @@ -14,11 +14,13 @@ #include #define NDEBUG #include +#include "resource.h" /* FUNCTIONS ****************************************************************/ void PrintError(DWORD ErrCode) { + TCHAR szFmtString[RC_STRING_MAX_SIZE] = {0}; TCHAR *buffer = (TCHAR*) calloc(2048, sizeof(TCHAR)); TCHAR *msg = NULL; @@ -32,9 +34,13 @@ void PrintError(DWORD ErrCode) (TCHAR*)&msg, 0, NULL); + LoadString(GetModuleHandle(NULL), + IDS_FAILED_WITH_ERROCODE, + szFmtString, + sizeof(szFmtString) / sizeof(szFmtString[0])); _sntprintf(buffer, 2048, - _T("Failed with error code 0x%x: %s\n"), + szFmtString, ErrCode, msg); _tprintf(_T("%s"), @@ -45,16 +51,15 @@ void PrintError(DWORD ErrCode) } } -void DisplaySubstUsage() +void DisplaySubstUsage(void) { - _tprintf(_T("Associates a path with a drive letter.\n\n")); - _tprintf(_T("SUBST [drive1: [drive2:]path]\n")); - _tprintf(_T("SUBST drive1: /D\n\n")); - _tprintf(_T(" drive1: Specifies a virtual drive to which you want to assign a path.\n")); - _tprintf(_T(" [drive2:]path Specifies a physical drive and path you want to assign to\n")); - _tprintf(_T(" a virtual drive.\n")); - _tprintf(_T(" /D Deletes a substituted (virtual) drive.\n\n")); - _tprintf(_T("Type SUBST with no parameters to display a list of current virtual drives.\n")); + TCHAR szHelp[RC_STRING_MAX_SIZE] = {0}; + + LoadString(GetModuleHandle(NULL), + IDS_USAGE, + szHelp, + sizeof(szHelp) / sizeof(szHelp[0])); + _tprintf(_T("%s"), szHelp); } BOOLEAN IsSubstedDrive(TCHAR *Drive) @@ -103,7 +108,7 @@ BOOLEAN IsSubstedDrive(TCHAR *Drive) return Result; } -void DumpSubstedDrives() +void DumpSubstedDrives(void) { TCHAR Drive[3] = _T("A:"); LPTSTR lpTargetPath = NULL; @@ -161,17 +166,23 @@ void DumpSubstedDrives() int DeleteSubst(TCHAR* Drive) { BOOL Result; + TCHAR szFmtString[RC_STRING_MAX_SIZE] = {0}; + + LoadString(GetModuleHandle(NULL), + IDS_INVALID_PARAMETER2, + szFmtString, + sizeof(szFmtString) / sizeof(szFmtString[0])); if (_tcslen(Drive) > 2) { - _tprintf(_T("Invalid parameter - %s\n"), + _tprintf(szFmtString, Drive); return 1; } if (! IsSubstedDrive(Drive)) { - _tprintf(_T("Invalid Parameter - %s\n"), + _tprintf(szFmtString, Drive); return 1; } @@ -190,17 +201,33 @@ int DeleteSubst(TCHAR* Drive) int AddSubst(TCHAR* Drive, TCHAR *Path) { BOOL Result; + TCHAR szFmtString[RC_STRING_MAX_SIZE] = {0}; - if (_tcslen(Drive) > 2) + LoadString(GetModuleHandle(NULL), + IDS_INVALID_PARAMETER2, + szFmtString, + sizeof(szFmtString) / sizeof(szFmtString[0])); + if (_tcslen(Drive) != 2) { - _tprintf(_T("Invalid parameter - %s\n"), + _tprintf(szFmtString, + Drive); + return 1; + } + + if (Drive[1] != _T(':')) + { + _tprintf(szFmtString, Drive); return 1; } if (IsSubstedDrive(Drive)) { - _tprintf(_T("Drive already SUBSTed\n")); + LoadString(GetModuleHandle(NULL), + IDS_DRIVE_ALREAD_SUBSTED, + szFmtString, + sizeof(szFmtString) / sizeof(szFmtString[0])); + _tprintf(szFmtString); return 1; } @@ -218,6 +245,7 @@ int AddSubst(TCHAR* Drive, TCHAR *Path) int _tmain(int argc, TCHAR* argv[]) { INT i; + TCHAR szFmtString[RC_STRING_MAX_SIZE] = {0}; for (i = 0; i < argc; i++) { @@ -232,7 +260,11 @@ int _tmain(int argc, TCHAR* argv[]) { if (argc >= 2) { - _tprintf(_T("Invalid parameter - %s\n"), + LoadString(GetModuleHandle(NULL), + IDS_INVALID_PARAMETER, + szFmtString, + sizeof(szFmtString) / sizeof(szFmtString[0])); + _tprintf(szFmtString, argv[1]); return 1; } @@ -242,7 +274,11 @@ int _tmain(int argc, TCHAR* argv[]) if (argc > 3) { - _tprintf(_T("Incorrect number of parameters - %s\n"), + LoadString(GetModuleHandle(NULL), + IDS_INCORRECT_PARAMETER_COUNT, + szFmtString, + sizeof(szFmtString) / sizeof(szFmtString[0])); + _tprintf(szFmtString, argv[3]); return 1; } diff --git a/reactos/base/system/subst/subst.rbuild b/reactos/base/system/subst/subst.rbuild index fe93acb95e1..8b77abd857d 100644 --- a/reactos/base/system/subst/subst.rbuild +++ b/reactos/base/system/subst/subst.rbuild @@ -1,9 +1,10 @@ - + include/reactos/wine . kernel32 + user32 subst.c subst.rc diff --git a/reactos/base/system/subst/subst.rc b/reactos/base/system/subst/subst.rc index b81ea2c6a7b..db0df66fd9d 100644 --- a/reactos/base/system/subst/subst.rc +++ b/reactos/base/system/subst/subst.rc @@ -3,3 +3,5 @@ #define REACTOS_STR_INTERNAL_NAME "subst\0" #define REACTOS_STR_ORIGINAL_FILENAME "subst.exe\0" #include + +#include "rsrc.rc" diff --git a/reactos/ntoskrnl/fstub/disksup.c b/reactos/ntoskrnl/fstub/disksup.c index 7c4f651f8ff..c4a67c3413f 100644 --- a/reactos/ntoskrnl/fstub/disksup.c +++ b/reactos/ntoskrnl/fstub/disksup.c @@ -64,17 +64,20 @@ HalpAssignDrive(IN PUNICODE_STRING PartitionName, if ((DriveNumber != AUTO_DRIVE) && (DriveNumber < 26)) { /* Force assignment */ + KeAcquireGuardedMutex(&ObpDeviceMapLock); if ((ObSystemDeviceMap->DriveMap & (1 << DriveNumber)) != 0) { DbgPrint("Drive letter already used!\n"); + KeReleaseGuardedMutex(&ObpDeviceMapLock); return FALSE; } + KeReleaseGuardedMutex(&ObpDeviceMapLock); } else { /* Automatic assignment */ DriveNumber = AUTO_DRIVE; - + KeAcquireGuardedMutex(&ObpDeviceMapLock); for (i = 2; i < 26; i++) { if ((ObSystemDeviceMap->DriveMap & (1 << i)) == 0) @@ -83,6 +86,7 @@ HalpAssignDrive(IN PUNICODE_STRING PartitionName, break; } } + KeReleaseGuardedMutex(&ObpDeviceMapLock); if (DriveNumber == AUTO_DRIVE) { @@ -93,10 +97,6 @@ HalpAssignDrive(IN PUNICODE_STRING PartitionName, DPRINT("DriveNumber %d\n", DriveNumber); - /* Update the System Device Map */ - ObSystemDeviceMap->DriveMap |= (1 << DriveNumber); - ObSystemDeviceMap->DriveType[DriveNumber] = DriveType; - /* Build drive name */ swprintf(DriveNameBuffer, L"\\??\\%C:", diff --git a/reactos/ntoskrnl/include/internal/ob.h b/reactos/ntoskrnl/include/internal/ob.h index 521bf5834a4..532565ee390 100644 --- a/reactos/ntoskrnl/include/internal/ob.h +++ b/reactos/ntoskrnl/include/internal/ob.h @@ -578,6 +578,7 @@ ObGetProcessHandleCount( // extern ULONG ObpTraceLevel; extern KEVENT ObpDefaultObject; +extern KGUARDED_MUTEX ObpDeviceMapLock; extern POBJECT_TYPE ObpTypeObjectType; extern POBJECT_TYPE ObSymbolicLinkType; extern POBJECT_TYPE ObpTypeObjectType; diff --git a/reactos/ntoskrnl/ob/obinit.c b/reactos/ntoskrnl/ob/obinit.c index 5a24101ed45..37d6f1bc761 100644 --- a/reactos/ntoskrnl/ob/obinit.c +++ b/reactos/ntoskrnl/ob/obinit.c @@ -169,6 +169,9 @@ ObInitSystem(VOID) /* Initialize the Default Event */ KeInitializeEvent(&ObpDefaultObject, NotificationEvent, TRUE); + /* Initialize the Dos Device Map mutex */ + KeInitializeGuardedMutex(&ObpDeviceMapLock); + /* Setup default access for the system process */ PsGetCurrentProcess()->GrantedAccess = PROCESS_ALL_ACCESS; PsGetCurrentThread()->GrantedAccess = THREAD_ALL_ACCESS; diff --git a/reactos/ntoskrnl/ob/oblife.c b/reactos/ntoskrnl/ob/oblife.c index f87e5948d36..ad4d9f10ca3 100644 --- a/reactos/ntoskrnl/ob/oblife.c +++ b/reactos/ntoskrnl/ob/oblife.c @@ -21,6 +21,7 @@ extern ULONG NtGlobalFlag; POBJECT_TYPE ObpTypeObjectType = NULL; KEVENT ObpDefaultObject; +KGUARDED_MUTEX ObpDeviceMapLock; GENERAL_LOOKASIDE ObpNameBufferLookasideList, ObpCreateInfoLookasideList; @@ -107,7 +108,7 @@ ObpDeallocateObject(IN PVOID Object) /* Add the SD charge too */ if (Header->Flags & OB_FLAG_SECURITY) PagedPoolCharge += 2048; } - + /* Return the quota */ DPRINT("FIXME: Should return quotas: %lx %lx\n", PagedPoolCharge, NonPagedPoolCharge); #if 0 @@ -115,7 +116,7 @@ ObpDeallocateObject(IN PVOID Object) PagedPoolCharge, NonPagedPoolCharge); #endif - + } } @@ -1261,14 +1262,14 @@ ObpDeleteObjectType(IN PVOID Object) { ULONG i; POBJECT_TYPE ObjectType = (PVOID)Object; - + /* Loop our locks */ for (i = 0; i < 4; i++) { /* Delete each one */ ExDeleteResourceLite(&ObjectType->ObjectLocks[i]); } - + /* Delete our main mutex */ ExDeleteResourceLite(&ObjectType->Mutex); } diff --git a/reactos/ntoskrnl/ob/oblink.c b/reactos/ntoskrnl/ob/oblink.c index 5b147474c0c..3648aa797a5 100644 --- a/reactos/ntoskrnl/ob/oblink.c +++ b/reactos/ntoskrnl/ob/oblink.c @@ -23,8 +23,160 @@ VOID NTAPI ObpDeleteSymbolicLinkName(IN POBJECT_SYMBOLIC_LINK SymbolicLink) { - /* FIXME: Device maps not supported yet */ + POBJECT_HEADER ObjectHeader; + POBJECT_HEADER_NAME_INFO ObjectNameInfo; + /* FIXME: Need to support Device maps */ + + /* Get header data */ + ObjectHeader = OBJECT_TO_OBJECT_HEADER(SymbolicLink); + ObjectNameInfo = ObpReferenceNameInfo(ObjectHeader); + + /* Check if we are not actually in a directory with a device map */ + if (!(ObjectNameInfo) || + !(ObjectNameInfo->Directory) /*|| + !(ObjectNameInfo->Directory->DeviceMap)*/) + { + ObpDereferenceNameInfo(ObjectNameInfo); + return; + } + + /* Check if it's a DOS drive letter, and remove the entry from drive map if needed */ + if (SymbolicLink->DosDeviceDriveIndex != 0 && + ObjectNameInfo->Name.Length == 2 * sizeof(WCHAR) && + ObjectNameInfo->Name.Buffer[1] == L':' && + ( (ObjectNameInfo->Name.Buffer[0] >= L'A' && + ObjectNameInfo->Name.Buffer[0] <= L'Z') || + (ObjectNameInfo->Name.Buffer[0] >= L'a' && + ObjectNameInfo->Name.Buffer[0] <= L'z') )) + { + /* Remove the drive entry */ + KeAcquireGuardedMutex(&ObpDeviceMapLock); + ObSystemDeviceMap->DriveType[SymbolicLink->DosDeviceDriveIndex-1] = + DOSDEVICE_DRIVE_UNKNOWN; + ObSystemDeviceMap->DriveMap &= + ~(1 << (SymbolicLink->DosDeviceDriveIndex-1)); + KeReleaseGuardedMutex(&ObpDeviceMapLock); + + /* Reset the drive index, valid drive index starts from 1 */ + SymbolicLink->DosDeviceDriveIndex = 0; + } + + ObpDereferenceNameInfo(ObjectNameInfo); +} + +NTSTATUS +NTAPI +ObpParseSymbolicLinkToIoDeviceObject(IN POBJECT_DIRECTORY SymbolicLinkDirectory, + IN OUT POBJECT_DIRECTORY *Directory, + IN OUT PUNICODE_STRING TargetPath, + IN OUT POBP_LOOKUP_CONTEXT Context, + OUT PVOID *Object) +{ + UNICODE_STRING Name; + BOOLEAN ManualUnlock; + + if (! TargetPath || ! Object || ! Context || ! Directory || + ! SymbolicLinkDirectory) + { + return STATUS_INVALID_PARAMETER; + } + + /* FIXME: Need to support Device maps */ + + /* Try walking the target path and open each part of the path */ + while (TargetPath->Length) + { + /* Strip '\' if present at the beginning of the target path */ + if (TargetPath->Length >= sizeof(OBJ_NAME_PATH_SEPARATOR)&& + TargetPath->Buffer[0] == OBJ_NAME_PATH_SEPARATOR) + { + TargetPath->Buffer++; + TargetPath->Length -= sizeof(OBJ_NAME_PATH_SEPARATOR); + } + + /* Remember the current component of the target path */ + Name = *TargetPath; + + /* Move forward to the next component of the target path */ + while (TargetPath->Length >= sizeof(OBJ_NAME_PATH_SEPARATOR)) + { + if (TargetPath->Buffer[0] != OBJ_NAME_PATH_SEPARATOR) + { + TargetPath->Buffer++; + TargetPath->Length -= sizeof(OBJ_NAME_PATH_SEPARATOR); + } + else + break; + } + + Name.Length -= TargetPath->Length; + + /* Finished processing the entire path, stop */ + if (! Name.Length) + break; + + /* + * Make sure a deadlock does not occur as an exclusive lock on a pushlock + * would have already taken one in ObpLookupObjectName() on the parent + * directory where the symlink is being created [ObInsertObject()]. + * Prevent recursive locking by faking lock state in the lookup context + * when the current directory is same as the parent directory where + * the symlink is being created. If the lock state is not faked, + * ObpLookupEntryDirectory() will try to get a recursive lock on the + * pushlock and hang. For e.g. this happens when a substed drive is pointed to + * another substed drive. + */ + if (*Directory == SymbolicLinkDirectory && ! Context->DirectoryLocked) + { + /* Fake lock state so that ObpLookupEntryDirectory() doesn't attempt a lock */ + ManualUnlock = TRUE; + Context->DirectoryLocked = TRUE; + } + else + ManualUnlock = FALSE; + + *Object = ObpLookupEntryDirectory(*Directory, + &Name, + 0, + FALSE, + Context); + + /* Locking was faked, undo it now */ + if (*Directory == SymbolicLinkDirectory && ManualUnlock) + Context->DirectoryLocked = FALSE; + + /* Lookup failed, stop */ + if (! *Object) + break; + + if (OBJECT_TO_OBJECT_HEADER(*Object)->Type == ObDirectoryType) + { + /* Make this current directory, and continue search */ + *Directory = (POBJECT_DIRECTORY)*Object; + } + else if (OBJECT_TO_OBJECT_HEADER(*Object)->Type == ObSymbolicLinkType && + (((POBJECT_SYMBOLIC_LINK)*Object)->DosDeviceDriveIndex == 0)) + { + /* Symlink points to another initialized symlink, ask caller to reparse */ + *Directory = ObpRootDirectoryObject; + TargetPath = &((POBJECT_SYMBOLIC_LINK)*Object)->LinkTarget; + return STATUS_REPARSE_OBJECT; + } + else + { + /* Neither directory or symlink, stop */ + break; + } + } + + /* Return a valid object, only if object type is IoDeviceObject */ + if (*Object && + OBJECT_TO_OBJECT_HEADER(*Object)->Type != IoDeviceObjectType) + { + *Object = NULL; + } + return STATUS_SUCCESS; } VOID @@ -33,23 +185,124 @@ ObpCreateSymbolicLinkName(IN POBJECT_SYMBOLIC_LINK SymbolicLink) { POBJECT_HEADER ObjectHeader; POBJECT_HEADER_NAME_INFO ObjectNameInfo; + PVOID Object = NULL; + POBJECT_DIRECTORY Directory; + UNICODE_STRING TargetPath; + NTSTATUS Status; + ULONG DriveType = DOSDEVICE_DRIVE_CALCULATE; + ULONG ReparseCnt; + const ULONG MaxReparseAttempts = 20; + OBP_LOOKUP_CONTEXT Context; + + /* FIXME: Need to support Device maps */ /* Get header data */ ObjectHeader = OBJECT_TO_OBJECT_HEADER(SymbolicLink); - ObjectNameInfo = OBJECT_HEADER_TO_NAME_INFO(ObjectHeader); + ObjectNameInfo = ObpReferenceNameInfo(ObjectHeader); /* Check if we are not actually in a directory with a device map */ if (!(ObjectNameInfo) || - !(ObjectNameInfo->Directory) || - !(ObjectNameInfo->Directory->DeviceMap)) + !(ObjectNameInfo->Directory) /*|| + !(ObjectNameInfo->Directory->DeviceMap)*/) { - /* There's nothing to do, return */ + ObpDereferenceNameInfo(ObjectNameInfo); return; } - /* FIXME: We don't support device maps yet */ - DPRINT1("Unhandled path!\n"); - ASSERT(FALSE); + /* Check if it's a DOS drive letter, and set the drive index accordingly */ + if (ObjectNameInfo->Name.Length == 2 * sizeof(WCHAR) && + ObjectNameInfo->Name.Buffer[1] == L':' && + ( (ObjectNameInfo->Name.Buffer[0] >= L'A' && + ObjectNameInfo->Name.Buffer[0] <= L'Z') || + (ObjectNameInfo->Name.Buffer[0] >= L'a' && + ObjectNameInfo->Name.Buffer[0] <= L'z') )) + { + SymbolicLink->DosDeviceDriveIndex = + RtlUpcaseUnicodeChar(ObjectNameInfo->Name.Buffer[0]) - L'A'; + /* The Drive index start from 1 */ + SymbolicLink->DosDeviceDriveIndex++; + + /* Initialize lookup context */ + ObpInitializeLookupContext(&Context); + + /* Start the search from the root */ + Directory = ObpRootDirectoryObject; + TargetPath = SymbolicLink->LinkTarget; + + /* + * Locate the IoDeviceObject if any this symbolic link points to. + * To prevent endless reparsing, setting an upper limit on the + * number of reparses. + */ + Status = STATUS_REPARSE_OBJECT; + ReparseCnt = 0; + while (Status == STATUS_REPARSE_OBJECT && + ReparseCnt < MaxReparseAttempts) + { + Status = + ObpParseSymbolicLinkToIoDeviceObject(ObjectNameInfo->Directory, + &Directory, + &TargetPath, + &Context, + &Object); + if (Status == STATUS_REPARSE_OBJECT) + ReparseCnt++; + } + + /* Cleanup lookup context */ + ObpReleaseLookupContext(&Context); + + /* Error, or max resparse attemtps exceeded */ + if (! NT_SUCCESS(Status) || ReparseCnt >= MaxReparseAttempts) + { + /* Cleanup */ + ObpDereferenceNameInfo(ObjectNameInfo); + return; + } + + if (Object) + { + /* Calculate the drive type */ + switch(((PDEVICE_OBJECT)Object)->DeviceType) + { + case FILE_DEVICE_VIRTUAL_DISK: + DriveType = DOSDEVICE_DRIVE_RAMDISK; + break; + case FILE_DEVICE_CD_ROM: + case FILE_DEVICE_CD_ROM_FILE_SYSTEM: + DriveType = DOSDEVICE_DRIVE_CDROM; + break; + case FILE_DEVICE_DISK: + case FILE_DEVICE_DISK_FILE_SYSTEM: + case FILE_DEVICE_FILE_SYSTEM: + if (((PDEVICE_OBJECT)Object)->Characteristics & FILE_REMOVABLE_MEDIA) + DriveType = DOSDEVICE_DRIVE_REMOVABLE; + else + DriveType = DOSDEVICE_DRIVE_FIXED; + break; + case FILE_DEVICE_NETWORK: + case FILE_DEVICE_NETWORK_FILE_SYSTEM: + DriveType = DOSDEVICE_DRIVE_REMOTE; + break; + default: + DPRINT1("Device Type %ld for %wZ is not known or unhandled\n", + ((PDEVICE_OBJECT)Object)->DeviceType, + &SymbolicLink->LinkTarget); + DriveType = DOSDEVICE_DRIVE_UNKNOWN; + } + } + + /* Add a new drive entry */ + KeAcquireGuardedMutex(&ObpDeviceMapLock); + ObSystemDeviceMap->DriveType[SymbolicLink->DosDeviceDriveIndex-1] = + (UCHAR)DriveType; + ObSystemDeviceMap->DriveMap |= + 1 << (SymbolicLink->DosDeviceDriveIndex-1); + KeReleaseGuardedMutex(&ObpDeviceMapLock); + } + + /* Cleanup */ + ObpDereferenceNameInfo(ObjectNameInfo); } /*++ diff --git a/reactos/ntoskrnl/ob/obname.c b/reactos/ntoskrnl/ob/obname.c index a514af7b195..e4f7e184985 100644 --- a/reactos/ntoskrnl/ob/obname.c +++ b/reactos/ntoskrnl/ob/obname.c @@ -113,24 +113,28 @@ VOID NTAPI ObDereferenceDeviceMap(IN PEPROCESS Process) { - //KIRQL OldIrql; - PDEVICE_MAP DeviceMap = Process->DeviceMap; + PDEVICE_MAP DeviceMap; - /* FIXME: We don't use Process Devicemaps yet */ + /* Get the pointer to this process devicemap and reset it + holding devicemap lock */ + KeAcquireGuardedMutex(&ObpDeviceMapLock); + DeviceMap = Process->DeviceMap; + Process->DeviceMap = NULL; + KeReleaseGuardedMutex(&ObpDeviceMapLock); + + /* Continue only if there is a devicemap to dereference */ if (DeviceMap) { - /* FIXME: Acquire the DeviceMap Spinlock */ - // KeAcquireSpinLock(DeviceMap->Lock, &OldIrql); + KeAcquireGuardedMutex(&ObpDeviceMapLock); /* Delete the device map link and dereference it */ - Process->DeviceMap = NULL; if (--DeviceMap->ReferenceCount) { /* Nobody is referencing it anymore, unlink the DOS directory */ DeviceMap->DosDevicesDirectory->DeviceMap = NULL; - /* FIXME: Release the DeviceMap Spinlock */ - // KeReleasepinLock(DeviceMap->Lock, OldIrql); + /* Release the devicemap lock */ + KeReleaseGuardedMutex(&ObpDeviceMapLock); /* Dereference the DOS Devices Directory and free the Device Map */ ObDereferenceObject(DeviceMap->DosDevicesDirectory); @@ -138,8 +142,8 @@ ObDereferenceDeviceMap(IN PEPROCESS Process) } else { - /* FIXME: Release the DeviceMap Spinlock */ - // KeReleasepinLock(DeviceMap->Lock, OldIrql); + /* Release the devicemap lock */ + KeReleaseGuardedMutex(&ObpDeviceMapLock); } } } @@ -1144,15 +1148,12 @@ NTAPI ObQueryDeviceMapInformation(IN PEPROCESS Process, IN PPROCESS_DEVICEMAP_INFORMATION DeviceMapInfo) { - //KIRQL OldIrql ; - /* * FIXME: This is an ugly hack for now, to always return the System Device Map * instead of returning the Process Device Map. Not important yet since we don't use it */ - /* FIXME: Acquire the DeviceMap Spinlock */ - // KeAcquireSpinLock(DeviceMap->Lock, &OldIrql); + KeAcquireGuardedMutex(&ObpDeviceMapLock); /* Make a copy */ DeviceMapInfo->Query.DriveMap = ObSystemDeviceMap->DriveMap; @@ -1160,8 +1161,7 @@ ObQueryDeviceMapInformation(IN PEPROCESS Process, ObSystemDeviceMap->DriveType, sizeof(ObSystemDeviceMap->DriveType)); - /* FIXME: Release the DeviceMap Spinlock */ - // KeReleasepinLock(DeviceMap->Lock, OldIrql); + KeReleaseGuardedMutex(&ObpDeviceMapLock); } /* EOF */ diff --git a/reactos/subsystems/win32/csrss/win32csr/file.c b/reactos/subsystems/win32/csrss/win32csr/file.c index 862a01480f3..982e8feec54 100644 --- a/reactos/subsystems/win32/csrss/win32csr/file.c +++ b/reactos/subsystems/win32/csrss/win32csr/file.c @@ -59,7 +59,7 @@ CSR_API(CsrDefineDosDevice) DWORD dwFlags; PWSTR lpBuffer; - DPRINT("CsrDefineDosDevice entered, Flags:%d, DeviceName:%wZ, TargetName:%wZ\n", + DPRINT("CsrDefineDosDevice entered, Flags:%d, DeviceName:%wZ, TargetName:%wZ\n", Request->Data.DefineDosDeviceRequest.dwFlags, &Request->Data.DefineDosDeviceRequest.DeviceName, &Request->Data.DefineDosDeviceRequest.TargetName); @@ -98,6 +98,17 @@ CSR_API(CsrDefineDosDevice) RequestLinkTarget = &Request->Data.DefineDosDeviceRequest.TargetName; + /* + * Strip off any trailing '\', if we leave a trailing slash the drive remains non-accessible. + * So working around it for now. + * FIXME: Need to fix this in the object manager ObpLookupObjectName()??, and remove this when the its fixed. + */ + while (RequestLinkTarget->Length >= sizeof(WCHAR) && + RequestLinkTarget->Buffer[(RequestLinkTarget->Length/sizeof(WCHAR)) - 1] == L'\\') + { + RequestLinkTarget->Length -= sizeof(WCHAR); + } + lpBuffer = (PWSTR) RtlAllocateHeap(Win32CsrApiHeap, HEAP_ZERO_MEMORY, RequestDeviceName.MaximumLength + 5 * sizeof(WCHAR)); @@ -146,7 +157,7 @@ CSR_API(CsrDefineDosDevice) &LinkTarget, &Length); } - + if (! NT_SUCCESS(Status)) { DPRINT1("NtQuerySymbolicLinkObject(%wZ) failed (Status %lx)\n", @@ -188,7 +199,7 @@ CSR_API(CsrDefineDosDevice) CONTAINING_RECORD(Entry, CSRSS_DOS_DEVICE_HISTORY_ENTRY, Entry); - Matched = + Matched = ! RtlCompareUnicodeString(&RequestDeviceName, &HistoryEntry->Device, FALSE); @@ -459,7 +470,7 @@ CSR_API(CsrDefineDosDevice) &DeviceName, Status); } } - _SEH2_FINALLY + _SEH2_FINALLY { (void) RtlLeaveCriticalSection(&Win32CsrDefineDosDeviceCritSec); if (DeviceName.Buffer) @@ -504,13 +515,13 @@ CSR_API(CsrDefineDosDevice) return Status; } -void CsrCleanupDefineDosDevice() +void CsrCleanupDefineDosDevice(void) { PLIST_ENTRY Entry, ListHead; PCSRSS_DOS_DEVICE_HISTORY_ENTRY HistoryEntry; (void) RtlDeleteCriticalSection(&Win32CsrDefineDosDeviceCritSec); - + ListHead = &DosDeviceHistory; Entry = ListHead->Flink; while (Entry != ListHead) From 50c0e55317c428300196b5b8fc985fdf25ec60b5 Mon Sep 17 00:00:00 2001 From: Sylvain Petreolle Date: Mon, 25 Apr 2011 18:59:20 +0000 Subject: [PATCH 211/317] sndrec32, clb, shimgvw: French translations by Jason Toscano Corrections/adjustements by me svn path=/trunk/; revision=51453 --- .../applications/regedit/clb/lang/fr-FR.rc | 32 +++++++++++ reactos/base/applications/regedit/clb/rsrc.rc | 1 + .../base/applications/sndrec32/lang/en-US.rc | 4 +- .../base/applications/sndrec32/lang/fr-FR.rc | 54 +++++++++++++++++++ reactos/base/applications/sndrec32/rsrc.rc | 1 + reactos/dll/win32/shimgvw/lang/fr-FR.rc | 17 ++++++ reactos/dll/win32/shimgvw/rsrc.rc | 1 + 7 files changed, 108 insertions(+), 2 deletions(-) create mode 100644 reactos/base/applications/regedit/clb/lang/fr-FR.rc create mode 100644 reactos/base/applications/sndrec32/lang/fr-FR.rc create mode 100644 reactos/dll/win32/shimgvw/lang/fr-FR.rc diff --git a/reactos/base/applications/regedit/clb/lang/fr-FR.rc b/reactos/base/applications/regedit/clb/lang/fr-FR.rc new file mode 100644 index 00000000000..a532465a262 --- /dev/null +++ b/reactos/base/applications/regedit/clb/lang/fr-FR.rc @@ -0,0 +1,32 @@ +/* * + * French Language Resource File * + * Traduit par : Jeisson Toscano en 2011 * + * */ + +LANGUAGE LANG_FRENCH, SUBLANG_DEFAULT + +IDD_COLUMNLISTBOXSTYLES DIALOGEX 0, 0, 227, 215 +STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "Styles de Boites de la Liste de la Colonne" +FONT 8, "MS Shell Dlg", 0, 0, 0x0 +BEGIN + GROUPBOX "Styles des Colonne de la Liste", -1, 6, 7, 158, 71 + CHECKBOX "&Standard", 1710, 10, 20, 42, 10, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP + CHECKBOX "&Bordure", 1713, 10, 30, 34, 10, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP + CHECKBOX "&Ordre", 1705, 10, 40, 26, 10, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP + CHECKBOX "Notif&ier", 1706, 10, 50, 32, 10, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP + CHECKBOX "Barre de Dplac. V&ert.", 1707, 10, 60, 64, 10, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP + CHECKBOX "Slection &Multiple", -1, 79, 20, 72, 10, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP | WS_DISABLED + CHECKBOX "Slection E&tendue", -1, 79, 30, 77, 10, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP | WS_DISABLED + CHECKBOX "Montrer &Chevet", 1714, 79, 40, 68, 10, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP + CHECKBOX "Colonnes &Elastiques", 1715, 79, 50, 66, 10, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP + GROUPBOX "Styles Basiques", -1, 6, 80, 158, 34 + CHECKBOX "&Visible", 1701, 10, 92, 34, 10, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP + CHECKBOX "&Dsactiv", 1702, 10, 102, 41, 10, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP + CHECKBOX "&Groupe", 1703, 79, 92, 32, 10, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP + CHECKBOX "Arrter &Tab", 1704, 79, 102, 44, 10, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP + PUSHBUTTON "Accepter", IDOK, 37, 125, 40, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP + PUSHBUTTON "Annuler", IDCANCEL, 93, 125, 40, 14, BS_PUSHBUTTON | WS_GROUP | WS_TABSTOP + CHECKBOX "D&sactiver Non-Dplac.", 1708, 79, 60, 66, 10, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP +END + diff --git a/reactos/base/applications/regedit/clb/rsrc.rc b/reactos/base/applications/regedit/clb/rsrc.rc index 56462377a84..176f4217132 100644 --- a/reactos/base/applications/regedit/clb/rsrc.rc +++ b/reactos/base/applications/regedit/clb/rsrc.rc @@ -32,6 +32,7 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL #include "lang/de-DE.rc" #include "lang/el-GR.rc" #include "lang/en-US.rc" +#include "lang/fr-FR.rc" #include "lang/es-ES.rc" #include "lang/id-ID.rc" #include "lang/it-IT.rc" diff --git a/reactos/base/applications/sndrec32/lang/en-US.rc b/reactos/base/applications/sndrec32/lang/en-US.rc index 56ba98cb68a..35241be738b 100644 --- a/reactos/base/applications/sndrec32/lang/en-US.rc +++ b/reactos/base/applications/sndrec32/lang/en-US.rc @@ -8,11 +8,11 @@ END IDD_ABOUTBOX DIALOGEX 0, 0, 196, 75 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Information about reactOS_sndrec32" +CAPTION "Information about ReactOS Sound Recorder" FONT 8, "MS Shell Dlg", 0, 0, 0x1 BEGIN ICON 128,IDC_REACTOS_SNDREC32,19,14,21,20 - LTEXT "reactOS_sndrec32, version 1.0",IDC_STATIC,56,16,114,8,SS_NOPREFIX + LTEXT "ReactOS Sound Recorder, version 1.0",IDC_STATIC,56,16,114,8,SS_NOPREFIX LTEXT "Copyright (C) 2009",IDC_STATIC,55,25,114,8 DEFPUSHBUTTON "OK",IDOK,139,54,50,14,WS_GROUP END diff --git a/reactos/base/applications/sndrec32/lang/fr-FR.rc b/reactos/base/applications/sndrec32/lang/fr-FR.rc new file mode 100644 index 00000000000..403069e0793 --- /dev/null +++ b/reactos/base/applications/sndrec32/lang/fr-FR.rc @@ -0,0 +1,54 @@ +LANGUAGE LANG_FRENCH, SUBLANG_DEFAULT + +IDC_REACTOS_SNDREC32 ACCELERATORS +BEGIN + "?", IDM_ABOUT, ASCII, ALT + "/", IDM_ABOUT, ASCII, ALT +END + +IDD_ABOUTBOX DIALOGEX 0, 0, 196, 75 +STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Information propos de l'Enregistreur de Son ReactOS" +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + ICON 128,IDC_REACTOS_SNDREC32,19,14,21,20 + LTEXT "Enregistreur de Son ReactOS, version 1.0",IDC_STATIC,56,16,114,8,SS_NOPREFIX + LTEXT "Copyright (C) 2009",IDC_STATIC,55,25,114,8 + DEFPUSHBUTTON "Accepter",IDOK,139,54,50,14,WS_GROUP +END + +IDR_MENU1 MENU +BEGIN + POPUP "Fichier" + BEGIN + MENUITEM "Nouveau", ID_NEW + MENUITEM "Ouvrir...", ID_FILE_OPEN + MENUITEM "Enregistrer", ID_FILE_SAVE, GRAYED + MENUITEM "Enregistrer sous...", ID_FILE_SAVEAS, GRAYED + MENUITEM SEPARATOR + MENUITEM "Sortir", ID_EXIT + END + MENUITEM "todo1", 0 + MENUITEM "todo2", 0 + POPUP "?" + BEGIN + MENUITEM "A propos...", ID__ABOUT + END +END + +STRINGTABLE +BEGIN + IDS_APP_TITLE "Enregistreur de son" + IDC_REACTOS_SNDREC32 "REACTOS_SNDREC32" +END + +STRINGTABLE +BEGIN + IDS_STRPOS "Position: %.2f s" + IDS_STRDUR "Dure: %.2f s" + IDS_STRBUF "Buffer: %.2f kb" + IDS_STRFMT "%.1f kHz %u bits" + IDS_STRMONO "mono" + IDS_STRSTEREO "stro" + IDS_STRCHAN "%s" +END diff --git a/reactos/base/applications/sndrec32/rsrc.rc b/reactos/base/applications/sndrec32/rsrc.rc index ed4864a701d..a79028067df 100644 --- a/reactos/base/applications/sndrec32/rsrc.rc +++ b/reactos/base/applications/sndrec32/rsrc.rc @@ -20,6 +20,7 @@ IDB_BITMAP2_STOP_DIS BITMAP "resources/but_stop_dis.bmp" #include "lang/de-DE.rc" #include "lang/en-US.rc" #include "lang/es-ES.rc" +#include "lang/fr-FR.rc" #include "lang/it-IT.rc" #include "lang/ja-JP.rc" #include "lang/pl-PL.rc" diff --git a/reactos/dll/win32/shimgvw/lang/fr-FR.rc b/reactos/dll/win32/shimgvw/lang/fr-FR.rc new file mode 100644 index 00000000000..6440bae798f --- /dev/null +++ b/reactos/dll/win32/shimgvw/lang/fr-FR.rc @@ -0,0 +1,17 @@ +LANGUAGE LANG_FRENCH, SUBLANG_DEFAULT + +STRINGTABLE +BEGIN + IDS_APPTITLE "Visionneuse d'Images et Fax de ReactOS" + IDS_SETASDESKBG "Dfinir comme Arrire-plan du Bureau" + + /* Tooltips */ + IDS_TOOLTIP_NEXT_PIC "Image Suivante" + IDS_TOOLTIP_PREV_PIC "Image Prcdente" + IDS_TOOLTIP_ZOOM_IN "Augmenter (+)" + IDS_TOOLTIP_ZOOM_OUT "Diminuer (-)" + IDS_TOOLTIP_ROT_CLOCKW "Tourner dans le sens des aiguilles d'une montre (Ctrl+K)" + IDS_TOOLTIP_ROT_COUNCW "Tourner dans le sens oppos des aiguilles d'une montre (Ctrl+L)" + IDS_TOOLTIP_PRINT "Imprimer (Ctrl+P)" + IDS_TOOLTIP_SAVEAS "Enregistrer sous... (Ctrl+S)" +END diff --git a/reactos/dll/win32/shimgvw/rsrc.rc b/reactos/dll/win32/shimgvw/rsrc.rc index 3f4e96012fd..55f1bd3cb83 100644 --- a/reactos/dll/win32/shimgvw/rsrc.rc +++ b/reactos/dll/win32/shimgvw/rsrc.rc @@ -6,6 +6,7 @@ #include "lang/de-DE.rc" #include "lang/en-US.rc" #include "lang/es-ES.rc" +#include "lang/fr-FR.rc" #include "lang/it-IT.rc" #include "lang/no-NO.rc" #include "lang/lt-LT.rc" From d3561afa9552b5ee29a41b86077a0e43bc952e08 Mon Sep 17 00:00:00 2001 From: Sylvain Petreolle Date: Mon, 25 Apr 2011 19:02:07 +0000 Subject: [PATCH 212/317] [SHIMGVW] Implement imageview_fullscreenW. svn path=/trunk/; revision=51454 --- reactos/dll/win32/shimgvw/shimgvw.c | 6 ------ reactos/dll/win32/shimgvw/shimgvw.spec | 2 +- 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/reactos/dll/win32/shimgvw/shimgvw.c b/reactos/dll/win32/shimgvw/shimgvw.c index f27db29d45c..e8796499fac 100644 --- a/reactos/dll/win32/shimgvw/shimgvw.c +++ b/reactos/dll/win32/shimgvw/shimgvw.c @@ -519,12 +519,6 @@ ImageView_PrintToW(HWND hwnd, HINSTANCE hInst, LPCWSTR path, int nShow) DPRINT("ImageView_PrintToW() not implemented\n"); } -VOID WINAPI -imageview_fullscreenW(HWND hwnd, HINSTANCE hInst, LPCWSTR path, int nShow) -{ - DPRINT("ImageView_fullscreenW() not implemented\n"); -} - BOOL WINAPI DllMain(IN HINSTANCE hinstDLL, IN DWORD dwReason, diff --git a/reactos/dll/win32/shimgvw/shimgvw.spec b/reactos/dll/win32/shimgvw/shimgvw.spec index c01d347f35a..d66d9553f09 100644 --- a/reactos/dll/win32/shimgvw/shimgvw.spec +++ b/reactos/dll/win32/shimgvw/shimgvw.spec @@ -5,7 +5,7 @@ @ stdcall ImageView_PrintTo(ptr ptr wstr long) @ stdcall ImageView_PrintToA(ptr ptr str long) @ stdcall ImageView_PrintToW(ptr ptr wstr long) -@ stdcall imageview_fullscreenW(ptr ptr wstr long) +@ stdcall imageview_fullscreenW(ptr ptr wstr long) ImageView_FullscreenW @ stub ConvertDIBSECTIONToThumbnail @ stub DllCanUnloadNow @ stub DllGetClassObject From 2e7e8bb0f6bb1af0efc778f660ed660e5a2945a4 Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Mon, 25 Apr 2011 20:34:41 +0000 Subject: [PATCH 213/317] [MMIXER] - Merge 50674 to trunk: - Allocate memory for the logical pin array - Use the correct counter variable for logical pin array - Found by msvc See issue #6143 for more details. svn path=/trunk/; revision=51455 --- reactos/lib/drivers/sound/mmixer/sup.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/reactos/lib/drivers/sound/mmixer/sup.c b/reactos/lib/drivers/sound/mmixer/sup.c index 9052e94fb9c..6d83e2cc4cf 100644 --- a/reactos/lib/drivers/sound/mmixer/sup.c +++ b/reactos/lib/drivers/sound/mmixer/sup.c @@ -544,6 +544,14 @@ MMixerSetGetMuxControlDetails( ASSERT(MixerData->Topology); ASSERT(MixerData->MixerInfo == MixerInfo); + /* now allocate logical pin array */ + Status = MMixerAllocateTopologyNodeArray(MixerContext, MixerData->Topology, &LogicalNodes); + if (Status != MM_STATUS_SUCCESS) + { + /* no memory */ + return MM_STATUS_NO_MEMORY; + } + /* get logical pin nodes */ MMixerGetConnectedFromLogicalTopologyPins(MixerData->Topology, MixerControl->NodeID, &LogicalNodesCount, LogicalNodes); @@ -552,7 +560,7 @@ MMixerSetGetMuxControlDetails( ASSERT(LogicalNodesCount == MixerControl->Control.Metrics.dwReserved[0]); Values = (LPMIXERCONTROLDETAILS_BOOLEAN)MixerControlDetails->paDetails; - for(Index = 0; Index < ConnectedNodesCount; Index++) + for(Index = 0; Index < LogicalNodesCount; Index++) { /* getting logical pin offset */ MMixerGetLowestLogicalTopologyPinOffsetFromArray(LogicalNodesCount, LogicalNodes, &CurLogicalPinOffset); From 7ba64c2ad62a1d0abf4b023ff442dfa2569ced9a Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Mon, 25 Apr 2011 21:53:06 +0000 Subject: [PATCH 214/317] [win32k] Acquire ownership of the window clip region, before deleting it. Fixes a region leak. svn path=/trunk/; revision=51457 --- reactos/subsystems/win32/win32k/ntuser/window.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/reactos/subsystems/win32/win32k/ntuser/window.c b/reactos/subsystems/win32/win32k/ntuser/window.c index fe362174aa9..1b4c0b39461 100644 --- a/reactos/subsystems/win32/win32k/ntuser/window.c +++ b/reactos/subsystems/win32/win32k/ntuser/window.c @@ -210,7 +210,7 @@ IntEnableWindow( HWND hWnd, BOOL bEnable ) } pWnd->style |= WS_DISABLED; } - + if (Update) { IntNotifyWinEvent(EVENT_OBJECT_STATECHANGE, pWnd, OBJID_WINDOW, CHILDID_SELF, 0); @@ -517,6 +517,7 @@ static LRESULT co_UserFreeWindow(PWND Window, if(Window->hrgnClip) { + IntGdiSetRegionOwner(Window->hrgnClip, GDI_OBJ_HMGR_POWNED); GreDeleteObject(Window->hrgnClip); Window->hrgnClip = NULL; } @@ -2265,7 +2266,7 @@ cleanup: UserDereferenceObject(Window); } if (ParentWindow) UserDerefObjectCo(ParentWindow); - + return ret; } From e9b2fe6591ac8e0194a2e80811bf5ed6c22adc6e Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Mon, 25 Apr 2011 21:55:41 +0000 Subject: [PATCH 215/317] [CRT/MINGW-W64] * Call pei and __main before possible invocation of DllEntryPoint. By Kai Tietz. svn path=/trunk/; revision=51458 --- reactos/lib/3rdparty/mingw/crtdll.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/reactos/lib/3rdparty/mingw/crtdll.c b/reactos/lib/3rdparty/mingw/crtdll.c index f930f0d6a5a..55665bda536 100644 --- a/reactos/lib/3rdparty/mingw/crtdll.c +++ b/reactos/lib/3rdparty/mingw/crtdll.c @@ -179,6 +179,9 @@ __DllMainCRTStartup (HANDLE hDllHandle, DWORD dwReason, LPVOID lpreserved) retcode = FALSE; goto i__leave; } + _pei386_runtime_relocator (); + if (retcode && dwReason == DLL_PROCESS_ATTACH) + __main (); if (dwReason == DLL_PROCESS_ATTACH || dwReason == DLL_THREAD_ATTACH) { retcode = DllEntryPoint (hDllHandle, dwReason, lpreserved); @@ -187,9 +190,6 @@ __DllMainCRTStartup (HANDLE hDllHandle, DWORD dwReason, LPVOID lpreserved) if (! retcode) goto i__leave; } - _pei386_runtime_relocator (); - if (retcode && dwReason == DLL_PROCESS_ATTACH) - __main (); retcode = DllMain(hDllHandle,dwReason,lpreserved); if ((dwReason == DLL_PROCESS_ATTACH) && ! retcode) { From 16f7899e27292035679692d336d32cf51d81c244 Mon Sep 17 00:00:00 2001 From: James Tabor Date: Mon, 25 Apr 2011 23:14:06 +0000 Subject: [PATCH 216/317] [User32|Win32csr] - Move AppSwitch to User32. svn path=/trunk/; revision=51459 --- .../win32/user32/controls}/appswitch.c | 21 ++++++++++--------- reactos/dll/win32/user32/user32.rbuild | 1 + .../subsystems/win32/csrss/win32csr/dllmain.c | 2 -- .../win32/csrss/win32csr/win32csr.rbuild | 1 - 4 files changed, 12 insertions(+), 13 deletions(-) rename reactos/{subsystems/win32/csrss/win32csr => dll/win32/user32/controls}/appswitch.c (90%) diff --git a/reactos/subsystems/win32/csrss/win32csr/appswitch.c b/reactos/dll/win32/user32/controls/appswitch.c similarity index 90% rename from reactos/subsystems/win32/csrss/win32csr/appswitch.c rename to reactos/dll/win32/user32/controls/appswitch.c index f816a8303ad..f9cfc445d45 100644 --- a/reactos/subsystems/win32/csrss/win32csr/appswitch.c +++ b/reactos/dll/win32/user32/controls/appswitch.c @@ -2,14 +2,15 @@ /* * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries - * FILE: subsys/csrss/win32csr/appswitch.c + * FILE: dll/win32/user32/controls/appswitch.c * PURPOSE: app switching functionality * PROGRAMMERS: Johannes Anderwald (janderwald@reactos.org) */ -#define NDEBUG -#include "w32csr.h" -#include +#include + +#include +WINE_DEFAULT_DEBUG_CHANNEL(user32); typedef struct APPSWITCH_ITEM { @@ -55,7 +56,7 @@ EnumWindowEnumProc( hProcess = OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ, FALSE, dwPid); if (hProcess) { - if (GetModuleFileNameExW(hProcess, NULL, szFileName, MAX_PATH)) +// if (GetModuleFileNameExW(hProcess, NULL, szFileName, MAX_PATH)) { szFileName[MAX_PATH-1] = L'\0'; PrivateExtractIconExW(szFileName, 0, &hIcon, NULL, 1); @@ -70,7 +71,7 @@ EnumWindowEnumProc( /* get the text length */ Length = SendMessageW(hwnd, WM_GETTEXTLENGTH, 0, 0); /* allocate item structure for it */ - pItem = (PAPPSWITCH_ITEM)HeapAlloc(Win32CsrApiHeap, HEAP_ZERO_MEMORY, sizeof(APPSWITCH_ITEM) + Length * sizeof(WCHAR)); +// pItem = (PAPPSWITCH_ITEM)HeapAlloc(Win32CsrApiHeap, HEAP_ZERO_MEMORY, sizeof(APPSWITCH_ITEM) + Length * sizeof(WCHAR)); if (!pItem) return TRUE; if (Length) @@ -165,7 +166,7 @@ KeyboardHookProc( /* FIXME * launch window */ - DPRINT1("launch alt-tab window\n"); + FIXME("launch alt-tab window\n"); } else { @@ -205,7 +206,7 @@ PaintAppWindows(HWND hwndDlg, HDC hDc) SetRect(&Rect, X-5, Y-5, X + XSize + 5, Y + YSize + 5); FillRect(hDc, &Rect, hBrush); DeleteObject((HGDIOBJ)hBrush); - SendDlgItemMessageW(hwndDlg, IDC_STATIC_CUR_APP, WM_SETTEXT, 0, (LPARAM)pCurItem->szText); +// SendDlgItemMessageW(hwndDlg, IDC_STATIC_CUR_APP, WM_SETTEXT, 0, (LPARAM)pCurItem->szText); } DrawIcon(hDc, X, Y, pCurItem->hIcon); @@ -223,7 +224,7 @@ DestroyAppWindows() { pNextItem = pCurItem->Next; DestroyIcon(pCurItem->hIcon); - HeapFree(Win32CsrApiHeap, 0, pCurItem); +// HeapFree(Win32CsrApiHeap, 0, pCurItem); pCurItem = pNextItem; } pRoot = NULL; @@ -265,5 +266,5 @@ WINAPI InitializeAppSwitchHook() { hhk = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardHookProc, NULL, 0); - DPRINT("InitializeAppSwitchHook hhk %p\n", hhk); + TRACE("InitializeAppSwitchHook hhk %p\n", hhk); } diff --git a/reactos/dll/win32/user32/user32.rbuild b/reactos/dll/win32/user32/user32.rbuild index c2e8315666d..c159be03109 100644 --- a/reactos/dll/win32/user32/user32.rbuild +++ b/reactos/dll/win32/user32/user32.rbuild @@ -16,6 +16,7 @@ user32.h + appswitch.c button.c combo.c edit.c diff --git a/reactos/subsystems/win32/csrss/win32csr/dllmain.c b/reactos/subsystems/win32/csrss/win32csr/dllmain.c index 013b8b8556d..bf43ccf15d8 100644 --- a/reactos/subsystems/win32/csrss/win32csr/dllmain.c +++ b/reactos/subsystems/win32/csrss/win32csr/dllmain.c @@ -14,7 +14,6 @@ /* Not defined in any header file */ extern VOID WINAPI PrivateCsrssManualGuiCheck(LONG Check); -extern VOID WINAPI InitializeAppSwitchHook(); extern LIST_ENTRY DosDeviceHistory; extern RTL_CRITICAL_SECTION Win32CsrDefineDosDeviceCritSec; @@ -105,7 +104,6 @@ DllMain(HANDLE hDll, if (DLL_PROCESS_ATTACH == dwReason) { Win32CsrDllHandle = hDll; - InitializeAppSwitchHook(); } if (DLL_PROCESS_DETACH == dwReason) diff --git a/reactos/subsystems/win32/csrss/win32csr/win32csr.rbuild b/reactos/subsystems/win32/csrss/win32csr/win32csr.rbuild index d402dbb8427..783ebed027f 100644 --- a/reactos/subsystems/win32/csrss/win32csr/win32csr.rbuild +++ b/reactos/subsystems/win32/csrss/win32csr/win32csr.rbuild @@ -29,6 +29,5 @@ harderror.c lineinput.c tuiconsole.c - appswitch.c win32csr.rc From ee43f54510ac490e9116ad48ddab631bd41b1599 Mon Sep 17 00:00:00 2001 From: James Tabor Date: Tue, 26 Apr 2011 00:01:03 +0000 Subject: [PATCH 217/317] [Win32Csr] - Hack ReactOS to boot again! See bug 5655. svn path=/trunk/; revision=51460 --- .../subsystems/win32/csrss/win32csr/dllmain.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/reactos/subsystems/win32/csrss/win32csr/dllmain.c b/reactos/subsystems/win32/csrss/win32csr/dllmain.c index bf43ccf15d8..d8cfa8c8161 100644 --- a/reactos/subsystems/win32/csrss/win32csr/dllmain.c +++ b/reactos/subsystems/win32/csrss/win32csr/dllmain.c @@ -94,8 +94,20 @@ static CSRSS_API_DEFINITION Win32CsrApiDefinitions[] = { 0, 0, NULL } }; +static HHOOK hhk = NULL; + /* FUNCTIONS *****************************************************************/ +LRESULT +CALLBACK +KeyboardHookProc( + int nCode, + WPARAM wParam, + LPARAM lParam) +{ + return CallNextHookEx(hhk, nCode, wParam, lParam); +} + BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, @@ -104,6 +116,13 @@ DllMain(HANDLE hDll, if (DLL_PROCESS_ATTACH == dwReason) { Win32CsrDllHandle = hDll; +// +// HACK HACK HACK ReactOS to BOOT! Initialization BUG ALERT! See bug 5655. +// + hhk = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardHookProc, NULL, 0); +// BUG ALERT! BUG ALERT! BUG ALERT! BUG ALERT! BUG ALERT! BUG ALERT! BUG ALERT! +// BUG ALERT! BUG ALERT! BUG ALERT! BUG ALERT! BUG ALERT! BUG ALERT! BUG ALERT! +// BUG ALERT! BUG ALERT! BUG ALERT! BUG ALERT! BUG ALERT! BUG ALERT! BUG ALERT! } if (DLL_PROCESS_DETACH == dwReason) From 0f669f42d62ab063df4f02fb1a323fbdf0477291 Mon Sep 17 00:00:00 2001 From: James Tabor Date: Tue, 26 Apr 2011 03:31:15 +0000 Subject: [PATCH 218/317] [User32] - Sync up menu without the Right to Left support. Still missing needed changes for adding it. - Patches by Alexandre Julliard and Dmitry Timoshkov. svn path=/trunk/; revision=51461 --- reactos/dll/win32/user32/windows/menu.c | 67 +++++++++++-------------- 1 file changed, 28 insertions(+), 39 deletions(-) diff --git a/reactos/dll/win32/user32/windows/menu.c b/reactos/dll/win32/user32/windows/menu.c index 004eaa7886b..e98084950c3 100644 --- a/reactos/dll/win32/user32/windows/menu.c +++ b/reactos/dll/win32/user32/windows/menu.c @@ -511,57 +511,46 @@ static UINT FASTCALL MenuFindItemByKey(HWND WndOwner, PROSMENUINFO MenuInfo, TRACE("\tlooking for '%c' (0x%02x) in [%p]\n", (char) Key, Key, MenuInfo); if (NULL == MenuInfo || ! IsMenu(MenuInfo->Self)) - { + { if (MenuGetRosMenuInfo(&SysMenuInfo, GetSystemMenu(WndOwner, FALSE))) - { + { MenuInfo = &SysMenuInfo; - } + } else - { + { MenuInfo = NULL; - } - } + } + } if (NULL != MenuInfo) - { + { if (MenuGetAllRosMenuItemInfo(MenuInfo->Self, &Items) <= 0) - { + { return -1; - } - if (! ForceMenuChar) - { - Key = toupperW(Key); + } + if ( !ForceMenuChar ) + { ItemInfo = Items; for (i = 0; i < MenuInfo->MenuItemCount; i++, ItemInfo++) - { + { if ((ItemInfo->lpstr) && NULL != ItemInfo->dwTypeData) - { + { WCHAR *p = (WCHAR *) ItemInfo->dwTypeData - 2; do - { - p = strchrW(p + 2, '&'); - } - while (NULL != p && L'&' == p[1]); - if (NULL != p && (toupperW(p[1]) == Key)) - { - return i; - } - } - } - } + { + p = strchrW (p + 2, '&'); + } + while (p != NULL && p [1] == '&'); + if (p && (toupperW(p[1]) == toupperW(Key))) return i; + } + } + } MenuChar = SendMessageW(WndOwner, WM_MENUCHAR, MAKEWPARAM(Key, MenuInfo->Flags), (LPARAM) MenuInfo->Self); - if (2 == HIWORD(MenuChar)) - { - return LOWORD(MenuChar); - } - if (1 == HIWORD(MenuChar)) - { - return (UINT) (-2); - } + if (HIWORD(MenuChar) == MNC_EXECUTE) return LOWORD(MenuChar); + if (HIWORD(MenuChar) == MNC_CLOSE) return (UINT)(-2); } - return (UINT)(-1); } @@ -1576,12 +1565,12 @@ static BOOL FASTCALL MenuShowPopup(HWND hwndOwner, HMENU hmenu, UINT id, UINT fl MenuInfo.FocusedItem = NO_SELECTED_ITEM; } - /* ReactOS Check */ - if (!ValidateHwnd(hwndOwner)) - { // This window maybe already DEAD!!! + /* store the owner for DrawItem */ + if (!IsWindow(hwndOwner)) + { + SetLastError( ERROR_INVALID_WINDOW_HANDLE ); return FALSE; } - /* store the owner for DrawItem */ MenuInfo.WndOwner = hwndOwner; MenuSetRosMenuInfo(&MenuInfo); @@ -3673,7 +3662,7 @@ VOID MenuTrackKbdMenuBar(HWND hwnd, UINT wParam, WCHAR wChar) if( uItem == NO_SELECTED_ITEM ) MenuMoveSelection( hwnd, &MenuInfo, ITEM_NEXT ); else - PostMessageW( hwnd, WM_KEYDOWN, VK_DOWN, 0L ); + PostMessageW( hwnd, WM_KEYDOWN, VK_RETURN, 0 ); } track_menu: From 7ed79f5ff39004215a142ddbca6ba2cafd41760c Mon Sep 17 00:00:00 2001 From: Gabriel Ilardi Date: Wed, 27 Apr 2011 07:09:47 +0000 Subject: [PATCH 219/317] [SUBST] Add Italian and Spanish translations. svn path=/trunk/; revision=51463 --- reactos/base/system/subst/lang/es-ES.rc | 16 ++++++++++++++++ reactos/base/system/subst/lang/it-IT.rc | 16 ++++++++++++++++ reactos/base/system/subst/rsrc.rc | 2 ++ 3 files changed, 34 insertions(+) create mode 100644 reactos/base/system/subst/lang/es-ES.rc create mode 100644 reactos/base/system/subst/lang/it-IT.rc diff --git a/reactos/base/system/subst/lang/es-ES.rc b/reactos/base/system/subst/lang/es-ES.rc new file mode 100644 index 00000000000..7bbefe47299 --- /dev/null +++ b/reactos/base/system/subst/lang/es-ES.rc @@ -0,0 +1,16 @@ +#include "resource.h" +LANGUAGE LANG_SPANISH, SUBLANG_NEUTRAL + +STRINGTABLE +BEGIN + IDS_INCORRECT_PARAMETER_COUNT "Cantidad de parmetros incorrecta - %s\n" + IDS_INVALID_PARAMETER "Cantidad de parmetros incorrecta - %s\n" + IDS_INVALID_PARAMETER2 "Parmetro incorrecto - %s\n" + IDS_DRIVE_ALREAD_SUBSTED "Unidad ya sustituida\n" + IDS_FAILED_WITH_ERROCODE "Falla con cdigo de error 0x%x: %s\n" + IDS_USAGE "Asocia una ruta con una letra de unidad.\n\nSUBST [unidad1: [unidad2:]ruta]\nSUBST unidad1: /D\n\n unidad1: \ + Especifica una unidad virtual a la cual se quiere asignar una ruta.\n \ + [unidad2:]ruta Especifica una unidad fsica y una ruta a la cual asignar\n \ + una unidad virtual.\n /D \ + Elimina una unidad (virtual) substituida.\n\nEscribir SUBST sin parmetros para mostrar una lista de las unidades virtuales actuales.\n" +END diff --git a/reactos/base/system/subst/lang/it-IT.rc b/reactos/base/system/subst/lang/it-IT.rc new file mode 100644 index 00000000000..a77d9f112ae --- /dev/null +++ b/reactos/base/system/subst/lang/it-IT.rc @@ -0,0 +1,16 @@ +#include "resource.h" +LANGUAGE LANG_ITALIAN, SUBLANG_NEUTRAL + +STRINGTABLE +BEGIN + IDS_INCORRECT_PARAMETER_COUNT "Numero di parametri invalido - %s\n" + IDS_INVALID_PARAMETER "Incorrect number of parameters - %s\n" + IDS_INVALID_PARAMETER2 "Parametro invalido - %s\n" + IDS_DRIVE_ALREAD_SUBSTED "Unit gi sostituita\n" + IDS_FAILED_WITH_ERROCODE "Interruzione con codice di errore 0x%x: %s\n" + IDS_USAGE "Associa un percorso ad una lettera di unit.\n\nSUBST [unit1: [unit2:]percorso]\nSUBST unit1: /D\n\n unit1: \ + Specifica un'unit virtuale alla quale assegnare un percorso.\n \ + [unit2:]percorso Specifica un'unit fisica e un percorso da assegnare ad una\n \ + unit virtuale.\n /D \ + Elimina un'unit (virtuale) sostituita.\n\nDigitare SUBST senza parametri per mostrare un elenco delle unit virtuali attuali.\n" +END diff --git a/reactos/base/system/subst/rsrc.rc b/reactos/base/system/subst/rsrc.rc index a6f84e411dc..f50bcd93ef0 100644 --- a/reactos/base/system/subst/rsrc.rc +++ b/reactos/base/system/subst/rsrc.rc @@ -4,3 +4,5 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL #include "lang/en-US.rc" +#include "lang/es-ES.rc" +#include "lang/it-IT.rc" From e29b0d8b1fbc71df08c738d67b36cd2469d9ed48 Mon Sep 17 00:00:00 2001 From: Giannis Adamopoulos Date: Wed, 27 Apr 2011 12:33:16 +0000 Subject: [PATCH 220/317] [win32k] -Fix a case when a window is created and we don't have a monitor created yet. (This can happen when we may attempt to use gui on demand) svn path=/trunk/; revision=51464 --- reactos/subsystems/win32/win32k/ntuser/window.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/reactos/subsystems/win32/win32k/ntuser/window.c b/reactos/subsystems/win32/win32k/ntuser/window.c index 1b4c0b39461..8bb6b56277f 100644 --- a/reactos/subsystems/win32/win32k/ntuser/window.c +++ b/reactos/subsystems/win32/win32k/ntuser/window.c @@ -1555,7 +1555,15 @@ IntFixWindowCoordinates(CREATESTRUCTW* Cs, PWND ParentWindow, DWORD* dwShowMode) PRTL_USER_PROCESS_PARAMETERS ProcessParams; pMonitor = IntGetPrimaryMonitor(); - ASSERT(pMonitor); + + /* Check if we don't have a monitor attached yet */ + if(pMonitor == NULL) + { + Cs->x = Cs->y = 0; + Cs->cx = 800; + Cs->cy = 600; + return; + } ProcessParams = PsGetCurrentProcess()->Peb->ProcessParameters; From b39193c83d5ba1e2bce9e0293989b917c7a10edd Mon Sep 17 00:00:00 2001 From: James Tabor Date: Wed, 27 Apr 2011 23:09:45 +0000 Subject: [PATCH 221/317] [Win32k] - Fix KsStudios actions with Hooks. svn path=/trunk/; revision=51468 --- reactos/subsystems/win32/win32k/ntuser/defwnd.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/subsystems/win32/win32k/ntuser/defwnd.c b/reactos/subsystems/win32/win32k/ntuser/defwnd.c index f64caeb52c4..c2560749508 100644 --- a/reactos/subsystems/win32/win32k/ntuser/defwnd.c +++ b/reactos/subsystems/win32/win32k/ntuser/defwnd.c @@ -118,8 +118,8 @@ DefWndHandleSysCommand(PWND pWnd, WPARAM wParam, LPARAM lParam) break; default: - UNIMPLEMENTED; - break; + // We do not support anything else here so we should return normal even when sending a hook. + return 0; } return(Hook ? 1 : 0); // Don't call us again from user space. From de078e7357eacd7a1e862a00db6568e2bc40785d Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Wed, 27 Apr 2011 23:49:09 +0000 Subject: [PATCH 222/317] [WIN32K] Don't send messages from or to a thread in cleanup. Fixes possible deadlock. svn path=/trunk/; revision=51469 --- .../subsystems/win32/win32k/ntuser/msgqueue.c | 41 +++++++++++-------- 1 file changed, 24 insertions(+), 17 deletions(-) diff --git a/reactos/subsystems/win32/win32k/ntuser/msgqueue.c b/reactos/subsystems/win32/win32k/ntuser/msgqueue.c index e7371277601..cd57a5082a5 100644 --- a/reactos/subsystems/win32/win32k/ntuser/msgqueue.c +++ b/reactos/subsystems/win32/win32k/ntuser/msgqueue.c @@ -64,7 +64,7 @@ static void set_input_key_state( PUSER_MESSAGE_QUEUE MessageQueue, UCHAR key, BO { if (down) { - if (!(MessageQueue->KeyState[key] & KS_DOWN_BIT)) + if (!(MessageQueue->KeyState[key] & KS_DOWN_BIT)) { MessageQueue->KeyState[key] ^= KS_LOCK_BIT; } @@ -106,9 +106,9 @@ static void update_input_key_state( PUSER_MESSAGE_QUEUE MessageQueue, MSG* msg ) down = 1; /* fall through */ case WM_XBUTTONUP: - if (msg->wParam == XBUTTON1) + if (msg->wParam == XBUTTON1) set_input_key_state( MessageQueue, VK_XBUTTON1, down ); - else if (msg->wParam == XBUTTON2) + else if (msg->wParam == XBUTTON2) set_input_key_state( MessageQueue, VK_XBUTTON2, down ); break; case WM_KEYDOWN: @@ -223,7 +223,7 @@ ClearMsgBitsMask(PUSER_MESSAGE_QUEUE Queue, UINT MessageBits) pti = Queue->Thread->Tcb.Win32Thread; if (MessageBits & QS_KEY) - { + { if (--Queue->nCntsQBits[QSRosKey] == 0) ClrMask |= QS_KEY; } if (MessageBits & QS_MOUSEMOVE) // ReactOS hard coded. @@ -347,7 +347,7 @@ co_MsqInsertMouseMessage(MSG* Msg, DWORD flags, ULONG_PTR dwExtraInfo, BOOL Hook if(Msg->hwnd != NULL) { pwnd = UserGetWindowObject(Msg->hwnd); - if ((pwnd->style & WS_VISIBLE) && + if ((pwnd->style & WS_VISIBLE) && IntPtInWindow(pwnd, Msg->pt.x, Msg->pt.y)) { pDesk->htEx = HTCLIENT; @@ -367,7 +367,7 @@ co_MsqInsertMouseMessage(MSG* Msg, DWORD flags, ULONG_PTR dwExtraInfo, BOOL Hook continue; } - if((pwnd->style & WS_VISIBLE) && + if((pwnd->style & WS_VISIBLE) && IntPtInWindow(pwnd, Msg->pt.x, Msg->pt.y)) { Msg->hwnd = pwnd->head.h; @@ -817,7 +817,14 @@ co_MsqSendMessage(PUSER_MESSAGE_QUEUE MessageQueue, ptirec = MessageQueue->Thread->Tcb.Win32Thread; ASSERT(ThreadQueue != MessageQueue); ASSERT(ptirec->pcti); // Send must have a client side to receive it!!!! - + + /* Don't send from or to a dying thread */ + if (pti->TIF_flags & TIF_INCLEANUP || ptirec->TIF_flags & TIF_INCLEANUP) + { + *uResult = -1; + return STATUS_TIMEOUT; + } + Timeout.QuadPart = (LONGLONG) uTimeout * (LONGLONG) -10000; /* FIXME - increase reference counter of sender's message queue here */ @@ -1034,7 +1041,7 @@ static void MsqSendParentNotify( PWND pwnd, WORD event, WORD idChild, POINT pt ) if (pwndParent == pwndDesktop) break; pt.x += pwnd->rcClient.left - pwndParent->rcClient.left; pt.y += pwnd->rcClient.top - pwndParent->rcClient.top; - + pwnd = pwndParent; co_IntSendMessage( UserHMGetHandle(pwnd), WM_PARENTNOTIFY, MAKEWPARAM( event, idChild ), MAKELPARAM( pt.x, pt.y ) ); @@ -1076,7 +1083,7 @@ BOOL co_IntProcessMouseMessage(MSG* msg, BOOL* RemoveMessages, UINT first, UINT } DPRINT("Got mouse message for 0x%x, hittest: 0x%x\n", msg->hwnd, hittest ); - + if (pwndMsg == NULL || pwndMsg->head.pti != pti) { /* Remove and ignore the message */ @@ -1146,7 +1153,7 @@ BOOL co_IntProcessMouseMessage(MSG* msg, BOOL* RemoveMessages, UINT first, UINT } } - if (!((first == 0 && last == 0) || (message >= first || message <= last))) + if (!((first == 0 && last == 0) || (message >= first || message <= last))) { DPRINT("Message out of range!!!\n"); RETURN(FALSE); @@ -1267,8 +1274,8 @@ BOOL co_IntProcessMouseMessage(MSG* msg, BOOL* RemoveMessages, UINT first, UINT if (pwndTop && pwndTop != pwndDesktop) { - LONG ret = co_IntSendMessage( msg->hwnd, - WM_MOUSEACTIVATE, + LONG ret = co_IntSendMessage( msg->hwnd, + WM_MOUSEACTIVATE, (WPARAM)UserHMGetHandle(pwndTop), MAKELONG( hittest, msg->message)); switch(ret) @@ -1443,7 +1450,7 @@ co_MsqPeekHardwareMessage(IN PUSER_MESSAGE_QUEUE MessageQueue, CurrentMessage = CONTAINING_RECORD(CurrentEntry, USER_MESSAGE, ListEntry); - do + do { if (IsListEmpty(CurrentEntry)) break; if (!CurrentMessage) break; @@ -1490,7 +1497,7 @@ MsqPeekMessage(IN PUSER_MESSAGE_QUEUE MessageQueue, PLIST_ENTRY CurrentEntry; PUSER_MESSAGE CurrentMessage; PLIST_ENTRY ListHead; - + CurrentEntry = MessageQueue->PostedMessagesListHead.Flink; ListHead = &MessageQueue->PostedMessagesListHead; @@ -1542,7 +1549,7 @@ co_MsqWaitForNewMessages(PUSER_MESSAGE_QUEUE MessageQueue, PWND WndFilter, ret = KeWaitForSingleObject( MessageQueue->NewMessages, UserRequest, UserMode, - FALSE, + FALSE, NULL ); UserEnterCo(); return ret; @@ -1614,7 +1621,7 @@ MsqCleanupMessageQueue(PUSER_MESSAGE_QUEUE MessageQueue) PUSER_MESSAGE CurrentMessage; PUSER_SENT_MESSAGE CurrentSentMessage; PTHREADINFO pti; - + pti = MessageQueue->Thread->Tcb.Win32Thread; @@ -1642,7 +1649,7 @@ MsqCleanupMessageQueue(PUSER_MESSAGE_QUEUE MessageQueue) DPRINT("Notify the sender and remove a message from the queue that had not been dispatched\n"); /* Only if the message has a sender was the message in the DispatchingList */ - if ((CurrentSentMessage->SenderQueue) + if ((CurrentSentMessage->SenderQueue) && (CurrentSentMessage->DispatchingListEntry.Flink != NULL)) { RemoveEntryList(&CurrentSentMessage->DispatchingListEntry); From 9ff568fd7dad878066c33a83a054248b8f74ea0c Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Thu, 28 Apr 2011 08:26:46 +0000 Subject: [PATCH 223/317] [WIN32K] Rewrite of the GDI handle manager - The old handle manager used a completely retarded spinlock in combination with KeDelayExecutionThread() for both exclusive and shared locks. This is probably the most uneffective algorithm possible. It was also duplicating code everywhere and it was a overall mess It is now replaced with a lock-free reference counter for shared locks and a pushlock for exclusive locks. -> Better performance and scalability. - Allocate user mode object attributes from the new gdi pool. This way, we don't need any caching, since the pool serves as a cache. Its also much faster and uses much less memory. - Allow object allocations of different size, instead of fixed size from a table. This way a single allocation can take care of actual needs. - Allow allcoating objects without a handle and insert them into the handle table later - Properly synchronize the process GDIHandleCount. Now gdiview and taskmanager show the correct number of gdi handles. - Implement a new event tracking system, that is capable of tracking all reverences and locks of objects and pool allocations to help track possible leaks - Make sure that all objects of a process are deleted in cleanup - Make sure all usermode memory allocations are freed, when cleaning up the process pool. - Make sure that each object type is using the correct type of lock (either shared or exclusive, not a mixture) - Fix some object / reference leaks - Lots of inferface improvements - Use global variables for certain things instead of members in the mapped gdi handle table - Make IntSysCreateRectpRgn create a region without a handle - Fix detection od source and mask use in GreStretchBltMask - Use GDIOBJ_bLockMultipleObjects in NtGdiCombineRegion to avoid possible deadlocks - Fix NtGdiAbortPath to reset DCPATH_ACTIVE flag in the dc and only bail out on error, instead of always - Replace DC_AllocateDcAttr and DC_AllocDcAttr with DC_bAllocDcAttr using the new user mode pool - Remove DCU_SyncDcAttrtoUser and DCU_SynchDcAttrtoUser. Those functions were unused and didn't do anything useful anyway, - Replace IntGdiSetDCOwnerEx and DC_SetOwnership with GreSetDCOwner, remove unused NoSetBrush parameter - Replace GDIOBJ_bValidateHandle and IsObjectDead with GreIsHandleValid - Chage GDIOBJ_bLockMultipleObjects: pass object type, return a BOOL, whether all objects could be locked, cleanup on failure svn path=/trunk/; revision=51470 --- .../subsystems/win32/win32k/eng/driverobj.c | 10 +- .../subsystems/win32/win32k/eng/engbrush.c | 2 +- .../subsystems/win32/win32k/eng/engwindow.c | 2 +- reactos/subsystems/win32/win32k/eng/pdevobj.c | 3 +- reactos/subsystems/win32/win32k/eng/surface.c | 24 +- .../subsystems/win32/win32k/include/brush.h | 7 +- .../subsystems/win32/win32k/include/color.h | 6 +- reactos/subsystems/win32/win32k/include/dc.h | 31 +- reactos/subsystems/win32/win32k/include/dib.h | 2 +- .../win32/win32k/include/driverobj.h | 12 +- .../win32/win32k/include/gdidebug.h | 115 +- .../subsystems/win32/win32k/include/gdiobj.h | 224 +- .../subsystems/win32/win32k/include/misc.h | 60 + .../subsystems/win32/win32k/include/palette.h | 5 +- .../subsystems/win32/win32k/include/path.h | 6 +- reactos/subsystems/win32/win32k/include/pen.h | 8 +- .../subsystems/win32/win32k/include/region.h | 23 +- .../subsystems/win32/win32k/include/surface.h | 8 +- .../subsystems/win32/win32k/include/text.h | 6 +- .../subsystems/win32/win32k/include/win32.h | 6 + .../subsystems/win32/win32k/include/win32kp.h | 5 + .../subsystems/win32/win32k/main/dllmain.c | 14 +- .../subsystems/win32/win32k/ntddraw/dxeng.c | 2 +- .../win32/win32k/ntuser/cursoricon.c | 27 +- .../subsystems/win32/win32k/ntuser/desktop.c | 18 +- .../subsystems/win32/win32k/ntuser/message.c | 4 +- .../subsystems/win32/win32k/ntuser/monitor.c | 12 +- .../subsystems/win32/win32k/ntuser/painting.c | 52 +- .../win32/win32k/ntuser/sysparams.c | 4 +- reactos/subsystems/win32/win32k/ntuser/vis.c | 14 +- .../subsystems/win32/win32k/ntuser/windc.c | 36 +- .../subsystems/win32/win32k/ntuser/winpos.c | 31 +- .../subsystems/win32/win32k/ntuser/winsta.c | 14 +- .../subsystems/win32/win32k/objects/bitblt.c | 140 +- .../subsystems/win32/win32k/objects/bitmaps.c | 16 +- .../subsystems/win32/win32k/objects/brush.c | 244 +- .../subsystems/win32/win32k/objects/cliprgn.c | 46 +- .../subsystems/win32/win32k/objects/dcattr.c | 269 +- .../subsystems/win32/win32k/objects/dclife.c | 197 +- .../subsystems/win32/win32k/objects/dcobjs.c | 12 +- .../subsystems/win32/win32k/objects/dcstate.c | 8 +- .../subsystems/win32/win32k/objects/dibobj.c | 7 +- .../subsystems/win32/win32k/objects/drawing.c | 4 +- .../win32/win32k/objects/fillshap.c | 8 +- .../win32/win32k/objects/gdibatch.c | 10 +- .../subsystems/win32/win32k/objects/gdidbg.c | 175 +- .../subsystems/win32/win32k/objects/gdiobj.c | 2777 +++++++---------- .../subsystems/win32/win32k/objects/gdipool.c | 37 +- reactos/subsystems/win32/win32k/objects/icm.c | 7 +- .../subsystems/win32/win32k/objects/palette.c | 104 +- .../subsystems/win32/win32k/objects/path.c | 15 +- reactos/subsystems/win32/win32k/objects/pen.c | 16 +- .../subsystems/win32/win32k/objects/region.c | 304 +- reactos/subsystems/win32/win32k/win32k.rbuild | 3 +- 54 files changed, 2322 insertions(+), 2870 deletions(-) diff --git a/reactos/subsystems/win32/win32k/eng/driverobj.c b/reactos/subsystems/win32/win32k/eng/driverobj.c index cb6ff389450..3cd1f6fd02a 100644 --- a/reactos/subsystems/win32/win32k/eng/driverobj.c +++ b/reactos/subsystems/win32/win32k/eng/driverobj.c @@ -102,8 +102,9 @@ EngDeleteDriverObj( /* NOTE: We don't care about the bLocked param, as our handle manager allows freeing the object, while we hold any number of locks. */ - /* Free the object */ - return DRIVEROBJ_FreeObjectByHandle(hdo); + /* Delete the object */ + GDIOBJ_vDeleteObject(&pedo->baseobj); + return TRUE; } @@ -139,10 +140,11 @@ EngUnlockDriverObj( } /* Unlock object */ - cLocks = DRIVEROBJ_UnlockObject(pedo); + cLocks = pedo->baseobj.cExclusiveLock; + DRIVEROBJ_UnlockObject(pedo); /* Check if we still hold a lock */ - if (cLocks < 1) + if (cLocks < 2) { /* Object wasn't locked before, fail. */ return FALSE; diff --git a/reactos/subsystems/win32/win32k/eng/engbrush.c b/reactos/subsystems/win32/win32k/eng/engbrush.c index c61e0e47f9f..c52d8481b3e 100644 --- a/reactos/subsystems/win32/win32k/eng/engbrush.c +++ b/reactos/subsystems/win32/win32k/eng/engbrush.c @@ -37,7 +37,7 @@ EBRUSHOBJ_vInit(EBRUSHOBJ *pebo, PBRUSH pbrush, PDC pdc) ASSERT(pebo->psurfTrg->ppal); pebo->ppalSurf = pebo->psurfTrg->ppal; - GDIOBJ_IncrementShareCount(&pebo->ppalSurf->BaseObject); + GDIOBJ_vReferenceObjectByPointer(&pebo->ppalSurf->BaseObject); if (pbrush->flAttrs & GDIBRUSH_IS_NULL) { diff --git a/reactos/subsystems/win32/win32k/eng/engwindow.c b/reactos/subsystems/win32/win32k/eng/engwindow.c index 74f9ec99bb2..19d76be7aa3 100644 --- a/reactos/subsystems/win32/win32k/eng/engwindow.c +++ b/reactos/subsystems/win32/win32k/eng/engwindow.c @@ -117,7 +117,7 @@ IntEngWndUpdateClipObj( { DPRINT1("Warning: Couldn't lock visible region of window DC\n"); } - REGION_FreeRgnByHandle(hVisRgn); + GreDeleteObject(hVisRgn); } else { diff --git a/reactos/subsystems/win32/win32k/eng/pdevobj.c b/reactos/subsystems/win32/win32k/eng/pdevobj.c index 1acb8a55ec8..9d1ee125a7a 100644 --- a/reactos/subsystems/win32/win32k/eng/pdevobj.c +++ b/reactos/subsystems/win32/win32k/eng/pdevobj.c @@ -143,7 +143,6 @@ PDEVOBJ_bEnablePDEV( ppdev->gdiinfo.ulLogPixelsY = 96; /* Setup Palette */ - GDIOBJ_SetOwnership(ppdev->devinfo.hpalDefault, NULL); ppdev->ppalSurf = PALETTE_ShareLockPalette(ppdev->devinfo.hpalDefault); DPRINT("PDEVOBJ_bEnablePDEV - dhpdev = %p\n", ppdev->dhpdev); @@ -171,7 +170,7 @@ PDEVOBJ_pSurface( if (ppdev->pSurface) { /* Increment reference count */ - GDIOBJ_IncrementShareCount(&ppdev->pSurface->BaseObject); + GDIOBJ_vReferenceObjectByPointer(&ppdev->pSurface->BaseObject); } else { diff --git a/reactos/subsystems/win32/win32k/eng/surface.c b/reactos/subsystems/win32/win32k/eng/surface.c index 8e9c62871fc..fb59ff525a1 100644 --- a/reactos/subsystems/win32/win32k/eng/surface.c +++ b/reactos/subsystems/win32/win32k/eng/surface.c @@ -151,7 +151,7 @@ SURFACE_AllocSurface( } /* Allocate a SURFACE object */ - psurf = (PSURFACE)GDIOBJ_AllocObjWithHandle(GDI_OBJECT_TYPE_BITMAP); + psurf = (PSURFACE)GDIOBJ_AllocObjWithHandle(GDI_OBJECT_TYPE_BITMAP, sizeof(SURFACE)); if (psurf) { @@ -166,7 +166,7 @@ SURFACE_AllocSurface( /* Assign a default palette and increment its reference count */ psurf->ppal = appalSurfaceDefault[iFormat]; - GDIOBJ_IncrementShareCount(&psurf->ppal->BaseObject); + GDIOBJ_vReferenceObjectByPointer(&psurf->ppal->BaseObject); } return psurf; @@ -285,12 +285,12 @@ EngCreateBitmap( { /* Bail out if that failed */ DPRINT1("SURFACE_bSetBitmapBits failed.\n"); - SURFACE_FreeSurfaceByHandle(hbmp); + GDIOBJ_vDeleteObject(&psurf->BaseObject); return NULL; } /* Set public ownership */ - GDIOBJ_SetOwnership(hbmp, NULL); + GDIOBJ_vSetObjectOwner(&psurf->BaseObject, GDI_OBJ_HMGR_PUBLIC); /* Unlock the surface and return */ SURFACE_UnlockSurface(psurf); @@ -324,7 +324,7 @@ EngCreateDeviceBitmap( hbmp = (HBITMAP)psurf->SurfObj.hsurf; /* Set public ownership */ - GDIOBJ_SetOwnership(hbmp, NULL); + GDIOBJ_vSetObjectOwner(&psurf->BaseObject, GDI_OBJ_HMGR_PUBLIC); /* Unlock the surface and return */ SURFACE_UnlockSurface(psurf); @@ -355,7 +355,7 @@ EngCreateDeviceSurface( hsurf = psurf->SurfObj.hsurf; /* Set public ownership */ - GDIOBJ_SetOwnership(hsurf, NULL); + GDIOBJ_vSetObjectOwner(&psurf->BaseObject, GDI_OBJ_HMGR_PUBLIC); /* Unlock the surface and return */ SURFACE_UnlockSurface(psurf); @@ -448,8 +448,16 @@ BOOL APIENTRY EngDeleteSurface(IN HSURF hsurf) { - GDIOBJ_SetOwnership(hsurf, PsGetCurrentProcess()); - SURFACE_FreeSurfaceByHandle(hsurf); + PSURFACE psurf; + + psurf = SURFACE_ShareLockSurface(hsurf); + if (!psurf) + { + DPRINT1("Could not reference surface to delete\n"); + return FALSE; + } + + GDIOBJ_vDeleteObject(&psurf->BaseObject); return TRUE; } diff --git a/reactos/subsystems/win32/win32k/include/brush.h b/reactos/subsystems/win32/win32k/include/brush.h index 8c9a7a8b21f..7d3a73f9791 100644 --- a/reactos/subsystems/win32/win32k/include/brush.h +++ b/reactos/subsystems/win32/win32k/include/brush.h @@ -89,14 +89,11 @@ typedef struct _EBRUSHOBJ #define GDIBRUSH_CACHED_IS_SOLID 0x80000000 #define BRUSH_AllocBrush() ((PBRUSH) GDIOBJ_AllocObj(GDIObjType_BRUSH_TYPE)) -#define BRUSH_AllocBrushWithHandle() ((PBRUSH) GDIOBJ_AllocObjWithHandle (GDI_OBJECT_TYPE_BRUSH)) +#define BRUSH_AllocBrushWithHandle() ((PBRUSH) GDIOBJ_AllocObjWithHandle(GDI_OBJECT_TYPE_BRUSH, sizeof(BRUSH))) #define BRUSH_FreeBrush(pBrush) GDIOBJ_FreeObj((POBJ)pBrush, GDIObjType_BRUSH_TYPE) #define BRUSH_FreeBrushByHandle(hBrush) GDIOBJ_FreeObjByHandle((HGDIOBJ)hBrush, GDI_OBJECT_TYPE_BRUSH) -#define BRUSH_LockBrush(hBrush) ((PBRUSH)GDIOBJ_LockObj((HGDIOBJ)hBrush, GDI_OBJECT_TYPE_BRUSH)) -#define BRUSH_UnlockBrush(pBrush) GDIOBJ_UnlockObjByPtr((POBJ)pBrush) - #define BRUSH_ShareLockBrush(hBrush) ((PBRUSH)GDIOBJ_ShareLockObj((HGDIOBJ)hBrush, GDI_OBJECT_TYPE_BRUSH)) -#define BRUSH_ShareUnlockBrush(pBrush) GDIOBJ_ShareUnlockObjByPtr((POBJ)pBrush) +#define BRUSH_ShareUnlockBrush(pBrush) GDIOBJ_vDereferenceObject((POBJ)pBrush) INT FASTCALL BRUSH_GetObject (PBRUSH GdiObject, INT Count, LPLOGBRUSH Buffer); BOOL INTERNAL_CALL BRUSH_Cleanup(PVOID ObjectBody); diff --git a/reactos/subsystems/win32/win32k/include/color.h b/reactos/subsystems/win32/win32k/include/color.h index 233412e6ccd..0d90d526f70 100644 --- a/reactos/subsystems/win32/win32k/include/color.h +++ b/reactos/subsystems/win32/win32k/include/color.h @@ -18,11 +18,11 @@ typedef struct _COLORSPACE #define COLORSPACEOBJ_AllocCS() ((PCOLORSPACE) GDIOBJ_AllocObj(GDIObjType_ICMLCS_TYPE)) -#define COLORSPACEOBJ_AllocCSWithHandle() ((PCOLORSPACE) GDIOBJ_AllocObjWithHandle (GDI_OBJECT_TYPE_COLORSPACE)) +#define COLORSPACEOBJ_AllocCSWithHandle() ((PCOLORSPACE) GDIOBJ_AllocObjWithHandle(GDI_OBJECT_TYPE_COLORSPACE, sizeof(COLORSPACE))) #define COLORSPACEOBJ_FreeCS(pCS) GDIOBJ_FreeObj((POBJ)pCS, GDIObjType_ICMLCS_TYPE) #define COLORSPACEOBJ_FreeCSByHandle(hCS) GDIOBJ_FreeObjByHandle((HGDIOBJ)hCS, GDI_OBJECT_TYPE_COLORSPACE) -#define COLORSPACEOBJ_LockCS(hCS) ((PCOLORSPACE)GDIOBJ_LockObj((HGDIOBJ)hCS, GDI_OBJECT_TYPE_COLORSPACE)) -#define COLORSPACEOBJ_UnlockCS(pCS) GDIOBJ_UnlockObjByPtr((POBJ)pCS) +#define COLORSPACEOBJ_LockCS(hCS) ((PCOLORSPACE)GDIOBJ_LockObject((HGDIOBJ)hCS, GDIObjType_ICMLCS_TYPE)) +#define COLORSPACEOBJ_UnlockCS(pCS) GDIOBJ_vUnlockObject((POBJ)pCS) typedef struct _COLORTRANSFORMOBJ { diff --git a/reactos/subsystems/win32/win32k/include/dc.h b/reactos/subsystems/win32/win32k/include/dc.h index caf112b827e..a3c685e0dbb 100644 --- a/reactos/subsystems/win32/win32k/include/dc.h +++ b/reactos/subsystems/win32/win32k/include/dc.h @@ -149,18 +149,13 @@ typedef struct _DC /* Internal functions *********************************************************/ -#define DC_LockDc(hDC) \ - ((PDC) GDIOBJ_LockObj ((HGDIOBJ) hDC, GDI_OBJECT_TYPE_DC)) -#define DC_UnlockDc(pDC) \ - GDIOBJ_UnlockObjByPtr ((POBJ)pDC) - extern PDC defaultDCstate; INIT_FUNCTION NTSTATUS NTAPI InitDcImpl(VOID); PPDEVOBJ FASTCALL IntEnumHDev(VOID); PDC NTAPI DC_AllocDcWithHandle(VOID); VOID FASTCALL DC_InitDC(HDC DCToInit); -VOID FASTCALL DC_AllocateDcAttr(HDC); +BOOL NTAPI DC_bAllocDcAttr(PDC pdc); VOID FASTCALL DC_FreeDcAttr(HDC); BOOL INTERNAL_CALL DC_Cleanup(PVOID ObjectBody); BOOL FASTCALL DC_SetOwnership(HDC hDC, PEPROCESS Owner); @@ -203,6 +198,22 @@ BOOL FASTCALL IntGdiCleanDC(HDC hDC); VOID FASTCALL IntvGetDeviceCaps(PPDEVOBJ, PDEVCAPS); BOOL FASTCALL MakeInfoDC(PDC,BOOL); BOOL FASTCALL IntSetDefaultRegion(PDC); +BOOL NTAPI GreSetDCOwner(HDC hdc, ULONG ulOwner); + +FORCEINLINE +PDC +DC_LockDc(HDC hdc) +{ + //if (GDI_HANDLE_GET_TYPE(hdc) != GDILoObjType_LO_DC_TYPE) return NULL; ??? + return GDIOBJ_LockObject(hdc, GDIObjType_DC_TYPE); +} + +FORCEINLINE +VOID +DC_UnlockDc(PDC pdc) +{ + GDIOBJ_vUnlockObject(&pdc->BaseObject); +} VOID FORCEINLINE @@ -215,7 +226,7 @@ DC_vSelectSurface(PDC pdc, PSURFACE psurfNew) SURFACE_ShareUnlockSurface(psurfOld); } if (psurfNew) - GDIOBJ_IncrementShareCount((POBJ)psurfNew); + GDIOBJ_vReferenceObjectByPointer((POBJ)psurfNew); pdc->dclevel.pSurface = psurfNew; } @@ -227,7 +238,7 @@ DC_vSelectFillBrush(PDC pdc, PBRUSH pbrFill) if (pbrFillOld) BRUSH_ShareUnlockBrush(pbrFillOld); if (pbrFill) - GDIOBJ_IncrementShareCount((POBJ)pbrFill); + GDIOBJ_vReferenceObjectByPointer((POBJ)pbrFill); pdc->dclevel.pbrFill = pbrFill; } @@ -239,7 +250,7 @@ DC_vSelectLineBrush(PDC pdc, PBRUSH pbrLine) if (pbrLineOld) BRUSH_ShareUnlockBrush(pbrLineOld); if (pbrLine) - GDIOBJ_IncrementShareCount((POBJ)pbrLine); + GDIOBJ_vReferenceObjectByPointer((POBJ)pbrLine); pdc->dclevel.pbrLine = pbrLine; } @@ -251,7 +262,7 @@ DC_vSelectPalette(PDC pdc, PPALETTE ppal) if (ppalOld) PALETTE_ShareUnlockPalette(ppalOld); if (ppal) - GDIOBJ_IncrementShareCount((POBJ)ppal); + GDIOBJ_vReferenceObjectByPointer((POBJ)ppal); pdc->dclevel.ppal = ppal; } diff --git a/reactos/subsystems/win32/win32k/include/dib.h b/reactos/subsystems/win32/win32k/include/dib.h index 9d5b2b18462..42c4650f609 100644 --- a/reactos/subsystems/win32/win32k/include/dib.h +++ b/reactos/subsystems/win32/win32k/include/dib.h @@ -18,4 +18,4 @@ HPALETTE FASTCALL BuildDIBPalette (CONST BITMAPINFO *bmi); BITMAPINFO* FASTCALL DIB_ConvertBitmapInfo(CONST BITMAPINFO* bmi, DWORD Usage); -VOID FASTCALL DIB_FreeConvertedBitmapInfo(BITMAPINFO* converted, BITMAPINFO* orig); \ No newline at end of file +VOID FASTCALL DIB_FreeConvertedBitmapInfo(BITMAPINFO* converted, BITMAPINFO* orig); diff --git a/reactos/subsystems/win32/win32k/include/driverobj.h b/reactos/subsystems/win32/win32k/include/driverobj.h index 4056083528d..d40f662b70c 100644 --- a/reactos/subsystems/win32/win32k/include/driverobj.h +++ b/reactos/subsystems/win32/win32k/include/driverobj.h @@ -14,7 +14,13 @@ typedef struct _EDRIVEROBJ BOOL INTERNAL_CALL DRIVEROBJ_Cleanup(PVOID pObject); -#define DRIVEROBJ_AllocObjectWithHandle() ((PEDRIVEROBJ)GDIOBJ_AllocObjWithHandle(GDI_OBJECT_TYPE_DRIVEROBJ)) +#define DRIVEROBJ_AllocObjectWithHandle() ((PEDRIVEROBJ)GDIOBJ_AllocObjWithHandle(GDI_OBJECT_TYPE_DRIVEROBJ, sizeof(DRIVEROBJ))) #define DRIVEROBJ_FreeObjectByHandle(hdo) GDIOBJ_FreeObjByHandle((HGDIOBJ)hdo, GDI_OBJECT_TYPE_DRIVEROBJ) -#define DRIVEROBJ_LockObject(hdo) ((PEDRIVEROBJ)GDIOBJ_LockObj((HGDIOBJ)hdo, GDI_OBJECT_TYPE_DRIVEROBJ)) -#define DRIVEROBJ_UnlockObject(pdo) GDIOBJ_UnlockObjByPtr((POBJ)pdo) +#define DRIVEROBJ_UnlockObject(pdo) GDIOBJ_vUnlockObject((POBJ)pdo) + +FORCEINLINE +PEDRIVEROBJ +DRIVEROBJ_LockObject(HDRVOBJ hdo) +{ + return GDIOBJ_LockObject(hdo, GDIObjType_DRVOBJ_TYPE); +} diff --git a/reactos/subsystems/win32/win32k/include/gdidebug.h b/reactos/subsystems/win32/win32k/include/gdidebug.h index ffea26dcdc9..0f5221cc89f 100644 --- a/reactos/subsystems/win32/win32k/include/gdidebug.h +++ b/reactos/subsystems/win32/win32k/include/gdidebug.h @@ -1,12 +1,51 @@ #pragma once -extern ULONG gulDebugChannels; +typedef enum _LOG_EVENT_TYPE +{ + EVENT_ALLOCATE, + EVENT_CREATE_HANDLE, + EVENT_REFERENCE, + EVENT_DEREFERENCE, + EVENT_LOCK, + EVENT_UNLOCK, + EVENT_DELETE, + EVENT_FREE, + EVENT_SET_OWNER, +} LOG_EVENT_TYPE; -#define GDI_STACK_LEVELS 20 -extern ULONG_PTR GDIHandleAllocator[GDI_HANDLE_COUNT][GDI_STACK_LEVELS+1]; -extern ULONG_PTR GDIHandleLocker[GDI_HANDLE_COUNT][GDI_STACK_LEVELS+1]; -extern ULONG_PTR GDIHandleShareLocker[GDI_HANDLE_COUNT][GDI_STACK_LEVELS+1]; -extern ULONG_PTR GDIHandleDeleter[GDI_HANDLE_COUNT][GDI_STACK_LEVELS+1]; +typedef struct _LOGENTRY +{ + SLIST_ENTRY sleLink; + LOG_EVENT_TYPE nEventType; + DWORD dwProcessId; + DWORD dwThreadId; + ULONG ulUnique; + LPARAM lParam; + PVOID apvBackTrace[20]; + union + { + ULONG_PTR data1; + } data; +} LOGENTRY, *PLOGENTRY; + +#if DBG_ENABLE_EVENT_LOGGING +VOID NTAPI DbgDumpEventList(PSLIST_HEADER pslh); +VOID NTAPI DbgLogEvent(PSLIST_HEADER pslh, EVENT_TYPE nEventType, LPARAM lParam); +VOID NTAPI DbgCleanupEventList(PSLIST_HEADER pslh); +#define DBG_LOGEVENT(pslh, type, val) DbgLogEvent(pslh, type, (ULONG_PTR)val) +#define DBG_INITLOG(pslh) InitializeSListHead(pslh) +#define DBG_DUMP_EVENT_LIST(pslh) DbgDumpEventList(pslh) +#define DBG_CLEANUP_EVENT_LIST(pslh) DbgCleanupEventList(pslh) +#else +#define DBG_LOGEVENT(pslh, type, val) +#define DBG_INITLOG(pslh) +#define DBG_DUMP_EVENT_LIST(pslh) +#define DBG_CLEANUP_EVENT_LIST(pslh) +#endif + +extern ULONG gulLogUnique; + +extern ULONG gulDebugChannels; enum _DEBUGCHANNELS { @@ -17,73 +56,18 @@ enum _DEBUGCHANNELS DbgModeSwitch = 16, }; -void IntDumpHandleTable(PGDI_HANDLE_TABLE HandleTable); -ULONG CaptureStackBackTace(PVOID* pFrames, ULONG nFramesToCapture); -BOOL GdiDbgHTIntegrityCheck(VOID); -void GdiDbgDumpLockedHandles(VOID); +VOID NTAPI DbgDumpGdiHandleTable(VOID); +ULONG NTAPI DbgCaptureStackBackTace(PVOID* pFrames, ULONG nFramesToCapture); +BOOL NTAPI DbgGdiHTIntegrityCheck(VOID); +VOID NTAPI DbgDumpLockedGdiHandles(VOID); #define DBGENABLE(ch) gulDebugChannels |= (ch); #define DBGDISABLE(ch) gulDebugChannels &= ~(ch); #define DPRINTCH(ch) if (gulDebugChannels & (ch)) DbgPrint -#ifdef GDI_DEBUG - #define KeRosDumpStackFrames(Frames, Count) KdSystemDebugControl('DsoR', (PVOID)Frames, Count, NULL, 0, NULL, KernelMode) NTSYSAPI ULONG APIENTRY RtlWalkFrameChain(OUT PVOID *Callers, IN ULONG Count, IN ULONG Flags); -#define IS_HANDLE_VALID(idx) \ - ((GdiHandleTable->Entries[idx].Type & GDI_ENTRY_BASETYPE_MASK) != 0) - -#define GDIDBG_TRACECALLER() \ - DPRINT1("-> called from:\n"); \ - KeRosDumpStackFrames(NULL, 20); -#define GDIDBG_TRACEALLOCATOR(handle) \ - DPRINT1("-> allocated from:\n"); \ - KeRosDumpStackFrames(GDIHandleAllocator[GDI_HANDLE_GET_INDEX(handle)], GDI_STACK_LEVELS); -#define GDIDBG_TRACELOCKER(handle) \ - DPRINT1("-> locked from:\n"); \ - KeRosDumpStackFrames(GDIHandleLocker[GDI_HANDLE_GET_INDEX(handle)], GDI_STACK_LEVELS); -#define GDIDBG_TRACESHARELOCKER(handle) \ - DPRINT1("-> locked from:\n"); \ - KeRosDumpStackFrames(GDIHandleShareLocker[GDI_HANDLE_GET_INDEX(handle)], GDI_STACK_LEVELS); -#define GDIDBG_TRACEDELETER(handle) \ - DPRINT1("-> deleted from:\n"); \ - KeRosDumpStackFrames(GDIHandleDeleter[GDI_HANDLE_GET_INDEX(handle)], GDI_STACK_LEVELS); -#define GDIDBG_CAPTUREALLOCATOR(handle) \ - CaptureStackBackTace((PVOID*)GDIHandleAllocator[GDI_HANDLE_GET_INDEX(handle)], GDI_STACK_LEVELS); -#define GDIDBG_CAPTURELOCKER(handle) \ - CaptureStackBackTace((PVOID*)GDIHandleLocker[GDI_HANDLE_GET_INDEX(handle)], GDI_STACK_LEVELS); -#define GDIDBG_CAPTURESHARELOCKER(handle) \ - CaptureStackBackTace((PVOID*)GDIHandleShareLocker[GDI_HANDLE_GET_INDEX(handle)], GDI_STACK_LEVELS); -#define GDIDBG_CAPTUREDELETER(handle) \ - CaptureStackBackTace((PVOID*)GDIHandleDeleter[GDI_HANDLE_GET_INDEX(handle)], GDI_STACK_LEVELS); -#define GDIDBG_DUMPHANDLETABLE() \ - IntDumpHandleTable(GdiHandleTable) -#define GDIDBG_INITLOOPTRACE() \ - ULONG Attempts = 0; -#define GDIDBG_TRACELOOP(Handle, PrevThread, Thread) \ - if ((++Attempts % 20) == 0) \ - { \ - DPRINT1("[%d] Handle 0x%p Locked by 0x%x (we're 0x%x)\n", Attempts, Handle, PrevThread, Thread); \ - } - -#else - -#define GDIDBG_TRACECALLER() -#define GDIDBG_TRACEALLOCATOR(index) -#define GDIDBG_TRACELOCKER(index) -#define GDIDBG_TRACESHARELOCKER(index) -#define GDIDBG_CAPTUREALLOCATOR(index) -#define GDIDBG_CAPTURELOCKER(index) -#define GDIDBG_CAPTURESHARELOCKER(index) -#define GDIDBG_CAPTUREDELETER(handle) -#define GDIDBG_DUMPHANDLETABLE() -#define GDIDBG_INITLOOPTRACE() -#define GDIDBG_TRACELOOP(Handle, PrevThread, Thread) -#define GDIDBG_TRACEDELETER(handle) - -#endif /* GDI_DEBUG */ - #if DBG void NTAPI @@ -104,7 +88,6 @@ GdiDbgAssertNoLocks(char * pszFile, ULONG nLine) { DbgPrint("(%s:%ld) There are %ld exclusive locks!\n", pszFile, nLine, pti->cExclusiveLocks); - GdiDbgDumpLockedHandles(); ASSERT(FALSE); } } diff --git a/reactos/subsystems/win32/win32k/include/gdiobj.h b/reactos/subsystems/win32/win32k/include/gdiobj.h index 032acc2c523..de1e89b1959 100644 --- a/reactos/subsystems/win32/win32k/include/gdiobj.h +++ b/reactos/subsystems/win32/win32k/include/gdiobj.h @@ -9,7 +9,7 @@ #include #include "win32.h" -/* apparently the first 10 entries are never used in windows as they are empty */ +/* The first 10 entries are never used in windows, they are empty */ #define RESERVE_ENTRIES_COUNT 10 typedef struct _GDI_HANDLE_TABLE @@ -24,11 +24,7 @@ typedef struct _GDI_HANDLE_TABLE PVOID pvLangPack; // Language Pack. CFONT cfPublic[GDI_CFONT_MAX]; // Public Fonts. DWORD dwCFCount; -////////////////////////////////////////////////////////////////////////////// - PPAGED_LOOKASIDE_LIST LookasideLists; - ULONG FirstFree; - ULONG FirstUnused; } GDI_HANDLE_TABLE, *PGDI_HANDLE_TABLE; @@ -42,19 +38,19 @@ typedef BOOL (INTERNAL_CALL *GDICLEANUPPROC)(PVOID ObjectBody); * It's for thread locking. */ typedef struct _BASEOBJECT { - HGDIOBJ hHmgr; - ULONG ulShareCount; - USHORT cExclusiveLock; - USHORT BaseFlags; - PTHREADINFO Tid; - EX_PUSH_LOCK pushlock; + HGDIOBJ hHmgr; + union { + ULONG ulShareCount; /* For objects without a handle */ + DWORD dwThreadId; /* Exclusive lock owner */ + }; + USHORT cExclusiveLock; + USHORT BaseFlags; + EX_PUSH_LOCK pushlock; +#if DBG_ENABLE_EVENT_LOGGING + SLIST_HEADER slhLog; +#endif } BASEOBJECT, *POBJ; -typedef struct _CLIENTOBJ -{ - BASEOBJECT BaseObject; -} CLIENTOBJ, *PCLIENTOBJ; - enum BASEFLAGS { BASEFLAG_LOOKASIDE = 0x80, @@ -63,103 +59,125 @@ enum BASEFLAGS BASEFLAG_READY_TO_DIE = 0x1000 }; -BOOL INTERNAL_CALL GDIOBJ_OwnedByCurrentProcess(HGDIOBJ ObjectHandle); -BOOL INTERNAL_CALL GDIOBJ_SetOwnership(HGDIOBJ ObjectHandle, PEPROCESS Owner); -BOOL INTERNAL_CALL GDIOBJ_CopyOwnership(HGDIOBJ CopyFrom, HGDIOBJ CopyTo); -BOOL INTERNAL_CALL GDIOBJ_ConvertToStockObj(HGDIOBJ *hObj); -//VOID INTERNAL_CALL GDIOBJ_ShareUnlockObjByPtr(POBJ Object); -BOOL INTERNAL_CALL GDIOBJ_ValidateHandle(HGDIOBJ hObj, ULONG ObjectType); -POBJ INTERNAL_CALL GDIOBJ_AllocObj(UCHAR ObjectType); -POBJ INTERNAL_CALL GDIOBJ_AllocObjWithHandle(ULONG ObjectType); -VOID INTERNAL_CALL GDIOBJ_FreeObj (POBJ pObj, UCHAR ObjectType); -BOOL INTERNAL_CALL GDIOBJ_FreeObjByHandle (HGDIOBJ hObj, DWORD ObjectType); -PGDIOBJ INTERNAL_CALL GDIOBJ_LockObj (HGDIOBJ hObj, DWORD ObjectType); -PGDIOBJ INTERNAL_CALL GDIOBJ_ShareLockObj (HGDIOBJ hObj, DWORD ObjectType); -VOID INTERNAL_CALL GDIOBJ_LockMultipleObjs(ULONG ulCount, IN HGDIOBJ* ahObj, OUT PGDIOBJ* apObj); +typedef struct _CLIENTOBJ +{ + BASEOBJECT BaseObject; +} CLIENTOBJ, *PCLIENTOBJ; -PVOID INTERNAL_CALL GDI_MapHandleTable(PEPROCESS Process); +#define GDIOBJFLAG_DEFAULT (0x0) +#define GDIOBJFLAG_IGNOREPID (0x1) +#define GDIOBJFLAG_IGNORELOCK (0x2) INIT_FUNCTION NTSTATUS NTAPI InitGdiHandleTable(VOID); -#define GDIOBJ_GetObjectType(Handle) \ - GDI_HANDLE_GET_TYPE(Handle) +BOOL +NTAPI +GreIsHandleValid( + HGDIOBJ hobj); -#define GDIOBJFLAG_DEFAULT (0x0) -#define GDIOBJFLAG_IGNOREPID (0x1) -#define GDIOBJFLAG_IGNORELOCK (0x2) - -BOOL FASTCALL GreDeleteObject(HGDIOBJ hObject); -BOOL FASTCALL IsObjectDead(HGDIOBJ); -BOOL FASTCALL IntGdiSetDCOwnerEx( HDC, DWORD, BOOL); -BOOL FASTCALL IntGdiSetRegionOwner(HRGN,DWORD); - -/*! - * Release GDI object. Every object locked by GDIOBJ_LockObj() must be unlocked. - * You should unlock the object - * as soon as you don't need to have access to it's data. - - * \param Object Object pointer (as returned by GDIOBJ_LockObj). - */ -ULONG -FORCEINLINE -GDIOBJ_UnlockObjByPtr(POBJ Object) -{ -#if DBG - PTHREADINFO pti = (PTHREADINFO)PsGetCurrentThreadWin32Thread(); - if (pti) - { - if (pti->cExclusiveLocks < 1) - { - DbgPrint("cExclusiveLocks = %ld, object: %ld\n", - pti->cExclusiveLocks, Object->cExclusiveLock); - ASSERT(FALSE); - } - pti->cExclusiveLocks--; - } -#endif - INT cLocks = InterlockedDecrement((PLONG)&Object->cExclusiveLock); - ASSERT(cLocks >= 0); - return cLocks; -} +BOOL +NTAPI +GreDeleteObject( + HGDIOBJ hObject); ULONG -FORCEINLINE -GDIOBJ_ShareUnlockObjByPtr(POBJ Object) -{ - HGDIOBJ hobj = Object->hHmgr; - USHORT flags = Object->BaseFlags; - INT cLocks = InterlockedDecrement((PLONG)&Object->ulShareCount); - ASSERT(cLocks >= 0); - if ((flags & BASEFLAG_READY_TO_DIE) && (cLocks == 0)) - { - ASSERT(Object->cExclusiveLock == 0); - GDIOBJ_SetOwnership(hobj, PsGetCurrentProcess()); - GDIOBJ_FreeObjByHandle(hobj, GDI_OBJECT_TYPE_DONTCARE); - } - return cLocks; -} +NTAPI +GreGetObjectOwner( + HGDIOBJ hobj); -#ifdef GDI_DEBUG -ULONG FASTCALL GDIOBJ_IncrementShareCount(POBJ Object); -#else -ULONG -FORCEINLINE -GDIOBJ_IncrementShareCount(POBJ Object) -{ - INT cLocks = InterlockedIncrement((PLONG)&Object->ulShareCount); - ASSERT(cLocks >= 1); - return cLocks; -} -#endif +BOOL +NTAPI +GreSetObjectOwner( + HGDIOBJ hobj, + ULONG ulOwner); -INT FASTCALL GreGetObjectOwner(HGDIOBJ, GDIOBJTYPE); +INT +NTAPI +GreGetObject( + IN HGDIOBJ hobj, + IN INT cbCount, + IN PVOID pvBuffer); + +POBJ +NTAPI +GDIOBJ_AllocateObject( + UCHAR objt, + ULONG cjSize, + FLONG fl); + +VOID +NTAPI +GDIOBJ_vDeleteObject( + POBJ pobj); + +POBJ +NTAPI +GDIOBJ_ReferenceObjectByHandle( + HGDIOBJ hobj, + UCHAR objt); + +VOID +NTAPI +GDIOBJ_vReferenceObjectByPointer( + POBJ pobj); + +VOID +NTAPI +GDIOBJ_vDereferenceObject( + POBJ pobj); + +PGDIOBJ +NTAPI +GDIOBJ_LockObject( + HGDIOBJ hobj, + UCHAR objt); + +VOID +NTAPI +GDIOBJ_vUnlockObject( + POBJ pobj); + +VOID +NTAPI +GDIOBJ_vSetObjectOwner( + POBJ pobj, + ULONG ulOwner); + +BOOL +NTAPI +GDIOBJ_bLockMultipleObjects( + ULONG ulCount, + HGDIOBJ* ahObj, + PGDIOBJ* apObj, + UCHAR objt); + +HGDIOBJ +NTAPI +GDIOBJ_hInsertObject( + POBJ pobj, + ULONG ulOwner); + +VOID +NTAPI +GDIOBJ_vFreeObject( + POBJ pobj); + +VOID +NTAPI +GDIOBJ_vSetObjectAttr( + POBJ pobj, + PVOID pvObjAttr); + +PVOID +NTAPI +GDIOBJ_pvGetObjectAttr( + POBJ pobj); + +BOOL INTERNAL_CALL GDIOBJ_ConvertToStockObj(HGDIOBJ *hObj); +POBJ INTERNAL_CALL GDIOBJ_AllocObjWithHandle(ULONG ObjectType, ULONG cjSize); +PGDIOBJ INTERNAL_CALL GDIOBJ_ShareLockObj(HGDIOBJ hObj, DWORD ObjectType); +PVOID INTERNAL_CALL GDI_MapHandleTable(PEPROCESS Process); -#define GDIOBJ_GetKernelObj(Handle) \ - ((PGDI_TABLE_ENTRY)&GdiHandleTable->Entries[GDI_HANDLE_GET_INDEX(Handle)])->KernelData -#define GDI_ENTRY_TO_INDEX(ht, e) \ - (((ULONG_PTR)(e) - (ULONG_PTR)&((ht)->Entries[0])) / sizeof(GDI_TABLE_ENTRY)) -#define GDI_HANDLE_GET_ENTRY(HandleTable, h) \ - (&(HandleTable)->Entries[GDI_HANDLE_GET_INDEX((h))]) diff --git a/reactos/subsystems/win32/win32k/include/misc.h b/reactos/subsystems/win32/win32k/include/misc.h index 26a35d4925a..0a905b9b2c0 100644 --- a/reactos/subsystems/win32/win32k/include/misc.h +++ b/reactos/subsystems/win32/win32k/include/misc.h @@ -77,3 +77,63 @@ RegWriteUserSetting( VOID FASTCALL SetLastNtError( NTSTATUS Status); + +typedef struct _GDI_POOL *PGDI_POOL; + +PGDI_POOL +NTAPI +GdiPoolCreate( + ULONG cjAllocSize, + ULONG ulTag); + +VOID +NTAPI +GdiPoolDestroy(PGDI_POOL pPool); + +PVOID +NTAPI +GdiPoolAllocate( + PGDI_POOL pPool); + +VOID +NTAPI +GdiPoolFree( + PGDI_POOL pPool, + PVOID pvAlloc); + +FORCEINLINE +VOID +ExAcquirePushLockExclusive(PEX_PUSH_LOCK PushLock) +{ + /* Try acquiring the lock */ + if (InterlockedBitTestAndSet((PLONG)PushLock, EX_PUSH_LOCK_LOCK_V)) + { + /* Someone changed it, use the slow path */ + ExfAcquirePushLockExclusive(PushLock); + } +} + +FORCEINLINE +VOID +ExReleasePushLockExclusive(PEX_PUSH_LOCK PushLock) +{ + EX_PUSH_LOCK OldValue; + + /* Unlock the pushlock */ + OldValue.Value = InterlockedExchangeAddSizeT((PSIZE_T)PushLock, + -(SSIZE_T)EX_PUSH_LOCK_LOCK); + /* Check if anyone is waiting on it and it's not already waking */ + if ((OldValue.Waiting) && !(OldValue.Waking)) + { + /* Wake it up */ + ExfTryToWakePushLock(PushLock); + } +} + +FORCEINLINE +VOID +_ExInitializePushLock(PEX_PUSH_LOCK Lock) +{ + *(PULONG_PTR)Lock = 0; +} +#define ExInitializePushLock _ExInitializePushLock diff --git a/reactos/subsystems/win32/win32k/include/palette.h b/reactos/subsystems/win32/win32k/include/palette.h index 10d6dffbae6..faea86c18f4 100644 --- a/reactos/subsystems/win32/win32k/include/palette.h +++ b/reactos/subsystems/win32/win32k/include/palette.h @@ -65,13 +65,12 @@ HPALETTE FASTCALL PALETTE_AllocPaletteIndexedRGB(ULONG NumColors, CONST RGBQUAD *Colors); #define PALETTE_FreePalette(pPalette) GDIOBJ_FreeObj((POBJ)pPalette, GDIObjType_PAL_TYPE) #define PALETTE_FreePaletteByHandle(hPalette) GDIOBJ_FreeObjByHandle((HGDIOBJ)hPalette, GDI_OBJECT_TYPE_PALETTE) -#define PALETTE_LockPalette(hPalette) ((PPALETTE)GDIOBJ_LockObj((HGDIOBJ)hPalette, GDI_OBJECT_TYPE_PALETTE)) -#define PALETTE_UnlockPalette(pPalette) GDIOBJ_UnlockObjByPtr((POBJ)pPalette) +#define PALETTE_UnlockPalette(pPalette) GDIOBJ_vUnlockObject((POBJ)pPalette) #define PALETTE_ShareLockPalette(hpal) \ ((PPALETTE)GDIOBJ_ShareLockObj((HGDIOBJ)hpal, GDI_OBJECT_TYPE_PALETTE)) #define PALETTE_ShareUnlockPalette(ppal) \ - GDIOBJ_ShareUnlockObjByPtr(&ppal->BaseObject) + GDIOBJ_vDereferenceObject(&ppal->BaseObject) BOOL INTERNAL_CALL PALETTE_Cleanup(PVOID ObjectBody); INIT_FUNCTION NTSTATUS NTAPI InitPaletteImpl(VOID); diff --git a/reactos/subsystems/win32/win32k/include/path.h b/reactos/subsystems/win32/win32k/include/path.h index b8c17786fa9..451a5a27536 100644 --- a/reactos/subsystems/win32/win32k/include/path.h +++ b/reactos/subsystems/win32/win32k/include/path.h @@ -19,7 +19,7 @@ typedef enum tagGdiPathState typedef struct _PATH { BASEOBJECT BaseObject; - + RECTFX rcfxBoundBox; POINTFX ptfxSubPathStart; @@ -39,11 +39,11 @@ typedef struct _EPATHOBJ } EPATHOBJ, *PEPATHOBJ; #define PATH_AllocPath() ((PPATH) GDIOBJ_AllocObj(GDIObjType_PATH_TYPE)) -#define PATH_AllocPathWithHandle() ((PPATH) GDIOBJ_AllocObjWithHandle (GDI_OBJECT_TYPE_PATH)) +#define PATH_AllocPathWithHandle() ((PPATH) GDIOBJ_AllocObjWithHandle (GDI_OBJECT_TYPE_PATH, sizeof(PATH))) #define PATH_FreePath(pPath) GDIOBJ_FreeObj((POBJ)pPath, GDIObjType_PATH_TYPE) #define PATH_FreeExtPathByHandle(hPath) GDIOBJ_FreeObjByHandle((HGDIOBJ) hPath, GDI_OBJECT_TYPE_PATH) #define PATH_LockPath(hPath) ((PPATH)GDIOBJ_ShareLockObj((HGDIOBJ)hPath, GDI_OBJECT_TYPE_PATH)) -#define PATH_UnlockPath(pPath) GDIOBJ_ShareUnlockObjByPtr((POBJ)pPath) +#define PATH_UnlockPath(pPath) GDIOBJ_vDereferenceObject((POBJ)pPath) #define PATH_IsPathOpen(dclevel) ( ((dclevel).hPath) && ((dclevel).flPath & DCPATH_ACTIVE) ) diff --git a/reactos/subsystems/win32/win32k/include/pen.h b/reactos/subsystems/win32/win32k/include/pen.h index 7ca623dab54..a7e96ad82ce 100644 --- a/reactos/subsystems/win32/win32k/include/pen.h +++ b/reactos/subsystems/win32/win32k/include/pen.h @@ -6,7 +6,7 @@ /* Internal interface */ #define PEN_AllocPen() ((HPEN)GDIOBJ_AllocObj(GDIObjType_BRUSH_TYPE)) -#define PEN_AllocPenWithHandle() ((PBRUSH)GDIOBJ_AllocObjWithHandle(GDI_OBJECT_TYPE_PEN)) +#define PEN_AllocPenWithHandle() ((PBRUSH)GDIOBJ_AllocObjWithHandle(GDI_OBJECT_TYPE_PEN, sizeof(BRUSH))) #define PEN_FreePen(pBMObj) GDIOBJ_FreeObj((POBJ) pBMObj, GDIObjType_BRUSH_TYPE) #define PEN_FreePenByHandle(hBMObj) GDIOBJ_FreeObjByHandle((HGDIOBJ) hBMObj, GDI_OBJECT_TYPE_PEN) @@ -14,16 +14,16 @@ //#define PEN_LockPen(hBMObj) ((PBRUSH)GDIOBJ_LockObj((HGDIOBJ) hBMObj, GDI_OBJECT_TYPE_PEN)) #define PEN_AllocExtPen() ((PBRUSH)GDIOBJ_AllocObj(GDIObjType_BRUSH_TYPE)) -#define PEN_AllocExtPenWithHandle() ((PBRUSH)GDIOBJ_AllocObjWithHandle(GDI_OBJECT_TYPE_EXTPEN)) +#define PEN_AllocExtPenWithHandle() ((PBRUSH)GDIOBJ_AllocObjWithHandle(GDI_OBJECT_TYPE_EXTPEN, sizeof(BRUSH))) #define PEN_FreeExtPen(pBMObj) GDIOBJ_FreeObj((POBJ) pBMObj, GDIObjType_BRUSH_TYPE) #define PEN_FreeExtPenByHandle(hBMObj) GDIOBJ_FreeObjByHandle((HGDIOBJ) hBMObj, GDI_OBJECT_TYPE_EXTPEN) //#define PEN_LockExtPen(hBMObj) ((PBRUSH)GDIOBJ_LockObj((HGDIOBJ) hBMObj, GDI_OBJECT_TYPE_EXTPEN)) -#define PEN_UnlockPen(pPenObj) GDIOBJ_UnlockObjByPtr((POBJ)pPenObj) +#define PEN_UnlockPen(pPenObj) GDIOBJ_vUnlockObject((POBJ)pPenObj) -#define PEN_ShareUnlockPen(ppen) GDIOBJ_ShareUnlockObjByPtr((POBJ)ppen) +#define PEN_ShareUnlockPen(ppen) GDIOBJ_vDereferenceObject((POBJ)ppen) PBRUSH FASTCALL PEN_LockPen(HGDIOBJ); diff --git a/reactos/subsystems/win32/win32k/include/region.h b/reactos/subsystems/win32/win32k/include/region.h index a7e531dff8b..91b3d5d935b 100644 --- a/reactos/subsystems/win32/win32k/include/region.h +++ b/reactos/subsystems/win32/win32k/include/region.h @@ -11,6 +11,8 @@ typedef struct _ROSRGNDATA /* Header for all gdi objects in the handle table. Do not (re)move this. */ BASEOBJECT BaseObject; + PRGN_ATTR prgnattr; + RGN_ATTR rgnattr; RGNDATAHEADER rdh; RECTL *Buffer; @@ -21,8 +23,6 @@ typedef struct _ROSRGNDATA #define REGION_FreeRgn(pRgn) GDIOBJ_FreeObj((POBJ)pRgn, GDIObjType_RGN_TYPE) #define REGION_FreeRgnByHandle(hRgn) GDIOBJ_FreeObjByHandle((HGDIOBJ)hRgn, GDI_OBJECT_TYPE_REGION) -#define REGION_LockRgn(hRgn) ((PROSRGNDATA)GDIOBJ_LockObj((HGDIOBJ)hRgn, GDI_OBJECT_TYPE_REGION)) -#define REGION_UnlockRgn(pRgn) GDIOBJ_UnlockObjByPtr((POBJ)pRgn) PROSRGNDATA FASTCALL REGION_AllocRgnWithHandle(INT n); PROSRGNDATA FASTCALL REGION_AllocUserRgnWithHandle(INT n); @@ -52,9 +52,28 @@ PROSRGNDATA FASTCALL RGNOBJAPI_Lock(HRGN,PRGN_ATTR *); VOID FASTCALL RGNOBJAPI_Unlock(PROSRGNDATA); HRGN FASTCALL IntSysCreateRectRgn(INT,INT,INT,INT); PROSRGNDATA FASTCALL IntSysCreateRectpRgn(INT,INT,INT,INT); +BOOL FASTCALL IntGdiSetRegionOwner(HRGN,DWORD); #define IntSysCreateRectRgnIndirect(prc) \ IntSysCreateRectRgn((prc)->left, (prc)->top, (prc)->right, (prc)->bottom) #define IntSysCreateRectpRgnIndirect(prc) \ IntSysCreateRectpRgn((prc)->left, (prc)->top, (prc)->right, (prc)->bottom) + +PROSRGNDATA +FASTCALL +IntSysCreateRectpRgn(INT LeftRect, INT TopRect, INT RightRect, INT BottomRect); + +FORCEINLINE +PREGION +REGION_LockRgn(HRGN hrgn) +{ + return GDIOBJ_LockObject(hrgn, GDIObjType_RGN_TYPE); +} + +FORCEINLINE +VOID +REGION_UnlockRgn(PREGION prgn) +{ + GDIOBJ_vUnlockObject(&prgn->BaseObject); +} diff --git a/reactos/subsystems/win32/win32k/include/surface.h b/reactos/subsystems/win32/win32k/include/surface.h index 26e512d9c29..4da75777dda 100644 --- a/reactos/subsystems/win32/win32k/include/surface.h +++ b/reactos/subsystems/win32/win32k/include/surface.h @@ -90,19 +90,17 @@ typedef struct _SURFACE /* Internal interface */ -#define SURFACE_AllocSurfaceWithHandle() ((PSURFACE) GDIOBJ_AllocObjWithHandle(GDI_OBJECT_TYPE_BITMAP)) +#define SURFACE_AllocSurfaceWithHandle() ((PSURFACE) GDIOBJ_AllocObjWithHandle(GDI_OBJECT_TYPE_BITMAP, sizeof(SURFACE))) #define SURFACE_FreeSurface(pBMObj) GDIOBJ_FreeObj((POBJ) pBMObj, GDIObjType_SURF_TYPE) #define SURFACE_FreeSurfaceByHandle(hBMObj) GDIOBJ_FreeObjByHandle((HGDIOBJ) hBMObj, GDI_OBJECT_TYPE_BITMAP) /* NOTE: Use shared locks! */ -#define SURFACE_LockSurface(hBMObj) \ - ((PSURFACE) GDIOBJ_LockObj ((HGDIOBJ) hBMObj, GDI_OBJECT_TYPE_BITMAP)) #define SURFACE_ShareLockSurface(hBMObj) \ ((PSURFACE) GDIOBJ_ShareLockObj ((HGDIOBJ) hBMObj, GDI_OBJECT_TYPE_BITMAP)) #define SURFACE_UnlockSurface(pBMObj) \ - GDIOBJ_UnlockObjByPtr ((POBJ)pBMObj) + GDIOBJ_vUnlockObject ((POBJ)pBMObj) #define SURFACE_ShareUnlockSurface(pBMObj) \ - GDIOBJ_ShareUnlockObjByPtr ((POBJ)pBMObj) + GDIOBJ_vDereferenceObject ((POBJ)pBMObj) BOOL INTERNAL_CALL SURFACE_Cleanup(PVOID ObjectBody); diff --git a/reactos/subsystems/win32/win32k/include/text.h b/reactos/subsystems/win32/win32k/include/text.h index 9dc6510fd6e..2be5cad6cbe 100644 --- a/reactos/subsystems/win32/win32k/include/text.h +++ b/reactos/subsystems/win32/win32k/include/text.h @@ -77,11 +77,11 @@ typedef struct /* Internal interface */ #define TEXTOBJ_AllocText() ((PTEXTOBJ) GDIOBJ_AllocObj(GDIObjType_LFONT_TYPE)) -#define TEXTOBJ_AllocTextWithHandle() ((PTEXTOBJ) GDIOBJ_AllocObjWithHandle(GDI_OBJECT_TYPE_FONT)) +#define TEXTOBJ_AllocTextWithHandle() ((PTEXTOBJ) GDIOBJ_AllocObjWithHandle(GDI_OBJECT_TYPE_FONT, sizeof(TEXTOBJ))) #define TEXTOBJ_FreeText(pBMObj) GDIOBJ_FreeObj((POBJ) pBMObj, GDILoObjType_LO_FONT_TYPE) #define TEXTOBJ_FreeTextByHandle(hBMObj) GDIOBJ_FreeObj((HGDIOBJ) hBMObj, GDI_OBJECT_TYPE_FONT) -#define TEXTOBJ_LockText(hBMObj) ((PTEXTOBJ) GDIOBJ_LockObj ((HGDIOBJ) hBMObj, GDI_OBJECT_TYPE_FONT)) -#define TEXTOBJ_UnlockText(pBMObj) GDIOBJ_UnlockObjByPtr ((POBJ)pBMObj) +#define TEXTOBJ_LockText(hBMObj) ((PTEXTOBJ) GDIOBJ_LockObject((HGDIOBJ) hBMObj, GDIObjType_LFONT_TYPE)) +#define TEXTOBJ_UnlockText(pBMObj) GDIOBJ_vUnlockObject ((POBJ)pBMObj) PTEXTOBJ FASTCALL RealizeFontInit(HFONT); NTSTATUS FASTCALL TextIntRealizeFont(HFONT,PTEXTOBJ); diff --git a/reactos/subsystems/win32/win32k/include/win32.h b/reactos/subsystems/win32/win32k/include/win32.h index 2e43ec1517f..0204ff96bf1 100644 --- a/reactos/subsystems/win32/win32k/include/win32.h +++ b/reactos/subsystems/win32/win32k/include/win32.h @@ -105,6 +105,9 @@ typedef struct _THREADINFO LIST_ENTRY W32CallbackListHead; SINGLE_LIST_ENTRY ReferencesList; ULONG cExclusiveLocks; +#if DBG + USHORT acExclusiveLockCount[GDIObjTypeTotal]; +#endif } THREADINFO; @@ -186,4 +189,7 @@ typedef struct _PROCESSINFO LIST_ENTRY DriverObjListHead; struct _KBL* KeyboardLayout; // THREADINFO only W32HEAP_USER_MAPPING HeapMappings; + struct _GDI_POOL *pPoolDcAttr; + struct _GDI_POOL *pPoolBrushAttr; + struct _GDI_POOL *pPoolRgnAttr; } PROCESSINFO; diff --git a/reactos/subsystems/win32/win32k/include/win32kp.h b/reactos/subsystems/win32/win32k/include/win32kp.h index 94bf3190b85..7c79d893c7b 100644 --- a/reactos/subsystems/win32/win32k/include/win32kp.h +++ b/reactos/subsystems/win32/win32k/include/win32kp.h @@ -18,6 +18,11 @@ #define INIT_FUNCTION #endif +/* Enable debugging features */ +#define GDI_DEBUG 0 +#define DBG_ENABLE_EVENT_LOGGING 0 +#define DBG_ENABLE_SERVICE_HOOKS 0 + /* Internal Win32k Headers */ #include #include diff --git a/reactos/subsystems/win32/win32k/main/dllmain.c b/reactos/subsystems/win32/win32k/main/dllmain.c index 59853171885..39b8691273b 100644 --- a/reactos/subsystems/win32/win32k/main/dllmain.c +++ b/reactos/subsystems/win32/win32k/main/dllmain.c @@ -114,6 +114,14 @@ Win32kProcessCallback(struct _EPROCESS *Process, Win32Process->peProcess = Process; /* setup process flags */ Win32Process->W32PF_flags = 0; + + /* Create pools for GDI object attributes */ + Win32Process->pPoolDcAttr = GdiPoolCreate(sizeof(DC_ATTR), 'acdG'); + Win32Process->pPoolBrushAttr = GdiPoolCreate(sizeof(BRUSH_ATTR), 'arbG'); + Win32Process->pPoolRgnAttr = GdiPoolCreate(sizeof(RGN_ATTR), 'agrG'); + ASSERT(Win32Process->pPoolDcAttr); + ASSERT(Win32Process->pPoolBrushAttr); + ASSERT(Win32Process->pPoolRgnAttr); } else { @@ -148,6 +156,10 @@ Win32kProcessCallback(struct _EPROCESS *Process, UserSetProcessWindowStation(NULL); + /* Destroy GDI pools */ + GdiPoolDestroy(Win32Process->pPoolDcAttr); + GdiPoolDestroy(Win32Process->pPoolBrushAttr); + GdiPoolDestroy(Win32Process->pPoolRgnAttr); } RETURN( STATUS_SUCCESS); @@ -440,7 +452,7 @@ DriverEntry( /* Register our per-process and per-thread structures. */ PsEstablishWin32Callouts((PWIN32_CALLOUTS_FPNS)&CalloutData); -#if 0 // DBG +#if 1 // DBG /* Register service hook callbacks */ KdSystemDebugControl('CsoR', DbgPreServiceHook, ID_Win32PreServiceHook, 0, 0, 0, 0); KdSystemDebugControl('CsoR', DbgPostServiceHook, ID_Win32PostServiceHook, 0, 0, 0, 0); diff --git a/reactos/subsystems/win32/win32k/ntddraw/dxeng.c b/reactos/subsystems/win32/win32k/ntddraw/dxeng.c index 0f9a1a797a1..ff7f7060eb2 100644 --- a/reactos/subsystems/win32/win32k/ntddraw/dxeng.c +++ b/reactos/subsystems/win32/win32k/ntddraw/dxeng.c @@ -727,7 +727,7 @@ BOOL APIENTRY DxEngSetDCOwner(HGDIOBJ hObject, DWORD OwnerMask) { DPRINT1("ReactX Calling : DxEngSetDCOwner \n"); - return IntGdiSetDCOwnerEx( hObject, OwnerMask, FALSE); + return GreSetDCOwner(hObject, OwnerMask); } /************************************************************************/ diff --git a/reactos/subsystems/win32/win32k/ntuser/cursoricon.c b/reactos/subsystems/win32/win32k/ntuser/cursoricon.c index 131d912cfc0..f749bda6dbd 100644 --- a/reactos/subsystems/win32/win32k/ntuser/cursoricon.c +++ b/reactos/subsystems/win32/win32k/ntuser/cursoricon.c @@ -413,13 +413,13 @@ IntDestroyCurIconObject(PCURICON_OBJECT CurIcon, BOOL ProcessCleanup) /* delete bitmaps */ if (bmpMask) { - GDIOBJ_SetOwnership(bmpMask, PsGetCurrentProcess()); + GreSetObjectOwner(bmpMask, GDI_OBJ_HMGR_POWNED); GreDeleteObject(bmpMask); CurIcon->IconInfo.hbmMask = NULL; } if (bmpColor) { - GDIOBJ_SetOwnership(bmpColor, PsGetCurrentProcess()); + GreSetObjectOwner(bmpColor, GDI_OBJ_HMGR_POWNED); GreDeleteObject(bmpColor); CurIcon->IconInfo.hbmColor = NULL; } @@ -934,13 +934,16 @@ NtUserSetCursorContents( /* Copy new IconInfo field */ CurIcon->IconInfo = IconInfo; - psurfBmp = SURFACE_ShareLockSurface(CurIcon->IconInfo.hbmColor); - if (psurfBmp) + if (CurIcon->IconInfo.hbmColor) { + psurfBmp = SURFACE_ShareLockSurface(CurIcon->IconInfo.hbmColor); + if (!psurfBmp) + goto done; + CurIcon->Size.cx = psurfBmp->SurfObj.sizlBitmap.cx; CurIcon->Size.cy = psurfBmp->SurfObj.sizlBitmap.cy; SURFACE_ShareUnlockSurface(psurfBmp); - GDIOBJ_SetOwnership(CurIcon->IconInfo.hbmColor, NULL); + GreSetObjectOwner(CurIcon->IconInfo.hbmColor, GDI_OBJ_HMGR_PUBLIC); } else { @@ -953,7 +956,7 @@ NtUserSetCursorContents( SURFACE_ShareUnlockSurface(psurfBmp); } - GDIOBJ_SetOwnership(CurIcon->IconInfo.hbmMask, NULL); + GreSetObjectOwner(CurIcon->IconInfo.hbmMask, GDI_OBJ_HMGR_PUBLIC); Ret = TRUE; @@ -1017,7 +1020,7 @@ NtUserSetCursorIconData( CurIcon->Size.cx = psurfBmp->SurfObj.sizlBitmap.cx; CurIcon->Size.cy = psurfBmp->SurfObj.sizlBitmap.cy; SURFACE_UnlockSurface(psurfBmp); - GDIOBJ_SetOwnership(GdiHandleTable, CurIcon->IconInfo.hbmMask, NULL); + GreSetObjectOwner(CurIcon->IconInfo.hbmMask, GDI_OBJ_HMGR_PUBLIC); } } if (CurIcon->IconInfo.hbmMask) @@ -1031,7 +1034,7 @@ NtUserSetCursorIconData( SURFACE_UnlockSurface(psurfBmp); } } - GDIOBJ_SetOwnership(GdiHandleTable, CurIcon->IconInfo.hbmMask, NULL); + GreSetObjectOwner(CurIcon->IconInfo.hbmMask, GDI_OBJ_HMGR_PUBLIC); } } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) @@ -1121,10 +1124,10 @@ done: if(Ret) { /* This icon is shared now */ - GDIOBJ_SetOwnership(CurIcon->IconInfo.hbmMask, NULL); + GreSetObjectOwner(CurIcon->IconInfo.hbmMask, GDI_OBJ_HMGR_PUBLIC); if(CurIcon->IconInfo.hbmColor) { - GDIOBJ_SetOwnership(CurIcon->IconInfo.hbmColor, NULL); + GreSetObjectOwner(CurIcon->IconInfo.hbmColor, GDI_OBJ_HMGR_PUBLIC); } } UserDereferenceObject(CurIcon); @@ -1170,12 +1173,12 @@ UserDrawIconEx( if (istepIfAniCur) DPRINT1("NtUserDrawIconEx: istepIfAniCur is not supported!\n"); - if (!hbmMask || !IntGdiGetObject(hbmMask, sizeof(BITMAP), (PVOID)&bm)) + if (!hbmMask || !GreGetObject(hbmMask, sizeof(BITMAP), (PVOID)&bm)) { return FALSE; } - if (hbmColor && !IntGdiGetObject(hbmColor, sizeof(BITMAP), (PVOID)&bmpColor)) + if (hbmColor && !GreGetObject(hbmColor, sizeof(BITMAP), (PVOID)&bmpColor)) { return FALSE; } diff --git a/reactos/subsystems/win32/win32k/ntuser/desktop.c b/reactos/subsystems/win32/win32k/ntuser/desktop.c index e414e7e55bf..3dbfdcf117e 100644 --- a/reactos/subsystems/win32/win32k/ntuser/desktop.c +++ b/reactos/subsystems/win32/win32k/ntuser/desktop.c @@ -168,7 +168,7 @@ IntDesktopObjectDelete(PWIN32_DELETEMETHOD_PARAMETERS Parameters) IntFreeDesktopHeap(Desktop); } -NTSTATUS NTAPI +NTSTATUS NTAPI IntDesktopOkToClose(PWIN32_OKAYTOCLOSEMETHOD_PARAMETERS Parameters) { PTHREADINFO pti; @@ -640,7 +640,7 @@ UserRedrawDesktop() { PWND Window = NULL; HRGN hRgn; - + Window = UserGetDesktopWindow(); hRgn = IntSysCreateRectRgnIndirect(&Window->rcWindow); @@ -650,8 +650,8 @@ UserRedrawDesktop() RDW_ERASE | RDW_INVALIDATE | RDW_ALLCHILDREN); - - REGION_FreeRgnByHandle(hRgn); + + GreDeleteObject(hRgn); } @@ -1831,7 +1831,7 @@ IntSetThreadDesktop(IN HDESK hDesktop, DPRINT("IntSetThreadDesktop() , FOF=%d\n", FreeOnFailure); MapHeap = (PsGetCurrentProcess() != PsInitialSystemProcess); W32Thread = PsGetCurrentThreadWin32Thread(); - + if(hDesktop != NULL) { /* Validate the new desktop. */ @@ -1943,7 +1943,7 @@ IntSetThreadDesktop(IN HDESK hDesktop, ObDereferenceObject(OldDesktop); } - + if (hOldDesktop != NULL) { ZwClose(hOldDesktop); @@ -1965,11 +1965,11 @@ NtUserSetThreadDesktop(HDESK hDesktop) BOOL ret; UserEnterExclusive(); - + ret = IntSetThreadDesktop(hDesktop, FALSE); - + UserLeave(); - + return ret; } diff --git a/reactos/subsystems/win32/win32k/ntuser/message.c b/reactos/subsystems/win32/win32k/ntuser/message.c index 030b1c9536f..b2422376620 100644 --- a/reactos/subsystems/win32/win32k/ntuser/message.c +++ b/reactos/subsystems/win32/win32k/ntuser/message.c @@ -667,7 +667,7 @@ IntDispatchMessage(PMSG pMsg) /* send a WM_NCPAINT and WM_ERASEBKGND if the non-client area is still invalid */ HRGN hrgn = IntSysCreateRectRgn( 0, 0, 0, 0 ); co_UserGetUpdateRgn( Window, hrgn, TRUE ); - REGION_FreeRgnByHandle( hrgn ); + GreDeleteObject(hrgn); } return retval; @@ -1482,7 +1482,7 @@ co_IntSendMessageWithCallBack( HWND hWnd, } IntReferenceMessageQueue(Window->head.pti->MessageQueue); - /* Take reference on this MessageQueue if its a callback. It will be released + /* Take reference on this MessageQueue if its a callback. It will be released when message is processed or removed from target hwnd MessageQueue */ if (CompletionCallback) IntReferenceMessageQueue(Win32Thread->MessageQueue); diff --git a/reactos/subsystems/win32/win32k/ntuser/monitor.c b/reactos/subsystems/win32/win32k/ntuser/monitor.c index 83ea41a1b9b..01a9c5c3705 100644 --- a/reactos/subsystems/win32/win32k/ntuser/monitor.c +++ b/reactos/subsystems/win32/win32k/ntuser/monitor.c @@ -175,7 +175,7 @@ IntAttachMonitor(IN PDEVOBJ *pGdiDevice, } Monitor->Prev = p; } - + IntUpdateMonitorSize(pGdiDevice); return STATUS_SUCCESS; @@ -232,7 +232,7 @@ IntDetachMonitor(IN PDEVOBJ *pGdiDevice) } if (Monitor->hrgnMonitor) - REGION_FreeRgnByHandle(Monitor->hrgnMonitor); + GreDeleteObject(Monitor->hrgnMonitor); IntDestroyMonitorObject(Monitor); @@ -276,8 +276,8 @@ IntUpdateMonitorSize(IN PDEVOBJ *pGdiDevice) if (Monitor->hrgnMonitor) { - GDIOBJ_SetOwnership(Monitor->hrgnMonitor, PsGetCurrentProcess()); - REGION_FreeRgnByHandle(Monitor->hrgnMonitor); + GreSetObjectOwner(Monitor->hrgnMonitor, GDI_OBJ_HMGR_POWNED); + GreDeleteObject(Monitor->hrgnMonitor); } Monitor->hrgnMonitor = IntSysCreateRectRgnIndirect( &Monitor->rcMonitor ); @@ -413,7 +413,7 @@ IntGetMonitorsFromRect(OPTIONAL IN LPCRECTL pRect, if (monitorRectList != NULL) monitorRectList[iCount] = IntersectionRect; } - + /* Increase count of found monitors */ iCount++; } @@ -806,7 +806,7 @@ NtUserMonitorFromRect( return hMonitor; } - hMonitorList = ExAllocatePoolWithTag(PagedPool, + hMonitorList = ExAllocatePoolWithTag(PagedPool, sizeof(HMONITOR) * numMonitors, USERTAG_MONITORRECTS); if (hMonitorList == NULL) diff --git a/reactos/subsystems/win32/win32k/ntuser/painting.c b/reactos/subsystems/win32/win32k/ntuser/painting.c index 48919098be7..636e27152e8 100644 --- a/reactos/subsystems/win32/win32k/ntuser/painting.c +++ b/reactos/subsystems/win32/win32k/ntuser/painting.c @@ -157,7 +157,7 @@ IntGetNCUpdateRgn(PWND Window, BOOL Validate) hRgnWindow = IntCalcWindowRgn(Window, TRUE); if (hRgnWindow == NULL) { - REGION_FreeRgnByHandle(hRgnNonClient); + GreDeleteObject(hRgnNonClient); return HRGN_WINDOW; } @@ -165,14 +165,14 @@ IntGetNCUpdateRgn(PWND Window, BOOL Validate) hRgnWindow, RGN_DIFF); if (RgnType == ERROR) { - REGION_FreeRgnByHandle(hRgnWindow); - REGION_FreeRgnByHandle(hRgnNonClient); + GreDeleteObject(hRgnWindow); + GreDeleteObject(hRgnNonClient); return HRGN_WINDOW; } else if (RgnType == NULLREGION) { - REGION_FreeRgnByHandle(hRgnWindow); - REGION_FreeRgnByHandle(hRgnNonClient); + GreDeleteObject(hRgnWindow); + GreDeleteObject(hRgnNonClient); return NULL; } @@ -187,14 +187,14 @@ IntGetNCUpdateRgn(PWND Window, BOOL Validate) hRgnWindow, RGN_AND) == NULLREGION) { IntGdiSetRegionOwner(Window->hrgnUpdate, GDI_OBJ_HMGR_POWNED); - REGION_FreeRgnByHandle(Window->hrgnUpdate); + GreDeleteObject(Window->hrgnUpdate); Window->hrgnUpdate = NULL; if (!(Window->state & WNDS_INTERNALPAINT)) MsqDecPaintCountQueue(Window->head.pti->MessageQueue); } } - REGION_FreeRgnByHandle(hRgnWindow); + GreDeleteObject(hRgnWindow); return hRgnNonClient; } @@ -246,7 +246,7 @@ co_IntPaintWindows(PWND Wnd, ULONG Flags, BOOL Recurse) NULL != TempRegion) { /* NOTE: The region can already be deleted! */ - GDIOBJ_FreeObjByHandle(TempRegion, GDI_OBJECT_TYPE_REGION | GDI_OBJECT_TYPE_SILENT); + GreDeleteObject(TempRegion); } } @@ -328,7 +328,7 @@ IntInvalidateWindows(PWND Wnd, HRGN hRgn, ULONG Flags) hRgnClient = IntSysCreateRectRgnIndirect(&Wnd->rcClient); RgnType = NtGdiCombineRgn(hRgn, hRgn, hRgnClient, RGN_AND); - REGION_FreeRgnByHandle(hRgnClient); + GreDeleteObject(hRgnClient); } /* @@ -341,7 +341,7 @@ IntInvalidateWindows(PWND Wnd, HRGN hRgn, ULONG Flags) hRgnWindow = IntSysCreateRectRgnIndirect(&Wnd->rcWindow); RgnType = NtGdiCombineRgn(hRgn, hRgn, hRgnWindow, RGN_AND); - REGION_FreeRgnByHandle(hRgnWindow); + GreDeleteObject(hRgnWindow); } else { @@ -378,7 +378,7 @@ IntInvalidateWindows(PWND Wnd, HRGN hRgn, ULONG Flags) hRgn, RGN_OR) == NULLREGION) { IntGdiSetRegionOwner(Wnd->hrgnUpdate, GDI_OBJ_HMGR_POWNED); - REGION_FreeRgnByHandle(Wnd->hrgnUpdate); + GreDeleteObject(Wnd->hrgnUpdate); Wnd->hrgnUpdate = NULL; } @@ -398,7 +398,7 @@ IntInvalidateWindows(PWND Wnd, HRGN hRgn, ULONG Flags) hRgn, RGN_DIFF) == NULLREGION) { IntGdiSetRegionOwner(Wnd->hrgnUpdate, GDI_OBJ_HMGR_POWNED); - REGION_FreeRgnByHandle(Wnd->hrgnUpdate); + GreDeleteObject(Wnd->hrgnUpdate); Wnd->hrgnUpdate = NULL; } } @@ -440,7 +440,7 @@ IntInvalidateWindows(PWND Wnd, HRGN hRgn, ULONG Flags) HRGN hRgnTemp = IntSysCreateRectRgn(0, 0, 0, 0); NtGdiCombineRgn(hRgnTemp, hRgn, 0, RGN_COPY); IntInvalidateWindows(Child, hRgnTemp, Flags); - REGION_FreeRgnByHandle(hRgnTemp); + GreDeleteObject(hRgnTemp); } } @@ -540,7 +540,7 @@ co_UserRedrawWindow( hRgn = IntSysCreateRectRgn(0, 0, 0, 0); if (NtGdiCombineRgn(hRgn, UpdateRgn, NULL, RGN_COPY) == NULLREGION) { - REGION_FreeRgnByHandle(hRgn); + GreDeleteObject(hRgn); hRgn = NULL; } else @@ -595,7 +595,7 @@ co_UserRedrawWindow( if (hRgn != NULL) { - REGION_FreeRgnByHandle(hRgn); + GreDeleteObject(hRgn); } DPRINT("co_UserRedrawWindow exit\n"); @@ -825,10 +825,10 @@ NtUserBeginPaint(HWND hWnd, PAINTSTRUCT* UnsafePs) Window->state &= ~WNDS_SENDNCPAINT; MsqDecPaintCountQueue(Window->head.pti->MessageQueue); co_IntSendMessage(hWnd, WM_NCPAINT, (WPARAM)hRgn, 0); - if (hRgn != (HANDLE)1 && hRgn != NULL) + if (hRgn != (HANDLE)1 && hRgn != NULL && GreIsHandleValid(hRgn)) { /* NOTE: The region can already by deleted! */ - GDIOBJ_FreeObjByHandle(hRgn, GDI_OBJECT_TYPE_REGION | GDI_OBJECT_TYPE_SILENT); + GreDeleteObject(hRgn); } } @@ -1230,14 +1230,14 @@ UserScrollDC( could not be copied, because it was not visible */ if (hrgnUpdate || prcUpdate) { - HRGN hrgnOwn, hrgnVisible, hrgnTmp; + HRGN hrgnOwn, hrgnTmp; + PREGION prgnTmp; pDC = DC_LockDc(hDC); if (!pDC) { return FALSE; } - hrgnVisible = ((PROSRGNDATA)pDC->prgnVis)->BaseObject.hHmgr; // pDC->prgnRao? /* Begin with the shifted and then clipped scroll rect */ rcDst = rcScroll; @@ -1262,14 +1262,16 @@ UserScrollDC( NtGdiCombineRgn(hrgnOwn, hrgnOwn, hrgnTmp, RGN_OR); /* Substract the part of the dest that was visible in source */ - NtGdiCombineRgn(hrgnTmp, hrgnTmp, hrgnVisible, RGN_AND); + prgnTmp = RGNOBJAPI_Lock(hrgnTmp, NULL); + IntGdiCombineRgn(prgnTmp, prgnTmp, pDC->prgnVis, RGN_AND); + RGNOBJAPI_Unlock(prgnTmp); NtGdiOffsetRgn(hrgnTmp, dx, dy); Result = NtGdiCombineRgn(hrgnOwn, hrgnOwn, hrgnTmp, RGN_DIFF); /* DO NOT Unlock DC while messing with prgnVis! */ DC_UnlockDc(pDC); - REGION_FreeRgnByHandle(hrgnTmp); + GreDeleteObject(hrgnTmp); if (prcUpdate) { @@ -1278,7 +1280,7 @@ UserScrollDC( if (!hrgnUpdate) { - REGION_FreeRgnByHandle(hrgnOwn); + GreDeleteObject(hrgnOwn); } } else @@ -1491,9 +1493,9 @@ NtUserScrollWindowEx( NtGdiOffsetRgn(hrgnTemp, dx, dy); NtGdiCombineRgn(hrgnTemp, hrgnTemp, hrgnClip, RGN_AND); co_UserRedrawWindow(Window, NULL, hrgnTemp, RDW_INVALIDATE | RDW_ERASE); - REGION_FreeRgnByHandle(hrgnClip); + GreDeleteObject(hrgnClip); } - REGION_FreeRgnByHandle(hrgnTemp); + GreDeleteObject(hrgnTemp); if (flags & SW_SCROLLCHILDREN) { @@ -1566,7 +1568,7 @@ NtUserScrollWindowEx( CLEANUP: if (hrgnOwn && !hrgnUpdate) { - REGION_FreeRgnByHandle(hrgnOwn); + GreDeleteObject(hrgnOwn); } if (Window) diff --git a/reactos/subsystems/win32/win32k/ntuser/sysparams.c b/reactos/subsystems/win32/win32k/ntuser/sysparams.c index 518eb9955d5..c1ac0effdda 100644 --- a/reactos/subsystems/win32/win32k/ntuser/sysparams.c +++ b/reactos/subsystems/win32/win32k/ntuser/sysparams.c @@ -647,7 +647,7 @@ SpiSetWallpaper(PVOID pvParam, FLONG fl) SURFACE_ShareUnlockSurface(psurfBmp); /* Change the bitmap's ownership */ - GDIOBJ_SetOwnership(hbmp, NULL); + GreSetObjectOwner(hbmp, GDI_OBJ_HMGR_PUBLIC); /* Yes, Windows really loads the current setting from the registry. */ ulTile = SpiLoadInt(KEY_DESKTOP, L"TileWallpaper", 0); @@ -677,7 +677,7 @@ SpiSetWallpaper(PVOID pvParam, FLONG fl) if(hOldBitmap != NULL) { /* Delete the old wallpaper */ - GDIOBJ_SetOwnership(hOldBitmap, PsGetCurrentProcess()); + GreSetObjectOwner(hOldBitmap, GDI_OBJ_HMGR_POWNED); GreDeleteObject(hOldBitmap); } diff --git a/reactos/subsystems/win32/win32k/ntuser/vis.c b/reactos/subsystems/win32/win32k/ntuser/vis.c index 0bf5dc88e72..78939bd4025 100644 --- a/reactos/subsystems/win32/win32k/ntuser/vis.c +++ b/reactos/subsystems/win32/win32k/ntuser/vis.c @@ -69,25 +69,25 @@ VIS_ComputeVisibleRegion( CurrentWindow->state & WNDS_DESTROYED ) { DPRINT1("ATM the Current Window or Parent is dead!\n"); - if (VisRgn) REGION_FreeRgnByHandle(VisRgn); + if (VisRgn) GreDeleteObject(VisRgn); return NULL; } if (!(CurrentWindow->style & WS_VISIBLE)) { - if (VisRgn) REGION_FreeRgnByHandle(VisRgn); + if (VisRgn) GreDeleteObject(VisRgn); return NULL; } ClipRgn = IntSysCreateRectRgnIndirect(&CurrentWindow->rcClient); NtGdiCombineRgn(VisRgn, VisRgn, ClipRgn, RGN_AND); - REGION_FreeRgnByHandle(ClipRgn); + GreDeleteObject(ClipRgn); if ((PreviousWindow->style & WS_CLIPSIBLINGS) || (PreviousWindow == Wnd && ClipSiblings)) { CurrentSibling = CurrentWindow->spwndChild; - while ( CurrentSibling != NULL && + while ( CurrentSibling != NULL && CurrentSibling != PreviousWindow ) { if ((CurrentSibling->style & WS_VISIBLE) && @@ -102,7 +102,7 @@ VIS_ComputeVisibleRegion( NtGdiOffsetRgn(ClipRgn, CurrentSibling->rcWindow.left, CurrentSibling->rcWindow.top); } NtGdiCombineRgn(VisRgn, VisRgn, ClipRgn, RGN_DIFF); - REGION_FreeRgnByHandle(ClipRgn); + GreDeleteObject(ClipRgn); } CurrentSibling = CurrentSibling->spwndNext; } @@ -129,7 +129,7 @@ VIS_ComputeVisibleRegion( NtGdiOffsetRgn(ClipRgn, CurrentWindow->rcWindow.left, CurrentWindow->rcWindow.top); } NtGdiCombineRgn(VisRgn, VisRgn, ClipRgn, RGN_DIFF); - REGION_FreeRgnByHandle(ClipRgn); + GreDeleteObject(ClipRgn); } CurrentWindow = CurrentWindow->spwndNext; } @@ -172,7 +172,7 @@ co_VIS_WindowLayoutChanged( RDW_ALLCHILDREN); UserDerefObjectCo(Parent); } - REGION_FreeRgnByHandle(Temp); + GreDeleteObject(Temp); } /* EOF */ diff --git a/reactos/subsystems/win32/win32k/ntuser/windc.c b/reactos/subsystems/win32/win32k/ntuser/windc.c index 619f94b430a..5265ba24624 100644 --- a/reactos/subsystems/win32/win32k/ntuser/windc.c +++ b/reactos/subsystems/win32/win32k/ntuser/windc.c @@ -50,6 +50,7 @@ DceCreateDisplayDC(VOID) if (hDC && !defaultDCstate) // Ultra HAX! Dedicated to GvG! { // This is a cheesy way to do this. PDC dc = DC_LockDc ( hDC ); + ASSERT(dc); defaultDCstate = ExAllocatePoolWithTag(PagedPool, sizeof(DC), TAG_DC); RtlZeroMemory(defaultDCstate, sizeof(DC)); defaultDCstate->pdcattr = &defaultDCstate->dcattr; @@ -113,7 +114,7 @@ DceAllocDCE(PWND Window OPTIONAL, DCE_TYPE Type) else { DPRINT("FREE DCATTR!!!! NOT DCE_WINDOW_DC!!!!! hDC-> %x\n", pDce->hDC); - IntGdiSetDCOwnerEx( pDce->hDC, GDI_OBJ_HMGR_NONE, FALSE); + GreSetDCOwner(pDce->hDC, GDI_OBJ_HMGR_NONE); pDce->ptiOwner = NULL; } @@ -179,7 +180,7 @@ DceDeleteClipRgn(DCE* Dce) } else if (Dce->hrgnClip != NULL) { - GDIOBJ_FreeObjByHandle(Dce->hrgnClip, GDI_OBJECT_TYPE_REGION|GDI_OBJECT_TYPE_SILENT); + GreDeleteObject(Dce->hrgnClip); } Dce->hrgnClip = NULL; @@ -225,7 +226,7 @@ DceReleaseDC(DCE* dce, BOOL EndPaint) } dce->DCXFlags &= ~DCX_DCEBUSY; DPRINT("Exit!!!!! DCX_CACHE!!!!!! hDC-> %x \n", dce->hDC); - if (!IntGdiSetDCOwnerEx( dce->hDC, GDI_OBJ_HMGR_NONE, FALSE)) + if (!GreSetDCOwner(dce->hDC, GDI_OBJ_HMGR_NONE)) return 0; dce->ptiOwner = NULL; // Reset ownership. dce->ppiOwner = NULL; @@ -308,7 +309,7 @@ noparent: { if(hRgnVisible != NULL) { - REGION_FreeRgnByHandle(hRgnVisible); + GreDeleteObject(hRgnVisible); } hRgnVisible = IntSysCreateRectRgn(0, 0, 0, 0); } @@ -328,7 +329,7 @@ noparent: if (hRgnVisible != NULL) { - REGION_FreeRgnByHandle(hRgnVisible); + GreDeleteObject(hRgnVisible); } } @@ -521,7 +522,7 @@ UserGetDCEx(PWND Wnd OPTIONAL, HANDLE ClipRegion, ULONG Flags) return(NULL); } - if (!GDIOBJ_ValidateHandle(Dce->hDC, GDI_OBJECT_TYPE_DC)) + if (!GreIsHandleValid(Dce->hDC)) { DPRINT1("FIXME: Got DCE with invalid hDC! 0x%x\n", Dce->hDC); Dce->hDC = DceCreateDisplayDC(); @@ -568,7 +569,7 @@ UserGetDCEx(PWND Wnd OPTIONAL, HANDLE ClipRegion, ULONG Flags) if (Dce->hrgnClip != NULL) { DPRINT1("Should not be called!!\n"); - GDIOBJ_FreeObjByHandle(Dce->hrgnClip, GDI_OBJECT_TYPE_REGION|GDI_OBJECT_TYPE_SILENT); + GreDeleteObject(Dce->hrgnClip); Dce->hrgnClip = NULL; } Dce->hrgnClip = ClipRegion; @@ -582,7 +583,7 @@ UserGetDCEx(PWND Wnd OPTIONAL, HANDLE ClipRegion, ULONG Flags) { DPRINT("ENTER!!!!!! DCX_CACHE!!!!!! hDC-> %x\n", Dce->hDC); // Need to set ownership so Sync dcattr will work. - IntGdiSetDCOwnerEx( Dce->hDC, GDI_OBJ_HMGR_POWNED, FALSE); + GreSetDCOwner(Dce->hDC, GDI_OBJ_HMGR_POWNED); Dce->ptiOwner = GetW32ThreadInfo(); // Set the temp owning } @@ -621,13 +622,14 @@ DceFreeDCE(PDCE pdce, BOOLEAN Force) pdce->DCXFlags |= DCX_INDESTROY; - if (Force && !GDIOBJ_OwnedByCurrentProcess(pdce->hDC)) + if (Force && + GreGetObjectOwner(pdce->hDC) != GDI_OBJ_HMGR_POWNED) { DPRINT("Change ownership for DCE! -> %x\n" , pdce); // Note: Windows sets W32PF_OWNDCCLEANUP and moves on. - if (!IsObjectDead((HGDIOBJ) pdce->hDC)) + if (GreIsHandleValid(pdce->hDC)) { - DC_SetOwnership( pdce->hDC, PsGetCurrentProcess()); + GreSetDCOwner(pdce->hDC, GDI_OBJ_HMGR_POWNED); } else { @@ -637,15 +639,15 @@ DceFreeDCE(PDCE pdce, BOOLEAN Force) } else { - if (!GreGetObjectOwner(pdce->hDC, GDIObjType_DC_TYPE)) - DC_SetOwnership( pdce->hDC, PsGetCurrentProcess()); + if (GreGetObjectOwner(pdce->hDC) == GDI_OBJ_HMGR_PUBLIC) + GreSetDCOwner(pdce->hDC, GDI_OBJ_HMGR_POWNED); } if (!Hit) IntGdiDeleteDC(pdce->hDC, TRUE); if (pdce->hrgnClip && !(pdce->DCXFlags & DCX_KEEPCLIPRGN)) { - GDIOBJ_FreeObjByHandle(pdce->hrgnClip, GDI_OBJECT_TYPE_REGION|GDI_OBJECT_TYPE_SILENT); + GreDeleteObject(pdce->hrgnClip); pdce->hrgnClip = NULL; } @@ -712,7 +714,7 @@ DceFreeWindowDCE(PWND Window) pDCE->hwndCurrent = 0; DPRINT("POWNED DCE going Cheap!! DCX_CACHE!! hDC-> %x \n", pDCE->hDC); - if (!IntGdiSetDCOwnerEx( pDCE->hDC, GDI_OBJ_HMGR_NONE, FALSE)) + if (!GreSetDCOwner( pDCE->hDC, GDI_OBJ_HMGR_NONE)) { DPRINT1("Fail Owner Switch hDC-> %x \n", pDCE->hDC); break; @@ -837,7 +839,7 @@ DceResetActiveDCEs(PWND Window) } pLE = LEDce.Flink; pDCE = CONTAINING_RECORD(pLE, DCE, List); - if(!pDCE) return; // Another null test! + do { if(!pDCE) break; @@ -859,7 +861,7 @@ DceResetActiveDCEs(PWND Window) } } - if (!GDIOBJ_ValidateHandle(pDCE->hDC, GDI_OBJECT_TYPE_DC) || + if (!GreIsHandleValid(pDCE->hDC) || (dc = DC_LockDc(pDCE->hDC)) == NULL) { pLE = pDCE->List.Flink; diff --git a/reactos/subsystems/win32/win32k/ntuser/winpos.c b/reactos/subsystems/win32/win32k/ntuser/winpos.c index 7b9a6f6fa44..3e397d84827 100644 --- a/reactos/subsystems/win32/win32k/ntuser/winpos.c +++ b/reactos/subsystems/win32/win32k/ntuser/winpos.c @@ -1206,7 +1206,7 @@ co_WinPosSetWindowPos( { /* Nothing to copy, clean up */ RGNOBJAPI_Unlock(VisRgn); - REGION_FreeRgnByHandle(CopyRgn); + GreDeleteObject(CopyRgn); CopyRgn = NULL; } else if (OldWindowRect.left != NewWindowRect.left || @@ -1299,12 +1299,12 @@ co_WinPosSetWindowPos( RDW_ERASE | RDW_FRAME | RDW_INVALIDATE | RDW_ALLCHILDREN); } } - REGION_FreeRgnByHandle(DirtyRgn); + GreDeleteObject(DirtyRgn); } if (CopyRgn != NULL) { - REGION_FreeRgnByHandle(CopyRgn); + GreDeleteObject(CopyRgn); } /* Expose what was covered before but not covered anymore */ @@ -1325,13 +1325,13 @@ co_WinPosSetWindowPos( { co_VIS_WindowLayoutChanged(Window, ExposedRgn); } - REGION_FreeRgnByHandle(ExposedRgn); - REGION_FreeRgnByHandle(VisBefore); + GreDeleteObject(ExposedRgn); + GreDeleteObject(VisBefore); } if (VisAfter != NULL) { - REGION_FreeRgnByHandle(VisAfter); + GreDeleteObject(VisAfter); } if (!(WinPos.flags & SWP_NOACTIVATE)) @@ -1421,7 +1421,7 @@ co_WinPosShowWindow(PWND Wnd, INT Cmd) // HRGN VisibleRgn; ASSERT_REFS_CO(Wnd); - + WasVisible = (Wnd->style & WS_VISIBLE) != 0; switch (Cmd) @@ -1640,7 +1640,7 @@ co_WinPosSearchChildren( UserDereferenceObject(ScopeWin); return NULL; } - + return ScopeWin; } @@ -1698,7 +1698,7 @@ IntDeferWindowPos( HDWP hdwp, SWP_HIDEWINDOW | SWP_FRAMECHANGED)) { EngSetLastError(ERROR_INVALID_PARAMETER); - return NULL; + return NULL; } if (!(pDWP = (PSMWP)UserGetObject(gHandleTable, hdwp, otSMWP))) @@ -1756,7 +1756,7 @@ IntDeferWindowPos( HDWP hdwp, pDWP->acvr[pDWP->ccvr].pos.cx = cx; pDWP->acvr[pDWP->ccvr].pos.cy = cy; pDWP->acvr[pDWP->ccvr].pos.flags = flags; - pDWP->acvr[pDWP->ccvr].hrgnClip = NULL; + pDWP->acvr[pDWP->ccvr].hrgnClip = NULL; pDWP->acvr[pDWP->ccvr].hrgnInterMonitor = NULL; pDWP->ccvr++; END: @@ -1917,7 +1917,7 @@ NtUserDeferWindowPos(HDWP WinPosInfo, if ( WndInsertAfter && WndInsertAfter != HWND_BOTTOM && - WndInsertAfter != HWND_TOPMOST && + WndInsertAfter != HWND_TOPMOST && WndInsertAfter != HWND_NOTOPMOST ) { pWndIA = UserGetWindowObject(WndInsertAfter); @@ -1934,7 +1934,7 @@ NtUserDeferWindowPos(HDWP WinPosInfo, Exit: DPRINT("Leave NtUserDeferWindowPos, ret=%i\n", Ret); UserLeave(); - return Ret; + return Ret; } /* @@ -1984,7 +1984,7 @@ NtUserSetWindowPos( if ( hWndInsertAfter && hWndInsertAfter != HWND_BOTTOM && - hWndInsertAfter != HWND_TOPMOST && + hWndInsertAfter != HWND_TOPMOST && hWndInsertAfter != HWND_NOTOPMOST ) { pWndIA = UserGetWindowObject(hWndInsertAfter); @@ -2051,7 +2051,7 @@ NtUserSetWindowRgn( if (hRgn) // The region will be deleted in user32. { - if (GDIOBJ_ValidateHandle(hRgn, GDI_OBJECT_TYPE_REGION)) + if (GreIsHandleValid(hRgn)) { hrgnCopy = IntSysCreateRectRgn(0, 0, 0, 0); @@ -2068,6 +2068,7 @@ NtUserSetWindowRgn( if (Window->hrgnClip) { /* Delete no longer needed region handle */ + IntGdiSetRegionOwner(Window->hrgnClip, GDI_OBJ_HMGR_POWNED); GreDeleteObject(Window->hrgnClip); } @@ -2198,7 +2199,7 @@ NtUserShowWindow(HWND hWnd, LONG nCmdShow) EngSetLastError(ERROR_INVALID_PARAMETER); RETURN(FALSE); } - + UserRefObjectCo(Window, &Ref); ret = co_WinPosShowWindow(Window, nCmdShow); UserDerefObjectCo(Window); diff --git a/reactos/subsystems/win32/win32k/ntuser/winsta.c b/reactos/subsystems/win32/win32k/ntuser/winsta.c index 2f44707b070..e312f7673cf 100644 --- a/reactos/subsystems/win32/win32k/ntuser/winsta.c +++ b/reactos/subsystems/win32/win32k/ntuser/winsta.c @@ -187,7 +187,7 @@ IntWinStaObjectParse(PWIN32_PARSEMETHOD_PARAMETERS Parameters) return STATUS_OBJECT_TYPE_MISMATCH; } -NTSTATUS NTAPI +NTSTATUS NTAPI IntWinstaOkToClose(PWIN32_OKAYTOCLOSEMETHOD_PARAMETERS Parameters) { PPROCESSINFO ppi; @@ -326,15 +326,15 @@ co_IntInitializeDesktopGraphics(VOID) IntDestroyPrimarySurface(); return FALSE; } - IntGdiSetDCOwnerEx(ScreenDeviceContext, GDI_OBJ_HMGR_PUBLIC, FALSE); + GreSetDCOwner(ScreenDeviceContext, GDI_OBJ_HMGR_PUBLIC); /* Setup the cursor */ co_IntLoadDefaultCursors(); hSystemBM = NtGdiCreateCompatibleDC(ScreenDeviceContext); - NtGdiSelectFont( hSystemBM, NtGdiGetStockObject(SYSTEM_FONT)); - IntGdiSetDCOwnerEx( hSystemBM, GDI_OBJ_HMGR_PUBLIC, FALSE); + NtGdiSelectFont(hSystemBM, NtGdiGetStockObject(SYSTEM_FONT)); + GreSetDCOwner(hSystemBM, GDI_OBJ_HMGR_PUBLIC); // FIXME! Move these to a update routine. gpsi->Planes = NtGdiGetDeviceCaps(ScreenDeviceContext, PLANES); @@ -353,8 +353,8 @@ IntEndDesktopGraphics(VOID) { if (NULL != ScreenDeviceContext) { // No need to allocate a new dcattr. - DC_SetOwnership(ScreenDeviceContext, PsGetCurrentProcess()); - NtGdiDeleteObjectApp(ScreenDeviceContext); + GreSetDCOwner(ScreenDeviceContext, GDI_OBJ_HMGR_POWNED); + GreDeleteObject(ScreenDeviceContext); ScreenDeviceContext = NULL; } IntHideDesktop(IntGetActiveDesktop()); @@ -438,7 +438,7 @@ NtUserCreateWindowStation( /* * No existing window station found, try to create new one */ - + /* Capture window station name */ _SEH2_TRY { diff --git a/reactos/subsystems/win32/win32k/objects/bitblt.c b/reactos/subsystems/win32/win32k/objects/bitblt.c index 1fa1d550027..27444939482 100644 --- a/reactos/subsystems/win32/win32k/objects/bitblt.c +++ b/reactos/subsystems/win32/win32k/objects/bitblt.c @@ -64,23 +64,19 @@ NtGdiAlphaBlend( DPRINT("Locking DCs\n"); ahDC[0] = hDCDest; ahDC[1] = hDCSrc ; - GDIOBJ_LockMultipleObjs(2, ahDC, apObj); - DCDest = apObj[0]; - DCSrc = apObj[1]; - - if ((NULL == DCDest) || (NULL == DCSrc)) + if (!GDIOBJ_bLockMultipleObjects(2, ahDC, apObj, GDIObjType_DC_TYPE)) { DPRINT1("Invalid dc handle (dest=0x%08x, src=0x%08x) passed to NtGdiAlphaBlend\n", hDCDest, hDCSrc); EngSetLastError(ERROR_INVALID_HANDLE); - if(DCSrc) GDIOBJ_UnlockObjByPtr(&DCSrc->BaseObject); - if(DCDest) GDIOBJ_UnlockObjByPtr(&DCDest->BaseObject); return FALSE; } + DCDest = apObj[0]; + DCSrc = apObj[1]; if (DCDest->dctype == DC_TYPE_INFO || DCDest->dctype == DCTYPE_INFO) { - GDIOBJ_UnlockObjByPtr(&DCSrc->BaseObject); - GDIOBJ_UnlockObjByPtr(&DCDest->BaseObject); + GDIOBJ_vUnlockObject(&DCSrc->BaseObject); + GDIOBJ_vUnlockObject(&DCDest->BaseObject); /* Yes, Windows really returns TRUE in this case */ return TRUE; } @@ -112,8 +108,8 @@ NtGdiAlphaBlend( !SourceRect.right || !SourceRect.bottom) { - GDIOBJ_UnlockObjByPtr(&DCSrc->BaseObject); - GDIOBJ_UnlockObjByPtr(&DCDest->BaseObject); + GDIOBJ_vUnlockObject(&DCSrc->BaseObject); + GDIOBJ_vUnlockObject(&DCDest->BaseObject); return TRUE; } @@ -153,8 +149,8 @@ NtGdiAlphaBlend( leave : DPRINT("Finishing blit\n"); DC_vFinishBlit(DCDest, DCSrc); - GDIOBJ_UnlockObjByPtr(&DCSrc->BaseObject); - GDIOBJ_UnlockObjByPtr(&DCDest->BaseObject); + GDIOBJ_vUnlockObject(&DCSrc->BaseObject); + GDIOBJ_vUnlockObject(&DCDest->BaseObject); return bResult; } @@ -216,23 +212,19 @@ NtGdiTransparentBlt( DPRINT("Locking DCs\n"); ahDC[0] = hdcDst; ahDC[1] = hdcSrc ; - GDIOBJ_LockMultipleObjs(2, ahDC, apObj); - DCDest = apObj[0]; - DCSrc = apObj[1]; - - if ((NULL == DCDest) || (NULL == DCSrc)) + if (!GDIOBJ_bLockMultipleObjects(2, ahDC, apObj, GDIObjType_DC_TYPE)) { DPRINT1("Invalid dc handle (dest=0x%08x, src=0x%08x) passed to NtGdiAlphaBlend\n", hdcDst, hdcSrc); EngSetLastError(ERROR_INVALID_HANDLE); - if(DCSrc) GDIOBJ_UnlockObjByPtr(&DCSrc->BaseObject); - if(DCDest) GDIOBJ_UnlockObjByPtr(&DCDest->BaseObject); return FALSE; } + DCDest = apObj[0]; + DCSrc = apObj[1]; if (DCDest->dctype == DC_TYPE_INFO || DCDest->dctype == DCTYPE_INFO) { - GDIOBJ_UnlockObjByPtr(&DCSrc->BaseObject); - GDIOBJ_UnlockObjByPtr(&DCDest->BaseObject); + GDIOBJ_vUnlockObject(&DCSrc->BaseObject); + GDIOBJ_vUnlockObject(&DCDest->BaseObject); /* Yes, Windows really returns TRUE in this case */ return TRUE; } @@ -289,8 +281,8 @@ NtGdiTransparentBlt( done: DC_vFinishBlit(DCDest, DCSrc); - GDIOBJ_UnlockObjByPtr(&DCDest->BaseObject); - GDIOBJ_UnlockObjByPtr(&DCSrc->BaseObject); + GDIOBJ_vUnlockObject(&DCDest->BaseObject); + GDIOBJ_vUnlockObject(&DCSrc->BaseObject); return Ret; } @@ -330,11 +322,16 @@ NtGdiMaskBlt( UsesMask = ROP_USES_MASK(dwRop); //DPRINT1("dwRop : 0x%08x\n", dwRop); + if (!hdcDest || (UsesSource && !hdcSrc)) + { + EngSetLastError(ERROR_INVALID_PARAMETER); + return FALSE; + } /* Take care of mask bitmap */ if(hbmMask) { - psurfMask = SURFACE_LockSurface(hbmMask); + psurfMask = SURFACE_ShareLockSurface(hbmMask); if(!psurfMask) { EngSetLastError(ERROR_INVALID_HANDLE); @@ -352,14 +349,14 @@ NtGdiMaskBlt( if(gajBitsPerFormat[psurfMask->SurfObj.iBitmapFormat] != 1) { EngSetLastError(ERROR_INVALID_PARAMETER); - SURFACE_UnlockSurface(psurfMask); + SURFACE_ShareUnlockSurface(psurfMask); return FALSE; } } else if(psurfMask) { DPRINT1("Getting Mask bitmap without needing it?\n"); - SURFACE_UnlockSurface(psurfMask); + SURFACE_ShareUnlockSurface(psurfMask); psurfMask = NULL; } MaskPoint.x = xMask; @@ -368,11 +365,17 @@ NtGdiMaskBlt( /* Take care of source and destination bitmap */ DPRINT("Locking DCs\n"); ahDC[0] = hdcDest; - ahDC[1] = hdcSrc ; - GDIOBJ_LockMultipleObjs(2, ahDC, apObj); + ahDC[1] = UsesSource ? hdcSrc : NULL; + if (!GDIOBJ_bLockMultipleObjects(2, ahDC, apObj, GDIObjType_DC_TYPE)) + { + DPRINT1("Invalid dc handle (dest=0x%08x, src=0x%08x) passed to NtGdiAlphaBlend\n", hdcDest, hdcSrc); + EngSetLastError(ERROR_INVALID_HANDLE); + return FALSE; + } DCDest = apObj[0]; DCSrc = apObj[1]; + ASSERT(DCDest); if (NULL == DCDest) { if(DCSrc) DC_UnlockDc(DCSrc); @@ -390,12 +393,7 @@ NtGdiMaskBlt( if (UsesSource) { - if (NULL == DCSrc) - { - DC_UnlockDc(DCDest); - DPRINT("Invalid source dc handle (0x%08x) passed to NtGdiBitBlt\n", hdcSrc); - return FALSE; - } + ASSERT(DCSrc); if (DCSrc->dctype == DC_TYPE_INFO) { DC_UnlockDc(DCDest); @@ -404,12 +402,6 @@ NtGdiMaskBlt( return TRUE; } } - else if(DCSrc) - { - DPRINT("Getting a valid Source handle without using source!!!\n"); - DC_UnlockDc(DCSrc); - DCSrc = NULL ; - } pdcattr = DCDest->pdcattr; @@ -490,7 +482,7 @@ cleanup: DC_UnlockDc(DCSrc); } DC_UnlockDc(DCDest); - if(psurfMask) SURFACE_UnlockSurface(psurfMask); + if(psurfMask) SURFACE_ShareUnlockSurface(psurfMask); return Status; } @@ -547,9 +539,12 @@ GreStretchBltMask( EXLATEOBJ exlo; XLATEOBJ *XlateObj = NULL; POINTL BrushOrigin; - BOOL UsesSource = ROP_USES_SOURCE(ROP); + BOOL UsesSource; + BOOL UsesMask; FIXUP_ROP(ROP); + UsesSource = ROP_USES_SOURCE(ROP); + UsesMask = ROP_USES_MASK(ROP); if (0 == WidthDest || 0 == HeightDest || 0 == WidthSrc || 0 == HeightSrc) { @@ -557,56 +552,45 @@ GreStretchBltMask( return FALSE; } - DPRINT("Locking DCs\n"); + if (!hDCDest || (UsesSource && !hDCSrc) || (UsesMask && !hDCMask)) + { + EngSetLastError(ERROR_INVALID_PARAMETER); + return FALSE; + } + ahDC[0] = hDCDest; - ahDC[1] = hDCSrc ; - ahDC[2] = hDCMask ; - GDIOBJ_LockMultipleObjs(3, ahDC, apObj); + ahDC[1] = UsesSource ? hDCSrc : NULL; + ahDC[2] = UsesMask ? hDCMask : NULL; + if (!GDIOBJ_bLockMultipleObjects(3, ahDC, apObj, GDIObjType_DC_TYPE)) + { + DPRINT1("Invalid dc handle (dest=0x%08x, src=0x%08x) passed to NtGdiAlphaBlend\n", hDCDest, hDCSrc); + EngSetLastError(ERROR_INVALID_HANDLE); + return FALSE; + } DCDest = apObj[0]; DCSrc = apObj[1]; DCMask = apObj[2]; - if (NULL == DCDest) - { - if(DCSrc) GDIOBJ_UnlockObjByPtr(&DCSrc->BaseObject); - if(DCMask) GDIOBJ_UnlockObjByPtr(&DCMask->BaseObject); - DPRINT("Invalid destination dc handle (0x%08x) passed to NtGdiBitBlt\n", hDCDest); - return FALSE; - } - if (DCDest->dctype == DC_TYPE_INFO) { - if(DCSrc) GDIOBJ_UnlockObjByPtr(&DCSrc->BaseObject); - if(DCMask) GDIOBJ_UnlockObjByPtr(&DCMask->BaseObject); - GDIOBJ_UnlockObjByPtr(&DCDest->BaseObject); + if(DCSrc) GDIOBJ_vUnlockObject(&DCSrc->BaseObject); + if(DCMask) GDIOBJ_vUnlockObject(&DCMask->BaseObject); + GDIOBJ_vUnlockObject(&DCDest->BaseObject); /* Yes, Windows really returns TRUE in this case */ return TRUE; } if (UsesSource) { - if (NULL == DCSrc) - { - GDIOBJ_UnlockObjByPtr(&DCDest->BaseObject); - if(DCMask) GDIOBJ_UnlockObjByPtr(&DCMask->BaseObject); - DPRINT("Invalid source dc handle (0x%08x) passed to NtGdiBitBlt\n", hDCSrc); - return FALSE; - } if (DCSrc->dctype == DC_TYPE_INFO) { - GDIOBJ_UnlockObjByPtr(&DCDest->BaseObject); - GDIOBJ_UnlockObjByPtr(&DCSrc->BaseObject); - if(DCMask) GDIOBJ_UnlockObjByPtr(&DCMask->BaseObject); + GDIOBJ_vUnlockObject(&DCDest->BaseObject); + GDIOBJ_vUnlockObject(&DCSrc->BaseObject); + if(DCMask) GDIOBJ_vUnlockObject(&DCMask->BaseObject); /* Yes, Windows really returns TRUE in this case */ return TRUE; } } - else if(DCSrc) - { - DPRINT1("Getting a valid Source handle without using source!!!\n"); - GDIOBJ_UnlockObjByPtr(&DCSrc->BaseObject); - DCSrc = NULL ; - } pdcattr = DCDest->pdcattr; @@ -867,7 +851,7 @@ IntGdiPolyPatBlt( for (i = 0; i < cRects; i++) { - pbrush = BRUSH_LockBrush(pRects->hBrush); + pbrush = BRUSH_ShareLockBrush(pRects->hBrush); if(pbrush != NULL) { IntPatBlt( @@ -878,7 +862,7 @@ IntGdiPolyPatBlt( pRects->r.bottom, dwRop, pbrush); - BRUSH_UnlockBrush(pbrush); + BRUSH_ShareUnlockBrush(pbrush); } pRects++; } @@ -928,7 +912,7 @@ NtGdiPatBlt( if (pdcattr->ulDirty_ & (DIRTY_FILL | DC_BRUSH_DIRTY)) DC_vUpdateFillBrush(dc); - pbrush = BRUSH_LockBrush(pdcattr->hbrush); + pbrush = BRUSH_ShareLockBrush(pdcattr->hbrush); if (pbrush == NULL) { EngSetLastError(ERROR_INVALID_HANDLE); @@ -938,7 +922,7 @@ NtGdiPatBlt( ret = IntPatBlt(dc, XLeft, YLeft, Width, Height, ROP, pbrush); - BRUSH_UnlockBrush(pbrush); + BRUSH_ShareUnlockBrush(pbrush); DC_UnlockDc(dc); return ret; diff --git a/reactos/subsystems/win32/win32k/objects/bitmaps.c b/reactos/subsystems/win32/win32k/objects/bitmaps.c index f99d1b4eab5..28dc28afb9a 100644 --- a/reactos/subsystems/win32/win32k/objects/bitmaps.c +++ b/reactos/subsystems/win32/win32k/objects/bitmaps.c @@ -114,7 +114,7 @@ GreCreateBitmapEx( if (!pvBits) { EngSetLastError(ERROR_NOT_ENOUGH_MEMORY); - SURFACE_FreeSurfaceByHandle(hbmp); + GDIOBJ_vDeleteObject(&psurf->BaseObject); return NULL; } DecompressBitmap(sizl, pvCompressedBits, pvBits, lDelta, iFormat); @@ -133,7 +133,7 @@ GreCreateBitmapEx( /* Bail out if that failed */ DPRINT1("SURFACE_bSetBitmapBits failed.\n"); EngSetLastError(ERROR_NOT_ENOUGH_MEMORY); - SURFACE_FreeSurfaceByHandle(hbmp); + GDIOBJ_vDeleteObject(&psurf->BaseObject); return NULL; } @@ -209,8 +209,7 @@ NtGdiCreateBitmap( } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { - SURFACE_UnlockSurface(psurf); - SURFACE_FreeSurfaceByHandle(hbmp); + GDIOBJ_vDeleteObject(&psurf->BaseObject); _SEH2_YIELD(return NULL;) } _SEH2_END @@ -274,7 +273,7 @@ IntCreateCompatibleBitmap( ASSERT(psurfBmp); /* Assign palette */ psurfBmp->ppal = psurf->ppal; - GDIOBJ_IncrementShareCount((POBJ)psurf->ppal); + GDIOBJ_vReferenceObjectByPointer((POBJ)psurf->ppal); /* Set flags */ psurfBmp->flags = API_BITMAP; psurfBmp->hdc = NULL; // Fixme @@ -316,7 +315,7 @@ IntCreateCompatibleBitmap( return 0; } - PalGDI = PALETTE_ShareLockPalette(psurf->ppal->BaseObject.hHmgr); + PalGDI = psurf->ppal; for (Index = 0; Index < 256 && Index < PalGDI->NumColors; @@ -327,7 +326,6 @@ IntCreateCompatibleBitmap( bi->bmiColors[Index].rgbBlue = PalGDI->IndexedColors[Index].peBlue; bi->bmiColors[Index].rgbReserved = 0; } - PALETTE_ShareUnlockPalette(PalGDI); } Bmp = DIB_CreateDIBSection(Dc, @@ -873,8 +871,8 @@ BITMAP_CopyBitmap(HBITMAP hBitmap) if (resBitmap) { IntSetBitmapBits(resBitmap, Bitmap->SurfObj.cjBits, Bitmap->SurfObj.pvBits); - GDIOBJ_IncrementShareCount(&Bitmap->ppal->BaseObject); - GDIOBJ_ShareUnlockObjByPtr(&resBitmap->ppal->BaseObject); + GDIOBJ_vReferenceObjectByPointer(&Bitmap->ppal->BaseObject); + GDIOBJ_vDereferenceObject(&resBitmap->ppal->BaseObject); resBitmap->ppal = Bitmap->ppal; SURFACE_ShareUnlockSurface(resBitmap); } diff --git a/reactos/subsystems/win32/win32k/objects/brush.c b/reactos/subsystems/win32/win32k/objects/brush.c index 72b7fd3864a..f72d7d1ddf7 100644 --- a/reactos/subsystems/win32/win32k/objects/brush.c +++ b/reactos/subsystems/win32/win32k/objects/brush.c @@ -35,180 +35,80 @@ static const ULONG HatchBrushes[NB_HATCH_STYLES][8] = {0x7E, 0xBD, 0xDB, 0xE7, 0xE7, 0xDB, 0xBD, 0x7E} /* HS_DIAGCROSS */ }; - -PVOID +BOOL FASTCALL -AllocateObjectAttr(VOID) +IntGdiSetBrushOwner(PBRUSH pbr, ULONG ulOwner) { - PTHREADINFO pti; - PPROCESSINFO ppi; - PVOID pAttr; - PGDI_OBJ_ATTR_FREELIST pGdiObjAttrFreeList; - PGDI_OBJ_ATTR_ENTRY pGdiObjAttrEntry; - int i; + // FIXME: + if (pbr->flAttrs & GDIBRUSH_IS_GLOBAL) return TRUE; - pti = PsGetCurrentThreadWin32Thread(); - if (pti->pgdiBrushAttr) - { - pAttr = pti->pgdiBrushAttr; // Get the free one. - pti->pgdiBrushAttr = NULL; - return pAttr; - } + if ((ulOwner == GDI_OBJ_HMGR_PUBLIC) || ulOwner == GDI_OBJ_HMGR_NONE) + { + // Deny user access to User Data. + GDIOBJ_vSetObjectAttr(&pbr->BaseObject, NULL); + // FIXME: deallocate brush attr + } - ppi = PsGetCurrentProcessWin32Process(); + if (ulOwner == GDI_OBJ_HMGR_POWNED) + { + // Allow user access to User Data. + GDIOBJ_vSetObjectAttr(&pbr->BaseObject, pbr->pBrushAttr); + // FIXME: allocate brush attr + } - if (!ppi->pBrushAttrList) // If set point is null, allocate new group. - { - pGdiObjAttrEntry = EngAllocUserMem(sizeof(GDI_OBJ_ATTR_ENTRY), 0); + GDIOBJ_vSetObjectOwner(&pbr->BaseObject, ulOwner); - if (!pGdiObjAttrEntry) - { - DPRINT1("Attr Failed User Allocation!\n"); - return NULL; - } - - DPRINT("AllocObjectAttr User 0x%x\n",pGdiObjAttrEntry); - - pGdiObjAttrFreeList = ExAllocatePoolWithTag( PagedPool, - sizeof(GDI_OBJ_ATTR_FREELIST), - GDITAG_BRUSH_FREELIST); - if ( !pGdiObjAttrFreeList ) - { - EngFreeUserMem(pGdiObjAttrEntry); - return NULL; - } - - RtlZeroMemory(pGdiObjAttrFreeList, sizeof(GDI_OBJ_ATTR_FREELIST)); - - DPRINT("AllocObjectAttr Ex 0x%x\n",pGdiObjAttrFreeList); - - InsertHeadList( &ppi->GDIBrushAttrFreeList, &pGdiObjAttrFreeList->Entry); - - pGdiObjAttrFreeList->nEntries = GDIOBJATTRFREE; - // Start at the bottom up and set end of free list point. - ppi->pBrushAttrList = &pGdiObjAttrEntry->Attr[GDIOBJATTRFREE-1]; - // Build the free attr list. - for ( i = 0; i < GDIOBJATTRFREE; i++) - { - pGdiObjAttrFreeList->AttrList[i] = &pGdiObjAttrEntry->Attr[i]; - } - } - - pAttr = ppi->pBrushAttrList; - pGdiObjAttrFreeList = (PGDI_OBJ_ATTR_FREELIST)ppi->GDIBrushAttrFreeList.Flink; - - // Free the list when it is full! - if ( pGdiObjAttrFreeList->nEntries-- == 1) - { // No more free entries, so yank the list. - RemoveEntryList( &pGdiObjAttrFreeList->Entry ); - - ExFreePoolWithTag( pGdiObjAttrFreeList, GDITAG_BRUSH_FREELIST ); - - if ( IsListEmpty( &ppi->GDIBrushAttrFreeList ) ) - { - ppi->pBrushAttrList = NULL; - return pAttr; - } - - pGdiObjAttrFreeList = (PGDI_OBJ_ATTR_FREELIST)ppi->GDIBrushAttrFreeList.Flink; - } - - ppi->pBrushAttrList = pGdiObjAttrFreeList->AttrList[pGdiObjAttrFreeList->nEntries-1]; - - return pAttr; -} - -VOID -FASTCALL -FreeObjectAttr(PVOID pAttr) -{ - PTHREADINFO pti; - PPROCESSINFO ppi; - PGDI_OBJ_ATTR_FREELIST pGdiObjAttrFreeList; - - pti = PsGetCurrentThreadWin32Thread(); - - if (!pti) return; - - if (!pti->pgdiBrushAttr) - { // If it is null, just cache it for the next time. - pti->pgdiBrushAttr = pAttr; - return; - } - - ppi = PsGetCurrentProcessWin32Process(); - - pGdiObjAttrFreeList = (PGDI_OBJ_ATTR_FREELIST)ppi->GDIBrushAttrFreeList.Flink; - - // We add to the list of free entries, so this will grows! - if ( IsListEmpty(&ppi->GDIBrushAttrFreeList) || - pGdiObjAttrFreeList->nEntries == GDIOBJATTRFREE ) - { - pGdiObjAttrFreeList = ExAllocatePoolWithTag( PagedPool, - sizeof(GDI_OBJ_ATTR_FREELIST), - GDITAG_BRUSH_FREELIST); - if ( !pGdiObjAttrFreeList ) - { - return; - } - InsertHeadList( &ppi->GDIBrushAttrFreeList, &pGdiObjAttrFreeList->Entry); - pGdiObjAttrFreeList->nEntries = 0; - } - // Up count, save the entry and set end of free list point. - ++pGdiObjAttrFreeList->nEntries; // Top Down... - pGdiObjAttrFreeList->AttrList[pGdiObjAttrFreeList->nEntries-1] = pAttr; - ppi->pBrushAttrList = pAttr; - - return; + return TRUE; } BOOL -FASTCALL -IntGdiSetBrushOwner(PBRUSH pbr, DWORD OwnerMask) +NTAPI +BRUSH_bAllocBrushAttr(PBRUSH pbr) { - HBRUSH hBR; - PEPROCESS Owner = NULL; - PGDI_TABLE_ENTRY pEntry = NULL; + PPROCESSINFO ppi; + BRUSH_ATTR *pBrushAttr; - if (!pbr) return FALSE; + ppi = PsGetCurrentProcessWin32Process(); + ASSERT(ppi); - hBR = pbr->BaseObject.hHmgr; - - if (!hBR || (GDI_HANDLE_GET_TYPE(hBR) != GDI_OBJECT_TYPE_BRUSH)) - return FALSE; - else - { - INT Index = GDI_HANDLE_GET_INDEX((HGDIOBJ)hBR); - pEntry = &GdiHandleTable->Entries[Index]; - } - - if (pbr->flAttrs & GDIBRUSH_IS_GLOBAL) - { - GDIOBJ_ShareUnlockObjByPtr((POBJ)pbr); - return TRUE; - } - - if ((OwnerMask == GDI_OBJ_HMGR_PUBLIC) || OwnerMask == GDI_OBJ_HMGR_NONE) - { - // Set this Brush to inaccessible mode and to an Owner of NONE. -// if (OwnerMask == GDI_OBJ_HMGR_NONE) Owner = OwnerMask; - - if (!GDIOBJ_SetOwnership((HGDIOBJ) hBR, Owner)) + pBrushAttr = GdiPoolAllocate(ppi->pPoolDcAttr); + if (!pBrushAttr) + { + DPRINT1("Could not allocate brush attr\n"); return FALSE; + } - // Deny user access to User Data. - pEntry->UserData = NULL; // This hBR is inaccessible! - } + /* Copy the content from the kernel mode dc attr */ + pbr->pBrushAttr = pBrushAttr; + *pbr->pBrushAttr = pbr->BrushAttr; - if (OwnerMask == GDI_OBJ_HMGR_POWNED) - { - if (!GDIOBJ_SetOwnership((HGDIOBJ) hBR, PsGetCurrentProcess() )) - return FALSE; + /* Set the object attribute in the handle table */ + GDIOBJ_vSetObjectAttr(&pbr->BaseObject, pBrushAttr); - // Allow user access to User Data. - pEntry->UserData = pbr->pBrushAttr; - } - return TRUE; + DPRINT("BRUSH_bAllocBrushAttr: pbr=%p, pbr->pdcattr=%p\n", pbr, pbr->pBrushAttr); + return TRUE; +} + + +VOID +NTAPI +BRUSH_vFreeBrushAttr(PBRUSH pbr) +{ +#if 0 + PPROCESSINFO ppi; + + if (pbrush->pBrushAttr == &pbrush->BrushAttr) return; + + /* Reset the object attribute in the handle table */ + GDIOBJ_vSetObjectAttr(&pbr->BaseObject, NULL); + + /* Free memory from the process gdi pool */ + ppi = PsGetCurrentProcessWin32Process(); + ASSERT(ppi); + GdiPoolFree(ppi->pPoolBrushAttr, pbr->pBrushAttr); +#endif + /* Reset to kmode brush attribute */ + pbr->pBrushAttr = &pbr->BrushAttr; } BOOL @@ -219,10 +119,16 @@ BRUSH_Cleanup(PVOID ObjectBody) if (pbrush->flAttrs & (GDIBRUSH_IS_HATCH | GDIBRUSH_IS_BITMAP)) { ASSERT(pbrush->hbmPattern); - GDIOBJ_SetOwnership(pbrush->hbmPattern, PsGetCurrentProcess()); + GreSetObjectOwner(pbrush->hbmPattern, GDI_OBJ_HMGR_POWNED); GreDeleteObject(pbrush->hbmPattern); } + /* Check if there is a usermode attribute */ + if (pbrush->pBrushAttr != &pbrush->BrushAttr) + { + BRUSH_vFreeBrushAttr(pbrush); + } + /* Free the kmode styles array of EXTPENS */ if (pbrush->pStyle) { @@ -339,9 +245,9 @@ IntGdiCreateDIBBrush( pbrush->hbmPattern = hPattern; /* FIXME: Fill in the rest of fields!!! */ - GDIOBJ_SetOwnership(hPattern, NULL); + GreSetObjectOwner(hPattern, GDI_OBJ_HMGR_PUBLIC); - BRUSH_UnlockBrush(pbrush); + GDIOBJ_vUnlockObject(&pbrush->BaseObject); return hBrush; } @@ -381,9 +287,9 @@ IntGdiCreateHatchBrush( pbrush->hbmPattern = hPattern; pbrush->BrushAttr.lbColor = Color & 0xFFFFFF; - GDIOBJ_SetOwnership(hPattern, NULL); + GreSetObjectOwner(hPattern, GDI_OBJ_HMGR_PUBLIC); - BRUSH_UnlockBrush(pbrush); + GDIOBJ_vUnlockObject(&pbrush->BaseObject); return hBrush; } @@ -417,9 +323,9 @@ IntGdiCreatePatternBrush( pbrush->hbmPattern = hPattern; /* FIXME: Fill in the rest of fields!!! */ - GDIOBJ_SetOwnership(hPattern, NULL); + GreSetObjectOwner(hPattern, GDI_OBJ_HMGR_PUBLIC); - BRUSH_UnlockBrush(pbrush); + GDIOBJ_vUnlockObject(&pbrush->BaseObject); return hBrush; } @@ -445,7 +351,7 @@ IntGdiCreateSolidBrush( pbrush->BrushAttr.lbColor = Color & 0x00FFFFFF; /* FIXME: Fill in the rest of fields!!! */ - BRUSH_UnlockBrush(pbrush); + GDIOBJ_vUnlockObject(&pbrush->BaseObject); return hBrush; } @@ -466,7 +372,7 @@ IntGdiCreateNullBrush(VOID) hBrush = pbrush->BaseObject.hHmgr; pbrush->flAttrs |= GDIBRUSH_IS_NULL; - BRUSH_UnlockBrush(pbrush); + GDIOBJ_vUnlockObject(&pbrush->BaseObject); return hBrush; } @@ -477,12 +383,12 @@ IntGdiSetSolidBrushColor(HBRUSH hBrush, COLORREF Color) { PBRUSH pbrush; - pbrush = BRUSH_LockBrush(hBrush); + pbrush = BRUSH_ShareLockBrush(hBrush); if (pbrush->flAttrs & GDIBRUSH_IS_SOLID) { pbrush->BrushAttr.lbColor = Color & 0xFFFFFF; } - BRUSH_UnlockBrush(pbrush); + BRUSH_ShareUnlockBrush(pbrush); } diff --git a/reactos/subsystems/win32/win32k/objects/cliprgn.c b/reactos/subsystems/win32/win32k/objects/cliprgn.c index bfe5248d10e..532d766a040 100644 --- a/reactos/subsystems/win32/win32k/objects/cliprgn.c +++ b/reactos/subsystems/win32/win32k/objects/cliprgn.c @@ -27,6 +27,7 @@ CLIPPING_UpdateGCRegion(DC* Dc) { PROSRGNDATA CombinedRegion; HRGN hRgnVis; + PREGION prgnClip, prgnGCClip; // would prefer this, but the rest of the code sucks // ASSERT(Dc->rosdc.hGCClipRgn); @@ -37,10 +38,18 @@ CLIPPING_UpdateGCRegion(DC* Dc) if (Dc->rosdc.hGCClipRgn == NULL) Dc->rosdc.hGCClipRgn = IntSysCreateRectRgn(0, 0, 0, 0); + prgnGCClip = REGION_LockRgn(Dc->rosdc.hGCClipRgn); + ASSERT(prgnGCClip); + if (Dc->rosdc.hClipRgn == NULL) - NtGdiCombineRgn(Dc->rosdc.hGCClipRgn, hRgnVis, 0, RGN_COPY); + IntGdiCombineRgn(prgnGCClip, Dc->prgnVis, NULL, RGN_COPY); else - NtGdiCombineRgn(Dc->rosdc.hGCClipRgn, Dc->rosdc.hClipRgn, hRgnVis, RGN_AND); + { + prgnClip = REGION_LockRgn(Dc->rosdc.hClipRgn); // FIXME: locking order, ugh + IntGdiCombineRgn(prgnGCClip, Dc->prgnVis, prgnClip, RGN_AND); + REGION_UnlockRgn(prgnClip); + } + REGION_UnlockRgn(prgnGCClip); NtGdiOffsetRgn(Dc->rosdc.hGCClipRgn, Dc->ptlDCOrig.x, Dc->ptlDCOrig.y); @@ -74,6 +83,7 @@ GdiSelectVisRgn(HDC hdc, HRGN hrgn) { int retval; DC *dc; + PREGION prgn; if (!hrgn) { @@ -90,10 +100,12 @@ GdiSelectVisRgn(HDC hdc, HRGN hrgn) ASSERT (dc->prgnVis != NULL); - retval = NtGdiCombineRgn(dc->prgnVis->BaseObject.hHmgr, hrgn, 0, RGN_COPY); + prgn = RGNOBJAPI_Lock(hrgn, NULL); + retval = prgn ? IntGdiCombineRgn(dc->prgnVis, prgn, NULL, RGN_COPY) : ERROR; + RGNOBJAPI_Unlock(prgn); if ( retval != ERROR ) { - NtGdiOffsetRgn(dc->prgnVis->BaseObject.hHmgr, -dc->ptlDCOrig.x, -dc->ptlDCOrig.y); + IntGdiOffsetRgn(dc->prgnVis, -dc->ptlDCOrig.x, -dc->ptlDCOrig.y); CLIPPING_UpdateGCRegion(dc); } DC_UnlockDc(dc); @@ -114,7 +126,7 @@ int FASTCALL GdiExtSelectClipRgn(PDC dc, { if (dc->rosdc.hClipRgn != NULL) { - REGION_FreeRgnByHandle(dc->rosdc.hClipRgn); + GreDeleteObject(dc->rosdc.hClipRgn); dc->rosdc.hClipRgn = NULL; } } @@ -213,7 +225,7 @@ GdiGetClipBox(HDC hDC, PRECTL rc) retval = REGION_GetRgnBox(pRgnNew, rc); - REGION_FreeRgnByHandle(pRgnNew->BaseObject.hHmgr); + REGION_Delete(pRgnNew); DC_UnlockDc(dc); if(Unlock) REGION_UnlockRgn(pRgn); @@ -266,7 +278,7 @@ int APIENTRY NtGdiExcludeClipRect(HDC hDC, { INT Result; RECTL Rect; - HRGN NewRgn; + PREGION prgnNew, prgnClip; PDC dc = DC_LockDc(hDC); if (!dc) @@ -282,8 +294,8 @@ int APIENTRY NtGdiExcludeClipRect(HDC hDC, IntLPtoDP(dc, (LPPOINT)&Rect, 2); - NewRgn = IntSysCreateRectRgnIndirect(&Rect); - if (!NewRgn) + prgnNew = IntSysCreateRectpRgnIndirect(&Rect); + if (!prgnNew) { Result = ERROR; } @@ -292,14 +304,18 @@ int APIENTRY NtGdiExcludeClipRect(HDC hDC, if (!dc->rosdc.hClipRgn) { dc->rosdc.hClipRgn = IntSysCreateRectRgn(0, 0, 0, 0); - NtGdiCombineRgn(dc->rosdc.hClipRgn, dc->prgnVis->BaseObject.hHmgr, NewRgn, RGN_DIFF); + prgnClip = REGION_LockRgn(dc->rosdc.hClipRgn); + IntGdiCombineRgn(prgnClip, dc->prgnVis, prgnNew, RGN_DIFF); + REGION_UnlockRgn(prgnClip); Result = SIMPLEREGION; } else { - Result = NtGdiCombineRgn(dc->rosdc.hClipRgn, dc->rosdc.hClipRgn, NewRgn, RGN_DIFF); + prgnClip = REGION_LockRgn(dc->rosdc.hClipRgn); + Result = IntGdiCombineRgn(prgnClip, prgnClip, prgnNew, RGN_DIFF); + REGION_UnlockRgn(prgnClip); } - REGION_FreeRgnByHandle(NewRgn); + REGION_Delete(prgnNew); } if (Result != ERROR) CLIPPING_UpdateGCRegion(dc); @@ -349,7 +365,7 @@ int APIENTRY NtGdiIntersectClipRect(HDC hDC, else { Result = NtGdiCombineRgn(dc->rosdc.hClipRgn, dc->rosdc.hClipRgn, NewRgn, RGN_AND); - REGION_FreeRgnByHandle(NewRgn); + GreDeleteObject(NewRgn); } if (Result != ERROR) CLIPPING_UpdateGCRegion(dc); @@ -476,13 +492,13 @@ IntGdiSetMetaRgn(PDC pDC) RGN_AND); if ( Ret ) { - GDIOBJ_ShareUnlockObjByPtr(&pDC->dclevel.prgnMeta->BaseObject); + GDIOBJ_vDereferenceObject(&pDC->dclevel.prgnMeta->BaseObject); if (!((PROSRGNDATA)pDC->dclevel.prgnMeta)->BaseObject.ulShareCount) REGION_Delete(pDC->dclevel.prgnMeta); pDC->dclevel.prgnMeta = TempRgn; - GDIOBJ_ShareUnlockObjByPtr(&pDC->dclevel.prgnClip->BaseObject); + GDIOBJ_vDereferenceObject(&pDC->dclevel.prgnClip->BaseObject); if (!((PROSRGNDATA)pDC->dclevel.prgnClip)->BaseObject.ulShareCount) REGION_Delete(pDC->dclevel.prgnClip); diff --git a/reactos/subsystems/win32/win32k/objects/dcattr.c b/reactos/subsystems/win32/win32k/objects/dcattr.c index 93673c77717..726fd0a86db 100644 --- a/reactos/subsystems/win32/win32k/objects/dcattr.c +++ b/reactos/subsystems/win32/win32k/objects/dcattr.c @@ -1,4 +1,4 @@ -/* +/* * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel * PURPOSE: Functions for creation and destruction of DCs @@ -26,188 +26,39 @@ typedef struct _GDI_DC_ATTR_ENTRY } GDI_DC_ATTR_ENTRY, *PGDI_DC_ATTR_ENTRY; -PDC_ATTR -FASTCALL -AllocateDcAttr(VOID) -{ - PTHREADINFO pti; - PPROCESSINFO ppi; - PDC_ATTR pDc_Attr; - PGDI_DC_ATTR_FREELIST pGdiDcAttrFreeList; - PGDI_DC_ATTR_ENTRY pGdiDcAttrEntry; - int i; - - pti = PsGetCurrentThreadWin32Thread(); - if (pti->pgdiDcattr) - { - pDc_Attr = pti->pgdiDcattr; // Get the free one. - pti->pgdiDcattr = NULL; - return pDc_Attr; - } - - ppi = PsGetCurrentProcessWin32Process(); - - if (!ppi->pDCAttrList) // If set point is null, allocate new group. - { - pGdiDcAttrEntry = EngAllocUserMem(sizeof(GDI_DC_ATTR_ENTRY), 0); - - if (!pGdiDcAttrEntry) - { - DPRINT1("DcAttr Failed User Allocation!\n"); - return NULL; - } - - DPRINT("AllocDcAttr User 0x%x\n",pGdiDcAttrEntry); - - pGdiDcAttrFreeList = ExAllocatePoolWithTag( PagedPool, - sizeof(GDI_DC_ATTR_FREELIST), - GDITAG_DC_FREELIST); - if ( !pGdiDcAttrFreeList ) - { - EngFreeUserMem(pGdiDcAttrEntry); - return NULL; - } - - RtlZeroMemory(pGdiDcAttrFreeList, sizeof(GDI_DC_ATTR_FREELIST)); - - DPRINT("AllocDcAttr Ex 0x%x\n",pGdiDcAttrFreeList); - - InsertHeadList( &ppi->GDIDcAttrFreeList, &pGdiDcAttrFreeList->Entry); - - pGdiDcAttrFreeList->nEntries = GDIDCATTRFREE; - // Start at the bottom up and set end of free list point. - ppi->pDCAttrList = &pGdiDcAttrEntry->Attr[GDIDCATTRFREE-1]; - // Build the free attr list. - for ( i = 0; i < GDIDCATTRFREE; i++) - { - pGdiDcAttrFreeList->AttrList[i] = &pGdiDcAttrEntry->Attr[i]; - } - } - - pDc_Attr = ppi->pDCAttrList; - pGdiDcAttrFreeList = (PGDI_DC_ATTR_FREELIST)ppi->GDIDcAttrFreeList.Flink; - - // Free the list when it is full! - if ( pGdiDcAttrFreeList->nEntries-- == 1) - { // No more free entries, so yank the list. - RemoveEntryList( &pGdiDcAttrFreeList->Entry ); - - ExFreePoolWithTag( pGdiDcAttrFreeList, GDITAG_DC_FREELIST ); - - if ( IsListEmpty( &ppi->GDIDcAttrFreeList ) ) - { - ppi->pDCAttrList = NULL; - return pDc_Attr; - } - - pGdiDcAttrFreeList = (PGDI_DC_ATTR_FREELIST)ppi->GDIDcAttrFreeList.Flink; - } - - ppi->pDCAttrList = pGdiDcAttrFreeList->AttrList[pGdiDcAttrFreeList->nEntries-1]; - - return pDc_Attr; -} - -VOID -FASTCALL -FreeDcAttr(PDC_ATTR pDc_Attr) -{ - PTHREADINFO pti; - PPROCESSINFO ppi; - PGDI_DC_ATTR_FREELIST pGdiDcAttrFreeList; - - pti = PsGetCurrentThreadWin32Thread(); - - if (!pti) return; - - if (!pti->pgdiDcattr) - { // If it is null, just cache it for the next time. - pti->pgdiDcattr = pDc_Attr; - return; - } - - ppi = PsGetCurrentProcessWin32Process(); - - pGdiDcAttrFreeList = (PGDI_DC_ATTR_FREELIST)ppi->GDIDcAttrFreeList.Flink; - - // We add to the list of free entries, so this will grows! - if ( IsListEmpty(&ppi->GDIDcAttrFreeList) || - pGdiDcAttrFreeList->nEntries == GDIDCATTRFREE ) - { - pGdiDcAttrFreeList = ExAllocatePoolWithTag( PagedPool, - sizeof(GDI_DC_ATTR_FREELIST), - GDITAG_DC_FREELIST); - if ( !pGdiDcAttrFreeList ) - { - return; - } - InsertHeadList( &ppi->GDIDcAttrFreeList, &pGdiDcAttrFreeList->Entry); - pGdiDcAttrFreeList->nEntries = 0; - } - // Up count, save the entry and set end of free list point. - ++pGdiDcAttrFreeList->nEntries; // Top Down... - pGdiDcAttrFreeList->AttrList[pGdiDcAttrFreeList->nEntries-1] = pDc_Attr; - ppi->pDCAttrList = pDc_Attr; - - return; -} - BOOL -FASTCALL -DC_AllocDcAttr(PDC pdc) +NTAPI +DC_bAllocDcAttr(PDC pdc) { - DC_AllocateDcAttr(pdc->BaseObject.hHmgr); + PPROCESSINFO ppi; + PDC_ATTR pdcattr; + + ppi = PsGetCurrentProcessWin32Process(); + ASSERT(ppi); + + pdcattr = GdiPoolAllocate(ppi->pPoolDcAttr); + if (!pdcattr) + { + DPRINT1("Could not allocate DC attr\n"); + return FALSE; + } + + /* Copy the content from the kernel mode dc attr */ + pdc->pdcattr = pdcattr; *pdc->pdcattr = pdc->dcattr; + + /* Set the object attribute in the handle table */ + GDIOBJ_vSetObjectAttr(&pdc->BaseObject, pdcattr); + + DPRINT("DC_AllocDcAttr: pdc=%p, pdc->pdcattr=%p\n", pdc, pdc->pdcattr); return TRUE; } -// CHECK against current head -VOID -FASTCALL -DC_AllocateDcAttr(HDC hDC) -{ - PVOID NewMem = NULL; - PDC pDC; - HANDLE Pid = NtCurrentProcess(); - ULONG MemSize = sizeof(DC_ATTR); //PAGE_SIZE it will allocate that size - - NTSTATUS Status = ZwAllocateVirtualMemory(Pid, - &NewMem, - 0, - &MemSize, - MEM_COMMIT|MEM_RESERVE, - PAGE_READWRITE); - { - INT Index = GDI_HANDLE_GET_INDEX((HGDIOBJ)hDC); - PGDI_TABLE_ENTRY Entry = &GdiHandleTable->Entries[Index]; - // FIXME: dc could have been deleted!!! use GDIOBJ_InsertUserData - if (NT_SUCCESS(Status)) - { - RtlZeroMemory(NewMem, MemSize); - Entry->UserData = NewMem; - DPRINT("DC_ATTR allocated! 0x%x\n",NewMem); - } - else - { - DPRINT("DC_ATTR not allocated!\n"); - } - } - pDC = DC_LockDc(hDC); - ASSERT(pDC->pdcattr == &pDC->dcattr); - if(NewMem) - { - pDC->pdcattr = NewMem; // Store pointer - } - DC_UnlockDc(pDC); -} - VOID NTAPI DC_vFreeDcAttr(PDC pdc) { - HANDLE Pid = NtCurrentProcess(); - INT Index; - PGDI_TABLE_ENTRY pent; + PPROCESSINFO ppi; if (pdc->pdcattr == &pdc->dcattr) { @@ -215,69 +66,13 @@ DC_vFreeDcAttr(PDC pdc) return; } + /* Reset the object attribute in the handle table */ + GDIOBJ_vSetObjectAttr(&pdc->BaseObject, NULL); + + ppi = PsGetCurrentProcessWin32Process(); + ASSERT(ppi); + GdiPoolFree(ppi->pPoolDcAttr, pdc->pdcattr); + + /* Reset to kmode dcattr */ pdc->pdcattr = &pdc->dcattr; - - Index = GDI_HANDLE_GET_INDEX(pdc->BaseObject.hHmgr); - pent = &GdiHandleTable->Entries[Index]; - if(pent->UserData) - { - ULONG MemSize = sizeof(DC_ATTR); - NTSTATUS Status = ZwFreeVirtualMemory(Pid, - &pent->UserData, - &MemSize, - MEM_RELEASE); - if (!NT_SUCCESS(Status)) - { - DPRINT1("DC_FreeDC failed to free DC_ATTR 0x%p\n", pent->UserData); - ASSERT(FALSE); - } - pent->UserData = NULL; - } } - - -static -VOID -CopytoUserDcAttr(PDC dc, PDC_ATTR pdcattr) -{ - dc->dcattr.mxWorldToDevice = dc->dclevel.mxWorldToDevice; - dc->dcattr.mxDeviceToWorld = dc->dclevel.mxDeviceToWorld; - dc->dcattr.mxWorldToPage = dc->dclevel.mxWorldToPage; - - _SEH2_TRY - { - ProbeForWrite(pdcattr, sizeof(DC_ATTR), 1); - RtlCopyMemory(pdcattr, &dc->dcattr, sizeof(DC_ATTR)); - } - _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) - { - ASSERT(FALSE); - } - _SEH2_END; -} - -// FIXME: wtf? 2 functions, where one has a typo in the name???? -BOOL -FASTCALL -DCU_SyncDcAttrtoUser(PDC dc) -{ - PDC_ATTR pdcattr = dc->pdcattr; - - if (pdcattr == &dc->dcattr) return TRUE; // No need to copy self. - ASSERT(pdcattr); - CopytoUserDcAttr( dc, pdcattr); - return TRUE; -} -// LOL! DCU_ Sync hDc Attr to User,,, need it speeled out for you? -BOOL -FASTCALL -DCU_SynchDcAttrtoUser(HDC hDC) -{ - BOOL Ret; - PDC pDC = DC_LockDc ( hDC ); - if (!pDC) return FALSE; - Ret = DCU_SyncDcAttrtoUser(pDC); - DC_UnlockDc( pDC ); - return Ret; -} - diff --git a/reactos/subsystems/win32/win32k/objects/dclife.c b/reactos/subsystems/win32/win32k/objects/dclife.c index d0c86c88c3a..83cd2451340 100644 --- a/reactos/subsystems/win32/win32k/objects/dclife.c +++ b/reactos/subsystems/win32/win32k/objects/dclife.c @@ -80,7 +80,22 @@ NTAPI DC_AllocDcWithHandle() { PDC pdc; - pdc = (PDC)GDIOBJ_AllocObjWithHandle(GDILoObjType_LO_DC_TYPE); + + pdc = (PDC)GDIOBJ_AllocateObject(GDIObjType_DC_TYPE, + sizeof(DC), + BASEFLAG_LOOKASIDE); + if (!pdc) + { + DPRINT1("Could not allocate a DC.\n"); + return NULL; + } + + if (!GDIOBJ_hInsertObject(&pdc->BaseObject, GDI_OBJ_HMGR_POWNED)) + { + DPRINT1("Could not insert DC into handle table.\n"); + GDIOBJ_vFreeObject(&pdc->BaseObject); + return NULL; + } pdc->pdcattr = &pdc->dcattr; @@ -232,7 +247,6 @@ DC_vInitDc( /* Allocate a Vis region */ pdc->prgnVis = IntSysCreateRectpRgn(0, 0, pdc->dclevel.sizl.cx, pdc->dclevel.sizl.cy); ASSERT(pdc->prgnVis); - GDIOBJ_CopyOwnership(pdc->BaseObject.hHmgr, pdc->prgnVis->BaseObject.hHmgr); /* Setup palette */ pdc->dclevel.hpal = StockObjects[DEFAULT_PALETTE]; @@ -357,9 +371,13 @@ DC_Cleanup(PVOID ObjectBody) if (pdc->rosdc.hClipRgn) GreDeleteObject(pdc->rosdc.hClipRgn); if (pdc->prgnVis) - REGION_FreeRgnByHandle(pdc->prgnVis->BaseObject.hHmgr); + { + REGION_Delete(pdc->prgnVis); + } if (pdc->rosdc.hGCClipRgn) + { GreDeleteObject(pdc->rosdc.hGCClipRgn); + } if (NULL != pdc->rosdc.CombinedClip) IntEngDeleteClipRegion(pdc->rosdc.CombinedClip); @@ -373,72 +391,64 @@ DC_Cleanup(PVOID ObjectBody) return TRUE; } -BOOL -FASTCALL -DC_SetOwnership(HDC hDC, PEPROCESS Owner) +VOID +NTAPI +DC_vSetOwner(PDC pdc, ULONG ulOwner) { - INT Index; - PGDI_TABLE_ENTRY Entry; - PDC pDC; - BOOL ret = FALSE; - if (!GDIOBJ_SetOwnership(hDC, Owner)) + if (pdc->rosdc.hClipRgn) { - DPRINT1("GDIOBJ_SetOwnership failed\n"); - return FALSE; + IntGdiSetRegionOwner(pdc->rosdc.hClipRgn, ulOwner); } - pDC = DC_LockDc(hDC); - if (!pDC) + if (pdc->rosdc.hGCClipRgn) { - DPRINT1("Could not lock DC\n"); - return FALSE; + IntGdiSetRegionOwner(pdc->rosdc.hGCClipRgn, ulOwner); } - /* - System Regions: - These regions do not use attribute sections and when allocated, use - gdiobj level functions. - */ - if (pDC->rosdc.hClipRgn) - { // FIXME! HAX!!! - Index = GDI_HANDLE_GET_INDEX(pDC->rosdc.hClipRgn); - Entry = &GdiHandleTable->Entries[Index]; - if (Entry->UserData) FreeObjectAttr(Entry->UserData); - Entry->UserData = NULL; - // - if (!GDIOBJ_SetOwnership(pDC->rosdc.hClipRgn, Owner)) goto leave; - } - if (pDC->prgnVis) - { // FIXME! HAX!!! - Index = GDI_HANDLE_GET_INDEX(pDC->prgnVis->BaseObject.hHmgr); - Entry = &GdiHandleTable->Entries[Index]; - if (Entry->UserData) FreeObjectAttr(Entry->UserData); - Entry->UserData = NULL; - // - if (!GDIOBJ_SetOwnership(pDC->prgnVis->BaseObject.hHmgr, Owner)) goto leave; - } - if (pDC->rosdc.hGCClipRgn) - { // FIXME! HAX!!! - Index = GDI_HANDLE_GET_INDEX(pDC->rosdc.hGCClipRgn); - Entry = &GdiHandleTable->Entries[Index]; - if (Entry->UserData) FreeObjectAttr(Entry->UserData); - Entry->UserData = NULL; - // - if (!GDIOBJ_SetOwnership(pDC->rosdc.hGCClipRgn, Owner)) goto leave; - } - if (pDC->dclevel.hPath) + if (pdc->dclevel.hPath) { - if (!GDIOBJ_SetOwnership(pDC->dclevel.hPath, Owner)) goto leave; + GreSetObjectOwner(pdc->dclevel.hPath, ulOwner); } - ret = TRUE; -leave: - DC_UnlockDc(pDC); + IntGdiSetBrushOwner(pdc->dclevel.pbrFill, ulOwner); + IntGdiSetBrushOwner(pdc->dclevel.pbrLine, ulOwner); - return ret; + /* Allocate or free DC attribute */ + if (ulOwner == GDI_OBJ_HMGR_PUBLIC || ulOwner == GDI_OBJ_HMGR_NONE) + { + if (pdc->pdcattr != &pdc->dcattr) + DC_vFreeDcAttr(pdc); + } + else if (ulOwner == GDI_OBJ_HMGR_POWNED) + { + if (pdc->pdcattr == &pdc->dcattr) + DC_bAllocDcAttr(pdc); + } + + /* Set the DC's ownership */ + GDIOBJ_vSetObjectOwner(&pdc->BaseObject, ulOwner); } +BOOL +NTAPI +GreSetDCOwner(HDC hdc, ULONG ulOwner) +{ + PDC pdc; + + pdc = DC_LockDc(hdc); + if (!pdc) + { + DPRINT1("GreSetDCOwner: Could not lock DC\n"); + return FALSE; + } + + /* Call the internal DC function */ + DC_vSetOwner(pdc, ulOwner); + + DC_UnlockDc(pdc); + return TRUE; +} int FASTCALL CLIPPING_UpdateGCRegion(DC* Dc); @@ -609,7 +619,7 @@ GreOpenDCW( /* FIXME: HACK! */ DC_InitHack(pdc); - DC_AllocDcAttr(pdc); + DC_bAllocDcAttr(pdc); DC_UnlockDc(pdc); @@ -689,17 +699,17 @@ NtGdiOpenDCW( /* Call the internal function */ hdc = GreOpenDCW(pustrDevice ? &ustrDevice : NULL, pdmInit ? &dmInit : NULL, - NULL, // fixme pwszLogAddress + NULL, // FIXME: pwszLogAddress iType, bDisplay, hspool, - NULL, //FIXME: pDriverInfo2 + NULL, // FIXME: pDriverInfo2 pUMdhpdev ? &dhpdev : NULL); /* If we got a HDC and a UM dhpdev is requested,... */ if (hdc && pUMdhpdev) { - /* Copy dhpdev to caller (FIXME: use dhpdev?? */ + /* Copy dhpdev to caller (FIXME: use dhpdev?) */ _SEH2_TRY { /* Pointer was already probed */ @@ -772,7 +782,7 @@ NtGdiCreateCompatibleDC(HDC hdc) DC_InitHack(pdcNew); /* Allocate a dc attribute */ - DC_AllocDcAttr(pdcNew); + DC_bAllocDcAttr(pdcNew); // HACK! DC_vSelectSurface(pdcNew, psurfDefaultBitmap); @@ -825,11 +835,9 @@ IntGdiDeleteDC(HDC hDC, BOOL Force) DC_UnlockDc(DCToDelete); - if (!IsObjectDead(hDC)) + if (GreIsHandleValid(hDC)) { - DC_vFreeDcAttr(DCToDelete); // Plug a leak see bug 6119! - - if (!GDIOBJ_FreeObjByHandle(hDC, GDI_OBJECT_TYPE_DC)) + if (!GreDeleteObject(hDC)) { DPRINT1("DC_FreeDC failed\n"); } @@ -844,25 +852,24 @@ IntGdiDeleteDC(HDC hDC, BOOL Force) BOOL APIENTRY -NtGdiDeleteObjectApp(HANDLE DCHandle) +NtGdiDeleteObjectApp(HANDLE hobj) { /* Complete all pending operations */ - NtGdiFlushUserBatch(); + NtGdiFlushUserBatch(); // FIXME: we shouldn't need this - if (GDI_HANDLE_IS_STOCKOBJ(DCHandle)) return TRUE; + if (GDI_HANDLE_IS_STOCKOBJ(hobj)) return TRUE; - if (GDI_HANDLE_GET_TYPE(DCHandle) != GDI_OBJECT_TYPE_DC) - return GreDeleteObject((HGDIOBJ) DCHandle); - - if (IsObjectDead((HGDIOBJ)DCHandle)) return TRUE; - - if (!GDIOBJ_OwnedByCurrentProcess(DCHandle)) + if (GreGetObjectOwner(hobj) != GDI_OBJ_HMGR_POWNED) { EngSetLastError(ERROR_INVALID_HANDLE); return FALSE; } - return IntGdiDeleteDC(DCHandle, FALSE); + if (GDI_HANDLE_GET_TYPE(hobj) != GDI_OBJECT_TYPE_DC) + return GreDeleteObject(hobj); + + // FIXME: everything should be callback based + return IntGdiDeleteDC(hobj, FALSE); } BOOL @@ -975,45 +982,3 @@ IntGdiCreateDisplayDC(HDEV hDev, ULONG DcType, BOOL EmptyDC) return hDC; } -BOOL -FASTCALL -IntGdiSetDCOwnerEx( HDC hDC, DWORD OwnerMask, BOOL NoSetBrush) -{ - PDC pDC; - BOOL Ret = FALSE; - - if (!hDC || (GDI_HANDLE_GET_TYPE(hDC) != GDI_OBJECT_TYPE_DC)) return FALSE; - - if ((OwnerMask == GDI_OBJ_HMGR_PUBLIC) || OwnerMask == GDI_OBJ_HMGR_NONE) - { - pDC = DC_LockDc ( hDC ); - MmCopyFromCaller(&pDC->dcattr, pDC->pdcattr, sizeof(DC_ATTR)); - DC_vFreeDcAttr(pDC); - DC_UnlockDc( pDC ); - - if (!DC_SetOwnership( hDC, NULL )) // This hDC is inaccessible! - return Ret; - } - - if (OwnerMask == GDI_OBJ_HMGR_POWNED) - { - pDC = DC_LockDc ( hDC ); - ASSERT(pDC->pdcattr == &pDC->dcattr); - DC_UnlockDc( pDC ); - - if (!DC_SetOwnership( hDC, PsGetCurrentProcess() )) return Ret; - - DC_AllocateDcAttr( hDC ); // Allocate new dcattr - - DCU_SynchDcAttrtoUser( hDC ); // Copy data from dc to dcattr - } - - if ((OwnerMask != GDI_OBJ_HMGR_NONE) && !NoSetBrush) - { - pDC = DC_LockDc ( hDC ); - if (IntGdiSetBrushOwner((PBRUSH)pDC->dclevel.pbrFill, OwnerMask)) - IntGdiSetBrushOwner((PBRUSH)pDC->dclevel.pbrLine, OwnerMask); - DC_UnlockDc( pDC ); - } - return TRUE; -} diff --git a/reactos/subsystems/win32/win32k/objects/dcobjs.c b/reactos/subsystems/win32/win32k/objects/dcobjs.c index 6a7cf20661b..39826dc5154 100644 --- a/reactos/subsystems/win32/win32k/objects/dcobjs.c +++ b/reactos/subsystems/win32/win32k/objects/dcobjs.c @@ -181,7 +181,8 @@ GdiSelectPalette( if(pdc->dctype == DCTYPE_MEMORY) { - IntGdiRealizePalette(pdc); + // This didn't work anyway + //IntGdiRealizePalette(hDC); } PALETTE_ShareUnlockPalette(ppal); @@ -364,7 +365,7 @@ NtGdiSelectBitmap( if (hVisRgn) { GdiSelectVisRgn(hdc, hVisRgn); - REGION_FreeRgnByHandle(hVisRgn); + GreDeleteObject(hVisRgn); } /* Return the old bitmap handle */ @@ -543,7 +544,12 @@ NtGdiGetRandomRgn( else if (pdc->dclevel.prgnMeta) hrgnSrc = pdc->dclevel.prgnMeta->BaseObject.hHmgr; break; case SYSRGN: - if (pdc->prgnVis) hrgnSrc = pdc->prgnVis->BaseObject.hHmgr; + if (pdc->prgnVis) + { + PREGION prgnDest = REGION_LockRgn(hrgnDest); + ret = IntGdiCombineRgn(prgnDest, pdc->prgnVis, 0, RGN_COPY) == ERROR ? -1 : 1; + REGION_UnlockRgn(prgnDest); + } break; default: hrgnSrc = NULL; diff --git a/reactos/subsystems/win32/win32k/objects/dcstate.c b/reactos/subsystems/win32/win32k/objects/dcstate.c index 9491db2ce6b..5af20526075 100644 --- a/reactos/subsystems/win32/win32k/objects/dcstate.c +++ b/reactos/subsystems/win32/win32k/objects/dcstate.c @@ -101,16 +101,12 @@ DC_vRestoreDC( IN PDC pdc, INT iSaveLevel) { - PEPROCESS pepCurrentProcess; HDC hdcSave; PDC pdcSave; ASSERT(iSaveLevel > 0); DPRINT("DC_vRestoreDC(%p, %ld)\n", pdc->BaseObject.hHmgr, iSaveLevel); - /* Get current process */ - pepCurrentProcess = PsGetCurrentProcess(); - /* Loop the save levels */ while (pdc->dclevel.lSaveDepth > iSaveLevel) { @@ -118,7 +114,7 @@ DC_vRestoreDC( DPRINT("RestoreDC = %p\n", hdcSave); /* Set us as the owner */ - if (!GDIOBJ_SetOwnership(hdcSave, pepCurrentProcess)) + if (!GreSetObjectOwner(hdcSave, GDI_OBJ_HMGR_POWNED)) { /* Could not get ownership. That's bad! */ DPRINT1("Could not get ownership of saved DC (%p) for hdc %p!\n", @@ -261,7 +257,7 @@ NtGdiSaveDC( /* Make it a kernel handle (FIXME: windows handles this different, see wiki)*/ - GDIOBJ_SetOwnership(hdcSave, NULL); + GreSetObjectOwner(hdcSave, GDI_OBJ_HMGR_PUBLIC); /* Copy the current state */ DC_vCopyState(pdc, pdcSave, TRUE); diff --git a/reactos/subsystems/win32/win32k/objects/dibobj.c b/reactos/subsystems/win32/win32k/objects/dibobj.c index 452e03d13fc..fdc8f92b416 100644 --- a/reactos/subsystems/win32/win32k/objects/dibobj.c +++ b/reactos/subsystems/win32/win32k/objects/dibobj.c @@ -164,7 +164,7 @@ IntSetDIBColorTable( return 0; } - PalGDI = PALETTE_ShareLockPalette(psurf->ppal->BaseObject.hHmgr); + PalGDI = psurf->ppal; for (Index = StartIndex; Index < StartIndex + Entries && Index < PalGDI->NumColors; @@ -174,7 +174,6 @@ IntSetDIBColorTable( PalGDI->IndexedColors[Index].peGreen = Colors[Index - StartIndex].rgbGreen; PalGDI->IndexedColors[Index].peBlue = Colors[Index - StartIndex].rgbBlue; } - PALETTE_ShareUnlockPalette(PalGDI); } else Entries = 0; @@ -559,7 +558,7 @@ Exit: if (pSourceSurf) EngUnlockSurface(pSourceSurf); if (hSourceBitmap) EngDeleteSurface((HSURF)hSourceBitmap); - if (hpalDIB) PALETTE_FreePaletteByHandle(hpalDIB); + if (hpalDIB) GreDeleteObject(hpalDIB); DC_UnlockDc(pDC); return ret; @@ -1639,7 +1638,7 @@ cleanup: if (res) { - SURFACE_FreeSurfaceByHandle(res); + GreDeleteObject(res); res = 0; } } diff --git a/reactos/subsystems/win32/win32k/objects/drawing.c b/reactos/subsystems/win32/win32k/objects/drawing.c index bac849ce9e9..794a6d0c0b5 100644 --- a/reactos/subsystems/win32/win32k/objects/drawing.c +++ b/reactos/subsystems/win32/win32k/objects/drawing.c @@ -1329,7 +1329,7 @@ IntFillArc( PDC dc, pdcattr = dc->pdcattr; - pbrush = BRUSH_LockBrush(pdcattr->hbrush); + pbrush = BRUSH_ShareLockBrush(pdcattr->hbrush); if (!pbrush) { DPRINT1("FillArc Fail\n"); @@ -1342,7 +1342,7 @@ IntFillArc( PDC dc, (dc->dclevel.flPath & DCPATH_CLOCKWISE) ? -Start : -End, pbrush, Chord); - BRUSH_UnlockBrush(pbrush); + BRUSH_ShareUnlockBrush(pbrush); return ret; } diff --git a/reactos/subsystems/win32/win32k/objects/fillshap.c b/reactos/subsystems/win32/win32k/objects/fillshap.c index 0fb1695c1b6..bdb98e277de 100644 --- a/reactos/subsystems/win32/win32k/objects/fillshap.c +++ b/reactos/subsystems/win32/win32k/objects/fillshap.c @@ -297,7 +297,7 @@ NtGdiEllipse( DPRINT("Ellipse 2: XLeft: %d, YLeft: %d, Width: %d, Height: %d\n", CenterX - RadiusX, CenterY + RadiusY, RadiusX*2, RadiusY*2); - pFillBrushObj = BRUSH_LockBrush(pdcattr->hbrush); + pFillBrushObj = BRUSH_ShareLockBrush(pdcattr->hbrush); if (NULL == pFillBrushObj) { DPRINT1("FillEllipse Fail\n"); @@ -317,7 +317,7 @@ NtGdiEllipse( RadiusX*2, // Width RadiusY*2, // Height &tmpFillBrushObj); - BRUSH_UnlockBrush(pFillBrushObj); + BRUSH_ShareUnlockBrush(pFillBrushObj); } if (ret) @@ -784,7 +784,7 @@ IntRoundRect( RectBounds.right += dc->ptlDCOrig.x; RectBounds.bottom += dc->ptlDCOrig.y; - pbrushFill = BRUSH_LockBrush(pdcattr->hbrush); + pbrushFill = BRUSH_ShareLockBrush(pdcattr->hbrush); if (NULL == pbrushFill) { DPRINT1("FillRound Fail\n"); @@ -804,7 +804,7 @@ IntRoundRect( xCurveDiameter, yCurveDiameter, &brushTemp); - BRUSH_UnlockBrush(pbrushFill); + BRUSH_ShareUnlockBrush(pbrushFill); } if (ret) diff --git a/reactos/subsystems/win32/win32k/objects/gdibatch.c b/reactos/subsystems/win32/win32k/objects/gdibatch.c index 7ddb1fa24e1..dc604103e30 100644 --- a/reactos/subsystems/win32/win32k/objects/gdibatch.c +++ b/reactos/subsystems/win32/win32k/objects/gdibatch.c @@ -20,7 +20,7 @@ FASTCALL DoDeviceSync( SURFOBJ *Surface, PRECTL Rect, FLONG fl) { PPDEVOBJ Device = (PDEVOBJ*)Surface->hdev; -// No punting and "Handle to a surface, provided that the surface is device-managed. +// No punting and "Handle to a surface, provided that the surface is device-managed. // Otherwise, dhsurf is zero". if (!(Device->flFlags & PDEV_DRIVER_PUNTED_CALL) && (Surface->dhsurf)) { @@ -42,9 +42,9 @@ VOID FASTCALL SynchonizeDriver(FLONG Flags) { - SURFOBJ *SurfObj; + SURFOBJ *SurfObj; PPDEVOBJ Device; - + if (Flags & GCAPS2_SYNCFLUSH) Flags = DSS_FLUSH_EVENT; if (Flags & GCAPS2_SYNCTIMER) @@ -149,7 +149,7 @@ GdiFlushUserBatch(PDC dc, PGDIBATCHHDR pHdr) break; } - return Size; + return Size; } /* @@ -190,7 +190,7 @@ NtGdiFlushUserBatch(VOID) PCHAR pHdr = (PCHAR)&pTeb->GdiTebBatch.Buffer[0]; PDC pDC = NULL; - if (hDC && !IsObjectDead(hDC)) + if (GDI_HANDLE_GET_TYPE(hDC) == GDILoObjType_LO_DC_TYPE && GreIsHandleValid(hDC)) { pDC = DC_LockDc(hDC); } diff --git a/reactos/subsystems/win32/win32k/objects/gdidbg.c b/reactos/subsystems/win32/win32k/objects/gdidbg.c index bf46e2b5111..ca48ec72f22 100644 --- a/reactos/subsystems/win32/win32k/objects/gdidbg.c +++ b/reactos/subsystems/win32/win32k/objects/gdidbg.c @@ -12,23 +12,14 @@ #define NDEBUG #include +extern ULONG gulFirstFree; +extern ULONG gulFirstUnused; ULONG gulDebugChannels = 0; +ULONG gulLogUnique = 0; #ifdef GDI_DEBUG - -ULONG_PTR GDIHandleAllocator[GDI_HANDLE_COUNT][GDI_STACK_LEVELS+1]; -ULONG_PTR GDIHandleLocker[GDI_HANDLE_COUNT][GDI_STACK_LEVELS+1]; -ULONG_PTR GDIHandleShareLocker[GDI_HANDLE_COUNT][GDI_STACK_LEVELS+1]; -ULONG_PTR GDIHandleDeleter[GDI_HANDLE_COUNT][GDI_STACK_LEVELS+1]; -struct DbgOpenGDIHandle -{ - ULONG idx; - int count; -}; -#define MAX_BACKTRACES 1024 -static struct DbgOpenGDIHandle AllocatorTable[MAX_BACKTRACES]; - +#if 0 static BOOL CompareBacktraces(ULONG idx1, ULONG idx2) @@ -50,7 +41,9 @@ CompareBacktraces(ULONG idx1, ULONG idx2) return TRUE; } -void IntDumpHandleTable(PGDI_HANDLE_TABLE HandleTable) +VOID +NTAPI +DbgDumpGdiHandleTable(void) { static int leak_reported = 0; int i, j, idx, nTraces = 0; @@ -139,9 +132,11 @@ void IntDumpHandleTable(PGDI_HANDLE_TABLE HandleTable) ASSERT(FALSE); } +#endif ULONG -CaptureStackBackTace(PVOID* pFrames, ULONG nFramesToCapture) +NTAPI +DbgCaptureStackBackTace(PVOID* pFrames, ULONG nFramesToCapture) { ULONG nFrameCount; @@ -160,7 +155,8 @@ CaptureStackBackTace(PVOID* pFrames, ULONG nFramesToCapture) } BOOL -GdiDbgHTIntegrityCheck() +NTAPI +DbgGdiHTIntegrityCheck() { ULONG i, nDeleted = 0, nFree = 0, nUsed = 0; PGDI_TABLE_ENTRY pEntry; @@ -171,7 +167,7 @@ GdiDbgHTIntegrityCheck() /* FIXME: check reserved entries */ /* Now go through the deleted objects */ - i = GdiHandleTable->FirstFree & 0xffff; + i = gulFirstFree & 0xffff; while (i) { pEntry = &GdiHandleTable->Entries[i]; @@ -208,7 +204,7 @@ GdiDbgHTIntegrityCheck() i = (ULONG_PTR)pEntry->KernelData & 0xffff; }; - for (i = GdiHandleTable->FirstUnused; + for (i = gulFirstUnused; i < GDI_HANDLE_COUNT; i++) { @@ -280,40 +276,135 @@ GdiDbgHTIntegrityCheck() return r; } -ULONG -FASTCALL -GDIOBJ_IncrementShareCount(POBJ Object) -{ - INT cLocks = InterlockedIncrement((PLONG)&Object->ulShareCount); - GDIDBG_CAPTURESHARELOCKER(Object->hHmgr); - ASSERT(cLocks >= 1); - return cLocks; -} - #endif /* GDI_DEBUG */ -void -GdiDbgDumpLockedHandles() +VOID +NTAPI +DbgDumpLockedGdiHandles() { +#if 0 ULONG i; for (i = RESERVE_ENTRIES_COUNT; i < GDI_HANDLE_COUNT; i++) { - PGDI_TABLE_ENTRY pEntry = &GdiHandleTable->Entries[i]; + PENTRY pentry = &gpentHmgr[i]; - if (pEntry->Type & GDI_ENTRY_BASETYPE_MASK) + if (pentry->Objt) { - BASEOBJECT *pObject = pEntry->KernelData; - if (pObject->cExclusiveLock > 0) + POBJ pobj = pentry->einfo.pobj; + if (pobj->cExclusiveLock > 0) { DPRINT1("Locked object: %lx, type = %lx. allocated from:\n", - i, pEntry->Type); - GDIDBG_TRACEALLOCATOR(i); - DPRINT1("Locked from:\n"); - GDIDBG_TRACELOCKER(i); + i, pentry->Objt); + DBG_DUMP_EVENT_LIST(&pobj->slhLog); } } } +#endif +} + +VOID +NTAPI +DbgLogEvent(PSLIST_HEADER pslh, EVENT_TYPE nEventType, LPARAM lParam) +{ + PLOGENTRY pLogEntry; + + /* Log a maximum of 100 events */ + if (QueryDepthSList(pslh) >= 1000) return; + + /* Allocate a logentry */ + pLogEntry = EngAllocMem(0, sizeof(LOGENTRY), 'golG'); + if (!pLogEntry) return; + + /* Set type */ + pLogEntry->nEventType = nEventType; + pLogEntry->ulUnique = InterlockedIncrement((LONG*)&gulLogUnique); + pLogEntry->dwProcessId = HandleToUlong(PsGetCurrentProcessId()); + pLogEntry->dwThreadId = HandleToUlong(PsGetCurrentThreadId()); + pLogEntry->lParam = lParam; + + /* Capture a backtrace */ + DbgCaptureStackBackTace(pLogEntry->apvBackTrace, 20); + + switch (nEventType) + { + case EVENT_ALLOCATE: + case EVENT_CREATE_HANDLE: + case EVENT_REFERENCE: + case EVENT_DEREFERENCE: + case EVENT_LOCK: + case EVENT_UNLOCK: + case EVENT_DELETE: + case EVENT_FREE: + case EVENT_SET_OWNER: + default: + break; + } + + /* Push it on the list */ + InterlockedPushEntrySList(pslh, &pLogEntry->sleLink); +} + +#define REL_ADDR(va) ((ULONG_PTR)va - (ULONG_PTR)&__ImageBase) + +VOID +DbgPrintEvent(PLOGENTRY pLogEntry) +{ + PSTR pstr; + + switch (pLogEntry->nEventType) + { + case EVENT_ALLOCATE: pstr = "Allocate"; break; + case EVENT_CREATE_HANDLE: pstr = "CreatHdl"; break; + case EVENT_REFERENCE: pstr = "Ref"; break; + case EVENT_DEREFERENCE: pstr = "Deref"; break; + case EVENT_LOCK: pstr = "Lock"; break; + case EVENT_UNLOCK: pstr = "Unlock"; break; + case EVENT_DELETE: pstr = "Delete"; break; + case EVENT_FREE: pstr = "Free"; break; + case EVENT_SET_OWNER: pstr = "SetOwner"; break; + default: pstr = "Unknown"; break; + } + + DbgPrint("[%ld] %03x:%03x %.8s val=%p <%lx,%lx,%lx,%lx>\n", + pLogEntry->ulUnique, + pLogEntry->dwProcessId, + pLogEntry->dwThreadId, + pstr, + pLogEntry->lParam, + REL_ADDR(pLogEntry->apvBackTrace[2]), + REL_ADDR(pLogEntry->apvBackTrace[3]), + REL_ADDR(pLogEntry->apvBackTrace[4]), + REL_ADDR(pLogEntry->apvBackTrace[5])); +} + +VOID +NTAPI +DbgDumpEventList(PSLIST_HEADER pslh) +{ + PSLIST_ENTRY psle; + PLOGENTRY pLogEntry; + + while ((psle = InterlockedPopEntrySList(pslh))) + { + pLogEntry = CONTAINING_RECORD(psle, LOGENTRY, sleLink); + DbgPrintEvent(pLogEntry); + } + +} + +VOID +NTAPI +DbgCleanupEventList(PSLIST_HEADER pslh) +{ + PSLIST_ENTRY psle; + PLOGENTRY pLogEntry; + + while ((psle = InterlockedPopEntrySList(pslh))) + { + pLogEntry = CONTAINING_RECORD(psle, LOGENTRY, sleLink); + EngFreeMem(pLogEntry); + } } void @@ -323,9 +414,9 @@ DbgPreServiceHook(ULONG ulSyscallId, PULONG_PTR pulArguments) PTHREADINFO pti = (PTHREADINFO)PsGetCurrentThreadWin32Thread(); if (pti && pti->cExclusiveLocks != 0) { - DbgPrint("FATAL: Win32DbgPreServiceHook(%ld): There are %ld exclusive locks!\n", + DbgPrint("FATAL: Win32DbgPreServiceHook(0x%lx): There are %ld exclusive locks!\n", ulSyscallId, pti->cExclusiveLocks); - GdiDbgDumpLockedHandles(); + DbgDumpLockedGdiHandles(); ASSERT(FALSE); } @@ -338,9 +429,9 @@ DbgPostServiceHook(ULONG ulSyscallId, ULONG_PTR ulResult) PTHREADINFO pti = (PTHREADINFO)PsGetCurrentThreadWin32Thread(); if (pti && pti->cExclusiveLocks != 0) { - DbgPrint("FATAL: Win32DbgPostServiceHook(%ld): There are %ld exclusive locks!\n", + DbgPrint("FATAL: Win32DbgPostServiceHook(0x%lx): There are %ld exclusive locks!\n", ulSyscallId, pti->cExclusiveLocks); - GdiDbgDumpLockedHandles(); + DbgDumpLockedGdiHandles(); ASSERT(FALSE); } return ulResult; diff --git a/reactos/subsystems/win32/win32k/objects/gdiobj.c b/reactos/subsystems/win32/win32k/objects/gdiobj.c index a6d470a5aa2..1050de6b6e7 100644 --- a/reactos/subsystems/win32/win32k/objects/gdiobj.c +++ b/reactos/subsystems/win32/win32k/objects/gdiobj.c @@ -3,278 +3,259 @@ * LICENSE: GPL - See COPYING in the top level directory * FILE: subsystems/win32/win32k/objects/gdiobj.c * PURPOSE: General GDI object manipulation routines - * PROGRAMMERS: ... + * PROGRAMMERS: Timo Kreuzer */ -/** INCLUDES ******************************************************************/ +/* + * If you want to understand this code, you need to start thinking in portals. + * - gpaulRefCount is a global pointer to an allocated array of ULONG values, + * one for each handle. Bits 0 - 22 contain a reference count for the handle. + * It gets increased for each handle lock / reference. Bit 23 contains a valid + * bit. If this bit is 0, the handle got deleted and will be pushed to the free + * list, once all references are gone. Bits 24 - 31 contain the reuse value of + * the handle, which allows to check if the entry was changed before atomically + * exchanging the reference count. + * - Objects can exist with or without a handle + * - Objects with a handle can be locked either exclusively or shared. + * Both locks increase the handle reference count in gpaulRefCount. + * Exclusive locks also increase the BASEOBJECT's cExclusiveLock field + * and the first lock (can be acquired recursively) acquires a pushlock + * that is also stored in the BASEOBJECT. + * - Objects without a handle cannot have exclusive locks. Their reference + * count is tracked in the BASEOBJECT's ulShareCount field. + * - An object that is inserted in the handle table automatically has an + * exclusive lock. For objects that are "shared objects" (BRUSH, PALETTE, ...) + * this is the only way it can ever be exclusively locked. It prevents the + * object from being locked by another thread. A shared lock will simply fail, + * while an exclusive lock will succeed after the object was unlocked. + * + */ + +/* INCLUDES ******************************************************************/ #include #define NDEBUG #include -#define BASE_OBJTYPE_COUNT 32 +// move to gdidbg.h +#if DBG +#define DBG_INCREASE_LOCK_COUNT(pti, hobj) \ + if (pti) ((PTHREADINFO)pti)->acExclusiveLockCount[((ULONG_PTR)hobj >> 16) & 0x1f]++; +#define DBG_DECREASE_LOCK_COUNT(pti, hobj) \ + if (pti) ((PTHREADINFO)pti)->acExclusiveLockCount[((ULONG_PTR)hobj >> 16) & 0x1f]--; +#define ASSERT_SHARED_OBJECT_TYPE(objt) \ + ASSERT((objt) == GDIObjType_SURF_TYPE || \ + (objt) == GDIObjType_PAL_TYPE || \ + (objt) == GDIObjType_LFONT_TYPE || \ + (objt) == GDIObjType_PATH_TYPE || \ + (objt) == GDIObjType_BRUSH_TYPE) +#define ASSERT_EXCLUSIVE_OBJECT_TYPE(objt) \ + ASSERT((objt) == GDIObjType_DC_TYPE || \ + (objt) == GDIObjType_RGN_TYPE || \ + (objt) == GDIObjType_LFONT_TYPE) +#else +#define DBG_INCREASE_LOCK_COUNT(ppi, hobj) +#define DBG_DECREASE_LOCK_COUNT(x, y) +#define ASSERT_SHARED_OBJECT_TYPE(objt) +#define ASSERT_EXCLUSIVE_OBJECT_TYPE(objt) +#endif -#define DelayExecution() \ - DPRINT("%s:%i: Delay\n", __FILE__, __LINE__); \ - KeDelayExecutionThread(KernelMode, FALSE, &ShortDelay) +#define MmMapViewInSessionSpace MmMapViewInSystemSpace -static -BOOL INTERNAL_CALL GDI_CleanupDummy(PVOID ObjectBody); +#ifdef _M_IX86 +#define InterlockedOr16 _InterlockedOr16 +#endif -/** GLOBALS *******************************************************************/ +#define GDIOBJ_POOL_TAG(type) ('00hG' + ((objt & 0x1f) << 24)) -typedef struct +enum { - BOOL bUseLookaside; - ULONG_PTR ulBodySize; - ULONG Tag; - GDICLEANUPPROC CleanupProc; -} OBJ_TYPE_INFO, *POBJ_TYPE_INFO; - -static const -OBJ_TYPE_INFO ObjTypeInfo[BASE_OBJTYPE_COUNT] = -{ - {0, 0, 0, NULL}, /* 00 reserved entry */ - {1, sizeof(DC), TAG_DC, DC_Cleanup}, /* 01 DC */ - {1, 0, 0, NULL}, /* 02 UNUSED1 */ - {1, 0, 0, NULL}, /* 03 UNUSED2 */ - {1, sizeof(ROSRGNDATA), TAG_REGION, REGION_Cleanup}, /* 04 RGN */ - {1, sizeof(SURFACE), TAG_SURFACE, SURFACE_Cleanup}, /* 05 SURFACE */ - {1, sizeof(CLIENTOBJ), TAG_CLIENTOBJ, GDI_CleanupDummy}, /* 06 CLIENTOBJ: METADC,... */ - {1, sizeof(PATH), TAG_PATH, GDI_CleanupDummy}, /* 07 PATH */ - {1, sizeof(PALETTE), TAG_PALETTE, PALETTE_Cleanup}, /* 08 PAL */ - {1, sizeof(COLORSPACE), TAG_ICMLCS, GDI_CleanupDummy}, /* 09 ICMLCS, */ - {1, sizeof(TEXTOBJ), TAG_LFONT, GDI_CleanupDummy}, /* 0a LFONT */ - {0, 0, TAG_RFONT, NULL}, /* 0b RFONT, unused */ - {0, 0, TAG_PFE, NULL}, /* 0c PFE, unused */ - {0, 0, TAG_PFT, NULL}, /* 0d PFT, unused */ - {0, sizeof(GDICLRXFORM), TAG_ICMCXF, GDI_CleanupDummy}, /* 0e ICMCXF, */ - {0, 0, TAG_SPRITE, NULL}, /* 0f SPRITE, unused */ - {1, sizeof(BRUSH), TAG_BRUSH, BRUSH_Cleanup}, /* 10 BRUSH, PEN, EXTPEN */ - {0, 0, TAG_UMPD, NULL}, /* 11 UMPD, unused */ - {0, 0, 0, NULL}, /* 12 UNUSED4 */ - {0, 0, TAG_SPACE, NULL}, /* 13 SPACE, unused */ - {0, 0, 0, NULL}, /* 14 UNUSED5 */ - {0, 0, TAG_META, NULL}, /* 15 META, unused */ - {0, 0, TAG_EFSTATE, NULL}, /* 16 EFSTATE, unused */ - {0, 0, TAG_BMFD, NULL}, /* 17 BMFD, unused */ - {0, 0, TAG_VTFD, NULL}, /* 18 VTFD, unused */ - {0, 0, TAG_TTFD, NULL}, /* 19 TTFD, unused */ - {0, 0, TAG_RC, NULL}, /* 1a RC, unused */ - {0, 0, TAG_TEMP, NULL}, /* 1b TEMP, unused */ - {0, sizeof(EDRIVEROBJ), TAG_DRVOBJ, DRIVEROBJ_Cleanup},/* 1c DRVOBJ */ - {0, 0, TAG_DCIOBJ, NULL}, /* 1d DCIOBJ, unused */ - {0, 0, TAG_SPOOL, NULL}, /* 1e SPOOL, unused */ - {0, 0, 0, NULL}, /* 1f reserved entry */ + REF_MASK_REUSE = 0xff000000, + REF_INC_REUSE = 0x01000000, + REF_MASK_VALID = 0x00800000, + REF_MASK_COUNT = 0x007fffff, + REF_MASK_INUSE = 0x00ffffff, }; -static LARGE_INTEGER ShortDelay; -PGDI_HANDLE_TABLE GdiHandleTable = NULL; -static PSECTION_OBJECT GdiTableSection = NULL; +/* GLOBALS *******************************************************************/ -/** INTERNAL FUNCTIONS ********************************************************/ +/* Per session handle table globals */ +static PVOID gpvGdiHdlTblSection = NULL; +static PENTRY gpentHmgr; +static PULONG gpaulRefCount; +ULONG gulFirstFree; +ULONG gulFirstUnused; +static PPAGED_LOOKASIDE_LIST gpaLookasideList; -// Audit Functions -int tDC = 0; -int tBRUSH = 0; -int tBITMAP = 0; -int tFONT = 0; -int tRGN = 0; +static BOOL INTERNAL_CALL GDIOBJ_Cleanup(PVOID ObjectBody); -VOID -AllocTypeDataDump(INT TypeInfo) +static const +GDICLEANUPPROC +apfnCleanup[] = { - switch( TypeInfo & GDI_HANDLE_TYPE_MASK ) - { - case GDILoObjType_LO_BRUSH_TYPE: - tBRUSH++; - break; - case GDILoObjType_LO_DC_TYPE: - tDC++; - break; - case GDILoObjType_LO_BITMAP_TYPE: - tBITMAP++; - break; - case GDILoObjType_LO_FONT_TYPE: - tFONT++; - break; - case GDILoObjType_LO_REGION_TYPE: - tRGN++; - break; - } -} + NULL, /* 00 GDIObjType_DEF_TYPE */ + DC_Cleanup, /* 01 GDIObjType_DC_TYPE */ + NULL, /* 02 GDIObjType_UNUSED1_TYPE */ + NULL, /* 03 GDIObjType_UNUSED2_TYPE */ + REGION_Cleanup, /* 04 GDIObjType_RGN_TYPE */ + SURFACE_Cleanup, /* 05 GDIObjType_SURF_TYPE */ + GDIOBJ_Cleanup, /* 06 GDIObjType_CLIENTOBJ_TYPE */ + GDIOBJ_Cleanup, /* 07 GDIObjType_PATH_TYPE */ + PALETTE_Cleanup, /* 08 GDIObjType_PAL_TYPE */ + GDIOBJ_Cleanup, /* 09 GDIObjType_ICMLCS_TYPE */ + GDIOBJ_Cleanup, /* 0a GDIObjType_LFONT_TYPE */ + NULL, /* 0b GDIObjType_RFONT_TYPE, unused */ + NULL, /* 0c GDIObjType_PFE_TYPE, unused */ + NULL, /* 0d GDIObjType_PFT_TYPE, unused */ + GDIOBJ_Cleanup, /* 0e GDIObjType_ICMCXF_TYPE */ + NULL, /* 0f GDIObjType_SPRITE_TYPE, unused */ + BRUSH_Cleanup, /* 10 GDIObjType_BRUSH_TYPE, BRUSH, PEN, EXTPEN */ + NULL, /* 11 GDIObjType_UMPD_TYPE, unused */ + NULL, /* 12 GDIObjType_UNUSED4_TYPE */ + NULL, /* 13 GDIObjType_SPACE_TYPE, unused */ + NULL, /* 14 GDIObjType_UNUSED5_TYPE */ + NULL, /* 15 GDIObjType_META_TYPE, unused */ + NULL, /* 16 GDIObjType_EFSTATE_TYPE, unused */ + NULL, /* 17 GDIObjType_BMFD_TYPE, unused */ + NULL, /* 18 GDIObjType_VTFD_TYPE, unused */ + NULL, /* 19 GDIObjType_TTFD_TYPE, unused */ + NULL, /* 1a GDIObjType_RC_TYPE, unused */ + NULL, /* 1b GDIObjType_TEMP_TYPE, unused */ + DRIVEROBJ_Cleanup,/* 1c GDIObjType_DRVOBJ_TYPE */ + NULL, /* 1d GDIObjType_DCIOBJ_TYPE, unused */ + NULL, /* 1e GDIObjType_SPOOL_TYPE, unused */ + NULL, /* 1f reserved entry */ +}; -VOID -DeAllocTypeDataDump(INT TypeInfo) -{ - switch( TypeInfo & GDI_HANDLE_TYPE_MASK ) - { - case GDILoObjType_LO_BRUSH_TYPE: - tBRUSH--; - break; - case GDILoObjType_LO_DC_TYPE: - tDC--; - break; - case GDILoObjType_LO_BITMAP_TYPE: - tBITMAP--; - break; - case GDILoObjType_LO_FONT_TYPE: - tFONT--; - break; - case GDILoObjType_LO_REGION_TYPE: - tRGN--; - break; - } -} +/* INTERNAL FUNCTIONS ********************************************************/ -/* - * Dummy GDI Cleanup Callback - */ static BOOL INTERNAL_CALL -GDI_CleanupDummy(PVOID ObjectBody) +GDIOBJ_Cleanup(PVOID ObjectBody) { return TRUE; } -/*! - * Allocate GDI object table. - * \param Size - number of entries in the object table. -*/ -INIT_FUNCTION -PGDI_HANDLE_TABLE -INTERNAL_CALL -GDIOBJ_iAllocHandleTable(OUT PSECTION_OBJECT *SectionObject) +static +VOID +InitLookasideList(UCHAR objt, ULONG cjSize) { - PGDI_HANDLE_TABLE HandleTable = NULL; - LARGE_INTEGER htSize; - UINT ObjType; - ULONG ViewSize = 0; - NTSTATUS Status; - - ASSERT(SectionObject != NULL); - - htSize.QuadPart = sizeof(GDI_HANDLE_TABLE); - - Status = MmCreateSection((PVOID*)SectionObject, - SECTION_ALL_ACCESS, - NULL, - &htSize, - PAGE_READWRITE, - SEC_COMMIT, - NULL, - NULL); - if (!NT_SUCCESS(Status)) - return NULL; - - /* FIXME - use MmMapViewInSessionSpace once available! */ - Status = MmMapViewInSystemSpace(*SectionObject, - (PVOID*)&HandleTable, - &ViewSize); - if (!NT_SUCCESS(Status)) - { - ObDereferenceObject(*SectionObject); - *SectionObject = NULL; - return NULL; - } - - RtlZeroMemory(HandleTable, sizeof(GDI_HANDLE_TABLE)); - - HandleTable->LookasideLists = ExAllocatePoolWithTag(NonPagedPool, - BASE_OBJTYPE_COUNT * sizeof(PAGED_LOOKASIDE_LIST), - TAG_GDIHNDTBLE); - if (HandleTable->LookasideLists == NULL) - { - MmUnmapViewInSystemSpace(HandleTable); - ObDereferenceObject(*SectionObject); - *SectionObject = NULL; - return NULL; - } - - for (ObjType = 0; ObjType < BASE_OBJTYPE_COUNT; ObjType++) - { - if (ObjTypeInfo[ObjType].bUseLookaside) - { - ExInitializePagedLookasideList(HandleTable->LookasideLists + ObjType, - NULL, - NULL, - 0, - ObjTypeInfo[ObjType].ulBodySize, - ObjTypeInfo[ObjType].Tag, - 0); - } - } - - ShortDelay.QuadPart = -5000LL; /* FIXME - 0.5 ms? */ - - HandleTable->FirstFree = 0; - HandleTable->FirstUnused = RESERVE_ENTRIES_COUNT; - - return HandleTable; + ExInitializePagedLookasideList(&gpaLookasideList[objt], + NULL, + NULL, + 0, + cjSize, + GDITAG_HMGR_LOOKASIDE_START + (objt << 24), + 0); } INIT_FUNCTION NTSTATUS NTAPI -InitGdiHandleTable() +InitGdiHandleTable(void) { - /* Create the GDI handle table */ - GdiHandleTable = GDIOBJ_iAllocHandleTable(&GdiTableSection); - if (GdiHandleTable == NULL) + NTSTATUS status; + LARGE_INTEGER liSize; + PVOID pvSection; + SIZE_T cjViewSize = 0; + + /* Create a section for the shared handle table */ + liSize.QuadPart = sizeof(GDI_HANDLE_TABLE);//GDI_HANDLE_COUNT * sizeof(ENTRY); + status = MmCreateSection(&gpvGdiHdlTblSection, + SECTION_ALL_ACCESS, + NULL, + &liSize, + PAGE_READWRITE, + SEC_COMMIT, + NULL, + NULL); + if (!NT_SUCCESS(status)) { - DPRINT1("Failed to initialize the GDI handle table.\n"); - return STATUS_UNSUCCESSFUL; + DPRINT1("INITGDI: Could not allocate a GDI handle table.\n"); + return status; } + /* Map the section in session space */ + status = MmMapViewInSessionSpace(gpvGdiHdlTblSection, + (PVOID*)&gpentHmgr, + &cjViewSize); + if (!NT_SUCCESS(status)) + { + DPRINT1("INITGDI: Failed to map handle table section\n"); + ObDereferenceObject(gpvGdiHdlTblSection); + return status; + } + + /* Allocate memory for the reference counter table */ + gpaulRefCount = EngAllocSectionMem(&pvSection, + FL_ZERO_MEMORY, + GDI_HANDLE_COUNT * sizeof(ULONG), + 'frHG'); + if (!gpaulRefCount) + { + DPRINT1("INITGDI: Failed to allocate reference table.\n"); + ObDereferenceObject(gpvGdiHdlTblSection); + return STATUS_INSUFFICIENT_RESOURCES; + } + + gulFirstFree = 0; + gulFirstUnused = RESERVE_ENTRIES_COUNT; + + GdiHandleTable = (PVOID)gpentHmgr; + + /* Initialize the lookaside lists */ + gpaLookasideList = ExAllocatePoolWithTag(NonPagedPool, + GDIObjTypeTotal * sizeof(PAGED_LOOKASIDE_LIST), + TAG_GDIHNDTBLE); + + InitLookasideList(GDIObjType_DC_TYPE, sizeof(DC)); + InitLookasideList(GDIObjType_RGN_TYPE, sizeof(REGION)); + InitLookasideList(GDIObjType_SURF_TYPE, sizeof(SURFACE)); + InitLookasideList(GDIObjType_CLIENTOBJ_TYPE, sizeof(CLIENTOBJ)); + InitLookasideList(GDIObjType_PATH_TYPE, sizeof(PATH)); + InitLookasideList(GDIObjType_PAL_TYPE, sizeof(PALETTE)); + InitLookasideList(GDIObjType_ICMLCS_TYPE, sizeof(COLORSPACE)); + InitLookasideList(GDIObjType_LFONT_TYPE, sizeof(TEXTOBJ)); + InitLookasideList(GDIObjType_BRUSH_TYPE, sizeof(BRUSH)); + return STATUS_SUCCESS; } - -static void FASTCALL -LockErrorDebugOutput(HGDIOBJ hObj, PGDI_TABLE_ENTRY Entry, LPSTR Function) +FORCEINLINE +VOID +IncrementGdiHandleCount(void) { - if ((Entry->Type & GDI_ENTRY_BASETYPE_MASK) == 0) - { - DPRINT1("%s: Attempted to lock object 0x%x that is deleted!\n", Function, hObj); - GDIDBG_TRACEDELETER(hObj); - } - else if (GDI_HANDLE_GET_REUSECNT(hObj) != GDI_ENTRY_GET_REUSECNT(Entry->Type)) - { - DPRINT1("%s: Attempted to lock object 0x%x, wrong reuse counter (Handle: 0x%x, Entry: 0x%x)\n", - Function, hObj, GDI_HANDLE_GET_REUSECNT(hObj), GDI_ENTRY_GET_REUSECNT(Entry->Type)); - } - else if (GDI_HANDLE_GET_TYPE(hObj) != ((Entry->Type << GDI_ENTRY_UPPER_SHIFT) & GDI_HANDLE_TYPE_MASK)) - { - DPRINT1("%s: Attempted to lock object 0x%x, type mismatch (Handle: 0x%x, Entry: 0x%x)\n", - Function, hObj, GDI_HANDLE_GET_TYPE(hObj), (Entry->Type << GDI_ENTRY_UPPER_SHIFT) & GDI_HANDLE_TYPE_MASK); - } - else - { - DPRINT1("%s: Attempted to lock object 0x%x, something went wrong, typeinfo = 0x%x\n", - Function, hObj, Entry->Type); - } - GDIDBG_TRACECALLER(); + PPROCESSINFO ppi = PsGetCurrentProcessWin32Process(); + if (ppi) InterlockedIncrement((LONG*)&ppi->GDIHandleCount); } -ULONG -FASTCALL -InterlockedPopFreeEntry(VOID) +FORCEINLINE +VOID +DecrementGdiHandleCount(void) +{ + PPROCESSINFO ppi = PsGetCurrentProcessWin32Process(); + if (ppi) InterlockedDecrement((LONG*)&ppi->GDIHandleCount); +} + +static +PENTRY +ENTRY_pentPopFreeEntry(VOID) { ULONG iFirst, iNext, iPrev; - PGDI_TABLE_ENTRY pEntry; + PENTRY pentFree; DPRINT("Enter InterLockedPopFreeEntry\n"); do { /* Get the index and sequence number of the first free entry */ - iFirst = GdiHandleTable->FirstFree; + iFirst = gulFirstFree; /* Check if we have a free entry */ if (!(iFirst & GDI_HANDLE_INDEX_MASK)) { /* Increment FirstUnused and get the new index */ - iFirst = InterlockedIncrement((LONG*)&GdiHandleTable->FirstUnused) - 1; + iFirst = InterlockedIncrement((LONG*)&gulFirstUnused) - 1; /* Check if we have unused entries left */ if (iFirst >= GDI_HANDLE_COUNT) @@ -283,1585 +264,811 @@ InterlockedPopFreeEntry(VOID) return 0; } - /* Return the old index */ - return iFirst; + /* Return the old entry */ + return &gpentHmgr[iFirst]; } /* Get a pointer to the first free entry */ - pEntry = GdiHandleTable->Entries + (iFirst & GDI_HANDLE_INDEX_MASK); + pentFree = &gpentHmgr[iFirst & GDI_HANDLE_INDEX_MASK]; /* Create a new value with an increased sequence number */ - iNext = (USHORT)(ULONG_PTR)pEntry->KernelData; + iNext = (USHORT)(ULONG_PTR)pentFree->einfo.pobj; iNext |= (iFirst & ~GDI_HANDLE_INDEX_MASK) + 0x10000; /* Try to exchange the FirstFree value */ - iPrev = InterlockedCompareExchange((LONG*)&GdiHandleTable->FirstFree, + iPrev = InterlockedCompareExchange((LONG*)&gulFirstFree, iNext, iFirst); } while (iPrev != iFirst); /* Sanity check: is entry really free? */ - ASSERT(((ULONG_PTR)pEntry->KernelData & ~GDI_HANDLE_INDEX_MASK) == 0); + ASSERT(((ULONG_PTR)pentFree->einfo.pobj & ~GDI_HANDLE_INDEX_MASK) == 0); - return iFirst & GDI_HANDLE_INDEX_MASK; + return pentFree; } /* Pushes an entry of the handle table to the free list, - The entry must be unlocked and the base type field must be 0 */ + The entry must not have any references left */ +static VOID -FASTCALL -InterlockedPushFreeEntry(ULONG idxToFree) +ENTRY_vPushFreeEntry(PENTRY pentFree) { - ULONG iToFree, iFirst, iPrev; - PGDI_TABLE_ENTRY pFreeEntry; + ULONG iToFree, iFirst, iPrev, idxToFree; - DPRINT("Enter InterlockedPushFreeEntry\n"); + DPRINT("Enter ENTRY_vPushFreeEntry\n"); - pFreeEntry = GdiHandleTable->Entries + idxToFree; - ASSERT((pFreeEntry->Type & GDI_ENTRY_BASETYPE_MASK) == 0); - ASSERT(pFreeEntry->ProcessId == 0); - pFreeEntry->UserData = NULL; // FIXME - ASSERT(pFreeEntry->UserData == NULL); + idxToFree = pentFree - gpentHmgr; + ASSERT((gpaulRefCount[idxToFree] & REF_MASK_INUSE) == 0); + + /* Initialize entry */ + pentFree->Objt = GDIObjType_DEF_TYPE; + pentFree->ObjectOwner.ulObj = 0; + pentFree->pUser = NULL; + + /* Increase reuse counter in entry and reference counter */ + InterlockedExchangeAdd((LONG*)&gpaulRefCount[idxToFree], REF_INC_REUSE); + pentFree->FullUnique += 0x0100; do { /* Get the current first free index and sequence number */ - iFirst = GdiHandleTable->FirstFree; + iFirst = gulFirstFree; - /* Set the KernelData member to the index of the first free entry */ - pFreeEntry->KernelData = UlongToPtr(iFirst & GDI_HANDLE_INDEX_MASK); + /* Set the einfo.pobj member to the index of the first free entry */ + pentFree->einfo.pobj = UlongToPtr(iFirst & GDI_HANDLE_INDEX_MASK); /* Combine new index and increased sequence number in iToFree */ iToFree = idxToFree | ((iFirst & ~GDI_HANDLE_INDEX_MASK) + 0x10000); /* Try to atomically update the first free entry */ - iPrev = InterlockedCompareExchange((LONG*)&GdiHandleTable->FirstFree, + iPrev = InterlockedCompareExchange((LONG*)&gulFirstFree, iToFree, iFirst); } while (iPrev != iFirst); } - -BOOL -INTERNAL_CALL -GDIOBJ_ValidateHandle(HGDIOBJ hObj, ULONG ObjectType) +static +PENTRY +ENTRY_ReferenceEntryByHandle(HGDIOBJ hobj, FLONG fl) { - PGDI_TABLE_ENTRY Entry = GDI_HANDLE_GET_ENTRY(GdiHandleTable, hObj); - if ((((ULONG_PTR)hObj & GDI_HANDLE_TYPE_MASK) == ObjectType) && - (Entry->Type << GDI_ENTRY_UPPER_SHIFT) == GDI_HANDLE_GET_UPPER(hObj)) + ULONG ulIndex, cNewRefs, cOldRefs; + PENTRY pentry; + + /* Get the handle index and check if its too big */ + ulIndex = GDI_HANDLE_GET_INDEX(hobj); + if (ulIndex >= GDI_HANDLE_COUNT) return NULL; + + /* Get pointer to the entry */ + pentry = &gpentHmgr[ulIndex]; + + /* Get the current reference count */ + cOldRefs = gpaulRefCount[ulIndex]; + + do { - HANDLE pid = (HANDLE)((ULONG_PTR)Entry->ProcessId & ~0x1); - if (pid == NULL || pid == PsGetCurrentProcessId()) + /* Check if the slot is deleted */ + if ((cOldRefs & REF_MASK_VALID) == 0) { - return TRUE; + DPRINT("GDIOBJ: slot not valid: 0x%lx, hobh=%p\n", cOldRefs, hobj); + return NULL; } + + /* Check if the unique value matches */ + if (pentry->FullUnique != (USHORT)((ULONG_PTR)hobj >> 16)) + { + DPRINT("GDIOBJ: wrong unique value. Handle: 0x%4x, entry: 0x%4x\n", + (USHORT)((ULONG_PTR)hobj >> 16, pentry->FullUnique)); + return NULL; + } + + /* Check if the object owner is this process or public */ + if (!(fl & GDIOBJFLAG_IGNOREPID) && + pentry->ObjectOwner.ulObj != GDI_OBJ_HMGR_PUBLIC && + pentry->ObjectOwner.ulObj != PtrToUlong(PsGetCurrentProcessId())) + { + DPRINT1("GDIOBJ: Cannot reference foreign handle %p, pentry=%p:%lx.\n", + hobj, pentry, pentry->ObjectOwner.ulObj); + //ASSERT(FALSE); + return NULL; + } + + /* Try to atomically increment the reference count */ + cNewRefs = cOldRefs + 1; + cOldRefs = InterlockedCompareExchange((PLONG)&gpaulRefCount[ulIndex], + cNewRefs, + cOldRefs); } - return FALSE; + while (cNewRefs != cOldRefs + 1); + + /* Integrity checks */ + ASSERT((pentry->FullUnique & 0x1f) == pentry->Objt); + ASSERT(pentry->einfo.pobj && pentry->einfo.pobj->hHmgr == hobj); + + return pentry; } -POBJ INTERNAL_CALL -GDIOBJ_AllocObj(UCHAR BaseType) +static +HGDIOBJ +ENTRY_hInsertObject(PENTRY pentry, POBJ pobj, UCHAR objt, ULONG ulOwner) { - POBJ pObject; + ULONG ulIndex; - ASSERT((BaseType & ~GDIObjTypeTotal) == 0); -// BaseType &= GDI_HANDLE_BASETYPE_MASK; + /* Calculate the handle index */ + ulIndex = pentry - gpentHmgr; - if (ObjTypeInfo[BaseType].bUseLookaside) + /* Update the fields in the ENTRY */ + pentry->einfo.pobj = pobj; + pentry->Objt = objt & 0x1f; + pentry->FullUnique = (pentry->FullUnique & 0xff00) | objt; + pentry->ObjectOwner.ulObj = ulOwner; + + /* Make the handle valid with 1 reference */ + ASSERT((gpaulRefCount[ulIndex] & REF_MASK_INUSE) == 0); + InterlockedOr((LONG*)&gpaulRefCount[ulIndex], REF_MASK_VALID | 1); + + /* Return the handle */ + return (HGDIOBJ)(((ULONG_PTR)pentry->FullUnique << 16) | ulIndex); +} + +POBJ +NTAPI +GDIOBJ_AllocateObject(UCHAR objt, ULONG cjSize, FLONG fl) +{ + POBJ pobj; + + if (fl & BASEFLAG_LOOKASIDE) { - PPAGED_LOOKASIDE_LIST LookasideList; - - LookasideList = GdiHandleTable->LookasideLists + BaseType; - pObject = ExAllocateFromPagedLookasideList(LookasideList); + /* Allocate the object from a lookaside list */ + pobj = ExAllocateFromPagedLookasideList(&gpaLookasideList[objt & 0x1f]); } else { - pObject = ExAllocatePoolWithTag(PagedPool, - ObjTypeInfo[BaseType].ulBodySize, - ObjTypeInfo[BaseType].Tag); + /* Allocate the object from paged pool */ + pobj = ExAllocatePoolWithTag(PagedPool, cjSize, GDIOBJ_POOL_TAG(objt)); } - if (pObject) - { - RtlZeroMemory(pObject, ObjTypeInfo[BaseType].ulBodySize); - } + if (!pobj) return NULL; - return pObject; + /* Initialize the object */ + RtlZeroMemory(pobj, cjSize); + pobj->hHmgr = (HGDIOBJ)((ULONG_PTR)objt << 16); + pobj->cExclusiveLock = 0; + pobj->ulShareCount = 1; + pobj->BaseFlags = fl & 0xffff; + DBG_INITLOG(&pobj->slhLog); + DBG_LOGEVENT(&pobj->slhLog, EVENT_ALLOCATE, 0); + + return pobj; } - -/*! - * Allocate memory for GDI object and return handle to it. - * - * \param ObjectType - type of object \ref GDI object types - * - * \return Pointer to the allocated object, which is locked. -*/ -POBJ INTERNAL_CALL -GDIOBJ_AllocObjWithHandle(ULONG ObjectType) +VOID +NTAPI +GDIOBJ_vFreeObject(POBJ pobj) { - PPROCESSINFO W32Process; - POBJ newObject = NULL; - HANDLE CurrentProcessId, LockedProcessId; - UCHAR TypeIndex; - UINT Index; - PGDI_TABLE_ENTRY Entry; - LONG TypeInfo; + UCHAR objt; - GDIDBG_INITLOOPTRACE(); + DBG_CLEANUP_EVENT_LIST(&pobj->slhLog); - W32Process = PsGetCurrentProcessWin32Process(); - /* HACK HACK HACK: simplest-possible quota implementation - don't allow a process - to take too many GDI objects, itself. */ - if (W32Process && W32Process->GDIHandleCount >= 0x2710) + /* Get the object type */ + objt = ((ULONG_PTR)pobj->hHmgr >> 16) & 0x1f; + + /* Call the cleanup procedure */ + ASSERT(apfnCleanup[objt]); + apfnCleanup[objt](pobj); + + /* Check if the object is allocated from a lookaside list */ + if (pobj->BaseFlags & BASEFLAG_LOOKASIDE) { - DPRINT1("Too many objects for process!!!\n"); - DPRINT1("DC %d BRUSH %d BITMAP %d FONT %d RGN %d\n",tDC,tBRUSH,tBITMAP,tFONT,tRGN); - GDIDBG_DUMPHANDLETABLE(); - return NULL; - } - - ASSERT(ObjectType != GDI_OBJECT_TYPE_DONTCARE); - - TypeIndex = GDI_OBJECT_GET_TYPE_INDEX(ObjectType); - - newObject = GDIOBJ_AllocObj(TypeIndex); - if (!newObject) - { - DPRINT1("Not enough memory to allocate gdi object!\n"); - return NULL; - } - - CurrentProcessId = PsGetCurrentProcessId(); - LockedProcessId = (HANDLE)((ULONG_PTR)CurrentProcessId | 0x1); - -// RtlZeroMemory(newObject, ObjTypeInfo[TypeIndex].ulBodySize); - - /* On Windows the higher 16 bit of the type field don't contain the - full type from the handle, but the base type. - (type = BRSUH, PEN, EXTPEN, basetype = BRUSH) */ - TypeInfo = (ObjectType & GDI_HANDLE_BASETYPE_MASK) | (ObjectType >> GDI_ENTRY_UPPER_SHIFT); - - Index = InterlockedPopFreeEntry(); - if (Index != 0) - { - HANDLE PrevProcId; - - Entry = &GdiHandleTable->Entries[Index]; - -LockHandle: - PrevProcId = InterlockedCompareExchangePointer((PVOID*)&Entry->ProcessId, LockedProcessId, 0); - if (PrevProcId == NULL) - { - PTHREADINFO Thread = (PTHREADINFO)PsGetCurrentThreadWin32Thread(); - HGDIOBJ Handle; - - Entry->KernelData = newObject; - - /* copy the reuse-counter */ - TypeInfo |= Entry->Type & GDI_ENTRY_REUSE_MASK; - - /* we found a free entry, no need to exchange this field atomically - since we're holding the lock */ - Entry->Type = TypeInfo; - - /* Create a handle */ - Handle = (HGDIOBJ)((Index & 0xFFFF) | (TypeInfo << GDI_ENTRY_UPPER_SHIFT)); - - /* Initialize BaseObject fields */ - newObject->hHmgr = Handle; - newObject->ulShareCount = 0; - newObject->cExclusiveLock = 1; - newObject->Tid = Thread; -#if DBG - if (Thread) Thread->cExclusiveLocks++; -#endif - - AllocTypeDataDump(TypeInfo); - - /* unlock the entry */ - (void)InterlockedExchangePointer((PVOID*)&Entry->ProcessId, CurrentProcessId); - - GDIDBG_CAPTUREALLOCATOR(Index); - - if (W32Process != NULL) - { - InterlockedIncrement(&W32Process->GDIHandleCount); - } - - DPRINT("GDIOBJ_AllocObj: 0x%x ob: 0x%x\n", Handle, newObject); - return newObject; - } - else - { - GDIDBG_TRACELOOP(Index, PrevProcId, CurrentProcessId); - /* damn, someone is trying to lock the object even though it doesn't - even exist anymore, wait a little and try again! - FIXME - we shouldn't loop forever! Give up after some time! */ - DelayExecution(); - /* try again */ - goto LockHandle; - } - } - - GDIOBJ_FreeObj(newObject, TypeIndex); - - DPRINT1("Failed to insert gdi object into the handle table, no handles left!\n"); - GDIDBG_DUMPHANDLETABLE(); - - return NULL; -} - - -VOID INTERNAL_CALL -GDIOBJ_FreeObj(POBJ pObject, UCHAR BaseType) -{ - /* Object must not have a handle! */ - ASSERT(pObject->hHmgr == NULL); - - if (ObjTypeInfo[BaseType].bUseLookaside) - { - PPAGED_LOOKASIDE_LIST LookasideList; - - LookasideList = GdiHandleTable->LookasideLists + BaseType; - ExFreeToPagedLookasideList(LookasideList, pObject); + ExFreeToPagedLookasideList(&gpaLookasideList[objt], pobj); } else { - ExFreePool(pObject); - } -} - -/*! - * Free memory allocated for the GDI object. For each object type this function calls the - * appropriate cleanup routine. - * - * \param hObj - handle of the object to be deleted. - * - * \return Returns TRUE if succesful. - * \return Returns FALSE if the cleanup routine returned FALSE or the object doesn't belong - * to the calling process. - * - * \bug This function should return VOID and kill the object no matter what... -*/ -BOOL INTERNAL_CALL -GDIOBJ_FreeObjByHandle(HGDIOBJ hObj, DWORD ExpectedType) -{ - PGDI_TABLE_ENTRY Entry; - HANDLE ProcessId, LockedProcessId, PrevProcId; - ULONG HandleType, HandleUpper, TypeIndex; - BOOL Silent; - - GDIDBG_INITLOOPTRACE(); - - DPRINT("GDIOBJ_FreeObj: hObj: 0x%08x\n", hObj); - - if (GDI_HANDLE_IS_STOCKOBJ(hObj)) - { - DPRINT1("GDIOBJ_FreeObj() failed, can't delete stock object handle: 0x%x !!!\n", hObj); - GDIDBG_TRACECALLER(); - return FALSE; - } - - ProcessId = PsGetCurrentProcessId(); - LockedProcessId = (HANDLE)((ULONG_PTR)ProcessId | 0x1); - - Silent = (ExpectedType & GDI_OBJECT_TYPE_SILENT); - ExpectedType &= ~GDI_OBJECT_TYPE_SILENT; - - HandleType = GDI_HANDLE_GET_TYPE(hObj); - HandleUpper = GDI_HANDLE_GET_UPPER(hObj); - - /* Check if we have the requested type */ - if ( (ExpectedType != GDI_OBJECT_TYPE_DONTCARE && - HandleType != ExpectedType) || - HandleType == 0 ) - { - DPRINT1("Attempted to free object 0x%x of wrong type (Handle: 0x%x, expected: 0x%x)\n", - hObj, HandleType, ExpectedType); - GDIDBG_TRACECALLER(); - return FALSE; - } - - Entry = GDI_HANDLE_GET_ENTRY(GdiHandleTable, hObj); - -LockHandle: - /* lock the object, we must not delete global objects, so don't exchange the locking - process ID to zero when attempting to lock a global object... */ - PrevProcId = InterlockedCompareExchangePointer((PVOID*)&Entry->ProcessId, LockedProcessId, ProcessId); - if (PrevProcId == ProcessId) - { - if ( (Entry->KernelData != NULL) && - ((Entry->Type << GDI_ENTRY_UPPER_SHIFT) == HandleUpper) && - ((Entry->Type & GDI_ENTRY_BASETYPE_MASK) == (HandleUpper & GDI_ENTRY_BASETYPE_MASK)) ) - { - POBJ Object; - PTHREADINFO Thread = (PTHREADINFO)PsGetCurrentThreadWin32Thread(); - - Object = Entry->KernelData; - - if ((Object->cExclusiveLock == 0 || Object->Tid == Thread) && - Object->ulShareCount == 0) - { - BOOL Ret; - PPROCESSINFO W32Process = PsGetCurrentProcessWin32Process(); - - /* Clear the basetype field so when unlocking the handle it gets finally deleted and increment reuse counter */ - Entry->Type = (Entry->Type + GDI_ENTRY_REUSE_INC) & ~GDI_ENTRY_BASETYPE_MASK; - - /* unlock the handle slot */ - (void)InterlockedExchangePointer((PVOID*)&Entry->ProcessId, NULL); - - /* push this entry to the free list */ - InterlockedPushFreeEntry(GDI_ENTRY_TO_INDEX(GdiHandleTable, Entry)); - - Object->hHmgr = NULL; -#if DBG - if (Thread) - { - if (Thread->cExclusiveLocks < Object->cExclusiveLock) - { - DPRINT1("cExclusiveLocks = %ld, object: %ld\n", - Thread->cExclusiveLocks, Object->cExclusiveLock); - ASSERT(FALSE); - } - Thread->cExclusiveLocks -= Object->cExclusiveLock; - } -#endif - - if (W32Process != NULL) - { - InterlockedDecrement(&W32Process->GDIHandleCount); - } - - /* call the cleanup routine. */ - TypeIndex = GDI_OBJECT_GET_TYPE_INDEX(HandleType); - Ret = ObjTypeInfo[TypeIndex].CleanupProc(Object); - - DeAllocTypeDataDump(HandleType); - - /* Now it's time to free the memory */ - GDIOBJ_FreeObj(Object, TypeIndex); - - GDIDBG_CAPTUREDELETER(hObj); - return Ret; - } - else if (Object->ulShareCount != 0) - { - NTSTATUS Status; - PEPROCESS OldProcess; - Object->BaseFlags |= BASEFLAG_READY_TO_DIE; - DPRINT("Object %p, ulShareCount = %d\n", Object->hHmgr, Object->ulShareCount); - /* Set NULL owner. Do the work here to avoid race conditions */ - Status = PsLookupProcessByProcessId((HANDLE)((ULONG_PTR)PrevProcId & ~0x1), &OldProcess); - if (NT_SUCCESS(Status)) - { - PPROCESSINFO W32Process = (PPROCESSINFO)OldProcess->Win32Process; - if (W32Process != NULL) - { - InterlockedDecrement(&W32Process->GDIHandleCount); - } - ObDereferenceObject(OldProcess); - } - (void)InterlockedExchangePointer((PVOID*)&Entry->ProcessId, NULL); - /* Don't wait on shared locks */ - return FALSE; - } - else - { - /* - * The object is currently locked by another thread, so freeing is forbidden! - */ - DPRINT1("Object->cExclusiveLock = %d\n", Object->cExclusiveLock); - GDIDBG_TRACECALLER(); - GDIDBG_TRACELOCKER(hObj); - (void)InterlockedExchangePointer((PVOID*)&Entry->ProcessId, PrevProcId); - /* do not assert here for it will call again from dxg.sys it being call twice */ - - DelayExecution(); - goto LockHandle; - } - } - else - { - LockErrorDebugOutput(hObj, Entry, "GDIOBJ_FreeObj"); - (void)InterlockedExchangePointer((PVOID*)&Entry->ProcessId, PrevProcId); - } - } - else if (PrevProcId == LockedProcessId) - { - GDIDBG_TRACELOOP(hObj, PrevProcId, ProcessId); - - /* the object is currently locked, wait some time and try again. - FIXME - we shouldn't loop forever! Give up after some time! */ - DelayExecution(); - /* try again */ - goto LockHandle; - } - else - { - if (!Silent) - { - if ((Entry->Type & GDI_ENTRY_BASETYPE_MASK) == 0) - { - DPRINT1("Attempted to free gdi handle 0x%x that is already deleted!\n", hObj); - } - else if (((ULONG_PTR)PrevProcId & ~0x1) == 0) - { - DPRINT1("Attempted to free global gdi handle 0x%x, caller needs to get ownership first!!!\n", hObj); - } - else - { - DPRINT1("Attempted to free foreign handle: 0x%x Owner: 0x%x from Caller: 0x%x\n", hObj, (ULONG_PTR)PrevProcId & ~0x1, (ULONG_PTR)ProcessId & ~0x1); - } - DPRINT1("Type = 0x%lx, KernelData = 0x%p, ProcessId = 0x%p\n", Entry->Type, Entry->KernelData, Entry->ProcessId); - GDIDBG_TRACECALLER(); - GDIDBG_TRACEALLOCATOR(hObj); - } - } - - return FALSE; -} - -BOOL -FASTCALL -IsObjectDead(HGDIOBJ hObject) -{ - INT Index = GDI_HANDLE_GET_INDEX(hObject); - PGDI_TABLE_ENTRY Entry = &GdiHandleTable->Entries[Index]; - // We check to see if the objects are knocking on deaths door. - if ((Entry->Type & GDI_ENTRY_BASETYPE_MASK) != 0) - return FALSE; - else - { - DPRINT1("Object 0x%x currently being destroyed!!!\n",hObject); - return TRUE; // return true and move on. - } -} - -/* - * Process Environment Cached GDI Handles - * - * What types of GDI handle objects that are cached in the GDI handle buffer? - * Brushes set to BS_SOLID, Pens with widths of zero or set to PS_SOLID, and - * Regions that are set to NULLREGION or SIMPLEREGION. - */ -BOOL -FASTCALL -bPEBCacheHandle(HGDIOBJ Handle, int oType, PVOID pAttr) -{ - PGDIHANDLECACHE GdiHandleCache; - HGDIOBJ *hPtr; - HANDLE Lock; - int Number, Offset, MaxNum = CACHE_PEN_ENTRIES; - BOOL Ret = FALSE; - - GdiHandleCache = (PGDIHANDLECACHE)NtCurrentTeb()->ProcessEnvironmentBlock->GdiHandleBuffer; - - switch (oType) - { - case hctBrushHandle: - Offset = 0; - MaxNum = CACHE_BRUSH_ENTRIES; - break; - - case hctPenHandle: - Offset = CACHE_BRUSH_ENTRIES; - break; - - case hctRegionHandle: - Offset = CACHE_BRUSH_ENTRIES+CACHE_PEN_ENTRIES; - break; - - default: - return FALSE; - } - - Lock = InterlockedCompareExchangePointer( (PVOID*)&GdiHandleCache->ulLock, - NtCurrentTeb(), - NULL ); - if (Lock) return FALSE; - - _SEH2_TRY - { - Number = GdiHandleCache->ulNumHandles[oType]; - - hPtr = GdiHandleCache->Handle + Offset; - - if ( pAttr ) - { - if ( Number < MaxNum ) - { // This object is cached and waiting for it's resurrection by the users. - ((PRGN_ATTR)pAttr)->AttrFlags |= ATTR_CACHED; - hPtr[Number] = Handle; - GdiHandleCache->ulNumHandles[oType]++; - DPRINT("Put Handle Count %d PEB 0x%x\n", GdiHandleCache->ulNumHandles[oType], NtCurrentTeb()->ProcessEnvironmentBlock); - Ret = TRUE; - } - } - } - _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) - { - Ret = FALSE; - } - _SEH2_END; - - (void)InterlockedExchangePointer((PVOID*)&GdiHandleCache->ulLock, Lock); - return Ret; -} - -/*! - * Delete GDI object - * \param hObject object handle - * \return if the function fails the returned value is FALSE. -*/ -BOOL -FASTCALL -GreDeleteObject(HGDIOBJ hObject) -{ - INT Index; - PGDI_TABLE_ENTRY Entry; - DWORD dwObjectType; - INT ihct; - PVOID pAttr = NULL; - - DPRINT("NtGdiDeleteObject handle 0x%08x\n", hObject); - if (!IsObjectDead(hObject)) - { - dwObjectType = GDIOBJ_GetObjectType(hObject); - - Index = GDI_HANDLE_GET_INDEX(hObject); - Entry = &GdiHandleTable->Entries[Index]; - pAttr = Entry->UserData; - - switch (dwObjectType) - { - case GDI_OBJECT_TYPE_BRUSH: - ihct = hctBrushHandle; - break; - - case GDI_OBJECT_TYPE_PEN: - ihct = hctPenHandle; - break; - - case GDI_OBJECT_TYPE_REGION: - ihct = hctRegionHandle; - break; - } - - switch (dwObjectType) - { -// case GDI_OBJECT_TYPE_BRUSH: -// case GDI_OBJECT_TYPE_PEN: - case GDI_OBJECT_TYPE_REGION: - /* If pAttr NULL, the probability is high for System GDI handle object. */ - if ( pAttr && - bPEBCacheHandle(hObject, ihct, pAttr) ) - { /* User space handle only! */ - return TRUE; - } - if (pAttr) - { - FreeObjectAttr(pAttr); - Entry->UserData = NULL; - } - break; - - case GDI_OBJECT_TYPE_DC: -// DC_FreeDcAttr(hObject); - break; - } - - return NULL != hObject - ? GDIOBJ_FreeObjByHandle(hObject, dwObjectType) : FALSE; - } - else - { - DPRINT1("Attempt DeleteObject 0x%x currently being destroyed!!!\n",hObject); - return TRUE; // return true and move on. + ExFreePoolWithTag(pobj, GDIOBJ_POOL_TAG(objt)); } } VOID -FASTCALL -IntDeleteHandlesForProcess(struct _EPROCESS *Process, ULONG ObjectType) +NTAPI +GDIOBJ_vDereferenceObject(POBJ pobj) { - PGDI_TABLE_ENTRY Entry, End; - ULONG Index = RESERVE_ENTRIES_COUNT; - HANDLE ProcId; - PPROCESSINFO W32Process; + ULONG cRefs, ulIndex; - W32Process = (PPROCESSINFO)Process->Win32Process; - ASSERT(W32Process); - - if (W32Process->GDIHandleCount > 0) + /* Check if the object has a handle */ + if (GDI_HANDLE_GET_INDEX(pobj->hHmgr)) { - ProcId = Process->UniqueProcessId; + /* Calculate the index */ + ulIndex = GDI_HANDLE_GET_INDEX(pobj->hHmgr); - /* FIXME - Instead of building the handle here and delete it using GDIOBJ_FreeObj - we should delete it directly here! */ + /* Decrement reference count */ + ASSERT((gpaulRefCount[ulIndex] & REF_MASK_COUNT) > 0); + cRefs = InterlockedDecrement((LONG*)&gpaulRefCount[ulIndex]) & REF_MASK_INUSE; - End = &GdiHandleTable->Entries[GDI_HANDLE_COUNT]; - for (Entry = &GdiHandleTable->Entries[RESERVE_ENTRIES_COUNT]; - Entry != End; - Entry++, Index++) + /* Check if we reached 0 and handle bit is not set */ + if (cRefs == 0) { - /* ignore the lock bit */ - if ( (HANDLE)((ULONG_PTR)Entry->ProcessId & ~0x1) == ProcId) + /* Check if the handle was process owned */ + if (gpentHmgr[ulIndex].ObjectOwner.ulObj != GDI_OBJ_HMGR_PUBLIC && + gpentHmgr[ulIndex].ObjectOwner.ulObj != GDI_OBJ_HMGR_NONE) { - if ( (Entry->Type & GDI_ENTRY_BASETYPE_MASK) == ObjectType || - ObjectType == GDI_OBJECT_TYPE_DONTCARE) - { - HGDIOBJ ObjectHandle; - - /* Create the object handle for the entry, the lower(!) 16 bit of the - Type field includes the type of the object including the stock - object flag - but since stock objects don't have a process id we can - simply ignore this fact here. */ - ObjectHandle = (HGDIOBJ)(Index | (Entry->Type << GDI_ENTRY_UPPER_SHIFT)); - - if (!GDIOBJ_FreeObjByHandle(ObjectHandle, GDI_OBJECT_TYPE_DONTCARE)) - { - DPRINT1("Failed to delete object %p!\n", ObjectHandle); - } - - if (W32Process->GDIHandleCount == 0) - { - /* there are no more gdi handles for this process, bail */ - break; - } - } + /* Decrement the process handle count */ + ASSERT(gpentHmgr[ulIndex].ObjectOwner.ulObj == + HandleToUlong(PsGetCurrentProcessId())); + DecrementGdiHandleCount(); } + + /* Push entry to the free list */ + ENTRY_vPushFreeEntry(&gpentHmgr[ulIndex]); } } + else + { + /* Decrement the objects reference count */ + ASSERT(pobj->ulShareCount > 0); + cRefs = InterlockedDecrement((LONG*)&pobj->ulShareCount); + } + + DBG_LOGEVENT(&pobj->slhLog, EVENT_DEREFERENCE, cRefs); + + /* Check if we reached 0 */ + if (cRefs == 0) + { + /* Make sure it's ok to delete the object */ + ASSERT(pobj->BaseFlags & BASEFLAG_READY_TO_DIE); + + /* Free the object */ + GDIOBJ_vFreeObject(pobj); + } } - -/*! - * Internal function. Called when the process is destroyed to free the remaining GDI handles. - * \param Process - PID of the process that will be destroyed. -*/ -BOOL INTERNAL_CALL -GDI_CleanupForProcess(struct _EPROCESS *Process) +POBJ +NTAPI +GDIOBJ_ReferenceObjectByHandle( + HGDIOBJ hobj, + UCHAR objt) { - PEPROCESS CurrentProcess; - PPROCESSINFO W32Process; + PENTRY pentry; + POBJ pobj; - DPRINT("Starting CleanupForProcess prochandle %x Pid %d\n", Process, Process->UniqueProcessId); - CurrentProcess = PsGetCurrentProcess(); - if (CurrentProcess != Process) + /* Check if the handle type matches */ + ASSERT_SHARED_OBJECT_TYPE(objt); + if ((((ULONG_PTR)hobj >> 16) & 0x1f) != objt) { - KeAttachProcess(&Process->Pcb); + DPRINT("GDIOBJ: wrong type. handle=%p, type=%x\n", hobj, objt); + return NULL; } - W32Process = (PPROCESSINFO)CurrentProcess->Win32Process; - - /* Delete objects. Begin with types that are not referenced by other types */ - IntDeleteHandlesForProcess(Process, GDILoObjType_LO_DC_TYPE); - IntDeleteHandlesForProcess(Process, GDILoObjType_LO_BRUSH_TYPE); - IntDeleteHandlesForProcess(Process, GDILoObjType_LO_BITMAP_TYPE); - - /* Finally finish with what's left */ - IntDeleteHandlesForProcess(Process, GDI_OBJECT_TYPE_DONTCARE); - - if (CurrentProcess != Process) + /* Reference the handle entry */ + pentry = ENTRY_ReferenceEntryByHandle(hobj, 0); + if (!pentry) { - KeDetachProcess(); + DPRINT("GDIOBJ: requested handle 0x%p is not valid.\n", hobj); + return NULL; } -#ifdef GDI_DEBUG - GdiDbgHTIntegrityCheck(); -#endif + /* Get the pointer to the BASEOBJECT */ + pobj = pentry->einfo.pobj; - DPRINT("Completed cleanup for process %d\n", Process->UniqueProcessId); - if (W32Process->GDIHandleCount > 0) + /* Check if the object is exclusively locked */ + if (pobj->cExclusiveLock != 0) { - DPRINT1("Leaking %d handles!\n", W32Process->GDIHandleCount); + DPRINT1("GDIOBJ: Cannot reference oject %p with exclusive lock.\n", hobj); + GDIOBJ_vDereferenceObject(pobj); + DBG_DUMP_EVENT_LIST(&pobj->slhLog); + return NULL; + } + + DBG_LOGEVENT(&pobj->slhLog, EVENT_REFERENCE, gpaulRefCount[pentry - gpentHmgr]); + + /* All is well, return the object */ + return pobj; +} + +VOID +NTAPI +GDIOBJ_vReferenceObjectByPointer(POBJ pobj) +{ + ULONG cRefs; + + /* Must not be exclusively locked */ + ASSERT(pobj->cExclusiveLock == 0); + + /* Check if the object has a handle */ + if (GDI_HANDLE_GET_INDEX(pobj->hHmgr)) + { + /* Increase the handle's reference count */ + ULONG ulIndex = GDI_HANDLE_GET_INDEX(pobj->hHmgr); + ASSERT((gpaulRefCount[ulIndex] & REF_MASK_COUNT) > 0); + cRefs = InterlockedIncrement((LONG*)&gpaulRefCount[ulIndex]); + } + else + { + /* Increase the object's reference count */ + cRefs = InterlockedIncrement((LONG*)&pobj->ulShareCount); + } + + DBG_LOGEVENT(&pobj->slhLog, EVENT_REFERENCE, cRefs); +} + +PGDIOBJ +NTAPI +GDIOBJ_LockObject( + HGDIOBJ hobj, + UCHAR objt) +{ + PENTRY pentry; + POBJ pobj; + DWORD dwThreadId; + + /* Check if the handle type matches */ + ASSERT_EXCLUSIVE_OBJECT_TYPE(objt); + if ((((ULONG_PTR)hobj >> 16) & 0x1f) != objt) + { + DPRINT("wrong object type: hobj=0x%p, objt=0x%x\n", hobj, objt); + return NULL; + } + + /* Reference the handle entry */ + pentry = ENTRY_ReferenceEntryByHandle(hobj, 0); + if (!pentry) + { + DPRINT("GDIOBJ: requested handle 0x%p is not valid.\n", hobj); + return NULL; + } + + /* Get the pointer to the BASEOBJECT */ + pobj = pentry->einfo.pobj; + + /* Check if we already own the lock */ + dwThreadId = PtrToUlong(PsGetCurrentThreadId()); + if (pobj->dwThreadId != dwThreadId) + { + /* Disable APCs and acquire the push lock */ + KeEnterCriticalRegion(); + ExAcquirePushLockExclusive(&pobj->pushlock); + + /* Set us as lock owner */ + ASSERT(pobj->dwThreadId == 0); + pobj->dwThreadId = dwThreadId; + } + + /* Increase lock count */ + pobj->cExclusiveLock++; + DBG_INCREASE_LOCK_COUNT(PsGetCurrentProcessWin32Process(), hobj); + DBG_LOGEVENT(&pobj->slhLog, EVENT_LOCK, 0); + + /* Return the object */ + return pobj; +} + +VOID +NTAPI +GDIOBJ_vUnlockObject(POBJ pobj) +{ + ASSERT(pobj->cExclusiveLock > 0); + + /* Decrease lock count */ + pobj->cExclusiveLock--; + DBG_DECREASE_LOCK_COUNT(PsGetCurrentProcessWin32Process(), pobj->hHmgr); + + /* Check if this was the last lock */ + if (pobj->cExclusiveLock == 0) + { + /* Reset lock owner */ + pobj->dwThreadId = 0; + + /* Release the pushlock and reenable APCs */ + ExReleasePushLockExclusive(&pobj->pushlock); + KeLeaveCriticalRegion(); + } + + /* Dereference the object */ + DBG_LOGEVENT(&pobj->slhLog, EVENT_UNLOCK, 0); + GDIOBJ_vDereferenceObject(pobj); +} + +HGDIOBJ +NTAPI +GDIOBJ_hInsertObject( + POBJ pobj, + ULONG ulOwner) +{ + PENTRY pentry; + UCHAR objt; + + /* Must have no handle and only one reference */ + ASSERT(GDI_HANDLE_GET_INDEX(pobj->hHmgr) == 0); + ASSERT(pobj->cExclusiveLock == 0); + ASSERT(pobj->ulShareCount == 1); + + /* Get a free handle entry */ + pentry = ENTRY_pentPopFreeEntry(); + if (!pentry) + { + DPRINT1("GDIOBJ: could not get a free entry.\n"); + return NULL; + } + + /* Make the object exclusively locked */ + ExInitializePushLock(&pobj->pushlock); + KeEnterCriticalRegion(); + ExAcquirePushLockExclusive(&pobj->pushlock); + pobj->cExclusiveLock = 1; + pobj->dwThreadId = PtrToUlong(PsGetCurrentThreadId()); + DBG_INCREASE_LOCK_COUNT(PsGetCurrentProcessWin32Process(), pobj->hHmgr); + + /* Get object type from the hHmgr field */ + objt = ((ULONG_PTR)pobj->hHmgr >> 16) & 0xff; + ASSERT(objt != GDIObjType_DEF_TYPE); + + /* Check if current process is requested owner */ + if (ulOwner == GDI_OBJ_HMGR_POWNED) + { + /* Increment the process handle count */ + IncrementGdiHandleCount(); + + /* Use Process id */ + ulOwner = HandleToUlong(PsGetCurrentProcessId()); + } + + /* Insert the object into the handle table */ + pobj->hHmgr = ENTRY_hInsertObject(pentry, pobj, objt, ulOwner); + + /* Return the handle */ + DPRINT("GDIOBJ: Created handle: %p\n", pobj->hHmgr); + DBG_LOGEVENT(&pobj->slhLog, EVENT_CREATE_HANDLE, 0); + return pobj->hHmgr; +} + +VOID +NTAPI +GDIOBJ_vSetObjectOwner( + POBJ pobj, + ULONG ulOwner) +{ + PENTRY pentry; + + /* This is a ugly hack, need to fix IntGdiSetDCOwnerEx */ + if (GDI_HANDLE_IS_STOCKOBJ(pobj->hHmgr)) + { + DPRINT("Trying to set ownership of stock object %p to %lx\n", pobj->hHmgr, ulOwner); + return; + } + + /* Get the handle entry */ + ASSERT(GDI_HANDLE_GET_INDEX(pobj->hHmgr)); + pentry = &gpentHmgr[GDI_HANDLE_GET_INDEX(pobj->hHmgr)]; + + /* Is the current process requested? */ + if (ulOwner == GDI_OBJ_HMGR_POWNED) + { + /* Use process id */ + ulOwner = HandleToUlong(PsGetCurrentProcessId()); + if (pentry->ObjectOwner.ulObj != ulOwner) + { + IncrementGdiHandleCount(); + } + } + + // HACK + if (ulOwner == GDI_OBJ_HMGR_NONE) + ulOwner = GDI_OBJ_HMGR_PUBLIC; + + if (ulOwner == GDI_OBJ_HMGR_PUBLIC || + ulOwner == GDI_OBJ_HMGR_NONE) + { + /* Make sure we don't leak user mode memory */ + ASSERT(pentry->pUser == NULL); + if (pentry->ObjectOwner.ulObj != GDI_OBJ_HMGR_PUBLIC && + pentry->ObjectOwner.ulObj != GDI_OBJ_HMGR_NONE) + { + DecrementGdiHandleCount(); + } + } + + /* Set new owner */ + pentry->ObjectOwner.ulObj = ulOwner; +} + +/* Locks 2 or 3 objects at a time */ +BOOL +NTAPI +GDIOBJ_bLockMultipleObjects( + IN ULONG ulCount, + IN HGDIOBJ* ahObj, + OUT PGDIOBJ* apObj, + IN UCHAR objt) +{ + UINT auiIndices[3] = {0, 1, 2}; + UINT i, j, tmp; + + ASSERT(ulCount <= 3); + + /* Sort the handles */ + for (i = 0; i < ulCount - 1; i++) + { + for (j = i + 1; j < ulCount; j++) + { + if ((ULONG_PTR)ahObj[auiIndices[i]] < + (ULONG_PTR)ahObj[auiIndices[j]]) + { + tmp = auiIndices[i]; + auiIndices[i] = auiIndices[j]; + auiIndices[j] = tmp; + } + } + } + + /* Lock the objects in safe order */ + for (i = 0; i < ulCount; i++) + { + /* Skip NULL handles */ + if (ahObj[auiIndices[i]] == NULL) + { + apObj[auiIndices[i]] = NULL; + continue; + } + + /* Lock the object */ + apObj[auiIndices[i]] = GDIOBJ_LockObject(ahObj[auiIndices[i]], objt); + + /* Check for failure */ + if (apObj[auiIndices[i]] == NULL) + { + /* Cleanup */ + while (i--) + { + if (apObj[auiIndices[i]]) + GDIOBJ_vUnlockObject(apObj[auiIndices[i]]); + } + return FALSE; + } } return TRUE; } -/*! - * Return pointer to the object by handle. - * - * \param hObj Object handle - * \return Pointer to the object. - * - * \note Process can only get pointer to the objects it created or global objects. - * - * \todo Get rid of the ExpectedType parameter! -*/ -PGDIOBJ INTERNAL_CALL -GDIOBJ_LockObj(HGDIOBJ hObj, DWORD ExpectedType) +PVOID +NTAPI +GDIOBJ_pvGetObjectAttr(POBJ pobj) { - ULONG HandleIndex; - PGDI_TABLE_ENTRY Entry; - HANDLE ProcessId, HandleProcessId, LockedProcessId, PrevProcId; - POBJ Object = NULL; - ULONG HandleType, HandleUpper; - - /* Check for dummy call */ - if(hObj == NULL) - return NULL ; - - GDIDBG_INITLOOPTRACE(); - - HandleIndex = GDI_HANDLE_GET_INDEX(hObj); - HandleType = GDI_HANDLE_GET_TYPE(hObj); - HandleUpper = GDI_HANDLE_GET_UPPER(hObj); - - /* Check that the handle index is valid. */ - if (HandleIndex >= GDI_HANDLE_COUNT ) - return NULL; - - Entry = &GdiHandleTable->Entries[HandleIndex]; - - /* Check if we have the requested type */ - if ( (ExpectedType != GDI_OBJECT_TYPE_DONTCARE && - HandleType != ExpectedType) || - HandleType == 0 ) - { - DPRINT("Attempted to lock object 0x%x of wrong type (Handle: 0x%x, requested: 0x%x)\n", - hObj, HandleType, ExpectedType); - GDIDBG_TRACECALLER(); - GDIDBG_TRACEALLOCATOR(hObj); - GDIDBG_TRACEDELETER(hObj); - return NULL; - } - - ProcessId = (HANDLE)((ULONG_PTR)PsGetCurrentProcessId() & ~1); - - /* - * Prevent the thread from being terminated during the locking process. - * It would result in undesired effects and inconsistency of the global - * handle table. - */ - - KeEnterCriticalRegion(); - - /* - * Loop until we either successfully lock the handle entry & object or - * fail some of the check. - */ - - for (;;) - { - HandleProcessId = (HANDLE)((ULONG_PTR)Entry->ProcessId & ~1); - - /* Check for invalid owner. */ - if (ProcessId != HandleProcessId && HandleProcessId != NULL) - { - DPRINT1("Tried to lock object (0x%p) of wrong owner! ProcessId = %p, HandleProcessId = %p\n", hObj, ProcessId, HandleProcessId); - GDIDBG_TRACECALLER(); - GDIDBG_TRACEALLOCATOR(hObj); - break; - } - - /* Lock the handle table entry. */ - LockedProcessId = (HANDLE)((ULONG_PTR)HandleProcessId | 0x1); - PrevProcId = InterlockedCompareExchangePointer((PVOID*)&Entry->ProcessId, - LockedProcessId, - HandleProcessId); - - if (PrevProcId == HandleProcessId) - { - /* - * We're locking an object that belongs to our process or it's a - * global object if HandleProcessId is 0 here. - */ - - if ( (Entry->KernelData != NULL) && - ((Entry->Type << GDI_ENTRY_UPPER_SHIFT) == HandleUpper) ) - { - PTHREADINFO Thread = (PTHREADINFO)PsGetCurrentThreadWin32Thread(); - Object = Entry->KernelData; - - if (Object->cExclusiveLock == 0) - { - Object->Tid = Thread; - Object->cExclusiveLock = 1; - GDIDBG_CAPTURELOCKER(GDI_HANDLE_GET_INDEX(hObj)) -#if DBG - if (Thread) Thread->cExclusiveLocks++; -#endif - } - else - { - if (Object->Tid != Thread) - { - /* Unlock the handle table entry. */ - (void)InterlockedExchangePointer((PVOID*)&Entry->ProcessId, PrevProcId); - - DelayExecution(); - continue; - } - InterlockedIncrement((PLONG)&Object->cExclusiveLock); -#if DBG - if (Thread) Thread->cExclusiveLocks++; -#endif - } - } - else - { - /* - * Debugging code. Report attempts to lock deleted handles and - * locking type mismatches. - */ - LockErrorDebugOutput(hObj, Entry, "GDIOBJ_LockObj"); - } - - /* Unlock the handle table entry. */ - (void)InterlockedExchangePointer((PVOID*)&Entry->ProcessId, PrevProcId); - - break; - } - else - { - /* - * The handle is currently locked, wait some time and try again. - */ - GDIDBG_TRACELOOP(hObj, PrevProcId, NULL); - - DelayExecution(); - continue; - } - } - - KeLeaveCriticalRegion(); - - return Object; + ULONG ulIndex = GDI_HANDLE_GET_INDEX(pobj->hHmgr); + return gpentHmgr[ulIndex].pUser; } - -/*! - * Return pointer to the object by handle (and allow sharing of the handle - * across threads). - * - * \param hObj Object handle - * \return Pointer to the object. - * - * \note Process can only get pointer to the objects it created or global objects. - * - * \todo Get rid of the ExpectedType parameter! -*/ -PGDIOBJ INTERNAL_CALL -GDIOBJ_ShareLockObj(HGDIOBJ hObj, DWORD ExpectedType) -{ - ULONG HandleIndex; - PGDI_TABLE_ENTRY Entry; - HANDLE ProcessId, HandleProcessId, LockedProcessId, PrevProcId; - POBJ Object = NULL; - ULONG_PTR HandleType, HandleUpper; - - /* Check for dummy call */ - if(hObj == NULL) - return NULL ; - - HandleIndex = GDI_HANDLE_GET_INDEX(hObj); - HandleType = GDI_HANDLE_GET_TYPE(hObj); - HandleUpper = GDI_HANDLE_GET_UPPER(hObj); - - /* Check that the handle index is valid. */ - if (HandleIndex >= GDI_HANDLE_COUNT) - return NULL; - - /* Check if we have the requested type */ - if ( (ExpectedType != GDI_OBJECT_TYPE_DONTCARE && - HandleType != ExpectedType) || - HandleType == 0 ) - { - DPRINT1("Attempted to lock object 0x%x of wrong type (Handle: 0x%x, requested: 0x%x)\n", - hObj, HandleType, ExpectedType); - return NULL; - } - - Entry = &GdiHandleTable->Entries[HandleIndex]; - - ProcessId = (HANDLE)((ULONG_PTR)PsGetCurrentProcessId() & ~1); - HandleProcessId = (HANDLE)((ULONG_PTR)Entry->ProcessId & ~1); - - /* Check for invalid owner. */ - if (ProcessId != HandleProcessId && HandleProcessId != NULL) - { - return NULL; - } - - /* - * Prevent the thread from being terminated during the locking process. - * It would result in undesired effects and inconsistency of the global - * handle table. - */ - - KeEnterCriticalRegion(); - - /* - * Loop until we either successfully lock the handle entry & object or - * fail some of the check. - */ - - for (;;) - { - /* Lock the handle table entry. */ - LockedProcessId = (HANDLE)((ULONG_PTR)HandleProcessId | 0x1); - PrevProcId = InterlockedCompareExchangePointer((PVOID*)&Entry->ProcessId, - LockedProcessId, - HandleProcessId); - - if (PrevProcId == HandleProcessId) - { - /* - * We're locking an object that belongs to our process or it's a - * global object if HandleProcessId is 0 here. - */ - - if ( (Entry->KernelData != NULL) && - (HandleUpper == (Entry->Type << GDI_ENTRY_UPPER_SHIFT)) ) - { - Object = (POBJ)Entry->KernelData; - -GDIDBG_CAPTURESHARELOCKER(HandleIndex); -#ifdef GDI_DEBUG3 - if (InterlockedIncrement((PLONG)&Object->ulShareCount) == 1) - { - memset(GDIHandleLocker[HandleIndex], 0x00, GDI_STACK_LEVELS * sizeof(ULONG)); - RtlCaptureStackBackTrace(1, GDI_STACK_LEVELS, (PVOID*)GDIHandleShareLocker[HandleIndex], NULL); - } -#else - InterlockedIncrement((PLONG)&Object->ulShareCount); -#endif - } - else - { - /* - * Debugging code. Report attempts to lock deleted handles and - * locking type mismatches. - */ - LockErrorDebugOutput(hObj, Entry, "GDIOBJ_ShareLockObj"); - } - - /* Unlock the handle table entry. */ - (void)InterlockedExchangePointer((PVOID*)&Entry->ProcessId, PrevProcId); - - break; - } - else - { - /* - * The handle is currently locked, wait some time and try again. - */ - - DelayExecution(); - continue; - } - } - - KeLeaveCriticalRegion(); - - return Object; -} - -BOOL INTERNAL_CALL -GDIOBJ_OwnedByCurrentProcess(HGDIOBJ ObjectHandle) -{ - PGDI_TABLE_ENTRY Entry; - HANDLE ProcessId; - BOOL Ret; - - DPRINT("GDIOBJ_OwnedByCurrentProcess: ObjectHandle: 0x%08x\n", ObjectHandle); - - if (!GDI_HANDLE_IS_STOCKOBJ(ObjectHandle)) - { - ProcessId = PsGetCurrentProcessId(); - - Entry = GDI_HANDLE_GET_ENTRY(GdiHandleTable, ObjectHandle); - Ret = Entry->KernelData != NULL && - (Entry->Type & GDI_ENTRY_BASETYPE_MASK) != 0 && - (HANDLE)((ULONG_PTR)Entry->ProcessId & ~0x1) == ProcessId; - - return Ret; - } - - return FALSE; -} - -BOOL INTERNAL_CALL -GDIOBJ_ConvertToStockObj(HGDIOBJ *phObj) -{ - /* - * FIXME !!!!! THIS FUNCTION NEEDS TO BE FIXED - IT IS NOT SAFE WHEN OTHER THREADS - * MIGHT ATTEMPT TO LOCK THE OBJECT DURING THIS CALL!!! - */ - PGDI_TABLE_ENTRY Entry; - HANDLE ProcessId, LockedProcessId, PrevProcId; - PTHREADINFO Thread; - HGDIOBJ hObj; - - GDIDBG_INITLOOPTRACE(); - - ASSERT(phObj); - hObj = *phObj; - - DPRINT("GDIOBJ_ConvertToStockObj: hObj: 0x%08x\n", hObj); - - Thread = (PTHREADINFO)PsGetCurrentThreadWin32Thread(); - - if (!GDI_HANDLE_IS_STOCKOBJ(hObj)) - { - ProcessId = PsGetCurrentProcessId(); - LockedProcessId = (HANDLE)((ULONG_PTR)ProcessId | 0x1); - - Entry = GDI_HANDLE_GET_ENTRY(GdiHandleTable, hObj); - -LockHandle: - /* lock the object, we must not convert stock objects, so don't check!!! */ - PrevProcId = InterlockedCompareExchangePointer((PVOID*)&Entry->ProcessId, LockedProcessId, ProcessId); - if (PrevProcId == ProcessId) - { - LONG NewType, PrevType, OldType; - - /* we're locking an object that belongs to our process. First calculate - the new object type including the stock object flag and then try to - exchange it.*/ - /* On Windows the higher 16 bit of the type field don't contain the - full type from the handle, but the base type. - (type = BRSUH, PEN, EXTPEN, basetype = BRUSH) */ - OldType = ((ULONG)hObj & GDI_HANDLE_BASETYPE_MASK) | ((ULONG)hObj >> GDI_ENTRY_UPPER_SHIFT); - /* We are currently not using bits 24..31 (flags) of the type field, but for compatibility - we copy them as we can't get them from the handle */ - OldType |= Entry->Type & GDI_ENTRY_FLAGS_MASK; - - /* As the object should be a stock object, set it's flag, but only in the lower 16 bits */ - NewType = OldType | GDI_ENTRY_STOCK_MASK; - - /* Try to exchange the type field - but only if the old (previous type) matches! */ - PrevType = InterlockedCompareExchange(&Entry->Type, NewType, OldType); - if (PrevType == OldType && Entry->KernelData != NULL) - { - PTHREADINFO PrevThread; - POBJ Object; - - /* We successfully set the stock object flag. - KernelData should never be NULL here!!! */ - ASSERT(Entry->KernelData); - - Object = Entry->KernelData; - - PrevThread = Object->Tid; - if (Object->cExclusiveLock == 0 || PrevThread == Thread) - { - /* dereference the process' object counter */ - if (PrevProcId != GDI_GLOBAL_PROCESS) - { - PEPROCESS OldProcess; - PPROCESSINFO W32Process; - NTSTATUS Status; - - /* FIXME */ - Status = PsLookupProcessByProcessId((HANDLE)((ULONG_PTR)PrevProcId & ~0x1), &OldProcess); - if (NT_SUCCESS(Status)) - { - W32Process = (PPROCESSINFO)OldProcess->Win32Process; - if (W32Process != NULL) - { - InterlockedDecrement(&W32Process->GDIHandleCount); - } - ObDereferenceObject(OldProcess); - } - } - - hObj = (HGDIOBJ)((ULONG)(hObj) | GDI_HANDLE_STOCK_MASK); - *phObj = hObj; - Object->hHmgr = hObj; - - /* remove the process id lock and make it global */ - (void)InterlockedExchangePointer((PVOID*)&Entry->ProcessId, GDI_GLOBAL_PROCESS); - - /* we're done, successfully converted the object */ - return TRUE; - } - else - { - GDIDBG_TRACELOOP(hObj, PrevThread, Thread); - - /* WTF?! The object is already locked by a different thread! - Release the lock, wait a bit and try again! - FIXME - we should give up after some time unless we want to wait forever! */ - (void)InterlockedExchangePointer((PVOID*)&Entry->ProcessId, PrevProcId); - - DelayExecution(); - goto LockHandle; - } - } - else - { - DPRINT1("Attempted to convert object 0x%x that is deleted! Should never get here!!!\n", hObj); - DPRINT1("OldType = 0x%x, Entry->Type = 0x%x, NewType = 0x%x, Entry->KernelData = 0x%x\n", OldType, Entry->Type, NewType, Entry->KernelData); - } - } - else if (PrevProcId == LockedProcessId) - { - GDIDBG_TRACELOOP(hObj, PrevProcId, ProcessId); - - /* the object is currently locked, wait some time and try again. - FIXME - we shouldn't loop forever! Give up after some time! */ - DelayExecution(); - /* try again */ - goto LockHandle; - } - else - { - DPRINT1("Attempted to convert invalid handle: 0x%x\n", hObj); - } - } - - return FALSE; -} - -BOOL INTERNAL_CALL -GDIOBJ_SetOwnership(HGDIOBJ ObjectHandle, PEPROCESS NewOwner) -{ - PGDI_TABLE_ENTRY Entry; - HANDLE ProcessId, LockedProcessId, PrevProcId; - PTHREADINFO Thread; - BOOL Ret = TRUE; - - GDIDBG_INITLOOPTRACE(); - - DPRINT("GDIOBJ_SetOwnership: hObj: 0x%x, NewProcess: 0x%x\n", ObjectHandle, (NewOwner ? PsGetProcessId(NewOwner) : 0)); - - Thread = (PTHREADINFO)PsGetCurrentThreadWin32Thread(); - - if (!GDI_HANDLE_IS_STOCKOBJ(ObjectHandle)) - { - ProcessId = PsGetCurrentProcessId(); - LockedProcessId = (HANDLE)((ULONG_PTR)ProcessId | 0x1); - - Entry = GDI_HANDLE_GET_ENTRY(GdiHandleTable, ObjectHandle); - -LockHandle: - /* lock the object, we must not convert stock objects, so don't check!!! */ - PrevProcId = InterlockedCompareExchangePointer((PVOID*)&Entry->ProcessId, ProcessId, LockedProcessId); - if (PrevProcId == ProcessId) - { - PTHREADINFO PrevThread; - - if ((Entry->Type & GDI_ENTRY_BASETYPE_MASK) != 0) - { - POBJ Object = Entry->KernelData; - - PrevThread = Object->Tid; - if (Object->cExclusiveLock == 0 || PrevThread == Thread) - { - PEPROCESS OldProcess; - PPROCESSINFO W32Process; - NTSTATUS Status; - - if (NewOwner != NULL) - { - ProcessId = PsGetProcessId(NewOwner); - } - else - ProcessId = 0; - - if((ULONG_PTR)ProcessId == ((ULONG_PTR)PrevProcId & ~0x1)) - { - DPRINT("Setting same process than previous one, nothing to do\n"); - goto done; - } - - /* dereference the process' object counter */ - /* FIXME */ - if ((ULONG_PTR)PrevProcId & ~0x1) - { - Status = PsLookupProcessByProcessId((HANDLE)((ULONG_PTR)PrevProcId & ~0x1), &OldProcess); - if (NT_SUCCESS(Status)) - { - W32Process = (PPROCESSINFO)OldProcess->Win32Process; - if (W32Process != NULL) - { - InterlockedDecrement(&W32Process->GDIHandleCount); - } - ObDereferenceObject(OldProcess); - } - } - - if (NewOwner != NULL) - { - /* Increase the new process' object counter */ - W32Process = (PPROCESSINFO)NewOwner->Win32Process; - if (W32Process != NULL) - { - InterlockedIncrement(&W32Process->GDIHandleCount); - } - } - - done: - /* remove the process id lock and change it to the new process id */ - (void)InterlockedExchangePointer((PVOID*)&Entry->ProcessId, ProcessId); - - /* we're done! */ - return Ret; - } - else - { - GDIDBG_TRACELOOP(ObjectHandle, PrevThread, Thread); - - /* WTF?! The object is already locked by a different thread! - Release the lock, wait a bit and try again! DO reset the pid lock - so we make sure we don't access invalid memory in case the object is - being deleted in the meantime (because we don't have aquired a reference - at this point). - FIXME - we should give up after some time unless we want to wait forever! */ - (void)InterlockedExchangePointer((PVOID*)&Entry->ProcessId, PrevProcId); - - DelayExecution(); - goto LockHandle; - } - } - else - { - DPRINT1("Attempted to change ownership of an object 0x%x currently being destroyed!!!\n", ObjectHandle); - DPRINT1("Entry->Type = 0x%lx, Entry->KernelData = 0x%p\n", Entry->Type, Entry->KernelData); - Ret = FALSE; - } - } - else if (PrevProcId == LockedProcessId) - { - GDIDBG_TRACELOOP(ObjectHandle, PrevProcId, ProcessId); - - /* the object is currently locked, wait some time and try again. - FIXME - we shouldn't loop forever! Give up after some time! */ - DelayExecution(); - /* try again */ - goto LockHandle; - } - else if (((ULONG_PTR)PrevProcId & ~0x1) == 0) - { - /* allow changing ownership of global objects */ - ProcessId = NULL; - LockedProcessId = (HANDLE)((ULONG_PTR)ProcessId | 0x1); - goto LockHandle; - } - else if ((HANDLE)((ULONG_PTR)PrevProcId & ~0x1) != PsGetCurrentProcessId()) - { - DPRINT1("Attempted to change ownership of object 0x%x (pid: 0x%x) from pid 0x%x!!!\n", ObjectHandle, (ULONG_PTR)PrevProcId & ~0x1, PsGetCurrentProcessId()); - Ret = FALSE; - } - else - { - DPRINT1("Attempted to change owner of invalid handle: 0x%x\n", ObjectHandle); - Ret = FALSE; - } - } - return Ret; -} - -BOOL INTERNAL_CALL -GDIOBJ_CopyOwnership(HGDIOBJ CopyFrom, HGDIOBJ CopyTo) -{ - PGDI_TABLE_ENTRY FromEntry; - PTHREADINFO Thread; - HANDLE FromProcessId, FromLockedProcessId, FromPrevProcId; - BOOL Ret = TRUE; - - GDIDBG_INITLOOPTRACE(); - - DPRINT("GDIOBJ_CopyOwnership: from: 0x%x, to: 0x%x\n", CopyFrom, CopyTo); - - Thread = (PTHREADINFO)PsGetCurrentThreadWin32Thread(); - - if (!GDI_HANDLE_IS_STOCKOBJ(CopyFrom) && !GDI_HANDLE_IS_STOCKOBJ(CopyTo)) - { - FromEntry = GDI_HANDLE_GET_ENTRY(GdiHandleTable, CopyFrom); - - FromProcessId = (HANDLE)((ULONG_PTR)FromEntry->ProcessId & ~0x1); - FromLockedProcessId = (HANDLE)((ULONG_PTR)FromProcessId | 0x1); - -LockHandleFrom: - /* lock the object, we must not convert stock objects, so don't check!!! */ - FromPrevProcId = InterlockedCompareExchangePointer((PVOID*)&FromEntry->ProcessId, FromProcessId, FromLockedProcessId); - if (FromPrevProcId == FromProcessId) - { - PTHREADINFO PrevThread; - POBJ Object; - - if ((FromEntry->Type & GDI_ENTRY_BASETYPE_MASK) != 0) - { - Object = FromEntry->KernelData; - - /* save the pointer to the calling thread so we know it was this thread - that locked the object */ - PrevThread = Object->Tid; - if (Object->cExclusiveLock == 0 || PrevThread == Thread) - { - /* now let's change the ownership of the target object */ - - if (((ULONG_PTR)FromPrevProcId & ~0x1) != 0) - { - PEPROCESS ProcessTo; - /* FIXME */ - if (NT_SUCCESS(PsLookupProcessByProcessId((HANDLE)((ULONG_PTR)FromPrevProcId & ~0x1), &ProcessTo))) - { - GDIOBJ_SetOwnership(CopyTo, ProcessTo); - ObDereferenceObject(ProcessTo); - } - } - else - { - /* mark the object as global */ - GDIOBJ_SetOwnership(CopyTo, NULL); - } - - (void)InterlockedExchangePointer((PVOID*)&FromEntry->ProcessId, FromPrevProcId); - } - else - { - GDIDBG_TRACELOOP(CopyFrom, PrevThread, Thread); - - /* WTF?! The object is already locked by a different thread! - Release the lock, wait a bit and try again! DO reset the pid lock - so we make sure we don't access invalid memory in case the object is - being deleted in the meantime (because we don't have aquired a reference - at this point). - FIXME - we should give up after some time unless we want to wait forever! */ - (void)InterlockedExchangePointer((PVOID*)&FromEntry->ProcessId, FromPrevProcId); - - DelayExecution(); - goto LockHandleFrom; - } - } - else - { - DPRINT1("Attempted to copy ownership from an object 0x%x currently being destroyed!!!\n", CopyFrom); - Ret = FALSE; - } - } - else if (FromPrevProcId == FromLockedProcessId) - { - GDIDBG_TRACELOOP(CopyFrom, FromPrevProcId, FromProcessId); - - /* the object is currently locked, wait some time and try again. - FIXME - we shouldn't loop forever! Give up after some time! */ - DelayExecution(); - /* try again */ - goto LockHandleFrom; - } - else if ((HANDLE)((ULONG_PTR)FromPrevProcId & ~0x1) != PsGetCurrentProcessId()) - { - /* FIXME - should we really allow copying ownership from objects that we don't even own? */ - DPRINT1("WARNING! Changing copying ownership of object 0x%x (pid: 0x%x) to pid 0x%x!!!\n", CopyFrom, (ULONG_PTR)FromPrevProcId & ~0x1, PsGetCurrentProcessId()); - FromProcessId = (HANDLE)((ULONG_PTR)FromPrevProcId & ~0x1); - FromLockedProcessId = (HANDLE)((ULONG_PTR)FromProcessId | 0x1); - goto LockHandleFrom; - } - else - { - DPRINT1("Attempted to copy ownership from invalid handle: 0x%x\n", CopyFrom); - Ret = FALSE; - } - } - return Ret; -} - -PVOID INTERNAL_CALL -GDI_MapHandleTable(PEPROCESS Process) -{ - PVOID MappedView = NULL; - NTSTATUS Status; - LARGE_INTEGER Offset; - ULONG ViewSize = sizeof(GDI_HANDLE_TABLE); - - Offset.QuadPart = 0; - - ASSERT(GdiTableSection != NULL); - ASSERT(Process != NULL); - - Status = MmMapViewOfSection(GdiTableSection, - Process, - &MappedView, - 0, - 0, - &Offset, - &ViewSize, - ViewUnmap, - SEC_NO_CHANGE, - PAGE_READONLY); - - if (!NT_SUCCESS(Status)) - return NULL; - - return MappedView; -} - -/* Locks 2 or 3 objects at a time */ VOID -INTERNAL_CALL -GDIOBJ_LockMultipleObjs(ULONG ulCount, - IN HGDIOBJ* ahObj, - OUT PGDIOBJ* apObj) +NTAPI +GDIOBJ_vSetObjectAttr(POBJ pobj, PVOID pvObjAttr) { - UINT auiIndices[3] = {0,1,2}; - UINT i, tmp ; - BOOL bUnsorted = TRUE; + ULONG ulIndex; - /* First is greatest */ - while(bUnsorted) + ASSERT(pobj->hHmgr); + + /* Get the handle index */ + ulIndex = GDI_HANDLE_GET_INDEX(pobj->hHmgr); + + /* Set pointer to the usermode attribute */ + gpentHmgr[ulIndex].pUser = pvObjAttr; +} + +VOID +NTAPI +GDIOBJ_vDeleteObject(POBJ pobj) +{ + ULONG ulIndex; + + /* Set the object's delete flag */ + InterlockedOr16((SHORT*)&pobj->BaseFlags, BASEFLAG_READY_TO_DIE); + DBG_LOGEVENT(&pobj->slhLog, EVENT_DELETE, 0); + + /* Get the handle index */ + ulIndex = GDI_HANDLE_GET_INDEX(pobj->hHmgr); + if (ulIndex) { - bUnsorted = FALSE; - for(i=1; icExclusiveLock != 0) { - if((ULONG_PTR)ahObj[auiIndices[i-1]] < (ULONG_PTR)ahObj[auiIndices[i]]) - { - tmp = auiIndices[i-1]; - auiIndices[i-1] = auiIndices[i]; - auiIndices[i] = tmp; - bUnsorted = TRUE; - } + /* Reset lock owner and lock count */ + pobj->dwThreadId = 0; + pobj->cExclusiveLock = 0; + + /* Release the pushlock and reenable APCs */ + ExReleasePushLockExclusive(&pobj->pushlock); + KeLeaveCriticalRegion(); } } - for(i=0;iEntries[GDI_HANDLE_GET_INDEX(Handle)]; - - if (pEntry->ObjectType == ObjType) - { - if (pEntry->FullUnique == (GDI_HANDLE_GET_UPPER(Handle) >> GDI_ENTRY_UPPER_SHIFT)) - Ret = pEntry->ProcessId & ~1; - } - } - return Ret; -} - -W32KAPI -HANDLE -APIENTRY -NtGdiCreateClientObj( - IN ULONG ulType -) -{ - POBJ pObject; - HANDLE handle; - - /* Mask out everything that would change the type in a wrong manner */ - ulType &= (GDI_HANDLE_TYPE_MASK & ~GDI_HANDLE_BASETYPE_MASK); - - /* Allocate a new object */ - pObject = GDIOBJ_AllocObjWithHandle(GDI_OBJECT_TYPE_CLIOBJ | ulType); - if (!pObject) - { - return NULL; - } - - /* get the handle */ - handle = pObject->hHmgr; - - /* Unlock it */ - GDIOBJ_UnlockObjByPtr(pObject); - - return handle; -} - -W32KAPI BOOL -APIENTRY -NtGdiDeleteClientObj( - IN HANDLE h -) +NTAPI +GreIsHandleValid(HGDIOBJ hobj) { - /* We first need to get the real type from the handle */ - ULONG type = GDI_HANDLE_GET_TYPE(h); + PENTRY pentry; - /* Check if it's really a CLIENTOBJ */ - if ((type & GDI_HANDLE_BASETYPE_MASK) != GDILoObjType_LO_CLIENTOBJ_TYPE) + pentry = ENTRY_ReferenceEntryByHandle(hobj, GDIOBJFLAG_IGNOREPID); + if (!pentry) return FALSE; + GDIOBJ_vDereferenceObject(pentry->einfo.pobj); + return TRUE; +} + +BOOL +NTAPI +GreDeleteObject(HGDIOBJ hobj) +{ + PENTRY pentry; + + /* Check for stock objects */ + if (GDI_HANDLE_IS_STOCKOBJ(hobj)) { - /* FIXME: SetLastError? */ + DPRINT1("GreDeleteObject: Cannot delete stock object %p.\n", hobj); return FALSE; } - return GDIOBJ_FreeObjByHandle(h, type); + + /* Reference the handle entry */ + pentry = ENTRY_ReferenceEntryByHandle(hobj, 0); + if (!pentry) + { + DPRINT1("GreDeleteObject: Trying to delete invalid object %p\n", hobj); + return FALSE; + } + + /* Check for public owner */ + if (pentry->ObjectOwner.ulObj == GDI_OBJ_HMGR_PUBLIC) + { + DPRINT1("GreDeleteObject: Trying to delete global object %p\n", hobj); + GDIOBJ_vDereferenceObject(pentry->einfo.pobj); + return FALSE; + } + + /* Delete the object */ + GDIOBJ_vDeleteObject(pentry->einfo.pobj); + return TRUE; +} + +ULONG +NTAPI +GreGetObjectOwner(HGDIOBJ hobj) +{ + ULONG ulIndex, ulOwner; + + /* Get the handle index */ + ulIndex = GDI_HANDLE_GET_INDEX(hobj); + + /* Check if the handle is valid */ + if (ulIndex >= GDI_HANDLE_COUNT || + gpentHmgr[ulIndex].Objt == GDIObjType_DEF_TYPE || + ((ULONG_PTR)hobj >> 16) != gpentHmgr[ulIndex].FullUnique) + { + DPRINT1("GreGetObjectOwner: invalid handle 0x%p.\n", hobj); + return GDI_OBJ_HMGR_RESTRICTED; + } + + /* Get the object owner */ + ulOwner = gpentHmgr[ulIndex].ObjectOwner.ulObj; + + if (ulOwner == HandleToUlong(PsGetCurrentProcessId())) + return GDI_OBJ_HMGR_POWNED; + + if (ulOwner == GDI_OBJ_HMGR_PUBLIC) + return GDI_OBJ_HMGR_PUBLIC; + + return GDI_OBJ_HMGR_RESTRICTED; +} + +BOOL +NTAPI +GreSetObjectOwner( + HGDIOBJ hobj, + ULONG ulOwner) +{ + PENTRY pentry; + + /* Check for stock objects */ + if (GDI_HANDLE_IS_STOCKOBJ(hobj)) + { + DPRINT("GreSetObjectOwner: got stock object %p\n", hobj); + return FALSE; + } + + /* Reference the handle entry */ + pentry = ENTRY_ReferenceEntryByHandle(hobj, 0); + if (!pentry) + { + DPRINT("GreSetObjectOwner: invalid handle 0x%p.\n", hobj); + return FALSE; + } + + /* Call internal function */ + GDIOBJ_vSetObjectOwner(pentry->einfo.pobj, ulOwner); + + /* Dereference the object */ + GDIOBJ_vDereferenceObject(pentry->einfo.pobj); + + return TRUE; } INT -FASTCALL -IntGdiGetObject(IN HANDLE Handle, - IN INT cbCount, - IN LPVOID lpBuffer) +NTAPI +GreGetObject( + IN HGDIOBJ hobj, + IN INT cbCount, + IN PVOID pvBuffer) { - PVOID pGdiObject; - INT Result = 0; - DWORD dwObjectType; + PVOID pvObj; + UCHAR objt; + INT iResult = 0; - pGdiObject = GDIOBJ_LockObj(Handle, GDI_OBJECT_TYPE_DONTCARE); - if (!pGdiObject) + /* Verify object type */ + objt = ((ULONG_PTR)hobj >> 16) & 0x1f; + if (objt != GDIObjType_BRUSH_TYPE && + objt != GDIObjType_SURF_TYPE && + objt != GDIObjType_LFONT_TYPE && + objt != GDIObjType_PAL_TYPE) { - EngSetLastError(ERROR_INVALID_HANDLE); - return 0; + DPRINT1("GreGetObject: invalid object type\n"); + return 0; } - dwObjectType = GDIOBJ_GetObjectType(Handle); - switch (dwObjectType) + pvObj = GDIOBJ_ReferenceObjectByHandle(hobj, objt); + if (!pvObj) { - case GDI_OBJECT_TYPE_PEN: - case GDI_OBJECT_TYPE_EXTPEN: - Result = PEN_GetObject((PBRUSH) pGdiObject, cbCount, (PLOGPEN) lpBuffer); // IntGdiCreatePenIndirect - break; + DPRINT("GreGetObject: Could not lock object\n"); + EngSetLastError(ERROR_INVALID_HANDLE); + return 0; + } - case GDI_OBJECT_TYPE_BRUSH: - Result = BRUSH_GetObject((PBRUSH ) pGdiObject, cbCount, (LPLOGBRUSH)lpBuffer); - break; + switch (GDI_HANDLE_GET_TYPE(hobj)) + { + case GDILoObjType_LO_PEN_TYPE: + case GDILoObjType_LO_EXTPEN_TYPE: + iResult = PEN_GetObject(pvObj, cbCount, pvBuffer); + break; - case GDI_OBJECT_TYPE_BITMAP: - Result = BITMAP_GetObject((SURFACE *) pGdiObject, cbCount, lpBuffer); - break; - case GDI_OBJECT_TYPE_FONT: - Result = FontGetObject((PTEXTOBJ) pGdiObject, cbCount, lpBuffer); + case GDILoObjType_LO_BRUSH_TYPE: + iResult = BRUSH_GetObject(pvObj, cbCount, pvBuffer); + break; + + case GDILoObjType_LO_BITMAP_TYPE: + iResult = BITMAP_GetObject(pvObj, cbCount, pvBuffer); + break; + case GDILoObjType_LO_FONT_TYPE: + iResult = FontGetObject(pvObj, cbCount, pvBuffer); #if 0 - // Fix the LOGFONT structure for the stock fonts - if (FIRST_STOCK_HANDLE <= Handle && Handle <= LAST_STOCK_HANDLE) - { - FixStockFontSizeW(Handle, cbCount, lpBuffer); - } + // Fix the LOGFONT structure for the stock fonts + if (FIRST_STOCK_HANDLE <= hobj && hobj <= LAST_STOCK_HANDLE) + { + FixStockFontSizeW(hobj, cbCount, pvBuffer); + } #endif - break; + break; - case GDI_OBJECT_TYPE_PALETTE: - Result = PALETTE_GetObject((PPALETTE) pGdiObject, cbCount, lpBuffer); - break; + case GDILoObjType_LO_PALETTE_TYPE: + iResult = PALETTE_GetObject(pvObj, cbCount, pvBuffer); + break; - default: - DPRINT1("GDI object type 0x%08x not implemented\n", dwObjectType); - break; + default: + DPRINT1("GDI object type of 0x%p not implemented\n", hobj); + break; } - GDIOBJ_UnlockObjByPtr(pGdiObject); - - return Result; + GDIOBJ_vDereferenceObject(pvObj); + return iResult; } - - W32KAPI INT APIENTRY -NtGdiExtGetObjectW(IN HANDLE hGdiObj, - IN INT cbCount, - OUT LPVOID lpBuffer) +NtGdiExtGetObjectW( + IN HANDLE hobj, + IN INT cbCount, + OUT LPVOID lpBuffer) { INT iRetCount = 0; INT cbCopyCount; @@ -1874,35 +1081,261 @@ NtGdiExtGetObjectW(IN HANDLE hGdiObj, LOGFONTW logfontw; EXTLOGFONTW extlogfontw; ENUMLOGFONTEXDVW enumlogfontexdvw; - } Object; + } object; - // Normalize to the largest supported object size - cbCount = min((UINT)cbCount, sizeof(Object)); + /* Normalize to the largest supported object size */ + cbCount = min((UINT)cbCount, sizeof(object)); - // Now do the actual call - iRetCount = IntGdiGetObject(hGdiObj, cbCount, lpBuffer ? &Object : NULL); + /* Now do the actual call */ + iRetCount = GreGetObject(hobj, cbCount, lpBuffer ? &object : NULL); cbCopyCount = min((UINT)cbCount, (UINT)iRetCount); - // Make sure we have a buffer and a copy size + /* Make sure we have a buffer and a copy size */ if ((cbCopyCount) && (lpBuffer)) { - // Enter SEH for buffer transfer + /* Enter SEH for buffer transfer */ _SEH2_TRY { // Probe the buffer and copy it ProbeForWrite(lpBuffer, cbCopyCount, sizeof(WORD)); - RtlCopyMemory(lpBuffer, &Object, cbCopyCount); + RtlCopyMemory(lpBuffer, &object, cbCopyCount); } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { - // Clear the return value. - // Do *NOT* set last error here! + /* Clear the return value. + * Do *NOT* set last error here! */ iRetCount = 0; } _SEH2_END; } - // Return the count + + /* Return the count */ return iRetCount; } -/* EOF */ +W32KAPI +HANDLE +APIENTRY +NtGdiCreateClientObj( + IN ULONG ulType) +{ + POBJ pObject; + HANDLE handle; + + /* Allocate a new object */ + pObject = GDIOBJ_AllocateObject(GDIObjType_CLIENTOBJ_TYPE, + sizeof(CLIENTOBJ), + BASEFLAG_LOOKASIDE); + if (!pObject) + { + DPRINT1("NtGdiCreateClientObj: Could not allocate a clientobj.\n"); + return NULL; + } + + /* Mask out everything that would change the type in a wrong manner */ + ulType &= (GDI_HANDLE_TYPE_MASK & ~GDI_HANDLE_BASETYPE_MASK); + + /* Set the real object type */ + pObject->hHmgr = UlongToHandle(ulType | GDILoObjType_LO_CLIENTOBJ_TYPE); + + /* Create a handle */ + handle = GDIOBJ_hInsertObject(pObject, GDI_OBJ_HMGR_POWNED); + if (!handle) + { + DPRINT1("NtGdiCreateClientObj Could not create a handle.\n"); + GDIOBJ_vFreeObject(pObject); + return NULL; + } + + /* Unlock it */ + GDIOBJ_vUnlockObject(pObject); + + return handle; +} + +W32KAPI +BOOL +APIENTRY +NtGdiDeleteClientObj( + IN HANDLE hobj) +{ + /* We first need to get the real type from the handle */ + ULONG ulType = GDI_HANDLE_GET_TYPE(hobj); + + /* Check if it's really a CLIENTOBJ */ + if ((ulType & GDI_HANDLE_BASETYPE_MASK) != GDILoObjType_LO_CLIENTOBJ_TYPE) + { + /* FIXME: SetLastError? */ + return FALSE; + } + + return GreDeleteObject(hobj); +} + + + +PGDI_HANDLE_TABLE GdiHandleTable = NULL; + +PGDIOBJ INTERNAL_CALL +GDIOBJ_ShareLockObj(HGDIOBJ hObj, DWORD ExpectedType) +{ + if (ExpectedType == GDI_OBJECT_TYPE_DONTCARE) + ExpectedType = GDI_HANDLE_GET_TYPE(hObj); + return GDIOBJ_ReferenceObjectByHandle(hObj, (ExpectedType >> 16) & 0x1f); +} + +// This function is not safe to use with concurrent deleting attempts +// That shouldn't be a problem, since we don't have any processes yet, +// that could delete the handle +BOOL +INTERNAL_CALL +GDIOBJ_ConvertToStockObj(HGDIOBJ *phObj) +{ + PENTRY pentry; + POBJ pobj; + + /* Reference the handle entry */ + pentry = ENTRY_ReferenceEntryByHandle(*phObj, 0); + if (!pentry) + { + DPRINT1("GDIOBJ: requested handle 0x%p is not valid.\n", *phObj); + return FALSE; + } + + /* Update the entry */ + pentry->FullUnique |= GDI_ENTRY_STOCK_MASK; + pentry->ObjectOwner.ulObj = 0; + + /* Get the pointer to the BASEOBJECT */ + pobj = pentry->einfo.pobj; + + /* Calculate the new handle */ + pobj->hHmgr = (HGDIOBJ)((ULONG_PTR)pobj->hHmgr | GDI_HANDLE_STOCK_MASK); + + /* Return the new handle */ + *phObj = pobj->hHmgr; + + /* Dereference the handle */ + GDIOBJ_vDereferenceObject(pobj); + + return TRUE; +} + +POBJ INTERNAL_CALL +GDIOBJ_AllocObjWithHandle(ULONG ObjectType, ULONG cjSize) +{ + POBJ pobj; + FLONG fl = 0; + UCHAR objt = ObjectType >> 16; + + if ((objt == GDIObjType_DC_TYPE && cjSize == sizeof(DC)) || + (objt == GDIObjType_PAL_TYPE && cjSize == sizeof(PALETTE)) || + (objt == GDIObjType_RGN_TYPE && cjSize == sizeof(REGION)) || + (objt == GDIObjType_SURF_TYPE && cjSize == sizeof(SURFACE)) || + (objt == GDIObjType_PATH_TYPE && cjSize == sizeof(PATH))) + { + fl |= BASEFLAG_LOOKASIDE; + } + + pobj = GDIOBJ_AllocateObject(objt, cjSize, fl); + if (!GDIOBJ_hInsertObject(pobj, GDI_OBJ_HMGR_POWNED)) + { + GDIOBJ_vFreeObject(pobj); + return NULL; + } + return pobj; +} + +PVOID INTERNAL_CALL +GDI_MapHandleTable(PEPROCESS pProcess) +{ + PVOID pvMappedView = NULL; + NTSTATUS Status; + LARGE_INTEGER liOffset; + ULONG cjViewSize = sizeof(GDI_HANDLE_TABLE); + + liOffset.QuadPart = 0; + + ASSERT(gpvGdiHdlTblSection != NULL); + ASSERT(pProcess != NULL); + + Status = MmMapViewOfSection(gpvGdiHdlTblSection, + pProcess, + &pvMappedView, + 0, + 0, + &liOffset, + &cjViewSize, + ViewUnmap, + SEC_NO_CHANGE, + PAGE_READONLY); + + if (!NT_SUCCESS(Status)) + return NULL; + + return pvMappedView; +} + +BOOL INTERNAL_CALL +GDI_CleanupForProcess(struct _EPROCESS *Process) +{ + PENTRY pentry; + ULONG ulIndex; + DWORD dwProcessId; + PPROCESSINFO ppi; + + DPRINT("CleanupForProcess prochandle %x Pid %d\n", + Process, Process->UniqueProcessId); + + ASSERT(Process == PsGetCurrentProcess()); + + /* Get the current process Id */ + dwProcessId = PtrToUlong(PsGetCurrentProcessId()); + + /* Loop all handles in the handle table */ + for (ulIndex = RESERVE_ENTRIES_COUNT; ulIndex < gulFirstUnused; ulIndex++) + { + pentry = &gpentHmgr[ulIndex]; + + /* Check if the object is owned by the process */ + if (pentry->ObjectOwner.ulObj == dwProcessId) + { + ASSERT(pentry->einfo.pobj->cExclusiveLock == 0); + + /* Reference the object and delete it */ + InterlockedIncrement((LONG*)&gpaulRefCount[ulIndex]); + GDIOBJ_vDeleteObject(pentry->einfo.pobj); + } + } + +//#ifdef GDI_DEBUG + DbgGdiHTIntegrityCheck(); +//#endif + + ppi = PsGetCurrentProcessWin32Process(); + DPRINT("Completed cleanup for process %d\n", Process->UniqueProcessId); + if (ppi->GDIHandleCount != 0) + { + DPRINT1("Leaking %d handles!\n", ppi->GDIHandleCount); + ASSERT(FALSE); + } + + /* Loop all handles in the handle table */ + for (ulIndex = RESERVE_ENTRIES_COUNT; ulIndex < gulFirstUnused; ulIndex++) + { + pentry = &gpentHmgr[ulIndex]; + + /* Check if the object is owned by the process */ + if (pentry->ObjectOwner.ulObj == dwProcessId) + { + DPRINT1("Leaking object. Index=%lx, type=0x%x, refcount=%lx\n", + ulIndex, pentry->Objt, gpaulRefCount[ulIndex]); + DBG_DUMP_EVENT_LIST(&pentry->einfo.pobj->slhLog); + //DBG_CLEANUP_EVENT_LIST(&pentry->einfo.pobj->slhLog); + ASSERT(FALSE); + } + } + + return TRUE; +} + diff --git a/reactos/subsystems/win32/win32k/objects/gdipool.c b/reactos/subsystems/win32/win32k/objects/gdipool.c index ebe81f25208..c78c789e215 100644 --- a/reactos/subsystems/win32/win32k/objects/gdipool.c +++ b/reactos/subsystems/win32/win32k/objects/gdipool.c @@ -1,7 +1,7 @@ /* * PROJECT: ReactOS win32 kernel mode subsystem * LICENSE: GPL - See COPYING in the top level directory - * FILE: subsystems/win32/win32k/objects/gdiobj.c + * FILE: subsystems/win32/win32k/objects/gdipool.c * PURPOSE: Static size allocator for user mode object attributes * PROGRAMMERS: Timo Kreuzer */ @@ -34,6 +34,9 @@ typedef struct _GDI_POOL ULONG cSlotsPerSection; ULONG cEmptySections; EX_PUSH_LOCK pushlock; // for pool growth +#if DBG_ENABLE_EVENT_LOGGING + SLIST_HEADER slhLog; +#endif LIST_ENTRY leInUseList; LIST_ENTRY leEmptyList; @@ -95,7 +98,13 @@ GdiPoolDeleteSection(PGDI_POOL pPool, PGDI_POOL_SECTION pSection) SIZE_T cjSize = 0; /* Should not have any allocations */ - ASSERT(pSection->cAllocCount == 0); + if (pSection->cAllocCount != 0) + { + DPRINT1("There are %ld allocations left, section=%p, pool=%p\n", + pSection->cAllocCount, pSection, pPool); + DBG_DUMP_EVENT_LIST(&pPool->slhLog); + ASSERT(FALSE); + } /* Release the virtual memory */ status = ZwFreeVirtualMemory(NtCurrentProcess(), @@ -186,8 +195,11 @@ GdiPoolAllocate( pSection->ulCommitBitmap |= ulPageBit; } - /* Increase alloc count and check if section is now busy */ + /* Increase alloc count */ pSection->cAllocCount++; + DBG_LOGEVENT(&pPool->slhLog, EVENT_ALLOCATE, pvAlloc); + + /* Check if section is now busy */ if (pSection->cAllocCount == pPool->cSlotsPerSection) { /* Remove the section from the ready list */ @@ -198,12 +210,11 @@ done: /* Release the pool lock and enable APCs */ ExReleasePushLockExclusive(&pPool->pushlock); KeLeaveCriticalRegion(); -DPRINT1("GdiPoolallocate: %p\n", pvAlloc); + DPRINT("GdiPoolallocate: %p\n", pvAlloc); return pvAlloc; } - VOID NTAPI GdiPoolFree( @@ -211,10 +222,10 @@ GdiPoolFree( PVOID pvAlloc) { PLIST_ENTRY ple; - PGDI_POOL_SECTION pSection; + PGDI_POOL_SECTION pSection = NULL; ULONG_PTR cjOffset; ULONG ulIndex; -DPRINT1("GdiPoolFree: %p\n", pvAlloc); + DPRINT("GdiPoolFree: %p\n", pvAlloc); /* Disable APCs and acquire the pool lock */ KeEnterCriticalRegion(); @@ -243,6 +254,7 @@ DPRINT1("GdiPoolFree: %p\n", pvAlloc); /* Decrease allocation count */ pSection->cAllocCount--; + DBG_LOGEVENT(&pPool->slhLog, EVENT_FREE, pvAlloc); /* Check if the section got valid now */ if (pSection->cAllocCount == pPool->cSlotsPerSection - 1) @@ -274,6 +286,8 @@ DPRINT1("GdiPoolFree: %p\n", pvAlloc); } } + DbgPrint("failed to free. pvAlloc=%p, base=%p, size=%lx\n", + pvAlloc, pSection->pvBaseAddress, pPool->cjSectionSize); ASSERT(FALSE); // KeBugCheck() @@ -305,6 +319,7 @@ GdiPoolCreate( pPool->ulTag = ulTag; pPool->cjSectionSize = GDI_POOL_ALLOCATION_GRANULARITY; pPool->cSlotsPerSection = pPool->cjSectionSize / cjAllocSize; + DBG_INITLOG(&pPool->slhLog); return pPool; } @@ -317,20 +332,24 @@ GdiPoolDestroy(PGDI_POOL pPool) PLIST_ENTRY ple; /* Loop all empty sections, removing them */ - while ((ple = RemoveHeadList(&pPool->leEmptyList))) + while (!IsListEmpty(&pPool->leEmptyList)) { /* Delete the section */ + ple = RemoveHeadList(&pPool->leEmptyList); pSection = CONTAINING_RECORD(ple, GDI_POOL_SECTION, leInUseLink); GdiPoolDeleteSection(pPool, pSection); } /* Loop all ready sections, removing them */ - while ((ple = RemoveHeadList(&pPool->leInUseList))) + while (!IsListEmpty(&pPool->leInUseList)) { /* Delete the section */ + ple = RemoveHeadList(&pPool->leInUseList); pSection = CONTAINING_RECORD(ple, GDI_POOL_SECTION, leInUseLink); GdiPoolDeleteSection(pPool, pSection); } + DBG_CLEANUP_EVENT_LIST(&pPool->slhLog); + EngFreeMem(pPool); } diff --git a/reactos/subsystems/win32/win32k/objects/icm.c b/reactos/subsystems/win32/win32k/objects/icm.c index f67ff9ca61a..8e76174de75 100644 --- a/reactos/subsystems/win32/win32k/objects/icm.c +++ b/reactos/subsystems/win32/win32k/objects/icm.c @@ -50,9 +50,10 @@ IntGdiDeleteColorSpace( { BOOL Ret = FALSE; - if ( hColorSpace != hStockColorSpace ) + if ( hColorSpace != hStockColorSpace && + GDI_HANDLE_GET_TYPE(hColorSpace) == GDILoObjType_LO_ICMLCS_TYPE) { - Ret = COLORSPACEOBJ_FreeCSByHandle(hColorSpace); + Ret = GreDeleteObject(hColorSpace); if ( !Ret ) EngSetLastError(ERROR_INVALID_PARAMETER); } return Ret; @@ -216,7 +217,7 @@ NtGdiSetColorSpace(IN HDC hdc, if (pDC->dclevel.pColorSpace) { - GDIOBJ_ShareUnlockObjByPtr((POBJ) pDC->dclevel.pColorSpace); + GDIOBJ_vDereferenceObject((POBJ) pDC->dclevel.pColorSpace); } pDC->dclevel.pColorSpace = pCS; diff --git a/reactos/subsystems/win32/win32k/objects/palette.c b/reactos/subsystems/win32/win32k/objects/palette.c index a283a85732c..6da9f41e738 100644 --- a/reactos/subsystems/win32/win32k/objects/palette.c +++ b/reactos/subsystems/win32/win32k/objects/palette.c @@ -144,27 +144,27 @@ VOID FASTCALL PALETTE_ValidateFlags(PALETTEENTRY* lpPalE, INT size) lpPalE[i].peFlags = PC_SYS_USED | (lpPalE[i].peFlags & 0x07); } -HPALETTE -FASTCALL -PALETTE_AllocPalette(ULONG Mode, +PPALETTE +NTAPI +PALETTE_AllocPalette2(ULONG Mode, ULONG NumColors, ULONG *Colors, ULONG Red, ULONG Green, ULONG Blue) { - HPALETTE NewPalette; PPALETTE PalGDI; - PalGDI = (PPALETTE)GDIOBJ_AllocObjWithHandle(GDI_OBJECT_TYPE_PALETTE); + PalGDI = (PPALETTE)GDIOBJ_AllocateObject(GDIObjType_PAL_TYPE, + sizeof(PALETTE), + BASEFLAG_LOOKASIDE); if (!PalGDI) { + DPRINT1("Could not allocate a palette.\n"); return NULL; } - NewPalette = PalGDI->BaseObject.hHmgr; - - PalGDI->Self = NewPalette; + PalGDI->Self = PalGDI->BaseObject.hHmgr; PalGDI->flFlags = Mode; if (NULL != Colors) @@ -174,8 +174,7 @@ PALETTE_AllocPalette(ULONG Mode, TAG_PALETTE); if (NULL == PalGDI->IndexedColors) { - PALETTE_UnlockPalette(PalGDI); - PALETTE_FreePaletteByHandle(NewPalette); + GDIOBJ_vDeleteObject(&PalGDI->BaseObject); return NULL; } RtlCopyMemory(PalGDI->IndexedColors, Colors, sizeof(PALETTEENTRY) * NumColors); @@ -201,9 +200,35 @@ PALETTE_AllocPalette(ULONG Mode, PalGDI->flFlags |= PAL_RGB; } - PALETTE_UnlockPalette(PalGDI); + return PalGDI; +} - return NewPalette; +HPALETTE +FASTCALL +PALETTE_AllocPalette(ULONG Mode, + ULONG NumColors, + ULONG *Colors, + ULONG Red, + ULONG Green, + ULONG Blue) +{ + PPALETTE ppal; + HPALETTE hpal; + + ppal = PALETTE_AllocPalette2(Mode, NumColors, Colors, Red, Green, Blue); + if (!ppal) return NULL; + + hpal = GDIOBJ_hInsertObject(&ppal->BaseObject, GDI_OBJ_HMGR_POWNED); + if (!hpal) + { + DPRINT1("Could not insert palette into handle table.\n"); + GDIOBJ_vFreeObject(&ppal->BaseObject); + return NULL; + } + + PALETTE_UnlockPalette(ppal); + + return hpal; } HPALETTE @@ -215,9 +240,19 @@ PALETTE_AllocPaletteIndexedRGB(ULONG NumColors, PPALETTE PalGDI; UINT i; - PalGDI = (PPALETTE)GDIOBJ_AllocObjWithHandle(GDI_OBJECT_TYPE_PALETTE); + PalGDI = (PPALETTE)GDIOBJ_AllocateObject(GDIObjType_PAL_TYPE, + sizeof(PALETTE), + BASEFLAG_LOOKASIDE); if (!PalGDI) { + DPRINT1("Could not allocate a palette.\n"); + return NULL; + } + + if (!GDIOBJ_hInsertObject(&PalGDI->BaseObject, GDI_OBJ_HMGR_POWNED)) + { + DPRINT1("Could not insert palette into handle table.\n"); + GDIOBJ_vFreeObject(&PalGDI->BaseObject); return NULL; } @@ -231,8 +266,7 @@ PALETTE_AllocPaletteIndexedRGB(ULONG NumColors, TAG_PALETTE); if (NULL == PalGDI->IndexedColors) { - PALETTE_UnlockPalette(PalGDI); - PALETTE_FreePaletteByHandle(NewPalette); + GDIOBJ_vDeleteObject(&PalGDI->BaseObject); return NULL; } @@ -390,22 +424,29 @@ ColorCorrection(PPALETTE PalGDI, PPALETTEENTRY PaletteEntry, ULONG Colors) HPALETTE APIENTRY EngCreatePalette( - ULONG Mode, - ULONG NumColors, - ULONG *Colors, - ULONG Red, - ULONG Green, - ULONG Blue) + ULONG iMode, + ULONG cColors, + ULONG *pulColors, + ULONG flRed, + ULONG flGreen, + ULONG flBlue) { - HPALETTE Palette; + PPALETTE ppal; + HPALETTE hpal; - Palette = PALETTE_AllocPalette(Mode, NumColors, Colors, Red, Green, Blue); - if (Palette != NULL) + ppal = PALETTE_AllocPalette2(iMode, cColors, pulColors, flRed, flGreen, flBlue); + if (!ppal) return NULL; + + hpal = GDIOBJ_hInsertObject(&ppal->BaseObject, GDI_OBJ_HMGR_PUBLIC); + if (!hpal) { - GDIOBJ_SetOwnership(Palette, NULL); + DPRINT1("Could not insert palette into handle table.\n"); + GDIOBJ_vFreeObject(&ppal->BaseObject); + return NULL; } - return Palette; + PALETTE_UnlockPalette(ppal); + return hpal; } /* @@ -413,11 +454,16 @@ EngCreatePalette( */ BOOL APIENTRY -EngDeletePalette(IN HPALETTE Palette) +EngDeletePalette(IN HPALETTE hpal) { - GDIOBJ_SetOwnership(Palette, PsGetCurrentProcess()); + PPALETTE ppal; - return PALETTE_FreePaletteByHandle(Palette); + ppal = PALETTE_ShareLockPalette(hpal); + if (!ppal) return FALSE; + + GDIOBJ_vDeleteObject(&ppal->BaseObject); + + return TRUE; } /* diff --git a/reactos/subsystems/win32/win32k/objects/path.c b/reactos/subsystems/win32/win32k/objects/path.c index 0b1a7aa512c..82ccf439920 100644 --- a/reactos/subsystems/win32/win32k/objects/path.c +++ b/reactos/subsystems/win32/win32k/objects/path.c @@ -70,8 +70,7 @@ PATH_Delete(HPATH hPath) pPath = PATH_LockPath( hPath ); if (!pPath) return FALSE; PATH_DestroyGdiPath( pPath ); - PATH_UnlockPath( pPath ); - PATH_FreeExtPathByHandle(hPath); + GDIOBJ_vDeleteObject(&pPath->BaseObject); return TRUE; } @@ -1527,7 +1526,7 @@ PATH_WidenPath(DC *dc) PATH_FlattenPath(pPath); - size = IntGdiGetObject( pdcattr->hpen, 0, NULL); + size = GreGetObject( pdcattr->hpen, 0, NULL); if (!size) { PATH_UnlockPath( pPath ); @@ -1536,9 +1535,9 @@ PATH_WidenPath(DC *dc) } elp = ExAllocatePoolWithTag(PagedPool, size, TAG_PATH); - (VOID) IntGdiGetObject( pdcattr->hpen, size, elp); + GreGetObject(pdcattr->hpen, size, elp); - obj_type = GDIOBJ_GetObjectType(pdcattr->hpen); + obj_type = GDI_HANDLE_GET_TYPE(pdcattr->hpen); if(obj_type == GDI_OBJECT_TYPE_PEN) { penStyle = ((LOGPEN*)elp)->lopnStyle; @@ -1865,6 +1864,7 @@ PATH_WidenPath(DC *dc) DPRINT1("Assign path failed\n"); PATH_DestroyGdiPath(pNewPath); ExFreePoolWithTag(pNewPath, TAG_PATH); + PATH_UnlockPath(pPath); return ret; } @@ -2120,6 +2120,7 @@ NtGdiAbortPath(HDC hDC) } pPath = PATH_LockPath(dc->dclevel.hPath); + if (!pPath) { DC_UnlockDc(dc); return FALSE; @@ -2128,6 +2129,8 @@ NtGdiAbortPath(HDC hDC) PATH_EmptyPath(pPath); PATH_UnlockPath(pPath); + dc->dclevel.flPath &= ~DCPATH_ACTIVE; + DC_UnlockDc ( dc ); return TRUE; } @@ -2182,7 +2185,7 @@ NtGdiBeginPath( HDC hDC ) DPRINT("BeginPath 2 h 0x%x p 0x%x\n", dc->dclevel.hPath, pPath); // Path handles are shared. Also due to recursion with in the same thread. - GDIOBJ_UnlockObjByPtr((POBJ)pPath); // Unlock + GDIOBJ_vUnlockObject((POBJ)pPath); // Unlock pPath = PATH_LockPath(dc->dclevel.hPath); // Share Lock. /* Make sure that path is empty */ diff --git a/reactos/subsystems/win32/win32k/objects/pen.c b/reactos/subsystems/win32/win32k/objects/pen.c index ef6944762b4..4c9a2d0a541 100644 --- a/reactos/subsystems/win32/win32k/objects/pen.c +++ b/reactos/subsystems/win32/win32k/objects/pen.c @@ -29,12 +29,12 @@ PBRUSH FASTCALL -PEN_LockPen(HGDIOBJ hBMObj) +PEN_LockPen(HGDIOBJ hobj) { - if (GDI_HANDLE_GET_TYPE(hBMObj) == GDI_OBJECT_TYPE_EXTPEN) - return GDIOBJ_LockObj( hBMObj, GDI_OBJECT_TYPE_EXTPEN); - else - return GDIOBJ_LockObj( hBMObj, GDI_OBJECT_TYPE_PEN); + if (GDI_HANDLE_GET_TYPE(hobj) != GDILoObjType_LO_PEN_TYPE && + GDI_HANDLE_GET_TYPE(hobj) != GDILoObjType_LO_EXTPEN_TYPE) return NULL; + + return GDIOBJ_LockObject(hobj, GDIObjType_BRUSH_TYPE); } PBRUSH @@ -189,11 +189,7 @@ IntGdiExtCreatePen( ExitCleanup: EngSetLastError(ERROR_INVALID_PARAMETER); pbrushPen->pStyle = NULL; - PEN_UnlockPen(pbrushPen); - if (bOldStylePen) - PEN_FreePenByHandle(hPen); - else - PEN_FreeExtPenByHandle(hPen); + GDIOBJ_vDeleteObject(&pbrushPen->BaseObject); return NULL; } diff --git a/reactos/subsystems/win32/win32k/objects/region.c b/reactos/subsystems/win32/win32k/objects/region.c index 9a267493002..99698c018f1 100644 --- a/reactos/subsystems/win32/win32k/objects/region.c +++ b/reactos/subsystems/win32/win32k/objects/region.c @@ -2032,9 +2032,19 @@ REGION_AllocRgnWithHandle(INT nReg) HRGN hReg; PROSRGNDATA pReg; - pReg = (PROSRGNDATA)GDIOBJ_AllocObjWithHandle(GDI_OBJECT_TYPE_REGION); - if(!pReg) + pReg = (PROSRGNDATA)GDIOBJ_AllocateObject(GDIObjType_RGN_TYPE, + sizeof(REGION), + BASEFLAG_LOOKASIDE); + if (!pReg) { + DPRINT1("Could not allocate a palette.\n"); + return NULL; + } + + if (!GDIOBJ_hInsertObject(&pReg->BaseObject, GDI_OBJ_HMGR_POWNED)) + { + DPRINT1("Could not insert palette into handle table.\n"); + GDIOBJ_vFreeObject(&pReg->BaseObject); return NULL; } @@ -2051,8 +2061,8 @@ REGION_AllocRgnWithHandle(INT nReg) pReg->Buffer = ExAllocatePoolWithTag(PagedPool, nReg * sizeof(RECT), TAG_REGION); if (!pReg->Buffer) { - RGNOBJAPI_Unlock(pReg); - GDIOBJ_FreeObjByHandle(hReg, GDI_OBJECT_TYPE_REGION); + DPRINT1("Could not allocate region buffer\n"); + GDIOBJ_vDeleteObject(&pReg->BaseObject); return NULL; } } @@ -2061,10 +2071,36 @@ REGION_AllocRgnWithHandle(INT nReg) pReg->rdh.dwSize = sizeof(RGNDATAHEADER); pReg->rdh.nCount = nReg; pReg->rdh.nRgnSize = nReg * sizeof(RECT); + pReg->prgnattr = &pReg->rgnattr; return pReg; } +BOOL +NTAPI +REGION_bAllocRgnAttr(PREGION prgn) +{ + PPROCESSINFO ppi; + PRGN_ATTR prgnattr; + + ppi = PsGetCurrentProcessWin32Process(); + ASSERT(ppi); + + prgnattr = GdiPoolAllocate(ppi->pPoolRgnAttr); + if (!prgnattr) + { + DPRINT1("Could not allocate RGN attr\n"); + return FALSE; + } + + /* Set the object attribute in the handle table */ + prgn->prgnattr = prgnattr; + GDIOBJ_vSetObjectAttr(&prgn->BaseObject, prgnattr); + + return TRUE; +} + + // // Allocate User Space Region Handle. // @@ -2072,34 +2108,31 @@ PROSRGNDATA FASTCALL REGION_AllocUserRgnWithHandle(INT nRgn) { - PROSRGNDATA pRgn; - PGDI_TABLE_ENTRY Entry; + PREGION prgn; - pRgn = REGION_AllocRgnWithHandle(nRgn); - if (pRgn) + prgn = REGION_AllocRgnWithHandle(nRgn); + if (!prgn) { - Entry = GDI_HANDLE_GET_ENTRY(GdiHandleTable, pRgn->BaseObject.hHmgr); - Entry->UserData = AllocateObjectAttr(); - RtlZeroMemory(Entry->UserData, sizeof(RGN_ATTR)); + return NULL; } - return pRgn; + + if (!REGION_bAllocRgnAttr(prgn)) + { + ASSERT(FALSE); + } + + return prgn; } -PROSRGNDATA -FASTCALL -RGNOBJAPI_Lock(HRGN hRgn, PRGN_ATTR *ppRgn_Attr) +VOID +NTAPI +REGION_vSyncRegion(PREGION pRgn) { - PGDI_TABLE_ENTRY Entry; - PRGN_ATTR pRgn_Attr; - BOOL Hit = FALSE; - PROSRGNDATA pRgn = NULL; + PRGN_ATTR pRgn_Attr = NULL; - pRgn = REGION_LockRgn(hRgn); - - if (pRgn && GDIOBJ_OwnedByCurrentProcess(hRgn)) + if (pRgn && pRgn->prgnattr != &pRgn->rgnattr) { - Entry = GDI_HANDLE_GET_ENTRY(GdiHandleTable, hRgn); - pRgn_Attr = Entry->UserData; + pRgn_Attr = GDIOBJ_pvGetObjectAttr(&pRgn->BaseObject); if ( pRgn_Attr ) { @@ -2126,30 +2159,29 @@ RGNOBJAPI_Lock(HRGN hRgn, PRGN_ATTR *ppRgn_Attr) pRgn_Attr->AttrFlags &= ~ATTR_RGN_DIRTY; } } - else - { // This object is cached an waiting for it's resurrection by the users. - Hit = TRUE; - } } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { } _SEH2_END; - - if (Hit) - { - REGION_UnlockRgn(pRgn); - return NULL; - } - if (ppRgn_Attr) - *ppRgn_Attr = pRgn_Attr; - } - else - { - if (ppRgn_Attr) - *ppRgn_Attr = NULL; } } + +} + +PROSRGNDATA +FASTCALL +RGNOBJAPI_Lock(HRGN hRgn, PRGN_ATTR *ppRgn_Attr) +{ + PROSRGNDATA pRgn = NULL; + + pRgn = REGION_LockRgn(hRgn); + + REGION_vSyncRegion(pRgn); + + if (ppRgn_Attr) + *ppRgn_Attr = pRgn->prgnattr; + return pRgn; } @@ -2157,13 +2189,11 @@ VOID FASTCALL RGNOBJAPI_Unlock(PROSRGNDATA pRgn) { - PGDI_TABLE_ENTRY Entry; PRGN_ATTR pRgn_Attr; - if (pRgn && GDIOBJ_OwnedByCurrentProcess(pRgn->BaseObject.hHmgr)) + if (pRgn && GreGetObjectOwner(pRgn->BaseObject.hHmgr) == GDI_OBJ_HMGR_POWNED) { - Entry = GDI_HANDLE_GET_ENTRY(GdiHandleTable, pRgn->BaseObject.hHmgr); - pRgn_Attr = Entry->UserData; + pRgn_Attr = GDIOBJ_pvGetObjectAttr(&pRgn->BaseObject); if ( pRgn_Attr ) { @@ -2199,42 +2229,69 @@ PROSRGNDATA FASTCALL IntSysCreateRectpRgn(INT LeftRect, INT TopRect, INT RightRect, INT BottomRect) { - PROSRGNDATA pRgn; + PREGION prgn; - pRgn = (PROSRGNDATA)GDIOBJ_AllocObjWithHandle(GDI_OBJECT_TYPE_REGION); - if (!pRgn) - { - return NULL; - } - pRgn->Buffer = &pRgn->rdh.rcBound; - REGION_SetRectRgn(pRgn, LeftRect, TopRect, RightRect, BottomRect); - REGION_UnlockRgn(pRgn); - return pRgn; + /* Allocate a region, witout a handle */ + prgn = (PREGION)GDIOBJ_AllocateObject(GDIObjType_RGN_TYPE, sizeof(REGION), 0); + if (!prgn) + { + return NULL; + } + + /* Initialize it */ + prgn->Buffer = &prgn->rdh.rcBound; + prgn->prgnattr = &prgn->rgnattr; + REGION_SetRectRgn(prgn, LeftRect, TopRect, RightRect, BottomRect); + + return prgn; } HRGN FASTCALL IntSysCreateRectRgn(INT LeftRect, INT TopRect, INT RightRect, INT BottomRect) { - PROSRGNDATA pRgn = IntSysCreateRectpRgn(LeftRect,TopRect,RightRect,BottomRect); - return (pRgn ? pRgn->BaseObject.hHmgr : NULL); + PREGION prgn; + HRGN hrgn; + + /* Allocate a region, witout a handle */ + prgn = (PREGION)GDIOBJ_AllocObjWithHandle(GDI_OBJECT_TYPE_REGION, sizeof(REGION)); + if (!prgn) + { + return NULL; + } + + /* Initialize it */ + prgn->Buffer = &prgn->rdh.rcBound; + REGION_SetRectRgn(prgn, LeftRect, TopRect, RightRect, BottomRect); + hrgn = prgn->BaseObject.hHmgr; + prgn->prgnattr = &prgn->rgnattr; + + REGION_UnlockRgn(prgn); + + return hrgn; } BOOL INTERNAL_CALL REGION_Cleanup(PVOID ObjectBody) { PROSRGNDATA pRgn = (PROSRGNDATA)ObjectBody; + PPROCESSINFO ppi = PsGetCurrentProcessWin32Process(); + ASSERT(ppi); + + ASSERT(pRgn->prgnattr); + if (pRgn->prgnattr != &pRgn->rgnattr) + GdiPoolFree(ppi->pPoolRgnAttr, pRgn->prgnattr); + if (pRgn->Buffer && pRgn->Buffer != &pRgn->rdh.rcBound) ExFreePoolWithTag(pRgn->Buffer, TAG_REGION); return TRUE; } -// use REGION_FreeRgnByHandle(hRgn); for systems regions. VOID FASTCALL REGION_Delete(PROSRGNDATA pRgn) { if ( pRgn == prgnDefault) return; - REGION_FreeRgn(pRgn); + GDIOBJ_vDeleteObject(&pRgn->BaseObject); } VOID FASTCALL @@ -2298,28 +2355,27 @@ BOOL FASTCALL IntGdiSetRegionOwner(HRGN hRgn, DWORD OwnerMask) { - INT Index; - PGDI_TABLE_ENTRY Entry; -/* - System Regions: - These regions do not use attribute sections and when allocated, use gdiobj - level functions. - */ - // FIXME! HAX!!! Remove this once we get everything right! - Index = GDI_HANDLE_GET_INDEX(hRgn); - Entry = &GdiHandleTable->Entries[Index]; - if (Entry->UserData) FreeObjectAttr(Entry->UserData); - Entry->UserData = NULL; - // - if ((OwnerMask == GDI_OBJ_HMGR_PUBLIC) || OwnerMask == GDI_OBJ_HMGR_NONE) - { - return GDIOBJ_SetOwnership(hRgn, NULL); - } - if (OwnerMask == GDI_OBJ_HMGR_POWNED) - { - return GDIOBJ_SetOwnership((HGDIOBJ) hRgn, PsGetCurrentProcess() ); - } - return FALSE; + PREGION prgn; + PRGN_ATTR prgnattr; + PPROCESSINFO ppi; + + prgn = REGION_LockRgn(hRgn); + if (!prgn) + { + return FALSE; + } + + prgnattr = GDIOBJ_pvGetObjectAttr(&prgn->BaseObject); + if (prgnattr) + { + GDIOBJ_vSetObjectAttr(&prgn->BaseObject, NULL); + prgn->prgnattr = NULL; + ppi = PsGetCurrentProcessWin32Process(); + GdiPoolFree(ppi->pPoolRgnAttr, prgnattr); + } + RGNOBJAPI_Unlock(prgn); + + return GreSetObjectOwner(hRgn, OwnerMask); } INT @@ -2366,6 +2422,7 @@ IntGdiCombineRgn(PROSRGNDATA destRgn, { DPRINT1("IntGdiCombineRgn requires hSrc2 != NULL for combine mode %d!\n", CombineMode); EngSetLastError(ERROR_INVALID_HANDLE); + ASSERT(FALSE); } } } @@ -2447,7 +2504,7 @@ IntGdiPaintRgn( if (!REGION_LPTODP(dc, tmpVisRgn, hRgn) || NtGdiOffsetRgn(tmpVisRgn, dc->ptlDCOrig.x, dc->ptlDCOrig.y) == ERROR) { - REGION_FreeRgnByHandle(tmpVisRgn); + GreDeleteObject(tmpVisRgn); return FALSE; } @@ -2456,7 +2513,7 @@ IntGdiPaintRgn( visrgn = RGNOBJAPI_Lock(tmpVisRgn, NULL); if (visrgn == NULL) { - REGION_FreeRgnByHandle(tmpVisRgn); + GreDeleteObject(tmpVisRgn); return FALSE; } @@ -2477,7 +2534,7 @@ IntGdiPaintRgn( 0xFFFF);//FIXME:don't know what to put here RGNOBJAPI_Unlock(visrgn); - REGION_FreeRgnByHandle(tmpVisRgn); + GreDeleteObject(tmpVisRgn); // Fill the region return bRet; @@ -3271,46 +3328,55 @@ IntRectInRegion( // INT APIENTRY -NtGdiCombineRgn(HRGN hDest, - HRGN hSrc1, - HRGN hSrc2, - INT CombineMode) +NtGdiCombineRgn( + IN HRGN hrgnDst, + IN HRGN hrgnSrc1, + IN HRGN hrgnSrc2, + IN INT iMode) { - INT result = ERROR; - PROSRGNDATA destRgn, src1Rgn, src2Rgn = NULL; + HRGN ahrgn[3]; + PREGION aprgn[3]; + INT iResult; - if ( CombineMode > RGN_COPY && CombineMode < RGN_AND) - { - EngSetLastError(ERROR_INVALID_PARAMETER); - return ERROR; - } + if (iMode < RGN_AND || iMode > RGN_COPY) + { + EngSetLastError(ERROR_INVALID_PARAMETER); + return ERROR; + } - destRgn = RGNOBJAPI_Lock(hDest, NULL); - if (!destRgn) - { - EngSetLastError(ERROR_INVALID_HANDLE); - return ERROR; - } + if (!hrgnDst || !hrgnSrc1 || (iMode != RGN_COPY && !hrgnSrc2)) + { + DPRINT1("NtGdiCombineRgn: %p, %p, %p, %d\n", + hrgnDst, hrgnSrc1, hrgnSrc2, iMode); + EngSetLastError(ERROR_INVALID_PARAMETER); + return ERROR; + } - src1Rgn = RGNOBJAPI_Lock(hSrc1, NULL); - if (!src1Rgn) - { - RGNOBJAPI_Unlock(destRgn); - EngSetLastError(ERROR_INVALID_HANDLE); - return ERROR; - } + /* Lock all regions */ + ahrgn[0] = hrgnDst; + ahrgn[1] = hrgnSrc1; + ahrgn[2] = iMode != RGN_COPY ? hrgnSrc2 : NULL; + if (!GDIOBJ_bLockMultipleObjects(3, ahrgn, (PVOID*)aprgn, GDIObjType_RGN_TYPE)) + { + DPRINT1("NtGdiCombineRgn: %p, %p, %p, %d\n", + hrgnDst, hrgnSrc1, hrgnSrc2, iMode); + EngSetLastError(ERROR_INVALID_PARAMETER); + return ERROR; + } - if (hSrc2) - src2Rgn = RGNOBJAPI_Lock(hSrc2, NULL); + /* HACK: Sync usermode attributes */ + REGION_vSyncRegion(aprgn[0]); + REGION_vSyncRegion(aprgn[1]); + if (aprgn[2]) REGION_vSyncRegion(aprgn[2]); - result = IntGdiCombineRgn( destRgn, src1Rgn, src2Rgn, CombineMode); + /* Call the internal function */ + iResult = IntGdiCombineRgn(aprgn[0], aprgn[1], aprgn[2], iMode); - if (src2Rgn) - RGNOBJAPI_Unlock(src2Rgn); - RGNOBJAPI_Unlock(src1Rgn); - RGNOBJAPI_Unlock(destRgn); - - return result; + /* Cleanup and return */ + REGION_UnlockRgn(aprgn[0]); + REGION_UnlockRgn(aprgn[1]); + if (aprgn[2]) REGION_UnlockRgn(aprgn[2]); + return iResult; } HRGN @@ -3678,13 +3744,13 @@ NtGdiFrameRgn( } if (!REGION_CreateFrameRgn(FrameRgn, hRgn, Width, Height)) { - REGION_FreeRgnByHandle(FrameRgn); + GreDeleteObject(FrameRgn); return FALSE; } Ret = NtGdiFillRgn(hDC, FrameRgn, hBrush); - REGION_FreeRgnByHandle(FrameRgn); + GreDeleteObject(FrameRgn); return Ret; } diff --git a/reactos/subsystems/win32/win32k/win32k.rbuild b/reactos/subsystems/win32/win32k/win32k.rbuild index c9cf0ad78cd..5be2e9422c4 100644 --- a/reactos/subsystems/win32/win32k/win32k.rbuild +++ b/reactos/subsystems/win32/win32k/win32k.rbuild @@ -182,8 +182,9 @@ font.c freetype.c gdibatch.c - gdiobj.c gdidbg.c + gdiobj.c + gdipool.c icm.c line.c metafile.c From 3c6f59eacffa1236eac72574e0106912c24b0f5d Mon Sep 17 00:00:00 2001 From: Gabriel Ilardi Date: Thu, 28 Apr 2011 08:26:49 +0000 Subject: [PATCH 224/317] [mshtml] Revert associations for ie, we can't use them. Spotted by encoded. See issue #6158 for more details. svn path=/trunk/; revision=51471 --- reactos/dll/win32/mshtml/mshtml.inf | 38 ++++++++++++++--------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/reactos/dll/win32/mshtml/mshtml.inf b/reactos/dll/win32/mshtml/mshtml.inf index d7d242800bf..c76552ef328 100644 --- a/reactos/dll/win32/mshtml/mshtml.inf +++ b/reactos/dll/win32/mshtml/mshtml.inf @@ -91,7 +91,7 @@ HKCR,"CLSID\%CLSID_CRecalcEngine%\InProcServer32","ThreadingModel",,"Apartment" ;; CrSource HKCR,"CLSID\%CLSID_CrSource%",,,"Microsoft CrSource 4.0" HKCR,"CLSID\%CLSID_CrSource%\BrowseInPlace",,16 -HKCR,"CLSID\%CLSID_CrSource%\DefaultIcon",,0x00020000,"%16422%\Internet Explorer\iexplore.exe,1" +;;HKCR,"CLSID\%CLSID_CrSource%\DefaultIcon",,0x00020000,"%16422%\Internet Explorer\iexplore.exe,1" HKCR,"CLSID\%CLSID_CrSource%\EnablePlugin\.css",,,"PointPlus plugin" HKCR,"CLSID\%CLSID_CrSource%\InProcServer32",,,"mshtml.dll" HKCR,"CLSID\%CLSID_CrSource%\InProcServer32","ThreadingModel",,"Apartment" @@ -122,7 +122,7 @@ HKCR,"CLSID\%CLSID_HTADocument%\Version",,,"6.0" ;; HTMLDocument HKCR,"CLSID\%CLSID_HTMLDocument%",,,"HTML Document" HKCR,"CLSID\%CLSID_HTMLDocument%\BrowseInPlace",,16 -HKCR,"CLSID\%CLSID_HTMLDocument%\DefaultIcon",,0x00020000,"%16422%\Internet Explorer\iexplore.exe,1" +;;HKCR,"CLSID\%CLSID_HTMLDocument%\DefaultIcon",,0x00020000,"%16422%\Internet Explorer\iexplore.exe,1" HKCR,"CLSID\%CLSID_HTMLDocument%\InProcServer32",,,"mshtml.dll" HKCR,"CLSID\%CLSID_HTMLDocument%\InProcServer32","ThreadingModel",,"Apartment" HKCR,"CLSID\%CLSID_HTMLDocument%\MiscStatus",,,"2228625" @@ -215,7 +215,7 @@ HKCR,"CLSID\%CLSID_MailtoProtocol%\InProcServer32","ThreadingModel",,"Apartment" ;; MHTMLDocument HKCR,"CLSID\%CLSID_MHTMLDocument%",,,"MHTML Document" HKCR,"CLSID\%CLSID_MHTMLDocument%\BrowseInPlace",,16 -HKCR,"CLSID\%CLSID_MHTMLDocument%\DefaultIcon",,0x00020000,"%16422%\Internet Explorer\iexplore.exe,1" +;;HKCR,"CLSID\%CLSID_MHTMLDocument%\DefaultIcon",,0x00020000,"%16422%\Internet Explorer\iexplore.exe,1" HKCR,"CLSID\%CLSID_MHTMLDocument%\InProcServer32",,,"mshtml.dll" HKCR,"CLSID\%CLSID_MHTMLDocument%\InProcServer32","ThreadingModel",,"Apartment" HKCR,"CLSID\%CLSID_MHTMLDocument%\MiscStatus",,,"2228625" @@ -236,7 +236,7 @@ HKCR,"CLSID\%CLSID_Scriptlet%\MiscStatus",,,"0" HKCR,"CLSID\%CLSID_Scriptlet%\MiscStatus\1",,,"131473" HKCR,"CLSID\%CLSID_Scriptlet%\ProgID",,,"ScriptBridge.ScriptBridge.1" HKCR,"CLSID\%CLSID_Scriptlet%\Programmable",,16 -HKCR,"CLSID\%CLSID_Scriptlet%\ToolboxBitmap32",,,"%16422%\Internet Explorer\iexplore.exe,1" +;;HKCR,"CLSID\%CLSID_Scriptlet%\ToolboxBitmap32",,,"%16422%\Internet Explorer\iexplore.exe,1" HKCR,"CLSID\%CLSID_Scriptlet%\TypeLib",,,"%LIBID_MSHTML%" HKCR,"CLSID\%CLSID_Scriptlet%\Version",,,"4.0" HKCR,"CLSID\%CLSID_Scriptlet%\VersionIndependentProgID",,,"ScriptBridge.ScriptBridge" @@ -312,9 +312,9 @@ HKCR,".gif",,2,"giffile" HKCR,".gif","Content Type",,"image/gif" HKCR,"giffile",,,"GIF Image" HKCR,"giffile\CLSID",,,"%CLSID_HTMLDocument%" -HKCR,"giffile\shell\open\command",,,"""%16422%\Internet Explorer\iexplore.exe"" -nohome" +;;HKCR,"giffile\shell\open\command",,,"""%16422%\Internet Explorer\iexplore.exe"" -nohome" HKCR,"giffile\shell\open\ddeexec",,,"""file:%%1"",,-1,,,,," -HKCR,"giffile\shell\open\ddeexec\Application",,,"IExplore" +;;HKCR,"giffile\shell\open\ddeexec\Application",,,"IExplore" HKCR,"giffile\shell\open\ddeexec\Topic",,,"WWW_OpenURL" ;; HKCR,"giffile\DefaultIcon",,,"%16422%\Internet Explorer\iexplore.exe,9" @@ -339,7 +339,7 @@ HKCR,"htmlfile\shell\printto\command",,,"rundll32.exe mshtml.dll,PrintHTML ""%%1 HKCR,"htmlfile",,,"HTML Document" HKCR,"htmlfile\BrowseInPlace",,16 HKCR,"htmlfile\CLSID",,,"%CLSID_HTMLDocument%" -HKCR,"htmlfile\DefaultIcon",,0x00020000,"%16422%\Internet Explorer\iexplore.exe,1" +;;HKCR,"htmlfile\DefaultIcon",,0x00020000,"%16422%\Internet Explorer\iexplore.exe,1" HKCR,"htmlfile_FullWindowEmbed",,,"HTML Plugin Document" HKCR,"htmlfile_FullWindowEmbed\BrowseInPlace",,16 HKCR,"htmlfile_FullWindowEmbed\CLSID",,,"%CLSID_HTMLPluginDocument%" @@ -359,9 +359,9 @@ HKCR,".jpe",,2,"jpegfile" HKCR,".jpe","Content Type",,"image/jpeg" HKCR,"jpegfile",,,"JPEG Image" HKCR,"jpegfile\CLSID",,,"%CLSID_HTMLDocument%" -HKCR,"jpegfile\shell\open\command",,,"""%16422%\Internet Explorer\iexplore.exe"" -nohome" +;;HKCR,"jpegfile\shell\open\command",,,"""%16422%\Internet Explorer\iexplore.exe"" -nohome" HKCR,"jpegfile\shell\open\ddeexec",,,"""file:%%1"",,-1,,,,," -HKCR,"jpegfile\shell\open\ddeexec\Application",,,"IExplore" +;;HKCR,"jpegfile\shell\open\ddeexec\Application",,,"IExplore" HKCR,"jpegfile\shell\open\ddeexec\Topic",,,"WWW_OpenURL" ;; HKCR,"jpegfile\DefaultIcon",,,"%16422%\Internet Explorer\iexplore.exe,8" @@ -374,9 +374,9 @@ HKCR,".jpeg",,2,"jpegfile" HKCR,".jpeg","Content Type",,"image/jpeg" HKCR,"jpegfile",,,"JPEG Image" HKCR,"jpegfile\CLSID",,,"%CLSID_HTMLDocument%" -HKCR,"jpegfile\shell\open\command",,,"""%16422%\Internet Explorer\iexplore.exe"" -nohome" +;;HKCR,"jpegfile\shell\open\command",,,"""%16422%\Internet Explorer\iexplore.exe"" -nohome" HKCR,"jpegfile\shell\open\ddeexec",,,"""file:%%1"",,-1,,,,," -HKCR,"jpegfile\shell\open\ddeexec\Application",,,"IExplore" +;;HKCR,"jpegfile\shell\open\ddeexec\Application",,,"IExplore" HKCR,"jpegfile\shell\open\ddeexec\Topic",,,"WWW_OpenURL" ;; HKCR,"jpegfile\DefaultIcon",,,"%16422%\Internet Explorer\iexplore.exe,8" @@ -385,9 +385,9 @@ HKCR,".jpg",,2,"jpegfile" HKCR,".jpg","Content Type",,"image/jpeg" HKCR,"jpegfile",,,"JPEG Image" HKCR,"jpegfile\CLSID",,,"%CLSID_HTMLDocument%" -HKCR,"jpegfile\shell\open\command",,,"""%16422%\Internet Explorer\iexplore.exe"" -nohome" +;;HKCR,"jpegfile\shell\open\command",,,"""%16422%\Internet Explorer\iexplore.exe"" -nohome" HKCR,"jpegfile\shell\open\ddeexec",,,"""file:%%1"",,-1,,,,," -HKCR,"jpegfile\shell\open\ddeexec\Application",,,"IExplore" +;;HKCR,"jpegfile\shell\open\ddeexec\Application",,,"IExplore" HKCR,"jpegfile\shell\open\ddeexec\Topic",,,"WWW_OpenURL" ;; HKCR,"jpegfile\DefaultIcon",,,"%16422%\Internet Explorer\iexplore.exe,8" @@ -422,9 +422,9 @@ HKCR,".jfif",,2,"pjpegfile" HKCR,".jfif","Content Type",,"image/jpeg" HKCR,"pjpegfile",,,"JPEG Image" HKCR,"pjpegfile\CLSID",,,"%CLSID_HTMLDocument%" -HKCR,"pjpegfile\shell\open\command",,,"""%16422%\Internet Explorer\iexplore.exe"" -nohome" +;;HKCR,"pjpegfile\shell\open\command",,,"""%16422%\Internet Explorer\iexplore.exe"" -nohome" HKCR,"pjpegfile\shell\open\ddeexec",,,"""file:%%1"",,-1,,,,," -HKCR,"pjpegfile\shell\open\ddeexec\Application",,,"IExplore" +;;HKCR,"pjpegfile\shell\open\ddeexec\Application",,,"IExplore" HKCR,"pjpegfile\shell\open\ddeexec\Topic",,,"WWW_OpenURL" ;; HKCR,"pjpegfile\DefaultIcon",,,"%16422%\Internet Explorer\iexplore.exe,8" @@ -435,9 +435,9 @@ HKCR,".png",,2,"pngfile" HKCR,".png","Content Type",,"image/png" HKCR,"pngfile",,,"PNG Image" HKCR,"pngfile\CLSID",,,"%CLSID_HTMLDocument%" -HKCR,"pngfile\shell\open\command",,,"""%16422%\Internet Explorer\iexplore.exe""" -nohome" +;;HKCR,"pngfile\shell\open\command",,,"""%16422%\Internet Explorer\iexplore.exe""" -nohome" HKCR,"pngfile\shell\open\ddeexec",,,"""file:%%1"",,-1,,,,," -HKCR,"pngfile\shell\open\ddeexec\Application",,,"IExplore" +;;HKCR,"pngfile\shell\open\ddeexec\Application",,,"IExplore" HKCR,"pngfile\shell\open\ddeexec\Topic",,,"WWW_OpenURL" ;; HKCR,"pngfile\DefaultIcon",,,"%16422%\Internet Explorer\iexplore.exe,9" @@ -478,9 +478,9 @@ HKCR,"MIME\Database\Content Type\image/x-xbitmap","CLSID",,"%CLSID_HTMLDocument% HKCR,".xbm","Content Type",,"image/x-xbitmap" HKCR,"xbmfile",,,"XBM Image" HKCR,"xbmfile\CLSID",,,"%CLSID_HTMLDocument%" -HKCR,"xbmfile\shell\open\command",,,"""%16422%\Internet Explorer\iexplore.exe"" -nohome" +;;HKCR,"xbmfile\shell\open\command",,,"""%16422%\Internet Explorer\iexplore.exe"" -nohome" HKCR,"xbmfile\shell\open\ddeexec",,,"""file:%%1"",,-1,,,,," -HKCR,"xbmfile\shell\open\ddeexec\Application",,,"IExplore" +;;HKCR,"xbmfile\shell\open\ddeexec\Application",,,"IExplore" HKCR,"xbmfile\shell\open\ddeexec\Topic",,,"WWW_OpenURL" ;; HKCR,"xbmfile\DefaultIcon",,,"%16422%\Internet Explorer\iexplore.exe,9" From c0dcdb67284288a6578cdd9a3f8abcf77e422161 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Thu, 28 Apr 2011 08:50:27 +0000 Subject: [PATCH 225/317] Fix release build svn path=/trunk/; revision=51472 --- reactos/subsystems/win32/win32k/main/dllmain.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/subsystems/win32/win32k/main/dllmain.c b/reactos/subsystems/win32/win32k/main/dllmain.c index 39b8691273b..14269cf017e 100644 --- a/reactos/subsystems/win32/win32k/main/dllmain.c +++ b/reactos/subsystems/win32/win32k/main/dllmain.c @@ -452,7 +452,7 @@ DriverEntry( /* Register our per-process and per-thread structures. */ PsEstablishWin32Callouts((PWIN32_CALLOUTS_FPNS)&CalloutData); -#if 1 // DBG +#if DBG_ENABLE_SERVICE_HOOKS /* Register service hook callbacks */ KdSystemDebugControl('CsoR', DbgPreServiceHook, ID_Win32PreServiceHook, 0, 0, 0, 0); KdSystemDebugControl('CsoR', DbgPostServiceHook, ID_Win32PostServiceHook, 0, 0, 0, 0); From f685f1aeb0c7032d881d2c8ab26308b5e5341f47 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Thu, 28 Apr 2011 14:29:47 +0000 Subject: [PATCH 226/317] [WIN32K] - Don't use exclusive locks for pens - Don't try to delete the window update region - Don't ignore pid in GreIsHandleValid - Check if handle is valid before deleting it in DC_Cleanup - Silence a DPRINT svn path=/trunk/; revision=51475 --- reactos/subsystems/win32/win32k/include/pen.h | 4 --- .../subsystems/win32/win32k/ntuser/painting.c | 6 ---- reactos/subsystems/win32/win32k/objects/arc.c | 22 ++++++------- .../subsystems/win32/win32k/objects/dclife.c | 4 +-- .../win32/win32k/objects/fillshap.c | 32 +++++++++---------- .../subsystems/win32/win32k/objects/gdiobj.c | 5 ++- reactos/subsystems/win32/win32k/objects/pen.c | 31 +++++++----------- 7 files changed, 43 insertions(+), 61 deletions(-) diff --git a/reactos/subsystems/win32/win32k/include/pen.h b/reactos/subsystems/win32/win32k/include/pen.h index a7e96ad82ce..29f07425e3a 100644 --- a/reactos/subsystems/win32/win32k/include/pen.h +++ b/reactos/subsystems/win32/win32k/include/pen.h @@ -11,8 +11,6 @@ #define PEN_FreePen(pBMObj) GDIOBJ_FreeObj((POBJ) pBMObj, GDIObjType_BRUSH_TYPE) #define PEN_FreePenByHandle(hBMObj) GDIOBJ_FreeObjByHandle((HGDIOBJ) hBMObj, GDI_OBJECT_TYPE_PEN) -//#define PEN_LockPen(hBMObj) ((PBRUSH)GDIOBJ_LockObj((HGDIOBJ) hBMObj, GDI_OBJECT_TYPE_PEN)) - #define PEN_AllocExtPen() ((PBRUSH)GDIOBJ_AllocObj(GDIObjType_BRUSH_TYPE)) #define PEN_AllocExtPenWithHandle() ((PBRUSH)GDIOBJ_AllocObjWithHandle(GDI_OBJECT_TYPE_EXTPEN, sizeof(BRUSH))) @@ -25,8 +23,6 @@ #define PEN_ShareUnlockPen(ppen) GDIOBJ_vDereferenceObject((POBJ)ppen) - -PBRUSH FASTCALL PEN_LockPen(HGDIOBJ); PBRUSH FASTCALL PEN_ShareLockPen(HGDIOBJ); INT APIENTRY PEN_GetObject(PBRUSH pPen, INT Count, PLOGPEN Buffer); diff --git a/reactos/subsystems/win32/win32k/ntuser/painting.c b/reactos/subsystems/win32/win32k/ntuser/painting.c index 636e27152e8..fc7eba1288b 100644 --- a/reactos/subsystems/win32/win32k/ntuser/painting.c +++ b/reactos/subsystems/win32/win32k/ntuser/painting.c @@ -242,12 +242,6 @@ co_IntPaintWindows(PWND Wnd, ULONG Flags, BOOL Recurse) MsqDecPaintCountQueue(Wnd->head.pti->MessageQueue); co_IntSendMessage(hWnd, WM_NCPAINT, (WPARAM)TempRegion, 0); - if ( (HANDLE) 1 != TempRegion && - NULL != TempRegion) - { - /* NOTE: The region can already be deleted! */ - GreDeleteObject(TempRegion); - } } if (Wnd->state & WNDS_ERASEBACKGROUND) diff --git a/reactos/subsystems/win32/win32k/objects/arc.c b/reactos/subsystems/win32/win32k/objects/arc.c index 17d7f26d73e..eefccce1d62 100644 --- a/reactos/subsystems/win32/win32k/objects/arc.c +++ b/reactos/subsystems/win32/win32k/objects/arc.c @@ -46,7 +46,7 @@ IntArc( DC *dc, { PDC_ATTR pdcattr; RECTL RectBounds, RectSEpts; - PBRUSH pbrushPen; + PBRUSH pbrPen; SURFACE *psurf; BOOL ret = TRUE; LONG PenWidth, PenOrigWidth; @@ -71,18 +71,18 @@ IntArc( DC *dc, pdcattr = dc->pdcattr; - pbrushPen = PEN_LockPen(pdcattr->hpen); - if (!pbrushPen) + pbrPen = PEN_ShareLockPen(pdcattr->hpen); + if (!pbrPen) { DPRINT1("Arc Fail 1\n"); EngSetLastError(ERROR_INTERNAL_ERROR); return FALSE; } - PenOrigWidth = PenWidth = pbrushPen->ptPenWidth.x; - if (pbrushPen->ulPenStyle == PS_NULL) PenWidth = 0; + PenOrigWidth = PenWidth = pbrPen->ptPenWidth.x; + if (pbrPen->ulPenStyle == PS_NULL) PenWidth = 0; - if (pbrushPen->ulPenStyle == PS_INSIDEFRAME) + if (pbrPen->ulPenStyle == PS_INSIDEFRAME) { if (2*PenWidth > (Right - Left)) PenWidth = (Right -Left + 1)/2; if (2*PenWidth > (Bottom - Top)) PenWidth = (Bottom -Top + 1)/2; @@ -93,7 +93,7 @@ IntArc( DC *dc, } if (!PenWidth) PenWidth = 1; - pbrushPen->ptPenWidth.x = PenWidth; + pbrPen->ptPenWidth.x = PenWidth; RectBounds.left = Left; RectBounds.right = Right; @@ -156,13 +156,13 @@ IntArc( DC *dc, AngleStart, AngleEnd, arctype, - pbrushPen); + pbrPen); psurf = dc->dclevel.pSurface; if (NULL == psurf) { DPRINT1("Arc Fail 2\n"); - PEN_UnlockPen(pbrushPen); + PEN_ShareUnlockPen(pbrPen); EngSetLastError(ERROR_INTERNAL_ERROR); return FALSE; } @@ -175,8 +175,8 @@ IntArc( DC *dc, if (arctype == GdiTypeChord) PUTLINE(EfCx + CenterX, EfCy + CenterY, SfCx + CenterX, SfCy + CenterY, dc->eboLine); - pbrushPen->ptPenWidth.x = PenOrigWidth; - PEN_UnlockPen(pbrushPen); + pbrPen->ptPenWidth.x = PenOrigWidth; + PEN_ShareUnlockPen(pbrPen); DPRINT("IntArc Exit.\n"); return ret; } diff --git a/reactos/subsystems/win32/win32k/objects/dclife.c b/reactos/subsystems/win32/win32k/objects/dclife.c index 83cd2451340..6b66f8c632d 100644 --- a/reactos/subsystems/win32/win32k/objects/dclife.c +++ b/reactos/subsystems/win32/win32k/objects/dclife.c @@ -368,13 +368,13 @@ DC_Cleanup(PVOID ObjectBody) EBRUSHOBJ_vCleanup(&pdc->eboBackground); /* Free regions */ - if (pdc->rosdc.hClipRgn) + if (pdc->rosdc.hClipRgn && GreIsHandleValid(pdc->rosdc.hClipRgn)) GreDeleteObject(pdc->rosdc.hClipRgn); if (pdc->prgnVis) { REGION_Delete(pdc->prgnVis); } - if (pdc->rosdc.hGCClipRgn) + if (pdc->rosdc.hGCClipRgn && GreIsHandleValid(pdc->rosdc.hGCClipRgn)) { GreDeleteObject(pdc->rosdc.hGCClipRgn); } diff --git a/reactos/subsystems/win32/win32k/objects/fillshap.c b/reactos/subsystems/win32/win32k/objects/fillshap.c index bdb98e277de..c1ff20183c0 100644 --- a/reactos/subsystems/win32/win32k/objects/fillshap.c +++ b/reactos/subsystems/win32/win32k/objects/fillshap.c @@ -248,7 +248,7 @@ NtGdiEllipse( if (pdcattr->ulDirty_ & (DIRTY_LINE | DC_PEN_DIRTY)) DC_vUpdateLineBrush(dc); - pbrush = PEN_LockPen(pdcattr->hpen); + pbrush = PEN_ShareLockPen(pdcattr->hpen); if (!pbrush) { DPRINT1("Ellipse Fail 1\n"); @@ -329,7 +329,7 @@ NtGdiEllipse( pbrush); pbrush->ptPenWidth.x = PenOrigWidth; - PEN_UnlockPen(pbrush); + PEN_ShareUnlockPen(pbrush); DC_UnlockDc(dc); DPRINT("Ellipse Exit.\n"); return ret; @@ -714,7 +714,7 @@ IntRoundRect( int yCurveDiameter) { PDC_ATTR pdcattr; - PBRUSH pbrushLine, pbrushFill; + PBRUSH pbrLine, pbrFill; RECTL RectBounds; LONG PenWidth, PenOrigWidth; BOOL ret = TRUE; // default to success @@ -748,18 +748,18 @@ IntRoundRect( if (pdcattr->ulDirty_ & (DIRTY_LINE | DC_PEN_DIRTY)) DC_vUpdateLineBrush(dc); - pbrushLine = PEN_LockPen(pdcattr->hpen); - if (!pbrushLine) + pbrLine = PEN_ShareLockPen(pdcattr->hpen); + if (!pbrLine) { /* Nothing to do, as we don't have a bitmap */ EngSetLastError(ERROR_INTERNAL_ERROR); return FALSE; } - PenOrigWidth = PenWidth = pbrushLine->ptPenWidth.x; - if (pbrushLine->ulPenStyle == PS_NULL) PenWidth = 0; + PenOrigWidth = PenWidth = pbrLine->ptPenWidth.x; + if (pbrLine->ulPenStyle == PS_NULL) PenWidth = 0; - if (pbrushLine->ulPenStyle == PS_INSIDEFRAME) + if (pbrLine->ulPenStyle == PS_INSIDEFRAME) { if (2*PenWidth > (Right - Left)) PenWidth = (Right -Left + 1)/2; if (2*PenWidth > (Bottom - Top)) PenWidth = (Bottom -Top + 1)/2; @@ -770,7 +770,7 @@ IntRoundRect( } if (!PenWidth) PenWidth = 1; - pbrushLine->ptPenWidth.x = PenWidth; + pbrLine->ptPenWidth.x = PenWidth; RectBounds.left = Left; RectBounds.top = Top; @@ -784,8 +784,8 @@ IntRoundRect( RectBounds.right += dc->ptlDCOrig.x; RectBounds.bottom += dc->ptlDCOrig.y; - pbrushFill = BRUSH_ShareLockBrush(pdcattr->hbrush); - if (NULL == pbrushFill) + pbrFill = BRUSH_ShareLockBrush(pdcattr->hbrush); + if (!pbrFill) { DPRINT1("FillRound Fail\n"); EngSetLastError(ERROR_INTERNAL_ERROR); @@ -793,7 +793,7 @@ IntRoundRect( } else { - RtlCopyMemory(&brushTemp, pbrushFill, sizeof(brushTemp)); + RtlCopyMemory(&brushTemp, pbrFill, sizeof(brushTemp)); brushTemp.ptOrigin.x += RectBounds.left - Left; brushTemp.ptOrigin.y += RectBounds.top - Top; ret = IntFillRoundRect( dc, @@ -804,7 +804,7 @@ IntRoundRect( xCurveDiameter, yCurveDiameter, &brushTemp); - BRUSH_ShareUnlockBrush(pbrushFill); + BRUSH_ShareUnlockBrush(pbrFill); } if (ret) @@ -815,10 +815,10 @@ IntRoundRect( RectBounds.bottom, xCurveDiameter, yCurveDiameter, - pbrushLine); + pbrLine); - pbrushLine->ptPenWidth.x = PenOrigWidth; - PEN_UnlockPen(pbrushLine); + pbrLine->ptPenWidth.x = PenOrigWidth; + PEN_ShareUnlockPen(pbrLine); return ret; } diff --git a/reactos/subsystems/win32/win32k/objects/gdiobj.c b/reactos/subsystems/win32/win32k/objects/gdiobj.c index 1050de6b6e7..2a5597ecf66 100644 --- a/reactos/subsystems/win32/win32k/objects/gdiobj.c +++ b/reactos/subsystems/win32/win32k/objects/gdiobj.c @@ -368,9 +368,8 @@ ENTRY_ReferenceEntryByHandle(HGDIOBJ hobj, FLONG fl) pentry->ObjectOwner.ulObj != GDI_OBJ_HMGR_PUBLIC && pentry->ObjectOwner.ulObj != PtrToUlong(PsGetCurrentProcessId())) { - DPRINT1("GDIOBJ: Cannot reference foreign handle %p, pentry=%p:%lx.\n", + DPRINT("GDIOBJ: Cannot reference foreign handle %p, pentry=%p:%lx.\n", hobj, pentry, pentry->ObjectOwner.ulObj); - //ASSERT(FALSE); return NULL; } @@ -892,7 +891,7 @@ GreIsHandleValid(HGDIOBJ hobj) { PENTRY pentry; - pentry = ENTRY_ReferenceEntryByHandle(hobj, GDIOBJFLAG_IGNOREPID); + pentry = ENTRY_ReferenceEntryByHandle(hobj, 0); if (!pentry) return FALSE; GDIOBJ_vDereferenceObject(pentry->einfo.pobj); return TRUE; diff --git a/reactos/subsystems/win32/win32k/objects/pen.c b/reactos/subsystems/win32/win32k/objects/pen.c index 4c9a2d0a541..9c246b891e3 100644 --- a/reactos/subsystems/win32/win32k/objects/pen.c +++ b/reactos/subsystems/win32/win32k/objects/pen.c @@ -29,22 +29,15 @@ PBRUSH FASTCALL -PEN_LockPen(HGDIOBJ hobj) +PEN_ShareLockPen(HGDIOBJ hobj) { if (GDI_HANDLE_GET_TYPE(hobj) != GDILoObjType_LO_PEN_TYPE && - GDI_HANDLE_GET_TYPE(hobj) != GDILoObjType_LO_EXTPEN_TYPE) return NULL; + GDI_HANDLE_GET_TYPE(hobj) != GDILoObjType_LO_EXTPEN_TYPE) + { + return NULL; + } - return GDIOBJ_LockObject(hobj, GDIObjType_BRUSH_TYPE); -} - -PBRUSH -FASTCALL -PEN_ShareLockPen(HGDIOBJ hBMObj) -{ - if (GDI_HANDLE_GET_TYPE(hBMObj) == GDI_OBJECT_TYPE_EXTPEN) - return GDIOBJ_ShareLockObj( hBMObj, GDI_OBJECT_TYPE_EXTPEN); - else - return GDIOBJ_ShareLockObj( hBMObj, GDI_OBJECT_TYPE_PEN); + return (PBRUSH)GDIOBJ_ReferenceObjectByHandle(hobj, GDIObjType_BRUSH_TYPE); } HPEN APIENTRY @@ -196,16 +189,16 @@ ExitCleanup: VOID FASTCALL IntGdiSetSolidPenColor(HPEN hPen, COLORREF Color) { - PBRUSH pbrushPen; + PBRUSH pbrPen; - pbrushPen = PEN_LockPen(hPen); - if (pbrushPen) + pbrPen = PEN_ShareLockPen(hPen); + if (pbrPen) { - if (pbrushPen->flAttrs & GDIBRUSH_IS_SOLID) + if (pbrPen->flAttrs & GDIBRUSH_IS_SOLID) { - pbrushPen->BrushAttr.lbColor = Color & 0xFFFFFF; + pbrPen->BrushAttr.lbColor = Color & 0xFFFFFF; } - PEN_UnlockPen(pbrushPen); + PEN_ShareUnlockPen(pbrPen); } } From 654d08212ed723dd6d955de1c5bd05592f36cef1 Mon Sep 17 00:00:00 2001 From: Giannis Adamopoulos Date: Thu, 28 Apr 2011 19:26:09 +0000 Subject: [PATCH 227/317] [win32k] - Call update_input_key_state correctly svn path=/trunk/; revision=51479 --- reactos/subsystems/win32/win32k/ntuser/msgqueue.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/reactos/subsystems/win32/win32k/ntuser/msgqueue.c b/reactos/subsystems/win32/win32k/ntuser/msgqueue.c index cd57a5082a5..e0210dafdc1 100644 --- a/reactos/subsystems/win32/win32k/ntuser/msgqueue.c +++ b/reactos/subsystems/win32/win32k/ntuser/msgqueue.c @@ -52,8 +52,7 @@ DWORD FASTCALL UserGetKeyState(DWORD key) if( key < 0x100 ) { - ret = ((DWORD)(MessageQueue->KeyState[key] & KS_DOWN_BIT) << 8 ) | - (MessageQueue->KeyState[key] & KS_LOCK_BIT); + ret = (DWORD)MessageQueue->KeyState[key]; } return ret; @@ -62,6 +61,8 @@ DWORD FASTCALL UserGetKeyState(DWORD key) /* change the input key state for a given key */ static void set_input_key_state( PUSER_MESSAGE_QUEUE MessageQueue, UCHAR key, BOOL down ) { + DPRINT("set_input_key_state key:%d, down:%d\n", key, down); + if (down) { if (!(MessageQueue->KeyState[key] & KS_DOWN_BIT)) @@ -82,6 +83,8 @@ static void update_input_key_state( PUSER_MESSAGE_QUEUE MessageQueue, MSG* msg ) UCHAR key; BOOL down = 0; + DPRINT("update_input_key_state message:%d\n", msg->message); + switch (msg->message) { case WM_LBUTTONDOWN: @@ -1465,7 +1468,7 @@ co_MsqPeekHardwareMessage(IN PUSER_MESSAGE_QUEUE MessageQueue, if (Remove) { - update_input_key_state(MessageQueue, pMsg); + update_input_key_state(MessageQueue, &msg); RemoveEntryList(&CurrentMessage->ListEntry); ClearMsgBitsMask(MessageQueue, CurrentMessage->QS_Flags); MsqDestroyMessage(CurrentMessage); From f2fa7073c4c818e5399e31e393ec1ebc8c4adaa0 Mon Sep 17 00:00:00 2001 From: Giannis Adamopoulos Date: Thu, 28 Apr 2011 19:52:23 +0000 Subject: [PATCH 228/317] [win32k] - Use ObCloseHandle instead of ZwClose when closing window station handles svn path=/trunk/; revision=51480 --- reactos/subsystems/win32/win32k/ntuser/winsta.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/subsystems/win32/win32k/ntuser/winsta.c b/reactos/subsystems/win32/win32k/ntuser/winsta.c index e312f7673cf..2d5d3870e07 100644 --- a/reactos/subsystems/win32/win32k/ntuser/winsta.c +++ b/reactos/subsystems/win32/win32k/ntuser/winsta.c @@ -621,7 +621,7 @@ NtUserCloseWindowStation( DPRINT("Closing window station handle (0x%X)\n", hWinSta); - Status = ZwClose(hWinSta); + Status = ObCloseHandle(hWinSta, UserMode); if (!NT_SUCCESS(Status)) { SetLastNtError(Status); @@ -975,7 +975,7 @@ UserSetProcessWindowStation(HWINSTA hWindowStation) if(hwinstaOld != NULL) { - ZwClose(hwinstaOld); + ObCloseHandle(hwinstaOld, UserMode); } return TRUE; From 7d857e4ff3d3f427da294ea16547e0d91191f816 Mon Sep 17 00:00:00 2001 From: Gregor Schneider Date: Thu, 28 Apr 2011 19:59:16 +0000 Subject: [PATCH 229/317] [win32csr] Implement routines to allow copy, paste and select all on console windows See issue #4068 for more details. svn path=/trunk/; revision=51481 --- .../win32/csrss/win32csr/guiconsole.c | 135 +++++++++++++++++- 1 file changed, 131 insertions(+), 4 deletions(-) diff --git a/reactos/subsystems/win32/csrss/win32csr/guiconsole.c b/reactos/subsystems/win32/csrss/win32csr/guiconsole.c index 8742538a1b2..e54e4dd9052 100644 --- a/reactos/subsystems/win32/csrss/win32csr/guiconsole.c +++ b/reactos/subsystems/win32/csrss/win32csr/guiconsole.c @@ -1370,6 +1370,109 @@ GuiConsoleMouseMove(HWND hWnd, WPARAM wParam, LPARAM lParam) GuiConsoleUpdateSelection(Console, &c); } +static VOID +GuiConsoleCopy(HWND hWnd, PCSRSS_CONSOLE Console) +{ + if (OpenClipboard(hWnd) == TRUE) + { + HANDLE hData; + PBYTE ptr; + LPSTR data, dstPos; + ULONG selWidth, selHeight; + ULONG xPos, yPos, size; + + selWidth = Console->Selection.srSelection.Right - Console->Selection.srSelection.Left + 1; + selHeight = Console->Selection.srSelection.Bottom - Console->Selection.srSelection.Top + 1; + DPRINT("Selection is (%d|%d) to (%d|%d)\n", + Console->Selection.srSelection.Left, + Console->Selection.srSelection.Top, + Console->Selection.srSelection.Right, + Console->Selection.srSelection.Bottom); + + /* Basic size for one line and termination */ + size = selWidth + 1; + if (selHeight > 0) + { + /* Multiple line selections have to get \r\n appended */ + size += ((selWidth + 2) * (selHeight - 1)); + } + + /* Allocate memory, it will be passed to the system and may not be freed here */ + hData = GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, size); + if (hData == NULL) + { + CloseClipboard(); + return; + } + data = GlobalLock(hData); + if (data == NULL) + { + CloseClipboard(); + return; + } + + DPRINT("Copying %dx%d selection\n", selWidth, selHeight); + dstPos = data; + + for (yPos = 0; yPos < selHeight; yPos++) + { + ptr = ConioCoordToPointer(Console->ActiveBuffer, + Console->Selection.srSelection.Left, + yPos + Console->Selection.srSelection.Top); + /* Copy only the characters, leave attributes alone */ + for (xPos = 0; xPos < selWidth; xPos++) + { + dstPos[xPos] = ptr[xPos * 2]; + } + dstPos += selWidth; + if (yPos != (selHeight - 1)) + { + strcat(data, "\r\n"); + dstPos += 2; + } + } + + DPRINT("Setting data <%s> to clipboard\n", data); + GlobalUnlock(hData); + + EmptyClipboard(); + SetClipboardData(CF_TEXT, hData); + CloseClipboard(); + } +} + +static VOID +GuiConsolePaste(HWND hWnd, PCSRSS_CONSOLE Console) +{ + if (OpenClipboard(hWnd) == TRUE) + { + HANDLE hData; + LPSTR str; + size_t len; + + hData = GetClipboardData(CF_TEXT); + if (hData == NULL) + { + CloseClipboard(); + return; + } + + str = GlobalLock(hData); + if (str == NULL) + { + CloseClipboard(); + return; + } + DPRINT("Got data <%s> from clipboard\n", str); + len = strlen(str); + + ConioWriteConsole(Console, Console->ActiveBuffer, str, len, TRUE); + + GlobalUnlock(hData); + CloseClipboard(); + } +} + static VOID GuiConsoleRightMouseDown(HWND hWnd) { @@ -1381,12 +1484,13 @@ GuiConsoleRightMouseDown(HWND hWnd) if (!(Console->Selection.dwFlags & CONSOLE_SELECTION_NOT_EMPTY)) { - /* FIXME - paste text from clipboard */ + GuiConsolePaste(hWnd, Console); } else { - /* FIXME - copy selection to clipboard */ + GuiConsoleCopy(hWnd, Console); + /* Clear the selection */ GuiConsoleUpdateSelection(Console, NULL); } @@ -1466,18 +1570,41 @@ GuiConsoleShowConsoleProperties(HWND hWnd, BOOL Defaults, PGUI_CONSOLE_DATA GuiD CPLFunc(hWnd, CPL_DBLCLK, (LPARAM)&SharedInfo, Defaults); } static LRESULT -GuiConsoleHandleSysMenuCommand(HWND hWnd, WPARAM wParam, LPARAM lParam, PGUI_CONSOLE_DATA GuiData) +GuiConsoleHandleSysMenuCommand(HWND hWnd, WPARAM wParam, LPARAM lParam) { LRESULT Ret = TRUE; + PCSRSS_CONSOLE Console; + PGUI_CONSOLE_DATA GuiData; + COORD bottomRight = { 0, 0 }; + + GuiConsoleGetDataPointers(hWnd, &Console, &GuiData); switch(wParam) { case ID_SYSTEM_EDIT_MARK: + DPRINT1("Marking not handled yet\n"); + break; + case ID_SYSTEM_EDIT_COPY: + GuiConsoleCopy(hWnd, Console); + break; + case ID_SYSTEM_EDIT_PASTE: + GuiConsolePaste(hWnd, Console); + break; + case ID_SYSTEM_EDIT_SELECTALL: + bottomRight.X = Console->Size.X - 1; + bottomRight.Y = Console->Size.Y - 1; + GuiConsoleUpdateSelection(Console, &bottomRight); + break; + case ID_SYSTEM_EDIT_SCROLL: + DPRINT1("Scrolling is not handled yet\n"); + break; + case ID_SYSTEM_EDIT_FIND: + DPRINT1("Finding is not handled yet\n"); break; case ID_SYSTEM_DEFAULTS: @@ -1895,7 +2022,7 @@ GuiConsoleWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) GuiConsoleMouseMove(hWnd, wParam, lParam); break; case WM_SYSCOMMAND: - Result = GuiConsoleHandleSysMenuCommand(hWnd, wParam, lParam, GuiData); + Result = GuiConsoleHandleSysMenuCommand(hWnd, wParam, lParam); break; case WM_HSCROLL: case WM_VSCROLL: From f80c0cc1560af47be8df720fc43c701328120e7e Mon Sep 17 00:00:00 2001 From: Gregor Schneider Date: Thu, 28 Apr 2011 20:17:14 +0000 Subject: [PATCH 230/317] [calc] Fix degree to radians conversion See issue #3018 for more details. svn path=/trunk/; revision=51482 --- reactos/base/applications/calc/convert.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/base/applications/calc/convert.c b/reactos/base/applications/calc/convert.c index 22966dff0fc..06c4523ac7c 100644 --- a/reactos/base/applications/calc/convert.c +++ b/reactos/base/applications/calc/convert.c @@ -50,7 +50,7 @@ typedef struct { static const conv_t conv_ANGLE[] = { DECLARE_CONV_UNIT(ANGLE, DEGREES, "$", "$") DECLARE_CONV_UNIT(ANGLE, GRADIANS, "$*0.9", "$/0.9") - DECLARE_CONV_UNIT(ANGLE, RADIANS, "$*180/P", "$*P/180") + DECLARE_CONV_UNIT(ANGLE, RADIANS, "$/P*180", "$*P/180") DECLARE_CONV_END }; From 16afe3648fa8c17c750e007642f18025eb1ba31b Mon Sep 17 00:00:00 2001 From: Giannis Adamopoulos Date: Thu, 28 Apr 2011 20:33:16 +0000 Subject: [PATCH 231/317] [win32k] - Store the initial desktop handle and use it evey time a new thread is created. svn path=/trunk/; revision=51483 --- .../subsystems/win32/win32k/main/dllmain.c | 91 ++++++++++++------- 1 file changed, 60 insertions(+), 31 deletions(-) diff --git a/reactos/subsystems/win32/win32k/main/dllmain.c b/reactos/subsystems/win32/win32k/main/dllmain.c index 14269cf017e..21b18029222 100644 --- a/reactos/subsystems/win32/win32k/main/dllmain.c +++ b/reactos/subsystems/win32/win32k/main/dllmain.c @@ -154,6 +154,13 @@ Win32kProcessCallback(struct _EPROCESS *Process, LogonProcess = NULL; } + /* Close the startup desktop */ + ASSERT(Win32Process->rpdeskStartup); + ASSERT(Win32Process->hdeskStartup); + ObDereferenceObject(Win32Process->rpdeskStartup); + ZwClose(Win32Process->hdeskStartup); + + /* Close the current window station */ UserSetProcessWindowStation(NULL); /* Destroy GDI pools */ @@ -211,6 +218,7 @@ Win32kThreadCallback(struct _ETHREAD *Thread, HDESK hDesk = NULL; NTSTATUS Status; PUNICODE_STRING DesktopPath; + PDESKTOP pdesk; PRTL_USER_PROCESS_PARAMETERS ProcessParams = (Process->Peb ? Process->Peb->ProcessParameters : NULL); DPRINT("Creating W32 thread TID:%d at IRQ level: %lu\n", Thread->Cid.UniqueThread, KeGetCurrentIrql()); @@ -223,37 +231,6 @@ Win32kThreadCallback(struct _ETHREAD *Thread, InitializeListHead(&Win32Thread->aphkStart[i]); } - /* - * inherit the thread desktop and process window station (if not yet inherited) from the process startup - * info structure. See documentation of CreateProcess() - */ - DesktopPath = (ProcessParams ? ((ProcessParams->DesktopInfo.Length > 0) ? &ProcessParams->DesktopInfo : NULL) : NULL); - Status = IntParseDesktopPath(Process, - DesktopPath, - &hWinSta, - &hDesk); - if(NT_SUCCESS(Status)) - { - if(hWinSta != NULL) - { - if(!UserSetProcessWindowStation(hWinSta)) - { - DPRINT1("Failed to set process window station\n"); - } - } - - if (hDesk != NULL) - { - if (!IntSetThreadDesktop(hDesk, FALSE)) - { - DPRINT1("Unable to set thread desktop\n"); - } - } - } - else - { - DPRINT1("No Desktop handle for this Thread!\n"); - } Win32Thread->TIF_flags &= ~TIF_INCLEANUP; co_IntDestroyCaret(Win32Thread); Win32Thread->ppi = PsGetCurrentProcessWin32Process(); @@ -266,6 +243,58 @@ Win32kThreadCallback(struct _ETHREAD *Thread, } Win32Thread->MessageQueue = MsqCreateMessageQueue(Thread); Win32Thread->KeyboardLayout = W32kGetDefaultKeyLayout(); + + /* HAAAAAAAACK! This should go to Win32kProcessCallback */ + if(Win32Thread->ppi->hdeskStartup == NULL) + { + /* + * inherit the thread desktop and process window station (if not yet inherited) from the process startup + * info structure. See documentation of CreateProcess() + */ + DesktopPath = (ProcessParams ? ((ProcessParams->DesktopInfo.Length > 0) ? &ProcessParams->DesktopInfo : NULL) : NULL); + Status = IntParseDesktopPath(Process, + DesktopPath, + &hWinSta, + &hDesk); + if(NT_SUCCESS(Status)) + { + if(hWinSta != NULL) + { + if(!UserSetProcessWindowStation(hWinSta)) + { + DPRINT1("Failed to set process window station\n"); + } + } + + if (hDesk != NULL) + { + /* Validate the new desktop. */ + Status = IntValidateDesktopHandle(hDesk, + UserMode, + 0, + &pdesk); + + if(NT_SUCCESS(Status)) + { + Win32Thread->ppi->hdeskStartup = hDesk; + Win32Thread->ppi->rpdeskStartup = pdesk; + } + } + } + else + { + DPRINT1("No Desktop handle for this Thread!\n"); + } + } + + if (Win32Thread->ppi->hdeskStartup != NULL) + { + if (!IntSetThreadDesktop(Win32Thread->ppi->hdeskStartup, FALSE)) + { + DPRINT1("Unable to set thread desktop\n"); + } + } + pTeb = NtCurrentTeb(); if (pTeb) { /* Attempt to startup client support which should have been initialized in IntSetThreadDesktop. */ From ee795b8b1e13e8f2b3aa26026f3197c67e670181 Mon Sep 17 00:00:00 2001 From: Rafal Harabien Date: Thu, 28 Apr 2011 22:10:51 +0000 Subject: [PATCH 232/317] [APITESTS] * Add GetDriveType tests. Some fails in ReactOS * Fix few rbuild files svn path=/trunk/; revision=51484 --- rostests/apitests/CMakeLists.txt | 1 + rostests/apitests/directory.rbuild | 4 ++ rostests/apitests/kernel32/CMakeLists.txt | 12 ++++ rostests/apitests/kernel32/GetDriveType.c | 71 +++++++++++++++++++ .../apitests/kernel32/kernel32_apitest.rbuild | 13 ++++ rostests/apitests/kernel32/testlist.c | 16 +++++ rostests/dibtests/bltrop/bltrop.rbuild | 1 + rostests/dibtests/vbltest/vbltest.rbuild | 1 + .../dxtest/win32kdxtest/win32kdxtest.rbuild | 1 + rostests/win32/smss/movefile/movefile.rbuild | 1 + .../user32/drawcaption/drawcaption.rbuild | 1 + rostests/winetests/cryptui/cryptui.rbuild | 1 + 12 files changed, 123 insertions(+) create mode 100644 rostests/apitests/kernel32/CMakeLists.txt create mode 100644 rostests/apitests/kernel32/GetDriveType.c create mode 100644 rostests/apitests/kernel32/kernel32_apitest.rbuild create mode 100644 rostests/apitests/kernel32/testlist.c diff --git a/rostests/apitests/CMakeLists.txt b/rostests/apitests/CMakeLists.txt index 4ac4b3027d2..1251a06a6ee 100644 --- a/rostests/apitests/CMakeLists.txt +++ b/rostests/apitests/CMakeLists.txt @@ -5,6 +5,7 @@ add_subdirectory(dciman32) add_subdirectory(gdi32) add_subdirectory(ntdll) add_subdirectory(user32) +add_subdirectory(kernel32) if(NOT MSVC) if(ARCH MATCHES i386) diff --git a/rostests/apitests/directory.rbuild b/rostests/apitests/directory.rbuild index 14446375bef..37c01c338be 100644 --- a/rostests/apitests/directory.rbuild +++ b/rostests/apitests/directory.rbuild @@ -21,6 +21,10 @@ + + + + diff --git a/rostests/apitests/kernel32/CMakeLists.txt b/rostests/apitests/kernel32/CMakeLists.txt new file mode 100644 index 00000000000..3fc8c865e62 --- /dev/null +++ b/rostests/apitests/kernel32/CMakeLists.txt @@ -0,0 +1,12 @@ + +add_definitions(-D_DLL -D__USE_CRTIMP) + +list(APPEND SOURCE + GetDriveType.c + testlist.c) + +add_executable(kernel32_apitest ${SOURCE}) +target_link_libraries(kernel32_apitest wine ${PSEH_LIB}) +set_module_type(kernel32_apitest win32cui) +add_importlibs(kernel32_apitest gdi32 user32 msvcrt kernel32 ntdll) +add_cab_target(kernel32_apitest 7) diff --git a/rostests/apitests/kernel32/GetDriveType.c b/rostests/apitests/kernel32/GetDriveType.c new file mode 100644 index 00000000000..010eb362de7 --- /dev/null +++ b/rostests/apitests/kernel32/GetDriveType.c @@ -0,0 +1,71 @@ +#include +#include +#include + +#define IS_DRIVE_TYPE_VALID(type) ((type) != DRIVE_UNKNOWN && (type) != DRIVE_NO_ROOT_DIR) + +START_TEST(GetDriveType) +{ + UINT Type, Type2, i; + WCHAR Path[MAX_PATH]; + + /* Note: Successful calls can set last error to at least ERROR_NOT_A_REPARSE_POINT, we don't test it here */ + SetLastError(0xdeadbeaf); + + Type = GetDriveTypeW(L""); + ok(Type == DRIVE_NO_ROOT_DIR, "Expected DRIVE_NO_ROOT_DIR, got %u\n", Type); + + Type = GetDriveTypeW(L"\nC:\\"); + ok(Type == DRIVE_NO_ROOT_DIR, "Expected DRIVE_NO_ROOT_DIR, got %u\n", Type); + + Type = GetDriveTypeW(L"Z:\\"); + ok(Type == DRIVE_NO_ROOT_DIR, "Expected DRIVE_NO_ROOT_DIR, got %u\n", Type); + + ok(GetLastError() == 0xdeadbeaf, "Expected no errors, got %lu\n", GetLastError()); + + /* Drive root is accepted without ending slash */ + Type = GetDriveTypeW(L"C:"); + ok(IS_DRIVE_TYPE_VALID(Type), "Expected valid drive type, got %u\n", Type); + + Type = GetDriveTypeW(L"C:\\"); + ok(IS_DRIVE_TYPE_VALID(Type), "Expected valid drive type, got %u\n", Type); + + Type = GetDriveTypeW(NULL); + ok(IS_DRIVE_TYPE_VALID(Type), "Expected valid drive type, got %u\n", Type); + + i = GetCurrentDirectoryW(sizeof(Path)/sizeof(Path[0]), Path); + if (i) + { + /* Note: there is no backslash at the end of Path */ + SetLastError(0xdeadbeaf); + Type2 = GetDriveTypeW(Path); + ok(Type2 == DRIVE_NO_ROOT_DIR, "Expected DRIVE_NO_ROOT_DIR, got %u\n", Type2); + ok(GetLastError() == 0xdeadbeaf, "Expected ERROR_NOT_A_REPARSE_POINT, got %lu\n", GetLastError()); + + wcscpy(Path+i, L"\\"); + Type2 = GetDriveTypeW(Path); + ok(Type == Type2, "Types are not equal: %u != %u\n", Type, Type2); + } + + i = GetSystemDirectoryW(Path, sizeof(Path)/sizeof(Path[0])); + if (i) + { + /* Note: there is no backslash at the end of Path */ + SetLastError(0xdeadbeaf); + Type = GetDriveTypeW(Path); + ok(Type == DRIVE_NO_ROOT_DIR, "Expected DRIVE_NO_ROOT_DIR, got %u\n", Type); + ok(GetLastError() == 0xdeadbeaf, "Expected no errors, got %lu\n", GetLastError()); + + wcscpy(Path+i, L"\\"); + Type = GetDriveTypeW(Path); + ok(IS_DRIVE_TYPE_VALID(Type), "Expected valid drive type, got %u\n", Type); + + wcscpy(Path+i, L"/"); + Type = GetDriveTypeW(Path); + ok(IS_DRIVE_TYPE_VALID(Type), "Expected valid drive type, got %u\n", Type); + + wcscpy(Path+i, L"\\\\"); + Type = GetDriveTypeW(Path); + ok(IS_DRIVE_TYPE_VALID(Type), "Expected valid drive type, got %u\n", Type); + } +} diff --git a/rostests/apitests/kernel32/kernel32_apitest.rbuild b/rostests/apitests/kernel32/kernel32_apitest.rbuild new file mode 100644 index 00000000000..81766be6722 --- /dev/null +++ b/rostests/apitests/kernel32/kernel32_apitest.rbuild @@ -0,0 +1,13 @@ + + + + + . + wine + ntdll + pseh + testlist.c + + GetDriveType.c + + diff --git a/rostests/apitests/kernel32/testlist.c b/rostests/apitests/kernel32/testlist.c new file mode 100644 index 00000000000..123e1ce2ea5 --- /dev/null +++ b/rostests/apitests/kernel32/testlist.c @@ -0,0 +1,16 @@ +#define WIN32_LEAN_AND_MEAN +#define __ROS_LONG64__ +#include + +#define STANDALONE +#include "wine/test.h" + +extern void func_GetDriveType(void); + +const struct test winetest_testlist[] = +{ + { "GetDriveType", func_GetDriveType }, + + { 0, 0 } +}; + diff --git a/rostests/dibtests/bltrop/bltrop.rbuild b/rostests/dibtests/bltrop/bltrop.rbuild index f19491c61bb..82b0a098e2b 100644 --- a/rostests/dibtests/bltrop/bltrop.rbuild +++ b/rostests/dibtests/bltrop/bltrop.rbuild @@ -4,3 +4,4 @@ user32 bltrop.c bltrop.rc + diff --git a/rostests/dibtests/vbltest/vbltest.rbuild b/rostests/dibtests/vbltest/vbltest.rbuild index d715469ba68..c49b905f530 100644 --- a/rostests/dibtests/vbltest/vbltest.rbuild +++ b/rostests/dibtests/vbltest/vbltest.rbuild @@ -4,3 +4,4 @@ gdi32 vbltest.c vbltest.rc + \ No newline at end of file diff --git a/rostests/dxtest/win32kdxtest/win32kdxtest.rbuild b/rostests/dxtest/win32kdxtest/win32kdxtest.rbuild index ad0499a5d05..90122ac0b6f 100644 --- a/rostests/dxtest/win32kdxtest/win32kdxtest.rbuild +++ b/rostests/dxtest/win32kdxtest/win32kdxtest.rbuild @@ -11,3 +11,4 @@ NtGdiDdWaitForVerticalBlank.c NtGdiDdCanCreateSurface.c dump.c + \ No newline at end of file diff --git a/rostests/win32/smss/movefile/movefile.rbuild b/rostests/win32/smss/movefile/movefile.rbuild index 21033a1930f..9fe8a054cab 100644 --- a/rostests/win32/smss/movefile/movefile.rbuild +++ b/rostests/win32/smss/movefile/movefile.rbuild @@ -4,3 +4,4 @@ user32 movefile.cpp movefile.rc + \ No newline at end of file diff --git a/rostests/win32/user32/drawcaption/drawcaption.rbuild b/rostests/win32/user32/drawcaption/drawcaption.rbuild index 351250ec530..026b2410bd8 100644 --- a/rostests/win32/user32/drawcaption/drawcaption.rbuild +++ b/rostests/win32/user32/drawcaption/drawcaption.rbuild @@ -16,3 +16,4 @@ capicon.c capicon.rc + diff --git a/rostests/winetests/cryptui/cryptui.rbuild b/rostests/winetests/cryptui/cryptui.rbuild index 2c6daf31b46..13b7702ce10 100644 --- a/rostests/winetests/cryptui/cryptui.rbuild +++ b/rostests/winetests/cryptui/cryptui.rbuild @@ -8,3 +8,4 @@ crypt32 user32 ntdll + From 6fd65190b1d1abcac234b8e0a758b607ba681567 Mon Sep 17 00:00:00 2001 From: Rafal Harabien Date: Thu, 28 Apr 2011 22:15:39 +0000 Subject: [PATCH 233/317] [KERNEL32] * Use current directory in GetDriveType if no path is given * Check if path is properly ended * Remove slash from end when calling NtCrateFile function * Fixes few kernel32_apitest tests and floppy icon in My Computer if no floppy is inserted See issue #6148 for more details. svn path=/trunk/; revision=51485 --- reactos/dll/win32/kernel32/file/volume.c | 89 +++++++++++++++++++----- 1 file changed, 71 insertions(+), 18 deletions(-) diff --git a/reactos/dll/win32/kernel32/file/volume.c b/reactos/dll/win32/kernel32/file/volume.c index 0e336661a6b..ad2a7acbb21 100644 --- a/reactos/dll/win32/kernel32/file/volume.c +++ b/reactos/dll/win32/kernel32/file/volume.c @@ -434,28 +434,81 @@ GetDriveTypeW(LPCWSTR lpRootPathName) { FILE_FS_DEVICE_INFORMATION FileFsDevice; IO_STATUS_BLOCK IoStatusBlock; - HANDLE hFile; - NTSTATUS errCode; + NTSTATUS Status; + UNICODE_STRING NtPath; + OBJECT_ATTRIBUTES ObjectAttributes; + WCHAR Buffer[MAX_PATH+1]; - hFile = InternalOpenDirW(lpRootPathName, FALSE); - if (hFile == INVALID_HANDLE_VALUE) - { - return DRIVE_NO_ROOT_DIR; /* According to WINE regression tests */ - } + if (!lpRootPathName) + { + DWORD cBytes; + + /* Get current directory */ + cBytes = RtlGetCurrentDirectory_U(sizeof(Buffer), Buffer); + if(cBytes < sizeof(Buffer)) + { + ASSERT(cBytes < MAX_PATH*sizeof(WCHAR)); + Buffer[cBytes/sizeof(WCHAR)] = L'\\'; + Buffer[cBytes/sizeof(WCHAR)+1] = L'\0'; + lpRootPathName = Buffer; + } /* else fail... should we allow longer current dirs? */ + } - errCode = NtQueryVolumeInformationFile (hFile, - &IoStatusBlock, - &FileFsDevice, - sizeof(FILE_FS_DEVICE_INFORMATION), - FileFsDeviceInformation); - if (!NT_SUCCESS(errCode)) - { - CloseHandle(hFile); - SetLastErrorByStatus (errCode); - return 0; - } + if (!RtlDosPathNameToNtPathName_U(lpRootPathName, &NtPath, NULL, NULL)) + { + WARN("Invalid path: %ls\n", lpRootPathName); + return DRIVE_NO_ROOT_DIR; + } + + /* Path from RtlDosPathNameToNtPathName_U does not contain '/' and multiple '\\' in a row */ + if(!NtPath.Length || NtPath.Buffer[NtPath.Length/sizeof(WCHAR)-1] != L'\\') + { + /* Path must be ended by slash */ + WARN("Invalid path: %ls\n", NtPath.Buffer); + return DRIVE_NO_ROOT_DIR; + } + + /* Remove ending slash */ + NtPath.Length -= sizeof(WCHAR); + + InitializeObjectAttributes(&ObjectAttributes, + &NtPath, + OBJ_CASE_INSENSITIVE, + NULL, + NULL); + + Status = NtCreateFile(&hFile, + FILE_GENERIC_READ, + &ObjectAttributes, + &IoStatusBlock, + NULL, + 0, + FILE_SHARE_READ|FILE_SHARE_WRITE, + FILE_OPEN, + 0, + NULL, + 0); + + RtlFreeUnicodeString(&NtPath); + + if (!NT_SUCCESS(Status)) + { + WARN("Invalid path: %ls\n", lpRootPathName); + return DRIVE_NO_ROOT_DIR; /* According to WINE regression tests */ + } + + Status = NtQueryVolumeInformationFile (hFile, + &IoStatusBlock, + &FileFsDevice, + sizeof(FILE_FS_DEVICE_INFORMATION), + FileFsDeviceInformation); CloseHandle(hFile); + if (!NT_SUCCESS(Status)) + { + ERR("NtQueryVolumeInformationFile failed for %ls\n", lpRootPathName); + return DRIVE_UNKNOWN; + } switch (FileFsDevice.DeviceType) { From 541978ae644fd5e73685818702924b6227492367 Mon Sep 17 00:00:00 2001 From: Rafal Harabien Date: Thu, 28 Apr 2011 22:33:50 +0000 Subject: [PATCH 234/317] [KERNEL32] * Fix formatting. No code changes. svn path=/trunk/; revision=51486 --- reactos/dll/win32/kernel32/file/volume.c | 1204 +++++++++++----------- 1 file changed, 602 insertions(+), 602 deletions(-) diff --git a/reactos/dll/win32/kernel32/file/volume.c b/reactos/dll/win32/kernel32/file/volume.c index ad2a7acbb21..1f64e0bbc79 100644 --- a/reactos/dll/win32/kernel32/file/volume.c +++ b/reactos/dll/win32/kernel32/file/volume.c @@ -29,41 +29,41 @@ DEBUG_CHANNEL(kernel32file); static HANDLE InternalOpenDirW(LPCWSTR DirName, - BOOLEAN Write) + BOOLEAN Write) { - UNICODE_STRING NtPathU; - OBJECT_ATTRIBUTES ObjectAttributes; - NTSTATUS errCode; - IO_STATUS_BLOCK IoStatusBlock; - HANDLE hFile; + UNICODE_STRING NtPathU; + OBJECT_ATTRIBUTES ObjectAttributes; + NTSTATUS errCode; + IO_STATUS_BLOCK IoStatusBlock; + HANDLE hFile; - if (!RtlDosPathNameToNtPathName_U(DirName, - &NtPathU, - NULL, - NULL)) + if (!RtlDosPathNameToNtPathName_U(DirName, + &NtPathU, + NULL, + NULL)) { - WARN("Invalid path\n"); - SetLastError(ERROR_BAD_PATHNAME); - return INVALID_HANDLE_VALUE; + WARN("Invalid path\n"); + SetLastError(ERROR_BAD_PATHNAME); + return INVALID_HANDLE_VALUE; } InitializeObjectAttributes(&ObjectAttributes, - &NtPathU, - OBJ_CASE_INSENSITIVE, - NULL, - NULL); + &NtPathU, + OBJ_CASE_INSENSITIVE, + NULL, + NULL); errCode = NtCreateFile (&hFile, - Write ? FILE_GENERIC_WRITE : FILE_GENERIC_READ, - &ObjectAttributes, - &IoStatusBlock, - NULL, - 0, - FILE_SHARE_READ|FILE_SHARE_WRITE, - FILE_OPEN, - 0, - NULL, - 0); + Write ? FILE_GENERIC_WRITE : FILE_GENERIC_READ, + &ObjectAttributes, + &IoStatusBlock, + NULL, + 0, + FILE_SHARE_READ|FILE_SHARE_WRITE, + FILE_OPEN, + 0, + NULL, + 0); RtlFreeHeap(RtlGetProcessHeap(), 0, @@ -71,8 +71,8 @@ InternalOpenDirW(LPCWSTR DirName, if (!NT_SUCCESS(errCode)) { - SetLastErrorByStatus (errCode); - return INVALID_HANDLE_VALUE; + SetLastErrorByStatus (errCode); + return INVALID_HANDLE_VALUE; } return hFile; } @@ -84,34 +84,34 @@ InternalOpenDirW(LPCWSTR DirName, /* Synced to Wine-2008/12/28 */ DWORD WINAPI GetLogicalDriveStringsA(DWORD nBufferLength, - LPSTR lpBuffer) + LPSTR lpBuffer) { - DWORD drive, count; - DWORD dwDriveMap; - LPSTR p; + DWORD drive, count; + DWORD dwDriveMap; + LPSTR p; - dwDriveMap = GetLogicalDrives(); + dwDriveMap = GetLogicalDrives(); - for (drive = count = 0; drive < MAX_DOS_DRIVES; drive++) - { - if (dwDriveMap & (1< nBufferLength) return ((count * 4) + 1); + if ((count * 4) + 1 > nBufferLength) return ((count * 4) + 1); - p = lpBuffer; + p = lpBuffer; - for (drive = 0; drive < MAX_DOS_DRIVES; drive++) - if (dwDriveMap & (1< nBufferLength) return ((count * 4) + 1); @@ -161,24 +161,24 @@ GetLogicalDriveStringsW(DWORD nBufferLength, DWORD WINAPI GetLogicalDrives(VOID) { - NTSTATUS Status; - PROCESS_DEVICEMAP_INFORMATION ProcessDeviceMapInfo; + NTSTATUS Status; + PROCESS_DEVICEMAP_INFORMATION ProcessDeviceMapInfo; - /* Get the Device Map for this Process */ - Status = NtQueryInformationProcess(NtCurrentProcess(), - ProcessDeviceMap, - &ProcessDeviceMapInfo, - sizeof(ProcessDeviceMapInfo), - NULL); + /* Get the Device Map for this Process */ + Status = NtQueryInformationProcess(NtCurrentProcess(), + ProcessDeviceMap, + &ProcessDeviceMapInfo, + sizeof(ProcessDeviceMapInfo), + NULL); - /* Return the Drive Map */ - if (!NT_SUCCESS(Status)) - { - SetLastErrorByStatus(Status); - return 0; - } + /* Return the Drive Map */ + if (!NT_SUCCESS(Status)) + { + SetLastErrorByStatus(Status); + return 0; + } - return ProcessDeviceMapInfo.Query.DriveMap; + return ProcessDeviceMapInfo.Query.DriveMap; } @@ -187,26 +187,26 @@ GetLogicalDrives(VOID) */ BOOL WINAPI GetDiskFreeSpaceA ( - LPCSTR lpRootPathName, - LPDWORD lpSectorsPerCluster, - LPDWORD lpBytesPerSector, - LPDWORD lpNumberOfFreeClusters, - LPDWORD lpTotalNumberOfClusters - ) + LPCSTR lpRootPathName, + LPDWORD lpSectorsPerCluster, + LPDWORD lpBytesPerSector, + LPDWORD lpNumberOfFreeClusters, + LPDWORD lpTotalNumberOfClusters +) { - PWCHAR RootPathNameW=NULL; + PWCHAR RootPathNameW=NULL; - if (lpRootPathName) - { - if (!(RootPathNameW = FilenameA2W(lpRootPathName, FALSE))) - return FALSE; - } + if (lpRootPathName) + { + if (!(RootPathNameW = FilenameA2W(lpRootPathName, FALSE))) + return FALSE; + } - return GetDiskFreeSpaceW (RootPathNameW, - lpSectorsPerCluster, - lpBytesPerSector, - lpNumberOfFreeClusters, - lpTotalNumberOfClusters); + return GetDiskFreeSpaceW (RootPathNameW, + lpSectorsPerCluster, + lpBytesPerSector, + lpNumberOfFreeClusters, + lpTotalNumberOfClusters); } @@ -220,7 +220,7 @@ GetDiskFreeSpaceW( LPDWORD lpBytesPerSector, LPDWORD lpNumberOfFreeClusters, LPDWORD lpTotalNumberOfClusters - ) +) { FILE_FS_SIZE_INFORMATION FileFsSize; IO_STATUS_BLOCK IoStatusBlock; @@ -238,11 +238,11 @@ GetDiskFreeSpaceW( } RootPathName[3] = 0; - hFile = InternalOpenDirW(RootPathName, FALSE); - if (INVALID_HANDLE_VALUE == hFile) + hFile = InternalOpenDirW(RootPathName, FALSE); + if (INVALID_HANDLE_VALUE == hFile) { - SetLastError(ERROR_PATH_NOT_FOUND); - return FALSE; + SetLastError(ERROR_PATH_NOT_FOUND); + return FALSE; } errCode = NtQueryVolumeInformationFile(hFile, @@ -276,24 +276,24 @@ GetDiskFreeSpaceW( */ BOOL WINAPI GetDiskFreeSpaceExA ( - LPCSTR lpDirectoryName OPTIONAL, - PULARGE_INTEGER lpFreeBytesAvailableToCaller, - PULARGE_INTEGER lpTotalNumberOfBytes, - PULARGE_INTEGER lpTotalNumberOfFreeBytes - ) + LPCSTR lpDirectoryName OPTIONAL, + PULARGE_INTEGER lpFreeBytesAvailableToCaller, + PULARGE_INTEGER lpTotalNumberOfBytes, + PULARGE_INTEGER lpTotalNumberOfFreeBytes +) { - PWCHAR DirectoryNameW=NULL; + PWCHAR DirectoryNameW=NULL; - if (lpDirectoryName) - { - if (!(DirectoryNameW = FilenameA2W(lpDirectoryName, FALSE))) - return FALSE; - } + if (lpDirectoryName) + { + if (!(DirectoryNameW = FilenameA2W(lpDirectoryName, FALSE))) + return FALSE; + } - return GetDiskFreeSpaceExW (DirectoryNameW , - lpFreeBytesAvailableToCaller, - lpTotalNumberOfBytes, - lpTotalNumberOfFreeBytes); + return GetDiskFreeSpaceExW (DirectoryNameW , + lpFreeBytesAvailableToCaller, + lpTotalNumberOfBytes, + lpTotalNumberOfFreeBytes); } @@ -306,7 +306,7 @@ GetDiskFreeSpaceExW( PULARGE_INTEGER lpFreeBytesAvailableToCaller, PULARGE_INTEGER lpTotalNumberOfBytes, PULARGE_INTEGER lpTotalNumberOfFreeBytes - ) +) { union { @@ -417,12 +417,12 @@ GetDiskFreeSpaceExW( UINT WINAPI GetDriveTypeA(LPCSTR lpRootPathName) { - PWCHAR RootPathNameW; + PWCHAR RootPathNameW; - if (!(RootPathNameW = FilenameA2W(lpRootPathName, FALSE))) - return DRIVE_UNKNOWN; + if (!(RootPathNameW = FilenameA2W(lpRootPathName, FALSE))) + return DRIVE_UNKNOWN; - return GetDriveTypeW(RootPathNameW); + return GetDriveTypeW(RootPathNameW); } @@ -432,10 +432,10 @@ GetDriveTypeA(LPCSTR lpRootPathName) UINT WINAPI GetDriveTypeW(LPCWSTR lpRootPathName) { - FILE_FS_DEVICE_INFORMATION FileFsDevice; - IO_STATUS_BLOCK IoStatusBlock; - HANDLE hFile; - NTSTATUS Status; + FILE_FS_DEVICE_INFORMATION FileFsDevice; + IO_STATUS_BLOCK IoStatusBlock; + HANDLE hFile; + NTSTATUS Status; UNICODE_STRING NtPath; OBJECT_ATTRIBUTES ObjectAttributes; WCHAR Buffer[MAX_PATH+1]; @@ -443,7 +443,7 @@ GetDriveTypeW(LPCWSTR lpRootPathName) if (!lpRootPathName) { DWORD cBytes; - + /* Get current directory */ cBytes = RtlGetCurrentDirectory_U(sizeof(Buffer), Buffer); if(cBytes < sizeof(Buffer)) @@ -473,10 +473,10 @@ GetDriveTypeW(LPCWSTR lpRootPathName) NtPath.Length -= sizeof(WCHAR); InitializeObjectAttributes(&ObjectAttributes, - &NtPath, + &NtPath, OBJ_CASE_INSENSITIVE, NULL, - NULL); + NULL); Status = NtCreateFile(&hFile, FILE_GENERIC_READ, @@ -498,39 +498,39 @@ GetDriveTypeW(LPCWSTR lpRootPathName) return DRIVE_NO_ROOT_DIR; /* According to WINE regression tests */ } - Status = NtQueryVolumeInformationFile (hFile, - &IoStatusBlock, - &FileFsDevice, - sizeof(FILE_FS_DEVICE_INFORMATION), - FileFsDeviceInformation); - CloseHandle(hFile); - if (!NT_SUCCESS(Status)) + Status = NtQueryVolumeInformationFile (hFile, + &IoStatusBlock, + &FileFsDevice, + sizeof(FILE_FS_DEVICE_INFORMATION), + FileFsDeviceInformation); + CloseHandle(hFile); + if (!NT_SUCCESS(Status)) { ERR("NtQueryVolumeInformationFile failed for %ls\n", lpRootPathName); return DRIVE_UNKNOWN; } - switch (FileFsDevice.DeviceType) - { - case FILE_DEVICE_CD_ROM: - case FILE_DEVICE_CD_ROM_FILE_SYSTEM: - return DRIVE_CDROM; - case FILE_DEVICE_VIRTUAL_DISK: - return DRIVE_RAMDISK; - case FILE_DEVICE_NETWORK_FILE_SYSTEM: - return DRIVE_REMOTE; - case FILE_DEVICE_DISK: - case FILE_DEVICE_DISK_FILE_SYSTEM: - if (FileFsDevice.Characteristics & FILE_REMOTE_DEVICE) - return DRIVE_REMOTE; - if (FileFsDevice.Characteristics & FILE_REMOVABLE_MEDIA) - return DRIVE_REMOVABLE; - return DRIVE_FIXED; - } + switch (FileFsDevice.DeviceType) + { + case FILE_DEVICE_CD_ROM: + case FILE_DEVICE_CD_ROM_FILE_SYSTEM: + return DRIVE_CDROM; + case FILE_DEVICE_VIRTUAL_DISK: + return DRIVE_RAMDISK; + case FILE_DEVICE_NETWORK_FILE_SYSTEM: + return DRIVE_REMOTE; + case FILE_DEVICE_DISK: + case FILE_DEVICE_DISK_FILE_SYSTEM: + if (FileFsDevice.Characteristics & FILE_REMOTE_DEVICE) + return DRIVE_REMOTE; + if (FileFsDevice.Characteristics & FILE_REMOVABLE_MEDIA) + return DRIVE_REMOVABLE; + return DRIVE_FIXED; + } - ERR("Returning DRIVE_UNKNOWN for device type %d\n", FileFsDevice.DeviceType); + ERR("Returning DRIVE_UNKNOWN for device type %d\n", FileFsDevice.DeviceType); - return DRIVE_UNKNOWN; + return DRIVE_UNKNOWN; } @@ -539,134 +539,134 @@ GetDriveTypeW(LPCWSTR lpRootPathName) */ BOOL WINAPI GetVolumeInformationA( - LPCSTR lpRootPathName, - LPSTR lpVolumeNameBuffer, - DWORD nVolumeNameSize, - LPDWORD lpVolumeSerialNumber, - LPDWORD lpMaximumComponentLength, - LPDWORD lpFileSystemFlags, - LPSTR lpFileSystemNameBuffer, - DWORD nFileSystemNameSize - ) + LPCSTR lpRootPathName, + LPSTR lpVolumeNameBuffer, + DWORD nVolumeNameSize, + LPDWORD lpVolumeSerialNumber, + LPDWORD lpMaximumComponentLength, + LPDWORD lpFileSystemFlags, + LPSTR lpFileSystemNameBuffer, + DWORD nFileSystemNameSize +) { - UNICODE_STRING FileSystemNameU; - UNICODE_STRING VolumeNameU = { 0, 0, NULL }; - ANSI_STRING VolumeName; - ANSI_STRING FileSystemName; - PWCHAR RootPathNameW; - BOOL Result; + UNICODE_STRING FileSystemNameU; + UNICODE_STRING VolumeNameU = { 0, 0, NULL }; + ANSI_STRING VolumeName; + ANSI_STRING FileSystemName; + PWCHAR RootPathNameW; + BOOL Result; - if (!(RootPathNameW = FilenameA2W(lpRootPathName, FALSE))) - return FALSE; + if (!(RootPathNameW = FilenameA2W(lpRootPathName, FALSE))) + return FALSE; - if (lpVolumeNameBuffer) + if (lpVolumeNameBuffer) { - VolumeNameU.MaximumLength = (USHORT)nVolumeNameSize * sizeof(WCHAR); - VolumeNameU.Buffer = RtlAllocateHeap (RtlGetProcessHeap (), - 0, - VolumeNameU.MaximumLength); - if (VolumeNameU.Buffer == NULL) - { - goto FailNoMem; - } + VolumeNameU.MaximumLength = (USHORT)nVolumeNameSize * sizeof(WCHAR); + VolumeNameU.Buffer = RtlAllocateHeap (RtlGetProcessHeap (), + 0, + VolumeNameU.MaximumLength); + if (VolumeNameU.Buffer == NULL) + { + goto FailNoMem; + } } - if (lpFileSystemNameBuffer) + if (lpFileSystemNameBuffer) { - FileSystemNameU.Length = 0; - FileSystemNameU.MaximumLength = (USHORT)nFileSystemNameSize * sizeof(WCHAR); - FileSystemNameU.Buffer = RtlAllocateHeap (RtlGetProcessHeap (), - 0, - FileSystemNameU.MaximumLength); - if (FileSystemNameU.Buffer == NULL) - { - if (VolumeNameU.Buffer != NULL) - { - RtlFreeHeap(RtlGetProcessHeap(), - 0, - VolumeNameU.Buffer); - } + FileSystemNameU.Length = 0; + FileSystemNameU.MaximumLength = (USHORT)nFileSystemNameSize * sizeof(WCHAR); + FileSystemNameU.Buffer = RtlAllocateHeap (RtlGetProcessHeap (), + 0, + FileSystemNameU.MaximumLength); + if (FileSystemNameU.Buffer == NULL) + { + if (VolumeNameU.Buffer != NULL) + { + RtlFreeHeap(RtlGetProcessHeap(), + 0, + VolumeNameU.Buffer); + } FailNoMem: - SetLastError(ERROR_NOT_ENOUGH_MEMORY); - return FALSE; - } + SetLastError(ERROR_NOT_ENOUGH_MEMORY); + return FALSE; + } } - Result = GetVolumeInformationW (RootPathNameW, - lpVolumeNameBuffer ? VolumeNameU.Buffer : NULL, - nVolumeNameSize, - lpVolumeSerialNumber, - lpMaximumComponentLength, - lpFileSystemFlags, - lpFileSystemNameBuffer ? FileSystemNameU.Buffer : NULL, - nFileSystemNameSize); + Result = GetVolumeInformationW (RootPathNameW, + lpVolumeNameBuffer ? VolumeNameU.Buffer : NULL, + nVolumeNameSize, + lpVolumeSerialNumber, + lpMaximumComponentLength, + lpFileSystemFlags, + lpFileSystemNameBuffer ? FileSystemNameU.Buffer : NULL, + nFileSystemNameSize); - if (Result) + if (Result) { - if (lpVolumeNameBuffer) + if (lpVolumeNameBuffer) { - VolumeNameU.Length = wcslen(VolumeNameU.Buffer) * sizeof(WCHAR); - VolumeName.Length = 0; - VolumeName.MaximumLength = (USHORT)nVolumeNameSize; - VolumeName.Buffer = lpVolumeNameBuffer; - } + VolumeNameU.Length = wcslen(VolumeNameU.Buffer) * sizeof(WCHAR); + VolumeName.Length = 0; + VolumeName.MaximumLength = (USHORT)nVolumeNameSize; + VolumeName.Buffer = lpVolumeNameBuffer; + } - if (lpFileSystemNameBuffer) - { - FileSystemNameU.Length = wcslen(FileSystemNameU.Buffer) * sizeof(WCHAR); - FileSystemName.Length = 0; - FileSystemName.MaximumLength = (USHORT)nFileSystemNameSize; - FileSystemName.Buffer = lpFileSystemNameBuffer; - } + if (lpFileSystemNameBuffer) + { + FileSystemNameU.Length = wcslen(FileSystemNameU.Buffer) * sizeof(WCHAR); + FileSystemName.Length = 0; + FileSystemName.MaximumLength = (USHORT)nFileSystemNameSize; + FileSystemName.Buffer = lpFileSystemNameBuffer; + } - /* convert unicode strings to ansi (or oem) */ - if (bIsFileApiAnsi) + /* convert unicode strings to ansi (or oem) */ + if (bIsFileApiAnsi) { - if (lpVolumeNameBuffer) - { - RtlUnicodeStringToAnsiString (&VolumeName, - &VolumeNameU, - FALSE); - } - if (lpFileSystemNameBuffer) - { - RtlUnicodeStringToAnsiString (&FileSystemName, - &FileSystemNameU, - FALSE); - } - } - else + if (lpVolumeNameBuffer) + { + RtlUnicodeStringToAnsiString (&VolumeName, + &VolumeNameU, + FALSE); + } + if (lpFileSystemNameBuffer) + { + RtlUnicodeStringToAnsiString (&FileSystemName, + &FileSystemNameU, + FALSE); + } + } + else { - if (lpVolumeNameBuffer) - { - RtlUnicodeStringToOemString (&VolumeName, - &VolumeNameU, - FALSE); - } - if (lpFileSystemNameBuffer) - { - RtlUnicodeStringToOemString (&FileSystemName, - &FileSystemNameU, - FALSE); - } - } + if (lpVolumeNameBuffer) + { + RtlUnicodeStringToOemString (&VolumeName, + &VolumeNameU, + FALSE); + } + if (lpFileSystemNameBuffer) + { + RtlUnicodeStringToOemString (&FileSystemName, + &FileSystemNameU, + FALSE); + } + } } - if (lpVolumeNameBuffer) + if (lpVolumeNameBuffer) { - RtlFreeHeap (RtlGetProcessHeap (), - 0, - VolumeNameU.Buffer); + RtlFreeHeap (RtlGetProcessHeap (), + 0, + VolumeNameU.Buffer); } - if (lpFileSystemNameBuffer) + if (lpFileSystemNameBuffer) { - RtlFreeHeap (RtlGetProcessHeap (), - 0, - FileSystemNameU.Buffer); + RtlFreeHeap (RtlGetProcessHeap (), + 0, + FileSystemNameU.Buffer); } - return Result; + return Result; } #define FS_VOLUME_BUFFER_SIZE (MAX_PATH * sizeof(WCHAR) + sizeof(FILE_FS_VOLUME_INFORMATION)) @@ -686,106 +686,106 @@ GetVolumeInformationW( LPDWORD lpFileSystemFlags, LPWSTR lpFileSystemNameBuffer, DWORD nFileSystemNameSize - ) +) { - PFILE_FS_VOLUME_INFORMATION FileFsVolume; - PFILE_FS_ATTRIBUTE_INFORMATION FileFsAttribute; - IO_STATUS_BLOCK IoStatusBlock; - WCHAR RootPathName[MAX_PATH]; - UCHAR Buffer[max(FS_VOLUME_BUFFER_SIZE, FS_ATTRIBUTE_BUFFER_SIZE)]; + PFILE_FS_VOLUME_INFORMATION FileFsVolume; + PFILE_FS_ATTRIBUTE_INFORMATION FileFsAttribute; + IO_STATUS_BLOCK IoStatusBlock; + WCHAR RootPathName[MAX_PATH]; + UCHAR Buffer[max(FS_VOLUME_BUFFER_SIZE, FS_ATTRIBUTE_BUFFER_SIZE)]; - HANDLE hFile; - NTSTATUS errCode; + HANDLE hFile; + NTSTATUS errCode; - FileFsVolume = (PFILE_FS_VOLUME_INFORMATION)Buffer; - FileFsAttribute = (PFILE_FS_ATTRIBUTE_INFORMATION)Buffer; + FileFsVolume = (PFILE_FS_VOLUME_INFORMATION)Buffer; + FileFsAttribute = (PFILE_FS_ATTRIBUTE_INFORMATION)Buffer; - TRACE("FileFsVolume %p\n", FileFsVolume); - TRACE("FileFsAttribute %p\n", FileFsAttribute); + TRACE("FileFsVolume %p\n", FileFsVolume); + TRACE("FileFsAttribute %p\n", FileFsAttribute); - if (!lpRootPathName || !wcscmp(lpRootPathName, L"")) - { - GetCurrentDirectoryW (MAX_PATH, RootPathName); - } - else - { - wcsncpy (RootPathName, lpRootPathName, 3); - } - RootPathName[3] = 0; - - hFile = InternalOpenDirW(RootPathName, FALSE); - if (hFile == INVALID_HANDLE_VALUE) + if (!lpRootPathName || !wcscmp(lpRootPathName, L"")) { - return FALSE; + GetCurrentDirectoryW (MAX_PATH, RootPathName); + } + else + { + wcsncpy (RootPathName, lpRootPathName, 3); + } + RootPathName[3] = 0; + + hFile = InternalOpenDirW(RootPathName, FALSE); + if (hFile == INVALID_HANDLE_VALUE) + { + return FALSE; } - TRACE("hFile: %x\n", hFile); - errCode = NtQueryVolumeInformationFile(hFile, - &IoStatusBlock, - FileFsVolume, - FS_VOLUME_BUFFER_SIZE, - FileFsVolumeInformation); - if ( !NT_SUCCESS(errCode) ) + TRACE("hFile: %x\n", hFile); + errCode = NtQueryVolumeInformationFile(hFile, + &IoStatusBlock, + FileFsVolume, + FS_VOLUME_BUFFER_SIZE, + FileFsVolumeInformation); + if ( !NT_SUCCESS(errCode) ) { - WARN("Status: %x\n", errCode); - CloseHandle(hFile); - SetLastErrorByStatus (errCode); - return FALSE; + WARN("Status: %x\n", errCode); + CloseHandle(hFile); + SetLastErrorByStatus (errCode); + return FALSE; } - if (lpVolumeSerialNumber) - *lpVolumeSerialNumber = FileFsVolume->VolumeSerialNumber; + if (lpVolumeSerialNumber) + *lpVolumeSerialNumber = FileFsVolume->VolumeSerialNumber; - if (lpVolumeNameBuffer) + if (lpVolumeNameBuffer) { - if (nVolumeNameSize * sizeof(WCHAR) >= FileFsVolume->VolumeLabelLength + sizeof(WCHAR)) + if (nVolumeNameSize * sizeof(WCHAR) >= FileFsVolume->VolumeLabelLength + sizeof(WCHAR)) { - memcpy(lpVolumeNameBuffer, - FileFsVolume->VolumeLabel, - FileFsVolume->VolumeLabelLength); - lpVolumeNameBuffer[FileFsVolume->VolumeLabelLength / sizeof(WCHAR)] = 0; - } - else + memcpy(lpVolumeNameBuffer, + FileFsVolume->VolumeLabel, + FileFsVolume->VolumeLabelLength); + lpVolumeNameBuffer[FileFsVolume->VolumeLabelLength / sizeof(WCHAR)] = 0; + } + else { - CloseHandle(hFile); - SetLastError(ERROR_MORE_DATA); - return FALSE; - } + CloseHandle(hFile); + SetLastError(ERROR_MORE_DATA); + return FALSE; + } } - errCode = NtQueryVolumeInformationFile (hFile, - &IoStatusBlock, - FileFsAttribute, - FS_ATTRIBUTE_BUFFER_SIZE, - FileFsAttributeInformation); - CloseHandle(hFile); - if (!NT_SUCCESS(errCode)) + errCode = NtQueryVolumeInformationFile (hFile, + &IoStatusBlock, + FileFsAttribute, + FS_ATTRIBUTE_BUFFER_SIZE, + FileFsAttributeInformation); + CloseHandle(hFile); + if (!NT_SUCCESS(errCode)) { - WARN("Status: %x\n", errCode); - SetLastErrorByStatus (errCode); - return FALSE; + WARN("Status: %x\n", errCode); + SetLastErrorByStatus (errCode); + return FALSE; } - if (lpFileSystemFlags) - *lpFileSystemFlags = FileFsAttribute->FileSystemAttributes; - if (lpMaximumComponentLength) - *lpMaximumComponentLength = FileFsAttribute->MaximumComponentNameLength; - if (lpFileSystemNameBuffer) + if (lpFileSystemFlags) + *lpFileSystemFlags = FileFsAttribute->FileSystemAttributes; + if (lpMaximumComponentLength) + *lpMaximumComponentLength = FileFsAttribute->MaximumComponentNameLength; + if (lpFileSystemNameBuffer) { - if (nFileSystemNameSize * sizeof(WCHAR) >= FileFsAttribute->FileSystemNameLength + sizeof(WCHAR)) + if (nFileSystemNameSize * sizeof(WCHAR) >= FileFsAttribute->FileSystemNameLength + sizeof(WCHAR)) { - memcpy(lpFileSystemNameBuffer, - FileFsAttribute->FileSystemName, - FileFsAttribute->FileSystemNameLength); - lpFileSystemNameBuffer[FileFsAttribute->FileSystemNameLength / sizeof(WCHAR)] = 0; - } - else + memcpy(lpFileSystemNameBuffer, + FileFsAttribute->FileSystemName, + FileFsAttribute->FileSystemNameLength); + lpFileSystemNameBuffer[FileFsAttribute->FileSystemNameLength / sizeof(WCHAR)] = 0; + } + else { - SetLastError(ERROR_MORE_DATA); - return FALSE; - } + SetLastError(ERROR_MORE_DATA); + return FALSE; + } } - return TRUE; + return TRUE; } @@ -795,34 +795,34 @@ GetVolumeInformationW( BOOL WINAPI SetVolumeLabelA ( - LPCSTR lpRootPathName, - LPCSTR lpVolumeName /* NULL if deleting label */ - ) + LPCSTR lpRootPathName, + LPCSTR lpVolumeName /* NULL if deleting label */ +) { - PWCHAR RootPathNameW; - PWCHAR VolumeNameW = NULL; - BOOL Result; + PWCHAR RootPathNameW; + PWCHAR VolumeNameW = NULL; + BOOL Result; - if (!(RootPathNameW = FilenameA2W(lpRootPathName, FALSE))) - return FALSE; + if (!(RootPathNameW = FilenameA2W(lpRootPathName, FALSE))) + return FALSE; - if (lpVolumeName) - { - if (!(VolumeNameW = FilenameA2W(lpVolumeName, TRUE))) - return FALSE; - } + if (lpVolumeName) + { + if (!(VolumeNameW = FilenameA2W(lpVolumeName, TRUE))) + return FALSE; + } - Result = SetVolumeLabelW (RootPathNameW, - VolumeNameW); + Result = SetVolumeLabelW (RootPathNameW, + VolumeNameW); - if (VolumeNameW) - { - RtlFreeHeap (RtlGetProcessHeap (), - 0, - VolumeNameW ); - } + if (VolumeNameW) + { + RtlFreeHeap (RtlGetProcessHeap (), + 0, + VolumeNameW ); + } - return Result; + return Result; } @@ -831,61 +831,61 @@ SetVolumeLabelA ( */ BOOL WINAPI SetVolumeLabelW( - LPCWSTR lpRootPathName, - LPCWSTR lpVolumeName /* NULL if deleting label */ - ) + LPCWSTR lpRootPathName, + LPCWSTR lpVolumeName /* NULL if deleting label */ +) { - PFILE_FS_LABEL_INFORMATION LabelInfo; - IO_STATUS_BLOCK IoStatusBlock; - ULONG LabelLength; - HANDLE hFile; - NTSTATUS Status; + PFILE_FS_LABEL_INFORMATION LabelInfo; + IO_STATUS_BLOCK IoStatusBlock; + ULONG LabelLength; + HANDLE hFile; + NTSTATUS Status; - LabelLength = wcslen(lpVolumeName) * sizeof(WCHAR); - LabelInfo = RtlAllocateHeap(RtlGetProcessHeap(), - 0, - sizeof(FILE_FS_LABEL_INFORMATION) + - LabelLength); - if (LabelInfo == NULL) - { - SetLastError(ERROR_NOT_ENOUGH_MEMORY); - return FALSE; - } - LabelInfo->VolumeLabelLength = LabelLength; - memcpy(LabelInfo->VolumeLabel, - lpVolumeName, - LabelLength); - - hFile = InternalOpenDirW(lpRootPathName, TRUE); - if (INVALID_HANDLE_VALUE == hFile) - { - RtlFreeHeap(RtlGetProcessHeap(), - 0, - LabelInfo); + LabelLength = wcslen(lpVolumeName) * sizeof(WCHAR); + LabelInfo = RtlAllocateHeap(RtlGetProcessHeap(), + 0, + sizeof(FILE_FS_LABEL_INFORMATION) + + LabelLength); + if (LabelInfo == NULL) + { + SetLastError(ERROR_NOT_ENOUGH_MEMORY); return FALSE; - } + } + LabelInfo->VolumeLabelLength = LabelLength; + memcpy(LabelInfo->VolumeLabel, + lpVolumeName, + LabelLength); - Status = NtSetVolumeInformationFile(hFile, - &IoStatusBlock, - LabelInfo, - sizeof(FILE_FS_LABEL_INFORMATION) + - LabelLength, - FileFsLabelInformation); + hFile = InternalOpenDirW(lpRootPathName, TRUE); + if (INVALID_HANDLE_VALUE == hFile) + { + RtlFreeHeap(RtlGetProcessHeap(), + 0, + LabelInfo); + return FALSE; + } - RtlFreeHeap(RtlGetProcessHeap(), - 0, - LabelInfo); + Status = NtSetVolumeInformationFile(hFile, + &IoStatusBlock, + LabelInfo, + sizeof(FILE_FS_LABEL_INFORMATION) + + LabelLength, + FileFsLabelInformation); - if (!NT_SUCCESS(Status)) - { - WARN("Status: %x\n", Status); - CloseHandle(hFile); - SetLastErrorByStatus(Status); - return FALSE; - } + RtlFreeHeap(RtlGetProcessHeap(), + 0, + LabelInfo); - CloseHandle(hFile); - return TRUE; + if (!NT_SUCCESS(Status)) + { + WARN("Status: %x\n", Status); + CloseHandle(hFile); + SetLastErrorByStatus(Status); + return FALSE; + } + + CloseHandle(hFile); + return TRUE; } /** @@ -909,217 +909,217 @@ SetVolumeLabelW( BOOL WINAPI GetVolumeNameForVolumeMountPointW( - IN LPCWSTR VolumeMountPoint, - OUT LPWSTR VolumeName, - IN DWORD VolumeNameLength) + IN LPCWSTR VolumeMountPoint, + OUT LPWSTR VolumeName, + IN DWORD VolumeNameLength) { - UNICODE_STRING NtFileName; - OBJECT_ATTRIBUTES ObjectAttributes; - HANDLE FileHandle; - IO_STATUS_BLOCK Iosb; - ULONG BufferLength; - PMOUNTDEV_NAME MountDevName; - PMOUNTMGR_MOUNT_POINT MountPoint; - ULONG MountPointSize; - PMOUNTMGR_MOUNT_POINTS MountPoints; - ULONG Index; - PUCHAR SymbolicLinkName; - BOOL Result; - NTSTATUS Status; + UNICODE_STRING NtFileName; + OBJECT_ATTRIBUTES ObjectAttributes; + HANDLE FileHandle; + IO_STATUS_BLOCK Iosb; + ULONG BufferLength; + PMOUNTDEV_NAME MountDevName; + PMOUNTMGR_MOUNT_POINT MountPoint; + ULONG MountPointSize; + PMOUNTMGR_MOUNT_POINTS MountPoints; + ULONG Index; + PUCHAR SymbolicLinkName; + BOOL Result; + NTSTATUS Status; - if (!VolumeMountPoint || !VolumeMountPoint[0]) - { - SetLastError(ERROR_PATH_NOT_FOUND); - return FALSE; - } + if (!VolumeMountPoint || !VolumeMountPoint[0]) + { + SetLastError(ERROR_PATH_NOT_FOUND); + return FALSE; + } - /* - * First step is to convert the passed volume mount point name to - * an NT acceptable name. - */ + /* + * First step is to convert the passed volume mount point name to + * an NT acceptable name. + */ - if (!RtlDosPathNameToNtPathName_U(VolumeMountPoint, &NtFileName, NULL, NULL)) - { - SetLastError(ERROR_PATH_NOT_FOUND); - return FALSE; - } + if (!RtlDosPathNameToNtPathName_U(VolumeMountPoint, &NtFileName, NULL, NULL)) + { + SetLastError(ERROR_PATH_NOT_FOUND); + return FALSE; + } - if (NtFileName.Length > sizeof(WCHAR) && - NtFileName.Buffer[(NtFileName.Length / sizeof(WCHAR)) - 1] == '\\') - { - NtFileName.Length -= sizeof(WCHAR); - } + if (NtFileName.Length > sizeof(WCHAR) && + NtFileName.Buffer[(NtFileName.Length / sizeof(WCHAR)) - 1] == '\\') + { + NtFileName.Length -= sizeof(WCHAR); + } - /* - * Query mount point device name which we will later use for determining - * the volume name. - */ + /* + * Query mount point device name which we will later use for determining + * the volume name. + */ - InitializeObjectAttributes(&ObjectAttributes, &NtFileName, 0, NULL, NULL); - Status = NtOpenFile(&FileHandle, FILE_READ_ATTRIBUTES | SYNCHRONIZE, - &ObjectAttributes, &Iosb, - FILE_SHARE_READ | FILE_SHARE_WRITE, - FILE_SYNCHRONOUS_IO_NONALERT); - RtlFreeUnicodeString(&NtFileName); - if (!NT_SUCCESS(Status)) - { - SetLastErrorByStatus(Status); - return FALSE; - } + InitializeObjectAttributes(&ObjectAttributes, &NtFileName, 0, NULL, NULL); + Status = NtOpenFile(&FileHandle, FILE_READ_ATTRIBUTES | SYNCHRONIZE, + &ObjectAttributes, &Iosb, + FILE_SHARE_READ | FILE_SHARE_WRITE, + FILE_SYNCHRONOUS_IO_NONALERT); + RtlFreeUnicodeString(&NtFileName); + if (!NT_SUCCESS(Status)) + { + SetLastErrorByStatus(Status); + return FALSE; + } - BufferLength = sizeof(MOUNTDEV_NAME) + 50 * sizeof(WCHAR); - do - { - MountDevName = RtlAllocateHeap(RtlGetProcessHeap(), 0, BufferLength); - if (MountDevName == NULL) - { - NtClose(FileHandle); - SetLastError(ERROR_NOT_ENOUGH_MEMORY); - return FALSE; - } - - Status = NtDeviceIoControlFile(FileHandle, NULL, NULL, NULL, &Iosb, - IOCTL_MOUNTDEV_QUERY_DEVICE_NAME, - NULL, 0, MountDevName, BufferLength); - if (!NT_SUCCESS(Status)) - { - RtlFreeHeap(GetProcessHeap(), 0, MountDevName); - if (Status == STATUS_BUFFER_OVERFLOW) - { - BufferLength = sizeof(MOUNTDEV_NAME) + MountDevName->NameLength; - continue; - } - else - { + BufferLength = sizeof(MOUNTDEV_NAME) + 50 * sizeof(WCHAR); + do + { + MountDevName = RtlAllocateHeap(RtlGetProcessHeap(), 0, BufferLength); + if (MountDevName == NULL) + { NtClose(FileHandle); - SetLastErrorByStatus(Status); + SetLastError(ERROR_NOT_ENOUGH_MEMORY); return FALSE; - } - } - } - while (!NT_SUCCESS(Status)); + } - NtClose(FileHandle); - - /* - * Get the mount point information from mount manager. - */ - - MountPointSize = MountDevName->NameLength + sizeof(MOUNTMGR_MOUNT_POINT); - MountPoint = RtlAllocateHeap(GetProcessHeap(), 0, MountPointSize); - if (MountPoint == NULL) - { - RtlFreeHeap(GetProcessHeap(), 0, MountDevName); - SetLastError(ERROR_NOT_ENOUGH_MEMORY); - return FALSE; - } - RtlZeroMemory(MountPoint, sizeof(MOUNTMGR_MOUNT_POINT)); - MountPoint->DeviceNameOffset = sizeof(MOUNTMGR_MOUNT_POINT); - MountPoint->DeviceNameLength = MountDevName->NameLength; - RtlCopyMemory(MountPoint + 1, MountDevName->Name, MountDevName->NameLength); - RtlFreeHeap(RtlGetProcessHeap(), 0, MountDevName); - - RtlInitUnicodeString(&NtFileName, L"\\??\\MountPointManager"); - InitializeObjectAttributes(&ObjectAttributes, &NtFileName, 0, NULL, NULL); - Status = NtOpenFile(&FileHandle, FILE_GENERIC_READ | SYNCHRONIZE, &ObjectAttributes, - &Iosb, FILE_SHARE_READ | FILE_SHARE_WRITE, - FILE_SYNCHRONOUS_IO_NONALERT); - if (!NT_SUCCESS(Status)) - { - SetLastErrorByStatus(Status); - RtlFreeHeap(RtlGetProcessHeap(), 0, MountPoint); - return FALSE; - } - - BufferLength = sizeof(MOUNTMGR_MOUNT_POINTS); - do - { - MountPoints = RtlAllocateHeap(RtlGetProcessHeap(), 0, BufferLength); - if (MountPoints == NULL) - { - RtlFreeHeap(RtlGetProcessHeap(), 0, MountPoint); - NtClose(FileHandle); - SetLastError(ERROR_NOT_ENOUGH_MEMORY); - return FALSE; - } - - Status = NtDeviceIoControlFile(FileHandle, NULL, NULL, NULL, &Iosb, - IOCTL_MOUNTMGR_QUERY_POINTS, - MountPoint, MountPointSize, - MountPoints, BufferLength); - if (!NT_SUCCESS(Status)) - { - if (Status == STATUS_BUFFER_OVERFLOW) - { - BufferLength = MountPoints->Size; - RtlFreeHeap(RtlGetProcessHeap(), 0, MountPoints); - continue; - } - else if (!NT_SUCCESS(Status)) - { - RtlFreeHeap(RtlGetProcessHeap(), 0, MountPoint); - RtlFreeHeap(RtlGetProcessHeap(), 0, MountPoints); - NtClose(FileHandle); - SetLastErrorByStatus(Status); - return FALSE; - } - } - } - while (!NT_SUCCESS(Status)); - - RtlFreeHeap(RtlGetProcessHeap(), 0, MountPoint); - NtClose(FileHandle); - - /* - * Now we've gathered info about all mount points mapped to our device, so - * select the correct one and copy it into the output buffer. - */ - - for (Index = 0; Index < MountPoints->NumberOfMountPoints; Index++) - { - MountPoint = MountPoints->MountPoints + Index; - SymbolicLinkName = (PUCHAR)MountPoints + MountPoint->SymbolicLinkNameOffset; - - /* - * Check for "\\?\Volume{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}\" - * (with the last slash being optional) style symbolic links. - */ - - if (MountPoint->SymbolicLinkNameLength == 48 * sizeof(WCHAR) || - (MountPoint->SymbolicLinkNameLength == 49 * sizeof(WCHAR) && - SymbolicLinkName[48] == L'\\')) - { - if (RtlCompareMemory(SymbolicLinkName, L"\\??\\Volume{", - 11 * sizeof(WCHAR)) == 11 * sizeof(WCHAR) && - SymbolicLinkName[19] == L'-' && SymbolicLinkName[24] == L'-' && - SymbolicLinkName[29] == L'-' && SymbolicLinkName[34] == L'-' && - SymbolicLinkName[47] == L'}') - { - if (VolumeNameLength >= MountPoint->SymbolicLinkNameLength / sizeof(WCHAR)) + Status = NtDeviceIoControlFile(FileHandle, NULL, NULL, NULL, &Iosb, + IOCTL_MOUNTDEV_QUERY_DEVICE_NAME, + NULL, 0, MountDevName, BufferLength); + if (!NT_SUCCESS(Status)) + { + RtlFreeHeap(GetProcessHeap(), 0, MountDevName); + if (Status == STATUS_BUFFER_OVERFLOW) { - RtlCopyMemory(VolumeName, - (PUCHAR)MountPoints + MountPoint->SymbolicLinkNameOffset, - MountPoint->SymbolicLinkNameLength); - VolumeName[1] = L'\\'; - Result = TRUE; + BufferLength = sizeof(MOUNTDEV_NAME) + MountDevName->NameLength; + continue; } else { - SetLastError(ERROR_FILENAME_EXCED_RANGE); - Result = FALSE; + NtClose(FileHandle); + SetLastErrorByStatus(Status); + return FALSE; } + } + } + while (!NT_SUCCESS(Status)); - RtlFreeHeap(RtlGetProcessHeap(), 0, MountPoints); + NtClose(FileHandle); - return Result; - } - } - } + /* + * Get the mount point information from mount manager. + */ - RtlFreeHeap(RtlGetProcessHeap(), 0, MountPoints); - SetLastError(ERROR_INVALID_PARAMETER); + MountPointSize = MountDevName->NameLength + sizeof(MOUNTMGR_MOUNT_POINT); + MountPoint = RtlAllocateHeap(GetProcessHeap(), 0, MountPointSize); + if (MountPoint == NULL) + { + RtlFreeHeap(GetProcessHeap(), 0, MountDevName); + SetLastError(ERROR_NOT_ENOUGH_MEMORY); + return FALSE; + } + RtlZeroMemory(MountPoint, sizeof(MOUNTMGR_MOUNT_POINT)); + MountPoint->DeviceNameOffset = sizeof(MOUNTMGR_MOUNT_POINT); + MountPoint->DeviceNameLength = MountDevName->NameLength; + RtlCopyMemory(MountPoint + 1, MountDevName->Name, MountDevName->NameLength); + RtlFreeHeap(RtlGetProcessHeap(), 0, MountDevName); - return FALSE; + RtlInitUnicodeString(&NtFileName, L"\\??\\MountPointManager"); + InitializeObjectAttributes(&ObjectAttributes, &NtFileName, 0, NULL, NULL); + Status = NtOpenFile(&FileHandle, FILE_GENERIC_READ | SYNCHRONIZE, &ObjectAttributes, + &Iosb, FILE_SHARE_READ | FILE_SHARE_WRITE, + FILE_SYNCHRONOUS_IO_NONALERT); + if (!NT_SUCCESS(Status)) + { + SetLastErrorByStatus(Status); + RtlFreeHeap(RtlGetProcessHeap(), 0, MountPoint); + return FALSE; + } + + BufferLength = sizeof(MOUNTMGR_MOUNT_POINTS); + do + { + MountPoints = RtlAllocateHeap(RtlGetProcessHeap(), 0, BufferLength); + if (MountPoints == NULL) + { + RtlFreeHeap(RtlGetProcessHeap(), 0, MountPoint); + NtClose(FileHandle); + SetLastError(ERROR_NOT_ENOUGH_MEMORY); + return FALSE; + } + + Status = NtDeviceIoControlFile(FileHandle, NULL, NULL, NULL, &Iosb, + IOCTL_MOUNTMGR_QUERY_POINTS, + MountPoint, MountPointSize, + MountPoints, BufferLength); + if (!NT_SUCCESS(Status)) + { + if (Status == STATUS_BUFFER_OVERFLOW) + { + BufferLength = MountPoints->Size; + RtlFreeHeap(RtlGetProcessHeap(), 0, MountPoints); + continue; + } + else if (!NT_SUCCESS(Status)) + { + RtlFreeHeap(RtlGetProcessHeap(), 0, MountPoint); + RtlFreeHeap(RtlGetProcessHeap(), 0, MountPoints); + NtClose(FileHandle); + SetLastErrorByStatus(Status); + return FALSE; + } + } + } + while (!NT_SUCCESS(Status)); + + RtlFreeHeap(RtlGetProcessHeap(), 0, MountPoint); + NtClose(FileHandle); + + /* + * Now we've gathered info about all mount points mapped to our device, so + * select the correct one and copy it into the output buffer. + */ + + for (Index = 0; Index < MountPoints->NumberOfMountPoints; Index++) + { + MountPoint = MountPoints->MountPoints + Index; + SymbolicLinkName = (PUCHAR)MountPoints + MountPoint->SymbolicLinkNameOffset; + + /* + * Check for "\\?\Volume{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}\" + * (with the last slash being optional) style symbolic links. + */ + + if (MountPoint->SymbolicLinkNameLength == 48 * sizeof(WCHAR) || + (MountPoint->SymbolicLinkNameLength == 49 * sizeof(WCHAR) && + SymbolicLinkName[48] == L'\\')) + { + if (RtlCompareMemory(SymbolicLinkName, L"\\??\\Volume{", + 11 * sizeof(WCHAR)) == 11 * sizeof(WCHAR) && + SymbolicLinkName[19] == L'-' && SymbolicLinkName[24] == L'-' && + SymbolicLinkName[29] == L'-' && SymbolicLinkName[34] == L'-' && + SymbolicLinkName[47] == L'}') + { + if (VolumeNameLength >= MountPoint->SymbolicLinkNameLength / sizeof(WCHAR)) + { + RtlCopyMemory(VolumeName, + (PUCHAR)MountPoints + MountPoint->SymbolicLinkNameOffset, + MountPoint->SymbolicLinkNameLength); + VolumeName[1] = L'\\'; + Result = TRUE; + } + else + { + SetLastError(ERROR_FILENAME_EXCED_RANGE); + Result = FALSE; + } + + RtlFreeHeap(RtlGetProcessHeap(), 0, MountPoints); + + return Result; + } + } + } + + RtlFreeHeap(RtlGetProcessHeap(), 0, MountPoints); + SetLastError(ERROR_INVALID_PARAMETER); + + return FALSE; } /* @@ -1131,7 +1131,7 @@ GetVolumeNameForVolumeMountPointA( LPCSTR lpszVolumeMountPoint, LPSTR lpszVolumeName, DWORD cchBufferLength - ) +) { BOOL ret; WCHAR volumeW[50], *pathW = NULL; @@ -1155,9 +1155,9 @@ GetVolumeNameForVolumeMountPointA( HANDLE WINAPI FindFirstVolumeW( - LPWSTR volume, - DWORD len - ) + LPWSTR volume, + DWORD len +) { DWORD size = 1024; HANDLE mgr = CreateFileW( MOUNTMGR_DOS_DEVICE_NAME, 0, FILE_SHARE_READ|FILE_SHARE_WRITE, @@ -1204,9 +1204,9 @@ FindFirstVolumeW( HANDLE WINAPI FindFirstVolumeA( - LPSTR volume, - DWORD len - ) + LPSTR volume, + DWORD len +) { WCHAR *buffer = NULL; HANDLE handle; @@ -1240,7 +1240,7 @@ BOOL WINAPI FindVolumeClose( HANDLE hFindVolume - ) +) { return RtlFreeHeap(RtlGetProcessHeap(), 0, hFindVolume); } @@ -1328,12 +1328,12 @@ GetVolumePathNameW(LPCWSTR lpszFileName, } while (!GetVolumeNameForVolumeMountPointW(UnicodeFilePath.Buffer, - VolumeName, - MAX_PATH)) + VolumeName, + MAX_PATH)) { if (((UnicodeFilePath.Length == 4) && (UnicodeFilePath.Buffer[0] == '\\') && - (UnicodeFilePath.Buffer[1] == '\\')) || ((UnicodeFilePath.Length == 6) && - (UnicodeFilePath.Buffer[1] == ':'))) + (UnicodeFilePath.Buffer[1] == '\\')) || ((UnicodeFilePath.Length == 6) && + (UnicodeFilePath.Buffer[1] == ':'))) { break; } From 2081b4bf88abd7b05c80e1e713d2f21ffcb167dc Mon Sep 17 00:00:00 2001 From: Olaf Siejka Date: Fri, 29 Apr 2011 13:07:12 +0000 Subject: [PATCH 235/317] - Swedish translation of charmap, find, dxdiag, mmc, mplay32, msconfig, devmgmt, eventvwr, servman, mstsc, ipconfig, ping, notepad, rapps, regedit, 3dtext, logon, shutdown, sndrec32, sndvol32, usetup, vminst and cmd. Patch by Jan Blomqvist Kinander (JaixBly [at] spray [dot] se) [SETUP][USETUP] - Translation update by Adam "Saibamen" Stachowicz. See issue #6171 for more details svn path=/trunk/; revision=51492 --- .../base/applications/charmap/lang/sv-SE.rc | 3 +- .../applications/cmdutils/find/lang/sv-SE.rc | 2 +- .../base/applications/dxdiag/lang/sv-SE.rc | 16 +- reactos/base/applications/mmc/lang/sv-SE.rc | 8 +- .../base/applications/mplay32/lang/sv-SE.rc | 35 + reactos/base/applications/mplay32/rsrc.rc | 1 + .../base/applications/msconfig/lang/sv-SE.rc | 180 +++++ reactos/base/applications/msconfig/rsrc.rc | 1 + .../mscutils/devmgmt/lang/sv-SE.rc | 88 +++ .../applications/mscutils/devmgmt/rsrc.rc | 1 + .../mscutils/eventvwr/lang/sv-SE.rc | 117 +++ .../applications/mscutils/eventvwr/rsrc.rc | 1 + .../mscutils/servman/lang/sv-SE.rc | 288 +++++++ .../applications/mscutils/servman/rsrc.rc | 1 + reactos/base/applications/mstsc/lang/sv-SE.rc | 69 ++ reactos/base/applications/mstsc/rsrc.rc | 1 + .../applications/network/ipconfig/ipconfig.rc | 1 + .../network/ipconfig/lang/sv-SE.rc | 71 ++ .../applications/network/ping/lang/sv-SE.rc | 41 + .../base/applications/network/ping/ping.rc | 3 +- .../base/applications/notepad/lang/no-NO.rc | 4 +- .../base/applications/notepad/lang/sv-SE.rc | 32 +- reactos/base/applications/rapps/lang/sv-SE.rc | 22 +- .../base/applications/regedit/lang/sv-SE.rc | 116 +-- .../screensavers/3dtext/lang/sv-SE.rc | 17 + .../applications/screensavers/3dtext/rsrc.rc | 1 + .../screensavers/logon/lang/sv-SE.rc | 13 + .../applications/screensavers/logon/logon.rc | 1 + .../base/applications/shutdown/lang/sv-SE.rc | 20 + reactos/base/applications/shutdown/rsrc.rc | 1 + .../base/applications/sndrec32/lang/sv-SE.rc | 60 ++ reactos/base/applications/sndrec32/rsrc.rc | 1 + .../base/applications/sndvol32/lang/sv-SE.rc | 13 +- reactos/base/setup/reactos/lang/pl-PL.rc | 16 +- reactos/base/setup/usetup/lang/pl-PL.h | 76 +- reactos/base/setup/usetup/lang/sv-SE.h | 388 +++++----- reactos/base/setup/vmwinst/lang/sv-SE.rc | 137 ++++ reactos/base/setup/vmwinst/rsrc.rc | 1 + reactos/base/shell/cmd/lang/sv-SE.rc | 713 ++++++++++++++++++ 39 files changed, 2218 insertions(+), 342 deletions(-) create mode 100644 reactos/base/applications/mplay32/lang/sv-SE.rc create mode 100644 reactos/base/applications/msconfig/lang/sv-SE.rc create mode 100644 reactos/base/applications/mscutils/devmgmt/lang/sv-SE.rc create mode 100644 reactos/base/applications/mscutils/eventvwr/lang/sv-SE.rc create mode 100644 reactos/base/applications/mscutils/servman/lang/sv-SE.rc create mode 100644 reactos/base/applications/mstsc/lang/sv-SE.rc create mode 100644 reactos/base/applications/network/ipconfig/lang/sv-SE.rc create mode 100644 reactos/base/applications/network/ping/lang/sv-SE.rc create mode 100644 reactos/base/applications/screensavers/3dtext/lang/sv-SE.rc create mode 100644 reactos/base/applications/screensavers/logon/lang/sv-SE.rc create mode 100644 reactos/base/applications/shutdown/lang/sv-SE.rc create mode 100644 reactos/base/applications/sndrec32/lang/sv-SE.rc create mode 100644 reactos/base/setup/vmwinst/lang/sv-SE.rc create mode 100644 reactos/base/shell/cmd/lang/sv-SE.rc diff --git a/reactos/base/applications/charmap/lang/sv-SE.rc b/reactos/base/applications/charmap/lang/sv-SE.rc index 3b314d05fe7..bd5da0a1a24 100644 --- a/reactos/base/applications/charmap/lang/sv-SE.rc +++ b/reactos/base/applications/charmap/lang/sv-SE.rc @@ -3,7 +3,8 @@ * FILE: \base\applications\charmap\lang\sv-SE.rc * PURPOSE: Swedish resource file * Translation: Jaix Bly - */LANGUAGE LANG_SWEDISH, SUBLANG_NEUTRAL + */ + LANGUAGE LANG_SWEDISH, SUBLANG_NEUTRAL IDD_CHARMAP DIALOGEX 6, 6, 293, 205 //233 CAPTION "Teckenuppsttning" diff --git a/reactos/base/applications/cmdutils/find/lang/sv-SE.rc b/reactos/base/applications/cmdutils/find/lang/sv-SE.rc index 12b9fa58391..6d5518ed3c5 100644 --- a/reactos/base/applications/cmdutils/find/lang/sv-SE.rc +++ b/reactos/base/applications/cmdutils/find/lang/sv-SE.rc @@ -5,7 +5,7 @@ BEGIN IDS_USAGE, "FIND: Skriver ut alla rader i en fil som innehller en strng.\n\n\ FIND [ /C ] [ /I ] [ /N ] [ /V ] ""strng"" [ fil... ]\n\ - /C Rkna nummren av linjer som innehller en strngen\n\ + /C Rkna antalet rader som innehller en strngen\n\ /I Ignorera skiftlge\n\ /N Antal visade rader, brjar p 1\n\ /V Skriver ut rader som inte innehller strngen" diff --git a/reactos/base/applications/dxdiag/lang/sv-SE.rc b/reactos/base/applications/dxdiag/lang/sv-SE.rc index eb27eb55359..bf737dda281 100644 --- a/reactos/base/applications/dxdiag/lang/sv-SE.rc +++ b/reactos/base/applications/dxdiag/lang/sv-SE.rc @@ -25,9 +25,9 @@ STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN FONT 8, "MS Shell Dlg" BEGIN LTEXT "Detta verktyget rapporterar detaljerad information om ReactX komponenter och enheter som r installerade p ditt system.", -1, 10, 10, 443, 17 - LTEXT "Om du vet vilket omrde som skapar problemer, vlger du den aktuella kategorin ovanfr. Om inte, kan du anvnda knappen ""Nsta sida"" nedanfr fr att beska alla sidorna sekventiellt.", -1, 10, 30, 443, 25 + LTEXT "Om du vet vilket omrde som skapar problem, kan du klicka p motsvarande flik ovanfr. Om inte, kan du anvnda knappen ""Nsta sida"" nedanfr fr att beska alla sidorna sekventiellt.", -1, 10, 30, 443, 25 GROUPBOX "System Information", -1, 10, 55, 443, 130, SS_RIGHT - LTEXT "Nuvarende Datum/Tid:", -1, 70, 70, 80, 10, SS_RIGHT + LTEXT "Aktuellt Datum/Tid:", -1, 70, 70, 80, 10, SS_RIGHT LTEXT "Datornamn:", -1, 70, 80, 80, 10, SS_RIGHT LTEXT "Operativsystem:", -1, 70, 90, 80, 10, SS_RIGHT LTEXT "Sprk:", -1, 70, 100, 80, 10, SS_RIGHT @@ -191,8 +191,8 @@ BEGIN IDS_FORMAT_UNIPROC "%s (%u processor)" IDS_FORMAT_MPPROC "%s (%u procesorer)" IDS_VERSION_UNKNOWN "Oknd version" - IDS_DEVICE_STATUS_ATTACHED "Kopplad till" - IDS_DEVICE_STATUS_MISSING "Kopplad frn" + IDS_DEVICE_STATUS_ATTACHED "Ansluten" + IDS_DEVICE_STATUS_MISSING "Saknas" IDS_DEVICE_STATUS_UNKNOWN "Oknd" IDS_DEVICE_NAME "Enhetsnamn" IDS_DEVICE_STATUS "Status" @@ -210,10 +210,10 @@ BEGIN IDS_DIRECTPLAY8_SERIALSP "DirectPlay8 Serial Service Provider" IDS_DIRECTPLAY8_IPXSP "DirectPlay8 IPX Service Provider" IDS_DIRECTPLAY8_TCPSP "DirectPlay8-TCP/IP Service Provider" - IDS_DIRECTPLAY_TCPCONN "Internet TCP/IP koppling for DirectPlay" - IDS_DIRECTPLAY_IPXCONN "IPX koppling for DirectPlay" - IDS_DIRECTPLAY_MODEMCONN "Modem koppling for DirectPlay" - IDS_DIRECTPLAY_SERIALCONN "Serial kopplig for DirectPlay" + IDS_DIRECTPLAY_TCPCONN "Internet TCP/IP koppling fr DirectPlay" + IDS_DIRECTPLAY_IPXCONN "IPX koppling fr DirectPlay" + IDS_DIRECTPLAY_MODEMCONN "Modemkoppling fr DirectPlay" + IDS_DIRECTPLAY_SERIALCONN "Seriell kopplig fr DirectPlay" IDS_REG_SUCCESS "OK" IDS_REG_FAIL "Fel" IDS_DDTEST_ERROR "Testet misslyckes!" diff --git a/reactos/base/applications/mmc/lang/sv-SE.rc b/reactos/base/applications/mmc/lang/sv-SE.rc index cefb5e91c68..aad29a76fed 100644 --- a/reactos/base/applications/mmc/lang/sv-SE.rc +++ b/reactos/base/applications/mmc/lang/sv-SE.rc @@ -1,4 +1,10 @@ -LANGUAGE LANG_NORWEGIAN, SUBLANG_NEUTRAL +/* + * PROJECT: ReactOS RAPPS + * FILE: \base\applications\mmc\lang\sv-SE.rc + * PURPOSE: Swedish resource file + * Translation: Jaix Bly + */ +LANGUAGE LANG_SWEDISH, SUBLANG_NEUTRAL IDM_CONSOLEROOT MENU DISCARDABLE BEGIN diff --git a/reactos/base/applications/mplay32/lang/sv-SE.rc b/reactos/base/applications/mplay32/lang/sv-SE.rc new file mode 100644 index 00000000000..42f5dc336d7 --- /dev/null +++ b/reactos/base/applications/mplay32/lang/sv-SE.rc @@ -0,0 +1,35 @@ +/* + * PROJECT: ReactOS RAPPS + * FILE: \base\applications\mplay32\lang\sv-SE.rc + * PURPOSE: Swedish resource file + * Translation: Jaix Bly + */ +LANGUAGE LANG_SWEDISH, SUBLANG_NEUTRAL + +IDR_MAINMENU MENU +BEGIN + POPUP "&Arkiv" + BEGIN + MENUITEM "&ppna...", IDM_OPEN_FILE + MENUITEM "&Stng", IDM_CLOSE_FILE + MENUITEM SEPARATOR + MENUITEM "&Avsluta", IDM_EXIT + END + POPUP "&Hjlp" + BEGIN + MENUITEM "&Om...", IDM_ABOUT + END +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_ALL_TYPES_FILTER "Alla kompaktibla filer (*.wav, *.cda, *.midi, *.mid, *.avi)\0*.wav;*.cda;*.midi;*.mid;*.avi\0" + IDS_TOOLTIP_PLAY "Spela upp" + IDS_TOOLTIP_STOP "Stopp" + IDS_TOOLTIP_EJECT "Mata ut" + IDS_TOOLTIP_BACKWARD "Spola tillbaka" + IDS_TOOLTIP_SEEKBACK "Sk bakt" + IDS_TOOLTIP_SEEKFORW "Sk framt" + IDS_TOOLTIP_FORWARD "Spola fremt" + IDS_APPTITLE "ReactOS Multimediaspelare" +END diff --git a/reactos/base/applications/mplay32/rsrc.rc b/reactos/base/applications/mplay32/rsrc.rc index 3ca9862d228..0b15dfb63e4 100644 --- a/reactos/base/applications/mplay32/rsrc.rc +++ b/reactos/base/applications/mplay32/rsrc.rc @@ -14,4 +14,5 @@ #include "lang/pl-PL.rc" #include "lang/ru-RU.rc" #include "lang/sk-SK.rc" +#include "lang/sv-SE.rc" #include "lang/uk-UA.rc" diff --git a/reactos/base/applications/msconfig/lang/sv-SE.rc b/reactos/base/applications/msconfig/lang/sv-SE.rc new file mode 100644 index 00000000000..927417287c1 --- /dev/null +++ b/reactos/base/applications/msconfig/lang/sv-SE.rc @@ -0,0 +1,180 @@ +/* + * PROJECT: ReactOS APPS + * FILE: \base\applications\msconfig\lang\sv-SE.rc + * PURPOSE: Swedish resource file + * Translation: Jaix Bly + */ +LANGUAGE LANG_SWEDISH, SUBLANG_NEUTRAL + +IDD_MSCONFIG_DIALOG DIALOGEX DISCARDABLE 0, 0, 378, 220 +STYLE DS_SHELLFONT | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | + WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU | + WS_THICKFRAME +CAPTION "Systemkonfigurastion" +FONT 8, "MS Shell Dlg" +BEGIN + CONTROL "Tab1",IDC_TAB,"SysTabControl32",WS_TABSTOP,2,2,374,195 + DEFPUSHBUTTON "OK", IDOK, 211, 201, 50, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP + PUSHBUTTON "&Hjlp", IDC_BTN_HELP, 2, 201, 50, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP + PUSHBUTTON "Avbryt", IDCANCEL, 267, 201, 50, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP + PUSHBUTTON "Verkstll", IDC_BTN_APPLY, 323, 201, 50, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP +END + +IDD_STARTUP_PAGE DIALOGEX DISCARDABLE 0, 0, 362, 175 +STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN +FONT 8, "MS Shell Dlg" +BEGIN + CONTROL "List3",IDC_STARTUP_LIST, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP, 2, 1, 360, 148 + PUSHBUTTON "&Aktivera allt",IDC_BTN_STARTUP_ACTIVATE,223,155,66,14 + PUSHBUTTON "&Inaktivera allt",IDC_BTN_STARTUP_DEACTIVATE,295,155,66,14 +END + +IDD_SYSTEM_PAGE DIALOGEX DISCARDABLE 0, 0, 362, 175 +STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN +FONT 8, "MS Shell Dlg" +BEGIN + CONTROL "", 237, "SysTreeView32", TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | TVS_EDITLABELS | TVS_SHOWSELALWAYS | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP, 2, 1, 280, 148 + PUSHBUTTON "Flytta &upp", IDC_BTN_SYSTEM_UP, 290, 5, 66, 14 + PUSHBUTTON "Flytta &ner", IDC_BTN_SYSTEM_DOWN, 290, 25, 66, 14 + + PUSHBUTTON "&Aktivera", IDC_BTN_SYSTEM_ENABLE, 290, 50, 66, 14 + PUSHBUTTON "I&naktivera", IDC_BTN_SYSTEM_DISABLE, 290, 70, 66, 14 + + PUSHBUTTON "&Sk", IDC_BTN_SYSTEM_FIND, 290, 95, 66, 14 + PUSHBUTTON "&Ny", IDC_BTN_SYSTEM_NEW, 290, 115, 66, 14 + PUSHBUTTON "Re&digera", IDC_BTN_SYSTEM_EDIT, 290, 135, 66, 14 + + PUSHBUTTON "A&ktivera allt", IDC_BTN_SYSTEM_ACTIVATE, 123, 155, 66, 14 + PUSHBUTTON "I&naktivera allt",IDC_BTN_SYSTEM_DEACTIVATE, 195, 155, 66, 14 +END + +IDD_TOOLS_PAGE DIALOGEX DISCARDABLE 0, 0, 362, 175 +STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN +FONT 8, "MS Shell Dlg" +BEGIN + CONTROL "List2",IDC_TOOLS_LIST, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP, 2, 1, 360, 134 + EDITTEXT IDC_TOOLS_CMDLINE, 1, 139, 360, 12, ES_READONLY + PUSHBUTTON "&Kr", IDC_BTN_RUN, 311, 155, 50, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP +END + +IDD_SERVICES_PAGE DIALOGEX DISCARDABLE 0, 0, 362, 175 +STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN +FONT 8, "MS Shell Dlg" +BEGIN + CONTROL "List1",IDC_SERVICES_LIST,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SORTASCENDING | WS_BORDER | WS_TABSTOP,2,1,360,148 + PUSHBUTTON "&Aktivera allt",IDC_BTN_SERVICES_ACTIVATE,223,155,66,14 + PUSHBUTTON "&Inaktivera allt",IDC_BTN_SERVICES_DEACTIVATE,295,155,66,14 +END + +IDD_GENERAL_PAGE DIALOGEX DISCARDABLE 0, 0, 362, 175 +STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN +FONT 8, "MS Shell Dlg" +BEGIN + GROUPBOX "Uppstartsval", -1, 10, 10, 340, 150,0,WS_EX_TRANSPARENT + CONTROL "&Normal uppstart - ladda in alla drivrutiner och tjnster", IDC_CBX_NORMAL_START, "Button", 0x50010009, 20, 30, 236, 10 + CONTROL "&Diagnostisk uppstart - ladda bara in grundlggande drivrutiner och tjnster", IDC_CBX_DIAGNOSTIC_START, "Button", 0x50010009, 20, 45, 236, 10 + CONTROL "&Selektiv uppstart", IDC_CBX_SELECTIVE_STARTUP, "Button", 0x50010009, 20, 60, 70, 10 + AUTOCHECKBOX "L&adda in SYSTEM.INI Filen", IDC_CBX_SYSTEM_INI, 30, 80, 95, 10 + AUTOCHECKBOX "&Ladda in Systemtjnster", IDC_CBX_SYSTEM_SERVICE, 30, 95, 105, 10 + AUTOCHECKBOX "La&dda in uppstartsprylar", IDC_CBX_STARTUP_ITEM, 30, 110, 105, 10 +END + +IDD_FREELDR_PAGE DIALOGEX DISCARDABLE 0, 0, 362, 175 +STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN +FONT 8, "MS Shell Dlg" +BEGIN + CONTROL "", IDC_LIST_BOX, "ListBox", 0x50010141, 10, 10, 340, 50, 0x00000200 + PUSHBUTTON "&Undersk alla bootvgar", IDC_BTN_CHECK_BOOT_PATH, 10, 65, 75, 12 + PUSHBUTTON "&Stt som standard", IDC_BTN_SET_DEFAULT_BOOT, 100, 65, 70, 12 + PUSHBUTTON "Flytta &upp", IDC_BTN_MOVE_UP_BOOT_OPTION, 190, 65, 70, 12 + PUSHBUTTON "Flytta &ner", IDC_BTN_MOVE_DOWN_BOOT_OPTION, 280, 65, 70, 12 + GROUPBOX "Uppstarts alternativ", -1, 10, 80, 250, 95,0,WS_EX_TRANSPARENT + CHECKBOX "/S&ker uppstart", IDC_CBX_SAFE_BOOT, 15, 90, 95, 10 + CHECKBOX "/&Ingen grafisk uppstart", IDC_CBX_NO_GUI_BOOT, 15, 105, 95, 10 + CHECKBOX "/&Uppstartslogg", IDC_CBX_BOOT_LOG, 15, 120, 80, 10 + CHECKBOX "/Enkel &grafik", IDC_CBX_BASE_VIDEO, 15, 135, 95, 10 + CHECKBOX "/H&jlp", IDC_CBX_SOS, 15, 150, 50, 10 + PUSHBUTTON "Av&ancerade alternativ...", IDC_BTN_ADVANCED_OPTIONS, 100, 150, 93, 12 + LTEXT "&Timeout:", -1, 280, 91, 70, 10 + EDITTEXT IDC_TXT_BOOT_TIMEOUT, 280, 100, 25, 12, ES_LEFT + LTEXT "sekunder", -1, 310, 100, 85, 10 +END + +IDD_FREELDR_ADVANCED_PAGE DIALOGEX DISCARDABLE 0, 0, 175, 175 +STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN +FONT 8, "MS Shell Dlg" +BEGIN + CHECKBOX "/&Maximalt minnestorlek:=", IDC_CBX_MAX_MEM, 10, 10, 50, 10 + EDITTEXT IDC_TXT_MAX_MEM, 80, 10, 60, 12 + CONTROL "",IDC_SCR_MAX_MEM, "msctls_updown32", 0x50000000, 140, 10, 11, 11 + CHECKBOX "/&Antal processorer:=", IDC_CBX_NUM_PROC, 10, 25, 50, 10 + COMBOBOX IDC_DRP_NUM_PROC, 80, 25, 60, 10, CBS_DROPDOWNLIST | CBS_SORT | WS_CHILD | WS_VISIBLE | WS_TABSTOP + CHECKBOX "/&PCILOCK", IDC_CBX_PCI_LOCK, 10, 40, 50, 10 + CHECKBOX "/P&ROFIL", IDC_CBX_PROFILE, 10, 55, 50, 10 + CHECKBOX "/&IRQ", IDC_CBX_IRQ, 10, 70, 40, 12 + EDITTEXT IDC_TXT_IRQ, 80, 70, 60, 12, ES_LEFT + CHECKBOX "/&DEBUG", IDC_CBX_DEBUG, 10, 85, 40, 10 + CHECKBOX "/D&EBUGPORT", IDC_CBX_DEBUG_PORT, 20, 100, 60, 10 + COMBOBOX IDC_DRP_DEBUG_PORT, 80, 100, 60, 10, CBS_DROPDOWNLIST | CBS_SORT | WS_CHILD | WS_VISIBLE | WS_TABSTOP + CHECKBOX "/&BAUDRATE", IDC_CBX_BAUD_RATE, 20, 115, 50, 10 + COMBOBOX IDC_DRP_DRP_BAUD_RATE, 80, 115, 60, 10, CBS_DROPDOWNLIST | CBS_SORT | WS_CHILD | WS_VISIBLE | WS_TABSTOP + CHECKBOX "/&Kanal", IDC_CBX_CHANNEL, 20, 130, 50, 10 + EDITTEXT IDC_TXT_CHANNEL, 80, 130, 60, 12, ES_LEFT + CONTROL "",IDC_SCR_CHANNEL, "msctls_updown32", 0x50000000, 140, 130, 11, 11 + PUSHBUTTON "Ok", IDC_OK, 20, 160, 50, 12 + PUSHBUTTON "Avbryt", IDC_CANCEL, 100, 160, 50, 12 +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_MSCONFIG "Systemkonfiguration" + IDS_TAB_GENERAL "Generellt" + IDS_TAB_SYSTEM "SYSTEM.INI" + IDS_TAB_FREELDR "FREELDR.INI" + IDS_TAB_SERVICES "Tjnster" + IDS_TAB_STARTUP "Uppstart" + IDS_TAB_TOOLS "Verktyg" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_SERVICES_COLUMN_SERVICE "Tjnst" + IDS_SERVICES_COLUMN_REQ "Viktigt" + IDS_SERVICES_COLUMN_VENDOR "Tillverkare" + IDS_SERVICES_COLUMN_STATUS "Status" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_TOOLS_COLUMN_NAME "Namn" + IDS_TOOLS_COLUMN_DESCR "Beskrivning" + + IDS_TOOLS_CMD_NAME "Kommando prompt" + IDS_TOOLS_CMD_DESCR "Kommando tolk fr att kontrollera systemet" + IDS_TOOLS_CMD_CMD "cmd.exe" + + IDS_TOOLS_INFO_NAME "Version" + IDS_TOOLS_INFO_DESCR "Visa version information." + IDS_TOOLS_INFO_CMD "winver.exe" + + IDS_TOOLS_REGEDIT_NAME "Registereditor" + IDS_TOOLS_REGEDIT_DESCR "ppna registereditorn." + IDS_TOOLS_REGEDIT_CMD "regedit.exe" + + IDS_TOOLS_SYSDM_NAME "Systemegenskaper" + IDS_TOOLS_SYSDM_DESCR "Visa information om denna datorn." + IDS_TOOLS_SYSDM_CMD "control.exe" + IDS_TOOLS_SYSDM_PARAM "sysdm.cpl" + + IDS_STARTUP_COLUMN_ELEMENT "Element" + IDS_STARTUP_COLUMN_CMD "Kommando" + IDS_STARTUP_COLUMN_PATH "Plassering" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_SERVICES_STATUS_RUNNING "Krs" + IDS_SERVICES_STATUS_STOPPED "Stoppad" + IDS_SERVICES_YES "Ja" + IDS_SERVICES_UNKNOWN "Oknt" +END diff --git a/reactos/base/applications/msconfig/rsrc.rc b/reactos/base/applications/msconfig/rsrc.rc index c4bee6fafd1..7acc79c64e3 100644 --- a/reactos/base/applications/msconfig/rsrc.rc +++ b/reactos/base/applications/msconfig/rsrc.rc @@ -28,6 +28,7 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL #include "lang/ro-RO.rc" #include "lang/ru-RU.rc" #include "lang/sk-SK.rc" +#include "lang/sv-SE.rc" #include "lang/th-TH.rc" #include "lang/uk-UA.rc" #include "lang/zh-CN.rc" diff --git a/reactos/base/applications/mscutils/devmgmt/lang/sv-SE.rc b/reactos/base/applications/mscutils/devmgmt/lang/sv-SE.rc new file mode 100644 index 00000000000..84b0652bbe6 --- /dev/null +++ b/reactos/base/applications/mscutils/devmgmt/lang/sv-SE.rc @@ -0,0 +1,88 @@ +/* + * PROJECT: ReactOS APPS + * FILE: \base\applications\mscutils\devmgmt\lang\sv-SE.rc + * PURPOSE: Swedish resource file + * Translation: Jaix Bly + */ +LANGUAGE LANG_SWEDISH, SUBLANG_NEUTRAL + +IDR_MAINMENU MENU +BEGIN + POPUP "&Arkiv" + BEGIN + MENUITEM "A&vsluta", IDC_EXIT + END + POPUP "tgrd" + BEGIN + MENUITEM "Skriv ut", IDC_PRINT, GRAYED + MENUITEM SEPARATOR + MENUITEM "Egenskaper", IDC_PROP, GRAYED + MENUITEM SEPARATOR + MENUITEM "Hjlp", IDC_PROGHELP, GRAYED + END + POPUP "Visa" + BEGIN + MENUITEM "Enheter efter typ", IDC_DEVBYTYPE, CHECKED + MENUITEM "Enheter efter koppling", IDC_STATIC, GRAYED + MENUITEM "Resurcer efter typ", IDC_STATIC, GRAYED + MENUITEM "Resurcer efter koppling", IDC_STATIC, GRAYED + END + POPUP "Hjlp" + BEGIN + MENUITEM "Hjlp", IDC_PROGHELP + MENUITEM "Om", IDC_ABOUT + END +END + +IDR_POPUP MENU +BEGIN + POPUP "popup" + BEGIN + MENUITEM "Egenskaper", IDC_PROP, GRAYED + MENUITEM SEPARATOR + MENUITEM "Hjlp", IDC_PROGHELP + END +END + +IDD_ABOUTBOX DIALOGEX 22,16,190,182 +CAPTION "Om Enhetshanteraren" +FONT 8,"MS Shell Dlg",0,0 +STYLE DS_SHELLFONT | WS_BORDER | WS_DLGFRAME | WS_SYSMENU | DS_MODALFRAME +BEGIN + LTEXT "Enhetshanteraren v0.1\nCopyright (C) 2006\nby Ged Murphy (gedmurphy@gmail.com)", IDC_STATIC, 48, 7, 130, 30 + PUSHBUTTON "Stng", IDOK, 75, 162, 44, 15 + ICON IDI_MAIN_ICON, IDC_STATIC, 10, 10, 7, 30 + EDITTEXT IDC_LICENSE_EDIT, 8, 44, 174, 107, WS_VISIBLE | WS_VSCROLL | WS_TABSTOP | ES_READONLY | ES_MULTILINE +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_LICENSE "Detta programmet r fri programvara; du kan distribuera det och/eller ndra det under villkoren enligt GNU General Public License som r utgivet av Free Software Foundation; version 2, eller (om du s nskar) alla senare versioner.\r\n\r\nDette programmet er utgivet i hopp om att det skall kunne anvndas, men DET FINNS INGA GARANTIER; ven utan underfrstdd garanti om SLJBARHET eller LMPLIGHET FR ETT VISST NDAML. Se p GNU General Public Licensen fr mer detaljer.\r\n\r\nDu skall ha motagit en kopia av GNU General Public Licensen tillsammans med detta programmet; om du inte har ftt det, skriv til Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA." +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_TOOLTIP_PROP "Egenskaper" + IDS_TOOLTIP_REFRESH "Uppdater" + IDS_TOOLTIP_HELP "Hjlp" + IDS_TOOLTIP_EXIT "Avsluta" +END + +/* Hints */ +STRINGTABLE DISCARDABLE +BEGIN + IDS_APPNAME "ReactOS Enhetshanterare" + IDS_HINT_BLANK " " + IDS_HINT_EXIT " Avsluta programmet." + IDS_HINT_REFRESH " Uppdatera tjnstelistan." + IDS_HINT_PROP " ppna egenskaper fr markerat val." + IDS_HINT_HELP " Visa hjlpfnstret." + IDS_HINT_ABOUT " Om ReactOS Enhetshanterare." + + IDS_HINT_SYS_RESTORE " terstll detta fnstret till normal storlek." + IDS_HINT_SYS_MOVE " Flytta detta fnstret." + IDS_HINT_SYS_SIZE " ndra storleken p detta fnstret." + IDS_HINT_SYS_MINIMIZE " Minimera detta fnstret till en ikon." + IDS_HINT_SYS_MAXIMIZE " Maximera dette fnstret s det fyller hela skrmen." + IDS_HINT_SYS_CLOSE " Stng detta fnstret." +END diff --git a/reactos/base/applications/mscutils/devmgmt/rsrc.rc b/reactos/base/applications/mscutils/devmgmt/rsrc.rc index 83a50d125f3..8a264bdc40e 100644 --- a/reactos/base/applications/mscutils/devmgmt/rsrc.rc +++ b/reactos/base/applications/mscutils/devmgmt/rsrc.rc @@ -27,5 +27,6 @@ IDB_EXIT BITMAP DISCARDABLE "res/exit.bmp" #include "lang/ro-RO.rc" #include "lang/ru-RU.rc" #include "lang/sk-SK.rc" +#include "lang/sv-SE.rc" #include "lang/th-TH.rc" #include "lang/uk-UA.rc" diff --git a/reactos/base/applications/mscutils/eventvwr/lang/sv-SE.rc b/reactos/base/applications/mscutils/eventvwr/lang/sv-SE.rc new file mode 100644 index 00000000000..2de7899c9cf --- /dev/null +++ b/reactos/base/applications/mscutils/eventvwr/lang/sv-SE.rc @@ -0,0 +1,117 @@ +/* + * PROJECT: ReactOS Event Viewer + * LICENSE: GPL - See COPYING in the top level directory + * FILE: base/applications/mscutils/eventvwr/lang/en-US.rc + * PURPOSE: Swedish Language File for ReactOS Event Viewer + * TRANSLATORS: Jaix Bly + */ + +LANGUAGE LANG_SWEDISH, SUBLANG_NEUTRAL + +IDC_EVENTVWR MENU +BEGIN + POPUP "&Logg" + BEGIN + MENUITEM "&Applikation", ID_LOG_APPLICATION + MENUITEM "&Skerhet", ID_LOG_SECURITY + MENUITEM "&System", ID_LOG_SYSTEM + MENUITEM SEPARATOR + MENUITEM "A&vsluta", IDM_EXIT + END + POPUP "&Visa" + BEGIN + MENUITEM "&Uppdatera", IDM_REFRESH + END + MENUITEM "&tgrd", ID_OPTIONS + POPUP "&Hjlp" + BEGIN + MENUITEM "Hj&lp", IDM_HELP + MENUITEM SEPARATOR + MENUITEM "&Om...", IDM_ABOUT + END +END + +IDC_EVENTVWR ACCELERATORS +BEGIN + "?", IDM_ABOUT, ASCII, ALT + "/", IDM_ABOUT, ASCII, ALT +END + +IDD_ABOUTBOX DIALOGEX 0, 0, 230, 75 +STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_CAPTION | WS_SYSMENU +CAPTION "Om" +FONT 8, "MS Shell Dlg", 0, 0, 0x0 +BEGIN + ICON IDI_EVENTVWR,IDC_MYICON,14,9,21,20 + LTEXT "ReactOS Hndelselogg Versjon 1.0",IDC_STATIC,49,10,119,8,SS_NOPREFIX + LTEXT "Copyright (C) 2007 Marc Piulachs (marc.piulachs@codexchange.net)",IDC_STATIC,49,20,119,22 + DEFPUSHBUTTON "OK",IDOK,90,48,42,16,WS_GROUP +END + +IDD_PROGRESSBOX DIALOGEX 0, 0, 230, 40 +STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER +CAPTION "Vnta.." +FONT 8, "MS Shell Dlg", 0, 0, 0x0 +BEGIN + CTEXT "Laddar in Hndelseloggen. Vnligen vnta...",IDC_STATIC,0,15,230,8,SS_NOPREFIX +END + +IDD_EVENTDETAILDIALOG DIALOGEX 0, 0, 276, 282 +STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU +EXSTYLE WS_EX_CONTEXTHELP +CAPTION "Hndelsedetaljer" +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + DEFPUSHBUTTON "&Stng",IDOK,12,258,50,14 + PUSHBUTTON "&Fregende",IDPREVIOUS,78,258,50,14 + PUSHBUTTON "&Nste",IDNEXT,144,258,50,14 + PUSHBUTTON "&Hjlp",IDHELP,210,258,50,14 + EDITTEXT IDC_EVENTTEXTEDIT,14,81,247,108,ES_MULTILINE | ES_READONLY + LTEXT "&Beskrivning:",IDC_STATIC,15,70,39,8 + LTEXT "Datum:",IDC_STATIC,14,14,36,8 + LTEXT "Static",IDC_EVENTDATESTATIC,56,14,72,8 + LTEXT "Tid:",IDC_STATIC,14,27,36,8 + LTEXT "Static",IDC_EVENTTIMESTATIC,56,27,72,8 + LTEXT "&Anvndare:",IDC_STATIC,14,41,36,8 + LTEXT "Static",IDC_EVENTUSERSTATIC,56,41,72,8 + LTEXT "&Dator:",IDC_STATIC,14,54,36,8 + LTEXT "Static",IDC_EVENTCOMPUTERSTATIC,56,54,72,8 + LTEXT "Hndelse ID:",IDC_STATIC,133,15,36,8 + LTEXT "Static",IDC_EVENTIDSTATIC,175,15,87,8 + LTEXT "Klla:",IDC_STATIC,133,28,36,8 + LTEXT "Static",IDC_EVENTSOURCESTATIC,175,28,87,8 + LTEXT "Type:",IDC_STATIC,133,42,36,8 + LTEXT "Static",IDC_EVENTTYPESTATIC,175,42,87,8 + LTEXT "Kategori:",IDC_STATIC,133,55,36,8 + LTEXT "Static",IDC_EVENTCATEGORYSTATIC,175,55,87,8 + EDITTEXT IDC_EVENTDATAEDIT,14,204,247,44,ES_MULTILINE | ES_READONLY + LTEXT "D&ata",IDC_STATIC,14,194,20,8 + CONTROL "&Byte",IDC_BYTESRADIO,"Button",BS_AUTORADIOBUTTON,39,194,34,10 + CONTROL "&Ord",IDC_WORDRADIO,"Button",BS_AUTORADIOBUTTON,77,194,33,10 +END + +STRINGTABLE +BEGIN + IDS_APP_TITLE "Hndelselogg" + IDS_EVENTSTRINGIDNOTFOUND "Beskrivning av Hndelse ID ( %lu ) i kllan ( %s ) kan inte hittas. Lokal dator har inte ndvendig registerinformation eller meddelander DLL filer for vise meddelander frn en fjrr dator." + IDS_EVENTLOG_ERROR_TYPE "Fel" + IDS_EVENTLOG_WARNING_TYPE "Varning" + IDS_EVENTLOG_INFORMATION_TYPE "Information" + IDS_EVENTLOG_AUDIT_SUCCESS "Revision lyckades" + IDS_EVENTLOG_AUDIT_FAILURE "Revision misslyckades" + IDS_EVENTLOG_SUCCESS "Uppgift lyckades" + IDS_EVENTLOG_UNKNOWN_TYPE "Oknd hndelse" +END + +STRINGTABLE +BEGIN + IDS_COLUMNTYPE "Typ" + IDS_COLUMNDATE "Datum" + IDS_COLUMNTIME "Tid" + IDS_COLUMNSOURCE "Klla" + IDS_COLUMNCATEGORY "Kategori" + IDS_COLUMNEVENT "Hndelse" + IDS_COLUMNUSER "Anvndare" + IDS_COLUMNCOMPUTER "Dator" + IDS_COLUMNEVENTDATA "Hndelsedata" +END diff --git a/reactos/base/applications/mscutils/eventvwr/rsrc.rc b/reactos/base/applications/mscutils/eventvwr/rsrc.rc index 0563d917e5c..a3b864ed86a 100644 --- a/reactos/base/applications/mscutils/eventvwr/rsrc.rc +++ b/reactos/base/applications/mscutils/eventvwr/rsrc.rc @@ -23,5 +23,6 @@ IDI_ERRORICON ICON "res/error.ico" #include "lang/ro-RO.rc" #include "lang/ru-RU.rc" #include "lang/sk-SK.rc" +#include "lang/sv-SE.rc" #include "lang/uk-UA.rc" diff --git a/reactos/base/applications/mscutils/servman/lang/sv-SE.rc b/reactos/base/applications/mscutils/servman/lang/sv-SE.rc new file mode 100644 index 00000000000..39553bacfbf --- /dev/null +++ b/reactos/base/applications/mscutils/servman/lang/sv-SE.rc @@ -0,0 +1,288 @@ +/* + * PROJECT: ReactOS APPS + * FILE: \base\applications\mscutils\servman\lang\sv-SE.rc + * PURPOSE: Swedish resource file + * Translation: Jaix Bly + */ +LANGUAGE LANG_SWEDISH, SUBLANG_NEUTRAL + +IDR_MAINMENU MENU +BEGIN + POPUP "&Arkiv" + BEGIN + MENUITEM "Exportera...", ID_EXPORT + MENUITEM SEPARATOR + MENUITEM "A&vsluta", ID_EXIT + END + POPUP "tgrd" + BEGIN + MENUITEM "Koppla till...", ID_CONNECT, GRAYED + MENUITEM SEPARATOR + MENUITEM "Starta", ID_START, GRAYED + MENUITEM "Stoppa", ID_STOP, GRAYED + MENUITEM "Pausa", ID_PAUSE, GRAYED + MENUITEM "Fortstta", ID_RESUME, GRAYED + MENUITEM "Starta om", ID_RESTART, GRAYED + MENUITEM SEPARATOR + MENUITEM "Uppdatera", ID_REFRESH + MENUITEM SEPARATOR + MENUITEM "Redigera...", ID_EDIT, GRAYED + MENUITEM "Skapa...", ID_CREATE, GRAYED + MENUITEM "Ta bort...", ID_DELETE, GRAYED + MENUITEM SEPARATOR + MENUITEM "Egenskaper...", ID_PROP, GRAYED + END + POPUP "Visa" + BEGIN + MENUITEM "Stora ikoner", ID_VIEW_LARGE + MENUITEM "Sm ikoner", ID_VIEW_SMALL + MENUITEM "Lista", ID_VIEW_LIST + MENUITEM "Detaljer", ID_VIEW_DETAILS + MENUITEM SEPARATOR + MENUITEM "Anpassa...",ID_VIEW_CUST, GRAYED + END + POPUP "Hjlp" + BEGIN + MENUITEM "Hjlp", ID_HELP + MENUITEM "Om", ID_ABOUT + END +END + +IDR_POPUP MENU +BEGIN + POPUP "popup" + BEGIN + MENUITEM "Starta", ID_START, GRAYED + MENUITEM "Stoppa", ID_STOP, GRAYED + MENUITEM "Pausa", ID_PAUSE, GRAYED + MENUITEM "Fortstta", ID_RESUME, GRAYED + MENUITEM "Starta om", ID_RESTART, GRAYED + MENUITEM SEPARATOR + MENUITEM "Uppdatera", ID_REFRESH + MENUITEM SEPARATOR + MENUITEM "Redigera...", ID_EDIT, GRAYED + MENUITEM "Ta bort...", ID_DELETE, GRAYED + MENUITEM SEPARATOR + MENUITEM "Egenskaper...", ID_PROP, GRAYED + MENUITEM SEPARATOR + MENUITEM "Hjlp...", ID_HELP + END +END + +IDD_ABOUTBOX DIALOGEX 22,16,190,182 +CAPTION "Om Tjnster" +FONT 8, "MS Shell Dlg",0,0 +STYLE DS_SHELLFONT | WS_BORDER | WS_DLGFRAME | WS_SYSMENU | DS_MODALFRAME +BEGIN + LTEXT "Tjnster v0.8\nCopyright (C) 2005-2007\nby Ged Murphy (gedmurphy@reactos.org)", IDC_STATIC, 48, 7, 135, 30 + PUSHBUTTON "Stng", IDOK, 75, 162, 44, 15 + ICON IDI_SM_ICON, IDC_STATIC, 10, 10, 7, 30 + EDITTEXT IDC_LICENSE_EDIT, 8, 44, 174, 107, WS_VISIBLE | WS_VSCROLL | WS_TABSTOP | ES_READONLY | ES_MULTILINE +END + +IDD_DLG_GENERAL DIALOGEX 6, 6, 253, 232 +CAPTION "Allmnnt" +FONT 8, "MS Shell Dlg",0,0 +STYLE DS_SHELLFONT | WS_BORDER | WS_VISIBLE | WS_DLGFRAME | WS_SYSMENU | WS_THICKFRAME | WS_GROUP | WS_TABSTOP +BEGIN + LTEXT "", IDC_SERV_NAME, 70,11,176,11, WS_CHILD | WS_VISIBLE + EDITTEXT IDC_DISP_NAME, 70, 29, 176, 13, WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_READONLY + EDITTEXT IDC_DESCRIPTION, 70, 46, 176, 24, WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP | ES_MULTILINE | ES_READONLY + EDITTEXT IDC_EXEPATH, 6, 86, 240, 13, WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_READONLY + COMBOBOX IDC_START_TYPE, 70, 107, 176, 40, WS_CHILD | WS_VISIBLE | WS_TABSTOP | CBS_DROPDOWNLIST + PUSHBUTTON "Starta", IDC_START, 6, 155, 54, 15, WS_DISABLED + PUSHBUTTON "Stoppa", IDC_STOP, 68, 155, 54, 15, WS_DISABLED + PUSHBUTTON "Pausa", IDC_PAUSE , 130, 155, 54, 15, WS_DISABLED + PUSHBUTTON "Fortstta", IDC_RESUME, 192, 155, 54, 15, WS_DISABLED + LTEXT "Tjnstenamn:", IDC_STATIC, 4, 11, 53, 11 + LTEXT "Visningsnamn:", IDC_STATIC, 4, 29, 53, 11 + LTEXT "Beskrivning:", IDC_STATIC, 4, 51, 53, 11 + LTEXT "Vg till krbar fil:", IDC_STATIC, 6, 73, 82, 9 + LTEXT "Startmetod:", IDC_STATIC, 6, 108, 53, 11 + LTEXT "Tjnstestatus:", IDC_STATIC, 4, 138, 53, 11 + LTEXT "", IDC_SERV_STATUS, 70, 138, 176, 11, WS_CHILD | WS_VISIBLE + LTEXT "Du kan ange startparametrar som gller nr du startar tjnsten hrifrn.",IDC_STATIC, 6,177,240,15 + LTEXT "startparametrar:", IDC_STATIC, 6, 200, 58, 11 + EDITTEXT IDC_START_PARAM, 68, 199, 178, 13, WS_CHILD | WS_VISIBLE | WS_TABSTOP + PUSHBUTTON "Redigera", IDC_EDIT, 192, 215, 54, 15, WS_DISABLED +END + +IDD_DLG_DEPEND DIALOGEX 6,6,253,225 +CAPTION "Beroenden" +FONT 8, "MS Shell Dlg",0,0 +STYLE DS_SHELLFONT | WS_BORDER | WS_VISIBLE | WS_DLGFRAME | WS_SYSMENU | WS_THICKFRAME | WS_GROUP | WS_TABSTOP +BEGIN + CONTROL "", IDC_DEPEND_TREE1, "SysTreeView32" , WS_BORDER | WS_CHILDWINDOW | WS_VISIBLE | WS_TABSTOP | TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | TVS_DISABLEDRAGDROP, 8, 70, 236, 68 + CONTROL "", IDC_DEPEND_TREE2, "SysTreeView32", WS_BORDER | WS_CHILDWINDOW | WS_VISIBLE | WS_TABSTOP | TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | TVS_DISABLEDRAGDROP, 8, 151, 234, 67 + LTEXT "Ngra tjnster r beroende av andra tjnster, systemdrivrutiner och laddsystemsgrupper. Om systemkomponenten r stoppad eller inte kr korrekt, kan tjnster som r beroende av den bli pverkade.", IDC_STATIC,8, 7, 238, 26 + LTEXT "Denna tjnsten r beroende av fljande komponenter", IDC_STATIC, 8, 57, 236, 9 + LTEXT "", IDC_DEPEND_SERVICE, 8, 38, 236, 13 +END + +IDD_DLG_CREATE DIALOGEX 6,6,225,209 +CAPTION "Skapa en tjnst" +FONT 8, "MS Shell Dlg",0,0 +STYLE DS_SHELLFONT | WS_BORDER | WS_VISIBLE | WS_DLGFRAME | WS_SYSMENU | WS_THICKFRAME | WS_GROUP | WS_TABSTOP +BEGIN + EDITTEXT IDC_CREATE_SERVNAME, 72, 12, 150, 11, WS_CHILD | WS_VISIBLE | WS_EX_CLIENTEDGE + EDITTEXT IDC_CREATE_DISPNAME, 72, 31, 150, 11, WS_CHILD | WS_VISIBLE + EDITTEXT IDC_CREATE_PATH, 10, 62, 210, 13, WS_CHILD | WS_VISIBLE + EDITTEXT IDC_CREATE_DESC, 10, 97, 210, 48, WS_CHILD | WS_VISIBLE + EDITTEXT IDC_CREATE_OPTIONS, 10, 162, 210, 13, WS_CHILD | WS_VISIBLE + LTEXT "*Tjnstenamn:", IDC_STATIC, 12, 12, 54, 9 + LTEXT "*Visningsnamn:", IDC_STATIC, 12, 33, 54, 9 + LTEXT "*Vg till krbar fil:", IDC_STATIC, 10, 51, 68, 9 + LTEXT "Beskrivning:", IDC_STATIC, 12, 86, 44, 9 + PUSHBUTTON "OK", IDOK, 126, 192, 44, 13 + PUSHBUTTON "Avbryt", IDCANCEL, 176, 192, 46, 13 + LTEXT "'Ytterligere val (klicka hjlp fr detaljer)", IDC_STATIC, 10, 151, 134, 9 + PUSHBUTTON "Hjlp", ID_CREATE_HELP, 10, 192, 44, 13 +END + +IDD_DLG_DELETE DIALOGEX 6,6,185,148 +CAPTION "Ta bort en tjnt" +FONT 8, "MS Shell Dlg",0,0 +STYLE DS_SHELLFONT | WS_BORDER | WS_DLGFRAME | DS_MODALFRAME +BEGIN + ICON IDI_WARNING, IDC_STATIC, 10, 8, 24, 22 + LTEXT "r du sker p att du vill ta bort denna tjnsten? Detta kan inte ngras nr den blivit raderad!", IDC_STATIC, 50, 6, 125, 25 + LTEXT "Tjnstenamn:",IDC_STATIC, 6, 40, 80, 9 + LTEXT "", IDC_DEL_NAME, 15, 53, 160, 15 + EDITTEXT IDC_DEL_DESC, 6, 73, 174, 48, WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_EX_STATICEDGE | ES_MULTILINE | ES_READONLY + PUSHBUTTON "Ja", IDOK, 26, 129, 54, 13 + DEFPUSHBUTTON "Nej", IDCANCEL, 102, 129, 54, 13 +END + +IDD_DLG_DEPEND_STOP DIALOGEX 6,6,240,148 +CAPTION "Stoppa Annan Tjnst" +FONT 8, "MS Shell Dlg",0,0 +STYLE DS_SHELLFONT | WS_BORDER | WS_DLGFRAME | DS_MODALFRAME +BEGIN + ICON IDI_WARNING, IDC_STATIC, 10, 8, 24, 22 + LTEXT "", IDC_STOP_DEPENDS, 40, 8, 170, 25 + LISTBOX IDC_STOP_DEPENDS_LB, 15, 40, 210, 70, WS_CHILD | WS_VISIBLE | WS_EX_STATICEDGE | LBS_NOSEL + LTEXT "Vill du stoppa dessa tjnster?",IDC_STATIC, 15, 110, 150, 10 + DEFPUSHBUTTON "Ja", IDOK, 60, 129, 54, 14 + PUSHBUTTON "Nej", IDCANCEL, 120, 129, 54, 14 +END + +IDD_DLG_HELP_OPTIONS DIALOGEX 6,6,200,150 +CAPTION "Val" +FONT 8, "MS Shell Dlg",0,0 +STYLE 0x10CF0000 +BEGIN + LTEXT "", IDC_CREATE_HELP, 6, 5, 200, 150 + PUSHBUTTON "Ok", IDOK, 75, 130, 44, 13 +END + +IDD_DLG_PROGRESS DIALOGEX 6,6,255,89 +CAPTION "Tjnst kontroll" +FONT 8, "MS Shell Dlg",0,0 +STYLE DS_SHELLFONT | WS_BORDER | WS_DLGFRAME | WS_SYSMENU | WS_VISIBLE | DS_MODALFRAME +EXSTYLE WS_EX_TOOLWINDOW +BEGIN + CONTROL "", IDC_SERVCON_PROGRESS, "msctls_progress32", 0x50000000, 8, 46, 238, 13 + LTEXT "", IDC_SERVCON_INFO, 8, 5, 236, 11 + LTEXT "", IDC_SERVCON_NAME, 8, 25, 66, 11 + PUSHBUTTON "&Stng", IDOK, 100, 70, 54, 13 +END + + + +STRINGTABLE DISCARDABLE +BEGIN + IDS_FIRSTCOLUMN "Namn" + IDS_SECONDCOLUMN "Beskrivning" + IDS_THIRDCOLUMN "Status" + IDS_FOURTHCOLUMN "Startmetod" + IDS_FITHCOLUMN "Logga p som" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_SERVICES_STARTED "Startad" + IDS_SERVICES_STOPPED "Stoppad" + IDS_SERVICES_AUTO "Automatisk" + IDS_SERVICES_MAN "Manuell" + IDS_SERVICES_DIS "Inaktiverad" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_NUM_SERVICES "Num tjnster: %d" + IDS_STOP_DEPENDS "Nr %s stoppas, kommer ocks dessa tjnster att stanna" + IDS_NO_DEPENDS "" + IDS_LICENSE "Detta programmet r fri programvara; du kan distribuera det och/eller ndra det under villkoren enligt GNU General Public License som r utgivet av Free Software Foundation; version 2, eller (om du s nskar) alla senare versioner.\r\n\r\nDette programmet er utgivet i hopp om att det skall kunne anvndas, men DET FINNS INGA GARANTIER; ven utan underfrstdd garanti om SLJBARHET eller LMPLIGHET FR ETT VISST NDAML. Se p GNU General Public Licensen fr mer detaljer.\r\n\r\nDu skall ha motagit en kopia av GNU General Public Licensen tillsammans med detta programmet; om du inte har ftt det, skriv til Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA." +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_TOOLTIP_PROP "Egenskaper" + IDS_TOOLTIP_REFRESH "Uppdatera" + IDS_TOOLTIP_EXPORT "Exportera lista" + IDS_TOOLTIP_CREATE "Skapa en ny tjnst" + IDS_TOOLTIP_DELETE "Tar bort en exiterande tjnst" + IDS_TOOLTIP_START "Starta tjnest" + IDS_TOOLTIP_STOP "Stoppa tjnst" + IDS_TOOLTIP_PAUSE "Pausa tjnst" + IDS_TOOLTIP_RESTART "Starta om tjnest" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_PROGRESS_INFO_START "ReactOS frsker att starta fljande tjnst" + IDS_PROGRESS_INFO_STOP "ReactOS frsker att stoppa fljande tjnst" + IDS_PROGRESS_INFO_PAUSE "ReactOS frsker att pausa fljande tjnst" + IDS_PROGRESS_INFO_RESUME "ReactOS frsker att fortstta fljende tjnst" + IDS_CREATE_SUCCESS "Tjnsten blev skapad" + IDS_DELETE_SUCCESS "Tjnsten togs bort" + IDS_CREATE_REQ "Flt markerade med en\nasterisk r obligatoriska" + IDS_DELETE_STOP "Du mste manuellt stoppa tjnsten fre den kan raderas!" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_HELP_OPTIONS "CREATE OPTIONS:\r\nNOTE: The option name includes the equal sign.\r\n type= \r\n (default = own)\r\n start= \r\n (default = demand) \r\n error= \r\n (default = normal)\r\n group= \r\n tag= \r\n depend= \r\n obj= \r\n (default = LocalSystem)\r\n password= \r\n" +END + +/* Hints */ +STRINGTABLE DISCARDABLE +BEGIN + IDS_HINT_BLANK " " + IDS_HINT_EXPORT " Exportera nuvarende lista till en fil." + IDS_HINT_EXIT " Avsluta programmet." + + IDS_HINT_CONNECT " Kontrollera en annan dator." + IDS_HINT_START " Starta valda tjnster." + IDS_HINT_STOP " Stoppa valda tjnster." + IDS_HINT_PAUSE " Pausa valda tjnster." + IDS_HINT_RESUME " Fortstt valda tjnster." + IDS_HINT_RESTART " Stoppa och starta valda tjnster." + IDS_HINT_REFRESH " Uppdatera tjnstelistan." + IDS_HINT_EDIT " Editera egenskaperna fr den valda tjnsten." + IDS_HINT_CREATE " Skapa en ny tjnst." + IDS_HINT_DELETE " Radera valda tjnster." + IDS_HINT_PROP " ppna egenskaperna fr nuvarande val." + + IDS_HINT_LARGE " Visa objekt med store ikoner." + IDS_HINT_SMALL " Visa objekt med mindre ikoner." + IDS_HINT_LIST " Visa objekt i en liste." + IDS_HINT_DETAILS " Visa information om varje objekt i ett fnster." + IDS_HINT_CUST " Anpassa vy." + + IDS_HINT_HELP " Visa hjlpfnstret." + IDS_HINT_ABOUT " Om ReactOS tjnster." + + IDS_HINT_SYS_RESTORE " terstll fnstret till normal storlek." + IDS_HINT_SYS_MOVE " Flytta detta fnstret." + IDS_HINT_SYS_SIZE " ndra storleken p dette fnstret." + IDS_HINT_SYS_MINIMIZE " Minimera dette fnstret till en ikon." + IDS_HINT_SYS_MAXIMIZE " Maximera dette fnstret till fullskrm." + IDS_HINT_SYS_CLOSE " Stng detta fnstret." +END + +/* Application title */ +STRINGTABLE DISCARDABLE +BEGIN + IDS_APPNAME "ReactOS tjnster" +END diff --git a/reactos/base/applications/mscutils/servman/rsrc.rc b/reactos/base/applications/mscutils/servman/rsrc.rc index 1b03b7bd920..2b1aed54411 100644 --- a/reactos/base/applications/mscutils/servman/rsrc.rc +++ b/reactos/base/applications/mscutils/servman/rsrc.rc @@ -35,5 +35,6 @@ IDI_DRIVER ICON "res/driver.ico" #include "lang/ro-RO.rc" #include "lang/ru-RU.rc" #include "lang/sk-SK.rc" +#include "lang/sv-SE.rc" #include "lang/th-TH.rc" #include "lang/uk-UA.rc" diff --git a/reactos/base/applications/mstsc/lang/sv-SE.rc b/reactos/base/applications/mstsc/lang/sv-SE.rc new file mode 100644 index 00000000000..cd50843b379 --- /dev/null +++ b/reactos/base/applications/mstsc/lang/sv-SE.rc @@ -0,0 +1,69 @@ +/* + * PROJECT: ReactOS RAPPS + * FILE: \base\applications\mstsc\lang\sv-SE.rc + * PURPOSE: Swedish resource file + * Translation: Jaix Bly + */ +LANGUAGE LANG_SWEDISH, SUBLANG_NEUTRAL + +IDD_GENERAL DIALOGEX 0, 0, 242, 175 +STYLE DS_SHELLFONT | WS_CHILD +FONT 8, "MS Shell Dlg", 0, 0, 0x0 +BEGIN + GROUPBOX "Inloggningsinstllningar",IDC_STATIC,7,7,228,89 + GROUPBOX "Anslutningsinstllningar",IDC_STATIC,7,103,228,65 + ICON "", IDC_LOGONICON, 15,19,20,20 + LTEXT "Skriv in serveradressen",IDC_STATIC,47,24,81,8 + LTEXT "Server:",IDC_STATIC,47,41,25,8 + LTEXT "Anvndarnamn:",IDC_STATIC,47,58,38,8 + COMBOBOX IDC_SERVERCOMBO,79,39,141,150,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Spara",IDC_SAVE,67,139,50,14 + PUSHBUTTON "Spara som...",IDC_SAVEAS,123,139,50,14 + PUSHBUTTON "ppna...",IDC_OPEN,177,139,50,14 + ICON "", IDC_CONNICON, 16,114,20,20 + LTEXT "Spara nuvarende anslutningsinstlling eller ppna lagrad anslutning",IDC_STATIC,50,115,172,20 +END + +IDD_DISPLAY DIALOGEX 0, 0, 242, 175 +STYLE DS_SHELLFONT | WS_CHILD +FONT 8, "MS Shell Dlg", 0, 0, 0x0 +BEGIN + GROUPBOX "Storlek p fjrrskrivbord",IDC_STATIC,7,7,228,68 + GROUPBOX "Frger",IDC_STATIC,7,83,228,85 + ICON "", IDC_REMICON, 15,19,20,20 + ICON "", IDC_COLORSICON, 15,98,20,20 + LTEXT "Vlj din skrmstorlek p fjrrskrivbordet. Dra glidreglaget helt till hger fr att f fullskrmsvisning.",IDC_STATIC,53,22,175,21 + CONTROL "", IDC_GEOSLIDER, "msctls_trackbar32", TBS_AUTOTICKS | WS_TABSTOP, 56, 42, 124, 17 + COMBOBOX IDC_BPPCOMBO,56,102,128,80, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP + CONTROL "",IDC_COLORIMAGE,"Static",SS_OWNERDRAW | SS_SUNKEN, 56,121,127,10 + LTEXT "OBS: Instllingen p fjrdatorn kan erstta denna instllingen.",IDC_STATIC,56,143,165,18 + LTEXT "Mindre",IDC_STATIC,35,42,22,8 + LTEXT "Strre",IDC_STATIC,189,42,19,8 + LTEXT "", IDC_SETTINGS_RESOLUTION_TEXT, 56, 62, 120, 10, SS_CENTER +END + +IDD_CONNECTDIALOG DIALOGEX 0, 0, 260, 262 +STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Anslutning till fjrrskrivbord" +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + DEFPUSHBUTTON "Anslut",IDOK,147,245,50,14 + PUSHBUTTON "Avbryt",IDCANCEL,203,245,50,14 + CONTROL "",IDC_TAB,"SysTabControl32",0x0,7,50,246,190 +END + + +STRINGTABLE +BEGIN + IDS_TAB_GENERAL "Allmnnt" + IDS_TAB_DISPLAY "Skrm" + IDS_256COLORS "256 Frger" + IDS_HIGHCOLOR15 "32,768 Frger (15 bit)" + IDS_HIGHCOLOR16 "65,536 Frger (16 bit)" + IDS_HIGHCOLOR24 "16,777,216 Frger (24 bit)" + IDS_PIXEL "%lux%lu Pixlar" + IDS_FULLSCREEN "Fullskrm" + IDS_BROWSESERVER "" + IDS_HEADERTEXT1 "Fjrrskrivbord" + IDS_HEADERTEXT2 "Anslutning" +END diff --git a/reactos/base/applications/mstsc/rsrc.rc b/reactos/base/applications/mstsc/rsrc.rc index 68241800e12..d933a50afac 100644 --- a/reactos/base/applications/mstsc/rsrc.rc +++ b/reactos/base/applications/mstsc/rsrc.rc @@ -27,4 +27,5 @@ IDB_SPECT BITMAP "res/spectrum.bmp" #include "lang/pl-PL.rc" #include "lang/ru-RU.rc" #include "lang/sk-SK.rc" +#include "lang/sv-SE.rc" #include "lang/uk-UA.rc" diff --git a/reactos/base/applications/network/ipconfig/ipconfig.rc b/reactos/base/applications/network/ipconfig/ipconfig.rc index 7627a1de6a2..04af25042a1 100644 --- a/reactos/base/applications/network/ipconfig/ipconfig.rc +++ b/reactos/base/applications/network/ipconfig/ipconfig.rc @@ -19,6 +19,7 @@ #include "lang/pl-PL.rc" #include "lang/ru-RU.rc" #include "lang/sk-SK.rc" +#include "lang/sv-SE.rc" #include "lang/uk-UA.rc" diff --git a/reactos/base/applications/network/ipconfig/lang/sv-SE.rc b/reactos/base/applications/network/ipconfig/lang/sv-SE.rc new file mode 100644 index 00000000000..35f7e1814b2 --- /dev/null +++ b/reactos/base/applications/network/ipconfig/lang/sv-SE.rc @@ -0,0 +1,71 @@ +/* + * PROJECT: ReactOS RAPPS + * FILE: \base\applications\network\ipconfig\lang\sv-SE.rc + * PURPOSE: Swedish resource file + * Translation: Jaix Bly + */ +LANGUAGE LANG_SWEDISH, SUBLANG_NEUTRAL + +STRINGTABLE DISCARDABLE +BEGIN + IDS_BCAST "Broadcast" + IDS_P2P "Peer To Peer" + IDS_MIXED "Mixad" + IDS_HYBRID "Hybrid" + IDS_UNKNOWN "Oknd" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_OTHER "Annan Typ av Adapter" + IDS_ETH "Ethernet Adapter" + IDS_TOKEN "Token Ring Adapter" + IDS_FDDI "FDDI Adapter" + IDS_PPP "PPP Adapter" + IDS_LOOP "Loopback Adapter" + IDS_SLIP "SLIP Adapter" +END + +STRINGTABLE DISCARDABLE +BEGIN +/* Please keep the spacing/formatting as per En.rc when translating */ + IDS_USAGE + "\nSYNTAX:\n \ + ipconfig [/? | /all | /renew [kort] | /release [kort] |\n \ + /flushdns | /displaydns | /registerdns |\n \ + /showclassid kort |\n \ + /setclassid kort [classid] ]\n \ + \n \ + dr\n \ + kort Anslutningssnamn\n \ + (jokertecken * och ? r tilltet, se exempeln)\n \ + \n \ + Alternativ:\n \ + /? Visar detta hjlpmeddelandet\n \ + /all Visar detaljerd information.\n \ + /release Frigr IP adressen fr det angivna kortet.\n \ + /renew Frnya alla IP adresser fr det angivna kortet.\n \ + /flushdns Tmmer DNS Resolver-buffern.\n \ + /registerdns Uppdaterar alla DHCP leaseavtal och registerer DNS namn p nytt.\n \ + /displaydns Visar inhll i DNS Resolver-bufferen.\n \ + /showclassid Visar alla klass-ID:na fr DHCP som r tilltet fr kortet.\n \ + /setclassid ndrar DHCP-klass-ID:t.\n \ + \n \ + Som standard visas bara IP-adressen, ntsmasken och\n \ + standardgateway fr varje ntverkskort som r bundet till TCP/IP.\n \ + \n \ + Om inget ntverkskort angetts fr Release och Renew, kommer IP-adresserna\n \ + fr alla ntverkskort som r bundna till TCP/IP att frigras eller frnyas.\n \ + \n \ + Om inget klass-ID har angetts fr Setclassid tas klass-ID:t bort.\n \ + \n \ + Exempel:\n \ + > ipconfig ... Visar informastion.\n \ + > ipconfig /all ... Visar detaljerd information\n \ + > ipconfig /renew ... Frnyar alla kort\n \ + > ipconfig /renew EL* ... Frnyar alle kort med navn som\n \ + brjar med EL\n \ + > ipconfig /release *Ans* ... frigr alla matchande anslutningar,\n \ + t.ex. ""Anslutning till lokalt ntverk 1"" eller\n \ + ""Anslutning till lokalt ntverk 2""\n \ " +END diff --git a/reactos/base/applications/network/ping/lang/sv-SE.rc b/reactos/base/applications/network/ping/lang/sv-SE.rc new file mode 100644 index 00000000000..135126c98a9 --- /dev/null +++ b/reactos/base/applications/network/ping/lang/sv-SE.rc @@ -0,0 +1,41 @@ +/* + * PROJECT: ReactOS RAPPS + * FILE: \base\applications\network\ping\lang\sv-SE.rc + * PURPOSE: Swedish resource file + * Translation: Jaix Bly + */ +LANGUAGE LANG_SWEDISH, SUBLANG_NEUTRAL + +STRINGTABLE DISCARDABLE +BEGIN + IDS_USAGE "\nSYNTAX: ping [-t] [-n antal] [-l storlek] [-w timeout] vrddator\n\n\ +Alternativ:\n\ + -t Pinga den angivna datorn tills kommandor stoppas.\n\ + Fr att stoppa - tryck Ctrl-C.\n\ + -n antal Antal ekobegranden som ska skickas.\n\ + -l storlek Sndniningsbuffertens storlek.\n\ + -w timeout Timeout i millisekunder att vnta p varje svar.\n\n\0" + + IDS_PING_WITH_BYTES "\nPingar %1 [%2] med %3!d! bytes data:\n\n\0" + IDS_PING_STATISTICS "\nPing statistk fr %1:\n\0" + IDS_PACKETS_SENT_RECEIVED_LOST " Packet: Snda = %1!d!, Mottagna = %2!d!, Frlorade = %3!d! (%4!d!%% frlust),\n\0" + IDS_APPROXIMATE_ROUND_TRIP "Ungefrliga slingtider i millisekunder:\n\0" + IDS_MIN_MAX_AVERAGE " Minimum = %1, Maximum = %2, Genomsnittlig = %3\n\0" + IDS_NOT_ENOUGH_RESOURCES "Inte tillrckliga resurser tillgnliga.\n\0" + IDS_UNKNOWN_HOST "Oknd Vrd %1.\n\0" + IDS_SETSOCKOPT_FAILED "setsockopt misslyckades (%1!d!).\n\0" + IDS_COULD_NOT_CREATE_SOCKET "Kunde inte skapa socket (#%1!d!).\n\0" + IDS_COULD_NOT_INIT_WINSOCK "Kunde inte initialisera winsock dll.\n\0" + IDS_DEST_MUST_BE_SPECIFIED "Namn eller IP adress till vrd mste anges.\n\0" + IDS_BAD_PARAMETER "Ogiltig parameter %1.\n\0" + IDS_BAD_OPTION_FORMAT "Ogiltigt format p alternativ %1.\n\0" + IDS_BAD_OPTION "Ogiltigt alternativ %1.\n\0" + IDS_BAD_VALUE_OPTION_L "Ogiltigt vrde fr alternativ -l, giltig intervall r frn 0 till %1!d!.\n\0" + IDS_REPLY_FROM "Svar frn %1: bytes=%2!d! tid%3%4 TTL=%5!d!\n\0" + IDS_DEST_UNREACHABLE "Vrddatorn gr inte att n.\n\0" + IDS_COULD_NOT_TRANSMIT "Kunde inte snda data (%1!d!).\n\0" + IDS_COULD_NOT_RECV "Kunde inte ta emot data (%1!d!).\n\0" + IDS_REQUEST_TIMEOUT "Frfrgan gjorde timeout.\n\0" + IDS_MS "ms\0" + IDS_1MS "1ms\0" +END diff --git a/reactos/base/applications/network/ping/ping.rc b/reactos/base/applications/network/ping/ping.rc index b47c1744474..e406d71dee4 100644 --- a/reactos/base/applications/network/ping/ping.rc +++ b/reactos/base/applications/network/ping/ping.rc @@ -12,6 +12,7 @@ #include "lang/de-DE.rc" #include "lang/en-US.rc" #include "lang/fr-FR.rc" -#include "lang/pl-PL.rc" #include "lang/it-IT.rc" +#include "lang/pl-PL.rc" +#include "lang/sv-SE.rc" #include "lang/uk-UA.rc" diff --git a/reactos/base/applications/notepad/lang/no-NO.rc b/reactos/base/applications/notepad/lang/no-NO.rc index ab8f4ae9f0b..d047342f5e2 100644 --- a/reactos/base/applications/notepad/lang/no-NO.rc +++ b/reactos/base/applications/notepad/lang/no-NO.rc @@ -150,9 +150,9 @@ CAPTION "Om ReactOS Notisblokk" FONT 8, "MS Shell Dlg" BEGIN CONTROL "ReactOS Notisblokk v1.0\r\nenerett 1997,98 Marcel Baur \r\nEnerett 2000 Mike McCormack \r\nEnerett 2002 Sylvain Petreolle \r\nEnerett 2002 Andriy Palamarchuk\r\n", - -1,"Statisk",SS_LEFTNOWORDWRAP | WS_GROUP,46,7,232,39 + -1,"Static",SS_LEFTNOWORDWRAP | WS_GROUP,46,7,232,39 CONTROL " ", - -1,"Statisk",0x50000000,8,48,272,11 + -1,"Static",0x50000000,8,48,272,11 DEFPUSHBUTTON "Avslutt",IDOK,114,149,44,15,WS_GROUP ICON IDI_NPICON,-1,12,9,20,30 EDITTEXT IDC_LICENSE,8,64,272,81,ES_MULTILINE | diff --git a/reactos/base/applications/notepad/lang/sv-SE.rc b/reactos/base/applications/notepad/lang/sv-SE.rc index ffaed196900..70fe042e3af 100644 --- a/reactos/base/applications/notepad/lang/sv-SE.rc +++ b/reactos/base/applications/notepad/lang/sv-SE.rc @@ -67,8 +67,8 @@ BEGIN MENUITEM SEPARATOR MENUITEM "Sk...", CMD_SEARCH MENUITEM "&Sk nsta\tF3", CMD_SEARCH_NEXT - MENUITEM "Replace\tCtrl+H", CMD_REPLACE - MENUITEM "Go To...\tCtrl+G", CMD_GOTO + MENUITEM "Erstt\tCtrl+H", CMD_REPLACE + MENUITEM "G Till...\tCtrl+G", CMD_GOTO MENUITEM SEPARATOR MENUITEM "Markera &allt", CMD_SELECT_ALL MENUITEM "&Tid/datum\tF5", CMD_TIME_DATE @@ -78,9 +78,9 @@ BEGIN MENUITEM "&Automatiskt radbyte", CMD_WRAP MENUITEM "&Font...", CMD_FONT END - POPUP "&View" + POPUP "&Visa" BEGIN - MENUITEM "Status&bar", CMD_STATUSBAR + MENUITEM "Status&rad", CMD_STATUSBAR END POPUP "&Hjlp" BEGIN @@ -88,7 +88,7 @@ BEGIN MENUITEM "&Sk...", CMD_HELP_SEARCH MENUITEM "Anvisningar fr hjlpen", CMD_HELP_ON_HELP MENUITEM SEPARATOR - MENUITEM "&About", CMD_ABOUT + MENUITEM "Om &Anteckningar", CMD_ABOUT MENUITEM "Inf&ormation...", CMD_ABOUT_WINE END END @@ -100,9 +100,9 @@ STYLE DS_SHELLFONT | DS_MODALFRAME | WS_CAPTION | WS_SYSMENU FONT 8, "MS Shell Dlg" CAPTION "Skrivarinstllningar" BEGIN -LTEXT "&Huvudnot:", 0x140, 10, 07, 40, 15 +LTEXT "&Sidhuvud:", 0x140, 10, 07, 40, 15 EDITTEXT 0x141, 60, 05,110, 12, WS_BORDER | WS_TABSTOP -LTEXT "&Fotnot:", 0x142, 10, 24, 40, 15 +LTEXT "&Sidfot:", 0x142, 10, 24, 40, 15 EDITTEXT 0x143, 60, 22,110, 12, WS_BORDER | WS_TABSTOP GROUPBOX "Marginaler:", 0x144, 10, 43,160, 45 @@ -125,36 +125,36 @@ DIALOG_ENCODING DIALOGEX 0, 0, 256, 44 STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPSIBLINGS | WS_CAPTION | WS_SYSMENU FONT 8, "MS Shell Dlg" -CAPTION "Encoding" +CAPTION "Kodning" BEGIN COMBOBOX ID_ENCODING,54,0,156,80,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP -LTEXT "Encoding:",0x155,5,2,41,12 +LTEXT "Kodning:",0x155,5,2,41,12 COMBOBOX ID_EOLN,54,18,156,80,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP -LTEXT "Endlines:",0x156,5,20,41,12 +LTEXT "Slutrader:",0x156,5,20,41,12 END /* Dialog 'Go To' */ DIALOG_GOTO DIALOGEX 0,0,165,50 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_CAPTION | WS_SYSMENU FONT 8, "MS Shell Dlg" -CAPTION "Goto line" +CAPTION "G till rad" BEGIN EDITTEXT ID_LINENUMBER,54,10,106,12,WS_CHILD | WS_BORDER | WS_TABSTOP -LTEXT "Line number:",0x155,5,12,41,12,WS_CHILD | WS_TABSTOP | ES_NUMBER +LTEXT "Radnummer:",0x155,5,12,41,12,WS_CHILD | WS_TABSTOP | ES_NUMBER DEFPUSHBUTTON "OK", IDOK, 75, 30, 40, 15, WS_CHILD | WS_TABSTOP -PUSHBUTTON "Cancel", IDCANCEL, 120, 30, 40, 15, WS_CHILD | WS_TABSTOP +PUSHBUTTON "Avbryt", IDCANCEL, 120, 30, 40, 15, WS_CHILD | WS_TABSTOP END IDD_ABOUTBOX DIALOGEX DISCARDABLE 22,16,284,170 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_CAPTION | WS_SYSMENU -CAPTION "About ReactOS Notepad" +CAPTION "Om ReactOS Anteckningar" FONT 8, "MS Shell Dlg" BEGIN - CONTROL "ReactOS Notepad v1.0\r\nCopyright 1997,98 Marcel Baur \r\nCopyright 2000 Mike McCormack \r\nCopyright 2002 Sylvain Petreolle \r\nCopyright 2002 Andriy Palamarchuk\r\n ", + CONTROL "ReactOS Anteckningar v1.0\r\nCopyright 1997,98 Marcel Baur \r\nCopyright 2000 Mike McCormack \r\nCopyright 2002 Sylvain Petreolle \r\nCopyright 2002 Andriy Palamarchuk\r\n ", -1,"Static",SS_LEFTNOWORDWRAP | WS_GROUP,46,7,232,39 CONTROL " ", -1,"Static",0x50000000,8,48,272,11 - DEFPUSHBUTTON "Close",IDOK,114,149,44,15,WS_GROUP + DEFPUSHBUTTON "Stng",IDOK,114,149,44,15,WS_GROUP ICON IDI_NPICON,-1,12,9,20,30 EDITTEXT IDC_LICENSE,8,64,272,81,ES_MULTILINE | ES_READONLY | WS_VSCROLL diff --git a/reactos/base/applications/rapps/lang/sv-SE.rc b/reactos/base/applications/rapps/lang/sv-SE.rc index 929fb9ab63f..fd17667b301 100644 --- a/reactos/base/applications/rapps/lang/sv-SE.rc +++ b/reactos/base/applications/rapps/lang/sv-SE.rc @@ -1,8 +1,8 @@ /* * PROJECT: ReactOS RAPPS - * FILE: \base\applications\rapps\lang\sv-SE.rc + * FILE: \base\applications\rapps\lang\sv-SE.rc * PURPOSE: Swedish resource file - * Translation: Jaix Bly + * Translation: Jaix Bly */ LANGUAGE LANG_SWEDISH, SUBLANG_NEUTRAL @@ -22,7 +22,7 @@ BEGIN MENUITEM SEPARATOR MENUITEM "&Ta bort frn Registret", ID_REGREMOVE MENUITEM SEPARATOR - MENUITEM "&Uppdatere", ID_REFRESH + MENUITEM "&Uppdatera", ID_REFRESH END POPUP "Hjlp" BEGIN @@ -35,8 +35,8 @@ IDR_LINKMENU MENU BEGIN POPUP "popup" BEGIN - MENUITEM "&ppne lnk i weblsare", ID_OPEN_LINK - MENUITEM "&Kopier lnk till urklipp", ID_COPY_LINK + MENUITEM "&ppna lnk i weblsare", ID_OPEN_LINK + MENUITEM "&Kopiera lnk till urklipp", ID_COPY_LINK END END @@ -46,7 +46,7 @@ BEGIN BEGIN MENUITEM "&Installera", ID_INSTALL MENUITEM "&Avinstallera", ID_UNINSTALL - MENUITEM "&ndre", ID_MODIFY + MENUITEM "&ndra", ID_MODIFY MENUITEM SEPARATOR MENUITEM "&Ta bort frn Registret", ID_REGREMOVE MENUITEM SEPARATOR @@ -60,7 +60,7 @@ CAPTION "Inst FONT 8, "MS Shell Dlg" BEGIN GROUPBOX "Allmnna", -1, 4, 2, 240, 61 - AUTOCHECKBOX "&Spara fnster position", IDC_SAVE_WINDOW_POS, 15, 12, 219, 12 + AUTOCHECKBOX "&Spara fnsterposition", IDC_SAVE_WINDOW_POS, 15, 12, 219, 12 AUTOCHECKBOX "&Uppdatera listan med tillgngliga program vid start", IDC_UPDATE_AVLIST, 15, 29, 219, 12 AUTOCHECKBOX "&Logga ur installation och borttagning program", IDC_LOG_ENABLED, 15, 46, 219, 12 @@ -68,9 +68,9 @@ BEGIN LTEXT "Mapp fr nerladdningar:", -1, 16, 75, 100, 9 EDITTEXT IDC_DOWNLOAD_DIR_EDIT, 15, 86, 166, 12, WS_CHILD | WS_VISIBLE | WS_GROUP PUSHBUTTON "&Vlj", IDC_CHOOSE, 187, 85, 50, 14 - AUTOCHECKBOX "&Ta bort programms installerare efter installation", IDC_DEL_AFTER_INSTALL, 16, 100, 218, 12 + AUTOCHECKBOX "&Ta bort programinstallerare efter installation", IDC_DEL_AFTER_INSTALL, 16, 100, 218, 12 - PUSHBUTTON "Frinstlld", IDC_DEFAULT_SETTINGS, 8, 124, 60, 14 + PUSHBUTTON "Standard", IDC_DEFAULT_SETTINGS, 8, 124, 60, 14 PUSHBUTTON "OK", IDOK, 116, 124, 60, 14 PUSHBUTTON "Avbryt", IDCANCEL, 181, 124, 60, 14 END @@ -184,14 +184,14 @@ BEGIN IDS_MODIFY "ndra" IDS_APPS_COUNT "Programantal: %d" IDS_WELCOME_TITLE "Vlkommen till ReactOS programhanterare!\n\n" - IDS_WELCOME_TEXT "Vlj en kategori till vnstre, och sedan ett program fr att installera eller avinstallera.\nReactOS Web sida: " + IDS_WELCOME_TEXT "Vlj en kategori till vnster, och sedan ett program fr att installera eller avinstallera.\nReactOS Web sida: " IDS_WELCOME_URL "http://www.reactos.org" IDS_INSTALLED "Installerat" IDS_AVAILABLEFORINST "Tillgngliga for installation" IDS_UPDATES "Uppdateringar" IDS_APPLICATIONS "Program" IDS_CHOOSE_FOLDER_TEXT "Vlj en mapp som kommer att anvndas fr nerladdning av program:" - IDS_CHOOSE_FOLDER_ERROR "Du har specificrat en obefintlig mapp!" + IDS_CHOOSE_FOLDER_ERROR "Du har specificrat en ej existerande mapp! Vill du skapa den?" IDS_USER_NOT_ADMIN "Du mste vara administratr fr att starta ""ReactOS programhanterare""!" IDS_APP_REG_REMOVE "r du sker p att du vill ta bort data det installerade programmets data frn registret?" IDS_INFORMATION "Information" diff --git a/reactos/base/applications/regedit/lang/sv-SE.rc b/reactos/base/applications/regedit/lang/sv-SE.rc index 70832d3e573..8a890d7a48d 100644 --- a/reactos/base/applications/regedit/lang/sv-SE.rc +++ b/reactos/base/applications/regedit/lang/sv-SE.rc @@ -1,7 +1,7 @@ /* * Regedit (Swedish resources) * - * Copyright 2005 Andreas Bjerkeholt + * Copyright 2005 Andreas Bjerkeholt modifierad 2011 Jaix Bly * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -54,8 +54,8 @@ BEGIN MENUITEM "&Exportera registerfil...", ID_REGISTRY_EXPORTREGISTRYFILE MENUITEM SEPARATOR - MENUITEM "Load Hive...", ID_REGISTRY_LOADHIVE, GRAYED - MENUITEM "Unload Hive...", ID_REGISTRY_UNLOADHIVE, GRAYED + MENUITEM "Ls in Registerdata...", ID_REGISTRY_LOADHIVE, GRAYED + MENUITEM "Ta bort Registerdata...", ID_REGISTRY_UNLOADHIVE, GRAYED MENUITEM SEPARATOR MENUITEM "&Anslut Ntverksregister...", ID_REGISTRY_CONNECTNETWORKREGISTRY @@ -72,15 +72,15 @@ BEGIN BEGIN MENUITEM "&ndra", ID_EDIT_MODIFY MENUITEM SEPARATOR - POPUP "&Ny(tt)" + POPUP "&Nytt" BEGIN MENUITEM "&Nyckel", ID_EDIT_NEW_KEY MENUITEM SEPARATOR MENUITEM "&Strngvrde", ID_EDIT_NEW_STRINGVALUE MENUITEM "&Binrvrde", ID_EDIT_NEW_BINARYVALUE MENUITEM "&DWORD-vrde", ID_EDIT_NEW_DWORDVALUE - MENUITEM "&Multi-String Value", ID_EDIT_NEW_MULTISTRINGVALUE - MENUITEM "&Expandable String Value", ID_EDIT_NEW_EXPANDABLESTRINGVALUE + MENUITEM "&Multistrngvrde", ID_EDIT_NEW_MULTISTRINGVALUE + MENUITEM "&Expanderbart Strngvrde", ID_EDIT_NEW_EXPANDABLESTRINGVALUE END MENUITEM SEPARATOR MENUITEM "B&ehrigheter...", ID_EDIT_PERMISSIONS @@ -90,7 +90,7 @@ BEGIN MENUITEM SEPARATOR MENUITEM "&Kopiera nyckelnamn", ID_EDIT_COPYKEYNAME MENUITEM SEPARATOR - MENUITEM "&Sk\tCtrl+F", ID_EDIT_FIND + MENUITEM "&Sk...\tCtrl+F", ID_EDIT_FIND MENUITEM "Sk N&sta\tF3", ID_EDIT_FINDNEXT END POPUP "&Visa" @@ -126,15 +126,15 @@ BEGIN END POPUP "" BEGIN - POPUP "&Ny(tt)" + POPUP "&Nytt" BEGIN MENUITEM "&Nyckel", ID_EDIT_NEW_KEY MENUITEM SEPARATOR MENUITEM "&Strngvrde", ID_EDIT_NEW_STRINGVALUE MENUITEM "&Binrvrde", ID_EDIT_NEW_BINARYVALUE MENUITEM "&DWORD-vrde", ID_EDIT_NEW_DWORDVALUE - MENUITEM "&Multi-String Value", ID_EDIT_NEW_MULTISTRINGVALUE - MENUITEM "&Expandable String Value", ID_EDIT_NEW_EXPANDABLESTRINGVALUE + MENUITEM "&Multistrngvrde", ID_EDIT_NEW_MULTISTRINGVALUE + MENUITEM "&Expanderbart Strngvalue", ID_EDIT_NEW_EXPANDABLESTRINGVALUE END END POPUP "" @@ -155,19 +155,19 @@ BEGIN MENUITEM "&Ta bort", ID_TREE_DELETE MENUITEM "&Byt namn", ID_TREE_RENAME MENUITEM SEPARATOR - MENUITEM "&Export", ID_TREE_EXPORT - MENUITEM "&Permissions...", ID_TREE_PERMISSIONS, GRAYED + MENUITEM "&Exportera", ID_TREE_EXPORT + MENUITEM "&Behrigheter...", ID_TREE_PERMISSIONS, GRAYED MENUITEM SEPARATOR MENUITEM "&Kopiera nyckelnamn", ID_EDIT_COPYKEYNAME END POPUP "" BEGIN - MENUITEM "C&ut", ID_HEXEDIT_CUT - MENUITEM "&Copy", ID_HEXEDIT_COPY - MENUITEM "&Paste", ID_HEXEDIT_PASTE - MENUITEM "&Delete", ID_HEXEDIT_DELETE + MENUITEM "Klipp &ut", ID_HEXEDIT_CUT + MENUITEM "&Kopiera", ID_HEXEDIT_COPY + MENUITEM "Klistra &in", ID_HEXEDIT_PASTE + MENUITEM "&Ta bort", ID_HEXEDIT_DELETE MENUITEM SEPARATOR - MENUITEM "Select &All", ID_HEXEDIT_SELECT_ALL + MENUITEM "Markera &Allt", ID_HEXEDIT_SELECT_ALL END END @@ -177,13 +177,13 @@ END */ IDD_LOADHIVE DIALOGEX DISCARDABLE 0, 0, 193, 34 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Load Hive" +CAPTION "Ls in registerdata" FONT 8, "Ms Shell Dlg" { - LTEXT "&Key:", IDC_STATIC, 4, 4, 15, 8, SS_LEFT + LTEXT "&Nyckel:", IDC_STATIC, 4, 4, 15, 8, SS_LEFT EDITTEXT IDC_EDIT_KEY, 23, 2, 167, 13 DEFPUSHBUTTON "OK", IDOK, 140, 17, 50, 14 - PUSHBUTTON "Cancel", IDCANCEL, 89, 17, 50, 14 + PUSHBUTTON "Avbryt", IDCANCEL, 89, 17, 50, 14 } IDD_EDIT_STRING DIALOGEX 32, 24, 252, 84 @@ -203,7 +203,7 @@ END IDD_EDIT_MULTI_STRING DIALOGEX 32, 24, 252, 174 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_NOIDLEMSG | DS_CONTEXTHELP | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "ndra multi-strng" +CAPTION "ndra multistrng" FONT 8, "MS Shell Dlg" BEGIN LTEXT "&Vrde:",IDC_STATIC,6,6,134,8 @@ -285,9 +285,9 @@ BEGIN ID_REGISTRY_EXPORTREGISTRYFILE "Exporterar hela eller en del av registret till en textfil" ID_REGISTRY_LOADHIVE - "Loads a hive file into the registry" + "Lser in registerdatafil till registret" ID_REGISTRY_UNLOADHIVE - "Unloads a hive from the registry" + "Tar bort registerdatafil frn registret" ID_REGISTRY_CONNECTNETWORKREGISTRY "Ansluter till en annan dators register" ID_REGISTRY_DISCONNECTNETWORKREGISTRY @@ -316,23 +316,23 @@ STRINGTABLE DISCARDABLE BEGIN IDS_ERROR "Fel" IDS_WARNING "Varning" - IDS_BAD_KEY "Can't query key '%s'" + IDS_BAD_KEY "Kan inte lsa nyckel '%s'" IDS_BAD_VALUE "Kan inte lsa vrdet '%s'" IDS_UNSUPPORTED_TYPE "Kan inte ndra nycklar av typen %ld" IDS_TOO_BIG_VALUE "Vrdet r fr stort (%ld)" IDS_MULTI_SZ_EMPTY_STRING "Data av typen REG_MULTI_SZ kan inte innehlla tomma strngar.\nDe tomma strngarna har tagits bort frn listan." - IDS_QUERY_DELETE_KEY_ONE "Are you sure you want to delete this key?" - IDS_QUERY_DELETE_KEY_MORE "Are you sure you want to delete these keys?" - IDS_QUERY_DELETE_KEY_CONFIRM "Confirm Key Delete" - IDS_QUERY_DELETE_ONE "r du sker p att du vill ta bort detta vrde?" - IDS_QUERY_DELETE_MORE "r du sker p att du vill ta bort dessa vrden?" + IDS_QUERY_DELETE_KEY_ONE "r du sker p att du vill ta bort denna nyckeln?" + IDS_QUERY_DELETE_KEY_MORE "r du sker p att du vill ta bort dessa nycklarna?" + IDS_QUERY_DELETE_KEY_CONFIRM "Bekrfta borttagning av nyckel" + IDS_QUERY_DELETE_ONE "r du sker p att du vill ta bort detta vrdet?" + IDS_QUERY_DELETE_MORE "r du sker p att du vill ta bort dessa vrdena?" IDS_QUERY_DELETE_CONFIRM "Bekrfta borttagning av vrde" - IDS_ERR_DELVAL_CAPTION "Borttagning misslyckades" + IDS_ERR_DELVAL_CAPTION "Fel vid borttagning av vrde" IDS_ERR_DELETEVALUE "Det gick inte att ta bort alla specificerade vrden!" - IDS_ERR_RENVAL_CAPTION "Namnbyte misslyckades" + IDS_ERR_RENVAL_CAPTION "Fel vid namnndring av vrde" IDS_ERR_RENVAL_TOEMPTY "Kunde inte byta namn p %s. Det specificerade vrdenamnet r tomt. Ange ett annat namn och frsk igen." - IDS_NEW_KEY "New Key #%d" - IDS_NEW_VALUE "New Value #%d" + IDS_NEW_KEY "Ny Nyckel #%d" + IDS_NEW_VALUE "Nytt Vrde #%d" END STRINGTABLE DISCARDABLE @@ -344,14 +344,14 @@ BEGIN IDS_MY_COMPUTER "Den hr datorn" IDS_IMPORT_REG_FILE "Importera registerfil" IDS_EXPORT_REG_FILE "Exportera registerfil" - IDS_LOAD_HIVE "Load Hive" - IDS_UNLOAD_HIVE "Unload Hive" + IDS_LOAD_HIVE "Ls in registerdatafil" + IDS_UNLOAD_HIVE "Ta bort registerdatafil" IDS_INVALID_DWORD "(felaktigt DWORD-vrde)" END STRINGTABLE DISCARDABLE BEGIN - IDS_FLT_REGFILE "Registration File" + IDS_FLT_REGFILE "Registerfil" IDS_FLT_REGFILES "Registerfiler" IDS_FLT_REGFILES_FLT "*.reg" IDS_FLT_REGEDIT4 "Win9x/NT4-Registerfiler (REGEDIT4)" @@ -388,7 +388,7 @@ BEGIN IDS_EXPAND "&Visa niv" IDS_COLLAPSE "&Dlj niv" IDS_GOTO_SUGGESTED_KEY "&Go to '%s'" - IDS_FINISHEDFIND "Finished searching through the registry." + IDS_FINISHEDFIND "Slutfrt skningen av registret." END /*****************************************************************/ @@ -402,66 +402,66 @@ IDD_EXPORTRANGE DIALOGEX DISCARDABLE 50, 50, 370, 50 STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_BORDER FONT 8, "MS Shell Dlg" BEGIN - GROUPBOX "Export Range",IDC_STATIC,2,0,366,48 - CONTROL "&All",IDC_EXPORT_ALL,"Button",BS_AUTORADIOBUTTON,10,10, 29,11 - CONTROL "S&elected Branch",IDC_EXPORT_BRANCH,"Button",BS_AUTORADIOBUTTON,10,22, 100,11 + GROUPBOX "Exportera Intervall",IDC_STATIC,2,0,366,48 + CONTROL "&Alla",IDC_EXPORT_ALL,"Button",BS_AUTORADIOBUTTON,10,10, 29,11 + CONTROL "&Vald Gren",IDC_EXPORT_BRANCH,"Button",BS_AUTORADIOBUTTON,10,22, 100,11 EDITTEXT IDC_EXPORT_BRANCH_TEXT,30,34,335,12 END IDD_ADDFAVORITES DIALOGEX DISCARDABLE 0, 0, 186, 46 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Add to Favorites" +CAPTION "Lgg till i Favoriter" FONT 8, "MS Shell Dlg" BEGIN DEFPUSHBUTTON "OK",IDOK,129,7,50,14 - PUSHBUTTON "Cancel",IDCANCEL,129,24,50,14 - LTEXT "&Favorite Name:",IDC_STATIC,7,7,70,10 + PUSHBUTTON "Avbryt",IDCANCEL,129,24,50,14 + LTEXT "&Namn p Favorit:",IDC_STATIC,7,7,70,10 EDITTEXT IDC_FAVORITENAME,7,26,110,13,ES_AUTOHSCROLL END IDD_REMOVEFAVORITES DIALOGEX DISCARDABLE 0, 0, 164, 135 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Remove Favorites" +CAPTION "Ta bort Favoriter" FONT 8, "MS Shell Dlg" BEGIN DEFPUSHBUTTON "OK",IDOK,107,114,50,14 - PUSHBUTTON "Cancel",IDCANCEL,7,114,50,14 + PUSHBUTTON "Avbryt",IDCANCEL,7,114,50,14 CONTROL "List1",IDC_FAVORITESLIST,"SysListView32",LVS_LIST | WS_BORDER | WS_TABSTOP,7,20,150,90 - LTEXT "Select Favorite(s):",IDC_STATIC,7,7,99,12 + LTEXT "Vlj Favorit(er):",IDC_STATIC,7,7,99,12 END IDD_FIND DIALOGEX DISCARDABLE 0, 0, 254, 82 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Find" +CAPTION "Sk" FONT 8, "MS Shell Dlg" BEGIN - DEFPUSHBUTTON "&Find Next",IDOK,197,7,50,14 - PUSHBUTTON "Cancel",IDCANCEL,197,24,50,14 - GROUPBOX "Look at",IDC_STATIC,7,25,63,51 - LTEXT "Fi&nd what:",IDC_STATIC,7,8,37,10 + DEFPUSHBUTTON "&Sk Nsta",IDOK,197,7,50,14 + PUSHBUTTON "Avbryt",IDCANCEL,197,24,50,14 + GROUPBOX "Sk i",IDC_STATIC,7,25,63,51 + LTEXT "&Sk efter:",IDC_STATIC,7,8,37,10 EDITTEXT IDC_FINDWHAT,47,7,142,13,ES_AUTOHSCROLL - CONTROL "&Keys",IDC_LOOKAT_KEYS,"Button",BS_AUTOCHECKBOX | + CONTROL "&Nycklar",IDC_LOOKAT_KEYS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,36,35,8 - CONTROL "&Values",IDC_LOOKAT_VALUES,"Button",BS_AUTOCHECKBOX | + CONTROL "&Vrden",IDC_LOOKAT_VALUES,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,48,36,8 CONTROL "&Data",IDC_LOOKAT_DATA,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,60,42,8 - CONTROL "Match &whole string only",IDC_MATCHSTRING,"Button", + CONTROL "Matcha endast &hela strngar",IDC_MATCHSTRING,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,83,32,94,13 - CONTROL "Match &case",IDC_MATCHCASE,"Button",BS_AUTOCHECKBOX | + CONTROL "Matcha &shiftlge",IDC_MATCHCASE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,83,48,90,12 END IDD_FINDING DIALOGEX 0, 0, 145, 50 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Find" +CAPTION "Sk" FONT 8, "MS Shell Dlg", 400, 0, 0x1 BEGIN ICON IDI_REGEDIT,IDC_STATIC,7,7,20,20 - DEFPUSHBUTTON "&Cancel",IDCANCEL,93,29,45,14 - LTEXT "Searching the registry...",IDC_STATIC,33,12,83,8 + DEFPUSHBUTTON "&Avbryt",IDCANCEL,93,29,45,14 + LTEXT "Sk i registret...",IDC_STATIC,33,12,83,8 END /* diff --git a/reactos/base/applications/screensavers/3dtext/lang/sv-SE.rc b/reactos/base/applications/screensavers/3dtext/lang/sv-SE.rc new file mode 100644 index 00000000000..d0a33b7d501 --- /dev/null +++ b/reactos/base/applications/screensavers/3dtext/lang/sv-SE.rc @@ -0,0 +1,17 @@ +LANGUAGE LANG_SWEDISH, SUBLANG_NEUTRAL + +DLG_SCRNSAVECONFIGURE DIALOGEX 0, 0, 273, 178 +STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "3D Text skrmslckarinstllingar" +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + DEFPUSHBUTTON "OK",IDOK,216,7,50,14 + PUSHBUTTON "Avbryt",IDCANCEL,216,24,50,14 + EDITTEXT IDC_MESSAGE_TEXT,18,28,122,14,ES_AUTOHSCROLL + LTEXT "Anpassa text",IDC_STATIC,18,17,65,8 +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_DESCRIPTION "3D Text skrmslckare" +END diff --git a/reactos/base/applications/screensavers/3dtext/rsrc.rc b/reactos/base/applications/screensavers/3dtext/rsrc.rc index 5f555e2f5e7..7c30d422e8f 100644 --- a/reactos/base/applications/screensavers/3dtext/rsrc.rc +++ b/reactos/base/applications/screensavers/3dtext/rsrc.rc @@ -25,4 +25,5 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL #include "lang/pl-PL.rc" #include "lang/ru-RU.rc" #include "lang/sk-SK.rc" +#include "lang/sv-SE.rc" #include "lang/uk-UA.rc" diff --git a/reactos/base/applications/screensavers/logon/lang/sv-SE.rc b/reactos/base/applications/screensavers/logon/lang/sv-SE.rc new file mode 100644 index 00000000000..7908353f741 --- /dev/null +++ b/reactos/base/applications/screensavers/logon/lang/sv-SE.rc @@ -0,0 +1,13 @@ +/* + * PROJECT: ReactOS RAPPS + * FILE: \base\applications\screensavers\logon\lang\sv-SE.rc + * PURPOSE: Swedish resource file + * Translation: Jaix Bly + */ +LANGUAGE LANG_SWEDISH, SUBLANG_NEUTRAL + +STRINGTABLE DISCARDABLE +BEGIN + IDS_DESCRIPTION "Inloggingsskrmslckare" + IDS_TEXT "Inga instllningar behvs." +END diff --git a/reactos/base/applications/screensavers/logon/logon.rc b/reactos/base/applications/screensavers/logon/logon.rc index e7ccf62bce8..088e5da99ef 100644 --- a/reactos/base/applications/screensavers/logon/logon.rc +++ b/reactos/base/applications/screensavers/logon/logon.rc @@ -27,5 +27,6 @@ IDB_SERVER BITMAP DISCARDABLE "res/1.bmp" #include "lang/no-NO.rc" #include "lang/ro-RO.rc" #include "lang/sk-SK.rc" +#include "lang/sv-SE.rc" #include "lang/uk-UA.rc" #include "lang/ru-RU.rc" diff --git a/reactos/base/applications/shutdown/lang/sv-SE.rc b/reactos/base/applications/shutdown/lang/sv-SE.rc new file mode 100644 index 00000000000..8c4f2c8f838 --- /dev/null +++ b/reactos/base/applications/shutdown/lang/sv-SE.rc @@ -0,0 +1,20 @@ +/* + * PROJECT: ReactOS RAPPS + * FILE: \base\applications\shutdown\lang\sv-SE.rc + * PURPOSE: Swedish resource file + * Translation: Jaix Bly + */ +LANGUAGE LANG_SWEDISH, SUBLANG_NEUTRAL + +STRINGTABLE DISCARDABLE +BEGIN + +IDS_USAGE, "SYNTAX: shutdown [-?] [-l | -s | -r] [-f]\n\n\ + Ingen parameter eller -? Visar detta meddelandet.\n\ + -l\t\tLogga ut\n\ + -s\t\tStng av datorn.\n\ + -r\t\tStng av och starta datorn.\n\ + -f\t\tGr att program som krs avslutas utan att anvndare meddelas.\n\ + \t\tOm du inte angav ngon annan parameter till detta kommandot\n\ + \t\tkommer anvndaren dessutom att loggas ut." +END diff --git a/reactos/base/applications/shutdown/rsrc.rc b/reactos/base/applications/shutdown/rsrc.rc index c06b62f28f9..a7dc8242bc0 100644 --- a/reactos/base/applications/shutdown/rsrc.rc +++ b/reactos/base/applications/shutdown/rsrc.rc @@ -16,5 +16,6 @@ #include "lang/pl-PL.rc" #include "lang/ru-RU.rc" #include "lang/sk-SK.rc" +#include "lang/sv-SE.rc" #include "lang/uk-UA.rc" diff --git a/reactos/base/applications/sndrec32/lang/sv-SE.rc b/reactos/base/applications/sndrec32/lang/sv-SE.rc new file mode 100644 index 00000000000..519a8f4d746 --- /dev/null +++ b/reactos/base/applications/sndrec32/lang/sv-SE.rc @@ -0,0 +1,60 @@ +/* + * PROJECT: ReactOS RAPPS + * FILE: \base\applications\sndrec32\lang\sv-SE.rc + * PURPOSE: Swedish resource file + * Translation: Jaix Bly + */ +LANGUAGE LANG_SWEDISH, SUBLANG_NEUTRAL + +IDC_REACTOS_SNDREC32 ACCELERATORS +BEGIN + "?", IDM_ABOUT, ASCII, ALT + "/", IDM_ABOUT, ASCII, ALT +END + +IDD_ABOUTBOX DIALOGEX 0, 0, 196, 75 +STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Information om ReactOS_sndrec32" +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + ICON 128,IDC_REACTOS_SNDREC32,19,14,21,20 + LTEXT "ReactOS_sndrec32, version 1.0",IDC_STATIC,56,16,114,8,SS_NOPREFIX + LTEXT "Copyright (C) 2009",IDC_STATIC,55,25,114,8 + DEFPUSHBUTTON "OK",IDOK,139,54,50,14,WS_GROUP +END + +IDR_MENU1 MENU +BEGIN + POPUP "Arkiv" + BEGIN + MENUITEM "Ny", ID_NEW + MENUITEM "ppna...", ID_FILE_OPEN + MENUITEM "Spara", ID_FILE_SAVE, GRAYED + MENUITEM "Spara som...", ID_FILE_SAVEAS, GRAYED + MENUITEM SEPARATOR + MENUITEM "Avsluta", ID_EXIT + END + MENUITEM "todo1", 0 + MENUITEM "todo2", 0 + POPUP "Hjlp" + BEGIN + MENUITEM "Om...", ID__ABOUT + END +END + +STRINGTABLE +BEGIN + IDS_APP_TITLE "Ljudinspelaren" + IDC_REACTOS_SNDREC32 "REACTOS_SNDREC32" +END + +STRINGTABLE +BEGIN + IDS_STRPOS "Position: %.2f s" + IDS_STRDUR "Lngd: %.2f s" + IDS_STRBUF "Buffert: %.2f kb" + IDS_STRFMT "%.1f kHz %u bits" + IDS_STRMONO "mono" + IDS_STRSTEREO "stereo" + IDS_STRCHAN "%s" +END diff --git a/reactos/base/applications/sndrec32/rsrc.rc b/reactos/base/applications/sndrec32/rsrc.rc index a79028067df..7964e8e0be0 100644 --- a/reactos/base/applications/sndrec32/rsrc.rc +++ b/reactos/base/applications/sndrec32/rsrc.rc @@ -25,5 +25,6 @@ IDB_BITMAP2_STOP_DIS BITMAP "resources/but_stop_dis.bmp" #include "lang/ja-JP.rc" #include "lang/pl-PL.rc" #include "lang/sk-SK.rc" +#include "lang/sv-SE.rc" #include "lang/uk-UA.rc" diff --git a/reactos/base/applications/sndvol32/lang/sv-SE.rc b/reactos/base/applications/sndvol32/lang/sv-SE.rc index f10445e2e95..7638ff9d833 100644 --- a/reactos/base/applications/sndvol32/lang/sv-SE.rc +++ b/reactos/base/applications/sndvol32/lang/sv-SE.rc @@ -1,7 +1,8 @@ ///////////////////////////////////////////////////////////////////////////// // Swedish (SE) resources /* - * Copyright 2005 David Nordenberg + * Copyright 2005 David Nordenberg + * completed and edited by Jaix Bly * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -55,7 +56,7 @@ BEGIN PUSHBUTTON "&Inspelning", IDC_RECORDING, 13,61,47,8, BS_AUTORADIOBUTTON PUSHBUTTON "&Andra:", IDC_OTHER, 13,80,42,8, BS_AUTORADIOBUTTON | WS_DISABLED COMBOBOX IDC_LINE, 55,80,155,50, CBS_DROPDOWNLIST | WS_TABSTOP | WS_DISABLED - LTEXT "Show the following volume controls:", IDC_LABELCONTROLS, 7, 109, 162, 8 + LTEXT "Visa fljander volymekontroller:", IDC_LABELCONTROLS, 7, 109, 162, 8 CONTROL "", IDC_CONTROLS, "SysListView32", LVS_REPORT | LVS_NOCOLUMNHEADER | WS_TABSTOP | WS_BORDER, 7, 122, 211, 96 PUSHBUTTON "OK", IDOK, 114,226,50,14 @@ -66,12 +67,12 @@ IDD_VOLUME_CTRL DIALOG 0, 0, 90, 150 STYLE WS_POPUP | WS_BORDER FONT 8, "MS Shell Dlg" BEGIN - LTEXT "Master", IDC_LINE_NAME, 4, 7, 100, 15 + LTEXT "Huvud", IDC_LINE_NAME, 4, 7, 100, 15 CONTROL "", -1, "static", SS_ETCHEDHORZ | WS_CHILD | WS_VISIBLE, 4, 30, 82, 1 - LTEXT "Balance", -1, 4, 35, 80, 42 - LTEXT "Volume", -1, 4, 100, 77, 108 + LTEXT "Balanse", -1, 4, 35, 80, 42 + LTEXT "Volyme", -1, 4, 100, 77, 108 CONTROL "", IDC_LINE_SLIDER_HORZ, "msctls_trackbar32", TBS_HORZ | TBS_AUTOTICKS | TBS_BOTH | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 25, 55, 85, 30 CONTROL "", IDC_LINE_SLIDER_VERT, "msctls_trackbar32", TBS_VERT | TBS_AUTOTICKS | TBS_BOTH | TBS_DOWNISLEFT | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 32, 115, 30, 70 - CHECKBOX "&Mute", IDC_LINE_SWITCH, 4, 190, 90, 12, BS_AUTOCHECKBOX + CHECKBOX "&Tyst", IDC_LINE_SWITCH, 4, 190, 90, 12, BS_AUTOCHECKBOX CONTROL "", IDC_LINE_SEP, "static", SS_ETCHEDVERT | WS_CHILD | WS_VISIBLE, 130, 7, 1, 200 END diff --git a/reactos/base/setup/reactos/lang/pl-PL.rc b/reactos/base/setup/reactos/lang/pl-PL.rc index dbb342a0167..7b1fdb25cfd 100644 --- a/reactos/base/setup/reactos/lang/pl-PL.rc +++ b/reactos/base/setup/reactos/lang/pl-PL.rc @@ -15,7 +15,7 @@ CAPTION "Instalator ReactOS" FONT 8, "MS Shell Dlg" BEGIN LTEXT "Witaj w Kreatorze instalacji ReactOS.", IDC_STARTTITLE, 115, 8, 195, 24 - LTEXT "Nie moesz zainstalowa ReactOS bezporednio! Uruchom ponownie komputer z tej pyty aby zainstalowa ReactOS.", IDC_STATIC, 115, 40, 195, 100 + LTEXT "Nie moesz zainstalowa ReactOS bezporednio! Uruchom ponownie komputer z tej pyty, aby zainstalowa ReactOS.", IDC_STATIC, 115, 40, 195, 100 LTEXT "Nacinij przycisk aby zakoczy prac Instalatora.", IDC_STATIC, 115, 169, 195, 17 END @@ -29,7 +29,7 @@ BEGIN CONTROL "", IDC_LANGUAGES, "ComboBox", WS_VSCROLL | WS_TABSTOP | CBS_DROPDOWNLIST, 132, 107, 176, 142 CONTROL "Ukad klawiatury:", IDC_STATIC, "Static", WS_CHILD | WS_VISIBLE | WS_GROUP | SS_RIGHT, 20, 142, 106, 11 CONTROL "", IDC_KEYLAYOUT, "ComboBox", WS_VSCROLL | WS_TABSTOP | CBS_DROPDOWNLIST, 132, 141, 176, 81 - LTEXT "Nacinij Dalej aby wybra rodzaj instalacji.", IDC_STATIC, 10, 180 ,297, 10 + LTEXT "Nacinij Dalej, aby wybra rodzaj instalacji.", IDC_STATIC, 10, 180 ,297, 10 END IDD_TYPEPAGE DIALOGEX DISCARDABLE 0, 0, 317, 193 @@ -40,7 +40,7 @@ BEGIN CONTROL "Rodzaj instalacji", IDC_STATIC, "Button", BS_GROUPBOX, 10,0,297,172 CONTROL "Zainstaluj ReactOS", IDC_INSTALL, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 20, 15, 277, 10 CONTROL "Napraw lub zaktualizuj zainstalowany wczeniej ReactOS", IDC_SETUP, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 20, 30, 277, 10 - LTEXT "Nacinij Dalej aby zmieni ustawienia sprztu.", IDC_STATIC, 10, 180 ,297, 10 + LTEXT "Nacinij Dalej, aby zmieni ustawienia sprztu.", IDC_STATIC, 10, 180 ,297, 10 END IDD_DEVICEPAGE DIALOGEX DISCARDABLE 0, 0, 317, 193 @@ -55,7 +55,7 @@ BEGIN CONTROL "", IDC_DISPLAY, "ComboBox", WS_VSCROLL | WS_TABSTOP | CBS_DROPDOWNLIST , 100, 35, 150, 80 LTEXT "Klawiatura:", IDC_STATIC, 20,55, 80, 10 CONTROL "", IDC_KEYBOARD, "ComboBox", WS_VSCROLL | WS_TABSTOP | CBS_DROPDOWNLIST , 100, 55, 150, 80 - LTEXT "Nacinij Dalej aby ustali miejsce instalacji.", IDC_STATIC, 10, 180 ,277, 20 + LTEXT "Nacinij Dalej, aby ustali miejsce instalacji.", IDC_STATIC, 10, 180 ,277, 20 END IDD_DRIVEPAGE DIALOGEX DISCARDABLE 0, 0, 317, 193 @@ -69,7 +69,7 @@ BEGIN PUSHBUTTON "&Usu", IDC_PARTDELETE, 76,155,50,15 PUSHBUTTON "s&terownik", IDC_DEVICEDRIVER, 162,155,50,15, WS_DISABLED PUSHBUTTON "&Opcje zaawansowane...", IDC_PARTMOREOPTS, 218,155,80,15 - LTEXT "Nacinij Dalej aby rozpocz proces instalacji.", IDC_STATIC, 10, 180 ,277, 20 + LTEXT "Nacinij Dalej, aby rozpocz proces instalacji.", IDC_STATIC, 10, 180 ,277, 20 END IDD_PARTITION DIALOGEX DISCARDABLE 0, 0, 145, 90 @@ -111,7 +111,7 @@ CAPTION "Instalator ReactOS" FONT 8, "MS Shell Dlg" BEGIN CONTROL "Podsumowanie instalacji", IDC_ACTION, "Button", BS_GROUPBOX, 10,0,297,172 - LTEXT "Kliknij Dalej aby rozpocz proces instalacji.", IDC_STATIC, 10, 180 ,277, 20 + LTEXT "Kliknij Dalej, aby rozpocz proces instalacji.", IDC_STATIC, 10, 180 ,277, 20 END IDD_PROCESSPAGE DIALOGEX 0, 0, 317, 193 @@ -136,7 +136,7 @@ BEGIN LTEXT "Po klikniciu Zakocz ten komputer zostanie uruchomiony ponownie.", IDC_STATIC, 20, 80, 277, 10 CONTROL "", IDC_RESTART_PROGRESS, "msctls_progress32", PBS_SMOOTH | WS_CHILD | WS_VISIBLE | WS_BORDER, 20, 120, 277, 8 - LTEXT "Jeli w napdzie jest pyta CD, wycignij j. Nastpnie nacinij Zakocz aby uruchomi ponownie Twj komputer.", IDC_STATIC, 10, 180, 297, 20 + LTEXT "Jeli w napdzie jest pyta CD, wycignij j. Nastpnie nacinij Zakocz, aby uruchomi ponownie Twj komputer.", IDC_STATIC, 10, 180, 297, 20 END STRINGTABLE @@ -152,7 +152,7 @@ BEGIN IDS_PROCESSTITLE "Przygotuj partycj, skopiuj pliki i zapisz ustawienia systemu" IDS_PROCESSSUBTITLE "Przygotuj i sformatuj partycj, skopiuj pliki, skopiuj i zainstaluj bootloader" IDS_RESTARTTITLE "Pierwszy etap instalacji zakoczony sukcesem" - IDS_RESTARTSUBTITLE "Pierwszy etap instalacji zosta zakoczony, uruchom ponownie komputer aby przej do drugiego etapu" + IDS_RESTARTSUBTITLE "Pierwszy etap instalacji zosta zakoczony, uruchom ponownie komputer, aby przej do drugiego etapu" IDS_SUMMARYTITLE "Podsumowanie instalacji" IDS_SUMMARYSUBTITLE "Sprawd ustawienia instalacji przed dokonaniem zmian na dysku" IDS_ABORTSETUP "Instalacja ReactOS nie zostaa ukoczona na tym komputerze. Jeli teraz zakoczysz instalacj, bdziesz musia uruchomi Instalator ponownie, aby zainstalowa Reactos. Na pewno zakoczy?" diff --git a/reactos/base/setup/usetup/lang/pl-PL.h b/reactos/base/setup/usetup/lang/pl-PL.h index ee8d9d8353e..7e3ad8aaf5a 100644 --- a/reactos/base/setup/usetup/lang/pl-PL.h +++ b/reactos/base/setup/usetup/lang/pl-PL.h @@ -108,7 +108,7 @@ static MUI_ENTRY plPLWelcomePageEntries[] = { 8, 21, - "\x07 Nacinij F3 aby wyj bez instalacji systemu ReactOS.", + "\x07 Nacinij F3, aby wyj bez instalacji systemu ReactOS.", TEXT_STYLE_NORMAL }, { @@ -208,13 +208,13 @@ static MUI_ENTRY plPLIntroPageEntries[] = { 8, 23, - "\x07 Nacinij ENTER aby zainstalowa system ReactOS.", + "\x07 Nacinij ENTER, aby zainstalowa system ReactOS.", TEXT_STYLE_NORMAL }, { 8, 25, - "\x07 Nacinij F3 aby wyj bez instalacji systemu ReactOS.", + "\x07 Nacinij F3, aby wyj bez instalacji systemu ReactOS.", TEXT_STYLE_NORMAL }, { @@ -407,13 +407,13 @@ static MUI_ENTRY plPLDevicePageEntries[] = { 6, 19, - "Moesz zmieni poszczeglne ustawienia za pomoc klawiszy GRA i D", + "Moesz zmieni poszczeglne ustawienia za pomoc klawiszy GRA i D,", TEXT_STYLE_NORMAL }, { 6, 20, - "aby wybra kategori. Potem nacinij ENTER by przej do menu z ", + "aby wybra kategori. Potem nacinij ENTER, by przej do menu z ", TEXT_STYLE_NORMAL }, { @@ -483,19 +483,19 @@ static MUI_ENTRY plPLRepairPageEntries[] = { 8, 17, - "\x07 Nacinij R by uruchomi Konsol Odtwarzania.", + "\x07 Nacinij R, by uruchomi Konsol Odtwarzania.", TEXT_STYLE_NORMAL }, { 8, 19, - "\x07 Nacinij ESC by powrci do gwnego menu.", + "\x07 Nacinij ESC, by powrci do gwnego menu.", TEXT_STYLE_NORMAL }, { 8, 21, - "\x07 Nacinij ENTER by zrestartowa komputer.", + "\x07 Nacinij ENTER, by zrestartowa komputer.", TEXT_STYLE_NORMAL }, { @@ -528,7 +528,7 @@ static MUI_ENTRY plPLComputerPageEntries[] = { 8, 10, - "\x07 Nacinij klawisz GRA albo D by wybra odpowiedni typ komputera.", + "\x07 Nacinij klawisz GRA albo D, by wybra odpowiedni typ komputera.", TEXT_STYLE_NORMAL }, { @@ -540,7 +540,7 @@ static MUI_ENTRY plPLComputerPageEntries[] = { 8, 13, - "\x07 Nacinij klawisz ESC aby powrci do poprzedniej strony bez zmiany", + "\x07 Nacinij klawisz ESC, aby powrci do poprzedniej strony bez zmiany", TEXT_STYLE_NORMAL }, { @@ -632,7 +632,7 @@ static MUI_ENTRY plPLQuitPageEntries[] = { 10, 11, - "Nacinij ENTER by zrestartowa komputer.", + "Nacinij ENTER, by zrestartowa komputer.", TEXT_STYLE_NORMAL }, { @@ -665,19 +665,19 @@ static MUI_ENTRY plPLDisplayPageEntries[] = }, { 8, 10, - "\x07 Nacinij klawisz GRA albo D by wybra rozdzielczo i liczb", + "\x07 Nacinij klawisz GRA albo D, by wybra rozdzielczo i liczb", TEXT_STYLE_NORMAL }, { 8, 11, - " kolorw a nastpnie nacinij ENTER.", + " kolorw, a nastpnie nacinij ENTER.", TEXT_STYLE_NORMAL }, { 8, 13, - "\x07 Nacinij ESC key aby powrci do poprzedniej strony bez zmiany", + "\x07 Nacinij ESC, aby powrci do poprzedniej strony bez zmiany", TEXT_STYLE_NORMAL }, { @@ -729,7 +729,7 @@ static MUI_ENTRY plPLSuccessPageEntries[] = { 10, 11, - "Nacinij ENTER by zrestartowa komputer.", + "Nacinij ENTER, by zrestartowa komputer.", TEXT_STYLE_NORMAL }, { @@ -816,25 +816,25 @@ static MUI_ENTRY plPLSelectPartitionEntries[] = { 8, 11, - "\x07 Nacinij GRA lub D by wybra pozycj z listy.", + "\x07 Nacinij GRA lub D, by wybra pozycj z listy.", TEXT_STYLE_NORMAL }, { 8, 13, - "\x07 Nacinij ENTER by zainstalowa ReactOS na wybranej partycji.", + "\x07 Nacinij ENTER, by zainstalowa ReactOS na wybranej partycji.", TEXT_STYLE_NORMAL }, { 8, 15, - "\x07 Nacinij C by stworzy now partycj.", + "\x07 Nacinij C, by stworzy now partycj.", TEXT_STYLE_NORMAL }, { 8, 17, - "\x07 Nacinij D by skasowa istniejc partycj.", + "\x07 Nacinij D, by skasowa istniejc partycj.", TEXT_STYLE_NORMAL }, { @@ -868,7 +868,7 @@ static MUI_ENTRY plPLFormatPartitionEntries[] = { 6, 10, - "Instalator sformatuje teraz partycj. Nacinij ENTER aby kontynuowa.", + "Instalator sformatuje teraz partycj. Nacinij ENTER, aby kontynuowa.", TEXT_STYLE_NORMAL }, { @@ -908,7 +908,7 @@ static MUI_ENTRY plPLInstallDirectoryEntries[] = { 6, 14, - "Aby zmieni domylny katalog, uyj klawisza BACKSPACE by skasowa", + "Aby zmieni domylny katalog, uyj klawisza BACKSPACE, by skasowa", TEXT_STYLE_NORMAL }, { @@ -1046,7 +1046,7 @@ static MUI_ENTRY plPLKeyboardSettingsEntries[] = { 8, 10, - "\x07 Nacinij klawisz GRA albo D by wybra odpowiedni typ klawiatury.", + "\x07 Nacinij klawisz GRA albo D, by wybra odpowiedni typ klawiatury.", TEXT_STYLE_NORMAL }, { @@ -1058,7 +1058,7 @@ static MUI_ENTRY plPLKeyboardSettingsEntries[] = { 8, 13, - "\x07 Nacinij ESC key aby powrci do poprzedniej strony bez zmiany", + "\x07 Nacinij ESC, aby powrci do poprzedniej strony bez zmiany", TEXT_STYLE_NORMAL }, { @@ -1098,7 +1098,7 @@ static MUI_ENTRY plPLLayoutSettingsEntries[] = { 8, 10, - "\x07 Nacinij klawisz GRA albo D by wybra odpowiedni ukad", + "\x07 Nacinij klawisz GRA albo D, by wybra odpowiedni ukad", TEXT_STYLE_NORMAL }, { @@ -1110,7 +1110,7 @@ static MUI_ENTRY plPLLayoutSettingsEntries[] = { 8, 13, - "\x07 Nacinij ESC key aby powrci do poprzedniej strony bez zmiany", + "\x07 Nacinij ESC, aby powrci do poprzedniej strony bez zmiany", TEXT_STYLE_NORMAL }, { @@ -1180,19 +1180,19 @@ static MUI_ENTRY plPLSelectFSEntries[] = { 8, 19, - "\x07 Nacinij klawisz GRA alub D by wybra system plikw.", + "\x07 Nacinij klawisz GRA alub D, by wybra system plikw.", 0 }, { 8, 21, - "\x07 Nacinij ENTER aby sformatowa partycj.", + "\x07 Nacinij ENTER, aby sformatowa partycj.", 0 }, { 8, 23, - "\x07 Nacinij ESC aby wybra inn partycj.", + "\x07 Nacinij ESC, aby wybra inn partycj.", 0 }, { @@ -1227,7 +1227,7 @@ static MUI_ENTRY plPLDeletePartitionEntries[] = { 8, 18, - "\x07 Nacinij D by skasowa partycj.", + "\x07 Nacinij D, by skasowa partycj.", TEXT_STYLE_NORMAL }, { @@ -1239,7 +1239,7 @@ static MUI_ENTRY plPLDeletePartitionEntries[] = { 8, 21, - "\x07 Nacinij ESC aby anulowa.", + "\x07 Nacinij ESC, aby anulowa.", TEXT_STYLE_NORMAL }, { @@ -1291,10 +1291,10 @@ MUI_ERROR plPLErrorEntries[] = //ERROR_NOT_INSTALLED "ReactOS nie zosta w peni zainstalowany na twoim\n" "komputerze. Jeli wyjdziesz teraz, trzeba bdzie\n" - "ponownie uruchomi instalator by zainstalowa ReactOS.\n" + "ponownie uruchomi instalator, by zainstalowa ReactOS.\n" "\n" - " \x07 Nacinij ENTER aby kontynuowa instalacj.\n" - " \x07 Nacinij F3 aby wyj z instalatora.", + " \x07 Nacinij ENTER, aby kontynuowa instalacj.\n" + " \x07 Nacinij F3, aby wyj z instalatora.", "F3= Wyjcie ENTER = Kontynuacja" }, { @@ -1359,8 +1359,8 @@ MUI_ERROR plPLErrorEntries[] = "\n" "Tworzenie lub kasowanie partycji moe zniszczy ca tablic partycji.\n" "\n" - " \x07 Nacinij F3 aby wyj z instalatora." - " \x07 Nacinij ENTER aby kontynuowa.", + " \x07 Nacinij F3, aby wyj z instalatora." + " \x07 Nacinij ENTER, aby kontynuowa.", "F3= Wyjcie ENTER = Kontynuacja" }, { @@ -1368,14 +1368,14 @@ MUI_ERROR plPLErrorEntries[] = "Nie moesz stworzy nowej partycji w miejscu ju\n" "istniejcej!\n" "\n" - " * Nacinij dowolny klawisz aby kontynuowa.", + " * Nacinij dowolny klawisz, aby kontynuowa.", NULL }, { //ERROR_DELETE_SPACE, "Nie moesz skasowa pustej przestrzeni, gdzie nie ma adnej partycji!\n" "\n" - " * Nacinij dowolny klawisz aby kontynuowa.", + " * Nacinij dowolny klawisz, aby kontynuowa.", NULL }, { @@ -1494,7 +1494,7 @@ MUI_ERROR plPLErrorEntries[] = { //ERROR_INSUFFICIENT_DISKSPACE, "Brak wystarczajcej wolnej przestrzeni w wybranej partycji.\n" - " * Nacinij dowolny klawisz aby kontynuowa.", + " * Nacinij dowolny klawisz, aby kontynuowa.", NULL }, { diff --git a/reactos/base/setup/usetup/lang/sv-SE.h b/reactos/base/setup/usetup/lang/sv-SE.h index debbfc22b61..c4aeeadbb5c 100644 --- a/reactos/base/setup/usetup/lang/sv-SE.h +++ b/reactos/base/setup/usetup/lang/sv-SE.h @@ -1,3 +1,9 @@ +/* + * PROJECT: ReactOS Setup + * FILE: \base\setup\usetup\lang\sv-SE.h + * PURPOSE: Swedish resource file + * Translation: Jaix Bly plus perhaps GreatLord if blame and translate.reactos.se is consulted. + */ #pragma once MUI_LAYOUTS svSELayouts[] = @@ -30,7 +36,7 @@ static MUI_ENTRY svSELanguagePageEntries[] = { 8, 11, - " Then press ENTER.", + " Then Tryck ENTER.", TEXT_STYLE_NORMAL }, { @@ -42,7 +48,7 @@ static MUI_ENTRY svSELanguagePageEntries[] = { 0, 0, - " ENTER = Continue F3 = Quit", + " ENTER = Fortstt F3 = Avsluta", TEXT_TYPE_STATUS }, { @@ -796,43 +802,43 @@ static MUI_ENTRY svSESelectPartitionEntries[] = { 6, 8, - "The list below shows existing partitions and unused disk", + "Lista nedan visar befintliga partitioner och oanvndt", TEXT_STYLE_NORMAL }, { 6, 9, - "space for new partitions.", + "diskutrymme fr nya partitioner.", TEXT_STYLE_NORMAL }, { 8, 11, - "\x07 Press UP or DOWN to select a list entry.", + "\x07 Tryck UPP eller NER tangenten fr att vlja i listan.", TEXT_STYLE_NORMAL }, { 8, 13, - "\x07 Press ENTER to install ReactOS onto the selected partition.", + "\x07 Tryck ENTER fr att installerara ReactOS till vald partition.", TEXT_STYLE_NORMAL }, { 8, 15, - "\x07 Press C to create a new partition.", + "\x07 Tryck C fr att skapa en ny partition.", TEXT_STYLE_NORMAL }, { 8, 17, - "\x07 Press D to delete an existing partition.", + "\x07 Tryck D fr att ta bort en befintlig partititon.", TEXT_STYLE_NORMAL }, { 0, 0, - " Please wait...", + " Var Vnlig Vnta...", TEXT_TYPE_STATUS }, { @@ -854,19 +860,19 @@ static MUI_ENTRY svSEFormatPartitionEntries[] = { 6, 8, - "Format partition", + "Formatera partition", TEXT_STYLE_NORMAL }, { 6, 10, - "Setup will now format the partition. Press ENTER to continue.", + "Partitionen kommer nu att formaters Tryck ENTER fr att fortstta.", TEXT_STYLE_NORMAL }, { 0, 0, - " ENTER = Continue F3 = Quit", + " ENTER = Fortstt F3 = Avsluta", TEXT_TYPE_STATUS }, { @@ -888,37 +894,37 @@ static MUI_ENTRY svSEInstallDirectoryEntries[] = { 6, 8, - "Setup installs ReactOS files onto the selected partition. Choose a", + "ReactOS installeras till vald partition. Vlj en", TEXT_STYLE_NORMAL }, { 6, 9, - "directory where you want ReactOS to be installed:", + "mapp som du vill installera ReactOS till.:", TEXT_STYLE_NORMAL }, { 6, 14, - "To change the suggested directory, press BACKSPACE to delete", + "Fr att ndra den freslagna mappen, tryck BACKSTEG fr att radera", TEXT_STYLE_NORMAL }, { 6, 15, - "characters and then type the directory where you want ReactOS to", + "bokstver och skriv sedan in mappen dit du vill att ReactOS ska bli", TEXT_STYLE_NORMAL }, { 6, 16, - "be installed.", + "installerad.", TEXT_STYLE_NORMAL }, { 0, 0, - " ENTER = Continue F3 = Quit", + " ENTER = Fortstt F3 = Avsluta", TEXT_TYPE_STATUS }, { @@ -940,25 +946,25 @@ static MUI_ENTRY svSEFileCopyEntries[] = { 11, 12, - "Please wait while ReactOS Setup copies files to your ReactOS", + "Var vnlig vnta medans ReactOS Setup kopieras till din ReactOS.", TEXT_STYLE_NORMAL }, { 30, 13, - "installation folder.", + "installationsmapp.", TEXT_STYLE_NORMAL }, { 20, 14, - "This may take several minutes to complete.", + "Detta kan ta flera minuter att fullflja.", TEXT_STYLE_NORMAL }, { 0, 0, - " \xB3 Please wait... ", + " \xB3 Var Vnlig Vnta... ", TEXT_TYPE_STATUS }, { @@ -980,37 +986,37 @@ static MUI_ENTRY svSEBootLoaderEntries[] = { 6, 8, - "Setup is installing the boot loader", + "Setup installerar boot-loadern", TEXT_STYLE_NORMAL }, { 8, 12, - "Install bootloader on the harddisk (MBR and VBR).", + "Installera bootloadern till harddisken (MBR and VBR).", TEXT_STYLE_NORMAL }, { 8, 13, - "Install bootloader on the harddisk (VBR only).", + "Installera bootloadern till hrddisken (VBR only).", TEXT_STYLE_NORMAL }, { 8, 14, - "Install bootloader on a floppy disk.", + "Installera bootloadern till en diskett.", TEXT_STYLE_NORMAL }, { 8, 15, - "Skip install bootloader.", + "Skippa installation av bootloader.", TEXT_STYLE_NORMAL }, { 0, 0, - " ENTER = Continue F3 = Quit", + " ENTER = Fortstt F3 = Avsluta", TEXT_TYPE_STATUS }, { @@ -1032,37 +1038,37 @@ static MUI_ENTRY svSEKeyboardSettingsEntries[] = { 6, 8, - "You want to change the type of keyboard to be installed.", + "Du vill ndra tangentbordstyp som ska intealleras.", TEXT_STYLE_NORMAL }, { 8, 10, - "\x07 Press the UP or DOWN key to select the desired keyboard type.", + "\x07 Tryck UP eller NER tangenten fr att vlja nskat tangentbordstyp.", TEXT_STYLE_NORMAL }, { 8, 11, - " Then press ENTER.", + " Tryck sedan ENTER.", TEXT_STYLE_NORMAL }, { 8, 13, - "\x07 Press the ESC key to return to the previous page without changing", + "\x07 Tryck ESC tangenten fr att terg till frra sidan utan att ndra ngot.", TEXT_STYLE_NORMAL }, { 8, 14, - " the keyboard type.", + " tangentbordstyp.", TEXT_STYLE_NORMAL }, { 0, 0, - " ENTER = Continue ESC = Cancel F3 = Quit", + " ENTER = Fortstt ESC = Avbryt F3 = Avsluta", TEXT_TYPE_STATUS }, { @@ -1084,37 +1090,37 @@ static MUI_ENTRY svSELayoutSettingsEntries[] = { 6, 8, - "Please select a layout to be installed by default.", + "Var vnlig och vlj layout du vill installera som standard.", TEXT_STYLE_NORMAL }, { 8, 10, - "\x07 Press the UP or DOWN key to select the desired keyboard", + "\x07 Tryck UPP eller NER tangenten fr att vlja nskad", TEXT_STYLE_NORMAL }, { 8, 11, - " layout. Then press ENTER.", + " tangentbordslayout. Tryck sedan ENTER.", TEXT_STYLE_NORMAL }, { 8, 13, - "\x07 Press the ESC key to return to the previous page without changing", + "\x07 Tryck ESC tangenten fr att terg till frra sidan utan att ndra", TEXT_STYLE_NORMAL }, { 8, 14, - " the keyboard layout.", + " tangentbordslayout.", TEXT_STYLE_NORMAL }, { 0, 0, - " ENTER = Continue ESC = Cancel F3 = Quit", + " ENTER = Fortstt ESC = Avbryt F3 = Avsluta", TEXT_TYPE_STATUS }, { @@ -1137,13 +1143,13 @@ static MUI_ENTRY svSEPrepareCopyEntries[] = { 6, 8, - "Setup prepares your computer for copying the ReactOS files. ", + "Setup frbereder din dator fr kopiering av ReactOS filer. ", TEXT_STYLE_NORMAL }, { 0, 0, - " Building the file copy list...", + " Sammanstller filkopieringslistan...", TEXT_TYPE_STATUS }, { @@ -1166,31 +1172,31 @@ static MUI_ENTRY svSESelectFSEntries[] = { 6, 17, - "Select a file system from the list below.", + "Vlj ett filsystem i listan nedan.", 0 }, { 8, 19, - "\x07 Press UP or DOWN to select a file system.", + "\x07 Tryck UPP or NER tangenten fr att vlja filsystem.", 0 }, { 8, 21, - "\x07 Press ENTER to format the partition.", + "\x07 Tryck ENTER fr att formatera partitionen.", 0 }, { 8, 23, - "\x07 Press ESC to select another partition.", + "\x07 Tryck ESC fr att vlja en annan partition.", 0 }, { 0, 0, - " ENTER = Continue ESC = Cancel F3 = Quit", + " ENTER = Fortstt ESC = Avbryt F3 = Avsluta", TEXT_TYPE_STATUS }, @@ -1213,31 +1219,31 @@ static MUI_ENTRY svSEDeletePartitionEntries[] = { 6, 8, - "You have chosen to delete the partition", + "Du har valt att ta bort partitionen", TEXT_STYLE_NORMAL }, { 8, 18, - "\x07 Press D to delete the partition.", + "\x07 Tryck D fr att ta bort partitionen.", TEXT_STYLE_NORMAL }, { 11, 19, - "WARNING: All data on this partition will be lost!", + "VARNING: Alla data p denna partition kommer att frloras!", TEXT_STYLE_NORMAL }, { 8, 21, - "\x07 Press ESC to cancel.", + "\x07 Tryck ESC fr att avbryta.", TEXT_STYLE_NORMAL }, { 0, 0, - " D = Delete Partition ESC = Cancel F3 = Quit", + " D = Tar bort Partitionen ESC = Avbryt F3 = Avsluta", TEXT_TYPE_STATUS }, { @@ -1259,13 +1265,13 @@ static MUI_ENTRY svSERegistryEntries[] = { 6, 8, - "Setup is updating the system configuration. ", + "Setup uppdaterar systemkonfigurationen. ", TEXT_STYLE_NORMAL }, { 0, 0, - " Creating registry hives...", + " Skapar regististerdatafiler...", TEXT_TYPE_STATUS }, { @@ -1281,212 +1287,212 @@ MUI_ERROR svSEErrorEntries[] = { { //ERROR_NOT_INSTALLED - "ReactOS is not completely installed on your\n" - "computer. If you quit Setup now, you will need to\n" - "run Setup again to install ReactOS.\n" + "ReactOS installerades inte fullstndigt p din\n" + "dator. Om du avslutar Setup nu, kommer du att behva\n" + "kra Setup igen fr att installera ReactOS.\n" "\n" - " \x07 Press ENTER to continue Setup.\n" - " \x07 Press F3 to quit Setup.", - "F3= Quit ENTER = Continue" + " \x07 Tryck ENTER fr att fortstta Setup.\n" + " \x07 Tryck F3 fr att avsluta Setup.", + "F3= Avsluta ENTER = Fortstta" }, { //ERROR_NO_HDD - "Setup could not find a harddisk.\n", - "ENTER = Reboot computer" + "Setup kunde inte hitta ngon hrddisk.\n", + "ENTER = Starta om datorn" }, { //ERROR_NO_SOURCE_DRIVE - "Setup could not find its source drive.\n", - "ENTER = Reboot computer" + "Setup kunde inte hitta sin klldisk.\n", + "ENTER = Starta om datorn" }, { //ERROR_LOAD_TXTSETUPSIF - "Setup failed to load the file TXTSETUP.SIF.\n", - "ENTER = Reboot computer" + "Setup misslyckades att lsa in filen TXTSETUP.SIF.\n", + "ENTER = Starta om datorn" }, { //ERROR_CORRUPT_TXTSETUPSIF - "Setup found a corrupt TXTSETUP.SIF.\n", - "ENTER = Reboot computer" + "Setup fann en korrupt TXTSETUP.SIF.\n", + "ENTER = Starta om datorn" }, { //ERROR_SIGNATURE_TXTSETUPSIF, - "Setup found an invalid signature in TXTSETUP.SIF.\n", - "ENTER = Reboot computer" + "Setup hittade en ogiltig signatur i TXTSETUP.SIF.\n", + "ENTER = Starta om datorn" }, { //ERROR_DRIVE_INFORMATION - "Setup could not retrieve system drive information.\n", - "ENTER = Reboot computer" + "Setup kunde inte lsa in informationen om systemenheten.\n", + "ENTER = Starta om datorn" }, { //ERROR_WRITE_BOOT, - "Setup failed to install FAT bootcode on the system partition.", - "ENTER = Reboot computer" + "Setup misslyckades installera FAT bootkod p systempartitionen.", + "ENTER = Starta om datorn" }, { //ERROR_LOAD_COMPUTER, - "Setup failed to load the computer type list.\n", - "ENTER = Reboot computer" + "Setup misslyckades att lsa datortypslistan.\n", + "ENTER = Starta om datorn" }, { //ERROR_LOAD_DISPLAY, - "Setup failed to load the display settings list.\n", - "ENTER = Reboot computer" + "Setup misslyckades att lsa in skrminstllningslistan.\n", + "ENTER = Starta om datorn" }, { //ERROR_LOAD_KEYBOARD, - "Setup failed to load the keyboard type list.\n", - "ENTER = Reboot computer" + "Setup misslyckades att lsa in tangentbordstypslistan.\n", + "ENTER = Starta om datorn" }, { //ERROR_LOAD_KBLAYOUT, - "Setup failed to load the keyboard layout list.\n", - "ENTER = Reboot computer" + "Setup misslyckades att lsa in tangentbordslayoutslistan.\n", + "ENTER = Starta om datorn" }, { //ERROR_WARN_PARTITION, - "Setup found that at least one harddisk contains an incompatible\n" - "partition table that can not be handled properly!\n" + "Setup fann att minst en hrdisk innehller en partitionstabell\n" + "inte r kompatibel och inte kan hanteras korrekt!\n" "\n" - "Creating or deleting partitions can destroy the partiton table.\n" + "Skapa eller ta bort partitioner kan frstra partitionstabellen.\n" "\n" - " \x07 Press F3 to quit Setup." - " \x07 Press ENTER to continue.", - "F3= Quit ENTER = Continue" + " \x07 Tryck F3 fr att avsluta Setup." + " \x07 Tryck ENTER fr att fortstta.", + "F3= Avsluta ENTER = Fortstt" }, { //ERROR_NEW_PARTITION, - "You can not create a new Partition inside\n" - "of an already existing Partition!\n" + "Du kan inte skapa en partition inuti\n" + "en redat befintlig partition!\n" "\n" - " * Press any key to continue.", + " * Tryck valfri tangent fr att fortstta.", NULL }, { //ERROR_DELETE_SPACE, - "You can not delete unpartitioned disk space!\n" + "Du kan inte ta bort opartitionerrat diskutrymme!\n" "\n" - " * Press any key to continue.", + " * Tryck valfri tangent fr att fortstta.", NULL }, { //ERROR_INSTALL_BOOTCODE, - "Setup failed to install the FAT bootcode on the system partition.", - "ENTER = Reboot computer" + "Setup misslyckades att installera FAT bootkoden p systempartitionen.", + "ENTER = Starta om datorn" }, { //ERROR_NO_FLOPPY, - "No disk in drive A:.", - "ENTER = Continue" + "Ingen disk i enhet A:.", + "ENTER = Fortstt" }, { //ERROR_UPDATE_KBSETTINGS, - "Setup failed to update keyboard layout settings.", - "ENTER = Reboot computer" + "Setup misslyckades att updatera instllninarna fr tangentbordslayout.", + "ENTER = Starta om datorn" }, { //ERROR_UPDATE_DISPLAY_SETTINGS, - "Setup failed to update display registry settings.", - "ENTER = Reboot computer" + "Setup misslyckades att uppdatera skrmregisterinstllningen.", + "ENTER = Starta om datorn" }, { //ERROR_IMPORT_HIVE, - "Setup failed to import a hive file.", - "ENTER = Reboot computer" + "Setup misslyckades att improterea en registerdatafil.", + "ENTER = Starta om datorn" }, { //ERROR_FIND_REGISTRY - "Setup failed to find the registry data files.", - "ENTER = Reboot computer" + "Setup misslyckades att hitta registerdatafilerna.", + "ENTER = Starta om datorn" }, { //ERROR_CREATE_HIVE, - "Setup failed to create the registry hives.", - "ENTER = Reboot computer" + "Setup misslyckades att skapa registerdatafilerna.", + "ENTER = Starta om datorn" }, { //ERROR_INITIALIZE_REGISTRY, - "Setup failed to set the initialize the registry.", - "ENTER = Reboot computer" + "Setup misslyckades att initialisera registret.", + "ENTER = Starta om datorn" }, { //ERROR_INVALID_CABINET_INF, - "Cabinet has no valid inf file.\n", - "ENTER = Reboot computer" + "Kabinettet has inen giltig inf fil.\n", + "ENTER = Starta om datorn" }, { //ERROR_CABINET_MISSING, - "Cabinet not found.\n", - "ENTER = Reboot computer" + "Kabinettet hittades inte.\n", + "ENTER = Starta om datorn" }, { //ERROR_CABINET_SCRIPT, - "Cabinet has no setup script.\n", - "ENTER = Reboot computer" + "Kabinettet har inget installationsskript.\n", + "ENTER = Starta om datorn" }, { //ERROR_COPY_QUEUE, - "Setup failed to open the copy file queue.\n", - "ENTER = Reboot computer" + "Setup misslyckades att ppna filkopierningskn.\n", + "ENTER = Starta om datorn" }, { //ERROR_CREATE_DIR, - "Setup could not create install directories.", - "ENTER = Reboot computer" + "Setup kunnde inte skapa installationsmapparna.", + "ENTER = Starta om datorn" }, { //ERROR_TXTSETUP_SECTION, - "Setup failed to find the 'Directories' section\n" - "in TXTSETUP.SIF.\n", - "ENTER = Reboot computer" + "Setup misslyckades att hitta 'Directories' sektionen\n" + "i TXTSETUP.SIF.\n", + "ENTER = Starta om datorn" }, { //ERROR_CABINET_SECTION, - "Setup failed to find the 'Directories' section\n" - "in the cabinet.\n", - "ENTER = Reboot computer" + "Setup misslyckades att hitta 'Directories' sektionen\n" + "i kabinettet.\n", + "ENTER = Starta om datorn" }, { //ERROR_CREATE_INSTALL_DIR - "Setup could not create the install directory.", - "ENTER = Reboot computer" + "Setup kunnde inte skapa installationsmappen.", + "ENTER = Starta om datorn" }, { //ERROR_FIND_SETUPDATA, - "Setup failed to find the 'SetupData' section\n" - "in TXTSETUP.SIF.\n", - "ENTER = Reboot computer" + "Setup misslyckades att hitta 'SetupData' sektionen\n" + "i TXTSETUP.SIF.\n", + "ENTER = Starta om datorn" }, { //ERROR_WRITE_PTABLE, - "Setup failed to write partition tables.\n" - "ENTER = Reboot computer" + "Setup misslyckades att skriva partitionstabellen.\n" + "ENTER = Starta om datorn" }, { //ERROR_ADDING_CODEPAGE, - "Setup failed to add codepage to registry.\n" - "ENTER = Reboot computer" + "Setup misslyckades att lgga till vald codepage till registret.\n" + "ENTER = Starta om datorn" }, { //ERROR_UPDATE_LOCALESETTINGS, - "Setup could not set the system locale.\n" - "ENTER = Reboot computer" + "Setup kunnde inte stlla in 'system locale'.\n" + "ENTER = Starta om datorn" }, { //ERROR_ADDING_KBLAYOUTS, - "Setup failed to add keyboard layouts to registry.\n" - "ENTER = Reboot computer" + "Setup misslyckades att lgga till tangentbordslayouten till registret.\n" + "ENTER = Starta om datorn" }, { //ERROR_UPDATE_GEOID, - "Setup could not set the geo id.\n" - "ENTER = Reboot computer" + "Setup kunde inte stalla int 'geo id'.\n" + "ENTER = Starta om datorn" }, { //ERROR_INSUFFICIENT_DISKSPACE, - "Not enough free space in the selected partition.\n" - " * Press any key to continue.", + "Inte tillrckligt mycket fritt utrymme p den valda partitionen.\n" + " * Tryck valfri tangent fr att fortstta.", NULL }, { @@ -1598,103 +1604,103 @@ MUI_PAGE svSEPages[] = MUI_STRING svSEStrings[] = { {STRING_PLEASEWAIT, - " Please wait..."}, + " Var vnlig vnta..."}, {STRING_INSTALLCREATEPARTITION, - " ENTER = Install C = Create Partition F3 = Quit"}, + " ENTER = Installera C = Skapa Partition F3 = Avsluta"}, {STRING_INSTALLDELETEPARTITION, - " ENTER = Install D = Delete Partition F3 = Quit"}, + " ENTER = Installera D = Ta bort Partition F3 = Avsluta"}, {STRING_PARTITIONSIZE, - "Size of new partition:"}, + "Storlek p den nya partitionen:"}, {STRING_CHOOSENEWPARTITION, - "You have chosen to create a new partition on"}, + "Du har valt att skapa en ny partiton p"}, {STRING_HDDSIZE, - "Please enter the size of the new partition in megabytes."}, + "Vnligen skriv in storleken av den nya partitionen i megabytes."}, {STRING_CREATEPARTITION, - " ENTER = Create Partition ESC = Cancel F3 = Quit"}, + " ENTER = Skapa Partition ESC = Avbryt F3 = Avsluta"}, {STRING_PARTFORMAT, - "This Partition will be formatted next."}, + "Denna Partition kommer att bli formaterad hrnst."}, {STRING_NONFORMATTEDPART, - "You chose to install ReactOS on a new or unformatted Partition."}, + "Du valde att installera ReactOS p en oformaterad partition."}, {STRING_INSTALLONPART, - "Setup install ReactOS onto Partition"}, + "Setup installerar ReactOS till Partitionen"}, {STRING_CHECKINGPART, - "Setup is now checking the selected partition."}, + "Setup undersker nu den valda partitionen."}, {STRING_QUITCONTINUE, - "F3= Quit ENTER = Continue"}, + "F3= Avsluta ENTER = Fortstt"}, {STRING_REBOOTCOMPUTER, - "ENTER = Reboot computer"}, + "ENTER = Starta om datorn"}, {STRING_TXTSETUPFAILED, - "Setup failed to find the '%S' section\nin TXTSETUP.SIF.\n"}, + "Setup misslyckades att hitta '%S' sektionen\ni TXTSETUP.SIF.\n"}, {STRING_COPYING, - " Copying file: %S"}, + " Kopierar fil: %S"}, {STRING_SETUPCOPYINGFILES, - "Setup is copying files..."}, + "Setup kopierar filer..."}, {STRING_REGHIVEUPDATE, - " Updating registry hives..."}, + " Uppdaterar registerdatafiler..."}, {STRING_IMPORTFILE, - " Importing %S..."}, + " Importerar %S..."}, {STRING_DISPLAYETTINGSUPDATE, - " Updating display registry settings..."}, + " Uppdaterar skrmregisterinstllningar..."}, {STRING_LOCALESETTINGSUPDATE, - " Updating locale settings..."}, + " Uppdaterar lokala instllningar..."}, {STRING_KEYBOARDSETTINGSUPDATE, - " Updating keyboard layout settings..."}, + " Uppdaterar tangentbordslayoutinstllningar..."}, {STRING_CODEPAGEINFOUPDATE, - " Adding codepage information to registry..."}, + " Lgger till information om codepage till registret..."}, {STRING_DONE, - " Done..."}, + " Frdigt..."}, {STRING_REBOOTCOMPUTER2, - " ENTER = Reboot computer"}, + " ENTER = Starta om datorn"}, {STRING_CONSOLEFAIL1, - "Unable to open the console\n\n"}, + "Det gr inte ppna Konsollen\n\n"}, {STRING_CONSOLEFAIL2, - "The most common cause of this is using an USB keyboard\n"}, + "Den vanligaste orsaken till detta r att ett USB tangentbord anvnds\n"}, {STRING_CONSOLEFAIL3, - "USB keyboards are not fully supported yet\n"}, + "USB tangentbord r itne helt sttt n\n"}, {STRING_FORMATTINGDISK, - "Setup is formatting your disk"}, + "Setup formaterar din disk"}, {STRING_CHECKINGDISK, - "Setup is checking your disk"}, + "Setup underker din disk"}, {STRING_FORMATDISK1, - " Format partition as %S file system (quick format) "}, + " Formaterar partition som %S filsystem (snabbformatering) "}, {STRING_FORMATDISK2, - " Format partition as %S file system "}, + " Formaterar partition som %S filsystem "}, {STRING_KEEPFORMAT, - " Keep current file system (no changes) "}, + " Behll nuvarande filsystem (inga frndringar) "}, {STRING_HDINFOPARTCREATE, - "%I64u %s Harddisk %lu (Port=%hu, Bus=%hu, Id=%hu) on %wZ."}, + "%I64u %s Hrddisk %lu (Port=%hu, Bus=%hu, Id=%hu) p %wZ."}, {STRING_HDDINFOUNK1, - "%I64u %s Harddisk %lu (Port=%hu, Bus=%hu, Id=%hu)."}, + "%I64u %s Hrddisk %lu (Port=%hu, Bus=%hu, Id=%hu)."}, {STRING_HDDINFOUNK2, - " %c%c Type %lu %I64u %s"}, + " %c%c Typ %lu %I64u %s"}, {STRING_HDINFOPARTDELETE, - "on %I64u %s Harddisk %lu (Port=%hu, Bus=%hu, Id=%hu) on %wZ."}, + "on %I64u %s Hrddisk %lu (Port=%hu, Bus=%hu, Id=%hu) p %wZ."}, {STRING_HDDINFOUNK3, - "on %I64u %s Harddisk %lu (Port=%hu, Bus=%hu, Id=%hu)."}, + "on %I64u %s Hrddisk %lu (Port=%hu, Bus=%hu, Id=%hu)."}, {STRING_HDINFOPARTZEROED, - "Harddisk %lu (%I64u %s), Port=%hu, Bus=%hu, Id=%hu (%wZ)."}, + "Hrddisk %lu (%I64u %s), Port=%hu, Bus=%hu, Id=%hu (%wZ)."}, {STRING_HDDINFOUNK4, - "%c%c Type %lu %I64u %s"}, + "%c%c Typ %lu %I64u %s"}, {STRING_HDINFOPARTEXISTS, - "on Harddisk %lu (%I64u %s), Port=%hu, Bus=%hu, Id=%hu (%wZ)."}, + "p Hrddisk %lu (%I64u %s), Port=%hu, Bus=%hu, Id=%hu (%wZ)."}, {STRING_HDDINFOUNK5, - "%c%c Type %-3u %6lu %s"}, + "%c%c Typ %-3u %6lu %s"}, {STRING_HDINFOPARTSELECT, - "%6lu %s Harddisk %lu (Port=%hu, Bus=%hu, Id=%hu) on %S"}, + "%6lu %s Hrddisk %lu (Port=%hu, Bus=%hu, Id=%hu) p %S"}, {STRING_HDDINFOUNK6, - "%6lu %s Harddisk %lu (Port=%hu, Bus=%hu, Id=%hu)"}, + "%6lu %s Hrddisk %lu (Port=%hu, Bus=%hu, Id=%hu)"}, {STRING_NEWPARTITION, - "Setup created a new partition on"}, + "Setup skapade en ny partition p"}, {STRING_UNPSPACE, - " Unpartitioned space %6lu %s"}, + " Opartitionerat utrymme %6lu %s"}, {STRING_MAXSIZE, "MB (max. %lu MB)"}, {STRING_UNFORMATTED, - "New (Unformatted)"}, + "Ny (Oformaterad)"}, {STRING_FORMATUNUSED, - "Unused"}, + "Oanvnt"}, {STRING_FORMATUNKNOWN, - "Unknown"}, + "Oknd"}, {STRING_KB, "KB"}, {STRING_MB, @@ -1702,6 +1708,6 @@ MUI_STRING svSEStrings[] = {STRING_GB, "GB"}, {STRING_ADDKBLAYOUTS, - "Adding keyboard layouts"}, + "Lgger till tangentbordslayouter"}, {0, 0} }; diff --git a/reactos/base/setup/vmwinst/lang/sv-SE.rc b/reactos/base/setup/vmwinst/lang/sv-SE.rc new file mode 100644 index 00000000000..a2aba4ddc6b --- /dev/null +++ b/reactos/base/setup/vmwinst/lang/sv-SE.rc @@ -0,0 +1,137 @@ +/* + * PROJECT: ReactOS RAPPS + * FILE: \base\setup\vmwinst\lang\sv-SE.rc + * PURPOSE: Swedish resource file + * Translation: Jaix Bly + */ +LANGUAGE LANG_SWEDISH, SUBLANG_NEUTRAL + +IDD_WELCOMEPAGE DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT +STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Installation av Videodrivrutiner" +FONT 8, "MS Shell Dlg", 0, 0, 0x0 +BEGIN + LTEXT "ReactOS Setup har upptckt att du kr ReactOS i VMware(r).", -1, 117, 8, 140, 24 + LTEXT "Om du vill installera VMware(r) SVGA drivrutin tryck 'Nsta', annars tryck 'Avbryt'.", -1, 117, 140, 140, 17 +END + +IDD_INSERT_VMWARE_TOOLS DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT +STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Installation av Videodrivrutiner" +FONT 8, "MS Shell Dlg", 0, 0, 0x0 +BEGIN + LTEXT "ReactOS Setup kommer inte med VMware(r) SVGA drivrutiner.\n\nG drfr till 'VM' i din VMware(r) workstation menyrad och vlj 'Installera VMware verktyg...'\n\n\nTryck 'Nsta' fr att fortstta eller 'Avbryt' fr att hoppa ver SVGA drivrutinsinstallation.",-1,25,25,225,85 +END + +IDD_INSTALLING_VMWARE_TOOLS DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT +STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Installation av Videodrivrutiner" +FONT 8, "MS Shell Dlg", 0, 0, 0x0 +BEGIN + LTEXT "{STATUS}",IDC_INSTALLINGSTATUS,25,68,225,8 + CONTROL "", IDC_INSTALLINGPROGRESS, "msctls_progress32", PBS_MARQUEE | WS_CHILD | WS_VISIBLE | WS_BORDER, 25, 80, 225, 8 +END + +IDD_CONFIG DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT +STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Installation av Videodrivrutiner" +FONT 8, "MS Shell Dlg", 0, 0, 0x0 +BEGIN + LTEXT "Installationen av VMware(r) SVGA drivrutin har lyckats. Vnligen vlj nskad skrmupplsning:",-1,25,5,225,20 + PUSHBUTTON "640x480", 1120, 25, 30, 65, 15, BS_AUTORADIOBUTTON + PUSHBUTTON "800x600", 1400, 25, 45, 65, 15, BS_AUTORADIOBUTTON + PUSHBUTTON "1024x768", 1792, 25, 60, 65, 15, BS_AUTORADIOBUTTON + PUSHBUTTON "1152x864", 2016, 25, 75, 65, 15, BS_AUTORADIOBUTTON + PUSHBUTTON "1280x960", 2240, 110, 30, 65, 15, BS_AUTORADIOBUTTON + PUSHBUTTON "1280x1024", 2304, 110, 45, 65, 15, BS_AUTORADIOBUTTON + PUSHBUTTON "1400x1050", 2450, 110, 60, 65, 15, BS_AUTORADIOBUTTON + PUSHBUTTON "1600x1200", 2800, 110, 75, 65, 15, BS_AUTORADIOBUTTON + PUSHBUTTON "1792x1344", 3136, 195, 30, 65, 15, BS_AUTORADIOBUTTON + PUSHBUTTON "1856x1392", 3248, 195, 45, 65, 15, BS_AUTORADIOBUTTON + PUSHBUTTON "1920x1440", 3360, 195, 60, 50, 15, BS_AUTORADIOBUTTON + LTEXT "Vnligen vlj nskat frgdjup:", -1, 25, 93, 225, 12 + COMBOBOX IDC_COLORQUALITY, 25, 105, 75, 80, CBS_DROPDOWNLIST | WS_TABSTOP +END + +IDD_INSTALLATION_FAILED DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT +STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Installation av Videodrivrutiner" +FONT 8, "MS Shell Dlg", 0, 0, 0x0 +BEGIN + LTEXT "ReactOS Setup lyckades inte installera VMware(r) SVGA drivrutin.\n\n\nTryck 'Slutfr' fr att fortstta installationsprosessen.",-1,25,25,225,85 +END + +IDD_CHOOSEACTION DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT +STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Installation av Videodrivrutiner" +FONT 8, "MS Shell Dlg", 0, 0, 0x0 +BEGIN + LTEXT "VMware(r) SVGA drivrutin r redan installerad.\n\nVnligen vlj vad du vill gra:",-1,25,5,225,30 + PUSHBUTTON "Konfigurera skrminstllingar", IDC_CONFIGSETTINGS, 25, 40, 200, 15, BS_AUTORADIOBUTTON + PUSHBUTTON "Anvnd en annan grafikdrivrutin", IDC_USEOTHERDRIVER, 25, 55, 200, 15, BS_AUTORADIOBUTTON + PUSHBUTTON "Avinstallera VMware(r) SVGA drivrutin", IDC_UNINSTALL, 25, 70, 200, 15, BS_AUTORADIOBUTTON + LTEXT "Tryck 'Nsta' fr att fortstta eller 'Avbryt' fr att avsluta guiden.", -1, 25, 93, 225, 12 +END + +IDD_SELECTDRIVER DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT +STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Installation av Videodrivrutiner" +FONT 8, "MS Shell Dlg", 0, 0, 0x0 +BEGIN + LTEXT "Vnligen vlj Grafikdrivrutin som du vill anvnda:",-1,25,25,225,15 + PUSHBUTTON "ReactOS VGA drivrutin", IDC_VGA, 25, 40, 225, 15, BS_AUTORADIOBUTTON + PUSHBUTTON "ReactOS VBE drivrutin (SVGA)", IDC_VBE, 25, 55, 225, 15, BS_AUTORADIOBUTTON + LTEXT "Tryck 'Slutfr' fr att avsluta eller 'Avbryt' fr att avsluta installationen utan ndringar.", -1, 25, 93, 225, 20 +END + +IDD_DOUNINSTALL DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT +STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Installation av Videodrivrutiner" +FONT 8, "MS Shell Dlg", 0, 0, 0x0 +BEGIN + LTEXT "ReactOS Setup kommer att avinstallera din VMware(r) SVGA drivrutin!!!\n\n\nTryck 'Slutfr' fr att avinstallere drivrutinen eller 'Avbryt' for att lmna det som det r.",-1,25,25,225,85 +END + +STRINGTABLE +BEGIN + IDS_WIZARD_NAME "VMware(r) upptckt" + IDS_FAILEDTOLOCATEDRIVERS "ReactOS Setup kunde inte hitta installationsfilerna.\nVnligen frskra dig om att VMware(r) verktygs CD-ROM r monterad." + IDS_FAILEDTOCOPYFILES "ReactOS Setup misslyckades att kopiere ndvndiga filer.\nVnligen frskra dig om att VMware(r) verktygs CD-ROM r monterad.\n" + IDS_FAILEDTOACTIVATEDRIVER "Misslyckades att aktivera VMware(r) SVGA drivrutin!" + IDS_FAILEDTOSELVGADRIVER "Misslyckades att aktivera ReactOS VGA drivrutin!" + IDS_FAILEDTOSELVBEDRIVER "Misslyckades att aktivera ReactOS VBE drivrutin!" + IDS_UNINSTNOTICE "VMware(r) SVGA drivrutins filer har inte nnu blivit raderade.\nVnligen radera dem manuellt efter att systemet startat om." + IDS_FAILEDTOADDREGENTRIES "Misslyckes att skapa registerinstllninar fr VMware(r) SVGA drivrutin!" +END + +STRINGTABLE +BEGIN + 10001 "Lgsta (8BPP)" + 10002 "Medel (16BPP)" + 10003 "Hgsta (32BPP)" +END + +STRINGTABLE +BEGIN + IDS_SEARCHINGFORCDROM "Sker efter VMware(r) Vertygs CD-ROM..." + IDS_COPYINGFILES "Kopierar filer..." + IDS_ENABLINGDRIVER "Aktiverar VMware(r) SVGA drivrutiner..." +END + +STRINGTABLE +BEGIN + IDD_INSERT_VMWARE_TOOLSTITLE "Guide fr installation av VMware (r) SVGA drivrutiner" + IDD_INSERT_VMWARE_TOOLSSUBTITLE "Vnligen stt in VMware verktygs CD-Rom." + IDD_INSTALLING_VMWARE_TOOLSTITLE "Guide fr installation av VMware (r) SVGA drivrutin" + IDD_INSTALLING_VMWARE_TOOLSSUBTITLE "Sker och kopierar VMware (r) SVGA drivrutin." + IDD_CONFIGTITLE "Guide fr installation av VMware (r) SVGA drivrutin" + IDD_CONFIGSUBTITLE "Vlj din favoritskrmsupplsning." + IDD_INSTALLATION_FAILEDTITLE "Guide fr installation av VMware (r) SVGA drivrutin" + IDD_INSTALLATION_FAILEDSUBTITLE "VMware (r) SVGA drivrutinsinstallation misslyckades." + IDD_CHOOSEACTIONTITLE "Guide fr installation av VMware (r) SVGA drivrutin" + IDD_CHOOSEACTIONSUBTITLE "Vlj vad du vill gra." + IDD_SELECTDRIVERTITLE "Guide fr installation av VMware (r) SVGA drivrutin" + IDD_SELECTDRIVERSUBTITLE "Vlj en drivrutin." + IDD_DOUNINSTALLTITLE "Guide fr installation av VMware (r) SVGA drivrutin" + IDD_DOUNINSTALLSUBTITLE "Avinstallerar drivrutinen." +END diff --git a/reactos/base/setup/vmwinst/rsrc.rc b/reactos/base/setup/vmwinst/rsrc.rc index efbb68a5f2c..65ee2b880d3 100644 --- a/reactos/base/setup/vmwinst/rsrc.rc +++ b/reactos/base/setup/vmwinst/rsrc.rc @@ -28,5 +28,6 @@ IDB_HEADER BITMAP "resources/header.bmp" #include "lang/no-NO.rc" #include "lang/pl-PL.rc" #include "lang/ru-RU.rc" +#include "lang/sv-SE.rc" #include "lang/uk-UA.rc" #include "lang/zh-CN.rc" diff --git a/reactos/base/shell/cmd/lang/sv-SE.rc b/reactos/base/shell/cmd/lang/sv-SE.rc new file mode 100644 index 00000000000..e2630f21ce9 --- /dev/null +++ b/reactos/base/shell/cmd/lang/sv-SE.rc @@ -0,0 +1,713 @@ +LANGUAGE LANG_SWEDISH, SUBLANG_NEUTRAL +STRINGTABLE DISCARDABLE +BEGIN + +STRING_ASSOC_HELP, "ndra assossierad filextention.\n\n\ +assoc [.ext[=[FileType]]]\n\ +\n\ +assoc (print all associations)\n\ +assoc .ext (print specific association)\n\ +assoc .ext= (remove specific association)\n\ +assoc .ext=FileType (add new association)\n" + +STRING_ATTRIB_HELP, "Visar eller ndrar filattributen.\n\n\ +ATTRIB [+R | -R] [+A | -A] [+S | -S] [+H | -H] fil ...\n\ + [/S [/D]]\n\n\ + + Stter ett attribut\n\ + - Rensar ett attribut\n\ + R Attribut: Skrivskyddad.\n\ + A Attribut: Arkiverad.\n\ + S Attribut: System.\n\ + H Attribut: Dold.\n\ + /S Behandlar matchande filer i den aktuella mappen\n\ + och alla undermappar.\n\ + /D Bearbetar ven mappar.\n\n\ +Skriv ATTRIB utan parametrar fr att visa attributten fr alla filer.\n" + +STRING_ALIAS_HELP, "Stter, tar bort eller visar alias.\n\n\ +ALIAS [alias=[Kommando]]\n\n\ + alias Namn p ett alias.\n\ + Kommando Text som skall erstttas av ett alias.\n\n\ +fr att lista alla alias:\n\ + ALIAS\n\n\ +Fr att stta ett nytt eller ndra ett befintligt alias:\n\ + ALIAS da=dir a:\n\n\ +Fr att ta bort ett alias frn listan:\n\ + kortnamn da=" + +STRING_BEEP_HELP, "Skickar en ljudsignal genom hgtalaren.\n\nPIP\n" + +STRING_CALL_HELP, "Kallar ett batchprogram frn ett annat.\n\n\ +CALL [enhet:][mapp]filnamn [batch-parameter]\n\n\ + batch-parameter Specificerar en kommandoradsinformation som batchprogrammet \n\ + behver." + +STRING_CD_HELP, "Visar namnet p, eller ndrar aktuell mapp\n\n\ +CHDIR [/D][enhet:][mapp]\n\ +CHDIR[..|.]\n\ +CD [/D][enhet:][mapp]\n\ +CD[..|.]\n\n\ + .. verordnad mapp\n\ + . aktuell mapp\n\ + /D Vill ndra aktuell enhet och aktuell mapp.\n\n\ +Skriv CD enhet: fr att visa aktuell mapp p specificerad enhet.\n\ +Skriv CD uten parametere fr att visa aktuell enhet och mapp.\n" + +STRING_CHCP_HELP, "Visar eller vljer aktiv teckentabell.\n\n\ +CHCP [nnn]\n\n\ + nnn Anger nummer p teckentabell.\n\n\ +Skriv CHCP utan parametrar fr att visa aktiv teckentabellnummer.\n" + +STRING_CHOICE_HELP, "Vntar p att anvndaren skall ange ett av alternativen.\n\n\ +CHOICE [/C[:]val][/N][/S][/T[:]c,nn][text]\n\n\ + /C[:]Val Anger lista med alternativ. Standard r JN.\n\ + /N Visa inte alternativen och ? vid slutet av frgan.\n\ + /S Behandle valgt alternativ med skiftlgesknslighet.\n\ + /T[:]c,nn Standardval stts till c efter nn sekunder.\n\ + text Textstrng som visas.\n\n\ +ERRORLEVEL stts till nummer fr knappen anvndaren vljer.\n" + +STRING_CLS_HELP, "Tmmer skrmen.\n\nCLS\n" + +STRING_CMD_HELP1, "\nInterna kommandon som r tillgngliga:\n" + +STRING_CMD_HELP2, "\nFunksjoner som r tillgngliga:" + +STRING_CMD_HELP3," [alias:er]" + +STRING_CMD_HELP4," [historik]" + +STRING_CMD_HELP5," [unix filnamnsavslutning]" + +STRING_CMD_HELP6," [mapplista]" + +STRING_CMD_HELP7," [omadressering och datakanaler]" + +STRING_CMD_HELP8, "Start ett ny instans av ReactOS kommandotolk.\n\n\ +CMD [/[C|K] kommando][/P][/Q][/T:bf]\n\n\ + /C kommando Kr angivet kommando och avslutar.\n\ + /K kommando Kr angivet kommando men avslutar inte.\n\ + /P CMD krs permanent och starter autoexec.bat\n\ + (kan inte avsluttes).\n\ + /T:bf Stller in bakgrunn/forgrunn frg (se COLOR kommando).\n" + +STRING_COLOR_HELP1, "Stller in standard forgrunns- och bakgrunnsfarger.\n\n\ +COLOR [attr [/-F]] \n\n\ + attr Anger fargeattributter for konsollteksten\n\ + /-F Fyller inte blank plass med fargeattributter\n\n\ +Det finns tre stt att ange frgerna:\n\ +1) [bright] namn p [bright] namn (bara de tre frsta bokstverna krvs)\n\ +2) decimal p decimal\n\ +3) to hexadecimala siffror\n\n\ +Frgerna r:\n\ +dec hex namn dec hex namn\n\ +0 0 Svart 8 8 Gr(ljus Svart)\n\ +1 1 Bl 9 9 Ljus Bl\n\ +2 2 Grn 10 A Ljus Grnn\n\ +3 3 Cyan 11 B Ljus Cyan\n\ +4 4 Rd 12 C Ljus Rd\n\ +5 5 Magenta 13 D Ljus Magenta\n\ +6 6 Gul 14 E Ljus Gult\n\ +7 7 Vit 15 F Ljus Vit\n" + +STRING_COPY_HELP1, "Vill du ersttta %s (Ja/Nej/Alla)? " + +STRING_COPY_HELP2, "Kopierar en eller flera filer till annan plats.\n\n\ +COPY [/V][/Y|/-Y][/A|/B] klla [/A|/B]\n\ + [+ klla [/A|/B] [+ ...]] [ml [/A|/B]]\n\n\ + klla Anger filen eller filerna som kopieras.\n\ + /A Anger att filen r en ASCII-textfil.\n\ + /B Anger att filen r en binr-fil.\n\ + ml Anger mappen och/eller filnamn fr den nya filen/filerna.\n\ + /V Kontrollera att nya filer r korrekt skrivna.\n\ + /Y Undertrycker frgor om att godknna om du nskar att skriva ver\n\ + befintlig destinationsfil.\n\ + /-Y Frgar alltid om du vill skriva ver\n\ + befintlig destinationsfil.\n\n\ +Vxeln /Y kan lggas in i COPYCMD miljvariabel.\n\ +...\n" + +STRING_DATE_HELP1, "\nSkriv in nytt datum (mm%cdd%cyyyy): " + +STRING_DATE_HELP2, "\nSkriv in nytt datum (dd%cmm%cyyyy): " + +STRING_DATE_HELP3, "\nSkriv in nytt datum (yyyy%cmm%cdd): " + +STRING_DATE_HELP4, "Visa eller ndra datumet.\n\n\ +DATE [/T][datum]\n\n\ + /T Endast visa\n\n\ +Skriv DATE utan parametrar fr att visa aktuella datum och\n\ +frga om nytt datum. Tryck ENTER fr att behlla samma datum.\n" + +STRING_DEL_HELP1, "Radera en eller flera filer.\n\n\ +DEL [/N /P /T /Q /S /W /Y /Z /A[[:]attribut]] fil ...\n\ +DELETE [/N /P /T /Q /S /W /Y /Z /A[[:]attribut]] fil ...\n\ +ERASE [/N /P /T /Q /S /W /Y /Z /A[[:]attribut]] fil ...\n\n\ + fil Anger fil(er) for radering.\n\n\ + /N Ingenting.\n\ + /P Frga innan varje fil raderas.\n\ + /T Total. Visar totalt antal raderade filer och frigjort diskutrymme.\n\ + /Q Tyst lge, tar bort filer utan att frga.\n\ + /W Sker borttagning. Skriv ver fil med slumpmssig data fre borttagning.\n\ + /Y Ja. Radera ven *.* utan att frga.\n\ + /F Framtvinga radering av dolda, skrivskyddade och systemfiler.\n\ + /S Submappar, radera filer frn alla undermappar\n\ + /A Vlj filer som skall raderas basert p filattribut.\n\ + attributter\n\ + R Skrivskyddade filer\n\ + S System filer\n\ + A Arkiv filer\n\ + H Dolda filer\n\ + - prefiks som betyder INTE. (f.eks -R)\n" + +STRING_DEL_HELP2, "Alla filer i mappen kommer att bli raderade!\nr du sker (J/N)?" +STRING_DEL_HELP3, " %lu fil raderade\n" +STRING_DEL_HELP4, " %lu filer raderade\n" + +STRING_DELAY_HELP, "paus i n sekunder eller mikrosekunder\n\ +DELAY [/m]n\n\n\ + /m anger at n r mikrosekunder\n\ + annars r n sekunder\n" + +STRING_DIR_HELP1, "DIR [enhet:][mapp][filnamn] [/A[[:]attribut]] [/B] [/C] [/D] [/L] [/N]\n\ + [/O[[:]sortering]] [/P] [/Q] [/S] [/T[[:]tidsflt]] [/W] [/X] [/4]\n\n\ + [enhet:][mapp][filnamn]\n\ + Anger enhet, mapp, och/eller filer som skall listes.\n\n\ + /A Vis filer ved att ange attributter.\n\ + attribut D mappar R Skrivskyddade filer\n\ + H Dolda filer A Filer klara fr arkivering\n\ + S System filer - Prefiks som betyder INTE\n\ + /B Anvnder rent filnamnformat (utan verskrift och summering).\n\ + /C Visar tusenavskiljare i filstorleken. Dette r standard-\n\ + instllningen. Avnnd /-C fr att deaktivera visning av skiljetecken.\n\ + /D Samme som fullt listformat, men filer sorteras i kolumner.\n\ + /L Anvnder sm bokstver.\n\ + /N Lngt listformat dr filenamnen vises lngst t hger.\n\ + /O Lista efter filer i sorterad ordning.\n\ + sortering N Efter namn (alfabetisk) S Efter storlek (minst frst)\n\ + E Efter filndelse (alfabetisk) D Efter datum/tid (ldst frst)\n\ + G Gruppera mappar frst - Prefix fr omvnd ordning\n\ + /P Pausa efter varje hel skrmbild.\n\ + /Q Viser vem som ger filen.\n\ + /S Viser alla filer i angiven mapp och alla undermappar.\n\ + /T Kontrollerar vilket tidsflt som visas eller blir anvnt fr sortering\n\ + timefelt C Skapelse \n\ + A Senast lst\n\ + W Senast skriven\n\ + /W Anvnd brett listformat.\n\ + /X Visar kort namn (8+3) genererat fr lnga filnamn.\n\ + Formatet r som fr /N med det korta namnet\n\ + fre det lnga namnet. Om det inte finns ngot kort namn blir tomt namn\n\ + p den platsen.\n\ + /4 Visar fyresiffriga rtal\n\n\ +Vxlar kan stllas in p frhand i DIRCMD miljvariabel. tsidostt\n\ +frinstllda vxlar med ett bindestreck (-) fre, till exempel, /-W.\n" + +STRING_DIR_HELP2, " Volumen i enhet %c r %s\n" +STRING_DIR_HELP3, " Volumet i enhet %c r utan namn.\n" +STRING_DIR_HELP4, " Volymens serienummer r %04X-%04X\n" +STRING_DIR_HELP5, "\n Totalt filer listet:\n%16i fil(r)% 14s byte\n" +STRING_DIR_HELP6, "%16i mapp(ar)% 15s byte\n" +STRING_DIR_HELP7, "\n mapp av %s\n\n" +STRING_DIR_HELP8, "%16i fil(er)% 14s byte\n" + +STRING_DIRSTACK_HELP1, "Sparar aktuell mapp for anvndning av POPD kommandot, och\n\ +ndrar drefter till angiven mapp.\n\n\ +PUSHD [mapp | ..]\n\n\ + mapp ange mapp det ndra till.\n" + +STRING_DIRSTACK_HELP2, "ndra till mapp som lagrats med PUSHD kommandot.\n\nPOPD" + +STRING_DIRSTACK_HELP3, "Skriver ut innehllet av en mapplista.\n\nDIRS" + +STRING_DIRSTACK_HELP4, "mapplistan r tom" + +STRING_ECHO_HELP1, "Visar meddelanden utan enter och radsprng.\n\n\ + ECHOS meddelande" + +STRING_ECHO_HELP2, "Visar ett meddelande skrivet till mottagare av felmeddelanden.\n\n\ + ECHOERR meddelande\n\ + ECHOERR. skriver en tom rad" + +STRING_ECHO_HELP3, "Skriver en meddelande till standardmottagaren av felmeddelanden utan enter och radsprng.\n\n\ + ECHOSERR meddelande" + +STRING_ECHO_HELP4, "Visar ett meddelande eller vxlar kommandot echo p eller av.\n\n\ + ECHO [ON | OFF]\n\ + ECHO [meddelande]\n\ + ECHO. skriv en tom rad\n\n\ +Skriv ECHO utan parametar fr att visa aktuell ECHO instllning." + +STRING_ECHO_HELP5, "ECHO r %s\n" + +STRING_EXIT_HELP, "Avsluta kommandotolken (cmd.exe).\n\nEXIT [/b] [ExitCode]\n\n\ + /B Avslutt bara en batchfil. \n\ + Om det krs utan en batch filkommer det avslutta cmd.exe\n\ + ExitCode Detta vrdet kommer att skickas till ERRORLEVEL vid avslutning\n" + +STRING_FOR_HELP1, "Kr ett angivet kommando fr varje fil i en grupp med filer\n\n\ +FOR %variabel IN (grupp) DO kommando [parametrar]\n\n\ + %variable Anger en utbytbar parameter (en enda bokstav).\n\ + (grupp) Anger en grupp med en eller flera filer. Jokertecken kan anvndas.\n\ + kommando Anger kommandot som skall anvndas fr varje enskild fil.\n\ + parametrar Anger parametrarna eller vxlarna fr angivet kommando.\n\n\ +fr att bruke FOR kommando i en batchfil, ange %%variabel istllet fr\n\ +%variabel.\n" + +STRING_FREE_HELP1, "\nVolum i enhet %s r %-11s\n\ + Serienummret r %s\n\ + %16s byte total lagringsutrymme\n\ + %16s byte anvnt\n\ + %16s byte ledigt\n" + +STRING_FREE_HELP2, "Visa enhetsinformation.\n\nFREE [enhet: ...]\n" + +STRING_IF_HELP1, "Utfr villkorsstyrd bearbetning i batchprogram.\n\n\ + IF [NOT] ERRORLEVEL nummer kommando\n\ + IF [NOT] strng1==strng2 kommando\n\ + IF [NOT] EXIST filnamn kommando\n\ + IF [NOT] DEFINED variabel kommando\n\n\ +NOT Anger att CMD skall fortstta kommando bara om\n\ + villkoret r falskt\n\ +ERRORLEVEL nummer Anger sant villkor om frra programkrningen returnerade\n\ + en avslutningskod strre n eller lika med nummret angivet.\n\ +kommando Anger vilket kommando som skall utfres d villkoret uppfylls.\n\ +strng1==strng2 Anger ett uppfyllt villkor om textstrngarna r lika\n\ +EXIST filnamn Anger ett uppfyllt villkor om angivet filnamn existerar.\n\ +DEFINED variabel Anger ett uppfyllt villkor om angiven variabel r\n\ + definerad.\n" + +STRING_GOTO_HELP1, "Dirigerar CMD till en namngiven etikett i ett batchprogram.\n\n\ +GOTO etikett\n\n\ + etikett Anger en text strng anvnt i ett batchprogram.\n\n\ +En etikett skapas p en egen rad genom att skriva kolon fljt av namn p etiketten." + +STRING_LABEL_HELP1, "Skapar, tar bort eller ndrar etikett p enhet.\n\nLABEL [enhet:][etikett]\n" + +STRING_LABEL_HELP2, "Volymen i enhet %c: r %s\n" +STRING_LABEL_HELP3, "Volymen i enhet %c: r utan namn\n" +STRING_LABEL_HELP4, "Volymens serienummer r %04X-%04X\n" +STRING_LABEL_HELP5, "Volymnamn (11 tecken, Enter = inget namn)? " + +STRING_LOCALE_HELP1, "aktuell tid r" + +STRING_MKDIR_HELP, "Skapar en mapp.\n\n\ +MKDIR [enhet:]mapp\nMD [enhet:]mapp" + +STRING_MKLINK_HELP, "Skapar en filesystemslnk.\n\n\ +MKLINK [/D | /H | /J] linknamn ml\n\n\ + /D Anger att lnkens ml r en mapp.\n\ + /H Skapar en hrdlnk i stllet fr en symbolisk lnk.\n\ + /J Skapar en knutpunkt fr en mapp sk. junction.\n\n\ +Om varken /H eller /J r angivna kommer en symbolisk lnk att skapas." + +STRING_MEMMORY_HELP1, "Visar mngd systemminne.\n\nMEMORY" + +STRING_MEMMORY_HELP2, "\n %12s%% anvnt minne.\n\n\ + %13s byte totalt fysisk RAM-minne.\n\ + %13s byte tillgngligt fysisk RAM-minne.\n\n\ + %13s byte total sidvxlingsfil.\n\ + %13s byte tillgnglig sidvxlingsfil.\n\n\ + %13s byte totalt virtuell minne.\n\ + %13s byte tilgngeligt virtuellt minne.\n" + +STRING_MISC_HELP1, "Tryck en knapp fr att fortstta...\n" + +STRING_MOVE_HELP1, "Skriv ver %s (Ja/Nej/Alla)? " + +STRING_MOVE_HELP2, "Flyttar filer, och byter namn p filer och mappar.\n\n\ +fr att flytte en eller flera filer:\n\ +MOVE [/N][enhet:][mapp]filnamn1[,...] destination\n\n\ +fr att ndra namn p en mapp:\n\ +MOVE [/N][enhet:][mapp]mappnamn1 mappnamn2\n\n\ + [enhet:][mapp]filnamn1 Anger placering och namn p fil\n\ + eller filer du nsker att flytta.\n\ + /N Ingenting. Gr allt utom att flytta filer eller mappar.\n\n\ +aktuell begrnsningar:\n\ + - Du kan inte flytta en fil eller mapp frn en enhet till en annan.\n" + +STRING_MSGBOX_HELP, "vis en meldingsboks och returner brukers svar\n\n\ +MSGBOX type ['tittel'] melding\n\n\ +type knapp vises\n\ + mulige verdier r: OK, OKCANCEL,\n\ + YESNO, YESNOCANCEL\n\ +tittel tittel p meldingsboks\n\ +melding text som vises i meldingsboks\n\n\n\ +ERRORLEVEL settes avhengig av hvilken knapp som trykkes:\n\n\ +JA : 10 | NEI : 11\n\ +OK : 10 | AVBRYT : 12\n" + +STRING_PATH_HELP1, "Viser eller setter en skesti for kjrbare filer.\n\n\ +PATH [[enhet:]mapp[;...]]\nPATH ;\n\n\ +Skriv PATH; fr att tmme alle skemappar instllninar och angi at kommandoskallet\n\ +kun skal ske aktuell mapp.\n\ +Skriv PATH uten parameter fr att visa aktuell skesti.\n" + +STRING_PROMPT_HELP1, "ndra kommandoledetekst.\n\n\ +PROMPT [text]\n\n\ + text Anger en nytt kommandoledetekst.\n\n\ +Ledeteksten kan bli satt sammen av normale tegn och flgende spesielle koder:\n\n\ + $A & (och-tegnet)\n\ + $B | (loddrett strek)\n\ + $C ( (venstreparentes)\n\ + $D aktuell dato\n\ + $E Escape-kode (ASCII kode 27)\n\ + $F ) (Hyreparentes)\n\ + $G > (strre-enn symbol)\n\ + $H Tilbake (sletter forrige tegn)\n\ + $L < (mindre-enn symbol)\n\ + $N aktuell enhet\n\ + $P aktuell enhet och mapp\n\ + $Q = (likhetstegn)\n\ + $T aktuell klokkeslett\n\ + $V Versjonsnummer for ReactOS\n\ + $_ Retur och linjeskift\n\ + $$ $ (dollar tegn)\n" + +STRING_PAUSE_HELP1, "Stoppar eksekvering av satsvis fil och vis flgende melding:\n\ +'Tryck valfri tangent fr att fortsette...' eller en anvndaren definert melding.\n\n\ +PAUSE [melding]" + +STRING_PROMPT_HELP2, " $+ Vis aktuell dybde av mappstakken" + +STRING_PROMPT_HELP3, "\nSkriv PROMPT uten parameter fr att resette ledeteksten." + +STRING_REM_HELP, "Start en kommentarlinje i en satsvis fil.\n\nREM [Kommentar]" + +STRING_RMDIR_HELP, "Flytter en mapp.\n\n\ +RMDIR [enhet:]mapp\nRD [enhet:]mapp\n\ +/S Sletter alle filer och mappar innenfor mlet\n\ +/Q Inte spr fr sletting.\n" +STRING_RMDIR_HELP2, "mappn r inte tom!\n" + +STRING_REN_HELP1, "ndra namn p fil/mapp eller filer/mappar.\n\n\ +ENDRE NAVN [/E /N /P /Q /S /T] gammelt_namn ... nytt_namn\n\ +REN [/E /N /P /Q /S /T] gammelt_namn ... nytt_namn\n\n\ + /E Ingen feilmeldinger.\n\ + /N Ingenting.\n\ + /P sprsml om godkjenning fr endring av namn p hver fil.\n\ + (Inte implementert enda!)\n\ + /Q Stille.\n\ + /S ndra namn p undermapp.\n\ + /T Vis totalt antall endrede filer.\n\n\ +NB; du kan inte ange en ny destinasjon for filen/mappen. Bruk\n\ +MOVE kommando for det formlet.\n" + +STRING_REN_HELP2, " %lu fil endret namn\n" + +STRING_REN_HELP3, " %lu filer endret namn\n" + +STRING_REPLACE_HELP1, "Replaces files.\n\n\ +REPLACE [drive1:][path1]filename [drive2:][path2] [/A] [/P] [/R] [/W]\n\ +REPLACE [drive1:][path1]filename [drive2:][path2] [/P] [/R] [/S] [/W] [/U]\n\n\ + [drive1:][path1]filename Specifies the source file or files.\n\ + [drive2:][path2] Specifies the directory where files are to be\n\ + replaced.\n\ + /A Adds new files to destination directory. Cannot\n\ + use with /S or /U switches.\n\ + /P Prompts for confirmation before replacing a file or\n\ + adding a source file.\n\ + /R Replaces read-only files as well as unprotected\n\ + files.\n\ + /S Replaces files in all subdirectories of the\n\ + destination directory. Cannot use with the /A\n\ + switch.\n\ + /W Waits for you to insert a disk before beginning.\n\ + /U Replaces (updates) only files that are older than\n\ + source files. Cannot use with the /A switch.\n" + +STRING_REPLACE_HELP2, "Source path required\n" + +STRING_REPLACE_HELP3, "No files replaced\n" + +STRING_REPLACE_HELP4, "%lu file(s) replaced\n" + +STRING_REPLACE_HELP5, "Replacing %s\n" + +STRING_REPLACE_HELP6, "Replace %s\n" + +STRING_REPLACE_HELP7, "No files added\n" + +STRING_REPLACE_HELP8, "%lu file(s) added\n" + +STRING_REPLACE_HELP9, "Add %s (Y/N) " + +STRING_REPLACE_HELP10, "Replace %s (Y/N) " + +STRING_REPLACE_HELP11, "Adding %s\n" + + +STRING_SHIFT_HELP, "ndra posisjon for erstattelig parameter i et satsvis fil.\n\n\ +SHIFT [NED]" + +STRING_SCREEN_HELP, "flytt markr och potensielt skriv ut text\n\n\ +SCREEN rad kol [text]\n\n\ + rad rad markr flyttes til\n\ + kol kolonne markr flyttes til" + +STRING_SET_HELP, "Vis, sett, eller fjern miljvariabel.\n\n\ +SET [variabel[=][streng]]\n\n\ + variabel Anger miljvariabel namn.\n\ + string Anger en serie av tegn til bestemme variabel.\n\n\ +Skriv SET uten parameter fr att visa aktuell miljvariabler.\n" + +STRING_START_HELP1, "Start en kommando.\n\n\ +START kommando\n\n\ + kommando Anger kommando fr att kjre.\n\n\ +NB; for yeblikket blir alle kommandoer startet asynkront.\n" + +STRING_TITLE_HELP, "Velg vindustittel for kommandotolkvindu.\n\n\ +TITLE [streng]\n\n\ +streng Anger tittel for kommandotolkvindu.\n" + +STRING_TIME_HELP1, "Vis eller sett system tid.\n\n\ +TIME [/T][tid]\n\n\ + /T vis bare\n\n\ +Skriv TIME uten parametere fr att visa aktuell tidsinstllninar och et\n\ +sprsml om en ny en. Tryck ENTER fr att beholde samme tid.\n" + +STRING_TIME_HELP2, "Velg ny tid: " + +STRING_TIMER_HELP1, "Forlpt %d msecs\n" + +STRING_TIMER_HELP2, "Forlpt %02d%c%02d%c%02d%c%02d\n" + +STRING_TIMER_HELP3, "Tillater bruk av inntil ti stoppeklokker.\n\n\ +TIMER [ON|OFF] [/S] [/n] [/Fn]\n\n\ + ON start stoppeklokke\n\ + OFF Stoppar stoppeklokke\n\ + /S Del tiden. Retur stoppeklokke\n\ + tid uten att ndra dens verdi\n\ + /n Anger stoppeklokke nummer.\n\ + Stoppeklokke r tilgjengelig fra 0 til 9\n\ + Hvis inte det r spesifisert r standard lik 1\n\ + /Fn Format for utgende\n\ + n kan bli:\n\ + 0 mikrosekunder\n\ + 1 hh%cmm%css%cdd\n\n\ +hvis hverken ON, OFF eller /S r spesifisert\n\ +vil status for stoppeklokken veksles.\n\n" + +STRING_TYPE_HELP1, "Vis innholdet av tekstfiler.\n\nSkriv [enhet:][mapp]filnamn \n\ + /P Vis en full skjerm om gangen.\n" + +STRING_VERIFY_HELP1, "Denne kommandoen r bare en etterlikning!!\n\ +Anger om det skal bekreftes at dine filer r skrevet korrekt til disk \n\n\ +VERIFY [ON | OFF]\n\n\ +Skriv VERIFY uten parametre fr att visa aktuell VERIFY instllninar.\n" + +STRING_VERIFY_HELP2, "VERIFY r %s.\n" + +STRING_VERIFY_HELP3, "M ange ON eller OFF." + +STRING_VERSION_HELP1, "Vis Reactos versjonen\n\n\ +VER [/C][/R][/W]\n\n\ + /C Vis anerkjennelse.\n\ + /R Vis videreformidlingsinformasjon.\n\ + /W Vis garantiinformasjon." + +STRING_VERSION_HELP2, " kommer med ABSOLUTT INGEN GARANTI; for detaljer\n\ +Skriv: `ver /w'. Dette r gratis programvare, och du r velkommen til videreformidle\n\ +det under gitte betingelser; Skriv `ver /r' for detaljer. Skriv `ver /c' for en\n\ +liste av anerkjennelser." + +STRING_VERSION_HELP3, "\n Dette programet r fordelt i hpet som det vil bli brukbar,\n\ + men UTEN NOEN GARANTI; uten engang antydet garantid for \n\ + SALGBARHET eller BRUKBARHET FOR NOE ML. Se \n\ + GNU Generell Publikum Lisens for flere detaljer." + +STRING_VERSION_HELP4, "\n Dette programmet r gratis programvare; du kan videre-\n\ + formidle det och/eller modifisere det under betingelser av Generell Publikum \n\ + Lisens som utgivelses av Free Software Foundation; enten version 2 av \n\ + Lisens, eller (ved din mulighet) andre nyere version.\n" + +STRING_VERSION_HELP5, "\nSend bug rapporter til .\n\ +oppdateringer r tilgjengelig her: http://www.reactos.org" + +STRING_VERSION_HELP6, "\nFreeDOS version skrevet av:\n" + +STRING_VERSION_HELP7, "\nReactOS version skrevet av:\n" + +STRING_VOL_HELP1, " Volumet i enhet %c r %s\n" +STRING_VOL_HELP2, " Volumet i enhet %c har ingen namn.\n" +STRING_VOL_HELP3, " Volumet Serie nummer r %04X-%04X\n" +STRING_VOL_HELP4, "Vis disk volumet merke och serie nummer, hvis det eksisterer.\n\nVOL [enhet:]" + +STRING_WINDOW_HELP1, "ndra konsoll vindu aspekt\n\n\ +WINDOW [/POS[=]venstre,topp,bredde,hyde]\n\ + [MINI|MAKS|GJENOPPRETT] ['tittel']\n\n\ +/POS ange vindusposisjon och strrelse\n\ +MINI minimer vinduet\n\ +MAKS maksimer vinduet\n\ +GJENOPPRETT gjenopprett vinduet" + +STRING_WINDOW_HELP2, "ndra konsoll vindu aspekt\n\n\ +ACTIVATE 'window' [/POS[=]venstre,topp,bredde,hyde]\n\ + [MINI|MAKS|GJENOPPRETT] ['tittel']\n\n\ +vindu tittel av vindu p stad fullfre handlinger\n\ +/POS ange vindu plass och strrelse\n\ +MIN minimer vinduet\n\ +MAX maksimer vinduet\n\ +RESTORE gjenopprett vinduet\n\ +tittel ny tittel\n" + + +STRING_HELP1, "Liste av alle tilgjengelige kommandoer (+ beskrivelse)\n\n\ +kommando /? For mer informasjon om en bestemt kommando\n\n\ +? Lister alle tilgjengelige kommando uten beskrivelse).\n\ +ALIAS Sett, fjern eller vis alias.\n\ +ATTRIB Viser eller ndra fil attributter.\n\ +BEEP Piper i hyttaleren.\n\ +CALL Starte et satsvis program fra et annet.\n\ +CD Vis namnet p eller endrer aktuell mapp.\n\ +CHCP Viser eller anger nummer p aktiv tegntabell.\n\ +CHOICE Venter til bruken vljer en av et sett av val.\n\ +CLS Tmmer skjermen.\n\ +CMD Start en ny forekomst av ReactOS kommandotolk.\n\ +COLOR Anger standard forgrunn- och bakgrunnsfargr for konsollen.\n\ +COPY Kopierer en eller flere filer til en annen plassering.\n\ +DATE Viser eller anger datoen.\n\ +DELETE Sletter en eller flere filer.\n\ +DIR Viser en liste over filer och undermappar i en mapp.\n\ +ECHO Viser meldinger, eller slr kommandoecho p eller av.\n\ +ERASE Sletter en eller flere filer.\n\ +EXIT Avslutter programmet CMD.EXE program (kommandotolken).\n\ +FOR Kjr en bestemt kommando for hver fil i et sett av filer.\n\ +FREE Viser ledig diskplass.\n\ +GOTO Leder ReactOS kommandotolk til en merket linje i\n\ + et satsvis program.\n\ +HELP Viser hjelpeinformasjon for ReactOS-kommandoer.\n\ +HISTORY Lister alle kommandoer som har blitt brukt\n\ +IF Utfre betinget behandling i satsvise programmer.\n\ +LABEL Oppretter, endrer, eller sletter volumnamnet p en disk.\n\ +MD Oppretter en mapp.\n\ +MKDIR Oppretter en mapp.\n\ +MKLINK Creates a filesystem link object.\n\ +MOVE Flytter en eller flere filer fra en mapp til en annen.\n\ +PATH Vis eller sett en skesti for kjrbare filer.\n\ +PAUSE Avbryter behandling av en satsvis fil, och viser en melding.\n\ +POPD Fjenoppretter den forige verdien av aktuell mapp, lagret av\n\ + PUSHD.\n\ +PROMPT ndra kommandoledeteksten.\n\ +PUSHD Lagre aktuell mapp och endrer den etterp.\n\ +RD Fjerner en mapp.\n\ +REM Anger kommentarer i satsvise filer.\n\ +REN Gir nytt namn til en eller flere filer.\n\ +RENAME Gir nytt namn til en eller flere filer.\n\ +RMDIR Fjerner en mapp.\n\ +SCREEN Flytter markr.\n\ +SET Vis, sett, eller fjern ReactOS miljvariabel.\n\ +SHIFT Shift plass for erstattelige parameter i satsvise filer.\n" +STRING_HELP2, "START Start et separat vindu til att kjre et spesifisert program eller kommando.\n\ + Utfrer kommando.\n\ +TIME Vis eller sett system tid.\n\ +TIMER Hndtere stoppeklokker (maks 10 stk).\n\ +TITLE Sett vindustittel for CMD.EXE sesjon.\n\ +TYPE Vis innholdet i en text fil.\n\ +VER Viser ReactOS version.\n\ +VERIFY Forteller ReactOS om att bekrefte om dine filer r skrevet\n\ + riktig til disk.\n\ +VOL Vis et volums namn och serienummer.\n" + + +STRING_CHOICE_OPTION, "YN" +STRING_COPY_OPTION, "YNA" + +STRING_ASSOC_ERROR, "Fil association ble inte funnet for utvidelsen %s\n" +STRING_ALIAS_ERROR, "Kommando linje for lang etter alias utvidelse!\n" +STRING_BATCH_ERROR, "Feil ved pning av satsvis fil\n" +STRING_CHCP_ERROR1, "Aktiv tegntabell: %u\n" +STRING_CHCP_ERROR4, "Ugyldig tegntabell\n" +STRING_CHOICE_ERROR, "Ugyldig val. Forventet format: /C[:]val" +STRING_CHOICE_ERROR_TXT, "Ugyldig val. Forventet format: /T[:]c,nn" +STRING_CHOICE_ERROR_OPTION, "Ulovlig operasjon: %s" +STRING_MD_ERROR, "En undermapp eller fil finnes allerede.\n" +STRING_MD_ERROR2, "Stien til den nye mappen eksisterer inte.\n" +STRING_CMD_ERROR1, "Kan inte viderefre inndata fra fil %s\n" +STRING_CMD_ERROR2, "Feil under oppretting av temporr fil for datakanal\n" +STRING_CMD_ERROR3, "Kan inte viderefre til fil %s\n" +STRING_CMD_ERROR4, "Kr %s...\n" +STRING_CMD_ERROR5, "Kr cmdexit.bat...\n" +STRING_COLOR_ERROR1, "Samme farge feil! (Bakgrunn och forgrunn kan inte ha samme farge)" +STRING_COLOR_ERROR2, "feil i farge spesifikasjon" +STRING_COLOR_ERROR3, "Farge %x\n" +STRING_COLOR_ERROR4, "samme farge feil!" +STRING_CONSOLE_ERROR, "Ukjent feil: %d\n" +STRING_COPY_ERROR1, "Feil: kan inte pne kilden - %s!\n" +STRING_COPY_ERROR2, "Feil: kan inte kopiere til seg selv!\n" +STRING_COPY_ERROR3, "Feil ved skriving til destinasjon!\n" +STRING_COPY_ERROR4, "Feil: Inte implementert enda!\n" +STRING_DATE_ERROR, "Ugyldig dato." +STRING_DEL_ERROR5, "Filen %s vil bli slettet! " +STRING_DEL_ERROR6, "Er du sikker (J/N)?" +STRING_DEL_ERROR7, "Sletter: %s\n" +STRING_ERROR_ERROR1, "Ukjent feil! Feilkode: 0x%lx\n" +STRING_ERROR_ERROR2, "Syntaks feil" +STRING_FOR_ERROR1, "'in' tapt i FOR kommando." +STRING_FOR_ERROR2, "ingen brakett funnet." +STRING_FOR_ERROR3, "'gjre' tapt." +STRING_FOR_ERROR4, "ingen kommando etter 'gjre'." +STRING_FREE_ERROR1, "Ugyldig driver" +STRING_FREE_ERROR2, "utmerket" +STRING_GOTO_ERROR1, "Ingen merke spesifisert for GTIL" +STRING_GOTO_ERROR2, "merke '%s' inte funnet\n" + +STRING_MOVE_ERROR1, "[OK]\n" +STRING_MOVE_ERROR2, "[Feil]\n" + +STRING_REN_ERROR1, "MoveFile() mislykkes. Feil: %lu\n" + +STRING_START_ERROR1, "Ingen satsvis sttte for yeblikket!" + +STRING_TIME_ERROR1, "Ugyldig tid." + +STRING_TYPE_ERROR1, "Ugyldig alternativ '/%s'\n" + +STRING_WINDOW_ERROR1, "vinduet ble inte funnet" + + +STRING_ERROR_PARAMETERF_ERROR, "Parameter format inte riktig - %c\n" +STRING_ERROR_INVALID_SWITCH, "Ugyldig bryter - /%c\n" +STRING_ERROR_TOO_MANY_PARAMETERS, "For mange parametere - %s\n" +STRING_ERROR_PATH_NOT_FOUND, "Stien ble inte funnet\n" +STRING_ERROR_FILE_NOT_FOUND, "Filen ble inte funnet\n" +STRING_ERROR_REQ_PARAM_MISSING, "Obligatorisk parameter mangler\n" +STRING_ERROR_INVALID_DRIVE, "Ugyldig enhet angitt\n" +STRING_ERROR_INVALID_PARAM_FORMAT, "Ugyldig parameter format - %s\n" +STRING_ERROR_BADCOMMAND, "Feil kommando eller filnamn - %s\n" +STRING_ERROR_OUT_OF_MEMORY, "Feil: Minne fullt.\n" +STRING_ERROR_CANNOTPIPE, "Feil! Kan inte bruke datakanal! Kan inte pne midlertidig fil!\n" +STRING_ERROR_D_PAUSEMSG, "Tryck valfri tangent fr att fortsette . . ." +STRING_ERROR_DRIVER_NOT_READY, "enheten r inte klar" + +STRING_PATH_ERROR, "CMD: Inte i miljet '%s'\n" + +STRING_REPLACE_ERROR1, "Invalid switch - %s\n" +STRING_REPLACE_ERROR2, "Mappen ble inte funnet - %s\n" +STRING_REPLACE_ERROR3, "The filename, directory name, or volume label syntax is incorrect.\n" +STRING_REPLACE_ERROR4, "Invalid parameter combination\n" +STRING_REPLACE_ERROR5, "Tilgang nektet - %s\n" +STRING_REPLACE_ERROR6, "Ingen filer ble funnet - %s\n" +STRING_REPLACE_ERROR7, "Extended Error 32\n" + +STRING_REACTOS_VERSION, "ReactOS Operativsystem [Versjon %s-%s]\n" +STRING_CMD_SHELLINFO, "\nReactOS Kommandotolk\nVersjon %s %s" +STRING_VERSION_RUNVER, " krs p %s" +STRING_COPY_FILE , " %d file(r) kopiert\n" +STRING_DELETE_WIPE, "slettet" +STRING_FOR_ERROR, "ugyldig variabel spesifikasjon." +STRING_SCREEN_COL, "ugyldig verdi for kolonne" +STRING_SCREEN_ROW, "ugyldig verdi for rad" +STRING_TIMER_TIME "Stoppeklokke %d r %s: " +STRING_MKLINK_CREATED_SYMBOLIC, "Symbolic link created for %s <<===>> %s\n" +STRING_MKLINK_CREATED_HARD, "Hard link created for %s <<===>> %s\n" +STRING_MKLINK_CREATED_JUNCTION, "Junction created for %s <<===>> %s\n" +STRING_MORE, "More? " +STRING_CANCEL_BATCH_FILE, "\r\nCtrl-Break trykket. Avbryt batch filen? (Ja/Nei/Alt) " + +STRING_INVALID_OPERAND, "Ugyldig operand." +STRING_EXPECTED_CLOSE_PAREN, "Forventet ')'." +STRING_EXPECTED_NUMBER_OR_VARIABLE,"Forventet nummer eller variabel namn." +STRING_SYNTAX_COMMAND_INCORRECT, "Syntaks for kommandoen r feil." + +END From 540ec7e00a838e748e905209c35ad9a3fed53b13 Mon Sep 17 00:00:00 2001 From: Gabriel Ilardi Date: Fri, 29 Apr 2011 14:01:03 +0000 Subject: [PATCH 236/317] [rapps] Jeisson Toscano: French update + some Spanish translation updates (with corrections from vicmarcal and me) See issue #6012 for more details. svn path=/trunk/; revision=51494 --- reactos/base/applications/rapps/rapps/abyss.txt | 3 +++ reactos/base/applications/rapps/rapps/fap.txt | 3 +++ reactos/base/applications/rapps/rapps/kdewin.txt | 3 +++ reactos/base/applications/rapps/rapps/mono2.txt | 3 +++ reactos/base/applications/rapps/rapps/net11.txt | 3 +++ reactos/base/applications/rapps/rapps/net20.txt | 3 +++ reactos/base/applications/rapps/rapps/net20sp2.txt | 3 +++ reactos/base/applications/rapps/rapps/python.txt | 3 +++ reactos/base/applications/rapps/rapps/remood.txt | 3 +++ reactos/base/applications/rapps/rapps/steam.txt | 3 +++ reactos/base/applications/rapps/rapps/sumatrapdf.txt | 6 ++++++ reactos/base/applications/rapps/rapps/superfinder.txt | 3 +++ reactos/base/applications/rapps/rapps/tahoma.txt | 4 ++++ reactos/base/applications/rapps/rapps/wme9.txt | 2 +- 14 files changed, 44 insertions(+), 1 deletion(-) diff --git a/reactos/base/applications/rapps/rapps/abyss.txt b/reactos/base/applications/rapps/rapps/abyss.txt index 89e0d78ba54..5dbbe7c11b7 100644 --- a/reactos/base/applications/rapps/rapps/abyss.txt +++ b/reactos/base/applications/rapps/rapps/abyss.txt @@ -14,6 +14,9 @@ CDPath = none [Section.0407] Description = Abyss Web Server ermöglicht es Webseiten auf Ihrem Computer zu hosten. Er unterstützt sichere SSL/TLS Verbindungen (HTTPS) sowie eine Vielfalt an Web Technologien. Er kann ebenfalls PHP, Perl, Python, ASP, ASP.NET, und Ruby on Rails Web Anwendungen ausführen, welche von Datenbanken, wie MySQL, SQLite, MS SQL Server, MS Access, oder Oracle unterstützt werden können. +[Section.040a] +Description = Abyss Web Server le permite alojar sitios Web en su ordenador. Soporta conexiones seguras SSL / TLS (HTTPS) así como una gran cantidad de tecnología web. También puede ejecutar aplicaciones web PHP, Perl, Python, ASP, ASP.Net, Ruby y Ruby on Rails, que pueden ser asociadas con bases de datos tales como MySQL, SQLite, MS SQL Server, MS Access u Oracle. + [Section.040c] Description = Abyss Web Server vous permet d'héberger vos sites internet sur votre ordinateur. Il supporte les connexions sécurisées SSL/TLS (HTTPS) ainsi qu'un grand nombre de technologies web. Il peut également faire tourner des applications web PHP, Perl, Python, ASP, ASP.Net, Ruby et Ruby on Rails, qui peuvent être associées à des bases de données telles que MySQL, SQLite, MS SQL Server, MS Access ou Oracle. diff --git a/reactos/base/applications/rapps/rapps/fap.txt b/reactos/base/applications/rapps/rapps/fap.txt index 420e1cffa19..2ea6cf397dd 100644 --- a/reactos/base/applications/rapps/rapps/fap.txt +++ b/reactos/base/applications/rapps/rapps/fap.txt @@ -14,6 +14,9 @@ CDPath = none [Section.0407] Description = Kleiner und einfacher Mediaplayer. +[Section.040a] +Description = Reproductor de audio simple y ligero. + [Section.040c] Description = Lecteur audio simple et léger. diff --git a/reactos/base/applications/rapps/rapps/kdewin.txt b/reactos/base/applications/rapps/rapps/kdewin.txt index d3b6383f61c..99e3de0ed5d 100644 --- a/reactos/base/applications/rapps/rapps/kdewin.txt +++ b/reactos/base/applications/rapps/rapps/kdewin.txt @@ -14,6 +14,9 @@ CDPath = none [Section.0407] Description = KDE für Windows. +[Section.040a] +Description = KDE para Windows. + [Section.040c] Description = KDE pour Windows. diff --git a/reactos/base/applications/rapps/rapps/mono2.txt b/reactos/base/applications/rapps/rapps/mono2.txt index 3b4b6c0dfad..a34a94fa8b0 100644 --- a/reactos/base/applications/rapps/rapps/mono2.txt +++ b/reactos/base/applications/rapps/rapps/mono2.txt @@ -11,6 +11,9 @@ URLSite = http://www.mono-project.com/Main_Page URLDownload = http://ftp.novell.com/pub/mono/archive/2.8.2/windows-installer/1/mono-2.8.2-gtksharp-2.12.10-win32-1.exe CDPath = none +[Section.040a] +Description = Versión open-source de .NET Framework + [Section.040c] Description = Framework .net open source. diff --git a/reactos/base/applications/rapps/rapps/net11.txt b/reactos/base/applications/rapps/rapps/net11.txt index 4ba17e8c506..c2ea5087369 100644 --- a/reactos/base/applications/rapps/rapps/net11.txt +++ b/reactos/base/applications/rapps/rapps/net11.txt @@ -11,6 +11,9 @@ URLSite = http://www.microsoft.com/downloads/details.aspx?FamilyId=262D25E3-F589 URLDownload = http://download.microsoft.com/download/a/a/c/aac39226-8825-44ce-90e3-bf8203e74006/dotnetfx.exe CDPath = none +[Section.040a] +Description = Microsoft .NET Framework versión 1.1 - Paquete redistribuible. + [Section.040c] Description = Microsoft .NET Framework version 1.1 - Paquet redistribuable. diff --git a/reactos/base/applications/rapps/rapps/net20.txt b/reactos/base/applications/rapps/rapps/net20.txt index 3b01fbaf29b..48c2d8b2536 100644 --- a/reactos/base/applications/rapps/rapps/net20.txt +++ b/reactos/base/applications/rapps/rapps/net20.txt @@ -11,6 +11,9 @@ URLSite = http://www.microsoft.com/downloads/details.aspx?FamilyID=0856eacb-4362 URLDownload = http://download.microsoft.com/download/5/6/7/567758a3-759e-473e-bf8f-52154438565a/dotnetfx.exe CDPath = none +[Section.040a] +Description = Microsoft .NET Framework versión 2.0 - Paquete redistribuible. + [Section.040c] Description = Microsoft .NET Framework version 2.0 - Paquet redistribuable. diff --git a/reactos/base/applications/rapps/rapps/net20sp2.txt b/reactos/base/applications/rapps/rapps/net20sp2.txt index ef47b60270b..b7155dda584 100644 --- a/reactos/base/applications/rapps/rapps/net20sp2.txt +++ b/reactos/base/applications/rapps/rapps/net20sp2.txt @@ -11,6 +11,9 @@ URLSite = http://www.microsoft.com/downloads/details.aspx?familyid=5B2C0358-915B URLDownload = http://download.microsoft.com/download/c/6/e/c6e88215-0178-4c6c-b5f3-158ff77b1f38/NetFx20SP2_x86.exe CDPath = none +[Section.040a] +Description = Microsoft .NET Framework versión 2.0 Service Pack 2. + [Section.040c] Description = Microsoft .NET Framework version 2.0 Service Pack 2. diff --git a/reactos/base/applications/rapps/rapps/python.txt b/reactos/base/applications/rapps/rapps/python.txt index 40aa3ead5d8..2684fd3a4e0 100644 --- a/reactos/base/applications/rapps/rapps/python.txt +++ b/reactos/base/applications/rapps/rapps/python.txt @@ -14,6 +14,9 @@ CDPath = none [Section.0407] Description = Eine sehr mächtige, dynamische Programmiersprache. +[Section.040a] +Description = Un lenguaje de programación dinámico sumamente potente. + [Section.040c] Description = Un langage de programmation dynamique remarquablement puissant. diff --git a/reactos/base/applications/rapps/rapps/remood.txt b/reactos/base/applications/rapps/rapps/remood.txt index 7a05e5dc8f9..bb67d85364a 100644 --- a/reactos/base/applications/rapps/rapps/remood.txt +++ b/reactos/base/applications/rapps/rapps/remood.txt @@ -14,6 +14,9 @@ CDPath = none [Section.0407] Description = ReMooD ist ein Port des Doom Legacy Sources. Es versucht das klassische Legacy Erfahrung zusammen mit neuen Features und mehr Stabilität zu bieten. +[Section.040a] +Description = ReMood es un port de Doom Legacy. Su fin es proporcionar la clásica experiencia anterior con nuevas características y mayor estabilidad. + [Section.040c] Description = ReMood est un portage du source de Doom Legacy. Son but est de fournir l'expérience classique de Legacy avec de nouvelles fonctionnalités et plus de stabilité. diff --git a/reactos/base/applications/rapps/rapps/steam.txt b/reactos/base/applications/rapps/rapps/steam.txt index 615734a26d4..6306fde7903 100644 --- a/reactos/base/applications/rapps/rapps/steam.txt +++ b/reactos/base/applications/rapps/rapps/steam.txt @@ -14,6 +14,9 @@ CDPath = none [Section.0407] Description = Die STEAM Spieleplattform, die von viele Spielen verwendet wird. +[Section.040a] +Description = La plataforma de juego STEAM usada por muchos juegos actuales. + [Section.040c] Description = La plateforme de jeu STEAM utilisée par beaucoup de jeux de nos jours. diff --git a/reactos/base/applications/rapps/rapps/sumatrapdf.txt b/reactos/base/applications/rapps/rapps/sumatrapdf.txt index 1e142ed113a..a28ff505811 100644 --- a/reactos/base/applications/rapps/rapps/sumatrapdf.txt +++ b/reactos/base/applications/rapps/rapps/sumatrapdf.txt @@ -14,6 +14,12 @@ CDPath = none [Section.0407] Description = Sumatra PDF ist ein freies, schlankes, Open-Source PDF-Anzeigeprogramm. +[Section.040a] +Description = Sumatra PDF es un lector PDF ligero, libre y open-source. + +[Section.040c] +Description = Sumatra PDF est un lecteur PDF léger, libre et open-source. + [Section.0410] Description = Sumatra PDF è un visualizzatore di file PDF. E' molto leggero ed è open source. diff --git a/reactos/base/applications/rapps/rapps/superfinder.txt b/reactos/base/applications/rapps/rapps/superfinder.txt index 350ac49bc84..04d6b0f1ead 100644 --- a/reactos/base/applications/rapps/rapps/superfinder.txt +++ b/reactos/base/applications/rapps/rapps/superfinder.txt @@ -14,6 +14,9 @@ CDPath = none [Section.0407] Description = Eine schnelle und effektive Suchanwendung. +[Section.040a] +Description = Una aplicación de búsqueda rápida llena de opciones. + [Section.040c] Description = Une application de recherche rapide et riche en fonctionnalités. diff --git a/reactos/base/applications/rapps/rapps/tahoma.txt b/reactos/base/applications/rapps/rapps/tahoma.txt index 41addaf0e6a..5081cd4d3a4 100644 --- a/reactos/base/applications/rapps/rapps/tahoma.txt +++ b/reactos/base/applications/rapps/rapps/tahoma.txt @@ -15,6 +15,10 @@ CDPath = none Licence = Unbekannt Description = Tahoma Font pack, der von einigen Anwendungen benötigt wird (Steam). +[Section.040a] +Licence = Desconocida +Description = Paquete de fuente Tahoma, necesaria para ciertas aplicaciones (Steam). + [Section.040c] Licence = Inconnue Description = Package pour la police Tahoma, nécessaire pour certaines applications (Steam). diff --git a/reactos/base/applications/rapps/rapps/wme9.txt b/reactos/base/applications/rapps/rapps/wme9.txt index a17de0a8797..cced38c3f0f 100644 --- a/reactos/base/applications/rapps/rapps/wme9.txt +++ b/reactos/base/applications/rapps/rapps/wme9.txt @@ -17,7 +17,7 @@ Licence = Unbekannt [Section.040a] Licence = Desconocida -[Section.040a] +[Section.040c] Licence = Inconnue [Section.0415] From 3ff2ee5566803bfed2630af1586a9727f8a9979b Mon Sep 17 00:00:00 2001 From: Gabriel Ilardi Date: Fri, 29 Apr 2011 15:58:37 +0000 Subject: [PATCH 237/317] [DESK] French translation by Jeisson Toscano. I adjusted some dialogs to make text fit in. See issue #6028 for more details. svn path=/trunk/; revision=51495 --- reactos/dll/cpl/desk/lang/fr-FR.rc | 76 +++++++++++++++--------------- 1 file changed, 38 insertions(+), 38 deletions(-) diff --git a/reactos/dll/cpl/desk/lang/fr-FR.rc b/reactos/dll/cpl/desk/lang/fr-FR.rc index 0bdebbc73ed..d95e8b42f87 100644 --- a/reactos/dll/cpl/desk/lang/fr-FR.rc +++ b/reactos/dll/cpl/desk/lang/fr-FR.rc @@ -22,7 +22,7 @@ BEGIN CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP END -IDD_SCREENSAVER DIALOGEX 0, 0, 246, 204 +IDD_SCREENSAVER DIALOGEX 0, 0, 246, 212 STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION CAPTION "cran de veille" FONT 8, "MS Shell Dlg", 0, 0 @@ -41,9 +41,9 @@ BEGIN LTEXT "minutes", IDC_MINTEXT, 70, 125, 26, 9 CONTROL " la reprise, demander un mot de &passe.",IDC_SCREENS_USEPASSCHK,"button", BS_AUTOCHECKBOX | WS_TABSTOP, 97, 120, 138, 19 - GROUPBOX "G&estion de l'alimentation du moniteur", IDC_SCREENS_DUMMY2, 6, 155, 232, 41 + GROUPBOX "G&estion de l'alimentation du moniteur", IDC_SCREENS_DUMMY2, 6, 155, 232, 43 LTEXT "Pour modifier les paramtres de l'alimentation du moniteur, cliquez sur Gestion de l'alimentation.", - IDC_STATIC, 14, 166, 140, 20 + IDC_STATIC, 14, 166, 140, 25 PUSHBUTTON "&Gestion de l'alimentation...", IDC_SCREENS_POWER_BUTTON, 140, 171, 93, 13 END @@ -98,66 +98,66 @@ BEGIN DEFPUSHBUTTON "OK", IDOK, 137, 220, 50, 14 END -IDD_EFFAPPEARANCE DIALOGEX DISCARDABLE 0, 0, 285, 185 +IDD_EFFAPPEARANCE DIALOGEX DISCARDABLE 0, 0, 340, 185 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU EXSTYLE WS_EX_DLGMODALFRAME | WS_EX_WINDOWEDGE CAPTION "Effects" FONT 8, "MS Shell Dlg" BEGIN - CONTROL "&Use the following transition effect for menus and tooltips:",IDC_EFFAPPEARANCE_ANIMATION,"button", - BS_AUTOCHECKBOX | WS_TABSTOP, 10, 5, 285, 19 + CONTROL "&Utilisez l'effet de transition suivant pour les menus et les bulles d'aides:",IDC_EFFAPPEARANCE_ANIMATION,"button", + BS_AUTOCHECKBOX | WS_TABSTOP, 10, 5, 330, 19 COMBOBOX IDC_EFFAPPEARANCE_ANIMATIONTYPE, 20, 25, 80, 19 , CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_CHILD | WS_VSCROLL | WS_TABSTOP - CONTROL "U&se the following method to smooth edges of screen fonts:",IDC_EFFAPPEARANCE_SMOOTHING,"button", - BS_AUTOCHECKBOX | WS_TABSTOP | WS_DISABLED, 10, 42, 285, 19 + CONTROL "U&tilisez la mthode suivante pour aplanir les bords des polices d'cran:",IDC_EFFAPPEARANCE_SMOOTHING,"button", + BS_AUTOCHECKBOX | WS_TABSTOP | WS_DISABLED, 10, 42, 330, 19 COMBOBOX IDC_EFFAPPEARANCE_SMOOTHINGTYPE, 20, 62, 80, 19 , CBS_DROPDOWNLIST | CBS_HASSTRINGS | CBS_SORT | WS_VSCROLL | WS_TABSTOP | WS_DISABLED - CONTROL "Us&e large icons",IDC_EFFAPPEARANCE_LARGEICONS,"button", - BS_AUTOCHECKBOX | WS_TABSTOP | WS_DISABLED, 10, 80, 285, 19 - CONTROL "Show sh&adows under menus",IDC_EFFAPPEARANCE_SETDROPSHADOW,"button", - BS_AUTOCHECKBOX | WS_TABSTOP | WS_DISABLED, 10, 95, 285, 19 - CONTROL "Show &window contents while dragging",IDC_EFFAPPEARANCE_DRAGFULLWINDOWS,"button", - BS_AUTOCHECKBOX | WS_TABSTOP, 10, 110, 285, 19 - CONTROL "&Hide underlined letters for keyboard navigation until I press the Alt key",IDC_EFFAPPEARANCE_KEYBOARDCUES,"button", - BS_AUTOCHECKBOX | WS_TABSTOP, 10, 125, 285, 19 - PUSHBUTTON "Cancel", IDCANCEL, 226, 165, 50, 14 - DEFPUSHBUTTON "OK", IDOK, 172, 165, 50, 14 + CONTROL "Uti&liser de grandes icones",IDC_EFFAPPEARANCE_LARGEICONS,"button", + BS_AUTOCHECKBOX | WS_TABSTOP | WS_DISABLED, 10, 80, 330, 19 + CONTROL "&Montrer ombrage sous les menus",IDC_EFFAPPEARANCE_SETDROPSHADOW,"button", + BS_AUTOCHECKBOX | WS_TABSTOP | WS_DISABLED, 10, 95, 330, 19 + CONTROL "Montrer contenu des fentres lorsqu'elles sont bougs",IDC_EFFAPPEARANCE_DRAGFULLWINDOWS,"button", + BS_AUTOCHECKBOX | WS_TABSTOP, 10, 110, 330, 19 + CONTROL "&Cacher les lettres soulignes pour la navigation du clavier jusqu' ce que j'appuie sur la touche Alt",IDC_EFFAPPEARANCE_KEYBOARDCUES,"button", + BS_AUTOCHECKBOX | WS_TABSTOP, 10, 125, 330, 19 + PUSHBUTTON "Annuler", IDCANCEL, 281, 165, 50, 14 + DEFPUSHBUTTON "Accepter", IDOK, 227, 165, 50, 14 END -IDD_SETTINGS DIALOGEX DISCARDABLE 0, 0, 246, 188 +IDD_SETTINGS DIALOGEX DISCARDABLE 0, 0, 246, 207 STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION CAPTION "Paramtres" FONT 8, "MS Shell Dlg" BEGIN - LTEXT "Dplacez les icnes de moniteur pour qu'elles correspondent l'arragement physique de vos moniteurs.",-1,3,3,240,10 - CONTROL "",IDC_SETTINGS_MONSEL,"MONITORSELWNDCLASS",WS_CHILD|WS_VISIBLE|WS_TABSTOP,3,16,240,82,WS_EX_CLIENTEDGE - LTEXT "&Affichage :",1820,3,100,30,8 - LTEXT "",IDC_SETTINGS_DEVICE,9,109,224,8 - GROUPBOX "&Rsolution de l'affichage",1818,3,120,115,43 + LTEXT "Dplacez les icnes de moniteur pour qu'elles correspondent l'arragement physique de vos moniteurs.",-1,3,3,240,16 + CONTROL "",IDC_SETTINGS_MONSEL,"MONITORSELWNDCLASS",WS_CHILD|WS_VISIBLE|WS_TABSTOP,3,26,240,82,WS_EX_CLIENTEDGE + LTEXT "&Affichage :",1820,3,110,30,8 + LTEXT "",IDC_SETTINGS_DEVICE,9,119,224,8 + GROUPBOX "&Rsolution de l'affichage",1818,3,130,115,43 CONTROL "",IDC_SETTINGS_RESOLUTION,"msctls_trackbar32", - TBS_AUTOTICKS | WS_TABSTOP, 30, 130, 58, 17 - LTEXT "Moins",1815,9,130,15,8,NOT WS_GROUP - LTEXT "Plus",1816,93,130,21,8,NOT WS_GROUP + TBS_AUTOTICKS | WS_TABSTOP, 30, 140, 58, 17 + LTEXT "Moins",1815,9,140,15,8,NOT WS_GROUP + LTEXT "Plus",1816,93,140,21,8,NOT WS_GROUP LTEXT "",IDC_SETTINGS_RESOLUTION_TEXT,10,150,100,10,NOT WS_GROUP | SS_CENTER - GROUPBOX "&Couleurs",1817,125,120,115,43 - COMBOBOX IDC_SETTINGS_BPP,131,130,103,80,CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | + GROUPBOX "&Couleurs",1817,125,130,115,43 + COMBOBOX IDC_SETTINGS_BPP,131,140,103,80,CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP - CONTROL "",IDC_SETTINGS_SPECTRUM,"Static",SS_OWNERDRAW | SS_SUNKEN,131,148,103,9 - PUSHBUTTON "A&vanc...",IDC_SETTINGS_ADVANCED,170,165,70,14 + CONTROL "",IDC_SETTINGS_SPECTRUM,"Static",SS_OWNERDRAW | SS_SUNKEN,131,158,103,9 + PUSHBUTTON "A&vanc...",IDC_SETTINGS_ADVANCED,170,175,70,14 END -IDD_ADVANCED_GENERAL DIALOGEX DISCARDABLE 0, 0, 253, 204 +IDD_ADVANCED_GENERAL DIALOGEX DISCARDABLE 0, 0, 299, 204 STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION CAPTION "Gnral" FONT 8, "MS Shell Dlg" BEGIN - GROUPBOX "Affichage", -1, 7, 6, 237, 56, WS_GROUP + GROUPBOX "Affichage", -1, 7, 6, 284, 56, WS_GROUP LTEXT "Taille de la police :", -1, 14, 20, 222, 8 COMBOBOX IDC_FONTSIZE_COMBO, 14, 30, 223, 80, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP LTEXT "", IDC_FONTSIZE_COSTOM, 14, 46, 223, 12 - GROUPBOX "Compatibilit", -1, 7, 67, 237, 97 - LTEXT "Quelques programmes peuvent mal fonctionner si vous ne redmarrez pas votre ordinateur aprs que vous ayiez chang les paramtres des couleurs.\r\n\nAprs que j'ai chang les paramtres des couleurs :", -1, 12, 78, 228, 34 - AUTORADIOBUTTON "&Redmarrer l'ordinateur avant d'appliquer les nouveaux paramtres des couleurs.", IDC_RESTART_RB, 14, 116, 224, 10 - AUTORADIOBUTTON "Appliquer les nouveaux paramtres des couleurs sans redmarrer.", IDC_WITHOUTREBOOT_RB, 14, 131, 224, 10 - AUTORADIOBUTTON "Me demander avant d'appliquer les nouveaux paramtres des couleurs.", IDC_ASKME_RB, 14, 146, 224, 10 + GROUPBOX "Compatibilit", -1, 7, 67, 284, 97 + LTEXT "Quelques programmes peuvent mal fonctionner si vous ne redmarrez pas votre ordinateur aprs que vous ayiez chang les paramtres des couleurs.\r\n\nAprs que j'ai chang les paramtres des couleurs :", -1, 12, 78, 274, 34 + AUTORADIOBUTTON "&Redmarrer l'ordinateur avant d'appliquer les nouveaux paramtres des couleurs.", IDC_RESTART_RB, 14, 116, 274, 10 + AUTORADIOBUTTON "Appliquer les nouveaux paramtres des couleurs sans redmarrer.", IDC_WITHOUTREBOOT_RB, 14, 131, 274, 10 + AUTORADIOBUTTON "Me demander avant d'appliquer les nouveaux paramtres des couleurs.", IDC_ASKME_RB, 14, 146, 274, 10 END IDR_PREVIEW_MENU MENU From 1396412b7c310a915b3bceeb310712f97bffd2e2 Mon Sep 17 00:00:00 2001 From: Giannis Adamopoulos Date: Fri, 29 Apr 2011 17:50:30 +0000 Subject: [PATCH 238/317] [win32k] - UserSetProcessWindowStation: Use PsGetProcessWin32WindowStation and PsSetProcessWindowStation. Close the prevoious window station handle only when the window station was not set by UserSetProcessWindowStation (should be the case for console apps) svn path=/trunk/; revision=51496 --- reactos/include/ndk/psfuncs.h | 15 +++++++++++ .../subsystems/win32/win32k/ntuser/winsta.c | 26 ++++++++++--------- 2 files changed, 29 insertions(+), 12 deletions(-) diff --git a/reactos/include/ndk/psfuncs.h b/reactos/include/ndk/psfuncs.h index 4b0a96f52af..19c6678ccfa 100644 --- a/reactos/include/ndk/psfuncs.h +++ b/reactos/include/ndk/psfuncs.h @@ -78,6 +78,21 @@ PsGetThreadWin32Thread( PETHREAD Thread ); +NTKERNELAPI +PVOID +NTAPI +PsGetProcessWin32WindowStation( + PEPROCESS Process +); + +NTKERNELAPI +VOID +NTAPI +PsSetProcessWindowStation( + PEPROCESS Process, + PVOID WindowStation +); + NTKERNELAPI PTEB NTAPI diff --git a/reactos/subsystems/win32/win32k/ntuser/winsta.c b/reactos/subsystems/win32/win32k/ntuser/winsta.c index 2d5d3870e07..10150292b73 100644 --- a/reactos/subsystems/win32/win32k/ntuser/winsta.c +++ b/reactos/subsystems/win32/win32k/ntuser/winsta.c @@ -940,6 +940,7 @@ UserSetProcessWindowStation(HWINSTA hWindowStation) ppi = PsGetCurrentProcessWin32Process(); + /* Reference the new window station */ if(hWindowStation !=NULL) { Status = IntValidateWindowStationHandle( hWindowStation, @@ -956,28 +957,29 @@ UserSetProcessWindowStation(HWINSTA hWindowStation) } OldWinSta = ppi->prpwinsta; - hwinstaOld = ppi->hwinsta; - - /* - * FIXME - don't allow changing the window station if there are threads that are attached to desktops and own gui objects - */ - - InterlockedExchangePointer(&PsGetCurrentProcess()->Win32WindowStation, hWindowStation); - - ppi->prpwinsta = NewWinSta; - ppi->hwinsta = hWindowStation; - + hwinstaOld = PsGetProcessWin32WindowStation(ppi->peProcess); + /* Dereference the previous window station */ if(OldWinSta != NULL) { ObDereferenceObject(OldWinSta); } - if(hwinstaOld != NULL) + /* Check if we have a stale handle (it should happen for console apps) */ + if(hwinstaOld != ppi->hwinsta) { ObCloseHandle(hwinstaOld, UserMode); } + /* + * FIXME - don't allow changing the window station if there are threads that are attached to desktops and own gui objects + */ + + PsSetProcessWindowStation(ppi->peProcess, hWindowStation); + + ppi->prpwinsta = NewWinSta; + ppi->hwinsta = hWindowStation; + return TRUE; } From 5197d7eb9541c9cae10f68e75bf9bfd6d5190f24 Mon Sep 17 00:00:00 2001 From: Gabriel Ilardi Date: Fri, 29 Apr 2011 21:47:53 +0000 Subject: [PATCH 239/317] [NOTEPAD] Patch by Edijs Kolesnikovics: Write default font, weight and point size when run for the first time. That's what ms notepad does too. See issue #5305 for more details. svn path=/trunk/; revision=51497 --- reactos/base/applications/notepad/settings.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/reactos/base/applications/notepad/settings.c b/reactos/base/applications/notepad/settings.c index c0a12491694..d8ed4a87a70 100644 --- a/reactos/base/applications/notepad/settings.c +++ b/reactos/base/applications/notepad/settings.c @@ -182,7 +182,6 @@ void SaveSettings(void) SaveDword(hKey, _T("lfCharSet"), Globals.lfFont.lfCharSet); SaveDword(hKey, _T("lfClipPrecision"), Globals.lfFont.lfClipPrecision); SaveDword(hKey, _T("lfEscapement"), Globals.lfFont.lfEscapement); - SaveString(hKey, _T("lfFaceName"), Globals.lfFont.lfFaceName); SaveDword(hKey, _T("lfItalic"), Globals.lfFont.lfItalic); SaveDword(hKey, _T("lfOrientation"), Globals.lfFont.lfOrientation); SaveDword(hKey, _T("lfOutPrecision"), Globals.lfFont.lfOutPrecision); @@ -190,14 +189,27 @@ void SaveSettings(void) SaveDword(hKey, _T("lfQuality"), Globals.lfFont.lfQuality); SaveDword(hKey, _T("lfStrikeOut"), Globals.lfFont.lfStrikeOut); SaveDword(hKey, _T("lfUnderline"), Globals.lfFont.lfUnderline); - SaveDword(hKey, _T("lfWeight"), Globals.lfFont.lfWeight); - SaveDword(hKey, _T("iPointSize"), PointSizeFromHeight(Globals.lfFont.lfHeight)); SaveDword(hKey, _T("fWrap"), Globals.bWrapLongLines ? 1 : 0); SaveDword(hKey, _T("fStatusBar"), Globals.bShowStatusBar ? 1 : 0); SaveDword(hKey, _T("iWindowPosX"), Globals.main_rect.left); SaveDword(hKey, _T("iWindowPosY"), Globals.main_rect.top); SaveDword(hKey, _T("iWindowPosDX"), Globals.main_rect.right - Globals.main_rect.left); SaveDword(hKey, _T("iWindowPosDY"), Globals.main_rect.bottom - Globals.main_rect.top); + + if (*Globals.lfFont.lfFaceName == '\0') + { + static const TCHAR default_font[] = _T("Tahoma"); + _tcscpy(Globals.lfFont.lfFaceName, default_font); + Globals.lfFont.lfHeight = 100; + Globals.lfFont.lfWeight = 400; + SaveDword(hKey, _T("iPointSize"), Globals.lfFont.lfHeight); + } + else + { + SaveDword(hKey, _T("iPointSize"), PointSizeFromHeight(Globals.lfFont.lfHeight)); + } + SaveDword(hKey, _T("lfWeight"), Globals.lfFont.lfWeight); + SaveString(hKey, _T("lfFaceName"), Globals.lfFont.lfFaceName); RegCloseKey(hKey); } From 8a518bb78dd23818933161385e1cbe7a161903ed Mon Sep 17 00:00:00 2001 From: Giannis Adamopoulos Date: Fri, 29 Apr 2011 21:49:37 +0000 Subject: [PATCH 240/317] [taskmgr] - When terminating an application use 1 as exit code. This is used by Task Manager in windows. It also prevents explorer from restarting in windows - Disable redrawing the list of processes while the list is updated. Fixes flicker in windows svn path=/trunk/; revision=51498 --- reactos/base/applications/taskmgr/endproc.c | 2 +- reactos/base/applications/taskmgr/procpage.c | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/reactos/base/applications/taskmgr/endproc.c b/reactos/base/applications/taskmgr/endproc.c index be080ffbddf..4e92a4e0fae 100644 --- a/reactos/base/applications/taskmgr/endproc.c +++ b/reactos/base/applications/taskmgr/endproc.c @@ -50,7 +50,7 @@ void ProcessPage_OnEndProcess(void) return; } - if (!TerminateProcess(hProcess, 0)) + if (!TerminateProcess(hProcess, 1)) { GetLastErrorText(strErrorText, 260); LoadStringW(hInst, IDS_MSG_UNABLETERMINATEPRO, szTitle, 256); diff --git a/reactos/base/applications/taskmgr/procpage.c b/reactos/base/applications/taskmgr/procpage.c index 6b7ae3519fe..52769063567 100644 --- a/reactos/base/applications/taskmgr/procpage.c +++ b/reactos/base/applications/taskmgr/procpage.c @@ -435,6 +435,8 @@ void UpdateProcesses() LV_ITEM item; LPPROCESS_PAGE_LIST_ITEM pData; + SendMessage(hProcessPageListCtrl, WM_SETREDRAW, FALSE, 0); + /* Remove old processes */ for (i = 0; i < ListView_GetItemCount(hProcessPageListCtrl); i++) { @@ -464,6 +466,8 @@ void UpdateProcesses() { (void)ListView_SortItems(hProcessPageListCtrl, ProcessPageCompareFunc, NULL); } + + SendMessage(hProcessPageListCtrl, WM_SETREDRAW, TRUE, 0); } BOOL ProcessRunning(ULONG ProcessId) From b68a7983f1cf92c375dd42e0fde4792cf0cafe05 Mon Sep 17 00:00:00 2001 From: Giannis Adamopoulos Date: Fri, 29 Apr 2011 21:59:48 +0000 Subject: [PATCH 241/317] [explorer] - Return 1 when explorer terminates. This value lets winlogon know that explorer terminated without errors and it doesn't need to restart svn path=/trunk/; revision=51499 --- reactos/base/shell/explorer/explorer.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/reactos/base/shell/explorer/explorer.cpp b/reactos/base/shell/explorer/explorer.cpp index f555010f142..4e6aee7fd60 100644 --- a/reactos/base/shell/explorer/explorer.cpp +++ b/reactos/base/shell/explorer/explorer.cpp @@ -968,7 +968,9 @@ int explorer_main(HINSTANCE hInstance, LPTSTR lpCmdLine, int cmdShow) } #endif - return Window::MessageLoop(); + Window::MessageLoop(); + + return 1; } From 89ea3624be3817bb9d1def884226742786f4793f Mon Sep 17 00:00:00 2001 From: Gabriel Ilardi Date: Sat, 30 Apr 2011 00:49:10 +0000 Subject: [PATCH 242/317] [NOTEPAD] Revert 51497, this is really a hack, sorry. svn path=/trunk/; revision=51500 --- reactos/base/applications/notepad/settings.c | 18 +++--------------- 1 file changed, 3 insertions(+), 15 deletions(-) diff --git a/reactos/base/applications/notepad/settings.c b/reactos/base/applications/notepad/settings.c index d8ed4a87a70..c0a12491694 100644 --- a/reactos/base/applications/notepad/settings.c +++ b/reactos/base/applications/notepad/settings.c @@ -182,6 +182,7 @@ void SaveSettings(void) SaveDword(hKey, _T("lfCharSet"), Globals.lfFont.lfCharSet); SaveDword(hKey, _T("lfClipPrecision"), Globals.lfFont.lfClipPrecision); SaveDword(hKey, _T("lfEscapement"), Globals.lfFont.lfEscapement); + SaveString(hKey, _T("lfFaceName"), Globals.lfFont.lfFaceName); SaveDword(hKey, _T("lfItalic"), Globals.lfFont.lfItalic); SaveDword(hKey, _T("lfOrientation"), Globals.lfFont.lfOrientation); SaveDword(hKey, _T("lfOutPrecision"), Globals.lfFont.lfOutPrecision); @@ -189,27 +190,14 @@ void SaveSettings(void) SaveDword(hKey, _T("lfQuality"), Globals.lfFont.lfQuality); SaveDword(hKey, _T("lfStrikeOut"), Globals.lfFont.lfStrikeOut); SaveDword(hKey, _T("lfUnderline"), Globals.lfFont.lfUnderline); + SaveDword(hKey, _T("lfWeight"), Globals.lfFont.lfWeight); + SaveDword(hKey, _T("iPointSize"), PointSizeFromHeight(Globals.lfFont.lfHeight)); SaveDword(hKey, _T("fWrap"), Globals.bWrapLongLines ? 1 : 0); SaveDword(hKey, _T("fStatusBar"), Globals.bShowStatusBar ? 1 : 0); SaveDword(hKey, _T("iWindowPosX"), Globals.main_rect.left); SaveDword(hKey, _T("iWindowPosY"), Globals.main_rect.top); SaveDword(hKey, _T("iWindowPosDX"), Globals.main_rect.right - Globals.main_rect.left); SaveDword(hKey, _T("iWindowPosDY"), Globals.main_rect.bottom - Globals.main_rect.top); - - if (*Globals.lfFont.lfFaceName == '\0') - { - static const TCHAR default_font[] = _T("Tahoma"); - _tcscpy(Globals.lfFont.lfFaceName, default_font); - Globals.lfFont.lfHeight = 100; - Globals.lfFont.lfWeight = 400; - SaveDword(hKey, _T("iPointSize"), Globals.lfFont.lfHeight); - } - else - { - SaveDword(hKey, _T("iPointSize"), PointSizeFromHeight(Globals.lfFont.lfHeight)); - } - SaveDword(hKey, _T("lfWeight"), Globals.lfFont.lfWeight); - SaveString(hKey, _T("lfFaceName"), Globals.lfFont.lfFaceName); RegCloseKey(hKey); } From 426f2618230da05387d5d8fa95ee25ae9de3d86a Mon Sep 17 00:00:00 2001 From: Matthias Kupfer Date: Sat, 30 Apr 2011 11:56:02 +0000 Subject: [PATCH 243/317] Add Python 3 svn path=/trunk/; revision=51503 --- .../base/applications/rapps/rapps/python.txt | 2 +- .../base/applications/rapps/rapps/python3.txt | 27 +++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 reactos/base/applications/rapps/rapps/python3.txt diff --git a/reactos/base/applications/rapps/rapps/python.txt b/reactos/base/applications/rapps/rapps/python.txt index 2684fd3a4e0..2bb660df6e2 100644 --- a/reactos/base/applications/rapps/rapps/python.txt +++ b/reactos/base/applications/rapps/rapps/python.txt @@ -1,7 +1,7 @@ ; UTF-8 [Section] -Name = Python +Name = Python 2 Version = 2.7.1 Licence = GPL/LGPL Description = A remarkably powerful dynamic programming language. diff --git a/reactos/base/applications/rapps/rapps/python3.txt b/reactos/base/applications/rapps/rapps/python3.txt new file mode 100644 index 00000000000..d97ef7398ea --- /dev/null +++ b/reactos/base/applications/rapps/rapps/python3.txt @@ -0,0 +1,27 @@ +; UTF-8 + +[Section] +Name = Python 3 +Version = 3.2 +Licence = GPL/LGPL +Description = A remarkably powerful dynamic programming language. +Size = 17.2MB +Category = 7 +URLSite = http://www.python.org/ +URLDownload = http://www.python.org/ftp/python/3.2/python-3.2.msi +CDPath = none + +[Section.0407] +Description = Eine sehr mächtige, dynamische Programmiersprache. + +[Section.040a] +Description = Un lenguaje de programación dinámico sumamente potente. + +[Section.040c] +Description = Un langage de programmation dynamique remarquablement puissant. + +[Section.0415] +Description = Potęży i dynamiczny język programowania. + +[Section.0422] +Description = Дуже потужна динамічна мова програмування. From dd8253dc8c4fe12b5cba22773a1e4c52ebe373c5 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Sat, 30 Apr 2011 14:26:21 +0000 Subject: [PATCH 244/317] [CRT/MINGW-W64] * Reorganize dll entry and C runtime initialization. By Kai Tietz. svn path=/trunk/; revision=51504 --- reactos/lib/3rdparty/mingw/crtdll.c | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/reactos/lib/3rdparty/mingw/crtdll.c b/reactos/lib/3rdparty/mingw/crtdll.c index 55665bda536..001cbd7358f 100644 --- a/reactos/lib/3rdparty/mingw/crtdll.c +++ b/reactos/lib/3rdparty/mingw/crtdll.c @@ -180,33 +180,33 @@ __DllMainCRTStartup (HANDLE hDllHandle, DWORD dwReason, LPVOID lpreserved) goto i__leave; } _pei386_runtime_relocator (); - if (retcode && dwReason == DLL_PROCESS_ATTACH) - __main (); if (dwReason == DLL_PROCESS_ATTACH || dwReason == DLL_THREAD_ATTACH) { + retcode = _CRT_INIT (hDllHandle, dwReason, lpreserved); + if (!retcode) + goto i__leave; retcode = DllEntryPoint (hDllHandle, dwReason, lpreserved); - if (retcode) - retcode = _CRT_INIT (hDllHandle, dwReason, lpreserved); if (! retcode) - goto i__leave; + { + if (dwReason == DLL_PROCESS_ATTACH) + _CRT_INIT (hDllHandle, DLL_PROCESS_DETACH, lpreserved); + goto i__leave; + } } + if (dwReason == DLL_PROCESS_ATTACH) + __main (); retcode = DllMain(hDllHandle,dwReason,lpreserved); - if ((dwReason == DLL_PROCESS_ATTACH) && ! retcode) + if (dwReason == DLL_PROCESS_ATTACH && ! retcode) { DllMain (hDllHandle, DLL_PROCESS_DETACH, lpreserved); - _CRT_INIT (hDllHandle, DLL_PROCESS_DETACH, lpreserved); DllEntryPoint (hDllHandle, DLL_PROCESS_DETACH, lpreserved); + _CRT_INIT (hDllHandle, DLL_PROCESS_DETACH, lpreserved); } if (dwReason == DLL_PROCESS_DETACH || dwReason == DLL_THREAD_DETACH) { + retcode = DllEntryPoint (hDllHandle, dwReason, lpreserved); if (_CRT_INIT (hDllHandle, dwReason, lpreserved) == FALSE) - { - retcode = FALSE; - } - if (retcode) - { - retcode = DllEntryPoint (hDllHandle, dwReason, lpreserved); - } + retcode = FALSE; } i__leave: __native_dllmain_reason = UINT_MAX; From 68b271c1872dbed3280fe887c33b1e50f23da784 Mon Sep 17 00:00:00 2001 From: Gabriel Ilardi Date: Sat, 30 Apr 2011 15:55:13 +0000 Subject: [PATCH 245/317] [SUBST] Italian update by Paolo Devoti. See issue #6178 for more details. svn path=/trunk/; revision=51505 --- reactos/base/system/subst/lang/it-IT.rc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/reactos/base/system/subst/lang/it-IT.rc b/reactos/base/system/subst/lang/it-IT.rc index a77d9f112ae..5a2c1d3229a 100644 --- a/reactos/base/system/subst/lang/it-IT.rc +++ b/reactos/base/system/subst/lang/it-IT.rc @@ -3,9 +3,9 @@ LANGUAGE LANG_ITALIAN, SUBLANG_NEUTRAL STRINGTABLE BEGIN - IDS_INCORRECT_PARAMETER_COUNT "Numero di parametri invalido - %s\n" - IDS_INVALID_PARAMETER "Incorrect number of parameters - %s\n" - IDS_INVALID_PARAMETER2 "Parametro invalido - %s\n" + IDS_INCORRECT_PARAMETER_COUNT "Numero di parametri errato - %s\n" + IDS_INVALID_PARAMETER "Numero di parametri errato - %s\n" + IDS_INVALID_PARAMETER2 "Parametro errato - %s\n" IDS_DRIVE_ALREAD_SUBSTED "Unit gi sostituita\n" IDS_FAILED_WITH_ERROCODE "Interruzione con codice di errore 0x%x: %s\n" IDS_USAGE "Associa un percorso ad una lettera di unit.\n\nSUBST [unit1: [unit2:]percorso]\nSUBST unit1: /D\n\n unit1: \ From dde695503b38702c43457640f3c70b4ce6952214 Mon Sep 17 00:00:00 2001 From: Rafal Harabien Date: Sat, 30 Apr 2011 19:32:37 +0000 Subject: [PATCH 246/317] [SNDVOL32 & TASKMGR] * Properly support WM_SYSCOLORCHANGE svn path=/trunk/; revision=51508 --- reactos/base/applications/sndvol32/sndvol32.c | 10 ++++++++++ reactos/base/applications/taskmgr/taskmgr.c | 6 ++++++ 2 files changed, 16 insertions(+) diff --git a/reactos/base/applications/sndvol32/sndvol32.c b/reactos/base/applications/sndvol32/sndvol32.c index 87fc26a059e..3090bfa4cc7 100644 --- a/reactos/base/applications/sndvol32/sndvol32.c +++ b/reactos/base/applications/sndvol32/sndvol32.c @@ -574,6 +574,16 @@ DlgPreferencesProc(HWND hwndDlg, IDCANCEL); break; } + + case WM_SYSCOLORCHANGE: + { + HWND hwndControls; + + /* Forward WM_SYSCOLORCHANGE to common controls */ + hwndControls = GetDlgItem(hwndDlg, IDC_CONTROLS); + SendMessage(hwndControls, WM_SYSCOLORCHANGE, 0, 0); + break; + } } return 0; diff --git a/reactos/base/applications/taskmgr/taskmgr.c b/reactos/base/applications/taskmgr/taskmgr.c index c6d11c0e54d..6778db38931 100644 --- a/reactos/base/applications/taskmgr/taskmgr.c +++ b/reactos/base/applications/taskmgr/taskmgr.c @@ -396,6 +396,12 @@ TaskManagerWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) case WM_MENUSELECT: TaskManager_OnMenuSelect(hDlg, LOWORD(wParam), HIWORD(wParam), (HMENU)lParam); break; + case WM_SYSCOLORCHANGE: + /* Forward WM_SYSCOLORCHANGE to common controls */ + SendMessage(hApplicationPageListCtrl, WM_SYSCOLORCHANGE, 0, 0); + SendMessage(hProcessPageListCtrl, WM_SYSCOLORCHANGE, 0, 0); + SendMessage(hProcessPageHeaderCtrl, WM_SYSCOLORCHANGE, 0, 0); + break; } return 0; From 452b5fc972d986272c011db4d23df45e3c449593 Mon Sep 17 00:00:00 2001 From: James Tabor Date: Sat, 30 Apr 2011 21:14:11 +0000 Subject: [PATCH 247/317] [Win32k] - Clear and set send erase background bit when sending WM_ERASEBKGND and if return zero reset the bit. This prevents a message loop in riched20 when calling GetUpdateRect. Spotted by Michael Martin. svn path=/trunk/; revision=51509 --- .../subsystems/win32/win32k/ntuser/painting.c | 24 ++++++++++++------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/reactos/subsystems/win32/win32k/ntuser/painting.c b/reactos/subsystems/win32/win32k/ntuser/painting.c index fc7eba1288b..fcea7dc0043 100644 --- a/reactos/subsystems/win32/win32k/ntuser/painting.c +++ b/reactos/subsystems/win32/win32k/ntuser/painting.c @@ -244,7 +244,7 @@ co_IntPaintWindows(PWND Wnd, ULONG Flags, BOOL Recurse) } - if (Wnd->state & WNDS_ERASEBACKGROUND) + if (Wnd->state & WNDS_SENDERASEBACKGROUND) { if (Wnd->hrgnUpdate) { @@ -252,9 +252,11 @@ co_IntPaintWindows(PWND Wnd, ULONG Flags, BOOL Recurse) Wnd->hrgnUpdate, DCX_CACHE|DCX_USESTYLE|DCX_INTERSECTRGN|DCX_KEEPCLIPRGN); - if (co_IntSendMessage(hWnd, WM_ERASEBKGND, (WPARAM)hDC, 0)) + Wnd->state &= ~(WNDS_SENDERASEBACKGROUND|WNDS_ERASEBACKGROUND); + // Kill the loop, so Clear before we send. + if (!co_IntSendMessage(hWnd, WM_ERASEBKGND, (WPARAM)hDC, 0)) { - Wnd->state &= ~WNDS_ERASEBACKGROUND; + Wnd->state |= (WNDS_SENDERASEBACKGROUND|WNDS_ERASEBACKGROUND); } UserReleaseDC(Wnd, hDC, FALSE); } @@ -379,7 +381,7 @@ IntInvalidateWindows(PWND Wnd, HRGN hRgn, ULONG Flags) if (Flags & RDW_FRAME) Wnd->state |= WNDS_SENDNCPAINT; if (Flags & RDW_ERASE) - Wnd->state |= WNDS_ERASEBACKGROUND; + Wnd->state |= WNDS_SENDERASEBACKGROUND; Flags |= RDW_FRAME; } @@ -398,11 +400,11 @@ IntInvalidateWindows(PWND Wnd, HRGN hRgn, ULONG Flags) } if (Wnd->hrgnUpdate == NULL) - Wnd->state &= ~WNDS_ERASEBACKGROUND; + Wnd->state &= ~(WNDS_SENDERASEBACKGROUND|WNDS_ERASEBACKGROUND); if (Flags & RDW_NOFRAME) Wnd->state &= ~WNDS_SENDNCPAINT; if (Flags & RDW_NOERASE) - Wnd->state &= ~WNDS_ERASEBACKGROUND; + Wnd->state &= ~(WNDS_SENDERASEBACKGROUND|WNDS_ERASEBACKGROUND); } if (Flags & RDW_INTERNALPAINT) @@ -819,7 +821,7 @@ NtUserBeginPaint(HWND hWnd, PAINTSTRUCT* UnsafePs) Window->state &= ~WNDS_SENDNCPAINT; MsqDecPaintCountQueue(Window->head.pti->MessageQueue); co_IntSendMessage(hWnd, WM_NCPAINT, (WPARAM)hRgn, 0); - if (hRgn != (HANDLE)1 && hRgn != NULL && GreIsHandleValid(hRgn)) + if (hRgn != HRGN_WINDOW && hRgn != NULL && GreIsHandleValid(hRgn)) { /* NOTE: The region can already by deleted! */ GreDeleteObject(hRgn); @@ -854,10 +856,14 @@ NtUserBeginPaint(HWND hWnd, PAINTSTRUCT* UnsafePs) Window->state &= ~WNDS_INTERNALPAINT; - if (Window->state & WNDS_ERASEBACKGROUND) + if (Window->state & WNDS_SENDERASEBACKGROUND) { - Window->state &= ~WNDS_ERASEBACKGROUND; + Window->state &= ~(WNDS_SENDERASEBACKGROUND|WNDS_ERASEBACKGROUND); Ps.fErase = !co_IntSendMessage(hWnd, WM_ERASEBKGND, (WPARAM)Ps.hdc, 0); + if ( Ps.fErase ) + { + Window->state |= (WNDS_SENDERASEBACKGROUND|WNDS_ERASEBACKGROUND); + } } else { From a41476b1646c357289a8dbd82b3e190195525e77 Mon Sep 17 00:00:00 2001 From: Rafal Harabien Date: Sat, 30 Apr 2011 21:41:15 +0000 Subject: [PATCH 248/317] [COMCTL32] * Properly support WM_SYSCOLORCHANGE in ListView controls with default background. Should be sent to Wine (tm) svn path=/trunk/; revision=51510 --- reactos/dll/win32/comctl32/listview.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/reactos/dll/win32/comctl32/listview.c b/reactos/dll/win32/comctl32/listview.c index d545044ad86..1a1d837ca3b 100644 --- a/reactos/dll/win32/comctl32/listview.c +++ b/reactos/dll/win32/comctl32/listview.c @@ -315,6 +315,7 @@ typedef struct tagLISTVIEW_INFO COLORREF clrBk; COLORREF clrText; COLORREF clrTextBk; + BOOL bDefaultBkColor; /* font */ HFONT hDefaultFont; @@ -7870,7 +7871,8 @@ static BOOL LISTVIEW_Scroll(LISTVIEW_INFO *infoPtr, INT dx, INT dy) static BOOL LISTVIEW_SetBkColor(LISTVIEW_INFO *infoPtr, COLORREF clrBk) { TRACE("(clrBk=%x)\n", clrBk); - + + infoPtr->bDefaultBkColor = FALSE; if(infoPtr->clrBk != clrBk) { if (infoPtr->clrBk != CLR_NONE) DeleteObject(infoPtr->hBkBrush); infoPtr->clrBk = clrBk; @@ -9263,6 +9265,7 @@ static LRESULT LISTVIEW_NCCreate(HWND hwnd, const CREATESTRUCTW *lpcs) infoPtr->clrText = CLR_DEFAULT; infoPtr->clrTextBk = CLR_DEFAULT; LISTVIEW_SetBkColor(infoPtr, comctl32_color.clrWindow); + infoPtr->bDefaultBkColor = TRUE; /* set default values */ infoPtr->nFocusedItem = -1; @@ -11525,6 +11528,11 @@ LISTVIEW_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) case WM_SYSCOLORCHANGE: COMCTL32_RefreshSysColors(); + if (infoPtr->bDefaultBkColor) + { + LISTVIEW_SetBkColor(infoPtr, comctl32_color.clrWindow); + infoPtr->bDefaultBkColor = TRUE; + } return 0; /* case WM_TIMER: */ From a4b0bea539bb216e517e0f6afa4b4b21bb18d623 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sat, 30 Apr 2011 22:09:16 +0000 Subject: [PATCH 249/317] =?UTF-8?q?[SMSS]=20Fix=20for=20the=20loading=20of?= =?UTF-8?q?=20the=20"KnownDlls"=20in=20SMSS.=20Patch=20by=20Herm=C3=A8s=20?= =?UTF-8?q?B=C3=89LUSCA=20-=20MA=C3=8FTO.=20The=20patch=20was=20applied=20?= =?UTF-8?q?without=20changes=20to=20comments,=20indentation=20and=20coding?= =?UTF-8?q?=20style.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit See issue #6159 for more details. svn path=/trunk/; revision=51511 --- reactos/base/system/smss/init.c | 2 +- reactos/base/system/smss/initenv.c | 62 +++++++++++++++++++++--------- 2 files changed, 44 insertions(+), 20 deletions(-) diff --git a/reactos/base/system/smss/init.c b/reactos/base/system/smss/init.c index 6d5bc643994..146a4418cf4 100644 --- a/reactos/base/system/smss/init.c +++ b/reactos/base/system/smss/init.c @@ -30,10 +30,10 @@ struct { {TRUE, SmInitDosDevices, "create dos device links"}, {TRUE, SmRunBootApplications, "run boot applications"}, {TRUE, SmProcessFileRenameList, "process the file rename list"}, + {FALSE, SmUpdateEnvironment, "update environment variables"}, {FALSE, SmLoadKnownDlls, "preload system DLLs"}, {TRUE, SmCreatePagingFiles, "create paging files"}, {TRUE, SmInitializeRegistry, "initialize the registry"}, - {FALSE, SmUpdateEnvironment, "update environment variables"}, {TRUE, SmInitializeClientManagement, "initialize client management"}, {TRUE, SmLoadSubsystems, "load subsystems"} }; diff --git a/reactos/base/system/smss/initenv.c b/reactos/base/system/smss/initenv.c index 24ccc3bb5c4..21874e366ff 100644 --- a/reactos/base/system/smss/initenv.c +++ b/reactos/base/system/smss/initenv.c @@ -227,10 +227,6 @@ SmSetEnvironmentVariables(VOID) goto done; } -done: - NtClose(EnvironmentKey); - - /* Set the 'PROCESSOR_IDENTIFIER' system environment variable */ RtlInitUnicodeString(&Identifier, NULL); RtlInitUnicodeString(&VendorIdentifier, NULL); @@ -251,25 +247,37 @@ done: QueryTable, NULL, NULL); - if (NT_SUCCESS(Status)) + if (!NT_SUCCESS(Status)) { - DPRINT("SM: szIdentifier: %wZ\n", &Identifier); - DPRINT("SM: szVendorIdentifier: %wZ\n", &VendorIdentifier); - - swprintf(Buffer, L"%wZ, %wZ", &Identifier, &VendorIdentifier); - - RtlWriteRegistryValue(RTL_REGISTRY_CONTROL, - L"Session Manager\\Environment", - L"PROCESSOR_IDENTIFIER", - REG_SZ, - Buffer, - (wcslen(Buffer) + 1) * sizeof(WCHAR)); + DPRINT1("SM: Failed to retrieve processor Identifier and/or VendorIdentifier (Status %08lx)", Status); + goto done; } - RtlFreeUnicodeString(&Identifier); - RtlFreeUnicodeString(&VendorIdentifier); + DPRINT("SM: szIdentifier: %wZ\n" , &Identifier); + DPRINT("SM: szVendorIdentifier: %wZ\n", &VendorIdentifier); - return STATUS_SUCCESS; + RtlInitUnicodeString(&VariableName, L"PROCESSOR_IDENTIFIER"); + swprintf(Buffer, L"%wZ, %wZ", &Identifier, &VendorIdentifier); + RtlFreeUnicodeString(&VendorIdentifier); + RtlFreeUnicodeString(&Identifier); + + Status = NtSetValueKey(EnvironmentKey, + &VariableName, + 0, + REG_SZ, + Buffer, + (wcslen(Buffer) + 1) * sizeof(WCHAR)); + if (!NT_SUCCESS(Status)) + { + DPRINT1("SM: Failed to set the PROCESSOR_IDENTIFIER environment variable (Status %08lx)", Status); + goto done; + } + +done: + /* Close the handle */ + NtClose(EnvironmentKey); + + return Status; } @@ -282,6 +290,10 @@ SmUpdateEnvironment(VOID) RTL_QUERY_REGISTRY_TABLE QueryTable[2]; WCHAR ValueBuffer[MAX_PATH]; NTSTATUS Status; +#ifndef NDEBUG + ULONG ii; + PWSTR envp; +#endif /* * The following environment variables must be set prior to reading @@ -317,6 +329,18 @@ SmUpdateEnvironment(VOID) &SmSystemEnvironment, SmSystemEnvironment); +#ifndef NDEBUG + /* Print all environment varaibles */ + ii = 0; + envp = SmSystemEnvironment; + DbgPrint("SmUpdateEnvironment:\n"); + while (*envp) + { + DbgPrint(" %u: %S\n", ii++, envp); + envp += wcslen(envp) + 1; + } +#endif + return Status; } From 94050d9e54b18266d9fa90fa539f04ccb6f3e740 Mon Sep 17 00:00:00 2001 From: James Tabor Date: Sat, 30 Apr 2011 22:17:55 +0000 Subject: [PATCH 250/317] [Win32k] - Update key state when key and hardware is set before the event set. This allows input.c to post and set key states. svn path=/trunk/; revision=51512 --- reactos/subsystems/win32/win32k/ntuser/msgqueue.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/reactos/subsystems/win32/win32k/ntuser/msgqueue.c b/reactos/subsystems/win32/win32k/ntuser/msgqueue.c index e0210dafdc1..36aa74c3bec 100644 --- a/reactos/subsystems/win32/win32k/ntuser/msgqueue.c +++ b/reactos/subsystems/win32/win32k/ntuser/msgqueue.c @@ -466,7 +466,6 @@ co_MsqPostKeyboardMessage(UINT uMsg, WPARAM wParam, LPARAM lParam) FocusMessageQueue->Desktop->pDeskInfo->LastInputWasKbd = TRUE; Msg.pt = gpsi->ptCursor; - update_input_key_state(FocusMessageQueue, &Msg); MsqPostMessage(FocusMessageQueue, &Msg, TRUE, QS_KEY); } else @@ -1006,6 +1005,9 @@ MsqPostMessage(PUSER_MESSAGE_QUEUE MessageQueue, MSG* Msg, BOOLEAN HardwareMessa { InsertTailList(&MessageQueue->HardwareMessagesListHead, &Message->ListEntry); + + if (MessageBits & QS_KEY) + update_input_key_state( MessageQueue, Msg ); } Message->QS_Flags = MessageBits; From 5dd119d642178b877365898427ee0b10fbc2bd7f Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sat, 30 Apr 2011 22:33:53 +0000 Subject: [PATCH 251/317] [EVENTLOG] Implement an event source list and use it to find the event log file for a given event source when an event was reported. svn path=/trunk/; revision=51513 --- reactos/base/services/eventlog/eventlog.c | 31 ++-- reactos/base/services/eventlog/eventlog.h | 15 +- .../base/services/eventlog/eventlog.rbuild | 1 + reactos/base/services/eventlog/eventsource.c | 150 ++++++++++++++++++ reactos/base/services/eventlog/rpc.c | 42 +++-- 5 files changed, 213 insertions(+), 26 deletions(-) create mode 100644 reactos/base/services/eventlog/eventsource.c diff --git a/reactos/base/services/eventlog/eventlog.c b/reactos/base/services/eventlog/eventlog.c index 70663351ab5..c81f9af4dcb 100644 --- a/reactos/base/services/eventlog/eventlog.c +++ b/reactos/base/services/eventlog/eventlog.c @@ -174,12 +174,11 @@ ServiceMain(DWORD argc, } -BOOL LoadLogFile(HKEY hKey, WCHAR * LogName) +PLOGFILE LoadLogFile(HKEY hKey, WCHAR * LogName) { DWORD MaxValueLen, ValueLen, Type, ExpandedLen; WCHAR *Buf = NULL, *Expanded = NULL; LONG Result; - BOOL ret = TRUE; PLOGFILE pLogf; DPRINT("LoadLogFile: %S\n", LogName); @@ -188,11 +187,10 @@ BOOL LoadLogFile(HKEY hKey, WCHAR * LogName) NULL, NULL, &MaxValueLen, NULL, NULL); Buf = HeapAlloc(MyHeap, 0, MaxValueLen); - if (!Buf) { DPRINT1("Can't allocate heap!\n"); - return FALSE; + return NULL; } ValueLen = MaxValueLen; @@ -203,29 +201,27 @@ BOOL LoadLogFile(HKEY hKey, WCHAR * LogName) &Type, (LPBYTE) Buf, &ValueLen); - if (Result != ERROR_SUCCESS) { DPRINT1("RegQueryValueEx failed: %d\n", GetLastError()); HeapFree(MyHeap, 0, Buf); - return FALSE; + return NULL; } if (Type != REG_EXPAND_SZ && Type != REG_SZ) { DPRINT1("%S\\File - value of wrong type %x.\n", LogName, Type); HeapFree(MyHeap, 0, Buf); - return FALSE; + return NULL; } ExpandedLen = ExpandEnvironmentStrings(Buf, NULL, 0); Expanded = HeapAlloc(MyHeap, 0, ExpandedLen * sizeof(WCHAR)); - if (!Expanded) { DPRINT1("Can't allocate heap!\n"); HeapFree(MyHeap, 0, Buf); - return FALSE; + return NULL; } ExpandEnvironmentStrings(Buf, Expanded, ExpandedLen); @@ -237,12 +233,11 @@ BOOL LoadLogFile(HKEY hKey, WCHAR * LogName) if (pLogf == NULL) { DPRINT1("Failed to create %S!\n", Expanded); - ret = FALSE; } HeapFree(MyHeap, 0, Buf); HeapFree(MyHeap, 0, Expanded); - return ret; + return pLogf; } BOOL LoadLogFiles(HKEY eventlogKey) @@ -251,6 +246,7 @@ BOOL LoadLogFiles(HKEY eventlogKey) DWORD MaxLognameLen, LognameLen; WCHAR *Buf = NULL; INT i; + PLOGFILE pLogFile; RegQueryInfoKey(eventlogKey, NULL, NULL, NULL, NULL, @@ -288,10 +284,16 @@ BOOL LoadLogFiles(HKEY eventlogKey) return FALSE; } - if (!LoadLogFile(SubKey, Buf)) - DPRINT1("Failed to load %S\n", Buf); - else + pLogFile = LoadLogFile(SubKey, Buf); + if (pLogFile != NULL) + { DPRINT("Loaded %S\n", Buf); + LoadEventSources(SubKey, pLogFile); + } + else + { + DPRINT1("Failed to load %S\n", Buf); + } RegCloseKey(SubKey); LognameLen = MaxLognameLen; @@ -310,6 +312,7 @@ INT wmain() HKEY elogKey; LogfListInitialize(); + InitEventSourceList(); MyHeap = HeapCreate(0, 1024 * 256, 0); diff --git a/reactos/base/services/eventlog/eventlog.h b/reactos/base/services/eventlog/eventlog.h index 7b6640e4b8d..c9a7cf89474 100644 --- a/reactos/base/services/eventlog/eventlog.h +++ b/reactos/base/services/eventlog/eventlog.h @@ -93,19 +93,17 @@ typedef struct _LOGFILE LIST_ENTRY ListEntry; } LOGFILE, *PLOGFILE; -#if 0 typedef struct _EVENTSOURCE { LIST_ENTRY EventSourceListEntry; PLOGFILE LogFile; - ULONG CurrentRecord; WCHAR szName[1]; } EVENTSOURCE, *PEVENTSOURCE; -#endif typedef struct _LOGHANDLE { LIST_ENTRY LogHandleListEntry; + PEVENTSOURCE EventSource; PLOGFILE LogFile; ULONG CurrentRecord; WCHAR szName[1]; @@ -192,6 +190,17 @@ VOID EventTimeToSystemTime(DWORD EventTime, VOID SystemTimeToEventTime(SYSTEMTIME * pSystemTime, DWORD * pEventTime); +/* eventsource.c */ +VOID InitEventSourceList(VOID); + +BOOL +LoadEventSources(HKEY hKey, + PLOGFILE pLogFile); + +PEVENTSOURCE +GetEventSourceByName(LPCWSTR Name); + + /* logport.c */ NTSTATUS WINAPI PortThreadRoutine(PVOID Param); diff --git a/reactos/base/services/eventlog/eventlog.rbuild b/reactos/base/services/eventlog/eventlog.rbuild index 7a3079a1163..eaea162f895 100644 --- a/reactos/base/services/eventlog/eventlog.rbuild +++ b/reactos/base/services/eventlog/eventlog.rbuild @@ -9,6 +9,7 @@ rpcrt4 pseh eventlog.c + eventsource.c logport.c eventlog.rc rpc.c diff --git a/reactos/base/services/eventlog/eventsource.c b/reactos/base/services/eventlog/eventsource.c new file mode 100644 index 00000000000..61826668c38 --- /dev/null +++ b/reactos/base/services/eventlog/eventsource.c @@ -0,0 +1,150 @@ +/* + * PROJECT: ReactOS kernel + * LICENSE: GPL - See COPYING in the top level directory + * FILE: base/services/eventlog/eventsource.c + * PURPOSE: Event logging service + * COPYRIGHT: Copyright 2011 Eric Kohl + */ + +/* INCLUDES *****************************************************************/ + +#include "eventlog.h" + +static LIST_ENTRY EventSourceListHead; +static CRITICAL_SECTION EventSourceListCs; + +/* FUNCTIONS ****************************************************************/ + +VOID +InitEventSourceList(VOID) +{ + InitializeCriticalSection(&EventSourceListCs); + InitializeListHead(&EventSourceListHead); +} + + +static VOID +DumpEventSourceList(VOID) +{ + PLIST_ENTRY CurrentEntry; + PEVENTSOURCE EventSource; + + DPRINT("DumpEventSourceList()\n"); + EnterCriticalSection(&EventSourceListCs); + + CurrentEntry = EventSourceListHead.Flink; + while (CurrentEntry != &EventSourceListHead) + { + EventSource = CONTAINING_RECORD(CurrentEntry, + EVENTSOURCE, + EventSourceListEntry); + + DPRINT("EventSource->szName: %S\n", EventSource->szName); + + CurrentEntry = CurrentEntry->Flink; + } + + LeaveCriticalSection(&EventSourceListCs); + + DPRINT("Done\n"); +} + + +BOOL +LoadEventSources(HKEY hKey, + PLOGFILE pLogFile) +{ + PEVENTSOURCE lpEventSource; + DWORD dwMaxSubKeyLength; + DWORD dwEventSourceNameLength; + DWORD dwIndex; + WCHAR *Buf = NULL; + + DPRINT("LoadEventSources\n"); + + RegQueryInfoKeyW(hKey, NULL, NULL, NULL, NULL, &dwMaxSubKeyLength, NULL, + NULL, NULL, NULL, NULL, NULL); + + DPRINT("dwMaxSubKeyLength: %lu\n", dwMaxSubKeyLength); + + dwMaxSubKeyLength++; + + Buf = HeapAlloc(MyHeap, 0, dwMaxSubKeyLength * sizeof(WCHAR)); + if (!Buf) + { + DPRINT1("Error: can't allocate heap!\n"); + return FALSE; + } + + dwEventSourceNameLength = dwMaxSubKeyLength; + + dwIndex = 0; + while (RegEnumKeyExW(hKey, + dwIndex, + Buf, + &dwEventSourceNameLength, + NULL, NULL, NULL, NULL) == ERROR_SUCCESS) + { + DPRINT("Event Source: %S\n", Buf); + + lpEventSource = HeapAlloc(MyHeap, 0, sizeof(EVENTSOURCE) + wcslen(Buf) * sizeof(WCHAR)); + if (lpEventSource != NULL) + { + wcscpy(lpEventSource->szName, Buf); + lpEventSource->LogFile = pLogFile; + + DPRINT("Insert event source: %S\n", lpEventSource->szName); + + + EnterCriticalSection(&EventSourceListCs); + InsertTailList(&EventSourceListHead, + &lpEventSource->EventSourceListEntry); + LeaveCriticalSection(&EventSourceListCs); + } + + dwEventSourceNameLength = dwMaxSubKeyLength; + dwIndex++; + } + + HeapFree(MyHeap, 0, Buf); + + DumpEventSourceList(); + + return TRUE; +} + + +PEVENTSOURCE +GetEventSourceByName(LPCWSTR Name) +{ + PLIST_ENTRY CurrentEntry; + PEVENTSOURCE Result = NULL; + + DPRINT("GetEventSourceByName(%S)\n", Name); + EnterCriticalSection(&EventSourceListCs); + + CurrentEntry = EventSourceListHead.Flink; + while (CurrentEntry != &EventSourceListHead) + { + PEVENTSOURCE Item = CONTAINING_RECORD(CurrentEntry, + EVENTSOURCE, + EventSourceListEntry); + + DPRINT("Item->szName: %S\n", Item->szName); +// if ((*(Item->szName) != 0) && !_wcsicmp(Item->szName, Name)) + if (_wcsicmp(Item->szName, Name) == 0) + { + DPRINT("Found it\n"); + Result = Item; + break; + } + + CurrentEntry = CurrentEntry->Flink; + } + + LeaveCriticalSection(&EventSourceListCs); + + DPRINT("Done (Result: %p)\n", Result); + + return Result; +} diff --git a/reactos/base/services/eventlog/rpc.c b/reactos/base/services/eventlog/rpc.c index d0efdad7f83..cf855757292 100644 --- a/reactos/base/services/eventlog/rpc.c +++ b/reactos/base/services/eventlog/rpc.c @@ -49,6 +49,9 @@ PLOGHANDLE ElfCreateEventLogHandle(LPCWSTR Name, BOOL Create) PLOGHANDLE lpLogHandle; PLOGFILE currentLogFile = NULL; INT i, LogsActive; + PEVENTSOURCE pEventSource; + + DPRINT("ElfCreateEventLogHandle(Name: %S)\n", Name); lpLogHandle = HeapAlloc(GetProcessHeap(), 0, sizeof(LOGHANDLE) + ((wcslen(Name) + 1) * sizeof(WCHAR))); @@ -70,19 +73,36 @@ PLOGHANDLE ElfCreateEventLogHandle(LPCWSTR Name, BOOL Create) /* If Creating, default to the Application Log in case we fail, as documented on MSDN */ if (Create == TRUE) - lpLogHandle->LogFile = LogfListItemByName(L"Application"); + { + pEventSource = GetEventSourceByName(Name); + DPRINT("EventSource: %p\n", pEventSource); + if (pEventSource) + { + DPRINT("EventSource LogFile: %p\n", pEventSource->LogFile); + lpLogHandle->LogFile = pEventSource->LogFile; + } + else + { + DPRINT("EventSource LogFile: Application log file\n"); + lpLogHandle->LogFile = LogfListItemByName(L"Application"); + } + + DPRINT("LogHandle LogFile: %p\n", lpLogHandle->LogFile); + } else + { lpLogHandle->LogFile = NULL; - for (i = 1; i <= LogsActive; i++) - { - currentLogFile = LogfListItemByIndex(i); - - if (_wcsicmp(Name, currentLogFile->LogName) == 0) + for (i = 1; i <= LogsActive; i++) { - lpLogHandle->LogFile = LogfListItemByIndex(i); - lpLogHandle->CurrentRecord = LogfGetOldestRecord(lpLogHandle->LogFile); - break; + currentLogFile = LogfListItemByIndex(i); + + if (_wcsicmp(Name, currentLogFile->LogName) == 0) + { + lpLogHandle->LogFile = LogfListItemByIndex(i); + lpLogHandle->CurrentRecord = LogfGetOldestRecord(lpLogHandle->LogFile); + break; + } } } @@ -267,6 +287,8 @@ NTSTATUS ElfrRegisterEventSourceW( DWORD MinorVersion, IELF_HANDLE *LogHandle) { + DPRINT1("ElfrRegisterEventSourceW()\n"); + if ((MajorVersion != 1) || (MinorVersion != 1)) return STATUS_INVALID_PARAMETER; @@ -274,6 +296,8 @@ NTSTATUS ElfrRegisterEventSourceW( if (RegModuleName->Length > 0) return STATUS_INVALID_PARAMETER; + DPRINT1("ModuleName: %S\n", ModuleName->Buffer); + /*FIXME: UNCServerName must specify the server or empty for local */ /*FIXME: Must verify that caller has write access */ From a6edd599e3b9ed88ea1db857fdb3b5d7c182398a Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sat, 30 Apr 2011 23:41:40 +0000 Subject: [PATCH 252/317] [NETEVENT] - Remove netevent.c and netevent.spec because netevent.dll is a resource-only dll. - Set entrypoint to 0. svn path=/trunk/; revision=51514 --- reactos/dll/win32/netevent/netevent.c | 25 ---------------------- reactos/dll/win32/netevent/netevent.rbuild | 4 +--- reactos/dll/win32/netevent/netevent.spec | 1 - 3 files changed, 1 insertion(+), 29 deletions(-) delete mode 100644 reactos/dll/win32/netevent/netevent.c delete mode 100644 reactos/dll/win32/netevent/netevent.spec diff --git a/reactos/dll/win32/netevent/netevent.c b/reactos/dll/win32/netevent/netevent.c deleted file mode 100644 index 2534275adad..00000000000 --- a/reactos/dll/win32/netevent/netevent.c +++ /dev/null @@ -1,25 +0,0 @@ -/* - * PROJECT: ReactOS Network Event Handler - * LICENSE: GPL - See COPYING in the top level directory - * FILE: dll/win32/netevent/netevent.c - * PURPOSE: Dummy main file - * COPYRIGHT: Eric Kohl - */ - -#include - -BOOL -WINAPI -DllMain(IN HINSTANCE hinstDLL, - IN DWORD dwReason, - IN LPVOID lpvReserved) -{ - switch (dwReason) - { - case DLL_PROCESS_ATTACH: - DisableThreadLibraryCalls(hinstDLL); - break; - } - - return TRUE; -} diff --git a/reactos/dll/win32/netevent/netevent.rbuild b/reactos/dll/win32/netevent/netevent.rbuild index 261bbeaf727..ac6f34013fc 100644 --- a/reactos/dll/win32/netevent/netevent.rbuild +++ b/reactos/dll/win32/netevent/netevent.rbuild @@ -1,8 +1,6 @@ - - + . . neteventmsg - netevent.c netevt.rc diff --git a/reactos/dll/win32/netevent/netevent.spec b/reactos/dll/win32/netevent/netevent.spec deleted file mode 100644 index 785ff690182..00000000000 --- a/reactos/dll/win32/netevent/netevent.spec +++ /dev/null @@ -1 +0,0 @@ -# netevent.dll exports From 8973f39c75e07fa45b60875cec5f46c04335946b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herv=C3=A9=20Poussineau?= Date: Sun, 1 May 2011 07:57:47 +0000 Subject: [PATCH 253/317] [freeldr] Handle ramdisks < 8MB svn path=/trunk/; revision=51515 --- reactos/boot/freeldr/freeldr/disk/ramdisk.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/reactos/boot/freeldr/freeldr/disk/ramdisk.c b/reactos/boot/freeldr/freeldr/disk/ramdisk.c index fadf34182c3..b9123ddb38a 100644 --- a/reactos/boot/freeldr/freeldr/disk/ramdisk.c +++ b/reactos/boot/freeldr/freeldr/disk/ramdisk.c @@ -164,7 +164,10 @@ RamDiskLoadVirtualFile(IN PCHAR FileName) // Allocate memory for it // ChunkSize = 8 * 1024 * 1024; - Percent = PercentPerChunk = 100 / (gRamDiskSize / ChunkSize); + if (gRamDiskSize < ChunkSize) + Percent = PercentPerChunk = 0; + else + Percent = PercentPerChunk = 100 / (gRamDiskSize / ChunkSize); gRamDiskBase = MmAllocateMemory(gRamDiskSize); if (!gRamDiskBase) { From d4e292197b2fb3cc19aaf84781d74e32da7357fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herv=C3=A9=20Poussineau?= Date: Sun, 1 May 2011 08:01:05 +0000 Subject: [PATCH 254/317] [freeldr] ramdisk: allocate memory with right type This fixes NT boot type with a ramdisk, but ntoskrnl part is still broken svn path=/trunk/; revision=51516 --- reactos/boot/freeldr/freeldr/disk/ramdisk.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/boot/freeldr/freeldr/disk/ramdisk.c b/reactos/boot/freeldr/freeldr/disk/ramdisk.c index b9123ddb38a..19eaa78aff8 100644 --- a/reactos/boot/freeldr/freeldr/disk/ramdisk.c +++ b/reactos/boot/freeldr/freeldr/disk/ramdisk.c @@ -168,7 +168,7 @@ RamDiskLoadVirtualFile(IN PCHAR FileName) Percent = PercentPerChunk = 0; else Percent = PercentPerChunk = 100 / (gRamDiskSize / ChunkSize); - gRamDiskBase = MmAllocateMemory(gRamDiskSize); + gRamDiskBase = MmAllocateMemoryWithType(gRamDiskSize, LoaderXIPRom); if (!gRamDiskBase) { UiMessageBox("Failed to allocate memory for RAM disk\n"); From f9d566f139c3825bd27840856c6ba29970b37e1c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herv=C3=A9=20Poussineau?= Date: Sun, 1 May 2011 08:11:43 +0000 Subject: [PATCH 255/317] [freeldr] Add PXE "filesystem" svn path=/trunk/; revision=51517 --- .../boot/freeldr/freeldr/arch/i386/i386pxe.S | 97 +++ .../boot/freeldr/freeldr/arch/i386/machpc.c | 2 +- .../boot/freeldr/freeldr/arch/i386/pcdisk.c | 11 + .../boot/freeldr/freeldr/freeldr_base.rbuild | 1 + .../freeldr/freeldr/freeldr_base64k.rbuild | 1 + reactos/boot/freeldr/freeldr/fs/fs.c | 4 + reactos/boot/freeldr/freeldr/fs/pxe.c | 362 +++++++++++ .../freeldr/include/arch/i386/hardware.h | 3 + .../freeldr/include/arch/i386/machpc.h | 1 + .../freeldr/freeldr/include/arch/i386/pxe.h | 602 ++++++++++++++++++ .../boot/freeldr/freeldr/include/freeldr.h | 2 + reactos/boot/freeldr/freeldr/include/fs/pxe.h | 27 + 12 files changed, 1112 insertions(+), 1 deletion(-) create mode 100644 reactos/boot/freeldr/freeldr/arch/i386/i386pxe.S create mode 100644 reactos/boot/freeldr/freeldr/fs/pxe.c create mode 100644 reactos/boot/freeldr/freeldr/include/arch/i386/pxe.h create mode 100644 reactos/boot/freeldr/freeldr/include/fs/pxe.h diff --git a/reactos/boot/freeldr/freeldr/arch/i386/i386pxe.S b/reactos/boot/freeldr/freeldr/arch/i386/i386pxe.S new file mode 100644 index 00000000000..b4ec7719ed4 --- /dev/null +++ b/reactos/boot/freeldr/freeldr/arch/i386/i386pxe.S @@ -0,0 +1,97 @@ +/* + * FreeLoader + * Copyright (C) 2011 Herv Poussineau + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + + .text + .code16 + +#define ASM + +#include + +/* + * U16 PxeCallApi(U16 Segment, U16 Offset, U16 Service, VOID *Parameter); + * + * RETURNS: + */ +_pxe_function: + .word 0 +_pxe_entry_point: + .long 0 +_pxe_buffer_segment: + .word0 +_pxe_buffer_offset: + .word0 +_pxe_result: + .word 0 + +EXTERN(_PxeCallApi) + .code32 + pushl %ebp + movl %esp,%ebp + + pushal + push %es + + /* copy entry point */ + movl 0x08(%ebp),%eax + shll $16,%eax + movw 0x0C(%ebp),%ax + movl %eax,_pxe_entry_point + + /* copy function */ + movw 0x10(%ebp),%ax + movw %ax,_pxe_function + + /* convert pointer to data buffer to segment/offset */ + movl 0x14(%ebp),%eax + shrl $4,%eax + andl $0xf000,%eax + movw %ax,_pxe_buffer_segment + movl 0x14(%ebp),%eax + andl $0xffff,%eax + movw %ax,_pxe_buffer_offset + + call switch_to_real + .code16 + + movw _pxe_buffer_segment,%ax + push %ax + movw _pxe_buffer_offset,%ax + push %ax + movw _pxe_function,%ax + push %ax + lcall *_pxe_entry_point + addw $6,%sp + movw %ax,_pxe_result + + call switch_to_prot + .code32 + + pop %es + popal + + movl %ebp,%esp + popl %ebp + + movw _pxe_result,%ax + + ret + +/* EOF */ + diff --git a/reactos/boot/freeldr/freeldr/arch/i386/machpc.c b/reactos/boot/freeldr/freeldr/arch/i386/machpc.c index 879e2029d6e..c585c97932d 100644 --- a/reactos/boot/freeldr/freeldr/arch/i386/machpc.c +++ b/reactos/boot/freeldr/freeldr/arch/i386/machpc.c @@ -43,7 +43,7 @@ PcMachInit(const char *CmdLine) MachVtbl.Beep = PcBeep; MachVtbl.PrepareForReactOS = PcPrepareForReactOS; MachVtbl.GetMemoryMap = PcMemGetMemoryMap; - MachVtbl.DiskGetBootPath = DiskGetBootPath; + MachVtbl.DiskGetBootPath = PcDiskGetBootPath; MachVtbl.DiskReadLogicalSectors = PcDiskReadLogicalSectors; MachVtbl.DiskGetDriveGeometry = PcDiskGetDriveGeometry; MachVtbl.DiskGetCacheableBlockCount = PcDiskGetCacheableBlockCount; diff --git a/reactos/boot/freeldr/freeldr/arch/i386/pcdisk.c b/reactos/boot/freeldr/freeldr/arch/i386/pcdisk.c index 304a8670107..4bde50c5839 100644 --- a/reactos/boot/freeldr/freeldr/arch/i386/pcdisk.c +++ b/reactos/boot/freeldr/freeldr/arch/i386/pcdisk.c @@ -367,4 +367,15 @@ PcDiskGetCacheableBlockCount(ULONG DriveNumber) } } +BOOLEAN +PcDiskGetBootPath(char *BootPath, unsigned Size) +{ + if (PxeInit()) + { + strcpy(BootPath, "net(0)"); + return 0; + } + return DiskGetBootPath(BootPath, Size); +} + /* EOF */ diff --git a/reactos/boot/freeldr/freeldr/freeldr_base.rbuild b/reactos/boot/freeldr/freeldr/freeldr_base.rbuild index 0288290b45c..5d391f65d21 100644 --- a/reactos/boot/freeldr/freeldr/freeldr_base.rbuild +++ b/reactos/boot/freeldr/freeldr/freeldr_base.rbuild @@ -33,6 +33,7 @@ fs.c iso.c ntfs.c + pxe.c ini_init.c diff --git a/reactos/boot/freeldr/freeldr/freeldr_base64k.rbuild b/reactos/boot/freeldr/freeldr/freeldr_base64k.rbuild index b5127e6b4ed..28a671a9f7f 100644 --- a/reactos/boot/freeldr/freeldr/freeldr_base64k.rbuild +++ b/reactos/boot/freeldr/freeldr/freeldr_base64k.rbuild @@ -12,6 +12,7 @@ i386cpu.S i386idt.S i386pnp.S + i386pxe.S i386trap.S int386.S linux.S diff --git a/reactos/boot/freeldr/freeldr/fs/fs.c b/reactos/boot/freeldr/freeldr/fs/fs.c index eb23215f789..13ecf5ce38d 100644 --- a/reactos/boot/freeldr/freeldr/fs/fs.c +++ b/reactos/boot/freeldr/freeldr/fs/fs.c @@ -338,6 +338,10 @@ LONG ArcOpen(CHAR* Path, OPENMODE OpenMode, ULONG* FileId) FileData[DeviceId].FileFuncTable = NtfsMount(DeviceId); if (!FileData[DeviceId].FileFuncTable) FileData[DeviceId].FileFuncTable = Ext2Mount(DeviceId); +#endif +#ifdef _M_IX86 + if (!FileData[DeviceId].FileFuncTable) + FileData[DeviceId].FileFuncTable = PxeMount(DeviceId); #endif if (!FileData[DeviceId].FileFuncTable) { diff --git a/reactos/boot/freeldr/freeldr/fs/pxe.c b/reactos/boot/freeldr/freeldr/fs/pxe.c new file mode 100644 index 00000000000..1e7f3b5c6b9 --- /dev/null +++ b/reactos/boot/freeldr/freeldr/fs/pxe.c @@ -0,0 +1,362 @@ +/* + * FreeLoader + * Copyright (C) 2011 Herv Poussineau + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include + +#define NDEBUG +#include + +#define NO_FILE ((ULONG)-1) + +static IP4 _ServerIP = { 0, }; +static ULONG _OpenFile = NO_FILE; +static ULONG _FileSize = 0; +static ULONG _FilePosition = 0; +static ULONG _PacketPosition = 0; +static UCHAR _Packet[4096]; +static UCHAR* _CachedFile = NULL; +static ULONG _CachedLength = 0; + +static PPXE +FindPxeStructure(VOID) +{ + PPXE Ptr; + UCHAR Checksum; + UCHAR i; + + /* Find the '!PXE' structure */ + Ptr = (PPXE)0xA0000; + while ((ULONG)Ptr > 0x10000) + { + Ptr = (PPXE)((ULONG)Ptr - 0x10); + + /* Look for signature */ + if (memcmp(Ptr, "!PXE", 4) != 0) + continue; + + /* Check size */ + if (Ptr->StructLength != sizeof(PXE)) + continue; + + /* Check checksum */ + Checksum = 0; + for (i = 0; i < Ptr->StructLength; i++) + Checksum += *((PUCHAR)Ptr + i); + if (Checksum != 0) + continue; + + DPRINTM(DPRINT_FILESYSTEM, "!PXE structure found at %p\n", Ptr); + return Ptr; + } + + return NULL; +} + +static PPXE GetPxeStructure(VOID) +{ + static PPXE pPxe = NULL; + static BOOLEAN bPxeSearched = FALSE; + if (!bPxeSearched) + { + pPxe = FindPxeStructure(); + bPxeSearched = TRUE; + } + return pPxe; +} + +extern PXENV_EXIT PxeCallApi(UINT16 Segment, UINT16 Offset, UINT16 Service, VOID *Parameter); +BOOLEAN CallPxe(UINT16 Service, PVOID Parameter) +{ + PPXE pxe; + PXENV_EXIT exit; + + pxe = GetPxeStructure(); + if (!pxe) + return FALSE; + + if (Service != PXENV_TFTP_READ) + { + // HACK: this delay shouldn't be necessary + KeStallExecutionProcessor(100 * 1000); // 100 ms + DPRINTM(DPRINT_FILESYSTEM, "PxeCall(0x%x, %p)\n", Service, Parameter); + } + + exit = PxeCallApi(pxe->EntryPointSP.segment, pxe->EntryPointSP.offset, Service, Parameter); + if (exit != PXENV_EXIT_SUCCESS) + { + DPRINTM(DPRINT_FILESYSTEM, "PxeCall(0x%x, %p) failed with exit=%d status=0x%x\n", + Service, Parameter, exit, *(PXENV_STATUS*)Parameter); + return FALSE; + } + if (*(PXENV_STATUS*)Parameter != PXENV_STATUS_SUCCESS) + { + DPRINTM(DPRINT_FILESYSTEM, "PxeCall(0x%x, %p) succeeded, but returned error status 0x%x\n", + Service, Parameter, *(PXENV_STATUS*)Parameter); + return FALSE; + } + return TRUE; +} + +static LONG PxeClose(ULONG FileId) +{ + t_PXENV_TFTP_CLOSE closeData; + + if (_OpenFile == NO_FILE || FileId != _OpenFile) + return EBADF; + + RtlZeroMemory(&closeData, sizeof(closeData)); + if (!CallPxe(PXENV_TFTP_CLOSE, &closeData)) + return EIO; + + _OpenFile = NO_FILE; + if (_CachedFile) + { + MmHeapFree(_CachedFile); + _CachedFile = NULL; + } + return ESUCCESS; +} + +static LONG PxeGetFileInformation(ULONG FileId, FILEINFORMATION* Information) +{ + if (_OpenFile == NO_FILE || FileId != _OpenFile) + return EBADF; + + RtlZeroMemory(Information, sizeof(FILEINFORMATION)); + Information->EndingAddress.LowPart = _FileSize; + Information->CurrentAddress.LowPart = _FilePosition; + + return ESUCCESS; +} + +static LONG PxeOpen(CHAR* Path, OPENMODE OpenMode, ULONG* FileId) +{ + t_PXENV_TFTP_GET_FSIZE sizeData; + t_PXENV_TFTP_OPEN openData; + + if (_OpenFile != NO_FILE) + return EIO; + if (OpenMode != OpenReadOnly) + return EACCES; + + RtlZeroMemory(&sizeData, sizeof(sizeData)); + sizeData.ServerIPAddress = _ServerIP; + strncpy((CHAR*)sizeData.FileName, Path, sizeof(sizeData.FileName)); + if (!CallPxe(PXENV_TFTP_GET_FSIZE, &sizeData)) + return EIO; + _FileSize = sizeData.FileSize; + if (_FileSize < 1024 * 1024) + { + _CachedFile = MmHeapAlloc(_FileSize); + // Don't check for allocation failure, we support _CachedFile = NULL + } + _CachedLength = 0; + + RtlZeroMemory(&openData, sizeof(openData)); + openData.ServerIPAddress = _ServerIP; + strncpy((CHAR*)openData.FileName, Path, sizeof(openData.FileName)); + openData.PacketSize = sizeof(_Packet); + + if (!CallPxe(PXENV_TFTP_OPEN, &openData)) + { + if (_CachedFile) + { + MmHeapFree(_CachedFile); + _CachedFile = NULL; + } + return ENOENT; + } + + _FilePosition = 0; + _PacketPosition = 0; + + _OpenFile = *FileId; + return ESUCCESS; +} + +static LONG PxeRead(ULONG FileId, VOID* Buffer, ULONG N, ULONG* Count) +{ + t_PXENV_TFTP_READ readData; + ULONG i; + + *Count = 0; + + if (_OpenFile == NO_FILE || FileId != _OpenFile) + return EBADF; + + RtlZeroMemory(&readData, sizeof(readData)); + readData.Buffer.segment = ((UINT32)_Packet & 0xf0000) / 16; + readData.Buffer.offset = (UINT32)_Packet & 0xffff; + + // Get new packets as required + while (N > 0) + { + if (N < _CachedLength - _FilePosition) + i = N; + else + i = _CachedLength - _FilePosition; + if (_CachedFile) + RtlCopyMemory(Buffer, _CachedFile + _FilePosition, i); + else + RtlCopyMemory(Buffer, _Packet + _FilePosition - _PacketPosition, i); + _FilePosition += i; + Buffer = (UCHAR*)Buffer + i; + *Count += i; + N -= i; + if (N == 0) + break; + + if (!CallPxe(PXENV_TFTP_READ, &readData)) + return EIO; + if (_CachedFile) + RtlCopyMemory(_CachedFile + _CachedLength, _Packet, readData.BufferSize); + _PacketPosition = _CachedLength; + _CachedLength += readData.BufferSize; + } + + return ESUCCESS; +} + +static LONG PxeSeek(ULONG FileId, LARGE_INTEGER* Position, SEEKMODE SeekMode) +{ + t_PXENV_TFTP_READ readData; + + if (_OpenFile == NO_FILE || FileId != _OpenFile) + return EBADF; + + if (Position->HighPart != 0 || SeekMode != SeekAbsolute) + return EINVAL; + + if (!_CachedFile && Position->LowPart < _FilePosition) + // We don't support backward seek without caching + return EINVAL; + + RtlZeroMemory(&readData, sizeof(readData)); + readData.Buffer.segment = ((UINT32)_Packet & 0xf0000) / 16; + readData.Buffer.offset = (UINT32)_Packet & 0xffff; + + // Get new packets as required + while (Position->LowPart > _CachedLength) + { + if (!CallPxe(PXENV_TFTP_READ, &readData)) + return EIO; + if (_CachedFile) + { + RtlCopyMemory(_CachedFile + _CachedLength, _Packet, readData.BufferSize); + } + _PacketPosition = _CachedLength; + _CachedLength += readData.BufferSize; + } + + _FilePosition = Position->LowPart; + return ESUCCESS; +} + +static const DEVVTBL PxeVtbl = { + PxeClose, + PxeGetFileInformation, + PxeOpen, + PxeRead, + PxeSeek, +}; + +const DEVVTBL* PxeMount(ULONG DeviceId) +{ + if (GetPxeStructure() == NULL) + return NULL; + return &PxeVtbl; +} + +static LONG PxeDiskClose(ULONG FileId) +{ + // Nothing to do + return ESUCCESS; +} + +static LONG PxeDiskGetFileInformation(ULONG FileId, FILEINFORMATION* Information) +{ + // Not implemented + return EINVAL; +} + +static LONG PxeDiskOpen(CHAR* Path, OPENMODE OpenMode, ULONG* FileId) +{ + // Nothing to do + return ESUCCESS; +} + +static LONG PxeDiskRead(ULONG FileId, VOID* Buffer, ULONG N, ULONG* Count) +{ + // Not implemented + return EINVAL; +} + +static LONG PxeDiskSeek(ULONG FileId, LARGE_INTEGER* Position, SEEKMODE SeekMode) +{ + // Not implemented + return EINVAL; +} + +static const DEVVTBL PxeDiskVtbl = { + PxeDiskClose, + PxeDiskGetFileInformation, + PxeDiskOpen, + PxeDiskRead, + PxeDiskSeek, +}; + +static BOOLEAN GetCachedInfo(VOID) +{ + t_PXENV_GET_CACHED_INFO Data; + BOOLEAN res; + UCHAR* Packet; + + RtlZeroMemory(&Data, sizeof(Data)); + Data.PacketType = PXENV_PACKET_TYPE_CACHED_REPLY; + + res = CallPxe(PXENV_GET_CACHED_INFO, &Data); + if (!res) + return FALSE; + if (Data.BufferSize < 36) + return FALSE; + Packet = (UCHAR*)((UINT32)(Data.Buffer.segment << 4) + Data.Buffer.offset); + RtlCopyMemory(&_ServerIP, Packet + 20, sizeof(IP4)); + return TRUE; +} + +BOOLEAN PxeInit(VOID) +{ + static BOOLEAN Initialized = FALSE; + static BOOLEAN Status = FALSE; + + // Do initialization only once + if (Initialized) + return Status; + Initialized = TRUE; + + // Check if PXE is available + if (GetPxeStructure() && GetCachedInfo()) + { + FsRegisterDevice("net(0)", &PxeDiskVtbl); + Status = TRUE; + } + + return Status; +} + diff --git a/reactos/boot/freeldr/freeldr/include/arch/i386/hardware.h b/reactos/boot/freeldr/freeldr/include/arch/i386/hardware.h index c97ba88e9b7..5974067cd2b 100644 --- a/reactos/boot/freeldr/freeldr/include/arch/i386/hardware.h +++ b/reactos/boot/freeldr/freeldr/include/arch/i386/hardware.h @@ -91,4 +91,7 @@ ULONG PnpBiosGetDeviceNodeCount(ULONG *NodeSize, ULONG PnpBiosGetDeviceNode(UCHAR *NodeId, UCHAR *NodeBuffer); +/* i386pxe.S */ +USHORT PxeCallApi(USHORT Segment, USHORT Offset, USHORT Service, VOID* Parameter); + /* EOF */ diff --git a/reactos/boot/freeldr/freeldr/include/arch/i386/machpc.h b/reactos/boot/freeldr/freeldr/include/arch/i386/machpc.h index 1cb40b24f10..e2af2118b8b 100644 --- a/reactos/boot/freeldr/freeldr/include/arch/i386/machpc.h +++ b/reactos/boot/freeldr/freeldr/include/arch/i386/machpc.h @@ -48,6 +48,7 @@ VOID PcPrepareForReactOS(IN BOOLEAN Setup); ULONG PcMemGetMemoryMap(PBIOS_MEMORY_MAP BiosMemoryMap, ULONG MaxMemoryMapSize); +BOOLEAN PcDiskGetBootPath(char *BootPath, unsigned Size); BOOLEAN PcDiskReadLogicalSectors(ULONG DriveNumber, ULONGLONG SectorNumber, ULONG SectorCount, PVOID Buffer); BOOLEAN PcDiskGetPartitionEntry(ULONG DriveNumber, ULONG PartitionNumber, PPARTITION_TABLE_ENTRY PartitionTableEntry); BOOLEAN PcDiskGetDriveGeometry(ULONG DriveNumber, PGEOMETRY DriveGeometry); diff --git a/reactos/boot/freeldr/freeldr/include/arch/i386/pxe.h b/reactos/boot/freeldr/freeldr/include/arch/i386/pxe.h new file mode 100644 index 00000000000..86f4cfe0bf4 --- /dev/null +++ b/reactos/boot/freeldr/freeldr/include/arch/i386/pxe.h @@ -0,0 +1,602 @@ +#ifndef _PXE_ +#define _PXE_ + +/* Basic types */ + +typedef UINT16 OFF16; +typedef UINT16 PXENV_EXIT; +typedef UINT16 PXENV_STATUS; +typedef UINT16 SEGSEL; +typedef UINT16 UDP_PORT; +typedef UINT32 ADDR32; + +#include + +#define IP_ADDR_LEN 4 +typedef union +{ + UINT32 num; + UINT8 array[IP_ADDR_LEN]; +} IP4; + +#define MAC_ADDR_LEN 16 +typedef UINT8 MAC_ADDR[MAC_ADDR_LEN]; + +typedef struct s_SEGDESC +{ + UINT16 segment_address; + UINT32 physical_address; + UINT16 seg_size; +} SEGDESC; + +typedef struct s_SEGOFF16 +{ + OFF16 offset; + SEGSEL segment; +} SEGOFF16; + +typedef struct s_PXE +{ + UINT8 Signature[4]; + UINT8 StructLength; + UINT8 StructCksum; + UINT8 StructRev; + UINT8 reserved1; + SEGOFF16 UNDIROMID; + SEGOFF16 BaseROMID; + SEGOFF16 EntryPointSP; + SEGOFF16 EntryPointESP; + SEGOFF16 StatusCallout; + UINT8 reserved2; + UINT8 SegDescCnt; + SEGSEL FirstSelector; + SEGDESC Stack; + SEGDESC UNDIData; + SEGDESC UNDICode; + SEGDESC UNDICodeWrite; + SEGDESC BC_Data; + SEGDESC BC_Code; + SEGDESC BC_CodeWrite; +} PXE, *PPXE; + +/* PXENV structures */ + +typedef struct s_PXENV_START_UNDI +{ + PXENV_STATUS Status; + UINT16 AX; + UINT16 BX; + UINT16 DX; + UINT16 DI; + UINT16 ES; +} t_PXENV_START_UNDI; + +typedef struct s_PXENV_UNDI_STARTUP +{ + PXENV_STATUS Status; +} t_PXENV_UNDI_STARTUP; + +typedef struct s_PXENV_UNDI_CLEANUP +{ + PXENV_STATUS Status; +} t_PXENV_UNDI_CLEANUP; + +typedef struct s_PXENV_UNDI_INITIALIZE +{ + PXENV_STATUS Status; + ADDR32 ProtocolIni; + UINT8 reserved[8]; +} t_PXENV_UNDI_INITIALIZE; + +#define MAXNUM_MCADDR 8 +typedef struct s_PXENV_UNDI_MCAST_ADDRESS +{ + UINT16 MCastAddrCount; + MAC_ADDR McastAddr[MAXNUM_MCADDR]; +} t_PXENV_UNDI_MCAST_ADDRESS; + +typedef struct s_PXENV_UNDI_RESET +{ + PXENV_STATUS Status; + t_PXENV_UNDI_MCAST_ADDRESS R_Mcast_Buf; +} t_PXENV_UNDI_RESET; + +typedef struct s_PXENV_UNDI_SHUTDOWN +{ + PXENV_STATUS Status; +} t_PXENV_UNDI_SHUTDOWN; + +typedef struct s_PXENV_UNDI_OPEN +{ + PXENV_STATUS Status; + UINT16 OpenFlag; + UINT16 PktFilter; +#define FLTR_DIRECTED 0x01 +#define FLTR_BRDCST 0x02 +#define FLTR_PRMSCS 0x04 +#define FLTR_SRC_RTG 0x08 + + t_PXENV_UNDI_MCAST_ADDRESS R_Mcast_Buf; +} t_PXENV_UNDI_OPEN; + +typedef struct s_PXENV_UNDI_CLOSE +{ + PXENV_STATUS Status; +} t_PXENV_UNDI_CLOSE; + +typedef struct s_PXENV_UNDI_TRANSMIT +{ + PXENV_STATUS Status; + UINT8 Protocol; +#define P_UNKNOWN 0 +#define P_IP 1 +#define P_ARP 2 +#define P_RARP 3 + + UINT8 XmitFlag; +#define XMT_DESTADDR 0x00 +#define XMT_BROADCAST 0x01 + + SEGOFF16 DestAddr; + SEGOFF16 TBD; + UINT32 Reserved[2]; +} t_PXENV_UNDI_TRANSMIT; + +#define MAX_DATA_BLKS 8 +typedef struct s_PXENV_UNDI_TBD +{ + UINT16 ImmedLength; + SEGOFF16 Xmit; + UINT16 DataBlkCount; + struct DataBlk + { + UINT8 TDPtrType; + UINT8 TDRsvdByte; + UINT8 TDDataLen; + SEGOFF16 TDDataPtr; + } DataBlock[MAX_DATA_BLKS]; +} t_PXENV_UNDI_TBD; + +typedef struct s_PXENV_UNDI_SET_MCAST_ADDRESS +{ + PXENV_STATUS Status; + t_PXENV_UNDI_MCAST_ADDRESS R_Mcast_Buf; +} t_PXENV_UNDI_SET_MCAST_ADDRESS; + +typedef struct s_PXENV_UNDI_SET_STATION_ADDRESS +{ + PXENV_STATUS Status; + MAC_ADDR StationAddress; +} t_PXENV_UNDI_SET_STATION_ADDRESS; + +typedef struct s_PXENV_UNDI_SET_PACKET_FILTER +{ + PXENV_STATUS Status; + UINT8 filter; +} t_PXENV_UNDI_SET_PACKET_FILTER; + +typedef struct s_PXENV_UNDI_GET_INFORMATION +{ + PXENV_STATUS Status; + UINT16 BaseIo; + UINT16 IntNumber; + UINT16 MaxTranUnit; + UINT16 HwType; +#define ETHER_TYPE 1 +#define EXP_ETHER_TYPE 2 +#define IEEE_TYPE 3 +#define ARCNET_TYPE 4 + + UINT16 HwAddrLen; + MAC_ADDR CurrentNodeAddress; + MAC_ADDR PermNodeAddress; + SEGSEL ROMAddress; + UINT16 RxBufCt; + UINT16 TxBufCt; +} t_PXENV_UNDI_GET_INFORMATION; + +typedef struct s_PXENV_UNDI_GET_STATISTICS +{ + PXENV_STATUS Status; + UINT32 XmtGoodFrames; + UINT32 RcvGoodFrames; + UINT32 RcvCRCErrors; + UINT32 RcvResourceErrors; +} t_PXENV_UNDI_GET_STATISTICS; + +typedef struct s_PXENV_UNDI_CLEAR_STATISTICS +{ + PXENV_STATUS Status; +} t_PXENV_UNDI_CLEAR_STATISTICS; + +typedef struct s_PXENV_UNDI_INITIATE_DIAGS +{ + PXENV_STATUS Status; +} t_PXENV_UNDI_INITIATE_DIAGS; + +typedef struct s_PXENV_UNDI_FORCE_INTERRUPT +{ + PXENV_STATUS Status; +} t_PXENV_UNDI_FORCE_INTERRUPT; + +typedef struct s_PXENV_UNDI_GET_MCAST_ADDRESS +{ + PXENV_STATUS Status; + IP4 InetAddr; + MAC_ADDR MediaAddr; +} t_PXENV_UNDI_GET_MCAST_ADDRESS; + +typedef struct s_PXENV_UNDI_GET_NIC_TYPE +{ + PXENV_STATUS Status; + UINT8 NicType; +#define PCI_NIC 2 +#define PnP_NIC 3 +#define CardBus_NIC 4 + + union + { + struct + { + UINT16 Vendor_ID; + UINT16 Dev_ID; + UINT8 Base_Class; + UINT8 Sub_Class; + UINT8 Prog_Intf; + UINT8 Rev; + UINT16 BusDevFunc; + UINT16 SubVendor_ID; + UINT16 SubDevice_ID; + } pci, cardbus; + struct + { + UINT32 EISA_Dev_ID; + UINT8 Base_Class; + UINT8 Sub_Class; + UINT8 Prog_Intf; + UINT16 CardSelNum; + } pnp; + } info; +} t_PXENV_UNDI_GET_NIC_TYPE; + +typedef struct s_PXENV_UNDI_GET_IFACE_INFO +{ + PXENV_STATUS Status; + UINT8 IfaceType[16]; + UINT32 LinkSpeed; + UINT32 ServiceFlags; + UINT32 Reserved[4]; +} t_PXENV_UNDI_GET_IFACE_INFO; + +typedef struct s_PXENV_UNDI_ISR +{ + PXENV_STATUS Status; + UINT16 FuncFlag; + UINT16 BufferLength; + UINT16 FrameLength; + UINT16 FrameHeaderLength; + SEGOFF16 Frame; + UINT8 ProtType; + UINT8 PktType; +} t_PXENV_UNDI_ISR; + +#define PXENV_UNDI_ISR_IN_START 1 +#define PXENV_UNDI_ISR_IN_PROCESS 2 +#define PXENV_UNDI_ISR_IN_GET_NEXT 3 + +/* One of these will be returned for PXENV_UNDI_ISR_IN_START */ +#define PXENV_UNDI_ISR_OUT_OURS 0 +#define PXENV_UNDI_ISR_OUT_NOT_OURS 1 + +/* One of these will be returned for PXENV_UNDI_ISR_IN_PROCESS and PXENV_UNDI_ISR_IN_GET_NEXT */ +#define PXENV_UNDI_ISR_OUT_DONE 0 +#define PXENV_UNDI_ISR_OUT_TRANSMIT 2 +#define PXENV_UNDI_ISR_OUT_RECEIVE 3 +#define PXENV_UNDI_ISR_OUT_BUSY 4 + +typedef struct s_PXENV_UNDI_GET_STATE +{ + PXENV_STATUS Status; +#define PXE_UNDI_GET_STATE_STARTED 1 +#define PXE_UNDI_GET_STATE_INITIALIZED 2 +#define PXE_UNDI_GET_STATE_OPENED 3 + UINT8 UNDIState; +} t_PXENV_UNDI_GET_STATE; + +typedef struct s_PXENV_STOP_UNDI +{ + PXENV_STATUS Status; +} t_PXENV_STOP_UNDI; + +typedef struct s_PXENV_TFTP_OPEN +{ + PXENV_STATUS Status; + IP4 ServerIPAddress; + IP4 GatewayIPAddress; + UINT8 FileName[128]; + UDP_PORT TFTPPort; + UINT16 PacketSize; +} t_PXENV_TFTP_OPEN; + +typedef struct s_PXENV_TFTP_CLOSE +{ + PXENV_STATUS Status; +} t_PXENV_TFTP_CLOSE; + +typedef struct s_PXENV_TFTP_READ +{ + PXENV_STATUS Status; + UINT16 PacketNumber; + UINT16 BufferSize; + SEGOFF16 Buffer; +} t_PXENV_TFTP_READ; + +typedef struct s_PXENV_TFTP_READ_FILE +{ + PXENV_STATUS Status; + UINT8 FileName[128]; + UINT32 BufferSize; + ADDR32 Buffer; + IP4 ServerIPAddress; + IP4 GatewayIPAddress; + IP4 McastIPAddress; + UDP_PORT TFTPClntPort; + UDP_PORT TFTPSvrPort; + UINT16 TFTPOpenTimeOut; + UINT16 TFTPReopenDelay; +} t_PXENV_TFTP_READ_FILE; + +typedef struct s_PXENV_TFTP_GET_FSIZE +{ + PXENV_STATUS Status; + IP4 ServerIPAddress; + IP4 GatewayIPAddress; + UINT8 FileName[128]; + UINT32 FileSize; +} t_PXENV_TFTP_GET_FSIZE; + +typedef struct s_PXENV_UDP_OPEN +{ + PXENV_STATUS Status; + IP4 src_ip; +} t_PXENV_UDP_OPEN; + +typedef struct s_PXENV_UDP_CLOSE +{ + PXENV_STATUS Status; +} t_PXENV_UDP_CLOSE; + +typedef struct s_PXENV_UDP_READ +{ + PXENV_STATUS Status; + IP4 ip; + IP4 dest_ip; + UDP_PORT s_port; + UDP_PORT d_port; + UINT16 buffer_size; + SEGOFF16 buffer; +} t_PXENV_UDP_READ; + +typedef struct s_PXENV_UDP_WRITE +{ + PXENV_STATUS Status; + IP4 ip; + IP4 gw; + UDP_PORT src_port; + UDP_PORT dst_port; + UINT16 buffer_size; + SEGOFF16 buffer; +} t_PXENV_UDP_WRITE; + +typedef struct s_PXENV_UNLOAD_STACK +{ + PXENV_STATUS Status; + UINT8 reserved[10]; +} t_PXENV_UNLOAD_STACK; + +typedef struct s_PXENV_GET_CACHED_INFO +{ + PXENV_STATUS Status; + UINT16 PacketType; +#define PXENV_PACKET_TYPE_DHCP_DISCOVER 1 +#define PXENV_PACKET_TYPE_DHCP_ACK 2 +#define PXENV_PACKET_TYPE_CACHED_REPLY 3 + UINT16 BufferSize; + SEGOFF16 Buffer; + UINT16 BufferLimit; +} t_PXENV_GET_CACHED_INFO; + +typedef struct s_PXENV_START_BASE +{ + PXENV_STATUS Status; +} t_PXENV_START_BASE; + +typedef struct s_PXENV_STOP_BASE +{ + PXENV_STATUS Status; +} t_PXENV_STOP_BASE; + +typedef struct bootph +{ + UINT8 opcode; +#define BOOTP_REQ 1 +#define BOOTP_REP 2 + + UINT8 Hardware; + UINT8 Hardlen; + UINT8 Gatehops; + UINT32 ident; + UINT16 seconds; + UINT16 Flags; +#define BOOTP_BCAST 0x8000 + + IP4 cip; + IP4 yip; + IP4 sip; + IP4 gip; + MAC_ADDR CAddr; + UINT8 Sname[64]; + UINT8 bootfile[128]; + union + { +#define BOOTP_DHCPVEND 1024 /* DHCP extended vendor field size */ + UINT8 d[BOOTP_DHCPVEND]; + struct + { + UINT8 magic[4]; +#define VM_RFC1048 0x63825363 + UINT32 flags; + UINT8 pad[56]; + } v; + } vendor; +} BOOTPLAYER; + +#include + +/* Exit codes returned in AX by a PXENV API service */ +#define PXENV_EXIT_SUCCESS 0x0000 +#define PXENV_EXIT_FAILURE 0x0001 + +/* Generic API status & error codes that are reported by the loader */ +#define PXENV_STATUS_SUCCESS 0x00 +#define PXENV_STATUS_FAILURE 0x01 /* General failure */ +#define PXENV_STATUS_BAD_FUNC 0x02 /* Invalid function number */ +#define PXENV_STATUS_UNSUPPORTED 0x03 /* Function is not yet supported */ +#define PXENV_STATUS_KEEP_UNDI 0x04 /* UNDI must not be unloaded from base memory */ +#define PXENV_STATUS_KEEP_ALL 0x05 +#define PXENV_STATUS_OUT_OF_RESOURCES 0x06 /* Base code and UNDI must not be unloaded from base memory */ + +/* ARP errors (0x10 to 0x1f) */ +#define PXENV_STATUS_ARP_TIMEOUT 0x11 + +/* Base code state errors */ +#define PXENV_STATUS_UDP_CLOSED 0x18 +#define PXENV_STATUS_UDP_OPEN 0x19 +#define PXENV_STATUS_TFTP_CLOSED 0x1a +#define PXENV_STATUS_TFTP_OPEN 0x1b + +/* BIOS/system errors (0x20 to 0x2f) */ +#define PXENV_STATUS_MCOPY_PROBLEM 0x20 +#define PXENV_STATUS_BIS_INTEGRITY_FAILURE 0x21 +#define PXENV_STATUS_BIS_VALIDATE_FAILURE 0x22 +#define PXENV_STATUS_BIS_INIT_FAILURE 0x23 +#define PXENV_STATUS_BIS_SHUTDOWN_FAILURE 0x24 +#define PXENV_STATUS_BIS_GBOA_FAILURE 0x25 +#define PXENV_STATUS_BIS_FREE_FAILURE 0x26 +#define PXENV_STATUS_BIS_GSI_FAILURE 0x27 +#define PXENV_STATUS_BIS_BAD_CKSUM 0x28 + +/* TFTP/MTFTP errors (0x30 to 0x3f) */ +#define PXENV_STATUS_TFTP_CANNOT_ARP_ADDRESS 0x30 +#define PXENV_STATUS_TFTP_OPEN_TIMEOUT 0x32 +#define PXENV_STATUS_TFTP_UNKNOWN_OPCODE 0x33 +#define PXENV_STATUS_TFTP_READ_TIMEOUT 0x35 +#define PXENV_STATUS_TFTP_ERROR_OPCODE 0x36 +#define PXENV_STATUS_TFTP_CANNOT_OPEN_CONNECTION 0x38 +#define PXENV_STATUS_TFTP_CANNOT_READ_FROM_CONNECTION 0x39 +#define PXENV_STATUS_TFTP_TOO_MANY_PACKAGES 0x3a +#define PXENV_STATUS_TFTP_FILE_NOT_FOUND 0x3b +#define PXENV_STATUS_TFTP_ACCESS_VIOLATION 0x3c +#define PXENV_STATUS_TFTP_NO_MCAST_ADDRESS 0x3d +#define PXENV_STATUS_TFTP_NO_FILESIZE 0x3e +#define PXENV_STATUS_TFTP_INVALID_PACKET_SIZE 0x3f + +/* Reserved errors (0x40 to 0x4f) */ + +/* DHCP/BOOTP errors (0x50 to 0x5f) */ +#define PXENV_STATUS_DHCP_TIMEOUT 0x51 +#define PXENV_STATUS_DHCP_NO_IP_ADDRESS 0x52 +#define PXENV_STATUS_DHCP_NO_BOOTFILE_NAME 0x53 +#define PXENV_STATUS_DHCP_BAD_IP_ADDRESS 0x54 + +/* Driver errors (0x60 to 0x6f) */ +/* These errors are for UNDI compatible NIC drivers */ +#define PXENV_STATUS_UNDI_INVALID_FUNCTION 0x60 +#define PXENV_STATUS_UNDI_MEDIATEST_FAILED 0x61 +#define PXENV_STATUS_UNDI_CANNOT_INIT_NIC_FOR_MCAST 0x62 +#define PXENV_STATUS_UNDI_CANNOT_INITIALIZE_NIC 0x63 +#define PXENV_STATUS_UNDI_CANNOT_INITIALIZE_PHY 0x64 +#define PXENV_STATUS_UNDI_CANNOT_READ_CONFIG_DATA 0x65 +#define PXENV_STATUS_UNDI_CANNOT_READ_INIT_DATA 0x66 +#define PXENV_STATUS_UNDI_BAD_MAC_ADDRESS 0x67 +#define PXENV_STATUS_UNDI_BAD_EEPROM_CHECKSUM 0x68 +#define PXENV_STATUS_UNDI_ERROR_SETTING_ISR 0x69 +#define PXENV_STATUS_UNDI_INVALID_STATE 0x6a +#define PXENV_STATUS_UNDI_TRANSMIT_ERROR 0x6b +#define PXENV_STATUS_UNDI_INVALID_PARAMETER 0x6c + +/* ROM and NBP bootstrap errors (0x70 to 0x7f) */ +#define PXENV_STATUS_BSTRAP_PROMPT_MENU 0x74 +#define PXENV_STATUS_BSTRAP_MCAST_ADDR 0x76 +#define PXENV_STATUS_BSTRAP_MISSING_LIST 0x77 +#define PXENV_STATUS_BSTRAP_NO_RESPONSE 0x78 +#define PXENV_STATUS_BSTRAP_FILE_TOO_BIG 0x79 + +/* Environment NBP errors (0x80 to 0x8f) */ + +/* Reserved errors (0x90 to 0x9f) */ + +/* Misc. errors (0xa0 to 0xaf) */ +#define PXENV_STATUS_BINL_CANCELED_BY_KEYSTROKE 0xa0 +#define PXENV_STATUS_BINL_NO_PXE_SERVER 0xa1 +#define PXENV_STATUS_NOT_AVAILABLE_IN_PMODE 0xa2 +#define PXENV_STATUS_NOT_AVAILABLE_IN_RMODE 0xa3 + +/* BUSD errors (0xb0 to 0xbf) */ +#define PXENV_STATUS_BUSD_DEVICE_NOT_SUPPORTED 0xb0 + +/* Loader errors (0xc0 to 0xcf) */ +#define PXENV_STATUS_LOADER_NO_FREE_BASE_MEMORY 0xc0 +#define PXENV_STATUS_LOADER_NO_BC_ROMID 0xc1 +#define PXENV_STATUS_LOADER_BAD_BC_ROMID 0xc2 +#define PXENV_STATUS_LOADER_BAD_BC_RUNTIME_IMAGE 0xc3 +#define PXENV_STATUS_LOADER_NO_UNDI_ROMID 0xc4 +#define PXENV_STATUS_LOADER_BAD_UNDI_ROMID 0xc5 +#define PXENV_STATUS_LOADER_BAD_UNDI_DRIVER_IMAGE 0xc6 +#define PXENV_STATUS_LOADER_NO_PXE_STRUCT 0xc8 +#define PXENV_STATUS_LOADER_NO_PXENV_STRUCT 0xc9 +#define PXENV_STATUS_LOADER_UNDI_START 0xca +#define PXENV_STATUS_LOADER_BC_START 0xcb + +/* Vendor errors (0xd0 to 0xff) */ + +/* PXENV API services */ +#define PXENV_START_UNDI 0x00 +#define PXENV_UNDI_STARTUP 0x01 +#define PXENV_UNDI_CLEANUP 0x02 +#define PXENV_UNDI_INITIALIZE 0x03 +#define PXENV_UNDI_RESET_ADAPTER 0x04 +#define PXENV_UNDI_SHUTDOWN 0x05 +#define PXENV_UNDI_OPEN 0x06 +#define PXENV_UNDI_CLOSE 0x07 +#define PXENV_UNDI_TRANSMIT 0x08 +#define PXENV_UNDI_SET_MCAST_ADDRESS 0x09 +#define PXENV_UNDI_SET_STATION_ADDRESS 0x0a +#define PXENV_UNDI_SET_PACKET_FILTER 0x0b +#define PXENV_UNDI_GET_INFORMATION 0x0c +#define PXENV_UNDI_GET_STATISTICS 0x0d +#define PXENV_UNDI_CLEAR_STATISTICS 0x0e +#define PXENV_UNDI_INITIATE_DIAGS 0x0f +#define PXENV_UNDI_FORCE_INTERRUPT 0x10 +#define PXENV_UNDI_GET_MCAST_ADDRESS 0x11 +#define PXENV_UNDI_GET_NIC_TYPE 0x12 +#define PXENV_UNDI_GET_IFACE_INFO 0x13 +#define PXENV_UNDI_ISR 0x14 +#define PXENV_UNDI_GET_STATE 0x15 +#define PXENV_STOP_UNDI 0x15 +#define PXENV_TFTP_OPEN 0x20 +#define PXENV_TFTP_CLOSE 0x21 +#define PXENV_TFTP_READ 0x22 +#define PXENV_TFTP_READ_FILE 0x23 +#define PXENV_TFTP_GET_FSIZE 0x25 +#define PXENV_UDP_OPEN 0x30 +#define PXENV_UDP_CLOSE 0x31 +#define PXENV_UDP_READ 0x32 +#define PXENV_UDP_WRITE 0x33 +#define PXENV_UNLOAD_STACK 0x70 +#define PXENV_GET_CACHED_INFO 0x71 +#define PXENV_RESTART_TFTP 0x73 +#define PXENV_START_BASE 0x75 +#define PXENV_STOP_BASE 0x76 + +#endif diff --git a/reactos/boot/freeldr/freeldr/include/freeldr.h b/reactos/boot/freeldr/freeldr/include/freeldr.h index eaea923c365..694c9c764a9 100644 --- a/reactos/boot/freeldr/freeldr/include/freeldr.h +++ b/reactos/boot/freeldr/freeldr/include/freeldr.h @@ -69,6 +69,7 @@ #include #include #include +#include /* ui support */ #include #include @@ -83,6 +84,7 @@ #include #include #include +#include #include #elif defined(_M_PPC) #include diff --git a/reactos/boot/freeldr/freeldr/include/fs/pxe.h b/reactos/boot/freeldr/freeldr/include/fs/pxe.h new file mode 100644 index 00000000000..5d2cc2abc42 --- /dev/null +++ b/reactos/boot/freeldr/freeldr/include/fs/pxe.h @@ -0,0 +1,27 @@ +/* + * FreeLoader PXE support + * Copyright (C) 2011 Herv Poussineau + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#ifndef __PXE_H +#define __PXE_H + +const DEVVTBL* PxeMount(ULONG DeviceId); + +BOOLEAN PxeInit(VOID); + +#endif /* #defined __PXE_H */ From 4f0424990bb8be7e93a0d906f575c7b055f93d73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herv=C3=A9=20Poussineau?= Date: Sun, 1 May 2011 08:17:26 +0000 Subject: [PATCH 256/317] Fix compilation svn path=/trunk/; revision=51518 --- reactos/boot/freeldr/freeldr/arch/i386/i386pxe.S | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/boot/freeldr/freeldr/arch/i386/i386pxe.S b/reactos/boot/freeldr/freeldr/arch/i386/i386pxe.S index b4ec7719ed4..71442135f36 100644 --- a/reactos/boot/freeldr/freeldr/arch/i386/i386pxe.S +++ b/reactos/boot/freeldr/freeldr/arch/i386/i386pxe.S @@ -34,9 +34,9 @@ _pxe_function: _pxe_entry_point: .long 0 _pxe_buffer_segment: - .word0 + .word 0 _pxe_buffer_offset: - .word0 + .word 0 _pxe_result: .word 0 From 5f8889d8b2105194d5d6d5c9ae9adab9f225c2b8 Mon Sep 17 00:00:00 2001 From: Giannis Adamopoulos Date: Sun, 1 May 2011 09:20:15 +0000 Subject: [PATCH 257/317] [win32k] - Do not try to initialize thread info in UserGetWindowObject. Do it in thread callout. Removing this hack is needed in order to use UserPostMessage in ProcessCallout when a process is terminating - Notify winlogon that the shell is exiting in order to restart the shell svn path=/trunk/; revision=51519 --- reactos/include/ndk/psfuncs.h | 7 +++++++ reactos/include/reactos/undocuser.h | 1 + reactos/include/reactos/win32k/ntuser.h | 2 ++ .../subsystems/win32/win32k/main/dllmain.c | 20 ++++++++++++++++++- .../subsystems/win32/win32k/ntuser/window.c | 19 ++++++------------ 5 files changed, 35 insertions(+), 14 deletions(-) diff --git a/reactos/include/ndk/psfuncs.h b/reactos/include/ndk/psfuncs.h index 19c6678ccfa..a32fc3b036c 100644 --- a/reactos/include/ndk/psfuncs.h +++ b/reactos/include/ndk/psfuncs.h @@ -185,6 +185,13 @@ PsGetProcessInheritedFromUniqueProcessId( IN PEPROCESS Process ); +NTKERNELAPI +NTSTATUS +NTAPI +PsGetProcessExitStatus( + PEPROCESS Process +); + // // Quota Functions // diff --git a/reactos/include/reactos/undocuser.h b/reactos/include/reactos/undocuser.h index 06312d7d34e..0fe8a816c1a 100644 --- a/reactos/include/reactos/undocuser.h +++ b/reactos/include/reactos/undocuser.h @@ -77,6 +77,7 @@ // // Definitions used by WM_LOGONNOTIFY // +#define LN_SHELL_EXITED 0x2 #define LN_START_TASK_MANAGER 0x4 #define LN_LOCK_WORKSTATION 0x5 #define LN_UNLOCK_WORKSTATION 0x6 diff --git a/reactos/include/reactos/win32k/ntuser.h b/reactos/include/reactos/win32k/ntuser.h index 71ea1772fc6..432390a5fc7 100644 --- a/reactos/include/reactos/win32k/ntuser.h +++ b/reactos/include/reactos/win32k/ntuser.h @@ -65,6 +65,8 @@ typedef struct _DESKTOPINFO HWND hProgmanWindow; HWND hShellWindow; + PPROCESSINFO ppiShellProcess; + union { UINT Dummy; diff --git a/reactos/subsystems/win32/win32k/main/dllmain.c b/reactos/subsystems/win32/win32k/main/dllmain.c index 21b18029222..caa5ee314ed 100644 --- a/reactos/subsystems/win32/win32k/main/dllmain.c +++ b/reactos/subsystems/win32/win32k/main/dllmain.c @@ -128,6 +128,23 @@ Win32kProcessCallback(struct _EPROCESS *Process, DPRINT("Destroying W32 process PID:%d at IRQ level: %lu\n", Process->UniqueProcessId, KeGetCurrentIrql()); Win32Process->W32PF_flags |= W32PF_TERMINATED; + /* Notify logon application to restart shell if needed */ + if(Win32Process->rpdeskStartup->pDeskInfo) + { + if(Win32Process->rpdeskStartup->pDeskInfo->ppiShellProcess == Win32Process) + { + DWORD ExitCode; + ExitCode = PsGetProcessExitStatus(Win32Process->peProcess); + + DPRINT1("Shell process is exiting (%d)\n", ExitCode); + + UserPostMessage(hwndSAS, + WM_LOGONNOTIFY, + LN_SHELL_EXITED, + ExitCode); + } + } + if (Win32Process->InputIdleEvent) { EngFreeMem((PVOID)Win32Process->InputIdleEvent); @@ -243,6 +260,7 @@ Win32kThreadCallback(struct _ETHREAD *Thread, } Win32Thread->MessageQueue = MsqCreateMessageQueue(Thread); Win32Thread->KeyboardLayout = W32kGetDefaultKeyLayout(); + Win32Thread->pEThread = Thread; /* HAAAAAAAACK! This should go to Win32kProcessCallback */ if(Win32Thread->ppi->hdeskStartup == NULL) @@ -322,7 +340,7 @@ Win32kThreadCallback(struct _ETHREAD *Thread, // System thread running! Now SendMessage should be okay. Win32Thread->pcti = &Win32Thread->cti; } - Win32Thread->pEThread = Thread; + GetW32ThreadInfo(); } else { diff --git a/reactos/subsystems/win32/win32k/ntuser/window.c b/reactos/subsystems/win32/win32k/ntuser/window.c index 8bb6b56277f..11ea4669a56 100644 --- a/reactos/subsystems/win32/win32k/ntuser/window.c +++ b/reactos/subsystems/win32/win32k/ntuser/window.c @@ -101,18 +101,7 @@ PWND FASTCALL IntGetWindowObject(HWND hWnd) /* temp hack */ PWND FASTCALL UserGetWindowObject(HWND hWnd) { - PTHREADINFO ti; - PWND Window; - - if (PsGetCurrentProcess() != PsInitialSystemProcess) - { - ti = GetW32ThreadInfo(); - if (ti == NULL) - { - EngSetLastError(ERROR_ACCESS_DENIED); - return NULL; - } - } + PWND Window; if (!hWnd) { @@ -3308,7 +3297,11 @@ NtUserSetShellWindowEx(HWND hwndShell, HWND hwndListView) WinStaObject->ShellListView = hwndListView; ti = GetW32ThreadInfo(); - if (ti->pDeskInfo) ti->pDeskInfo->hShellWindow = hwndShell; + if (ti->pDeskInfo) + { + ti->pDeskInfo->hShellWindow = hwndShell; + ti->pDeskInfo->ppiShellProcess = ti->ppi; + } UserDerefObjectCo(WndShell); From 2aaa0b9e08d9593debe1e45413688d0ae13cd0ab Mon Sep 17 00:00:00 2001 From: Giannis Adamopoulos Date: Sun, 1 May 2011 09:59:01 +0000 Subject: [PATCH 258/317] [winlogon] - Implement restarting the shell in case of a failure. kudos to hpoussin svn path=/trunk/; revision=51520 --- reactos/base/system/winlogon/sas.c | 71 +++++++++++++++++++++--------- 1 file changed, 50 insertions(+), 21 deletions(-) diff --git a/reactos/base/system/winlogon/sas.c b/reactos/base/system/winlogon/sas.c index d394439b191..11035c16d4e 100644 --- a/reactos/base/system/winlogon/sas.c +++ b/reactos/base/system/winlogon/sas.c @@ -55,6 +55,37 @@ StartTaskManager( return ret; } +static BOOL +StartUserShell( + IN OUT PWLSESSION Session) +{ + LPVOID lpEnvironment = NULL; + BOOLEAN Old; + BOOL ret; + + /* Create environment block for the user */ + if (!CreateEnvironmentBlock(&lpEnvironment, Session->UserToken, TRUE)) + { + WARN("WL: CreateEnvironmentBlock() failed\n"); + return FALSE; + } + + /* Get privilege */ + /* FIXME: who should do it? winlogon or gina? */ + /* FIXME: reverting to lower privileges after creating user shell? */ + RtlAdjustPrivilege(SE_ASSIGNPRIMARYTOKEN_PRIVILEGE, TRUE, FALSE, &Old); + + ret = Session->Gina.Functions.WlxActivateUserShell( + Session->Gina.Context, + L"Default", + NULL, /* FIXME */ + lpEnvironment); + + DestroyEnvironmentBlock(lpEnvironment); + return ret; +} + + BOOL SetDefaultLanguage( IN BOOL UserProfile) @@ -167,8 +198,6 @@ HandleLogon( IN OUT PWLSESSION Session) { PROFILEINFOW ProfileInfo; - LPVOID lpEnvironment = NULL; - BOOLEAN Old; BOOL ret = FALSE; /* Loading personal settings */ @@ -211,13 +240,6 @@ HandleLogon( goto cleanup; } - /* Create environment block for the user */ - if (!CreateEnvironmentBlock(&lpEnvironment, Session->UserToken, TRUE)) - { - WARN("WL: CreateEnvironmentBlock() failed\n"); - goto cleanup; - } - DisplayStatusMessage(Session, Session->WinlogonDesktop, IDS_APPLYINGYOURPERSONALSETTINGS); UpdatePerUserSystemParameters(0, TRUE); @@ -228,16 +250,7 @@ HandleLogon( goto cleanup; } - /* Get privilege */ - /* FIXME: who should do it? winlogon or gina? */ - /* FIXME: reverting to lower privileges after creating user shell? */ - RtlAdjustPrivilege(SE_ASSIGNPRIMARYTOKEN_PRIVILEGE, TRUE, FALSE, &Old); - - if (!Session->Gina.Functions.WlxActivateUserShell( - Session->Gina.Context, - L"Default", - NULL, /* FIXME */ - lpEnvironment)) + if (!StartUserShell(Session)) { //WCHAR StatusMsg[256]; WARN("WL: WlxActivateUserShell() failed\n"); @@ -264,8 +277,6 @@ cleanup: { UnloadUserProfile(WLSession->UserToken, ProfileInfo.hProfile); } - if (lpEnvironment) - DestroyEnvironmentBlock(lpEnvironment); RemoveStatusMessage(Session); if (!ret) { @@ -942,12 +953,30 @@ SASWindowProc( { return HandleMessageBeep(lParam); } + case LN_SHELL_EXITED: + { + /* lParam is the exit code */ + if(lParam != 1) + { + SetTimer(hwndDlg, 1, 1000, NULL); + } + break; + } default: { ERR("WM_LOGONNOTIFY case %d is unimplemented\n", wParam); } } return 0; + } + case WM_TIMER: + { + if (wParam == 1) + { + KillTimer(hwndDlg, 1); + StartUserShell(Session); + } + break; } case WLX_WM_SAS: { From 0f43b7af514aaf1e7fe73530a4c820630cb04e61 Mon Sep 17 00:00:00 2001 From: James Tabor Date: Sun, 1 May 2011 11:51:22 +0000 Subject: [PATCH 259/317] [Win32k] - Patch by Erich HooverSend: WM_SYSKEYDOWN and WM_SYSKEYUP when the 'F10' key is used. See wine bug 19383 and http://www.winehq.org/pipermail/wine-patches/2009-October/079871.html for details. - Update key state for all hardware postings. svn path=/trunk/; revision=51521 --- reactos/subsystems/win32/win32k/ntuser/input.c | 6 ++++-- reactos/subsystems/win32/win32k/ntuser/msgqueue.c | 3 +-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/reactos/subsystems/win32/win32k/ntuser/input.c b/reactos/subsystems/win32/win32k/ntuser/input.c index 5c7a108e33f..604ede7cabc 100644 --- a/reactos/subsystems/win32/win32k/ntuser/input.c +++ b/reactos/subsystems/win32/win32k/ntuser/input.c @@ -1297,9 +1297,10 @@ IntKeyboardInput(KEYBDINPUT *ki, BOOL Injected) if (ki->dwFlags & KEYEVENTF_KEYUP) { Msg.message = WM_KEYUP; - if ((gQueueKeyStateTable[VK_MENU] & 0x80) && + if (((gQueueKeyStateTable[VK_MENU] & 0x80) && ((wVkStripped == VK_MENU) || (wVkStripped == VK_CONTROL) || !(gQueueKeyStateTable[VK_CONTROL] & 0x80))) + || (wVkStripped == VK_F10)) { if( TrackSysKey == VK_MENU || /* -down/-up sequence */ (wVkStripped != VK_MENU)) /* -down...-up */ @@ -1311,8 +1312,9 @@ IntKeyboardInput(KEYBDINPUT *ki, BOOL Injected) else { Msg.message = WM_KEYDOWN; - if ((gQueueKeyStateTable[VK_MENU] & 0x80 || wVkStripped == VK_MENU) && + if (((gQueueKeyStateTable[VK_MENU] & 0x80 || wVkStripped == VK_MENU) && !(gQueueKeyStateTable[VK_CONTROL] & 0x80 || wVkStripped == VK_CONTROL)) + || (wVkStripped == VK_F10)) { Msg.message = WM_SYSKEYDOWN; TrackSysKey = wVkStripped; diff --git a/reactos/subsystems/win32/win32k/ntuser/msgqueue.c b/reactos/subsystems/win32/win32k/ntuser/msgqueue.c index 36aa74c3bec..2c754cdcbbc 100644 --- a/reactos/subsystems/win32/win32k/ntuser/msgqueue.c +++ b/reactos/subsystems/win32/win32k/ntuser/msgqueue.c @@ -1006,8 +1006,7 @@ MsqPostMessage(PUSER_MESSAGE_QUEUE MessageQueue, MSG* Msg, BOOLEAN HardwareMessa InsertTailList(&MessageQueue->HardwareMessagesListHead, &Message->ListEntry); - if (MessageBits & QS_KEY) - update_input_key_state( MessageQueue, Msg ); + update_input_key_state( MessageQueue, Msg ); } Message->QS_Flags = MessageBits; From 8311cfe2171fd5b9d231bfe03656bb99e33711d6 Mon Sep 17 00:00:00 2001 From: Rafal Harabien Date: Sun, 1 May 2011 12:49:38 +0000 Subject: [PATCH 260/317] [COMCTL32] * Sync Rebar to Wine 1.3.19 * Properly support WM_SYSCOLORCHANGE in Rebars * Update comctl32_ros.diff svn path=/trunk/; revision=51522 --- reactos/dll/win32/comctl32/comctl32_ros.diff | 74 +++++++++++++++++++- reactos/dll/win32/comctl32/listview.c | 2 +- reactos/dll/win32/comctl32/rebar.c | 39 +++-------- 3 files changed, 84 insertions(+), 31 deletions(-) diff --git a/reactos/dll/win32/comctl32/comctl32_ros.diff b/reactos/dll/win32/comctl32/comctl32_ros.diff index 079c5972367..d15da082250 100644 --- a/reactos/dll/win32/comctl32/comctl32_ros.diff +++ b/reactos/dll/win32/comctl32/comctl32_ros.diff @@ -143,7 +143,15 @@ Index: listview.c =================================================================== --- listview.c (revision 51320) +++ listview.c (working copy) -@@ -1634,8 +1635,19 @@ +@@ -315,6 +315,7 @@ + COLORREF clrBk; + COLORREF clrText; + COLORREF clrTextBk; ++ BOOL bDefaultBkColor; + + /* font */ + HFONT hDefaultFont; +@@ -1635,8 +1636,19 @@ /* used to handle collapse main item column case */ static inline BOOL LISTVIEW_DrawFocusRect(const LISTVIEW_INFO *infoPtr, HDC hdc) { @@ -165,7 +173,7 @@ Index: listview.c } /* Listview invalidation functions: use _only_ these functions to invalidate */ -@@ -5041,7 +5053,11 @@ +@@ -5042,7 +5054,11 @@ /* Draw marquee rectangle if appropriate */ if (infoPtr->bMarqueeSelect) @@ -177,3 +185,65 @@ Index: listview.c if (cdmode & CDRF_NOTIFYPOSTPAINT) notify_postpaint(infoPtr, &nmlvcd); +@@ -7856,6 +7872,7 @@ + { + TRACE("(clrBk=%x)\n", clrBk); + ++ infoPtr->bDefaultBkColor = FALSE; + if(infoPtr->clrBk != clrBk) { + if (infoPtr->clrBk != CLR_NONE) DeleteObject(infoPtr->hBkBrush); + infoPtr->clrBk = clrBk; +@@ -9248,6 +9265,7 @@ + infoPtr->clrText = CLR_DEFAULT; + infoPtr->clrTextBk = CLR_DEFAULT; + LISTVIEW_SetBkColor(infoPtr, comctl32_color.clrWindow); ++ infoPtr->bDefaultBkColor = TRUE; + + /* set default values */ + infoPtr->nFocusedItem = -1; +@@ -11510,6 +11528,11 @@ + + case WM_SYSCOLORCHANGE: + COMCTL32_RefreshSysColors(); ++ if (infoPtr->bDefaultBkColor) ++ { ++ LISTVIEW_SetBkColor(infoPtr, comctl32_color.clrWindow); ++ infoPtr->bDefaultBkColor = TRUE; ++ } + return 0; + + /* case WM_TIMER: */ +Index: rebar.c +=================================================================== +--- rebar.c (revision 51320) ++++ rebar.c (working copy) +@@ -51,7 +51,6 @@ + * - WM_QUERYNEWPALETTE + * - WM_RBUTTONDOWN + * - WM_RBUTTONUP +- * - WM_SYSCOLORCHANGE + * - WM_VKEYTOITEM + * - WM_WININICHANGE + * Notifications: +@@ -2540,10 +2539,8 @@ + + /* initialize band */ + memset(lpBand, 0, sizeof(*lpBand)); +- lpBand->clrFore = infoPtr->clrText == CLR_NONE ? infoPtr->clrBtnText : +- infoPtr->clrText; +- lpBand->clrBack = infoPtr->clrBk == CLR_NONE ? infoPtr->clrBtnFace : +- infoPtr->clrBk; ++ lpBand->clrFore = infoPtr->clrText; ++ lpBand->clrBack = infoPtr->clrBk; + lpBand->iImage = -1; + + REBAR_CommonSetupBand(infoPtr->hwndSelf, lprbbi, lpBand); +@@ -3793,6 +3790,8 @@ + + case WM_SYSCOLORCHANGE: + COMCTL32_RefreshSysColors(); ++ infoPtr->clrBtnText = comctl32_color.clrBtnText; ++ infoPtr->clrBtnFace = comctl32_color.clrBtnFace; + return 0; + + /* case WM_VKEYTOITEM: supported according to ControlSpy */ diff --git a/reactos/dll/win32/comctl32/listview.c b/reactos/dll/win32/comctl32/listview.c index 1a1d837ca3b..d6da12d5a0a 100644 --- a/reactos/dll/win32/comctl32/listview.c +++ b/reactos/dll/win32/comctl32/listview.c @@ -7871,7 +7871,7 @@ static BOOL LISTVIEW_Scroll(LISTVIEW_INFO *infoPtr, INT dx, INT dy) static BOOL LISTVIEW_SetBkColor(LISTVIEW_INFO *infoPtr, COLORREF clrBk) { TRACE("(clrBk=%x)\n", clrBk); - + infoPtr->bDefaultBkColor = FALSE; if(infoPtr->clrBk != clrBk) { if (infoPtr->clrBk != CLR_NONE) DeleteObject(infoPtr->hBkBrush); diff --git a/reactos/dll/win32/comctl32/rebar.c b/reactos/dll/win32/comctl32/rebar.c index 8e9c38b7a79..d5771064883 100644 --- a/reactos/dll/win32/comctl32/rebar.c +++ b/reactos/dll/win32/comctl32/rebar.c @@ -51,7 +51,6 @@ * - WM_QUERYNEWPALETTE * - WM_RBUTTONDOWN * - WM_RBUTTONUP - * - WM_SYSCOLORCHANGE * - WM_VKEYTOITEM * - WM_WININICHANGE * Notifications: @@ -1524,9 +1523,10 @@ REBAR_SizeToHeight(REBAR_INFO *infoPtr, int height) for (i = prev_visible(infoPtr, infoPtr->uNumBands); i > 0; i = prev_visible(infoPtr, i)) { REBAR_BAND *lpBand = REBAR_GetBand(infoPtr, i); - int height = lpBand->rcBand.bottom - lpBand->rcBand.top; int cyBreakExtra; /* additional cy for the rebar after a RBBS_BREAK on this band */ + height = lpBand->rcBand.bottom - lpBand->rcBand.top; + if (infoPtr->dwStyle & RBS_VARHEIGHT) cyBreakExtra = lpBand->cyRowSoFar; /* 'height' => 'lpBand->cyRowSoFar' + 'height'*/ else @@ -1846,8 +1846,7 @@ REBAR_CommonSetupBand(HWND hwnd, const REBARBANDINFOW *lprbbi, REBAR_BAND *lpBan return uChanged; } -static LRESULT -REBAR_InternalEraseBkGnd (const REBAR_INFO *infoPtr, HDC hdc, const RECT *clip) +static LRESULT REBAR_EraseBkGnd (const REBAR_INFO *infoPtr, HDC hdc) /* Function: This erases the background rectangle by drawing */ /* each band with its background color (or the default) and */ /* draws each bands right separator if necessary. The row */ @@ -1950,14 +1949,10 @@ REBAR_InternalEraseBkGnd (const REBAR_INFO *infoPtr, HDC hdc, const RECT *clip) else { old = SetBkColor (hdc, new); - TRACE("%s background color=0x%06x, band (%d,%d)-(%d,%d), clip (%d,%d)-(%d,%d)\n", + TRACE("%s background color=0x%06x, band %s\n", (lpBand->clrBack == CLR_NONE) ? "none" : ((lpBand->clrBack == CLR_DEFAULT) ? "dft" : ""), - GetBkColor(hdc), - rcBand.left,rcBand.top, - rcBand.right,rcBand.bottom, - clip->left, clip->top, - clip->right, clip->bottom); + GetBkColor(hdc), wine_dbgstr_rect(&rcBand)); ExtTextOutW (hdc, 0, 0, ETO_OPAQUE, &rcBand, NULL, 0, 0); if (lpBand->clrBack != CLR_NONE) SetBkColor (hdc, old); @@ -2120,7 +2115,7 @@ REBAR_HandleUDDrag (REBAR_INFO *infoPtr, const POINT *ptsmove) REBAR_BAND *hitBand, *rowBeginBand; if(infoPtr->uNumBands <= 0) - ERR("There are no bands in this rebar"); + ERR("There are no bands in this rebar\n"); /* Up/down dragging can only occur when there is more than one * band in the rebar */ @@ -2544,10 +2539,8 @@ REBAR_InsertBandT(REBAR_INFO *infoPtr, INT iIndex, const REBARBANDINFOW *lprbbi, /* initialize band */ memset(lpBand, 0, sizeof(*lpBand)); - lpBand->clrFore = infoPtr->clrText == CLR_NONE ? infoPtr->clrBtnText : - infoPtr->clrText; - lpBand->clrBack = infoPtr->clrBk == CLR_NONE ? infoPtr->clrBtnFace : - infoPtr->clrBk; + lpBand->clrFore = infoPtr->clrText; + lpBand->clrBack = infoPtr->clrBk; lpBand->iImage = -1; REBAR_CommonSetupBand(infoPtr->hwndSelf, lprbbi, lpBand); @@ -3000,18 +2993,6 @@ REBAR_Destroy (REBAR_INFO *infoPtr) return 0; } - -static LRESULT -REBAR_EraseBkGnd (const REBAR_INFO *infoPtr, HDC hdc) -{ - RECT cliprect; - - if (GetClipBox ( hdc, &cliprect)) - return REBAR_InternalEraseBkGnd (infoPtr, hdc, &cliprect); - return 0; -} - - static LRESULT REBAR_GetFont (const REBAR_INFO *infoPtr) { @@ -3454,7 +3435,7 @@ REBAR_Paint (const REBAR_INFO *infoPtr, HDC hdc) TRACE("painting (%s)\n", wine_dbgstr_rect(&ps.rcPaint)); if (ps.fErase) { /* Erase area of paint if requested */ - REBAR_InternalEraseBkGnd (infoPtr, hdc, &ps.rcPaint); + REBAR_EraseBkGnd (infoPtr, hdc); } REBAR_Refresh (infoPtr, hdc); EndPaint (infoPtr->hwndSelf, &ps); @@ -3809,6 +3790,8 @@ REBAR_WindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) case WM_SYSCOLORCHANGE: COMCTL32_RefreshSysColors(); + infoPtr->clrBtnText = comctl32_color.clrBtnText; + infoPtr->clrBtnFace = comctl32_color.clrBtnFace; return 0; /* case WM_VKEYTOITEM: supported according to ControlSpy */ From 0bbfb26d0fa1aac5cd71c7ea45267d33b34f9ae2 Mon Sep 17 00:00:00 2001 From: Rafal Harabien Date: Sun, 1 May 2011 12:53:10 +0000 Subject: [PATCH 261/317] [APPLICATIONS] * Properly support WM_SYSCOLORCHANGE in msconfig, mspaint, rapps, regedit and regedit svn path=/trunk/; revision=51523 --- reactos/base/applications/msconfig/msconfig.c | 7 +++++++ reactos/base/applications/mspaint/winproc.c | 8 ++++++++ reactos/base/applications/rapps/winmain.c | 9 +++++++++ reactos/base/applications/regedit/framewnd.c | 5 +++++ reactos/base/applications/sndvol32/sndvol32.c | 2 +- 5 files changed, 30 insertions(+), 1 deletion(-) diff --git a/reactos/base/applications/msconfig/msconfig.c b/reactos/base/applications/msconfig/msconfig.c index 49f2e31229e..7f68f98c923 100644 --- a/reactos/base/applications/msconfig/msconfig.c +++ b/reactos/base/applications/msconfig/msconfig.c @@ -212,6 +212,13 @@ MsConfigWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) } break; + case WM_SYSCOLORCHANGE: + /* Forward WM_SYSCOLORCHANGE to common controls */ + SendMessage(hServicesListCtrl, WM_SYSCOLORCHANGE, 0, 0); + SendMessage(hStartupListCtrl, WM_SYSCOLORCHANGE, 0, 0); + SendMessage(hToolsListCtrl, WM_SYSCOLORCHANGE, 0, 0); + break; + case WM_DESTROY: if (hToolsPage) DestroyWindow(hToolsPage); diff --git a/reactos/base/applications/mspaint/winproc.c b/reactos/base/applications/mspaint/winproc.c index 23e1855824a..213efaffd58 100644 --- a/reactos/base/applications/mspaint/winproc.c +++ b/reactos/base/applications/mspaint/winproc.c @@ -692,6 +692,14 @@ WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) // menu and button events + case WM_SYSCOLORCHANGE: + { + /* Redirect message to common controls */ + HWND hToolbar = FindWindowEx(hToolBoxContainer, NULL, TOOLBARCLASSNAME, NULL); + SendMessage(hToolbar, WM_SYSCOLORCHANGE, 0, 0); + break; + } + case WM_COMMAND: switch (LOWORD(wParam)) { diff --git a/reactos/base/applications/rapps/winmain.c b/reactos/base/applications/rapps/winmain.c index 9f6a0fc65f7..d722facf7f7 100644 --- a/reactos/base/applications/rapps/winmain.c +++ b/reactos/base/applications/rapps/winmain.c @@ -717,6 +717,15 @@ MainWindowProc(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam) return TRUE; } + case WM_SYSCOLORCHANGE: + { + /* Forward WM_SYSCOLORCHANGE to common controls */ + SendMessage(hListView, WM_SYSCOLORCHANGE, 0, 0); + SendMessage(hTreeView, WM_SYSCOLORCHANGE, 0, 0); + SendMessage(hToolBar, WM_SYSCOLORCHANGE, 0, 0); + } + break; + case WM_DESTROY: { ShowWindow(hwnd, SW_HIDE); diff --git a/reactos/base/applications/regedit/framewnd.c b/reactos/base/applications/regedit/framewnd.c index 5d9a68264c9..e37adbef08b 100644 --- a/reactos/base/applications/regedit/framewnd.c +++ b/reactos/base/applications/regedit/framewnd.c @@ -1177,6 +1177,11 @@ LRESULT CALLBACK FrameWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPa case WM_MENUSELECT: OnMenuSelect(hWnd, LOWORD(wParam), HIWORD(wParam), (HMENU)lParam); break; + case WM_SYSCOLORCHANGE: + /* Forward WM_SYSCOLORCHANGE to common controls */ + SendMessage(g_pChildWnd->hListWnd, WM_SYSCOLORCHANGE, 0, 0); + SendMessage(g_pChildWnd->hTreeWnd, WM_SYSCOLORCHANGE, 0, 0); + break; case WM_DESTROY: WinHelp(hWnd, _T("regedit"), HELP_QUIT, 0); PostQuitMessage(0); diff --git a/reactos/base/applications/sndvol32/sndvol32.c b/reactos/base/applications/sndvol32/sndvol32.c index 3090bfa4cc7..ec16547f4af 100644 --- a/reactos/base/applications/sndvol32/sndvol32.c +++ b/reactos/base/applications/sndvol32/sndvol32.c @@ -579,7 +579,7 @@ DlgPreferencesProc(HWND hwndDlg, { HWND hwndControls; - /* Forward WM_SYSCOLORCHANGE to common controls */ + /* Forward WM_SYSCOLORCHANGE */ hwndControls = GetDlgItem(hwndDlg, IDC_CONTROLS); SendMessage(hwndControls, WM_SYSCOLORCHANGE, 0, 0); break; From 9bee914885f170bdcd4421a8ff8e37f387630444 Mon Sep 17 00:00:00 2001 From: Rafal Harabien Date: Sun, 1 May 2011 12:58:15 +0000 Subject: [PATCH 262/317] [EXPLORER] * Properly support WM_SYSCOLORCHANGE svn path=/trunk/; revision=51524 --- .../base/shell/explorer/desktop/desktop.cpp | 9 +++++---- .../base/shell/explorer/shell/mainframe.cpp | 19 +++++++++++++++++++ .../shell/explorer/shell/shellbrowser.cpp | 6 ++++++ .../shell/explorer/taskbar/desktopbar.cpp | 9 +++++++++ .../base/shell/explorer/taskbar/taskbar.cpp | 4 ++++ 5 files changed, 43 insertions(+), 4 deletions(-) diff --git a/reactos/base/shell/explorer/desktop/desktop.cpp b/reactos/base/shell/explorer/desktop/desktop.cpp index e7787055b8d..4c35f37243b 100644 --- a/reactos/base/shell/explorer/desktop/desktop.cpp +++ b/reactos/base/shell/explorer/desktop/desktop.cpp @@ -464,11 +464,12 @@ LRESULT DesktopWindow::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) goto def; case WM_SYSCOLORCHANGE: - // redraw background window - InvalidateRect(g_Globals._hwndShellView, NULL, TRUE); + // redraw background window - it's done by system + //InvalidateRect(g_Globals._hwndShellView, NULL, TRUE); - // forward message to shell view window to redraw icon backgrounds - SendMessage(g_Globals._hwndShellView, WM_SYSCOLORCHANGE, wparam, lparam); + // forward message to common controls + SendMessage(g_Globals._hwndShellView, WM_SYSCOLORCHANGE, 0, 0); + SendMessage(_desktopBar, WM_SYSCOLORCHANGE, 0, 0);OutputDebugStringA("WM_SYSCOLORCHANGE desktop\n"); break; default: def: diff --git a/reactos/base/shell/explorer/shell/mainframe.cpp b/reactos/base/shell/explorer/shell/mainframe.cpp index d03efbfcd7e..b3cf599b214 100644 --- a/reactos/base/shell/explorer/shell/mainframe.cpp +++ b/reactos/base/shell/explorer/shell/mainframe.cpp @@ -372,6 +372,11 @@ bool MainFrameBase::ProcessMessage(UINT nmsg, WPARAM wparam, LPARAM lparam, LRES SendMessage(_hstatusbar, SB_SETTEXT, 0, lparam); break; + case WM_SYSCOLORCHANGE: + SendMessage(_hwndrebar, WM_SYSCOLORCHANGE, 0, 0); + SendMessage(_htoolbar, WM_SYSCOLORCHANGE, 0, 0); + break; + default: return false; } @@ -993,6 +998,20 @@ LRESULT MDIMainFrame::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) } return TRUE;} // success + case WM_SYSCOLORCHANGE: { + LRESULT res; + HWND hChild; + + /* Forward WM_SYSCOLORCHANGE to common controls */ + SendMessage(_hextrabar, WM_SYSCOLORCHANGE, 0, 0); + SendMessage(_hdrivebar, WM_SYSCOLORCHANGE, 0, 0); + + for(hChild = GetNextWindow(_hmdiclient,GW_CHILD); hChild; hChild = GetNextWindow(hChild, GW_HWNDNEXT)) + SendMessage(hChild, WM_SYSCOLORCHANGE, 0, 0); + + super::ProcessMessage(nmsg, wparam, lparam, &res); + break; } + default: { LRESULT res; diff --git a/reactos/base/shell/explorer/shell/shellbrowser.cpp b/reactos/base/shell/explorer/shell/shellbrowser.cpp index 17a23d01b52..44ba3750ff0 100644 --- a/reactos/base/shell/explorer/shell/shellbrowser.cpp +++ b/reactos/base/shell/explorer/shell/shellbrowser.cpp @@ -701,6 +701,12 @@ LRESULT MDIShellBrowserChild::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) } return TRUE;} + case WM_SYSCOLORCHANGE: + /* Forward WM_SYSCOLORCHANGE to common controls */ + SendMessage(_left_hwnd, WM_SYSCOLORCHANGE, 0, 0); + SendMessage(_right_hwnd, WM_SYSCOLORCHANGE, 0, 0); + break; + default: return super::WndProc(nmsg, wparam, lparam); } diff --git a/reactos/base/shell/explorer/taskbar/desktopbar.cpp b/reactos/base/shell/explorer/taskbar/desktopbar.cpp index f6988279d65..c52a1671a06 100644 --- a/reactos/base/shell/explorer/taskbar/desktopbar.cpp +++ b/reactos/base/shell/explorer/taskbar/desktopbar.cpp @@ -345,6 +345,15 @@ LRESULT DesktopBar::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) case PM_GET_NOTIFYAREA: return (LRESULT)(HWND)_hwndNotify; + case WM_SYSCOLORCHANGE:OutputDebugStringA("WM_SYSCOLORCHANGE desktopbar\n"); + /* Forward WM_SYSCOLORCHANGE to common controls */ +#ifndef _NO_REBAR + SendMessage(_hwndrebar, WM_SYSCOLORCHANGE, 0, 0); +#endif + SendMessage(_hwndQuickLaunch, WM_SYSCOLORCHANGE, 0, 0); + SendMessage(_hwndTaskBar, WM_SYSCOLORCHANGE, 0, 0); + break; + default: def: return super::WndProc(nmsg, wparam, lparam); } diff --git a/reactos/base/shell/explorer/taskbar/taskbar.cpp b/reactos/base/shell/explorer/taskbar/taskbar.cpp index 526c4c12759..d2c5144704d 100644 --- a/reactos/base/shell/explorer/taskbar/taskbar.cpp +++ b/reactos/base/shell/explorer/taskbar/taskbar.cpp @@ -202,6 +202,10 @@ LRESULT TaskBar::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) case PM_GET_LAST_ACTIVE: return (LRESULT)(HWND)_last_foreground_wnd; + case WM_SYSCOLORCHANGE: + SendMessage(_htoolbar, WM_SYSCOLORCHANGE, 0, 0); + break; + default: def: if (nmsg == WM_SHELLHOOK) { switch(wparam) { From e094f5462333c87808162bf78d3d0df41956a047 Mon Sep 17 00:00:00 2001 From: Rafal Harabien Date: Sun, 1 May 2011 12:59:48 +0000 Subject: [PATCH 263/317] [WIN32K] * Redraw desktop after change of system colors. Inspired by Wine svn path=/trunk/; revision=51525 --- reactos/subsystems/win32/win32k/ntuser/ntstubs.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/reactos/subsystems/win32/win32k/ntuser/ntstubs.c b/reactos/subsystems/win32/win32k/ntuser/ntstubs.c index e1ede5abb5f..281fe7190a1 100644 --- a/reactos/subsystems/win32/win32k/ntuser/ntstubs.c +++ b/reactos/subsystems/win32/win32k/ntuser/ntstubs.c @@ -519,6 +519,8 @@ NtUserSetSysColors( if (Ret) { UserSendNotifyMessage(HWND_BROADCAST, WM_SYSCOLORCHANGE, 0, 0); + + UserRedrawDesktop(); } UserLeave(); From 606747e15c0a69c9fb1bbcb66ba70369eeb0bd54 Mon Sep 17 00:00:00 2001 From: Rafal Harabien Date: Sun, 1 May 2011 13:01:38 +0000 Subject: [PATCH 264/317] [SHELL32] * Properly support WM_SYSCOLORCHANGE in ShellView window. Changing system colors in ReactOS works perfectly now :) svn path=/trunk/; revision=51526 --- reactos/dll/win32/shell32/shlview.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/reactos/dll/win32/shell32/shlview.c b/reactos/dll/win32/shell32/shlview.c index ff05864eb80..2218504735d 100644 --- a/reactos/dll/win32/shell32/shlview.c +++ b/reactos/dll/win32/shell32/shlview.c @@ -1853,6 +1853,12 @@ static LRESULT CALLBACK ShellView_WndProc(HWND hWnd, UINT uMessage, WPARAM wPara (pThis->FolderSettings.fFlags & FWF_TRANSPARENT)) return SendMessageW(pThis->hWndParent, WM_ERASEBKGND, wParam, lParam); /* redirect to parent */ break; + + case WM_SYSCOLORCHANGE: + /* Forward WM_SYSCOLORCHANGE to common controls */ + SendMessage(pThis->hWndList, WM_SYSCOLORCHANGE, 0, 0); + break; + case CWM_GETISHELLBROWSER: return (LRESULT)pThis->pShellBrowser; } From 3fe6ca77a5665f75967588603318fc9d6d30a120 Mon Sep 17 00:00:00 2001 From: Rafal Harabien Date: Sun, 1 May 2011 13:15:30 +0000 Subject: [PATCH 265/317] [WIN32K] * Do not reference current thread before sending message to it. It was causing thread to be a ghost if ExitThread was called in WndProc. * Hold only UserRefObjectCo reference on windows when sending messages to them. svn path=/trunk/; revision=51527 --- reactos/subsystems/win32/win32k/ntuser/message.c | 8 ++++---- reactos/subsystems/win32/win32k/ntuser/window.c | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/reactos/subsystems/win32/win32k/ntuser/message.c b/reactos/subsystems/win32/win32k/ntuser/message.c index b2422376620..9067b267037 100644 --- a/reactos/subsystems/win32/win32k/ntuser/message.c +++ b/reactos/subsystems/win32/win32k/ntuser/message.c @@ -1218,7 +1218,7 @@ co_IntSendMessageTimeoutSingle( HWND hWnd, RETURN( FALSE); } - ObReferenceObject(Win32Thread->pEThread); + //ObReferenceObject(Win32Thread->pEThread); Result = (ULONG_PTR)co_IntCallWindowProc( Window->lpfnWndProc, !Window->Unicode, hWnd, @@ -1231,7 +1231,7 @@ co_IntSendMessageTimeoutSingle( HWND hWnd, *uResult = Result; } - ObDereferenceObject(Win32Thread->pEThread); + //ObDereferenceObject(Win32Thread->pEThread); IntCallWndProcRet( Window, hWnd, Msg, wParam, lParam, (LRESULT *)uResult); @@ -1438,7 +1438,7 @@ co_IntSendMessageWithCallBack( HWND hWnd, IntCallWndProc( Window, hWnd, Msg, wParam, lParam); - ObReferenceObject(Win32Thread->pEThread); + //ObReferenceObject(Win32Thread->pEThread); Result = (ULONG_PTR)co_IntCallWindowProc( Window->lpfnWndProc, !Window->Unicode, hWnd, @@ -1450,7 +1450,7 @@ co_IntSendMessageWithCallBack( HWND hWnd, { *uResult = Result; } - ObDereferenceObject(Win32Thread->pEThread); + //ObDereferenceObject(Win32Thread->pEThread); IntCallWndProcRet( Window, hWnd, Msg, wParam, lParam, (LRESULT *)uResult); diff --git a/reactos/subsystems/win32/win32k/ntuser/window.c b/reactos/subsystems/win32/win32k/ntuser/window.c index 11ea4669a56..6fe58a5049f 100644 --- a/reactos/subsystems/win32/win32k/ntuser/window.c +++ b/reactos/subsystems/win32/win32k/ntuser/window.c @@ -1995,6 +1995,7 @@ co_UserCreateWindowEx(CREATESTRUCTW* Cs, hwndInsertAfter = HWND_TOP; UserRefObjectCo(Window, &Ref); + UserDereferenceObject(Window); ObDereferenceObject(WinSta); //// Check for a hook to eliminate overhead. //// @@ -2260,7 +2261,6 @@ cleanup: if (Window) { UserDerefObjectCo(Window); - UserDereferenceObject(Window); } if (ParentWindow) UserDerefObjectCo(ParentWindow); From 18ea9e1c9d0ccb10999f42ddbcbf70e4e13f794a Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sun, 1 May 2011 13:23:59 +0000 Subject: [PATCH 266/317] [NETEVENT] Fix a little typo. svn path=/trunk/; revision=51528 --- reactos/include/reactos/mc/netevent.mc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/include/reactos/mc/netevent.mc b/reactos/include/reactos/mc/netevent.mc index 6c15a3466c4..3800d163961 100644 --- a/reactos/include/reactos/mc/netevent.mc +++ b/reactos/include/reactos/mc/netevent.mc @@ -43,7 +43,7 @@ The Event log service was stopped. MessageId=6009 Severity=Warning Facility=System -SymbolicName=EVENT_EventlogProductInfo +SymbolicName=EVENT_EventLogProductInfo Language=English ReactOS %1 %2 %3 %4. . From 957e387479d84361e785f56109dece0efd578ba1 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sun, 1 May 2011 13:35:51 +0000 Subject: [PATCH 267/317] [EVENTLOG] - Add event sources "EventLog" and "Service Control Manager" to the registry. - Implement an internal event reporting function and report the successful start of the event logging service. svn path=/trunk/; revision=51529 --- reactos/base/services/eventlog/eventlog.c | 4 ++ reactos/base/services/eventlog/eventlog.h | 6 +++ reactos/base/services/eventlog/file.c | 50 +++++++++++++++++++++++ reactos/boot/bootdata/hivesys_i386.inf | 4 ++ 4 files changed, 64 insertions(+) diff --git a/reactos/base/services/eventlog/eventlog.c b/reactos/base/services/eventlog/eventlog.c index c81f9af4dcb..ee34a1d2e45 100644 --- a/reactos/base/services/eventlog/eventlog.c +++ b/reactos/base/services/eventlog/eventlog.c @@ -168,6 +168,10 @@ ServiceMain(DWORD argc, { DPRINT("Service started\n"); UpdateServiceStatus(SERVICE_RUNNING); + + LogfReportEvent(EVENTLOG_INFORMATION_TYPE, + 0, + EVENT_EventlogStarted); } DPRINT("ServiceMain() done\n"); diff --git a/reactos/base/services/eventlog/eventlog.h b/reactos/base/services/eventlog/eventlog.h index c9a7cf89474..2ed6a4f50f2 100644 --- a/reactos/base/services/eventlog/eventlog.h +++ b/reactos/base/services/eventlog/eventlog.h @@ -13,6 +13,7 @@ #define WIN32_NO_STATUS #include +#include #include #include #include @@ -177,6 +178,11 @@ PBYTE LogfAllocAndBuildNewRecord(LPDWORD lpRecSize, DWORD dwDataSize, LPVOID lpRawData); +VOID +LogfReportEvent(WORD wType, + WORD wCategory, + DWORD dwEventId); + /* eventlog.c */ extern HANDLE MyHeap; diff --git a/reactos/base/services/eventlog/file.c b/reactos/base/services/eventlog/file.c index bc68d3dcad5..3dd38af0fb6 100644 --- a/reactos/base/services/eventlog/file.c +++ b/reactos/base/services/eventlog/file.c @@ -1049,3 +1049,53 @@ PBYTE LogfAllocAndBuildNewRecord(LPDWORD lpRecSize, *lpRecSize = dwRecSize; return Buffer; } + + +VOID +LogfReportEvent(WORD wType, + WORD wCategory, + DWORD dwEventId) +{ + WCHAR szComputerName[MAX_COMPUTERNAME_LENGTH + 1]; + DWORD dwComputerNameLength = MAX_COMPUTERNAME_LENGTH + 1; + PEVENTSOURCE pEventSource = NULL; + PBYTE logBuffer; + DWORD lastRec; + DWORD recSize; + DWORD dwError; + + if (!GetComputerNameW(szComputerName, &dwComputerNameLength)) + { + szComputerName[0] = 0; + } + + pEventSource = GetEventSourceByName(L"EventLog"); + if (pEventSource == NULL) + { + return; + } + + lastRec = LogfGetCurrentRecord(pEventSource->LogFile); + + logBuffer = LogfAllocAndBuildNewRecord(&recSize, + lastRec, + wType, + wCategory, + dwEventId, + pEventSource->szName, + (LPCWSTR)szComputerName, + 0, + NULL, + 0, //wNumStrings, + NULL, //lpStrings, + 0, //dwDataSize, + NULL); //lpRawData); + + dwError = LogfWriteData(pEventSource->LogFile, recSize, logBuffer); + if (!dwError) + { + DPRINT1("ERROR WRITING TO EventLog %S\n", pEventSource->LogFile->FileName); + } + + LogfFreeRecord(logBuffer); +} \ No newline at end of file diff --git a/reactos/boot/bootdata/hivesys_i386.inf b/reactos/boot/bootdata/hivesys_i386.inf index a5d1e4264cc..3561a0d9bff 100644 --- a/reactos/boot/bootdata/hivesys_i386.inf +++ b/reactos/boot/bootdata/hivesys_i386.inf @@ -1148,10 +1148,14 @@ HKLM,"SYSTEM\CurrentControlSet\Services\EventLog","Type",0x00010001,0x00000010 HKLM,"SYSTEM\CurrentControlSet\Services\EventLog\Application",,0x00000010 HKLM,"SYSTEM\CurrentControlSet\Services\EventLog\Application","File",0x00020000,"%SystemRoot%\system32\config\AppEvent.Evt" +HKLM,"SYSTEM\CurrentControlSet\Services\EventLog\Application\Service Control Manager","EventMessageFile",0x00020000,"%SystemRoot%\system32\netevent.dll" +HKLM,"SYSTEM\CurrentControlSet\Services\EventLog\Application\Service Control Manager","TypesSupported",0x00010001,0x00000007 HKLM,"SYSTEM\CurrentControlSet\Services\EventLog\Security",,0x00000010 HKLM,"SYSTEM\CurrentControlSet\Services\EventLog\Security","File",0x00020000,"%SystemRoot%\system32\config\SecEvent.Evt" HKLM,"SYSTEM\CurrentControlSet\Services\EventLog\System",,0x00000010 HKLM,"SYSTEM\CurrentControlSet\Services\EventLog\System","File",0x00020000,"%SystemRoot%\system32\config\SysEvent.Evt" +HKLM,"SYSTEM\CurrentControlSet\Services\EventLog\System\EventLog","EventMessageFile",0x00020000,"%SystemRoot%\system32\netevent.dll" +HKLM,"SYSTEM\CurrentControlSet\Services\EventLog\System\EventLog","TypesSupported",0x00010001,0x00000007 ; Floppy driver HKLM,"SYSTEM\CurrentControlSet\Services\Floppy","ErrorControl",0x00010001,0x00000000 From aea7bfcd56a87005c9f2feb702efc482250f879e Mon Sep 17 00:00:00 2001 From: Rafal Harabien Date: Sun, 1 May 2011 14:35:58 +0000 Subject: [PATCH 268/317] [TASKMGR] * Make buttons on applications page longer, so polish text fits svn path=/trunk/; revision=51530 --- reactos/base/applications/taskmgr/lang/pl-PL.rc | 6 +++--- reactos/subsystems/win32/win32k/ntuser/message.c | 5 ----- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/reactos/base/applications/taskmgr/lang/pl-PL.rc b/reactos/base/applications/taskmgr/lang/pl-PL.rc index 1cbd872c3a7..3f594c2f650 100644 --- a/reactos/base/applications/taskmgr/lang/pl-PL.rc +++ b/reactos/base/applications/taskmgr/lang/pl-PL.rc @@ -184,9 +184,9 @@ FONT 8, "MS Shell Dlg" BEGIN CONTROL "List2",IDC_APPLIST,"SysListView32",LVS_REPORT | LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP,7,7,233,177 - PUSHBUTTON "&Nowe zadanie...",IDC_NEWTASK,187,189,53,14 - PUSHBUTTON "P&rzecz na",IDC_SWITCHTO,131,189,53,14,WS_DISABLED - PUSHBUTTON "&Zakocz zadanie",IDC_ENDTASK,75,189,53,14,WS_DISABLED + PUSHBUTTON "&Nowe zadanie...",IDC_NEWTASK,175,189,65,14 + PUSHBUTTON "P&rzecz na",IDC_SWITCHTO,107,189,65,14,WS_DISABLED + PUSHBUTTON "&Zakocz zadanie",IDC_ENDTASK,39,189,65,14,WS_DISABLED END IDD_PROCESS_PAGE DIALOGEX DISCARDABLE 0, 0, 247, 210 diff --git a/reactos/subsystems/win32/win32k/ntuser/message.c b/reactos/subsystems/win32/win32k/ntuser/message.c index 9067b267037..fbe7a93d033 100644 --- a/reactos/subsystems/win32/win32k/ntuser/message.c +++ b/reactos/subsystems/win32/win32k/ntuser/message.c @@ -1218,7 +1218,6 @@ co_IntSendMessageTimeoutSingle( HWND hWnd, RETURN( FALSE); } - //ObReferenceObject(Win32Thread->pEThread); Result = (ULONG_PTR)co_IntCallWindowProc( Window->lpfnWndProc, !Window->Unicode, hWnd, @@ -1231,8 +1230,6 @@ co_IntSendMessageTimeoutSingle( HWND hWnd, *uResult = Result; } - //ObDereferenceObject(Win32Thread->pEThread); - IntCallWndProcRet( Window, hWnd, Msg, wParam, lParam, (LRESULT *)uResult); if (! NT_SUCCESS(UnpackParam(lParamPacked, Msg, wParam, lParam, FALSE))) @@ -1438,7 +1435,6 @@ co_IntSendMessageWithCallBack( HWND hWnd, IntCallWndProc( Window, hWnd, Msg, wParam, lParam); - //ObReferenceObject(Win32Thread->pEThread); Result = (ULONG_PTR)co_IntCallWindowProc( Window->lpfnWndProc, !Window->Unicode, hWnd, @@ -1450,7 +1446,6 @@ co_IntSendMessageWithCallBack( HWND hWnd, { *uResult = Result; } - //ObDereferenceObject(Win32Thread->pEThread); IntCallWndProcRet( Window, hWnd, Msg, wParam, lParam, (LRESULT *)uResult); From 16b032b455187e39bad70fd102d2826f787614f3 Mon Sep 17 00:00:00 2001 From: Rafal Harabien Date: Sun, 1 May 2011 15:07:35 +0000 Subject: [PATCH 269/317] [DESK] * Fix a bug when after changing color scheme Apply and then OK is clicked. Background color was restored to the previous one in this case. Spotted by Gabriel Ilardi. svn path=/trunk/; revision=51531 --- reactos/dll/cpl/desk/appearance.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/reactos/dll/cpl/desk/appearance.c b/reactos/dll/cpl/desk/appearance.c index 65e9ad6890a..7670f4c9e00 100644 --- a/reactos/dll/cpl/desk/appearance.c +++ b/reactos/dll/cpl/desk/appearance.c @@ -115,12 +115,14 @@ AppearancePageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) hwndDlg, AdvAppearanceDlgProc, (LPARAM)g) == IDOK) { PropSheet_Changed(GetParent(hwndDlg), hwndDlg); - g->Theme = g->ThemeAdv; - g_GlobalData.desktop_color = g->Theme.crColor[COLOR_DESKTOP]; g->bHasChanged = TRUE; + g->Theme = g->ThemeAdv; g->ThemeId = -1; /* Customized */ + g_GlobalData.desktop_color = g->Theme.crColor[COLOR_DESKTOP]; + SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_COLORSCHEME, CB_SETCURSEL, (WPARAM)-1, 0); SetDlgItemText(hwndDlg, IDC_APPEARANCE_COLORSCHEME, TEXT("")); + SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&g->Theme); } break; @@ -136,6 +138,7 @@ AppearancePageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { g->Theme = Theme; g->ThemeId = ThemeId; + g_GlobalData.desktop_color = g->Theme.crColor[COLOR_DESKTOP]; SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&Theme); } } From c81830d2e67727ed2596fa8cec81f0d25a8f7ee5 Mon Sep 17 00:00:00 2001 From: Gregor Schneider Date: Sun, 1 May 2011 15:16:55 +0000 Subject: [PATCH 270/317] [regedit] Process WM_COMMAND button click messages in the local window as well See issue #5927 for more details. svn path=/trunk/; revision=51532 --- reactos/base/applications/regedit/childwnd.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/reactos/base/applications/regedit/childwnd.c b/reactos/base/applications/regedit/childwnd.c index fcf5db21a03..378d2e7e8ba 100644 --- a/reactos/base/applications/regedit/childwnd.c +++ b/reactos/base/applications/regedit/childwnd.c @@ -367,7 +367,8 @@ LRESULT CALLBACK ChildWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPa { PostMessage(g_pChildWnd->hAddressBarWnd, WM_KEYUP, VK_RETURN, 0); } - else if (!_CmdWndProc(hWnd, message, wParam, lParam)) + + if (!_CmdWndProc(hWnd, message, wParam, lParam)) { goto def; } From 8ba552d1a3251be4acaf5cd29564b969770b2790 Mon Sep 17 00:00:00 2001 From: Rafal Harabien Date: Sun, 1 May 2011 15:45:50 +0000 Subject: [PATCH 271/317] [RAPPS] * Change color of description richedit when system colors are changed svn path=/trunk/; revision=51533 --- reactos/base/applications/rapps/winmain.c | 1 + 1 file changed, 1 insertion(+) diff --git a/reactos/base/applications/rapps/winmain.c b/reactos/base/applications/rapps/winmain.c index d722facf7f7..599665f8b75 100644 --- a/reactos/base/applications/rapps/winmain.c +++ b/reactos/base/applications/rapps/winmain.c @@ -723,6 +723,7 @@ MainWindowProc(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam) SendMessage(hListView, WM_SYSCOLORCHANGE, 0, 0); SendMessage(hTreeView, WM_SYSCOLORCHANGE, 0, 0); SendMessage(hToolBar, WM_SYSCOLORCHANGE, 0, 0); + SendMessageW(hRichEdit, EM_SETBKGNDCOLOR, 0, GetSysColor(COLOR_BTNFACE)); } break; From 2b77604a9f278576183fb4409f910f386f2b3c8a Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sun, 1 May 2011 18:47:13 +0000 Subject: [PATCH 272/317] [EVENTVWR] Replace some hard-coded strings by resource strings. svn path=/trunk/; revision=51536 --- .../base/applications/mscutils/eventvwr/eventvwr.c | 11 ++++++----- .../base/applications/mscutils/eventvwr/lang/bg-BG.rc | 6 ++++++ .../base/applications/mscutils/eventvwr/lang/de-DE.rc | 6 ++++++ .../base/applications/mscutils/eventvwr/lang/el-GR.rc | 6 ++++++ .../base/applications/mscutils/eventvwr/lang/en-US.rc | 6 ++++++ .../base/applications/mscutils/eventvwr/lang/es-ES.rc | 6 ++++++ .../base/applications/mscutils/eventvwr/lang/fr-FR.rc | 6 ++++++ .../base/applications/mscutils/eventvwr/lang/it-IT.rc | 6 ++++++ .../base/applications/mscutils/eventvwr/lang/ja-JP.rc | 6 ++++++ .../base/applications/mscutils/eventvwr/lang/ko-KR.rc | 6 ++++++ .../base/applications/mscutils/eventvwr/lang/no-NO.rc | 6 ++++++ .../base/applications/mscutils/eventvwr/lang/pl-PL.rc | 6 ++++++ .../base/applications/mscutils/eventvwr/lang/ro-RO.rc | 6 ++++++ .../base/applications/mscutils/eventvwr/lang/ru-RU.rc | 6 ++++++ .../base/applications/mscutils/eventvwr/lang/sk-SK.rc | 6 ++++++ .../base/applications/mscutils/eventvwr/lang/sv-SE.rc | 6 ++++++ .../base/applications/mscutils/eventvwr/lang/uk-UA.rc | 6 ++++++ .../base/applications/mscutils/eventvwr/resource.h | 3 +++ 18 files changed, 105 insertions(+), 5 deletions(-) diff --git a/reactos/base/applications/mscutils/eventvwr/eventvwr.c b/reactos/base/applications/mscutils/eventvwr/eventvwr.c index 658e4c280c4..7f0a5e51e2e 100644 --- a/reactos/base/applications/mscutils/eventvwr/eventvwr.c +++ b/reactos/base/applications/mscutils/eventvwr/eventvwr.c @@ -267,7 +267,7 @@ GetEventCategory(IN LPCWSTR KeyName, } else { - wcscpy(CategoryName, L"None"); + LoadStringW(hInst, IDS_NONE, CategoryName, MAX_PATH); } if (hLibrary != NULL) @@ -281,7 +281,7 @@ GetEventCategory(IN LPCWSTR KeyName, } } - wcscpy(CategoryName, L"None"); + LoadStringW(hInst, IDS_NONE, CategoryName, MAX_PATH); return FALSE; } @@ -597,9 +597,9 @@ QueryEventMessages(LPWSTR lpMachineName, while (dwRead > 0) { - wcscpy(szUsername , L"N/A"); - wcscpy(szEventText , L"N/A"); - wcscpy(szCategory , L"None"); + LoadStringW(hInst, IDS_NOT_AVAILABLE, szUsername, MAX_PATH); + LoadStringW(hInst, IDS_NOT_AVAILABLE, szEventText, MAX_PATH); + LoadStringW(hInst, IDS_NONE, szCategory, MAX_PATH); // Get the event source name. lpSourceName = (LPWSTR)((LPBYTE)pevlr + sizeof(EVENTLOGRECORD)); @@ -1142,6 +1142,7 @@ DisplayEvent(HWND hDlg) SetDlgItemTextW(hDlg, IDC_EVENTDATESTATIC, szDate); SetDlgItemTextW(hDlg, IDC_EVENTTIMESTATIC, szTime); + SetDlgItemTextW(hDlg, IDC_EVENTUSERSTATIC, szUser); SetDlgItemTextW(hDlg, IDC_EVENTSOURCESTATIC, szSource); SetDlgItemTextW(hDlg, IDC_EVENTCOMPUTERSTATIC, szComputer); diff --git a/reactos/base/applications/mscutils/eventvwr/lang/bg-BG.rc b/reactos/base/applications/mscutils/eventvwr/lang/bg-BG.rc index c8e9e673a85..638bd578411 100644 --- a/reactos/base/applications/mscutils/eventvwr/lang/bg-BG.rc +++ b/reactos/base/applications/mscutils/eventvwr/lang/bg-BG.rc @@ -108,3 +108,9 @@ BEGIN IDS_COLUMNCOMPUTER "" IDS_COLUMNEVENTDATA " " END + +STRINGTABLE +BEGIN + IDS_NONE "None" + IDS_NOT_AVAILABLE "N/A" +END diff --git a/reactos/base/applications/mscutils/eventvwr/lang/de-DE.rc b/reactos/base/applications/mscutils/eventvwr/lang/de-DE.rc index 58dada9aa8b..a52269f750d 100644 --- a/reactos/base/applications/mscutils/eventvwr/lang/de-DE.rc +++ b/reactos/base/applications/mscutils/eventvwr/lang/de-DE.rc @@ -115,3 +115,9 @@ BEGIN IDS_COLUMNCOMPUTER "Computer" IDS_COLUMNEVENTDATA "Ereignisdaten" END + +STRINGTABLE +BEGIN + IDS_NONE "Keine" + IDS_NOT_AVAILABLE "Nicht verfgbar" +END diff --git a/reactos/base/applications/mscutils/eventvwr/lang/el-GR.rc b/reactos/base/applications/mscutils/eventvwr/lang/el-GR.rc index abbd7922319..48c8aa4a38e 100644 --- a/reactos/base/applications/mscutils/eventvwr/lang/el-GR.rc +++ b/reactos/base/applications/mscutils/eventvwr/lang/el-GR.rc @@ -115,3 +115,9 @@ BEGIN IDS_COLUMNCOMPUTER "Computer" IDS_COLUMNEVENTDATA "Event Data" END + +STRINGTABLE +BEGIN + IDS_NONE "None" + IDS_NOT_AVAILABLE "N/A" +END diff --git a/reactos/base/applications/mscutils/eventvwr/lang/en-US.rc b/reactos/base/applications/mscutils/eventvwr/lang/en-US.rc index fc19d72139f..396bc14c017 100644 --- a/reactos/base/applications/mscutils/eventvwr/lang/en-US.rc +++ b/reactos/base/applications/mscutils/eventvwr/lang/en-US.rc @@ -115,3 +115,9 @@ BEGIN IDS_COLUMNCOMPUTER "Computer" IDS_COLUMNEVENTDATA "Event Data" END + +STRINGTABLE +BEGIN + IDS_NONE "None" + IDS_NOT_AVAILABLE "N/A" +END diff --git a/reactos/base/applications/mscutils/eventvwr/lang/es-ES.rc b/reactos/base/applications/mscutils/eventvwr/lang/es-ES.rc index 2de3ec360b8..0bf199f22a7 100644 --- a/reactos/base/applications/mscutils/eventvwr/lang/es-ES.rc +++ b/reactos/base/applications/mscutils/eventvwr/lang/es-ES.rc @@ -115,3 +115,9 @@ BEGIN IDS_COLUMNCOMPUTER "Computadora" IDS_COLUMNEVENTDATA "Datos del evento" END + +STRINGTABLE +BEGIN + IDS_NONE "None" + IDS_NOT_AVAILABLE "N/A" +END diff --git a/reactos/base/applications/mscutils/eventvwr/lang/fr-FR.rc b/reactos/base/applications/mscutils/eventvwr/lang/fr-FR.rc index 54ad9cae749..2c9eeac7d73 100644 --- a/reactos/base/applications/mscutils/eventvwr/lang/fr-FR.rc +++ b/reactos/base/applications/mscutils/eventvwr/lang/fr-FR.rc @@ -115,3 +115,9 @@ BEGIN IDS_COLUMNCOMPUTER "Ordinateur" IDS_COLUMNEVENTDATA "Donnes" END + +STRINGTABLE +BEGIN + IDS_NONE "None" + IDS_NOT_AVAILABLE "N/A" +END diff --git a/reactos/base/applications/mscutils/eventvwr/lang/it-IT.rc b/reactos/base/applications/mscutils/eventvwr/lang/it-IT.rc index 6bfa290275c..342409733ae 100644 --- a/reactos/base/applications/mscutils/eventvwr/lang/it-IT.rc +++ b/reactos/base/applications/mscutils/eventvwr/lang/it-IT.rc @@ -115,3 +115,9 @@ BEGIN IDS_COLUMNCOMPUTER "Computer" IDS_COLUMNEVENTDATA "Dati Evento" END + +STRINGTABLE +BEGIN + IDS_NONE "None" + IDS_NOT_AVAILABLE "N/A" +END diff --git a/reactos/base/applications/mscutils/eventvwr/lang/ja-JP.rc b/reactos/base/applications/mscutils/eventvwr/lang/ja-JP.rc index ffd1e6a86e5..29552903f71 100644 --- a/reactos/base/applications/mscutils/eventvwr/lang/ja-JP.rc +++ b/reactos/base/applications/mscutils/eventvwr/lang/ja-JP.rc @@ -115,3 +115,9 @@ BEGIN IDS_COLUMNCOMPUTER "Computer" IDS_COLUMNEVENTDATA "Event Data" END + +STRINGTABLE +BEGIN + IDS_NONE "None" + IDS_NOT_AVAILABLE "N/A" +END diff --git a/reactos/base/applications/mscutils/eventvwr/lang/ko-KR.rc b/reactos/base/applications/mscutils/eventvwr/lang/ko-KR.rc index ba1228a040d..843a2319f17 100644 --- a/reactos/base/applications/mscutils/eventvwr/lang/ko-KR.rc +++ b/reactos/base/applications/mscutils/eventvwr/lang/ko-KR.rc @@ -111,3 +111,9 @@ BEGIN IDS_COLUMNCOMPUTER "Computer" IDS_COLUMNEVENTDATA "Event Data" END + +STRINGTABLE +BEGIN + IDS_NONE "None" + IDS_NOT_AVAILABLE "N/A" +END diff --git a/reactos/base/applications/mscutils/eventvwr/lang/no-NO.rc b/reactos/base/applications/mscutils/eventvwr/lang/no-NO.rc index 3c6561bb9e7..3022d16cac7 100644 --- a/reactos/base/applications/mscutils/eventvwr/lang/no-NO.rc +++ b/reactos/base/applications/mscutils/eventvwr/lang/no-NO.rc @@ -115,3 +115,9 @@ BEGIN IDS_COLUMNCOMPUTER "Computer" IDS_COLUMNEVENTDATA "Event Data" END + +STRINGTABLE +BEGIN + IDS_NONE "None" + IDS_NOT_AVAILABLE "N/A" +END diff --git a/reactos/base/applications/mscutils/eventvwr/lang/pl-PL.rc b/reactos/base/applications/mscutils/eventvwr/lang/pl-PL.rc index 05c7c256f08..63a1e6a7dbd 100644 --- a/reactos/base/applications/mscutils/eventvwr/lang/pl-PL.rc +++ b/reactos/base/applications/mscutils/eventvwr/lang/pl-PL.rc @@ -119,3 +119,9 @@ BEGIN IDS_COLUMNCOMPUTER "Komputer" IDS_COLUMNEVENTDATA "Dane zdarzenia" END + +STRINGTABLE +BEGIN + IDS_NONE "None" + IDS_NOT_AVAILABLE "N/A" +END diff --git a/reactos/base/applications/mscutils/eventvwr/lang/ro-RO.rc b/reactos/base/applications/mscutils/eventvwr/lang/ro-RO.rc index 7014f5b4937..0d70d059739 100644 --- a/reactos/base/applications/mscutils/eventvwr/lang/ro-RO.rc +++ b/reactos/base/applications/mscutils/eventvwr/lang/ro-RO.rc @@ -115,3 +115,9 @@ BEGIN IDS_COLUMNCOMPUTER "Computer" IDS_COLUMNEVENTDATA "Event Data" END + +STRINGTABLE +BEGIN + IDS_NONE "None" + IDS_NOT_AVAILABLE "N/A" +END diff --git a/reactos/base/applications/mscutils/eventvwr/lang/ru-RU.rc b/reactos/base/applications/mscutils/eventvwr/lang/ru-RU.rc index 59dce435d37..e2c6cb2f714 100644 --- a/reactos/base/applications/mscutils/eventvwr/lang/ru-RU.rc +++ b/reactos/base/applications/mscutils/eventvwr/lang/ru-RU.rc @@ -115,3 +115,9 @@ BEGIN IDS_COLUMNCOMPUTER "Computer" IDS_COLUMNEVENTDATA "Event Data" END + +STRINGTABLE +BEGIN + IDS_NONE "None" + IDS_NOT_AVAILABLE "N/A" +END diff --git a/reactos/base/applications/mscutils/eventvwr/lang/sk-SK.rc b/reactos/base/applications/mscutils/eventvwr/lang/sk-SK.rc index a0a6817edf3..8f57f621095 100644 --- a/reactos/base/applications/mscutils/eventvwr/lang/sk-SK.rc +++ b/reactos/base/applications/mscutils/eventvwr/lang/sk-SK.rc @@ -112,3 +112,9 @@ BEGIN IDS_COLUMNCOMPUTER "Computer" IDS_COLUMNEVENTDATA "Event Data" END + +STRINGTABLE +BEGIN + IDS_NONE "None" + IDS_NOT_AVAILABLE "N/A" +END diff --git a/reactos/base/applications/mscutils/eventvwr/lang/sv-SE.rc b/reactos/base/applications/mscutils/eventvwr/lang/sv-SE.rc index 2de7899c9cf..7dbd9718a69 100644 --- a/reactos/base/applications/mscutils/eventvwr/lang/sv-SE.rc +++ b/reactos/base/applications/mscutils/eventvwr/lang/sv-SE.rc @@ -115,3 +115,9 @@ BEGIN IDS_COLUMNCOMPUTER "Dator" IDS_COLUMNEVENTDATA "Hndelsedata" END + +STRINGTABLE +BEGIN + IDS_NONE "None" + IDS_NOT_AVAILABLE "N/A" +END diff --git a/reactos/base/applications/mscutils/eventvwr/lang/uk-UA.rc b/reactos/base/applications/mscutils/eventvwr/lang/uk-UA.rc index 55f31d90528..8a703aecf5c 100644 --- a/reactos/base/applications/mscutils/eventvwr/lang/uk-UA.rc +++ b/reactos/base/applications/mscutils/eventvwr/lang/uk-UA.rc @@ -115,3 +115,9 @@ BEGIN IDS_COLUMNCOMPUTER "'" IDS_COLUMNEVENTDATA " 䳿" END + +STRINGTABLE +BEGIN + IDS_NONE "None" + IDS_NOT_AVAILABLE "N/A" +END diff --git a/reactos/base/applications/mscutils/eventvwr/resource.h b/reactos/base/applications/mscutils/eventvwr/resource.h index b6869b22fc0..93f2a868264 100644 --- a/reactos/base/applications/mscutils/eventvwr/resource.h +++ b/reactos/base/applications/mscutils/eventvwr/resource.h @@ -64,3 +64,6 @@ #define IDS_COLUMNCOMPUTER 307 #define IDS_COLUMNEVENTDATA 308 +#define IDS_NONE 320 +#define IDS_NOT_AVAILABLE 321 + From e2dfab00f433736fca662fb6cd6bfff915c0bb48 Mon Sep 17 00:00:00 2001 From: Gregor Schneider Date: Sun, 1 May 2011 19:16:58 +0000 Subject: [PATCH 273/317] [charmap] - Carlo Bramini: implement a skeleton for the charmap advanced view, Italian translation included - German translation added by myself See issue #6065 for more details. svn path=/trunk/; revision=51537 --- reactos/base/applications/charmap/charmap.c | 335 +++++++++++++----- .../base/applications/charmap/charmap.rbuild | 10 +- .../base/applications/charmap/lang/bg-BG.rc | 24 +- .../base/applications/charmap/lang/ca-ES.rc | 24 +- .../base/applications/charmap/lang/cs-CZ.rc | 24 +- .../base/applications/charmap/lang/de-DE.rc | 32 +- .../base/applications/charmap/lang/el-GR.rc | 24 +- .../base/applications/charmap/lang/en-US.rc | 24 +- .../base/applications/charmap/lang/es-ES.rc | 24 +- .../base/applications/charmap/lang/fr-FR.rc | 24 +- .../base/applications/charmap/lang/id-ID.rc | 24 +- .../base/applications/charmap/lang/it-IT.rc | 28 +- .../base/applications/charmap/lang/ja-JP.rc | 24 +- .../base/applications/charmap/lang/ko-KR.rc | 24 +- .../base/applications/charmap/lang/lt-LT.rc | 24 +- .../base/applications/charmap/lang/nl-NL.rc | 24 +- .../base/applications/charmap/lang/no-NO.rc | 24 +- .../base/applications/charmap/lang/pl-PL.rc | 24 +- .../base/applications/charmap/lang/pt-BR.rc | 24 +- .../base/applications/charmap/lang/ru-RU.rc | 24 +- .../base/applications/charmap/lang/sk-SK.rc | 24 +- .../base/applications/charmap/lang/uk-UA.rc | 24 +- .../base/applications/charmap/lang/zh-CN.rc | 24 +- .../base/applications/charmap/lang/zh-TW.rc | 24 +- reactos/base/applications/charmap/precomp.h | 5 +- reactos/base/applications/charmap/resource.h | 39 +- 26 files changed, 709 insertions(+), 220 deletions(-) diff --git a/reactos/base/applications/charmap/charmap.c b/reactos/base/applications/charmap/charmap.c index 6f91d5b4ef9..5b4b4026dc5 100644 --- a/reactos/base/applications/charmap/charmap.c +++ b/reactos/base/applications/charmap/charmap.c @@ -11,7 +11,17 @@ #define ID_ABOUT 0x1 +typedef struct { + BOOL IsAdvancedView; +} SETTINGS; + HINSTANCE hInstance; +HWND hCharmapDlg; +HWND hAdvancedDlg; +HWND hStatusWnd; +HICON hSmIcon; +HICON hBgIcon; +SETTINGS Settings; /* Font-enumeration callback */ static @@ -226,76 +236,91 @@ AddCharToSelection(HWND hDlg, WCHAR ch) } +static +void +UpdateSettings(HWND hDlg) +{ + if (hDlg == hCharmapDlg) + { + Settings.IsAdvancedView = + SendDlgItemMessage(hDlg, IDC_CHECK_ADVANCED, BM_GETCHECK, 0, 0); + } + + if (hDlg == hAdvancedDlg) + { + } +} + +static +void +ChangeView(HWND hWnd) +{ + RECT rcCharmap; + RECT rcAdvanced; + RECT rcPanelExt; + RECT rcPanelInt; + RECT rcStatus; + UINT DeX, DeY; + UINT xPos, yPos; + UINT Width, Height; + UINT DeskTopWidth, DeskTopHeight; + + GetClientRect(hCharmapDlg, &rcCharmap); + GetClientRect(hAdvancedDlg, &rcAdvanced); + GetWindowRect(hWnd, &rcPanelExt); + GetClientRect(hWnd, &rcPanelInt); + GetClientRect(hStatusWnd, &rcStatus); + + DeskTopWidth = GetSystemMetrics(SM_CXFULLSCREEN); + DeskTopHeight = GetSystemMetrics(SM_CYFULLSCREEN); + + DeX = (rcPanelExt.right - rcPanelExt.left) - rcPanelInt.right; + DeY = (rcPanelExt.bottom - rcPanelExt.top) - rcPanelInt.bottom; + + MoveWindow(hCharmapDlg, 0, 0, rcCharmap.right, rcCharmap.bottom, FALSE); + MoveWindow(hAdvancedDlg, 0, rcCharmap.bottom, rcAdvanced.right, rcAdvanced.bottom, FALSE); + + ShowWindow(hAdvancedDlg, (Settings.IsAdvancedView) ? SW_SHOW : SW_HIDE); + + xPos = rcPanelExt.left; + yPos = rcPanelExt.top; + + Width = DeX + rcCharmap.right; + Height = DeY + rcCharmap.bottom + rcStatus.bottom; + + if (Settings.IsAdvancedView) + Height += rcAdvanced.bottom; + + if ((xPos + Width) > DeskTopWidth) + xPos += DeskTopWidth - (xPos + Width); + + if ((yPos + Height) > DeskTopHeight) + yPos += DeskTopHeight - (yPos + Height); + + MoveWindow(hWnd, + xPos, yPos, + Width, Height, + TRUE); +} + static INT_PTR CALLBACK -DlgProc(HWND hDlg, - UINT Message, - WPARAM wParam, - LPARAM lParam) +CharMapDlgProc(HWND hDlg, + UINT Message, + WPARAM wParam, + LPARAM lParam) { - static HICON hSmIcon; - static HICON hBgIcon; - LPWSTR lpAboutText = NULL; - switch(Message) { case WM_INITDIALOG: { - HMENU hSysMenu; DWORD evMask; - hSmIcon = LoadImageW(hInstance, - MAKEINTRESOURCEW(IDI_ICON), - IMAGE_ICON, - 16, - 16, - 0); - if (hSmIcon) - { - SendMessageW(hDlg, - WM_SETICON, - ICON_SMALL, - (LPARAM)hSmIcon); - } - - hBgIcon = LoadImageW(hInstance, - MAKEINTRESOURCEW(IDI_ICON), - IMAGE_ICON, - 32, - 32, - 0); - if (hBgIcon) - { - SendMessageW(hDlg, - WM_SETICON, - ICON_BIG, - (LPARAM)hBgIcon); - } - FillFontStyleComboList(GetDlgItem(hDlg, IDC_FONTCOMBO)); ChangeMapFont(hDlg); - hSysMenu = GetSystemMenu(hDlg, - FALSE); - if (hSysMenu != NULL) - { - if (LoadStringW(hInstance, - IDS_ABOUT, - lpAboutText, - 0)) - { - AppendMenuW(hSysMenu, - MF_SEPARATOR, - 0, - NULL); - AppendMenuW(hSysMenu, - MF_STRING, - ID_ABOUT, - lpAboutText); - } - } // Configure Richedi control for sending notification changes. evMask = SendDlgItemMessage(hDlg, IDC_TEXTBOX, EM_GETEVENTMASK, 0, 0); @@ -344,35 +369,33 @@ DlgProc(HWND hDlg, CopyCharacters(hDlg); break; - case IDOK: - if (hSmIcon) - DestroyIcon(hSmIcon); - if (hBgIcon) - DestroyIcon(hBgIcon); - EndDialog(hDlg, 0); + case IDC_CHECK_ADVANCED: + UpdateSettings(hDlg); + ChangeView(GetParent(hDlg)); break; } } break; - case WM_SYSCOMMAND: - { - switch(wParam) - { - case ID_ABOUT: - ShowAboutDlg(hDlg); - break; - } - } - break; - - case WM_CLOSE: - if (hSmIcon) - DestroyIcon(hSmIcon); - if (hBgIcon) - DestroyIcon(hBgIcon); - EndDialog(hDlg, 0); + default: break; + } + + return FALSE; +} + +static +INT_PTR +CALLBACK +AdvancedDlgProc(HWND hDlg, + UINT Message, + WPARAM wParam, + LPARAM lParam) +{ + switch(Message) + { + case WM_INITDIALOG: + return TRUE; default: return FALSE; @@ -381,6 +404,142 @@ DlgProc(HWND hDlg, return FALSE; } +static int +OnCreate(HWND hWnd, WPARAM wParam, LPARAM lParam) +{ + HMENU hSysMenu; + WCHAR lpAboutText[256]; + + hCharmapDlg = CreateDialog(hInstance, + MAKEINTRESOURCE(IDD_CHARMAP), + hWnd, + CharMapDlgProc); + + hAdvancedDlg = CreateDialog(hInstance, + MAKEINTRESOURCE(IDD_ADVANCED), + hWnd, + AdvancedDlgProc); + + hStatusWnd = CreateWindow(STATUSCLASSNAME, + NULL, + WS_CHILD | WS_VISIBLE, + 0, 0, 0, 0, + hWnd, + (HMENU)IDD_STATUSBAR, + hInstance, + NULL); + + // Set the status bar for multiple parts output + SendMessage(hStatusWnd, SB_SIMPLE, (WPARAM)FALSE, (LPARAM)0); + + ChangeView(hWnd); + + hSysMenu = GetSystemMenu(hWnd, FALSE); + + if (hSysMenu != NULL) + { + if (LoadStringW(hInstance, IDS_ABOUT, lpAboutText, SIZEOF(lpAboutText))) + { + AppendMenuW(hSysMenu, MF_SEPARATOR, 0, NULL); + AppendMenuW(hSysMenu, MF_STRING, ID_ABOUT, lpAboutText); + } + } + + return 0; +} + +static LRESULT CALLBACK +PanelWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + switch (msg) { + case WM_CREATE: + return OnCreate(hWnd, wParam, lParam); + + case WM_CLOSE: + DestroyWindow(hWnd); + return 0; + + case WM_SIZE: + SendMessage(hStatusWnd, msg, wParam, lParam); + break; + + case WM_DESTROY: + PostQuitMessage(0); + return 0; + + case WM_SYSCOMMAND: + switch(wParam) { + case ID_ABOUT: + ShowAboutDlg(hWnd); + break; + } + break; + + } + + return DefWindowProc(hWnd, msg, wParam, lParam); +} + +static HWND +InitInstance(HINSTANCE hInst) +{ + WCHAR szClass[] = L"CharMap"; + WCHAR szTitle[256]; + WNDCLASSEXW wc; + HWND hWnd; + + LoadStringW(hInst, IDS_TITLE, szTitle, SIZEOF(szTitle)); + + hSmIcon = LoadImage(hInstance, + MAKEINTRESOURCE(IDI_ICON), + IMAGE_ICON, + 16, + 16, + 0); + + hBgIcon = LoadImage(hInstance, + MAKEINTRESOURCE(IDI_ICON), + IMAGE_ICON, + 32, + 32, + 0); + + // Create workspace + ZeroMemory(&wc, sizeof(wc)); + + wc.cbSize = sizeof(wc); + wc.lpfnWndProc = PanelWndProc; + wc.hInstance = hInst; + wc.hIcon = hBgIcon; + wc.hCursor = LoadCursor(NULL, IDC_ARROW); + wc.hbrBackground = (HBRUSH)GetStockObject(NULL_BRUSH); + wc.lpszMenuName = NULL; + wc.lpszClassName = szClass; + wc.hIconSm = hSmIcon; + + RegisterClassExW(&wc); + + hWnd = CreateWindowW( + szClass, + szTitle, + WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX, + CW_USEDEFAULT, + CW_USEDEFAULT, + CW_USEDEFAULT, + CW_USEDEFAULT, + NULL, + NULL, + hInst, + NULL); + + if (hWnd != NULL) + { + ShowWindow(hWnd, SW_SHOW); + UpdateWindow(hWnd); + } + + return hWnd; +} INT WINAPI @@ -392,6 +551,7 @@ wWinMain(HINSTANCE hInst, INITCOMMONCONTROLSEX iccx; INT Ret = 1; HMODULE hRichEd20; + MSG Msg; hInstance = hInst; @@ -405,10 +565,19 @@ wWinMain(HINSTANCE hInst, if (hRichEd20 != NULL) { - Ret = DialogBoxW(hInstance, - MAKEINTRESOURCEW(IDD_CHARMAP), - NULL, - DlgProc) >= 0; + InitInstance(hInst); + + for (;;) + { + if (GetMessage(&Msg, NULL, 0, 0) <= 0) + { + Ret = Msg.wParam; + break; + } + + TranslateMessage(&Msg); + DispatchMessage(&Msg); + } FreeLibrary(hRichEd20); } diff --git a/reactos/base/applications/charmap/charmap.rbuild b/reactos/base/applications/charmap/charmap.rbuild index 76a1d64155b..bdea2fd7f1f 100644 --- a/reactos/base/applications/charmap/charmap.rbuild +++ b/reactos/base/applications/charmap/charmap.rbuild @@ -5,12 +5,10 @@ gdi32 user32 comctl32 - - about.c - charmap.c - lrgcell.c - map.c - + about.c + charmap.c + lrgcell.c + map.c charmap.rc precomp.h diff --git a/reactos/base/applications/charmap/lang/bg-BG.rc b/reactos/base/applications/charmap/lang/bg-BG.rc index a4c203b4e9f..860ca4bd464 100644 --- a/reactos/base/applications/charmap/lang/bg-BG.rc +++ b/reactos/base/applications/charmap/lang/bg-BG.rc @@ -1,9 +1,8 @@ LANGUAGE LANG_BULGARIAN, SUBLANG_DEFAULT -IDD_CHARMAP DIALOGEX 6, 6, 293, 205 //233 -CAPTION " " +IDD_CHARMAP DIALOGEX 6, 6, 292, 224 FONT 8,"MS Shell Dlg",0,0 -STYLE DS_SHELLFONT | WS_BORDER | WS_VISIBLE | WS_SYSMENU | WS_MINIMIZEBOX +STYLE DS_SHELLFONT | WS_CHILD | WS_VISIBLE BEGIN LTEXT " :", IDC_STATIC, 6, 7, 24, 9 COMBOBOX IDC_FONTCOMBO, 36, 5, 210, 210, WS_CHILD | WS_VISIBLE | WS_VSCROLL | CBS_DROPDOWNLIST | CBS_SORT | CBS_HASSTRINGS @@ -13,8 +12,22 @@ BEGIN CONTROL "",IDC_TEXTBOX,RICHEDIT_CLASS,ES_AUTOHSCROLL | WS_BORDER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 74, 186, 114, 13 DEFPUSHBUTTON "", IDC_SELECT, 194, 186, 44, 13 PUSHBUTTON "", IDC_COPY, 242, 186, 44, 13, WS_DISABLED - //AUTOCHECKBOX "a ", IDC_ADVVIEW, 10, 204, 64, 9, WS_CHILD | WS_VISIBLE | WS_TABSTOP - //EDITTEXT IDC_DISPLAY, 8, 217, 278, 13, WS_VISIBLE | WS_TABSTOP | ES_READONLY + CONTROL "Advanced view",IDC_CHECK_ADVANCED,"Button", BS_AUTOCHECKBOX | WS_TABSTOP, 8, 208, 95, 10 +END + +IDD_ADVANCED DIALOGEX 0, 0, 292, 64 +STYLE DS_SHELLFONT | WS_CHILD +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Charset:",IDC_STATIC,8,8,48,8 + COMBOBOX IDC_COMBO_CHARSET,72,4,116,80,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "Group by:",IDC_STATIC,8,28,50,8 + COMBOBOX IDC_COMBO_GROUPBY,72,24,116,80,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Search",IDC_BUTTON_SEARCH,200,44,50,14 + EDITTEXT IDC_EDIT_SEARCH,72,44,116,14,ES_AUTOHSCROLL + LTEXT "Search for:",IDC_STATIC,8,48,42,8 + LTEXT "Unicode:",IDC_STATIC,200,8,30,8 + EDITTEXT IDC_EDIT_UNICODE,236,4,28,12,ES_AUTOHSCROLL END IDD_ABOUTBOX DIALOGEX 22,16,210,182 @@ -32,4 +45,5 @@ STRINGTABLE DISCARDABLE BEGIN IDS_LICENSE "This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.\r\n\r\nThis program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\r\n\r\nYou should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA." IDS_ABOUT "&..." + IDS_TITLE "Character Map" END diff --git a/reactos/base/applications/charmap/lang/ca-ES.rc b/reactos/base/applications/charmap/lang/ca-ES.rc index 102e1ceb4f7..19a4157dc0c 100644 --- a/reactos/base/applications/charmap/lang/ca-ES.rc +++ b/reactos/base/applications/charmap/lang/ca-ES.rc @@ -1,9 +1,8 @@ LANGUAGE LANG_CATALAN, SUBLANG_DEFAULT -IDD_CHARMAP DIALOGEX 6, 6, 293, 205 //233 -CAPTION "Mapa de carcters" +IDD_CHARMAP DIALOGEX 6, 6, 292, 224 FONT 8,"MS Shell Dlg",0,0 -STYLE DS_SHELLFONT | WS_BORDER | WS_VISIBLE | WS_SYSMENU | WS_MINIMIZEBOX +STYLE DS_SHELLFONT | WS_CHILD | WS_VISIBLE BEGIN LTEXT "Font :", IDC_STATIC, 6, 7, 24, 9 COMBOBOX IDC_FONTCOMBO, 36, 5, 210, 210, WS_CHILD | WS_VISIBLE | WS_VSCROLL | CBS_DROPDOWNLIST | CBS_SORT | CBS_HASSTRINGS @@ -13,8 +12,22 @@ BEGIN CONTROL "",IDC_TEXTBOX,RICHEDIT_CLASS,ES_AUTOHSCROLL | WS_BORDER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 74, 186, 114, 13 DEFPUSHBUTTON "Selecciona", IDC_SELECT, 194, 186, 44, 13 PUSHBUTTON "Copia", IDC_COPY, 242, 186, 44, 13, WS_DISABLED - //AUTOCHECKBOX "Vista avanada", IDC_ADVVIEW, 10, 204, 64, 9, WS_CHILD | WS_VISIBLE | WS_TABSTOP - //EDITTEXT IDC_DISPLAY, 8, 217, 278, 13, WS_VISIBLE | WS_TABSTOP | ES_READONLY + CONTROL "Advanced view",IDC_CHECK_ADVANCED,"Button", BS_AUTOCHECKBOX | WS_TABSTOP, 8, 208, 95, 10 +END + +IDD_ADVANCED DIALOGEX 0, 0, 292, 64 +STYLE DS_SHELLFONT | WS_CHILD +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Charset:",IDC_STATIC,8,8,48,8 + COMBOBOX IDC_COMBO_CHARSET,72,4,116,80,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "Group by:",IDC_STATIC,8,28,50,8 + COMBOBOX IDC_COMBO_GROUPBY,72,24,116,80,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Search",IDC_BUTTON_SEARCH,200,44,50,14 + EDITTEXT IDC_EDIT_SEARCH,72,44,116,14,ES_AUTOHSCROLL + LTEXT "Search for:",IDC_STATIC,8,48,42,8 + LTEXT "Unicode:",IDC_STATIC,200,8,30,8 + EDITTEXT IDC_EDIT_UNICODE,236,4,28,12,ES_AUTOHSCROLL END IDD_ABOUTBOX DIALOGEX 22,16,210,182 @@ -32,4 +45,5 @@ STRINGTABLE DISCARDABLE BEGIN IDS_LICENSE "This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.\r\n\r\nThis program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\r\n\r\nYou should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA." IDS_ABOUT "&En quant a..." + IDS_TITLE "Character Map" END diff --git a/reactos/base/applications/charmap/lang/cs-CZ.rc b/reactos/base/applications/charmap/lang/cs-CZ.rc index d31df8eb885..ff50115013d 100644 --- a/reactos/base/applications/charmap/lang/cs-CZ.rc +++ b/reactos/base/applications/charmap/lang/cs-CZ.rc @@ -5,10 +5,9 @@ LANGUAGE LANG_CZECH, SUBLANG_DEFAULT -IDD_CHARMAP DIALOGEX 6, 6, 293, 205 //233 -CAPTION "Mapa znak" +IDD_CHARMAP DIALOGEX 6, 6, 292, 224 FONT 8,"MS Shell Dlg",0,0 -STYLE DS_SHELLFONT | WS_BORDER | WS_VISIBLE | WS_SYSMENU | WS_MINIMIZEBOX +STYLE DS_SHELLFONT | WS_CHILD | WS_VISIBLE BEGIN LTEXT "Psmo:", IDC_STATIC, 6, 7, 24, 9 COMBOBOX IDC_FONTCOMBO, 36, 5, 210, 210, WS_CHILD | WS_VISIBLE | WS_VSCROLL | CBS_DROPDOWNLIST | CBS_SORT | CBS_HASSTRINGS @@ -18,8 +17,22 @@ BEGIN CONTROL "",IDC_TEXTBOX,RICHEDIT_CLASS,ES_AUTOHSCROLL | WS_BORDER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 74, 186, 114, 13 DEFPUSHBUTTON "Oznait", IDC_SELECT, 194, 186, 44, 13 PUSHBUTTON "Koprovat", IDC_COPY, 242, 186, 44, 13, WS_DISABLED - //AUTOCHECKBOX "Pokroil zobrazen", IDC_ADVVIEW, 10, 204, 64, 9, WS_CHILD | WS_VISIBLE | WS_TABSTOP - //EDITTEXT IDC_DISPLAY, 8, 217, 278, 13, WS_VISIBLE | WS_TABSTOP | ES_READONLY + CONTROL "Advanced view",IDC_CHECK_ADVANCED,"Button", BS_AUTOCHECKBOX | WS_TABSTOP, 8, 208, 95, 10 +END + +IDD_ADVANCED DIALOGEX 0, 0, 292, 64 +STYLE DS_SHELLFONT | WS_CHILD +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Charset:",IDC_STATIC,8,8,48,8 + COMBOBOX IDC_COMBO_CHARSET,72,4,116,80,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "Group by:",IDC_STATIC,8,28,50,8 + COMBOBOX IDC_COMBO_GROUPBY,72,24,116,80,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Search",IDC_BUTTON_SEARCH,200,44,50,14 + EDITTEXT IDC_EDIT_SEARCH,72,44,116,14,ES_AUTOHSCROLL + LTEXT "Search for:",IDC_STATIC,8,48,42,8 + LTEXT "Unicode:",IDC_STATIC,200,8,30,8 + EDITTEXT IDC_EDIT_UNICODE,236,4,28,12,ES_AUTOHSCROLL END IDD_ABOUTBOX DIALOGEX 22,16,210,182 @@ -37,4 +50,5 @@ STRINGTABLE DISCARDABLE BEGIN IDS_LICENSE "This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.\r\n\r\nThis program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\r\n\r\nYou should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA." IDS_ABOUT "&O programu..." + IDS_TITLE "Character Map" END diff --git a/reactos/base/applications/charmap/lang/de-DE.rc b/reactos/base/applications/charmap/lang/de-DE.rc index cecf8fe2621..d1feda73713 100644 --- a/reactos/base/applications/charmap/lang/de-DE.rc +++ b/reactos/base/applications/charmap/lang/de-DE.rc @@ -1,20 +1,33 @@ LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL -IDD_CHARMAP DIALOGEX 6, 6, 293, 205 //233 -CAPTION "Zeichentabelle" +IDD_CHARMAP DIALOGEX 6, 6, 292, 224 FONT 8,"MS Shell Dlg",0,0 -STYLE DS_SHELLFONT | WS_BORDER | WS_VISIBLE | WS_SYSMENU | WS_MINIMIZEBOX +STYLE DS_SHELLFONT | WS_CHILD | WS_VISIBLE BEGIN LTEXT "Schrift:", IDC_STATIC, 6, 7, 24, 9 COMBOBOX IDC_FONTCOMBO, 36, 5, 210, 210, WS_CHILD | WS_VISIBLE | WS_VSCROLL | CBS_DROPDOWNLIST | CBS_SORT | CBS_HASSTRINGS - PUSHBUTTON "Hilfe", IDC_CMHELP, 249, 5, 35, 13 + PUSHBUTTON "&Hilfe", IDC_CMHELP, 249, 5, 35, 13 CONTROL "", IDC_FONTMAP, "FontMapWnd", WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL, 20, 22, 266, 156 - LTEXT "Zeichenauswahl:", IDC_STATIC, 6, 188, 66, 9 + LTEXT "Zeichenaus&wahl:", IDC_STATIC, 6, 188, 66, 9 CONTROL "",IDC_TEXTBOX,RICHEDIT_CLASS,ES_AUTOHSCROLL | WS_BORDER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 74, 186, 114, 13 - DEFPUSHBUTTON "Auswhlen", IDC_SELECT, 194, 186, 44, 13 - PUSHBUTTON "Kopieren", IDC_COPY, 242, 186, 44, 13, WS_DISABLED - //AUTOCHECKBOX "Erweiterte Ansicht", IDC_ADVVIEW, 10, 204, 64, 9, WS_CHILD | WS_VISIBLE | WS_TABSTOP - //EDITTEXT IDC_DISPLAY, 8, 217, 278, 13, WS_VISIBLE | WS_TABSTOP | ES_READONLY + DEFPUSHBUTTON "&Auswhlen", IDC_SELECT, 194, 186, 44, 13 + PUSHBUTTON "&Kopieren", IDC_COPY, 242, 186, 44, 13, WS_DISABLED + CONTROL "&Erweiterte Ansicht",IDC_CHECK_ADVANCED,"Button", BS_AUTOCHECKBOX | WS_TABSTOP, 8, 208, 95, 10 +END + +IDD_ADVANCED DIALOGEX 0, 0, 292, 64 +STYLE DS_SHELLFONT | WS_CHILD +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "&Zeichensatz:",IDC_STATIC,8,8,48,8 + COMBOBOX IDC_COMBO_CHARSET,72,4,116,80,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "&Gruppieren nach:",IDC_STATIC,8,28,58,8 + COMBOBOX IDC_COMBO_GROUPBY,72,24,116,80,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "&Suchen",IDC_BUTTON_SEARCH,200,44,50,14 + EDITTEXT IDC_EDIT_SEARCH,72,44,116,14,ES_AUTOHSCROLL + LTEXT "Su&chen nach:",IDC_STATIC,8,48,46,8 + LTEXT "&Unicode:",IDC_STATIC,200,8,30,8 + EDITTEXT IDC_EDIT_UNICODE,236,4,28,12,ES_AUTOHSCROLL END IDD_ABOUTBOX DIALOGEX 22,16,210,182 @@ -32,4 +45,5 @@ STRINGTABLE DISCARDABLE BEGIN IDS_LICENSE "Dieses Programm ist kostenlos; Sie knnen es frei verteilen mit od. ohne nderungen unter der GNU Lesser General Public License wie es von der Free Software Foundation verffentlicht wurde; entweder Version 2.1 der Lizenz, oder eine sptere Version (ihrer Wahl).\r\n\r\nThis program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\r\n\r\nYou should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA." IDS_ABOUT "&ber..." + IDS_TITLE "Zeichentabelle" END diff --git a/reactos/base/applications/charmap/lang/el-GR.rc b/reactos/base/applications/charmap/lang/el-GR.rc index 4ad6c2764cb..46fa157868a 100644 --- a/reactos/base/applications/charmap/lang/el-GR.rc +++ b/reactos/base/applications/charmap/lang/el-GR.rc @@ -1,9 +1,8 @@ LANGUAGE LANG_GREEK, SUBLANG_DEFAULT -IDD_CHARMAP DIALOGEX 6, 6, 293, 205 -STYLE DS_SHELLFONT | WS_MINIMIZEBOX | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION " " -FONT 8, "MS Shell Dlg" +IDD_CHARMAP DIALOGEX 6, 6, 292, 224 +FONT 8,"MS Shell Dlg",0,0 +STYLE DS_SHELLFONT | WS_CHILD | WS_VISIBLE BEGIN LTEXT " :",IDC_STATIC,6,7,60,9 COMBOBOX IDC_FONTCOMBO,65,5,181,210,CBS_DROPDOWNLIST | CBS_SORT | @@ -15,6 +14,22 @@ BEGIN CONTROL "",IDC_TEXTBOX,RICHEDIT_CLASS,ES_AUTOHSCROLL | WS_BORDER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 74, 186, 114, 13 DEFPUSHBUTTON "",IDC_SELECT,194,186,44,13 PUSHBUTTON "",IDC_COPY,242,186,44,13,WS_DISABLED + CONTROL "Advanced view",IDC_CHECK_ADVANCED,"Button", BS_AUTOCHECKBOX | WS_TABSTOP, 8, 208, 95, 10 +END + +IDD_ADVANCED DIALOGEX 0, 0, 292, 64 +STYLE DS_SHELLFONT | WS_CHILD +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Charset:",IDC_STATIC,8,8,48,8 + COMBOBOX IDC_COMBO_CHARSET,72,4,116,80,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "Group by:",IDC_STATIC,8,28,50,8 + COMBOBOX IDC_COMBO_GROUPBY,72,24,116,80,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Search",IDC_BUTTON_SEARCH,200,44,50,14 + EDITTEXT IDC_EDIT_SEARCH,72,44,116,14,ES_AUTOHSCROLL + LTEXT "Search for:",IDC_STATIC,8,48,42,8 + LTEXT "Unicode:",IDC_STATIC,200,8,30,8 + EDITTEXT IDC_EDIT_UNICODE,236,4,28,12,ES_AUTOHSCROLL END IDD_ABOUTBOX DIALOGEX 22, 16, 210, 182 @@ -34,4 +49,5 @@ STRINGTABLE DISCARDABLE BEGIN IDS_LICENSE "This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.\r\n\r\nThis program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\r\n\r\nYou should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA." IDS_ABOUT "&..." + IDS_TITLE "Character Map" END diff --git a/reactos/base/applications/charmap/lang/en-US.rc b/reactos/base/applications/charmap/lang/en-US.rc index 9cf7dfc5347..6e9e5f51d5f 100644 --- a/reactos/base/applications/charmap/lang/en-US.rc +++ b/reactos/base/applications/charmap/lang/en-US.rc @@ -1,9 +1,8 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -IDD_CHARMAP DIALOGEX 6, 6, 293, 205 //233 -CAPTION "Character Map" +IDD_CHARMAP DIALOGEX 6, 6, 292, 224 FONT 8,"MS Shell Dlg",0,0 -STYLE DS_SHELLFONT | WS_BORDER | WS_VISIBLE | WS_SYSMENU | WS_MINIMIZEBOX +STYLE DS_SHELLFONT | WS_CHILD | WS_VISIBLE BEGIN LTEXT "Font:", IDC_STATIC, 6, 7, 24, 9 COMBOBOX IDC_FONTCOMBO, 36, 5, 210, 210, WS_CHILD | WS_VISIBLE | WS_VSCROLL | CBS_DROPDOWNLIST | CBS_SORT | CBS_HASSTRINGS @@ -13,8 +12,22 @@ BEGIN CONTROL "",IDC_TEXTBOX,RICHEDIT_CLASS,ES_AUTOHSCROLL | WS_BORDER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 74, 186, 114, 13 DEFPUSHBUTTON "Select", IDC_SELECT, 194, 186, 44, 13 PUSHBUTTON "Copy", IDC_COPY, 242, 186, 44, 13, WS_DISABLED - //AUTOCHECKBOX "Advanced view", IDC_ADVVIEW, 10, 204, 64, 9, WS_CHILD | WS_VISIBLE | WS_TABSTOP - //EDITTEXT IDC_DISPLAY, 8, 217, 278, 13, WS_VISIBLE | WS_TABSTOP | ES_READONLY + CONTROL "Advanced view",IDC_CHECK_ADVANCED,"Button", BS_AUTOCHECKBOX | WS_TABSTOP, 8, 208, 95, 10 +END + +IDD_ADVANCED DIALOGEX 0, 0, 292, 64 +STYLE DS_SHELLFONT | WS_CHILD +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Charset:",IDC_STATIC,8,8,48,8 + COMBOBOX IDC_COMBO_CHARSET,72,4,116,80,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "Group by:",IDC_STATIC,8,28,50,8 + COMBOBOX IDC_COMBO_GROUPBY,72,24,116,80,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Search",IDC_BUTTON_SEARCH,200,44,50,14 + EDITTEXT IDC_EDIT_SEARCH,72,44,116,14,ES_AUTOHSCROLL + LTEXT "Search for:",IDC_STATIC,8,48,42,8 + LTEXT "Unicode:",IDC_STATIC,200,8,30,8 + EDITTEXT IDC_EDIT_UNICODE,236,4,28,12,ES_AUTOHSCROLL END IDD_ABOUTBOX DIALOGEX 22,16,210,182 @@ -32,4 +45,5 @@ STRINGTABLE DISCARDABLE BEGIN IDS_LICENSE "This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.\r\n\r\nThis program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\r\n\r\nYou should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA." IDS_ABOUT "A&bout..." + IDS_TITLE "Character Map" END diff --git a/reactos/base/applications/charmap/lang/es-ES.rc b/reactos/base/applications/charmap/lang/es-ES.rc index ada78f80c69..a15d8b3fe70 100644 --- a/reactos/base/applications/charmap/lang/es-ES.rc +++ b/reactos/base/applications/charmap/lang/es-ES.rc @@ -1,9 +1,8 @@ LANGUAGE LANG_SPANISH, SUBLANG_NEUTRAL -IDD_CHARMAP DIALOGEX 6, 6, 293, 205 //233 -CAPTION "Mapa de Caracteres" +IDD_CHARMAP DIALOGEX 6, 6, 292, 224 FONT 8,"MS Shell Dlg",0,0 -STYLE DS_SHELLFONT | WS_BORDER | WS_VISIBLE | WS_SYSMENU | WS_MINIMIZEBOX +STYLE DS_SHELLFONT | WS_CHILD | WS_VISIBLE BEGIN LTEXT "Fuente :", IDC_STATIC, 6, 7, 24, 9 COMBOBOX IDC_FONTCOMBO, 36, 5, 210, 210, WS_CHILD | WS_VISIBLE | WS_VSCROLL | CBS_DROPDOWNLIST | CBS_SORT | CBS_HASSTRINGS @@ -13,8 +12,22 @@ BEGIN CONTROL "",IDC_TEXTBOX,RICHEDIT_CLASS,ES_AUTOHSCROLL | WS_BORDER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 74, 186, 114, 13 DEFPUSHBUTTON "Seleccionar", IDC_SELECT, 194, 186, 44, 13 PUSHBUTTON "Copiar", IDC_COPY, 242, 186, 44, 13, WS_DISABLED - //AUTOCHECKBOX "Vista Avanzada", IDC_ADVVIEW, 10, 204, 64, 9, WS_CHILD | WS_VISIBLE | WS_TABSTOP - //EDITTEXT IDC_DISPLAY, 8, 217, 278, 13, WS_VISIBLE | WS_TABSTOP | ES_READONLY + CONTROL "Advanced view",IDC_CHECK_ADVANCED,"Button", BS_AUTOCHECKBOX | WS_TABSTOP, 8, 208, 95, 10 +END + +IDD_ADVANCED DIALOGEX 0, 0, 292, 64 +STYLE DS_SHELLFONT | WS_CHILD +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Charset:",IDC_STATIC,8,8,48,8 + COMBOBOX IDC_COMBO_CHARSET,72,4,116,80,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "Group by:",IDC_STATIC,8,28,50,8 + COMBOBOX IDC_COMBO_GROUPBY,72,24,116,80,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Search",IDC_BUTTON_SEARCH,200,44,50,14 + EDITTEXT IDC_EDIT_SEARCH,72,44,116,14,ES_AUTOHSCROLL + LTEXT "Search for:",IDC_STATIC,8,48,42,8 + LTEXT "Unicode:",IDC_STATIC,200,8,30,8 + EDITTEXT IDC_EDIT_UNICODE,236,4,28,12,ES_AUTOHSCROLL END IDD_ABOUTBOX DIALOGEX 22,16,210,182 @@ -32,4 +45,5 @@ STRINGTABLE DISCARDABLE BEGIN IDS_LICENSE "This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.\r\n\r\nThis program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\r\n\r\nYou should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA." IDS_ABOUT "&Acerca de ..." + IDS_TITLE "Character Map" END diff --git a/reactos/base/applications/charmap/lang/fr-FR.rc b/reactos/base/applications/charmap/lang/fr-FR.rc index 9a2a206726e..910b6df3746 100644 --- a/reactos/base/applications/charmap/lang/fr-FR.rc +++ b/reactos/base/applications/charmap/lang/fr-FR.rc @@ -1,9 +1,8 @@ LANGUAGE LANG_FRENCH, SUBLANG_NEUTRAL -IDD_CHARMAP DIALOGEX 6, 6, 293, 205 //233 -CAPTION "Table des Caractres" +IDD_CHARMAP DIALOGEX 6, 6, 292, 224 FONT 8,"MS Shell Dlg",0,0 -STYLE DS_SHELLFONT | WS_BORDER | WS_VISIBLE | WS_SYSMENU | WS_MINIMIZEBOX +STYLE DS_SHELLFONT | WS_CHILD | WS_VISIBLE BEGIN LTEXT "Police :", IDC_STATIC, 6, 7, 24, 9 COMBOBOX IDC_FONTCOMBO, 36, 5, 210, 210, WS_CHILD | WS_VISIBLE | WS_VSCROLL | CBS_DROPDOWNLIST | CBS_SORT | CBS_HASSTRINGS @@ -13,8 +12,22 @@ BEGIN CONTROL "",IDC_TEXTBOX,RICHEDIT_CLASS,ES_AUTOHSCROLL | WS_BORDER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 74, 186, 114, 13 DEFPUSHBUTTON "Slectionner", IDC_SELECT, 194, 186, 44, 13 PUSHBUTTON "Copier", IDC_COPY, 242, 186, 44, 13, WS_DISABLED - //AUTOCHECKBOX "Vue avance", IDC_ADVVIEW, 10, 204, 64, 9, WS_CHILD | WS_VISIBLE | WS_TABSTOP - //EDITTEXT IDC_DISPLAY, 8, 217, 278, 13, WS_VISIBLE | WS_TABSTOP | ES_READONLY + CONTROL "Advanced view",IDC_CHECK_ADVANCED,"Button", BS_AUTOCHECKBOX | WS_TABSTOP, 8, 208, 95, 10 +END + +IDD_ADVANCED DIALOGEX 0, 0, 292, 64 +STYLE DS_SHELLFONT | WS_CHILD +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Charset:",IDC_STATIC,8,8,48,8 + COMBOBOX IDC_COMBO_CHARSET,72,4,116,80,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "Group by:",IDC_STATIC,8,28,50,8 + COMBOBOX IDC_COMBO_GROUPBY,72,24,116,80,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Search",IDC_BUTTON_SEARCH,200,44,50,14 + EDITTEXT IDC_EDIT_SEARCH,72,44,116,14,ES_AUTOHSCROLL + LTEXT "Search for:",IDC_STATIC,8,48,42,8 + LTEXT "Unicode:",IDC_STATIC,200,8,30,8 + EDITTEXT IDC_EDIT_UNICODE,236,4,28,12,ES_AUTOHSCROLL END IDD_ABOUTBOX DIALOGEX 22,16,210,182 @@ -32,4 +45,5 @@ STRINGTABLE DISCARDABLE BEGIN IDS_LICENSE "Ce programme est un logiciel libre ; vous pouvez le redistribuer et/ou le modifier tout en respectant les termes de la ""GNU General Public License"" publie par la Free Software Foundation; dans sa version 2 (ou selon votre prfrence) toute version ultrieure.\r\n\r\nCe programme est distribu dans l'espoir qu'il sera utile, cependant SANS GARANTIE D'AUCUNE SORTE ; sans mme une garantie implicite de COMMERCIABILIT ou DE CONFORMIT UNE UTILISATION PARTICULIRE. \r\n\r\nVoir la Licence Publique Gnrale GNU pour plus de dtails. Vous devriez avoir reu un exemplaire de la Licence Publique Gnrale GNU avec ce programme ; si ce n'est pas le cas, crivez la Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA." IDS_ABOUT " propos..." + IDS_TITLE "Character Map" END diff --git a/reactos/base/applications/charmap/lang/id-ID.rc b/reactos/base/applications/charmap/lang/id-ID.rc index 790bf651bef..a2c2cae4b96 100644 --- a/reactos/base/applications/charmap/lang/id-ID.rc +++ b/reactos/base/applications/charmap/lang/id-ID.rc @@ -1,9 +1,8 @@ LANGUAGE LANG_INDONESIAN, SUBLANG_DEFAULT -IDD_CHARMAP DIALOGEX 6, 6, 293, 205 //233 -CAPTION "Peta Karakter" +IDD_CHARMAP DIALOGEX 6, 6, 292, 224 FONT 8,"MS Shell Dlg",0,0 -STYLE DS_SHELLFONT | WS_BORDER | WS_VISIBLE | WS_SYSMENU | WS_MINIMIZEBOX +STYLE DS_SHELLFONT | WS_CHILD | WS_VISIBLE BEGIN LTEXT "Font :", IDC_STATIC, 6, 7, 24, 9 COMBOBOX IDC_FONTCOMBO, 36, 5, 210, 210, WS_CHILD | WS_VISIBLE | WS_VSCROLL | CBS_DROPDOWNLIST | CBS_SORT | CBS_HASSTRINGS @@ -13,8 +12,22 @@ BEGIN CONTROL "",IDC_TEXTBOX,RICHEDIT_CLASS,ES_AUTOHSCROLL | WS_BORDER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 74, 186, 114, 13 DEFPUSHBUTTON "Pilih", IDC_SELECT, 194, 186, 44, 13 PUSHBUTTON "Copy", IDC_COPY, 242, 186, 44, 13, WS_DISABLED - //AUTOCHECKBOX "Advanced view", IDC_ADVVIEW, 10, 204, 64, 9, WS_CHILD | WS_VISIBLE | WS_TABSTOP - //EDITTEXT IDC_DISPLAY, 8, 217, 278, 13, WS_VISIBLE | WS_TABSTOP | ES_READONLY + CONTROL "Advanced view",IDC_CHECK_ADVANCED,"Button", BS_AUTOCHECKBOX | WS_TABSTOP, 8, 208, 95, 10 +END + +IDD_ADVANCED DIALOGEX 0, 0, 292, 64 +STYLE DS_SHELLFONT | WS_CHILD +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Charset:",IDC_STATIC,8,8,48,8 + COMBOBOX IDC_COMBO_CHARSET,72,4,116,80,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "Group by:",IDC_STATIC,8,28,50,8 + COMBOBOX IDC_COMBO_GROUPBY,72,24,116,80,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Search",IDC_BUTTON_SEARCH,200,44,50,14 + EDITTEXT IDC_EDIT_SEARCH,72,44,116,14,ES_AUTOHSCROLL + LTEXT "Search for:",IDC_STATIC,8,48,42,8 + LTEXT "Unicode:",IDC_STATIC,200,8,30,8 + EDITTEXT IDC_EDIT_UNICODE,236,4,28,12,ES_AUTOHSCROLL END IDD_ABOUTBOX DIALOGEX 22,16,210,182 @@ -32,4 +45,5 @@ STRINGTABLE DISCARDABLE BEGIN IDS_LICENSE "Program ini adalah software bebas; anda dapat mendistribusikan dan/atau mengubahnya di bawah term GNU General Public License seperti dipublikasikan oleh Free Software Foundation; baik Lisensi versi 2, atau (menurut opini anda) setiap versi berikutnya.\r\n\r\nProgram ini didistribusikan dengan harapan ia akan berguna, tetapi TANPA JAMINAN APAPUN; bahkan tanpa jaminan berarti dari MERCANTABILITAS atau KECUKUPAN UNTUK KEPERLUAN TERTENTU. Lihat GNU General Public License untuk lebih jelasnya.\r\n\r\nAnda seharusnya menerima duplikat GNU General Public License bersamaan dengan program ini; jika tidak, tulis ke Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA." IDS_ABOUT "Te&ntang..." + IDS_TITLE "Character Map" END diff --git a/reactos/base/applications/charmap/lang/it-IT.rc b/reactos/base/applications/charmap/lang/it-IT.rc index f7f44bb2453..e4a66dea8f1 100644 --- a/reactos/base/applications/charmap/lang/it-IT.rc +++ b/reactos/base/applications/charmap/lang/it-IT.rc @@ -1,11 +1,10 @@ LANGUAGE LANG_ITALIAN, SUBLANG_NEUTRAL -IDD_CHARMAP DIALOGEX 6, 6, 293, 205 //233 -CAPTION "Character Map" +IDD_CHARMAP DIALOGEX 6, 6, 292, 224 FONT 8,"MS Shell Dlg",0,0 -STYLE DS_SHELLFONT | WS_BORDER | WS_VISIBLE | WS_SYSMENU | WS_MINIMIZEBOX +STYLE DS_SHELLFONT | WS_CHILD | WS_VISIBLE BEGIN - LTEXT "Font :", IDC_STATIC, 6, 7, 24, 9 + LTEXT "Font:", IDC_STATIC, 6, 7, 24, 9 COMBOBOX IDC_FONTCOMBO, 36, 5, 210, 210, WS_CHILD | WS_VISIBLE | WS_VSCROLL | CBS_DROPDOWNLIST | CBS_SORT | CBS_HASSTRINGS PUSHBUTTON "Aiuto", IDC_CMHELP, 249, 5, 35, 13 CONTROL "", IDC_FONTMAP, "FontMapWnd", WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL, 20, 22, 266, 156 @@ -13,8 +12,22 @@ BEGIN CONTROL "",IDC_TEXTBOX,RICHEDIT_CLASS,ES_AUTOHSCROLL | WS_BORDER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 74, 186, 114, 13 DEFPUSHBUTTON "Selezionare", IDC_SELECT, 194, 186, 44, 13 PUSHBUTTON "Copiare", IDC_COPY, 242, 186, 44, 13, WS_DISABLED - //AUTOCHECKBOX "Visualizzazione avanzata", IDC_ADVVIEW, 10, 204, 64, 9, WS_CHILD | WS_VISIBLE | WS_TABSTOP - //EDITTEXT IDC_DISPLAY, 8, 217, 278, 13, WS_VISIBLE | WS_TABSTOP | ES_READONLY + CONTROL "Visualizzazione avanzata",IDC_CHECK_ADVANCED,"Button", BS_AUTOCHECKBOX | WS_TABSTOP, 8, 208, 95, 10 +END + +IDD_ADVANCED DIALOGEX 0, 0, 292, 64 +STYLE DS_SHELLFONT | WS_CHILD +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Set di caratteri:",IDC_STATIC,8,8,48,8 + COMBOBOX IDC_COMBO_CHARSET,72,4,116,80,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "Raggruppa per:",IDC_STATIC,8,28,50,8 + COMBOBOX IDC_COMBO_GROUPBY,72,24,116,80,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Ce&rca",IDC_BUTTON_SEARCH,200,44,50,14 + EDITTEXT IDC_EDIT_SEARCH,72,44,116,14,ES_AUTOHSCROLL + LTEXT "C&erca:",IDC_STATIC,8,48,22,8 + LTEXT "Unicode:",IDC_STATIC,200,8,30,8 + EDITTEXT IDC_EDIT_UNICODE,236,4,28,12,ES_AUTOHSCROLL END IDD_ABOUTBOX DIALOGEX 22,16,210,182 @@ -22,7 +35,7 @@ CAPTION "Informazioni su Character Map" FONT 8,"MS Shell Dlg",0,0 STYLE DS_SHELLFONT | WS_BORDER | WS_DLGFRAME | WS_SYSMENU | DS_MODALFRAME BEGIN - LTEXT "Character Map v0.1\nCopyright (C) 2007 Ged Murphy (gedmurphy@reactos.org)", IDC_STATIC, 48, 7, 150, 36 + LTEXT "Mappa caratteri v0.1\nCopyright (C) 2007 Ged Murphy (gedmurphy@reactos.org)", IDC_STATIC, 48, 7, 150, 36 PUSHBUTTON "Chiudi", IDOK, 75, 162, 44, 15 ICON IDI_ICON, IDC_STATIC, 10, 10, 7, 30 EDITTEXT IDC_LICENSE_EDIT, 8, 44, 194, 107, WS_VISIBLE | WS_VSCROLL | WS_TABSTOP | ES_READONLY | ES_MULTILINE @@ -32,4 +45,5 @@ STRINGTABLE DISCARDABLE BEGIN IDS_LICENSE, "Questo programma software libero; pu redistribuirlo e/o modificarlo sotto\ni termini della licenza pubblica GNU come pubblicata dalla Free Software Foundation; sia la versione 2 sia una versione successiva (a sua scelta).\r\n\r\nQuesto programma distribuito\nnella speranza che sia utile, ma SENZA ALCUNA GARANZIA; senza neanche la garanzia implicita\ndi NEGOZIABILITA' o APPLICABILITA' per un particolare scopo. Si veda la licenza generale pubblica GNU per maggiori dettagli.\r\n\r\nDovrebbe aver ricevuto una copia assieme a questo programma; se cos non fosse, scriva alla Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA." IDS_ABOUT "&Informazioni su..." + IDS_TITLE "Mappa caratteri" END diff --git a/reactos/base/applications/charmap/lang/ja-JP.rc b/reactos/base/applications/charmap/lang/ja-JP.rc index e5e426d2674..b97f0a48f5c 100644 --- a/reactos/base/applications/charmap/lang/ja-JP.rc +++ b/reactos/base/applications/charmap/lang/ja-JP.rc @@ -1,9 +1,8 @@ LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT -IDD_CHARMAP DIALOGEX 6, 6, 293, 205 //233 -CAPTION "R[h\\" +IDD_CHARMAP DIALOGEX 6, 6, 292, 224 FONT 9,"MS UI Gothic",0,0 -STYLE DS_SHELLFONT | WS_BORDER | WS_VISIBLE | WS_SYSMENU | WS_MINIMIZEBOX +STYLE DS_SHELLFONT | WS_CHILD | WS_VISIBLE BEGIN LTEXT "tHg:", IDC_STATIC, 6, 7, 24, 9 COMBOBOX IDC_FONTCOMBO, 36, 5, 210, 210, WS_CHILD | WS_VISIBLE | WS_VSCROLL | CBS_DROPDOWNLIST | CBS_SORT | CBS_HASSTRINGS @@ -13,8 +12,22 @@ BEGIN CONTROL "",IDC_TEXTBOX,RICHEDIT_CLASS,ES_AUTOHSCROLL | WS_BORDER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 74, 186, 114, 13 DEFPUSHBUTTON "I", IDC_SELECT, 194, 186, 44, 13 PUSHBUTTON "Rs[", IDC_COPY, 242, 186, 44, 13, WS_DISABLED - //AUTOCHECKBOX "ڍו\\", IDC_ADVVIEW, 10, 204, 64, 9, WS_CHILD | WS_VISIBLE | WS_TABSTOP - //EDITTEXT IDC_DISPLAY, 8, 217, 278, 13, WS_VISIBLE | WS_TABSTOP | ES_READONLY + CONTROL "Advanced view",IDC_CHECK_ADVANCED,"Button", BS_AUTOCHECKBOX | WS_TABSTOP, 8, 208, 95, 10 +END + +IDD_ADVANCED DIALOGEX 0, 0, 292, 64 +STYLE DS_SHELLFONT | WS_CHILD +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Charset:",IDC_STATIC,8,8,48,8 + COMBOBOX IDC_COMBO_CHARSET,72,4,116,80,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "Group by:",IDC_STATIC,8,28,50,8 + COMBOBOX IDC_COMBO_GROUPBY,72,24,116,80,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Search",IDC_BUTTON_SEARCH,200,44,50,14 + EDITTEXT IDC_EDIT_SEARCH,72,44,116,14,ES_AUTOHSCROLL + LTEXT "Search for:",IDC_STATIC,8,48,42,8 + LTEXT "Unicode:",IDC_STATIC,200,8,30,8 + EDITTEXT IDC_EDIT_UNICODE,236,4,28,12,ES_AUTOHSCROLL END IDD_ABOUTBOX DIALOGEX 22,16,210,182 @@ -32,4 +45,5 @@ STRINGTABLE DISCARDABLE BEGIN IDS_LICENSE "This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.\r\n\r\nThis program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\r\n\r\nYou should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA." IDS_ABOUT "o[W(&B)..." + IDS_TITLE "Character Map" END diff --git a/reactos/base/applications/charmap/lang/ko-KR.rc b/reactos/base/applications/charmap/lang/ko-KR.rc index b700764d09a..a99a7f7ebc3 100644 --- a/reactos/base/applications/charmap/lang/ko-KR.rc +++ b/reactos/base/applications/charmap/lang/ko-KR.rc @@ -3,10 +3,9 @@ */ LANGUAGE LANG_KOREAN, SUBLANG_DEFAULT -IDD_CHARMAP DIALOGEX 6, 6, 293, 205 //233 -CAPTION "ǥ" +IDD_CHARMAP DIALOGEX 6, 6, 292, 224 FONT 8,"MS Shell Dlg",0,0 -STYLE DS_SHELLFONT | WS_BORDER | WS_VISIBLE | WS_SYSMENU | WS_MINIMIZEBOX +STYLE DS_SHELLFONT | WS_CHILD | WS_VISIBLE BEGIN LTEXT "۲:", IDC_STATIC, 6, 7, 24, 9 COMBOBOX IDC_FONTCOMBO, 36, 5, 210, 210, WS_CHILD | WS_VISIBLE | WS_VSCROLL | CBS_DROPDOWNLIST | CBS_SORT | CBS_HASSTRINGS @@ -16,8 +15,22 @@ BEGIN CONTROL "",IDC_TEXTBOX,RICHEDIT_CLASS,ES_AUTOHSCROLL | WS_BORDER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 74, 186, 114, 13 DEFPUSHBUTTON "", IDC_SELECT, 194, 186, 44, 13 PUSHBUTTON "", IDC_COPY, 242, 186, 44, 13, WS_DISABLED - //AUTOCHECKBOX "Ȯ ", IDC_ADVVIEW, 10, 204, 64, 9, WS_CHILD | WS_VISIBLE | WS_TABSTOP - //EDITTEXT IDC_DISPLAY, 8, 217, 278, 13, WS_VISIBLE | WS_TABSTOP | ES_READONLY + CONTROL "Advanced view",IDC_CHECK_ADVANCED,"Button", BS_AUTOCHECKBOX | WS_TABSTOP, 8, 208, 95, 10 +END + +IDD_ADVANCED DIALOGEX 0, 0, 292, 64 +STYLE DS_SHELLFONT | WS_CHILD +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Charset:",IDC_STATIC,8,8,48,8 + COMBOBOX IDC_COMBO_CHARSET,72,4,116,80,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "Group by:",IDC_STATIC,8,28,50,8 + COMBOBOX IDC_COMBO_GROUPBY,72,24,116,80,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Search",IDC_BUTTON_SEARCH,200,44,50,14 + EDITTEXT IDC_EDIT_SEARCH,72,44,116,14,ES_AUTOHSCROLL + LTEXT "Search for:",IDC_STATIC,8,48,42,8 + LTEXT "Unicode:",IDC_STATIC,200,8,30,8 + EDITTEXT IDC_EDIT_UNICODE,236,4,28,12,ES_AUTOHSCROLL END IDD_ABOUTBOX DIALOGEX 22,16,210,182 @@ -35,4 +48,5 @@ STRINGTABLE DISCARDABLE BEGIN IDS_LICENSE "This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.\r\n\r\nThis program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\r\n\r\nYou should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA." IDS_ABOUT "(&A)" + IDS_TITLE "Character Map" END diff --git a/reactos/base/applications/charmap/lang/lt-LT.rc b/reactos/base/applications/charmap/lang/lt-LT.rc index 9fec37413ed..67ba5fb1132 100644 --- a/reactos/base/applications/charmap/lang/lt-LT.rc +++ b/reactos/base/applications/charmap/lang/lt-LT.rc @@ -9,10 +9,9 @@ LANGUAGE LANG_LITHUANIAN, SUBLANG_DEFAULT -IDD_CHARMAP DIALOGEX 6, 6, 293, 205 //233 -CAPTION "Simboli lentel" +IDD_CHARMAP DIALOGEX 6, 6, 292, 224 FONT 8,"MS Shell Dlg",0,0 -STYLE DS_SHELLFONT | WS_BORDER | WS_VISIBLE | WS_SYSMENU | WS_MINIMIZEBOX +STYLE DS_SHELLFONT | WS_CHILD | WS_VISIBLE BEGIN LTEXT "riftas:", IDC_STATIC, 6, 7, 24, 9 COMBOBOX IDC_FONTCOMBO, 36, 5, 210, 210, WS_CHILD | WS_VISIBLE | WS_VSCROLL | CBS_DROPDOWNLIST | CBS_SORT | CBS_HASSTRINGS @@ -22,8 +21,22 @@ BEGIN CONTROL "",IDC_TEXTBOX,RICHEDIT_CLASS,ES_AUTOHSCROLL | WS_BORDER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 74, 186, 114, 13 DEFPUSHBUTTON "Parinkti", IDC_SELECT, 194, 186, 44, 13 PUSHBUTTON "Kopijuoti", IDC_COPY, 242, 186, 44, 13, WS_DISABLED - //AUTOCHECKBOX "Advanced view", IDC_ADVVIEW, 10, 204, 64, 9, WS_CHILD | WS_VISIBLE | WS_TABSTOP - //EDITTEXT IDC_DISPLAY, 8, 217, 278, 13, WS_VISIBLE | WS_TABSTOP | ES_READONLY + CONTROL "Advanced view",IDC_CHECK_ADVANCED,"Button", BS_AUTOCHECKBOX | WS_TABSTOP, 8, 208, 95, 10 +END + +IDD_ADVANCED DIALOGEX 0, 0, 292, 64 +STYLE DS_SHELLFONT | WS_CHILD +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Charset:",IDC_STATIC,8,8,48,8 + COMBOBOX IDC_COMBO_CHARSET,72,4,116,80,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "Group by:",IDC_STATIC,8,28,50,8 + COMBOBOX IDC_COMBO_GROUPBY,72,24,116,80,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Search",IDC_BUTTON_SEARCH,200,44,50,14 + EDITTEXT IDC_EDIT_SEARCH,72,44,116,14,ES_AUTOHSCROLL + LTEXT "Search for:",IDC_STATIC,8,48,42,8 + LTEXT "Unicode:",IDC_STATIC,200,8,30,8 + EDITTEXT IDC_EDIT_UNICODE,236,4,28,12,ES_AUTOHSCROLL END IDD_ABOUTBOX DIALOGEX 22,16,210,182 @@ -41,4 +54,5 @@ STRINGTABLE DISCARDABLE BEGIN IDS_LICENSE "This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.\r\n\r\nThis program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\r\n\r\nYou should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA." IDS_ABOUT "&Apie..." + IDS_TITLE "Character Map" END diff --git a/reactos/base/applications/charmap/lang/nl-NL.rc b/reactos/base/applications/charmap/lang/nl-NL.rc index 6389f34f2d0..3e8673c1be6 100644 --- a/reactos/base/applications/charmap/lang/nl-NL.rc +++ b/reactos/base/applications/charmap/lang/nl-NL.rc @@ -1,9 +1,8 @@ LANGUAGE LANG_DUTCH, SUBLANG_NEUTRAL -IDD_CHARMAP DIALOGEX 6, 6, 293, 205 //233 -CAPTION "Speciale tekens" +IDD_CHARMAP DIALOGEX 6, 6, 292, 224 FONT 8,"MS Shell Dlg",0,0 -STYLE DS_SHELLFONT | WS_BORDER | WS_VISIBLE | WS_SYSMENU | WS_MINIMIZEBOX +STYLE DS_SHELLFONT | WS_CHILD | WS_VISIBLE BEGIN LTEXT "Lettertype:", IDC_STATIC, 6, 7, 24, 9 COMBOBOX IDC_FONTCOMBO, 36, 5, 210, 210, WS_CHILD | WS_VISIBLE | WS_VSCROLL | CBS_DROPDOWNLIST | CBS_SORT | CBS_HASSTRINGS @@ -13,8 +12,22 @@ BEGIN CONTROL "",IDC_TEXTBOX,RICHEDIT_CLASS,ES_AUTOHSCROLL | WS_BORDER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 74, 186, 114, 13 DEFPUSHBUTTON "Selecteren", IDC_SELECT, 194, 186, 44, 13 PUSHBUTTON "Kopiren", IDC_COPY, 242, 186, 44, 13, WS_DISABLED - //AUTOCHECKBOX "Geavanceerde weergave", IDC_ADVVIEW, 10, 204, 64, 9, WS_CHILD | WS_VISIBLE | WS_TABSTOP - //EDITTEXT IDC_DISPLAY, 8, 217, 278, 13, WS_VISIBLE | WS_TABSTOP | ES_READONLY + CONTROL "Advanced view",IDC_CHECK_ADVANCED,"Button", BS_AUTOCHECKBOX | WS_TABSTOP, 8, 208, 95, 10 +END + +IDD_ADVANCED DIALOGEX 0, 0, 292, 64 +STYLE DS_SHELLFONT | WS_CHILD +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Charset:",IDC_STATIC,8,8,48,8 + COMBOBOX IDC_COMBO_CHARSET,72,4,116,80,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "Group by:",IDC_STATIC,8,28,50,8 + COMBOBOX IDC_COMBO_GROUPBY,72,24,116,80,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Search",IDC_BUTTON_SEARCH,200,44,50,14 + EDITTEXT IDC_EDIT_SEARCH,72,44,116,14,ES_AUTOHSCROLL + LTEXT "Search for:",IDC_STATIC,8,48,42,8 + LTEXT "Unicode:",IDC_STATIC,200,8,30,8 + EDITTEXT IDC_EDIT_UNICODE,236,4,28,12,ES_AUTOHSCROLL END IDD_ABOUTBOX DIALOGEX 22,16,210,182 @@ -32,4 +45,5 @@ STRINGTABLE DISCARDABLE BEGIN IDS_LICENSE "This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.\r\n\r\nThis program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\r\n\r\nYou should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA." IDS_ABOUT "Over..." + IDS_TITLE "Character Map" END diff --git a/reactos/base/applications/charmap/lang/no-NO.rc b/reactos/base/applications/charmap/lang/no-NO.rc index 8fd7c204e0b..67ff7c9c102 100644 --- a/reactos/base/applications/charmap/lang/no-NO.rc +++ b/reactos/base/applications/charmap/lang/no-NO.rc @@ -1,9 +1,8 @@ LANGUAGE LANG_NORWEGIAN, SUBLANG_NEUTRAL -IDD_CHARMAP DIALOGEX 6, 6, 293, 205 //233 -CAPTION "Tegnkart" +IDD_CHARMAP DIALOGEX 6, 6, 292, 224 FONT 8,"MS Shell Dlg",0,0 -STYLE DS_SHELLFONT | WS_BORDER | WS_VISIBLE | WS_SYSMENU | WS_MINIMIZEBOX +STYLE DS_SHELLFONT | WS_CHILD | WS_VISIBLE BEGIN LTEXT "Skrift:", IDC_STATIC, 6, 7, 24, 9 COMBOBOX IDC_FONTCOMBO, 36, 5, 210, 210, WS_CHILD | WS_VISIBLE | WS_VSCROLL | CBS_DROPDOWNLIST | CBS_SORT | CBS_HASSTRINGS @@ -13,8 +12,22 @@ BEGIN CONTROL "",IDC_TEXTBOX,RICHEDIT_CLASS,ES_AUTOHSCROLL | WS_BORDER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 74, 186, 114, 13 DEFPUSHBUTTON "Velg", IDC_SELECT, 194, 186, 44, 13 PUSHBUTTON "Kopier", IDC_COPY, 242, 186, 44, 13, WS_DISABLED - //AUTOCHECKBOX "Avansert visning", IDC_ADVVIEW, 10, 204, 64, 9, WS_CHILD | WS_VISIBLE | WS_TABSTOP - //EDITTEXT IDC_DISPLAY, 8, 217, 278, 13, WS_VISIBLE | WS_TABSTOP | ES_READONLY + CONTROL "Advanced view",IDC_CHECK_ADVANCED,"Button", BS_AUTOCHECKBOX | WS_TABSTOP, 8, 208, 95, 10 +END + +IDD_ADVANCED DIALOGEX 0, 0, 292, 64 +STYLE DS_SHELLFONT | WS_CHILD +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Charset:",IDC_STATIC,8,8,48,8 + COMBOBOX IDC_COMBO_CHARSET,72,4,116,80,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "Group by:",IDC_STATIC,8,28,50,8 + COMBOBOX IDC_COMBO_GROUPBY,72,24,116,80,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Search",IDC_BUTTON_SEARCH,200,44,50,14 + EDITTEXT IDC_EDIT_SEARCH,72,44,116,14,ES_AUTOHSCROLL + LTEXT "Search for:",IDC_STATIC,8,48,42,8 + LTEXT "Unicode:",IDC_STATIC,200,8,30,8 + EDITTEXT IDC_EDIT_UNICODE,236,4,28,12,ES_AUTOHSCROLL END IDD_ABOUTBOX DIALOGEX 22,16,210,182 @@ -32,4 +45,5 @@ STRINGTABLE DISCARDABLE BEGIN IDS_LICENSE "Dette programmet er gratis programvare; du kan distribuere det og/eller endre det under betingelsene av GNU General Public License som er utgitt av Free Software Foundation; version 2 av lisensen, eller (etter din mening) alle senere versjoner.\r\n\r\nDette programmet er utgitt i hp for at det skal kunne brukes, men DET ER INGEN GARANTIER; uten heller forutsatt garantier av SALGBARHET eller SIKKETHET FOR EN ENKELTHET FORML. Se p GNU General Public Lisensen for mere detaljer.\r\n\r\nDu skal ha motatt en kopi av GNU General Public Lisensen sammen med denne programmet; hvis du ikke har motatt det, skriv til Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA." IDS_ABOUT "O&m..." + IDS_TITLE "Character Map" END diff --git a/reactos/base/applications/charmap/lang/pl-PL.rc b/reactos/base/applications/charmap/lang/pl-PL.rc index 75dce3c7064..96e0092e5b2 100644 --- a/reactos/base/applications/charmap/lang/pl-PL.rc +++ b/reactos/base/applications/charmap/lang/pl-PL.rc @@ -6,10 +6,9 @@ LANGUAGE LANG_POLISH, SUBLANG_DEFAULT -IDD_CHARMAP DIALOGEX 6, 6, 293, 205 //233 -CAPTION "Tablica znakw" +IDD_CHARMAP DIALOGEX 6, 6, 292, 224 FONT 8,"MS Shell Dlg",0,0 -STYLE DS_SHELLFONT | WS_BORDER | WS_VISIBLE | WS_SYSMENU | WS_MINIMIZEBOX +STYLE DS_SHELLFONT | WS_CHILD | WS_VISIBLE BEGIN LTEXT "Czci&onka:", IDC_STATIC, 6, 7, 24, 9 COMBOBOX IDC_FONTCOMBO, 36, 5, 210, 210, WS_CHILD | WS_VISIBLE | WS_VSCROLL | CBS_DROPDOWNLIST | CBS_SORT | CBS_HASSTRINGS @@ -19,8 +18,22 @@ BEGIN CONTROL "",IDC_TEXTBOX,RICHEDIT_CLASS,ES_AUTOHSCROLL | WS_BORDER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 74, 186, 114, 13 DEFPUSHBUTTON "Wy&bierz", IDC_SELECT, 194, 186, 44, 13 PUSHBUTTON "&Kopiuj", IDC_COPY, 242, 186, 44, 13, WS_DISABLED - //AUTOCHECKBOX "Widok z&aawansowany", IDC_ADVVIEW, 10, 204, 64, 9, WS_CHILD | WS_VISIBLE | WS_TABSTOP - //EDITTEXT IDC_DISPLAY, 8, 217, 278, 13, WS_VISIBLE | WS_TABSTOP | ES_READONLY + CONTROL "Advanced view",IDC_CHECK_ADVANCED,"Button", BS_AUTOCHECKBOX | WS_TABSTOP, 8, 208, 95, 10 +END + +IDD_ADVANCED DIALOGEX 0, 0, 292, 64 +STYLE DS_SHELLFONT | WS_CHILD +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Charset:",IDC_STATIC,8,8,48,8 + COMBOBOX IDC_COMBO_CHARSET,72,4,116,80,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "Group by:",IDC_STATIC,8,28,50,8 + COMBOBOX IDC_COMBO_GROUPBY,72,24,116,80,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Search",IDC_BUTTON_SEARCH,200,44,50,14 + EDITTEXT IDC_EDIT_SEARCH,72,44,116,14,ES_AUTOHSCROLL + LTEXT "Search for:",IDC_STATIC,8,48,42,8 + LTEXT "Unicode:",IDC_STATIC,200,8,30,8 + EDITTEXT IDC_EDIT_UNICODE,236,4,28,12,ES_AUTOHSCROLL END IDD_ABOUTBOX DIALOGEX 22,16,210,182 @@ -38,4 +51,5 @@ STRINGTABLE DISCARDABLE BEGIN IDS_LICENSE "Niniejszy program jest wolnym oprogramowaniem; moesz go rozprowadza dalej i/lub modyfikowa na warunkach Powszechnej Licencji Publicznej GNU, wydanej przez Fundacj Wolnego Oprogramowania - wedug wersji 2 tej Licencji lub (wedug twojego wyboru) ktrej z pniejszych wersji.\r\n\r\nNiniejszy program rozpowszechniany jest z nadziej, i bdzie on uyteczny - jednak BEZ JAKIEJKOLWIEK GWARANCJI, nawet domylnej gwarancji PRZYDATNOCI HANDLOWEJ albo PRZYDATNOCI DO OKRELONYCH ZASTOSOWA. W celu uzyskania bliszych informacji signij do Powszechnej Licencji Publicznej GNU.\r\n\r\nZ pewnoci wraz z niniejszym programem otrzymae te egzemplarz Powszechnej Licencji Publicznej GNU (GNU General Public License); jeli nie - napisz do Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA." IDS_ABOUT "&O programie..." + IDS_TITLE "Character Map" END diff --git a/reactos/base/applications/charmap/lang/pt-BR.rc b/reactos/base/applications/charmap/lang/pt-BR.rc index 6a86e180307..c3046153c3f 100644 --- a/reactos/base/applications/charmap/lang/pt-BR.rc +++ b/reactos/base/applications/charmap/lang/pt-BR.rc @@ -1,9 +1,8 @@ LANGUAGE LANG_PORTUGUESE, SUBLANG_NEUTRAL -IDD_CHARMAP DIALOGEX 6, 6, 293, 205 //233 -CAPTION "Mapa de caracteres" +IDD_CHARMAP DIALOGEX 6, 6, 292, 224 FONT 8,"MS Shell Dlg",0,0 -STYLE DS_SHELLFONT | WS_BORDER | WS_VISIBLE | WS_SYSMENU | WS_MINIMIZEBOX +STYLE DS_SHELLFONT | WS_CHILD | WS_VISIBLE BEGIN LTEXT "Fonte :", IDC_STATIC, 6, 7, 24, 9 COMBOBOX IDC_FONTCOMBO, 36, 5, 210, 210, WS_CHILD | WS_VISIBLE | WS_VSCROLL | CBS_DROPDOWNLIST | CBS_SORT | CBS_HASSTRINGS @@ -13,8 +12,22 @@ BEGIN CONTROL "",IDC_TEXTBOX,RICHEDIT_CLASS,ES_AUTOHSCROLL | WS_BORDER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 74, 186, 114, 13 DEFPUSHBUTTON "Selecionar", IDC_SELECT, 194, 186, 46, 13 PUSHBUTTON "Copiar", IDC_COPY, 244, 186, 46, 13, WS_DISABLED - //AUTOCHECKBOX "Modo de exibio avanado", IDC_ADVVIEW, 10, 204, 64, 9, WS_CHILD | WS_VISIBLE | WS_TABSTOP - //EDITTEXT IDC_DISPLAY, 8, 217, 278, 13, WS_VISIBLE | WS_TABSTOP | ES_READONLY + CONTROL "Advanced view",IDC_CHECK_ADVANCED,"Button", BS_AUTOCHECKBOX | WS_TABSTOP, 8, 208, 95, 10 +END + +IDD_ADVANCED DIALOGEX 0, 0, 292, 64 +STYLE DS_SHELLFONT | WS_CHILD +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Charset:",IDC_STATIC,8,8,48,8 + COMBOBOX IDC_COMBO_CHARSET,72,4,116,80,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "Group by:",IDC_STATIC,8,28,50,8 + COMBOBOX IDC_COMBO_GROUPBY,72,24,116,80,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Search",IDC_BUTTON_SEARCH,200,44,50,14 + EDITTEXT IDC_EDIT_SEARCH,72,44,116,14,ES_AUTOHSCROLL + LTEXT "Search for:",IDC_STATIC,8,48,42,8 + LTEXT "Unicode:",IDC_STATIC,200,8,30,8 + EDITTEXT IDC_EDIT_UNICODE,236,4,28,12,ES_AUTOHSCROLL END IDD_ABOUTBOX DIALOGEX 22,16,210,182 @@ -32,4 +45,5 @@ STRINGTABLE DISCARDABLE BEGIN IDS_LICENSE "Este programa software livre; voc pode redistribu-lo e/ou modific-lo sob os termos da GNU General Public License conforme publicada pela Free Software Foundation; quer a verso 2 da licena, ou (conforme voc escolha) qualquer verso posterior.\r\n\r\nEste programa distribudo com a esperana de que seja til, mas SEM QUALQUER GARANTIA; mesmo sem a garantia implcita de MERCANTIBILIDADE OU ADEQUAO A UM DETERMINADO PROPSITO. Para mais detalhes, veja a GNU General Public License.\r\n\r\nVoc deve ter recebido uma cpia da GNU General Public License juntamente com este programa; caso contrrio, escreva para a Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA." IDS_ABOUT "So&bre..." + IDS_TITLE "Character Map" END diff --git a/reactos/base/applications/charmap/lang/ru-RU.rc b/reactos/base/applications/charmap/lang/ru-RU.rc index 1a6bc939526..c52593abcb1 100644 --- a/reactos/base/applications/charmap/lang/ru-RU.rc +++ b/reactos/base/applications/charmap/lang/ru-RU.rc @@ -2,10 +2,9 @@ LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT -IDD_CHARMAP DIALOGEX 6, 6, 293, 205 //233 -CAPTION " " +IDD_CHARMAP DIALOGEX 6, 6, 292, 224 FONT 8,"MS Shell Dlg",0,0 -STYLE DS_SHELLFONT | WS_BORDER | WS_VISIBLE | WS_SYSMENU | WS_MINIMIZEBOX +STYLE DS_SHELLFONT | WS_CHILD | WS_VISIBLE BEGIN LTEXT ":", IDC_STATIC, 6, 7, 27, 9 COMBOBOX IDC_FONTCOMBO, 36, 5, 210, 210, WS_CHILD | WS_VISIBLE | WS_VSCROLL | CBS_DROPDOWNLIST | CBS_SORT | CBS_HASSTRINGS @@ -15,8 +14,22 @@ BEGIN CONTROL "",IDC_TEXTBOX,RICHEDIT_CLASS,ES_AUTOHSCROLL | WS_BORDER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 74, 186, 114, 13 DEFPUSHBUTTON "", IDC_SELECT, 194, 186, 44, 13 PUSHBUTTON "", IDC_COPY, 242, 186, 44, 13, WS_DISABLED - //AUTOCHECKBOX "Advanced view", IDC_ADVVIEW, 10, 204, 64, 9, WS_CHILD | WS_VISIBLE | WS_TABSTOP - //EDITTEXT IDC_DISPLAY, 8, 217, 278, 13, WS_VISIBLE | WS_TABSTOP | ES_READONLY + CONTROL "Advanced view",IDC_CHECK_ADVANCED,"Button", BS_AUTOCHECKBOX | WS_TABSTOP, 8, 208, 95, 10 +END + +IDD_ADVANCED DIALOGEX 0, 0, 292, 64 +STYLE DS_SHELLFONT | WS_CHILD +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Charset:",IDC_STATIC,8,8,48,8 + COMBOBOX IDC_COMBO_CHARSET,72,4,116,80,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "Group by:",IDC_STATIC,8,28,50,8 + COMBOBOX IDC_COMBO_GROUPBY,72,24,116,80,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Search",IDC_BUTTON_SEARCH,200,44,50,14 + EDITTEXT IDC_EDIT_SEARCH,72,44,116,14,ES_AUTOHSCROLL + LTEXT "Search for:",IDC_STATIC,8,48,42,8 + LTEXT "Unicode:",IDC_STATIC,200,8,30,8 + EDITTEXT IDC_EDIT_UNICODE,236,4,28,12,ES_AUTOHSCROLL END IDD_ABOUTBOX DIALOGEX 22,16,210,182 @@ -34,4 +47,5 @@ STRINGTABLE DISCARDABLE BEGIN IDS_LICENSE " ; () , GNU, ; 2 , ( ) , .\r\n\r\n , , - , . GNU.\r\n\r\n GNU, , (Free Software Foundation, Inc.), 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA." IDS_ABOUT "& ..." + IDS_TITLE "Character Map" END diff --git a/reactos/base/applications/charmap/lang/sk-SK.rc b/reactos/base/applications/charmap/lang/sk-SK.rc index 7ab74b1715e..868f97e72ba 100644 --- a/reactos/base/applications/charmap/lang/sk-SK.rc +++ b/reactos/base/applications/charmap/lang/sk-SK.rc @@ -9,10 +9,9 @@ LANGUAGE LANG_SLOVAK, SUBLANG_DEFAULT -IDD_CHARMAP DIALOGEX 6, 6, 293, 205 //233 -CAPTION "Mapa znakov" +IDD_CHARMAP DIALOGEX 6, 6, 292, 224 FONT 8,"MS Shell Dlg",0,0 -STYLE DS_SHELLFONT | WS_BORDER | WS_VISIBLE | WS_SYSMENU | WS_MINIMIZEBOX +STYLE DS_SHELLFONT | WS_CHILD | WS_VISIBLE BEGIN LTEXT "Ps&mo:", IDC_STATIC, 6, 7, 24, 9 COMBOBOX IDC_FONTCOMBO, 36, 5, 210, 210, WS_CHILD | WS_VISIBLE | WS_VSCROLL | CBS_DROPDOWNLIST | CBS_SORT | CBS_HASSTRINGS @@ -22,8 +21,22 @@ BEGIN CONTROL "",IDC_TEXTBOX,RICHEDIT_CLASS,ES_AUTOHSCROLL | WS_BORDER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 74, 186, 114, 13 DEFPUSHBUTTON "&Vybra", IDC_SELECT, 194, 186, 44, 13 PUSHBUTTON "&Koprova", IDC_COPY, 242, 186, 44, 13, WS_DISABLED - //AUTOCHECKBOX "R&ozren zobrazenie", IDC_ADVVIEW, 10, 204, 75, 9, WS_CHILD | WS_VISIBLE | WS_TABSTOP - //EDITTEXT IDC_DISPLAY, 8, 217, 278, 13, WS_VISIBLE | WS_TABSTOP | ES_READONLY + CONTROL "Advanced view",IDC_CHECK_ADVANCED,"Button", BS_AUTOCHECKBOX | WS_TABSTOP, 8, 208, 95, 10 +END + +IDD_ADVANCED DIALOGEX 0, 0, 292, 64 +STYLE DS_SHELLFONT | WS_CHILD +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Charset:",IDC_STATIC,8,8,48,8 + COMBOBOX IDC_COMBO_CHARSET,72,4,116,80,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "Group by:",IDC_STATIC,8,28,50,8 + COMBOBOX IDC_COMBO_GROUPBY,72,24,116,80,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Search",IDC_BUTTON_SEARCH,200,44,50,14 + EDITTEXT IDC_EDIT_SEARCH,72,44,116,14,ES_AUTOHSCROLL + LTEXT "Search for:",IDC_STATIC,8,48,42,8 + LTEXT "Unicode:",IDC_STATIC,200,8,30,8 + EDITTEXT IDC_EDIT_UNICODE,236,4,28,12,ES_AUTOHSCROLL END IDD_ABOUTBOX DIALOGEX 22,16,210,182 @@ -41,4 +54,5 @@ STRINGTABLE DISCARDABLE BEGIN IDS_LICENSE, "Tento program je von softvr; mete ho ri a/alebo modifikova poda podmienok GNU Veobecnej verejnej licencie (GNU General Public License) ako bola zverejnen nadciou Free Software Foundation; bu verzie 2 tejto licencie, alebo (poda Vho uvenia) niektorej neskorej verzie.\r\n\r\nTento program je distribuovan v ndeji, e bude uiton, avak BEZ AKEJKOVEK ZRUKY; rovnako bez zruky PREDAJNOSTI alebo VHODNOSTI PRE URIT EL. Pre viac detailov si pozrite GNU Veobecn verejn licenciu (GNU General Public License).\r\n\r\nKpiu Veobecnej verejnej licencie GNU ste mali dosta spolu s tmto programom; ak nie, napte si o u na Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA." IDS_ABOUT "&o je Mapa znakov" + IDS_TITLE "Character Map" END diff --git a/reactos/base/applications/charmap/lang/uk-UA.rc b/reactos/base/applications/charmap/lang/uk-UA.rc index cabd820e41d..a76da186bec 100644 --- a/reactos/base/applications/charmap/lang/uk-UA.rc +++ b/reactos/base/applications/charmap/lang/uk-UA.rc @@ -8,10 +8,9 @@ LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT -IDD_CHARMAP DIALOGEX 6, 6, 293, 205 //233 -CAPTION " " +IDD_CHARMAP DIALOGEX 6, 6, 292, 224 FONT 8,"MS Shell Dlg",0,0 -STYLE DS_SHELLFONT | WS_BORDER | WS_VISIBLE | WS_SYSMENU | WS_MINIMIZEBOX +STYLE DS_SHELLFONT | WS_CHILD | WS_VISIBLE BEGIN LTEXT " :", IDC_STATIC, 6, 7, 24, 9 COMBOBOX IDC_FONTCOMBO, 36, 5, 210, 210, WS_CHILD | WS_VISIBLE | WS_VSCROLL | CBS_DROPDOWNLIST | CBS_SORT | CBS_HASSTRINGS @@ -21,8 +20,22 @@ BEGIN CONTROL "",IDC_TEXTBOX,RICHEDIT_CLASS,ES_AUTOHSCROLL | WS_BORDER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 74, 186, 114, 13 DEFPUSHBUTTON "", IDC_SELECT, 194, 186, 44, 13 PUSHBUTTON "", IDC_COPY, 242, 186, 44, 13, WS_DISABLED - //AUTOCHECKBOX " ", IDC_ADVVIEW, 10, 204, 64, 9, WS_CHILD | WS_VISIBLE | WS_TABSTOP - //EDITTEXT IDC_DISPLAY, 8, 217, 278, 13, WS_VISIBLE | WS_TABSTOP | ES_READONLY + CONTROL "Advanced view",IDC_CHECK_ADVANCED,"Button", BS_AUTOCHECKBOX | WS_TABSTOP, 8, 208, 95, 10 +END + +IDD_ADVANCED DIALOGEX 0, 0, 292, 64 +STYLE DS_SHELLFONT | WS_CHILD +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Charset:",IDC_STATIC,8,8,48,8 + COMBOBOX IDC_COMBO_CHARSET,72,4,116,80,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "Group by:",IDC_STATIC,8,28,50,8 + COMBOBOX IDC_COMBO_GROUPBY,72,24,116,80,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Search",IDC_BUTTON_SEARCH,200,44,50,14 + EDITTEXT IDC_EDIT_SEARCH,72,44,116,14,ES_AUTOHSCROLL + LTEXT "Search for:",IDC_STATIC,8,48,42,8 + LTEXT "Unicode:",IDC_STATIC,200,8,30,8 + EDITTEXT IDC_EDIT_UNICODE,236,4,28,12,ES_AUTOHSCROLL END IDD_ABOUTBOX DIALOGEX 22,16,210,182 @@ -40,4 +53,5 @@ STRINGTABLE DISCARDABLE BEGIN IDS_LICENSE " - ; , ³ GNU, ; 2 , - , .\r\n\r\n 䳿 , , - Ҳ, Ҳ Ҳ Ҳ . ³ GNU.\r\n\r\n ³ GNU. , (Free Software Foundation, Inc.), 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA." IDS_ABOUT "& ..." + IDS_TITLE "Character Map" END diff --git a/reactos/base/applications/charmap/lang/zh-CN.rc b/reactos/base/applications/charmap/lang/zh-CN.rc index 7fdfffd1a1f..7385d597667 100644 --- a/reactos/base/applications/charmap/lang/zh-CN.rc +++ b/reactos/base/applications/charmap/lang/zh-CN.rc @@ -2,10 +2,9 @@ LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED -IDD_CHARMAP DIALOGEX 6, 6, 293, 205 //233 -CAPTION "ַ" +IDD_CHARMAP DIALOGEX 6, 6, 292, 224 FONT 8,"MS Shell Dlg",0,0 -STYLE DS_SHELLFONT | WS_BORDER | WS_VISIBLE | WS_SYSMENU | WS_MINIMIZEBOX +STYLE DS_SHELLFONT | WS_CHILD | WS_VISIBLE BEGIN LTEXT ":", IDC_STATIC, 6, 7, 24, 9 COMBOBOX IDC_FONTCOMBO, 36, 5, 210, 210, WS_CHILD | WS_VISIBLE | WS_VSCROLL | CBS_DROPDOWNLIST | CBS_SORT | CBS_HASSTRINGS @@ -15,8 +14,22 @@ BEGIN CONTROL "",IDC_TEXTBOX,RICHEDIT_CLASS,ES_AUTOHSCROLL | WS_BORDER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 74, 186, 114, 13 DEFPUSHBUTTON "ѡ", IDC_SELECT, 194, 186, 44, 13 PUSHBUTTON "", IDC_COPY, 242, 186, 44, 13, WS_DISABLED - //AUTOCHECKBOX "Advanced view", IDC_ADVVIEW, 10, 204, 64, 9, WS_CHILD | WS_VISIBLE | WS_TABSTOP - //EDITTEXT IDC_DISPLAY, 8, 217, 278, 13, WS_VISIBLE | WS_TABSTOP | ES_READONLY + CONTROL "Advanced view",IDC_CHECK_ADVANCED,"Button", BS_AUTOCHECKBOX | WS_TABSTOP, 8, 208, 95, 10 +END + +IDD_ADVANCED DIALOGEX 0, 0, 292, 64 +STYLE DS_SHELLFONT | WS_CHILD +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Charset:",IDC_STATIC,8,8,48,8 + COMBOBOX IDC_COMBO_CHARSET,72,4,116,80,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "Group by:",IDC_STATIC,8,28,50,8 + COMBOBOX IDC_COMBO_GROUPBY,72,24,116,80,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Search",IDC_BUTTON_SEARCH,200,44,50,14 + EDITTEXT IDC_EDIT_SEARCH,72,44,116,14,ES_AUTOHSCROLL + LTEXT "Search for:",IDC_STATIC,8,48,42,8 + LTEXT "Unicode:",IDC_STATIC,200,8,30,8 + EDITTEXT IDC_EDIT_UNICODE,236,4,28,12,ES_AUTOHSCROLL END IDD_ABOUTBOX DIALOGEX 22,16,210,182 @@ -34,4 +47,5 @@ STRINGTABLE DISCARDABLE BEGIN IDS_LICENSE "This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.\r\n\r\nThis program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\r\n\r\nYou should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA." IDS_ABOUT "(&A)..." + IDS_TITLE "Character Map" END diff --git a/reactos/base/applications/charmap/lang/zh-TW.rc b/reactos/base/applications/charmap/lang/zh-TW.rc index ba36b67fb70..5bb325887ba 100644 --- a/reactos/base/applications/charmap/lang/zh-TW.rc +++ b/reactos/base/applications/charmap/lang/zh-TW.rc @@ -2,10 +2,9 @@ LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL -IDD_CHARMAP DIALOGEX 6, 6, 293, 205 //233 -CAPTION "rŪ" +IDD_CHARMAP DIALOGEX 6, 6, 292, 224 FONT 8,"MS Shell Dlg",0,0 -STYLE DS_SHELLFONT | WS_BORDER | WS_VISIBLE | WS_SYSMENU | WS_MINIMIZEBOX +STYLE DS_SHELLFONT | WS_CHILD | WS_VISIBLE BEGIN LTEXT "rG", IDC_STATIC, 6, 7, 24, 9 COMBOBOX IDC_FONTCOMBO, 36, 5, 210, 210, WS_CHILD | WS_VISIBLE | WS_VSCROLL | CBS_DROPDOWNLIST | CBS_SORT | CBS_HASSTRINGS @@ -15,8 +14,22 @@ BEGIN CONTROL "",IDC_TEXTBOX,RICHEDIT_CLASS,ES_AUTOHSCROLL | WS_BORDER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 74, 186, 114, 13 DEFPUSHBUTTON "", IDC_SELECT, 194, 186, 44, 13 PUSHBUTTON "ƻs", IDC_COPY, 242, 186, 44, 13, WS_DISABLED - //AUTOCHECKBOX "Advanced view", IDC_ADVVIEW, 10, 204, 64, 9, WS_CHILD | WS_VISIBLE | WS_TABSTOP - //EDITTEXT IDC_DISPLAY, 8, 217, 278, 13, WS_VISIBLE | WS_TABSTOP | ES_READONLY + CONTROL "Advanced view",IDC_CHECK_ADVANCED,"Button", BS_AUTOCHECKBOX | WS_TABSTOP, 8, 208, 95, 10 +END + +IDD_ADVANCED DIALOGEX 0, 0, 292, 64 +STYLE DS_SHELLFONT | WS_CHILD +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Charset:",IDC_STATIC,8,8,48,8 + COMBOBOX IDC_COMBO_CHARSET,72,4,116,80,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "Group by:",IDC_STATIC,8,28,50,8 + COMBOBOX IDC_COMBO_GROUPBY,72,24,116,80,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Search",IDC_BUTTON_SEARCH,200,44,50,14 + EDITTEXT IDC_EDIT_SEARCH,72,44,116,14,ES_AUTOHSCROLL + LTEXT "Search for:",IDC_STATIC,8,48,42,8 + LTEXT "Unicode:",IDC_STATIC,200,8,30,8 + EDITTEXT IDC_EDIT_UNICODE,236,4,28,12,ES_AUTOHSCROLL END IDD_ABOUTBOX DIALOGEX 22,16,210,182 @@ -34,4 +47,5 @@ STRINGTABLE DISCARDABLE BEGIN IDS_LICENSE "This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.\r\n\r\nThis program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\r\n\r\nYou should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA." IDS_ABOUT "(&A)..." + IDS_TITLE "Character Map" END diff --git a/reactos/base/applications/charmap/precomp.h b/reactos/base/applications/charmap/precomp.h index 597d9f20967..9825aa47560 100644 --- a/reactos/base/applications/charmap/precomp.h +++ b/reactos/base/applications/charmap/precomp.h @@ -1,13 +1,16 @@ #ifndef __CHARMAP_PRECOMP_H #define __CHARMAP_PRECOMP_H +#define WIN32_LEAN_AND_MEAN +#include #include #include -#include #include #include #include "resource.h" +#define SIZEOF(_v) (sizeof(_v) / sizeof(*_v)) + #define XCELLS 20 #define YCELLS 10 #define XLARGE 45 diff --git a/reactos/base/applications/charmap/resource.h b/reactos/base/applications/charmap/resource.h index b174903ab8a..07828054f69 100644 --- a/reactos/base/applications/charmap/resource.h +++ b/reactos/base/applications/charmap/resource.h @@ -1,19 +1,28 @@ -#define IDC_STATIC -1 +#define IDC_STATIC -1 -#define IDI_ICON 100 +#define IDI_ICON 100 -#define IDD_CHARMAP 200 -#define IDD_ABOUTBOX 201 +#define IDD_CHARMAP 200 +#define IDD_ABOUTBOX 201 +#define IDD_STATUSBAR 202 +#define IDD_ADVANCED 203 -#define IDC_FONTCOMBO 1001 -#define IDC_CMHELP 1002 -#define IDC_FONTMAP 1003 -#define IDC_TEXTBOX 1004 -#define IDC_SELECT 1005 -#define IDC_COPY 1006 -#define IDC_ADVVIEW 1007 -#define IDC_DISPLAY 1008 -#define IDC_LICENSE_EDIT 1009 +#define IDC_FONTCOMBO 1001 +#define IDC_CMHELP 1002 +#define IDC_FONTMAP 1003 +#define IDC_TEXTBOX 1004 +#define IDC_SELECT 1005 +#define IDC_COPY 1006 +#define IDC_ADVVIEW 1007 +#define IDC_DISPLAY 1008 +#define IDC_LICENSE_EDIT 1009 +#define IDC_COMBO_CHARSET 1000 +#define IDC_COMBO_GROUPBY 1001 +#define IDC_BUTTON_SEARCH 1002 +#define IDC_EDIT_SEARCH 1003 +#define IDC_EDIT_UNICODE 1004 +#define IDC_CHECK_ADVANCED 1007 -#define IDS_LICENSE 1010 -#define IDS_ABOUT 1011 +#define IDS_LICENSE 1010 +#define IDS_ABOUT 1011 +#define IDS_TITLE 1012 From 8b5ab2d248664492f9c26efd8ce545ee826f61f1 Mon Sep 17 00:00:00 2001 From: Olaf Siejka Date: Sun, 1 May 2011 21:36:15 +0000 Subject: [PATCH 274/317] [CHARMAP] - Translation update [EVENTVWR] - Translation update svn path=/trunk/; revision=51538 --- reactos/base/applications/charmap/lang/pl-PL.rc | 15 ++++++++------- .../applications/mscutils/eventvwr/lang/pl-PL.rc | 4 ++-- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/reactos/base/applications/charmap/lang/pl-PL.rc b/reactos/base/applications/charmap/lang/pl-PL.rc index 96e0092e5b2..ab354758d78 100644 --- a/reactos/base/applications/charmap/lang/pl-PL.rc +++ b/reactos/base/applications/charmap/lang/pl-PL.rc @@ -2,6 +2,7 @@ * translated by xrogers * xxrogers@users.sourceforge.net * https://sourceforge.net/projects/reactospl +* updated by Olaf Siejka (May, 2011) */ LANGUAGE LANG_POLISH, SUBLANG_DEFAULT @@ -18,21 +19,21 @@ BEGIN CONTROL "",IDC_TEXTBOX,RICHEDIT_CLASS,ES_AUTOHSCROLL | WS_BORDER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 74, 186, 114, 13 DEFPUSHBUTTON "Wy&bierz", IDC_SELECT, 194, 186, 44, 13 PUSHBUTTON "&Kopiuj", IDC_COPY, 242, 186, 44, 13, WS_DISABLED - CONTROL "Advanced view",IDC_CHECK_ADVANCED,"Button", BS_AUTOCHECKBOX | WS_TABSTOP, 8, 208, 95, 10 + CONTROL "Widok zaawansowany",IDC_CHECK_ADVANCED,"Button", BS_AUTOCHECKBOX | WS_TABSTOP, 8, 208, 95, 10 END IDD_ADVANCED DIALOGEX 0, 0, 292, 64 STYLE DS_SHELLFONT | WS_CHILD FONT 8, "MS Shell Dlg" BEGIN - LTEXT "Charset:",IDC_STATIC,8,8,48,8 + LTEXT "Zestaw znakw:",IDC_STATIC,8,8,48,8 COMBOBOX IDC_COMBO_CHARSET,72,4,116,80,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - LTEXT "Group by:",IDC_STATIC,8,28,50,8 + LTEXT "Grupowanie wedug:",IDC_STATIC,8,28,50,8 COMBOBOX IDC_COMBO_GROUPBY,72,24,116,80,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Search",IDC_BUTTON_SEARCH,200,44,50,14 + PUSHBUTTON "Szukaj",IDC_BUTTON_SEARCH,200,44,50,14 EDITTEXT IDC_EDIT_SEARCH,72,44,116,14,ES_AUTOHSCROLL - LTEXT "Search for:",IDC_STATIC,8,48,42,8 - LTEXT "Unicode:",IDC_STATIC,200,8,30,8 + LTEXT "Wyszukaj:",IDC_STATIC,8,48,42,8 + LTEXT "Symbol Unicode:",IDC_STATIC,200,8,30,8 EDITTEXT IDC_EDIT_UNICODE,236,4,28,12,ES_AUTOHSCROLL END @@ -51,5 +52,5 @@ STRINGTABLE DISCARDABLE BEGIN IDS_LICENSE "Niniejszy program jest wolnym oprogramowaniem; moesz go rozprowadza dalej i/lub modyfikowa na warunkach Powszechnej Licencji Publicznej GNU, wydanej przez Fundacj Wolnego Oprogramowania - wedug wersji 2 tej Licencji lub (wedug twojego wyboru) ktrej z pniejszych wersji.\r\n\r\nNiniejszy program rozpowszechniany jest z nadziej, i bdzie on uyteczny - jednak BEZ JAKIEJKOLWIEK GWARANCJI, nawet domylnej gwarancji PRZYDATNOCI HANDLOWEJ albo PRZYDATNOCI DO OKRELONYCH ZASTOSOWA. W celu uzyskania bliszych informacji signij do Powszechnej Licencji Publicznej GNU.\r\n\r\nZ pewnoci wraz z niniejszym programem otrzymae te egzemplarz Powszechnej Licencji Publicznej GNU (GNU General Public License); jeli nie - napisz do Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA." IDS_ABOUT "&O programie..." - IDS_TITLE "Character Map" + IDS_TITLE "Tablica znakw" END diff --git a/reactos/base/applications/mscutils/eventvwr/lang/pl-PL.rc b/reactos/base/applications/mscutils/eventvwr/lang/pl-PL.rc index 63a1e6a7dbd..8ddf4c83248 100644 --- a/reactos/base/applications/mscutils/eventvwr/lang/pl-PL.rc +++ b/reactos/base/applications/mscutils/eventvwr/lang/pl-PL.rc @@ -4,7 +4,7 @@ * FILE: base/applications/mscutils/eventvwr/lang/en-US.rc * PURPOSE: English Language File for ReactOS Event Viewer * - * translated by Caemyr - Olaf Siejka (Dec,2007) + * translated by Caemyr - Olaf Siejka (Dec,2007;May,2011) * Use ReactOS forum PM or IRC to contact me * http://www.reactos.org * IRC: irc.freenode.net #reactos-pl; @@ -122,6 +122,6 @@ END STRINGTABLE BEGIN - IDS_NONE "None" + IDS_NONE "Brak" IDS_NOT_AVAILABLE "N/A" END From b86b0d1048f460b25c30d174f64c5db2f6e1fe89 Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Sun, 1 May 2011 22:00:14 +0000 Subject: [PATCH 275/317] [KERNEL32] - Initialize ViewSize to 0 when mapping view of section. Fixes DLLs registration problems in 2nd stage (happening all the time with the ldr rewrite). svn path=/trunk/; revision=51539 --- reactos/dll/win32/kernel32/misc/ldr.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/dll/win32/kernel32/misc/ldr.c b/reactos/dll/win32/kernel32/misc/ldr.c index 03c3ed1053d..b383f1dd6a1 100644 --- a/reactos/dll/win32/kernel32/misc/ldr.c +++ b/reactos/dll/win32/kernel32/misc/ldr.c @@ -275,7 +275,7 @@ BasepLoadLibraryAsDatafile(PWSTR Path, LPCWSTR Name, HMODULE *hModule) HANDLE hMapping; NTSTATUS Status; PVOID lpBaseAddress = NULL; - SIZE_T ViewSize; + SIZE_T ViewSize = 0; //PUNICODE_STRING OriginalName; //UNICODE_STRING dotDLL = RTL_CONSTANT_STRING(L".DLL"); From 110864eec585b0ef9e27361f28cf83c32715249c Mon Sep 17 00:00:00 2001 From: James Tabor Date: Mon, 2 May 2011 07:40:04 +0000 Subject: [PATCH 276/317] [Win32k] - Fix shift key handling, see bug 6175. svn path=/trunk/; revision=51540 --- reactos/subsystems/win32/win32k/ntuser/msgqueue.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/reactos/subsystems/win32/win32k/ntuser/msgqueue.c b/reactos/subsystems/win32/win32k/ntuser/msgqueue.c index 2c754cdcbbc..e34d0a3101b 100644 --- a/reactos/subsystems/win32/win32k/ntuser/msgqueue.c +++ b/reactos/subsystems/win32/win32k/ntuser/msgqueue.c @@ -53,6 +53,8 @@ DWORD FASTCALL UserGetKeyState(DWORD key) if( key < 0x100 ) { ret = (DWORD)MessageQueue->KeyState[key]; + if (MessageQueue->KeyState[key] & KS_DOWN_BIT) + ret |= 0xFF00; // If down, windows returns 0xFF80. } return ret; From 19c2502076c3bce9060fc309a97f266395464b19 Mon Sep 17 00:00:00 2001 From: Gabriel Ilardi Date: Mon, 2 May 2011 07:59:16 +0000 Subject: [PATCH 277/317] [EVENTVWR] Italian and Spanish translation updates. svn path=/trunk/; revision=51541 --- reactos/base/applications/mscutils/eventvwr/lang/es-ES.rc | 2 +- reactos/base/applications/mscutils/eventvwr/lang/it-IT.rc | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/reactos/base/applications/mscutils/eventvwr/lang/es-ES.rc b/reactos/base/applications/mscutils/eventvwr/lang/es-ES.rc index 0bf199f22a7..486746ddb15 100644 --- a/reactos/base/applications/mscutils/eventvwr/lang/es-ES.rc +++ b/reactos/base/applications/mscutils/eventvwr/lang/es-ES.rc @@ -118,6 +118,6 @@ END STRINGTABLE BEGIN - IDS_NONE "None" + IDS_NONE "Ninguna" IDS_NOT_AVAILABLE "N/A" END diff --git a/reactos/base/applications/mscutils/eventvwr/lang/it-IT.rc b/reactos/base/applications/mscutils/eventvwr/lang/it-IT.rc index 342409733ae..0f0166c68ea 100644 --- a/reactos/base/applications/mscutils/eventvwr/lang/it-IT.rc +++ b/reactos/base/applications/mscutils/eventvwr/lang/it-IT.rc @@ -43,7 +43,7 @@ CAPTION "Informazioni su" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN ICON IDI_EVENTVWR,IDC_MYICON,14,9,21,20 - LTEXT "ReactOS Visualizzatore eventi Version 1.0",IDC_STATIC,49,10,119,8,SS_NOPREFIX + LTEXT "ReactOS Visualizzatore eventi Versione 1.0",IDC_STATIC,49,10,119,8,SS_NOPREFIX LTEXT "Copyright (C) 2007 Marc Piulachs (marc.piulachs@codexchange.net)",IDC_STATIC,49,20,119,22 DEFPUSHBUTTON "OK",IDOK,90,48,42,16,WS_GROUP END @@ -118,6 +118,6 @@ END STRINGTABLE BEGIN - IDS_NONE "None" + IDS_NONE "Nessuna" IDS_NOT_AVAILABLE "N/A" END From 341e9e4d23e0519eaf46756fa6ee663235201ba4 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Mon, 2 May 2011 09:43:01 +0000 Subject: [PATCH 278/317] [FREETYPE] Sync to version 2.4.4 svn path=/trunk/; revision=51542 --- reactos/lib/3rdparty/freetype/ChangeLog | 9158 ++------- reactos/lib/3rdparty/freetype/ChangeLog.23 | 15896 ++++++++++++++++ reactos/lib/3rdparty/freetype/Jamfile | 4 +- reactos/lib/3rdparty/freetype/README | 10 +- reactos/lib/3rdparty/freetype/README.git | 4 +- reactos/lib/3rdparty/freetype/configure | 15 +- .../lib/3rdparty/freetype/devel/ftoption.h | 37 +- reactos/lib/3rdparty/freetype/freetype.rbuild | 6 - .../include/freetype/config/ftconfig.h | 2 +- .../include/freetype/config/ftoption.h | 41 +- .../freetype/include/freetype/freetype.h | 46 +- .../freetype/include/freetype/ftcache.h | 29 +- .../freetype/include/freetype/fterrdef.h | 21 +- .../freetype/include/freetype/ftimage.h | 12 + .../freetype/include/freetype/ftlcdfil.h | 45 +- .../freetype/include/freetype/ftlist.h | 6 +- .../freetype/include/freetype/ftmodapi.h | 44 +- .../freetype/include/freetype/ftrender.h | 6 +- .../freetype/include/freetype/ftsystem.h | 7 +- .../include/freetype/internal/ftmemory.h | 22 +- .../include/freetype/internal/ftobjs.h | 31 +- .../freetype/include/freetype/ttnameid.h | 2 +- .../freetype/include/freetype/tttables.h | 19 +- .../lib/3rdparty/freetype/src/autofit/afcjk.c | 4 +- .../3rdparty/freetype/src/autofit/afglobal.c | 11 +- .../3rdparty/freetype/src/autofit/afhints.c | 131 +- .../3rdparty/freetype/src/autofit/afhints.h | 5 +- .../3rdparty/freetype/src/autofit/aflatin.c | 29 +- .../3rdparty/freetype/src/autofit/aflatin2.c | 9 +- .../lib/3rdparty/freetype/src/autofit/afpic.c | 18 +- .../lib/3rdparty/freetype/src/base/ftbase.h | 11 + .../lib/3rdparty/freetype/src/base/ftdbgmem.c | 6 +- .../lib/3rdparty/freetype/src/base/ftgloadr.c | 4 +- .../lib/3rdparty/freetype/src/base/ftglyph.c | 4 +- .../lib/3rdparty/freetype/src/base/ftgxval.c | 17 +- .../lib/3rdparty/freetype/src/base/ftinit.c | 3 +- .../lib/3rdparty/freetype/src/base/ftlcdfil.c | 37 +- .../lib/3rdparty/freetype/src/base/ftobjs.c | 270 +- .../lib/3rdparty/freetype/src/base/ftotval.c | 9 +- .../lib/3rdparty/freetype/src/base/ftoutln.c | 3 +- .../lib/3rdparty/freetype/src/base/ftpfr.c | 7 +- .../lib/3rdparty/freetype/src/base/ftrfork.c | 84 +- .../lib/3rdparty/freetype/src/base/ftstream.c | 16 +- .../lib/3rdparty/freetype/src/base/ftsynth.c | 4 +- .../lib/3rdparty/freetype/src/base/ftsystem.c | 26 +- .../lib/3rdparty/freetype/src/bdf/bdfdrivr.c | 14 +- .../lib/3rdparty/freetype/src/bdf/bdflib.c | 91 +- .../3rdparty/freetype/src/cache/ftcbasic.c | 12 +- .../3rdparty/freetype/src/cache/ftccache.c | 14 +- .../3rdparty/freetype/src/cache/ftccache.h | 17 +- .../lib/3rdparty/freetype/src/cache/ftccmap.c | 33 +- .../3rdparty/freetype/src/cache/ftcglyph.c | 2 +- .../3rdparty/freetype/src/cache/ftcglyph.h | 2 +- .../3rdparty/freetype/src/cache/ftcimage.c | 4 +- .../3rdparty/freetype/src/cache/ftcmanag.c | 4 +- .../3rdparty/freetype/src/cache/ftcmanag.h | 2 +- .../lib/3rdparty/freetype/src/cache/ftcmru.h | 4 +- .../3rdparty/freetype/src/cache/ftcsbits.c | 10 +- .../lib/3rdparty/freetype/src/cff/cffcmap.c | 31 +- .../lib/3rdparty/freetype/src/cff/cffdrivr.c | 78 +- .../lib/3rdparty/freetype/src/cff/cffgload.c | 137 +- .../lib/3rdparty/freetype/src/cff/cffload.c | 241 +- .../lib/3rdparty/freetype/src/cff/cffload.h | 16 +- .../lib/3rdparty/freetype/src/cff/cffobjs.c | 136 +- .../lib/3rdparty/freetype/src/cff/cffparse.c | 21 +- .../lib/3rdparty/freetype/src/cff/cffpic.c | 16 +- .../lib/3rdparty/freetype/src/cff/cfftypes.h | 21 +- .../lib/3rdparty/freetype/src/cid/cidgload.c | 3 +- .../lib/3rdparty/freetype/src/cid/cidobjs.c | 4 +- .../3rdparty/freetype/src/gxvalid/gxvcommn.c | 4 +- .../lib/3rdparty/freetype/src/gzip/ftgzip.c | 8 +- reactos/lib/3rdparty/freetype/src/lzw/ftlzw.c | 2 +- .../3rdparty/freetype/src/otvalid/otvmath.c | 3 +- .../3rdparty/freetype/src/otvalid/otvmod.c | 4 +- .../lib/3rdparty/freetype/src/pcf/pcfdrivr.c | 13 +- .../lib/3rdparty/freetype/src/pcf/pcfread.c | 6 +- .../lib/3rdparty/freetype/src/pfr/pfrdrivr.c | 4 +- .../lib/3rdparty/freetype/src/pfr/pfrgload.c | 42 +- .../lib/3rdparty/freetype/src/pfr/pfrload.c | 16 +- .../lib/3rdparty/freetype/src/pfr/pfrobjs.c | 20 +- .../lib/3rdparty/freetype/src/pfr/pfrsbit.c | 6 +- .../3rdparty/freetype/src/psaux/afmparse.c | 4 +- .../3rdparty/freetype/src/psaux/afmparse.h | 3 +- .../lib/3rdparty/freetype/src/psaux/psobjs.c | 12 +- .../3rdparty/freetype/src/psaux/t1decode.c | 83 +- .../3rdparty/freetype/src/pshinter/pshalgo.c | 16 +- .../3rdparty/freetype/src/pshinter/pshglob.c | 4 +- .../3rdparty/freetype/src/pshinter/pshpic.c | 16 +- .../3rdparty/freetype/src/psnames/psmodule.c | 9 +- .../lib/3rdparty/freetype/src/psnames/pspic.c | 14 +- .../lib/3rdparty/freetype/src/raster/ftmisc.h | 16 +- .../3rdparty/freetype/src/raster/ftraster.c | 42 +- .../3rdparty/freetype/src/raster/rastpic.c | 13 +- .../lib/3rdparty/freetype/src/sfnt/sfdriver.c | 16 +- .../lib/3rdparty/freetype/src/sfnt/sfntpic.c | 13 +- .../lib/3rdparty/freetype/src/sfnt/sfobjs.c | 16 +- .../lib/3rdparty/freetype/src/sfnt/ttbdf.c | 16 +- .../lib/3rdparty/freetype/src/sfnt/ttcmap.c | 22 +- .../lib/3rdparty/freetype/src/sfnt/ttkern.c | 6 +- .../lib/3rdparty/freetype/src/sfnt/ttload.c | 28 +- .../lib/3rdparty/freetype/src/sfnt/ttpost.c | 60 +- .../lib/3rdparty/freetype/src/sfnt/ttsbit.c | 5 +- .../3rdparty/freetype/src/smooth/ftgrays.c | 320 +- .../3rdparty/freetype/src/smooth/ftsmooth.c | 28 +- .../lib/3rdparty/freetype/src/smooth/ftspic.c | 13 +- .../3rdparty/freetype/src/tools/apinames.c | 20 +- .../3rdparty/freetype/src/truetype/ttgload.c | 112 +- .../3rdparty/freetype/src/truetype/ttgxvar.c | 18 +- .../3rdparty/freetype/src/truetype/ttinterp.c | 474 +- .../3rdparty/freetype/src/truetype/ttinterp.h | 12 +- .../3rdparty/freetype/src/truetype/ttobjs.c | 204 +- .../3rdparty/freetype/src/truetype/ttpic.c | 14 +- .../3rdparty/freetype/src/truetype/ttpload.c | 30 +- .../lib/3rdparty/freetype/src/type1/t1afm.c | 9 +- .../lib/3rdparty/freetype/src/type1/t1load.c | 18 +- .../lib/3rdparty/freetype/src/type1/t1objs.c | 13 +- .../3rdparty/freetype/src/type42/t42objs.c | 22 +- .../3rdparty/freetype/src/type42/t42parse.c | 19 +- .../3rdparty/freetype/src/winfonts/winfnt.c | 24 +- 119 files changed, 19910 insertions(+), 9066 deletions(-) create mode 100644 reactos/lib/3rdparty/freetype/ChangeLog.23 diff --git a/reactos/lib/3rdparty/freetype/ChangeLog b/reactos/lib/3rdparty/freetype/ChangeLog index 83a7d53c6d4..b7aea521796 100644 --- a/reactos/lib/3rdparty/freetype/ChangeLog +++ b/reactos/lib/3rdparty/freetype/ChangeLog @@ -1,15 +1,15 @@ -2010-02-13 Werner Lemberg +2010-11-28 Werner Lemberg - * Version 2.3.12 released. - ========================== + * Version 2.4.4 released. + ========================= - Tag sources with `VER-2-3-12'. + Tag sources with `VER-2-4-4'. * docs/CHANGES: Updated. * docs/VERSION.DLL: Update documentation and bump version number to - 2.3.12. + 2.4.4 * README, Jamfile (RefDoc), builds/win32/vc2005/freetype.vcproj, builds/win32/vc2005/index.html, @@ -22,7917 +22,1529 @@ builds/wince/vc2005-ce/freetype.vcproj, builds/wince/vc2005-ce/index.html, builds/wince/vc2008-ce/freetype.vcproj, - builds/wince/vc2008-ce/index.html: s/2.3.11/2.3.12/, s/2311/2312/. - - * include/freetype/freetype.h (FREETYPE_PATCH): Set to 12. - - * builds/unix/configure.raw (version_info): Set to 10:0:4. - -2010-02-12 suzuki toshiya - - Improve autotool version checking to work with beta releases. - - * autogen.sh (check_tool_version): Improve the extraction of version - number from "tool --version" output. Some beta releases of - autotools have extra strings before version number. - -2010-02-12 suzuki toshiya - - Fix overallocating bug in FT_Outline_New_Internal(). - - * src/base/ftoutln.c (FT_Outline_New_Internal): The length of - FT_Outline->points[] should be numPoints, not 2 * numPoints. - Found by Paul Messmer, see - http://lists.gnu.org/archive/html/freetype-devel/2010-02/msg00003.html - -2010-02-10 Ken Sharp - - Really fix Savannah bug #28678 (part 2). - - Since we consider `sbw' for the horizontal direction only, we still have - to synthesize vertical metrics if the user wants to use the vertical - writing direction. - - * src/cff/cffgload.c (cff_slot_load), src/cid/cidgload.c - (cid_slot_load_glyph), src/type1/t1gload.c (T1_Load_Glyph): - Synthesize vertical metrics (only) if FT_LOAD_VERTICAL_LAYOUT is - set. - -2010-02-10 Ken Sharp - - Really fix Savannah bug #28678 (part 1). - - After long discussion, we now consider the character width vector - (wx,wy) returned by the `sbw' Type 1 operator as being part of *one* - direction only. For example, if you are using the horizontal - writing direction, you get the horizontal and vertical components of - the advance width for this direction. Note that OpenType and CFF fonts - don't have such a vertical component; instead, the GPOS table can be - used to generate two-dimensional advance widths (but this isn't - handled by FreeType). - - * include/freetype/ftincrem.h (FT_Incremental_MetricsRec): Add - `advance_v' field to hold the vertical component of the advance - value. - - * src/truetype/ttgload.c (tt_get_metrics), src/cff/cffgload.c - (cff_slot_load), src/type1/t1gload.c - (T1_Parse_Glyph_And_Get_Char_String), src/cid/cidgload.c - (cid_load_glyph): Use it. - -2010-02-08 Werner Lemberg - - * devel/ftoption.h [FT_CONFIG_OPTION_PIC]: Define. - -2010-02-04 suzuki toshiya - - Prevent NULL pointer dereference passed to FT_Module_Requester. - - * src/sfnt/sfdriver.c (sfnt_get_interface): Don't use `module'. - * src/psnames/psmodule.c (psnames_get_interface): Ditto. - - * src/cff/cffdrivr.c (cff_get_interface): Check NULL `driver'. - * src/truetype/ttdriver.c (tt_get_interface): Ditto. - -2010-01-29 suzuki toshiya - - Fix memory leaks in previous patch. - - * src/sfnt/sfobjs.c (sfnt_load_face): Don't overwrite the strings - allocated for face->root.family_name and style_name. - -2010-01-29 suzuki toshiya - - New parameters for FT_Open_Face() to ignore preferred family names. - - Preferred family names should be used for legacy systems that - can hold only a few faces (<= 4) for a family name. Suggested by - Andreas Heinrich. - http://lists.gnu.org/archive/html/freetype/2010-01/msg00001.html - - * include/freetype/ftsnames.h (FT_PARAM_TAG_IGNORE_PREFERRED_FAMILY, - FT_PARAM_TAG_IGNORE_PREFERRED_SUBFAMILY): Define. - - * src/sfnt/sfobjs.h (sfnt_load_face): Check the arguments and - ignore preferred family and subfamily names if requested. - -2010-01-27 Ken Sharp - - Fix Savannah bug #28678. - - * src/cff/cffgload.c (cff_slot_load), src/cid/cidgload.c - (cid_load_glyph): Handle vertical metrics correctly. - - * src/type1/t1gload.c (T1_Parse_Glyph_And_Get_Char_String): Handle - vertical metrics correctly. - (T1_Load_Glyph): Don't synthesize vertical metrics. - -2010-01-14 Werner Lemberg - - Make FT_Set_Transform work if no renderer is available. - - * src/base/ftobjs.c (FT_Load_Glyph): Apply `standard' transformation - if no renderer is compiled into the library. - -2010-01-14 Werner Lemberg - - Fix compilation warning. - - * src/base/ftbase.h: s/LOCAL_DEF/LOCAL/. - * src/base/ftobjc.s: Include ftbase.h conditionally. - -2010-01-11 Kwang Yul Seo - - Provide inline assembly code for RVCT compiler. - This is Savannah patch #7059. - - * include/freetype/config/ftconfig.h (FT_MULFIX_ASSEMBLER, - FT_MulFix_arm) [__CC_ARM || __ARM_CC]: Define. - -2010-01-08 Ken Sharp - - Fix Savannah bug #28521. - - Issue #28226 involved a work-around for a font which used the - `setcurrentpoint' operator in an invalid way; this operator is only - supposed to be used with the result of OtherSubrs, and the font used - it directly. The supplied patch removed the block of code which - checked this usage entirely. - - This turns out to be a Bad Thing. If `setcurrentpoint' is being - used correctly it should reset the flex flag in the decoder. If we - don't do this then the flag never gets reset and we omit any further - contours from the glyph (at least until we close the path or - similar). - - * src/psaux/t1decode.c (t1_decoder_parse_charstrings) - : Handle `flex_state' correctly. - -2010-01-05 Werner Lemberg - - Apply reports from clang static analyzer. - - * src/lzw/ftlzw.c (ft_lzw_file_init), src/base/ftstroke.c - (FT_Stroker_ParseOutline), src/base/ftsynth.c - (FT_GlyphSlot_Embolden): Remove dead code. - - * src/base/ftpatent.c (_tt_check_patents_in_table): Initialize - `offset_i' and `length_i'. - -2010-01-05 Ralph Giles - - Enable the incremental font interface by default. - - Ghostscript requires the incremental font interface for handling - some Postscript documents. It is moving to using FreeType as its - primary renderer; supporting this in the default build makes it - Ghostscript to be linked against the system FreeType when one is - available. - - * include/freetype/config/ftoption.h (FT_CONFIG_OPTION_INCREMENTAL): - Uncomment. - -2010-01-05 Werner Lemberg - - Fix Savannah bug #28395. - - * src/truetype/ttdriver.c (Load_Glyph), src/type1/t1gload.c - (T1_Loada_Glyph): Don't check `num_glyphs' if incremental interface - is used. - -2010-01-05 Ken Sharp - - Make Type 1 `seac' operator work with incremental interface. - This fixes Savannah bug #28480. - - * src/psaux/t1decode.c (t1operator_seac): Don't check `glyph_names' - if incremental interface is used. - -2010-01-04 Ken Sharp - - Make incremental interface work with TrueType fonts. - This fixes Savannah bug #28478. - - * src/truetype/ttgload.c (load_truetype_glyph): Don't check - `glyf_offset' if incremental interface is used. - -2009-12-31 Lars Abrahamsson - - Make compilation with FT_CONFIG_OPTION_PIC work again. - - * src/base/ftglyph.c (FT_Glyph_To_Bitmap) [FT_CONFIG_OPTION_PIC]: - Declare `library' for FT_BITMAP_GLYPH_CLASS_GET. - - * src/base/ftinit.c (ft_destroy_default_module_classes, - ft_create_default_module_classes): Use proper casts (needed for C++ - compilation). - - * src/sfnt/ttcmap.c (tt_cmap13_class_rec): Use FT_DEFINE_TT_CMAP. - -2009-12-22 Marc Kleine-Budde - - Make freetype-config aware of $SYSROOT. - This is Savannah patch #7040. - - * builds/unix/freetype-config.in: Decorate with ${SYSROOT} where - appropriate. - -2009-12-20 Werner Lemberg - - Fix compiler warning. - Reported by Sean. - - * src/base/ftdbgmem.c [!FT_DEBUG_MEMORY]: ANSI C doesn't like empty - source files; however, some compilers warn about an unused variable - declaration. This is now replaced with a typedef. - -2009-12-18 Werner Lemberg - - Fix Savannah bug #28320. - - There exist corrupt, subsetted fonts (embedded in PDF files) which - contain a private dict that ends with an unterminated floating point - number (no operator following). We now ignore this error (as - acrobat does). - - * src/cff/cffparse.c (cff_parser_run): Don't emit a syntax error for - unterminated floating point numbers. - -2009-12-16 Werner Lemberg - - Really fix compiler warnings. - Reported by Sean. - - * src/truetype/ttgxvar.c (GX_PT_POINTS_ARE_WORDS, - GX_PT_POINT_RUN_COUNT_MASK): Convert enum values to macros. - -2009-12-16 suzuki toshiya - - Improve configure.raw to copy some options from CFLAGS to LDFLAGS. - The linker of Mac OS X 10.6 is sensitive to the architecture. If - the architectures are specified explicitly for the C compiler, the - linker requires the architecture specifications too. - - * builds/unix/configure.raw: Replace `-isysroot' option parser by - more generic argument parser. - -2009-12-15 Werner Lemberg - - Fix compiler warnings. - Reported by Sean. - - * src/truetype/ttgxvar.c (ft_var_readpackeddeltas): Fix counter data - type. - -2009-12-14 Ken Sharp - - Ignore invalid `setcurrentpoint' operations in Type 1 fonts. - This fixes Savannah bug #28226. - - At least two wild PostScript files of unknown provenance contain - Type 1 fonts, apparently converted from TrueType fonts in earlier - PDF versions of the files, which use the `setcurrentpoint' operator - inappropriately. - - FreeType currently throws an error in this case, but Ghostscript and - Adobe Distiller both accept the fonts and ignore the problem. This - commit #ifdefs out the check so PostScript interpreters using - FreeType can render these files. - - The specification says `setcurrentpoint' should only be used to set - the point after a `Subr' call, but these fonts use it to set the - initial point to (0,0). Unnecessarily so, as they correctly use an - `hsbw' operation which implicitly sets the initial point. - - * src/psaux/t1decode.c (t1_decoder_parse_charstrings) - : Comment out code. - -2009-12-14 Bram Tassyns - - Fix parsing of /CIDFontVersion. - This fixes Savannah bug #28287. - - * src/cid/cidtoken.h: `cid_version' in CID_FaceInfoRec (in - t1tables.h) is of type FT_Fixed. - -2009-12-14 Werner Lemberg - - Trace glyph index in CID module. - Suggested in Savannah patch #7023. - - * src/cid/cidgload.c (cid_load_glyph): Add tracing message. - -2009-12-03 Werner Lemberg - - Fix compiler warnings. - - * src/truetype/ttgload.c (tt_get_metrics): Put `Exit' label into the - proper preprocessor conditional. - * src/pfr/pfrobjs.c (pfr_slot_load): Pacify gcc. - -2009-11-25 John Tytgat - - Better handling of start of `eexec' section. - This fixes Savannah bug #28090. - - * src/type1/t1parse.c (T1_Get_Private_Dict): Skip all whitespace - characters before start of `eexec' section. - -2009-11-20 Werner Lemberg - - Fix Savannah bug #27742. - - * src/base/ftstroke.c (ft_stroker_outside): Avoid silent division by - zero, using a threshold for `theta'. - -2009-11-20 Werner Lemberg - - Fix Savannah bug #28036. - - * src/type1/t1afm.c (t1_get_index): Fix comparison. - -2009-11-16 Werner Lemberg - - Fix compiler warnings. - Reported by Kevin Blenkinsopp . - - * src/sfnt/ttload.c (check_table_dir): Use proper data type. - -2009-11-15 Werner Lemberg - - Really fix FreeDesktop bug #21197. - This also fixes Savannah bug #28021. - - * src/autofit/aflatin.c (af_latin_metrics_check_digits), - src/autofit/aflatin2.c (af_latin2_metrics_check_digits): Fix loop. - -2009-11-15 Werner Lemberg - - Add tracing messages for advance values. - - * src/base/ftobjs.c (FT_Load_Glyph), src/truetype/ttgload.c - (TT_Get_HMetrics, TT_Get_VMetrics): Do it. - -2009-11-08 Werner Lemberg - - Fix compiler warning. - Reported by Jeremy Manson . - - * src/truetype/ttgload.c (load_truetype_glyph): Initialize `error'. - -2009-11-04 Werner Lemberg - - Remove compiler warning. - Reported by Sean McBride . - - * src/tools/apinames.c (read_header_file): Use a cast to - `int', as specified in the printf(3) man page. - -2009-11-04 Werner Lemberg - - Fix Savannah bug #27921. - - * src/cff/cffobjs.c (cff_face_init), src/cid/cidobjs.c - (cid_face_init), src/type1/t1afm.c (T1_Read_Metrics), - src/type1/t1objs.c (T1_Face_Init): Don't use unsigned constant - values for rounding if the argument can be negative. - -2009-11-03 Bram Tassyns - - Add basic support for Type1 charstrings in CFF. - This fixes Savannah bug #27922. - - * src/cff/cffgload.c (CFF_Operator, cff_argument_counts): Handle - `seac', `sbw', and `setcurrentpoint' opcodes. - (cff_compute_bias): Add parameter to indicate the charstring type. - Update all callers. - (cff_operator_seac): Add parameter for side bearing. - (cff_decoder_parse_charstrings): Updated for more Type1 support. - -2009-11-03 Werner Lemberg - - Return correct `linearHoriAdvance' value for embedded TT bitmaps too. - Reported by Jeremy Manson . - - src/truetype/ttgload.c (load_truetype_glyph): Add parameter to - quickly load the glyph header only. - Update all callers. - (tt_loader_init): Add parameter to quickly load the `glyf' table - only. - Update all callers. - (TT_Load_Glyph): Compute linear advance values for embedded bitmap - glyphs too. - -2009-11-03 Werner Lemberg - - Improve code readability. - - * src/ttgload.c (load_truetype_glyph): Move metrics calculation - to... - (tt_get_metrics): This new function. - -2009-10-26 Bram Tassyns - - Fix Savannah bug #27811. - - * src/truetype/ttxgvar.c (ft_var_readpackeddeltas): Fix - signed/unsigned mismatch. - -2009-10-19 Ning Dong - - Fix handling of `get' and `put' CFF instructions. - - * src/cff/cffgload.c (cff_decoder_parse_charstrings) : Appendix B of Adobe Technote #5177 limits the number of - elements for the `get' and `put' operators to 32. - * src/cff/cffgload.h (CFF_MAX_TRANS_ELEMENTS): Define. - (CFF_Decoder): Use it for `buildchar' and remove `len_buildchar'. - -2009-10-18 Werner Lemberg - - Fix handling of `dup' CFF instruction. - Problem and solution reported by Ning Dong . - - * src/cff/cffgload.c (cff_decoder_parse_charstrings) : - Increase `args' by 2, not 1. - -2009-10-10 Werner Lemberg - - * Version 2.3.11 released. - ========================== - - - Tag sources with `VER-2-3-11'. - - * docs/VERSION.DLL: Update documentation and bump version number to - 2.3.11. - - * README, Jamfile (RefDoc), builds/win32/visualc/index.html, - builds/win32/visualc/freetype.dsp, - builds/win32/visualc/freetype.vcproj, - builds/win32/visualce/index.html, - builds/win32/visualce/freetype.dsp, - builds/win32/visualce/freetype.vcproj: s/2.3.10/2.3.11/, s/2310/2311/. - - * include/freetype/freetype.h (FREETYPE_PATCH): Set to 11. - - * builds/unix/configure.raw (version_info): Set to 9:22:3. - -2009-10-10 Werner Lemberg - - * docs/CHANGES, docs/release: Updated. - -2009-10-10 suzuki toshiya - - * src/pcf/pcfread.c (pcf_get_properties): Fix a bug in the nprops - truncation. Reported by Martin von Gagern and Peter Volkov. - https://bugs.gentoo.org/288357 and https://bugs.gentoo.org/288256 - -2009-10-06 Werner Lemberg - - * Version 2.3.10 released. - ========================== - - - Tag sources with `VER-2-3-10'. - - * builds/toplevel.mk (major, minor, patch): Fix regexp to allow more - than a single digit. - (dist): We now use git. - - * docs/VERSION.DLL: Update documentation and bump version number to - 2.3.10. - - * README, Jamfile (RefDoc), builds/win32/visualc/index.html, - builds/win32/visualc/freetype.dsp, - builds/win32/visualc/freetype.vcproj, - builds/win32/visualce/index.html, - builds/win32/visualce/freetype.dsp, - builds/win32/visualce/freetype.vcproj: s/2.3.9/2.3.10/, s/239/2310/. - - * include/freetype/freetype.h (FREETYPE_PATCH): Set to 10. - - * builds/unix/configure.raw (version_info): Set to 9:21:3. - -2009-10-06 Werner Lemberg - - Fix `make multi'. - - * src/cache/ftccache.c, src/cache/ftcsbits.c (FT_COMPONENT): Define. - - * src/sfnt/sfdriver.c: Include FT_INTERNAL_DEBUG_H. - -2009-09-27 suzuki toshiya - - [cache] Fix Savannah bug #27441, clean up Redhat bugzilla #513582. - Tricky casts in FTC_{CACHE,GCACHE,MRULIST}_LOOKUP_CMP() are removed. - Now these functions should be called with FTC_Node or FTC_MruNode - variable, and the caller should cast them to appropriate pointers to - concrete data. These tricky casts can GCC-4.4 optimizer (-O2) - confused and the crashing binaries are generated. - - * src/cache/ftcmru.h (FTC_MRULIST_LOOKUP_CMP): Drop tricky cast. - Now the 4th argument `node' of this function should be typed as - FTC_MruNode. - - * src/cache/ftcglyph.h (FTC_GCACHE_LOOKUP_CMP): For inline - implementation, new temporal variable FTC_MruNode `_mrunode' to take - the pointer from FTC_MRULIST_LOOKUP_CMP(). For non-inline - implementation, tricky cast is dropped. - - * src/cache/ftcmanag.c (FTC_SIZE_NODE): New macro casting - to FTC_SizeNode. - (FTC_Manager_LookupSize): Replace FTC_SizeNode `node' by FTC_MruNode - `mrunode', and FTC_SIZE_NODE() is inserted. - (FTC_FACE_NODE): New macro casting to FTC_FaceNode. - (FTC_Manager_LookupFace) Replace FTC_FaceNode `node' by FTC_MruNode - `mrunode', and FTC_FACE_NODE() is inserted. - - * src/cache/ftcbasic.c (FTC_ImageCache_Lookup): Change the type of - `node' from FTC_INode to FTC_Node. Extra casting macro FTC_NODE() - is dropped. - (FTC_ImageCache_LookupScaler): Ditto. - (FTC_SBitCache_Lookup): Change the type of `node' from FTC_SNode to - FTC_Node. Extra casting macro FTC_NODE() is dropped. FTC_SNODE() - is inserted. - (FTC_SBitCache_LookupScaler): Ditto. - - * src/cache/ftccmap.c (FTC_CMapCache_Lookup): Change the type of - `node' from FTC_CMapNode to FTC_Node. Extra casting macro - FTC_NODE() is dropped, FTC_CMAP_NODE() is inserted. - -2009-09-25 suzuki toshiya - - [cache, psaux, type1] Fix for multi build. - In multi build, some cpp functions are left as unresolved symbols. - - * src/cache/ftcbasic.c: Include FT_INTERNAL_DEBUG_H for FT_TRACE1(). - - * src/psaux/t1decode.c: Include FT_INTERNAL_CALC_H for - FIXED_TO_INT(). - * src/type1/t1gload.c: Ditto. - * src/type1/t1objs.c: Ditto. - -2009-09-25 suzuki toshiya - - [autofit] Fix for multi build. - - * src/autofit/afmodule.h: Include FT_INTERNAL_OBJECTS_H to use - FT_DECLARE_MODULE() macro in multi build. - - * src/autofit/aflatin.c: Include to handle - FT_ADVANCES_H correctly in multi build. - -2009-09-24 suzuki toshiya - - [cache] Check the face filled by FTC_Manager_LookupFace(). - - * src/cache/ftcbasic.c (ftc_basic_family_get_count): Return - immediately if FTC_Manager_LookupFace() fills face by NULL. Such - case can occur when the code is optimized by GCC-4.2.x. - -2009-09-23 Werner Lemberg - - * docs/CHANGES: Updated. - -2009-09-12 Werner Lemberg - - [raster] Fix 5-levels grayscale output. - This was broken since version 2.3.0. - - * src/raster/ftraster.c (count_table): Use pre-2.3.0 values (which - were then computed dynamically). - (Vertical_Gray_Sweep_Step): Updated. - - (ft_black_render): Initialize `worker->gray_lines' (problem found by - valgrind). - - (FT_RASTER_OPTION_ANTI_ALIASING, DEBUG_RASTER): Dont' #undef, just - comment out. - -2009-09-12 suzuki toshiya - - Improve configure.raw for cross build. - - * builds/unix/configure.raw: Remove temporal files created by the - suffix checking for CC_BUILD. Set XX_ANSIFLAGS and XX_CFLAGS when - cross compiler is GCC. AC_PROG_CC checks whether the cross compiler - is GCC, its result is stored in GCC. - -2009-09-12 suzuki toshiya - - [BDF] Modify hash API to take size_t value instead of void *. - - The hash API in BDF driver is designed to be generic, it takes - void * typed data. But BDF driver always gives an unsigned long - integer (the index to a property). To reduce non-essential - casts from unsigned long to void* and from void* to unsigned - long, the hash API is changed to take size_t integer. - The issue of incompatible cast between unsigned long and void* - on LLP64 platform is reported by NightStrike from MinGW-Win64 - project. See - http://lists.gnu.org/archive/html/freetype/2009-09/msg00000.html - - * src/bdf/bdf.h: The type of hashnode->data is changed from - void* to size_t. - - * src/bdf/bdflib.c (hash_insert): Get size_t data, instead of - void* data. - (bdf_create_property): Get the name length of new property by - size_t variable, with a cut-off at FT_ULONG_MAX. - (_bdf_set_default_spacing): Get the name length of the face by - size_t variable, with a cut-off at 256. - (bdf_get_property): Get the property id by size_t variable to - reduce the casts between 32-bit prop ID & hashnode->data during - simple copying. - (_bdf_add_property): Ditto. - (_bdf_parse_start): Calculate the index to the property array - by size_t variable. - (bdf_get_font_property): Drop a cast to unsigned long. - -2009-09-10 suzuki toshiya - - [Win64] Improve the computation of random seed from stack address. - - On LLP64 platform, the conversion from pointer to FT_Fixed need - to drop higher 32-bit. Explict casts are required. Reported by - NightStrike from MinGW-w64 project. See - http://lists.gnu.org/archive/html/freetype/2009-09/msg00000.html - - * src/cff/cffgload.c: Convert the pointers to FT_Fixed explicitly. - - * src/psaux/t1decode.c: Ditto. - - -2009-09-03 Werner Lemberg - - [raster] Improvements for stand-alone mode. - - * src/raster/rules.mk: Don't handle ftmisc.h. It is needed for - stand-alone mode only. - - * src/raster/ftmisc.h (FT_MemoryRec , FT_Alloc_Func, FT_Free_Func, - FT_Realloc_Func): Copy declarations from ftsystem.h. - -2009-09-02 Bram Tassyns - - Improve vertical metrics calculation (Savannah bug #27364). - - The calculation of `vertBearingX' is not defined in the OTF font - spec so FreeType does a `best effort' attempt. However, this value - is defined in the PDF and PostScript specs, and that algorithm is - better than the one FreeType currently uses: - - FreeType: Use the middle of the bounding box as the X coordinate - of the vertical origin. - - Adobe PDF spec: Use the middle of the horizontal advance vector as - the X coordinate of the vertical origin. - - FreeType's algorithm goes wrong if you have a really small glyph - (like the full-width, circle-like dot at the end of the sentence, as - used in CJK scripts) with large bearings. With the FreeType - algorithm this dot gets centered on the baseline; with the PDF - algorithm it gets the correct location (in the top right). Note - that this is a serious issue, it's like printing the dot at the end - of a Roman sentence at the center of the textline instead of on the - baseline like it should. So i believe the PDF spec's algorithm - should be used in FreeType as well. - - The `vertBearingY' value for such small glyphs is also very strange - if no `vmtx' information is present, since the height of the bbox is - not representable for the height of the glyph visually (the - whitespace up to the baseline is part of the glyph). The fix also - includes some code for a better estimate of `vertBearingY'. - - * src/base/ftobjs.c (ft_synthesize_vertical_metrics): `vertBearingX' - is now calculated as described by the Adobe PDF Spec. Estimate for - `vertBearingY' now works better for small glyphs completely above or - below the baseline into account. - - * src/cff/cffgload.c (cff_slot_load): `vertBearingX' is now - calculated as described by the Adobe PDF Spec. Vertical metrics - information was always ignored when FT_CONFIG_OPTION_OLD_INTERNALS - was not defined. - - * src/truetype/ttgload.c (compute_glyph_metrics): `vertBearingX' is - now calculated as described by the Adobe PDF Spec. - -2009-09-01 John Tytgat - - Fix custom cmap for empty Type 1 font (Savannah bug #27294). - - * include/freetype/internal/t1types.h (T1_EncodingRecRec_): Update - comment to reflect revised code_last meaning. - * src/type1/t1load.c (T1_Open_Face), src/type42/t42objs.c - (T42_Open_Face): Assign max_char as highest character code + 1 and - use this for T1_EncodingRecRec_::code_last. - * src/psaux/t1cmap.c (t1_cmap_custom_init): Follow revised - T1_EncodingRecRec_::code_last meaning. - -2009-08-25 Werner Lemberg - - Fix rendering of horizontally compressed CFFs. - Bug reported by Ivan Nincic . - - * src/cff/cffgload.c (cff_slot_load): Thinko: Check `xx' element of - `font_matrix' also. - - * docs/CHANGES: Updated. - -2009-08-03 suyu0925@gmail.com - - Don't call `ft_fseek' every time when executing `ft_fread'. - - * src/base/ftstream.c (FT_Stream_Seek), src/base/ftsystem.c - (ft_ansi_stream_io): Implement it. - -2009-07-31 suzuki toshiya - - sfnt: Cast a charcode to 32-bit in cmap format 14 parser. - - * src/sfnt/ttcmap.c (tt_cmap14_char_var_index, - tt_cmap14_char_var_isdefault, tt_cmap14_char_variants, - tt_cmap14_variant_chars): Correct mismatches from - FT_CMap_CharVarIndexFunc prototype, FT_ULong arguments - are replaced by FT_UInt32 arguments. - -2009-07-31 suzuki toshiya - - sfnt: Cast a charcode to 32-bit in cmap format 12 parser. - - * src/sfnt/ttcmap.c (tt_cmap12_char_next): - Insert explicit cast from FT_UFast to FT_UInt32 - for return value. - -2009-07-31 suzuki toshiya - - psaux: Fix a few casts to FT_Int32 value. - - * src/psaux/t1decode.c (t1_decoder_parse_charstrings): - Fix a few casts setting `value' from FT_Long to FT_Int32, - because `value' is typed as FT_Int32 since 2009-06-22. - -2009-07-31 suzuki toshiya - - sfnt: Fix a data type mismatching with its source. - - * src/sfnt/ttcmap.c (tt_cmap13_char_next): Fix the - type of `gindex' from FT_ULong to FT_UInt because - it is set by FT_UInt tt_cmap13_char_map_binary() or - TT_CMap13->cur_gindex. - -2009-07-31 suzuki toshiya - - sfnt: Extend a few local variables to load 32-bit values. - - * src/sfnt/ttkern.c (tt_face_load_kern): Extend `count' - and `kern' to load 32-bit values. - -2009-07-31 suzuki toshiya - - pfr: Extend `num_aux' to take 32-bit value. - - * src/pfr/pfrload.c (pfr_phy_font_load): Extend - `num_aux' to load 32-bit value. - -2009-07-31 suzuki toshiya - - pcf: Truncate FT_ULong `nprops' to fit to int PCF_Face->nprops. - - * src/pcf/pcfread.c (pcf_get_properties): Load `nprops' - as FT_ULong value from PCF file, but truncate it as - int to fit PCF_Face->nprops. The number of truncated - properties is shown in the trace message. - -2009-07-31 suzuki toshiya - - gxvalid: Extend a few local variables to reduce the casts. - - * src/gxvalid/gxvmorx.c (gxv_morx_subtables_validate): - Extend `type' and `rest' to take FT_ULong values. - -2009-07-31 suzuki toshiya - - gxvalid: Extend `settingTable' to take 32-bit offset. - - * src/gxvalid/gxvfeat.c (gxv_feat_name_validate): - Extend `settingTable' to take 32-bit offset. - -2009-07-31 suzuki toshiya - - autofit: Cast FT_Long glyph_count to compare with FT_UInt GID. - - * src/autofit/afglobal.c (af_face_globals_is_digit, - af_face_globals_compute_script_coverage): Cast FT_Long - globals->glyph_count to FT_ULong, to compare with FT_UInt - gindex. - -2009-07-31 suzuki toshiya - - smooth: Exclude 16-bit system in invalid pitch/height check. - - * src/smooth/ftsmooth.c (ft_smooth_render_generic): - pitch and height are typed as FT_UInt but checked to fit - 16-bit range, to avoid the overflows. On 16-bit system, - this checking inserts a conditional that never occurs. - -2009-07-03 suzuki toshiya - - cff: Type large constants > 0x7FFF as long for 16-bit systems. - - * src/cff/cffload.c (cff_charset_load): Type large - constants > 0x7FFF as long, because normal constants - are typed signed integer that is less than 0x8000 on - 16-bit systems. - -2009-07-31 suzuki toshiya - - base: Remove an unused variable. - - * src/base/ftglyph.c (FT_Glyph_To_Bitmap): Remove an - unused variable `library'. glyph->library is used. - -2009-07-31 suzuki toshiya - - cache: Check higher bits in flags for non ILP32 systems. - - 4 public functions ought to take FT_ULong flags, but take - FT_UInt flags. To keep binary compatibility, we drop higher - bits on non ILP32 platforms, - ILP64 systems: No drop occurs. - LP64 systems: Higher bits are not used. - 16-bit systems: Drop can occur. - See - http://lists.gnu.org/archive/html/freetype-devel/2008-12/msg00065.html - These functions will be refined to take FT_ULong flags in - next bump with incompatible API change. - - * src/cache/ftcbasic.c (FTC_ImageCache_Lookup): - Check `flags' in `type', the 2nd argument. - (FTC_SBitCache_Lookup): Ditto. - (FTC_ImageCache_LookupScaler): Check `load_flags', - the 3rd argument. - (FTC_SBitCache_LookupScaler): Ditto. - -2009-07-31 suzuki toshiya - - sfnt: Ignore invalid GIDs in glyph name lookup. - - * include/freetype/internal/fttrace.h: - New trace module for sfdriver.c is added. - - * src/sfnt/sfdriver.c (sfnt_get_name_index): - Restrict glyph name lookup to FT_UInt GID. - Genuine TrueType can hold 16-bit glyphs. - -2009-07-31 suzuki toshiya - - pcf: Fix a comparison between FT_Long and FT_ULong. - - * src/pcf/pcfread.c (pcf_get_bitmaps): Return an error - if PCF_Face->nemetrics is negative. - -2009-07-31 suzuki toshiya - - gxvalid: Guarantee `nFeatureFlags' size up to 32-bit. - - * src/gxvalid/gxvmort.c (gxv_mort_featurearray_validate): - Extend the 3rd argument `nFeatureFlags' to FT_ULong. - * src/gxvalid/gxvmort.h: Ditto. - -2009-07-31 suzuki toshiya - - sfnt: Insert explicit cast for LP64 system. - - * src/sfnt/ttkern.c (tt_face_load_kern): Insert - cast from unsigned long to FT_UInt32. - -2009-07-31 suzuki toshiya - - gxvalid: Guarantee `just' table size upto 32-bit. - - * src/gxvalid/gxvjust.c (gxv_just_validate): - The type of `offset' is changed from FT_UInt to - FT_Offset, for 16-bit platforms. - -2009-07-31 suzuki toshiya - - gxvalid: Guarantee `trak' table size upto 32-bit. - - * src/gxvalid/gxvtrak.c (gxv_trak_validate): - The type of `offset' is changed from FT_UInt to - FT_Offset, for 16-bit platforms. - -2009-07-31 suzuki toshiya - - type1: Fix a data type mismatching with its source. - - * include/freetype/internal/t1types.h: The type of - T1_Face->buildchar is matched with T1_Decorder->top. - -2009-07-31 suzuki toshiya - - pfr: Fix a data type mismatching with its source. - - * src/pfr/pfrtypes.h: The type of PFR_KernItem->offset - is extended from FT_UInt32 to FT_Offset, because it is - calculated with the pointer difference, in - pfr_extra_item_load_kerning_pairs(). - -2009-07-31 suzuki toshiya - - pfr: Fix a data type mismatching with its source. - - * src/pfr/pfrtypes.h: The type of PFR_PhysFont->chars_offset - is extended from FT_UInt32 to FT_Offset, because it is - calculated with the pointer difference in pfr_phy_font_load(). - -2009-07-31 suzuki toshiya - - pfr: Fix a data type mismatching with its source. - - * src/pfr/pfrtypes.h: The type of PFR_PhyFont->bct_offset - is extended from FT_UInt32 to FT_Long, because it is - loaded by FT_STREAM_POS() in pfr_phy_font_load(). - -2009-07-31 suzuki toshiya - - smooth: Improve the format in debug message. - - * src/smooth/ftgrays.c (gray_dump_cells): Improve the - format specifications to dump variables. - -2009-07-31 suzuki toshiya - - sfnt: Fix a data type mismatching with its source. - - * src/sfnt/sfobjs.c (sfnt_load_face): The type of - local `flags' is matched with FT_Face->face_flags. - -2009-07-31 suzuki toshiya - - psaux: Fix a data type mismatching with its source. - - * include/freetype/internal/psaux.h: The type of - T1_DecorderRec.buildchar is matched with - T1_DecorderRec.top. - -2009-07-31 suzuki toshiya - - truetype: Extend TrueType GX packed deltas to FT_Offset. - - * src/truetype/ttgxvar.c (ft_var_readpackeddeltas): - The type of 2nd argument `delta_cnt' is changed from - FT_Int to FT_Offset, because its source can be cvt - table size calculated from stream position. - -2009-07-31 suzuki toshiya - - truetype: Extend mmvar_len to hold size_t values. - - * src/truetype/ttgxvar.h: The type of - GX_BlendRec.mmvar_len is changed from FT_Int to - FT_Offset, because TT_Get_MM_Var() calculates it - by sizeof() results. - -2009-07-31 suzuki toshiya - - truetype: Check invalid function number in IDEF instruction. - - * src/truetype/ttinterp.c (Ins_IDEF): Check - if the operand fits to 8-bit opcode limitation. - -2009-07-31 suzuki toshiya - - truetype: Check invalid function number in FDEF instruction. - - * src/truetype/ttinterp.c (Ins_FDEF): Check - if the operand fits 16-bit function number. - -2009-07-31 suzuki toshiya - - truetype: Truncate the deltas of composite glyph at 16-bit values. - - * src/truetype/ttgload.c (load_truetype_glyph): - Insert cast from FT_Long (deltas[i].{x,y}) to - FT_Int16 in the summation of deltas[] for composite - glyphs. Because deltas[i] is typed as FT_Pos, - its component x, y are typed as FT_Long, but - their sources are always FT_Int16 when they are - loaded by ft_var_readpackeddeltas(). However, - the limitation about the summed deltas is unclear. - -2009-07-31 suzuki toshiya - - truetype: Truncate the instructions upto 16-bit per a glyph. - - * src/truetype/ttgload.c (TT_Hint_Glyph): Truncate - the instructions upto 16-bit length per a glyph. - -2009-07-31 suzuki toshiya - - truetype: Cast the numerical operands to 32-bit for LP64 systems. - - * src/truetype/ttinterp.c (Ins_SPHIX, INS_MIAP, - Ins_MIRP): Insert cast from long (args[], the - operands passed to TrueType operator) to FT_Int32 - (the argument of TT_MulFix14()). - -2009-07-31 suzuki toshiya - - truetype: Cast the project vector to 32-bit for LP64 system. - - * src/truetype/ttinterp.c (Project, DualProject): - Insert casts from FT_Pos (the arguments `dx', `dy') - to FT_UInt32 (the argument to TT_DotFix14()). - -2009-07-31 suzuki toshiya - - truetype: Cast the scaling params to 32-bit for LP64 system. - - * src/truetype/ttgload.c (TT_Process_Composite_Component): - Insert casts from long (return value of FT_MulFix()) to - FT_Int32 (the argument to FT_SqrtFixed()). - -2009-07-31 suzuki toshiya - - sfnt: Cast a character code to FT_UInt32 for LP64 system. - - * src/sfnt/ttcmap.c (tt_cmap14_char_map_nondef_binary, - tt_cmap14_variants, tt_cmap14_char_variants, - tt_cmap14_def_char_count, tt_cmap14_get_def_chars, - tt_cmap14_get_nondef_chars, tt_cmap14_variant_chars) - Insert casts when FT_UInt32 variable is loaded by - TT_NEXT_{UINT24|ULONG}. Because most of them are - compared with FT_UInt32 values in public API, replacing - FT_UFast is not recommended. - -2009-07-31 suzuki toshiya - - sfnt: Cast a character code to FT_UInt32 for LP64 system. - - * src/sfnt/ttcmap.c (tt_cmap4_init, tt_cmap4_next): - Insert the casts from unsigned long constant to - FT_UInt32. - -2009-07-31 suzuki toshiya - - sfnt: Extend TT_BDF->strings_size to FT_ULong for huge BDF. - - * include/freetype/internal/tttypes.h: The type - of TT_BDF->string_size is extended from FT_UInt32 - to FT_ULong, because BDF specification does not - restrict the length of string. - * src/sfnt/ttbdf.c: The scratch variable `strings' - to load TT_BDF->string_size is matched with - TT_BDF->string_size. - -2009-07-31 suzuki toshiya - - psaux: Handle the string length by FT_Offset variables. - - * src/psaux/afmparse.c (afm_parser_next_key, - afm_tokenize, afm_parse_track_kern, - afm_parse_kern_pairs, afm_parse_kern_data, - afm_parser_skip_section, afm_parser_parse): - The length of key is handled by FT_Offset, - instead of FT_UInt. Although the length of - PostScript strings or name object is 16-bit, - AFM_STREAM_KEY_LEN() calculates the length - from the pointer difference. - - * src/psaux/afmparse.h (afm_parser_next_key): - Ditto. - -2009-07-31 suzuki toshiya - - pcf: Fix some data types mismatching with their sources. - - * src/pcf/pcfread.c (pcf_get_bitmaps): The types - of `nbitmaps', `i', `sizebitmaps' are matched with - the type of area FT_Bitmap.pitch * FT_Bitmap.rows. - -2009-07-31 suzuki toshiya - - pcf: Handle the string length by size_t variables. - - * src/pcf/pcfread.c (pcf_interpret_style): The types - of nn, len, lengths[4] are changed to size_t, because - they are loaded by (or compared with) ft_strlen(). - - * src/pcf/pcfutil.c (BitOrderInvert, TwoByteSwap, - FourByteSwap): The type of the 2nd argument `nbytes' - is changed to size_t, for similarity with ANSI C - string functions. - - * src/pcf/pcfdrivr.c (PCF_Glyph_Load): The type of - `bytes' is changed to FT_Offset, because it is passed - to FT_ALLOC(), via ft_glyphslot_alloc_bitmap(). At - least, using unsigned type is better. - -2009-07-31 suzuki toshiya - - pcf: Fix some data types mismatching with their sources. - - * src/pcf/pcfread.c (pcf_seek_to_table_type, - pcf_has_table_type): The type of 3rd argument - `ntables' is matched with PCF_Toc->count. - -2009-07-31 suzuki toshiya - - otvalid: Truncate the glyph index to 16-bit. - - * src/otvalid/otvalid.c (otv_validate): Checks - face->num_glyphs does not exceed 16-bit limit, - pass FT_UInt num_glyphs to backend functions - otv_{GPOS|GSUB|GDEF|JSTF|MATH}_validate(). - -2009-07-31 suzuki toshiya - - cache: Insert explict casts for LP64 systems. - - * src/cache/ftcbasic.c (FTC_ImageCache_Lookup, - FTC_SBitCache_Lookup): The type of FTC_ImageType->width - is FT_Int, so the cast to unsigned larger type FT_ULong - is introduced for the comparisons with 0x10000L for - LP64 platform. - -2009-07-31 suzuki toshiya - - cache: Fix some data types mismatching with their sources. - - * src/cache/ftccache.h: The type of return value - by FTC_Node_WeightFunc function is changed to - FT_Offset. The type of FTC_CacheClass->cache_size - is changed to FT_Offset, too. - - * src/cache/ftccback.h (ft_inode_weight, - ftc_snode_weight): Ditto. - - * src/cache/ftccmap.c (ftc_cmap_node_weight): Ditto. - - * src/cache/ftcimage.c (ftc_inode_weight, - FTC_INode_Weight): Ditto. - - * src/cache/ftcsbits.c (ftc_snode_weight, - FTC_SNode_Weight): Ditto. - - * src/cache/ftcmru.h: The type of - FTC_MruListClass->node_size is changed to FT_Offset, - because it is passed to FT_ALLOC() to specify the - size of buffer. - -2009-07-31 suzuki toshiya - - XXX_cmap_encoding_char_next() return FT_UInt32 values. - - * include/freetype/internal/services/svpscmap.h: - The size of the charcode value returned by - the function typed PS_Unicodes_CharNextFunc is - matched with its input charcode value. - - * src/cff/cffmap.c (cff_cmap_encoding_char_next, - cff_cmap_unicode_char_next): Ditto. - - * src/pfr/pfrmap.c (pfr_cmap_encoding_char_next): - Ditto. - - * src/psaux/t1cmap.c (t1_cmap_std_char_next, - t1_cmap_custom_char_next, t1_cmap_unicode_char_next): - Ditto. - - * src/psnames/psmodule.c (ps_unicodes_char_next): - Ditto. - - * src/winfonts/winfnt.c (fnt_cmap_char_next): - Ditto. - - * src/sfnt/ttcmap.c (tt_cmap0_char_next, - tt_cmap2_char_next, tt_cmap4_char_next, - tt_cmap6_char_next, tt_cmap10_char_next, - tt_cmap12_char_next, tt_cmap13_char_next): Ditto. - (tt_cmap14_char_variants): Handle base unicode - codepoint by FT_UInt32 variable to avoid overflow - on 16-bit platforms. - (tt_cmap14_ensure): The type of `num_results' is - extend to FT_UInt32, to cover unsigned 32-bit - `numVarSelectorRecords' in cmap14 table header. - -2009-07-31 suzuki toshiya - - truetype: Extend TT_Face->num_locations for broken TTFs. - - * include/freetype/internal/tttypes.h: - TT_Face->num_locations are extended from FT_UInt - to FT_ULong, to stand with broken huge loca table. - Some people insists there are broken TTF including - the glyphs over 16-bit limitation, in PRC market. - * src/truetype/ttpload.c (tt_face_load_loca): - Remove unrequired 16-bit truncation for FT_UInt - TT_Face->num_locations. - -2009-07-31 suzuki toshiya - - smooth: Fix some data types mismatching with their sources. - - * src/smooth/ftgrays.c: The type of `TCoord' is - matched to `TPos', because they are mixed in - gray_set_cell(). The type of TCell->x is extended - to `TPos', because gray_find_cell() sets it by - TWorker.ex. The type of TCell->cover is extended - to `TCoord', because gray_render_scanline() adds - TCoord value to it. The type of TWork.cover is matched - with TCell->cover. The types of - TWork.{max_cells,num_cells} are changed to FT_PtrDist, - because they are calculated from the memory addresses. - The type of TWork.ycount is changed to TPos, because - it is calculated from TPos variables. - (gray_find_cell): The type of `x' is matched with - its initial value ras.ex. - (gray_render_scanline): The types of `mod', `lift' - and `rem' are changed to TCoord, because their values - are set with explicit casts to TCoord. When ras.area - is updated by the differential values including - `delta', they are explicitly cast to TArea, because - the type of `delta' is not TArea but TCoord. - (gray_render_line): The type of `mod' is extended - from int to TCoord, because (TCoord)dy is added to mod. - (gray_hline): The argument `acount' is extended to - TCoord, to match with the parameters in the callers. - -2009-07-31 suzuki toshiya - - cff: Fix some data types mismatching with their sources. - - * src/cff/cffobjs.c (cff_face_init): The type of - `scaling' is matched with the scaling parameter - in FT_Matrix_Multiply_Scaled() and - FT_Vector_Transform_Scaled(). - - * src/cff/cffparse.c (cff_parse_real): The type of - `power_ten', `scaling', `exponent_add', - `integer_length', `fraction_length', - `new_fraction_length' and `shift' are matched with - the type of `exponent' to avoid unexpected truncation. - (cff_parse_fixed_scaled): The type of `scaling' is - matched with the `scaling' argument to - cff_parse_real(). - (cff_parse_fixed_dynamic): Ditto. - (cff_parse_font_matrix): The type of `scaling' is - matched with the `scaling' argument to - cff_parse_dynamic(). - -2009-07-31 suzuki toshiya - - autofit: Fix some data types mismatching with their sources. - - * src/autofit/afglobal.c: Correct the type of - AF_FaceGlobalsRec.glyph_count to match with - FT_Face->num_glyphs. - (af_face_globals_compute_script_coverage): - Insert explicit cast to compare - FT_Long AF_FaceGlobalsRec.glyph_count versus - FT_UInt gindex. The type of `nn' is changed - to scan glyph index upto AF_FaceGlobalsRec.glyph_count. - (af_face_globals_get_metrics): The type of `script_max' - is changed to cover size_t value. Insert explicit cast - to compare FT_Long AF_FaceGlobalsRec.glyph_count versus - FT_UInt gindex. - - * src/autofit/afhints.c (af_axis_hints_new_segment): - Insert explicit cast to calculate `big_max' from - integer and size_t values. - (af_axis_hints_new_edge): Ditto. - - * src/autofit/aflatin.c (af_latin_metrics_init_blues): - The type of `best_y' is matched to FT_Vector.y. - (af_latin_compute_stem_width): The type of `delta' is - matched to `dist' and `org_dist'. - -2009-07-31 suzuki toshiya - - autofit: Count the size of the memory object by ptrdiff_t. - - * src/autofit/afcjk.c (af_cjk_hint_edges): The - number of edges `n_edges' should be counted by - FT_PtrDist variable instead of FT_Int. - - * src/autofit/aflatin.c (af_latin_hint_edges): - Ditto. - - * src/autofit/aftypes.h: In AF_ScriptClassRec, - the size of metric `script_metrics_size' should - be counted by FT_Offset variable instead of FT_UInt. - - * src/autofit/afhints.c - (af_glyph_hints_align_strong_points): The cursors - for the edges `min', `max', `mid' in the memory - buffer should be typed FT_PtrDist. - -2009-07-31 suzuki toshiya - - autofit: Fix for unused variable `first'. - - * src/autofit/afhints.c (af_glyph_hints_reload): Insert - FT_UNUSED() to hide the unused variable warning. - -2009-07-31 suzuki toshiya - - Improve bitmap size or pixel variables for 16-bit systems. - - * include/freetype/config/ftstdlib.h: Introduce - FT_INT_MIN, to use in signed integer overflow in - 16-bit and 64-bit platforms. - - * include/freetype/internal/fttrace.h: Add a tracer - to ftsynth.c. - - * src/base/ftbitmap.c (FT_Bitmap_Embolden): Check - invalid strength causing integer overflow on 16-bit - platform. - - * src/base/ftcalc.c (ft_corner_orientation): Change - the internal calculation from FT_Int to FT_Long, to - avoid an overflow on 16-bit platforms. The caller of - this function should use only the sign of result, - so the cast to FT_Int is acceptable. - - * src/base/ftsynth.c: Introduce a tracer for synth module. - (FT_GlyphSlot_Embolden): Check invalid strength causing - integer overflow on 16-bit platform. - - * src/bdf/bdfdrivr.c (BDF_Face_Init): The glyph index - in FT2 API is typed as FT_UInt, although BDF driver - can handle unsigned long glyph index internally. To - avoid integer overflow on 16-bit platform, too large - glyph index should be excluded. - (BDF_Glyph_Load): The glyph pitch in FT2 is typed as - FT_UInt, although BDF driver can handle unsigned long - glyph pitch internally. To avoid integer overflow on - 16-bit platform, too large glyph pitch should not be - returned. - - * src/pfr/pfrsbit.c (pfr_slot_load_bitmap): The glyph - pitch in FT2 is typed as FT_UInt, although PFR font - format can include huge bitmap glyph with 24-bit pitch - (however, a glyph spends 16.7 pixel, it's not realistic). - To avoid integer overflow on 16-bit platform, huge - bitmap glyph should be excluded. - - * src/smooth/ftgrays.c (gray_hline): As FT_Span.x is - truncated to fit its type (16-bit short), FT_Span.y - should be truncated to fit its type (FT_Int). - - * src/cff/cffdrivr.c (cff_get_ros): CFF specification - defines the supplement in ROS as a real number. - Truncate it to fit public FT2 API. - - * src/cff/cffparse.c (cff_parse_cid_ros): Warn the - supplement if it is truncated or rounded in cff_get_ros(). - - * src/cff/cfftypes.h: Change the type of internal variable - `supplement' from FT_Long to FT_ULong to fit the signedness - to the type in public API. - -2009-07-31 suzuki toshiya - - psaux: Prevent invalid arguments to afm_parser_read_vals(). - - * src/psaux/afmparse.c (afm_parser_read_vals): Change - the type of `n' to prevent negative number how many - arguments should be parsed. - - * src/psaux/afmparse.h (afm_parser_read_vals): Ditto. - -2009-07-31 suzuki toshiya - - base: Prevent some overflows on LP64 systems. - - * src/base/ftadvance.c (FT_Get_Advances): Cast the - unsigned long constant FT_LOAD_ADVANCE_ONLY to FT_UInt32 - for LP64 platforms. - - * src/base/ftcalc.c (FT_Sqrt32): All internal variables - are changed to FT_UInt32 from FT_ULong. - (FT_MulDiv): Insert casts to FT_Int32 for LP64 platforms. - This function is designed for 32-bit integer, although - their arguments and return value are FT_Long. - - * src/base/ftobjs.c (FT_Get_Char_Index): Check `charcode' - is within unsigned 32-bit integer for LP64 platforms. - (FT_Face_GetCharVariantIndex): Check `charcode' and - `variantSelector' are within 32-bit integer for LP64 - platforms. - (FT_Face_GetCharsOfVariant): Check `variantSelector' is - within unsigned 32-bit integer for LP64 platforms. - - * src/base/fttrigon.c (ft_trig_downscale): The FT_Fixed - variable `val' and unsigned long constant FT_TRIG_SCALE - are cast to FT_UInt32, when calculates FT_UInt32. - (FT_Vector_Rotate): The long constant 1L is cast to - FT_Int32 to calculate FT_Int32 `half'. - -2009-07-31 suzuki toshiya - - cff: Cast the long variables to 32-bit for LP64 systems. - - * src/cff/cffdrivr.c (cff_get_advances): Insert - explicit cast to modify a 32-bit flag by unsigned - long constant. - - * src/cff/cffobjs.c (cff_face_init): Ditto. - - * src/cff/cffgload.c (cff_decoder_parse_charstrings): - Replace the casts to FT_Long by the casts to FT_Int32 - for LP64 platforms. - -2009-07-31 suzuki toshiya - - pcf: Improve PCF_PropertyRec.value names on LP64 platforms. - - * src/pcf/pcf.h: In PCF_PropertyRec.value, the member - `integer' is replaced by `l', `cardinal' is replaced - by `ul', to fix the difference between the name and - the types on LP64 platforms. - - * src/pcf/pcfdrivr.c (pcf_get_bdf_property): Reflect - PCF_PropertyRec.value change, with appropriate casts - to FT_Int32/FT_UInt32. Their destinations - BDF_PropertyRec.{integer|cardinal} are public and - explicitly defined as FT_Int32/FT_UInt32. - - * src/pcf/pcfread.c (pcf_get_properties, pcf_load_font): - Reflect PCF_PropertyRec.value change. - -2009-07-31 suzuki toshiya - - pcf: Fix some data types mismatching with their sources. - - * src/pcf/pcfdrivr.c (pcf_cmap_char_index): The type of - `code' is matched to PCF_Encoding->enc. - (pcf_cmap_char_next): The type of `charcode' is matched - to PCF_Encoding->enc. When *acharcode is set by charcode, - an overflow is checked and cast to unsigned 32-bit - integer. - -2009-07-31 suzuki toshiya - - bdf: Improve bdf_property_t.value names for LP64 platforms. - - * src/bdf/bdf.h: In bdf_property_t.value, the member - `int32' is replaced by `l', `card32' is replaced by - `ul', to fix the difference between the name and the - types on LP64 platforms. - - * src/bdf/bdfdrivr.c (BDF_Face_Init): Reflect - bdf_property_t.value change. - (bdf_get_bdf_property): Reflect bdf_property_t.value - change, with appropriate casts to FT_Int32/FT_UInt32. - Their destinations BDF_PropertyRec.{integer|cardinal} - are public and explicitly defined as FT_Int32/FT_UInt32. - - * src/bdf/bdflib.c (_bdf_add_property): Reflect - bdf_property_t.value change. - -2009-07-31 suzuki toshiya - - bdf: Fix some data types mismatching with their sources. - - * src/bdf/bdrdrivr.c (bdf_cmap_char_index): The type - of `code' is matched with BDF_encoding_el->enc. - (bdf_cmap_char_next): The type of `charcode' is - matched with BDF_encoding_el->enc. When *acharcode - is set by charcode, an overflow is checked and - cast to unsigned 32-bit integer. - -2009-07-31 suzuki toshiya - - autofit: Improve Unicode range definitions. - - * src/autofit/aftypes.h (AF_UNIRANGE_REC): New macro - to declare a range by two unsigned 32-bit integer, - to avoid 64-bit range definition on LP64 platforms. - - * src/autofit/aflatin.c (af_latin_uniranges): Ditto. - - * src/autofit/aflatin2.c (af_latin2_uniranges): Ditto. - - * src/autofit/afindic.c (af_indic_uniranges): Ditto. - - * src/autofit/afcjk.c (af_cjk_uniranges): Declare - the ranges by AF_UNIRANGE_REC. - -2009-07-31 suzuki toshiya - - smooth: Fix a data type mismatching with its source. - - * src/smooth/ftgrays.c (gray_sweep): The type of - `area' is matched with the 3rd argument `area' - of gray_hline(). - -2009-07-31 suzuki toshiya - - smooth: Fix a data type mismatching with its source. - - * src/smooth/ftgrays.c (gray_render_line): The type - of `area' is matched with TWorker.area. - -2009-07-31 suzuki toshiya - - cache: Disable the legacy compatibility if 16-bit system. - - * src/cache/ftcbasic.c (FTC_ImageCache_Lookup): Exclude - the legacy behaviour from 16-bit platform, because the - current hack cannot detect the caller uses this function - via legacy convension. - (FTC_SBitCache_Lookup): Ditto. - -2009-07-31 suzuki toshiya - - cache: Check 32-bit glyph index on 16-bit systems. - - * src/cache/ftcbasic.c (ftc_basic_family_get_count): - Check overflow caused by the face including large - number of glyphs > 64k. - -2009-07-31 suzuki toshiya - - cache: Fix some data types mismatching with their sources. - - * src/cache/ftccache.c (ftc_cache_resize): The types of - `p', `mask', `count' are matched with FTC_Cache->{p,mask}. - (FTC_Cache_Clear): The type of `old_index' is matched to - FTC_Cache->{p,mask}. - - * src/cache/ftccache.h (FTC_CACHE_LOOKUP_CMP): The type - of `_idx' is matched with FTC_Cache->{p,mask}. - -2009-07-31 suzuki toshiya - - cache: Fix some data types mismatching with their sources. - - * src/cache/ftcsbits.c (ftc_snode_load): The types - of `xadvance' and `yadvance' are matched with - FT_GlyphSlot->advance.{x|y}. - -2009-07-31 suzuki toshiya - - cache: Cast NULL to a required function type explicitly. - - * src/cache/ftcmanag.c (FTC_Manager_RemoveFaceID): - Insert explicit cast from NULL to function type. - -2009-07-31 suzuki toshiya - - fttypes.h: Cast FT_MAKE_TAG output to FT_Tag exlicitly. - - * include/freetype/fttypes.h (FT_MAKE_TAG): - Cast the result to FT_Tag. - -2009-07-31 suzuki toshiya - - psnames: Handle Unicode codepoints by FT_UInt32 variables. - - * src/psnames/psmodule.c (BASE_GLYPH): Cast the result - to unsigned 32-bit integer for LP64 platform. - (ps_unicode_value): Return the value by unsigned 32-bit - integer instead of unsigned long. - -2009-07-31 suzuki toshiya - - psaux: Use size_t variable to pass the buffer size. - - * src/psaux/psaux.h (to_bytes): The type of `max_bytes' - (the argument to pass the buffer size) is changed to - size_t, to match with ANSI C string functions. - - * src/psaux/psconv.h (PS_Conv_StringDecode, - PS_Conv_ASCIIHexDecode, PS_Conv_EexecDecode): Ditto. - - * src/psaux/psconv.c (PS_Conv_StringDecode, - PS_Conv_ASCIIHexDecode, PS_Conv_EexecDecode): Ditto. - - * src/psaux/psobjs.h (ps_parser_to_bytes): Ditto. - - * src/psaux/psobjs.c (ps_parser_to_bytes): Ditto. - -2009-07-31 suzuki toshiya - - type1: Use size_t variable to pass the string length. - - * psaux.h: The type of `len' (the argument to pass - the buffer size to the function in AFM_ParserRec) - is changed to size_t, to match with ANSI C string - functions. - - * t1afm.c (t1_get_index): Ditto. - - * test_afm.c (dummy_get_index): Ditto. - - * afmparse.c (afm_parser_read_vals): To call - AFM_ParserRec.get_index, the length of token - `len' is cast to size_t. - -2009-07-31 suzuki toshiya - - cid: Fix some data types mismatching with their sources. - - * src/cid/cidparse.c (cid_parser_new): The types of - `read_len' and `stream_len' are matched to - FT_Stream->size. Unrequired cast is removed. - -2009-07-31 suzuki toshiya - - cff: Fix for unused variable `rest'. - - * src/cff/cffparse.c (cff_parse_real): Insert - FT_UNUSED() to hide the unused variable warning. - -2009-07-31 suzuki toshiya - - cff: Fix some data types mismatching with their sources. - - * src/cff/cffgload.c (cff_slot_load): The types of - `top_upm' and `sub_upm' are matched with - CFF_FontRecDict->units_per_em. - - * src/cff/cffobjs.c (cff_size_select): Ditto. - (cff_size_request): Ditto. - -2009-07-31 suzuki toshiya - - bdf: Fix some data types mismatching with their sources. - - * bdflib.c (_bdf_list_ensure): The type of `num_items' - is matched with _bdf_list_t.used. Also the types of - `oldsize', `newsize', `bigsize' are matched too. - (_bdf_readstream): `cursor' is used as an offset to - the pointer, it should be typed as FT_Offset. Also - the types of `bytes', `start', `end', `avail' are matched. - - * bdfdrivr.c: The type of BDF_CMap->num_encodings is - matched with FT_CMap->clazz->size. - (bdf_cmap_char_index): The types of `min', `max', `mid' - are matched with BDF_CMap->num_encodings. The type of - `result' is matched with encoding->glyph. - (bdf_cmap_char_next): Ditto, the type of `code' is - matched with BDF_encoding_el.enc. - (bdf_interpret_style): The type of `lengths' is changed - to size_t, to take the value by ft_strlen(). Also the - types of `len', `nn', `mm' are matched. - -2009-07-31 suzuki toshiya - - sfnt: Count the size of the memory object by ptrdiff_t. - - * src/sfnt/ttbdf.c (tt_face_find_bdf_prop): The type of - `peroperty_len' is changed from FT_UInt to FT_Offset, - to match with size_t, which is appropriate type for the - object in the memory buffer. - -2009-07-31 suzuki toshiya - - lzw: Count the size of the memory object by ptrdiff_t. - - * src/lzw/ftzopen.h: The types of FT_LzwState->{buf_total, - stack_size} are changed from FT_UInt to FT_Offset, to match - with size_t, which is appropriate type for the object in - the memory buffer. - - * src/lzw/ftzopen.c (ft_lzwstate_stack_grow): The types of - `old_size' and `new_size' are changed from FT_UInt to - FT_Offset, to match with size_t, which is appropriate type - for the object in the memory buffer. - -2009-07-31 suzuki toshiya - - otvalid: Count the table size on memory by ptrdiff_t. - - * src/otvalid/otvgpos.c (otv_ValueRecord_validate): - Change the type of table size from FT_UInt to - FT_PtrDist because it is calculated by the memory - addresses. - -2009-07-31 suzuki toshiya - - otvalid: Prevent an overflow by GPOS/GSUB 32b-bit offset. - - * src/otvalid/otvgpos.c (otv_ExtensionPos_validate): - Extend ExtensionOffset from FT_UInt to FT_ULong, to - cover 32-bit offset on 16-bit platform. - - * src/otvalid/otvgsub.c (otv_ExtensionSubst_validate): - Ditto. - -2009-07-31 suzuki toshiya - - ftobjs.c: Prevent an overflow in glyph index handling. - - * src/base/ftobjs.c (FT_Face_GetCharsOfVariant): - Improve the cast in comparison to avoid the truncation. - -2009-07-31 suzuki toshiya - - Improve the variable types in raccess_make_file_name(). - - * src/base/ftrfork.c (raccess_make_file_name): - Change the type of cursor variable `tmp' to const char*, - to prevent the unexpected modification of original pathname. - (raccess_make_file_name): Change the type of new_length - to size_t. - -2009-07-31 suzuki toshiya - - ftpatent.c: Fix for unused variable `error'. - - * src/base/ftpatent.c (_tt_check_patents_in_range): - Fix warning for unused variable `error'. - -2009-07-31 suzuki toshiya - - type1: Check invalid string longer than PostScript limit. - - * src/type1/t1afm.c (t1_get_index): Check invalid string - which exceeds the limit of PostScript string/name objects. - -2009-07-31 suzuki toshiya - - gzip: Use FT2 zcalloc() & zfree() in ftgzip.c by default. - - * src/gzip/ftgzip.c (zcalloc, zcfree): Disable all - zcalloc() & zfree() by zlib in zutil.c, those in - ftgzip.c by FT2 are enabled by default. To use - zlib zcalloc() & zfree(), define USE_ZLIB_ZCALLOC. - See discussion: - http://lists.gnu.org/archive/html/freetype-devel/2009-02/msg00000.html - -2009-07-31 suzuki toshiya - - gzip: Distinguish PureC from TurboC on MSDOS. - - * src/gzip/zutil.c (zcalloc, zcfree): Enable only for - MSDOS platform. - -2009-07-31 suzuki toshiya - - gxvalid: Insert PureC pragma to allow unevaluated variables. - - * builds/atari/ATARI.H: Insert PureC pragma not to - warn against set-but-unevaluated variable in gxvalid - module. - -2009-07-31 suzuki toshiya - - gxvalid: Pass the union by the pointer instead of the value. - - * src/gxvalid/gxvcommn.h: - - Declare new type `GXV_LookupValueCPtr'. - - Update the type of the 2nd argument to pass GXV_LookupValueDesc - data to the function prototyped as GXV_Lookup_Value_Validate_Func, - from GXV_LookupValueDesc to GXV_LookupValueCPtr. - - Likewise for the function prototyped as - GXV_Lookup_Fmt4_Transit_Func. - - - Declare new type `GXV_StateTable_GlyphOffsetCPtr'. - - Update the type of the 3rd argument to pass - GXV_StateTable_GlyphOffsetDesc data to the function prototyped - as GXV_StateTable_Entry_Validate_Func, from - GXV_StateTable_GlyphOffsetDesc to GXV_StateTable_GlyphOffsetCPtr. - - - Declare new type `GXV_XStateTable_GlyphOffsetCPtr'. - - Update the type of the 3rd argument to pass - GXV_XStateTable_GlyphOffsetDesc data to the function prototyped - as GXV_XStateTable_Entry_Validate_Func, - from GXV_XStateTable_GlyphOffsetDesc - to GXV_XStateTable_GlyphOffsetCPtr. - - * src/gxvalid/gxvcommn.c (gxv_LookupTable_fmt0_validate, - gxv_XClassTable_lookupval_validate, - gxv_XClassTable_lookupfmt4_transit): - Update from GXV_LookupValueDesc to GXV_LookupValueCPtr. - - * src/gxvalid/gxvbsln.c (gxv_bsln_LookupValue_validate, - gxv_bsln_LookupFmt4_transit): Ditto. - - * src/gxvalid/gxvjust.c - (gxv_just_pcTable_LookupValue_entry_validate, - gxv_just_classTable_entry_validate, - gxv_just_wdcTable_LookupValue_validate): Ditto. - - * src/gxvalid/gxvkern.c - (gxv_kern_subtable_fmt1_entry_validate): Ditto. - - * src/gxvalid/gxvlcar.c (gxv_lcar_LookupValue_validate, - gxv_lcar_LookupFmt4_transit): Ditto. - - * src/gxvalid/gxvopbd.c (gxv_opbd_LookupValue_validate, - gxv_opbd_LookupFmt4_transit): Ditto. - - * src/gxvalid/gxvprop.c (gxv_prop_LookupValue_validate, - gxv_prop_LookupFmt4_transit): Ditto. - - * src/gxvalid/gxvmort4.c - (gxv_mort_subtable_type4_lookupval_validate): Ditto. - - * src/gxvalid/gxvmort0.c - (gxv_mort_subtable_type0_entry_validate): Update - from GXV_StateTable_GlyphOffsetDesc - to GXV_StateTable_GlyphOffsetCPtr. - - * src/gxvalid/gxvmort1.c - (gxv_mort_subtable_type1_entry_validate): Ditto. - - * src/gxvalid/gxvmort2.c - (gxv_mort_subtable_type2_entry_validate): Ditto. - - * src/gxvalid/gxvmort5.c - (gxv_mort_subtable_type5_entry_validate): Ditto. - - * src/gxvalid/gxvmorx2.c - (gxv_morx_subtable_type2_entry_validate): Ditto. - - * src/gxvalid/gxvmorx5.c - (gxv_morx_subtable_type5_entry_validate): Ditto. - - * src/gxvalid/gxvmorx1.c - (gxv_morx_subtable_type1_entry_validate): Ditto. - (gxv_morx_subtable_type1_LookupValue_validate, - gxv_morx_subtable_type1_LookupFmt4_transit): - Update from GXV_LookupValueDesc to GXV_LookupValueCPtr. - - * src/gxvalid/gxvmorx0.c - (gxv_morx_subtable_type0_entry_validate): Update - from GXV_XStateTable_GlyphOffsetDesc - to GXV_XStateTable_GlyphOffsetCPtr. - -2009-07-29 Fabrice Bellet - - Fix Redhat bugzilla #513582 and Savannah bug #26849. - - * src/cache/ftccache.h (FTC_CACHE_LOOKUP_CMP) : Fix - aliasing bug. - -2009-07-19 Werner Lemberg - - Document recent library changes. - - * docs/CHANGES: Do it. - -2009-07-17 Werner Lemberg - - Fix Savannah bug #23786. - - * src/truetype/ttobjs.c (tt_size_init_bytecode): Don't reset x_ppem - and y_ppem. Otherwise the `*_CVT_Stretched' functions in ttinterp.c - get never called. - An anonymous guy suggested this change on Savannah, and it seems to - be the right solution. - -2009-07-15 Werner Lemberg - - * docs/release: Updated. - -2009-07-15 Werner Lemberg - - README.CVS -> README.git - - * README.CVS: Renamed to... - * README.git: This. - Updated. - -2009-07-15 suzuki toshiya - - Borland C++ compiler patch proposed by Mirco Babin. - http://lists.gnu.org/archive/html/freetype/2009-07/msg00016.html. - - * builds/exports.mk: Delete unused flags, CCexe_{CFLAGS,LDFLAGS}. - Fix APINAMES_C and APINAMES_EXE pathnames to reflect the platform - specific pathname syntax. - * builds/compiler/bcc.mk: Remove unused flag, CCexe_LDFLAGS. - Define TE = `-e' separately (bcc32 cannot specify the pathname of - binary executable by T = `-o'). - Extend the large page size in linking freetype.lib. - Add extra CLEAN target to delete bcc specific temporary files. - * builds/compiler/bcc-dev.mk: Ditto. - -2009-07-14 Werner Lemberg - - Fix Savannah bug #27026. - - * builds/win32/vc2005/freetype.sln: Use correct version number. - -2009-07-12 suzuki toshiya - - Add a script to check the undefined and unused trace macros. - - * src/tools/chktrcmp.py: A script to check trace_XXXX macros - that are used in C source but undefined in fttrace.h, or - defined in fttrace.h but unused in C sources. See - http://lists.gnu.org/archive/html/freetype-devel/2009-07/msg00013.html. - * docs/DEBUG: Mention on chktrcmp.py. - * docs/release: Ditto. - -2009-07-09 Werner Lemberg - - [ftraster] Make it compile again with -D_STANDALONE_. - - * src/raster/ftraster.c [_STANDALONE_]: Define - FT_CONFIG_STANDARD_LIBRARY_H. - Include `string.h'. - Don't include `rastpic.h'. - Define FT_DEFINE_RASTER_FUNCS. - -2009-07-09 suzuki toshiya - - smooth: Check glyph size by width/height, instead of pitch/height. - Suggested by der Mouse . - - * src/smooth/ftsmooth.c (ft_smooth_render_generic): Improve - the check for too large glyph. Replace the pair of `pitch' and - `height' by the pair of `width' and `height'. `pitch' cannot - be greater than `height'. The required is checking the product - `pitch' * `height' <= FT_ULONG_MAX, but we use cheap checks for - the realistic case only. - -2009-07-09 suzuki toshiya - - Register 2 missing trace components, t1afm and ttbdf. - - * include/freetype/internal/fttrace.h: Add FT_TRACE_DEF( t1afm ) - and FT_TRACE_DEF( ttbdf ). See - http://lists.gnu.org/archive/html/freetype-devel/2009-07/msg00013.html - -2009-07-09 suzuki toshiya - - Register a trace component for ftgloadr.c. - - * include/freetype/internal/fttrace.h: Add FT_TRACE_DEF( gloader ). - The macro `trace_gloader' was already used in the initial version - on 2002-02-24. - -2009-07-08 suzuki toshiya - - Prevent the overflows by a glyph with too many points or contours. - The bug is reported by Boris Letocha . See - http://lists.gnu.org/archive/html/freetype-devel/2009-06/msg00031.html - http://lists.gnu.org/archive/html/freetype-devel/2009-07/msg00002.html - - * include/freetype/ftimage.h (FT_OUTLINE_CONTOURS_MAX, - FT_OUTLINE_POINTS_MAX): New macros to declare the maximum - values of FT_Outline.{n_contours,n_points}. - * src/base/ftgloadr.c (FT_GlyphLoader_CheckPoints): Check the - total numbers of points and contours cause no overflows in - FT_Outline.{n_contours,n_points}. - - * include/freetype/internal/ftgloadr.h (FT_GLYPHLOADER_CHECK_P, - FT_GLYPHLOADER_CHECK_C): Compare the numbers of points and - contours as unsigned long number, instead of signed int, to - prevent the overflows on 16-bit systems. - -2009-07-05 Bram Tassyns - - Improve compatibility to Acroread. - This fixes Savannah bug #26944. - - * src/cff/cffload.c (cff_charset_compute_cids): For multiple GID to - single CID mappings, make the lowest value win. - -2009-06-28 suzuki toshiya - - ftpatent: Fix a bug by wrong usage of service->table_info(). - http://lists.gnu.org/archive/html/freetype-devel/2008-12/msg00039.html - - * include/freetype/internal/services/svsfnt.h: Extend - FT_SFNT_TableInfoFunc() to take new argument to obtain the offset - to the specified table. - * src/sfnt/sfdriver.c (sfnt_table_info): Extend to return the - table-offset to the caller function. - * src/base/ftpatent.c (_tt_check_patents_in_table): Use new - service->table_info(). - * src/base/ftobjs.c (FT_Sfnt_Table_Info): Synchronize to new - service->table_info(). - -2009-06-28 Werner Lemberg - - [psaux, cff] Protect against nested `seac' calls. - - * include/freetype/internal/psaux.h (T1_Decoder), src/cff/cffgload.h - (CFF_Decoder): Add `seac' boolean variable. - - * src/cff/cffgload.c (cff_operator_seac), src/psaux/t1decode.c - (t1operator_seac): Use it. - -2009-06-28 Werner Lemberg - - Thinko. - - * src/psaux/t1decode.c (t1operator_seac) - [FT_CONFIG_OPTION_INCREMENTAL]: Test for existence of incremental - interface. - -2009-06-28 Werner Lemberg - - * devel/ftoption.h [FT_CONFIG_OPTION_INCREMENTAL]: Define. - -2009-06-27 suzuki toshiya - - Add tools to preprocess the source files for AtariST PureC. - - * builds/atari/deflinejoiner.awk: New file to filter C source files - for broken C preprocessor of PureC compiler. - - * builds/atari/gen-purec-patch.sh: New file to generate a patch set - for PureC, by using deflinejoiner.awk. - -2009-06-27 suzuki toshiya - - Keep existing modules.cfg in the building tree. - - * configure: If `configure' is executed outside of the source tree, - an existing `modules.cfg' file in the build directory should be - kept, not overwritten by the version in the source tree. - -2009-06-27 suzuki toshiya - - Filter --srcdir= option before invoking builds/unix/configure. - - * configure: If builds/unix/configure is invoked with --srcdir - option, the option should take `builds/unix' directory instead of - the top source directory. Thus the configure script in the top - directory should modify the --srcdir= option if - `builds/unix/configure' is invoked. - -2009-06-27 suzuki toshiya - - Improve configure.raw for cross-building on exe-suffixed systems. - - * builds/unix/configure.raw: Fix a bug in sed script to extract - native suffix for binary executables, patch by Peter Breitenlohner. - http://lists.gnu.org/archive/html/freetype-devel/2009-04/msg00036.html - -2009-06-26 Werner Lemberg - - [truetype] Remove TT_SubGlyphRec. - - * src/truetype/ttobjs.h (TT_SubGlyphRec): Removed, unused. - -2009-06-26 Werner Lemberg - - * */*: For warning messages, replace FT_ERROR with FT_TRACE0. - - FT_ERROR is now used only if a function produces a non-zero `error' - value. - - Formatting, improving and harmonizing debug strings. - -2009-06-25 Werner Lemberg - - Provide version information better. - - * src/base/ftinit.c (FT_Init_FreeType): Don't set version here - but... - * src/base/ftobjs.c (FT_New_Library): Here. - -2009-06-22 Werner Lemberg - - Use 16.16 format while parsing Type 1 charstrings. - This fixes Savannah bug #26867. - - Previously, only integers have been used which can lead to serious - rounding errors. - - However, fractional values are only used internally; after the - charstrings (of either Type 1 or 2) have been processed, the - resulting coordinates get rounded to integers currently -- before - applying scaling. This should be fixed; at the same time a new load - flag should be introduced, to be used in combination with - FT_LOAD_NO_SCALE, which indicates that font units are returned in - 16.16 format. Similarly, the incremental interface should be - extended to allow fractional values for metrics. - - * include/freetype/internal/psaux.h (T1_BuilderRec): Remove `shift' - field. - * include/freetype/internal/pshints.h (T1_Hints_SetStemFunc, - T1_Hints_SetStem3Func): Use FT_Fixed for coordinates. - - * src/psaux/psobjs.c: Include FT_INTERNAL_CALC_H. - (t1_build_add_point): Always convert fixed to integer. - * src/psaux/t1decode.c (t1_decoder_parse_charstrings): - Use 16.16 format everywhere (except for large integers followed by a - `div'). - [CAN_HANDLE_NON_INTEGRAL_T1_OPERANDS]: Remove #ifdef and activate - code uncoditionally. - Add support for random numbers and update remaining code - accordingly; this should work now. - (t1_operator_seac): Updated. - * src/psaux/pshrec.c: Include FT_INTERNAL_CALC_H. - (ps_hints_t1stem3, t1_hints_stem): Updated. - - * src/cid/cidgload.c: Include FT_INTERNAL_CALC_H. - (cid_load_glyph) [FT_CONFIG_OPTION_INCREMENTAL], - (cid_face_compute_max_advance, cid_slot_load_glyph): Updated. - - * src/type1/t1gload.c (T1_Parse_Glyph_And_Get_Char_String) - [FT_CONFIG_OPTION_INCREMENTAL], (T1_Get_Advances, T1_Load_Glyph): - Updated. - * src/type1/t1load.c: Include FT_INTERNAL_CALC_H. - * src/type1/t1objs.c (T1_Face_Init): Updated. - -2009-06-21 Werner Lemberg - - * src/pshinter/pshrec.c: Use PSH_Err_Ok. - -2009-06-21 Werner Lemberg - - Code beautification. - - * src/type1/t1load.c (FT_INT_TO_FIXED): Removed. - Replace everywhere with INT_TO_FIXED. - (FT_FIXED_TO_INT): Move to ... - * include/freetype/internal/ftcalc.h (FIXED_TO_INT): Here. - Update all users. - -2009-06-20 Werner Lemberg - - Remove unused variables. - - * include/freetype/internal/psaux.h (T1_BuilderRec), - src/cff/cffgload.h (CFF_Builder): Remove `last'. - Update all users. - -2009-06-20 Werner Lemberg - - [psaux] Check large integers while parsing charstrings. - - * src/psaux/t1decode.c (t1_decoder_parse_charstrings): Large - integers must be followed by a `div' operator. - -2009-06-20 Werner Lemberg - - [cff] Revert last change. - - * src/cff/cffgload.c (cff_decoder_parse_charstrings): Do it. - Next time, don't confuse Type 2 charstring opcodes with TOP DICT - values... - -2009-06-20 Werner Lemberg - - * src/autofit/aflatin.c (af_latin_metrics_check_digits): Fix - compiler warning. - -2009-06-20 Werner Lemberg - - * builds/compiler/gcc.mk (CFLAGS): Use -O3, not -O6. - -2009-06-19 Werner Lemberg - - [cff] Fix handling of reserved byte 0xFF. - - * src/cff/cffgload.c (cff_decoder_parse_charstrings): Abort if byte - 0xFF is encountered. - -2009-06-19 Werner Lemberg - - Improve debug messages for Type1 charstrings. - - * src/psaux/t1decode.c (t1_decoder_parse_charstrings): Emit newlines - after instructions. - Prettify output. - -2009-06-19 Werner Lemberg - - More ftgray fixes for FT_STATIC_RASTER. - Problems reported by suyu@cooee.cn. - - * src/smooth/ftgrays.c (gray_move_to, gray_raster_render): Use - RAS_VAR. - -2009-06-18 Werner Lemberg - - * docs/CHANGES: Updated. - -2009-06-18 Werner Lemberg - - Fix B/W rasterization of subglyphs with different drop-out modes. - - Normally, the SCANMODE instruction (if present) to set the drop-out - mode in a TrueType font is located in the `prep' table only and thus - valid for all glyphs. However, there are fonts like `pala.ttf' - which additionally contain this instruction in the hinting code of - some glyphs (but not all). As a result it can happen that a - composite glyph needs multiple drop-out modes for its subglyphs - since the rendering state gets reset for each subglyph. - - FreeType collects the hinted outlines from all subglyphs, then it - sends the data to the rasterizer. It also sends the drop-out mode - -- after hinting has been applied -- and here is the error: It sends - the drop-out mode of the last subglyph only; drop-out modes of all - other subglyphs are lost. - - This patch fixes the problem; it adds a second, alternative - mechanism to pass the drop-out mode: For each contour, the - rasterizer now checks the first `tags' array element. If bit 2 is - set, bits 5-7 contain the contour's drop-out mode, overriding the - global drop-out mode. - - * include/freetype/ftimage.h (FT_CURVE_TAG_HAS_SCANMODE): New macro. - - * src/truetype/ttgload.c (TT_Hint_Glyph): Store drop-out mode in - `tags[0]'. - - * src/raster/ftraster.c (Flow_Up, Overshoot_Top, Overshoot_Bottom): - Use bits 3-5 instead of 0-2. - (New_Profile): Set the drop-out mode in the profile's `flags' field. - (Decompose_Curve): Check `tags[0]' and set `dropOutControl' if - necessary. - (Vertical_Sweep_Drop, Horizontal_Sweep_Drop, - Horizontal_Gray_Sweep_Drop, Draw_Sweep): Use the profile's drop-out - mode. - -2009-06-16 Werner Lemberg - - Improve scan conversion rules 4 and 6. - - Two new constraints are introduced to better identify a `stub' -- a - concept which is only vaguely described in the OpenType - specification. The old code was too rigorous and suppressed more - pixel than it should. - - . The intersection of the two profiles with the scanline is less - than a half pixel. Code related to this was already present in - the sources but has been commented out. - - . The endpoint of the original contour forming a profile has a - distance (`overshoot') less than half a pixel to the scanline. - - Note that the two additional conditions fix almost all differences - to the Windows rasterizer, but some problematic cases remain. - - * src/raster/ftraster.c (Overshoot_Top, Overshoot_Bottom): New - macros for the `flags' field in the `TProfile' structure. - (IS_BOTTOM_OVERSHOOT, IS_TOP_OVERSHOOT): New macros. - (New_Profile, End_Profile): Pass overshoot flag as an argument and - set it accordingly. - Update callers. - (Vertical_Sweep_Drop, Horizontal_Sweep_Drop): Implement the two new - constraints. - -2009-06-11 Werner Lemberg - - Increase precision for B/W rasterizer. - - * src/raster/ftraster.c (Set_High_Precision): Add two more bits to - the precision. This corrects rendering of some small glyphs, for - example, glyph `xi' in verdana.ttf at 13 ppem. Testing with ftbench - on my GNU/Linux box I don't see a performance degradation. - -2009-06-08 Michael Zucchi - - Handle FT_STROKER_LINECAP_BUTT. - This fixes Savannah bug #26757. - - * src/base/ftstroke.c (ft_stroker_cap): Implement it. - -2009-06-07 Harald Fernengel - - Fix some potential out-of-memory crashes. - - * src/base/ftobjs.c (ft_glyphslot_done): Check `slot->internal'. - * src/base/ftstream.c (FT_Stream_ReleaseFrame): Check `stream'. - * src/truetype/ttinterp.c (TT_New_Context): Avoid double-free of - `exec' in case of failure. - -2009-06-07 Werner Lemberg - - Simplify math. - Suggested by Alexei Podtelezhnikov . - - * src/raster/ftraster.c (Vertical_Sweep_Drop, Horizontal_Sweep_Drop, - Horizontal_Gray_Sweep_Drop): Do it. - -2009-06-04 Werner Lemberg - - Preparation for fixing scan conversion rules 4 and 6. - - * src/raster/ftraster.c (TFlow): Replace enumeration with... - (Flow_Up): This macro. - (TProfile): Replace `flow' member with `flags' bit field. - Update all affected code. - -2009-05-29 James Cloos - - Enable autohinting for glyphs rotated by multiples of 90°. - - * src/base/ftobjs.c (FT_Load_Glyph): Alter check for permitted - matrices to allow rotations by multiples of 90°, not only unrotated, - possibly slanted matrices. - -2009-05-28 Werner Lemberg - - Remove compiler warning. - Reported by Krzysztof Kowalczyk . - - * src/autofit/aflatin2.c (af_latin2_hint_edges): Move declaration of - `n_edges' into `#if' block. - -2009-05-28 Werner Lemberg - - Make compilation work with FT_CONFIG_OPTION_USE_ZLIB not defined. - Reported by Krzysztof Kowalczyk . - - * src/pcf/pcfdrivr.c (PCF_Face_Init) [!FT_CONFIG_OPTION_USE_ZLIB]: - Make it work. - Simplify #ifdef logic. - -2009-05-22 Werner Lemberg - - Improve b/w rasterizer. - Problem reported by Krzysztof Kotlenga . - - * src/raster/raster.c (Vertical_Sweep_Drop, Horizontal_Sweep_Drop, - Horizontal_Gray_Sweep_Drop): For smart drop-out mode, if - intersections are equally distant relative to next pixel center, - select the left pixel, not the right one. - -2009-05-19 Werner Lemberg - - Fix Savannah bug #26600. - - * src/type42/t42parse.c (t42_load_keyword): Handle - T1_FIELD_LOCATION_FONT_EXTRA. - -2009-04-30 Werner Lemberg - - Document recent changes to ftview. - - * docs/CHANGES: Do it. - -2009-04-27 Werner Lemberg - - autohinter: Don't change digit widths if all widths are the same. - This fixes FreeDesktop bug #21197. - - * src/autofit/afglobal.c (AF_DIGIT): New macro. - (af_face_globals_compute_script_coverage): Mark ASCII digits in - `glyph_scripts' array. - (af_face_globals_get_metrics): Updated. - (af_face_globals_is_digit): New function. - * src/autofit/afglobal.h: Updated. - (AF_ScriptMetricsRec): Add `digits_have_same_width' flag. - - * src/autofit/aflatin.c: Include FT_ADVANCES_H. - (af_latin_metrics_check_digits): New function. - (af_latin_metrics_init): Use it. - * src/autofit/aflatin.h: Updated. - * src/autofit/afcjk.c (af_cjk_metrics_init): Updated. - - * src/autofit/aflatin2.c: Similar changes as with aflatin.c. - - * src/autofit/afloader.c (af_loader_load_g): Test digit width. - - * docs/CHANGES: Document it. - -2009-04-26 Werner Lemberg - - Make ftgrays compile with _STANDALONE_ and FT_STATIC_RASTER again. - Problems reported by suyu@cooee.cn. - - * src/smooth/ftgrays.c (FT_DEFINE_OUTLINE_FUNCS, - FT_DEFINE_RASTER_FUNCS) [_STANDALONE_]: Define. - [!_STANDALONE_]: Include ftspic.h only here. - (ras): Define/declare after definition of `TWorker'. - Use `RAS_VAR_' where necessary. - -2009-04-21 Karl Berry - - Fix AC_CHECK_FT2. - - * builds/unix/freetype2.m4: Only check PATH for freetype-config if - we did not already find it from a prefix option. - -2009-04-05 Oran Agra - - Add #error to modules and files that do not support PIC yet. - - When FT_CONFIG_OPTION_PIC is defined the following files will - create #error: - * src/bdf/bdfdrivr.h - * src/cache/ftcmanag.c - * src/cid/cidriver.h - * src/gxvalid/gxvmod.h - * src/gzip/ftgzip.c - * src/lzw/ftlzw.c - * src/otvalid/otvmod.h - * src/pcf/pcfdrivr.h - * src/pfr/pfrdrivr.h - * src/psaux/psauxmod.h - * src/type1/t1driver.h - * src/type42/t42drivr.h - * src/winfonts/winfnt.h - -2009-04-05 Oran Agra - - Position Independent Code (PIC) support in autofit module. - - * include/freetype/internal/autohint.h add macros to init - instances of FT_AutoHinter_ServiceRec. - - * src/autofit/afmodule.h declare autofit_module_class - using macros from ftmodapi.h, - when FT_CONFIG_OPTION_PIC is defined create and destroy - functions will be declared. - * src/autofit/afmodule.c when FT_CONFIG_OPTION_PIC is defined - af_autofitter_service and autofit_module_class structs - will have functions to init or create and destroy them - instead of being allocated in the global scope. - And macros will be used from afpic.h in order to access them. - - * src/autofit/aftypes.h add macros to init and declare - instances of AF_ScriptClassRec. - - * src/autofit/afcjk.h declare af_cjk_script_class - using macros from aftypes.h, - when FT_CONFIG_OPTION_PIC is defined init function will be declared. - * src/autofit/afcjk.c when FT_CONFIG_OPTION_PIC is defined - af_cjk_script_class struct will have function to init it instead of - being allocated in the global scope. - - * src/autofit/afdummy.h declare af_dummy_script_class - using macros from aftypes.h, - when FT_CONFIG_OPTION_PIC is defined init function will be declared. - * src/autofit/afdummy.c when FT_CONFIG_OPTION_PIC is defined - af_dummy_script_class struct will have function to init it instead of - being allocated in the global scope. - - * src/autofit/afindic.h declare af_indic_script_class - using macros from aftypes.h, - when FT_CONFIG_OPTION_PIC is defined init function will be declared. - * src/autofit/afindic.c when FT_CONFIG_OPTION_PIC is defined - af_indic_script_class struct will have function to init it instead of - being allocated in the global scope. - - * src/autofit/aflatin.h declare af_latin_script_class - using macros from aftypes.h, - when FT_CONFIG_OPTION_PIC is defined init function will be declared. - * src/autofit/aflatin.c when FT_CONFIG_OPTION_PIC is defined - af_latin_script_class struct will have function to init it instead of - being allocated in the global scope. - Change af_latin_blue_chars to be PIC-compatible by being a two - dimentional array rather than array of pointers. - - - * src/autofit/aflatin2.h declare af_latin2_script_class - using macros from aftypes.h, - when FT_CONFIG_OPTION_PIC is defined init function will be declared. - * src/autofit/aflatin2.c when FT_CONFIG_OPTION_PIC is defined - af_latin2_script_class struct will have function to init it instead of - being allocated in the global scope. - Change af_latin2_blue_chars to be PIC-compatible by being a two - dimentional array rather than array of pointers. - - * src/autofit/afglobal.c when FT_CONFIG_OPTION_PIC is defined - af_script_classes array initialization was moved to afpic.c and - is later refered using macros defeined in afpic.h. - - New Files: - * src/autofit/afpic.h declare struct to hold PIC globals for autofit - module and macros to access them. - * src/autofit/afpic.c implement functions to allocate, destroy and - initialize PIC globals for autofit module. - - * src/autofit/autofit.c add new file to build: afpic.c. - * src/autofit/jamfile add new files to FT2_MULTI build: afpic.c. - -2009-04-05 Oran Agra - - Position Independent Code (PIC) support in pshinter module. - - * include/freetype/internal/pshints.h add macros to init - instances of PSHinter_Interface. - - * src/pshinter/pshmod.h declare pshinter_module_class - using macros from ftmodapi.h, - when FT_CONFIG_OPTION_PIC is defined create and destroy - functions will be declared. - * src/pshinter/pshmod.c when FT_CONFIG_OPTION_PIC is defined - pshinter_interface and pshinter_module_class structs - will have functions to init or create and destroy them - instead of being allocated in the global scope. - And macros will be used from pshpic.h in order to access them. - - New Files: - * src/pshinter/pshpic.h declare struct to hold PIC globals for pshinter - module and macros to access them. - * src/pshinter/pshpic.c implement functions to allocate, destroy and - initialize PIC globals for pshinter module. - - * src/pshinter/pshinter.c add new file to build: pshpic.c. - * src/pshinter/jamfile add new files to FT2_MULTI build: pshpic.c. - -2009-04-05 Oran Agra - - Position Independent Code (PIC) support in psnames module. - - * include/freetype/internal/services/svpscmap.h add macros to init - instances of FT_Service_PsCMapsRec. - - * src/psnames/psmodule.h declare psnames_module_class - using macros from ftmodapi.h, - when FT_CONFIG_OPTION_PIC is defined create and destroy - functions will be declared. - * src/psnames/psmodule.c when FT_CONFIG_OPTION_PIC is defined - pscmaps_interface and pscmaps_services structs - and psnames_module_class array - will have functions to init or create and destroy them - instead of being allocated in the global scope. - And macros will be used from pspic.h in order to access them. - - New Files: - * src/psnames/pspic.h declare struct to hold PIC globals for psnames - module and macros to access them. - * src/psnames/pspic.c implement functions to allocate, destroy and - initialize PIC globals for psnames module. - - * src/psnames/psnames.c add new file to build: pspic.c. - * src/psnames/jamfile add new files to FT2_MULTI build: pspic.c. - -2009-04-05 Oran Agra - - Position Independent Code (PIC) support in raster renderer. - - * src/raster/ftrend1.h declare ft_raster1_renderer_class - and ft_raster5_renderer_class - using macros from ftrender.h, - when FT_CONFIG_OPTION_PIC is defined create and destroy - functions will be declared. - * src/smooth/ftrend1.c when FT_CONFIG_OPTION_PIC is defined - ft_raster1_renderer_class and ft_raster5_renderer_class structs - will have functions to init or create and destroy them - instead of being allocated in the global scope. - Macros will be used from rastpic.h in order to access - ft_standard_raster from the pic_container (allocated in ftraster.c). - In ft_raster1_render when PIC is enabled, the last letter of - module_name is used to verfy the renderer class rather than the - class pointer. - - * src/raster/ftraster.c when FT_CONFIG_OPTION_PIC is defined - ft_standard_raster struct will have function to init it - instead of being allocated in the global scope. - - New Files: - * src/raster/rastpic.h declare struct to hold PIC globals for raster - renderer and macros to access them. - * src/raster/rastpic.c implement functions to allocate, destroy and - initialize PIC globals for raster renderer. - - * src/raster/raster.c add new file to build: rastpic.c. - * src/raster/jamfile add new files to FT2_MULTI build: rastpic.c. - -2009-04-05 Oran Agra - - Position Independent Code (PIC) support in smooth renderer. - - * src/smooth/ftsmooth.h declare ft_smooth_renderer_class, - ft_smooth_lcd_renderer_class and ft_smooth_lcd_v_renderer_class - using macros from ftrender.h, - when FT_CONFIG_OPTION_PIC is defined create and destroy - functions will be declared. - * src/smooth/ftsmooth.c when FT_CONFIG_OPTION_PIC is defined - the following structs: - ft_smooth_renderer_class, ft_smooth_lcd_renderer_class - and ft_smooth_lcd_v_renderer_class - will have functions to init or create and destroy them - instead of being allocated in the global scope. - And macros will be used from ftspic.h in order to access - ft_grays_raster from the pic_container (allocated in ftgrays.c). - - * src/smooth/ftgrays.h include FT_CONFIG_CONFIG_H - * src/smooth/ftgrays.c when FT_CONFIG_OPTION_PIC is NOT defined - func_interface was moved from gray_convert_glyph_inner function - to the global scope. - When FT_CONFIG_OPTION_PIC is defined - func_interface and ft_grays_raster structs - will have functions to init them - instead of being allocated in the global scope. - And func_interface will be allocated on the stack of - gray_convert_glyph_inner. - - New Files: - * src/smooth/ftspic.h declare struct to hold PIC globals for smooth - renderer and macros to access them. - * src/smooth/ftspic.c implement functions to allocate, destroy and - initialize PIC globals for smooth renderer. - - * src/smooth/smooth.c add new file to build: ftspic.c. - * src/smooth/jamfile add new files to FT2_MULTI build: ftspic.c. - -2009-04-05 Oran Agra - - Position Independent Code (PIC) support in cff driver. - - * include/freetype/internal/services/svcid.h add macros to init - instances of FT_Service_CIDRec. - * include/freetype/internal/services/svpsinfo.h add macros to init - instances of FT_Service_PsInfoRec. - - * src/cff/cffcmap.h declare cff_cmap_encoding_class_rec - and cff_cmap_unicode_class_rec using macros from - ftobjs.h, when FT_CONFIG_OPTION_PIC is defined create and destroy - functions will be declared. - * src/cff/cffcmap.c when FT_CONFIG_OPTION_PIC is defined - the following structs: - cff_cmap_encoding_class_rec and cff_cmap_unicode_class_rec - will have functions to init or create and destroy them - instead of being allocated in the global scope. - - * src/cff/cffdrivr.h declare cff_driver_class using macros from - ftdriver.h, when FT_CONFIG_OPTION_PIC is defined create and destroy - functions will be declared. - * src/cff/cffdrivr.c when FT_CONFIG_OPTION_PIC is defined - the following structs: - cff_service_glyph_dict, cff_service_ps_info, cff_service_ps_name - cff_service_get_cmap_info, cff_service_cid_info, cff_driver_class, - and cff_services array - will have functions to init or create and destroy them - instead of being allocated in the global scope. - And macros will be used from cffpic.h in order to access them - from the pic_container. - Use macros from cffpic.h in order to access the - structs allocated in cffcmap.c - - * src/cff/cffobjs.c Use macros from cffpic.h in order to access the - structs allocated in cffcmap.c - - * src/cff/parser.c when FT_CONFIG_OPTION_PIC is defined - implement functions to create and destroy cff_field_handlers array - instead of being allocated in the global scope. - And macros will be used from cffpic.h in order to access it - from the pic_container. - - New Files: - * src/cff/cffpic.h declare struct to hold PIC globals for cff - driver and macros to access them. - * src/cff/cffpic.c implement functions to allocate, destroy and - initialize PIC globals for cff driver. - - * src/cff/cff.c add new file to build: cffpic.c. - * src/cff/jamfile add new files to FT2_MULTI build: cffpic.c. - -2009-04-05 Oran Agra - - Position Independent Code (PIC) support in sfnt driver. - - * include/freetype/internal/services/svbdf.h add macros to init - instances of FT_Service_BDFRec. - * include/freetype/internal/services/svgldict.h add macros to init - instances of FT_Service_GlyphDictRec. - * include/freetype/internal/services/svpostnm.h add macros to init - instances of FT_Service_PsFontNameRec. - * include/freetype/internal/services/svsfnt.h add macros to init - instances of FT_Service_SFNT_TableRec. - * include/freetype/internal/services/svttcmap.h add macros to init - instances of FT_Service_TTCMapsRec. - * include/freetype/internal/sfnt.h add macros to init - instances of SFNT_Interface. - - * src/sfnt/sfdriver.h declare sfnt_module_class using macros from - ftmodapi.h, when FT_CONFIG_OPTION_PIC is defined create and destroy - functions will be declared. - * src/sfnt/sfdriver.c when FT_CONFIG_OPTION_PIC is defined - the following structs: - sfnt_service_sfnt_table, sfnt_service_glyph_dict, sfnt_service_ps_name - tt_service_get_cmap_info, sfnt_service_bdf, sfnt_interface, - sfnt_module_class, and sfnt_services array - will have functions to init or create and destroy them - instead of being allocated in the global scope. - And macros will be used from sfntpic.h in order to access them - from the pic_container. - - * src/sfnt/ttcmap.h add macros to init - instances of TT_CMap_ClassRec. - * src/sfnt/ttcmap.c when FT_CONFIG_OPTION_PIC is defined - the following structs: - tt_cmap0_class_rec, tt_cmap2_class_rec, tt_cmap4_class_rec - tt_cmap6_class_rec, tt_cmap8_class_rec, tt_cmap10_class_rec, - tt_cmap12_class_rec, tt_cmap14_class_rec and tt_cmap_classes array - will have functions to init or create and destroy them - instead of being allocated in the global scope. - And macros will be used from sfntpic.h in order to access them - from the pic_container. - The content of tt_cmap_classes is now described in the - new file 'ttcmapc.h'. - - New Files: - * src/sfnt/sfntpic.h declare struct to hold PIC globals for sfnt - driver and macros to access them. - * src/sfnt/sfntpic.c implement functions to allocate, destroy and - initialize PIC globals for sfnt driver. - * src/sfnt/ttcmapc.h describing the content of - tt_cmap_classes allocated in ttcmap.c - - * src/sfnt/sfnt.c add new file to build: sfntpic.c. - * src/sfnt/jamfile add new files to FT2_MULTI build: sfntpic.c. - -2009-04-05 Oran Agra - - Position Independent Code (PIC) support in truetype driver. - - * include/freetype/internal/services/svmm.h add macros to init - instances of FT_Service_MultiMastersRec. - * include/freetype/internal/services/svttglyf.h add macros to init - instances of FT_Service_TTGlyfRec. - - * src/truetype/ttdriver.h declare tt_driver_class using macros from - ftdriver.h, when FT_CONFIG_OPTION_PIC is defined create and destroy - functions will be declared. - * src/truetype/ttdriver.c when FT_CONFIG_OPTION_PIC is defined - the following structs: - tt_service_gx_multi_masters, tt_service_truetype_glyf, tt_driver_class - and tt_services array, - will have functions to init or create and destroy them - instead of being allocated in the global scope. - And macros will be used from ttpic.h in order to access them - from the pic_container. - * src/truetype/ttobjs.c change trick_names array to be - PIC-compatible by being a two dimentional array rather than array - of pointers. - - New Files: - * src/truetype/ttpic.h declare struct to hold PIC globals for truetype - driver and macros to access them. - * src/truetype/ttpic.c implement functions to allocate, destroy and - initialize PIC globals for truetype driver. - - * src/truetype/truetype.c add new file to build: ttpic.c. - * src/truetype/jamfile add new files to FT2_MULTI build: ttpic.c. - -2009-04-05 Oran Agra - - Position Independent Code (PIC) support and infrastructure in base. - - * include/freetype/config/ftoption.h add FT_CONFIG_OPTION_PIC - * include/freetype/internal/ftobjs.h Add pic_container member to - FT_LibraryRec. - Add macros to declare and init instances of FT_CMap_ClassRec. - Add macros to init instances of FT_Outline_Funcs and FT_Raster_Funcs. - Add macros to declare, allocate and initialize modules - (FT_Module_Class). - Add macros to declare, allocate and initialize renderers - (FT_Renderer_Class). - Add macro to init instances of FT_Glyph_Class. - Add macros to declare, allocate and initialize drivers - (FT_Driver_ClassRec). - * include/freetype/internal/ftpic.h new file to declare the - FT_PIC_Container struct and the functions to allocate and detroy it. - * include/freetype/internal/ftserv.h add macros to allocate and - destory arrays of FT_ServiceDescRec. - * include/freetype/internal/internal.h define macro to include - ftpic.h. - - New Files: - * src/base/ftpic.c implement functions to allocate and destory the - global pic_container. - * src/base/basepic.h declare struct to hold PIC globals for base and - macros to access them. - * src/base/basepic.c implement functions to allocate, destroy and - initialize PIC globals for base. - - * src/base/ftinit.c when FT_CONFIG_OPTION_PIC is defined implement - functions that allocate and destroy ft_default_modules according to - FT_CONFIG_MODULES_H in the pic_container instead of the global scope - and use macro from basepic.h to access it. - * src/base/ftobjs.c add calls to the functions that allocate and - destroy the global pic_container when the library is created and - destroyed. - - * src/base/jamfile add new files to FT2_MULTI build: - ftpic.c and basepic.c. - * src/base/ftbase.c add new files to build: - ftpic.c and basepic.c. - - * src/base/ftglyph.c when FT_CONFIG_OPTION_PIC is defined - ft_bitmap_glyph_class and ft_outline_glyph_class will be allocated - in the pic_container instead of the global scope and use macros from - basepic.h to access them. - * src/base/ftbbox.c allocate bbox_interface stract on the stack - instead of the global scope when FT_CONFIG_OPTION_PIC is defined. - * src/base/ftstroke.c access ft_outline_glyph_class allocated in - ftglyph.c via macros from basepic.h - -2009-04-05 Oran Agra - - Preparing changes in cff parser later needed for PIC version. - - * src/cff/cffload.c, src/cff/cffload.h, src/cff/cffobjs.c, - src/cff/cffparse.c, src/cff/cffparse.h: Add library pointer to - 'CFF_ParserRec' set by `cff_parser_init'. - Route library pointer from 'cff_face_init' to 'cff_subfont_load' - for `cff_parser_init'. - - * src/cff/cffparse.c (CFF_Field_Handler): Move it to... - * src/cff/cffparse.h: This file, to be used by other C files. - -2009-04-05 Oran Agra - - Minor change in ftstroke.c. - - * src/base/ftstroke.c (FT_StrokerRec): Replace `memory' member with - `library' needed for PIC version. - Update all callers. - -2009-04-04 Werner Lemberg - - ftnames.c -> ftsnames.c - - * src/base/ftnames.c: Rename to... - * src/base/ftsnames.c: This. - * src/base/Jamfile, src/base/rules.mk, src/base/ftbase.c: Updated. - -2009-04-04 Werner Lemberg - - Add support for cmap type 13. - - * devel/ftoption.h, include/freetype/config/ftoption.h - (TT_CONFIG_CMAP_FORMAT_13): New macro. - - * src/sfnt/ttcmap.c (TT_CMap13Rec, tt_cmap13_init, - tt_cmap13_validate, tt_cmap13_char_index, tt_cmap13_char_next, - tt_cmap13_get_info, tt_cmap13_char_map_def_binary, - tt_cmap14_class_rec): New functions and structures for cmap 13 - support. - (tt_cmap_classes): Register tt_cmap13_class_rec. - - * docs/CHANGES: Mention cmap 13 support. - -2009-04-01 Werner Lemberg - - Ignore empty contours in CFF glyphs. - - Problem reported by Albert Astals Cid . - - * src/cff/cffgload.c (cff_builder_close_contour): Synchronize with - t1_builder_close_contour. - -2009-03-21 Werner Lemberg - - Another redundant header inclusion. - - * src/truetype/ttgxvar.c: Fix Ghostscript Coverity issue #4041. - -2009-03-21 Werner Lemberg - - Remove redundant header inclusions. - - This covers many Ghostscript Coverity issues. - - * src/*: Do it. - -2009-03-21 Werner Lemberg - - Fix Ghostscript Coverity issue #3904. - - * src/truetype/ttgxvar.c (ft_var_readpackedpoints): Protect against - invalid values of `runcnt'. - -2009-03-20 Werner Lemberg - - Fix `make multi' run. - - * src/smooth/ftsmooth.h: Include FT_INTERNAL_DEBUG_H. - -2009-03-20 Werner Lemberg - - Fix Savannah bug #25923. - - * src/cache/ftccmap.c (FTC_CMAP_HASH): Fix typo. - -2009-03-20 Werner Lemberg - - Protect against too large glyphs. - - Problem reported by Tavis Ormandy . - - * src/smooth/ftsmooth.c (ft_smooth_render_generic): Don't allow - `pitch' or `height' to be larger than 0xFFFF. - -2009-03-20 Werner Lemberg - Tavis Ormandy - - Fix validation for various cmap table formats. - - * src/sfnt/ttcmap.c (tt_cmap8_validate, tt_cmap10_validate, - tt_cmap12_validate): Check `length' correctly. - (tt_cmap_14_validate): Check `length' and `numMappings' correctly. - -2009-03-20 Werner Lemberg - - Protect against malformed compressed data. - - * src/lzw/ftzopen.c (ft_lzwstate_io): Test whether `state->prefix' is - zero. - -2009-03-20 Werner Lemberg - - Protect against invalid SID values in CFFs. - - Problem reported by Tavis Ormandy . - - * src/cff/cffload.c (cff_charset_load): Reject SID values larger - than 64999. - -2009-03-19 Vincent Richomme - - Update WinCE Visual C project files. - - * builds/wince/vc2005-ce/freetype.vcproj, - builds/wince/vc2008-ce/freetype.vcproj: Add missing base extension - files. - -2009-03-19 Werner Lemberg - - Remove unused Win32 code. - - * builds/wince/ftdebug.c: Remove code guarded with `!_WIN32_WCE'. - Since Win32 is handled separately this is no longer needed. - -2009-03-19 Vincent Richomme - - Make `gzip' module compile on WinCE. - - * src/gzip/zconf.h [_WIN32_WCE]: Define NO_ERRNO_H. - -2009-03-19 Werner Lemberg - - Remove unused WinCE code. - - * builds/win32/ftdebug.c: Remove code guarded with `_WIN32_WCE'. - Since WinCE is handled separately this is no longer needed. - -2009-03-16 Werner Lemberg - - docmaker: Don't ignore single-line code blocks. - - * src/tools/docmaker/content.py (DocBlock::_init__): Fix change from - 2009-01-31. - -2009-03-15 Steve Langasek - - Use __asm__ for declaring assembly instead of asm. - - * builds/unix/ftconfig.in (FT_MulFix_arm): Use __asm__ instead of - asm on arm, fixing a build failure on armel with -pedantic. - -2009-03-14 Werner Lemberg - - Fix valgrind warning. - - * src/sfnt/ttsbit0.c (tt_sbit_decoder_load_bit_aligned): Don't read - past the end of the frame. - -2009-03-12 Werner Lemberg - - * Version 2.3.9 released. - ========================= - - - Tag sources with `VER-2-3-9'. - -2009-03-12 Werner Lemberg - - * builds/unix/freetype2.in: Move @FT2_EXTRA_LIBS@ to `Libs.private'. - -2009-03-12 Werner Lemberg - - Fix some FreeType Coverity issues as reported for Ghostscript. - - * src/base/ftobjs.c (FT_New_Face, FT_New_Memory_Face): Initialize - `args.stream' (#3874, #3875). - (open_face_PS_from_sfnt_stream): Improve error management (#3786). - * src/base/ftmm.c (ft_face_get_mm_service): Fix check of `aservice' - (#3870). - * src/base/ftstroke.c (ft_stroke_border_get_counts): Remove dead - code (#3790). - * src/base/ftrfork.c (raccess_guess_apple_generic): Check error - value of `FT_Stream_Skip' (#3784). - - * src/type1/t1gload.c (T1_Load_Glyph): Check `size' before accessing - it (#3872) - - * src/pcf/pcfdrivr.c (PCF_Glyph_Load): Check `face' before accessing - it (#3871). - * src/pcf/pcfread.c (pcf_get_metrics): Handle return value of - `pcf_get_metric' (#3789, #3782). - (pcf_get_properties): Use FT_STREAM_SKIP (#3783). - - * src/cache/ftcmanag.c (FTC_Manager_RegisterCache): Fix check of - `acache' (#3797) - - * src/cff/cffdrivr.c (cff_ps_get_font_info): Fix check of `cff' - (#3796). - * src/cff/cffgload.c (cff_decoder_prepare): Check `size' (#3795). - * src/cff/cffload.c (cff_index_get_pointers): Add comment (#3794). - - * src/bdf/bdflib.c (_bdf_add_property): Check `fp->value.atom' - (#3793). - (_bdf_parse_start): Add comment (#3792). - - * src/raster/ftraster.c (Finalize_Profile_Table): Check - `ras.fProfile' (#3791). - - * src/sfnt/ttsbit.c (Load_SBit_Image): Use FT_STREAM_SKIP (#3785). - - * src/gzip/ftgzip.c (ft_gzip_get_uncompressed_size): Properly ignore - seek error (#3781). - -2009-03-11 Michael Toftdal - - Extend CID service functions to handle CID-keyed CFFs as CID fonts. - - * include/freetype/ftcid.h (FT_Get_CID_Is_Internally_CID_keyed, - FT_Get_CID_From_Glyph_Index): New functions. - - * include/freetype/internal/services/svcid.h - (FT_CID_GetIsInternallyCIDKeyedFunc, - FT_CID_GetCIDFromGlyphIndexFunc): New function typedefs. - (CID Service): Use them. - - * src/base/ftcid.c: Include FT_CID_H. - (FT_Get_CID_Is_Internally_CID_keyed, FT_Get_CID_From_Glyph_Index): - New functions. - - * src/cff/cffdrivr.c (cff_get_is_cid, cff_get_cid_from_glyph_index): - New functions. - (cff_service_cid_info): Add them. - * src/cff/cffload.c (cff_font_load): Don't free `font->charset.sids' - -- it is needed for access as a CID-keyed font. It gets deleted - later on. - - * src/cid/cidriver.c (cid_get_is_cid, cid_get_cid_from_glyph_index): - New functions. - (cid_service_cid_info): Add them. - - * docs/CHANGES: Updated. - -2009-03-11 Bram Tassyns - - Fix Savannah bug #25597. - - * src/cff/cffparse.c (cff_parse_real): Don't allow fraction_length - to become larger than 9. - -2009-03-11 Werner Lemberg - - Fix Savannah bug #25814. - - * builds/unix/freetype2.in: As suggested in the bug report, move - @LIBZ@ to `Libs.private'. - -2009-03-11 Werner Lemberg - - Fix Savannah bug #25781. - We now simply check for a valid `offset', no longer handling `delta - = 1' specially. - - * src/sfnt/ttcmap.c (tt_cmap4_validate): Don't check `delta' for - last segment. - (tt_cmap4_set_range, tt_cmap4_char_map_linear, - tt_cmap4_char_map_binary): Check offset. - -2009-03-11 Werner Lemberg - - * src/base/Jamfile: Fix handling of ftadvanc.c. - Reported by Oran Agra . - -2009-03-10 Vincent Richomme - - Restructure Win32 and Wince compiler support. - - * src/builds/win32: Remove files for WinCE. - Move VC 2005 support to a separate directory. - Add directory for VC 2008 support. - - * src/builds/wince: New directory hierarchy for WinCE compilers - (VC 2005 and VC 2008). - -2009-03-09 Werner Lemberg - - More preparations for 2.3.9 release. - - * docs/CHANGES: Updated. - - * Jamfile, README: s/2.3.8/2.3.9/, s/238/239/. - -2009-03-09 Werner Lemberg - - * src/sfnt/rules.mk (SFNT_DRV_H): Add ttsbit0.c. - -2009-03-09 Alexey Kryukov - - Fix handling of EBDT formats 8 and 9 (part 2). - - This patch fixes the following problems in ttsbit0.c: - - . Bitmaps for compound glyphs were never allocated. - - . `SBitDecoder' refused to load metrics if some other metrics have - already been loaded. This condition certainly makes no sense for - recursive calls, so I've just disabled it. Another possibility - would be resetting `decoder->metrics_loaded' to false before - loading each composite component. However, we must restore the - original metrics after finishing the recursion; otherwise we can - get a misaligned glyph. - - . `tt_sbit_decoder_load_bit_aligned' incorrectly handled `x_pos', - causing some glyph components to be shifted too far to the right - (especially noticeable for small sizes). - - Note that support for grayscale bitmaps (not necessarily compound) is - completely broken in ttsbit0.c. - - * src/sfnt/tt_sbit_decoder_load_metrics: Always load metrics. - (tt_sbit_decoder_load_bit_aligned): Handle `x_pos' correctly in case - of `h == height'. - (tt_sbit_decoder_load_compound): Reset metrics after loading - components. - Allocate bitmap. - -2009-03-09 Werner Lemberg - - * builds/unix/configure.raw (version_info): Set to 9:20:3. - -2009-03-03 David Turner - - Protect SFNT kerning table parser against malformed tables. - - This closes Savannah BUG #25750. - - * src/sfnt/ttkern.c (tt_face_load_kern, tt_face_get_kerning): Fix a - bug where a malformed table would be successfully loaded but later - crash the engine during parsing. - -2009-03-03 David Turner - - Update documentation and bump version number to 2.3.9. - - * include/freetype/freetype.h: Bump patch version to 9. - * docs/CHANGES: Document the ABI break in 2.3.8. - * docs/VERSION.DLL: Update version numbers table for 2.3.9. - -2009-03-03 David Turner - - Remove ABI-breaking field in public PS_InfoFontRec definition. - - Instead, we define a new internal PS_FontExtraRec structure to - hold the additional field, then place it in various internal - positions of the corresponding FT_Face derived objects. - - * include/freetype/t1tables.h (PS_FontInfoRec): Remove the - `fs_type' field from the public structure. - * include/freetype/internal/psaux.h (T1_FieldLocation): New - enumeration `T1_FIELD_LOCATION_FONT_EXTRA'. - * include/freetype/internal/t1types.h (PS_FontExtraRec): New - structure. - (T1_FontRec, CID_FaceRec): Add it. - - * src/cid/cidload.c (cid_load_keyword): Handle - T1_FIELD_LOCATION_FONT_EXTRA. - * src/cid/cidtoken.h, src/type1/t1tokens.h, src/type42/t42parse.c: - Adjust FT_STRUCTURE and T1CODE properly to handle `FSType'. - * src/type1/t1load.c (t1_load_keyword): Handle - T1_FIELD_LOCATION_FONT_EXTRA. - - * include/freetype/internal/services/svpsinfo.h (PsInfo service): - Add `PS_GetFontExtraFunc' function typedef. - - * src/base/ftfstype.c: Include FT_INTERNAL_SERVICE_H and - FT_SERVICE_POSTSCRIPT_INFO_H. - (FT_Get_FSType_Flags): Use POSTSCRIPT_INFO service. - - * src/cff/cffdrivr.c (cff_service_ps_info): Updated. - * src/cid/cidriver.c (cid_ps_get_font_extra): New function. - (cid_service_ps_info): Updated. - * src/type1/t1driver.c (t1_ps_get_font_extra): New function. - (t1_service_ps_info): Updated. - * src/type42/t42drivr.c (t42_ps_get_font_extra): New function. - (t42_service_ps_info): Updated. - -2009-03-02 Alexey Kryukov - - Fix handling of EBDT formats 8 and 9. - - The main cycle in `blit_sbit' makes too many iterations: it actually - needs the count of lines in the source bitmap rather than in the - target image. - - * src/sfnt/ttsbit.c (blit_sbit) [FT_CONFIG_OPTION_OLD_INTERNALS]: - Add parameter `source_height' and use it for main loop. - (Load_SBit_Single) [FT_CONFIG_OPTION_OLD_INTERNALS]: Updated. - -2009-02-23 Werner Lemberg - - Fix Savannah bug #25669. - - * src/base/ftadvanc.h (FT_Get_Advances): Fix serious typo. - - * src/base/ftobjs.c (FT_Select_Metrics, FT_Request_Metrics): Fix - scaling factor for non-scalable fonts. - - * src/cff/cffdrivr.c (cff_get_advances): Use correct advance width - value to prevent incorrect scaling. - - * docs/CHANGES: Document it. - -2009-02-15 Matt Godbolt - - Fix Savannah bug #25588. - - * builds/unix/ftconfig.in (FT_MulFix_arm): Use correct syntax for - `orr' instruction. - -2009-02-11 Werner Lemberg - - * src/truetype/ttobjs.c (tt_check_trickyness): Add `DFKaiShu'. - Reported by David Bevan . - -2009-02-09 Werner Lemberg - - Fix Savannah bug #25495. - - * src/sfnt/sfobjs.c (sfnt_load_face): Test for bitmap strikes before - setting metrics and bbox values. This ensures that the check for a - font with neither a `glyf' table nor bitmap strikes can be performed - early enough to set metrics and bbox values too. - -2009-02-04 Werner Lemberg - - Fix Savannah bug #25480. - - * builds/unix/freetype-config.in: For --ftversion, don't use $prefix - but $includedir. - -2009-01-31 Werner Lemberg - - Minor docmaker improvements. - - * src/tools/docmaker/content.py (DocBlock::__init__): Ignore empty - code blocks. - -2009-01-25 Werner Lemberg - - Fix SCANCTRL handling in TTFs. - Problem reported by Alexey Kryukov . - - * src/truetype/ttinterp.c (Ins_SCANCTRL): Fix threshold handling. - -2009-01-23 Werner Lemberg - - Move FT_Get_FSType_Flags to a separate file. - Problem reported by Mickey Gabel . - - * src/base/ftobjs.c (FT_Get_FSType_Flags): Move to... - * src/base/ftfstype.c: This new file. - - * modules.cfg (BASE_EXTENSION): Add ftfstype.c. - - * docs/INSTALL.ANY: Updated. - - * builds/mac/*.txt, builds/amiga/*makefile*, - builds/win32/{visualc,visualce}/freetype.*, builds/symbian/*: - Updated. - -2009-01-22 suzuki toshiya - - * builds/unix/ftsystem.c (FT_Stream_Open): Fix 2 error - messages ending without "\n". - -2009-01-22 suzuki toshiya - - Fix Savannah bug #25347. - - * src/base/ftobjs.c (open_face_PS_from_sfnt_stream): Rewind - the stream to the original position passed to this function, - when ft_lookup_PS_in_sfnt_stream() failed. - (Mac_Read_sfnt_Resource): Rewind the stream to the head of - sfnt resource body, when open_face_PS_from_sfnt_stream() - failed. - -2009-01-19 Michael Lotz - - Fix Savannah bug #25355. - - * include/freetype/config/ftconfig.h (FT_MulFix_i386): Make - assembler code work with gcc 2.95.3 (as used by the Haiku project). - Add `cc' register to the clobber list. - -2009-01-18 Werner Lemberg - - Protect FT_Get_Next_Char. - - * src/sfnt/ttcmap.c (tt_cmap4_set_range): Apply fix similar to - change from 2008-07-22. - - Patch from Ronen Ghoshal . - -2009-01-18 Werner Lemberg - - Implement FT_Get_Name_Index for SFNT driver. - - * src/sfnt/sfdriver.c (sfnt_get_name_index): New function. - (sfnt_service_glyph_dict): Use it. - - Problem reported by Truc Truong . - -2009-01-18 Werner Lemberg - - * include/freetype/ftstroke.h (FT_Outline_GetInsideBorder): Fix - documentation. Problem reported by Truc Truong . - - * docs/CHANGES: Updated. - -2009-01-14 Werner Lemberg - - * Version 2.3.8 released. - ========================= - - - Tag sources with `VER-2-3-8'. - - * docs/VERSION.DLL: Update documentation and bump version number to - 2.3.8. - - * README, Jamfile (RefDoc), builds/win32/visualc/index.html, - builds/win32/visualc/freetype.dsp, - builds/win32/visualc/freetype.vcproj, - builds/win32/visualce/index.html, - builds/win32/visualce/freetype.dsp, - builds/win32/visualce/freetype.vcproj: s/2.3.7/2.3.8/, s/237/238/. - - * include/freetype/freetype.h (FREETYPE_PATCH): Set to 8. - - * builds/unix/configure.raw (version_info): Set to 9:19:3. - - * docs/release: Updated. - -2009-01-14 Werner Lemberg - - * builds/toplevel.mk (dist): Compress better. - -2009-01-13 Werner Lemberg - - * src/base/ftobjs.c (FT_Get_FSType_Flags): Cast for compilation - with C++. - -2009-01-13 Werner Lemberg - - Don't use stdlib.h and friends directly. - Reported by Mickey Gabel . - - * src/base/ftdbgmem.c: s//FT_CONFIG_STANDARD_LIBRARY_H/. - - * src/gzip/ftgzip.c, src/lzw/ftlzw.c, src/raster/ftmisc.h: - s//FT_CONFIG_STANDARD_LIBRARY_H/. - - * src/autofit/aftypes.h, src/autofit/afhints.c, - src/pshinter/pshalgo.c: s//FT_CONFIG_STANDARD_LIBRARY_H/ - - * src/lzw/ftlzw.c, src/base/ftdbgmem.c: Don't include stdio.h. - -2009-01-12 Werner Lemberg - - Avoid compiler warnings. - - * */*: s/do ; while ( 0 )/do { } while ( 0 )/. - Reported by Sean McBride . - -2009-01-12 Werner Lemberg - - Fix stdlib dependencies. - - Problem reported by Mickey Gabel . - - * include/freetype/config/ftstdlib.h (ft_exit): Removed. Unused. - - * src/autofit/afhints.c, src/base/ftlcdfil.c, src/smooth/ftsmooth.c: - s/memcpy/ft_memcpy/. - * src/psaux/t1decode.c: s/memset/ft_memset/, s/memcpy/ft_memcpy/. - -2009-01-11 Werner Lemberg - - * docs/formats.txt: Add link to PCF specification. - - * include/freetype/ftbdf.h (FT_Get_BDF_Property): Improve - documentation. - -2009-01-09 suzuki toshiya - - * src/base/ftadvanc.c (_ft_face_scale_advances, FT_Get_Advance, - FT_Get_Advances): Change the type of load_flags from FT_UInt32 to - FT_Int32, to match with the flags for FT_Load_Glyph(). - * src/cff/cffdrivr.c (cff_get_advances): Ditto. - * src/truetype/ttdriver.c (tt_get_advances): Ditto. - * include/freetype/ftadvanc.h (FT_Get_Advance, FT_Get_Advances): - Ditto. - * include/freetype/internal/ftdriver.h (FT_Face_GetAdvancesFunc): - Ditto. - -2009-01-09 Daniel Zimmermann - - * src/gxvalid/gxvmort.c (gxv_mort_feature_validate): Fix wrong - length check. From Savannah patch #6682. - -2009-01-09 Werner Lemberg - - Fix problem with T1_FIELD_{NUM,FIXED}_TABLE2. - - * src/psaux/psobjs.c (ps_parser_load_field_table): Don't handle - `count_offset' if it is zero (i.e., unused). Otherwise, the first - element of the structure which holds the data is erroneously - modified. Problem reported by Chi Nguyen . - -2009-01-09 suzuki toshiya - - * src/base/ftadvanc.c (_ft_face_scale_advances, FT_Get_Advance, - FT_Get_Advances): Extend the type of load_flags from FT_UInt to - FT_UInt32, to pass 32-bit flags on 16bit platforms. - * src/cff/cffdrivr.c (cff_get_advances): Ditto. - * src/truetype/ttdriver.c (tt_get_advances): Ditto. - * include/freetype/ftadvanc.h (FT_Get_Advance, FT_Get_Advances): - Ditto. - * include/freetype/internal/ftdriver.h (FT_Face_GetAdvancesFunc): - Ditto. - -2009-01-09 suzuki toshiya - - * src/base/ftobjs.c (FT_Done_Library): Issue an error message when - FT_Done_Face() cannot free all faces. If the list of the opened - faces includes broken face which FT_Done_Face() cannot free, - FT_Done_Library() retries FT_Done_Face() and it can fall into - an endless loop. See the discussion: - http://lists.gnu.org/archive/html/freetype-devel/2008-09/msg00047.html - http://lists.gnu.org/archive/html/freetype-devel/2008-10/msg00000.html - -2009-01-07 Werner Lemberg - - * docs/CHANGES: Document new key `a' in ftdiff. - -2009-01-06 Werner Lemberg - - * autogen.sh: Don't use GNUisms while calling sed. Problem reported - by Sean McBride. - -2009-01-06 Werner Lemberg - - * src/base/ftbitmap.c (FT_Bitmap_Convert): Handle FT_PIXEL_MODE_LCD - and FT_PIXEL_MODE_LCD_V. Problem reported by Chi Nguyen - . - -2009-01-06 Diego Pettenò - - * builds/unix/configure.raw: Don't call AC_CANONICAL_BUILD and - AC_CANONICAL_TARGET and use $host_os only. A nice explanation for - this change can be found at - http://blog.flameeyes.eu/s/canonical-target. - - From Savannah patch #6712. - -2009-01-06 Sean McBride - - * src/base/ftdbgmem.c (_debug_mem_dummy): Make it static. - - * src/base/ftmac.c: Remove some #undefs. - -2008-12-26 Werner Lemberg - - Set `face_index' field in FT_Face for all font formats. - - * cff/cffobjs.c (cff_face_init), winfonts/winfnt.c (FNT_Face_Init), - sfnt/sfobjs.c (sfnt_init_face): Do it. - - * docs/CHANGES: Document it. - -2008-12-22 Steve Grubb - - * builds/unix/ftsystem.c (FT_Stream_Open): Reject zero-length files. - Patch from Savannah bug #25151. - -2008-12-21 Werner Lemberg - - * src/pfr/pfrdrivr.c, src/winfonts/winfnt.c, src/cache/ftcmanag.c, - src/smooth/ftgrays.c, src/base/ftobjc.s, src/sfobjs.c: - s/_Err_Bad_Argument/_Err_Invalid_Argument/. The former is for - errors in the bytecode interpreter only. - -2008-12-21 Werner Lemberg - - * src/base/ftpfr.c (FT_Get_PFR_Metrics): Protect against NULL - arguments. - Fix return value for non-PFR fonts. Both problems reported by Chi - Nguyen . - -2008-12-21 anonymous - - FT_USE_MODULE declares things as: - - extern const FT_Module_Class - - (or similar for C++). However, the actual types of the variables - being declared are often different, e.g., FT_Driver_ClassRec or - FT_Renderer_Class. (Some are, indeed, FT_Module_Class.) - - This works with most C compilers (since those structs begin with an - FT_Module_Class struct), but technically it's undefined behavior. - - To quote the ISO/IEC 9899:TC2 final committee draft, section 6.2.7 - paragraph 2: - - All declarations that refer to the same object or function shall - have compatible type; otherwise, the behavior is undefined. - - (And they are not compatible types.) - - Most C compilers don't reject (or even detect!) code which has this - issue, but the GCC LTO development branch compiler does. (It - outputs the types of the objects while generating .o files, along - with a bunch of other information, then compares them when doing the - final link-time code generation pass.) - - Patch from Savannah bug #25133. - - * src/base/ftinit.c (FT_USE_MODULE): Include variable type. - - * builds/amiga/include/freetype/config/ftmodule.h, - include/freetype/config/ftmodule.h, */module.mk: Updated to declare - pass correct types to FT_USE_MODULE. - -2008-12-21 Hongbo Ni - - * src/autofit/aflatin.c (af_latin_hint_edges), - src/autofit/aflatin2.c (af_latin2_hint_edges), src/autofit/afcjk.c - (af_cjk_hint_edges): Protect against division by zero. This fixes - Savannah bug #25124. - -2008-12-18 Werner Lemberg - - * docs/CHANGES: Updated. - -2008-12-18 Bevan, David - - Provide API for accessing embedding and subsetting restriction - information. - - * include/freetype.h (FT_FSTYPE_INSTALLABLE_EMBEDDING, - FT_FSTYPE_RESTRICTED_LICENSE_EMBEDDING, - FT_FSTYPE_PREVIEW_AND_PRINT_EMBEDDING, FT_FSTYPE_EDITABLE_EMBEDDING, - FT_FSTYPE_NO_SUBSETTING, FT_FSTYPE_BITMAP_EMBEDDING_ONLY): New - macros. - (FT_Get_FSType_Flags): New function declaration. - - * src/base/ftobjs.c (FT_Get_FSType_Flags): New function. - - * src/cid/cidtoken.h, src/type1/t1tokens.h, src/type42/t42parse.c - (t42_keywords): Handle `FSType'. - - * include/freetype/t1tables.h (PS_FontInfoRec): Add `fs_type' field. - -2008-12-17 Werner Lemberg - - * src/base/ftsynth.c (FT_GlyphSlot_Embolden): Don't use internal - macros so that copying the source code into an application works - out of the box. - -2008-12-17 Werner Lemberg - - * include/freetype/ftsynth.h, src/base/ftsynth.c: Move - FT_GlyphSlot_Own_Bitmap to... - * include/freetype/ftbitmap.h, src/base/ftbitmap.c: These files. - - * docs/CHANGES: Document it. - -2008-12-10 Werner Lemberg - - Generalize the concept of `tricky' fonts by introducing - FT_FACE_FLAG_TRICKY to indicate that the font format's hinting - engine is necessary for correct rendering. - - At the same time, slightly modify the behaviour of tricky fonts: - FT_LOAD_NO_HINTING is now ignored. To really force raw loading - of tricky fonts (without hinting), both FT_LOAD_NO_HINTING and - FT_LOAD_NO_AUTOHINT must be used. - - Finally, tricky TrueType fonts always use the bytecode interpreter - even if the patented code is used. - - * include/freetype/freetype.h (FT_FACE_FLAG_TRICKY, FT_IS_TRICKY): - New macros. - - * src/truetype/ttdriver.c (Load_Glyph): Handle new load flags - semantics as described above. - - * src/truetype/ttobjs.c (tt_check_trickyness): New function, using - code of ... - (tt_face_init): This function, now simplified and updated to new - semantics. - - * src/base/ftobjs.c (FT_Load_Glyph): Don't use autohinter for tricky - fonts. - - * docs/CHANGES: Document it. - -2008-12-09 Werner Lemberg - - Really fix Savannah bug #25010: An SFNT font with neither outlines - nor bitmaps can be considered as containing space `glyphs' only. - - * src/truetype/ttpload.c (tt_face_load_loca): Handle the case where - a `glyf' table is missing. - - * src/truetype/ttgload.c (load_truetype_glyph): Abort if we have no - `glyf' table but a non-zero `loca' entry. - (tt_loader_init): Handle missing `glyf' table. - - * src/base/ftobjs.c (FT_Load_Glyph): Undo change 2008-12-05. - - * src/sfnt/sfobjs.c (sfnt_load_face): A font with neither outlines - nor bitmaps is scalable. - -2008-12-05 Werner Lemberg - - * src/autofit/aflatin.c (af_latin_uniranges): Add more ranges. This - fixes Savannah bug #21190 which also provides a basic patch. - -2008-12-05 Werner Lemberg - - * include/freetype/freetype.h (FT_LOAD_ADVANCE_ONLY): Use value - 0x100 instead of 0x10000; the latter value is already occupied by - FT_LOAD_TARGET_LIGHT. Bug reported by James Cloos. - - - Handle SFNT with neither outlines nor bitmaps. This fixes Savannah - bug #25010. - - * src/base/ftobjs.c (FT_Load_Glyph): Reject fonts with neither - outlines nor bitmaps. - - * src/sfnt/sfobjs.c (sfnt_load_face): Don't return an error if there - is no table with glyphs. - - - * src/sfnt/ttload.c (tt_face_lookup_table): Improve debugging - message. - -2008-12-01 Werner Lemberg - - GDEF tables need `glyph_count' too for validation. Problem reported - by Chi Nguyen . - - * src/otvalid/otvgdef.c (otv_GDEF_validate), src/otvalid/otvalid.h - (otv_GDEF_validate), src/otvalid/otvmod.c (otv_validate): Pass - `glyph_count'. - -2008-11-29 Werner Lemberg - - * src/autofit/afcjk.c, src/base/ftoutln.c, src/base/ftrfork.c, - src/bdf/bdfdrivr.c, src/gxvalid/gxvmorx.c, src/otvalid/otvmath.c, - src/pcf/pcfdrivr.c, src/psnames/pstables.h, src/smooth/ftgrays.c, - src/tools/glnames.py, src/truetype/ttinterp.c, src/type1/t1load.c, - src/type42/t42objs.c, src/winfonts/winfnt.c: Fix compiler warnings - (Atari PureC). - -2008-11-29 James Cloos - - * src/type/t1load.c (mm_axis_unmap): Revert previous patch and fix - it correctly by using FT_INT_TO_FIXED (FreeType expects 16.16 values - in the /BlendDesignMap space). - -2008-11-29 James Cloos - - * src/type1/t1load.c (mm_axis_unmap): `blend_points' is FT_Fixed*, - whereas `design_points' is FT_Long*. Therefore, return blend rather - than design points. - -2008-11-27 Werner Lemberg - - * src/cff/cffparse.c (cff_parse_real): Handle more than nine - significant digits correctly. This fixes Savannah bug #24953. - -2008-11-25 Daniel Zimmermann - - * src/base/ftstream.c (FT_Stream_ReadFields): Don't access stream - before the NULL check. From Savannah patch #6681. - -2008-11-24 Werner Lemberg - - Fixes from the gnuwin32 port. - - * src/base/ftlcdfil.c: s/EXPORT/EXPORT_DEF/. - - * src/base/ftotval.c: Include FT_OPENTYPE_VALIDATE_H. - - * src/psaux/psobjs.c (ps_table_add): Check `length'. - -2008-11-15 Werner Lemberg - - * src/truetype/ttinterp.c (tt_default_graphics_state): The default - value for `scan_type' is zero, as confirmed by Greg Hitchcock from - Microsoft. Problem reported by Michal Nowakowski - . - -2008-11-12 Tor Andersson - - * src/cff/cffdrivr.c (cff_get_cmap_info): Initialize `format' field. - This fixes Savannah bug #24819. - -2008-11-08 Werner Lemberg - - * src/sfnt/sfobjs.c (sfnt_load_face): Remove #if 0/#endif guards - since OpenType version 1.5 has been released. - - * include/ttnameid.h (TT_NAME_ID_WWS_FAMILY, - TT_NAME_ID_WWS_SUBFAMILY): New macros for OpenType 1.5. - (TT_URC_COPTIC, TT_URC_VAI, TT_URC_NKO, TT_URC_BALINESE, - TT_URC_PHAGSPA, TT_URC_NON_PLANE_0, TT_URC_PHOENICIAN, - TT_URC_TAI_LE, TT_URC_NEW_TAI_LUE, TT_URC_BUGINESE, - TT_URC_GLAGOLITIC, TT_URC_YIJING, TT_URC_SYLOTI_NAGRI, - TT_URC_LINEAR_B, TT_URC_ANCIENT_GREEK_NUMBERS, TT_URC_UGARITIC, - TT_URC_OLD_PERSIAN, TT_URC_SHAVIAN, TT_URC_OSMANYA, - TT_URC_CYPRIOT_SYLLABARY, TT_URC_KHAROSHTHI, TT_URC_TAI_XUAN_JING, - TT_URC_CUNEIFORM, TT_URC_COUNTING_ROD_NUMERALS, TT_URC_SUNDANESE, - TT_URC_LEPCHA, TT_URC_OL_CHIKI, TT_URC_SAURASHTRA, TT_URC_KAYAH_LI, - TT_URC_REJANG, TT_URC_CHAM, TT_URC_ANCIENT_SYMBOLS, - TT_URC_PHAISTOS_DISC, TT_URC_OLD_ANATOLIAN, TT_URC_GAME_TILES): New - macros for OpenType 1.5. - -2008-11-08 Wenlin Institute - - * src/base/ftobjs.c (ft_glyphslot_free_bitmap): Protect against - slot->internal == NULL. Reported by Graham Asher. - -2008-11-08 Werner Lemberg - - * src/sfnt/sfobjs.c (tt_face_get_name): Modified to return an error - code so that memory allocation problems can be distinguished from - missing table entries. Reported by Graham Asher. - (GET_NAME): New macro. - (sfnt_load_face): Use it. - -2008-11-05 Werner Lemberg - - * devel/ftoption.h, include/freetype/config/ftoption.h - [TT_CONFIG_OPTION_BYTECODE_INTERPRETER]: Undefine - TT_CONFIG_OPTION_UNPATENTED_HINTING. This fixes the return value of - `FT_Get_TrueType_Engine_Type' (and makes it work as documented). - Reported in bug #441638 of bugzilla.novell.com. - - * docs/CHANGES: Document it. - -2008-11-03 Werner Lemberg - - * src/type1/t1load.c (parse_subrs): Use an endless loop. There are - fonts (like HELVI.PFB version 003.001, used on OS/2) which define - some `subrs' elements more than once. Problem reported by Peter - Weilbacher . - -2008-10-15 Graham Asher - - * src/sfnt/ttpost.c (tt_post_default_names): Add `const'. - -2008-10-15 David Turner - - * src/truetype/ttgxvar.c (TT_Set_MM_Blend): Disambiguate for - meddlesome compilers' warning against `for ( ...; ...; ...) ;'. - -2008-10-14 Werner Lemberg - - * src/cff/cffobjs.c (cff_face_init): Remove compiler warning. - Suggested by Bram Tassyns in Savannah patch #6651. - -2008-10-12 Graham Asher - - * src/sfnt/sfobjs.c (sfnt_load_face): Fix computation of - `underline_position'. - -2008-10-12 Werner Lemberg - - * docs/CHANGES: Updated. - -2008-10-09 suzuki toshiya - - Fix Savannah bug #24468. - - According to include/freetype/internal/ftobjs.h, the appropriate - type to interchange single character codepoint is FT_UInt32. It - should be distinguished from FT_UInt which can be 16bit integer. - - * src/sfnt/ttcmap.c (tt_cmap4_char_map_linear): Change the type - of the second argument `pcharcode' from FT_UInt* to FT_UInt32*. - (tt_cmap4_char_map_binary): Ditto. - (tt_cmap14_get_nondef_chars): Change the type of return value - from FT_UInt* to FT_UInt32*. - -2008-10-08 John Tytgat - - Fix Savannah bug #24485. - - * src/type1/t1load.c (parse_charstrings): Assure that we always have - a .notdef glyph. - -2008-10-05 suzuki toshiya - - * src/base/ftmac.c: Include FT_TRUETYPE_TAGS_H for multi build. - * builds/mac/ftmac.c: Ditto. - -2008-10-05 suzuki toshiya - - * include/freetype/tttags.h (TTAG_TYP1, TTAG_typ1): Fix definitions. - * src/base/ftobjs.c: Include FT_TRUETYPE_TAGS_H. - -2008-10-05 suzuki toshiya - - * src/sfnt/sfobjs.c (sfnt_open_font): Allow `typ1' version tag in - the beginning of sfnt container. - * src/sfnt/ttload.c (check_table_dir): Return - `SFNT_Err_Table_Missing' when sfnt table directory structure is - correct but essential tables for TrueType fonts (`head', `bhed' or - `SING') are missing. Other errors are returned by - SFNT_Err_Unknown_File_Format. - - * src/base/ftobjs.c (FT_Open_Face): When TrueType driver returns - `FT_Err_Table_Missing', try `open_face_PS_from_sfnt_stream'. It is - enabled only when old mac font support is configured. - -2008-10-04 suzuki toshiya - - * include/freetype/tttags.h (TTAG_CID, TTAG_FOND, TTAG_LWFN, - TTAG_POST, TTAG_sfnt, TTAG_TYP1, TTAG_typ1): New tags to simplify - the repeated calculations of these values in ftobjs.c and ftmac.c. - * src/base/ftobjs.c: Replace all FT_MAKE_TAG by new tags. - * src/base/ftmac.c: Ditto. - * builds/mac/ftmac.c: Ditto. - -2008-10-04 suzuki toshiya - - * src/base/ftobjs.c (ft_lookup_PS_in_sfnt_stream): Remove wrong - initialization of *is_sfnt_cid. - -2008-10-04 Werner Lemberg - - * src/base/ftobjs.c (open_face_PS_from_sfnt_stream): Remove compiler - warnings. - -2008-10-04 suzuki toshiya - - * src/base/ftobjs.c (ft_lookup_PS_in_sfnt): Replaced by... - (ft_lookup_PS_in_sfnt_stream): This. - (open_face_PS_from_sfnt_stream): New function. It checks whether - the stream is sfnt-wrapped Type1 PS font or sfnt-wrapped CID-keyed - font, then try to open a face for given face_index. - (Mac_Read_sfnt_Resource): Replace the combination of - `ft_lookup_PS_in_sfnt' and `open_face_from_buffer' by - `open_face_PS_from_sfnt_stream'. - * src/base/ftmac.c (FT_New_Face_From_SFNT): Ditto. - * builds/mac/ftmac.c (FT_New_Face_From_SFNT): Ditto. - * src/base/ftbase.h: Remove `ft_lookup_PS_in_sfnt' and add - `open_face_PS_from_sfnt_stream'. - -2008-10-03 suzuki toshiya - - * src/base/ftobjs.c (ft_lookup_PS_in_sfnt): Set *is_sfnt_cid to - FALSE if neither `CID ' nor `TYP1' is found in the sfnt container. - -2008-10-03 suzuki toshiya - - * include/freetype/config/ftconfig.h: Define FT_MACINTOSH when SC or - MrC compiler of MPW is used. These compilers do not define the - macro __APPLE__ by themselves. - * builds/unix/ftconfig.in: Ditto. - * builds/vms/ftconfig.h: Ditto. - * src/base/ftbase.c: Use FT_MACINTOSH instead of __APPLE__, to - include ftmac.c if FreeType 2 is built by MPW. - * src/base/ftobjs.c: Use FT_MACINTOSH instead of __APPLE__, to - enable shared functions for ftmac.c if FreeType 2 is built by MPW. - - * builds/mac/ftmac.c: Include ftbase.h. - (memory_stream_close): Removed. - (new_memory_stream): Ditto. - (open_face_from_buffer): Removed. Use the implementation in - ftobjs.c. - (ft_lookup_PS_in_sfnt): Ditto. - - * builds/mac/FreeType.m68k_far.make.txt: Build ftmac.c as an - included part of ftbase.c, to share the functions in ftobjs.c. The - rule compiling ftmac.c separately is removed and the rule copying - ftbase.c from src/base/ftbase.c to builds/mac/ftbase.c is added. - * builds/mac/FreeType.m68k_cfm.make.txt: Ditto. - * builds/mac/FreeType.ppc_classic.make.txt: Ditto. - * builds/mac/FreeType.ppc_carbon.make.txt: Ditto. - -2008-10-02 Bram Tassyns - - * src/cff/cffgload.c (cff_slot_load): Map CID 0 to GID 0. This - fixes Savannah bug #24430. - -2008-10-02 Werner Lemberg - - * builds/freetype.mk (BASE_H): Rename to... - (INTERNAL_H): This. - (FREETYPE_H): Updated. - * src/base/rules.mk: (BASE_OBJ_S, OBJ_DIR/%.$O): Add BASE_H. - * src/bdf/rules.mk (BDF_DRV_H): Add bdferror.h. - * src/cache/rules.mk (CACHE_DRV_H): Add ftccache.h and ftcsbits.h. - * src/pcf/rules.mk (PCF_DRV_H): Add pcfread.h. - * src/raster/rules.mk (RASTER_DRV_H): Add ftmisc.h. - * src/type42/rules.mk (T42_DRV_H): Add t42types.h. - -2008-10-02 suzuki toshiya - - * src/base/ftbase.h: New file to declare the private utility - functions shared by the sources of base modules. Currently, - `ft_lookup_PS_in_sfnt' and `open_face_from_buffer' are declared to - share between ftobjs.c and ftmac.c. - - * src/base/rule.mk: Add ftbase.h. - - * src/base/ftobjs.c: Include ftbase.h. - (memory_stream_close): Build on any platform when old MacOS font - support is enabled. - (new_memory_stream): Ditto. - (open_face_from_buffer): Build on any platform when old MacOS font - support is enabled. The counting of the face in a font file is - slightly different between Carbon-dependent parser and Carbon-free - parser. They are merged with the platform-specific conditional. - (ft_lookup_PS_in_sfnt): Ditto. - - * src/base/ftmac.c: Include ftbase.h. - (memory_stream_close): Removed. - (new_memory_stream): Ditto. - (open_face_from_buffer): Removed. Use the implementation in - ftobjs.c. - (ft_lookup_PS_in_sfnt): Ditto. - -2008-10-02 Werner Lemberg - - * src/sfnt/sfobjs.c (sfnt_load_face): `psnames_error' is only needed - if TT_CONFIG_OPTION_POSTSCRIPT_NAMES is defined. - -2008-10-01 Werner Lemberg - - * src/truetype/ttobjs.c (tt_face_done), src/cff/cffobjs.c - (cff_face_done), src/pfr/pfrobjs.c (pfr_face_done), - src/pcf/pcfdrivr.c (PCF_Face_Done), src/cid/cidobjs.c - (cid_face_done), src/bdf/bdfdrivr. (BDF_Face_Done), - src/sfnt/sfobjs.c (sfnt_face_done): Protect against face == 0. - Reported by Graham Asher. - -2008-09-30 suzuki toshiya - - * src/base/rules.mk: Add conditional source to BASE_SRC, for `make - multi' on Mac OS X. If the macro $(ftmac_c) is defined, - $(BASE_DIR)/$(ftmac_c) is added to BASE_SRC. In a normal build, the - lack of ftmac.c in BASE_SRC is not serious because ftbase.c includes - ftmac.c. - * builds/unix/unix-def.in: Add a macro definition of $(ftmac_c). - * builds/unix/configure.raw: Add procedure to set up appropriate - value of $(ftmac_c) with the consideration of the availability of - Carbon framework. - -2008-09-30 suzuki toshiya - - * src/base/Jamfile: Add target for multi build by jam on Mac OS X. - * src/base/ftobjs.c (FT_New_Face): Fix the condition to include this - function for MPW building. It is synchronized the condition to - include ftmac.c source into ftbase.c. - -2008-09-22 Werner Lemberg - - * src/cff/cffgload.c (CFF_Operator, cff_argument_counts, - cff_decoder_parse_charstrings): Handle (invalid) - `callothersubr' and `pop' instructions. - -2008-09-22 John Tytgat - - Fix Savannah bug #24307. - - * include/freetype/internal/t1types.h (CID_FaceRec), - src/type42/t42types.h (T42_FaceRec): Comment out `afm_data'. - -2008-09-21 Werner Lemberg - - * src/smooth/ftgrays.c (gray_raster_render): Don't dereference - `target_map' if FT_RASTER_FLAG_DIRECT is set. Problem reported by - Stephan T. Lavavej . - -2008-09-21 suzuki toshiya - - * src/otvalid/Jamfile: Add missing target `otvmath' for multi build - by jam. - * src/sfnt/Jamfile: Add missing target `ttmtx' for multi build by - jam. - -2008-09-20 Werner Lemberg - - * src/smooth/ftgrays.c (gray_find_cell): Fix threshold. The values - passed to this function are already `normalized'. Problem reported - by Stephan T. Lavavej . - - * docs/CHANGES: Document it. - -2008-09-20 Werner Lemberg - - * src/base/ftoutln.c: Include FT_INTERNAL_DEBUG_H. - (FT_Outline_Decompose): Decorate with tracing messages. - - * src/smooth/ftgrays.c [DEBUG_GRAYS]: Replace with - FT_DEBUG_LEVEL_TRACE. - [_STANDALONE_ && FT_DEBUG_LEVEL_TRACE]: Include stdio.h and - stdarg.h. - - (FT_TRACE) [_STANDALONE_]: Remove. - (FT_Message) [_STANDALONE_ && FT_DEBUG_LEVEL_TRACE]: New function. - (FT_TRACE5, FT_TRACE7) [_STANDALONE_]: New macros. - (FT_ERROR) [_STANDALONE_]: Updated. - - (gray_hline) [FT_DEBUG_LEVEL_TRACE]: Fix condition. - Use FT_TRACE7. - (gray_dump_cells): Make it `static void'. - (gray_convert_glyph): Use FT_TRACE7. - - (FT_Outline_Decompose) [_STANDALONE_]: Synchronize with version in - ftoutln.c. - - * src/base/ftadvanc.c (FT_Get_Advance, FT_Get_Advances): Use - FT_ERROR_BASE. - - * docs/formats.txt: Updated. - -2008-09-19 suzuki toshiya - - * src/base/ftmac.c: Import sfnt-wrapped Type1 and sfnt-wrapped - CID-keyed font support. - * builds/mac/ftmac.c: Ditto. - -2008-09-19 suzuki toshiya - - * src/base/ftobjs.c (Mac_Read_sfnt_Resource): Fix double free bug in - sfnt-wrapped Type1 and sfnt-wrapped CID-keyed font support code. - `open_face_from_buffer' frees the passed buffer if it cannot open a - face from the buffer, so the caller must not free it. - -2008-09-19 suzuki toshiya - - * src/base/ftobjs.c (Mac_Read_sfnt_Resource): Add initial support - for sfnt-wrapped Type1 and sfnt-wrapped CID-keyed font. - (ft_lookup_PS_in_sfnt): New function to look up `TYP1' or `CID ' - table in sfnt table directory. It is used before loading TrueType - font driver. - - * docs/CHANGES: Add note about the current status of sfnt-wrapped - Type1 and sfnt-wrapped CID-keyed font support. - -2008-09-18 Werner Lemberg - - * src/base/ftsystem.c (FT_Done_Memory): Use ft_sfree directly for - orthogonality (ft_free and ft_sfree could belong to different memory - pools). This fixes Savannah bug #24297. - -2008-09-18 suzuki toshiya - - * src/cff/cffobjs.c (cff_face_init): Use TTAG_OTTO defined - in ttags.h instead of numerical value 0x4F54544FL. - -2008-09-16 Werner Lemberg - - * src/cff/cffgload.h, src/cff/cffgload.c - (cff_decoder_set_width_only): Eliminate function call. - -2008-09-15 George Williams - - Fix Savannah bug #24179, reported by Bram Tassyns. - - * src/type1/t1load.c (mm_axis_unmap, T1_Get_MM_Var): Fix computation - of default values. - -2008-09-15 Werner Lemberg - - * src/tools/glnames.py (main): Surround `ft_get_adobe_glyph_index' - and `ft_adobe_glyph_list' with FT_CONFIG_OPTION_ADOBE_GLYPH_LIST to - prevent unconditional definition. This fixes Savannah bug #24241. - - * src/psnames/pstables.h: Regenerated. - -2008-09-13 Werner Lemberg - - * autogen.sh, builds/unix/configure.raw, - include/freetype/config/ftconfig.h, builds/unix/ftconfig.in: Minor - beautifying. - - * include/freetype/ftadvanc.h, include/freetype/ftgasp.h, - include/freetype/ftlcdfil.h: Protect against FreeType 1. - Some other minor fixes. - - * devel/ftoption.h: Synchronize with - include/freetype/config/ftoption.h. - -2008-09-11 Werner Lemberg - - * src/base/ftbase.c: Include ftadvanc.c. - -2008-09-11 suzuki toshiya - - * builds/unix/ftconfig.in: Duplicate the cpp computation of - FT_SIZEOF_{INT|LONG} from include/freetype/config/ftconfig.h. - (FT_USE_AUTOCONF_SIZEOF_TYPES): New macro. If defined, the cpp - computation is disabled and the statically configured sizes are - used. This fixes Savannah bug #21250. - - * builds/unix/configure.raw: Add the checks to compare the cpp - computation results of the bit length of int and long versus the - sizes detected by running `configure'. If the results are - different, FT_USE_AUTOCONF_SIZEOF_TYPES is defined to prioritize the - results. - New option --{enable|disable}-biarch-config is added to define or - undefine FT_USE_AUTOCONF_SIZEOF_TYPES manually. - -2008-09-05 suzuki toshiya - - * builds/unix/configure.raw: Clear FT2_EXTRA_LIBS when Carbon or - ApplicationService framework is missing. Although this value is not - used in building of FreeType2, it is written in `freetype2.pc' and - `freetype-config'. - -2008-09-01 david turner - - * src/cache/ftccmap.c (FTC_CMapCache_Lookup): Accept a negative cmap - index to mean `use default cached FT_Face's charmap'. This fixes - Savannah bug #22625. - * include/freetype/ftcache.h: Document it. - - - Make FT_MulFix an inlined function. This is done to speed up - FreeType a little (on x86 3% when loading+hinting, 10% when - rendering, ARM savings are more important though). Disable this by - undefining FT_CONFIG_OPTION_INLINE_MULFIX. - - Use of assembler code can now be controlled with - FT_CONFIG_OPTION_NO_ASSEMBLER. - - * include/freetype/config/ftconfig.h, builds/unix/ftconfig.in - [!FT_CONFIG_OPTION_NO_ASSEMBLER] (FT_MulFix_arm): New assembler - implementation. - [!FT_CONFIG_OPTION_NO_ASSEMBLER] (FT_MulFix_i386): Assembler - implementation taken from `ftcalc.c'. - [!FT_CONFIG_OPTION_NO_ASSEMBLER] (FT_MULFIX_ASSEMBLER): New macro - which is defined to the platform-specific assembler implementation - of FT_MulFix. - [FT_CONFIG_OPTION_INLINE_MULFIX && FT_MULFIX_ASSEMBLER] - (FT_MULFIX_INLINED): New macro. - - * include/freetype/config/ftoption.h (FT_CONFIG_OPTION_NO_ASSEMBLER, - FT_CONFIG_OPTION_INLINE_MULFIX): New macros. - - * include/freetype/freetype.h: Updated to handle FT_MULFIX_INLINED. - - * src/base/ftcalc.c: Updated to use FT_MULFIX_ASSEMBLER and - FT_MULFIX_INLINED. - - - Add a new header named FT_ADVANCES_H declaring some new APIs to - extract the advances of one or more glyphs without necessarily - loading their outlines. Also provide `fast loaders' for the - TrueType, Type1, and CFF font drivers (more to come later). - - * src/base/ftadvanc.c, include/freetype/ftadvanc.h: New files. - - * include/freetype/config/ftheader.h (FT_ADVANCES_H): New macro. - * include/freetype/freetype.h (FT_LOAD_ADVANCE_ONLY): New macro. - - * include/freetype/internal/ftdriver.h (FT_Face_GetAdvancesFunc): - `flags' and `advances' are now of type `FT_UInt' and `FT_Fixed', - respectively. - - * src/base/Jamfile (_sources), src/base/rules.mk (BASE_SRC): Add - ftadvanc.c. - - * src/cff/cffdrivr.c (cff_get_advances): New function. - (cff_driver_class): Register it. - - * src/cff/cffgload.c (cff_decoder_set_width_only): New function. - (cff_decoder_parse_charstrings): Handle `width_only'. - (cff_slot_load): Handle FT_LOAD_ADVANCE_ONLY. - - * src/cff/cffgload.h (cff_decoder): New element `width_only'. - (cff_decoder_set_width_only): New declaration. - - * src/truetype/ttdriver.c (tt_get_advances): New function. - (tt_driver_class): Register it. - - * src/truetype/ttgload.c (Get_HMetrics, Get_VMetrics): Renamed to... - (TT_Get_HMetrics, TT_Get_VMetrics): This. - Update callers. - * src/truetype/ttgload.h: Declare them. - - * src/type1/t1gload.h, src/type1/t1gload.c (T1_Get_Advances): New - function. - * src/type1/t1driver.c (t1_driver_class): Register T1_Get_Advances. - - - Add checks for minimum version of the `autotools' stuff. - - * autogen.sh: Implement it. - (get_major_version, get_minor_version, get_patch_version, - compare_to_minimum_version, check_tool_version): New auxiliary - functions. - - * README.CVS: Document it. - -2008-08-29 suzuki toshiya - - * src/sfnt/sfobjs.c (sfnt_open_font): Use TTAG_OTTO defined in - ttags.h instead of FT_MAKE_TAG( 'O', 'T', 'T', 'O' ). - -2008-08-28 Werner Lemberg - - * src/type1/t1load.c (parse_encoding): Protect against infinite - loop. This fixes Savannah bug #24150 (where a patch has been posted - too). - -2008-08-23 Werner Lemberg - - * src/type/t1afm.c (compare_kern_pairs), src/pxaux/afmparse.c - (afm_compare_kern_pairs): Fix comparison. This fixes Savannah bug - #24119. - -2008-08-19 suzuki toshiya - - * src/base/ftobjs.c (FT_Stream_New): Initialize *astream always, - even if passed library or arguments are invalid. This fixes a bug - that an uninitialized stream is freed when an invalid library handle - is passed. Originally proposed by Mike Fabian, 2008/08/18 on - freetype-devel. - (FT_Open_Face): Ditto (stream). - (load_face_in_embedded_rfork): Ditto (stream2). - -2008-08-18 suzuki toshiya - - * src/base/ftmac.c: Add a fallback to guess the availability of the - `ResourceIndex' type. It is used when built without configure - (e.g., a build with Jam). - * builds/mac/ftmac.c: Ditto. - * builds/unix/configure.raw: Set HAVE_TYPE_RESOURCE_INDEX to 1 or 0 - explicitly, even if `ResourceIndex' is unavailable. - -2008-08-18 suzuki toshiya - - * builds/unix/configure.raw: In checking of Mac OS X features, - all-in-one header file `Carbon.h' is replaced by the minimum - header file `CoreServices.h', similar to current src/base/ftmac.c. - -2008-08-18 suzuki toshiya - - * src/sfnt/ttcmap.c (tt_cmap2_validate): Skip the validation of - sub-header when its code_count is 0. Many Japanese Dynalab fonts - include such an empty sub-header (code_count == 0, first_code == 0 - delta == 0, but offset != 0) as the second sub-header in SJIS cmap. - -2008-08-04 Werner Lemberg - - * src/type1/t1tokens.h: Handle `ForceBold' keyword. This fixes - Savannah bug #23995. - - * src/cid/cidload.c (parse_expansion_factor): New callback function. - (cid_field_records): Use it for `ExpansionFactor'. - * src/cod/cidtoken.h: Handle `ForceBold' keyword. - Don't handle `ExpansionFactor'. - -2008-08-04 Bram Tassyns - - * src/cff/cffparse.c (cff_parse_fixed_scaled): Fix thinko which - resulted in incorrect scaling. This fixes Savannah bug #23973. - -2008-08-04 Werner Lemberg - - Be more tolerant w.r.t. invalid entries in SFNT table directory. - - * src/sfnt/ttload.c (check_table_dir): Ignore invalid entries and - adjust table count. - Add more trace messages. - (tt_face_load_font_dir): Updated. - -2008-07-30 Werner Lemberg - - * src/cff/cffgload.c (cff_decoder_parse_charstrings): No longer - assume that the first argument on the stack is the bottom-most - element. Two reasons: - - o According to people from Adobe it is missing in the Type 2 - specification that pushing of additional, superfluous arguments - on the stack is prohibited. - - o Acroread in general handles fonts differently, namely by popping - the number of arguments needed for a particular operand (as a PS - interpreter would do). In case of buggy fonts this causes a - different interpretation which of the elements on the stack are - superfluous and which not. - - Since there are CFF subfonts (embedded in PDFs) which rely on - Acroread's behaviour, FreeType now does the same. - -2008-07-27 Werner Lemberg - - Add extra mappings for `Tcommaaccent' and `tcommaaccent'. This - fixes Savannah bug #23940. - - * src/psnames/psmodule.c (WGL_EXTRA_LIST_SIZE): Rename to... - (EXTRA_GLYPH_LIST_SIZE): This. - Increase by 2. - (ft_wgl_extra_unicodes): Rename to... - (ft_extra_glyph_unicodes): This. - Add two code values. - (ft_wgl_extra_glyph_names): Rename to... - (ft_extra_glyph_names): This. - Add two glyphs. - (ft_wgl_extra_glyph_name_offsets): Rename to... - (ft_extra_glyph_name_offsets): This. - Add two offsets. - - (ps_check_wgl_name, ps_check_wgl_unicode): Rename to... - (ps_check_extra_glyph_name, ps_check_extra_glyph_unicode): This. - Updated. - (ps_unicodes_init): Updated. - -2008-07-26 Werner Lemberg - - * src/cff/cffgload.c (cff_decoder_prepare, - cff_decoder_parse_charstrings): Improve debug output. - -2008-07-22 Martin McBride - - * src/sfnt/ttcmap.c (tt_cmap4_validate, tt_cmap4_char_map_linear, - tt_cmap4_char_map_binary): Handle fonts which treat the last segment - specially. According to the specification, such fonts would be - invalid but acroread accepts them. - -2008-07-16 Jon Foster - - * src/pfr/pfrdrivr.c (pfr_get_advance): Fix off-by-one error. - - * src/base/ftcalc.c (FT_MulFix): Fix portability issue. - - * src/sfnt/ttpost.c (MAC_NAME) [!FT_CONFIG_OPTION_POSTSCRIPT_NAMES]: - Fix compiler warning. - -2008-07-16 Werner Lemberg - - Handle CID-keyed fonts wrapped in an SFNT (with cmaps) correctly. - - * src/cff/cffload.c (cff_font_load): Pass `pure_cff'. - Invert sids table only if `pure_cff' is set. - * src/cff/cffload.h: Udpated. - - * src/cff/cffobjs.c (cff_face_init): Updated. - Set FT_FACE_FLAG_CID_KEYED only if pure_cff is set. - - * docs/CHANGES: Updated. - -2008-07-09 Werner Lemberg - - * src/truetype/ttpload.c (tt_face_load_loca): Handle buggy fonts - where num_locations < num_glyphs. Problem reported by Ding Li. - -2008-07-05 Werner Lemberg - - Since FreeType uses `$(value ...)', we now need GNU make 3.80 or - newer. This fixes Savannah bug #23648. - - * configure: zsh doesn't like ${1+"$@"}. - Update needed GNU make version. - * builds/toplevel.mk: Check for `$(eval ...)'. - * docs/INSTALL.GNU, docs/INSTALL.CROSS, docs/INSTALL.UNIX: Document - it. - -2008-07-04 Werner Lemberg - - * src/raster/ftraster.c (Draw_Sweep): If span is smaller than one - pixel, only check for dropouts if neither start nor end point lies - on a pixel center. This fixes Savannah bug #23762. - -2008-06-29 Werner Lemberg - - * Version 2.3.7 released. - ========================= - - - Tag sources with `VER-2-3-7'. - - * docs/CHANGES, docs/VERSION.DLL: Update documentation and bump - version number to 2.3.7. - - * README, Jamfile (RefDoc), builds/win32/visualc/index.html, - builds/win32/visualc/freetype.dsp, - builds/win32/visualc/freetype.vcproj, - builds/win32/visualce/index.html, - builds/win32/visualce/freetype.dsp, - builds/win32/visualce/freetype.vcproj: s/2.3.6/2.3.7/, s/236/237/. - - * include/freetype/freetype.h (FREETYPE_PATCH): Set to 7. - - * builds/unix/configure.raw (version_info): Set to 9:18:3. - - * docs/release: Updated. - -2008-06-28 Werner Lemberg - - * src/ftglyph.c (FT_Matrix_Multiply, FT_Matrix_Invert): Move to... - * src/ftcalc.c: Here. This fixes Savannah bug #23729. - -2008-06-27 Werner Lemberg - - * src/raster/ftraster.c (Vertical_Sweep_Drop, Horizontal_Sweep_Drop, - Horizontal_Gray_Sweep_Drop): Test for intersections which - degenerate to a single point can be ignored; this has been confirmed - by Greg Hitchcock from Microsoft. (This was commented out code.) - -2008-06-26 Werner Lemberg - - Improve navigation in API reference. - - * src/tools/docmaker/tohtml.py (html_header_3): Renamed to... - (html_header_6): This. - (html_header_3, html_header_3i, html_header_4, html_header_5, - html_header_5t): New strings. - (toc_footer_start, toc_footer_end): New strings. - (HtmlFormatter::html_header): Updated. - (HtmlFormatter::html_index_header, HtmlFormatter::html_toc_header): - New strings. - (HtmlFormatter::index_enter): Use `html_index_header'. - (HtmlFormatter::index_exit): Print `html_footer'. - (HtmlFormatter::toc_enter): Use `html_toc_header'. - (HtmlFormatter::toc_exit): Print proper footer. - - Convert ~ to non-breakable space. - - * src/tools/docmaker/tohtml.py (make_html_para): Implement it. - Update header files accordingly. - -2008-06-24 suzuki toshiya - - * builds/unix/configure.raw: Check type `ResourceIndex' explicitly - and define HAVE_TYPE_RESOURCE_INDEX if it is defined. Mac OS X 10.5 - bundles 10.4u SDK with MAC_OS_X_VERSION_10_5 macro but without - ResourceIndex type definition. The macro does not inform the type - availability. - * src/base/ftmac.c: More parentheses are inserted to clarify the - conditionals to disable legacy APIs in `10.5 and later' cases. If - HAVE_TYPE_RESOURCE_INDEX is not defined, ResourceIndex is defined. - -2008-06-24 Werner Lemberg - - * src/truetype/ttinterp.c (Ins_SCANTYPE): Don't check rendering - mode. - - * src/raster/ftraster.c (Render_Glyph, Render_Gray_Glyph, - Draw_Sweep): No-dropout mode is value 2, not value 0. - (Draw_Sweep): Really skip dropout handling for no-dropout mode. - -2008-06-24 Werner Lemberg - - * src/psaux/psobjs.c (t1_builder_close_contour): Don't add contour - if it consists of one point only. Based on a patch from Savannah - bug #23683 (from John Tytgat). - -2008-06-22 Werner Lemberg - - * src/truetype/ttgload.c (TT_Load_Glyph): Protect bytecode stuff - with IS_HINTED. - - * docs/CHANGES: Updated. - -2008-06-22 suzuki toshiya - - * builds/unix/configure.raw: If CFLAGS has `-isysroot XXX' option - but LDFLAGS does not, import it to LDFLAGS. The option is used to - specify non-default SDK on Mac OS X (e.g., universal binary SDK for - Mac OS X 10.4 on PowerPC platform). Although Apple TechNote 2137 - recommends to add the option only to CFLAGS, LDFLAGS should include - it because libfreetype.la is built with -no-undefined. This fixes a - bug reported by Ryan Schmidt in MacPorts, - http://trac.macports.org/ticket/15331. - -2008-06-21 Werner Lemberg - - Enable access to the various dropout rules of the B&W rasterizer. - Pass dropout rules from the TT bytecode interpreter to the - rasterizer. - - * include/freetype/ftimage.h (FT_OUTLINE_SMART_DROPOUTS, - FT_OUTLINE_EXCLUDE_STUBS): New flags for for FT_Outline. - - * src/raster/ftraster.c (Vertical_Sweep_Drop, Horizontal_Sweep_Drop, - Horizontal_Gray_Sweep_Drop): Use same mode numbers as given in the - OpenType specification. - Fix mode 4 computation. - (Render_Glyph, Render_Gray_Glyph): Handle new outline flags. - - * src/truetype/ttgload.c (TT_Load_Glyph) Convert scan conversion - mode to FT_OUTLINE_XXX flags. - - * src/truetype/ttinterp.c (Ins_SCANCTRL): Enable ppem check. - -2008-06-19 Werner Lemberg - - * src/cff/cffobjs.c (cff_face_init): Compute final - `dict->units_per_em' value before assigning it to - `cffface->units_per_EM'. Otherwise, CFFs without subfonts are - scaled incorrectly if the font matrix is non-standard. This fixes - Savannah bug #23630. - - * docs/CHANGES: Updated. - -2008-06-19 Werner Lemberg - - * src/type/t1objs.c (T1_Face_Init): Slightly improve algorithm fix - from 2008-06-19. - -2008-06-18 Werner Lemberg - - * src/type/t1objs.c (T1_Face_Init): Fix change from 2008-03-21. - Reported by Peter Weilbacher . - - * docs/CHANGES: Updated. - -2008-06-15 George Williams - - * src/otvalid/otvgpos.c (otv_MarkBasePos_validate): Set - `valid->extra2' to 1. This is undocumented in the OpenType 1.5 - specification. - -2008-06-15 Werner Lemberg - - * src/base/ftcalc.c (FT_MulFix) : Protect registers correctly - from clobbering. Patch from Savannah bug report #23556. - - * docs/CHANGES: Document it. - -2008-06-10 Werner Lemberg - - * autogen.sh: Add option `--install' to libtoolize. - -2008-06-10 Werner Lemberg - - * Version 2.3.6 released. - ========================= - - - Tag sources with `VER-2-3-6'. - - * docs/CHANGES, docs/VERSION.DLL: Update documentation and bump - version number to 2.3.6. - - * README, Jamfile (RefDoc), builds/win32/visualc/index.html, - builds/win32/visualc/freetype.dsp, - builds/win32/visualc/freetype.vcproj, - builds/win32/visualce/index.html, - builds/win32/visualce/freetype.dsp, - builds/win32/visualce/freetype.vcproj: s/2.3.5/2.3.6/, s/235/236/. - - * include/freetype/freetype.h (FREETYPE_PATCH): Set to 6. - - * builds/unix/configure.raw (version_info): Set to 9:17:3. - - - * include/freetype/internal/psaux.h (T1_BuilderRec): Remove `scale_x' - and `scale_y'. - * src/cff/cffgload.h (CFF_Builder): Remove `scale_x' and `scale_y'. - - - * src/cff/cffparse.c: Include FT_INTERNAL_DEBUG_H. - * src/cff/cffobjs.h: Include FT_INTERNAL_POSTSCRIPT_HINTS_H. - -2008-06-10 Werner Lemberg - - * src/base/ftobjs.c (open_face): Check `clazz->init_face' and - `clazz->done_face'. - -2008-06-09 VaDiM - - Support debugging on WinCE. From Savannah patch #6536; this fixes - bug #23497. - - * builds/win32/ftdebug.c (OutputDebugStringEx): New function/macro - as a replacement for OutputDebugStringA (which WinCE doesn't have). - Update all callers. - (ft_debug_init) [_WIN32_CE]: WinCE apparently doesn't have - environment variables. - -2008-06-09 Werner Lemberg - - * README.CVS: Updated. - - * builds/unix/configure.raw, builds/unix/freetype-config.in: Updated - for newer versions of autoconf and friends. - -2008-06-08 Werner Lemberg - - * src/type1/t1parse.h (T1_ParserRec): Make `base_len' and - `private_len' unsigned. - - * src/type1/t1parse.c (read_pfb_tag): Make `asize' unsigned and read - it as such. - (T1_New_Parser, T1_Get_Private_Dict): Make `size' unsigned. - - - * src/base/ftstream.c (FT_Stream_Skip): Reject negative values. - - - * src/type1/t1load.c (parse_blend_design_positions): Check `n_axis' - for sane value. - Fix typo. - - - * src/psaux/psobjs.c (ps_table_add): Check `idx' correctly. - - - * src/truetype/ttinterp (Ins_SHC): Use BOUNDS() to check - `last_point'. - - - * src/sfnt/ttload.c (tt_face_load_max_profile): Limit - `maxTwilightPoints'. - -2008-06-06 Werner Lemberg - - * src/truetype/ttinterp.c (Ins_IP): Handle case `org_dist == 0' - correctly. This fixes glyphs `t' and `h' of Arial Narrow at 12ppem. - -2008-06-03 Werner Lemberg - - * include/freetype/ftcache.h (FTC_FaceID): Change type back to - FT_Pointer. Reported by Ian Britten . - -2008-06-02 Werner Lemberg - - Emit header info for defined FreeType objects in reference. - - * src/tools/docmaker/content.py (re_header_macro): New regexp. - (ContentProcessor::__init__): Initialize new dictionary `headers'. - (DocBlock::__init__): Collect macro header definitions. - - * src/tools/docmaker/tohtml.py (header_location_header, - header_location_footer): New strings. - (HtmlFormatter::__init__): Pass `headers' dictionary. - (HtmlFormatter::print_html_field): Don't emit paragraph tags. - (HtmlFormatter::print_html_field_list): Emit empty paragraph. - (HtmlFormatter::block_enter): Emit header info. - -2008-06-01 Werner Lemberg - - * include/freetype/config/ftheader.h (FT_UNPATENTED_HINTING_H, - FT_INCREMENTAL_H): Added. - -2008-05-28 Werner Lemberg - - * src/tools/docmaker/sources.py (SourceBlock::__init__): While - looking for markup tags, return immediately as soon a single one is - found. - -2008-05-28 Werner Lemberg - - * src/truetype/ttinterp.c (Ins_MD): The MD instruction also uses - original, unscaled input values. Confirmed by Greg Hitchcock from - Microsoft. - -2008-05-27 Werner Lemberg - - * src/tools/docmaker/tohtml.py (block_footer_start, - block_footer_middle): Beautify output. - -2008-05-25 Werner Lemberg - - * src/raster/ftraster.c (fc_black_render): Return 0 when we are - trying to render into a zero-width/height bitmap, not an error code. - - * src/truetype/ttgload.c (load_truetype_glyph): Move initialization - of the graphics state for subglyphs to... - (TT_Hint_Glyph): This function. - Hinting instructions for a composite glyph apparently refer to the - just hinted subglyphs, not the unhinted, unscaled outline. This - seems to fix Savannah bugs #20973 and (at least partially) #23310. - -2008-05-20 suzuki toshiya - - * src/base/ftmac.c (FT_New_Face_From_Suitcase): Check if valid - `aface' is returned by FT_New_Face_From_FOND(). The patch was - proposed by an anonymous reporter of Savannah bug #23204. - -2008-05-18 Werner Lemberg - - * src/pshinter/pshalgo.c (ps_hints_apply): Reset scale values after - correction for pixel boundary. Without this patch, the effect can - be cumulative under certain circumstances, making glyphs taller and - taller after each call. This fixes Savannah bug #19976. - -2008-05-18 Werner Lemberg - - * src/base/ftdebug.c (FT_Message, FT_Panic): Send output to stderr. - This fixes Savannah bug #23280. - - * docs/CHANGES: Updated. - -2008-05-18 David Turner - - * src/psnames/psmodule.c (ft_wgl_extra_unicodes, - ft_wgl_extra_glyph_names, ft_wgl_extra_glyph_name_offsets, - ps_check_wgl_name, ps_check_wgl_unicode): Use `static' to make - declarations non-global. - - * src/type1/t1load.c: Add missing comment. - -2008-05-17 Sam Hocevar - - * src/truetype/ttgload.c (TT_Load_Simple_Glyph): Handle zero-contour - glyphs correctly. Patch from Savannah bug #23277. - -2008-05-16 Werner Lemberg - - * docs/CHANGES: Updated. - -2008-05-16 Sergey Tolstov - - Improve support for WGL4 encoded fonts. - - * src/psnames/psmodule.c (WGL_EXTRA_LIST_SIZE): New macro. - (ft_wgl_extra_unicodes, ft_wgl_extra_glyph_names, - ft_wgl_extra_glyph_name_offsets): New arrays. - (ps_check_wgl_name, ps_check_wgl_unicode): New functions. - (ps_unicodes_init): Use them to add additional Unicode mappings. - -2008-05-15 Werner Lemberg - - * src/psaux/t1decode.c (t1_decoder_parse_charstrings) - : `closepath' without a path is a no-op, not an error - (cf. the PS reference manual). - - Reported by Martin McBride. - -2008-05-15 Werner Lemberg - - * builds/toplevel.mk (CONFIG_GUESS, CONFIG_SUB): Updated. - -2008-05-15 Werner Lemberg - - * src/type1/t1load.c (parse_subrs): Accept fonts with a subrs array - which contains a single but empty entry. This is technically - invalid (since it must end with `return'), but... - - Reported by Martin McBride. - -2008-05-14 Werner Lemberg - - Finish fix of scaling bug of CID-keyed CFF subfonts. - - * include/freetype/internal/ftcalc.h, src/base/ftcalc.c - (FT_Matrix_Multiply_Scaled, FT_Vector_Transform_Scaled): New - functions. - - * src/cff/cffobjs.h (CFF_Internal): New struct. It is used to - provide global hinting data for both the top-font and all subfonts - (with proper scaling). - - * src/cff/cffobjs.c (cff_make_private_dict): New function, using - code from `cff_size_init'. - (cff_size_init, cff_size_done, cff_size_select, cff_size_request): - Use CFF_Internal and handle subfonts. - (cff_face_init): Handle top-dict and subfont matrices correctly; - apply some heuristic in case of unlikely matrix concatenation - results. This has been discussed with people from Adobe (thanks - goes mainly to David Lemon) who confirm that the CFF specs are fuzzy - and not correct. - - * src/cff/cffgload.h (cff_decoder_prepare): Add `size' argument. - - * src/cff/cffgload.c (cff_builder_init): Updated. - (cff_decoder_prepare): Handle hints globals for subfonts. - Update all callers. - (cff_slot_load): Handling scaling of subfonts properly. - - * src/cff/cffparse.c (cff_parse_fixed_dynamic): New function. - (cff_parse_font_matrix): Use it. - - * src/cff/cfftypes.h (CFF_FontDictRec): Make `units_per_em' - FT_ULong. - - * docs/CHANGES: Document it. - -2008-05-13 Werner Lemberg - - * src/winfonts/winfnt.c (fnt_face_get_dll_font, FNT_Face_Init): - Handle case `face_index < 0'. - * docs/CHANGES: Document it. - -2008-05-04 Werner Lemberg - - First steps to fix the scaling bug of CID-keyed CFF subfonts, - reported by Ding Li on 2008/03/28 on freetype-devel. - - * src/base/cff/cffparse.c (power_tens): New array. - (cff_parse_real): Rewritten to introduce a fourth parameter which - returns the `scaling' of the real number so that we have no - precision loss. This is not used yet. - Update all callers. - (cff_parse_fixed_thousand): Replace with... - (cff_parse_fixed_scaled): This function. Update all callers. - -2008-05-03 Werner Lemberg - - * src/base/ftobjs.c (FT_Load_Glyph): Call the auto-hinter without - transformation since it recursively calls FT_Load_Glyph. This fixes - Savannah bug #23143. - -2008-04-26 Werner Lemberg - - * include/freetype/internal/psaux.h (T1_BuilderRec): Mark `scale_x' - and `scale_y' as obsolete since they aren't used. - * src/psaux/psobjs.c (t1_builder_init): Updated. - - * src/cff/cffgload.h (CFF_Builder): Mark `scale_x' and `scale_y' as - obsolete since they aren't used. - * src/cff/cffgload.c (cff_builder_init): Updated. - -2008-04-14 Werner Lemberg - - * src/pcf/pcfdrivr.c (PCF_Face_Init): Protect call to - `FT_Stream_OpenLZW' with `FT_CONFIG_OPTION_USE_LZ'. From Savannah - bug #22909. - -2008-04-13 Werner Lemberg - - * src/psaux/psconv.c (PS_Conv_ToFixed): Increase precision if - integer part is zero. - -2008-04-01 Werner Lemberg - - Fix compilation with g++ 4.1 (with both `single' and `multi' - targets). - - * src/base/ftobjs.c (FT_Open_Face): Don't define a variable in block - which is crossed by a `goto'. - - * src/otvalid/otvalid.h (otv_MATH_validate): Add prototype. - -2008-03-31 Werner Lemberg - - Fix support for subsetted CID-keyed CFFs. - - * include/freetype/freetype.h (FT_FACE_FLAG_CID_KEYED, - FT_IS_CID_KEYED): New macros. - - * src/cff/cffobjs.c (cff_face_init): Set number of glyphs to the - maximum CID value in CID-keyed CFFs. - Handle FT_FACE_FLAG_CID_KEYED flag. - - * docs/CHANGES: Document it. - - - Fix CFF font matrix calculation and improve precision. - - * src/cff/cffparse.c (cff_parse_real): Increase precision if integer - part is zero. - (cff_parse_font_matrix): Simplify computation of `units_per_em'; - this prevents overflow also. - - - Support FT_Get_CID_Registry_Ordering_Supplement for PS CID fonts. - - * src/cid/cidriver.c: Include FT_SERVICE_CID_H. - (cid_get_ros): New function. - (cid_service_cid_info): New service structure. - (cid_services): Register it. - -2008-03-23 Werner Lemberg - - Adjustments for Visual C++ 8.0, as reported by Rainer Deyke. - - * builds/compiler/visualc.mk (CFLAGS): Remove /W5. - (ANSIFLAGS): Add _CRT_SECURE_NO_DEPRECATE. - -2008-03-21 Laurence Darby - - * src/type1/t1objs.c (T1_Face_Init): Use `/Weight'. Patch from - Savannah bug #22675. - -2008-03-13 Derek Clegg - - * src/truetype/ttgxvar.c (TT_Get_MM_Var): Fix named style loop. - Patch from Savannah bug #22541. - -2008-03-03 Masatoshi Kimura - - * src/sfnt/ttcmap.c (tt_cmap14_char_map_nondef_binary, - tt_cmap14_find_variant): Return correct value. - (tt_cmap14_variant_chars): Fix check for `di'. - -2008-02-29 Wermer Lemberg - - * docs/CHANGES: Updated. - -2008-02-29 Wolf - - Add build support for symbian platform. From Savannah bug #22440. - - * builds/symbian/*: New files. - -2008-02-21 suzuki toshiya - - * src/base/ftmac.c (parse_fond): Fix a bug of PostScript font name - synthesis. For any face of a specified FOND, always the name for - the first face was used. Except of a FOND that refers multiple - Type1 font files, wrong synthesized font names are not used at all, - so this is an invisible bug. A few limit checks are added too. - - * builds/mac/ftmac.c: Ditto. - -2008-02-21 suzuki toshiya - - * builds/unix/configure.raw: Split compiler option to link Carbon - frameworks to one option for CoreServices framework and another - option for ApplicationServices framework. The split options can be - managed by GNU libtool to avoid unrequired duplication when FreeType - is linked with other applications. Suggested by Daniel Macks, - Savannah bug #22366. - -2008-02-18 Victor Stinner - - * src/truetype/ttinterp.c (Ins_IUP): Check number of points. Fix - from Savannah bug #22356. - -2008-02-17 Jonathan Blow - - * src/autofit/afloader.c (af_loader_load_g, af_loader_load_glyph): - Check for valid callback pointers. - -2008-02-15 suzuki toshiya - - * src/base/ftmac.c (FT_New_Face_From_SFNT): Check the sfnt resource - handle by its value instead of ResError(), fix provided by Deron - Kazmaier. According to the Resource Manager Reference, - GetResource(), Get1Resource(), GetNamedResource(), - Get1NamedResource() and RGetResource() set noErr but return NULL - handle when they can not find the requested resource. These - functions never return undefined values, so it is sufficient to - check if the handle is not NULL. - - * builds/mac/ftmac.c (FT_New_Face_From_SFNT): Ditto. - -2008-02-14 suzuki toshiya - - * src/base/ftbase.c: is replaced by "ftmac.c" as other - inclusion styles. Now it always includes src/base/ftmac.c; - builds/mac/ftmac.c is never included in any configuration. - - * builds/unix/configure.raw: Print warning if configure is executed - with options to specify Carbon functionalities explicitly. - - * docs/INSTALL.MAC: Note that legacy builds/mac/ftmac.c is not - included automatically and manual replacement is required. - -2008-02-11 Werner Lemberg - - * builds/modules.mk (CLOSE_MODULE, REMOVE_MODULE), builds/detect.mk - (dos_setup), builds/freetype.mk (clean_project_dos, - distclean_project_dos): Don't use \ but $(SEP). Reported by Duncan - Murdoch. - -2008-01-18 Sylvain Pasche - - * src/base/ftlcdfil.c (_ft_lcd_filter_legacy): Updated comment to - mention intra-pixel algorithm. - - * include/freetype/freetype.h (FT_Render_Mode): Mention that - FT_Library_SetLcdFilter can be used to reduce fringes. - -2008-01-16 Werner Lemberg - - * src/raster/ftraster.c (ft_black_render): Check `outline' before - using it. Reported by Allan Yang. - -2008-01-12 Werner Lemberg - - * src/raster/ftraster.c (FT_CONFIG_OPTION_5_GRAY_LEVELS): Remove. - -2008-01-12 Allan Yang, Jian Hua - SH - - * src/raster/ftraster.c (ft_black_init) - [FT_RASTER_OPTION_ANTI_ALIASING]: Fix compilation. - -2008-01-10 Werner Lemberg - - * src/truetype/ttgload.c (load_truetype_glyph): Handle the case - where the number of contours in a simple glyph is zero (and which - does contain an entry in the `glyf' table). This fixes Savannah bug - #21990. - -2008-01-04 suzuki toshiya - - Formatting suggested by Sean McBride. - - * builds/mac/ftmac.c: Formatting (tab expanded). - * src/autofit/afindic.c: Ditto. - * src/base/ftcid.c: Ditto. - * src/base/ftmac.c: Ditto. - -2007-12-30 Werner Lemberg - - * src/smooth/ftgrays.c (gray_raster_render): Check `outline' - correctly. - -2007-12-21 suzuki toshiya - - Improvement of POSIX resource-fork accessor to load unsorted - references in a resource. In HelveLTMM (resource-fork PostScript - Type1 font bundled with Mac OS X since 10.3.x), the appearance order - of PFB chunks is not sorted; sorting the chunks by reference IDs is - required. - - * include/freetype/internal/ftrfork.h (FT_RFork_Ref): New structure - type to store a pair of reference ID and offset to the chunk. - - * src/base/ftrfork.c (ft_raccess_sort_ref_by_id): New function to - sort FT_RFork_Ref by their reference IDs. - - (FT_Raccess_Get_DataOffsets): Returns an array of offsets that is - sorted by reference ID. - -2007-12-14 Werner Lemberg - - * src/cff/cffparse.c (cff_parse_real): Don't apply `power_ten' - division too early; otherwise the most significant digit(s) of the - final result are lost as the value is truncated to an integer. This - fixes Savannah bug #21794 (where the patch has been posted too). - -2007-12-06 Fix <4d876b82@gmail.com> - - Pass options from one configure script to another as-is (not - expanded). This is needed for options like - --includedir='${prefix}/include'. - - * builds/unix/detect.mk, configure: Prevent argument expansion in - call to the (real) `configure' script. - -2007-12-06 Werner Lemberg - - * src/truetype/ttgload.c (load_truetype_glyph): Fix compilation if - TT_USE_BYTECODE_INTERPRETER isn't defined. - -2007-12-06 Werner Lemberg - - There exist CFFs which contain opcodes for the Type 1 operators - `hsbw' and `closepath' which are both invalid in Type 2 charstrings. - However, it doesn't harm to support them. - - * src/cff/cffgload.c (CFF_Operator): Add `cff_op_hsbw' and - `cff_op_closepath.' - (cff_argument_counts): Ditto. - - (cff_decoder_parse_charstrings): Handle Type 1 opcodes 9 (closepath) - and 13 (hsbw) which are invalid in Type 2 charstrings. - -2007-12-06 suzuki toshiya - - * src/base/ftrfork.c (raccess_guess_darwin_newvfs): New function to - support new pathname syntax `..namedfork/rsrc' to access a resource - fork on Mac OS X. The legacy syntax `/rsrc' does not work on - case-sensitive HFS+. - (raccess_guess_darwin_hfsplus): Fix a bug in the calculation of - buffer size to store a pathname. - * include/freetype/internal/ftrfork.h: Increment the number of - resource fork guessing rule. - -2007-12-06 suzuki toshiya - - * builds/unix/configure.raw: Improve the compile tests to search - Carbon functions. - * builds/mac/ftmac.c: Import fixes for Carbon incompatibilities - proposed by Sean McBride from src/base/ftmac.c (see 2007-11-16). - -2007-12-06 suzuki toshiya - - The documents and comments for Mac OS X are improved by Sean - McBride. - - * src/base/ftmac.c: Fix a comment. - * include/freetype/ftmac.h: Ditto. - * docs/INSTALL.MAC: Improve English and add comment on lowest - system version specified by MACOSX_DEPLOYMENT_TARGET. - -2007-12-04 Werner Lemberg - - * src/cff/cffload.c (cff_subfont_load): Don't use logical OR to - concatenate error codes. - * src/sfnt/ttsbit.c (Load_SBit_Range): Ditto. - -2007-12-04 Graham Asher - - * src/truetype/ttobjs.c (tt_face_init): Don't use logical OR to - concatenate error codes. - -2007-12-04 Sean McBride - - * src/pfr/pfrgload.c (pfr_glyph_load_compound): Remove compiler - warning. - -2007-11-20 suzuki toshiya - - Fix MacOS legacy font support by Masatake Yamato on Mac OS X. It is - not working since 2.3.5. In FT_Open_New(), if FT_New_Stream() - cannot mmap() the specified file and cannot seek to head of the - specified file, it returns NULL stream and FT_Open_New() returns the - error immediately. On MacOS, most legacy MacOS fonts fall into such - a scenario because their data forks are zero-sized and cannot be - sought. To proceed to guessing of resource fork fonts, the - functions for legacy MacOS font must properly handle the NULL stream - returned by FT_New_Stream(). - - * src/base/ftobjs.c (IsMacBinary): Return error - FT_Err_Invalid_Stream_Operation immediately when NULL stream is - passed. - (FT_Open_Face): Even when FT_New_Stream() returns an error, proceed - to fallback. Originally, legacy MacOS font is tested in the cases - of FT_Err_Invalid_Stream_Operation (occurs when data fork is empty) - or FT_Err_Unknown_File_Format (occurs when AppleSingle header or - .dfont header is combined). Now the case of - FT_Err_Cannot_Open_Stream is included. - - * src/base/ftrfork.c (FT_Raccess_Guess): When passed stream is NULL, - skip FT_Stream_Seek(), which seeks to the head of stream, and - proceed to unit testing of raccess_guess_XXX(). FT_Stream_Seek() - for a NULL stream causes a Bus error on Mac OS X. - (raccess_guess_apple_double): Return FT_Err_Cannot_Open_Stream - immediately if passed stream is NULL. - (raccess_guess_apple_single): Ditto. - -2007-11-16 suzuki toshiya - - Fix for Carbon incompatibilities since Mac OS X 10.5, - proposed by Sean McBride. - - * doc/INSTALL.MAC: Comment on MACOSX_DEPLOYMENT_TARGET. - - * include/freetype/ftmac.h: Deprecate FT_New_Face_From_FOND and - FT_GetFilePath_From_Mac_ATS_Name. Since Mac OS X 10.5, calling - Carbon functions from a forked process is classified as unsafe - by Apple. All Carbon-dependent functions should be deprecated. - - * src/base/ftmac.c: Use essential header files - and - instead of - all-in-one header file . - - Include and replace HFS_MAXPATHLEN by Apple - genuine macro PATH_MAX. - - Add fallback macro for kATSOptionFlagsUnRestrictedScope which - is not found in Mac OS X 10.0. - - Multi-character constants ('POST', 'sfnt' etc) are replaced by - 64bit constants calculated by FT_MAKE_TAG() macro. - - For the index in the segment of resource fork, new portable - type ResourceIndex is introduced for better compatibility. - This type is since Mac OS X 10.5, so it is defined as short - when built on older platforms. - - (FT_ATSFontGetFileReference): If build target is only the systems - 10.5 and newer, it calls Apple genuine ATSFontGetFileReference(). - - (FT_GetFile_From_Mac_ATS_Name): Return an error if system is 10.5 - and newer or 64bit platform, because legacy type FSSpec type is - removed completely. - - (FT_New_Face_From_FSSpec): Ditto. - -2007-11-01 Werner Lemberg - - * src/sfnt/sfobjs.c (sfnt_done_face): Check `sfnt' everywhere. This - fixes Savannah bug #21485. - -2007-10-29 Daniel Svoboda - - * src/winfonts/winfnt.c (FNT_Face_Init): Check first that the driver - can handle the font at all, then check `face_index'. Otherwise, the - driver might return the wrong error code. This fixes Savannah bug - #21468. - -2007-10-21 Werner Lemberg - - * src/sfnt/sfobjs.c (sfnt_load_face): Support bit 9 and prepare - support for bit 8 of the `fsSelection' field in the `OS/2' table. - MS is already using this; hopefully, this becomes part of OpenType - 1.5. - Prepare also support for `name' IDs 21 (WWS_FAMILY) and 22 - (WWS_SUBFAMILY). - -2007-10-20 Werner Lemberg - - * src/tools/docmaker/tohtml.py (html_header_2): Fix typo. - Add `td.left' element to CSS. - (toc_section_enter): Use it. - -2007-10-18 David Turner - - * include/freetype/freetype.h, src/base/ftobjs.c: Rename API - functions related to cmap type 14 support to the - `FT_Object_ActionName' scheme: - - FT_Get_Char_Variant_index -> FT_Face_GetCharVariantIndex - FT_Get_Char_Variant_IsDefault -> FT_Face_GetCharVariantIsDefault - FT_Get_Variant_Selectors -> FT_Face_GetVariantSelectors - FT_Get_Variants_Of_Char -> FT_Face_GetVariantsOfChar - FT_Get_Chars_Of_Variant -> FT_Face_GetCharsOfVariant - - Update documentation accordingly. - - * src/sfnt/ttcmap.c: Stronger cmap 14 validation. - Make the code a little more consistent with FreeType coding - conventions and modify the cmap14 functions that returned a newly - allocated array to use a persistent vector from the TT_CMap14 object - instead. - - (TT_CMap14Rec): Provide array and auxiliary data for result. - (tt_cmap14_done, tt_cmap14_ensure): New functions. - - (tt_cmap14_init, tt_cmap14_validate, tt_cmap14_char_map_def_binary, - tt_cmap14_char_map_nondef_binary, tt_cmap14_find_variant, - tt_cmap14_char_var_index, tt_cmap14_variants, - tt_cmap14_char_variants, tt_cmap14_def_char_count, - tt_cmap14_get_def_chars, tt_cmap14_get_nondef_chars, - tt_cmap14_variant_chars, tt_cmap14_class_rec): Updated and improved. - -2007-10-15 George Williams - - Add support for cmap type 14. - - * devel/ftoption.h, include/freetype/config/ftoption.h - (TT_CONFIG_CMAP_FORMAT_14): New macro. - - * include/freetype/internal/ftobjs.h (FT_CMap_CharVarIndexFunc, - FT_CMap_CharVarIsDefaultFunc, FT_CMap_VariantListFunc, - FT_CMap_CharVariantListFunc, FT_CMap_VariantCharListFunc): New - support function prototypes. - (FT_CMap_ClassRec): Add them. - Update all users. - - * include/freetype/ttnameid.h (TT_APPLE_ID_VARIANT_SELECTOR): New - macro. - - * include/freetype/freetype.h (FT_Get_Char_Variant_Index, - FT_Get_Char_Variant_IsDefault, FT_Get_Variant_Selectors, - FT_Get_Variants_Of_Char, FT_Get_Chars_Of_Variant): New API - functions. - - * src/base/ftobjs.c (find_variant_selector_charmap): New auxiliary - function. - (FT_Set_Charmap): Disallow cmaps of type 14. - (FT_Get_Char_Variant_Index, FT_Get_Char_Variant_IsDefault, - FT_Get_Variant_Selectors, FT_Get_Variants_Of_Char, - FT_Get_Chars_Of_Variant): New API functions. - - * src/sfnt/ttcmap.c (TT_PEEK_UINT24, TT_NEXT_UINT24): New macros. - - (TT_CMap14Rec, tt_cmap14_init, tt_cmap14_validate, - tt_cmap14_char_index, tt_cmap14_char_next, tt_cmap14_get_info, - tt_cmap14_char_map_def_binary, tt_cmap14_char_map_nondef_binary, - tt_cmap14_find_variant, tt_cmap14_char_var_index, - tt_cmap14_char_var_isdefault, tt_cmap14_variants, - tt_cmap14_char_variants, tt_cmap14_def_char_count, - tt_cmap14_get_def_chars, tt_cmap14_get_nondef_chars, - tt_cmap14_variant_chars, tt_cmap14_class_rec): New functions and - structures for cmap 14 support. - (tt_cmap_classes): Register tt_cmap14_class_rec. - (tt_face_build_cmaps): One more error message. - - * docs/CHANGES: Mention cmap 14 support. - -2007-10-01 Werner Lemberg - - * src/base/ftobjs.c (find_unicode_charmap): If search for a UCS-4 - charmap fails, do the loop again while searching a UCS-2 charmap. - This favours MS charmaps over Apple ones. - -2007-08-29 suzuki toshiya - - * src/base/ftmac.c: Introduction of abstract `short' data types, - ResFileRefNum and ResID. These types were introduced for Copland, - then backported to MPW. The variables exchanged with FileManager - QuickDraw frameworks are redefined by these data types. Patch was - proposed by Sean McBride. - * builds/mac/ftmac.c: Ditto. - -2007-08-18 Werner Lemberg - - * src/otvalid/otvcmmn.c (otv_x_y_ux_sy): Skip context glyphs. Found - by Imran Yousaf. Fixes Savannah bug #20773. - - (otv_Lookup_validate): Correct handling of LookupType. Found by - Imran Yousaf. Fixes Savannah bug #20782. - -2007-08-17 George Williams - - * src/otvalid/otvgsub.c (otv_SingleSubst_validate): Fix handling of - SingleSubstFormat1. - -2007-08-11 suzuki toshiya - - * builds/unix/configure.raw: Fix a bug which sets CC_BUILD by - ${build-gcc} (unchecked) instead of by ${build}-gcc (checked). - Found by Ryan Hill. - -2007-08-11 George Williams - - * src/otvalid/otvcommn.c, src/otvalid/otvcommn.h - (otv_Coverage_validate): Add fourth argument to pass an expected - count value. Update all users. - Check glyph IDs. - (otv_ClassDef_validate): Check `StartGlyph'. - - * src/otvalid/otvgsub.c (otv_SingleSubst_validate): More glyph ID - checks. - - * src/otvalid/otvmath.c (otv_MathConstants_validate): There are only - 56 constants. - (otv_GlyphAssembly_validate, otv_MathGlyphConstruction_validate): - Check glyph IDs. - -2007-08-08 Werner Lemberg - - * src/otvalid/otvbase.c, src/otvalid/otvcommn.c, - src/otvalid/otvgdef.c, src/otvalid/otvgpos.c, src/otvalid/otvgsub.c, - src/otvalid/otvjstf.c: s/FT_INVALID_DATA/FT_INVALID_FORMAT/ where - appropriate. Reported by George. - - * include/freetype/internal/fttrace.h: Define `trace_otvmath'. - - * src/otvalid/rules.mk (OTV_DRV_SRC): Add otvmath.c. - - * docs/CHANGES: Updated. - -2007-08-08 George Williams - - Add `MATH' validating support to otvalid module. - - * include/freetype/tttags.h (TTAG_MATH): New macro. - * include/freetype/ftotval.h (FT_VALIDATE_MATH): New macro. - (FT_VALIDATE_OT): Updated. - - * src/otvalid/otmath.c: New file. - - * src/otvalid/otvalid.c: Include otvmath.c. - * src/otvalid/otvmod.c (otv_validate): Handle `MATH' table. - -2007-08-04 Werner Lemberg - - * builds/unix/configure.raw: Add call to AC_LIBTOOL_WIN32_DLL. - Fixes Savannah bug #20686. - -2007-08-03 Werner Lemberg - - * src/psnames/psmodule.c: Fix usage of - FT_CONFIG_OPTION_POSTSCRIPT_NAMES macro. Reported by Graham Asher. - -2007-07-31 suzuki toshiya - - * src/base/ftmac.c (open_face_from_buffer): The argument - `driver_name' is typed as `const char*' to match with the - callers in FT_New_Face_From_LWFN and FT_New_Face_From_SFNT. - This is same with open_face_from_buffer in src/base/ftobjs.c. - Found and fixed by Sean McBride. - -2007-07-28 Werner Lemberg - - * src/raster/ftraster.c (count_table): Make it conditional. - * src/base/ftobjs.c (FT_New_Library): Check FT_RENDER_POOL_SIZE with - a preprocessor statement. - -2007-07-27 Werner Lemberg - - * src/base/ftoutln.c (FT_Outline_Translate): Check `outline' before - first usage. From Savannah patch #6115. - -2007-07-16 Werner Lemberg - - * docs/CHANGES: Updated. - -2007-07-16 Derek Clegg - - Add new service for getting the ROS from a CID font. - - * include/freetype/config/ftheader.h (FT_CID_H): New macro. - * include/freetype/ftcid.h: New file. - - * include/freetype/internal/ftserv.h (FT_SERVIVE_CID_H): New macro. - * include/freetype/internal/services/svcid.h: New file. - - * src/base/ftcid.c: New file. - - * src/cff/cffdrivr.c: Include FT_SERVICE_CID_H. - (cff_get_ros): New function. - (cff_service_cid_info): New service structure. - (cff_services): Register it. - - * src/cff/cffload.c (cff_font_done): Free registry and ordering. - - * src/cff/cfftypes.h (CFF_FontRec): Add `registry' and `ordering'. - - * modules.cfg (BASE_EXTENSIONS): Add ftcid.c. - -2007-07-11 Derek Clegg - - Add support for postscript name service to CFF driver. - - * src/cff/cffdrivr.c: Include FT_SERVICE_POSTSCRIPT_NAME_H. - (cff_get_ps_name): New function. - (cff_service_ps_name): New service structure. - (cff_services): Register it. - -2007-07-07 Werner Lemberg - - * src/base/ftglyph.c (FT_Glyph_Copy): Fix initialization of - `target'. Reported by Sean McBride. - -2007-07-06 Werner Lemberg - - * src/pfr/pfrcmap.c: Include pfrerror.h. - - * src/autofit/afindic.c: Add some external declarations to pacify - `make multi' compilation. - - * src/cid/cidgload.c (cid_load_glyph): Pacify compiler. - - * src/cff/cffdrivr.c (cff_ps_get_font_info), src/cff/cffobjs.c - (cff_strcpy), include/freetype/internal/ftmemory.h (FT_MEM_STRDUP), - src/autofit/aflatin.c (af_latin_hints_compute_edges), - src/autofit/afcjk.c (af_cjk_hints_compute_edges), src/sfnt/ttmtx.c - (tt_face_get_metrics), src/base/ftobjs.c (open_face) - [FT_CONFIG_OPTION_INCREMENTAL]: Fix compilation with C++ compiler. - - * docs/release: Mention test compilation targets. - -2007-07-04 Werner Lemberg - - * docs/PROBLEMS: Mention that some PS based fonts can't be - handled correctly by FreeType. - - * src/truetype/ttgload.c (load_truetype_glyph): Always allow a - recursion depth of 1. This was the maximum value in TrueType 1.0, - and some older fonts don't set this field correctly. - - * src/gxvalid/gxvmort1.c - (gxv_mort_subtable_type1_substTable_validate): Fix tracing message. - -2007-07-03 Werner Lemberg - - * src/autofit/aflatin.c (af_latin_metrics_init_blues): Initialize - `round' to pacify compiler. - -2007-07-02 Werner Lemberg - - - * Version 2.3.5 released. - ========================= - - - Tag sources with `VER-2-3-5'. - - * docs/CHANGES, docs/VERSION.DLL: Update documentation and bump - version number to 2.3.5. - - * README, Jamfile (RefDoc), builds/win32/visualc/index.html, - builds/win32/visualc/freetype.dsp, - builds/win32/visualc/freetype.vcproj, - builds/win32/visualce/index.html, - builds/win32/visualce/freetype.dsp, - builds/win32/visualce/freetype.vcproj: s/2.3.4/2.3.5/, s/234/235/. - - * include/freetype/freetype.h (FREETYPE_PATCH): Set to 5. - - * builds/unix/configure.raw (version_info): Set to 9:16:3. - -2007-07-01 David Turner - - * include/freetype/freetype.h, src/base/ftpatent.c - (FT_Face_SetUnpatentedHinting): New function to dynamically change - the setting after a face is created. - - * src/truetype/ttgload.c (TT_Load_Simple_Glyph): Fix a small bug - that created distortions in the bytecode interpreter results. - -2007-06-30 David Turner - - * src/truetype/ttinterp.c (Ins_IUP): Add missing variable - initialization. - - * src/autofit/aflatin.c (af_latin_metric_init_blues): Get rid of an - infinite loop in the case of degenerate fonts. - -2007-06-26 Rahul Bhalerao - - Add autofit module for Indic scripts. This currently just reuses - the CJK-specific functions. - - * include/freetype/config/ftoption.h (AF_CONFIG_OPTION_INDIC): New - macro. - * devel/ftoption.h: Synchronize with - include/freetype/config/ftoption.h. - - * src/autofit/afindic.c, src/autofit/afindic.h: New files. - - * src/autofit/afglobal.c, src/autofit/aftypes.h, - src/autofit/autofit.c: Updated. - - * src/autofit/Jamfile (_sources), * src/autofit/rules.mk - (AUTOF_DRV_SRC): Updated. - -2007-06-23 David Turner - - * src/truetype/ttgload.c (TT_Load_Simple): Fix change from - 2007-06-16 that prevented the TrueType module from loading most - glyphs. - -2007-06-20 Werner Lemberg - - * src/cff/cffgload.c (cff_slot_load): Fix logic of 2007-05-28 - change. - -2007-06-19 Werner Lemberg - - * src/type1/t1load.c (parse_encoding): Handle one more error. - -2007-06-19 Dmitry Timoshkov - - * src/winfonts/winfnt.c (fnt_face_get_dll_font): Return error - FNT_Err_Invalid_File_Format if file format was recognized but - the file doesn't contain any FNT(NE) or RT_FONT(PE) resources. - Add verbose debug logs to make it easier to debug failing load - attempts. - (FNT_Face_Init): A single FNT font can't contain more than 1 face, - so return an error if requested face index is > 0. - Do not do further attempt to load fonts if a previous attempt has - failed but returned error FNT_Err_Invalid_File_Format, i.e., the - file format has been recognized but no fonts found in the file. - -2007-07-19 suzuki toshiya - - * src/base/ftmac.c: Apply patches proposed by Sean McBride. - (FT_GetFile_From_Mac_Name): Insert FT_UNUSED macros to fix - the compiler warnings against unused arguments. - (FT_ATSFontGetFileReference): Ditto. - (FT_GetFile_From_Mac_ATS_Name): Ditto. - (FT_New_Face_From_FSSpec): Ditto. - (lookup_lwfn_by_fond): Fix wrong comment. - Replace `const StringPtr' by more appropriate type - `ConstStr255Param'. - FSRefMakePathPath always returns UTF8 POSIX pathname in - Mach-O, thus HFS pathname support is dropped. - (count_faces): Remove HLock and HUnlock which is not - required on Mac OS X anymore. - (FT_New_Face_From_SFNT): Ditto. - (FT_New_Face_From_FOND): Ditto. - * builds/mac/ftmac.c: Synchronize to src/base/ftmac.c, - except of HFS pathname support and HLock/HUnlock. - They are required on classic CFM environment. - -2007-06-18 Werner Lemberg - - * src/psaux/psobjs.c (ps_parser_skip_PS_token): Remove incorrect - assertion. - (ps_parser_to_bytes): Fix error message. - - * src/type42/t42objs.c (T42_Open_Face): Handle one more error. - * src/type42/t42parse.c (t42_parse_sfnts): s/alloc/allocated/. - Don't allow mixed binary and hex strings. - Handle string_size == 0 and string_buf == 0. - (t42_parse_encoding): Handle one more error. - -2007-06-18 Werner Lemberg - - * src/psaux/psobjs.c (ps_tofixedarray, ps_tocoordarray): Fix exit - logic. - (ps_parser_load_field) : Skip delimiters - correctly. - (ps_parser_load_field_table): Use `fields->array_max' instead of - T1_MAX_TABLE_ELEMENTS to limit the number of arguments. - - * src/cff/cffgload.c (cff_decoder_prepare): Fix change from - 2007-06-06. - -2007-06-17 Werner Lemberg - - * src/tools/ftrandom.c (font_size): New global variable. - (TestFace): Use it. - (main): Handle new option `--size' to set `font_size'. - (Usage): Updated. - - * src/winfonts/winfnt.c (fnt_face_get_dll_font): Exit in case of - invalid font. - (FNT_Load_Glyph): Protect against invalid bitmap width. - -2007-06-16 David Turner - - * src/smooth/ftgrays.c (gray_find_cell, gray_set_cell, gray_hline): - Prevent integer overflows when rendering very large outlines. - - * src/truetype/ttgload.c (TT_Load_Simple_Glyph): Check the - well-formedness of the contours array when loading a glyph. - - * src/truetype/ttinterp.c (TT_Load_Context): Initialize `zp0', `zp1', - and `zp2'. - (Ins_IP): Check argument ranges to reject bogus operations properly. - (IUP_WorkerRec): Add `max_points' member. - (_iup_worker_interpolate): Check argument ranges. - (Ins_IUP): Ignore empty outlines. - -2007-06-16 Dmitry Timoshkov - - * src/winfonts/winfnt.h: Add necessary structures for PE resource - parsing. - (WinPE32_HeaderRec): New structure. - (WinPE32_SectionRec): New structure. - (WinPE_RsrcDirRec): New structure. - (WinPE_RsrcDirEntryRec): New structure. - (WinPE_RsrcDataEntryRec): New structure. - (FNT_FontRec): Remove unused `size_shift' field. - - * src/winfonts/winfnt.c (fnt_face_get_dll_font): Add support for - loading bitmap .fon files in PE format. - -2007-06-15 Dmitry Timoshkov - - * builds/win32/ftdebug.c: Unify debug level handling with other - platforms. - -2007-06-14 Dmitry Timoshkov - - * builds/win32/ftdebug.c (FT_Message): Send debug output to the - console as well as to the debugger. - -2007-06-14 Werner Lemberg - - * src/autofit/aflatin.c (af_latin_uniranges): Expand structure to - cover all ranges which could possibly be handled by the aflatin - module (since the default fallback for unknown ranges is now the - afcjk module). It might be necessary to fine-tune this further by - splitting off modules for Greek, Cyrillic, or other blocks. - -2007-06-11 David Turner - - * src/autofit/aflatin.c (af_latin_hints_link_segments): Fix - incorrect segment linking computation. This was the root cause of - Savannah bug #19565. - - - * src/autofit/* [FT_OPTION_AUTOFIT2]: Some very experimental changes - to improve the Latin auto-hinter. Note that the new code is - disabled by default since it is not stabilized yet. - - * src/autofit/aflatin2.c, src/autofit/aflatin2.h: New files - (disabled currently). - - * src/autofit/afhints.c: Remove dead code. - (af_axis_hints_new_edge): Add argument to handle segment directions. - (af_edge_flags_to_string): New function. - (af_glyph_hints_dump_segments, af_glyph_hints_dump_edges): Handle - option flags. - (af_glyph_hints_reload): Add argument to handle inflections. - Simplify. - (af_direction_compute): Fine tuning. - (af_glyph_hints_align_edge_points): Fix logic. - (af_glyph_hints_align_strong_points): Do linear search for small - edge counts. - (af_glyph_hints_align_weak_points): Skip any touched neighbors. - (af_iup_shift): Handle zero `delta'. - - * src/autofit/afhints.h: Updated. - (AF_SORT_SEGMENTS): New macro (disabled). - (AF_AxisHintsRec) [AF_SORT_SEGMENTS]: New member `mid_segments'. - - * src/autofit/afglobal.c (af_face_globals_get_metrics): Add - argument to pass option flags for handling scripts. - * src/autofit/afglobal.h: Updated. - - * src/autofit/afcjk.c: Updated. - * src/autofit/aflatin.c: Updated. - (af_latin_metrics_scale_dim): Don't reduce scale by 2%. - - (af_latin_hints_compute_segments) [AF_HINT_METRICS]: Remove dead code. - (af_latin_hints_compute_edges) [AF_HINT_METRICS]: Remove dead code. - Don't set `edge->dir' - (af_latin_hint_edges): Add more logging. - - * src/autofit/afloader.c: Updated. - -2007-06-11 Werner Lemberg - - * docs/CHANGES: Document FT_Face_CheckTrueTypePatents. - -2007-06-10 David Turner - - * src/truetype/ttgload.c (TT_Load_Simple_Glyph): Slight speed-up to - the TrueType glyph loader. - - * include/freetype/config/ftoption.h: Clarify documentation - regarding unpatented hinting. - - - Add new `FT_Face_CheckTrueTypePatents' API. - - * include/freetype/freetype.h (FT_Face_CheckTrueTypePatents): New - declaration. - - * include/freetype/internal/services/svttglyf.h, - src/base/ftpatent.c: New files. - - * include/freetype/internal/ftserv.h (FT_SERVICE_TRUETYPE_GLYF_H): - New macro. - - * src/truetype/ttdriver.c: Include FT_SERVICE_TRUETYPE_GLYF_H and - `ttpload.h'. - (tt_service_truetype_glyf): New service structure. - (tt_services): Register it. - - * modules.cfg (BASE_EXTENSIONS), src/base/Jamfile (_sources): Add - `ftpatent.c'. - -2007-06-08 Werner Lemberg - - * src/sfnt/sfobjs.c (sfnt_load_face): Undo change from 2007-04-28. - Fonts without a cmap must be handled correctly by FreeType (anything - else would be a bug). - - - * src/psaux/t1decode.c (t1_decoder_parse_charstrings) - [FT_DEBUG_LEVEL_TRACE]: Improve tracing message. - -2007-06-07 Werner Lemberg - - * src/sfnt/ttsbit0.c (tt_sbit_decoder_init, - tt_sbit_decoder_load_image): Protect against integer overflows. - - - * src/pfr/pfrgload.c (pfr_glyph_load_simple): More bounding checks - for `x_control' and `y_control'. - -2007-06-06 Werner Lemberg - - * src/base/ftoutln.c (FT_Outline_Decompose): Check `last'. - - - * src/pfr/pfrcmap.c (pfr_cmap_init): Convert assertion into normal - FreeType error. - - - * src/winfonts/winfnt.c (fnt_face_get_dll_font): Do a rough check of - `font_count'. - - - * src/type1/t1load.c (parse_font_matrix): Check `temp_scale'. - - - * src/cff/cffgload.c (cff_decoder_prepare): Change return type to - `FT_Error'. - Check `fd_index'. - (cff_slot_load): Updated. - * src/cff/cffgload.h: Updated. - -2007-06-05 Werner Lemberg - - * src/pfr/pfrgload.c (pfr_glyph_done): Comment out unused code. - (pfr_glyph_load_simple): Convert assertion into normal FreeType - error. - Check `idx'. - (pfr_glyph_load_compound, pfr_glyph_curve_to, pfr_glyph_line_to): - Convert assertion into normal FreeType error. - - * src/pfr/pfrtypes.h (PFR_GlyphRec): Comment out unused code. - - - * src/winfonts/winfnt.c (FNT_Face_Init): Check `family_size'. - - - * src/psaux/psobjs.c (ps_tocoordarray, ps_tofixedarray): Return -1 - in case of parsing error. - (ps_parser_load_field): Updated. - - * src/type1/t1load.c (parse_font_matrix): Updated. - -2007-06-04 Werner Lemberg - - * src/cid/cidgload.c (cid_load_glyph): Check `fd_select'. - - * src/tools/ftrandom/Makefile: Depend on `libfreetype.a'. - -2007-06-03 Werner Lemberg - - * src/tools/ftrandom/*: Add the `ftrandom' test program written by - George Williams (with some modifications). - -2007-06-03 Werner Lemberg - - * src/base/ftobjs.c (destroy_charmaps), src/type1/t1objs.c - (T1_Face_Done), src/winfonts/winfnt.c (FNT_Face_Done): Check for - face == NULL. Suggested by Graham Asher. - -2007-06-03 Ismail Dönmez - - * src/base/ftobjs.c (FT_Request_Metrics): Fix compiler warning. - -2007-06-02 Werner Lemberg - - * include/freetype/fterrdef.h (FT_Err_Corrupted_Font_Header, - FT_Err_Corrupted_Font_Glyphs): New error codes for BDF files. - - * src/bdf/bdflib.c (bdf_load_font): Use them. - - * src/bdf/bdflib.c (_bdf_parse_start): Check `FONT' better. - -2007-06-01 Werner Lemberg - - * src/base/ftobjs.c (FT_Request_Metrics), src/cache/ftccmap.c - (FTC_CMapCache_Lookup): Remove unused code. - -2007-06-01 Sean McBride - - * src/truetype/ttinterp.c (Null_Vector, NULL_Vector): Removed, - unused. - -2007-06-01 Werner Lemberg - - * src/cid/cidparse.c (cid_parser_new): Don't continue second search - pass for `StartData' if an error has occurred. - Exit properly if no `StartData' has been seen at all. - - * builds/unix/ftsystem.c (FT_Stream_Open): Don't use ULONG_MAX but - LONG_MAX to avoid compiler warning. Suggested by Sean McBride. - -2007-05-30 Werner Lemberg - - * src/type1/t1load.c (parse_subrs, parse_charstrings): Protect - against too small binary data strings. - - * src/bdf/bdflib.c (_bdf_parse_glyphs): Check `STARTCHAR' better. - -2007-05-28 David Turner - - * src/cff/cffgload.c (cff_slot_load): Do not apply the identity - transformation. This significantly reduces the loading time of CFF - glyphs. - - * docs/CHANGES: Updated. - - * src/autofit/afglobal.c (AF_SCRIPT_LIST_DEFAULT): Change default - hinting script to CJK, since it works well with more scripts than - latin. Thanks to Rahul Bhalerao for pointing - this out! - -2007-05-25 Werner Lemberg - - * docs/CHANGES: Updated. - -2007-05-24 Werner Lemberg - - * src/truetype/ttobjs.h (tt_size_ready_bytecode): Move declaration - into TT_USE_BYTECODE_INTERPRETER preprocessor block. - -2007-05-24 Graham Asher - - * src/truetype/ttobjs.c (tt_size_ready_bytecode) - [!TT_USE_BYTECODE_INTERPRETER]: Removed. Unused. - -2007-05-22 David Turner - - * src/truetype/ttgload.c (load_truetype_glyph): Fix last change to - avoid crashes in case the bytecode interpreter is not used. - - - Avoid heap blowup with very large .Z font files. This fixes - Savannah bug #19910. - - * src/lzw/ftzopen.h (FT_LzwStateRec): Remove `in_cursor', - `in_limit', `pad', `pad_bits', and `in_buff' members. - Add `buf_tab', `buf_offset', `buf_size', `buf_clear', and - `buf_total' members. - - * src/lzw/ftzopen.c (ft_lzwstate_get_code): Rewritten. It now takes - only one argument. - (ft_lzwstate_refill, ft_lzwstate_reset, ft_lzwstate_io): Updated. - -2007-05-20 Ismail Dönmez - - * src/pshinter/pshrec.c (ps_mask_table_set_bits): Add `const'. - (ps_dimension_set_mask_bits): Remove `const'. - -2007-05-19 Werner Lemberg - - * src/sfnt/ttmtx.c (tt_face_get_metrics) - [!FT_CONFIG_OPTION_OLD_INTERNALS]: Another type-punning fix. - -2007-05-19 Derek Clegg - - Savannah patch #5929. - - * include/freetype/tttables.h, src/base/ftobjcs.c - (FT_Get_CMap_Format): New function. - - * include/freetype/internal/services/svttcmap.c (TT_CMapInfo): Add - `format' member. - * src/sfnt/ttcmap.c (tt_cmap{0,2,4,6,8,10,12}_get_info): Set - cmap_info->format. - -2007-05-19 Werner Lemberg - - * src/truetype/ttgload.c (load_truetype_glyph): Save graphics state - before handling subglyphs so that it can be reinitialized each time. - This fixes Savannah bug #19859. - -2007-05-16 Werner Lemberg - - * src/cache/ftccache.c (ftc_node_mru_link, ftc_node_mru_unlink), - src/cache/ftccache.h (FTC_CACHE_LOOKUP_CMP), src/cache/ftcglyph.h - (FTC_GCACHE_LOOKUP_CMP), src/pshinter/pshmod.c (ps_hinter_init), - src/sfnt/ttmtx.c (tt_face_load_hmtx, tt_face_load_hhea, - tt_face_get_metrics): Fix type-punning issues. - -2007-05-15 David Turner - - * include/freetype/config/ftstdlib.h, - include/freetype/internal/ftobjs.h: As suggested by Graham Asher, - ensure that ft_isalnum, ft_isdigit, etc., use hard-coded values - instead on relying on the locale-dependent functions provided by - . - -2007-05-15 Graham Asher - - * src/autofit/afcjk.c (af_cjk_hints_compute_edges): Remove unused - variable. - * src/autofit/afloader.c (af_loader_load_g): Ditto. - - * src/base/ftobjs.c (ft_validator_error): Use `ft_jmp_buf'. - (open_face_from_buffer): Initialize `stream'. - (FT_Request_Metrics): Remove unused variable. - Remove redundant `break' statements. - (FT_Get_Track_Kerning): Remove unused variable. - - * src/psaux/afmparse.c (afm_parse_track_kern, afm_parse_kern_pairs, - afm_parse_kern_data): Remove redundant - `break' statements. - (afm_parser_parse): Ditto. - Don't use uninitialized variables. - - * src/psnames/psmodule.c (VARIANT_BIT): Define as unsigned long. - Use `|' operator instead of `^' to set it. - Update all users. - - * src/sfnt/ttcmap.c (tt_face_build_cmaps): Use `ft_jmp_buf'. - * src/sfnt/ttkern.c (tt_face_load_kern): Remove unused variable. - - * src/truetype/ttgload.c (TT_Load_Simple_Glyph): Remove redundant - comparison. - (TT_Process_Simple_Glyph): Use FT_UInt for `n_points' and `i'. - (TT_Load_Glyph): Remove unused variable. - -2007-05-13 Derek Clegg - - * src/base/ftobjs.c (FT_New_Library): Only allocate rendering pool - if FT_RENDER_POOL_SIZE is > 0. From Savannah patch #5928. - -2007-05-11 David Turner - - * src/cache/ftbasic.c, include/freetype/ftcache.h - (FTC_ImageCache_LookupScaler, FTC_SBit_Cache_LookupScaler): Two new - functions that allow us to look up glyphs using an FTC_Scaler object - to specify the size, making it possible to use fractional pixel - sizes. - - * src/truetype/ttobjs.c (tt_size_ready_bytecode): Set - `size->cvt_ready'. Reported by Boris Letocha. - -2007-05-09 Graham Asher - - * src/truetype/ttinterp.c (Ins_IP), src/autofit/aflatin.c - (af_latin_metrics_scale_dim): Fix compiler warnings. - -2007-05-06 Werner Lemberg - - * builds/win32/visualce/freetype.sln: Removed, as requested by - Vincent. - -2007-05-04 Vincent RICHOMME - - * builds/win32/visualce/*: Add Visual C++ project files for Pocket - PC targets. - - * docs/CHANGES: Document them. - -2007-05-04 - - * builds/unix/ftsystem.c (FT_Stream_Open): Handle return value 0 of - mmap (which might happen on some RTOS). From Savannah patch #5909. - -2007-05-03 Werner Lemberg - - * src/base/ftobjs.c (FT_Set_Char_Size): Simplify code. - * include/freetype/freetype.h (FT_Set_Char_Size): Update - documentation. - -2007-04-28 Victor Stinner - - * src/sfnt/sfobjs.c (sfnt_load_face): Check error code after loading - `cmap'. - -2007-04-27 Werner Lemberg - - * src/truetype/ttgload.c (TT_Load_Simple_Glyph): Check for negative - number of points in contours. Problem reported by Victor Stinner - . - (TT_Process_Simple_Glyph): Synchronize variable types. - -2007-04-26 Werner Lemberg - - * src/base/ftglyph.c (FT_Glyph_Copy): Always set second argument to - zero in case of error. This fixes Savannah bug #19689. - -2007-04-25 Boris Letocha - - * src/truetype/ttobjs.c: Fix a typo that created a speed regression - in the TrueType bytecode loader. - -2007-04-10 Martin Horak - - * src/sfnt/sfobjs.c (sfnt_load_face) [FT_CONFIG_OPTION_INCREMENTAL]: - Ignore `hhea' table. This fixes Savannah bug #19261. - -2007-04-09 Werner Lemberg - - - * Version 2.3.4 released. - ========================= - - - Tag sources with `VER-2-3-4'. - - * docs/CHANGES, docs/VERSION.DLL: Update documentation and bump - version number to 2.3.4. - - * README, Jamfile (RefDoc), builds/win32/visualc/index.html, - builds/win32/visualc/freetype.dsp, - builds/win32/visualc/freetype.vcproj: s/2.3.3/2.3.4/, s/233/234/. + builds/wince/vc2008-ce/index.html: s/2.4.3/2.4.4/, s/243/244/. * include/freetype/freetype.h (FREETYPE_PATCH): Set to 4. - * builds/unix/configure.raw (version_info): Set to 9:15:3. + * builds/unix/configure.raw (version_info): Set to 12:2:6. -2007-04-09 Martin Horak +2010-11-28 Alexei Podtelezhnikov - * src/truetype/ttgload.c (load_truetype_glyph): Save and restore - memory stream to avoid a crash with the incremental memory - interface (Savannah bug #19260). + [ftsmooth]: Minor code simplification. -2007-04-06 David Turner + * src/smooth/ftgrays (gray_render_cubic): Do only one comparison + instead of two. - * src/base/ftbimap.c (ft_bitmap_assure_buffer): Fix buffer-overwrite bug - (Savannah bug #19536). +2010-11-26 Johnson Y. Yan -2007-04-04 Werner Lemberg + [truetype] Better multi-threading support. + * src/truetype/ttinterp.c (TT_Load_Context): Reset glyph zone + references. - * Version 2.3.3 released. +2010-11-23 John Tytgat + + * src/psaux/t1decode.c (t1_decoder_parse_charstring): Expand + start_point, check_points, add_point, add_point1, close_contour + macros. + Remove add_contour macro. + Return error code from t1_builder_start_point and + t1_builder_check_points when there was one (instead of returning 0). + +2010-11-22 suzuki toshiya + + [truetype] Identify the tricky fonts by cvt/fpgm/prep checksums. + Some Latin TrueType fonts are still expected to be unhinted. + Fix Savannah bug #31645. + + * src/truetype/ttobjs.c (tt_check_trickyness): Divided to... + (tt_check_trickyness_family): this checking family name, and + (tt_check_trickyness_sfnt_ids): this checking cvt/fpgm/prep. + (tt_get_sfnt_checksum): Function to retrieve the sfnt checksum + for specified subtable even if cleared by lazy PDF generators. + (tt_synth_sfnt_checksum): Function to calculate the checksum. + +2010-11-18 Werner Lemberg + + [truetype] Fix `loca' handling for inconsistent number of glyphs. + Reported by Johnson Y. Yan . + + * src/truetype/ttpload.c (tt_face_load_loca): While sanitizing, + handle case where `loca' is the last table in the font. + +2010-11-18 Werner Lemberg + + [sfnt] Ignore all errors while loading `OS/2' table. + Suggested by Johnson Y. Yan . + + * src/sfnt/sfobjs.c (sfnt_load_face): Do it. + +2010-11-18 Johnson Y. Yan + + [type1] Fix matrix normalization. + + * src/type1/t1load.c (parse_font_matrix): Handle sign of scaling + factor. + +2010-11-18 Werner Lemberg + + [type1] Improve guard against malformed data. + Based on a patch submitted by Johnson Y. Yan + + + * src/type1/t1load.c (read_binary_data): Check `size'. + +2010-11-17 Werner Lemberg + + [sfnt] While tracing, output table checksums also. + + * src/sfnt/ttload.c (tt_face_load_font_dir): Do it. + +2010-11-04 suzuki toshiya + + [UVS] Fix find_variant_selector_charmap(), Savannah bug #31545. + + Since 2010-07-04, find_variant_selector_charmap() returns + the first cmap subtable always under rogue-compatible + configuration, it causes NULL pointer dereference and + make UVS-related functions crashed. + + * src/base/ftobjs.c (Fix find_variant_selector_charmap): + Returns UVS cmap correctly. + +2010-11-01 Alexei Podtelezhnikov + + [ftsmooth] Improve rendering. + + * src/smooth/ftsmooth.c (gray_render_conic): Since version 2.4.3, + cubic deviations have been estimated _after_ UPSCALE, whereas + conic ones have been evaluated _before_ UPSCALE, which produces + inferior rendering results. Fix this. + Partially undo change from 2010-10-15 by using ONE_PIXEL/4; this has + been tested with demo images sent to the mailing list. See + + http://lists.gnu.org/archive/html/freetype-devel/2010-10/msg00055.html + + and later mails in this thread. + +2010-10-28 Werner Lemberg + + [ftraster] Minor fixes. + + Reported by Tom Bishop . + + * src/raster/ftraster.c (ULong): Remove unused typedef. + (TWorker): Remove unused variable `precision_mask'. + +2010-10-28 Werner Lemberg + + [ftraster] Fix rendering. + + Problem reported by Tom Bishop ; see + thread starting with + + http://lists.gnu.org/archive/html/freetype/2010-10/msg00049.html + + * src/raster/ftraster.c (Line_Up): Replace FMulDiv with SMulDiv + since the involved multiplication exceeds 32 bits. + +2010-10-25 suzuki toshiya + + Revert a change of `_idx' type in FTC_CACHE_LOOKUP_CMP(). + + * src/cache/ftccache.h (FTC_CACHE_LOOKUP_CMP): Revert + the type of `_idx' from FT_PtrDist (by previous change) + to original FT_UFast, to match with FT_CacheRec. + +2010-10-24 suzuki toshiya + + [cache] Change the hash types to FT_PtrDist. + + On LLP64 platforms (e.g. Win64), FT_ULong (32-bit) + variables are inappropriate to calculate hash values + from the memory address (64-bit). The hash variables + are extended from FT_ULong to FT_PtrDist and new + hashing macro functions are introduced. The hash + values on 16-bit memory platforms are changed, but + ILP32 and LP64 are not changed. The hash value in + the cache subsystem is not reverted to the memory + address, so using signed type FT_PtrDist is safe. + + * src/cache/ftccache.h (_FTC_FACE_ID_HASH): New hash + function to replace FTC_FACE_ID_HASH() for portability. + * src/cache/ftcmanag.h (FTC_SCALER_HASH): Replace + FTC_FACE_ID_HASH() by _FTC_FACE_ID_HASH(). + * src/cache/ftccmap.c (FTC_CMAP_HASH): Ditto. + + * src/cache/ftccache.h (FTC_NodeRec): The type of the + member `hash' is changed from FT_UInt32 to FT_PtrDist. + + * src/cache/ftccache.h (FTC_Cache_Lookup): The type of the + argument `hash' is changed from FT_UInt32 to FT_PtrDist. + (FTC_Cache_NewNode): Ditto. + * src/cache/ftccache.c (ftc_cache_add): Ditto. + (FTC_Cache_Lookup): Ditto. (FTC_Cache_NewNode): Ditto. + * src/cache/ftcglyph.h (FTC_GCache_Lookup): Ditto. + * src/cache/ftcglyph.c (FTC_GCache_Lookup): Ditto. + + * src/cache/ftcbasic.c (FTC_ImageCache_Lookup): The type + of the internal variable `hash' is changed to FT_PtrDist + from FT_UInt32. (FTC_ImageCache_LookupScaler): Ditto. + (FTC_SBitCache_Lookup): Ditto. + (FTC_SBitCache_LookupScaler): Ditto. + * src/cache/ftccmap.c (FTC_CMapCache_Lookup): Ditto. + * src/cache/ftccache.h (FTC_CACHE_LOOKUP_CMP): Ditto. + Also the type of the internal variable `_idx' is changed to + FT_PtrDist from FT_UFast for better pointer calculation. + +2010-10-24 suzuki toshiya + + [cache] Hide internal macros incompatible with LLP64. + + FT_POINTER_TO_ULONG(), FTC_FACE_ID_HASH() and + FTC_IMAGE_TYPE_HASH() are enclosed by + FT_CONFIG_OPTION_OLD_INTERNALS and hidden from + normal clients. + + For the history of these macros, see the investigation: + http://lists.gnu.org/archive/html/freetype/2010-10/msg00022.html + +2010-10-24 suzuki toshiya + + Change the type of FT_MEM_VAL() from FT_ULong to FT_PtrDist. + + On LLP64 platforms (e.g. Win64), unsigned long (32-bit) + cannot cover the memory address (64-bit). FT_MEM_VAL() is + used for hashing only and not dereferred, so using signed + type FT_PtrDist is safe. + + * src/base/ftdbgmem.c (FT_MEM_VAL): Change the type of the + return value from FT_ULong to FT_PtrDist. + (ft_mem_table_resize): The type of hash is changed to + FT_PtrDist. (ft_mem_table_get_nodep): Ditto. + +2010-10-24 suzuki toshiya + + Replace "%lx" for memory address by "%p", LLP64 platforms. + + On LLP64 platforms (e.g. Win64), long (32-bit) cannot cover + the memory address (64-bit). Also the casts from the pointer + type to long int should be removed to preserve the address + correctly. + + * src/raster/ftraster.c (New_Profile): Replace "%lx" by "%p". + (End_Profile) Ditto. + * src/truetype/ttinterp.c (Init_Context): Ditto. + +2010-10-15 Alexei Podtelezhnikov + + Fix thinko in spline flattening. + + FT_MAX_CURVE_DEVIATION is dependent on the value of ONE_PIXEL. + + * src/smooth/ftgrays.c (FT_MAX_CURVE_DEVIATION): Remove it and + replace it everywhere with ONE_PIXEL/8. + +2010-10-13 suzuki toshiya + + [raccess] Skip unrequired resource access rules by Darwin VFS. + + When a resource fork access rule by Darwin VFS could open the + resource fork but no font is found in it, the rest of rules + by Darwin VFS are skipped. It reduces the warnings of the + deprecated resource fork access method by recent Darwin kernel. + Fix MacPorts ticket #18859: + http://trac.macports.org/ticket/18859 + + * src/base/ftobjs.c (load_face_in_embedded_rfork): + When FT_Stream_New() returns FT_Err_Cannot_Open_Stream, it + means that the file is possible to be fopen()-ed but zero-sized. + Also there is a case that the resource fork is not zero-sized, + but no supported font exists in it. If a rule by Darwin VFS + falls into such cases, there is no need to try other Darwin VFS + rules anymore. Such cases are marked by vfs_rfork_has_no_font. + If it is TRUE, the Darwin VFS rules are skipped. + +2010-10-13 suzuki toshiya + + [raccess] Grouping resource access rules based on Darwin VFS. + + MacOS X/Darwin kernel supports a few tricky methods to access + a resource fork via ANSI C or POSIX interface. Current resource + fork accessor tries all possible methods to support all kernels. + But if a method could open a resource fork but no font is found, + there is no need to try other methods older than tested method. + To determine whether the rule index is for Darwin VFS, a local + function ftrfork.c::raccess_rule_by_darwin_vfs() is introduced. + To use this function in ftobjs.c etc but it should be inlined, + it is exposed by ftbase.h. + + * src/base/ftrfork.c (FT_RFork_Rule): New enum type to identify + the rules to access the resource fork. + (raccess_guess_rec): New structure to bind the rule function and + rule enum type. + (FT_Raccess_Guess): The list of the rule functions is replaced by + (raccess_guess_table): This. This is exposed to be used by other + intra module functions. + (raccess_rule_by_darwin_vfs): A function to return a boolean + if the rule specified by the rule index is based on Darwin VFS. + +2010-10-13 suzuki toshiya + + Prevent to open a FT_Stream for zero-sized file on non-Unix. + + builds/unix/ftsystem.c prevents to open an useless stream from + zero-sized file and returns FT_Err_Cannot_Open_Stream, but the + stream drivers for ANSI C, Amiga and VMS return useless streams. + For cross-platform consistency, all stream drivers should act + same. + + * src/base/ftsystem.c (FT_Stream_Open): If the size of the opened + file is zero, FT_Err_Cannot_Open_Stream is returned. + * builds/amiga/src/base/ftsystem.c (FT_Stream_Open): Ditto. + * src/vms/ftsystem.c (FT_Stream_Open): Ditto. + +2010-10-12 Werner Lemberg + + Fix Savannah bug #31310. + + * src/truetype/ttgxvar.c (ft_var_readpackedpoints): Protect against + invalid `runcnt' values. + +2010-10-08 Chris Liddell + + Fix Savannah bug #31275. + + * src/sfnt/ttpost.c: Include FT_INTERNAL_DEBUG_H. + +2010-10-06 Werner Lemberg + + [truetype] Improve error handling of `SHZ' bytecode instruction. + Problem reported by Chris Evans . + + * src/truetype/ttinterp.c (Ins_SHZ): Check `last_point'. + +2010-10-05 Werner Lemberg + + Fix Savannah bug #31253. + Patch submitted by an anonymous reporter. + + * configure: Use `awk' instead of `sed' to manipulate output of `ls + -id'. + +2010-10-03 Werner Lemberg + + * Version 2.4.3 released. ========================= - Tag sources with `VER-2-3-3'. + Tag sources with `VER-2-4-3'. - * docs/CHANGES: Mention CVE-2007-1351. + * docs/CHANGES: Updated. -2007-04-03 David Turner + * docs/VERSION.DLL: Update documentation and bump version number to + 2.4.3 - * src/base/ftobjs.c (FT_Set_Char_Size): As suggested by James Cloos, - if one of the resolution values is 0, treat it as if it were the - same as the other value. - -2007-04-02 David Turner - - Add special code to detect `extra-light' fonts and do not snap their - stem widths too much to avoid bizarre hinting effects. - - * src/autofit/aflatin.h (AF_LatinAxisRec): Add `standard_width' and - `extra_light' members. - - * src/autofit/aflatin.c (af_latin_metrics_init_widths): Initialize - them. - (af_latin_metrics_scale_dim): Set `extra_light'. - (af_latin_compute_stem_width): Use `extra_light'. - -2007-03-28 David Turner - - * src/base/ftbitmap.c (ft_bitmap_assure_buffer): Fix zero-ing of the - padding. - -2007-03-28 Werner Lemberg - - * src/bdf/bdflib.c (setsbit, sbitset): Handle values >= 128 - gracefully. - (_bdf_set_default_spacing): Increase `name' buffer size to 256 and - issue an error for longer names. This fixes CVE-2007-1351. - (_bdf_parse_glyphs): Limit allowed number of glyphs in font to the - number of code points in Unicode. - - * builds/win32/visualc/index.html, + * README, Jamfile (RefDoc), + builds/win32/vc2005/freetype.vcproj, builds/win32/vc2005/index.html, + builds/win32/vc2008/freetype.vcproj, builds/win32/vc2008/index.html, builds/win32/visualc/freetype.dsp, - builds/win32/visualc/freetype.vcproj, README: s/2.3.2/2.3.3/, - s/232/233/. - - * docs/CHANGES: Mention ftdiff. - -2007-03-26 David Turner - - * src/truetype/ttinterp.c [FIX_BYTECODE]: Remove it and - corresponding code. - (Ins_MD): Last regression fix. - - * src/autofit/aflatin.c (af_latin_metrics_init_blues): Fix blues - computations in order to ignore single-point contours. These are - never rasterized and correspond in certain fonts to mark-attach - points that are very far from the glyph's real outline, ruining the - computation. - - * src/autofit/afloader.c (af_loader_load_g): In the case of - monospaced fonts, always set `rsb_delta' and `lsb_delta' to 0. - Otherwise code that uses them will most certainly ruin the fixed - advance property. - - * docs/CHANGES, docs/VERSION.DLL, README, Jamfile (RefDoc): Update - documentation and bump version number to 2.3.3. + builds/win32/visualc/freetype.vcproj, + builds/win32/visualc/index.html, builds/win32/visualce/freetype.dsp, + builds/win32/visualce/freetype.vcproj, + builds/win32/visualce/index.html, + builds/wince/vc2005-ce/freetype.vcproj, + builds/wince/vc2005-ce/index.html, + builds/wince/vc2008-ce/freetype.vcproj, + builds/wince/vc2008-ce/index.html: s/2.4.2/2.4.3/, s/242/243/. * include/freetype/freetype.h (FREETYPE_PATCH): Set to 3. - * builds/unix/configure.raw (version_info): Set to 9:14:3. + * builds/unix/configure.raw (version_info): Set to 12:1:6. -2007-03-26 suzuki toshiya +2010-10-03 Werner Lemberg - * builds/unix/ftconfig.in: Disable Carbon framework dependency on - 64bit ABI on Mac OS X 10.4.x (ppc & i386). Found by Sean McBride. - * builds/vms/ftconfig.h: Ditto. - * include/freetype/config/ftconfig.h: Ditto. + Avoid `configure' issues with symbolic links. + Based on a patch from Alexander Stohr . -2007-03-22 suzuki toshiya + * configure: Compare directories using `ls -id'. + Check existence of `reference' subdirectory before creating it. - * builds/unix/ftsystem.c (FT_Stream_Open): Temporary fix to prevent - 32bit unsigned long overflow by 64bit filesize on LP64 platform, as - proposed by Sean McBride: - http://lists.gnu.org/archive/html/freetype-devel/2007-03/msg00032.html +2010-10-02 Werner Lemberg -2007-03-22 suzuki toshiya + Fix Savannah bug #31088 (sort of). - * builds/unix/ftconfig.in: Suppress SGI compiler's warning against - setjmp, proposed by Sean McBride: - http://lists.gnu.org/archive/html/freetype-devel/2007-03/msg00032.html + * src/sfnt/ttload.c (tt_face_load_maxp): Always allocate at least 64 + function entries. -2007-03-19 suzuki toshiya +2010-10-02 Werner Lemberg - * builds/unix/configure.raw: Dequote `OS_INLINE' in comment of - conftest.c, to avoid unexpected shell evaluation. Possibly it is a - bug or undocumented behaviour of autoconf. + [smooth] Fix splitting of cubics for negative values. -2007-03-18 David Turner + Reported by Róbert Márki ; see + http://lists.gnu.org/archive/html/freetype/2010-09/msg00019.html. - * src/truetype/ttinterp.c (Ins_MDRP): Another bytecode regression - fix; testing still needed. + * src/smooth/ftgrays.c (gray_render_cubic): Fix thinko. - * src/truetype/ttinterp.c (Ins_MD): Another bytecode regression fix. +2010-10-01 suzuki toshiya -2007-03-17 David Turner + Fix Savannah bug #31040. - * src/truetype/ttinterp.c (Ins_IP): Fix wrong handling of the - (undocumented) twilight zone special case. + * src/truetype/ttinterp.c (free_buffer_in_size): Remove. + (TT_RunIns): Updated. -2007-03-09 Werner Lemberg +2010-09-20 suzuki toshiya + [sfnt] Make error message filling NULL names less verbose. - * Version 2.3.2 released. + * src/sfnt/ttpost.c (load_format_20): Showing 1 summary message + when we fill `post' names by NULL, instead of per-entry message. + +2010-09-20 Graham Asher + David Bevan + + [smooth] Fix and improve spline flattening. + + This fixes the flattening of cubic, S-shaped curves and speeds up + the handling of both the conic and cubic arcs. + + See the discussions on the freetype-devel mailing list in late + August and September 2010 for details. + + * src/smooth/ftgrays.c (FT_MAX_CURVE_DEVIATION): New macro. + (TWorker): Remove `conic_level' and `cubic_level' elements. + (gray_render_conic): Simplify algorithm. + (gray_render_cubic): New algorithm; details are given in the code + comments. + (gray_convert_glyph): Remove heuristics. + +2010-09-19 Werner Lemberg + + Minor fixes. + + * src/cff/cffload.c (cff_charset_compute_cids): `charset->sids[i]' + is `FT_UShort'. + (cff_index_access_element): Don't use additions in comparison. + * src/sfnt/ttpost.c (load_format_20): Make `post_limit' of type + `FT_Long'. + Don't use additions in comparison. + Improve tracing messages. + (load_format_25, load_post_names): Make `post_limit' of type + `FT_Long'. + +2010-09-19 suzuki toshiya + + [cff] Truncate the element length at the end of the stream. + See Savannah bug #30975. + + * src/cff/cffload.c (cff_index_access_element): `off2', the offset + to the next element is truncated at the end of the stream to prevent + invalid I/O. As `off1', the offset to the requested element has + been checked by FT_STREAM_SEEK(), `off2' should be checked + similarly. + +2010-09-19 suzuki toshiya + + [cff] Ignore CID > 0xFFFFU. + See Savannah bug #30975. + + * src/cff/cffload.c (cff_charset_compute_cids): Ignore CID if + greater than 0xFFFFU. CFF font spec does not mention maximum CID in + the font, but PostScript and PDF spec define that maximum CID is + 0xFFFFU. + +2010-09-19 suzuki toshiya + + [cff] Make trace message in cff_charset_load() verbose. + See Savannah bug #30975. + + * src/cff/cffload.c (cff_charset_load): Report the original `nleft' + and truncated `nleft'. + +2010-09-19 suzuki toshiya + + [cff] Correct `max_cid' from CID array length to max CID. + See Savannah bug #30975. + + * src/cff/cffload.c (cff_charset_compute_cids): Don't increment + max_cid after detecting max CID. The array CFF_Charset->cids is + allocated by max_cid + 1. + (cff_charset_cid_to_gindex): Permit CID is less than or equal to + CFF_Charset->max_cid. + * src/cff/cffobjs.c (cff_face_init): FT_Face->num_glyphs is + calculated as CFF_Charset->max_cid + 1. + +2010-09-19 suzuki toshiya + + [truetype] Sanitize the broken offsets in `loca'. + See Savannah bug #31040. + + * src/truetype/ttpload.c (tt_face_get_location): If `pos1', the + offset to the requested entry in `glyf' exceeds the end of the + table, return offset=0, length=0. If `pos2', the offset to the next + entry in `glyf' exceeds the end of the table, truncate the entry + length at the end of `glyf' table. + +2010-09-19 suzuki toshiya + + [sfnt] Prevent overrunning in `post' table parser. + See Savannah bug #31040. + + * src/sfnt/ttpost.c (load_post_names): Get the length of `post' + table and pass the limit of `post' table to load_format_20() and + load_format_25(). + (load_format_20): Stop the parsing when we reached at the limit of + `post' table. If more glyph names are required, they are filled by + NULL names. + +2010-09-17 suzuki toshiya + + [truetype] Don't duplicate size->twilight structure to be freed. + See Savannah bug #31040 for detail. + + * src/truetype/ttinterp.c (free_buffer_in_size): Don't duplicate + FT_GlyphZoneRec size->twilight to be freed. If duplicated, + FT_FREE() erases the duplicated pointers only and leave original + pointers. They can cause the double-free crash when the burst + errors occur in TrueType interpreter and free_buffer_in_size() is + invoked repeatedly. + +2010-09-15 Werner Lemberg + + Make bytecode debugging with FontForge work again. + + * src/truetype/ttinterp.c (TT_RunIns): Don't call + `free_buffer_in_size' in case of error if a debugger is active. + +2010-09-14 Werner Lemberg + + Improve tracing messages. + + * src/truetype/ttinterp.c (TT_RunIns): Improve wording of tracing + message. + * src/truetype/ttobjs.c (tt_size_run_fpgm, tt_size_run_prep): Add + tracing message. + * src/truetype/ttgload.c (tt_loader_init): Add tracing message. + * src/cache/ftcsbits.c (ftc_snode_load): Emit tracing message if + glyph doesn't fit into a small bitmap container. + +2010-09-13 Werner Lemberg + + Fix minor issues reported by . + + * src/autofit/aflatin.c (af_latin_compute_stem_width): Remove + redundant conditional check. + * src/base/ftsynth.c (FT_GlyphSlot_Embolden): Ditto. + * src/cff/cffload.c (cff_encoding_load): Remove conditional check + which always evaluates to `true'. + * src/pshinter/pshalgo.c (ps_glyph_interpolate_strong_points): + Ditto. + * src/truetype/ttinterp.c (Ins_IUP): Ditto. + * src/cid/cidgload.c (cid_slot_load_glyph): Don't check for NULL if + value is already dereferenced. + * src/winfonts/winfnt.c (FNT_Load_Glyph): Fix check of `face'. + +2010-08-31 suzuki toshiya + + Ignore the environmental setting of LIBTOOL. + Patch is suggested by Adrian Bunk, to prevent unexpected + reflection of environmental LIBTOOL. See: + http://savannah.nongnu.org/patch/?7290 + + * builds/unix/unix-cc.in: LIBTOOL is unconditionally set to + $(FT_LIBTOOL_DIR)/libtool. FT_LIBTOOL_DIR is set to $(BUILD_DIR) + by default. + * configure: When configured for the building out of source tee, + FT_LIBTOOL_DIR is set to $(OBJ_DIR). + +2010-08-31 suzuki toshiya + + [truetype] Decrease the trace level catching the interpreter error. + + * src/truetype/ttinterp.c (TT_RunIns): Decrease the trace level + showing the error when the interpreter returns with an error, + from FT_TRACE7() to FT_TRACE1(). + +2010-08-30 suzuki toshiya + + [truetype] Prevent bytecode reuse after the interpretation error. + + * src/truetype/ttinterp.c (free_buffer_in_size): New function to + free the buffer allocated during the interpretation of this glyph. + (TT_RunIns): Unset FT_Face->size->{cvt_ready,bytecode_ready} if + an error occurs in the bytecode interpretation. The interpretation + of invalid bytecode may break the function definitions and referring + them in later interpretation is danger. By unsetting these flags, + `fpgm' and `prep' tables are executed again in next interpretation. + + This fixes Savannah bug #30798, reported by Robert Święcki. + +2010-08-29 Werner Lemberg + + [ftraster] Pacify compiler. + + * src/raster/ftraster.c (ft_black_new) [_STANDALONE_]: `memory' is + not used. + +2010-08-29 Werner Lemberg + + [cff] Allow SIDs >= 65000. + + * src/cff/cffload.c (cff_charset_load): Fix change from 2009-03-20: + The threshold for SIDs is not applicable here. I misinterpreted the + `SID values 65000 and above are available for implementation use' + sentence in the CFF specification. + + Problem reported by Ivan Ninčić . + +2010-08-28 suzuki toshiya + + Force hinting when the font lacks its familyname. + + In Type42 or Type11 font embedded in PostScript & PDF, TrueType sfnt + stream may lack `name' table because they are not required. Hinting + for nameless fonts is safer for PDFs including embedded Chinese + fonts. Written by David Bevan, see: + + http://lists.gnu.org/archive/html/freetype-devel/2010-08/msg00021.html + http://lists.freedesktop.org/archives/poppler/2010-August/006310.html + + * src/truetype/ttobjs.c (tt_check_trickyness): If a NULL pointer by + nameless font is given, TRUE is returned to enable hinting. + +2010-08-28 suzuki toshiya + + Register yet another tricky TrueType font. + + * src/truetype/ttobjs.c (tt_check_trickyness): Add `HuaTianKaiTi?', + a Kaishu typeface paired with `HuaTianSongTi?' by Huatian + Information Industry. + +2010-08-17 Teijo Kinnunen + + Fix Savannah bug #30788. + + * src/cache/ftccache.c (FTC_Cache_Clear): Check `cache->buckets' for + NULL too. + +2010-08-10 Werner Lemberg + + Try to fix Savannah bug #30717 (and probably #30719 too). + + * src/smooth/ftsmooth.c (ft_smooth_render_generic): Add another + overflow test for `width' and `height'. + +2010-08-06 Werner Lemberg + + * Version 2.4.2 released. ========================= - Tag sources with `VER-2-3-2'. + Tag sources with `VER-2-4-2'. - * builds/win32/visualc/index.html, + * docs/CHANGES: Updated. + + * docs/VERSION.DLL: Update documentation and bump version number to + 2.4.2 + + * README, Jamfile (RefDoc), + builds/win32/vc2005/freetype.vcproj, builds/win32/vc2005/index.html, + builds/win32/vc2008/freetype.vcproj, builds/win32/vc2008/index.html, builds/win32/visualc/freetype.dsp, - builds/win32/visualc/freetype.vcproj, README: s/2.3.1/2.3.2/, - s/231/232/. - -2007-03-08 David Turner - - * docs/CHANGES, docs/VERSION.DLL: Updated for upcoming release. - - * builds/unix/configure.raw (version_info): Set to 9:13:3. + builds/win32/visualc/freetype.vcproj, + builds/win32/visualc/index.html, builds/win32/visualce/freetype.dsp, + builds/win32/visualce/freetype.vcproj, + builds/win32/visualce/index.html, + builds/wince/vc2005-ce/freetype.vcproj, + builds/wince/vc2005-ce/index.html, + builds/wince/vc2008-ce/freetype.vcproj, + builds/wince/vc2008-ce/index.html: s/2.4.1/2.4.2/, s/241/242/. * include/freetype/freetype.h (FREETYPE_PATCH): Set to 2. - * README, Jamfile (RefDoc): s/2.3.1/2.3.2/. + * builds/unix/configure.raw (version_info): Set to 12:0:6. - * src/base/ftutil.c (ft_mem_strcpyn): Fix a bug that prevented the - function to work properly, over-writing user-provided buffers in - some cases. Reported by James Cloos . +2010-08-06 suzuki toshiya + Fix Savannah bug #30648. -2007-03-05 Werner Lemberg + * src/base/ftobjs.c (FT_Done_Library): Specify the order of font + drivers during the face closing process. Type42 faces should be + closed before TrueType faces, because a Type42 face refers to + another internal TrueType face which is created from sfnt[] array on + the memory. - * include/freetype/config/ftstdlib.h (ft_strstr): New wrapper - macro for `strstr'. +2010-08-06 Yuriy Kaminskiy - * src/truetype/ttobjs.c (tt_face_init): Use ft_strstr for scanning - `trick_names', as suggested by Ivan Nincic. + [raster] Fix valgrind warning. -2007-03-05 David Turner + * src/raster/ftraster.c (Decompose_Curve) : Access point[0] + only if we don't hit `limit'. - * src/base/ftinit.c (FT_Init_FreeType): Fix a small memory leak in - case FT_Init_FreeType fails for some reason. Problem reported by - Maximilian Schwerin . +2010-08-06 suzuki toshiya - * src/truetype/ttobs.c (tt_size_init_bytecode): Clear the `x_ppem' - and `y_ppem' fields of the `TT_Size.metrics' structure, not those of - `TT_Size.root.metrics'. Problem reported by Daniel Glöckner - . + Fix Savannah bug #30658. - * src/type1/t1afm.c (T1_Read_PFM): Read kerning values as 16-bit - signed values, not unsigned ones. Problem reported by Johannes - Walther . + * src/base/ftobjs.c (Mac_Read_POST_Resource): Check that the total + length of collected POST segments does not overrun the allocated + buffer. -2007-02-21 David Turner +2010-08-06 Yuriy Kaminskiy - * src/pshinter/pshalgo.c (psh_hint_align): Fix a bug in the hinting - of small and ghost stems in the Postscript interpreter. + Fix conditional usage of FT_MulFix_i386. + With -ansi flag, gcc does not define `i386', only `__i386__'. -2007-02-20 suzuki toshiya + * include/freetype/config/ftconfig.h, builds/unix/ftconfig.in: + s/i386/__i386__/. - * src/base/ftmac.c (FT_GetFileRef_From_Mac_ATS_Name): Fix memory - leak, patch by "Jjgod Jiang" . - * builds/mac/ftmac.c (FT_GetFileRef_From_Mac_ATS_Name): Ditto. +2010-08-05 Werner Lemberg -2007-02-16 Werner Lemberg + Fix Savannah bug #30657. - * src/truetype/ttinterp.c (Ins_MD): Remove unused variable. - * src/autofit/aflatin.c (af_latin_hints_link_segments): Ditto. + * src/truetype/ttinterp.c (BOUNDSL): New macro. + Change `BOUNDS' to `BOUNDSL' where appropriate. -2007-02-14 David Turner + * src/truetype/ttinterp.h (TT_ExecContextRec): Fix type of + `cvtSize'. - It seems that the following changes fix most of the known - interpreter problems with my fonts, but more testing is needed, - though. +2010-08-05 Werner Lemberg - * src/truetype/ttinterp.c (FIX_BYTECODE): Activate. - (TT_MulFix14): Rewrite. - (Ins_MD, Ins_MDRP, Ins_IP) [FIX_BYTECODE]: Improved and updated. - (Ins_MIRP): Ditto. + Fix Savannah bug #30656. -2007-02-12 Werner Lemberg + * src/type42/t42parse.c (t42_parse_sfnts): Protect against negative + string_size. + Fix comparison. - * src/truetype/ttinterp.c (Project_x, Project_y): Remove compiler - warnings. +2010-08-05 suzuki toshiya - * src/pcf/pcfread.c (pcf_interpret_style), src/bdf/bdfdrivr.c - (bdf_interpret_style): Ditto. + [cff] Don't use any values in decoder after parsing error. -2007-02-12 David Turner + * src/cff/cffgload.c (cff_slot_load): Skip the evaluations + of the values in decoder, if cff_decoder_parse_charstrings() + returns any error. - Simplify projection and dual-projection code interface. +2010-08-04 Werner Lemberg - * src/truetype/ttinterp.h (TT_Project_Func): Use `FT_Pos', not - FT_Vector' as argument type. - * src/truetype/ttinterp.c (CUR_Func_project, CUR_Func_dualproj): - Updated. - (CUR_fast_project, CUR_fast_dualproj): New macros. - (Project, Dual_Project, Project_x, Project_y): Updated. - (Ins_GC, Ins_SCFS, Ins_MDAP, Ins_MIAP, Ins_IP): Use new `fast' - macros. + Fix Savannah bug #30644. + * src/base/ftstream.c (FT_Stream_EnterFrame): Fix comparison. - * src/autofit/afloader.c (af_loader_load_g): Improve spacing - adjustments for the non-light auto-hinted modes. Gets rid of - `inter-letter spacing is too wide' problems. +2010-08-04 Werner Lemberg - * src/autofit/aflatin.c (af_latin_hints_link_segments, - af_latin_hints_compute_edges): Slight optimization of the segment - linker and better handling of serif segments to get rid of broken - `9' in Arial at 9pt (96dpi). - - - Introduce new string functions and the corresponding macros to get - rid of various uses of strcpy and other `evil' functions, as well as - to simplify a few things. - - * include/freetype/internal/ftmemory.h (ft_mem_strdup, ft_mem_dup, - ft_mem_strcpyn): New declarations. - (FT_MEM_STRDUP, FT_STRDUP, FT_MEM_DUP, FT_DUP, FT_STRCPYN): New - macros. - * src/base/ftutil.c (ft_mem_dup, ft_mem_strdup, ft_mem_strcpyn): New - functions. - - * src/bfd/bfddrivr.c (bdf_interpret_style, BDF_Face_Init), - src/bdf/bdflib.c (_bdf_add_property), src/pcf/pcfread.c - (pcf_get_properties, pcf_interpret_style, pcf_load_font), - src/cff/cffdrivr.c (cff_get_glyph_name), src/cff/cffload.c - (cff_index_get_sid_string), src/cff/cffobjs.c (cff_strcpy), - src/sfnt/sfdriver.c (sfnt_get_glyph_name), src/type1/t1driver.c - (t1_get_glyph_name), src/type42/t42drivr.c (t42_get_glyph_name, - t42_get_name_index): Use new functions and simplify code. - - * builds/mac/ftmac.c (FT_FSPathMakeSpec): Don't use FT_MIN. - -2007-02-11 Werner Lemberg - - * src/autofit/afloader.c (af_loader_load_g): Don't change width for - non-spacing glyphs. - -2007-02-07 Tom Parker - - * src/cff/cffdrivr.c (cff_get_name_index): Protect against NULL - pointer. - -2007-02-05 suzuki toshiya - - * include/freetype/ftmac.h (FT_DEPRECATED_ATTRIBUTE): - Introduce __attribute((deprecated))__ to warn functions - which use non-ANSI data types in its interfaces. - (FT_GetFile_From_Mac_Name): Deprecated, using FSSpec. - (FT_GetFile_From_Mac_ATS_Name): Deprecated, using FSSpec. - (FT_New_Face_From_FSSpec): Deprecated, using FSSpec. - (FT_New_Face_From_FSRef): Deprecated, using FSRef. - - * src/base/ftmac.c: Predefine FT_DEPRECATED_ATTRIBUTE as void - to avoid warning in building FreeType. - * builds/mac/ftmac.c: Ditto. - -2007-02-05 suzuki toshiya - - * src/base/ftbase.c: Fix to use builds/mac/ftmac.c, if configured - `--with-fsspec' etc. Replace #include "ftmac.c" with - #include . - -2007-02-05 suzuki toshiya - - * include/freetype/ftmac.h (FT_GetFilePath_From_Mac_ATS_Name): - Introduced as replacement of FT_GetFile_From_Mac_ATS_Name. - * src/base/ftmac.c (FT_GetFilePath_From_Mac_ATS_Name): Ditto. - (FT_GetFile_From_Mac_ATS_Name): Rewritten as wrapper of - FT_GetFilePath_From_Mac_ATS_Name. - * builds/mac/ftmac.c: Ditto. - -2007-02-05 suzuki toshiya - - * include/freetype/ftmac.h: Fixed wrong comment: FSSpec of - FT_GetFile_From_Mac_Name, FT_GetFile_From_Mac_ATS_Name are - for passing to FT_New_Face_From_FSSpec. - -2007-02-05 suzuki toshiya - - * builds/unix/configure.raw: Check whether Mac OS X system headers - can be built under ANSI C mode. - - * src/base/ftmac.c (OS_INLINE): Redefine OS_INLINE by a version - compatible to ANSI C in case system headers are ANSI C incompatible. - * builds/mac/ftmac.c (OS_INLINE): Ditto. - -2007-02-01 Werner Lemberg - - * include/freetype/ttnameid.h (TT_MS_LANGID_DZONGHKA_BHUTAN): - Explain why applications shouldn't use it. Found by Alexei. - -2007-02-01 Alexei Podtelezhnikov - - * builds/unix/freetype2.m4 (AC_CHECK_FT2): Fix spelling of warning - message. - - * src/gxvalid/gxvmort1.c - (gxv_mort_subtable_type1_substTable_validate): Fix debugging - message. - -2007-01-31 Werner Lemberg - - - * Version 2.3.1 released. - ========================= - - - Tag sources with `VER-2-3-1-FINAL'. - - * builds/win32/visualc/freetype.dsp, - builds/win32/visualc/freetype.vcproj: s/230/231/. - * builds/win32/visualc/index.html: s/221/231/. - - * vms_make.com: Add `ftgasp'. - -2007-01-30 David Turner - - Tag sources with VER-2-3-1 to prepare release. - - * include/freetype/freetype.h (FREETYPE_PATCH): Set to 1. - - * docs/VERSION.DLL, docs/release, README, Jamfile (RefDoc): - s/2.3.0/2.3.1/. - - * builds/unix/configure.raw (version_info): Set to 9:12:3. - - - * src/autofit/aftypes.h (AF_USE_WARPER), src/autofit/afloader.c - (af_loader_load_g): Disable the warper (i.e., the light hinting - improvements) to make a 2.3.1 bugfix release before introducing a - new feature. This should give us more time to tune and improve the - warper for the next release. - - * docs/CHANGES: Update accordingly. - -2007-01-25 David Turner - - For light auto-hinting, improve glyph advance widths and resurrect - normal/full hinting to its normal quality. - - * src/autofit/afhints.h (AF_GlyphHintsRec): New members `xmin_delta' - and `xmax_delta'. - * src/autofit/afhints.c (af_glyph_hints_reload): Reset `xmin_delta' - and `xmax_delta'. - - * src/autofit/afloader.c (af_loader_load_g) : Replace - preprocessor conditional with if-clause, handling both light and - normal mode. - - * src/autofit/afwarp.c (AF_WarpScore): Fine-tune again. - (af_warper_compute): Handle `xmin_delta' and `xmax_delta'. - -2007-01-25 Werner Lemberg - - * docs/release: Updated -- Savannah uses a new uploading scheme. - -2007-01-25 David Turner - - * src/cff/cffload.c (cff_index_get_pointers): Improve previous fix. - - * src/cff/cffgload.c (cff_decoder_parse_charstrings) - : Fix sanity check for empty - functions. - - * docs/CHANGES: Document light auto-hinting improvement. - -2007-01-25 Werner Lemberg - - * src/cff/cffload.c (cff_index_get_pointers): Handle last entry - correctly in a sanity check. Since this function is only used to - load local and global functions, any charstring that called the last - local/global function would fail otherwise. This fixes Savannah bug - #18867. - - * docs/CHANGES: Document it. - -2007-01-23 David Turner - - * src/truetype/ttobjs.c (tt_size_ready_bytecode): Fix typo that - prevented compilation when disabling both the unpatented and the - bytecode interpreter in the TrueType font driver. - - - Fix and enable the warper to improve `light' hinting mode. This is - not necessarily a final version, but it seems to work well. - - * src/autofit/aflatin.c (af_latin_hints_init) [AF_USE_WARPER]: - Disable code. - (af_latin_hints_apply) [AF_USE_WARPER]: Handle FT_RENDER_MODE_LIGHT. - * src/autofit/aftypes.h: Activate AF_USE_WARPER. - - * src/autofit/afwarp.c (AF_WarpScore): Tune table. - (af_warper_compute_line_best): Fix array size of `scores'. - (af_warper_compute): Better handling of border cases. - * src/autofit/afwarp.h (AF_WarperRec): Remove unused members `X1' - and `X2'. - -2007-01-21 Werner Lemberg - - * ChangeLog: Split off older entries into... - * ChangeLog.22: This new file. - -2007-01-21 Werner Lemberg - - * docs/CHANGES: Document SHZ fix. - -2007-01-21 George Williams - - * src/truetype/ttinterp.c (Ins_SHZ): SHZ doesn't move phantom - points. - -2007-01-21 Werner Lemberg - - * src/sfnt/ttmtx.c (tt_face_get_metrics) - [!FT_CONFIG_OPTION_OLD_INTERNALS]: Fix limit check. - -2007-01-17 Werner Lemberg - - - * Version 2.3.0 released. - ========================= - - - Tag sources with `VER-2-3-0-FINAL'. - -2007-01-17 Werner Lemberg - - * docs/release: Updated. - -2007-01-16 David Turner - - * src/autofit/aflatin.c (af_latin_hints_compute_segments), - src/cff/cffdriver.c (cff_ps_get_font_info), src/truetype/ttobjs.c - (tt_face_init), src/truetype/ttinterp.c (Ins_SHC): Fix compiler - warnings. - -2007-01-15 Detlef Würkner - - * builds/amiga/makefile, builds/amiga/makefile.os4, - builds/amiga/smakefile: Add `ftgasp.c' and `ftlcdfil.c'. - - * builds/amiga/include/freetype/config/ftconfig.h: Synchronize. - -2007-01-14 Detlef Würkner - - Fix various compiler warnings. - - * src/truetype/ttdriver.c (tt_size_select), src/cff/cffobjs.h, - src/cff/cffobjs.c (cff_size_request), src/type42/t42objs.h: - s/index/strike_index/. - * src/base/ftobjs.c (FT_Match_Size): s/index/size_index/. - - * src/gxvalid/gxvmorx5.c - (gxv_morx_subtable_type5_InsertList_validate): s/index/table_index/. - - * src/truetype/ttinterp.c (Compute_Point_Displacement), - src/pcf/pcfread.c (pcf_seek_to_table_type): Avoid possibly - uninitialized variables. - -2007-01-13 suzuki toshiya - - * docs/CHANGES, docs/INSTALL.MAC: Improvements. - -2007-01-13 Werner Lemberg - - * src/type1/t1afm.c (T1_Read_Metrics): MS Windows allows PFM - versions up to 0x3FF without complaining. - -2007-01-13 Derek Clegg - - Add FT_Get_PS_Font_Info interface to CFF driver. - - * src/cff/cfftypes.h: Include FT_TYPE1_TABLES_H. - (CFF_FontRec): Add `font_info' field. - - * src/cff/cffload.c: Include FT_TYPE1_TABLES_H. - (cff_font_done): Free font->font_info if necessary. - - * src/cff/cffdrvr.c (cff_ps_get_font_info): New function. - (cff_service_ps_info): Register cff_ps_get_font_info. - -2007-01-13 Werner Lemberg - - * src/base/ftoutln.c (FT_Outline_Get_Orientation): Fix compilation - with C++ compiler. - - * src/autofit/afhints.c (af_glyph_hints_dump_segments, - af_glyph_hints_dump_edges): Ditto. - - * src/base/rules.mk (BASE_SRC): Remove ftgasp.c (it's already in - `modules.cfg'). - - * src/sfnt/ttsbit0.h: Remove. - - * src/sfnt/rules.mk (SFNT_DRV_SRC): Don't include ttsbit0.c. - -2007-01-12 David Turner - - * src/base/ftbitmap.c (ft_bitmap_assure_buffer): Fix memory stomping - bug in the bitmap emboldener if the pitch of the source bitmap is - much larger than its width. - - * src/truetype/ttinterp.c (Update_Max): Fix aliasing-related - compilation warning. - -2007-01-12 Werner Lemberg - - * builds/unix/install-sh, builds/unix/mkinstalldirs: Updated from - `automake' CVS module from sources.redhat.com. - -2007-01-11 Werner Lemberg - - * src/type1/t1load.c (is_space): Removed. - (parse_encoding, parse_charstrings): Use IS_PS_DELIM. - (parse_charstrings): Use IS_PS_TOKEN. - - - * autogen.sh: Avoid bash specific syntax. - -2007-01-11 David Turner - - * docs/CHANGES: Small update. - - * builds/unix/configure.raw (version_info): Set to 9:11:3. - - * src/base/ftobjs.c (IsMacResource): Fix a small bug that caused a - crash with some Mac OS X .dfont files. Submitted by Masatake - Yamato. - - * autogen.sh: Small fix to get it working on Mac OS X properly: - The issue is that GNU libtool is called `glibtool' on this platform, - and we must call `glibtoolize', since `libtoolize' doesn't exist. - -2007-01-10 David Turner - - * all-sources: Tag all sources with VER-2-3-0-RC1 and - VER-2-3-0. - - * Jamfile (RefDoc), README, builds/win32/visualc/freetype.dsp, - builds/win32/visualc/freetype.vcproj, docs/VERSION.DLL: Update - version number to 2.3.0. - - * include/freetype/freetype.h (FREETYPE_MINOR): Set to 3. - (FREETYPE_PATCH): Set to 0. - - * include/freetype/ftchapters.h, include/freetype/ftgasp.h, - include/freetype/ftlcdfil.h: Update reference documentation with - GASP support and LCD filtering sections. - - * src/pshinter/pshalgo.c (psh_glyph_compute_inflections): Fix a typo - which created an endless loop with some malformed font files. - -2007-01-10 Derek Clegg - - * src/type1/t1load.c (T1_Get_MM_Var): Always return fixed point - values. - -2007-01-08 David Turner - - * docs/CHANGES: Updated. - - * include/freetype/ftgasp.h, src/base/ftgasp.c: New files which add - a new API `FT_Get_Gasp' to return entries of the `gasp' table - corresponding to a given character pixel size. - - * src/sfnt/ttload.c (tt_face_load_gasp): Add version check for the - `gasp' table, in order to avoid potential problems with later - versions. - - * include/freetype/config/ftheader.h (FT_GASP_H): New macro for - . - - * src/base/rules.mk (BASE_SRC), src/base/Jamfile (_sources), - modules.cfg (BASE_EXTENSIONS), builds/win32/visualc/freetype.dsp, - builds/win32/visualc/freetype.vcproj: Add src/base/ftgasp.c to the - default build. - -2007-01-07 Werner Lemberg - - * src/cid/cidparse.c (cid_parser_new): Improve error message for - Type 11 fonts. - Scan for `/sfnts' token. - -2007-01-07 Werner Lemberg - - * src/cid/cidparse.c (cid_parser_new): Reject Type 11 fonts. - -2007-01-06 Werner Lemberg - - * src/cff/cffload.c (cff_index_init): Remove unused variable. - (cff_index_read_offset): s/perror/errorp/ to avoid global shadowing. - -2007-01-04 David Turner - - * src/pfr/pfrobjs.c (pfr_face_init): Detect non-scalable fonts - correctly. This fixes Savannah bug #17876. - - - Do not allocate interpreter-specific tables in memory if we are not - going to load glyphs with the bytecode interpreter anyway. - - * src/truetype/ttgload.c (tt_loader_init): Load execution context - only if glyph is hinted. - Updated. - * src/truetype/ttobjs.h (TT_SizeRec): Add members `bytecode_ready' - and `cvs_ready'. - Add `tt_size_ready_bytecode' declaration. - * src/truetype/ttobjs.c (tt_size_done_bytecode, - tt_size_init_bytecode, tt_size_ready_bytecode): New functions. - (tt_size_init): Move most code into `tt_size_init_bytecode'. - (tt_size_done): Move most code into `tt_size_done_bytecode'. - (tt_size_reset): Move some code to `tt_size_ready_bytecode'. - - - Don't extract the metrics table from the SFNT font file. Instead, - reparse it on each glyph load. The runtime difference is not - noticeable, and it can save a lot of heap memory when memory-mapped - files are not used. - - * include/freetype/internal/tttypes.h (TT_FaceRec): Add members - `horz_metrics_offset' and `vert_metrics_ofset'. - * src/sfnt/ttmtx.c (tt_face_load_hmtx, tt_face_get_metrics): - Updated. - - - * src/sfnt/ttcmap.c (tt_cmap4_validate): Slight optimization. - - - Do not load the CFF index offsets into memory, since this wastes a - *lot* of heap memory with large Asian CFF fonts. There is no - significant performance loss. - - * src/cff/cffload.h: Add `cff_charset_cid_to_gindex' declaration. - * src/cff/cfftypes.h (CFF_IndexRec): Add fields `start' and - `data_size'. - (CFF_CharsetRec): Add field `num_glyphs'. - - * src/cff/cffload.c (cff_index_read_offset, cff_index_load_offsets, - cff_charset_cid_to_gindex): New functions. - (cff_new_index): Renamed to... - (cff_index_init): This. Update all callers. - Updated -- some code has been moved to `cff_index_load_offsets'. - (cff_done_index): Renamed to... - (cff_index_done): This. Update all callers. - (cff_index_get_pointers, cff_index_access_element): Updated to use - stream offsets. - (cff_charset_compute_cids): Set `num_glyphs' field. - (cff_encoding_load): Updated. - - * src/cff/cffgload.c (cff_slot_load): Updated. - -2007-01-04 David Turner - - * docs/INSTALL.UNIX: Simplify some parts, add reference to - autogen.sh and pointer to README.CVS. - - * README.CVS: Add common problem description and solution - when running autogen.sh. - - * docs/INSTALL: Add reference to MacOS X. - - * docs/MAKEPP, docs/INSTALL.MAC: New documentation files. - - * docs/TODO: Remove obsolete items. - - * src/raster/ftraster.c: (TRaster_Instance): Replace it with... - (TWorker): This. - Remove `count_table' and `memory'. - Make `grays' a pointer. - (TRaster): New structure. - (count_table): New static array. - (RAS_ARGS, RAS_ARG, RAS_VARS, RAS_VAR, FT_UNUSED_RASTER, cur_ras, - Vertical_Gray_Sweep_Step, ft_black_new, ft_black_done, - ft_black_set_mode, ft_black_render): Updated. - (ft_black_init): Don't initialize `count_table'. - (ft_black_reset): Use the render pool. This saves about 6KB of - heap space for each FT_Library instance. - - * src/smooth/ftgrays.c (TRaster): Replaced with... - (TWorker): This. - Remove `memory'. - (TRaster): New structure. - - (RAS_ARG_, RAS_ARG, RAS_VAR_, RAS_VAR, ras, gray_render_line, - gray_move_to, gray_line_to, gray_conic_to, gray_cubic_to, - gray_render_span, gray_raster_render): Updated. - (gray_raster_reset): Use the render pool. This saves about 6KB of - heap space for each FT_Library instance. - - * src/sfnt/sfobjs.c, src/sfnt/ttkern.c, src/sfnt/ttkern.h, - src/sfnt/ttmtx.c, src/sfnt/ttsbit.c, src/sfnt/ttsbit.h, - src/truetype/ttpload.c, include/freetype/config/ftoption.h: Remove - FT_OPTIMIZE_MEMORY macro (and code for !FT_OPTIMIZE_MEMORY) since - the optimization is no longer experimental. - - * src/pshinter/pshalgo.c (psh_glyph_interpolate_normal_points): - Remove a typo that results in no hinting and a memory leak with some - large Asian CFF fonts. - - * src/base/ftobjs.c (FT_Done_Library): Remove a subtle memory leak - which happens when FT_Done_Library is called with still opened - CFF_Faces in it. We need to close all faces before destroying the - modules, or else some bad things (memory leaks) may happen. - -2007-01-02 Werner Lemberg - - * src/gxvalid/gxvkern.c (gxv_kern_subtable_fmt0_pairs_validate): - Remove compiler warning. - -2007-01-02 David Turner - - * src/sfnt/sfobjs.c: Add documentation comment. - -2006-12-31 Masatake YAMATO - - * src/gxvalid/gxvkern.c (gxv_kern_subtable_fmt0_pairs_validate): New - function. - Check uniqueness of the gid pairs. - (gxv_kern_subtable_fmt0_validate): Move some code to - `gxv_kern_subtable_fmt0_pairs_validate'. - -2006-12-22 David Turner - - * src/autofit/aflatin.c, src/truetype/ttgload.c: Remove compiler - warnings. - - * builds/win32/visualc/freetype.vcproj: Add _CRT_SECURE_NO_DEPRECATE - to avoid deprecation warnings with Visual C++ 8. - -2006-12-16 Anders Kaseorg - - * src/base/ftlcdfil.c (FT_Library_SetLcdFilter) - [FT_FORCE_LIGHT_LCD_FILTER]: Fix typo. - -2006-12-15 suzuki toshiya - - * include/freetype/internal/services/svotval.h: Add `volatile' to - sync with the modification by Jens Claudius on 2006-08-22; cf. - http://cvs.savannah.gnu.org/viewcvs/freetype/freetype2/src/otvalid/otvmod.c?r1=1.4&r2=1.5 - -2006-12-15 suzuki toshiya - - * src/base/ftmac.c: Specialized for Mac OS X only. - * builds/unix/ftconfig.in: Fixed for ppc64 missing Carbon framework. - * builds/unix/configure.raw: Ditto. When explicit switches for - FSSpec/FSRef/QuickDraw/ATS availability are given to configure, - builds/mac/ftmac.c is used instead of default src/base/ftmac.c. - -2006-12-15 suzuki toshiya - - * builds/mac/ftmac.c: Copied src/base/ftmac.c for legacy system. - * builds/mac/FreeType.m68k_cfm.make.txt: Fix to use builds/mac/ftmac.c - instead of src/base/ftmac.c - * builds/mac/FreeType.ppc_carbon.make.txt: Ditto. - * builds/mac/FreeType.ppc_classic.make.txt: Ditto. - * builds/mac/FreeType.m68k_far.make.txt: Ditto, and exclude gxvalid.c - that cannot be built at present. - -2006-12-15 suzuki toshiya - - * src/base/ftobjs.c: Improvement of resource fork handler for - POSIX, cf. - http://lists.gnu.org/archive/html/freetype-devel/2006-10/msg00025.html - (Mac_Read_sfnt_Resource): Count only `sfnt' resource of suitcase font - format or .dfont, to simulate the face index number counted by ftmac.c. - (IsMacResource): Return the number of scalable faces correctly. - -2006-12-10 Werner Lemberg - - * builds/toplevel.mk (version): Protect against `distclean' target. - -2006-12-09 Werner Lemberg - - * builds/*/*def.mk, builds/*/detect.mk (CAT): Define to either `cat' - or `type'. - - * builds/freetype.mk (version): Extracted from freetype.h, using - GNU make's built-in string functions. - (refdoc): Use $(version) instead of static version number. - -2006-12-08 Werner Lemberg - - * builds/toplevel.mk (dist): Extract version number from freetype.h. - -2006-12-08 Vladimir Volovich - - * src/tools/apinames.c (State): Remove final comma in structure -- - xlc v5 under AIX 4.3 doesn't like this. - -2006-12-07 David Turner - - * src/autofit/afloader.c (af_loader_load_g): Small adjustment - to the spacing of auto-fitted glyphs. This only impacts rare - cases (e.g., Arial Bold at rather small character sizes). - -2006-12-03 Werner Lemberg - - * src/sfnt/rules.mk (SFNT_DRV_SRC): Add ttsbit0.c. - -2006-12-01 Werner Lemberg - - * src/sfnt/sfobjs.c (tt_face_get_name): All Unicode strings are - encoded in UTF-16BE. Patch from Rajeev Pahuja . - (tt_name_entry_ascii_from_ucs4): Removed. - - - * include/freetype/ftxf86.h: Fix and extend comment so that it - appears in the documentation. - - * include/freetype/ftchapters.h: Add `font_format' section. - - - * src/tools/docmaker/tohtml.py (HtmlFormatter::index_exit): Add link - to TOC in index page. - -2006-11-28 David Turner - - * src/smooth/ftgrays.c (gray_raster_render): Return 0 when we are - trying to render into a zero-width/height bitmap, not an error code. - - * src/truetype/ttobjs.c (tt_face_init): Fix typo in previous patch. - - * src/smooth/ftgrays.c: Remove hard-coded error values; use FreeType - ones instead. - - * src/autofit/afhints.c (af_glyph_hints_dump_segments): Remove unused - variable. - -2006-11-26 Pierre Hanser - - * src/truetype/ttobjs.c (tt_face_init): Protect against NULL pointer. - -2006-11-25 David Turner - - * src/autofit/afhints.c (af_glyph_hints_dump_points, - af_glyph_hints_dump_segments, af_glyph_hints_dumpedges) [!AF_DEBUG]: - Add stubs to link the `ftgrid' test program when debugging is - disabled in the auto-hinter. - -2006-11-23 David Turner - - * src/autofit/afhints.c, src/autofit/afhints.h, src/autofit/aflatin.c, - src/autofit/aftypes.h: Miscellaneous auto-hinter improvements. - - * src/autofit/afhints.c (af_glyph_hints_dump_segments) [AF_DEBUG]: - Emit more sensible information. - - * src/autofit/afhints.h (AF_SegmentRec): Add `height' member. - - * src/autofit/aflatin.c (af_latin_metrics_scale_dim): Improve - rounding of blue values. - (af_latin_hints_compute_segments): Hint segment heights. - (af_latin_hints_link_segments): Reduce `len_score' value. - (af_latin_hints_compute_edges): Increase `segment_length_threshold' - value and use `height' member for comparisons. - (af_latin_hint_edges): Extend logging message. - Improve handling of remaining edges. - -2006-11-22 Werner Lemberg - - Fix Savannah bug #15553. - - * src/truetype/ttgload.c (tt_loader_init): Re-execute the CVT - program after a change from mono to grayscaling (and vice versa). - Use correct constant for comparison to get `exec->grayscale'. - -2006-11-18 Werner Lemberg - - Because FT_Load_Glyph expects CID values for CID-keyed fonts, the - test for a valid glyph index must be deferred to the font drivers. - This patch fixes Savannah bug #18301. - - * src/base/ftobjs.c (FT_Load_Glyph): Don't check `glyph_index'. - * src/bdf/bdfdrivr.c (BDF_Glyph_Load), src/cff/cffgload.c - (cff_slot_load), src/cid/cidgload.c (cid_slot_load_glyph), - src/pcf/pcfdrivr.c (PCF_Glyph_Load), src/pfr/pfrobjs.c - (pfr_slot_load), src/truetype/ttdriver.c (Load_Glyph), - src/type1/t1gload.c (T1_Load_Glyph), src/winfonts/winfnt.c - (FNT_Load_Glyph): Check validity of `glyph_index'. - -2006-11-13 David Turner - - * src/truetype/ttinterp.c (FIX_BYTECODE): Undefine. The interpreter - `enhancements' are still too buggy for general use. - - * src/base/ftlcdfil.c: Add support for FT_FORCE_LIGHT_LCD_FILTER and - FT_FORCE_LEGACY_LCD_FILTER at compile time. Define these macros - when building the library to change the default LCD filter to be - used. This is only useful for experimentation. - - * include/freetype/ftlcdfil.h: Update documentation. - -2006-11-10 David Turner - - * src/smooth/ftsmooth.c: API change for the LCD - filter. The FT_LcdFilter value is an enumeration describing which - filter to apply, with new values FT_LCD_FILTER_LIGHT and - FT_LCD_FILTER_LEGACY (the latter implements the LibXft original - algorithm which produces strong color fringes for everything - except very-well hinted text). - - * include/freetype/ftlcdfil.h (FT_Library_SetLcdFilter): Change - second parameter to an enum type. - - * src/base/ftlcdfil.c (USE_LEGACY): Define. - (_ft_lcd_filter): Rename to... - (_ft_lcd_filter_fir): This. - Update parameters. - (_ft_lcd_filter_legacy) [USE_LEGACY]: New filter function. - (FT_Library_Set_LcdFilter): Update parameters. - Handle new filter modes. - - * include/internal/ftobjs.h: Include FT_LCD_FILTER_H. - (FT_Bitmap_LcdFilterFunc): Change third argument to `FT_Library'. - (FT_LibraryRec) [FT_CONFIG_OPTION_SUBPIXEL_RENDERING]: Add filtering - callback and update other fields. - - * src/smooth/ftsmooth.c (ft_smooth_render_generic) - [FT_CONFIG_OPTION_SUBPIXEL_RENDERING]: Update. - Other minor improvements. - - * src/autofit/aflatin.c: Various tiny improvements that drastically - improve the handling of serif fonts and of LCD/LCD_V hinting modes. - (af_latin_hints_compute_edges): Fix typo. - (af_latin_compute_stem_width): Take better care of diagonal stems. - -2006-11-09 David Turner - - * src/pshinter/pshalgo.c (psh_glyph_compute_inflections): Fix - typo which created a variable-used-before-initialized bug. - -2006-11-07 Zhe Su - - * src/base/ftsynth.c (FT_GlyphSlot_Embolden): Handle vertical layout - also. - -2006-11-03 Werner Lemberg - - * src/base/ftcalc.c: Don't use `long long' but `FT_Int64'. - -2006-11-02 David Turner - - Add a few tweaks to better handle serif fonts. - Add more debugging messages. - - * src/autofit/aflatin.c (af_latin_hints_compute_edges): Ignore - segments that are less than 1.5 pixels high. This gets rid of - *many* corner cases with serifs. - (af_latin_align_linked_edge): Add logging message. - (af_latin_hint_edges): Use AF_HINTS_DO_BLUES. - Add logging messages. - Handle AF_EDGE_FLAG flag specially. - - * src/autofit/afmodule.c [AF_DEBUG]: Add _af_debug, - _af_debug_disable_blue_hints, and _af_debug_hints variables. - - * src/autofit/aftypes.h (AF_LOG) [AF_DEBUG]: Use _af_debug. - Update external declarations. - (af_corner_orientation, af_corner_is_flat): Replaced by... - - * include/freetype/internal/ftcalc.h (ft_corner_orientation, - ft_corner_is_flat): These declarations. - - * src/autofit/afangles.c (af_corner_orientation, af_corner_is_flat): - Comment out. Replaced by... - - * src/base/ftcalc.h (ft_corner_orientation, ft_corner_is_flat): - These functions. Update all callers. - (FT_Add64) [!FT_LONG64]: Simplify. - - * src/autofit/afhints.c: Include FT_INTERNAL_CALC_H. - (af_direction_compute): Add a missing FT_ABS call. This bug caused - production of garbage by missing lots of segments. - - * src/autofit/afhints.h (AF_HINTS_DO_BLUES): New macro. - - * src/autofit/afloader.c (af_loader_init, af_loader_done) - [AF_DEBUG]: Set _af_debug_hints. - - - * src/pshinter/pshalgo.c: Include FT_INTERNAL_CALC_H. - (psh_corner_is_flat, psh_corner_orientation): Use ft_corner_is_flat - and ft_corner_orientation. - - - * src/gzip/inftrees.c (huft_build): Remove compiler warning. - -2006-10-24 Werner Lemberg - - * src/cff/cffload.c (cff_encoding_load): Remove unused variable. - - * src/base/ftobjs.c (FT_Select_Charmap): Disallow FT_ENCODING_NONE - as argument. - -2006-10-23 Zhe Su - - * src/base/ftoutln.c (FT_Outline_Get_Orientation): Re-implement to - better deal with broken Asian fonts with strange glyphs, having - self-intersections and other peculiarities. The used algorithm is - based on the nonzero winding rule. - -2006-10-23 David Turner - - Speed up the CFF font loader. With some large CFF fonts, - FT_Open_Face is now more than three times faster. - - * src/cff/cffload.c (cff_get_offset): Removed. - (cff_new_index): Inline functionality of `cff_get_offset'. - (cff_charset_compute_cids, cff_charset_free_cids): New functions. - (cff_charset_done): Call `cff_charset_free_cids'. - (cff_charset_load): Call `cff_charset_compute_cids'. - (cff_encoding_load) : Ditto, to replace inefficient loop. - - * src/sfnt/ttmtx.c (tt_face_load_hmtx): Replace calls to FT_GET_XXX - with FT_NEXT_XXX. - - - Speed up the Postscript hinter, with more than 100% speed increase - on my machine. - - * src/pshinter/pshalgo.c (psh_corner_is_flat, - psh_corner_orientation): New functions. - (psh_glyph_compute_inflections): Merge loops for efficiency. - Use `psh_corner_orientation'. - (psh_glyph_init): Use `psh_corner_is_flat'. - (psh_hint_table_find_strong_point): Renamed to... - (psh_hint_table_find_strong_points): This. - Rewrite, adding argument to handle all points at once. - Update all callers. - (PSH_MAX_STRONG_INTERNAL): New macro. - (psh_glyph_interpolate_normal_points): Rewrite for efficiency. - -2006-10-15 suzuki toshiya - - * src/base/ftmac.c (FT_New_Face_From_FOND): Initialize variable - `error' with FT_Err_Ok. - -2006-10-14 suzuki toshiya - - * docs/INSTALL.CROSS: New document file for cross-building. - - * builds/unix/configure.raw: Preliminary cross-building support. - Find native C compiler and pass it by CC_BUILD, and - find suffix for native executable and pass it by EXEEXT_BUILD. - Also suffix for target executable is passed by EXEEXT. - - * builds/unix/unix-cc.in (CCraw_build, E_BUILD): New variables to - build `apinames' which runs on building system. They are set by - CC_BUILD and EXEEXT_BUILD. - - * builds/exports.mk (APINAMES_EXE): Change the extension for - apinames from the suffix for target (E) to that for building host - (E_BUILD). - -2006-10-12 Werner Lemberg - - * docs/INSTALL.UNX, docs/UPGRADE.UNX: Renamed to... - * docs/INSTALL.UNIX, docs/UPGRADE.UNIX: This. Update all documents - which reference those files. - -2006-10-12 suzuki toshiya - - * builds/unix/configure.raw (FT2_EXTRA_LIBS): New variable. It is - embedded in freetype2.pc and freetype-config. Use it to record - Carbon dependency of MacOSX. - - * builds/unix/freetype2.in: Embed FT2_EXTRA_LIBS. - - * builds/unix/freetype-config.in: Ditto. - -2006-10-11 Werner Lemberg - - * devel/ftoption.h (FT_CONFIG_OPTION_SUBPIXEL_RENDERING): Define for - development. - -2006-10-03 Jens Claudius - - * include/freetype/config/ftstdlib.h: Cast away volatileness from - argument to ft_setjmp. - - * include/freetype/internal/ftvalid.h: Add comment that - ft_validator_run must not be used. - -2006-10-01 Werner Lemberg - - * src/base/ftbase.c: Undo change from 2006-09-30. - - * src/base/rules.mk (BASE_SRC): Remove `ftlcdfil.c'. - -2006-09-30 David Turner - - * include/freetype/internal/ftobjs.h (FT_Face_InternalRec): - s/unpatented_hinting/ignore_unpatented_hinter/. - Update all callers. - - * src/base/ftobjs.c (FT_Load_Glyph): Refine the algorithm whether - auto-hinting shall be used or not. - - * src/truetype/ttobjs.c (tt_face_init): Ditto. - -2006-09-30 Werner Lemberg - - * src/base/rules.mk (BASE_SRC): Remove `ftapi.c' (which is no longer - in use). - - * src/base/ftbase.c: Include `ftlcdfil.c'. - -2006-09-29 Werner Lemberg - - * src/sfnt/ttcmap.c (tt_cmap4_char_map_binary): Fix algorithm for - overlapping segments. Bug reported by Stefan Koch. - -2006-09-28 David Turner - - Fix a bug in the automatic unpatented hinting support which prevents - normal bytecode hinting to work properly. - - * include/freetype/internal/ftobjs.h (FT_Face_InternalRec): - s/force_autohint/unpatented_hinting/. Update all callers. - - * src/base/ftobjs.c (FT_Load_Glyph): Updated code. - - * src/autofit/aftypes.h (AF_DEBUG): Undefine to get rid of traces. - -2006-09-27 David Turner - - * include/freetype/freetype.h (FT_FREETYPE_PATCH): Set to 2. - - - Add a new API to support color filtering of subpixel glyph bitmaps. - In a default build, the function `FT_Library_SetLcdFilter' returns - `FT_Err_Unimplemented_Feature'; you need to #define - FT_CONFIG_OPTION_SUBPIXEL_RENDERING in ftoption.h to compile the - real implementation. - - * include/freetype/ftlcdfil.h, src/base/ftlcdfil.c: New files. - - * include/freetype/internal/ftobjs.h (FT_Bitmap_LcdFilterFunc): New - typedef. - (FT_LibraryRec) [FT_CONFIG_OPTION_SUBPIXEL_RENDERING]: New members - `lcd_filter_weights' and `lcd_filter'. - - * src/smooth/ftsmooth.c (ft_smooth_render_generic): Remove arguments - `hmul' and `vmul'. - - Handle subpixel rendering. - Simplify function. - (ft_smooth_render_lcd): Use `FT_RENDER_MODE_LCD'. - (ft_smooth_render_lcd_v): Use `FT_RENDER_MODE_LCD_V'. - - * include/freetype/config/ftheader.h (FT_LCD_FILTER_H): New macro, - pointing to . - - * src/base/Jamfile (_sources), src/base/rules.mk (BASE_SRC), - vms_make.com: Add `ftlcdfil.c' to the list of compiled source files. - - * modules.cfg (BASE_EXTENSIONS): Add ftlcdfil.c. - -2006-09-26 David Bustin - - * src/pfr/pfrobjs.c (pfr_face_get_kerning): Skip adjustment bytes - correctly. Reported as Savannah bug #17843. - -2006-09-26 David Turner - - * src/autofit/afhints.h (AF_HINTS_DO_HORIZONTAL, - AF_HINTS_DO_VERTICAL, AF_HINTS_DO_ADVANCE): New macros to disable - horizontal and vertical hinting for the purpose of debugging the - auto-fitter. - - * src/autofit/afmodule.c (_af_debug_disable_horz_hints, - _af_debug_disable_vert_hints) [AF_DEBUG]: New global variables. - - * src/autofit/aftypes.h [AF_DEBUG]: Declare above variables. - - * include/freetype/config/ftoption.h, devel/ftoption.h - (FT_CONFIG_OPTION_SUBPIXEL_RENDERING): New macro to control whether - we want to compile LCD-optimized rendering code (à la ClearType) or - not. The macro *must* be disabled in default builds of the library - for patent reasons. - - * src/smooth/ftsmooth.c (ft_smooth_render_generic): Disable - LCD-specific rendering when FT_CONFIG_OPTION_SUBPIXEL_RENDERING - isn't defined at compile time. This only changes the content of the - rendered glyph to match the one of normal gray-level rendering, - hence clients should not need to be modified. - - * docs/CHANGES: Updated. - -2006-09-18 Garrick Meeker - - * src/base/ftmac.c (FT_New_Face_From_FOND): Fall back to SFNT if - LWFN fails and both are available. - -2006-09-11 David Turner - - * src/sfnt/sfobjs.c (tt_face_get_name): Support some fonts which - report their English names through an Apple Roman - (platform,encoding) pair, with language_id != English. - - If the font uses another name entry with language_id == English, it - will be selected correctly, though. - - * src/truetype/ttobjs.c (tt_face_init): Add unpatented hinting - selection for `mingli.ttf'. - -2006-09-05 Werner Lemberg - - * src/truetype/ttpload.c (tt_face_load_hdmx): Handle `record_size' - values which have the upper two bytes set to 0xFF instead of 0x00 - (as it happens in at least two CJKV fonts, `HAN NOM A.ttf' and - `HAN NOM B.ttf'). - - * src/smooth/ftgrays.c [GRAYS_USE_GAMMA]: Really remove all code. - -2006-09-05 David Turner - - Minor source cleanups and optimizations. - - * src/smooth/ftgrays.c (GRAYS_COMPACT): Removed. - (TRaster): Remove `count_ex' and `count_ey'. - (gray_find_cell): Remove 2nd and 3rd argument. - (gray_alloc_cell): Merged with `gray_find_cell'. - (gray_record_cell): Simplify. - (gray_set_cell): Rewrite. - (gray_start_cell): Apply offsets to `ras.ex' and `ras.ey'. - (gray_render_span): Don't use FT_MEM_SET for small values. - (gray_dump_cells) [DEBUG_GRAYS]: New function. - (gray_sweep): Avoid buffer overwrites when to drawing the end of a - bitmap scanline. - (gray_convert_glyph): Fix speed-up. - -2006-09-04 David Turner - - * src/smooth/ftgrays.c (gray_convert_glyphs): Make it work with - 64bit processors. - -2006-09-03 Werner Lemberg + `make devel' fails if FT_CONFIG_OPTION_OLD_INTERNALS is set. * devel/ftoption.h: Synchronize with include/freetype/config/ftoption.h. - * src/smooth/ftgrays.c (gray_record_cell): Remove shadowing - variable declaration. - (gray_convert_glyph): Fix compiler warnings. +2010-08-04 suzuki toshiya -2006-09-01 David Turner + [cff] Improve stack overflow test. - * src/truetype/ttobjs.c (tt_face_init): Update the TrueType loader - to recognize a few fonts that require the automatic unpatented - loader. + * src/cff/cffgload.c (cff_decoder_parse_charstrings): Check stack + after execution of operations too. - * src/smooth/ftgrays.c: Optmize the performance of the anti-aliased - rasterizer. The speed improvement is between 15% and 25%, depending - on the font data. +2010-07-18 Werner Lemberg - (GRAYS_USE_GAMMA, GRAYS_COMPACT): Removed, and all associated code. - (TCell): Redefine. - (TRaster): New members `buffer', `buffer_size', `ycells', `ycount'. - (gray_init_cells): Updated. - (gray_find_cell, gray_alloc_cell): New functions. - (gray_record_cell): Rewritten to use `gray_find_cell' and - `gray_alloc_cell'. - (PACK, LESS_THAN, SWAP_CELLS, DEBUG_SORT, QUICK_SORT, SHELL_SORT, - QSORT_THRESHOLD): + Add reference counters and to FT_Library and FT_Face objects. + + * include/freetype/freetype.h (FT_Reference_Face): New function. + * include/freetype/ftmodapi.h (FT_Rererence_Library): New function. + + * include/freetype/internal/ftobjs.h (FT_Face_InternalRec, + FT_LibraryRec): New field `refcount'. + + * src/base/ftobjs.c (FT_Open_Face, FT_New_Library): Handle + `refcount'. + (FT_Reference_Face, FT_Reference_Library): Implement new functions. + (FT_Done_Face, FT_Done_Library): Handle `refcount'. + + * docs/CHANGES: Updated. + +2010-07-18 Werner Lemberg + + * Version 2.4.1 released. + ========================= + + + Tag sources with `VER-2-4-1'. + + * docs/CHANGES: Updated. + + * docs/VERSION.DLL: Update documentation and bump version number to + 2.4.1. + + * README, Jamfile (RefDoc), + builds/win32/vc2005/freetype.vcproj, builds/win32/vc2005/index.html, + builds/win32/vc2008/freetype.vcproj, builds/win32/vc2008/index.html, + builds/win32/visualc/freetype.dsp, + builds/win32/visualc/freetype.vcproj, + builds/win32/visualc/index.html, builds/win32/visualce/freetype.dsp, + builds/win32/visualce/freetype.vcproj, + builds/win32/visualce/index.html, + builds/wince/vc2005-ce/freetype.vcproj, + builds/wince/vc2005-ce/index.html, + builds/wince/vc2008-ce/freetype.vcproj, + builds/wince/vc2008-ce/index.html: s/2.4.0/2.4.1/, s/240/241/. + + * include/freetype/freetype.h (FREETYPE_PATCH): Set to 1. + + * builds/unix/configure.raw (version_info): Set to 11:1:5. + +2010-07-17 Werner Lemberg + + [cff] Final try to fix `hintmask' and `cntrmask' limit check. + + Problem reported by Tobias Wolf . + + * src/cff/cffgload.c (cff_decoder_parse_charstrings) + : Sigh. I'm apparently too silly to fix this + correctly in less than three tries. + +2010-07-12 Werner Lemberg + + * Version 2.4.0 released. + ========================= + + + Tag sources with `VER-2-4-0'. + + * docs/CHANGES: Updated. + + * docs/VERSION.DLL: Update documentation and bump version number to + 2.4.0. + + * README, Jamfile (RefDoc), + builds/win32/vc2005/freetype.vcproj, builds/win32/vc2005/index.html, + builds/win32/vc2008/freetype.vcproj, builds/win32/vc2008/index.html, + builds/win32/visualc/freetype.dsp, + builds/win32/visualc/freetype.vcproj, + builds/win32/visualc/index.html, builds/win32/visualce/freetype.dsp, + builds/win32/visualce/freetype.vcproj, + builds/win32/visualce/index.html, + builds/wince/vc2005-ce/freetype.vcproj, + builds/wince/vc2005-ce/index.html, + builds/wince/vc2008-ce/freetype.vcproj, + builds/wince/vc2008-ce/index.html: s/2.3.12/2.4.0/, s/2312/240/. + + * include/freetype/freetype.h (FREETYPE_MINOR): Set to 4. + (FREETYPE_PATCH): Set to 0. + + * builds/unix/configure.raw (version_info): Set to 11:0:5. + +2010-07-12 Werner Lemberg + + Remove C++ warnings. + + */*: Initialize pointers where necessary to make g++ happy. + +2010-07-12 malc + Richard Henderson + + Fix type-punning issues with C++. + + * include/freetype/internal/ftmemory.h (FT_ASSIGNP) [__cplusplus]: + Emulate a `typeof' operator with an inline template which uses + `static_cast'. + +2010-07-11 Werner Lemberg + + Fix C++ compilation issue. + + * src/tools/apinames.c (names_dump) : Fix + type of `dot' variable. + +2010-07-10 suzuki toshiya + + Fix another case reported in Savannah bug #30373. + Permit a face for Type1, Type42 and CFF without charmap, + patch by Tor Andersson. + + * src/type1/t1objs.c (T1_Face_Init): Reset the error if it + is FT_Err_No_Unicode_Glyph_Name. + * src/type42/t42objs.c (T42_Face_Init): Ditto. + * src/cff/cffobjs.c (cff_face_init): Ditto. + +2010-07-09 suzuki toshiya + + Use defined macros to set {platform,encoding}_id. + + * src/bdf/bdfdrivr.c: Include ttnameid.h and use macros to + set charmap.{platfom,encoding}_id. + * src/pcf/pcfdrivr.c: Ditto. + * src/winfonts/winfnt.c: Ditto. + * src/type1/t1objs.c: Ditto. + * src/type42/t42objs.c: Ditto. + * src/cff/cffobjs.c: Ditto. + * src/pfr/pfrobjs.c: Ditto. + +2010-07-09 suzuki toshiya + + Fix Savannah bug #30373. + Too serious check of errors by `FT_CMap_New' since 2010-07-04 + is fixed. Reported by Tor Andersson. + + * include/freetype/fterrdef.h + (PSnames_Err_No_Unicode_Glyph_Name): New error code to + indicate the Unicode charmap synthesis failed because + no Unicode glyph name is found. + + * src/psnames/psmodule.c (ps_unicodes_init): Return + PSnames_Err_No_Unicode_Glyph_Name when no Unicode glyph name + is found in the font. + * src/cff/cffcmap.c (cff_cmap_unicode_init): Return + CFF_Err_No_Unicode_Glyph_Name when no SID is available. + + * src/type1/t1objs.c (T1_Face_Init): Proceed if `FT_CMap_New' + is failed by the lack of Unicode glyph name. + * src/type42/t42objs.c (T42_Face_Init): Ditto. + * src/cff/cffobjs.c (cff_face_init): Ditto. + +2010-07-09 Ken Sharp + + Make ftraster.c compile in stand-alone mode with MSVC compiler. + + * src/raster/ftmisc.h (FT_Int64) [_WIN32, _WIN64]: Fix typedef + since there is no `inttypes.h' for MSVC. + +2010-07-08 Werner Lemberg + + Fix Savannah bug #30361. + + * src/truetype/ttinterp.c (Ins_IUP): Fix bounds check. + +2010-07-06 Werner Lemberg + + Pacify compiler. + + * src/cff/cffload.c (cff_index_get_pointers): Initialize + `new_bytes'. + +2010-07-05 Eugene A. Shatokhin + + Fix Savannah bug #27648. + + * src/base/ftobjs.c (ft_remove_renderer, FT_Add_Module): Call + `raster_done' only if we have an outline glyph format. + +2010-07-05 Werner Lemberg + + Fix Savannah bug #30030. + + * builds/win32/*/freetype.vcproj: Add ftxf86.c. + +2010-07-05 Werner Lemberg + + [cff] Next try to fix `hintmask' and `cntrmask' limit check. + + Problem reported by malc . + + * src/cff/cffgload.c (cff_decoder_parse_charstrings) + : It is possible that there is just a single byte + after the `hintmask' or `cntrmask', e.g., a `return' instruction. + +2010-07-04 suzuki toshiya + + Restrict the number of the charmaps in a rogue-compatible mode. + Fix for Savannah bug #30059. + + * src/cache/ftccmap.c (FTC_CMapCache_Lookup): Replace `16' the + minimum character code passed by a legacy rogue client by... + * include/freetype/config/ftoption.h (FT_MAX_CHARMAP_CACHEABLE): + This. It is undefined when FT_CONFIG_OPTION_OLD_INTERNALS is + undefined (thus the rogue client compatibility is not required). + + * src/cff/cffobjs.c (cff_face_init): Abort the automatic + selection or synthesis of Unicode cmap subtable when the charmap + index exceeds FT_MAX_CHARMAP_CACHEABLE. + * src/sfnt/ttcmap.c (tt_face_build_cmaps): Issue error message + when the charmap index exceeds FT_MAX_CHARMAP_CACHEABLE. + + * src/base/ftobjs.c (find_unicode_charmap): When Unicode charmap + is found after FT_MAX_CHARMAP_CACHEABLE, ignore it and search + earlier one. + (find_variant_selector_charmap): When UVS charmap is found after + FT_MAX_CHARMAP_CACHEABLE, ignore it and search earlier one. + (FT_Select_Charmap): When a charmap matching with requested + encoding but after FT_MAX_CHARMAP_CACHEABLE, ignore and search + earlier one. + (FT_Set_Charmap): When a charmap matching with requested + charmap but after FT_MAX_CHARMAP_CACHEABLE, ignore and search + earlier one. + (FT_Get_Charmap_Index): When a requested charmap is found + after FT_MAX_CHARMAP_CACHEABLE, return the inverted charmap + index. + +2010-07-04 Werner Lemberg + + TrueType hinting is no longer patented. + + * include/freetype/config/ftoption.h, devel/ftoption.h + (TT_CONFIG_OPTION_BYTECODE_INTERPRETER): Define. + (TT_CONFIG_OPTION_UNPATENTED_HINTING): Undefine. + + * docs/CHANGES, docs/INSTALL, include/freetype/freetype.h: Updated. + * docs/TRUETYPE, docs/PATENTS: Removed. + +2010-07-04 suzuki toshiya + + Check error value by `FT_CMap_New'. + + * src/cff/cffobjs.c (cff_face_init): Check error value by + `FT_CMap_New'. + * src/pfr/pfrobjs.c (pfr_face_init): Ditto. + * src/type1/t1jobjs.c (T1_Face_Init): Ditto. + * src/type42/t42jobjs.c (T42_Face_Init): Ditto. + +2010-07-03 Werner Lemberg + + Make ftgrays.c compile stand-alone again. + + * src/smooth/ftgrays.c [_STANDALONE_]: Include `stddef.h'. + (FT_INT_MAX, FT_PtrDist)[_STANDALONE_]: Define. + +2010-07-02 suzuki toshiya + + Additional fix for Savannah bug #30306. + + * src/base/ftobjs.c (Mac_Read_POST_Resource): If the type of the + POST fragment is 0, the segment is completely ignored. The declared + length of the segment is not cared at all. According to Adobe + Technical Note 5040, type 0 segment is a comment only and should not + be loaded for the interpreter. Reported by Robert Święcki. + +2010-07-01 Werner Lemberg + + [truetype] Protect against code range underflow. + + * src/truetype/ttinterp.c (DO_JROT, DO_JMPR, DO_JROF): Don't allow + negative IP values. + +2010-07-01 Werner Lemberg + + [truetype] Add rudimentary tracing for bytecode instructions. + + * src/truetype/ttinterp.c (opcode_name) [FT_DEBUG_LEVEL_TRACE]: New + array. + (TT_RunIns): Trace opcodes. + +2010-06-30 Werner Lemberg + + Fix Savannah bug #30263. + + * src/smooth/ftgrays.c (gray_render_span): Use cast to `unsigned + int' to avoid integer overflow. + + * src/smooth/ftsmooth.c (ft_smooth_render_generic): Use smaller + threshold values for `width' and `height'. This is not directly + related to the bug fix but makes sense anyway. + +2010-07-01 suzuki toshiya + + Initial fix for Savannah bug #30306. + + * src/base/ftobjs.c (Mac_Read_POST_Resource): Check `rlen', the + length of fragment declared in the POST fragment header, and prevent + an underflow in length calculation. Some fonts set the length to + zero in spite of the existence of a following 16bit `type'. + Reported by Robert Święcki. + +2010-07-01 suzuki toshiya + + Additional fix for Savannah bug #30248 and #30249. + + * src/base/ftobjs.c (Mac_Read_POST_Resource): Check the buffer size + during gathering PFB fragments embedded in LaserWriter PS font for + Macintosh. Reported by Robert Święcki. + +2010-06-30 Alexei Podtelezhnikov + + Minor optimizations by avoiding divisions. + + * src/sfnt/ttkern.c (tt_face_load_kern, tt_face_get_kerning): + Replace divisions with multiplication in comparisons. + +2010-06-29 Werner Lemberg + + Fix minor tracing issues. + + * src/cff/cffgload.c, src/truetype/ttgload.c: Adjust tracing levels. + +2010-06-27 Werner Lemberg + + [cff] Really fix `hintmask' and `cntrmask' limit check. + + * src/cff/cffgload.c (cff_decoder_parse_charstrings) + : Fix thinko and handle tracing also. + +2010-06-27 Werner Lemberg + + Fix valgrind warning. + + * src/base/ftoutln.c (FT_Outline_Get_Orientation): Initialize + `result' array. + +2010-06-27 Werner Lemberg + + [cff] Fix memory leak. + + * src/cff/cffgload.c (cff_operator_seac): Free charstrings even in + case of errors. + +2010-06-27 Werner Lemberg + + [cff] Protect against invalid `hintmask' and `cntrmask' operators. + + * src/cff/cffgload.c (cff_decoder_parse_charstrings) + : Ensure that we don't exceed `limit' while parsing + the bit masks of the `hintmask' and `cntrmask' operators. + +2010-06-26 Werner Lemberg + + Fix PFR change 2010-06-24. + + * src/pfr/pfrgload.c (pfr_glyph_load_simple): Really protect against + invalid indices. + +2010-06-26 Werner Lemberg + + Improve PFR tracing messages. + + * src/pfr/pfrgload.c (pfr_glyph_load_rec): Emit tracing messages for + simple and compound glyph offsets. + +2010-06-26 Werner Lemberg + + Fix last PFR change. + + * src/pfr/pfrobjs.c (pfr_face_init): Fix rejection logic. + +2010-06-26 Werner Lemberg + + Fix Savannah bug #30262. + + * src/sfnt/ttload.c (tt_face_load_maxp): Limit `maxComponentDepth' + arbitrarily to 100 to avoid stack exhaustion. + +2010-06-26 Werner Lemberg + + Add some memory checks (mainly for debugging). + + * src/base/ftstream.c (FT_Stream_EnterFrame): Exit with error + if the frame size is larger than the stream size. + + * src/base/ftsystem.c (ft_ansi_stream_io): Exit with error if + seeking a position larger than the stream size. + +2010-06-25 Werner Lemberg + + Fix Savannah bug #30261. + + * src/pfr/pfrobjs.c (pfr_face_init): Reject fonts which contain + neither outline nor bitmap glyphs. + +2010-06-25 Werner Lemberg + + Fix Savannah bug #30254. + + * src/cff/cffload.c (cff_index_get_pointers): Do sanity check for + first offset also. + +2010-06-25 suzuki toshiya + + Initial fix for Savannah bug #30248 and #30249. + + * src/base/ftobjs.c (Mac_Read_POST_Resource): Check the error during + reading a PFB fragment embedded in LaserWriter PS font for Macintosh. + Reported by Robert Święcki. + +2010-06-24 Werner Lemberg + + Fix Savannah bug #30247. + + * src/pcf/pcfread.c (pcf_get_metrics): Disallow (invalid) fonts with + zero metrics. + +2010-06-24 Graham Asher + + * src/smooth/ftgrays.c (gray_render_cubic): Fix algorithm. + The previous version was too aggressive, as demonstrated in + http://lists.gnu.org/archive/html/freetype-devel/2010-06/msg00020.html. + +2010-06-24 Werner Lemberg + + */*: Use module specific error names where appropriate. + +2010-06-24 Werner Lemberg + + Fix Savannah bug #30236. + + * src/sfnt/ttcmap.c (tt_face_build_cmaps): Improve check for pointer + to `cmap_table'. + +2010-06-24 Werner Lemberg + + Fix Savannah bug #30235. + + * src/pfr/pfrgload.c (pfr_glyph_load_simple): Protect against + invalid indices if there aren't any coordinates for indexing. + +2010-06-24 Werner Lemberg + + [bdf]: Font properties are optional. + + * src/bdf/bdflib.c (_bdf_readstream): Use special error code to + indicate a redo operation. + (_bdf_parse_start): Handle `CHARS' keyword here too and pass current + input line to `_bdf_parse_glyph'. + +2010-06-23 Werner Lemberg + + Fix Savannah bug #30220. + + * include/freetype/fterrdef.h + (BDF_Err_Missing_Fontboundingbox_Field): New error code. + + * src/bdf/bdflib.c (_bdf_parse_start): Check for missing + `FONTBOUNDINGBOX' field. + Avoid memory leak if there are multiple `FONT' lines (which is + invalid but doesn't hurt). + +2010-06-21 Werner Lemberg + + Fix Savannah bug #30168. + + * src/pfr/pfrgload.c (pfr_glyph_load_compound): Limit the number of + subglyphs to avoid endless recursion. + +2010-06-20 Werner Lemberg + + Fix Savannah bug #30145. + + * src/psaux/psobjs.c (t1_builder_add_contour): Protect against + `outline == NULL' which might happen in invalid fonts. + +2010-06-19 Werner Lemberg + + Fix Savannah bug #30135. + + * src/bdf/bdflib.c (_bdf_list_join): Don't modify value in static + string `empty'. + (_bdf_parse_glyph): Avoid memory leak in case of error. + +2010-06-15 Werner Lemberg + + Fix Savannah bug #30108. + + * src/autofit/afglobal.c (af_face_globals_compute_script_coverage): + Properly mask AF_DIGIT bit in comparison. + +2010-06-11 Werner Lemberg + + Fix Savannah bug #30106. + + Point numbers for FreeType's implementation of hinting masks are + collected before the final number of points of a glyph has been + determined; in particular, the code for handling the `endchar' + opcode can reduce the number of points. + + * src/pshinter/pshalgo.c (psh_glyph_find_strong_points): Assure that + `end_point' is not larger than `glyph->num_points'. + +2010-06-11 Werner Lemberg + + [cff]: Improve debugging output. + + * src/cff/cffgload.c (cff_decoder_parse_charstrings) + : Implement it. + +2010-06-10 Graham Asher + + ftgrays: Speed up rendering of small cubic splines. + + * src/smooth/ftgrays.c (gray_render_cubic): Implement new, + simplified algorithm to find out whether the spline can be replaced + with two straight lines. See this thread for more: + + http://lists.gnu.org/archive/html/freetype-devel/2010-06/msg00000.html + +2010-06-09 Werner Lemberg + + Fix Savannah bug #30082. + + * src/cff/cffgload.c (cff_decoder_parse_charstrings) + : Protect against stack underflow. + +2010-06-08 Werner Lemberg + + Fix Savannah bug #30053. + + * src/cff/cffparse.c (cff_parse_real): Handle border case where + `fraction_length' has value 10. + +2010-06-07 Werner Lemberg + + Fix Savannah bug #30052. + This bug has been introduced with commit 2415cbf3. + + * src/base/ftobjs.c (FT_Get_First_Char, FT_Get_Next_Char): Protect + against endless loop in case of corrupted font header data. + +2010-05-26 Werner Lemberg + + Remove unused variable. + Found by Graham. + + * src/autofit/afhints.c (af_glyph_hints_reload): Remove unused + variable `first' in first block. + +2010-05-22 Werner Lemberg + + Fix various memory problems found by linuxtesting.org. + + * src/base/ftgxval.c (FT_TrueTypeGX_Free, FT_ClassicKern_Free), + src/base/ftotval.c (FT_OpenType_Free), src/base/ftpfr.c + (ft_pfr_check): Check `face'. + + * src/base/ftobjs.c (FT_Get_Charmap_Index): Check `charmap' and + `charmap->face'. + (FT_Render_Glyph): Check `slot->face'. + (FT_Get_SubGlyph_Info): Check `glyph->subglyphs'. + +2010-05-22 Werner Lemberg + + autofit: Remove dead code. + Suggested by Graham. + + * src/autofit/afhints.c (af_glyph_hints_compute_inflections): Removed. - (gray_shell_sort, gray_quick_sort, gray_check_sort, - gray_dump_cells): Removed. - (gray_sweep): Rewritten. - (gray_convert_glyph): Rewrite code which used one of the sorting - functions. - (gray_raster_render): Updated. + (af_glyph_hints_reload): Remove third argument. + Update all callers. -2006-08-29 Dr. Werner Fink +2010-05-21 Bram Tassyns - * configure: Make it possible to handle configure options which - have strings containing spaces. + Fix Savannah bug #27987. -2006-08-27 David Turner + * src/cff/cffobjs.c (remove_subset_prefix): New function. + (cff_face_init): Use it to adjust `cffface->family_name'. - * include/freetype/config/ftoption.h (TT_USE_BYTECODE_INTERPRETER): - New macro, defined if either TT_CONFIG_OPTION_BYTECODE_INTERPRETER - or TT_CONFIG_OPTION_UNPATENTED_HINTING is defined. +2010-05-20 Werner Lemberg - * include/freetype/internal/ftcalc.h, src/base/ftcalc.c, - src/truetype/truetype.c, src/truetype/ttdriver.c, - src/truetype/ttgload.c, src/truetype/ttgload.h, - src/truetype/ttinterp.c, src/truetype/ttobjs.c, - src/truetype/ttobjs.h, src/truetype/ttpload.c, src/type42/t42drivr.c: - s/TT_CONFIG_OPTION_BYTECODE_INTERPRETER/TT_USE_BYTECODE_INTERPRETER/. + TrueType: Make FreeType ignore maxSizeOfInstructions in `maxp'. - * include/freetype/internal/ftobjs.h (FT_Face_InternalRec): New - member `force_autohint'. + Acroread does the same. - * src/base/ftobjs.c (FT_Load_Glyph): Use `force_autohint'. + * src/truetype/ttgload.c (TT_Process_Composite_Glyph): Call + `Update_Max' to adjust size of instructions array if necessary and + add a rough safety check. - * src/truetype/ttobjs.c (tt_face_init): Prepare code for testing - against a list of font names which need the bytecode interpreter. + (load_truetype_glyph): Save `loader->byte_len' before recursive + call. -2006-08-27 Jens Claudius + * src/truetype/ttinterp.h, src/truetype/ttinterp.c (Update_Max): + Declare it as FT_LOCAL. - Fix miscellaneous compiler warnings. +2010-05-18 Hongbo Ni - * include/freetype/internal/ftobjs.h: Close comment with `*/' to - avoid `/* in comment' compiler warning. + Apply Savannah patch #7196. - * src/base/ftdbgmem.c (ft_mem_table_get_source): Turn cast - `(FT_UInt32)(void*)' into `(FT_UInt32)(FT_PtrDist)(void*)' since on - 64-bit platforms void* is larger than FT_UInt32. + * src/cff/cffgload.c (cff_slot_load): Prevent crash if CFF subfont + index is out of range. - * src/base/ftobjs.c (t_validator_error): Cast away - volatileness of argument to ft_longjmp. Spotted by Werner - `Putzfrau' Lemberg. +2010-05-11 Werner Lemberg - * src/bdf/bdflib.c (bdf_load_font): Initialize local - variable `lineno'. + * docs/formats.txt: Give pointer to PCF documentation. + Information provided by Alan Coopersmith + . - * src/gxvalid/gxvmod.c (classic_kern_validate): Mark local variable - `error' as volatile. +2010-05-10 Ken Sharp -2006-08-27 Werner Lemberg + Fix Savannah bug #29846. - * builds/unix/ftconfig.in: Synchronize with main ftconfig.h. - Reported by Jens. + Previously we discovered fonts which used `setcurrentpoint' to set + the initial point of a contour to 0,0. This caused FreeType to + raise an error, because the `setcurrentpoint' operator is only + supposed to be used with the results from an OtherSubr subroutine. -2006-08-22 Jens Claudius + This was fixed by simply ignoring the error and carrying on. - Fix for previous commit, which caused many compiler warnings/errors - about addresses of volatile objects passed as function arguments as - non-volatile pointers. + Now we have found a font which uses setcurrentpoint to actually + establish a non-zero point for a contour during the course of a + glyph program. FWIW, these files may be produced by an application + called `Intaglio' on the Mac, when converting TrueType fonts to + Type 1. - * include/freetype/internal/ftvalid.h: Make FT_Validator typedef a - pointer to a volatile object. + The fix allows the new invalid behaviour, the old invalid behaviour + and real proper usage of the operator to work the same way as Adobe + interpreters apparently do. - * src/gxvalid/gxvmod.c (gxv_load_table): Make function argument - `table' a pointer to a volatile object. + (t1_decoder_parse_charstrings): Make `setcurrentpoint' use the top + two elements of the stack to establish unconditionally the current x + and y coordinates. - * src/otvalid/otvmod.c (otv_load_table): Make function argument - `table' a pointer to a volatile object. + Make the `flex' subroutine handling (OtherSubr 0) put the current + x,y coordinates onto the stack, instead of two dummy uninitialised + values. -2006-08-18 Jens Claudius +2010-04-14 Ken Sharp - * src/gxvalid/gxvmod.c (GXV_TABLE_DECL): Mark local variable `_sfnt' - as volatile since it must keep its value across a call to ft_setjmp. - (gxv_validate): Same for local variables `memory' and `valid'. - (classic_kern_validate): Same for local variables `memory', - `ckern', and `valid'. + Fix Savannah bug #29444. - * src/otvalid/otvmod.c (otv_validate): Same for function parameter - `face' and local variables `base', `gdef', `gpos', `gsub', `jstf', - and 'valid'. + * src/psaux/psobjs.c (t1_builder_start_point): Accept (invalid) + `lineto' immediately after `hsbw', in accordance with Acrobat, GS, + and others. - * src/sfnt/ttcmap.c (tt_face_build_cmaps): Same for local variable - `cmap'. +2010-04-14 Michał Cichoń -2006-08-16 David Turner + Fix Savannah bug #27999. - * src/cid/cidgload.c (cid_slot_load_glyph): Remove compiler - warnings. + * src/cache/ftcmanag.c (FTC_Manager_RemoveFaceID): Only remove + selected entry, not all. - * src/base/ftobjs.c (ft_validator_run): Disable function; it is - buggy by design. Always return -1. +2010-04-06 Jonathan Kew + Add overflow check to `fvar' table. - Improvements to native TrueType hinting. This is a first try, - controlled by the FIX_BYTECODE macro in src/truetype/ttinterp.c. + * src/truetype/ttgxvar.c (TT_Get_MM_Var): Check axis and instance + count. - * include/freetype/internal/ftgloadr.h (FT_GlyphLoadRec): Add member - `extra_points2'. +2010-04-05 Ken Sharp - * include/freetype/internal/tttypes.h (TT_GlyphZoneRec): Add member - `orus'. + Fix Savannah bug #29335. - * src/base/ftgloadr.c (FT_GlyphLoader_Reset, - FT_GlyphLoader_Adjust_Points, FT_GlyphLoader_CreateExtra, - FT_GlyphLoader_CheckPoints, FT_GlyphLoader_CopyPoints): Updated to - handle `extra_points2'. + * src/raster/ftraster.c (Line_Up): Use slow multiplication to + prevent overflow. This shouldn't have any serious impact on speed, + however. - * src/truetype/ttgload.c (tt_prepare_zone): Handle `orus'. - Remove compiler warning. - (cur_to_arg): Remove macro. - (TT_Hint_Glyph): Updated. - (TT_Process_Simple_Glyph): Handle `orus'. +2010-04-05 Werner Lemberg - * src/truetype/ttinterp.c (FIX_BYTECODE): New macro. - (Ins_MD, Ins_MDRP, Ins_IP) [FIX_BYTECODE]: Handle `orus'. - (LOC_Ins_IUP): Renamed to... - (IUP_WorkerRec): This. - Add `orus' member. - (Shift): Renamed to... - (_iup_worker_shift): This. - Updated. - (Interp): Renamed to... - (_iup_worker_interpolate): This. - Updated to handle `orus'. - (Ins_IUP): Updated. + Add new function `FT_Library_SetLcdFilterWeights'. - * src/truetype/ttobjs.c (tt_glyphzone_done, tt_glyphzone_new): - Handle `orus'. + This is based on code written by Lifter + . It fixes + FreeDesktop bug #27386. -2006-08-15 suzuki toshiya + * src/base/ftlcdfil.c (FT_Library_SetLcdFilterWeights): New + function. - * modules.cfg (BASE_EXTENSIONS): Compile in ftgxval.c by default to - build ftvalid in ft2demos. This has been inadvertedly changed - 2006-08-13. + * include/freetype/ftlcdfil.h: Updated. -2006-08-15 suzuki toshiya + * docs/CHANGES: Updated. - `ft_validator_run' wrapping `setjmp' can cause a crash, as found by - Jens: - http://lists.gnu.org/archive/html/freetype-devel/2006-08/msg00004.htm. +2010-04-01 John Tytgat - * src/otvalid/otvmod.c: Replace `ft_validator_run' by `ft_setjmp'. - It reverts the change introduced on 2005-08-20. + Fix Savannah bug #29404. - * src/gxvalid/gxvmod.c: Ditto. + * src/truetype/ttgload.c: Revert change 2752bd1a (check on bit 1 + of `head' table of TrueType fonts). -2006-08-13 Jens Claudius +2010-03-14 suzuki toshiya - * finclude/freetype/internal/psaux.h: (T1_TokenType): Add - T1_TOKEN_TYPE_KEY. - (T1_FieldRec): Add `dict'. - (T1_FIELD_DICT_FONTDICT, T1_FIELD_DICT_PRIVATE): New macros. - (T1_NEW_XXX, T1_FIELD_XXX): Update to take the dictionary where a PS - keyword is expected as an additional argument. + Fix `multi build' for Tytgat's CFF driver improvement. - * src/cid/cidload.c: (cid_field_records): Adjust invocations of - T1_FIELD_XXX. - - * src/cid/cidtoken.h: Adjust invocations of T1_FIELD_XXX. - - * src/psaux/psobjs.c: Add macro FT_COMPONENT for tracing. - (ps_parser_to_token): Report a PostScript key as T1_TOKEN_TYPE_KEY, - not T1_TOKEN_TYPE_ANY. - (ps_parser_load_field): Make sure a token that should be a string or - name is really a string or name. - Avoid memory leak if a keyword has been already encountered and its - value is overwritten. - * src/type1/t1load.c: (t1_keywords): Adjust invocations of - T1_FIELD_XXX. - (parse_dict): Ignore keywords that occur in the wrong dictionary - (e.g., in `Private' instead of `FontDict'). - - * src/type1/t1tokens.h: Adjust invocations of T1_FIELD_XXX. - - * src/type42/t42parse.c: (t42_keywords): Adjust invocations of - T1_FIELD_XXX. + * src/base/cffload.h (cff_index_get_name): Added. -2006-07-18 Jens Claudius - - Move creation of field `buildchar' of T1_DecoderRec out of - `t1_decoder_init' and let the caller of `t1_decoder_init' take care - of it. - - Call the finisher for T1_Decoder in `cid_face_compute_max_advance' - and `T1_Compute_Max_Advance'. - - * include/freetype/internal/psaux.h (T1_DecoderRec): Remove field - `face', add `len_buildchar'. - - * include/freetype/internal/t1types.h (T1_FaceRec): Add field - `buildchar'. - - * src/cid/cidgload.c (cid_face_compute_max_advance): Call finisher - for T1_Decoder. - (cid_slot_load_glyph): Do not ignore failure when initializing the - T1_Decoder. - - * src/psaux/t1decode.c (t1_decoder_parse_charstrings): Updated. - (t1_decoder_init): Remove initialization of fields `buildchar' and - `len_buildchar'. - (t1_decoder_done): Remove deallocation of field `buildchar'. - - * freetype/src/type1/t1gload.c (T1_Compute_Max_Advance): Initialize - T1_Decoder's `buildchar' and `len_buildchar'; call finisher for - T1_Decoder. - (T1_Load_Glyph): Initialize T1_Decoder's `buildchar' and - `len_buildchar'; make sure to call finisher for T1_Decoder even in - case of error. - - * src/type1/t1load.c (T1_Open_Face): Allocate new field `buildchar' - of T1_FaceRec. - - * src/type1/t1objs.c (T1_Face_Done): Free new field `buildchar' of - T1_FaceRec. - -2006-07-14 Jens Claudius - - * include/freetype/internal/psaux.h: New macros IS_PS_NEWLINE, - IS_PS_SPACE, IS_PS_SPECIAL, IS_PS_DELIM, IS_PS_DIGIT, IS_PS_XDIGIT, - and IS_PS_BASE85 (from src/psaux/psconv.h). - (T1_FieldLocation): Add T1_FIELD_LOCATION_LOADER, - T1_FIELD_LOCATION_FACE, and T1_FIELD_LOCATION_BLEND. - (T1_DecoderRec): New fields `buildchar' and `face'. - (IS_PS_TOKEN): New macro. - - * include/freetype/internal/t1types.h (T1_FaceRec): New fields - `ndv_idx', `cdv_idx', and `len_buildchar'. - - * include/freetype/t1tables.h (PS_BlendRec): New fields - `default_design_vector' and `num_default_design_vector'. - - * src/psaux/psconv.h: Move macros IS_PS_NEWLINE, IS_PS_SPACE, - IS_PS_SPECIAL, IS_PS_DELIM, IS_PS_DIGIT, IS_PS_XDIGIT, and - IS_PS_BASE85 to include/freetype/internal/psaux.h. - - * src/psaux/psobjs.c (ps_parser_to_token_array): Allow `token' - argument to be NULL if we want only to count the number of tokens. - (ps_tocoordarray): Allow `coords' argument to be NULL if we just - want to skip the array. - (ps_tofixedarray): Allow `values' argument to be NULL if we just - want to skip the array. - - * src/psaux/t1decode.c (t1_decoder_parse_charstrings): Add support - for (partially commented out) othersubrs 19-25, 27, and 28. - (t1_decoder_init): Initialize new fields `face' and `buildchar'. - (t1_decoder_done): Release new field `buildchar'. - - * src/type1/t1load.c (parse_buildchar, parse_private): New - functions. - (t1_keywords): Register them. - (t1_allocate_blend): Updated. - (t1_load_keyword): Handle field types T1_FIELD_LOCATION_LOADER, - T1_FIELD_LOCATION_FACE and T1_FIELD_LOCATION_BLEND. - (parse_dict): Remove `keyword_flags' argument. - Use new macro IS_PS_TOKEN. - Changed function so that later PostScript definitions override - earlier ones. - (t1_init_loader): Initialize new field `keywords_encountered'. - (T1_Open_Face): Initialize new fields `ndv_idx', `cdv_idx', and - `len_buildchar'. - Remove `keywords_flags'. - - * src/type1/t1load.h (T1_LoaderRect): New field - `keywords_encountered'. - (T1_PRIVATE, T1_FONTDIR_AFTER_PRIVATE): New macros. - - * src/type1/t1tokens.h [!T1_CONFIG_OPTION_NO_MM_SUPPORT]: New - entries for parsing /NDV, /CDV, and /DesignVector. - -2006-07-07 Werner Lemberg - - Add many checks to protect against malformed PCF files. - - * src/pcf/pcfdrivr.c (PCF_Face_Done): Protect against NULL pointers. - (PCF_Face_Init): Add calls to PCF_Face_Done in case of errors. - - * src/pcf/pcfread.c (pcf_read_TOC): Protect against malformed table - data and check that tables don't overlap (using a simple - bubblesort). - (PCF_METRIC_SIZE, PCF_COMPRESSED_METRIC_SIZE, PCF_PROPERTY_SIZE): - New macros which give the size of data structures in the data - stream. - (pcf_get_properties): Use rough estimates to get array size limits. - Assign `face->nprops' and `face->properties' earlier so that a call - to PCF_Face_Done can do the clean-up in case of error. - Protect against invalid string offsets. - (pcf_get_metrics): Clean up code. - Adjust tracing message levels. - Use rough estimate to get array size limit. - (pcf_get_bitmaps): Clean up code. - Adjust tracing message levels. - Use rough estimates to get offset limits. - (pcf_get_encodings): Adjust tracing message level. - (pcf_get_accel): Clean up code. - -2006-06-26 Werner Lemberg - - * src/bdf/bdfdrivr.c (BDF_Face_Init): Handle fonts correctly which - don't have a POINT_SIZE property. This fixes Savannah bug #16914. - -2006-06-26 Jens Claudius - - * src/psaux/t1decode.c (T1_Operator, t1_args_count): Add opcode 15. - (t1_decoder_parse_charstrings): Operator with - opcode 15 pops its two arguments. - Handle the case where the pops of an othersubr may be part of a - subroutine. - Handle unknown othersubrs gracefully: count their operands and let - the following pop operators push the operands as the results onto - the Type1 stack. - Improve handling of setcurrentpoint opcode. - -2006-06-25 Jens Claudius - - The Type 1 parser now skips over top-level procedures as required - for a `Simplified Parser'. This makes the parser more robust as it - doesn't poke around in PostScript code. Additionally, it makes the - FontDirectory hackery in src/type1/t1load.c unnecessary. - - * src/psaux/psobjs.c (IS_OCTAL_DIGIT): New macro. - (skip_literal_string): Add FT_Error as return value. - Handle escapes better. - (skip_string): Add FT_Error as return value. - Don't set `parser->error' but return error code directly. - (skip_procedure): New function. - (ps_parser_skip_PS_token): Handle procedures. - Update code. - (ps_parser_to_token): Update code. - (ps_parser_load_field_table): Handle bbox entries also. - - * src/type1/t1load.c (parse_dict): Remove FontDirectory hackery. - Add commented-out code for synthetic fonts. - -2006-06-24 Eugeniy Meshcheryakov - - Fix two hinting bugs as reported in - http://lists.gnu.org/archive/html/freetype-devel/2006-06/msg00057.html. - - * include/freetype/internal/tttypes.h (TT_GlyphZoneRec): Add - `first_point' member. - - * src/truetype/ttgload.c (tt_prepare_zone): Initialize - `first_point'. - (TT_Process_Composite_Glyph): Always untouch points. - - * src/truetype/ttinterp.c (Ins_SHC): Fix computation of - `first_point' and `last_point' in case of composite glyphs. - (Ins_IUP): Fix computation of `end_point'. - -2006-06-22 suzuki toshiya - - Insert EndianS16_BtoN and EndianS32_BtoN as workaround for Intel - Mac. The original patch was written by David Sachitano and Lawrence - Coopet, and modified by Sean McBride for MPW compatibility. Only - required data are converted; unused data are left in big endian. - - * src/base/ftmac.c: Include for byteorder macros for non - Mac OS X platforms. - (OS_INLINE): Undefine before definition. - (count_faces_sfnt): Insert EndianS16_BtoN to parse the header of - FontAssociation table in FOND resource. - (count_faces_scalable): Insert EndianS16_BtoN to parse the header - and fontSize at each entry of FontAssociation table in FOND - resource. - (parse_fond): Insert EndianS16_BtoN and EndianS32_BtoN to parse - ffStylOff of FamilyRecord header of FOND resource, the header, - fontSize, fontID at each entry of FontAssociation table, and - StyleMapping table. - (count_faces): Call `HUnlock' after all FOND utilization. - -2006-06-08 suzuki toshiya - - Public API of TrueTypeGX, OpenType, and classic kern table validator - should return `FT_Err_Unimplemented_Feature' if validation service - is unavailable (disabled in `modules.cfg'). It is originally - suggested by David Turner, cf. - http://lists.gnu.org/archive/html/freetype-devel/2005-11/msg00078.html - - * src/base/ftgxval.c (FT_TrueTypeGX_Validate): Return - FT_Err_Unimplemented_Feature if TrueTypeGX validation service is - unavailable. - (FT_ClassicKern_Validate): Return FT_Err_Unimplemented_Feature if - classic kern table validation service is unavailable. - - * src/base/ftotval.c (FT_OpenType_Validate): Return - FT_Err_Unimplemented_Feature if OpenType validation service is - unavailable. - -2006-06-08 Werner Lemberg - - * src/bdf/bdflib.c (bdf_load_font): Fix memory leaks in case of - errors. - -2006-06-07 David Turner - - * src/type1/t1afm.c (KERN_INDEX): Make it more robust. - (T1_Read_Metrics): Fix memory leak which happened when the metrics - file doesn't have kerning pairs. This fixes Savannah bug #16768. - -2006-06-06 David Turner - - Fix memory leak described in Savannah bug #16759. - - We change `ps_unicodes_init' so that it also takes a - `free_glyph_name' callback to release the glyph names returned by - `get_glyph_name' - - * include/freetype/internal/services/svpscmap.h (PS_Glyph_NameFunc): - Renamed to ... - (PS_GetGlyphNameFunc): This. - (PS_FreeGlyphNameFunc): New typedef. - (PS_Unicodes_InitFunc): Add variable for PS_FreeGlyphNameFunc. - - * src/cff/cffcmap.c (cff_sid_to_glyph_name): Use `TT_Face' for first - argument. - (cff_sid_free_glyph_name): New function. +2010-03-12 suzuki toshiya + + Remove duplicated inclusion of `FT_OUTLINE_H' in ftobjs.c. + + * src/base/ftobjs.c: Remove 2nd inclusion of `FT_OUTLINE_H'. + +2010-03-11 Chris Liddell + + Fix Savannah bug #27442. + + * src/raster/ftraster.c (ft_black_reset): Fix `buffer_size'. + +2010-03-09 Werner Lemberg + + Remove unused variable. + Reported by Graham. + + * src/cff/cffparse.c (cff_parse_real): Remove `rest'. + +2010-03-02 John Tytgat + + Improve CFF string (especially glyphname) lookup performance. + + We do this by avoiding memory allocation and file I/O. This is + Savannah patch #7104. + + * src/cff/cfftypes.h: Include PS cmaps service and + FT_INTERNAL_POSTSCRIPT_HINTS_H. + (CFF_SubFontRec): Remove `num_local_subrs'. + (CFF_FontRec): Add `num_strings', `strings', and `string_pool' + fields. + Remove `string_index' and `num_global_subrs' fields. + Use real types instead of `void' for `pshinter' and `psnames' fields. + + * src/cff/cffload.c: Don't include PS cmaps service. + (cff_index_get_pointers): Add `pool' parameter which allows to + insert an extra NUL character for each String INDEX entry. + (cff_index_get_name): Make it a local function. + (cff_index_get_string): New function. + (cff_subfont_load): Updated. + (cff_font_load): Initialize `num_strings', `strings', and + `string_pool' fields in the `CFF_FontRec' structure. + (cff_index_get_sid_string): Use `cff_index_get_string' instead of + `cff_index_get_name'. + (cff_font_done): Updated. + + * src/cff/cffload.h: Don't include PS cmaps service. + (cff_index_get_string): Added. + (cff_index_get_sid_string): Updated. + + * src/cff/cffobjs.c: Don't include PS cmaps service and + FT_INTERNAL_POSTSCRIPT_HINTS_H. + (cff_size_get_globals_funcs, cff_slot_init): Updated. + (cff_face_init): Follow `cff_index_get_name', + `cff_index_get_string', and `cff_index_get_sid_string' changes. + + * src/cff/cffcmap.c (cff_sid_free_glyph_name): Removed. + (cff_sid_to_glyph_name): Use `cff_index_get_cid_string'. (cff_cmap_unicode_init): Updated. - * src/psaux/t1cmap.c (t1_cmap_unicode_init): Updated. + * src/cff/cffdrivr.c: Don't include PS cmap service. + (cff_get_glyph_name): Avoid unnecessary lookup for POSTSCRIPT_CMAPS + service. + (cff_get_glyph_name, cff_ps_get_font_info, cff_get_ros): Follow API + `cff_index_get_sid_string' change. + (cff_get_name_index): Use `cff_index_get_string' instead of + `cff_index_get_name'. - * src/psnames/psmodule.c (ps_unicodes_init): Add variable for - PS_FreeGlyphNameFunc and use it. + * src/cff/cffgload.c: Don't include FT_INTERNAL_POSTSCRIPT_HINTS_H. + (cff_decoder_init, cff_decoder_prepare): Updated. +2010-02-27 Werner Lemberg -2006-06-04 David Turner + Simplify code. + Suggested by Behdad. - * src/base/ftutil.c (ft_mem_qrealloc): Fix the function to accept - `item_size == 0' as well -- though this sounds weird, it can - theoretically happen. This fixes Savannah bug #16669. + * src/base/ftobjs.c (FT_Get_First_Char): Don't use a loop since we + call FT_Get_Next_Char anyway if necessary. - * src/pfr/pfrobjs.c (pfr_face_init): Fix the computation - of `face->num_glyphs' which missed the last glyph, due to - the offset-by-1 computation, since the PFR format doesn't - guarantee that glyph index 0 corresponds to the `missing - glyph. This fixes Savannah bug #16668. +2010-02-26 Behdad Esfahbod -2006-05-25 Werner Lemberg + Improve handling of invalid glyph indices in char->index functions. - * builds/unix/unix-cc.in (LINK_LIBRARY): Don't comment out - `-no-undefined'. Reported by Christian Biesinger. + * src/base/ftobjs.c (FT_Get_First_Char, FT_Get_Next_Char): Use a + loop. -2006-05-19 Brian Weed +2010-02-18 Chris Liddell - * builds/win32/visualc/freetype.dsp: Release libraries no longer - have debug information, and debug libraries use `C7 compatible' - debug info. + Fix Savannah bug #28905. -2006-05-19 suzuki toshiya + Initialize phantom points before calling the incremental interface + to update glyph metrics. - Apply patch by Derek Clegg to fix two memory leaks in the MacOS - resource fork handler. This fixes Savannah bug #16631. - - * src/base/ftobjs.c (load_face_in_embedded_rfork): Replace - `FT_Stream_Close' by `FT_Stream_Free' to fix memory leak. - - * src/base/ftrfrk.c (raccess_guess_linux_double_from_file_name): - Replace `FT_Stream_Close' by `FT_Stream_Free' to fix memory leak. - -2006-05-19 suzuki toshiya - - * build/unix/configure.raw: Add a fallback to disable Carbon - dependency, if configured with no options on Mac OS X. - -2006-05-19 suzuki toshiya - - * src/base/ftmac.c (open_face_from_buffer): Deallocate stream when - its content cannot be parsed as supported font. This fixes - the second part of Savannah bug #16590. - -2006-05-18 Werner Lemberg - - * src/truetype/ttgload.c (TT_Load_Composite_Glyph) - [FT_CONFIG_OPTION_BYTECODE_INTERPRETER]: Make it compilable again. - -2006-05-17 David Turner - - This is a major patch used to drastically improve the performance of - loading glyphs. This both speeds up loading the glyph vectors - themselves and the auto-fitter module. - - We now use inline assembler code with GCC to implement `FT_MulFix', - which is probably the most important function related to the - engine's performance. - - The resulting speed-up is about 25%. - - - * include/freetype/internal/tttypes.h (TT_LoaderRec): Add fields - `cursor' and `limit'. - - * src/autofit/afangles.c (af_corner_is_flat, af_corner_orientation): - New functions. - (AF_ATAN_BITS, af_arctan, af_angle_atan): Comment out. - [TEST]: Remove. - - * src/autofit/afcjk.c (AF_Script_UniRangeRec): Comment out test - code. - - * src/autofit/afhints.c (af_axis_hints_new_segment): Don't call - `FT_ZERO' - (af_direction_compute, af_glyph_hints_compute_inflections): Rewritten. - (af_glyph_hints_reload: Rewrite recognition of weak points. - - * src/autofit/aflatin.c (af_latin_hints_compute_segments): Move - constant values out of the loops. - - * src/autofit/aftypes.h: Updated. - - * src/base/ftcalc.c (FT_MulFix): Use inline assembler code. - - * src/base/ftoutln.c (FT_Outline_Get_Orientation): Use vector - product to get orientation. - - * src/gzip/ftgzip.c (ft_get_uncompressed_size): New function. - (FT_Stream_OpenGzip): Use it to handle small files directly in - memory. - - * src/psaux/psconv.c (PS_Conv_ASCIIHexDecode, PS_ConvEexecDecode): - Improve performance. - - * src/truetype/ttgload.c (TT_Access_Glyph_Frame): Set `cursor' and - `limit'. - - (TT_Load_Glyph_Header, TT_Load_Simple_Glyph, - TT_Load_Composite_Glyph): Updated. Add threshold to protect against - exceedingly large values of number of contours. Speed up by - reducing the number of loops. - - * src/type1/t1gload.c (T1_Load_Glyph): Don't apply unit matrix. - - - * src/cache/ftccmap.c (FTC_CMapCache_Lookup): Change the threshold - used to detect rogue clients from 4 to 16. This is to prevent some - segmentation faults with fonts like `KozMinProVI-Regular.otf' which - comes from the Japanese Adobe Reader Asian Font pack. - -2007-05-17 Werner Lemberg - - * src/cff/cffload.c (cff_font_done): Deallocate subfont array. This - fixes the first part of Savannah bug #16590. - -2006-05-16 Werner Lemberg - - * docs/PROBLEMS: Updated icl issues. + * src/truetype/ttgload.c (tt_get_metrics_incr_overrides) + [FT_CONFIG_OPTION_INCREMENTAL]: New function, split off from... + (tt_get_metrics): This. + Updated. + (load_truetype_glyph): Use tt_get_metrics_incr_overrides. ---------------------------------------------------------------------------- -Copyright 2006, 2007, 2008, 2009, 2010 by +Copyright 2010 by David Turner, Robert Wilhelm, and Werner Lemberg. This file is part of the FreeType project, and may only be used, modified, diff --git a/reactos/lib/3rdparty/freetype/ChangeLog.23 b/reactos/lib/3rdparty/freetype/ChangeLog.23 new file mode 100644 index 00000000000..ecbf69af105 --- /dev/null +++ b/reactos/lib/3rdparty/freetype/ChangeLog.23 @@ -0,0 +1,15896 @@ +2010-02-13 Werner Lemberg + + * Version 2.3.12 released. + ========================== + + + Tag sources with `VER-2-3-12'. + + * docs/CHANGES: Updated. + + * docs/VERSION.DLL: Update documentation and bump version number to + 2.3.12. + + * README, Jamfile (RefDoc), + builds/win32/vc2005/freetype.vcproj, builds/win32/vc2005/index.html, + builds/win32/vc2008/freetype.vcproj, builds/win32/vc2008/index.html, + builds/win32/visualc/freetype.dsp, + builds/win32/visualc/freetype.vcproj, + builds/win32/visualc/index.html, builds/win32/visualce/freetype.dsp, + builds/win32/visualce/freetype.vcproj, + builds/win32/visualce/index.html, + builds/wince/vc2005-ce/freetype.vcproj, + builds/wince/vc2005-ce/index.html, + builds/wince/vc2008-ce/freetype.vcproj, + builds/wince/vc2008-ce/index.html: s/2.3.11/2.3.12/, s/2311/2312/. + + * include/freetype/freetype.h (FREETYPE_PATCH): Set to 12. + + * builds/unix/configure.raw (version_info): Set to 10:0:4. + +2010-02-12 suzuki toshiya + + Improve autotool version checking to work with beta releases. + + * autogen.sh (check_tool_version): Improve the extraction of version + number from "tool --version" output. Some beta releases of + autotools have extra strings before version number. + +2010-02-12 suzuki toshiya + + Fix overallocating bug in FT_Outline_New_Internal(). + + * src/base/ftoutln.c (FT_Outline_New_Internal): The length of + FT_Outline->points[] should be numPoints, not 2 * numPoints. + Found by Paul Messmer, see + http://lists.gnu.org/archive/html/freetype-devel/2010-02/msg00003.html + +2010-02-10 Ken Sharp + + Really fix Savannah bug #28678 (part 2). + + Since we consider `sbw' for the horizontal direction only, we still have + to synthesize vertical metrics if the user wants to use the vertical + writing direction. + + * src/cff/cffgload.c (cff_slot_load), src/cid/cidgload.c + (cid_slot_load_glyph), src/type1/t1gload.c (T1_Load_Glyph): + Synthesize vertical metrics (only) if FT_LOAD_VERTICAL_LAYOUT is + set. + +2010-02-10 Ken Sharp + + Really fix Savannah bug #28678 (part 1). + + After long discussion, we now consider the character width vector + (wx,wy) returned by the `sbw' Type 1 operator as being part of *one* + direction only. For example, if you are using the horizontal + writing direction, you get the horizontal and vertical components of + the advance width for this direction. Note that OpenType and CFF fonts + don't have such a vertical component; instead, the GPOS table can be + used to generate two-dimensional advance widths (but this isn't + handled by FreeType). + + * include/freetype/ftincrem.h (FT_Incremental_MetricsRec): Add + `advance_v' field to hold the vertical component of the advance + value. + + * src/truetype/ttgload.c (tt_get_metrics), src/cff/cffgload.c + (cff_slot_load), src/type1/t1gload.c + (T1_Parse_Glyph_And_Get_Char_String), src/cid/cidgload.c + (cid_load_glyph): Use it. + +2010-02-08 Werner Lemberg + + * devel/ftoption.h [FT_CONFIG_OPTION_PIC]: Define. + +2010-02-04 suzuki toshiya + + Prevent NULL pointer dereference passed to FT_Module_Requester. + + * src/sfnt/sfdriver.c (sfnt_get_interface): Don't use `module'. + * src/psnames/psmodule.c (psnames_get_interface): Ditto. + + * src/cff/cffdrivr.c (cff_get_interface): Check NULL `driver'. + * src/truetype/ttdriver.c (tt_get_interface): Ditto. + +2010-01-29 suzuki toshiya + + Fix memory leaks in previous patch. + + * src/sfnt/sfobjs.c (sfnt_load_face): Don't overwrite the strings + allocated for face->root.family_name and style_name. + +2010-01-29 suzuki toshiya + + New parameters for FT_Open_Face() to ignore preferred family names. + + Preferred family names should be used for legacy systems that + can hold only a few faces (<= 4) for a family name. Suggested by + Andreas Heinrich. + http://lists.gnu.org/archive/html/freetype/2010-01/msg00001.html + + * include/freetype/ftsnames.h (FT_PARAM_TAG_IGNORE_PREFERRED_FAMILY, + FT_PARAM_TAG_IGNORE_PREFERRED_SUBFAMILY): Define. + + * src/sfnt/sfobjs.c (sfnt_load_face): Check the arguments and + ignore preferred family and subfamily names if requested. + +2010-01-27 Ken Sharp + + Fix Savannah bug #28678. + + * src/cff/cffgload.c (cff_slot_load), src/cid/cidgload.c + (cid_load_glyph): Handle vertical metrics correctly. + + * src/type1/t1gload.c (T1_Parse_Glyph_And_Get_Char_String): Handle + vertical metrics correctly. + (T1_Load_Glyph): Don't synthesize vertical metrics. + +2010-01-14 Werner Lemberg + + Make FT_Set_Transform work if no renderer is available. + + * src/base/ftobjs.c (FT_Load_Glyph): Apply `standard' transformation + if no renderer is compiled into the library. + +2010-01-14 Werner Lemberg + + Fix compilation warning. + + * src/base/ftbase.h: s/LOCAL_DEF/LOCAL/. + * src/base/ftobjc.s: Include ftbase.h conditionally. + +2010-01-11 Kwang Yul Seo + + Provide inline assembly code for RVCT compiler. + This is Savannah patch #7059. + + * include/freetype/config/ftconfig.h (FT_MULFIX_ASSEMBLER, + FT_MulFix_arm) [__CC_ARM || __ARM_CC]: Define. + +2010-01-08 Ken Sharp + + Fix Savannah bug #28521. + + Issue #28226 involved a work-around for a font which used the + `setcurrentpoint' operator in an invalid way; this operator is only + supposed to be used with the result of OtherSubrs, and the font used + it directly. The supplied patch removed the block of code which + checked this usage entirely. + + This turns out to be a Bad Thing. If `setcurrentpoint' is being + used correctly it should reset the flex flag in the decoder. If we + don't do this then the flag never gets reset and we omit any further + contours from the glyph (at least until we close the path or + similar). + + * src/psaux/t1decode.c (t1_decoder_parse_charstrings) + : Handle `flex_state' correctly. + +2010-01-05 Werner Lemberg + + Apply reports from clang static analyzer. + + * src/lzw/ftlzw.c (ft_lzw_file_init), src/base/ftstroke.c + (FT_Stroker_ParseOutline), src/base/ftsynth.c + (FT_GlyphSlot_Embolden): Remove dead code. + + * src/base/ftpatent.c (_tt_check_patents_in_table): Initialize + `offset_i' and `length_i'. + +2010-01-05 Ralph Giles + + Enable the incremental font interface by default. + + Ghostscript requires the incremental font interface for handling + some Postscript documents. It is moving to using FreeType as its + primary renderer; supporting this in the default build makes it + Ghostscript to be linked against the system FreeType when one is + available. + + * include/freetype/config/ftoption.h (FT_CONFIG_OPTION_INCREMENTAL): + Uncomment. + +2010-01-05 Werner Lemberg + + Fix Savannah bug #28395. + + * src/truetype/ttdriver.c (Load_Glyph), src/type1/t1gload.c + (T1_Loada_Glyph): Don't check `num_glyphs' if incremental interface + is used. + +2010-01-05 Ken Sharp + + Make Type 1 `seac' operator work with incremental interface. + This fixes Savannah bug #28480. + + * src/psaux/t1decode.c (t1operator_seac): Don't check `glyph_names' + if incremental interface is used. + +2010-01-04 Ken Sharp + + Make incremental interface work with TrueType fonts. + This fixes Savannah bug #28478. + + * src/truetype/ttgload.c (load_truetype_glyph): Don't check + `glyf_offset' if incremental interface is used. + +2009-12-31 Lars Abrahamsson + + Make compilation with FT_CONFIG_OPTION_PIC work again. + + * src/base/ftglyph.c (FT_Glyph_To_Bitmap) [FT_CONFIG_OPTION_PIC]: + Declare `library' for FT_BITMAP_GLYPH_CLASS_GET. + + * src/base/ftinit.c (ft_destroy_default_module_classes, + ft_create_default_module_classes): Use proper casts (needed for C++ + compilation). + + * src/sfnt/ttcmap.c (tt_cmap13_class_rec): Use FT_DEFINE_TT_CMAP. + +2009-12-22 Marc Kleine-Budde + + Make freetype-config aware of $SYSROOT. + This is Savannah patch #7040. + + * builds/unix/freetype-config.in: Decorate with ${SYSROOT} where + appropriate. + +2009-12-20 Werner Lemberg + + Fix compiler warning. + Reported by Sean. + + * src/base/ftdbgmem.c [!FT_DEBUG_MEMORY]: ANSI C doesn't like empty + source files; however, some compilers warn about an unused variable + declaration. This is now replaced with a typedef. + +2009-12-18 Werner Lemberg + + Fix Savannah bug #28320. + + There exist corrupt, subsetted fonts (embedded in PDF files) which + contain a private dict that ends with an unterminated floating point + number (no operator following). We now ignore this error (as + acrobat does). + + * src/cff/cffparse.c (cff_parser_run): Don't emit a syntax error for + unterminated floating point numbers. + +2009-12-16 Werner Lemberg + + Really fix compiler warnings. + Reported by Sean. + + * src/truetype/ttgxvar.c (GX_PT_POINTS_ARE_WORDS, + GX_PT_POINT_RUN_COUNT_MASK): Convert enum values to macros. + +2009-12-16 suzuki toshiya + + Improve configure.raw to copy some options from CFLAGS to LDFLAGS. + The linker of Mac OS X 10.6 is sensitive to the architecture. If + the architectures are specified explicitly for the C compiler, the + linker requires the architecture specifications too. + + * builds/unix/configure.raw: Replace `-isysroot' option parser by + more generic argument parser. + +2009-12-15 Werner Lemberg + + Fix compiler warnings. + Reported by Sean. + + * src/truetype/ttgxvar.c (ft_var_readpackeddeltas): Fix counter data + type. + +2009-12-14 Ken Sharp + + Ignore invalid `setcurrentpoint' operations in Type 1 fonts. + This fixes Savannah bug #28226. + + At least two wild PostScript files of unknown provenance contain + Type 1 fonts, apparently converted from TrueType fonts in earlier + PDF versions of the files, which use the `setcurrentpoint' operator + inappropriately. + + FreeType currently throws an error in this case, but Ghostscript and + Adobe Distiller both accept the fonts and ignore the problem. This + commit #ifdefs out the check so PostScript interpreters using + FreeType can render these files. + + The specification says `setcurrentpoint' should only be used to set + the point after a `Subr' call, but these fonts use it to set the + initial point to (0,0). Unnecessarily so, as they correctly use an + `hsbw' operation which implicitly sets the initial point. + + * src/psaux/t1decode.c (t1_decoder_parse_charstrings) + : Comment out code. + +2009-12-14 Bram Tassyns + + Fix parsing of /CIDFontVersion. + This fixes Savannah bug #28287. + + * src/cid/cidtoken.h: `cid_version' in CID_FaceInfoRec (in + t1tables.h) is of type FT_Fixed. + +2009-12-14 Werner Lemberg + + Trace glyph index in CID module. + Suggested in Savannah patch #7023. + + * src/cid/cidgload.c (cid_load_glyph): Add tracing message. + +2009-12-03 Werner Lemberg + + Fix compiler warnings. + + * src/truetype/ttgload.c (tt_get_metrics): Put `Exit' label into the + proper preprocessor conditional. + * src/pfr/pfrobjs.c (pfr_slot_load): Pacify gcc. + +2009-11-25 John Tytgat + + Better handling of start of `eexec' section. + This fixes Savannah bug #28090. + + * src/type1/t1parse.c (T1_Get_Private_Dict): Skip all whitespace + characters before start of `eexec' section. + +2009-11-20 Werner Lemberg + + Fix Savannah bug #27742. + + * src/base/ftstroke.c (ft_stroker_outside): Avoid silent division by + zero, using a threshold for `theta'. + +2009-11-20 Werner Lemberg + + Fix Savannah bug #28036. + + * src/type1/t1afm.c (t1_get_index): Fix comparison. + +2009-11-16 Werner Lemberg + + Fix compiler warnings. + Reported by Kevin Blenkinsopp . + + * src/sfnt/ttload.c (check_table_dir): Use proper data type. + +2009-11-15 Werner Lemberg + + Really fix FreeDesktop bug #21197. + This also fixes Savannah bug #28021. + + * src/autofit/aflatin.c (af_latin_metrics_check_digits), + src/autofit/aflatin2.c (af_latin2_metrics_check_digits): Fix loop. + +2009-11-15 Werner Lemberg + + Add tracing messages for advance values. + + * src/base/ftobjs.c (FT_Load_Glyph), src/truetype/ttgload.c + (TT_Get_HMetrics, TT_Get_VMetrics): Do it. + +2009-11-08 Werner Lemberg + + Fix compiler warning. + Reported by Jeremy Manson . + + * src/truetype/ttgload.c (load_truetype_glyph): Initialize `error'. + +2009-11-04 Werner Lemberg + + Remove compiler warning. + Reported by Sean McBride . + + * src/tools/apinames.c (read_header_file): Use a cast to + `int', as specified in the printf(3) man page. + +2009-11-04 Werner Lemberg + + Fix Savannah bug #27921. + + * src/cff/cffobjs.c (cff_face_init), src/cid/cidobjs.c + (cid_face_init), src/type1/t1afm.c (T1_Read_Metrics), + src/type1/t1objs.c (T1_Face_Init): Don't use unsigned constant + values for rounding if the argument can be negative. + +2009-11-03 Bram Tassyns + + Add basic support for Type1 charstrings in CFF. + This fixes Savannah bug #27922. + + * src/cff/cffgload.c (CFF_Operator, cff_argument_counts): Handle + `seac', `sbw', and `setcurrentpoint' opcodes. + (cff_compute_bias): Add parameter to indicate the charstring type. + Update all callers. + (cff_operator_seac): Add parameter for side bearing. + (cff_decoder_parse_charstrings): Updated for more Type1 support. + +2009-11-03 Werner Lemberg + + Return correct `linearHoriAdvance' value for embedded TT bitmaps too. + Reported by Jeremy Manson . + + src/truetype/ttgload.c (load_truetype_glyph): Add parameter to + quickly load the glyph header only. + Update all callers. + (tt_loader_init): Add parameter to quickly load the `glyf' table + only. + Update all callers. + (TT_Load_Glyph): Compute linear advance values for embedded bitmap + glyphs too. + +2009-11-03 Werner Lemberg + + Improve code readability. + + * src/ttgload.c (load_truetype_glyph): Move metrics calculation + to... + (tt_get_metrics): This new function. + +2009-10-26 Bram Tassyns + + Fix Savannah bug #27811. + + * src/truetype/ttxgvar.c (ft_var_readpackeddeltas): Fix + signed/unsigned mismatch. + +2009-10-19 Ning Dong + + Fix handling of `get' and `put' CFF instructions. + + * src/cff/cffgload.c (cff_decoder_parse_charstrings) : Appendix B of Adobe Technote #5177 limits the number of + elements for the `get' and `put' operators to 32. + * src/cff/cffgload.h (CFF_MAX_TRANS_ELEMENTS): Define. + (CFF_Decoder): Use it for `buildchar' and remove `len_buildchar'. + +2009-10-18 Werner Lemberg + + Fix handling of `dup' CFF instruction. + Problem and solution reported by Ning Dong . + + * src/cff/cffgload.c (cff_decoder_parse_charstrings) : + Increase `args' by 2, not 1. + +2009-10-10 Werner Lemberg + + * Version 2.3.11 released. + ========================== + + + Tag sources with `VER-2-3-11'. + + * docs/VERSION.DLL: Update documentation and bump version number to + 2.3.11. + + * README, Jamfile (RefDoc), builds/win32/visualc/index.html, + builds/win32/visualc/freetype.dsp, + builds/win32/visualc/freetype.vcproj, + builds/win32/visualce/index.html, + builds/win32/visualce/freetype.dsp, + builds/win32/visualce/freetype.vcproj: s/2.3.10/2.3.11/, s/2310/2311/. + + * include/freetype/freetype.h (FREETYPE_PATCH): Set to 11. + + * builds/unix/configure.raw (version_info): Set to 9:22:3. + +2009-10-10 Werner Lemberg + + * docs/CHANGES, docs/release: Updated. + +2009-10-10 suzuki toshiya + + * src/pcf/pcfread.c (pcf_get_properties): Fix a bug in the nprops + truncation. Reported by Martin von Gagern and Peter Volkov. + https://bugs.gentoo.org/288357 and https://bugs.gentoo.org/288256 + +2009-10-06 Werner Lemberg + + * Version 2.3.10 released. + ========================== + + + Tag sources with `VER-2-3-10'. + + * builds/toplevel.mk (major, minor, patch): Fix regexp to allow more + than a single digit. + (dist): We now use git. + + * docs/VERSION.DLL: Update documentation and bump version number to + 2.3.10. + + * README, Jamfile (RefDoc), builds/win32/visualc/index.html, + builds/win32/visualc/freetype.dsp, + builds/win32/visualc/freetype.vcproj, + builds/win32/visualce/index.html, + builds/win32/visualce/freetype.dsp, + builds/win32/visualce/freetype.vcproj: s/2.3.9/2.3.10/, s/239/2310/. + + * include/freetype/freetype.h (FREETYPE_PATCH): Set to 10. + + * builds/unix/configure.raw (version_info): Set to 9:21:3. + +2009-10-06 Werner Lemberg + + Fix `make multi'. + + * src/cache/ftccache.c, src/cache/ftcsbits.c (FT_COMPONENT): Define. + + * src/sfnt/sfdriver.c: Include FT_INTERNAL_DEBUG_H. + +2009-09-27 suzuki toshiya + + [cache] Fix Savannah bug #27441, clean up Redhat bugzilla #513582. + Tricky casts in FTC_{CACHE,GCACHE,MRULIST}_LOOKUP_CMP() are removed. + Now these functions should be called with FTC_Node or FTC_MruNode + variable, and the caller should cast them to appropriate pointers to + concrete data. These tricky casts can GCC-4.4 optimizer (-O2) + confused and the crashing binaries are generated. + + * src/cache/ftcmru.h (FTC_MRULIST_LOOKUP_CMP): Drop tricky cast. + Now the 4th argument `node' of this function should be typed as + FTC_MruNode. + + * src/cache/ftcglyph.h (FTC_GCACHE_LOOKUP_CMP): For inline + implementation, new temporal variable FTC_MruNode `_mrunode' to take + the pointer from FTC_MRULIST_LOOKUP_CMP(). For non-inline + implementation, tricky cast is dropped. + + * src/cache/ftcmanag.c (FTC_SIZE_NODE): New macro casting + to FTC_SizeNode. + (FTC_Manager_LookupSize): Replace FTC_SizeNode `node' by FTC_MruNode + `mrunode', and FTC_SIZE_NODE() is inserted. + (FTC_FACE_NODE): New macro casting to FTC_FaceNode. + (FTC_Manager_LookupFace) Replace FTC_FaceNode `node' by FTC_MruNode + `mrunode', and FTC_FACE_NODE() is inserted. + + * src/cache/ftcbasic.c (FTC_ImageCache_Lookup): Change the type of + `node' from FTC_INode to FTC_Node. Extra casting macro FTC_NODE() + is dropped. + (FTC_ImageCache_LookupScaler): Ditto. + (FTC_SBitCache_Lookup): Change the type of `node' from FTC_SNode to + FTC_Node. Extra casting macro FTC_NODE() is dropped. FTC_SNODE() + is inserted. + (FTC_SBitCache_LookupScaler): Ditto. + + * src/cache/ftccmap.c (FTC_CMapCache_Lookup): Change the type of + `node' from FTC_CMapNode to FTC_Node. Extra casting macro + FTC_NODE() is dropped, FTC_CMAP_NODE() is inserted. + +2009-09-25 suzuki toshiya + + [cache, psaux, type1] Fix for multi build. + In multi build, some cpp functions are left as unresolved symbols. + + * src/cache/ftcbasic.c: Include FT_INTERNAL_DEBUG_H for FT_TRACE1(). + + * src/psaux/t1decode.c: Include FT_INTERNAL_CALC_H for + FIXED_TO_INT(). + * src/type1/t1gload.c: Ditto. + * src/type1/t1objs.c: Ditto. + +2009-09-25 suzuki toshiya + + [autofit] Fix for multi build. + + * src/autofit/afmodule.h: Include FT_INTERNAL_OBJECTS_H to use + FT_DECLARE_MODULE() macro in multi build. + + * src/autofit/aflatin.c: Include to handle + FT_ADVANCES_H correctly in multi build. + +2009-09-24 suzuki toshiya + + [cache] Check the face filled by FTC_Manager_LookupFace(). + + * src/cache/ftcbasic.c (ftc_basic_family_get_count): Return + immediately if FTC_Manager_LookupFace() fills face by NULL. Such + case can occur when the code is optimized by GCC-4.2.x. + +2009-09-23 Werner Lemberg + + * docs/CHANGES: Updated. + +2009-09-12 Werner Lemberg + + [raster] Fix 5-levels grayscale output. + This was broken since version 2.3.0. + + * src/raster/ftraster.c (count_table): Use pre-2.3.0 values (which + were then computed dynamically). + (Vertical_Gray_Sweep_Step): Updated. + + (ft_black_render): Initialize `worker->gray_lines' (problem found by + valgrind). + + (FT_RASTER_OPTION_ANTI_ALIASING, DEBUG_RASTER): Dont' #undef, just + comment out. + +2009-09-12 suzuki toshiya + + Improve configure.raw for cross build. + + * builds/unix/configure.raw: Remove temporal files created by the + suffix checking for CC_BUILD. Set XX_ANSIFLAGS and XX_CFLAGS when + cross compiler is GCC. AC_PROG_CC checks whether the cross compiler + is GCC, its result is stored in GCC. + +2009-09-12 suzuki toshiya + + [BDF] Modify hash API to take size_t value instead of void *. + + The hash API in BDF driver is designed to be generic, it takes + void * typed data. But BDF driver always gives an unsigned long + integer (the index to a property). To reduce non-essential + casts from unsigned long to void* and from void* to unsigned + long, the hash API is changed to take size_t integer. + The issue of incompatible cast between unsigned long and void* + on LLP64 platform is reported by NightStrike from MinGW-Win64 + project. See + http://lists.gnu.org/archive/html/freetype/2009-09/msg00000.html + + * src/bdf/bdf.h: The type of hashnode->data is changed from + void* to size_t. + + * src/bdf/bdflib.c (hash_insert): Get size_t data, instead of + void* data. + (bdf_create_property): Get the name length of new property by + size_t variable, with a cut-off at FT_ULONG_MAX. + (_bdf_set_default_spacing): Get the name length of the face by + size_t variable, with a cut-off at 256. + (bdf_get_property): Get the property id by size_t variable to + reduce the casts between 32-bit prop ID & hashnode->data during + simple copying. + (_bdf_add_property): Ditto. + (_bdf_parse_start): Calculate the index to the property array + by size_t variable. + (bdf_get_font_property): Drop a cast to unsigned long. + +2009-09-10 suzuki toshiya + + [Win64] Improve the computation of random seed from stack address. + + On LLP64 platform, the conversion from pointer to FT_Fixed need + to drop higher 32-bit. Explict casts are required. Reported by + NightStrike from MinGW-w64 project. See + http://lists.gnu.org/archive/html/freetype/2009-09/msg00000.html + + * src/cff/cffgload.c: Convert the pointers to FT_Fixed explicitly. + + * src/psaux/t1decode.c: Ditto. + + +2009-09-03 Werner Lemberg + + [raster] Improvements for stand-alone mode. + + * src/raster/rules.mk: Don't handle ftmisc.h. It is needed for + stand-alone mode only. + + * src/raster/ftmisc.h (FT_MemoryRec , FT_Alloc_Func, FT_Free_Func, + FT_Realloc_Func): Copy declarations from ftsystem.h. + +2009-09-02 Bram Tassyns + + Improve vertical metrics calculation (Savannah bug #27364). + + The calculation of `vertBearingX' is not defined in the OTF font + spec so FreeType does a `best effort' attempt. However, this value + is defined in the PDF and PostScript specs, and that algorithm is + better than the one FreeType currently uses: + + FreeType: Use the middle of the bounding box as the X coordinate + of the vertical origin. + + Adobe PDF spec: Use the middle of the horizontal advance vector as + the X coordinate of the vertical origin. + + FreeType's algorithm goes wrong if you have a really small glyph + (like the full-width, circle-like dot at the end of the sentence, as + used in CJK scripts) with large bearings. With the FreeType + algorithm this dot gets centered on the baseline; with the PDF + algorithm it gets the correct location (in the top right). Note + that this is a serious issue, it's like printing the dot at the end + of a Roman sentence at the center of the textline instead of on the + baseline like it should. So i believe the PDF spec's algorithm + should be used in FreeType as well. + + The `vertBearingY' value for such small glyphs is also very strange + if no `vmtx' information is present, since the height of the bbox is + not representable for the height of the glyph visually (the + whitespace up to the baseline is part of the glyph). The fix also + includes some code for a better estimate of `vertBearingY'. + + * src/base/ftobjs.c (ft_synthesize_vertical_metrics): `vertBearingX' + is now calculated as described by the Adobe PDF Spec. Estimate for + `vertBearingY' now works better for small glyphs completely above or + below the baseline into account. + + * src/cff/cffgload.c (cff_slot_load): `vertBearingX' is now + calculated as described by the Adobe PDF Spec. Vertical metrics + information was always ignored when FT_CONFIG_OPTION_OLD_INTERNALS + was not defined. + + * src/truetype/ttgload.c (compute_glyph_metrics): `vertBearingX' is + now calculated as described by the Adobe PDF Spec. + +2009-09-01 John Tytgat + + Fix custom cmap for empty Type 1 font (Savannah bug #27294). + + * include/freetype/internal/t1types.h (T1_EncodingRecRec_): Update + comment to reflect revised code_last meaning. + * src/type1/t1load.c (T1_Open_Face), src/type42/t42objs.c + (T42_Open_Face): Assign max_char as highest character code + 1 and + use this for T1_EncodingRecRec_::code_last. + * src/psaux/t1cmap.c (t1_cmap_custom_init): Follow revised + T1_EncodingRecRec_::code_last meaning. + +2009-08-25 Werner Lemberg + + Fix rendering of horizontally compressed CFFs. + Bug reported by Ivan Nincic . + + * src/cff/cffgload.c (cff_slot_load): Thinko: Check `xx' element of + `font_matrix' also. + + * docs/CHANGES: Updated. + +2009-08-03 suyu0925@gmail.com + + Don't call `ft_fseek' every time when executing `ft_fread'. + + * src/base/ftstream.c (FT_Stream_Seek), src/base/ftsystem.c + (ft_ansi_stream_io): Implement it. + +2009-07-31 suzuki toshiya + + sfnt: Cast a charcode to 32-bit in cmap format 14 parser. + + * src/sfnt/ttcmap.c (tt_cmap14_char_var_index, + tt_cmap14_char_var_isdefault, tt_cmap14_char_variants, + tt_cmap14_variant_chars): Correct mismatches from + FT_CMap_CharVarIndexFunc prototype, FT_ULong arguments + are replaced by FT_UInt32 arguments. + +2009-07-31 suzuki toshiya + + sfnt: Cast a charcode to 32-bit in cmap format 12 parser. + + * src/sfnt/ttcmap.c (tt_cmap12_char_next): + Insert explicit cast from FT_UFast to FT_UInt32 + for return value. + +2009-07-31 suzuki toshiya + + psaux: Fix a few casts to FT_Int32 value. + + * src/psaux/t1decode.c (t1_decoder_parse_charstrings): + Fix a few casts setting `value' from FT_Long to FT_Int32, + because `value' is typed as FT_Int32 since 2009-06-22. + +2009-07-31 suzuki toshiya + + sfnt: Fix a data type mismatching with its source. + + * src/sfnt/ttcmap.c (tt_cmap13_char_next): Fix the + type of `gindex' from FT_ULong to FT_UInt because + it is set by FT_UInt tt_cmap13_char_map_binary() or + TT_CMap13->cur_gindex. + +2009-07-31 suzuki toshiya + + sfnt: Extend a few local variables to load 32-bit values. + + * src/sfnt/ttkern.c (tt_face_load_kern): Extend `count' + and `kern' to load 32-bit values. + +2009-07-31 suzuki toshiya + + pfr: Extend `num_aux' to take 32-bit value. + + * src/pfr/pfrload.c (pfr_phy_font_load): Extend + `num_aux' to load 32-bit value. + +2009-07-31 suzuki toshiya + + pcf: Truncate FT_ULong `nprops' to fit to int PCF_Face->nprops. + + * src/pcf/pcfread.c (pcf_get_properties): Load `nprops' + as FT_ULong value from PCF file, but truncate it as + int to fit PCF_Face->nprops. The number of truncated + properties is shown in the trace message. + +2009-07-31 suzuki toshiya + + gxvalid: Extend a few local variables to reduce the casts. + + * src/gxvalid/gxvmorx.c (gxv_morx_subtables_validate): + Extend `type' and `rest' to take FT_ULong values. + +2009-07-31 suzuki toshiya + + gxvalid: Extend `settingTable' to take 32-bit offset. + + * src/gxvalid/gxvfeat.c (gxv_feat_name_validate): + Extend `settingTable' to take 32-bit offset. + +2009-07-31 suzuki toshiya + + autofit: Cast FT_Long glyph_count to compare with FT_UInt GID. + + * src/autofit/afglobal.c (af_face_globals_is_digit, + af_face_globals_compute_script_coverage): Cast FT_Long + globals->glyph_count to FT_ULong, to compare with FT_UInt + gindex. + +2009-07-31 suzuki toshiya + + smooth: Exclude 16-bit system in invalid pitch/height check. + + * src/smooth/ftsmooth.c (ft_smooth_render_generic): + pitch and height are typed as FT_UInt but checked to fit + 16-bit range, to avoid the overflows. On 16-bit system, + this checking inserts a conditional that never occurs. + +2009-07-03 suzuki toshiya + + cff: Type large constants > 0x7FFF as long for 16-bit systems. + + * src/cff/cffload.c (cff_charset_load): Type large + constants > 0x7FFF as long, because normal constants + are typed signed integer that is less than 0x8000 on + 16-bit systems. + +2009-07-31 suzuki toshiya + + base: Remove an unused variable. + + * src/base/ftglyph.c (FT_Glyph_To_Bitmap): Remove an + unused variable `library'. glyph->library is used. + +2009-07-31 suzuki toshiya + + cache: Check higher bits in flags for non ILP32 systems. + + 4 public functions ought to take FT_ULong flags, but take + FT_UInt flags. To keep binary compatibility, we drop higher + bits on non ILP32 platforms, + ILP64 systems: No drop occurs. + LP64 systems: Higher bits are not used. + 16-bit systems: Drop can occur. + See + http://lists.gnu.org/archive/html/freetype-devel/2008-12/msg00065.html + These functions will be refined to take FT_ULong flags in + next bump with incompatible API change. + + * src/cache/ftcbasic.c (FTC_ImageCache_Lookup): + Check `flags' in `type', the 2nd argument. + (FTC_SBitCache_Lookup): Ditto. + (FTC_ImageCache_LookupScaler): Check `load_flags', + the 3rd argument. + (FTC_SBitCache_LookupScaler): Ditto. + +2009-07-31 suzuki toshiya + + sfnt: Ignore invalid GIDs in glyph name lookup. + + * include/freetype/internal/fttrace.h: + New trace module for sfdriver.c is added. + + * src/sfnt/sfdriver.c (sfnt_get_name_index): + Restrict glyph name lookup to FT_UInt GID. + Genuine TrueType can hold 16-bit glyphs. + +2009-07-31 suzuki toshiya + + pcf: Fix a comparison between FT_Long and FT_ULong. + + * src/pcf/pcfread.c (pcf_get_bitmaps): Return an error + if PCF_Face->nemetrics is negative. + +2009-07-31 suzuki toshiya + + gxvalid: Guarantee `nFeatureFlags' size up to 32-bit. + + * src/gxvalid/gxvmort.c (gxv_mort_featurearray_validate): + Extend the 3rd argument `nFeatureFlags' to FT_ULong. + * src/gxvalid/gxvmort.h: Ditto. + +2009-07-31 suzuki toshiya + + sfnt: Insert explicit cast for LP64 system. + + * src/sfnt/ttkern.c (tt_face_load_kern): Insert + cast from unsigned long to FT_UInt32. + +2009-07-31 suzuki toshiya + + gxvalid: Guarantee `just' table size upto 32-bit. + + * src/gxvalid/gxvjust.c (gxv_just_validate): + The type of `offset' is changed from FT_UInt to + FT_Offset, for 16-bit platforms. + +2009-07-31 suzuki toshiya + + gxvalid: Guarantee `trak' table size upto 32-bit. + + * src/gxvalid/gxvtrak.c (gxv_trak_validate): + The type of `offset' is changed from FT_UInt to + FT_Offset, for 16-bit platforms. + +2009-07-31 suzuki toshiya + + type1: Fix a data type mismatching with its source. + + * include/freetype/internal/t1types.h: The type of + T1_Face->buildchar is matched with T1_Decorder->top. + +2009-07-31 suzuki toshiya + + pfr: Fix a data type mismatching with its source. + + * src/pfr/pfrtypes.h: The type of PFR_KernItem->offset + is extended from FT_UInt32 to FT_Offset, because it is + calculated with the pointer difference, in + pfr_extra_item_load_kerning_pairs(). + +2009-07-31 suzuki toshiya + + pfr: Fix a data type mismatching with its source. + + * src/pfr/pfrtypes.h: The type of PFR_PhysFont->chars_offset + is extended from FT_UInt32 to FT_Offset, because it is + calculated with the pointer difference in pfr_phy_font_load(). + +2009-07-31 suzuki toshiya + + pfr: Fix a data type mismatching with its source. + + * src/pfr/pfrtypes.h: The type of PFR_PhyFont->bct_offset + is extended from FT_UInt32 to FT_Long, because it is + loaded by FT_STREAM_POS() in pfr_phy_font_load(). + +2009-07-31 suzuki toshiya + + smooth: Improve the format in debug message. + + * src/smooth/ftgrays.c (gray_dump_cells): Improve the + format specifications to dump variables. + +2009-07-31 suzuki toshiya + + sfnt: Fix a data type mismatching with its source. + + * src/sfnt/sfobjs.c (sfnt_load_face): The type of + local `flags' is matched with FT_Face->face_flags. + +2009-07-31 suzuki toshiya + + psaux: Fix a data type mismatching with its source. + + * include/freetype/internal/psaux.h: The type of + T1_DecorderRec.buildchar is matched with + T1_DecorderRec.top. + +2009-07-31 suzuki toshiya + + truetype: Extend TrueType GX packed deltas to FT_Offset. + + * src/truetype/ttgxvar.c (ft_var_readpackeddeltas): + The type of 2nd argument `delta_cnt' is changed from + FT_Int to FT_Offset, because its source can be cvt + table size calculated from stream position. + +2009-07-31 suzuki toshiya + + truetype: Extend mmvar_len to hold size_t values. + + * src/truetype/ttgxvar.h: The type of + GX_BlendRec.mmvar_len is changed from FT_Int to + FT_Offset, because TT_Get_MM_Var() calculates it + by sizeof() results. + +2009-07-31 suzuki toshiya + + truetype: Check invalid function number in IDEF instruction. + + * src/truetype/ttinterp.c (Ins_IDEF): Check + if the operand fits to 8-bit opcode limitation. + +2009-07-31 suzuki toshiya + + truetype: Check invalid function number in FDEF instruction. + + * src/truetype/ttinterp.c (Ins_FDEF): Check + if the operand fits 16-bit function number. + +2009-07-31 suzuki toshiya + + truetype: Truncate the deltas of composite glyph at 16-bit values. + + * src/truetype/ttgload.c (load_truetype_glyph): + Insert cast from FT_Long (deltas[i].{x,y}) to + FT_Int16 in the summation of deltas[] for composite + glyphs. Because deltas[i] is typed as FT_Pos, + its component x, y are typed as FT_Long, but + their sources are always FT_Int16 when they are + loaded by ft_var_readpackeddeltas(). However, + the limitation about the summed deltas is unclear. + +2009-07-31 suzuki toshiya + + truetype: Truncate the instructions upto 16-bit per a glyph. + + * src/truetype/ttgload.c (TT_Hint_Glyph): Truncate + the instructions upto 16-bit length per a glyph. + +2009-07-31 suzuki toshiya + + truetype: Cast the numerical operands to 32-bit for LP64 systems. + + * src/truetype/ttinterp.c (Ins_SPHIX, INS_MIAP, + Ins_MIRP): Insert cast from long (args[], the + operands passed to TrueType operator) to FT_Int32 + (the argument of TT_MulFix14()). + +2009-07-31 suzuki toshiya + + truetype: Cast the project vector to 32-bit for LP64 system. + + * src/truetype/ttinterp.c (Project, DualProject): + Insert casts from FT_Pos (the arguments `dx', `dy') + to FT_UInt32 (the argument to TT_DotFix14()). + +2009-07-31 suzuki toshiya + + truetype: Cast the scaling params to 32-bit for LP64 system. + + * src/truetype/ttgload.c (TT_Process_Composite_Component): + Insert casts from long (return value of FT_MulFix()) to + FT_Int32 (the argument to FT_SqrtFixed()). + +2009-07-31 suzuki toshiya + + sfnt: Cast a character code to FT_UInt32 for LP64 system. + + * src/sfnt/ttcmap.c (tt_cmap14_char_map_nondef_binary, + tt_cmap14_variants, tt_cmap14_char_variants, + tt_cmap14_def_char_count, tt_cmap14_get_def_chars, + tt_cmap14_get_nondef_chars, tt_cmap14_variant_chars) + Insert casts when FT_UInt32 variable is loaded by + TT_NEXT_{UINT24|ULONG}. Because most of them are + compared with FT_UInt32 values in public API, replacing + FT_UFast is not recommended. + +2009-07-31 suzuki toshiya + + sfnt: Cast a character code to FT_UInt32 for LP64 system. + + * src/sfnt/ttcmap.c (tt_cmap4_init, tt_cmap4_next): + Insert the casts from unsigned long constant to + FT_UInt32. + +2009-07-31 suzuki toshiya + + sfnt: Extend TT_BDF->strings_size to FT_ULong for huge BDF. + + * include/freetype/internal/tttypes.h: The type + of TT_BDF->string_size is extended from FT_UInt32 + to FT_ULong, because BDF specification does not + restrict the length of string. + * src/sfnt/ttbdf.c: The scratch variable `strings' + to load TT_BDF->string_size is matched with + TT_BDF->string_size. + +2009-07-31 suzuki toshiya + + psaux: Handle the string length by FT_Offset variables. + + * src/psaux/afmparse.c (afm_parser_next_key, + afm_tokenize, afm_parse_track_kern, + afm_parse_kern_pairs, afm_parse_kern_data, + afm_parser_skip_section, afm_parser_parse): + The length of key is handled by FT_Offset, + instead of FT_UInt. Although the length of + PostScript strings or name object is 16-bit, + AFM_STREAM_KEY_LEN() calculates the length + from the pointer difference. + + * src/psaux/afmparse.h (afm_parser_next_key): + Ditto. + +2009-07-31 suzuki toshiya + + pcf: Fix some data types mismatching with their sources. + + * src/pcf/pcfread.c (pcf_get_bitmaps): The types + of `nbitmaps', `i', `sizebitmaps' are matched with + the type of area FT_Bitmap.pitch * FT_Bitmap.rows. + +2009-07-31 suzuki toshiya + + pcf: Handle the string length by size_t variables. + + * src/pcf/pcfread.c (pcf_interpret_style): The types + of nn, len, lengths[4] are changed to size_t, because + they are loaded by (or compared with) ft_strlen(). + + * src/pcf/pcfutil.c (BitOrderInvert, TwoByteSwap, + FourByteSwap): The type of the 2nd argument `nbytes' + is changed to size_t, for similarity with ANSI C + string functions. + + * src/pcf/pcfdrivr.c (PCF_Glyph_Load): The type of + `bytes' is changed to FT_Offset, because it is passed + to FT_ALLOC(), via ft_glyphslot_alloc_bitmap(). At + least, using unsigned type is better. + +2009-07-31 suzuki toshiya + + pcf: Fix some data types mismatching with their sources. + + * src/pcf/pcfread.c (pcf_seek_to_table_type, + pcf_has_table_type): The type of 3rd argument + `ntables' is matched with PCF_Toc->count. + +2009-07-31 suzuki toshiya + + otvalid: Truncate the glyph index to 16-bit. + + * src/otvalid/otvalid.c (otv_validate): Checks + face->num_glyphs does not exceed 16-bit limit, + pass FT_UInt num_glyphs to backend functions + otv_{GPOS|GSUB|GDEF|JSTF|MATH}_validate(). + +2009-07-31 suzuki toshiya + + cache: Insert explict casts for LP64 systems. + + * src/cache/ftcbasic.c (FTC_ImageCache_Lookup, + FTC_SBitCache_Lookup): The type of FTC_ImageType->width + is FT_Int, so the cast to unsigned larger type FT_ULong + is introduced for the comparisons with 0x10000L for + LP64 platform. + +2009-07-31 suzuki toshiya + + cache: Fix some data types mismatching with their sources. + + * src/cache/ftccache.h: The type of return value + by FTC_Node_WeightFunc function is changed to + FT_Offset. The type of FTC_CacheClass->cache_size + is changed to FT_Offset, too. + + * src/cache/ftccback.h (ft_inode_weight, + ftc_snode_weight): Ditto. + + * src/cache/ftccmap.c (ftc_cmap_node_weight): Ditto. + + * src/cache/ftcimage.c (ftc_inode_weight, + FTC_INode_Weight): Ditto. + + * src/cache/ftcsbits.c (ftc_snode_weight, + FTC_SNode_Weight): Ditto. + + * src/cache/ftcmru.h: The type of + FTC_MruListClass->node_size is changed to FT_Offset, + because it is passed to FT_ALLOC() to specify the + size of buffer. + +2009-07-31 suzuki toshiya + + XXX_cmap_encoding_char_next() return FT_UInt32 values. + + * include/freetype/internal/services/svpscmap.h: + The size of the charcode value returned by + the function typed PS_Unicodes_CharNextFunc is + matched with its input charcode value. + + * src/cff/cffmap.c (cff_cmap_encoding_char_next, + cff_cmap_unicode_char_next): Ditto. + + * src/pfr/pfrmap.c (pfr_cmap_encoding_char_next): + Ditto. + + * src/psaux/t1cmap.c (t1_cmap_std_char_next, + t1_cmap_custom_char_next, t1_cmap_unicode_char_next): + Ditto. + + * src/psnames/psmodule.c (ps_unicodes_char_next): + Ditto. + + * src/winfonts/winfnt.c (fnt_cmap_char_next): + Ditto. + + * src/sfnt/ttcmap.c (tt_cmap0_char_next, + tt_cmap2_char_next, tt_cmap4_char_next, + tt_cmap6_char_next, tt_cmap10_char_next, + tt_cmap12_char_next, tt_cmap13_char_next): Ditto. + (tt_cmap14_char_variants): Handle base unicode + codepoint by FT_UInt32 variable to avoid overflow + on 16-bit platforms. + (tt_cmap14_ensure): The type of `num_results' is + extend to FT_UInt32, to cover unsigned 32-bit + `numVarSelectorRecords' in cmap14 table header. + +2009-07-31 suzuki toshiya + + truetype: Extend TT_Face->num_locations for broken TTFs. + + * include/freetype/internal/tttypes.h: + TT_Face->num_locations are extended from FT_UInt + to FT_ULong, to stand with broken huge loca table. + Some people insists there are broken TTF including + the glyphs over 16-bit limitation, in PRC market. + * src/truetype/ttpload.c (tt_face_load_loca): + Remove unrequired 16-bit truncation for FT_UInt + TT_Face->num_locations. + +2009-07-31 suzuki toshiya + + smooth: Fix some data types mismatching with their sources. + + * src/smooth/ftgrays.c: The type of `TCoord' is + matched to `TPos', because they are mixed in + gray_set_cell(). The type of TCell->x is extended + to `TPos', because gray_find_cell() sets it by + TWorker.ex. The type of TCell->cover is extended + to `TCoord', because gray_render_scanline() adds + TCoord value to it. The type of TWork.cover is matched + with TCell->cover. The types of + TWork.{max_cells,num_cells} are changed to FT_PtrDist, + because they are calculated from the memory addresses. + The type of TWork.ycount is changed to TPos, because + it is calculated from TPos variables. + (gray_find_cell): The type of `x' is matched with + its initial value ras.ex. + (gray_render_scanline): The types of `mod', `lift' + and `rem' are changed to TCoord, because their values + are set with explicit casts to TCoord. When ras.area + is updated by the differential values including + `delta', they are explicitly cast to TArea, because + the type of `delta' is not TArea but TCoord. + (gray_render_line): The type of `mod' is extended + from int to TCoord, because (TCoord)dy is added to mod. + (gray_hline): The argument `acount' is extended to + TCoord, to match with the parameters in the callers. + +2009-07-31 suzuki toshiya + + cff: Fix some data types mismatching with their sources. + + * src/cff/cffobjs.c (cff_face_init): The type of + `scaling' is matched with the scaling parameter + in FT_Matrix_Multiply_Scaled() and + FT_Vector_Transform_Scaled(). + + * src/cff/cffparse.c (cff_parse_real): The type of + `power_ten', `scaling', `exponent_add', + `integer_length', `fraction_length', + `new_fraction_length' and `shift' are matched with + the type of `exponent' to avoid unexpected truncation. + (cff_parse_fixed_scaled): The type of `scaling' is + matched with the `scaling' argument to + cff_parse_real(). + (cff_parse_fixed_dynamic): Ditto. + (cff_parse_font_matrix): The type of `scaling' is + matched with the `scaling' argument to + cff_parse_dynamic(). + +2009-07-31 suzuki toshiya + + autofit: Fix some data types mismatching with their sources. + + * src/autofit/afglobal.c: Correct the type of + AF_FaceGlobalsRec.glyph_count to match with + FT_Face->num_glyphs. + (af_face_globals_compute_script_coverage): + Insert explicit cast to compare + FT_Long AF_FaceGlobalsRec.glyph_count versus + FT_UInt gindex. The type of `nn' is changed + to scan glyph index upto AF_FaceGlobalsRec.glyph_count. + (af_face_globals_get_metrics): The type of `script_max' + is changed to cover size_t value. Insert explicit cast + to compare FT_Long AF_FaceGlobalsRec.glyph_count versus + FT_UInt gindex. + + * src/autofit/afhints.c (af_axis_hints_new_segment): + Insert explicit cast to calculate `big_max' from + integer and size_t values. + (af_axis_hints_new_edge): Ditto. + + * src/autofit/aflatin.c (af_latin_metrics_init_blues): + The type of `best_y' is matched to FT_Vector.y. + (af_latin_compute_stem_width): The type of `delta' is + matched to `dist' and `org_dist'. + +2009-07-31 suzuki toshiya + + autofit: Count the size of the memory object by ptrdiff_t. + + * src/autofit/afcjk.c (af_cjk_hint_edges): The + number of edges `n_edges' should be counted by + FT_PtrDist variable instead of FT_Int. + + * src/autofit/aflatin.c (af_latin_hint_edges): + Ditto. + + * src/autofit/aftypes.h: In AF_ScriptClassRec, + the size of metric `script_metrics_size' should + be counted by FT_Offset variable instead of FT_UInt. + + * src/autofit/afhints.c + (af_glyph_hints_align_strong_points): The cursors + for the edges `min', `max', `mid' in the memory + buffer should be typed FT_PtrDist. + +2009-07-31 suzuki toshiya + + autofit: Fix for unused variable `first'. + + * src/autofit/afhints.c (af_glyph_hints_reload): Insert + FT_UNUSED() to hide the unused variable warning. + +2009-07-31 suzuki toshiya + + Improve bitmap size or pixel variables for 16-bit systems. + + * include/freetype/config/ftstdlib.h: Introduce + FT_INT_MIN, to use in signed integer overflow in + 16-bit and 64-bit platforms. + + * include/freetype/internal/fttrace.h: Add a tracer + to ftsynth.c. + + * src/base/ftbitmap.c (FT_Bitmap_Embolden): Check + invalid strength causing integer overflow on 16-bit + platform. + + * src/base/ftcalc.c (ft_corner_orientation): Change + the internal calculation from FT_Int to FT_Long, to + avoid an overflow on 16-bit platforms. The caller of + this function should use only the sign of result, + so the cast to FT_Int is acceptable. + + * src/base/ftsynth.c: Introduce a tracer for synth module. + (FT_GlyphSlot_Embolden): Check invalid strength causing + integer overflow on 16-bit platform. + + * src/bdf/bdfdrivr.c (BDF_Face_Init): The glyph index + in FT2 API is typed as FT_UInt, although BDF driver + can handle unsigned long glyph index internally. To + avoid integer overflow on 16-bit platform, too large + glyph index should be excluded. + (BDF_Glyph_Load): The glyph pitch in FT2 is typed as + FT_UInt, although BDF driver can handle unsigned long + glyph pitch internally. To avoid integer overflow on + 16-bit platform, too large glyph pitch should not be + returned. + + * src/pfr/pfrsbit.c (pfr_slot_load_bitmap): The glyph + pitch in FT2 is typed as FT_UInt, although PFR font + format can include huge bitmap glyph with 24-bit pitch + (however, a glyph spends 16.7 pixel, it's not realistic). + To avoid integer overflow on 16-bit platform, huge + bitmap glyph should be excluded. + + * src/smooth/ftgrays.c (gray_hline): As FT_Span.x is + truncated to fit its type (16-bit short), FT_Span.y + should be truncated to fit its type (FT_Int). + + * src/cff/cffdrivr.c (cff_get_ros): CFF specification + defines the supplement in ROS as a real number. + Truncate it to fit public FT2 API. + + * src/cff/cffparse.c (cff_parse_cid_ros): Warn the + supplement if it is truncated or rounded in cff_get_ros(). + + * src/cff/cfftypes.h: Change the type of internal variable + `supplement' from FT_Long to FT_ULong to fit the signedness + to the type in public API. + +2009-07-31 suzuki toshiya + + psaux: Prevent invalid arguments to afm_parser_read_vals(). + + * src/psaux/afmparse.c (afm_parser_read_vals): Change + the type of `n' to prevent negative number how many + arguments should be parsed. + + * src/psaux/afmparse.h (afm_parser_read_vals): Ditto. + +2009-07-31 suzuki toshiya + + base: Prevent some overflows on LP64 systems. + + * src/base/ftadvance.c (FT_Get_Advances): Cast the + unsigned long constant FT_LOAD_ADVANCE_ONLY to FT_UInt32 + for LP64 platforms. + + * src/base/ftcalc.c (FT_Sqrt32): All internal variables + are changed to FT_UInt32 from FT_ULong. + (FT_MulDiv): Insert casts to FT_Int32 for LP64 platforms. + This function is designed for 32-bit integer, although + their arguments and return value are FT_Long. + + * src/base/ftobjs.c (FT_Get_Char_Index): Check `charcode' + is within unsigned 32-bit integer for LP64 platforms. + (FT_Face_GetCharVariantIndex): Check `charcode' and + `variantSelector' are within 32-bit integer for LP64 + platforms. + (FT_Face_GetCharsOfVariant): Check `variantSelector' is + within unsigned 32-bit integer for LP64 platforms. + + * src/base/fttrigon.c (ft_trig_downscale): The FT_Fixed + variable `val' and unsigned long constant FT_TRIG_SCALE + are cast to FT_UInt32, when calculates FT_UInt32. + (FT_Vector_Rotate): The long constant 1L is cast to + FT_Int32 to calculate FT_Int32 `half'. + +2009-07-31 suzuki toshiya + + cff: Cast the long variables to 32-bit for LP64 systems. + + * src/cff/cffdrivr.c (cff_get_advances): Insert + explicit cast to modify a 32-bit flag by unsigned + long constant. + + * src/cff/cffobjs.c (cff_face_init): Ditto. + + * src/cff/cffgload.c (cff_decoder_parse_charstrings): + Replace the casts to FT_Long by the casts to FT_Int32 + for LP64 platforms. + +2009-07-31 suzuki toshiya + + pcf: Improve PCF_PropertyRec.value names on LP64 platforms. + + * src/pcf/pcf.h: In PCF_PropertyRec.value, the member + `integer' is replaced by `l', `cardinal' is replaced + by `ul', to fix the difference between the name and + the types on LP64 platforms. + + * src/pcf/pcfdrivr.c (pcf_get_bdf_property): Reflect + PCF_PropertyRec.value change, with appropriate casts + to FT_Int32/FT_UInt32. Their destinations + BDF_PropertyRec.{integer|cardinal} are public and + explicitly defined as FT_Int32/FT_UInt32. + + * src/pcf/pcfread.c (pcf_get_properties, pcf_load_font): + Reflect PCF_PropertyRec.value change. + +2009-07-31 suzuki toshiya + + pcf: Fix some data types mismatching with their sources. + + * src/pcf/pcfdrivr.c (pcf_cmap_char_index): The type of + `code' is matched to PCF_Encoding->enc. + (pcf_cmap_char_next): The type of `charcode' is matched + to PCF_Encoding->enc. When *acharcode is set by charcode, + an overflow is checked and cast to unsigned 32-bit + integer. + +2009-07-31 suzuki toshiya + + bdf: Improve bdf_property_t.value names for LP64 platforms. + + * src/bdf/bdf.h: In bdf_property_t.value, the member + `int32' is replaced by `l', `card32' is replaced by + `ul', to fix the difference between the name and the + types on LP64 platforms. + + * src/bdf/bdfdrivr.c (BDF_Face_Init): Reflect + bdf_property_t.value change. + (bdf_get_bdf_property): Reflect bdf_property_t.value + change, with appropriate casts to FT_Int32/FT_UInt32. + Their destinations BDF_PropertyRec.{integer|cardinal} + are public and explicitly defined as FT_Int32/FT_UInt32. + + * src/bdf/bdflib.c (_bdf_add_property): Reflect + bdf_property_t.value change. + +2009-07-31 suzuki toshiya + + bdf: Fix some data types mismatching with their sources. + + * src/bdf/bdrdrivr.c (bdf_cmap_char_index): The type + of `code' is matched with BDF_encoding_el->enc. + (bdf_cmap_char_next): The type of `charcode' is + matched with BDF_encoding_el->enc. When *acharcode + is set by charcode, an overflow is checked and + cast to unsigned 32-bit integer. + +2009-07-31 suzuki toshiya + + autofit: Improve Unicode range definitions. + + * src/autofit/aftypes.h (AF_UNIRANGE_REC): New macro + to declare a range by two unsigned 32-bit integer, + to avoid 64-bit range definition on LP64 platforms. + + * src/autofit/aflatin.c (af_latin_uniranges): Ditto. + + * src/autofit/aflatin2.c (af_latin2_uniranges): Ditto. + + * src/autofit/afindic.c (af_indic_uniranges): Ditto. + + * src/autofit/afcjk.c (af_cjk_uniranges): Declare + the ranges by AF_UNIRANGE_REC. + +2009-07-31 suzuki toshiya + + smooth: Fix a data type mismatching with its source. + + * src/smooth/ftgrays.c (gray_sweep): The type of + `area' is matched with the 3rd argument `area' + of gray_hline(). + +2009-07-31 suzuki toshiya + + smooth: Fix a data type mismatching with its source. + + * src/smooth/ftgrays.c (gray_render_line): The type + of `area' is matched with TWorker.area. + +2009-07-31 suzuki toshiya + + cache: Disable the legacy compatibility if 16-bit system. + + * src/cache/ftcbasic.c (FTC_ImageCache_Lookup): Exclude + the legacy behaviour from 16-bit platform, because the + current hack cannot detect the caller uses this function + via legacy convension. + (FTC_SBitCache_Lookup): Ditto. + +2009-07-31 suzuki toshiya + + cache: Check 32-bit glyph index on 16-bit systems. + + * src/cache/ftcbasic.c (ftc_basic_family_get_count): + Check overflow caused by the face including large + number of glyphs > 64k. + +2009-07-31 suzuki toshiya + + cache: Fix some data types mismatching with their sources. + + * src/cache/ftccache.c (ftc_cache_resize): The types of + `p', `mask', `count' are matched with FTC_Cache->{p,mask}. + (FTC_Cache_Clear): The type of `old_index' is matched to + FTC_Cache->{p,mask}. + + * src/cache/ftccache.h (FTC_CACHE_LOOKUP_CMP): The type + of `_idx' is matched with FTC_Cache->{p,mask}. + +2009-07-31 suzuki toshiya + + cache: Fix some data types mismatching with their sources. + + * src/cache/ftcsbits.c (ftc_snode_load): The types + of `xadvance' and `yadvance' are matched with + FT_GlyphSlot->advance.{x|y}. + +2009-07-31 suzuki toshiya + + cache: Cast NULL to a required function type explicitly. + + * src/cache/ftcmanag.c (FTC_Manager_RemoveFaceID): + Insert explicit cast from NULL to function type. + +2009-07-31 suzuki toshiya + + fttypes.h: Cast FT_MAKE_TAG output to FT_Tag exlicitly. + + * include/freetype/fttypes.h (FT_MAKE_TAG): + Cast the result to FT_Tag. + +2009-07-31 suzuki toshiya + + psnames: Handle Unicode codepoints by FT_UInt32 variables. + + * src/psnames/psmodule.c (BASE_GLYPH): Cast the result + to unsigned 32-bit integer for LP64 platform. + (ps_unicode_value): Return the value by unsigned 32-bit + integer instead of unsigned long. + +2009-07-31 suzuki toshiya + + psaux: Use size_t variable to pass the buffer size. + + * src/psaux/psaux.h (to_bytes): The type of `max_bytes' + (the argument to pass the buffer size) is changed to + size_t, to match with ANSI C string functions. + + * src/psaux/psconv.h (PS_Conv_StringDecode, + PS_Conv_ASCIIHexDecode, PS_Conv_EexecDecode): Ditto. + + * src/psaux/psconv.c (PS_Conv_StringDecode, + PS_Conv_ASCIIHexDecode, PS_Conv_EexecDecode): Ditto. + + * src/psaux/psobjs.h (ps_parser_to_bytes): Ditto. + + * src/psaux/psobjs.c (ps_parser_to_bytes): Ditto. + +2009-07-31 suzuki toshiya + + type1: Use size_t variable to pass the string length. + + * psaux.h: The type of `len' (the argument to pass + the buffer size to the function in AFM_ParserRec) + is changed to size_t, to match with ANSI C string + functions. + + * t1afm.c (t1_get_index): Ditto. + + * test_afm.c (dummy_get_index): Ditto. + + * afmparse.c (afm_parser_read_vals): To call + AFM_ParserRec.get_index, the length of token + `len' is cast to size_t. + +2009-07-31 suzuki toshiya + + cid: Fix some data types mismatching with their sources. + + * src/cid/cidparse.c (cid_parser_new): The types of + `read_len' and `stream_len' are matched to + FT_Stream->size. Unrequired cast is removed. + +2009-07-31 suzuki toshiya + + cff: Fix for unused variable `rest'. + + * src/cff/cffparse.c (cff_parse_real): Insert + FT_UNUSED() to hide the unused variable warning. + +2009-07-31 suzuki toshiya + + cff: Fix some data types mismatching with their sources. + + * src/cff/cffgload.c (cff_slot_load): The types of + `top_upm' and `sub_upm' are matched with + CFF_FontRecDict->units_per_em. + + * src/cff/cffobjs.c (cff_size_select): Ditto. + (cff_size_request): Ditto. + +2009-07-31 suzuki toshiya + + bdf: Fix some data types mismatching with their sources. + + * bdflib.c (_bdf_list_ensure): The type of `num_items' + is matched with _bdf_list_t.used. Also the types of + `oldsize', `newsize', `bigsize' are matched too. + (_bdf_readstream): `cursor' is used as an offset to + the pointer, it should be typed as FT_Offset. Also + the types of `bytes', `start', `end', `avail' are matched. + + * bdfdrivr.c: The type of BDF_CMap->num_encodings is + matched with FT_CMap->clazz->size. + (bdf_cmap_char_index): The types of `min', `max', `mid' + are matched with BDF_CMap->num_encodings. The type of + `result' is matched with encoding->glyph. + (bdf_cmap_char_next): Ditto, the type of `code' is + matched with BDF_encoding_el.enc. + (bdf_interpret_style): The type of `lengths' is changed + to size_t, to take the value by ft_strlen(). Also the + types of `len', `nn', `mm' are matched. + +2009-07-31 suzuki toshiya + + sfnt: Count the size of the memory object by ptrdiff_t. + + * src/sfnt/ttbdf.c (tt_face_find_bdf_prop): The type of + `peroperty_len' is changed from FT_UInt to FT_Offset, + to match with size_t, which is appropriate type for the + object in the memory buffer. + +2009-07-31 suzuki toshiya + + lzw: Count the size of the memory object by ptrdiff_t. + + * src/lzw/ftzopen.h: The types of FT_LzwState->{buf_total, + stack_size} are changed from FT_UInt to FT_Offset, to match + with size_t, which is appropriate type for the object in + the memory buffer. + + * src/lzw/ftzopen.c (ft_lzwstate_stack_grow): The types of + `old_size' and `new_size' are changed from FT_UInt to + FT_Offset, to match with size_t, which is appropriate type + for the object in the memory buffer. + +2009-07-31 suzuki toshiya + + otvalid: Count the table size on memory by ptrdiff_t. + + * src/otvalid/otvgpos.c (otv_ValueRecord_validate): + Change the type of table size from FT_UInt to + FT_PtrDist because it is calculated by the memory + addresses. + +2009-07-31 suzuki toshiya + + otvalid: Prevent an overflow by GPOS/GSUB 32b-bit offset. + + * src/otvalid/otvgpos.c (otv_ExtensionPos_validate): + Extend ExtensionOffset from FT_UInt to FT_ULong, to + cover 32-bit offset on 16-bit platform. + + * src/otvalid/otvgsub.c (otv_ExtensionSubst_validate): + Ditto. + +2009-07-31 suzuki toshiya + + ftobjs.c: Prevent an overflow in glyph index handling. + + * src/base/ftobjs.c (FT_Face_GetCharsOfVariant): + Improve the cast in comparison to avoid the truncation. + +2009-07-31 suzuki toshiya + + Improve the variable types in raccess_make_file_name(). + + * src/base/ftrfork.c (raccess_make_file_name): + Change the type of cursor variable `tmp' to const char*, + to prevent the unexpected modification of original pathname. + (raccess_make_file_name): Change the type of new_length + to size_t. + +2009-07-31 suzuki toshiya + + ftpatent.c: Fix for unused variable `error'. + + * src/base/ftpatent.c (_tt_check_patents_in_range): + Fix warning for unused variable `error'. + +2009-07-31 suzuki toshiya + + type1: Check invalid string longer than PostScript limit. + + * src/type1/t1afm.c (t1_get_index): Check invalid string + which exceeds the limit of PostScript string/name objects. + +2009-07-31 suzuki toshiya + + gzip: Use FT2 zcalloc() & zfree() in ftgzip.c by default. + + * src/gzip/ftgzip.c (zcalloc, zcfree): Disable all + zcalloc() & zfree() by zlib in zutil.c, those in + ftgzip.c by FT2 are enabled by default. To use + zlib zcalloc() & zfree(), define USE_ZLIB_ZCALLOC. + See discussion: + http://lists.gnu.org/archive/html/freetype-devel/2009-02/msg00000.html + +2009-07-31 suzuki toshiya + + gzip: Distinguish PureC from TurboC on MSDOS. + + * src/gzip/zutil.c (zcalloc, zcfree): Enable only for + MSDOS platform. + +2009-07-31 suzuki toshiya + + gxvalid: Insert PureC pragma to allow unevaluated variables. + + * builds/atari/ATARI.H: Insert PureC pragma not to + warn against set-but-unevaluated variable in gxvalid + module. + +2009-07-31 suzuki toshiya + + gxvalid: Pass the union by the pointer instead of the value. + + * src/gxvalid/gxvcommn.h: + - Declare new type `GXV_LookupValueCPtr'. + - Update the type of the 2nd argument to pass GXV_LookupValueDesc + data to the function prototyped as GXV_Lookup_Value_Validate_Func, + from GXV_LookupValueDesc to GXV_LookupValueCPtr. + - Likewise for the function prototyped as + GXV_Lookup_Fmt4_Transit_Func. + + - Declare new type `GXV_StateTable_GlyphOffsetCPtr'. + - Update the type of the 3rd argument to pass + GXV_StateTable_GlyphOffsetDesc data to the function prototyped + as GXV_StateTable_Entry_Validate_Func, from + GXV_StateTable_GlyphOffsetDesc to GXV_StateTable_GlyphOffsetCPtr. + + - Declare new type `GXV_XStateTable_GlyphOffsetCPtr'. + - Update the type of the 3rd argument to pass + GXV_XStateTable_GlyphOffsetDesc data to the function prototyped + as GXV_XStateTable_Entry_Validate_Func, + from GXV_XStateTable_GlyphOffsetDesc + to GXV_XStateTable_GlyphOffsetCPtr. + + * src/gxvalid/gxvcommn.c (gxv_LookupTable_fmt0_validate, + gxv_XClassTable_lookupval_validate, + gxv_XClassTable_lookupfmt4_transit): + Update from GXV_LookupValueDesc to GXV_LookupValueCPtr. + + * src/gxvalid/gxvbsln.c (gxv_bsln_LookupValue_validate, + gxv_bsln_LookupFmt4_transit): Ditto. + + * src/gxvalid/gxvjust.c + (gxv_just_pcTable_LookupValue_entry_validate, + gxv_just_classTable_entry_validate, + gxv_just_wdcTable_LookupValue_validate): Ditto. + + * src/gxvalid/gxvkern.c + (gxv_kern_subtable_fmt1_entry_validate): Ditto. + + * src/gxvalid/gxvlcar.c (gxv_lcar_LookupValue_validate, + gxv_lcar_LookupFmt4_transit): Ditto. + + * src/gxvalid/gxvopbd.c (gxv_opbd_LookupValue_validate, + gxv_opbd_LookupFmt4_transit): Ditto. + + * src/gxvalid/gxvprop.c (gxv_prop_LookupValue_validate, + gxv_prop_LookupFmt4_transit): Ditto. + + * src/gxvalid/gxvmort4.c + (gxv_mort_subtable_type4_lookupval_validate): Ditto. + + * src/gxvalid/gxvmort0.c + (gxv_mort_subtable_type0_entry_validate): Update + from GXV_StateTable_GlyphOffsetDesc + to GXV_StateTable_GlyphOffsetCPtr. + + * src/gxvalid/gxvmort1.c + (gxv_mort_subtable_type1_entry_validate): Ditto. + + * src/gxvalid/gxvmort2.c + (gxv_mort_subtable_type2_entry_validate): Ditto. + + * src/gxvalid/gxvmort5.c + (gxv_mort_subtable_type5_entry_validate): Ditto. + + * src/gxvalid/gxvmorx2.c + (gxv_morx_subtable_type2_entry_validate): Ditto. + + * src/gxvalid/gxvmorx5.c + (gxv_morx_subtable_type5_entry_validate): Ditto. + + * src/gxvalid/gxvmorx1.c + (gxv_morx_subtable_type1_entry_validate): Ditto. + (gxv_morx_subtable_type1_LookupValue_validate, + gxv_morx_subtable_type1_LookupFmt4_transit): + Update from GXV_LookupValueDesc to GXV_LookupValueCPtr. + + * src/gxvalid/gxvmorx0.c + (gxv_morx_subtable_type0_entry_validate): Update + from GXV_XStateTable_GlyphOffsetDesc + to GXV_XStateTable_GlyphOffsetCPtr. + +2009-07-29 Fabrice Bellet + + Fix Redhat bugzilla #513582 and Savannah bug #26849. + + * src/cache/ftccache.h (FTC_CACHE_LOOKUP_CMP) : Fix + aliasing bug. + +2009-07-19 Werner Lemberg + + Document recent library changes. + + * docs/CHANGES: Do it. + +2009-07-17 Werner Lemberg + + Fix Savannah bug #23786. + + * src/truetype/ttobjs.c (tt_size_init_bytecode): Don't reset x_ppem + and y_ppem. Otherwise the `*_CVT_Stretched' functions in ttinterp.c + get never called. + An anonymous guy suggested this change on Savannah, and it seems to + be the right solution. + +2009-07-15 Werner Lemberg + + * docs/release: Updated. + +2009-07-15 Werner Lemberg + + README.CVS -> README.git + + * README.CVS: Renamed to... + * README.git: This. + Updated. + +2009-07-15 suzuki toshiya + + Borland C++ compiler patch proposed by Mirco Babin. + http://lists.gnu.org/archive/html/freetype/2009-07/msg00016.html. + + * builds/exports.mk: Delete unused flags, CCexe_{CFLAGS,LDFLAGS}. + Fix APINAMES_C and APINAMES_EXE pathnames to reflect the platform + specific pathname syntax. + * builds/compiler/bcc.mk: Remove unused flag, CCexe_LDFLAGS. + Define TE = `-e' separately (bcc32 cannot specify the pathname of + binary executable by T = `-o'). + Extend the large page size in linking freetype.lib. + Add extra CLEAN target to delete bcc specific temporary files. + * builds/compiler/bcc-dev.mk: Ditto. + +2009-07-14 Werner Lemberg + + Fix Savannah bug #27026. + + * builds/win32/vc2005/freetype.sln: Use correct version number. + +2009-07-12 suzuki toshiya + + Add a script to check the undefined and unused trace macros. + + * src/tools/chktrcmp.py: A script to check trace_XXXX macros + that are used in C source but undefined in fttrace.h, or + defined in fttrace.h but unused in C sources. See + http://lists.gnu.org/archive/html/freetype-devel/2009-07/msg00013.html. + * docs/DEBUG: Mention on chktrcmp.py. + * docs/release: Ditto. + +2009-07-09 Werner Lemberg + + [ftraster] Make it compile again with -D_STANDALONE_. + + * src/raster/ftraster.c [_STANDALONE_]: Define + FT_CONFIG_STANDARD_LIBRARY_H. + Include `string.h'. + Don't include `rastpic.h'. + Define FT_DEFINE_RASTER_FUNCS. + +2009-07-09 suzuki toshiya + + smooth: Check glyph size by width/height, instead of pitch/height. + Suggested by der Mouse . + + * src/smooth/ftsmooth.c (ft_smooth_render_generic): Improve + the check for too large glyph. Replace the pair of `pitch' and + `height' by the pair of `width' and `height'. `pitch' cannot + be greater than `height'. The required is checking the product + `pitch' * `height' <= FT_ULONG_MAX, but we use cheap checks for + the realistic case only. + +2009-07-09 suzuki toshiya + + Register 2 missing trace components, t1afm and ttbdf. + + * include/freetype/internal/fttrace.h: Add FT_TRACE_DEF( t1afm ) + and FT_TRACE_DEF( ttbdf ). See + http://lists.gnu.org/archive/html/freetype-devel/2009-07/msg00013.html + +2009-07-09 suzuki toshiya + + Register a trace component for ftgloadr.c. + + * include/freetype/internal/fttrace.h: Add FT_TRACE_DEF( gloader ). + The macro `trace_gloader' was already used in the initial version + on 2002-02-24. + +2009-07-08 suzuki toshiya + + Prevent the overflows by a glyph with too many points or contours. + The bug is reported by Boris Letocha . See + http://lists.gnu.org/archive/html/freetype-devel/2009-06/msg00031.html + http://lists.gnu.org/archive/html/freetype-devel/2009-07/msg00002.html + + * include/freetype/ftimage.h (FT_OUTLINE_CONTOURS_MAX, + FT_OUTLINE_POINTS_MAX): New macros to declare the maximum + values of FT_Outline.{n_contours,n_points}. + * src/base/ftgloadr.c (FT_GlyphLoader_CheckPoints): Check the + total numbers of points and contours cause no overflows in + FT_Outline.{n_contours,n_points}. + + * include/freetype/internal/ftgloadr.h (FT_GLYPHLOADER_CHECK_P, + FT_GLYPHLOADER_CHECK_C): Compare the numbers of points and + contours as unsigned long number, instead of signed int, to + prevent the overflows on 16-bit systems. + +2009-07-05 Bram Tassyns + + Improve compatibility to Acroread. + This fixes Savannah bug #26944. + + * src/cff/cffload.c (cff_charset_compute_cids): For multiple GID to + single CID mappings, make the lowest value win. + +2009-06-28 suzuki toshiya + + ftpatent: Fix a bug by wrong usage of service->table_info(). + http://lists.gnu.org/archive/html/freetype-devel/2008-12/msg00039.html + + * include/freetype/internal/services/svsfnt.h: Extend + FT_SFNT_TableInfoFunc() to take new argument to obtain the offset + to the specified table. + * src/sfnt/sfdriver.c (sfnt_table_info): Extend to return the + table-offset to the caller function. + * src/base/ftpatent.c (_tt_check_patents_in_table): Use new + service->table_info(). + * src/base/ftobjs.c (FT_Sfnt_Table_Info): Synchronize to new + service->table_info(). + +2009-06-28 Werner Lemberg + + [psaux, cff] Protect against nested `seac' calls. + + * include/freetype/internal/psaux.h (T1_Decoder), src/cff/cffgload.h + (CFF_Decoder): Add `seac' boolean variable. + + * src/cff/cffgload.c (cff_operator_seac), src/psaux/t1decode.c + (t1operator_seac): Use it. + +2009-06-28 Werner Lemberg + + Thinko. + + * src/psaux/t1decode.c (t1operator_seac) + [FT_CONFIG_OPTION_INCREMENTAL]: Test for existence of incremental + interface. + +2009-06-28 Werner Lemberg + + * devel/ftoption.h [FT_CONFIG_OPTION_INCREMENTAL]: Define. + +2009-06-27 suzuki toshiya + + Add tools to preprocess the source files for AtariST PureC. + + * builds/atari/deflinejoiner.awk: New file to filter C source files + for broken C preprocessor of PureC compiler. + + * builds/atari/gen-purec-patch.sh: New file to generate a patch set + for PureC, by using deflinejoiner.awk. + +2009-06-27 suzuki toshiya + + Keep existing modules.cfg in the building tree. + + * configure: If `configure' is executed outside of the source tree, + an existing `modules.cfg' file in the build directory should be + kept, not overwritten by the version in the source tree. + +2009-06-27 suzuki toshiya + + Filter --srcdir= option before invoking builds/unix/configure. + + * configure: If builds/unix/configure is invoked with --srcdir + option, the option should take `builds/unix' directory instead of + the top source directory. Thus the configure script in the top + directory should modify the --srcdir= option if + `builds/unix/configure' is invoked. + +2009-06-27 suzuki toshiya + + Improve configure.raw for cross-building on exe-suffixed systems. + + * builds/unix/configure.raw: Fix a bug in sed script to extract + native suffix for binary executables, patch by Peter Breitenlohner. + http://lists.gnu.org/archive/html/freetype-devel/2009-04/msg00036.html + +2009-06-26 Werner Lemberg + + [truetype] Remove TT_SubGlyphRec. + + * src/truetype/ttobjs.h (TT_SubGlyphRec): Removed, unused. + +2009-06-26 Werner Lemberg + + * */*: For warning messages, replace FT_ERROR with FT_TRACE0. + + FT_ERROR is now used only if a function produces a non-zero `error' + value. + + Formatting, improving and harmonizing debug strings. + +2009-06-25 Werner Lemberg + + Provide version information better. + + * src/base/ftinit.c (FT_Init_FreeType): Don't set version here + but... + * src/base/ftobjs.c (FT_New_Library): Here. + +2009-06-22 Werner Lemberg + + Use 16.16 format while parsing Type 1 charstrings. + This fixes Savannah bug #26867. + + Previously, only integers have been used which can lead to serious + rounding errors. + + However, fractional values are only used internally; after the + charstrings (of either Type 1 or 2) have been processed, the + resulting coordinates get rounded to integers currently -- before + applying scaling. This should be fixed; at the same time a new load + flag should be introduced, to be used in combination with + FT_LOAD_NO_SCALE, which indicates that font units are returned in + 16.16 format. Similarly, the incremental interface should be + extended to allow fractional values for metrics. + + * include/freetype/internal/psaux.h (T1_BuilderRec): Remove `shift' + field. + * include/freetype/internal/pshints.h (T1_Hints_SetStemFunc, + T1_Hints_SetStem3Func): Use FT_Fixed for coordinates. + + * src/psaux/psobjs.c: Include FT_INTERNAL_CALC_H. + (t1_build_add_point): Always convert fixed to integer. + * src/psaux/t1decode.c (t1_decoder_parse_charstrings): + Use 16.16 format everywhere (except for large integers followed by a + `div'). + [CAN_HANDLE_NON_INTEGRAL_T1_OPERANDS]: Remove #ifdef and activate + code uncoditionally. + Add support for random numbers and update remaining code + accordingly; this should work now. + (t1_operator_seac): Updated. + * src/psaux/pshrec.c: Include FT_INTERNAL_CALC_H. + (ps_hints_t1stem3, t1_hints_stem): Updated. + + * src/cid/cidgload.c: Include FT_INTERNAL_CALC_H. + (cid_load_glyph) [FT_CONFIG_OPTION_INCREMENTAL], + (cid_face_compute_max_advance, cid_slot_load_glyph): Updated. + + * src/type1/t1gload.c (T1_Parse_Glyph_And_Get_Char_String) + [FT_CONFIG_OPTION_INCREMENTAL], (T1_Get_Advances, T1_Load_Glyph): + Updated. + * src/type1/t1load.c: Include FT_INTERNAL_CALC_H. + * src/type1/t1objs.c (T1_Face_Init): Updated. + +2009-06-21 Werner Lemberg + + * src/pshinter/pshrec.c: Use PSH_Err_Ok. + +2009-06-21 Werner Lemberg + + Code beautification. + + * src/type1/t1load.c (FT_INT_TO_FIXED): Removed. + Replace everywhere with INT_TO_FIXED. + (FT_FIXED_TO_INT): Move to ... + * include/freetype/internal/ftcalc.h (FIXED_TO_INT): Here. + Update all users. + +2009-06-20 Werner Lemberg + + Remove unused variables. + + * include/freetype/internal/psaux.h (T1_BuilderRec), + src/cff/cffgload.h (CFF_Builder): Remove `last'. + Update all users. + +2009-06-20 Werner Lemberg + + [psaux] Check large integers while parsing charstrings. + + * src/psaux/t1decode.c (t1_decoder_parse_charstrings): Large + integers must be followed by a `div' operator. + +2009-06-20 Werner Lemberg + + [cff] Revert last change. + + * src/cff/cffgload.c (cff_decoder_parse_charstrings): Do it. + Next time, don't confuse Type 2 charstring opcodes with TOP DICT + values... + +2009-06-20 Werner Lemberg + + * src/autofit/aflatin.c (af_latin_metrics_check_digits): Fix + compiler warning. + +2009-06-20 Werner Lemberg + + * builds/compiler/gcc.mk (CFLAGS): Use -O3, not -O6. + +2009-06-19 Werner Lemberg + + [cff] Fix handling of reserved byte 0xFF. + + * src/cff/cffgload.c (cff_decoder_parse_charstrings): Abort if byte + 0xFF is encountered. + +2009-06-19 Werner Lemberg + + Improve debug messages for Type1 charstrings. + + * src/psaux/t1decode.c (t1_decoder_parse_charstrings): Emit newlines + after instructions. + Prettify output. + +2009-06-19 Werner Lemberg + + More ftgray fixes for FT_STATIC_RASTER. + Problems reported by suyu@cooee.cn. + + * src/smooth/ftgrays.c (gray_move_to, gray_raster_render): Use + RAS_VAR. + +2009-06-18 Werner Lemberg + + * docs/CHANGES: Updated. + +2009-06-18 Werner Lemberg + + Fix B/W rasterization of subglyphs with different drop-out modes. + + Normally, the SCANMODE instruction (if present) to set the drop-out + mode in a TrueType font is located in the `prep' table only and thus + valid for all glyphs. However, there are fonts like `pala.ttf' + which additionally contain this instruction in the hinting code of + some glyphs (but not all). As a result it can happen that a + composite glyph needs multiple drop-out modes for its subglyphs + since the rendering state gets reset for each subglyph. + + FreeType collects the hinted outlines from all subglyphs, then it + sends the data to the rasterizer. It also sends the drop-out mode + -- after hinting has been applied -- and here is the error: It sends + the drop-out mode of the last subglyph only; drop-out modes of all + other subglyphs are lost. + + This patch fixes the problem; it adds a second, alternative + mechanism to pass the drop-out mode: For each contour, the + rasterizer now checks the first `tags' array element. If bit 2 is + set, bits 5-7 contain the contour's drop-out mode, overriding the + global drop-out mode. + + * include/freetype/ftimage.h (FT_CURVE_TAG_HAS_SCANMODE): New macro. + + * src/truetype/ttgload.c (TT_Hint_Glyph): Store drop-out mode in + `tags[0]'. + + * src/raster/ftraster.c (Flow_Up, Overshoot_Top, Overshoot_Bottom): + Use bits 3-5 instead of 0-2. + (New_Profile): Set the drop-out mode in the profile's `flags' field. + (Decompose_Curve): Check `tags[0]' and set `dropOutControl' if + necessary. + (Vertical_Sweep_Drop, Horizontal_Sweep_Drop, + Horizontal_Gray_Sweep_Drop, Draw_Sweep): Use the profile's drop-out + mode. + +2009-06-16 Werner Lemberg + + Improve scan conversion rules 4 and 6. + + Two new constraints are introduced to better identify a `stub' -- a + concept which is only vaguely described in the OpenType + specification. The old code was too rigorous and suppressed more + pixel than it should. + + . The intersection of the two profiles with the scanline is less + than a half pixel. Code related to this was already present in + the sources but has been commented out. + + . The endpoint of the original contour forming a profile has a + distance (`overshoot') less than half a pixel to the scanline. + + Note that the two additional conditions fix almost all differences + to the Windows rasterizer, but some problematic cases remain. + + * src/raster/ftraster.c (Overshoot_Top, Overshoot_Bottom): New + macros for the `flags' field in the `TProfile' structure. + (IS_BOTTOM_OVERSHOOT, IS_TOP_OVERSHOOT): New macros. + (New_Profile, End_Profile): Pass overshoot flag as an argument and + set it accordingly. + Update callers. + (Vertical_Sweep_Drop, Horizontal_Sweep_Drop): Implement the two new + constraints. + +2009-06-11 Werner Lemberg + + Increase precision for B/W rasterizer. + + * src/raster/ftraster.c (Set_High_Precision): Add two more bits to + the precision. This corrects rendering of some small glyphs, for + example, glyph `xi' in verdana.ttf at 13 ppem. Testing with ftbench + on my GNU/Linux box I don't see a performance degradation. + +2009-06-08 Michael Zucchi + + Handle FT_STROKER_LINECAP_BUTT. + This fixes Savannah bug #26757. + + * src/base/ftstroke.c (ft_stroker_cap): Implement it. + +2009-06-07 Harald Fernengel + + Fix some potential out-of-memory crashes. + + * src/base/ftobjs.c (ft_glyphslot_done): Check `slot->internal'. + * src/base/ftstream.c (FT_Stream_ReleaseFrame): Check `stream'. + * src/truetype/ttinterp.c (TT_New_Context): Avoid double-free of + `exec' in case of failure. + +2009-06-07 Werner Lemberg + + Simplify math. + Suggested by Alexei Podtelezhnikov . + + * src/raster/ftraster.c (Vertical_Sweep_Drop, Horizontal_Sweep_Drop, + Horizontal_Gray_Sweep_Drop): Do it. + +2009-06-04 Werner Lemberg + + Preparation for fixing scan conversion rules 4 and 6. + + * src/raster/ftraster.c (TFlow): Replace enumeration with... + (Flow_Up): This macro. + (TProfile): Replace `flow' member with `flags' bit field. + Update all affected code. + +2009-05-29 James Cloos + + Enable autohinting for glyphs rotated by multiples of 90°. + + * src/base/ftobjs.c (FT_Load_Glyph): Alter check for permitted + matrices to allow rotations by multiples of 90°, not only unrotated, + possibly slanted matrices. + +2009-05-28 Werner Lemberg + + Remove compiler warning. + Reported by Krzysztof Kowalczyk . + + * src/autofit/aflatin2.c (af_latin2_hint_edges): Move declaration of + `n_edges' into `#if' block. + +2009-05-28 Werner Lemberg + + Make compilation work with FT_CONFIG_OPTION_USE_ZLIB not defined. + Reported by Krzysztof Kowalczyk . + + * src/pcf/pcfdrivr.c (PCF_Face_Init) [!FT_CONFIG_OPTION_USE_ZLIB]: + Make it work. + Simplify #ifdef logic. + +2009-05-22 Werner Lemberg + + Improve b/w rasterizer. + Problem reported by Krzysztof Kotlenga . + + * src/raster/raster.c (Vertical_Sweep_Drop, Horizontal_Sweep_Drop, + Horizontal_Gray_Sweep_Drop): For smart drop-out mode, if + intersections are equally distant relative to next pixel center, + select the left pixel, not the right one. + +2009-05-19 Werner Lemberg + + Fix Savannah bug #26600. + + * src/type42/t42parse.c (t42_load_keyword): Handle + T1_FIELD_LOCATION_FONT_EXTRA. + +2009-04-30 Werner Lemberg + + Document recent changes to ftview. + + * docs/CHANGES: Do it. + +2009-04-27 Werner Lemberg + + autohinter: Don't change digit widths if all widths are the same. + This fixes FreeDesktop bug #21197. + + * src/autofit/afglobal.c (AF_DIGIT): New macro. + (af_face_globals_compute_script_coverage): Mark ASCII digits in + `glyph_scripts' array. + (af_face_globals_get_metrics): Updated. + (af_face_globals_is_digit): New function. + * src/autofit/afglobal.h: Updated. + (AF_ScriptMetricsRec): Add `digits_have_same_width' flag. + + * src/autofit/aflatin.c: Include FT_ADVANCES_H. + (af_latin_metrics_check_digits): New function. + (af_latin_metrics_init): Use it. + * src/autofit/aflatin.h: Updated. + * src/autofit/afcjk.c (af_cjk_metrics_init): Updated. + + * src/autofit/aflatin2.c: Similar changes as with aflatin.c. + + * src/autofit/afloader.c (af_loader_load_g): Test digit width. + + * docs/CHANGES: Document it. + +2009-04-26 Werner Lemberg + + Make ftgrays compile with _STANDALONE_ and FT_STATIC_RASTER again. + Problems reported by suyu@cooee.cn. + + * src/smooth/ftgrays.c (FT_DEFINE_OUTLINE_FUNCS, + FT_DEFINE_RASTER_FUNCS) [_STANDALONE_]: Define. + [!_STANDALONE_]: Include ftspic.h only here. + (ras): Define/declare after definition of `TWorker'. + Use `RAS_VAR_' where necessary. + +2009-04-21 Karl Berry + + Fix AC_CHECK_FT2. + + * builds/unix/freetype2.m4: Only check PATH for freetype-config if + we did not already find it from a prefix option. + +2009-04-05 Oran Agra + + Add #error to modules and files that do not support PIC yet. + + When FT_CONFIG_OPTION_PIC is defined the following files will + create #error: + * src/bdf/bdfdrivr.h + * src/cache/ftcmanag.c + * src/cid/cidriver.h + * src/gxvalid/gxvmod.h + * src/gzip/ftgzip.c + * src/lzw/ftlzw.c + * src/otvalid/otvmod.h + * src/pcf/pcfdrivr.h + * src/pfr/pfrdrivr.h + * src/psaux/psauxmod.h + * src/type1/t1driver.h + * src/type42/t42drivr.h + * src/winfonts/winfnt.h + +2009-04-05 Oran Agra + + Position Independent Code (PIC) support in autofit module. + + * include/freetype/internal/autohint.h add macros to init + instances of FT_AutoHinter_ServiceRec. + + * src/autofit/afmodule.h declare autofit_module_class + using macros from ftmodapi.h, + when FT_CONFIG_OPTION_PIC is defined create and destroy + functions will be declared. + * src/autofit/afmodule.c when FT_CONFIG_OPTION_PIC is defined + af_autofitter_service and autofit_module_class structs + will have functions to init or create and destroy them + instead of being allocated in the global scope. + And macros will be used from afpic.h in order to access them. + + * src/autofit/aftypes.h add macros to init and declare + instances of AF_ScriptClassRec. + + * src/autofit/afcjk.h declare af_cjk_script_class + using macros from aftypes.h, + when FT_CONFIG_OPTION_PIC is defined init function will be declared. + * src/autofit/afcjk.c when FT_CONFIG_OPTION_PIC is defined + af_cjk_script_class struct will have function to init it instead of + being allocated in the global scope. + + * src/autofit/afdummy.h declare af_dummy_script_class + using macros from aftypes.h, + when FT_CONFIG_OPTION_PIC is defined init function will be declared. + * src/autofit/afdummy.c when FT_CONFIG_OPTION_PIC is defined + af_dummy_script_class struct will have function to init it instead of + being allocated in the global scope. + + * src/autofit/afindic.h declare af_indic_script_class + using macros from aftypes.h, + when FT_CONFIG_OPTION_PIC is defined init function will be declared. + * src/autofit/afindic.c when FT_CONFIG_OPTION_PIC is defined + af_indic_script_class struct will have function to init it instead of + being allocated in the global scope. + + * src/autofit/aflatin.h declare af_latin_script_class + using macros from aftypes.h, + when FT_CONFIG_OPTION_PIC is defined init function will be declared. + * src/autofit/aflatin.c when FT_CONFIG_OPTION_PIC is defined + af_latin_script_class struct will have function to init it instead of + being allocated in the global scope. + Change af_latin_blue_chars to be PIC-compatible by being a two + dimentional array rather than array of pointers. + + + * src/autofit/aflatin2.h declare af_latin2_script_class + using macros from aftypes.h, + when FT_CONFIG_OPTION_PIC is defined init function will be declared. + * src/autofit/aflatin2.c when FT_CONFIG_OPTION_PIC is defined + af_latin2_script_class struct will have function to init it instead of + being allocated in the global scope. + Change af_latin2_blue_chars to be PIC-compatible by being a two + dimentional array rather than array of pointers. + + * src/autofit/afglobal.c when FT_CONFIG_OPTION_PIC is defined + af_script_classes array initialization was moved to afpic.c and + is later refered using macros defeined in afpic.h. + + New Files: + * src/autofit/afpic.h declare struct to hold PIC globals for autofit + module and macros to access them. + * src/autofit/afpic.c implement functions to allocate, destroy and + initialize PIC globals for autofit module. + + * src/autofit/autofit.c add new file to build: afpic.c. + * src/autofit/jamfile add new files to FT2_MULTI build: afpic.c. + +2009-04-05 Oran Agra + + Position Independent Code (PIC) support in pshinter module. + + * include/freetype/internal/pshints.h add macros to init + instances of PSHinter_Interface. + + * src/pshinter/pshmod.h declare pshinter_module_class + using macros from ftmodapi.h, + when FT_CONFIG_OPTION_PIC is defined create and destroy + functions will be declared. + * src/pshinter/pshmod.c when FT_CONFIG_OPTION_PIC is defined + pshinter_interface and pshinter_module_class structs + will have functions to init or create and destroy them + instead of being allocated in the global scope. + And macros will be used from pshpic.h in order to access them. + + New Files: + * src/pshinter/pshpic.h declare struct to hold PIC globals for pshinter + module and macros to access them. + * src/pshinter/pshpic.c implement functions to allocate, destroy and + initialize PIC globals for pshinter module. + + * src/pshinter/pshinter.c add new file to build: pshpic.c. + * src/pshinter/jamfile add new files to FT2_MULTI build: pshpic.c. + +2009-04-05 Oran Agra + + Position Independent Code (PIC) support in psnames module. + + * include/freetype/internal/services/svpscmap.h add macros to init + instances of FT_Service_PsCMapsRec. + + * src/psnames/psmodule.h declare psnames_module_class + using macros from ftmodapi.h, + when FT_CONFIG_OPTION_PIC is defined create and destroy + functions will be declared. + * src/psnames/psmodule.c when FT_CONFIG_OPTION_PIC is defined + pscmaps_interface and pscmaps_services structs + and psnames_module_class array + will have functions to init or create and destroy them + instead of being allocated in the global scope. + And macros will be used from pspic.h in order to access them. + + New Files: + * src/psnames/pspic.h declare struct to hold PIC globals for psnames + module and macros to access them. + * src/psnames/pspic.c implement functions to allocate, destroy and + initialize PIC globals for psnames module. + + * src/psnames/psnames.c add new file to build: pspic.c. + * src/psnames/jamfile add new files to FT2_MULTI build: pspic.c. + +2009-04-05 Oran Agra + + Position Independent Code (PIC) support in raster renderer. + + * src/raster/ftrend1.h declare ft_raster1_renderer_class + and ft_raster5_renderer_class + using macros from ftrender.h, + when FT_CONFIG_OPTION_PIC is defined create and destroy + functions will be declared. + * src/smooth/ftrend1.c when FT_CONFIG_OPTION_PIC is defined + ft_raster1_renderer_class and ft_raster5_renderer_class structs + will have functions to init or create and destroy them + instead of being allocated in the global scope. + Macros will be used from rastpic.h in order to access + ft_standard_raster from the pic_container (allocated in ftraster.c). + In ft_raster1_render when PIC is enabled, the last letter of + module_name is used to verfy the renderer class rather than the + class pointer. + + * src/raster/ftraster.c when FT_CONFIG_OPTION_PIC is defined + ft_standard_raster struct will have function to init it + instead of being allocated in the global scope. + + New Files: + * src/raster/rastpic.h declare struct to hold PIC globals for raster + renderer and macros to access them. + * src/raster/rastpic.c implement functions to allocate, destroy and + initialize PIC globals for raster renderer. + + * src/raster/raster.c add new file to build: rastpic.c. + * src/raster/jamfile add new files to FT2_MULTI build: rastpic.c. + +2009-04-05 Oran Agra + + Position Independent Code (PIC) support in smooth renderer. + + * src/smooth/ftsmooth.h declare ft_smooth_renderer_class, + ft_smooth_lcd_renderer_class and ft_smooth_lcd_v_renderer_class + using macros from ftrender.h, + when FT_CONFIG_OPTION_PIC is defined create and destroy + functions will be declared. + * src/smooth/ftsmooth.c when FT_CONFIG_OPTION_PIC is defined + the following structs: + ft_smooth_renderer_class, ft_smooth_lcd_renderer_class + and ft_smooth_lcd_v_renderer_class + will have functions to init or create and destroy them + instead of being allocated in the global scope. + And macros will be used from ftspic.h in order to access + ft_grays_raster from the pic_container (allocated in ftgrays.c). + + * src/smooth/ftgrays.h include FT_CONFIG_CONFIG_H + * src/smooth/ftgrays.c when FT_CONFIG_OPTION_PIC is NOT defined + func_interface was moved from gray_convert_glyph_inner function + to the global scope. + When FT_CONFIG_OPTION_PIC is defined + func_interface and ft_grays_raster structs + will have functions to init them + instead of being allocated in the global scope. + And func_interface will be allocated on the stack of + gray_convert_glyph_inner. + + New Files: + * src/smooth/ftspic.h declare struct to hold PIC globals for smooth + renderer and macros to access them. + * src/smooth/ftspic.c implement functions to allocate, destroy and + initialize PIC globals for smooth renderer. + + * src/smooth/smooth.c add new file to build: ftspic.c. + * src/smooth/jamfile add new files to FT2_MULTI build: ftspic.c. + +2009-04-05 Oran Agra + + Position Independent Code (PIC) support in cff driver. + + * include/freetype/internal/services/svcid.h add macros to init + instances of FT_Service_CIDRec. + * include/freetype/internal/services/svpsinfo.h add macros to init + instances of FT_Service_PsInfoRec. + + * src/cff/cffcmap.h declare cff_cmap_encoding_class_rec + and cff_cmap_unicode_class_rec using macros from + ftobjs.h, when FT_CONFIG_OPTION_PIC is defined create and destroy + functions will be declared. + * src/cff/cffcmap.c when FT_CONFIG_OPTION_PIC is defined + the following structs: + cff_cmap_encoding_class_rec and cff_cmap_unicode_class_rec + will have functions to init or create and destroy them + instead of being allocated in the global scope. + + * src/cff/cffdrivr.h declare cff_driver_class using macros from + ftdriver.h, when FT_CONFIG_OPTION_PIC is defined create and destroy + functions will be declared. + * src/cff/cffdrivr.c when FT_CONFIG_OPTION_PIC is defined + the following structs: + cff_service_glyph_dict, cff_service_ps_info, cff_service_ps_name + cff_service_get_cmap_info, cff_service_cid_info, cff_driver_class, + and cff_services array + will have functions to init or create and destroy them + instead of being allocated in the global scope. + And macros will be used from cffpic.h in order to access them + from the pic_container. + Use macros from cffpic.h in order to access the + structs allocated in cffcmap.c + + * src/cff/cffobjs.c Use macros from cffpic.h in order to access the + structs allocated in cffcmap.c + + * src/cff/parser.c when FT_CONFIG_OPTION_PIC is defined + implement functions to create and destroy cff_field_handlers array + instead of being allocated in the global scope. + And macros will be used from cffpic.h in order to access it + from the pic_container. + + New Files: + * src/cff/cffpic.h declare struct to hold PIC globals for cff + driver and macros to access them. + * src/cff/cffpic.c implement functions to allocate, destroy and + initialize PIC globals for cff driver. + + * src/cff/cff.c add new file to build: cffpic.c. + * src/cff/jamfile add new files to FT2_MULTI build: cffpic.c. + +2009-04-05 Oran Agra + + Position Independent Code (PIC) support in sfnt driver. + + * include/freetype/internal/services/svbdf.h add macros to init + instances of FT_Service_BDFRec. + * include/freetype/internal/services/svgldict.h add macros to init + instances of FT_Service_GlyphDictRec. + * include/freetype/internal/services/svpostnm.h add macros to init + instances of FT_Service_PsFontNameRec. + * include/freetype/internal/services/svsfnt.h add macros to init + instances of FT_Service_SFNT_TableRec. + * include/freetype/internal/services/svttcmap.h add macros to init + instances of FT_Service_TTCMapsRec. + * include/freetype/internal/sfnt.h add macros to init + instances of SFNT_Interface. + + * src/sfnt/sfdriver.h declare sfnt_module_class using macros from + ftmodapi.h, when FT_CONFIG_OPTION_PIC is defined create and destroy + functions will be declared. + * src/sfnt/sfdriver.c when FT_CONFIG_OPTION_PIC is defined + the following structs: + sfnt_service_sfnt_table, sfnt_service_glyph_dict, sfnt_service_ps_name + tt_service_get_cmap_info, sfnt_service_bdf, sfnt_interface, + sfnt_module_class, and sfnt_services array + will have functions to init or create and destroy them + instead of being allocated in the global scope. + And macros will be used from sfntpic.h in order to access them + from the pic_container. + + * src/sfnt/ttcmap.h add macros to init + instances of TT_CMap_ClassRec. + * src/sfnt/ttcmap.c when FT_CONFIG_OPTION_PIC is defined + the following structs: + tt_cmap0_class_rec, tt_cmap2_class_rec, tt_cmap4_class_rec + tt_cmap6_class_rec, tt_cmap8_class_rec, tt_cmap10_class_rec, + tt_cmap12_class_rec, tt_cmap14_class_rec and tt_cmap_classes array + will have functions to init or create and destroy them + instead of being allocated in the global scope. + And macros will be used from sfntpic.h in order to access them + from the pic_container. + The content of tt_cmap_classes is now described in the + new file 'ttcmapc.h'. + + New Files: + * src/sfnt/sfntpic.h declare struct to hold PIC globals for sfnt + driver and macros to access them. + * src/sfnt/sfntpic.c implement functions to allocate, destroy and + initialize PIC globals for sfnt driver. + * src/sfnt/ttcmapc.h describing the content of + tt_cmap_classes allocated in ttcmap.c + + * src/sfnt/sfnt.c add new file to build: sfntpic.c. + * src/sfnt/jamfile add new files to FT2_MULTI build: sfntpic.c. + +2009-04-05 Oran Agra + + Position Independent Code (PIC) support in truetype driver. + + * include/freetype/internal/services/svmm.h add macros to init + instances of FT_Service_MultiMastersRec. + * include/freetype/internal/services/svttglyf.h add macros to init + instances of FT_Service_TTGlyfRec. + + * src/truetype/ttdriver.h declare tt_driver_class using macros from + ftdriver.h, when FT_CONFIG_OPTION_PIC is defined create and destroy + functions will be declared. + * src/truetype/ttdriver.c when FT_CONFIG_OPTION_PIC is defined + the following structs: + tt_service_gx_multi_masters, tt_service_truetype_glyf, tt_driver_class + and tt_services array, + will have functions to init or create and destroy them + instead of being allocated in the global scope. + And macros will be used from ttpic.h in order to access them + from the pic_container. + * src/truetype/ttobjs.c change trick_names array to be + PIC-compatible by being a two dimentional array rather than array + of pointers. + + New Files: + * src/truetype/ttpic.h declare struct to hold PIC globals for truetype + driver and macros to access them. + * src/truetype/ttpic.c implement functions to allocate, destroy and + initialize PIC globals for truetype driver. + + * src/truetype/truetype.c add new file to build: ttpic.c. + * src/truetype/jamfile add new files to FT2_MULTI build: ttpic.c. + +2009-04-05 Oran Agra + + Position Independent Code (PIC) support and infrastructure in base. + + * include/freetype/config/ftoption.h add FT_CONFIG_OPTION_PIC + * include/freetype/internal/ftobjs.h Add pic_container member to + FT_LibraryRec. + Add macros to declare and init instances of FT_CMap_ClassRec. + Add macros to init instances of FT_Outline_Funcs and FT_Raster_Funcs. + Add macros to declare, allocate and initialize modules + (FT_Module_Class). + Add macros to declare, allocate and initialize renderers + (FT_Renderer_Class). + Add macro to init instances of FT_Glyph_Class. + Add macros to declare, allocate and initialize drivers + (FT_Driver_ClassRec). + * include/freetype/internal/ftpic.h new file to declare the + FT_PIC_Container struct and the functions to allocate and detroy it. + * include/freetype/internal/ftserv.h add macros to allocate and + destory arrays of FT_ServiceDescRec. + * include/freetype/internal/internal.h define macro to include + ftpic.h. + + New Files: + * src/base/ftpic.c implement functions to allocate and destory the + global pic_container. + * src/base/basepic.h declare struct to hold PIC globals for base and + macros to access them. + * src/base/basepic.c implement functions to allocate, destroy and + initialize PIC globals for base. + + * src/base/ftinit.c when FT_CONFIG_OPTION_PIC is defined implement + functions that allocate and destroy ft_default_modules according to + FT_CONFIG_MODULES_H in the pic_container instead of the global scope + and use macro from basepic.h to access it. + * src/base/ftobjs.c add calls to the functions that allocate and + destroy the global pic_container when the library is created and + destroyed. + + * src/base/jamfile add new files to FT2_MULTI build: + ftpic.c and basepic.c. + * src/base/ftbase.c add new files to build: + ftpic.c and basepic.c. + + * src/base/ftglyph.c when FT_CONFIG_OPTION_PIC is defined + ft_bitmap_glyph_class and ft_outline_glyph_class will be allocated + in the pic_container instead of the global scope and use macros from + basepic.h to access them. + * src/base/ftbbox.c allocate bbox_interface stract on the stack + instead of the global scope when FT_CONFIG_OPTION_PIC is defined. + * src/base/ftstroke.c access ft_outline_glyph_class allocated in + ftglyph.c via macros from basepic.h + +2009-04-05 Oran Agra + + Preparing changes in cff parser later needed for PIC version. + + * src/cff/cffload.c, src/cff/cffload.h, src/cff/cffobjs.c, + src/cff/cffparse.c, src/cff/cffparse.h: Add library pointer to + 'CFF_ParserRec' set by `cff_parser_init'. + Route library pointer from 'cff_face_init' to 'cff_subfont_load' + for `cff_parser_init'. + + * src/cff/cffparse.c (CFF_Field_Handler): Move it to... + * src/cff/cffparse.h: This file, to be used by other C files. + +2009-04-05 Oran Agra + + Minor change in ftstroke.c. + + * src/base/ftstroke.c (FT_StrokerRec): Replace `memory' member with + `library' needed for PIC version. + Update all callers. + +2009-04-04 Werner Lemberg + + ftnames.c -> ftsnames.c + + * src/base/ftnames.c: Rename to... + * src/base/ftsnames.c: This. + * src/base/Jamfile, src/base/rules.mk, src/base/ftbase.c: Updated. + +2009-04-04 Werner Lemberg + + Add support for cmap type 13. + + * devel/ftoption.h, include/freetype/config/ftoption.h + (TT_CONFIG_CMAP_FORMAT_13): New macro. + + * src/sfnt/ttcmap.c (TT_CMap13Rec, tt_cmap13_init, + tt_cmap13_validate, tt_cmap13_char_index, tt_cmap13_char_next, + tt_cmap13_get_info, tt_cmap13_char_map_def_binary, + tt_cmap14_class_rec): New functions and structures for cmap 13 + support. + (tt_cmap_classes): Register tt_cmap13_class_rec. + + * docs/CHANGES: Mention cmap 13 support. + +2009-04-01 Werner Lemberg + + Ignore empty contours in CFF glyphs. + + Problem reported by Albert Astals Cid . + + * src/cff/cffgload.c (cff_builder_close_contour): Synchronize with + t1_builder_close_contour. + +2009-03-21 Werner Lemberg + + Another redundant header inclusion. + + * src/truetype/ttgxvar.c: Fix Ghostscript Coverity issue #4041. + +2009-03-21 Werner Lemberg + + Remove redundant header inclusions. + + This covers many Ghostscript Coverity issues. + + * src/*: Do it. + +2009-03-21 Werner Lemberg + + Fix Ghostscript Coverity issue #3904. + + * src/truetype/ttgxvar.c (ft_var_readpackedpoints): Protect against + invalid values of `runcnt'. + +2009-03-20 Werner Lemberg + + Fix `make multi' run. + + * src/smooth/ftsmooth.h: Include FT_INTERNAL_DEBUG_H. + +2009-03-20 Werner Lemberg + + Fix Savannah bug #25923. + + * src/cache/ftccmap.c (FTC_CMAP_HASH): Fix typo. + +2009-03-20 Werner Lemberg + + Protect against too large glyphs. + + Problem reported by Tavis Ormandy . + + * src/smooth/ftsmooth.c (ft_smooth_render_generic): Don't allow + `pitch' or `height' to be larger than 0xFFFF. + +2009-03-20 Werner Lemberg + Tavis Ormandy + + Fix validation for various cmap table formats. + + * src/sfnt/ttcmap.c (tt_cmap8_validate, tt_cmap10_validate, + tt_cmap12_validate): Check `length' correctly. + (tt_cmap_14_validate): Check `length' and `numMappings' correctly. + +2009-03-20 Werner Lemberg + + Protect against malformed compressed data. + + * src/lzw/ftzopen.c (ft_lzwstate_io): Test whether `state->prefix' is + zero. + +2009-03-20 Werner Lemberg + + Protect against invalid SID values in CFFs. + + Problem reported by Tavis Ormandy . + + * src/cff/cffload.c (cff_charset_load): Reject SID values larger + than 64999. + +2009-03-19 Vincent Richomme + + Update WinCE Visual C project files. + + * builds/wince/vc2005-ce/freetype.vcproj, + builds/wince/vc2008-ce/freetype.vcproj: Add missing base extension + files. + +2009-03-19 Werner Lemberg + + Remove unused Win32 code. + + * builds/wince/ftdebug.c: Remove code guarded with `!_WIN32_WCE'. + Since Win32 is handled separately this is no longer needed. + +2009-03-19 Vincent Richomme + + Make `gzip' module compile on WinCE. + + * src/gzip/zconf.h [_WIN32_WCE]: Define NO_ERRNO_H. + +2009-03-19 Werner Lemberg + + Remove unused WinCE code. + + * builds/win32/ftdebug.c: Remove code guarded with `_WIN32_WCE'. + Since WinCE is handled separately this is no longer needed. + +2009-03-16 Werner Lemberg + + docmaker: Don't ignore single-line code blocks. + + * src/tools/docmaker/content.py (DocBlock::_init__): Fix change from + 2009-01-31. + +2009-03-15 Steve Langasek + + Use __asm__ for declaring assembly instead of asm. + + * builds/unix/ftconfig.in (FT_MulFix_arm): Use __asm__ instead of + asm on arm, fixing a build failure on armel with -pedantic. + +2009-03-14 Werner Lemberg + + Fix valgrind warning. + + * src/sfnt/ttsbit0.c (tt_sbit_decoder_load_bit_aligned): Don't read + past the end of the frame. + +2009-03-12 Werner Lemberg + + * Version 2.3.9 released. + ========================= + + + Tag sources with `VER-2-3-9'. + +2009-03-12 Werner Lemberg + + * builds/unix/freetype2.in: Move @FT2_EXTRA_LIBS@ to `Libs.private'. + +2009-03-12 Werner Lemberg + + Fix some FreeType Coverity issues as reported for Ghostscript. + + * src/base/ftobjs.c (FT_New_Face, FT_New_Memory_Face): Initialize + `args.stream' (#3874, #3875). + (open_face_PS_from_sfnt_stream): Improve error management (#3786). + * src/base/ftmm.c (ft_face_get_mm_service): Fix check of `aservice' + (#3870). + * src/base/ftstroke.c (ft_stroke_border_get_counts): Remove dead + code (#3790). + * src/base/ftrfork.c (raccess_guess_apple_generic): Check error + value of `FT_Stream_Skip' (#3784). + + * src/type1/t1gload.c (T1_Load_Glyph): Check `size' before accessing + it (#3872) + + * src/pcf/pcfdrivr.c (PCF_Glyph_Load): Check `face' before accessing + it (#3871). + * src/pcf/pcfread.c (pcf_get_metrics): Handle return value of + `pcf_get_metric' (#3789, #3782). + (pcf_get_properties): Use FT_STREAM_SKIP (#3783). + + * src/cache/ftcmanag.c (FTC_Manager_RegisterCache): Fix check of + `acache' (#3797) + + * src/cff/cffdrivr.c (cff_ps_get_font_info): Fix check of `cff' + (#3796). + * src/cff/cffgload.c (cff_decoder_prepare): Check `size' (#3795). + * src/cff/cffload.c (cff_index_get_pointers): Add comment (#3794). + + * src/bdf/bdflib.c (_bdf_add_property): Check `fp->value.atom' + (#3793). + (_bdf_parse_start): Add comment (#3792). + + * src/raster/ftraster.c (Finalize_Profile_Table): Check + `ras.fProfile' (#3791). + + * src/sfnt/ttsbit.c (Load_SBit_Image): Use FT_STREAM_SKIP (#3785). + + * src/gzip/ftgzip.c (ft_gzip_get_uncompressed_size): Properly ignore + seek error (#3781). + +2009-03-11 Michael Toftdal + + Extend CID service functions to handle CID-keyed CFFs as CID fonts. + + * include/freetype/ftcid.h (FT_Get_CID_Is_Internally_CID_keyed, + FT_Get_CID_From_Glyph_Index): New functions. + + * include/freetype/internal/services/svcid.h + (FT_CID_GetIsInternallyCIDKeyedFunc, + FT_CID_GetCIDFromGlyphIndexFunc): New function typedefs. + (CID Service): Use them. + + * src/base/ftcid.c: Include FT_CID_H. + (FT_Get_CID_Is_Internally_CID_keyed, FT_Get_CID_From_Glyph_Index): + New functions. + + * src/cff/cffdrivr.c (cff_get_is_cid, cff_get_cid_from_glyph_index): + New functions. + (cff_service_cid_info): Add them. + * src/cff/cffload.c (cff_font_load): Don't free `font->charset.sids' + -- it is needed for access as a CID-keyed font. It gets deleted + later on. + + * src/cid/cidriver.c (cid_get_is_cid, cid_get_cid_from_glyph_index): + New functions. + (cid_service_cid_info): Add them. + + * docs/CHANGES: Updated. + +2009-03-11 Bram Tassyns + + Fix Savannah bug #25597. + + * src/cff/cffparse.c (cff_parse_real): Don't allow fraction_length + to become larger than 9. + +2009-03-11 Werner Lemberg + + Fix Savannah bug #25814. + + * builds/unix/freetype2.in: As suggested in the bug report, move + @LIBZ@ to `Libs.private'. + +2009-03-11 Werner Lemberg + + Fix Savannah bug #25781. + We now simply check for a valid `offset', no longer handling `delta + = 1' specially. + + * src/sfnt/ttcmap.c (tt_cmap4_validate): Don't check `delta' for + last segment. + (tt_cmap4_set_range, tt_cmap4_char_map_linear, + tt_cmap4_char_map_binary): Check offset. + +2009-03-11 Werner Lemberg + + * src/base/Jamfile: Fix handling of ftadvanc.c. + Reported by Oran Agra . + +2009-03-10 Vincent Richomme + + Restructure Win32 and Wince compiler support. + + * src/builds/win32: Remove files for WinCE. + Move VC 2005 support to a separate directory. + Add directory for VC 2008 support. + + * src/builds/wince: New directory hierarchy for WinCE compilers + (VC 2005 and VC 2008). + +2009-03-09 Werner Lemberg + + More preparations for 2.3.9 release. + + * docs/CHANGES: Updated. + + * Jamfile, README: s/2.3.8/2.3.9/, s/238/239/. + +2009-03-09 Werner Lemberg + + * src/sfnt/rules.mk (SFNT_DRV_H): Add ttsbit0.c. + +2009-03-09 Alexey Kryukov + + Fix handling of EBDT formats 8 and 9 (part 2). + + This patch fixes the following problems in ttsbit0.c: + + . Bitmaps for compound glyphs were never allocated. + + . `SBitDecoder' refused to load metrics if some other metrics have + already been loaded. This condition certainly makes no sense for + recursive calls, so I've just disabled it. Another possibility + would be resetting `decoder->metrics_loaded' to false before + loading each composite component. However, we must restore the + original metrics after finishing the recursion; otherwise we can + get a misaligned glyph. + + . `tt_sbit_decoder_load_bit_aligned' incorrectly handled `x_pos', + causing some glyph components to be shifted too far to the right + (especially noticeable for small sizes). + + Note that support for grayscale bitmaps (not necessarily compound) is + completely broken in ttsbit0.c. + + * src/sfnt/tt_sbit_decoder_load_metrics: Always load metrics. + (tt_sbit_decoder_load_bit_aligned): Handle `x_pos' correctly in case + of `h == height'. + (tt_sbit_decoder_load_compound): Reset metrics after loading + components. + Allocate bitmap. + +2009-03-09 Werner Lemberg + + * builds/unix/configure.raw (version_info): Set to 9:20:3. + +2009-03-03 David Turner + + Protect SFNT kerning table parser against malformed tables. + + This closes Savannah BUG #25750. + + * src/sfnt/ttkern.c (tt_face_load_kern, tt_face_get_kerning): Fix a + bug where a malformed table would be successfully loaded but later + crash the engine during parsing. + +2009-03-03 David Turner + + Update documentation and bump version number to 2.3.9. + + * include/freetype/freetype.h: Bump patch version to 9. + * docs/CHANGES: Document the ABI break in 2.3.8. + * docs/VERSION.DLL: Update version numbers table for 2.3.9. + +2009-03-03 David Turner + + Remove ABI-breaking field in public PS_InfoFontRec definition. + + Instead, we define a new internal PS_FontExtraRec structure to + hold the additional field, then place it in various internal + positions of the corresponding FT_Face derived objects. + + * include/freetype/t1tables.h (PS_FontInfoRec): Remove the + `fs_type' field from the public structure. + * include/freetype/internal/psaux.h (T1_FieldLocation): New + enumeration `T1_FIELD_LOCATION_FONT_EXTRA'. + * include/freetype/internal/t1types.h (PS_FontExtraRec): New + structure. + (T1_FontRec, CID_FaceRec): Add it. + + * src/cid/cidload.c (cid_load_keyword): Handle + T1_FIELD_LOCATION_FONT_EXTRA. + * src/cid/cidtoken.h, src/type1/t1tokens.h, src/type42/t42parse.c: + Adjust FT_STRUCTURE and T1CODE properly to handle `FSType'. + * src/type1/t1load.c (t1_load_keyword): Handle + T1_FIELD_LOCATION_FONT_EXTRA. + + * include/freetype/internal/services/svpsinfo.h (PsInfo service): + Add `PS_GetFontExtraFunc' function typedef. + + * src/base/ftfstype.c: Include FT_INTERNAL_SERVICE_H and + FT_SERVICE_POSTSCRIPT_INFO_H. + (FT_Get_FSType_Flags): Use POSTSCRIPT_INFO service. + + * src/cff/cffdrivr.c (cff_service_ps_info): Updated. + * src/cid/cidriver.c (cid_ps_get_font_extra): New function. + (cid_service_ps_info): Updated. + * src/type1/t1driver.c (t1_ps_get_font_extra): New function. + (t1_service_ps_info): Updated. + * src/type42/t42drivr.c (t42_ps_get_font_extra): New function. + (t42_service_ps_info): Updated. + +2009-03-02 Alexey Kryukov + + Fix handling of EBDT formats 8 and 9. + + The main cycle in `blit_sbit' makes too many iterations: it actually + needs the count of lines in the source bitmap rather than in the + target image. + + * src/sfnt/ttsbit.c (blit_sbit) [FT_CONFIG_OPTION_OLD_INTERNALS]: + Add parameter `source_height' and use it for main loop. + (Load_SBit_Single) [FT_CONFIG_OPTION_OLD_INTERNALS]: Updated. + +2009-02-23 Werner Lemberg + + Fix Savannah bug #25669. + + * src/base/ftadvanc.h (FT_Get_Advances): Fix serious typo. + + * src/base/ftobjs.c (FT_Select_Metrics, FT_Request_Metrics): Fix + scaling factor for non-scalable fonts. + + * src/cff/cffdrivr.c (cff_get_advances): Use correct advance width + value to prevent incorrect scaling. + + * docs/CHANGES: Document it. + +2009-02-15 Matt Godbolt + + Fix Savannah bug #25588. + + * builds/unix/ftconfig.in (FT_MulFix_arm): Use correct syntax for + `orr' instruction. + +2009-02-11 Werner Lemberg + + * src/truetype/ttobjs.c (tt_check_trickyness): Add `DFKaiShu'. + Reported by David Bevan . + +2009-02-09 Werner Lemberg + + Fix Savannah bug #25495. + + * src/sfnt/sfobjs.c (sfnt_load_face): Test for bitmap strikes before + setting metrics and bbox values. This ensures that the check for a + font with neither a `glyf' table nor bitmap strikes can be performed + early enough to set metrics and bbox values too. + +2009-02-04 Werner Lemberg + + Fix Savannah bug #25480. + + * builds/unix/freetype-config.in: For --ftversion, don't use $prefix + but $includedir. + +2009-01-31 Werner Lemberg + + Minor docmaker improvements. + + * src/tools/docmaker/content.py (DocBlock::__init__): Ignore empty + code blocks. + +2009-01-25 Werner Lemberg + + Fix SCANCTRL handling in TTFs. + Problem reported by Alexey Kryukov . + + * src/truetype/ttinterp.c (Ins_SCANCTRL): Fix threshold handling. + +2009-01-23 Werner Lemberg + + Move FT_Get_FSType_Flags to a separate file. + Problem reported by Mickey Gabel . + + * src/base/ftobjs.c (FT_Get_FSType_Flags): Move to... + * src/base/ftfstype.c: This new file. + + * modules.cfg (BASE_EXTENSION): Add ftfstype.c. + + * docs/INSTALL.ANY: Updated. + + * builds/mac/*.txt, builds/amiga/*makefile*, + builds/win32/{visualc,visualce}/freetype.*, builds/symbian/*: + Updated. + +2009-01-22 suzuki toshiya + + * builds/unix/ftsystem.c (FT_Stream_Open): Fix 2 error + messages ending without "\n". + +2009-01-22 suzuki toshiya + + Fix Savannah bug #25347. + + * src/base/ftobjs.c (open_face_PS_from_sfnt_stream): Rewind + the stream to the original position passed to this function, + when ft_lookup_PS_in_sfnt_stream() failed. + (Mac_Read_sfnt_Resource): Rewind the stream to the head of + sfnt resource body, when open_face_PS_from_sfnt_stream() + failed. + +2009-01-19 Michael Lotz + + Fix Savannah bug #25355. + + * include/freetype/config/ftconfig.h (FT_MulFix_i386): Make + assembler code work with gcc 2.95.3 (as used by the Haiku project). + Add `cc' register to the clobber list. + +2009-01-18 Werner Lemberg + + Protect FT_Get_Next_Char. + + * src/sfnt/ttcmap.c (tt_cmap4_set_range): Apply fix similar to + change from 2008-07-22. + + Patch from Ronen Ghoshal . + +2009-01-18 Werner Lemberg + + Implement FT_Get_Name_Index for SFNT driver. + + * src/sfnt/sfdriver.c (sfnt_get_name_index): New function. + (sfnt_service_glyph_dict): Use it. + + Problem reported by Truc Truong . + +2009-01-18 Werner Lemberg + + * include/freetype/ftstroke.h (FT_Outline_GetInsideBorder): Fix + documentation. Problem reported by Truc Truong . + + * docs/CHANGES: Updated. + +2009-01-14 Werner Lemberg + + * Version 2.3.8 released. + ========================= + + + Tag sources with `VER-2-3-8'. + + * docs/VERSION.DLL: Update documentation and bump version number to + 2.3.8. + + * README, Jamfile (RefDoc), builds/win32/visualc/index.html, + builds/win32/visualc/freetype.dsp, + builds/win32/visualc/freetype.vcproj, + builds/win32/visualce/index.html, + builds/win32/visualce/freetype.dsp, + builds/win32/visualce/freetype.vcproj: s/2.3.7/2.3.8/, s/237/238/. + + * include/freetype/freetype.h (FREETYPE_PATCH): Set to 8. + + * builds/unix/configure.raw (version_info): Set to 9:19:3. + + * docs/release: Updated. + +2009-01-14 Werner Lemberg + + * builds/toplevel.mk (dist): Compress better. + +2009-01-13 Werner Lemberg + + * src/base/ftobjs.c (FT_Get_FSType_Flags): Cast for compilation + with C++. + +2009-01-13 Werner Lemberg + + Don't use stdlib.h and friends directly. + Reported by Mickey Gabel . + + * src/base/ftdbgmem.c: s//FT_CONFIG_STANDARD_LIBRARY_H/. + + * src/gzip/ftgzip.c, src/lzw/ftlzw.c, src/raster/ftmisc.h: + s//FT_CONFIG_STANDARD_LIBRARY_H/. + + * src/autofit/aftypes.h, src/autofit/afhints.c, + src/pshinter/pshalgo.c: s//FT_CONFIG_STANDARD_LIBRARY_H/ + + * src/lzw/ftlzw.c, src/base/ftdbgmem.c: Don't include stdio.h. + +2009-01-12 Werner Lemberg + + Avoid compiler warnings. + + * */*: s/do ; while ( 0 )/do { } while ( 0 )/. + Reported by Sean McBride . + +2009-01-12 Werner Lemberg + + Fix stdlib dependencies. + + Problem reported by Mickey Gabel . + + * include/freetype/config/ftstdlib.h (ft_exit): Removed. Unused. + + * src/autofit/afhints.c, src/base/ftlcdfil.c, src/smooth/ftsmooth.c: + s/memcpy/ft_memcpy/. + * src/psaux/t1decode.c: s/memset/ft_memset/, s/memcpy/ft_memcpy/. + +2009-01-11 Werner Lemberg + + * docs/formats.txt: Add link to PCF specification. + + * include/freetype/ftbdf.h (FT_Get_BDF_Property): Improve + documentation. + +2009-01-09 suzuki toshiya + + * src/base/ftadvanc.c (_ft_face_scale_advances, FT_Get_Advance, + FT_Get_Advances): Change the type of load_flags from FT_UInt32 to + FT_Int32, to match with the flags for FT_Load_Glyph(). + * src/cff/cffdrivr.c (cff_get_advances): Ditto. + * src/truetype/ttdriver.c (tt_get_advances): Ditto. + * include/freetype/ftadvanc.h (FT_Get_Advance, FT_Get_Advances): + Ditto. + * include/freetype/internal/ftdriver.h (FT_Face_GetAdvancesFunc): + Ditto. + +2009-01-09 Daniel Zimmermann + + * src/gxvalid/gxvmort.c (gxv_mort_feature_validate): Fix wrong + length check. From Savannah patch #6682. + +2009-01-09 Werner Lemberg + + Fix problem with T1_FIELD_{NUM,FIXED}_TABLE2. + + * src/psaux/psobjs.c (ps_parser_load_field_table): Don't handle + `count_offset' if it is zero (i.e., unused). Otherwise, the first + element of the structure which holds the data is erroneously + modified. Problem reported by Chi Nguyen . + +2009-01-09 suzuki toshiya + + * src/base/ftadvanc.c (_ft_face_scale_advances, FT_Get_Advance, + FT_Get_Advances): Extend the type of load_flags from FT_UInt to + FT_UInt32, to pass 32-bit flags on 16bit platforms. + * src/cff/cffdrivr.c (cff_get_advances): Ditto. + * src/truetype/ttdriver.c (tt_get_advances): Ditto. + * include/freetype/ftadvanc.h (FT_Get_Advance, FT_Get_Advances): + Ditto. + * include/freetype/internal/ftdriver.h (FT_Face_GetAdvancesFunc): + Ditto. + +2009-01-09 suzuki toshiya + + * src/base/ftobjs.c (FT_Done_Library): Issue an error message when + FT_Done_Face() cannot free all faces. If the list of the opened + faces includes broken face which FT_Done_Face() cannot free, + FT_Done_Library() retries FT_Done_Face() and it can fall into + an endless loop. See the discussion: + http://lists.gnu.org/archive/html/freetype-devel/2008-09/msg00047.html + http://lists.gnu.org/archive/html/freetype-devel/2008-10/msg00000.html + +2009-01-07 Werner Lemberg + + * docs/CHANGES: Document new key `a' in ftdiff. + +2009-01-06 Werner Lemberg + + * autogen.sh: Don't use GNUisms while calling sed. Problem reported + by Sean McBride. + +2009-01-06 Werner Lemberg + + * src/base/ftbitmap.c (FT_Bitmap_Convert): Handle FT_PIXEL_MODE_LCD + and FT_PIXEL_MODE_LCD_V. Problem reported by Chi Nguyen + . + +2009-01-06 Diego Pettenò + + * builds/unix/configure.raw: Don't call AC_CANONICAL_BUILD and + AC_CANONICAL_TARGET and use $host_os only. A nice explanation for + this change can be found at + http://blog.flameeyes.eu/s/canonical-target. + + From Savannah patch #6712. + +2009-01-06 Sean McBride + + * src/base/ftdbgmem.c (_debug_mem_dummy): Make it static. + + * src/base/ftmac.c: Remove some #undefs. + +2008-12-26 Werner Lemberg + + Set `face_index' field in FT_Face for all font formats. + + * cff/cffobjs.c (cff_face_init), winfonts/winfnt.c (FNT_Face_Init), + sfnt/sfobjs.c (sfnt_init_face): Do it. + + * docs/CHANGES: Document it. + +2008-12-22 Steve Grubb + + * builds/unix/ftsystem.c (FT_Stream_Open): Reject zero-length files. + Patch from Savannah bug #25151. + +2008-12-21 Werner Lemberg + + * src/pfr/pfrdrivr.c, src/winfonts/winfnt.c, src/cache/ftcmanag.c, + src/smooth/ftgrays.c, src/base/ftobjc.s, src/sfobjs.c: + s/_Err_Bad_Argument/_Err_Invalid_Argument/. The former is for + errors in the bytecode interpreter only. + +2008-12-21 Werner Lemberg + + * src/base/ftpfr.c (FT_Get_PFR_Metrics): Protect against NULL + arguments. + Fix return value for non-PFR fonts. Both problems reported by Chi + Nguyen . + +2008-12-21 anonymous + + FT_USE_MODULE declares things as: + + extern const FT_Module_Class + + (or similar for C++). However, the actual types of the variables + being declared are often different, e.g., FT_Driver_ClassRec or + FT_Renderer_Class. (Some are, indeed, FT_Module_Class.) + + This works with most C compilers (since those structs begin with an + FT_Module_Class struct), but technically it's undefined behavior. + + To quote the ISO/IEC 9899:TC2 final committee draft, section 6.2.7 + paragraph 2: + + All declarations that refer to the same object or function shall + have compatible type; otherwise, the behavior is undefined. + + (And they are not compatible types.) + + Most C compilers don't reject (or even detect!) code which has this + issue, but the GCC LTO development branch compiler does. (It + outputs the types of the objects while generating .o files, along + with a bunch of other information, then compares them when doing the + final link-time code generation pass.) + + Patch from Savannah bug #25133. + + * src/base/ftinit.c (FT_USE_MODULE): Include variable type. + + * builds/amiga/include/freetype/config/ftmodule.h, + include/freetype/config/ftmodule.h, */module.mk: Updated to declare + pass correct types to FT_USE_MODULE. + +2008-12-21 Hongbo Ni + + * src/autofit/aflatin.c (af_latin_hint_edges), + src/autofit/aflatin2.c (af_latin2_hint_edges), src/autofit/afcjk.c + (af_cjk_hint_edges): Protect against division by zero. This fixes + Savannah bug #25124. + +2008-12-18 Werner Lemberg + + * docs/CHANGES: Updated. + +2008-12-18 Bevan, David + + Provide API for accessing embedding and subsetting restriction + information. + + * include/freetype.h (FT_FSTYPE_INSTALLABLE_EMBEDDING, + FT_FSTYPE_RESTRICTED_LICENSE_EMBEDDING, + FT_FSTYPE_PREVIEW_AND_PRINT_EMBEDDING, FT_FSTYPE_EDITABLE_EMBEDDING, + FT_FSTYPE_NO_SUBSETTING, FT_FSTYPE_BITMAP_EMBEDDING_ONLY): New + macros. + (FT_Get_FSType_Flags): New function declaration. + + * src/base/ftobjs.c (FT_Get_FSType_Flags): New function. + + * src/cid/cidtoken.h, src/type1/t1tokens.h, src/type42/t42parse.c + (t42_keywords): Handle `FSType'. + + * include/freetype/t1tables.h (PS_FontInfoRec): Add `fs_type' field. + +2008-12-17 Werner Lemberg + + * src/base/ftsynth.c (FT_GlyphSlot_Embolden): Don't use internal + macros so that copying the source code into an application works + out of the box. + +2008-12-17 Werner Lemberg + + * include/freetype/ftsynth.h, src/base/ftsynth.c: Move + FT_GlyphSlot_Own_Bitmap to... + * include/freetype/ftbitmap.h, src/base/ftbitmap.c: These files. + + * docs/CHANGES: Document it. + +2008-12-10 Werner Lemberg + + Generalize the concept of `tricky' fonts by introducing + FT_FACE_FLAG_TRICKY to indicate that the font format's hinting + engine is necessary for correct rendering. + + At the same time, slightly modify the behaviour of tricky fonts: + FT_LOAD_NO_HINTING is now ignored. To really force raw loading + of tricky fonts (without hinting), both FT_LOAD_NO_HINTING and + FT_LOAD_NO_AUTOHINT must be used. + + Finally, tricky TrueType fonts always use the bytecode interpreter + even if the patented code is used. + + * include/freetype/freetype.h (FT_FACE_FLAG_TRICKY, FT_IS_TRICKY): + New macros. + + * src/truetype/ttdriver.c (Load_Glyph): Handle new load flags + semantics as described above. + + * src/truetype/ttobjs.c (tt_check_trickyness): New function, using + code of ... + (tt_face_init): This function, now simplified and updated to new + semantics. + + * src/base/ftobjs.c (FT_Load_Glyph): Don't use autohinter for tricky + fonts. + + * docs/CHANGES: Document it. + +2008-12-09 Werner Lemberg + + Really fix Savannah bug #25010: An SFNT font with neither outlines + nor bitmaps can be considered as containing space `glyphs' only. + + * src/truetype/ttpload.c (tt_face_load_loca): Handle the case where + a `glyf' table is missing. + + * src/truetype/ttgload.c (load_truetype_glyph): Abort if we have no + `glyf' table but a non-zero `loca' entry. + (tt_loader_init): Handle missing `glyf' table. + + * src/base/ftobjs.c (FT_Load_Glyph): Undo change 2008-12-05. + + * src/sfnt/sfobjs.c (sfnt_load_face): A font with neither outlines + nor bitmaps is scalable. + +2008-12-05 Werner Lemberg + + * src/autofit/aflatin.c (af_latin_uniranges): Add more ranges. This + fixes Savannah bug #21190 which also provides a basic patch. + +2008-12-05 Werner Lemberg + + * include/freetype/freetype.h (FT_LOAD_ADVANCE_ONLY): Use value + 0x100 instead of 0x10000; the latter value is already occupied by + FT_LOAD_TARGET_LIGHT. Bug reported by James Cloos. + + + Handle SFNT with neither outlines nor bitmaps. This fixes Savannah + bug #25010. + + * src/base/ftobjs.c (FT_Load_Glyph): Reject fonts with neither + outlines nor bitmaps. + + * src/sfnt/sfobjs.c (sfnt_load_face): Don't return an error if there + is no table with glyphs. + + + * src/sfnt/ttload.c (tt_face_lookup_table): Improve debugging + message. + +2008-12-01 Werner Lemberg + + GDEF tables need `glyph_count' too for validation. Problem reported + by Chi Nguyen . + + * src/otvalid/otvgdef.c (otv_GDEF_validate), src/otvalid/otvalid.h + (otv_GDEF_validate), src/otvalid/otvmod.c (otv_validate): Pass + `glyph_count'. + +2008-11-29 Werner Lemberg + + * src/autofit/afcjk.c, src/base/ftoutln.c, src/base/ftrfork.c, + src/bdf/bdfdrivr.c, src/gxvalid/gxvmorx.c, src/otvalid/otvmath.c, + src/pcf/pcfdrivr.c, src/psnames/pstables.h, src/smooth/ftgrays.c, + src/tools/glnames.py, src/truetype/ttinterp.c, src/type1/t1load.c, + src/type42/t42objs.c, src/winfonts/winfnt.c: Fix compiler warnings + (Atari PureC). + +2008-11-29 James Cloos + + * src/type/t1load.c (mm_axis_unmap): Revert previous patch and fix + it correctly by using FT_INT_TO_FIXED (FreeType expects 16.16 values + in the /BlendDesignMap space). + +2008-11-29 James Cloos + + * src/type1/t1load.c (mm_axis_unmap): `blend_points' is FT_Fixed*, + whereas `design_points' is FT_Long*. Therefore, return blend rather + than design points. + +2008-11-27 Werner Lemberg + + * src/cff/cffparse.c (cff_parse_real): Handle more than nine + significant digits correctly. This fixes Savannah bug #24953. + +2008-11-25 Daniel Zimmermann + + * src/base/ftstream.c (FT_Stream_ReadFields): Don't access stream + before the NULL check. From Savannah patch #6681. + +2008-11-24 Werner Lemberg + + Fixes from the gnuwin32 port. + + * src/base/ftlcdfil.c: s/EXPORT/EXPORT_DEF/. + + * src/base/ftotval.c: Include FT_OPENTYPE_VALIDATE_H. + + * src/psaux/psobjs.c (ps_table_add): Check `length'. + +2008-11-15 Werner Lemberg + + * src/truetype/ttinterp.c (tt_default_graphics_state): The default + value for `scan_type' is zero, as confirmed by Greg Hitchcock from + Microsoft. Problem reported by Michal Nowakowski + . + +2008-11-12 Tor Andersson + + * src/cff/cffdrivr.c (cff_get_cmap_info): Initialize `format' field. + This fixes Savannah bug #24819. + +2008-11-08 Werner Lemberg + + * src/sfnt/sfobjs.c (sfnt_load_face): Remove #if 0/#endif guards + since OpenType version 1.5 has been released. + + * include/ttnameid.h (TT_NAME_ID_WWS_FAMILY, + TT_NAME_ID_WWS_SUBFAMILY): New macros for OpenType 1.5. + (TT_URC_COPTIC, TT_URC_VAI, TT_URC_NKO, TT_URC_BALINESE, + TT_URC_PHAGSPA, TT_URC_NON_PLANE_0, TT_URC_PHOENICIAN, + TT_URC_TAI_LE, TT_URC_NEW_TAI_LUE, TT_URC_BUGINESE, + TT_URC_GLAGOLITIC, TT_URC_YIJING, TT_URC_SYLOTI_NAGRI, + TT_URC_LINEAR_B, TT_URC_ANCIENT_GREEK_NUMBERS, TT_URC_UGARITIC, + TT_URC_OLD_PERSIAN, TT_URC_SHAVIAN, TT_URC_OSMANYA, + TT_URC_CYPRIOT_SYLLABARY, TT_URC_KHAROSHTHI, TT_URC_TAI_XUAN_JING, + TT_URC_CUNEIFORM, TT_URC_COUNTING_ROD_NUMERALS, TT_URC_SUNDANESE, + TT_URC_LEPCHA, TT_URC_OL_CHIKI, TT_URC_SAURASHTRA, TT_URC_KAYAH_LI, + TT_URC_REJANG, TT_URC_CHAM, TT_URC_ANCIENT_SYMBOLS, + TT_URC_PHAISTOS_DISC, TT_URC_OLD_ANATOLIAN, TT_URC_GAME_TILES): New + macros for OpenType 1.5. + +2008-11-08 Wenlin Institute + + * src/base/ftobjs.c (ft_glyphslot_free_bitmap): Protect against + slot->internal == NULL. Reported by Graham Asher. + +2008-11-08 Werner Lemberg + + * src/sfnt/sfobjs.c (tt_face_get_name): Modified to return an error + code so that memory allocation problems can be distinguished from + missing table entries. Reported by Graham Asher. + (GET_NAME): New macro. + (sfnt_load_face): Use it. + +2008-11-05 Werner Lemberg + + * devel/ftoption.h, include/freetype/config/ftoption.h + [TT_CONFIG_OPTION_BYTECODE_INTERPRETER]: Undefine + TT_CONFIG_OPTION_UNPATENTED_HINTING. This fixes the return value of + `FT_Get_TrueType_Engine_Type' (and makes it work as documented). + Reported in bug #441638 of bugzilla.novell.com. + + * docs/CHANGES: Document it. + +2008-11-03 Werner Lemberg + + * src/type1/t1load.c (parse_subrs): Use an endless loop. There are + fonts (like HELVI.PFB version 003.001, used on OS/2) which define + some `subrs' elements more than once. Problem reported by Peter + Weilbacher . + +2008-10-15 Graham Asher + + * src/sfnt/ttpost.c (tt_post_default_names): Add `const'. + +2008-10-15 David Turner + + * src/truetype/ttgxvar.c (TT_Set_MM_Blend): Disambiguate for + meddlesome compilers' warning against `for ( ...; ...; ...) ;'. + +2008-10-14 Werner Lemberg + + * src/cff/cffobjs.c (cff_face_init): Remove compiler warning. + Suggested by Bram Tassyns in Savannah patch #6651. + +2008-10-12 Graham Asher + + * src/sfnt/sfobjs.c (sfnt_load_face): Fix computation of + `underline_position'. + +2008-10-12 Werner Lemberg + + * docs/CHANGES: Updated. + +2008-10-09 suzuki toshiya + + Fix Savannah bug #24468. + + According to include/freetype/internal/ftobjs.h, the appropriate + type to interchange single character codepoint is FT_UInt32. It + should be distinguished from FT_UInt which can be 16bit integer. + + * src/sfnt/ttcmap.c (tt_cmap4_char_map_linear): Change the type + of the second argument `pcharcode' from FT_UInt* to FT_UInt32*. + (tt_cmap4_char_map_binary): Ditto. + (tt_cmap14_get_nondef_chars): Change the type of return value + from FT_UInt* to FT_UInt32*. + +2008-10-08 John Tytgat + + Fix Savannah bug #24485. + + * src/type1/t1load.c (parse_charstrings): Assure that we always have + a .notdef glyph. + +2008-10-05 suzuki toshiya + + * src/base/ftmac.c: Include FT_TRUETYPE_TAGS_H for multi build. + * builds/mac/ftmac.c: Ditto. + +2008-10-05 suzuki toshiya + + * include/freetype/tttags.h (TTAG_TYP1, TTAG_typ1): Fix definitions. + * src/base/ftobjs.c: Include FT_TRUETYPE_TAGS_H. + +2008-10-05 suzuki toshiya + + * src/sfnt/sfobjs.c (sfnt_open_font): Allow `typ1' version tag in + the beginning of sfnt container. + * src/sfnt/ttload.c (check_table_dir): Return + `SFNT_Err_Table_Missing' when sfnt table directory structure is + correct but essential tables for TrueType fonts (`head', `bhed' or + `SING') are missing. Other errors are returned by + SFNT_Err_Unknown_File_Format. + + * src/base/ftobjs.c (FT_Open_Face): When TrueType driver returns + `FT_Err_Table_Missing', try `open_face_PS_from_sfnt_stream'. It is + enabled only when old mac font support is configured. + +2008-10-04 suzuki toshiya + + * include/freetype/tttags.h (TTAG_CID, TTAG_FOND, TTAG_LWFN, + TTAG_POST, TTAG_sfnt, TTAG_TYP1, TTAG_typ1): New tags to simplify + the repeated calculations of these values in ftobjs.c and ftmac.c. + * src/base/ftobjs.c: Replace all FT_MAKE_TAG by new tags. + * src/base/ftmac.c: Ditto. + * builds/mac/ftmac.c: Ditto. + +2008-10-04 suzuki toshiya + + * src/base/ftobjs.c (ft_lookup_PS_in_sfnt_stream): Remove wrong + initialization of *is_sfnt_cid. + +2008-10-04 Werner Lemberg + + * src/base/ftobjs.c (open_face_PS_from_sfnt_stream): Remove compiler + warnings. + +2008-10-04 suzuki toshiya + + * src/base/ftobjs.c (ft_lookup_PS_in_sfnt): Replaced by... + (ft_lookup_PS_in_sfnt_stream): This. + (open_face_PS_from_sfnt_stream): New function. It checks whether + the stream is sfnt-wrapped Type1 PS font or sfnt-wrapped CID-keyed + font, then try to open a face for given face_index. + (Mac_Read_sfnt_Resource): Replace the combination of + `ft_lookup_PS_in_sfnt' and `open_face_from_buffer' by + `open_face_PS_from_sfnt_stream'. + * src/base/ftmac.c (FT_New_Face_From_SFNT): Ditto. + * builds/mac/ftmac.c (FT_New_Face_From_SFNT): Ditto. + * src/base/ftbase.h: Remove `ft_lookup_PS_in_sfnt' and add + `open_face_PS_from_sfnt_stream'. + +2008-10-03 suzuki toshiya + + * src/base/ftobjs.c (ft_lookup_PS_in_sfnt): Set *is_sfnt_cid to + FALSE if neither `CID ' nor `TYP1' is found in the sfnt container. + +2008-10-03 suzuki toshiya + + * include/freetype/config/ftconfig.h: Define FT_MACINTOSH when SC or + MrC compiler of MPW is used. These compilers do not define the + macro __APPLE__ by themselves. + * builds/unix/ftconfig.in: Ditto. + * builds/vms/ftconfig.h: Ditto. + * src/base/ftbase.c: Use FT_MACINTOSH instead of __APPLE__, to + include ftmac.c if FreeType 2 is built by MPW. + * src/base/ftobjs.c: Use FT_MACINTOSH instead of __APPLE__, to + enable shared functions for ftmac.c if FreeType 2 is built by MPW. + + * builds/mac/ftmac.c: Include ftbase.h. + (memory_stream_close): Removed. + (new_memory_stream): Ditto. + (open_face_from_buffer): Removed. Use the implementation in + ftobjs.c. + (ft_lookup_PS_in_sfnt): Ditto. + + * builds/mac/FreeType.m68k_far.make.txt: Build ftmac.c as an + included part of ftbase.c, to share the functions in ftobjs.c. The + rule compiling ftmac.c separately is removed and the rule copying + ftbase.c from src/base/ftbase.c to builds/mac/ftbase.c is added. + * builds/mac/FreeType.m68k_cfm.make.txt: Ditto. + * builds/mac/FreeType.ppc_classic.make.txt: Ditto. + * builds/mac/FreeType.ppc_carbon.make.txt: Ditto. + +2008-10-02 Bram Tassyns + + * src/cff/cffgload.c (cff_slot_load): Map CID 0 to GID 0. This + fixes Savannah bug #24430. + +2008-10-02 Werner Lemberg + + * builds/freetype.mk (BASE_H): Rename to... + (INTERNAL_H): This. + (FREETYPE_H): Updated. + * src/base/rules.mk: (BASE_OBJ_S, OBJ_DIR/%.$O): Add BASE_H. + * src/bdf/rules.mk (BDF_DRV_H): Add bdferror.h. + * src/cache/rules.mk (CACHE_DRV_H): Add ftccache.h and ftcsbits.h. + * src/pcf/rules.mk (PCF_DRV_H): Add pcfread.h. + * src/raster/rules.mk (RASTER_DRV_H): Add ftmisc.h. + * src/type42/rules.mk (T42_DRV_H): Add t42types.h. + +2008-10-02 suzuki toshiya + + * src/base/ftbase.h: New file to declare the private utility + functions shared by the sources of base modules. Currently, + `ft_lookup_PS_in_sfnt' and `open_face_from_buffer' are declared to + share between ftobjs.c and ftmac.c. + + * src/base/rule.mk: Add ftbase.h. + + * src/base/ftobjs.c: Include ftbase.h. + (memory_stream_close): Build on any platform when old MacOS font + support is enabled. + (new_memory_stream): Ditto. + (open_face_from_buffer): Build on any platform when old MacOS font + support is enabled. The counting of the face in a font file is + slightly different between Carbon-dependent parser and Carbon-free + parser. They are merged with the platform-specific conditional. + (ft_lookup_PS_in_sfnt): Ditto. + + * src/base/ftmac.c: Include ftbase.h. + (memory_stream_close): Removed. + (new_memory_stream): Ditto. + (open_face_from_buffer): Removed. Use the implementation in + ftobjs.c. + (ft_lookup_PS_in_sfnt): Ditto. + +2008-10-02 Werner Lemberg + + * src/sfnt/sfobjs.c (sfnt_load_face): `psnames_error' is only needed + if TT_CONFIG_OPTION_POSTSCRIPT_NAMES is defined. + +2008-10-01 Werner Lemberg + + * src/truetype/ttobjs.c (tt_face_done), src/cff/cffobjs.c + (cff_face_done), src/pfr/pfrobjs.c (pfr_face_done), + src/pcf/pcfdrivr.c (PCF_Face_Done), src/cid/cidobjs.c + (cid_face_done), src/bdf/bdfdrivr. (BDF_Face_Done), + src/sfnt/sfobjs.c (sfnt_face_done): Protect against face == 0. + Reported by Graham Asher. + +2008-09-30 suzuki toshiya + + * src/base/rules.mk: Add conditional source to BASE_SRC, for `make + multi' on Mac OS X. If the macro $(ftmac_c) is defined, + $(BASE_DIR)/$(ftmac_c) is added to BASE_SRC. In a normal build, the + lack of ftmac.c in BASE_SRC is not serious because ftbase.c includes + ftmac.c. + * builds/unix/unix-def.in: Add a macro definition of $(ftmac_c). + * builds/unix/configure.raw: Add procedure to set up appropriate + value of $(ftmac_c) with the consideration of the availability of + Carbon framework. + +2008-09-30 suzuki toshiya + + * src/base/Jamfile: Add target for multi build by jam on Mac OS X. + * src/base/ftobjs.c (FT_New_Face): Fix the condition to include this + function for MPW building. It is synchronized the condition to + include ftmac.c source into ftbase.c. + +2008-09-22 Werner Lemberg + + * src/cff/cffgload.c (CFF_Operator, cff_argument_counts, + cff_decoder_parse_charstrings): Handle (invalid) + `callothersubr' and `pop' instructions. + +2008-09-22 John Tytgat + + Fix Savannah bug #24307. + + * include/freetype/internal/t1types.h (CID_FaceRec), + src/type42/t42types.h (T42_FaceRec): Comment out `afm_data'. + +2008-09-21 Werner Lemberg + + * src/smooth/ftgrays.c (gray_raster_render): Don't dereference + `target_map' if FT_RASTER_FLAG_DIRECT is set. Problem reported by + Stephan T. Lavavej . + +2008-09-21 suzuki toshiya + + * src/otvalid/Jamfile: Add missing target `otvmath' for multi build + by jam. + * src/sfnt/Jamfile: Add missing target `ttmtx' for multi build by + jam. + +2008-09-20 Werner Lemberg + + * src/smooth/ftgrays.c (gray_find_cell): Fix threshold. The values + passed to this function are already `normalized'. Problem reported + by Stephan T. Lavavej . + + * docs/CHANGES: Document it. + +2008-09-20 Werner Lemberg + + * src/base/ftoutln.c: Include FT_INTERNAL_DEBUG_H. + (FT_Outline_Decompose): Decorate with tracing messages. + + * src/smooth/ftgrays.c [DEBUG_GRAYS]: Replace with + FT_DEBUG_LEVEL_TRACE. + [_STANDALONE_ && FT_DEBUG_LEVEL_TRACE]: Include stdio.h and + stdarg.h. + + (FT_TRACE) [_STANDALONE_]: Remove. + (FT_Message) [_STANDALONE_ && FT_DEBUG_LEVEL_TRACE]: New function. + (FT_TRACE5, FT_TRACE7) [_STANDALONE_]: New macros. + (FT_ERROR) [_STANDALONE_]: Updated. + + (gray_hline) [FT_DEBUG_LEVEL_TRACE]: Fix condition. + Use FT_TRACE7. + (gray_dump_cells): Make it `static void'. + (gray_convert_glyph): Use FT_TRACE7. + + (FT_Outline_Decompose) [_STANDALONE_]: Synchronize with version in + ftoutln.c. + + * src/base/ftadvanc.c (FT_Get_Advance, FT_Get_Advances): Use + FT_ERROR_BASE. + + * docs/formats.txt: Updated. + +2008-09-19 suzuki toshiya + + * src/base/ftmac.c: Import sfnt-wrapped Type1 and sfnt-wrapped + CID-keyed font support. + * builds/mac/ftmac.c: Ditto. + +2008-09-19 suzuki toshiya + + * src/base/ftobjs.c (Mac_Read_sfnt_Resource): Fix double free bug in + sfnt-wrapped Type1 and sfnt-wrapped CID-keyed font support code. + `open_face_from_buffer' frees the passed buffer if it cannot open a + face from the buffer, so the caller must not free it. + +2008-09-19 suzuki toshiya + + * src/base/ftobjs.c (Mac_Read_sfnt_Resource): Add initial support + for sfnt-wrapped Type1 and sfnt-wrapped CID-keyed font. + (ft_lookup_PS_in_sfnt): New function to look up `TYP1' or `CID ' + table in sfnt table directory. It is used before loading TrueType + font driver. + + * docs/CHANGES: Add note about the current status of sfnt-wrapped + Type1 and sfnt-wrapped CID-keyed font support. + +2008-09-18 Werner Lemberg + + * src/base/ftsystem.c (FT_Done_Memory): Use ft_sfree directly for + orthogonality (ft_free and ft_sfree could belong to different memory + pools). This fixes Savannah bug #24297. + +2008-09-18 suzuki toshiya + + * src/cff/cffobjs.c (cff_face_init): Use TTAG_OTTO defined + in ttags.h instead of numerical value 0x4F54544FL. + +2008-09-16 Werner Lemberg + + * src/cff/cffgload.h, src/cff/cffgload.c + (cff_decoder_set_width_only): Eliminate function call. + +2008-09-15 George Williams + + Fix Savannah bug #24179, reported by Bram Tassyns. + + * src/type1/t1load.c (mm_axis_unmap, T1_Get_MM_Var): Fix computation + of default values. + +2008-09-15 Werner Lemberg + + * src/tools/glnames.py (main): Surround `ft_get_adobe_glyph_index' + and `ft_adobe_glyph_list' with FT_CONFIG_OPTION_ADOBE_GLYPH_LIST to + prevent unconditional definition. This fixes Savannah bug #24241. + + * src/psnames/pstables.h: Regenerated. + +2008-09-13 Werner Lemberg + + * autogen.sh, builds/unix/configure.raw, + include/freetype/config/ftconfig.h, builds/unix/ftconfig.in: Minor + beautifying. + + * include/freetype/ftadvanc.h, include/freetype/ftgasp.h, + include/freetype/ftlcdfil.h: Protect against FreeType 1. + Some other minor fixes. + + * devel/ftoption.h: Synchronize with + include/freetype/config/ftoption.h. + +2008-09-11 Werner Lemberg + + * src/base/ftbase.c: Include ftadvanc.c. + +2008-09-11 suzuki toshiya + + * builds/unix/ftconfig.in: Duplicate the cpp computation of + FT_SIZEOF_{INT|LONG} from include/freetype/config/ftconfig.h. + (FT_USE_AUTOCONF_SIZEOF_TYPES): New macro. If defined, the cpp + computation is disabled and the statically configured sizes are + used. This fixes Savannah bug #21250. + + * builds/unix/configure.raw: Add the checks to compare the cpp + computation results of the bit length of int and long versus the + sizes detected by running `configure'. If the results are + different, FT_USE_AUTOCONF_SIZEOF_TYPES is defined to prioritize the + results. + New option --{enable|disable}-biarch-config is added to define or + undefine FT_USE_AUTOCONF_SIZEOF_TYPES manually. + +2008-09-05 suzuki toshiya + + * builds/unix/configure.raw: Clear FT2_EXTRA_LIBS when Carbon or + ApplicationService framework is missing. Although this value is not + used in building of FreeType2, it is written in `freetype2.pc' and + `freetype-config'. + +2008-09-01 david turner + + * src/cache/ftccmap.c (FTC_CMapCache_Lookup): Accept a negative cmap + index to mean `use default cached FT_Face's charmap'. This fixes + Savannah bug #22625. + * include/freetype/ftcache.h: Document it. + + + Make FT_MulFix an inlined function. This is done to speed up + FreeType a little (on x86 3% when loading+hinting, 10% when + rendering, ARM savings are more important though). Disable this by + undefining FT_CONFIG_OPTION_INLINE_MULFIX. + + Use of assembler code can now be controlled with + FT_CONFIG_OPTION_NO_ASSEMBLER. + + * include/freetype/config/ftconfig.h, builds/unix/ftconfig.in + [!FT_CONFIG_OPTION_NO_ASSEMBLER] (FT_MulFix_arm): New assembler + implementation. + [!FT_CONFIG_OPTION_NO_ASSEMBLER] (FT_MulFix_i386): Assembler + implementation taken from `ftcalc.c'. + [!FT_CONFIG_OPTION_NO_ASSEMBLER] (FT_MULFIX_ASSEMBLER): New macro + which is defined to the platform-specific assembler implementation + of FT_MulFix. + [FT_CONFIG_OPTION_INLINE_MULFIX && FT_MULFIX_ASSEMBLER] + (FT_MULFIX_INLINED): New macro. + + * include/freetype/config/ftoption.h (FT_CONFIG_OPTION_NO_ASSEMBLER, + FT_CONFIG_OPTION_INLINE_MULFIX): New macros. + + * include/freetype/freetype.h: Updated to handle FT_MULFIX_INLINED. + + * src/base/ftcalc.c: Updated to use FT_MULFIX_ASSEMBLER and + FT_MULFIX_INLINED. + + + Add a new header named FT_ADVANCES_H declaring some new APIs to + extract the advances of one or more glyphs without necessarily + loading their outlines. Also provide `fast loaders' for the + TrueType, Type1, and CFF font drivers (more to come later). + + * src/base/ftadvanc.c, include/freetype/ftadvanc.h: New files. + + * include/freetype/config/ftheader.h (FT_ADVANCES_H): New macro. + * include/freetype/freetype.h (FT_LOAD_ADVANCE_ONLY): New macro. + + * include/freetype/internal/ftdriver.h (FT_Face_GetAdvancesFunc): + `flags' and `advances' are now of type `FT_UInt' and `FT_Fixed', + respectively. + + * src/base/Jamfile (_sources), src/base/rules.mk (BASE_SRC): Add + ftadvanc.c. + + * src/cff/cffdrivr.c (cff_get_advances): New function. + (cff_driver_class): Register it. + + * src/cff/cffgload.c (cff_decoder_set_width_only): New function. + (cff_decoder_parse_charstrings): Handle `width_only'. + (cff_slot_load): Handle FT_LOAD_ADVANCE_ONLY. + + * src/cff/cffgload.h (cff_decoder): New element `width_only'. + (cff_decoder_set_width_only): New declaration. + + * src/truetype/ttdriver.c (tt_get_advances): New function. + (tt_driver_class): Register it. + + * src/truetype/ttgload.c (Get_HMetrics, Get_VMetrics): Renamed to... + (TT_Get_HMetrics, TT_Get_VMetrics): This. + Update callers. + * src/truetype/ttgload.h: Declare them. + + * src/type1/t1gload.h, src/type1/t1gload.c (T1_Get_Advances): New + function. + * src/type1/t1driver.c (t1_driver_class): Register T1_Get_Advances. + + + Add checks for minimum version of the `autotools' stuff. + + * autogen.sh: Implement it. + (get_major_version, get_minor_version, get_patch_version, + compare_to_minimum_version, check_tool_version): New auxiliary + functions. + + * README.CVS: Document it. + +2008-08-29 suzuki toshiya + + * src/sfnt/sfobjs.c (sfnt_open_font): Use TTAG_OTTO defined in + ttags.h instead of FT_MAKE_TAG( 'O', 'T', 'T', 'O' ). + +2008-08-28 Werner Lemberg + + * src/type1/t1load.c (parse_encoding): Protect against infinite + loop. This fixes Savannah bug #24150 (where a patch has been posted + too). + +2008-08-23 Werner Lemberg + + * src/type/t1afm.c (compare_kern_pairs), src/pxaux/afmparse.c + (afm_compare_kern_pairs): Fix comparison. This fixes Savannah bug + #24119. + +2008-08-19 suzuki toshiya + + * src/base/ftobjs.c (FT_Stream_New): Initialize *astream always, + even if passed library or arguments are invalid. This fixes a bug + that an uninitialized stream is freed when an invalid library handle + is passed. Originally proposed by Mike Fabian, 2008/08/18 on + freetype-devel. + (FT_Open_Face): Ditto (stream). + (load_face_in_embedded_rfork): Ditto (stream2). + +2008-08-18 suzuki toshiya + + * src/base/ftmac.c: Add a fallback to guess the availability of the + `ResourceIndex' type. It is used when built without configure + (e.g., a build with Jam). + * builds/mac/ftmac.c: Ditto. + * builds/unix/configure.raw: Set HAVE_TYPE_RESOURCE_INDEX to 1 or 0 + explicitly, even if `ResourceIndex' is unavailable. + +2008-08-18 suzuki toshiya + + * builds/unix/configure.raw: In checking of Mac OS X features, + all-in-one header file `Carbon.h' is replaced by the minimum + header file `CoreServices.h', similar to current src/base/ftmac.c. + +2008-08-18 suzuki toshiya + + * src/sfnt/ttcmap.c (tt_cmap2_validate): Skip the validation of + sub-header when its code_count is 0. Many Japanese Dynalab fonts + include such an empty sub-header (code_count == 0, first_code == 0 + delta == 0, but offset != 0) as the second sub-header in SJIS cmap. + +2008-08-04 Werner Lemberg + + * src/type1/t1tokens.h: Handle `ForceBold' keyword. This fixes + Savannah bug #23995. + + * src/cid/cidload.c (parse_expansion_factor): New callback function. + (cid_field_records): Use it for `ExpansionFactor'. + * src/cod/cidtoken.h: Handle `ForceBold' keyword. + Don't handle `ExpansionFactor'. + +2008-08-04 Bram Tassyns + + * src/cff/cffparse.c (cff_parse_fixed_scaled): Fix thinko which + resulted in incorrect scaling. This fixes Savannah bug #23973. + +2008-08-04 Werner Lemberg + + Be more tolerant w.r.t. invalid entries in SFNT table directory. + + * src/sfnt/ttload.c (check_table_dir): Ignore invalid entries and + adjust table count. + Add more trace messages. + (tt_face_load_font_dir): Updated. + +2008-07-30 Werner Lemberg + + * src/cff/cffgload.c (cff_decoder_parse_charstrings): No longer + assume that the first argument on the stack is the bottom-most + element. Two reasons: + + o According to people from Adobe it is missing in the Type 2 + specification that pushing of additional, superfluous arguments + on the stack is prohibited. + + o Acroread in general handles fonts differently, namely by popping + the number of arguments needed for a particular operand (as a PS + interpreter would do). In case of buggy fonts this causes a + different interpretation which of the elements on the stack are + superfluous and which not. + + Since there are CFF subfonts (embedded in PDFs) which rely on + Acroread's behaviour, FreeType now does the same. + +2008-07-27 Werner Lemberg + + Add extra mappings for `Tcommaaccent' and `tcommaaccent'. This + fixes Savannah bug #23940. + + * src/psnames/psmodule.c (WGL_EXTRA_LIST_SIZE): Rename to... + (EXTRA_GLYPH_LIST_SIZE): This. + Increase by 2. + (ft_wgl_extra_unicodes): Rename to... + (ft_extra_glyph_unicodes): This. + Add two code values. + (ft_wgl_extra_glyph_names): Rename to... + (ft_extra_glyph_names): This. + Add two glyphs. + (ft_wgl_extra_glyph_name_offsets): Rename to... + (ft_extra_glyph_name_offsets): This. + Add two offsets. + + (ps_check_wgl_name, ps_check_wgl_unicode): Rename to... + (ps_check_extra_glyph_name, ps_check_extra_glyph_unicode): This. + Updated. + (ps_unicodes_init): Updated. + +2008-07-26 Werner Lemberg + + * src/cff/cffgload.c (cff_decoder_prepare, + cff_decoder_parse_charstrings): Improve debug output. + +2008-07-22 Martin McBride + + * src/sfnt/ttcmap.c (tt_cmap4_validate, tt_cmap4_char_map_linear, + tt_cmap4_char_map_binary): Handle fonts which treat the last segment + specially. According to the specification, such fonts would be + invalid but acroread accepts them. + +2008-07-16 Jon Foster + + * src/pfr/pfrdrivr.c (pfr_get_advance): Fix off-by-one error. + + * src/base/ftcalc.c (FT_MulFix): Fix portability issue. + + * src/sfnt/ttpost.c (MAC_NAME) [!FT_CONFIG_OPTION_POSTSCRIPT_NAMES]: + Fix compiler warning. + +2008-07-16 Werner Lemberg + + Handle CID-keyed fonts wrapped in an SFNT (with cmaps) correctly. + + * src/cff/cffload.c (cff_font_load): Pass `pure_cff'. + Invert sids table only if `pure_cff' is set. + * src/cff/cffload.h: Udpated. + + * src/cff/cffobjs.c (cff_face_init): Updated. + Set FT_FACE_FLAG_CID_KEYED only if pure_cff is set. + + * docs/CHANGES: Updated. + +2008-07-09 Werner Lemberg + + * src/truetype/ttpload.c (tt_face_load_loca): Handle buggy fonts + where num_locations < num_glyphs. Problem reported by Ding Li. + +2008-07-05 Werner Lemberg + + Since FreeType uses `$(value ...)', we now need GNU make 3.80 or + newer. This fixes Savannah bug #23648. + + * configure: zsh doesn't like ${1+"$@"}. + Update needed GNU make version. + * builds/toplevel.mk: Check for `$(eval ...)'. + * docs/INSTALL.GNU, docs/INSTALL.CROSS, docs/INSTALL.UNIX: Document + it. + +2008-07-04 Werner Lemberg + + * src/raster/ftraster.c (Draw_Sweep): If span is smaller than one + pixel, only check for dropouts if neither start nor end point lies + on a pixel center. This fixes Savannah bug #23762. + +2008-06-29 Werner Lemberg + + * Version 2.3.7 released. + ========================= + + + Tag sources with `VER-2-3-7'. + + * docs/CHANGES, docs/VERSION.DLL: Update documentation and bump + version number to 2.3.7. + + * README, Jamfile (RefDoc), builds/win32/visualc/index.html, + builds/win32/visualc/freetype.dsp, + builds/win32/visualc/freetype.vcproj, + builds/win32/visualce/index.html, + builds/win32/visualce/freetype.dsp, + builds/win32/visualce/freetype.vcproj: s/2.3.6/2.3.7/, s/236/237/. + + * include/freetype/freetype.h (FREETYPE_PATCH): Set to 7. + + * builds/unix/configure.raw (version_info): Set to 9:18:3. + + * docs/release: Updated. + +2008-06-28 Werner Lemberg + + * src/ftglyph.c (FT_Matrix_Multiply, FT_Matrix_Invert): Move to... + * src/ftcalc.c: Here. This fixes Savannah bug #23729. + +2008-06-27 Werner Lemberg + + * src/raster/ftraster.c (Vertical_Sweep_Drop, Horizontal_Sweep_Drop, + Horizontal_Gray_Sweep_Drop): Test for intersections which + degenerate to a single point can be ignored; this has been confirmed + by Greg Hitchcock from Microsoft. (This was commented out code.) + +2008-06-26 Werner Lemberg + + Improve navigation in API reference. + + * src/tools/docmaker/tohtml.py (html_header_3): Renamed to... + (html_header_6): This. + (html_header_3, html_header_3i, html_header_4, html_header_5, + html_header_5t): New strings. + (toc_footer_start, toc_footer_end): New strings. + (HtmlFormatter::html_header): Updated. + (HtmlFormatter::html_index_header, HtmlFormatter::html_toc_header): + New strings. + (HtmlFormatter::index_enter): Use `html_index_header'. + (HtmlFormatter::index_exit): Print `html_footer'. + (HtmlFormatter::toc_enter): Use `html_toc_header'. + (HtmlFormatter::toc_exit): Print proper footer. + + Convert ~ to non-breakable space. + + * src/tools/docmaker/tohtml.py (make_html_para): Implement it. + Update header files accordingly. + +2008-06-24 suzuki toshiya + + * builds/unix/configure.raw: Check type `ResourceIndex' explicitly + and define HAVE_TYPE_RESOURCE_INDEX if it is defined. Mac OS X 10.5 + bundles 10.4u SDK with MAC_OS_X_VERSION_10_5 macro but without + ResourceIndex type definition. The macro does not inform the type + availability. + * src/base/ftmac.c: More parentheses are inserted to clarify the + conditionals to disable legacy APIs in `10.5 and later' cases. If + HAVE_TYPE_RESOURCE_INDEX is not defined, ResourceIndex is defined. + +2008-06-24 Werner Lemberg + + * src/truetype/ttinterp.c (Ins_SCANTYPE): Don't check rendering + mode. + + * src/raster/ftraster.c (Render_Glyph, Render_Gray_Glyph, + Draw_Sweep): No-dropout mode is value 2, not value 0. + (Draw_Sweep): Really skip dropout handling for no-dropout mode. + +2008-06-24 Werner Lemberg + + * src/psaux/psobjs.c (t1_builder_close_contour): Don't add contour + if it consists of one point only. Based on a patch from Savannah + bug #23683 (from John Tytgat). + +2008-06-22 Werner Lemberg + + * src/truetype/ttgload.c (TT_Load_Glyph): Protect bytecode stuff + with IS_HINTED. + + * docs/CHANGES: Updated. + +2008-06-22 suzuki toshiya + + * builds/unix/configure.raw: If CFLAGS has `-isysroot XXX' option + but LDFLAGS does not, import it to LDFLAGS. The option is used to + specify non-default SDK on Mac OS X (e.g., universal binary SDK for + Mac OS X 10.4 on PowerPC platform). Although Apple TechNote 2137 + recommends to add the option only to CFLAGS, LDFLAGS should include + it because libfreetype.la is built with -no-undefined. This fixes a + bug reported by Ryan Schmidt in MacPorts, + http://trac.macports.org/ticket/15331. + +2008-06-21 Werner Lemberg + + Enable access to the various dropout rules of the B&W rasterizer. + Pass dropout rules from the TT bytecode interpreter to the + rasterizer. + + * include/freetype/ftimage.h (FT_OUTLINE_SMART_DROPOUTS, + FT_OUTLINE_EXCLUDE_STUBS): New flags for FT_Outline. + + * src/raster/ftraster.c (Vertical_Sweep_Drop, Horizontal_Sweep_Drop, + Horizontal_Gray_Sweep_Drop): Use same mode numbers as given in the + OpenType specification. + Fix mode 4 computation. + (Render_Glyph, Render_Gray_Glyph): Handle new outline flags. + + * src/truetype/ttgload.c (TT_Load_Glyph) Convert scan conversion + mode to FT_OUTLINE_XXX flags. + + * src/truetype/ttinterp.c (Ins_SCANCTRL): Enable ppem check. + +2008-06-19 Werner Lemberg + + * src/cff/cffobjs.c (cff_face_init): Compute final + `dict->units_per_em' value before assigning it to + `cffface->units_per_EM'. Otherwise, CFFs without subfonts are + scaled incorrectly if the font matrix is non-standard. This fixes + Savannah bug #23630. + + * docs/CHANGES: Updated. + +2008-06-19 Werner Lemberg + + * src/type/t1objs.c (T1_Face_Init): Slightly improve algorithm fix + from 2008-06-19. + +2008-06-18 Werner Lemberg + + * src/type/t1objs.c (T1_Face_Init): Fix change from 2008-03-21. + Reported by Peter Weilbacher . + + * docs/CHANGES: Updated. + +2008-06-15 George Williams + + * src/otvalid/otvgpos.c (otv_MarkBasePos_validate): Set + `valid->extra2' to 1. This is undocumented in the OpenType 1.5 + specification. + +2008-06-15 Werner Lemberg + + * src/base/ftcalc.c (FT_MulFix) : Protect registers correctly + from clobbering. Patch from Savannah bug report #23556. + + * docs/CHANGES: Document it. + +2008-06-10 Werner Lemberg + + * autogen.sh: Add option `--install' to libtoolize. + +2008-06-10 Werner Lemberg + + * Version 2.3.6 released. + ========================= + + + Tag sources with `VER-2-3-6'. + + * docs/CHANGES, docs/VERSION.DLL: Update documentation and bump + version number to 2.3.6. + + * README, Jamfile (RefDoc), builds/win32/visualc/index.html, + builds/win32/visualc/freetype.dsp, + builds/win32/visualc/freetype.vcproj, + builds/win32/visualce/index.html, + builds/win32/visualce/freetype.dsp, + builds/win32/visualce/freetype.vcproj: s/2.3.5/2.3.6/, s/235/236/. + + * include/freetype/freetype.h (FREETYPE_PATCH): Set to 6. + + * builds/unix/configure.raw (version_info): Set to 9:17:3. + + + * include/freetype/internal/psaux.h (T1_BuilderRec): Remove `scale_x' + and `scale_y'. + * src/cff/cffgload.h (CFF_Builder): Remove `scale_x' and `scale_y'. + + + * src/cff/cffparse.c: Include FT_INTERNAL_DEBUG_H. + * src/cff/cffobjs.h: Include FT_INTERNAL_POSTSCRIPT_HINTS_H. + +2008-06-10 Werner Lemberg + + * src/base/ftobjs.c (open_face): Check `clazz->init_face' and + `clazz->done_face'. + +2008-06-09 VaDiM + + Support debugging on WinCE. From Savannah patch #6536; this fixes + bug #23497. + + * builds/win32/ftdebug.c (OutputDebugStringEx): New function/macro + as a replacement for OutputDebugStringA (which WinCE doesn't have). + Update all callers. + (ft_debug_init) [_WIN32_CE]: WinCE apparently doesn't have + environment variables. + +2008-06-09 Werner Lemberg + + * README.CVS: Updated. + + * builds/unix/configure.raw, builds/unix/freetype-config.in: Updated + for newer versions of autoconf and friends. + +2008-06-08 Werner Lemberg + + * src/type1/t1parse.h (T1_ParserRec): Make `base_len' and + `private_len' unsigned. + + * src/type1/t1parse.c (read_pfb_tag): Make `asize' unsigned and read + it as such. + (T1_New_Parser, T1_Get_Private_Dict): Make `size' unsigned. + + + * src/base/ftstream.c (FT_Stream_Skip): Reject negative values. + + + * src/type1/t1load.c (parse_blend_design_positions): Check `n_axis' + for sane value. + Fix typo. + + + * src/psaux/psobjs.c (ps_table_add): Check `idx' correctly. + + + * src/truetype/ttinterp (Ins_SHC): Use BOUNDS() to check + `last_point'. + + + * src/sfnt/ttload.c (tt_face_load_max_profile): Limit + `maxTwilightPoints'. + +2008-06-06 Werner Lemberg + + * src/truetype/ttinterp.c (Ins_IP): Handle case `org_dist == 0' + correctly. This fixes glyphs `t' and `h' of Arial Narrow at 12ppem. + +2008-06-03 Werner Lemberg + + * include/freetype/ftcache.h (FTC_FaceID): Change type back to + FT_Pointer. Reported by Ian Britten . + +2008-06-02 Werner Lemberg + + Emit header info for defined FreeType objects in reference. + + * src/tools/docmaker/content.py (re_header_macro): New regexp. + (ContentProcessor::__init__): Initialize new dictionary `headers'. + (DocBlock::__init__): Collect macro header definitions. + + * src/tools/docmaker/tohtml.py (header_location_header, + header_location_footer): New strings. + (HtmlFormatter::__init__): Pass `headers' dictionary. + (HtmlFormatter::print_html_field): Don't emit paragraph tags. + (HtmlFormatter::print_html_field_list): Emit empty paragraph. + (HtmlFormatter::block_enter): Emit header info. + +2008-06-01 Werner Lemberg + + * include/freetype/config/ftheader.h (FT_UNPATENTED_HINTING_H, + FT_INCREMENTAL_H): Added. + +2008-05-28 Werner Lemberg + + * src/tools/docmaker/sources.py (SourceBlock::__init__): While + looking for markup tags, return immediately as soon a single one is + found. + +2008-05-28 Werner Lemberg + + * src/truetype/ttinterp.c (Ins_MD): The MD instruction also uses + original, unscaled input values. Confirmed by Greg Hitchcock from + Microsoft. + +2008-05-27 Werner Lemberg + + * src/tools/docmaker/tohtml.py (block_footer_start, + block_footer_middle): Beautify output. + +2008-05-25 Werner Lemberg + + * src/raster/ftraster.c (fc_black_render): Return 0 when we are + trying to render into a zero-width/height bitmap, not an error code. + + * src/truetype/ttgload.c (load_truetype_glyph): Move initialization + of the graphics state for subglyphs to... + (TT_Hint_Glyph): This function. + Hinting instructions for a composite glyph apparently refer to the + just hinted subglyphs, not the unhinted, unscaled outline. This + seems to fix Savannah bugs #20973 and (at least partially) #23310. + +2008-05-20 suzuki toshiya + + * src/base/ftmac.c (FT_New_Face_From_Suitcase): Check if valid + `aface' is returned by FT_New_Face_From_FOND(). The patch was + proposed by an anonymous reporter of Savannah bug #23204. + +2008-05-18 Werner Lemberg + + * src/pshinter/pshalgo.c (ps_hints_apply): Reset scale values after + correction for pixel boundary. Without this patch, the effect can + be cumulative under certain circumstances, making glyphs taller and + taller after each call. This fixes Savannah bug #19976. + +2008-05-18 Werner Lemberg + + * src/base/ftdebug.c (FT_Message, FT_Panic): Send output to stderr. + This fixes Savannah bug #23280. + + * docs/CHANGES: Updated. + +2008-05-18 David Turner + + * src/psnames/psmodule.c (ft_wgl_extra_unicodes, + ft_wgl_extra_glyph_names, ft_wgl_extra_glyph_name_offsets, + ps_check_wgl_name, ps_check_wgl_unicode): Use `static' to make + declarations non-global. + + * src/type1/t1load.c: Add missing comment. + +2008-05-17 Sam Hocevar + + * src/truetype/ttgload.c (TT_Load_Simple_Glyph): Handle zero-contour + glyphs correctly. Patch from Savannah bug #23277. + +2008-05-16 Werner Lemberg + + * docs/CHANGES: Updated. + +2008-05-16 Sergey Tolstov + + Improve support for WGL4 encoded fonts. + + * src/psnames/psmodule.c (WGL_EXTRA_LIST_SIZE): New macro. + (ft_wgl_extra_unicodes, ft_wgl_extra_glyph_names, + ft_wgl_extra_glyph_name_offsets): New arrays. + (ps_check_wgl_name, ps_check_wgl_unicode): New functions. + (ps_unicodes_init): Use them to add additional Unicode mappings. + +2008-05-15 Werner Lemberg + + * src/psaux/t1decode.c (t1_decoder_parse_charstrings) + : `closepath' without a path is a no-op, not an error + (cf. the PS reference manual). + + Reported by Martin McBride. + +2008-05-15 Werner Lemberg + + * builds/toplevel.mk (CONFIG_GUESS, CONFIG_SUB): Updated. + +2008-05-15 Werner Lemberg + + * src/type1/t1load.c (parse_subrs): Accept fonts with a subrs array + which contains a single but empty entry. This is technically + invalid (since it must end with `return'), but... + + Reported by Martin McBride. + +2008-05-14 Werner Lemberg + + Finish fix of scaling bug of CID-keyed CFF subfonts. + + * include/freetype/internal/ftcalc.h, src/base/ftcalc.c + (FT_Matrix_Multiply_Scaled, FT_Vector_Transform_Scaled): New + functions. + + * src/cff/cffobjs.h (CFF_Internal): New struct. It is used to + provide global hinting data for both the top-font and all subfonts + (with proper scaling). + + * src/cff/cffobjs.c (cff_make_private_dict): New function, using + code from `cff_size_init'. + (cff_size_init, cff_size_done, cff_size_select, cff_size_request): + Use CFF_Internal and handle subfonts. + (cff_face_init): Handle top-dict and subfont matrices correctly; + apply some heuristic in case of unlikely matrix concatenation + results. This has been discussed with people from Adobe (thanks + goes mainly to David Lemon) who confirm that the CFF specs are fuzzy + and not correct. + + * src/cff/cffgload.h (cff_decoder_prepare): Add `size' argument. + + * src/cff/cffgload.c (cff_builder_init): Updated. + (cff_decoder_prepare): Handle hints globals for subfonts. + Update all callers. + (cff_slot_load): Handling scaling of subfonts properly. + + * src/cff/cffparse.c (cff_parse_fixed_dynamic): New function. + (cff_parse_font_matrix): Use it. + + * src/cff/cfftypes.h (CFF_FontDictRec): Make `units_per_em' + FT_ULong. + + * docs/CHANGES: Document it. + +2008-05-13 Werner Lemberg + + * src/winfonts/winfnt.c (fnt_face_get_dll_font, FNT_Face_Init): + Handle case `face_index < 0'. + * docs/CHANGES: Document it. + +2008-05-04 Werner Lemberg + + First steps to fix the scaling bug of CID-keyed CFF subfonts, + reported by Ding Li on 2008/03/28 on freetype-devel. + + * src/base/cff/cffparse.c (power_tens): New array. + (cff_parse_real): Rewritten to introduce a fourth parameter which + returns the `scaling' of the real number so that we have no + precision loss. This is not used yet. + Update all callers. + (cff_parse_fixed_thousand): Replace with... + (cff_parse_fixed_scaled): This function. Update all callers. + +2008-05-03 Werner Lemberg + + * src/base/ftobjs.c (FT_Load_Glyph): Call the auto-hinter without + transformation since it recursively calls FT_Load_Glyph. This fixes + Savannah bug #23143. + +2008-04-26 Werner Lemberg + + * include/freetype/internal/psaux.h (T1_BuilderRec): Mark `scale_x' + and `scale_y' as obsolete since they aren't used. + * src/psaux/psobjs.c (t1_builder_init): Updated. + + * src/cff/cffgload.h (CFF_Builder): Mark `scale_x' and `scale_y' as + obsolete since they aren't used. + * src/cff/cffgload.c (cff_builder_init): Updated. + +2008-04-14 Werner Lemberg + + * src/pcf/pcfdrivr.c (PCF_Face_Init): Protect call to + `FT_Stream_OpenLZW' with `FT_CONFIG_OPTION_USE_LZ'. From Savannah + bug #22909. + +2008-04-13 Werner Lemberg + + * src/psaux/psconv.c (PS_Conv_ToFixed): Increase precision if + integer part is zero. + +2008-04-01 Werner Lemberg + + Fix compilation with g++ 4.1 (with both `single' and `multi' + targets). + + * src/base/ftobjs.c (FT_Open_Face): Don't define a variable in block + which is crossed by a `goto'. + + * src/otvalid/otvalid.h (otv_MATH_validate): Add prototype. + +2008-03-31 Werner Lemberg + + Fix support for subsetted CID-keyed CFFs. + + * include/freetype/freetype.h (FT_FACE_FLAG_CID_KEYED, + FT_IS_CID_KEYED): New macros. + + * src/cff/cffobjs.c (cff_face_init): Set number of glyphs to the + maximum CID value in CID-keyed CFFs. + Handle FT_FACE_FLAG_CID_KEYED flag. + + * docs/CHANGES: Document it. + + + Fix CFF font matrix calculation and improve precision. + + * src/cff/cffparse.c (cff_parse_real): Increase precision if integer + part is zero. + (cff_parse_font_matrix): Simplify computation of `units_per_em'; + this prevents overflow also. + + + Support FT_Get_CID_Registry_Ordering_Supplement for PS CID fonts. + + * src/cid/cidriver.c: Include FT_SERVICE_CID_H. + (cid_get_ros): New function. + (cid_service_cid_info): New service structure. + (cid_services): Register it. + +2008-03-23 Werner Lemberg + + Adjustments for Visual C++ 8.0, as reported by Rainer Deyke. + + * builds/compiler/visualc.mk (CFLAGS): Remove /W5. + (ANSIFLAGS): Add _CRT_SECURE_NO_DEPRECATE. + +2008-03-21 Laurence Darby + + * src/type1/t1objs.c (T1_Face_Init): Use `/Weight'. Patch from + Savannah bug #22675. + +2008-03-13 Derek Clegg + + * src/truetype/ttgxvar.c (TT_Get_MM_Var): Fix named style loop. + Patch from Savannah bug #22541. + +2008-03-03 Masatoshi Kimura + + * src/sfnt/ttcmap.c (tt_cmap14_char_map_nondef_binary, + tt_cmap14_find_variant): Return correct value. + (tt_cmap14_variant_chars): Fix check for `di'. + +2008-02-29 Wermer Lemberg + + * docs/CHANGES: Updated. + +2008-02-29 Wolf + + Add build support for symbian platform. From Savannah bug #22440. + + * builds/symbian/*: New files. + +2008-02-21 suzuki toshiya + + * src/base/ftmac.c (parse_fond): Fix a bug of PostScript font name + synthesis. For any face of a specified FOND, always the name for + the first face was used. Except of a FOND that refers multiple + Type1 font files, wrong synthesized font names are not used at all, + so this is an invisible bug. A few limit checks are added too. + + * builds/mac/ftmac.c: Ditto. + +2008-02-21 suzuki toshiya + + * builds/unix/configure.raw: Split compiler option to link Carbon + frameworks to one option for CoreServices framework and another + option for ApplicationServices framework. The split options can be + managed by GNU libtool to avoid unrequired duplication when FreeType + is linked with other applications. Suggested by Daniel Macks, + Savannah bug #22366. + +2008-02-18 Victor Stinner + + * src/truetype/ttinterp.c (Ins_IUP): Check number of points. Fix + from Savannah bug #22356. + +2008-02-17 Jonathan Blow + + * src/autofit/afloader.c (af_loader_load_g, af_loader_load_glyph): + Check for valid callback pointers. + +2008-02-15 suzuki toshiya + + * src/base/ftmac.c (FT_New_Face_From_SFNT): Check the sfnt resource + handle by its value instead of ResError(), fix provided by Deron + Kazmaier. According to the Resource Manager Reference, + GetResource(), Get1Resource(), GetNamedResource(), + Get1NamedResource() and RGetResource() set noErr but return NULL + handle when they can not find the requested resource. These + functions never return undefined values, so it is sufficient to + check if the handle is not NULL. + + * builds/mac/ftmac.c (FT_New_Face_From_SFNT): Ditto. + +2008-02-14 suzuki toshiya + + * src/base/ftbase.c: is replaced by "ftmac.c" as other + inclusion styles. Now it always includes src/base/ftmac.c; + builds/mac/ftmac.c is never included in any configuration. + + * builds/unix/configure.raw: Print warning if configure is executed + with options to specify Carbon functionalities explicitly. + + * docs/INSTALL.MAC: Note that legacy builds/mac/ftmac.c is not + included automatically and manual replacement is required. + +2008-02-11 Werner Lemberg + + * builds/modules.mk (CLOSE_MODULE, REMOVE_MODULE), builds/detect.mk + (dos_setup), builds/freetype.mk (clean_project_dos, + distclean_project_dos): Don't use \ but $(SEP). Reported by Duncan + Murdoch. + +2008-01-18 Sylvain Pasche + + * src/base/ftlcdfil.c (_ft_lcd_filter_legacy): Updated comment to + mention intra-pixel algorithm. + + * include/freetype/freetype.h (FT_Render_Mode): Mention that + FT_Library_SetLcdFilter can be used to reduce fringes. + +2008-01-16 Werner Lemberg + + * src/raster/ftraster.c (ft_black_render): Check `outline' before + using it. Reported by Allan Yang. + +2008-01-12 Werner Lemberg + + * src/raster/ftraster.c (FT_CONFIG_OPTION_5_GRAY_LEVELS): Remove. + +2008-01-12 Allan Yang, Jian Hua - SH + + * src/raster/ftraster.c (ft_black_init) + [FT_RASTER_OPTION_ANTI_ALIASING]: Fix compilation. + +2008-01-10 Werner Lemberg + + * src/truetype/ttgload.c (load_truetype_glyph): Handle the case + where the number of contours in a simple glyph is zero (and which + does contain an entry in the `glyf' table). This fixes Savannah bug + #21990. + +2008-01-04 suzuki toshiya + + Formatting suggested by Sean McBride. + + * builds/mac/ftmac.c: Formatting (tab expanded). + * src/autofit/afindic.c: Ditto. + * src/base/ftcid.c: Ditto. + * src/base/ftmac.c: Ditto. + +2007-12-30 Werner Lemberg + + * src/smooth/ftgrays.c (gray_raster_render): Check `outline' + correctly. + +2007-12-21 suzuki toshiya + + Improvement of POSIX resource-fork accessor to load unsorted + references in a resource. In HelveLTMM (resource-fork PostScript + Type1 font bundled with Mac OS X since 10.3.x), the appearance order + of PFB chunks is not sorted; sorting the chunks by reference IDs is + required. + + * include/freetype/internal/ftrfork.h (FT_RFork_Ref): New structure + type to store a pair of reference ID and offset to the chunk. + + * src/base/ftrfork.c (ft_raccess_sort_ref_by_id): New function to + sort FT_RFork_Ref by their reference IDs. + + (FT_Raccess_Get_DataOffsets): Returns an array of offsets that is + sorted by reference ID. + +2007-12-14 Werner Lemberg + + * src/cff/cffparse.c (cff_parse_real): Don't apply `power_ten' + division too early; otherwise the most significant digit(s) of the + final result are lost as the value is truncated to an integer. This + fixes Savannah bug #21794 (where the patch has been posted too). + +2007-12-06 Fix <4d876b82@gmail.com> + + Pass options from one configure script to another as-is (not + expanded). This is needed for options like + --includedir='${prefix}/include'. + + * builds/unix/detect.mk, configure: Prevent argument expansion in + call to the (real) `configure' script. + +2007-12-06 Werner Lemberg + + * src/truetype/ttgload.c (load_truetype_glyph): Fix compilation if + TT_USE_BYTECODE_INTERPRETER isn't defined. + +2007-12-06 Werner Lemberg + + There exist CFFs which contain opcodes for the Type 1 operators + `hsbw' and `closepath' which are both invalid in Type 2 charstrings. + However, it doesn't harm to support them. + + * src/cff/cffgload.c (CFF_Operator): Add `cff_op_hsbw' and + `cff_op_closepath.' + (cff_argument_counts): Ditto. + + (cff_decoder_parse_charstrings): Handle Type 1 opcodes 9 (closepath) + and 13 (hsbw) which are invalid in Type 2 charstrings. + +2007-12-06 suzuki toshiya + + * src/base/ftrfork.c (raccess_guess_darwin_newvfs): New function to + support new pathname syntax `..namedfork/rsrc' to access a resource + fork on Mac OS X. The legacy syntax `/rsrc' does not work on + case-sensitive HFS+. + (raccess_guess_darwin_hfsplus): Fix a bug in the calculation of + buffer size to store a pathname. + * include/freetype/internal/ftrfork.h: Increment the number of + resource fork guessing rule. + +2007-12-06 suzuki toshiya + + * builds/unix/configure.raw: Improve the compile tests to search + Carbon functions. + * builds/mac/ftmac.c: Import fixes for Carbon incompatibilities + proposed by Sean McBride from src/base/ftmac.c (see 2007-11-16). + +2007-12-06 suzuki toshiya + + The documents and comments for Mac OS X are improved by Sean + McBride. + + * src/base/ftmac.c: Fix a comment. + * include/freetype/ftmac.h: Ditto. + * docs/INSTALL.MAC: Improve English and add comment on lowest + system version specified by MACOSX_DEPLOYMENT_TARGET. + +2007-12-04 Werner Lemberg + + * src/cff/cffload.c (cff_subfont_load): Don't use logical OR to + concatenate error codes. + * src/sfnt/ttsbit.c (Load_SBit_Range): Ditto. + +2007-12-04 Graham Asher + + * src/truetype/ttobjs.c (tt_face_init): Don't use logical OR to + concatenate error codes. + +2007-12-04 Sean McBride + + * src/pfr/pfrgload.c (pfr_glyph_load_compound): Remove compiler + warning. + +2007-11-20 suzuki toshiya + + Fix MacOS legacy font support by Masatake Yamato on Mac OS X. It is + not working since 2.3.5. In FT_Open_New(), if FT_New_Stream() + cannot mmap() the specified file and cannot seek to head of the + specified file, it returns NULL stream and FT_Open_New() returns the + error immediately. On MacOS, most legacy MacOS fonts fall into such + a scenario because their data forks are zero-sized and cannot be + sought. To proceed to guessing of resource fork fonts, the + functions for legacy MacOS font must properly handle the NULL stream + returned by FT_New_Stream(). + + * src/base/ftobjs.c (IsMacBinary): Return error + FT_Err_Invalid_Stream_Operation immediately when NULL stream is + passed. + (FT_Open_Face): Even when FT_New_Stream() returns an error, proceed + to fallback. Originally, legacy MacOS font is tested in the cases + of FT_Err_Invalid_Stream_Operation (occurs when data fork is empty) + or FT_Err_Unknown_File_Format (occurs when AppleSingle header or + .dfont header is combined). Now the case of + FT_Err_Cannot_Open_Stream is included. + + * src/base/ftrfork.c (FT_Raccess_Guess): When passed stream is NULL, + skip FT_Stream_Seek(), which seeks to the head of stream, and + proceed to unit testing of raccess_guess_XXX(). FT_Stream_Seek() + for a NULL stream causes a Bus error on Mac OS X. + (raccess_guess_apple_double): Return FT_Err_Cannot_Open_Stream + immediately if passed stream is NULL. + (raccess_guess_apple_single): Ditto. + +2007-11-16 suzuki toshiya + + Fix for Carbon incompatibilities since Mac OS X 10.5, + proposed by Sean McBride. + + * doc/INSTALL.MAC: Comment on MACOSX_DEPLOYMENT_TARGET. + + * include/freetype/ftmac.h: Deprecate FT_New_Face_From_FOND and + FT_GetFilePath_From_Mac_ATS_Name. Since Mac OS X 10.5, calling + Carbon functions from a forked process is classified as unsafe + by Apple. All Carbon-dependent functions should be deprecated. + + * src/base/ftmac.c: Use essential header files + and + instead of + all-in-one header file . + + Include and replace HFS_MAXPATHLEN by Apple + genuine macro PATH_MAX. + + Add fallback macro for kATSOptionFlagsUnRestrictedScope which + is not found in Mac OS X 10.0. + + Multi-character constants ('POST', 'sfnt' etc) are replaced by + 64bit constants calculated by FT_MAKE_TAG() macro. + + For the index in the segment of resource fork, new portable + type ResourceIndex is introduced for better compatibility. + This type is since Mac OS X 10.5, so it is defined as short + when built on older platforms. + + (FT_ATSFontGetFileReference): If build target is only the systems + 10.5 and newer, it calls Apple genuine ATSFontGetFileReference(). + + (FT_GetFile_From_Mac_ATS_Name): Return an error if system is 10.5 + and newer or 64bit platform, because legacy type FSSpec type is + removed completely. + + (FT_New_Face_From_FSSpec): Ditto. + +2007-11-01 Werner Lemberg + + * src/sfnt/sfobjs.c (sfnt_done_face): Check `sfnt' everywhere. This + fixes Savannah bug #21485. + +2007-10-29 Daniel Svoboda + + * src/winfonts/winfnt.c (FNT_Face_Init): Check first that the driver + can handle the font at all, then check `face_index'. Otherwise, the + driver might return the wrong error code. This fixes Savannah bug + #21468. + +2007-10-21 Werner Lemberg + + * src/sfnt/sfobjs.c (sfnt_load_face): Support bit 9 and prepare + support for bit 8 of the `fsSelection' field in the `OS/2' table. + MS is already using this; hopefully, this becomes part of OpenType + 1.5. + Prepare also support for `name' IDs 21 (WWS_FAMILY) and 22 + (WWS_SUBFAMILY). + +2007-10-20 Werner Lemberg + + * src/tools/docmaker/tohtml.py (html_header_2): Fix typo. + Add `td.left' element to CSS. + (toc_section_enter): Use it. + +2007-10-18 David Turner + + * include/freetype/freetype.h, src/base/ftobjs.c: Rename API + functions related to cmap type 14 support to the + `FT_Object_ActionName' scheme: + + FT_Get_Char_Variant_index -> FT_Face_GetCharVariantIndex + FT_Get_Char_Variant_IsDefault -> FT_Face_GetCharVariantIsDefault + FT_Get_Variant_Selectors -> FT_Face_GetVariantSelectors + FT_Get_Variants_Of_Char -> FT_Face_GetVariantsOfChar + FT_Get_Chars_Of_Variant -> FT_Face_GetCharsOfVariant + + Update documentation accordingly. + + * src/sfnt/ttcmap.c: Stronger cmap 14 validation. + Make the code a little more consistent with FreeType coding + conventions and modify the cmap14 functions that returned a newly + allocated array to use a persistent vector from the TT_CMap14 object + instead. + + (TT_CMap14Rec): Provide array and auxiliary data for result. + (tt_cmap14_done, tt_cmap14_ensure): New functions. + + (tt_cmap14_init, tt_cmap14_validate, tt_cmap14_char_map_def_binary, + tt_cmap14_char_map_nondef_binary, tt_cmap14_find_variant, + tt_cmap14_char_var_index, tt_cmap14_variants, + tt_cmap14_char_variants, tt_cmap14_def_char_count, + tt_cmap14_get_def_chars, tt_cmap14_get_nondef_chars, + tt_cmap14_variant_chars, tt_cmap14_class_rec): Updated and improved. + +2007-10-15 George Williams + + Add support for cmap type 14. + + * devel/ftoption.h, include/freetype/config/ftoption.h + (TT_CONFIG_CMAP_FORMAT_14): New macro. + + * include/freetype/internal/ftobjs.h (FT_CMap_CharVarIndexFunc, + FT_CMap_CharVarIsDefaultFunc, FT_CMap_VariantListFunc, + FT_CMap_CharVariantListFunc, FT_CMap_VariantCharListFunc): New + support function prototypes. + (FT_CMap_ClassRec): Add them. + Update all users. + + * include/freetype/ttnameid.h (TT_APPLE_ID_VARIANT_SELECTOR): New + macro. + + * include/freetype/freetype.h (FT_Get_Char_Variant_Index, + FT_Get_Char_Variant_IsDefault, FT_Get_Variant_Selectors, + FT_Get_Variants_Of_Char, FT_Get_Chars_Of_Variant): New API + functions. + + * src/base/ftobjs.c (find_variant_selector_charmap): New auxiliary + function. + (FT_Set_Charmap): Disallow cmaps of type 14. + (FT_Get_Char_Variant_Index, FT_Get_Char_Variant_IsDefault, + FT_Get_Variant_Selectors, FT_Get_Variants_Of_Char, + FT_Get_Chars_Of_Variant): New API functions. + + * src/sfnt/ttcmap.c (TT_PEEK_UINT24, TT_NEXT_UINT24): New macros. + + (TT_CMap14Rec, tt_cmap14_init, tt_cmap14_validate, + tt_cmap14_char_index, tt_cmap14_char_next, tt_cmap14_get_info, + tt_cmap14_char_map_def_binary, tt_cmap14_char_map_nondef_binary, + tt_cmap14_find_variant, tt_cmap14_char_var_index, + tt_cmap14_char_var_isdefault, tt_cmap14_variants, + tt_cmap14_char_variants, tt_cmap14_def_char_count, + tt_cmap14_get_def_chars, tt_cmap14_get_nondef_chars, + tt_cmap14_variant_chars, tt_cmap14_class_rec): New functions and + structures for cmap 14 support. + (tt_cmap_classes): Register tt_cmap14_class_rec. + (tt_face_build_cmaps): One more error message. + + * docs/CHANGES: Mention cmap 14 support. + +2007-10-01 Werner Lemberg + + * src/base/ftobjs.c (find_unicode_charmap): If search for a UCS-4 + charmap fails, do the loop again while searching a UCS-2 charmap. + This favours MS charmaps over Apple ones. + +2007-08-29 suzuki toshiya + + * src/base/ftmac.c: Introduction of abstract `short' data types, + ResFileRefNum and ResID. These types were introduced for Copland, + then backported to MPW. The variables exchanged with FileManager + QuickDraw frameworks are redefined by these data types. Patch was + proposed by Sean McBride. + * builds/mac/ftmac.c: Ditto. + +2007-08-18 Werner Lemberg + + * src/otvalid/otvcmmn.c (otv_x_y_ux_sy): Skip context glyphs. Found + by Imran Yousaf. Fixes Savannah bug #20773. + + (otv_Lookup_validate): Correct handling of LookupType. Found by + Imran Yousaf. Fixes Savannah bug #20782. + +2007-08-17 George Williams + + * src/otvalid/otvgsub.c (otv_SingleSubst_validate): Fix handling of + SingleSubstFormat1. + +2007-08-11 suzuki toshiya + + * builds/unix/configure.raw: Fix a bug which sets CC_BUILD by + ${build-gcc} (unchecked) instead of by ${build}-gcc (checked). + Found by Ryan Hill. + +2007-08-11 George Williams + + * src/otvalid/otvcommn.c, src/otvalid/otvcommn.h + (otv_Coverage_validate): Add fourth argument to pass an expected + count value. Update all users. + Check glyph IDs. + (otv_ClassDef_validate): Check `StartGlyph'. + + * src/otvalid/otvgsub.c (otv_SingleSubst_validate): More glyph ID + checks. + + * src/otvalid/otvmath.c (otv_MathConstants_validate): There are only + 56 constants. + (otv_GlyphAssembly_validate, otv_MathGlyphConstruction_validate): + Check glyph IDs. + +2007-08-08 Werner Lemberg + + * src/otvalid/otvbase.c, src/otvalid/otvcommn.c, + src/otvalid/otvgdef.c, src/otvalid/otvgpos.c, src/otvalid/otvgsub.c, + src/otvalid/otvjstf.c: s/FT_INVALID_DATA/FT_INVALID_FORMAT/ where + appropriate. Reported by George. + + * include/freetype/internal/fttrace.h: Define `trace_otvmath'. + + * src/otvalid/rules.mk (OTV_DRV_SRC): Add otvmath.c. + + * docs/CHANGES: Updated. + +2007-08-08 George Williams + + Add `MATH' validating support to otvalid module. + + * include/freetype/tttags.h (TTAG_MATH): New macro. + * include/freetype/ftotval.h (FT_VALIDATE_MATH): New macro. + (FT_VALIDATE_OT): Updated. + + * src/otvalid/otmath.c: New file. + + * src/otvalid/otvalid.c: Include otvmath.c. + * src/otvalid/otvmod.c (otv_validate): Handle `MATH' table. + +2007-08-04 Werner Lemberg + + * builds/unix/configure.raw: Add call to AC_LIBTOOL_WIN32_DLL. + Fixes Savannah bug #20686. + +2007-08-03 Werner Lemberg + + * src/psnames/psmodule.c: Fix usage of + FT_CONFIG_OPTION_POSTSCRIPT_NAMES macro. Reported by Graham Asher. + +2007-07-31 suzuki toshiya + + * src/base/ftmac.c (open_face_from_buffer): The argument + `driver_name' is typed as `const char*' to match with the + callers in FT_New_Face_From_LWFN and FT_New_Face_From_SFNT. + This is same with open_face_from_buffer in src/base/ftobjs.c. + Found and fixed by Sean McBride. + +2007-07-28 Werner Lemberg + + * src/raster/ftraster.c (count_table): Make it conditional. + * src/base/ftobjs.c (FT_New_Library): Check FT_RENDER_POOL_SIZE with + a preprocessor statement. + +2007-07-27 Werner Lemberg + + * src/base/ftoutln.c (FT_Outline_Translate): Check `outline' before + first usage. From Savannah patch #6115. + +2007-07-16 Werner Lemberg + + * docs/CHANGES: Updated. + +2007-07-16 Derek Clegg + + Add new service for getting the ROS from a CID font. + + * include/freetype/config/ftheader.h (FT_CID_H): New macro. + * include/freetype/ftcid.h: New file. + + * include/freetype/internal/ftserv.h (FT_SERVIVE_CID_H): New macro. + * include/freetype/internal/services/svcid.h: New file. + + * src/base/ftcid.c: New file. + + * src/cff/cffdrivr.c: Include FT_SERVICE_CID_H. + (cff_get_ros): New function. + (cff_service_cid_info): New service structure. + (cff_services): Register it. + + * src/cff/cffload.c (cff_font_done): Free registry and ordering. + + * src/cff/cfftypes.h (CFF_FontRec): Add `registry' and `ordering'. + + * modules.cfg (BASE_EXTENSIONS): Add ftcid.c. + +2007-07-11 Derek Clegg + + Add support for postscript name service to CFF driver. + + * src/cff/cffdrivr.c: Include FT_SERVICE_POSTSCRIPT_NAME_H. + (cff_get_ps_name): New function. + (cff_service_ps_name): New service structure. + (cff_services): Register it. + +2007-07-07 Werner Lemberg + + * src/base/ftglyph.c (FT_Glyph_Copy): Fix initialization of + `target'. Reported by Sean McBride. + +2007-07-06 Werner Lemberg + + * src/pfr/pfrcmap.c: Include pfrerror.h. + + * src/autofit/afindic.c: Add some external declarations to pacify + `make multi' compilation. + + * src/cid/cidgload.c (cid_load_glyph): Pacify compiler. + + * src/cff/cffdrivr.c (cff_ps_get_font_info), src/cff/cffobjs.c + (cff_strcpy), include/freetype/internal/ftmemory.h (FT_MEM_STRDUP), + src/autofit/aflatin.c (af_latin_hints_compute_edges), + src/autofit/afcjk.c (af_cjk_hints_compute_edges), src/sfnt/ttmtx.c + (tt_face_get_metrics), src/base/ftobjs.c (open_face) + [FT_CONFIG_OPTION_INCREMENTAL]: Fix compilation with C++ compiler. + + * docs/release: Mention test compilation targets. + +2007-07-04 Werner Lemberg + + * docs/PROBLEMS: Mention that some PS based fonts can't be + handled correctly by FreeType. + + * src/truetype/ttgload.c (load_truetype_glyph): Always allow a + recursion depth of 1. This was the maximum value in TrueType 1.0, + and some older fonts don't set this field correctly. + + * src/gxvalid/gxvmort1.c + (gxv_mort_subtable_type1_substTable_validate): Fix tracing message. + +2007-07-03 Werner Lemberg + + * src/autofit/aflatin.c (af_latin_metrics_init_blues): Initialize + `round' to pacify compiler. + +2007-07-02 Werner Lemberg + + + * Version 2.3.5 released. + ========================= + + + Tag sources with `VER-2-3-5'. + + * docs/CHANGES, docs/VERSION.DLL: Update documentation and bump + version number to 2.3.5. + + * README, Jamfile (RefDoc), builds/win32/visualc/index.html, + builds/win32/visualc/freetype.dsp, + builds/win32/visualc/freetype.vcproj, + builds/win32/visualce/index.html, + builds/win32/visualce/freetype.dsp, + builds/win32/visualce/freetype.vcproj: s/2.3.4/2.3.5/, s/234/235/. + + * include/freetype/freetype.h (FREETYPE_PATCH): Set to 5. + + * builds/unix/configure.raw (version_info): Set to 9:16:3. + +2007-07-01 David Turner + + * include/freetype/freetype.h, src/base/ftpatent.c + (FT_Face_SetUnpatentedHinting): New function to dynamically change + the setting after a face is created. + + * src/truetype/ttgload.c (TT_Load_Simple_Glyph): Fix a small bug + that created distortions in the bytecode interpreter results. + +2007-06-30 David Turner + + * src/truetype/ttinterp.c (Ins_IUP): Add missing variable + initialization. + + * src/autofit/aflatin.c (af_latin_metric_init_blues): Get rid of an + infinite loop in the case of degenerate fonts. + +2007-06-26 Rahul Bhalerao + + Add autofit module for Indic scripts. This currently just reuses + the CJK-specific functions. + + * include/freetype/config/ftoption.h (AF_CONFIG_OPTION_INDIC): New + macro. + * devel/ftoption.h: Synchronize with + include/freetype/config/ftoption.h. + + * src/autofit/afindic.c, src/autofit/afindic.h: New files. + + * src/autofit/afglobal.c, src/autofit/aftypes.h, + src/autofit/autofit.c: Updated. + + * src/autofit/Jamfile (_sources), * src/autofit/rules.mk + (AUTOF_DRV_SRC): Updated. + +2007-06-23 David Turner + + * src/truetype/ttgload.c (TT_Load_Simple): Fix change from + 2007-06-16 that prevented the TrueType module from loading most + glyphs. + +2007-06-20 Werner Lemberg + + * src/cff/cffgload.c (cff_slot_load): Fix logic of 2007-05-28 + change. + +2007-06-19 Werner Lemberg + + * src/type1/t1load.c (parse_encoding): Handle one more error. + +2007-06-19 Dmitry Timoshkov + + * src/winfonts/winfnt.c (fnt_face_get_dll_font): Return error + FNT_Err_Invalid_File_Format if file format was recognized but + the file doesn't contain any FNT(NE) or RT_FONT(PE) resources. + Add verbose debug logs to make it easier to debug failing load + attempts. + (FNT_Face_Init): A single FNT font can't contain more than 1 face, + so return an error if requested face index is > 0. + Do not do further attempt to load fonts if a previous attempt has + failed but returned error FNT_Err_Invalid_File_Format, i.e., the + file format has been recognized but no fonts found in the file. + +2007-07-19 suzuki toshiya + + * src/base/ftmac.c: Apply patches proposed by Sean McBride. + (FT_GetFile_From_Mac_Name): Insert FT_UNUSED macros to fix + the compiler warnings against unused arguments. + (FT_ATSFontGetFileReference): Ditto. + (FT_GetFile_From_Mac_ATS_Name): Ditto. + (FT_New_Face_From_FSSpec): Ditto. + (lookup_lwfn_by_fond): Fix wrong comment. + Replace `const StringPtr' by more appropriate type + `ConstStr255Param'. + FSRefMakePathPath always returns UTF8 POSIX pathname in + Mach-O, thus HFS pathname support is dropped. + (count_faces): Remove HLock and HUnlock which is not + required on Mac OS X anymore. + (FT_New_Face_From_SFNT): Ditto. + (FT_New_Face_From_FOND): Ditto. + * builds/mac/ftmac.c: Synchronize to src/base/ftmac.c, + except of HFS pathname support and HLock/HUnlock. + They are required on classic CFM environment. + +2007-06-18 Werner Lemberg + + * src/psaux/psobjs.c (ps_parser_skip_PS_token): Remove incorrect + assertion. + (ps_parser_to_bytes): Fix error message. + + * src/type42/t42objs.c (T42_Open_Face): Handle one more error. + * src/type42/t42parse.c (t42_parse_sfnts): s/alloc/allocated/. + Don't allow mixed binary and hex strings. + Handle string_size == 0 and string_buf == 0. + (t42_parse_encoding): Handle one more error. + +2007-06-18 Werner Lemberg + + * src/psaux/psobjs.c (ps_tofixedarray, ps_tocoordarray): Fix exit + logic. + (ps_parser_load_field) : Skip delimiters + correctly. + (ps_parser_load_field_table): Use `fields->array_max' instead of + T1_MAX_TABLE_ELEMENTS to limit the number of arguments. + + * src/cff/cffgload.c (cff_decoder_prepare): Fix change from + 2007-06-06. + +2007-06-17 Werner Lemberg + + * src/tools/ftrandom.c (font_size): New global variable. + (TestFace): Use it. + (main): Handle new option `--size' to set `font_size'. + (Usage): Updated. + + * src/winfonts/winfnt.c (fnt_face_get_dll_font): Exit in case of + invalid font. + (FNT_Load_Glyph): Protect against invalid bitmap width. + +2007-06-16 David Turner + + * src/smooth/ftgrays.c (gray_find_cell, gray_set_cell, gray_hline): + Prevent integer overflows when rendering very large outlines. + + * src/truetype/ttgload.c (TT_Load_Simple_Glyph): Check the + well-formedness of the contours array when loading a glyph. + + * src/truetype/ttinterp.c (TT_Load_Context): Initialize `zp0', `zp1', + and `zp2'. + (Ins_IP): Check argument ranges to reject bogus operations properly. + (IUP_WorkerRec): Add `max_points' member. + (_iup_worker_interpolate): Check argument ranges. + (Ins_IUP): Ignore empty outlines. + +2007-06-16 Dmitry Timoshkov + + * src/winfonts/winfnt.h: Add necessary structures for PE resource + parsing. + (WinPE32_HeaderRec): New structure. + (WinPE32_SectionRec): New structure. + (WinPE_RsrcDirRec): New structure. + (WinPE_RsrcDirEntryRec): New structure. + (WinPE_RsrcDataEntryRec): New structure. + (FNT_FontRec): Remove unused `size_shift' field. + + * src/winfonts/winfnt.c (fnt_face_get_dll_font): Add support for + loading bitmap .fon files in PE format. + +2007-06-15 Dmitry Timoshkov + + * builds/win32/ftdebug.c: Unify debug level handling with other + platforms. + +2007-06-14 Dmitry Timoshkov + + * builds/win32/ftdebug.c (FT_Message): Send debug output to the + console as well as to the debugger. + +2007-06-14 Werner Lemberg + + * src/autofit/aflatin.c (af_latin_uniranges): Expand structure to + cover all ranges which could possibly be handled by the aflatin + module (since the default fallback for unknown ranges is now the + afcjk module). It might be necessary to fine-tune this further by + splitting off modules for Greek, Cyrillic, or other blocks. + +2007-06-11 David Turner + + * src/autofit/aflatin.c (af_latin_hints_link_segments): Fix + incorrect segment linking computation. This was the root cause of + Savannah bug #19565. + + + * src/autofit/* [FT_OPTION_AUTOFIT2]: Some very experimental changes + to improve the Latin auto-hinter. Note that the new code is + disabled by default since it is not stabilized yet. + + * src/autofit/aflatin2.c, src/autofit/aflatin2.h: New files + (disabled currently). + + * src/autofit/afhints.c: Remove dead code. + (af_axis_hints_new_edge): Add argument to handle segment directions. + (af_edge_flags_to_string): New function. + (af_glyph_hints_dump_segments, af_glyph_hints_dump_edges): Handle + option flags. + (af_glyph_hints_reload): Add argument to handle inflections. + Simplify. + (af_direction_compute): Fine tuning. + (af_glyph_hints_align_edge_points): Fix logic. + (af_glyph_hints_align_strong_points): Do linear search for small + edge counts. + (af_glyph_hints_align_weak_points): Skip any touched neighbors. + (af_iup_shift): Handle zero `delta'. + + * src/autofit/afhints.h: Updated. + (AF_SORT_SEGMENTS): New macro (disabled). + (AF_AxisHintsRec) [AF_SORT_SEGMENTS]: New member `mid_segments'. + + * src/autofit/afglobal.c (af_face_globals_get_metrics): Add + argument to pass option flags for handling scripts. + * src/autofit/afglobal.h: Updated. + + * src/autofit/afcjk.c: Updated. + * src/autofit/aflatin.c: Updated. + (af_latin_metrics_scale_dim): Don't reduce scale by 2%. + + (af_latin_hints_compute_segments) [AF_HINT_METRICS]: Remove dead code. + (af_latin_hints_compute_edges) [AF_HINT_METRICS]: Remove dead code. + Don't set `edge->dir' + (af_latin_hint_edges): Add more logging. + + * src/autofit/afloader.c: Updated. + +2007-06-11 Werner Lemberg + + * docs/CHANGES: Document FT_Face_CheckTrueTypePatents. + +2007-06-10 David Turner + + * src/truetype/ttgload.c (TT_Load_Simple_Glyph): Slight speed-up to + the TrueType glyph loader. + + * include/freetype/config/ftoption.h: Clarify documentation + regarding unpatented hinting. + + + Add new `FT_Face_CheckTrueTypePatents' API. + + * include/freetype/freetype.h (FT_Face_CheckTrueTypePatents): New + declaration. + + * include/freetype/internal/services/svttglyf.h, + src/base/ftpatent.c: New files. + + * include/freetype/internal/ftserv.h (FT_SERVICE_TRUETYPE_GLYF_H): + New macro. + + * src/truetype/ttdriver.c: Include FT_SERVICE_TRUETYPE_GLYF_H and + `ttpload.h'. + (tt_service_truetype_glyf): New service structure. + (tt_services): Register it. + + * modules.cfg (BASE_EXTENSIONS), src/base/Jamfile (_sources): Add + `ftpatent.c'. + +2007-06-08 Werner Lemberg + + * src/sfnt/sfobjs.c (sfnt_load_face): Undo change from 2007-04-28. + Fonts without a cmap must be handled correctly by FreeType (anything + else would be a bug). + + + * src/psaux/t1decode.c (t1_decoder_parse_charstrings) + [FT_DEBUG_LEVEL_TRACE]: Improve tracing message. + +2007-06-07 Werner Lemberg + + * src/sfnt/ttsbit0.c (tt_sbit_decoder_init, + tt_sbit_decoder_load_image): Protect against integer overflows. + + + * src/pfr/pfrgload.c (pfr_glyph_load_simple): More bounding checks + for `x_control' and `y_control'. + +2007-06-06 Werner Lemberg + + * src/base/ftoutln.c (FT_Outline_Decompose): Check `last'. + + + * src/pfr/pfrcmap.c (pfr_cmap_init): Convert assertion into normal + FreeType error. + + + * src/winfonts/winfnt.c (fnt_face_get_dll_font): Do a rough check of + `font_count'. + + + * src/type1/t1load.c (parse_font_matrix): Check `temp_scale'. + + + * src/cff/cffgload.c (cff_decoder_prepare): Change return type to + `FT_Error'. + Check `fd_index'. + (cff_slot_load): Updated. + * src/cff/cffgload.h: Updated. + +2007-06-05 Werner Lemberg + + * src/pfr/pfrgload.c (pfr_glyph_done): Comment out unused code. + (pfr_glyph_load_simple): Convert assertion into normal FreeType + error. + Check `idx'. + (pfr_glyph_load_compound, pfr_glyph_curve_to, pfr_glyph_line_to): + Convert assertion into normal FreeType error. + + * src/pfr/pfrtypes.h (PFR_GlyphRec): Comment out unused code. + + + * src/winfonts/winfnt.c (FNT_Face_Init): Check `family_size'. + + + * src/psaux/psobjs.c (ps_tocoordarray, ps_tofixedarray): Return -1 + in case of parsing error. + (ps_parser_load_field): Updated. + + * src/type1/t1load.c (parse_font_matrix): Updated. + +2007-06-04 Werner Lemberg + + * src/cid/cidgload.c (cid_load_glyph): Check `fd_select'. + + * src/tools/ftrandom/Makefile: Depend on `libfreetype.a'. + +2007-06-03 Werner Lemberg + + * src/tools/ftrandom/*: Add the `ftrandom' test program written by + George Williams (with some modifications). + +2007-06-03 Werner Lemberg + + * src/base/ftobjs.c (destroy_charmaps), src/type1/t1objs.c + (T1_Face_Done), src/winfonts/winfnt.c (FNT_Face_Done): Check for + face == NULL. Suggested by Graham Asher. + +2007-06-03 Ismail Dönmez + + * src/base/ftobjs.c (FT_Request_Metrics): Fix compiler warning. + +2007-06-02 Werner Lemberg + + * include/freetype/fterrdef.h (FT_Err_Corrupted_Font_Header, + FT_Err_Corrupted_Font_Glyphs): New error codes for BDF files. + + * src/bdf/bdflib.c (bdf_load_font): Use them. + + * src/bdf/bdflib.c (_bdf_parse_start): Check `FONT' better. + +2007-06-01 Werner Lemberg + + * src/base/ftobjs.c (FT_Request_Metrics), src/cache/ftccmap.c + (FTC_CMapCache_Lookup): Remove unused code. + +2007-06-01 Sean McBride + + * src/truetype/ttinterp.c (Null_Vector, NULL_Vector): Removed, + unused. + +2007-06-01 Werner Lemberg + + * src/cid/cidparse.c (cid_parser_new): Don't continue second search + pass for `StartData' if an error has occurred. + Exit properly if no `StartData' has been seen at all. + + * builds/unix/ftsystem.c (FT_Stream_Open): Don't use ULONG_MAX but + LONG_MAX to avoid compiler warning. Suggested by Sean McBride. + +2007-05-30 Werner Lemberg + + * src/type1/t1load.c (parse_subrs, parse_charstrings): Protect + against too small binary data strings. + + * src/bdf/bdflib.c (_bdf_parse_glyphs): Check `STARTCHAR' better. + +2007-05-28 David Turner + + * src/cff/cffgload.c (cff_slot_load): Do not apply the identity + transformation. This significantly reduces the loading time of CFF + glyphs. + + * docs/CHANGES: Updated. + + * src/autofit/afglobal.c (AF_SCRIPT_LIST_DEFAULT): Change default + hinting script to CJK, since it works well with more scripts than + latin. Thanks to Rahul Bhalerao for pointing + this out! + +2007-05-25 Werner Lemberg + + * docs/CHANGES: Updated. + +2007-05-24 Werner Lemberg + + * src/truetype/ttobjs.h (tt_size_ready_bytecode): Move declaration + into TT_USE_BYTECODE_INTERPRETER preprocessor block. + +2007-05-24 Graham Asher + + * src/truetype/ttobjs.c (tt_size_ready_bytecode) + [!TT_USE_BYTECODE_INTERPRETER]: Removed. Unused. + +2007-05-22 David Turner + + * src/truetype/ttgload.c (load_truetype_glyph): Fix last change to + avoid crashes in case the bytecode interpreter is not used. + + + Avoid heap blowup with very large .Z font files. This fixes + Savannah bug #19910. + + * src/lzw/ftzopen.h (FT_LzwStateRec): Remove `in_cursor', + `in_limit', `pad', `pad_bits', and `in_buff' members. + Add `buf_tab', `buf_offset', `buf_size', `buf_clear', and + `buf_total' members. + + * src/lzw/ftzopen.c (ft_lzwstate_get_code): Rewritten. It now takes + only one argument. + (ft_lzwstate_refill, ft_lzwstate_reset, ft_lzwstate_io): Updated. + +2007-05-20 Ismail Dönmez + + * src/pshinter/pshrec.c (ps_mask_table_set_bits): Add `const'. + (ps_dimension_set_mask_bits): Remove `const'. + +2007-05-19 Werner Lemberg + + * src/sfnt/ttmtx.c (tt_face_get_metrics) + [!FT_CONFIG_OPTION_OLD_INTERNALS]: Another type-punning fix. + +2007-05-19 Derek Clegg + + Savannah patch #5929. + + * include/freetype/tttables.h, src/base/ftobjcs.c + (FT_Get_CMap_Format): New function. + + * include/freetype/internal/services/svttcmap.c (TT_CMapInfo): Add + `format' member. + * src/sfnt/ttcmap.c (tt_cmap{0,2,4,6,8,10,12}_get_info): Set + cmap_info->format. + +2007-05-19 Werner Lemberg + + * src/truetype/ttgload.c (load_truetype_glyph): Save graphics state + before handling subglyphs so that it can be reinitialized each time. + This fixes Savannah bug #19859. + +2007-05-16 Werner Lemberg + + * src/cache/ftccache.c (ftc_node_mru_link, ftc_node_mru_unlink), + src/cache/ftccache.h (FTC_CACHE_LOOKUP_CMP), src/cache/ftcglyph.h + (FTC_GCACHE_LOOKUP_CMP), src/pshinter/pshmod.c (ps_hinter_init), + src/sfnt/ttmtx.c (tt_face_load_hmtx, tt_face_load_hhea, + tt_face_get_metrics): Fix type-punning issues. + +2007-05-15 David Turner + + * include/freetype/config/ftstdlib.h, + include/freetype/internal/ftobjs.h: As suggested by Graham Asher, + ensure that ft_isalnum, ft_isdigit, etc., use hard-coded values + instead on relying on the locale-dependent functions provided by + . + +2007-05-15 Graham Asher + + * src/autofit/afcjk.c (af_cjk_hints_compute_edges): Remove unused + variable. + * src/autofit/afloader.c (af_loader_load_g): Ditto. + + * src/base/ftobjs.c (ft_validator_error): Use `ft_jmp_buf'. + (open_face_from_buffer): Initialize `stream'. + (FT_Request_Metrics): Remove unused variable. + Remove redundant `break' statements. + (FT_Get_Track_Kerning): Remove unused variable. + + * src/psaux/afmparse.c (afm_parse_track_kern, afm_parse_kern_pairs, + afm_parse_kern_data): Remove redundant + `break' statements. + (afm_parser_parse): Ditto. + Don't use uninitialized variables. + + * src/psnames/psmodule.c (VARIANT_BIT): Define as unsigned long. + Use `|' operator instead of `^' to set it. + Update all users. + + * src/sfnt/ttcmap.c (tt_face_build_cmaps): Use `ft_jmp_buf'. + * src/sfnt/ttkern.c (tt_face_load_kern): Remove unused variable. + + * src/truetype/ttgload.c (TT_Load_Simple_Glyph): Remove redundant + comparison. + (TT_Process_Simple_Glyph): Use FT_UInt for `n_points' and `i'. + (TT_Load_Glyph): Remove unused variable. + +2007-05-13 Derek Clegg + + * src/base/ftobjs.c (FT_New_Library): Only allocate rendering pool + if FT_RENDER_POOL_SIZE is > 0. From Savannah patch #5928. + +2007-05-11 David Turner + + * src/cache/ftbasic.c, include/freetype/ftcache.h + (FTC_ImageCache_LookupScaler, FTC_SBit_Cache_LookupScaler): Two new + functions that allow us to look up glyphs using an FTC_Scaler object + to specify the size, making it possible to use fractional pixel + sizes. + + * src/truetype/ttobjs.c (tt_size_ready_bytecode): Set + `size->cvt_ready'. Reported by Boris Letocha. + +2007-05-09 Graham Asher + + * src/truetype/ttinterp.c (Ins_IP), src/autofit/aflatin.c + (af_latin_metrics_scale_dim): Fix compiler warnings. + +2007-05-06 Werner Lemberg + + * builds/win32/visualce/freetype.sln: Removed, as requested by + Vincent. + +2007-05-04 Vincent RICHOMME + + * builds/win32/visualce/*: Add Visual C++ project files for Pocket + PC targets. + + * docs/CHANGES: Document them. + +2007-05-04 + + * builds/unix/ftsystem.c (FT_Stream_Open): Handle return value 0 of + mmap (which might happen on some RTOS). From Savannah patch #5909. + +2007-05-03 Werner Lemberg + + * src/base/ftobjs.c (FT_Set_Char_Size): Simplify code. + * include/freetype/freetype.h (FT_Set_Char_Size): Update + documentation. + +2007-04-28 Victor Stinner + + * src/sfnt/sfobjs.c (sfnt_load_face): Check error code after loading + `cmap'. + +2007-04-27 Werner Lemberg + + * src/truetype/ttgload.c (TT_Load_Simple_Glyph): Check for negative + number of points in contours. Problem reported by Victor Stinner + . + (TT_Process_Simple_Glyph): Synchronize variable types. + +2007-04-26 Werner Lemberg + + * src/base/ftglyph.c (FT_Glyph_Copy): Always set second argument to + zero in case of error. This fixes Savannah bug #19689. + +2007-04-25 Boris Letocha + + * src/truetype/ttobjs.c: Fix a typo that created a speed regression + in the TrueType bytecode loader. + +2007-04-10 Martin Horak + + * src/sfnt/sfobjs.c (sfnt_load_face) [FT_CONFIG_OPTION_INCREMENTAL]: + Ignore `hhea' table. This fixes Savannah bug #19261. + +2007-04-09 Werner Lemberg + + + * Version 2.3.4 released. + ========================= + + + Tag sources with `VER-2-3-4'. + + * docs/CHANGES, docs/VERSION.DLL: Update documentation and bump + version number to 2.3.4. + + * README, Jamfile (RefDoc), builds/win32/visualc/index.html, + builds/win32/visualc/freetype.dsp, + builds/win32/visualc/freetype.vcproj: s/2.3.3/2.3.4/, s/233/234/. + + * include/freetype/freetype.h (FREETYPE_PATCH): Set to 4. + + * builds/unix/configure.raw (version_info): Set to 9:15:3. + +2007-04-09 Martin Horak + + * src/truetype/ttgload.c (load_truetype_glyph): Save and restore + memory stream to avoid a crash with the incremental memory + interface (Savannah bug #19260). + +2007-04-06 David Turner + + * src/base/ftbimap.c (ft_bitmap_assure_buffer): Fix buffer-overwrite bug + (Savannah bug #19536). + +2007-04-04 Werner Lemberg + + + * Version 2.3.3 released. + ========================= + + + Tag sources with `VER-2-3-3'. + + * docs/CHANGES: Mention CVE-2007-1351. + +2007-04-03 David Turner + + * src/base/ftobjs.c (FT_Set_Char_Size): As suggested by James Cloos, + if one of the resolution values is 0, treat it as if it were the + same as the other value. + +2007-04-02 David Turner + + Add special code to detect `extra-light' fonts and do not snap their + stem widths too much to avoid bizarre hinting effects. + + * src/autofit/aflatin.h (AF_LatinAxisRec): Add `standard_width' and + `extra_light' members. + + * src/autofit/aflatin.c (af_latin_metrics_init_widths): Initialize + them. + (af_latin_metrics_scale_dim): Set `extra_light'. + (af_latin_compute_stem_width): Use `extra_light'. + +2007-03-28 David Turner + + * src/base/ftbitmap.c (ft_bitmap_assure_buffer): Fix zero-ing of the + padding. + +2007-03-28 Werner Lemberg + + * src/bdf/bdflib.c (setsbit, sbitset): Handle values >= 128 + gracefully. + (_bdf_set_default_spacing): Increase `name' buffer size to 256 and + issue an error for longer names. This fixes CVE-2007-1351. + (_bdf_parse_glyphs): Limit allowed number of glyphs in font to the + number of code points in Unicode. + + * builds/win32/visualc/index.html, + builds/win32/visualc/freetype.dsp, + builds/win32/visualc/freetype.vcproj, README: s/2.3.2/2.3.3/, + s/232/233/. + + * docs/CHANGES: Mention ftdiff. + +2007-03-26 David Turner + + * src/truetype/ttinterp.c [FIX_BYTECODE]: Remove it and + corresponding code. + (Ins_MD): Last regression fix. + + * src/autofit/aflatin.c (af_latin_metrics_init_blues): Fix blues + computations in order to ignore single-point contours. These are + never rasterized and correspond in certain fonts to mark-attach + points that are very far from the glyph's real outline, ruining the + computation. + + * src/autofit/afloader.c (af_loader_load_g): In the case of + monospaced fonts, always set `rsb_delta' and `lsb_delta' to 0. + Otherwise code that uses them will most certainly ruin the fixed + advance property. + + * docs/CHANGES, docs/VERSION.DLL, README, Jamfile (RefDoc): Update + documentation and bump version number to 2.3.3. + + * include/freetype/freetype.h (FREETYPE_PATCH): Set to 3. + + * builds/unix/configure.raw (version_info): Set to 9:14:3. + +2007-03-26 suzuki toshiya + + * builds/unix/ftconfig.in: Disable Carbon framework dependency on + 64bit ABI on Mac OS X 10.4.x (ppc & i386). Found by Sean McBride. + * builds/vms/ftconfig.h: Ditto. + * include/freetype/config/ftconfig.h: Ditto. + +2007-03-22 suzuki toshiya + + * builds/unix/ftsystem.c (FT_Stream_Open): Temporary fix to prevent + 32bit unsigned long overflow by 64bit filesize on LP64 platform, as + proposed by Sean McBride: + http://lists.gnu.org/archive/html/freetype-devel/2007-03/msg00032.html + +2007-03-22 suzuki toshiya + + * builds/unix/ftconfig.in: Suppress SGI compiler's warning against + setjmp, proposed by Sean McBride: + http://lists.gnu.org/archive/html/freetype-devel/2007-03/msg00032.html + +2007-03-19 suzuki toshiya + + * builds/unix/configure.raw: Dequote `OS_INLINE' in comment of + conftest.c, to avoid unexpected shell evaluation. Possibly it is a + bug or undocumented behaviour of autoconf. + +2007-03-18 David Turner + + * src/truetype/ttinterp.c (Ins_MDRP): Another bytecode regression + fix; testing still needed. + + * src/truetype/ttinterp.c (Ins_MD): Another bytecode regression fix. + +2007-03-17 David Turner + + * src/truetype/ttinterp.c (Ins_IP): Fix wrong handling of the + (undocumented) twilight zone special case. + +2007-03-09 Werner Lemberg + + + * Version 2.3.2 released. + ========================= + + + Tag sources with `VER-2-3-2'. + + * builds/win32/visualc/index.html, + builds/win32/visualc/freetype.dsp, + builds/win32/visualc/freetype.vcproj, README: s/2.3.1/2.3.2/, + s/231/232/. + +2007-03-08 David Turner + + * docs/CHANGES, docs/VERSION.DLL: Updated for upcoming release. + + * builds/unix/configure.raw (version_info): Set to 9:13:3. + + * include/freetype/freetype.h (FREETYPE_PATCH): Set to 2. + + * README, Jamfile (RefDoc): s/2.3.1/2.3.2/. + + * src/base/ftutil.c (ft_mem_strcpyn): Fix a bug that prevented the + function to work properly, over-writing user-provided buffers in + some cases. Reported by James Cloos . + + +2007-03-05 Werner Lemberg + + * include/freetype/config/ftstdlib.h (ft_strstr): New wrapper + macro for `strstr'. + + * src/truetype/ttobjs.c (tt_face_init): Use ft_strstr for scanning + `trick_names', as suggested by Ivan Nincic. + +2007-03-05 David Turner + + * src/base/ftinit.c (FT_Init_FreeType): Fix a small memory leak in + case FT_Init_FreeType fails for some reason. Problem reported by + Maximilian Schwerin . + + * src/truetype/ttobs.c (tt_size_init_bytecode): Clear the `x_ppem' + and `y_ppem' fields of the `TT_Size.metrics' structure, not those of + `TT_Size.root.metrics'. Problem reported by Daniel Glöckner + . + + * src/type1/t1afm.c (T1_Read_PFM): Read kerning values as 16-bit + signed values, not unsigned ones. Problem reported by Johannes + Walther . + +2007-02-21 David Turner + + * src/pshinter/pshalgo.c (psh_hint_align): Fix a bug in the hinting + of small and ghost stems in the Postscript interpreter. + +2007-02-20 suzuki toshiya + + * src/base/ftmac.c (FT_GetFileRef_From_Mac_ATS_Name): Fix memory + leak, patch by "Jjgod Jiang" . + * builds/mac/ftmac.c (FT_GetFileRef_From_Mac_ATS_Name): Ditto. + +2007-02-16 Werner Lemberg + + * src/truetype/ttinterp.c (Ins_MD): Remove unused variable. + * src/autofit/aflatin.c (af_latin_hints_link_segments): Ditto. + +2007-02-14 David Turner + + It seems that the following changes fix most of the known + interpreter problems with my fonts, but more testing is needed, + though. + + * src/truetype/ttinterp.c (FIX_BYTECODE): Activate. + (TT_MulFix14): Rewrite. + (Ins_MD, Ins_MDRP, Ins_IP) [FIX_BYTECODE]: Improved and updated. + (Ins_MIRP): Ditto. + +2007-02-12 Werner Lemberg + + * src/truetype/ttinterp.c (Project_x, Project_y): Remove compiler + warnings. + + * src/pcf/pcfread.c (pcf_interpret_style), src/bdf/bdfdrivr.c + (bdf_interpret_style): Ditto. + +2007-02-12 David Turner + + Simplify projection and dual-projection code interface. + + * src/truetype/ttinterp.h (TT_Project_Func): Use `FT_Pos', not + FT_Vector' as argument type. + * src/truetype/ttinterp.c (CUR_Func_project, CUR_Func_dualproj): + Updated. + (CUR_fast_project, CUR_fast_dualproj): New macros. + (Project, Dual_Project, Project_x, Project_y): Updated. + (Ins_GC, Ins_SCFS, Ins_MDAP, Ins_MIAP, Ins_IP): Use new `fast' + macros. + + + * src/autofit/afloader.c (af_loader_load_g): Improve spacing + adjustments for the non-light auto-hinted modes. Gets rid of + `inter-letter spacing is too wide' problems. + + * src/autofit/aflatin.c (af_latin_hints_link_segments, + af_latin_hints_compute_edges): Slight optimization of the segment + linker and better handling of serif segments to get rid of broken + `9' in Arial at 9pt (96dpi). + + + Introduce new string functions and the corresponding macros to get + rid of various uses of strcpy and other `evil' functions, as well as + to simplify a few things. + + * include/freetype/internal/ftmemory.h (ft_mem_strdup, ft_mem_dup, + ft_mem_strcpyn): New declarations. + (FT_MEM_STRDUP, FT_STRDUP, FT_MEM_DUP, FT_DUP, FT_STRCPYN): New + macros. + * src/base/ftutil.c (ft_mem_dup, ft_mem_strdup, ft_mem_strcpyn): New + functions. + + * src/bfd/bfddrivr.c (bdf_interpret_style, BDF_Face_Init), + src/bdf/bdflib.c (_bdf_add_property), src/pcf/pcfread.c + (pcf_get_properties, pcf_interpret_style, pcf_load_font), + src/cff/cffdrivr.c (cff_get_glyph_name), src/cff/cffload.c + (cff_index_get_sid_string), src/cff/cffobjs.c (cff_strcpy), + src/sfnt/sfdriver.c (sfnt_get_glyph_name), src/type1/t1driver.c + (t1_get_glyph_name), src/type42/t42drivr.c (t42_get_glyph_name, + t42_get_name_index): Use new functions and simplify code. + + * builds/mac/ftmac.c (FT_FSPathMakeSpec): Don't use FT_MIN. + +2007-02-11 Werner Lemberg + + * src/autofit/afloader.c (af_loader_load_g): Don't change width for + non-spacing glyphs. + +2007-02-07 Tom Parker + + * src/cff/cffdrivr.c (cff_get_name_index): Protect against NULL + pointer. + +2007-02-05 suzuki toshiya + + * include/freetype/ftmac.h (FT_DEPRECATED_ATTRIBUTE): + Introduce __attribute((deprecated))__ to warn functions + which use non-ANSI data types in its interfaces. + (FT_GetFile_From_Mac_Name): Deprecated, using FSSpec. + (FT_GetFile_From_Mac_ATS_Name): Deprecated, using FSSpec. + (FT_New_Face_From_FSSpec): Deprecated, using FSSpec. + (FT_New_Face_From_FSRef): Deprecated, using FSRef. + + * src/base/ftmac.c: Predefine FT_DEPRECATED_ATTRIBUTE as void + to avoid warning in building FreeType. + * builds/mac/ftmac.c: Ditto. + +2007-02-05 suzuki toshiya + + * src/base/ftbase.c: Fix to use builds/mac/ftmac.c, if configured + `--with-fsspec' etc. Replace #include "ftmac.c" with + #include . + +2007-02-05 suzuki toshiya + + * include/freetype/ftmac.h (FT_GetFilePath_From_Mac_ATS_Name): + Introduced as replacement of FT_GetFile_From_Mac_ATS_Name. + * src/base/ftmac.c (FT_GetFilePath_From_Mac_ATS_Name): Ditto. + (FT_GetFile_From_Mac_ATS_Name): Rewritten as wrapper of + FT_GetFilePath_From_Mac_ATS_Name. + * builds/mac/ftmac.c: Ditto. + +2007-02-05 suzuki toshiya + + * include/freetype/ftmac.h: Fixed wrong comment: FSSpec of + FT_GetFile_From_Mac_Name, FT_GetFile_From_Mac_ATS_Name are + for passing to FT_New_Face_From_FSSpec. + +2007-02-05 suzuki toshiya + + * builds/unix/configure.raw: Check whether Mac OS X system headers + can be built under ANSI C mode. + + * src/base/ftmac.c (OS_INLINE): Redefine OS_INLINE by a version + compatible to ANSI C in case system headers are ANSI C incompatible. + * builds/mac/ftmac.c (OS_INLINE): Ditto. + +2007-02-01 Werner Lemberg + + * include/freetype/ttnameid.h (TT_MS_LANGID_DZONGHKA_BHUTAN): + Explain why applications shouldn't use it. Found by Alexei. + +2007-02-01 Alexei Podtelezhnikov + + * builds/unix/freetype2.m4 (AC_CHECK_FT2): Fix spelling of warning + message. + + * src/gxvalid/gxvmort1.c + (gxv_mort_subtable_type1_substTable_validate): Fix debugging + message. + +2007-01-31 Werner Lemberg + + + * Version 2.3.1 released. + ========================= + + + Tag sources with `VER-2-3-1-FINAL'. + + * builds/win32/visualc/freetype.dsp, + builds/win32/visualc/freetype.vcproj: s/230/231/. + * builds/win32/visualc/index.html: s/221/231/. + + * vms_make.com: Add `ftgasp'. + +2007-01-30 David Turner + + Tag sources with VER-2-3-1 to prepare release. + + * include/freetype/freetype.h (FREETYPE_PATCH): Set to 1. + + * docs/VERSION.DLL, docs/release, README, Jamfile (RefDoc): + s/2.3.0/2.3.1/. + + * builds/unix/configure.raw (version_info): Set to 9:12:3. + + + * src/autofit/aftypes.h (AF_USE_WARPER), src/autofit/afloader.c + (af_loader_load_g): Disable the warper (i.e., the light hinting + improvements) to make a 2.3.1 bugfix release before introducing a + new feature. This should give us more time to tune and improve the + warper for the next release. + + * docs/CHANGES: Update accordingly. + +2007-01-25 David Turner + + For light auto-hinting, improve glyph advance widths and resurrect + normal/full hinting to its normal quality. + + * src/autofit/afhints.h (AF_GlyphHintsRec): New members `xmin_delta' + and `xmax_delta'. + * src/autofit/afhints.c (af_glyph_hints_reload): Reset `xmin_delta' + and `xmax_delta'. + + * src/autofit/afloader.c (af_loader_load_g) : Replace + preprocessor conditional with if-clause, handling both light and + normal mode. + + * src/autofit/afwarp.c (AF_WarpScore): Fine-tune again. + (af_warper_compute): Handle `xmin_delta' and `xmax_delta'. + +2007-01-25 Werner Lemberg + + * docs/release: Updated -- Savannah uses a new uploading scheme. + +2007-01-25 David Turner + + * src/cff/cffload.c (cff_index_get_pointers): Improve previous fix. + + * src/cff/cffgload.c (cff_decoder_parse_charstrings) + : Fix sanity check for empty + functions. + + * docs/CHANGES: Document light auto-hinting improvement. + +2007-01-25 Werner Lemberg + + * src/cff/cffload.c (cff_index_get_pointers): Handle last entry + correctly in a sanity check. Since this function is only used to + load local and global functions, any charstring that called the last + local/global function would fail otherwise. This fixes Savannah bug + #18867. + + * docs/CHANGES: Document it. + +2007-01-23 David Turner + + * src/truetype/ttobjs.c (tt_size_ready_bytecode): Fix typo that + prevented compilation when disabling both the unpatented and the + bytecode interpreter in the TrueType font driver. + + + Fix and enable the warper to improve `light' hinting mode. This is + not necessarily a final version, but it seems to work well. + + * src/autofit/aflatin.c (af_latin_hints_init) [AF_USE_WARPER]: + Disable code. + (af_latin_hints_apply) [AF_USE_WARPER]: Handle FT_RENDER_MODE_LIGHT. + * src/autofit/aftypes.h: Activate AF_USE_WARPER. + + * src/autofit/afwarp.c (AF_WarpScore): Tune table. + (af_warper_compute_line_best): Fix array size of `scores'. + (af_warper_compute): Better handling of border cases. + * src/autofit/afwarp.h (AF_WarperRec): Remove unused members `X1' + and `X2'. + +2007-01-21 Werner Lemberg + + * ChangeLog: Split off older entries into... + * ChangeLog.22: This new file. + +2007-01-21 Werner Lemberg + + * docs/CHANGES: Document SHZ fix. + +2007-01-21 George Williams + + * src/truetype/ttinterp.c (Ins_SHZ): SHZ doesn't move phantom + points. + +2007-01-21 Werner Lemberg + + * src/sfnt/ttmtx.c (tt_face_get_metrics) + [!FT_CONFIG_OPTION_OLD_INTERNALS]: Fix limit check. + +2007-01-17 Werner Lemberg + + + * Version 2.3.0 released. + ========================= + + + Tag sources with `VER-2-3-0-FINAL'. + +2007-01-17 Werner Lemberg + + * docs/release: Updated. + +2007-01-16 David Turner + + * src/autofit/aflatin.c (af_latin_hints_compute_segments), + src/cff/cffdriver.c (cff_ps_get_font_info), src/truetype/ttobjs.c + (tt_face_init), src/truetype/ttinterp.c (Ins_SHC): Fix compiler + warnings. + +2007-01-15 Detlef Würkner + + * builds/amiga/makefile, builds/amiga/makefile.os4, + builds/amiga/smakefile: Add `ftgasp.c' and `ftlcdfil.c'. + + * builds/amiga/include/freetype/config/ftconfig.h: Synchronize. + +2007-01-14 Detlef Würkner + + Fix various compiler warnings. + + * src/truetype/ttdriver.c (tt_size_select), src/cff/cffobjs.h, + src/cff/cffobjs.c (cff_size_request), src/type42/t42objs.h: + s/index/strike_index/. + * src/base/ftobjs.c (FT_Match_Size): s/index/size_index/. + + * src/gxvalid/gxvmorx5.c + (gxv_morx_subtable_type5_InsertList_validate): s/index/table_index/. + + * src/truetype/ttinterp.c (Compute_Point_Displacement), + src/pcf/pcfread.c (pcf_seek_to_table_type): Avoid possibly + uninitialized variables. + +2007-01-13 suzuki toshiya + + * docs/CHANGES, docs/INSTALL.MAC: Improvements. + +2007-01-13 Werner Lemberg + + * src/type1/t1afm.c (T1_Read_Metrics): MS Windows allows PFM + versions up to 0x3FF without complaining. + +2007-01-13 Derek Clegg + + Add FT_Get_PS_Font_Info interface to CFF driver. + + * src/cff/cfftypes.h: Include FT_TYPE1_TABLES_H. + (CFF_FontRec): Add `font_info' field. + + * src/cff/cffload.c: Include FT_TYPE1_TABLES_H. + (cff_font_done): Free font->font_info if necessary. + + * src/cff/cffdrvr.c (cff_ps_get_font_info): New function. + (cff_service_ps_info): Register cff_ps_get_font_info. + +2007-01-13 Werner Lemberg + + * src/base/ftoutln.c (FT_Outline_Get_Orientation): Fix compilation + with C++ compiler. + + * src/autofit/afhints.c (af_glyph_hints_dump_segments, + af_glyph_hints_dump_edges): Ditto. + + * src/base/rules.mk (BASE_SRC): Remove ftgasp.c (it's already in + `modules.cfg'). + + * src/sfnt/ttsbit0.h: Remove. + + * src/sfnt/rules.mk (SFNT_DRV_SRC): Don't include ttsbit0.c. + +2007-01-12 David Turner + + * src/base/ftbitmap.c (ft_bitmap_assure_buffer): Fix memory stomping + bug in the bitmap emboldener if the pitch of the source bitmap is + much larger than its width. + + * src/truetype/ttinterp.c (Update_Max): Fix aliasing-related + compilation warning. + +2007-01-12 Werner Lemberg + + * builds/unix/install-sh, builds/unix/mkinstalldirs: Updated from + `automake' CVS module from sources.redhat.com. + +2007-01-11 Werner Lemberg + + * src/type1/t1load.c (is_space): Removed. + (parse_encoding, parse_charstrings): Use IS_PS_DELIM. + (parse_charstrings): Use IS_PS_TOKEN. + + + * autogen.sh: Avoid bash specific syntax. + +2007-01-11 David Turner + + * docs/CHANGES: Small update. + + * builds/unix/configure.raw (version_info): Set to 9:11:3. + + * src/base/ftobjs.c (IsMacResource): Fix a small bug that caused a + crash with some Mac OS X .dfont files. Submitted by Masatake + Yamato. + + * autogen.sh: Small fix to get it working on Mac OS X properly: + The issue is that GNU libtool is called `glibtool' on this platform, + and we must call `glibtoolize', since `libtoolize' doesn't exist. + +2007-01-10 David Turner + + * all-sources: Tag all sources with VER-2-3-0-RC1 and + VER-2-3-0. + + * Jamfile (RefDoc), README, builds/win32/visualc/freetype.dsp, + builds/win32/visualc/freetype.vcproj, docs/VERSION.DLL: Update + version number to 2.3.0. + + * include/freetype/freetype.h (FREETYPE_MINOR): Set to 3. + (FREETYPE_PATCH): Set to 0. + + * include/freetype/ftchapters.h, include/freetype/ftgasp.h, + include/freetype/ftlcdfil.h: Update reference documentation with + GASP support and LCD filtering sections. + + * src/pshinter/pshalgo.c (psh_glyph_compute_inflections): Fix a typo + which created an endless loop with some malformed font files. + +2007-01-10 Derek Clegg + + * src/type1/t1load.c (T1_Get_MM_Var): Always return fixed point + values. + +2007-01-08 David Turner + + * docs/CHANGES: Updated. + + * include/freetype/ftgasp.h, src/base/ftgasp.c: New files which add + a new API `FT_Get_Gasp' to return entries of the `gasp' table + corresponding to a given character pixel size. + + * src/sfnt/ttload.c (tt_face_load_gasp): Add version check for the + `gasp' table, in order to avoid potential problems with later + versions. + + * include/freetype/config/ftheader.h (FT_GASP_H): New macro for + . + + * src/base/rules.mk (BASE_SRC), src/base/Jamfile (_sources), + modules.cfg (BASE_EXTENSIONS), builds/win32/visualc/freetype.dsp, + builds/win32/visualc/freetype.vcproj: Add src/base/ftgasp.c to the + default build. + +2007-01-07 Werner Lemberg + + * src/cid/cidparse.c (cid_parser_new): Improve error message for + Type 11 fonts. + Scan for `/sfnts' token. + +2007-01-07 Werner Lemberg + + * src/cid/cidparse.c (cid_parser_new): Reject Type 11 fonts. + +2007-01-06 Werner Lemberg + + * src/cff/cffload.c (cff_index_init): Remove unused variable. + (cff_index_read_offset): s/perror/errorp/ to avoid global shadowing. + +2007-01-04 David Turner + + * src/pfr/pfrobjs.c (pfr_face_init): Detect non-scalable fonts + correctly. This fixes Savannah bug #17876. + + + Do not allocate interpreter-specific tables in memory if we are not + going to load glyphs with the bytecode interpreter anyway. + + * src/truetype/ttgload.c (tt_loader_init): Load execution context + only if glyph is hinted. + Updated. + * src/truetype/ttobjs.h (TT_SizeRec): Add members `bytecode_ready' + and `cvs_ready'. + Add `tt_size_ready_bytecode' declaration. + * src/truetype/ttobjs.c (tt_size_done_bytecode, + tt_size_init_bytecode, tt_size_ready_bytecode): New functions. + (tt_size_init): Move most code into `tt_size_init_bytecode'. + (tt_size_done): Move most code into `tt_size_done_bytecode'. + (tt_size_reset): Move some code to `tt_size_ready_bytecode'. + + + Don't extract the metrics table from the SFNT font file. Instead, + reparse it on each glyph load. The runtime difference is not + noticeable, and it can save a lot of heap memory when memory-mapped + files are not used. + + * include/freetype/internal/tttypes.h (TT_FaceRec): Add members + `horz_metrics_offset' and `vert_metrics_ofset'. + * src/sfnt/ttmtx.c (tt_face_load_hmtx, tt_face_get_metrics): + Updated. + + + * src/sfnt/ttcmap.c (tt_cmap4_validate): Slight optimization. + + + Do not load the CFF index offsets into memory, since this wastes a + *lot* of heap memory with large Asian CFF fonts. There is no + significant performance loss. + + * src/cff/cffload.h: Add `cff_charset_cid_to_gindex' declaration. + * src/cff/cfftypes.h (CFF_IndexRec): Add fields `start' and + `data_size'. + (CFF_CharsetRec): Add field `num_glyphs'. + + * src/cff/cffload.c (cff_index_read_offset, cff_index_load_offsets, + cff_charset_cid_to_gindex): New functions. + (cff_new_index): Renamed to... + (cff_index_init): This. Update all callers. + Updated -- some code has been moved to `cff_index_load_offsets'. + (cff_done_index): Renamed to... + (cff_index_done): This. Update all callers. + (cff_index_get_pointers, cff_index_access_element): Updated to use + stream offsets. + (cff_charset_compute_cids): Set `num_glyphs' field. + (cff_encoding_load): Updated. + + * src/cff/cffgload.c (cff_slot_load): Updated. + +2007-01-04 David Turner + + * docs/INSTALL.UNIX: Simplify some parts, add reference to + autogen.sh and pointer to README.CVS. + + * README.CVS: Add common problem description and solution + when running autogen.sh. + + * docs/INSTALL: Add reference to MacOS X. + + * docs/MAKEPP, docs/INSTALL.MAC: New documentation files. + + * docs/TODO: Remove obsolete items. + + * src/raster/ftraster.c: (TRaster_Instance): Replace it with... + (TWorker): This. + Remove `count_table' and `memory'. + Make `grays' a pointer. + (TRaster): New structure. + (count_table): New static array. + (RAS_ARGS, RAS_ARG, RAS_VARS, RAS_VAR, FT_UNUSED_RASTER, cur_ras, + Vertical_Gray_Sweep_Step, ft_black_new, ft_black_done, + ft_black_set_mode, ft_black_render): Updated. + (ft_black_init): Don't initialize `count_table'. + (ft_black_reset): Use the render pool. This saves about 6KB of + heap space for each FT_Library instance. + + * src/smooth/ftgrays.c (TRaster): Replaced with... + (TWorker): This. + Remove `memory'. + (TRaster): New structure. + + (RAS_ARG_, RAS_ARG, RAS_VAR_, RAS_VAR, ras, gray_render_line, + gray_move_to, gray_line_to, gray_conic_to, gray_cubic_to, + gray_render_span, gray_raster_render): Updated. + (gray_raster_reset): Use the render pool. This saves about 6KB of + heap space for each FT_Library instance. + + * src/sfnt/sfobjs.c, src/sfnt/ttkern.c, src/sfnt/ttkern.h, + src/sfnt/ttmtx.c, src/sfnt/ttsbit.c, src/sfnt/ttsbit.h, + src/truetype/ttpload.c, include/freetype/config/ftoption.h: Remove + FT_OPTIMIZE_MEMORY macro (and code for !FT_OPTIMIZE_MEMORY) since + the optimization is no longer experimental. + + * src/pshinter/pshalgo.c (psh_glyph_interpolate_normal_points): + Remove a typo that results in no hinting and a memory leak with some + large Asian CFF fonts. + + * src/base/ftobjs.c (FT_Done_Library): Remove a subtle memory leak + which happens when FT_Done_Library is called with still opened + CFF_Faces in it. We need to close all faces before destroying the + modules, or else some bad things (memory leaks) may happen. + +2007-01-02 Werner Lemberg + + * src/gxvalid/gxvkern.c (gxv_kern_subtable_fmt0_pairs_validate): + Remove compiler warning. + +2007-01-02 David Turner + + * src/sfnt/sfobjs.c: Add documentation comment. + +2006-12-31 Masatake YAMATO + + * src/gxvalid/gxvkern.c (gxv_kern_subtable_fmt0_pairs_validate): New + function. + Check uniqueness of the gid pairs. + (gxv_kern_subtable_fmt0_validate): Move some code to + `gxv_kern_subtable_fmt0_pairs_validate'. + +2006-12-22 David Turner + + * src/autofit/aflatin.c, src/truetype/ttgload.c: Remove compiler + warnings. + + * builds/win32/visualc/freetype.vcproj: Add _CRT_SECURE_NO_DEPRECATE + to avoid deprecation warnings with Visual C++ 8. + +2006-12-16 Anders Kaseorg + + * src/base/ftlcdfil.c (FT_Library_SetLcdFilter) + [FT_FORCE_LIGHT_LCD_FILTER]: Fix typo. + +2006-12-15 suzuki toshiya + + * include/freetype/internal/services/svotval.h: Add `volatile' to + sync with the modification by Jens Claudius on 2006-08-22; cf. + http://cvs.savannah.gnu.org/viewcvs/freetype/freetype2/src/otvalid/otvmod.c?r1=1.4&r2=1.5 + +2006-12-15 suzuki toshiya + + * src/base/ftmac.c: Specialized for Mac OS X only. + * builds/unix/ftconfig.in: Fixed for ppc64 missing Carbon framework. + * builds/unix/configure.raw: Ditto. When explicit switches for + FSSpec/FSRef/QuickDraw/ATS availability are given to configure, + builds/mac/ftmac.c is used instead of default src/base/ftmac.c. + +2006-12-15 suzuki toshiya + + * builds/mac/ftmac.c: Copied src/base/ftmac.c for legacy system. + * builds/mac/FreeType.m68k_cfm.make.txt: Fix to use builds/mac/ftmac.c + instead of src/base/ftmac.c + * builds/mac/FreeType.ppc_carbon.make.txt: Ditto. + * builds/mac/FreeType.ppc_classic.make.txt: Ditto. + * builds/mac/FreeType.m68k_far.make.txt: Ditto, and exclude gxvalid.c + that cannot be built at present. + +2006-12-15 suzuki toshiya + + * src/base/ftobjs.c: Improvement of resource fork handler for + POSIX, cf. + http://lists.gnu.org/archive/html/freetype-devel/2006-10/msg00025.html + (Mac_Read_sfnt_Resource): Count only `sfnt' resource of suitcase font + format or .dfont, to simulate the face index number counted by ftmac.c. + (IsMacResource): Return the number of scalable faces correctly. + +2006-12-10 Werner Lemberg + + * builds/toplevel.mk (version): Protect against `distclean' target. + +2006-12-09 Werner Lemberg + + * builds/*/*def.mk, builds/*/detect.mk (CAT): Define to either `cat' + or `type'. + + * builds/freetype.mk (version): Extracted from freetype.h, using + GNU make's built-in string functions. + (refdoc): Use $(version) instead of static version number. + +2006-12-08 Werner Lemberg + + * builds/toplevel.mk (dist): Extract version number from freetype.h. + +2006-12-08 Vladimir Volovich + + * src/tools/apinames.c (State): Remove final comma in structure -- + xlc v5 under AIX 4.3 doesn't like this. + +2006-12-07 David Turner + + * src/autofit/afloader.c (af_loader_load_g): Small adjustment + to the spacing of auto-fitted glyphs. This only impacts rare + cases (e.g., Arial Bold at rather small character sizes). + +2006-12-03 Werner Lemberg + + * src/sfnt/rules.mk (SFNT_DRV_SRC): Add ttsbit0.c. + +2006-12-01 Werner Lemberg + + * src/sfnt/sfobjs.c (tt_face_get_name): All Unicode strings are + encoded in UTF-16BE. Patch from Rajeev Pahuja . + (tt_name_entry_ascii_from_ucs4): Removed. + + + * include/freetype/ftxf86.h: Fix and extend comment so that it + appears in the documentation. + + * include/freetype/ftchapters.h: Add `font_format' section. + + + * src/tools/docmaker/tohtml.py (HtmlFormatter::index_exit): Add link + to TOC in index page. + +2006-11-28 David Turner + + * src/smooth/ftgrays.c (gray_raster_render): Return 0 when we are + trying to render into a zero-width/height bitmap, not an error code. + + * src/truetype/ttobjs.c (tt_face_init): Fix typo in previous patch. + + * src/smooth/ftgrays.c: Remove hard-coded error values; use FreeType + ones instead. + + * src/autofit/afhints.c (af_glyph_hints_dump_segments): Remove unused + variable. + +2006-11-26 Pierre Hanser + + * src/truetype/ttobjs.c (tt_face_init): Protect against NULL pointer. + +2006-11-25 David Turner + + * src/autofit/afhints.c (af_glyph_hints_dump_points, + af_glyph_hints_dump_segments, af_glyph_hints_dumpedges) [!AF_DEBUG]: + Add stubs to link the `ftgrid' test program when debugging is + disabled in the auto-hinter. + +2006-11-23 David Turner + + * src/autofit/afhints.c, src/autofit/afhints.h, src/autofit/aflatin.c, + src/autofit/aftypes.h: Miscellaneous auto-hinter improvements. + + * src/autofit/afhints.c (af_glyph_hints_dump_segments) [AF_DEBUG]: + Emit more sensible information. + + * src/autofit/afhints.h (AF_SegmentRec): Add `height' member. + + * src/autofit/aflatin.c (af_latin_metrics_scale_dim): Improve + rounding of blue values. + (af_latin_hints_compute_segments): Hint segment heights. + (af_latin_hints_link_segments): Reduce `len_score' value. + (af_latin_hints_compute_edges): Increase `segment_length_threshold' + value and use `height' member for comparisons. + (af_latin_hint_edges): Extend logging message. + Improve handling of remaining edges. + +2006-11-22 Werner Lemberg + + Fix Savannah bug #15553. + + * src/truetype/ttgload.c (tt_loader_init): Re-execute the CVT + program after a change from mono to grayscaling (and vice versa). + Use correct constant for comparison to get `exec->grayscale'. + +2006-11-18 Werner Lemberg + + Because FT_Load_Glyph expects CID values for CID-keyed fonts, the + test for a valid glyph index must be deferred to the font drivers. + This patch fixes Savannah bug #18301. + + * src/base/ftobjs.c (FT_Load_Glyph): Don't check `glyph_index'. + * src/bdf/bdfdrivr.c (BDF_Glyph_Load), src/cff/cffgload.c + (cff_slot_load), src/cid/cidgload.c (cid_slot_load_glyph), + src/pcf/pcfdrivr.c (PCF_Glyph_Load), src/pfr/pfrobjs.c + (pfr_slot_load), src/truetype/ttdriver.c (Load_Glyph), + src/type1/t1gload.c (T1_Load_Glyph), src/winfonts/winfnt.c + (FNT_Load_Glyph): Check validity of `glyph_index'. + +2006-11-13 David Turner + + * src/truetype/ttinterp.c (FIX_BYTECODE): Undefine. The interpreter + `enhancements' are still too buggy for general use. + + * src/base/ftlcdfil.c: Add support for FT_FORCE_LIGHT_LCD_FILTER and + FT_FORCE_LEGACY_LCD_FILTER at compile time. Define these macros + when building the library to change the default LCD filter to be + used. This is only useful for experimentation. + + * include/freetype/ftlcdfil.h: Update documentation. + +2006-11-10 David Turner + + * src/smooth/ftsmooth.c: API change for the LCD + filter. The FT_LcdFilter value is an enumeration describing which + filter to apply, with new values FT_LCD_FILTER_LIGHT and + FT_LCD_FILTER_LEGACY (the latter implements the LibXft original + algorithm which produces strong color fringes for everything + except very-well hinted text). + + * include/freetype/ftlcdfil.h (FT_Library_SetLcdFilter): Change + second parameter to an enum type. + + * src/base/ftlcdfil.c (USE_LEGACY): Define. + (_ft_lcd_filter): Rename to... + (_ft_lcd_filter_fir): This. + Update parameters. + (_ft_lcd_filter_legacy) [USE_LEGACY]: New filter function. + (FT_Library_Set_LcdFilter): Update parameters. + Handle new filter modes. + + * include/internal/ftobjs.h: Include FT_LCD_FILTER_H. + (FT_Bitmap_LcdFilterFunc): Change third argument to `FT_Library'. + (FT_LibraryRec) [FT_CONFIG_OPTION_SUBPIXEL_RENDERING]: Add filtering + callback and update other fields. + + * src/smooth/ftsmooth.c (ft_smooth_render_generic) + [FT_CONFIG_OPTION_SUBPIXEL_RENDERING]: Update. + Other minor improvements. + + * src/autofit/aflatin.c: Various tiny improvements that drastically + improve the handling of serif fonts and of LCD/LCD_V hinting modes. + (af_latin_hints_compute_edges): Fix typo. + (af_latin_compute_stem_width): Take better care of diagonal stems. + +2006-11-09 David Turner + + * src/pshinter/pshalgo.c (psh_glyph_compute_inflections): Fix + typo which created a variable-used-before-initialized bug. + +2006-11-07 Zhe Su + + * src/base/ftsynth.c (FT_GlyphSlot_Embolden): Handle vertical layout + also. + +2006-11-03 Werner Lemberg + + * src/base/ftcalc.c: Don't use `long long' but `FT_Int64'. + +2006-11-02 David Turner + + Add a few tweaks to better handle serif fonts. + Add more debugging messages. + + * src/autofit/aflatin.c (af_latin_hints_compute_edges): Ignore + segments that are less than 1.5 pixels high. This gets rid of + *many* corner cases with serifs. + (af_latin_align_linked_edge): Add logging message. + (af_latin_hint_edges): Use AF_HINTS_DO_BLUES. + Add logging messages. + Handle AF_EDGE_FLAG flag specially. + + * src/autofit/afmodule.c [AF_DEBUG]: Add _af_debug, + _af_debug_disable_blue_hints, and _af_debug_hints variables. + + * src/autofit/aftypes.h (AF_LOG) [AF_DEBUG]: Use _af_debug. + Update external declarations. + (af_corner_orientation, af_corner_is_flat): Replaced by... + + * include/freetype/internal/ftcalc.h (ft_corner_orientation, + ft_corner_is_flat): These declarations. + + * src/autofit/afangles.c (af_corner_orientation, af_corner_is_flat): + Comment out. Replaced by... + + * src/base/ftcalc.h (ft_corner_orientation, ft_corner_is_flat): + These functions. Update all callers. + (FT_Add64) [!FT_LONG64]: Simplify. + + * src/autofit/afhints.c: Include FT_INTERNAL_CALC_H. + (af_direction_compute): Add a missing FT_ABS call. This bug caused + production of garbage by missing lots of segments. + + * src/autofit/afhints.h (AF_HINTS_DO_BLUES): New macro. + + * src/autofit/afloader.c (af_loader_init, af_loader_done) + [AF_DEBUG]: Set _af_debug_hints. + + + * src/pshinter/pshalgo.c: Include FT_INTERNAL_CALC_H. + (psh_corner_is_flat, psh_corner_orientation): Use ft_corner_is_flat + and ft_corner_orientation. + + + * src/gzip/inftrees.c (huft_build): Remove compiler warning. + +2006-10-24 Werner Lemberg + + * src/cff/cffload.c (cff_encoding_load): Remove unused variable. + + * src/base/ftobjs.c (FT_Select_Charmap): Disallow FT_ENCODING_NONE + as argument. + +2006-10-23 Zhe Su + + * src/base/ftoutln.c (FT_Outline_Get_Orientation): Re-implement to + better deal with broken Asian fonts with strange glyphs, having + self-intersections and other peculiarities. The used algorithm is + based on the nonzero winding rule. + +2006-10-23 David Turner + + Speed up the CFF font loader. With some large CFF fonts, + FT_Open_Face is now more than three times faster. + + * src/cff/cffload.c (cff_get_offset): Removed. + (cff_new_index): Inline functionality of `cff_get_offset'. + (cff_charset_compute_cids, cff_charset_free_cids): New functions. + (cff_charset_done): Call `cff_charset_free_cids'. + (cff_charset_load): Call `cff_charset_compute_cids'. + (cff_encoding_load) : Ditto, to replace inefficient loop. + + * src/sfnt/ttmtx.c (tt_face_load_hmtx): Replace calls to FT_GET_XXX + with FT_NEXT_XXX. + + + Speed up the Postscript hinter, with more than 100% speed increase + on my machine. + + * src/pshinter/pshalgo.c (psh_corner_is_flat, + psh_corner_orientation): New functions. + (psh_glyph_compute_inflections): Merge loops for efficiency. + Use `psh_corner_orientation'. + (psh_glyph_init): Use `psh_corner_is_flat'. + (psh_hint_table_find_strong_point): Renamed to... + (psh_hint_table_find_strong_points): This. + Rewrite, adding argument to handle all points at once. + Update all callers. + (PSH_MAX_STRONG_INTERNAL): New macro. + (psh_glyph_interpolate_normal_points): Rewrite for efficiency. + +2006-10-15 suzuki toshiya + + * src/base/ftmac.c (FT_New_Face_From_FOND): Initialize variable + `error' with FT_Err_Ok. + +2006-10-14 suzuki toshiya + + * docs/INSTALL.CROSS: New document file for cross-building. + + * builds/unix/configure.raw: Preliminary cross-building support. + Find native C compiler and pass it by CC_BUILD, and + find suffix for native executable and pass it by EXEEXT_BUILD. + Also suffix for target executable is passed by EXEEXT. + + * builds/unix/unix-cc.in (CCraw_build, E_BUILD): New variables to + build `apinames' which runs on building system. They are set by + CC_BUILD and EXEEXT_BUILD. + + * builds/exports.mk (APINAMES_EXE): Change the extension for + apinames from the suffix for target (E) to that for building host + (E_BUILD). + +2006-10-12 Werner Lemberg + + * docs/INSTALL.UNX, docs/UPGRADE.UNX: Renamed to... + * docs/INSTALL.UNIX, docs/UPGRADE.UNIX: This. Update all documents + which reference those files. + +2006-10-12 suzuki toshiya + + * builds/unix/configure.raw (FT2_EXTRA_LIBS): New variable. It is + embedded in freetype2.pc and freetype-config. Use it to record + Carbon dependency of MacOSX. + + * builds/unix/freetype2.in: Embed FT2_EXTRA_LIBS. + + * builds/unix/freetype-config.in: Ditto. + +2006-10-11 Werner Lemberg + + * devel/ftoption.h (FT_CONFIG_OPTION_SUBPIXEL_RENDERING): Define for + development. + +2006-10-03 Jens Claudius + + * include/freetype/config/ftstdlib.h: Cast away volatileness from + argument to ft_setjmp. + + * include/freetype/internal/ftvalid.h: Add comment that + ft_validator_run must not be used. + +2006-10-01 Werner Lemberg + + * src/base/ftbase.c: Undo change from 2006-09-30. + + * src/base/rules.mk (BASE_SRC): Remove `ftlcdfil.c'. + +2006-09-30 David Turner + + * include/freetype/internal/ftobjs.h (FT_Face_InternalRec): + s/unpatented_hinting/ignore_unpatented_hinter/. + Update all callers. + + * src/base/ftobjs.c (FT_Load_Glyph): Refine the algorithm whether + auto-hinting shall be used or not. + + * src/truetype/ttobjs.c (tt_face_init): Ditto. + +2006-09-30 Werner Lemberg + + * src/base/rules.mk (BASE_SRC): Remove `ftapi.c' (which is no longer + in use). + + * src/base/ftbase.c: Include `ftlcdfil.c'. + +2006-09-29 Werner Lemberg + + * src/sfnt/ttcmap.c (tt_cmap4_char_map_binary): Fix algorithm for + overlapping segments. Bug reported by Stefan Koch. + +2006-09-28 David Turner + + Fix a bug in the automatic unpatented hinting support which prevents + normal bytecode hinting to work properly. + + * include/freetype/internal/ftobjs.h (FT_Face_InternalRec): + s/force_autohint/unpatented_hinting/. Update all callers. + + * src/base/ftobjs.c (FT_Load_Glyph): Updated code. + + * src/autofit/aftypes.h (AF_DEBUG): Undefine to get rid of traces. + +2006-09-27 David Turner + + * include/freetype/freetype.h (FT_FREETYPE_PATCH): Set to 2. + + + Add a new API to support color filtering of subpixel glyph bitmaps. + In a default build, the function `FT_Library_SetLcdFilter' returns + `FT_Err_Unimplemented_Feature'; you need to #define + FT_CONFIG_OPTION_SUBPIXEL_RENDERING in ftoption.h to compile the + real implementation. + + * include/freetype/ftlcdfil.h, src/base/ftlcdfil.c: New files. + + * include/freetype/internal/ftobjs.h (FT_Bitmap_LcdFilterFunc): New + typedef. + (FT_LibraryRec) [FT_CONFIG_OPTION_SUBPIXEL_RENDERING]: New members + `lcd_filter_weights' and `lcd_filter'. + + * src/smooth/ftsmooth.c (ft_smooth_render_generic): Remove arguments + `hmul' and `vmul'. + + Handle subpixel rendering. + Simplify function. + (ft_smooth_render_lcd): Use `FT_RENDER_MODE_LCD'. + (ft_smooth_render_lcd_v): Use `FT_RENDER_MODE_LCD_V'. + + * include/freetype/config/ftheader.h (FT_LCD_FILTER_H): New macro, + pointing to . + + * src/base/Jamfile (_sources), src/base/rules.mk (BASE_SRC), + vms_make.com: Add `ftlcdfil.c' to the list of compiled source files. + + * modules.cfg (BASE_EXTENSIONS): Add ftlcdfil.c. + +2006-09-26 David Bustin + + * src/pfr/pfrobjs.c (pfr_face_get_kerning): Skip adjustment bytes + correctly. Reported as Savannah bug #17843. + +2006-09-26 David Turner + + * src/autofit/afhints.h (AF_HINTS_DO_HORIZONTAL, + AF_HINTS_DO_VERTICAL, AF_HINTS_DO_ADVANCE): New macros to disable + horizontal and vertical hinting for the purpose of debugging the + auto-fitter. + + * src/autofit/afmodule.c (_af_debug_disable_horz_hints, + _af_debug_disable_vert_hints) [AF_DEBUG]: New global variables. + + * src/autofit/aftypes.h [AF_DEBUG]: Declare above variables. + + * include/freetype/config/ftoption.h, devel/ftoption.h + (FT_CONFIG_OPTION_SUBPIXEL_RENDERING): New macro to control whether + we want to compile LCD-optimized rendering code (à la ClearType) or + not. The macro *must* be disabled in default builds of the library + for patent reasons. + + * src/smooth/ftsmooth.c (ft_smooth_render_generic): Disable + LCD-specific rendering when FT_CONFIG_OPTION_SUBPIXEL_RENDERING + isn't defined at compile time. This only changes the content of the + rendered glyph to match the one of normal gray-level rendering, + hence clients should not need to be modified. + + * docs/CHANGES: Updated. + +2006-09-18 Garrick Meeker + + * src/base/ftmac.c (FT_New_Face_From_FOND): Fall back to SFNT if + LWFN fails and both are available. + +2006-09-11 David Turner + + * src/sfnt/sfobjs.c (tt_face_get_name): Support some fonts which + report their English names through an Apple Roman + (platform,encoding) pair, with language_id != English. + + If the font uses another name entry with language_id == English, it + will be selected correctly, though. + + * src/truetype/ttobjs.c (tt_face_init): Add unpatented hinting + selection for `mingli.ttf'. + +2006-09-05 Werner Lemberg + + * src/truetype/ttpload.c (tt_face_load_hdmx): Handle `record_size' + values which have the upper two bytes set to 0xFF instead of 0x00 + (as it happens in at least two CJKV fonts, `HAN NOM A.ttf' and + `HAN NOM B.ttf'). + + * src/smooth/ftgrays.c [GRAYS_USE_GAMMA]: Really remove all code. + +2006-09-05 David Turner + + Minor source cleanups and optimizations. + + * src/smooth/ftgrays.c (GRAYS_COMPACT): Removed. + (TRaster): Remove `count_ex' and `count_ey'. + (gray_find_cell): Remove 2nd and 3rd argument. + (gray_alloc_cell): Merged with `gray_find_cell'. + (gray_record_cell): Simplify. + (gray_set_cell): Rewrite. + (gray_start_cell): Apply offsets to `ras.ex' and `ras.ey'. + (gray_render_span): Don't use FT_MEM_SET for small values. + (gray_dump_cells) [DEBUG_GRAYS]: New function. + (gray_sweep): Avoid buffer overwrites when to drawing the end of a + bitmap scanline. + (gray_convert_glyph): Fix speed-up. + +2006-09-04 David Turner + + * src/smooth/ftgrays.c (gray_convert_glyphs): Make it work with + 64bit processors. + +2006-09-03 Werner Lemberg + + * devel/ftoption.h: Synchronize with + include/freetype/config/ftoption.h. + + * src/smooth/ftgrays.c (gray_record_cell): Remove shadowing + variable declaration. + (gray_convert_glyph): Fix compiler warnings. + +2006-09-01 David Turner + + * src/truetype/ttobjs.c (tt_face_init): Update the TrueType loader + to recognize a few fonts that require the automatic unpatented + loader. + + * src/smooth/ftgrays.c: Optmize the performance of the anti-aliased + rasterizer. The speed improvement is between 15% and 25%, depending + on the font data. + + (GRAYS_USE_GAMMA, GRAYS_COMPACT): Removed, and all associated code. + (TCell): Redefine. + (TRaster): New members `buffer', `buffer_size', `ycells', `ycount'. + (gray_init_cells): Updated. + (gray_find_cell, gray_alloc_cell): New functions. + (gray_record_cell): Rewritten to use `gray_find_cell' and + `gray_alloc_cell'. + (PACK, LESS_THAN, SWAP_CELLS, DEBUG_SORT, QUICK_SORT, SHELL_SORT, + QSORT_THRESHOLD): + Removed. + (gray_shell_sort, gray_quick_sort, gray_check_sort, + gray_dump_cells): Removed. + (gray_sweep): Rewritten. + (gray_convert_glyph): Rewrite code which used one of the sorting + functions. + (gray_raster_render): Updated. + +2006-08-29 Dr. Werner Fink + + * configure: Make it possible to handle configure options which + have strings containing spaces. + +2006-08-27 David Turner + + * include/freetype/config/ftoption.h (TT_USE_BYTECODE_INTERPRETER): + New macro, defined if either TT_CONFIG_OPTION_BYTECODE_INTERPRETER + or TT_CONFIG_OPTION_UNPATENTED_HINTING is defined. + + * include/freetype/internal/ftcalc.h, src/base/ftcalc.c, + src/truetype/truetype.c, src/truetype/ttdriver.c, + src/truetype/ttgload.c, src/truetype/ttgload.h, + src/truetype/ttinterp.c, src/truetype/ttobjs.c, + src/truetype/ttobjs.h, src/truetype/ttpload.c, src/type42/t42drivr.c: + s/TT_CONFIG_OPTION_BYTECODE_INTERPRETER/TT_USE_BYTECODE_INTERPRETER/. + + * include/freetype/internal/ftobjs.h (FT_Face_InternalRec): New + member `force_autohint'. + + * src/base/ftobjs.c (FT_Load_Glyph): Use `force_autohint'. + + * src/truetype/ttobjs.c (tt_face_init): Prepare code for testing + against a list of font names which need the bytecode interpreter. + +2006-08-27 Jens Claudius + + Fix miscellaneous compiler warnings. + + * include/freetype/internal/ftobjs.h: Close comment with `*/' to + avoid `/* in comment' compiler warning. + + * src/base/ftdbgmem.c (ft_mem_table_get_source): Turn cast + `(FT_UInt32)(void*)' into `(FT_UInt32)(FT_PtrDist)(void*)' since on + 64-bit platforms void* is larger than FT_UInt32. + + * src/base/ftobjs.c (t_validator_error): Cast away + volatileness of argument to ft_longjmp. Spotted by Werner + `Putzfrau' Lemberg. + + * src/bdf/bdflib.c (bdf_load_font): Initialize local + variable `lineno'. + + * src/gxvalid/gxvmod.c (classic_kern_validate): Mark local variable + `error' as volatile. + +2006-08-27 Werner Lemberg + + * builds/unix/ftconfig.in: Synchronize with main ftconfig.h. + Reported by Jens. + +2006-08-22 Jens Claudius + + Fix for previous commit, which caused many compiler warnings/errors + about addresses of volatile objects passed as function arguments as + non-volatile pointers. + + * include/freetype/internal/ftvalid.h: Make FT_Validator typedef a + pointer to a volatile object. + + * src/gxvalid/gxvmod.c (gxv_load_table): Make function argument + `table' a pointer to a volatile object. + + * src/otvalid/otvmod.c (otv_load_table): Make function argument + `table' a pointer to a volatile object. + +2006-08-18 Jens Claudius + + * src/gxvalid/gxvmod.c (GXV_TABLE_DECL): Mark local variable `_sfnt' + as volatile since it must keep its value across a call to ft_setjmp. + (gxv_validate): Same for local variables `memory' and `valid'. + (classic_kern_validate): Same for local variables `memory', + `ckern', and `valid'. + + * src/otvalid/otvmod.c (otv_validate): Same for function parameter + `face' and local variables `base', `gdef', `gpos', `gsub', `jstf', + and 'valid'. + + * src/sfnt/ttcmap.c (tt_face_build_cmaps): Same for local variable + `cmap'. + +2006-08-16 David Turner + + * src/cid/cidgload.c (cid_slot_load_glyph): Remove compiler + warnings. + + * src/base/ftobjs.c (ft_validator_run): Disable function; it is + buggy by design. Always return -1. + + + Improvements to native TrueType hinting. This is a first try, + controlled by the FIX_BYTECODE macro in src/truetype/ttinterp.c. + + * include/freetype/internal/ftgloadr.h (FT_GlyphLoadRec): Add member + `extra_points2'. + + * include/freetype/internal/tttypes.h (TT_GlyphZoneRec): Add member + `orus'. + + * src/base/ftgloadr.c (FT_GlyphLoader_Reset, + FT_GlyphLoader_Adjust_Points, FT_GlyphLoader_CreateExtra, + FT_GlyphLoader_CheckPoints, FT_GlyphLoader_CopyPoints): Updated to + handle `extra_points2'. + + * src/truetype/ttgload.c (tt_prepare_zone): Handle `orus'. + Remove compiler warning. + (cur_to_arg): Remove macro. + (TT_Hint_Glyph): Updated. + (TT_Process_Simple_Glyph): Handle `orus'. + + * src/truetype/ttinterp.c (FIX_BYTECODE): New macro. + (Ins_MD, Ins_MDRP, Ins_IP) [FIX_BYTECODE]: Handle `orus'. + (LOC_Ins_IUP): Renamed to... + (IUP_WorkerRec): This. + Add `orus' member. + (Shift): Renamed to... + (_iup_worker_shift): This. + Updated. + (Interp): Renamed to... + (_iup_worker_interpolate): This. + Updated to handle `orus'. + (Ins_IUP): Updated. + + * src/truetype/ttobjs.c (tt_glyphzone_done, tt_glyphzone_new): + Handle `orus'. + +2006-08-15 suzuki toshiya + + * modules.cfg (BASE_EXTENSIONS): Compile in ftgxval.c by default to + build ftvalid in ft2demos. This has been inadvertedly changed + 2006-08-13. + +2006-08-15 suzuki toshiya + + `ft_validator_run' wrapping `setjmp' can cause a crash, as found by + Jens: + http://lists.gnu.org/archive/html/freetype-devel/2006-08/msg00004.htm. + + * src/otvalid/otvmod.c: Replace `ft_validator_run' by `ft_setjmp'. + It reverts the change introduced on 2005-08-20. + + * src/gxvalid/gxvmod.c: Ditto. + +2006-08-13 Jens Claudius + + * finclude/freetype/internal/psaux.h: (T1_TokenType): Add + T1_TOKEN_TYPE_KEY. + (T1_FieldRec): Add `dict'. + (T1_FIELD_DICT_FONTDICT, T1_FIELD_DICT_PRIVATE): New macros. + (T1_NEW_XXX, T1_FIELD_XXX): Update to take the dictionary where a PS + keyword is expected as an additional argument. + + * src/cid/cidload.c: (cid_field_records): Adjust invocations of + T1_FIELD_XXX. + + * src/cid/cidtoken.h: Adjust invocations of T1_FIELD_XXX. + + * src/psaux/psobjs.c: Add macro FT_COMPONENT for tracing. + (ps_parser_to_token): Report a PostScript key as T1_TOKEN_TYPE_KEY, + not T1_TOKEN_TYPE_ANY. + (ps_parser_load_field): Make sure a token that should be a string or + name is really a string or name. + Avoid memory leak if a keyword has been already encountered and its + value is overwritten. + * src/type1/t1load.c: (t1_keywords): Adjust invocations of + T1_FIELD_XXX. + (parse_dict): Ignore keywords that occur in the wrong dictionary + (e.g., in `Private' instead of `FontDict'). + + * src/type1/t1tokens.h: Adjust invocations of T1_FIELD_XXX. + + * src/type42/t42parse.c: (t42_keywords): Adjust invocations of + T1_FIELD_XXX. + +2006-07-18 Jens Claudius + + Move creation of field `buildchar' of T1_DecoderRec out of + `t1_decoder_init' and let the caller of `t1_decoder_init' take care + of it. + + Call the finisher for T1_Decoder in `cid_face_compute_max_advance' + and `T1_Compute_Max_Advance'. + + * include/freetype/internal/psaux.h (T1_DecoderRec): Remove field + `face', add `len_buildchar'. + + * include/freetype/internal/t1types.h (T1_FaceRec): Add field + `buildchar'. + + * src/cid/cidgload.c (cid_face_compute_max_advance): Call finisher + for T1_Decoder. + (cid_slot_load_glyph): Do not ignore failure when initializing the + T1_Decoder. + + * src/psaux/t1decode.c (t1_decoder_parse_charstrings): Updated. + (t1_decoder_init): Remove initialization of fields `buildchar' and + `len_buildchar'. + (t1_decoder_done): Remove deallocation of field `buildchar'. + + * freetype/src/type1/t1gload.c (T1_Compute_Max_Advance): Initialize + T1_Decoder's `buildchar' and `len_buildchar'; call finisher for + T1_Decoder. + (T1_Load_Glyph): Initialize T1_Decoder's `buildchar' and + `len_buildchar'; make sure to call finisher for T1_Decoder even in + case of error. + + * src/type1/t1load.c (T1_Open_Face): Allocate new field `buildchar' + of T1_FaceRec. + + * src/type1/t1objs.c (T1_Face_Done): Free new field `buildchar' of + T1_FaceRec. + +2006-07-14 Jens Claudius + + * include/freetype/internal/psaux.h: New macros IS_PS_NEWLINE, + IS_PS_SPACE, IS_PS_SPECIAL, IS_PS_DELIM, IS_PS_DIGIT, IS_PS_XDIGIT, + and IS_PS_BASE85 (from src/psaux/psconv.h). + (T1_FieldLocation): Add T1_FIELD_LOCATION_LOADER, + T1_FIELD_LOCATION_FACE, and T1_FIELD_LOCATION_BLEND. + (T1_DecoderRec): New fields `buildchar' and `face'. + (IS_PS_TOKEN): New macro. + + * include/freetype/internal/t1types.h (T1_FaceRec): New fields + `ndv_idx', `cdv_idx', and `len_buildchar'. + + * include/freetype/t1tables.h (PS_BlendRec): New fields + `default_design_vector' and `num_default_design_vector'. + + * src/psaux/psconv.h: Move macros IS_PS_NEWLINE, IS_PS_SPACE, + IS_PS_SPECIAL, IS_PS_DELIM, IS_PS_DIGIT, IS_PS_XDIGIT, and + IS_PS_BASE85 to include/freetype/internal/psaux.h. + + * src/psaux/psobjs.c (ps_parser_to_token_array): Allow `token' + argument to be NULL if we want only to count the number of tokens. + (ps_tocoordarray): Allow `coords' argument to be NULL if we just + want to skip the array. + (ps_tofixedarray): Allow `values' argument to be NULL if we just + want to skip the array. + + * src/psaux/t1decode.c (t1_decoder_parse_charstrings): Add support + for (partially commented out) othersubrs 19-25, 27, and 28. + (t1_decoder_init): Initialize new fields `face' and `buildchar'. + (t1_decoder_done): Release new field `buildchar'. + + * src/type1/t1load.c (parse_buildchar, parse_private): New + functions. + (t1_keywords): Register them. + (t1_allocate_blend): Updated. + (t1_load_keyword): Handle field types T1_FIELD_LOCATION_LOADER, + T1_FIELD_LOCATION_FACE and T1_FIELD_LOCATION_BLEND. + (parse_dict): Remove `keyword_flags' argument. + Use new macro IS_PS_TOKEN. + Changed function so that later PostScript definitions override + earlier ones. + (t1_init_loader): Initialize new field `keywords_encountered'. + (T1_Open_Face): Initialize new fields `ndv_idx', `cdv_idx', and + `len_buildchar'. + Remove `keywords_flags'. + + * src/type1/t1load.h (T1_LoaderRect): New field + `keywords_encountered'. + (T1_PRIVATE, T1_FONTDIR_AFTER_PRIVATE): New macros. + + * src/type1/t1tokens.h [!T1_CONFIG_OPTION_NO_MM_SUPPORT]: New + entries for parsing /NDV, /CDV, and /DesignVector. + +2006-07-07 Werner Lemberg + + Add many checks to protect against malformed PCF files. + + * src/pcf/pcfdrivr.c (PCF_Face_Done): Protect against NULL pointers. + (PCF_Face_Init): Add calls to PCF_Face_Done in case of errors. + + * src/pcf/pcfread.c (pcf_read_TOC): Protect against malformed table + data and check that tables don't overlap (using a simple + bubblesort). + (PCF_METRIC_SIZE, PCF_COMPRESSED_METRIC_SIZE, PCF_PROPERTY_SIZE): + New macros which give the size of data structures in the data + stream. + (pcf_get_properties): Use rough estimates to get array size limits. + Assign `face->nprops' and `face->properties' earlier so that a call + to PCF_Face_Done can do the clean-up in case of error. + Protect against invalid string offsets. + (pcf_get_metrics): Clean up code. + Adjust tracing message levels. + Use rough estimate to get array size limit. + (pcf_get_bitmaps): Clean up code. + Adjust tracing message levels. + Use rough estimates to get offset limits. + (pcf_get_encodings): Adjust tracing message level. + (pcf_get_accel): Clean up code. + +2006-06-26 Werner Lemberg + + * src/bdf/bdfdrivr.c (BDF_Face_Init): Handle fonts correctly which + don't have a POINT_SIZE property. This fixes Savannah bug #16914. + +2006-06-26 Jens Claudius + + * src/psaux/t1decode.c (T1_Operator, t1_args_count): Add opcode 15. + (t1_decoder_parse_charstrings): Operator with + opcode 15 pops its two arguments. + Handle the case where the pops of an othersubr may be part of a + subroutine. + Handle unknown othersubrs gracefully: count their operands and let + the following pop operators push the operands as the results onto + the Type1 stack. + Improve handling of setcurrentpoint opcode. + +2006-06-25 Jens Claudius + + The Type 1 parser now skips over top-level procedures as required + for a `Simplified Parser'. This makes the parser more robust as it + doesn't poke around in PostScript code. Additionally, it makes the + FontDirectory hackery in src/type1/t1load.c unnecessary. + + * src/psaux/psobjs.c (IS_OCTAL_DIGIT): New macro. + (skip_literal_string): Add FT_Error as return value. + Handle escapes better. + (skip_string): Add FT_Error as return value. + Don't set `parser->error' but return error code directly. + (skip_procedure): New function. + (ps_parser_skip_PS_token): Handle procedures. + Update code. + (ps_parser_to_token): Update code. + (ps_parser_load_field_table): Handle bbox entries also. + + * src/type1/t1load.c (parse_dict): Remove FontDirectory hackery. + Add commented-out code for synthetic fonts. + +2006-06-24 Eugeniy Meshcheryakov + + Fix two hinting bugs as reported in + http://lists.gnu.org/archive/html/freetype-devel/2006-06/msg00057.html. + + * include/freetype/internal/tttypes.h (TT_GlyphZoneRec): Add + `first_point' member. + + * src/truetype/ttgload.c (tt_prepare_zone): Initialize + `first_point'. + (TT_Process_Composite_Glyph): Always untouch points. + + * src/truetype/ttinterp.c (Ins_SHC): Fix computation of + `first_point' and `last_point' in case of composite glyphs. + (Ins_IUP): Fix computation of `end_point'. + +2006-06-22 suzuki toshiya + + Insert EndianS16_BtoN and EndianS32_BtoN as workaround for Intel + Mac. The original patch was written by David Sachitano and Lawrence + Coopet, and modified by Sean McBride for MPW compatibility. Only + required data are converted; unused data are left in big endian. + + * src/base/ftmac.c: Include for byteorder macros for non + Mac OS X platforms. + (OS_INLINE): Undefine before definition. + (count_faces_sfnt): Insert EndianS16_BtoN to parse the header of + FontAssociation table in FOND resource. + (count_faces_scalable): Insert EndianS16_BtoN to parse the header + and fontSize at each entry of FontAssociation table in FOND + resource. + (parse_fond): Insert EndianS16_BtoN and EndianS32_BtoN to parse + ffStylOff of FamilyRecord header of FOND resource, the header, + fontSize, fontID at each entry of FontAssociation table, and + StyleMapping table. + (count_faces): Call `HUnlock' after all FOND utilization. + +2006-06-08 suzuki toshiya + + Public API of TrueTypeGX, OpenType, and classic kern table validator + should return `FT_Err_Unimplemented_Feature' if validation service + is unavailable (disabled in `modules.cfg'). It is originally + suggested by David Turner, cf. + http://lists.gnu.org/archive/html/freetype-devel/2005-11/msg00078.html + + * src/base/ftgxval.c (FT_TrueTypeGX_Validate): Return + FT_Err_Unimplemented_Feature if TrueTypeGX validation service is + unavailable. + (FT_ClassicKern_Validate): Return FT_Err_Unimplemented_Feature if + classic kern table validation service is unavailable. + + * src/base/ftotval.c (FT_OpenType_Validate): Return + FT_Err_Unimplemented_Feature if OpenType validation service is + unavailable. + +2006-06-08 Werner Lemberg + + * src/bdf/bdflib.c (bdf_load_font): Fix memory leaks in case of + errors. + +2006-06-07 David Turner + + * src/type1/t1afm.c (KERN_INDEX): Make it more robust. + (T1_Read_Metrics): Fix memory leak which happened when the metrics + file doesn't have kerning pairs. This fixes Savannah bug #16768. + +2006-06-06 David Turner + + Fix memory leak described in Savannah bug #16759. + + We change `ps_unicodes_init' so that it also takes a + `free_glyph_name' callback to release the glyph names returned by + `get_glyph_name' + + * include/freetype/internal/services/svpscmap.h (PS_Glyph_NameFunc): + Renamed to ... + (PS_GetGlyphNameFunc): This. + (PS_FreeGlyphNameFunc): New typedef. + (PS_Unicodes_InitFunc): Add variable for PS_FreeGlyphNameFunc. + + * src/cff/cffcmap.c (cff_sid_to_glyph_name): Use `TT_Face' for first + argument. + (cff_sid_free_glyph_name): New function. + (cff_cmap_unicode_init): Updated. + + * src/psaux/t1cmap.c (t1_cmap_unicode_init): Updated. + + * src/psnames/psmodule.c (ps_unicodes_init): Add variable for + PS_FreeGlyphNameFunc and use it. + + +2006-06-04 David Turner + + * src/base/ftutil.c (ft_mem_qrealloc): Fix the function to accept + `item_size == 0' as well -- though this sounds weird, it can + theoretically happen. This fixes Savannah bug #16669. + + * src/pfr/pfrobjs.c (pfr_face_init): Fix the computation + of `face->num_glyphs' which missed the last glyph, due to + the offset-by-1 computation, since the PFR format doesn't + guarantee that glyph index 0 corresponds to the `missing + glyph. This fixes Savannah bug #16668. + +2006-05-25 Werner Lemberg + + * builds/unix/unix-cc.in (LINK_LIBRARY): Don't comment out + `-no-undefined'. Reported by Christian Biesinger. + +2006-05-19 Brian Weed + + * builds/win32/visualc/freetype.dsp: Release libraries no longer + have debug information, and debug libraries use `C7 compatible' + debug info. + +2006-05-19 suzuki toshiya + + Apply patch by Derek Clegg to fix two memory leaks in the MacOS + resource fork handler. This fixes Savannah bug #16631. + + * src/base/ftobjs.c (load_face_in_embedded_rfork): Replace + `FT_Stream_Close' by `FT_Stream_Free' to fix memory leak. + + * src/base/ftrfrk.c (raccess_guess_linux_double_from_file_name): + Replace `FT_Stream_Close' by `FT_Stream_Free' to fix memory leak. + +2006-05-19 suzuki toshiya + + * build/unix/configure.raw: Add a fallback to disable Carbon + dependency, if configured with no options on Mac OS X. + +2006-05-19 suzuki toshiya + + * src/base/ftmac.c (open_face_from_buffer): Deallocate stream when + its content cannot be parsed as supported font. This fixes + the second part of Savannah bug #16590. + +2006-05-18 Werner Lemberg + + * src/truetype/ttgload.c (TT_Load_Composite_Glyph) + [FT_CONFIG_OPTION_BYTECODE_INTERPRETER]: Make it compilable again. + +2006-05-17 David Turner + + This is a major patch used to drastically improve the performance of + loading glyphs. This both speeds up loading the glyph vectors + themselves and the auto-fitter module. + + We now use inline assembler code with GCC to implement `FT_MulFix', + which is probably the most important function related to the + engine's performance. + + The resulting speed-up is about 25%. + + + * include/freetype/internal/tttypes.h (TT_LoaderRec): Add fields + `cursor' and `limit'. + + * src/autofit/afangles.c (af_corner_is_flat, af_corner_orientation): + New functions. + (AF_ATAN_BITS, af_arctan, af_angle_atan): Comment out. + [TEST]: Remove. + + * src/autofit/afcjk.c (AF_Script_UniRangeRec): Comment out test + code. + + * src/autofit/afhints.c (af_axis_hints_new_segment): Don't call + `FT_ZERO' + (af_direction_compute, af_glyph_hints_compute_inflections): Rewritten. + (af_glyph_hints_reload: Rewrite recognition of weak points. + + * src/autofit/aflatin.c (af_latin_hints_compute_segments): Move + constant values out of the loops. + + * src/autofit/aftypes.h: Updated. + + * src/base/ftcalc.c (FT_MulFix): Use inline assembler code. + + * src/base/ftoutln.c (FT_Outline_Get_Orientation): Use vector + product to get orientation. + + * src/gzip/ftgzip.c (ft_get_uncompressed_size): New function. + (FT_Stream_OpenGzip): Use it to handle small files directly in + memory. + + * src/psaux/psconv.c (PS_Conv_ASCIIHexDecode, PS_ConvEexecDecode): + Improve performance. + + * src/truetype/ttgload.c (TT_Access_Glyph_Frame): Set `cursor' and + `limit'. + + (TT_Load_Glyph_Header, TT_Load_Simple_Glyph, + TT_Load_Composite_Glyph): Updated. Add threshold to protect against + exceedingly large values of number of contours. Speed up by + reducing the number of loops. + + * src/type1/t1gload.c (T1_Load_Glyph): Don't apply unit matrix. + + + * src/cache/ftccmap.c (FTC_CMapCache_Lookup): Change the threshold + used to detect rogue clients from 4 to 16. This is to prevent some + segmentation faults with fonts like `KozMinProVI-Regular.otf' which + comes from the Japanese Adobe Reader Asian Font pack. + +2007-05-17 Werner Lemberg + + * src/cff/cffload.c (cff_font_done): Deallocate subfont array. This + fixes the first part of Savannah bug #16590. + +2006-05-16 Werner Lemberg + + * docs/PROBLEMS: Updated icl issues. + +---------------------------------------------------------------------------- + +Copyright 2006, 2007, 2008, 2009, 2010 by +David Turner, Robert Wilhelm, and Werner Lemberg. + +This file is part of the FreeType project, and may only be used, modified, +and distributed under the terms of the FreeType project license, +LICENSE.TXT. By continuing to use, modify, or distribute this file you +indicate that you have read the license and understand and accept it +fully. + + +Local Variables: +version-control: never +coding: utf-8 +End: +2010-02-13 Werner Lemberg + + * Version 2.3.12 released. + ========================== + + + Tag sources with `VER-2-3-12'. + + * docs/CHANGES: Updated. + + * docs/VERSION.DLL: Update documentation and bump version number to + 2.3.12. + + * README, Jamfile (RefDoc), + builds/win32/vc2005/freetype.vcproj, builds/win32/vc2005/index.html, + builds/win32/vc2008/freetype.vcproj, builds/win32/vc2008/index.html, + builds/win32/visualc/freetype.dsp, + builds/win32/visualc/freetype.vcproj, + builds/win32/visualc/index.html, builds/win32/visualce/freetype.dsp, + builds/win32/visualce/freetype.vcproj, + builds/win32/visualce/index.html, + builds/wince/vc2005-ce/freetype.vcproj, + builds/wince/vc2005-ce/index.html, + builds/wince/vc2008-ce/freetype.vcproj, + builds/wince/vc2008-ce/index.html: s/2.3.11/2.3.12/, s/2311/2312/. + + * include/freetype/freetype.h (FREETYPE_PATCH): Set to 12. + + * builds/unix/configure.raw (version_info): Set to 10:0:4. + +2010-02-12 suzuki toshiya + + Improve autotool version checking to work with beta releases. + + * autogen.sh (check_tool_version): Improve the extraction of version + number from "tool --version" output. Some beta releases of + autotools have extra strings before version number. + +2010-02-12 suzuki toshiya + + Fix overallocating bug in FT_Outline_New_Internal(). + + * src/base/ftoutln.c (FT_Outline_New_Internal): The length of + FT_Outline->points[] should be numPoints, not 2 * numPoints. + Found by Paul Messmer, see + http://lists.gnu.org/archive/html/freetype-devel/2010-02/msg00003.html + +2010-02-10 Ken Sharp + + Really fix Savannah bug #28678 (part 2). + + Since we consider `sbw' for the horizontal direction only, we still have + to synthesize vertical metrics if the user wants to use the vertical + writing direction. + + * src/cff/cffgload.c (cff_slot_load), src/cid/cidgload.c + (cid_slot_load_glyph), src/type1/t1gload.c (T1_Load_Glyph): + Synthesize vertical metrics (only) if FT_LOAD_VERTICAL_LAYOUT is + set. + +2010-02-10 Ken Sharp + + Really fix Savannah bug #28678 (part 1). + + After long discussion, we now consider the character width vector + (wx,wy) returned by the `sbw' Type 1 operator as being part of *one* + direction only. For example, if you are using the horizontal + writing direction, you get the horizontal and vertical components of + the advance width for this direction. Note that OpenType and CFF fonts + don't have such a vertical component; instead, the GPOS table can be + used to generate two-dimensional advance widths (but this isn't + handled by FreeType). + + * include/freetype/ftincrem.h (FT_Incremental_MetricsRec): Add + `advance_v' field to hold the vertical component of the advance + value. + + * src/truetype/ttgload.c (tt_get_metrics), src/cff/cffgload.c + (cff_slot_load), src/type1/t1gload.c + (T1_Parse_Glyph_And_Get_Char_String), src/cid/cidgload.c + (cid_load_glyph): Use it. + +2010-02-08 Werner Lemberg + + * devel/ftoption.h [FT_CONFIG_OPTION_PIC]: Define. + +2010-02-04 suzuki toshiya + + Prevent NULL pointer dereference passed to FT_Module_Requester. + + * src/sfnt/sfdriver.c (sfnt_get_interface): Don't use `module'. + * src/psnames/psmodule.c (psnames_get_interface): Ditto. + + * src/cff/cffdrivr.c (cff_get_interface): Check NULL `driver'. + * src/truetype/ttdriver.c (tt_get_interface): Ditto. + +2010-01-29 suzuki toshiya + + Fix memory leaks in previous patch. + + * src/sfnt/sfobjs.c (sfnt_load_face): Don't overwrite the strings + allocated for face->root.family_name and style_name. + +2010-01-29 suzuki toshiya + + New parameters for FT_Open_Face() to ignore preferred family names. + + Preferred family names should be used for legacy systems that + can hold only a few faces (<= 4) for a family name. Suggested by + Andreas Heinrich. + http://lists.gnu.org/archive/html/freetype/2010-01/msg00001.html + + * include/freetype/ftsnames.h (FT_PARAM_TAG_IGNORE_PREFERRED_FAMILY, + FT_PARAM_TAG_IGNORE_PREFERRED_SUBFAMILY): Define. + + * src/sfnt/sfobjs.c (sfnt_load_face): Check the arguments and + ignore preferred family and subfamily names if requested. + +2010-01-27 Ken Sharp + + Fix Savannah bug #28678. + + * src/cff/cffgload.c (cff_slot_load), src/cid/cidgload.c + (cid_load_glyph): Handle vertical metrics correctly. + + * src/type1/t1gload.c (T1_Parse_Glyph_And_Get_Char_String): Handle + vertical metrics correctly. + (T1_Load_Glyph): Don't synthesize vertical metrics. + +2010-01-14 Werner Lemberg + + Make FT_Set_Transform work if no renderer is available. + + * src/base/ftobjs.c (FT_Load_Glyph): Apply `standard' transformation + if no renderer is compiled into the library. + +2010-01-14 Werner Lemberg + + Fix compilation warning. + + * src/base/ftbase.h: s/LOCAL_DEF/LOCAL/. + * src/base/ftobjc.s: Include ftbase.h conditionally. + +2010-01-11 Kwang Yul Seo + + Provide inline assembly code for RVCT compiler. + This is Savannah patch #7059. + + * include/freetype/config/ftconfig.h (FT_MULFIX_ASSEMBLER, + FT_MulFix_arm) [__CC_ARM || __ARM_CC]: Define. + +2010-01-08 Ken Sharp + + Fix Savannah bug #28521. + + Issue #28226 involved a work-around for a font which used the + `setcurrentpoint' operator in an invalid way; this operator is only + supposed to be used with the result of OtherSubrs, and the font used + it directly. The supplied patch removed the block of code which + checked this usage entirely. + + This turns out to be a Bad Thing. If `setcurrentpoint' is being + used correctly it should reset the flex flag in the decoder. If we + don't do this then the flag never gets reset and we omit any further + contours from the glyph (at least until we close the path or + similar). + + * src/psaux/t1decode.c (t1_decoder_parse_charstrings) + : Handle `flex_state' correctly. + +2010-01-05 Werner Lemberg + + Apply reports from clang static analyzer. + + * src/lzw/ftlzw.c (ft_lzw_file_init), src/base/ftstroke.c + (FT_Stroker_ParseOutline), src/base/ftsynth.c + (FT_GlyphSlot_Embolden): Remove dead code. + + * src/base/ftpatent.c (_tt_check_patents_in_table): Initialize + `offset_i' and `length_i'. + +2010-01-05 Ralph Giles + + Enable the incremental font interface by default. + + Ghostscript requires the incremental font interface for handling + some Postscript documents. It is moving to using FreeType as its + primary renderer; supporting this in the default build makes it + Ghostscript to be linked against the system FreeType when one is + available. + + * include/freetype/config/ftoption.h (FT_CONFIG_OPTION_INCREMENTAL): + Uncomment. + +2010-01-05 Werner Lemberg + + Fix Savannah bug #28395. + + * src/truetype/ttdriver.c (Load_Glyph), src/type1/t1gload.c + (T1_Loada_Glyph): Don't check `num_glyphs' if incremental interface + is used. + +2010-01-05 Ken Sharp + + Make Type 1 `seac' operator work with incremental interface. + This fixes Savannah bug #28480. + + * src/psaux/t1decode.c (t1operator_seac): Don't check `glyph_names' + if incremental interface is used. + +2010-01-04 Ken Sharp + + Make incremental interface work with TrueType fonts. + This fixes Savannah bug #28478. + + * src/truetype/ttgload.c (load_truetype_glyph): Don't check + `glyf_offset' if incremental interface is used. + +2009-12-31 Lars Abrahamsson + + Make compilation with FT_CONFIG_OPTION_PIC work again. + + * src/base/ftglyph.c (FT_Glyph_To_Bitmap) [FT_CONFIG_OPTION_PIC]: + Declare `library' for FT_BITMAP_GLYPH_CLASS_GET. + + * src/base/ftinit.c (ft_destroy_default_module_classes, + ft_create_default_module_classes): Use proper casts (needed for C++ + compilation). + + * src/sfnt/ttcmap.c (tt_cmap13_class_rec): Use FT_DEFINE_TT_CMAP. + +2009-12-22 Marc Kleine-Budde + + Make freetype-config aware of $SYSROOT. + This is Savannah patch #7040. + + * builds/unix/freetype-config.in: Decorate with ${SYSROOT} where + appropriate. + +2009-12-20 Werner Lemberg + + Fix compiler warning. + Reported by Sean. + + * src/base/ftdbgmem.c [!FT_DEBUG_MEMORY]: ANSI C doesn't like empty + source files; however, some compilers warn about an unused variable + declaration. This is now replaced with a typedef. + +2009-12-18 Werner Lemberg + + Fix Savannah bug #28320. + + There exist corrupt, subsetted fonts (embedded in PDF files) which + contain a private dict that ends with an unterminated floating point + number (no operator following). We now ignore this error (as + acrobat does). + + * src/cff/cffparse.c (cff_parser_run): Don't emit a syntax error for + unterminated floating point numbers. + +2009-12-16 Werner Lemberg + + Really fix compiler warnings. + Reported by Sean. + + * src/truetype/ttgxvar.c (GX_PT_POINTS_ARE_WORDS, + GX_PT_POINT_RUN_COUNT_MASK): Convert enum values to macros. + +2009-12-16 suzuki toshiya + + Improve configure.raw to copy some options from CFLAGS to LDFLAGS. + The linker of Mac OS X 10.6 is sensitive to the architecture. If + the architectures are specified explicitly for the C compiler, the + linker requires the architecture specifications too. + + * builds/unix/configure.raw: Replace `-isysroot' option parser by + more generic argument parser. + +2009-12-15 Werner Lemberg + + Fix compiler warnings. + Reported by Sean. + + * src/truetype/ttgxvar.c (ft_var_readpackeddeltas): Fix counter data + type. + +2009-12-14 Ken Sharp + + Ignore invalid `setcurrentpoint' operations in Type 1 fonts. + This fixes Savannah bug #28226. + + At least two wild PostScript files of unknown provenance contain + Type 1 fonts, apparently converted from TrueType fonts in earlier + PDF versions of the files, which use the `setcurrentpoint' operator + inappropriately. + + FreeType currently throws an error in this case, but Ghostscript and + Adobe Distiller both accept the fonts and ignore the problem. This + commit #ifdefs out the check so PostScript interpreters using + FreeType can render these files. + + The specification says `setcurrentpoint' should only be used to set + the point after a `Subr' call, but these fonts use it to set the + initial point to (0,0). Unnecessarily so, as they correctly use an + `hsbw' operation which implicitly sets the initial point. + + * src/psaux/t1decode.c (t1_decoder_parse_charstrings) + : Comment out code. + +2009-12-14 Bram Tassyns + + Fix parsing of /CIDFontVersion. + This fixes Savannah bug #28287. + + * src/cid/cidtoken.h: `cid_version' in CID_FaceInfoRec (in + t1tables.h) is of type FT_Fixed. + +2009-12-14 Werner Lemberg + + Trace glyph index in CID module. + Suggested in Savannah patch #7023. + + * src/cid/cidgload.c (cid_load_glyph): Add tracing message. + +2009-12-03 Werner Lemberg + + Fix compiler warnings. + + * src/truetype/ttgload.c (tt_get_metrics): Put `Exit' label into the + proper preprocessor conditional. + * src/pfr/pfrobjs.c (pfr_slot_load): Pacify gcc. + +2009-11-25 John Tytgat + + Better handling of start of `eexec' section. + This fixes Savannah bug #28090. + + * src/type1/t1parse.c (T1_Get_Private_Dict): Skip all whitespace + characters before start of `eexec' section. + +2009-11-20 Werner Lemberg + + Fix Savannah bug #27742. + + * src/base/ftstroke.c (ft_stroker_outside): Avoid silent division by + zero, using a threshold for `theta'. + +2009-11-20 Werner Lemberg + + Fix Savannah bug #28036. + + * src/type1/t1afm.c (t1_get_index): Fix comparison. + +2009-11-16 Werner Lemberg + + Fix compiler warnings. + Reported by Kevin Blenkinsopp . + + * src/sfnt/ttload.c (check_table_dir): Use proper data type. + +2009-11-15 Werner Lemberg + + Really fix FreeDesktop bug #21197. + This also fixes Savannah bug #28021. + + * src/autofit/aflatin.c (af_latin_metrics_check_digits), + src/autofit/aflatin2.c (af_latin2_metrics_check_digits): Fix loop. + +2009-11-15 Werner Lemberg + + Add tracing messages for advance values. + + * src/base/ftobjs.c (FT_Load_Glyph), src/truetype/ttgload.c + (TT_Get_HMetrics, TT_Get_VMetrics): Do it. + +2009-11-08 Werner Lemberg + + Fix compiler warning. + Reported by Jeremy Manson . + + * src/truetype/ttgload.c (load_truetype_glyph): Initialize `error'. + +2009-11-04 Werner Lemberg + + Remove compiler warning. + Reported by Sean McBride . + + * src/tools/apinames.c (read_header_file): Use a cast to + `int', as specified in the printf(3) man page. + +2009-11-04 Werner Lemberg + + Fix Savannah bug #27921. + + * src/cff/cffobjs.c (cff_face_init), src/cid/cidobjs.c + (cid_face_init), src/type1/t1afm.c (T1_Read_Metrics), + src/type1/t1objs.c (T1_Face_Init): Don't use unsigned constant + values for rounding if the argument can be negative. + +2009-11-03 Bram Tassyns + + Add basic support for Type1 charstrings in CFF. + This fixes Savannah bug #27922. + + * src/cff/cffgload.c (CFF_Operator, cff_argument_counts): Handle + `seac', `sbw', and `setcurrentpoint' opcodes. + (cff_compute_bias): Add parameter to indicate the charstring type. + Update all callers. + (cff_operator_seac): Add parameter for side bearing. + (cff_decoder_parse_charstrings): Updated for more Type1 support. + +2009-11-03 Werner Lemberg + + Return correct `linearHoriAdvance' value for embedded TT bitmaps too. + Reported by Jeremy Manson . + + src/truetype/ttgload.c (load_truetype_glyph): Add parameter to + quickly load the glyph header only. + Update all callers. + (tt_loader_init): Add parameter to quickly load the `glyf' table + only. + Update all callers. + (TT_Load_Glyph): Compute linear advance values for embedded bitmap + glyphs too. + +2009-11-03 Werner Lemberg + + Improve code readability. + + * src/ttgload.c (load_truetype_glyph): Move metrics calculation + to... + (tt_get_metrics): This new function. + +2009-10-26 Bram Tassyns + + Fix Savannah bug #27811. + + * src/truetype/ttxgvar.c (ft_var_readpackeddeltas): Fix + signed/unsigned mismatch. + +2009-10-19 Ning Dong + + Fix handling of `get' and `put' CFF instructions. + + * src/cff/cffgload.c (cff_decoder_parse_charstrings) : Appendix B of Adobe Technote #5177 limits the number of + elements for the `get' and `put' operators to 32. + * src/cff/cffgload.h (CFF_MAX_TRANS_ELEMENTS): Define. + (CFF_Decoder): Use it for `buildchar' and remove `len_buildchar'. + +2009-10-18 Werner Lemberg + + Fix handling of `dup' CFF instruction. + Problem and solution reported by Ning Dong . + + * src/cff/cffgload.c (cff_decoder_parse_charstrings) : + Increase `args' by 2, not 1. + +2009-10-10 Werner Lemberg + + * Version 2.3.11 released. + ========================== + + + Tag sources with `VER-2-3-11'. + + * docs/VERSION.DLL: Update documentation and bump version number to + 2.3.11. + + * README, Jamfile (RefDoc), builds/win32/visualc/index.html, + builds/win32/visualc/freetype.dsp, + builds/win32/visualc/freetype.vcproj, + builds/win32/visualce/index.html, + builds/win32/visualce/freetype.dsp, + builds/win32/visualce/freetype.vcproj: s/2.3.10/2.3.11/, s/2310/2311/. + + * include/freetype/freetype.h (FREETYPE_PATCH): Set to 11. + + * builds/unix/configure.raw (version_info): Set to 9:22:3. + +2009-10-10 Werner Lemberg + + * docs/CHANGES, docs/release: Updated. + +2009-10-10 suzuki toshiya + + * src/pcf/pcfread.c (pcf_get_properties): Fix a bug in the nprops + truncation. Reported by Martin von Gagern and Peter Volkov. + https://bugs.gentoo.org/288357 and https://bugs.gentoo.org/288256 + +2009-10-06 Werner Lemberg + + * Version 2.3.10 released. + ========================== + + + Tag sources with `VER-2-3-10'. + + * builds/toplevel.mk (major, minor, patch): Fix regexp to allow more + than a single digit. + (dist): We now use git. + + * docs/VERSION.DLL: Update documentation and bump version number to + 2.3.10. + + * README, Jamfile (RefDoc), builds/win32/visualc/index.html, + builds/win32/visualc/freetype.dsp, + builds/win32/visualc/freetype.vcproj, + builds/win32/visualce/index.html, + builds/win32/visualce/freetype.dsp, + builds/win32/visualce/freetype.vcproj: s/2.3.9/2.3.10/, s/239/2310/. + + * include/freetype/freetype.h (FREETYPE_PATCH): Set to 10. + + * builds/unix/configure.raw (version_info): Set to 9:21:3. + +2009-10-06 Werner Lemberg + + Fix `make multi'. + + * src/cache/ftccache.c, src/cache/ftcsbits.c (FT_COMPONENT): Define. + + * src/sfnt/sfdriver.c: Include FT_INTERNAL_DEBUG_H. + +2009-09-27 suzuki toshiya + + [cache] Fix Savannah bug #27441, clean up Redhat bugzilla #513582. + Tricky casts in FTC_{CACHE,GCACHE,MRULIST}_LOOKUP_CMP() are removed. + Now these functions should be called with FTC_Node or FTC_MruNode + variable, and the caller should cast them to appropriate pointers to + concrete data. These tricky casts can GCC-4.4 optimizer (-O2) + confused and the crashing binaries are generated. + + * src/cache/ftcmru.h (FTC_MRULIST_LOOKUP_CMP): Drop tricky cast. + Now the 4th argument `node' of this function should be typed as + FTC_MruNode. + + * src/cache/ftcglyph.h (FTC_GCACHE_LOOKUP_CMP): For inline + implementation, new temporal variable FTC_MruNode `_mrunode' to take + the pointer from FTC_MRULIST_LOOKUP_CMP(). For non-inline + implementation, tricky cast is dropped. + + * src/cache/ftcmanag.c (FTC_SIZE_NODE): New macro casting + to FTC_SizeNode. + (FTC_Manager_LookupSize): Replace FTC_SizeNode `node' by FTC_MruNode + `mrunode', and FTC_SIZE_NODE() is inserted. + (FTC_FACE_NODE): New macro casting to FTC_FaceNode. + (FTC_Manager_LookupFace) Replace FTC_FaceNode `node' by FTC_MruNode + `mrunode', and FTC_FACE_NODE() is inserted. + + * src/cache/ftcbasic.c (FTC_ImageCache_Lookup): Change the type of + `node' from FTC_INode to FTC_Node. Extra casting macro FTC_NODE() + is dropped. + (FTC_ImageCache_LookupScaler): Ditto. + (FTC_SBitCache_Lookup): Change the type of `node' from FTC_SNode to + FTC_Node. Extra casting macro FTC_NODE() is dropped. FTC_SNODE() + is inserted. + (FTC_SBitCache_LookupScaler): Ditto. + + * src/cache/ftccmap.c (FTC_CMapCache_Lookup): Change the type of + `node' from FTC_CMapNode to FTC_Node. Extra casting macro + FTC_NODE() is dropped, FTC_CMAP_NODE() is inserted. + +2009-09-25 suzuki toshiya + + [cache, psaux, type1] Fix for multi build. + In multi build, some cpp functions are left as unresolved symbols. + + * src/cache/ftcbasic.c: Include FT_INTERNAL_DEBUG_H for FT_TRACE1(). + + * src/psaux/t1decode.c: Include FT_INTERNAL_CALC_H for + FIXED_TO_INT(). + * src/type1/t1gload.c: Ditto. + * src/type1/t1objs.c: Ditto. + +2009-09-25 suzuki toshiya + + [autofit] Fix for multi build. + + * src/autofit/afmodule.h: Include FT_INTERNAL_OBJECTS_H to use + FT_DECLARE_MODULE() macro in multi build. + + * src/autofit/aflatin.c: Include to handle + FT_ADVANCES_H correctly in multi build. + +2009-09-24 suzuki toshiya + + [cache] Check the face filled by FTC_Manager_LookupFace(). + + * src/cache/ftcbasic.c (ftc_basic_family_get_count): Return + immediately if FTC_Manager_LookupFace() fills face by NULL. Such + case can occur when the code is optimized by GCC-4.2.x. + +2009-09-23 Werner Lemberg + + * docs/CHANGES: Updated. + +2009-09-12 Werner Lemberg + + [raster] Fix 5-levels grayscale output. + This was broken since version 2.3.0. + + * src/raster/ftraster.c (count_table): Use pre-2.3.0 values (which + were then computed dynamically). + (Vertical_Gray_Sweep_Step): Updated. + + (ft_black_render): Initialize `worker->gray_lines' (problem found by + valgrind). + + (FT_RASTER_OPTION_ANTI_ALIASING, DEBUG_RASTER): Dont' #undef, just + comment out. + +2009-09-12 suzuki toshiya + + Improve configure.raw for cross build. + + * builds/unix/configure.raw: Remove temporal files created by the + suffix checking for CC_BUILD. Set XX_ANSIFLAGS and XX_CFLAGS when + cross compiler is GCC. AC_PROG_CC checks whether the cross compiler + is GCC, its result is stored in GCC. + +2009-09-12 suzuki toshiya + + [BDF] Modify hash API to take size_t value instead of void *. + + The hash API in BDF driver is designed to be generic, it takes + void * typed data. But BDF driver always gives an unsigned long + integer (the index to a property). To reduce non-essential + casts from unsigned long to void* and from void* to unsigned + long, the hash API is changed to take size_t integer. + The issue of incompatible cast between unsigned long and void* + on LLP64 platform is reported by NightStrike from MinGW-Win64 + project. See + http://lists.gnu.org/archive/html/freetype/2009-09/msg00000.html + + * src/bdf/bdf.h: The type of hashnode->data is changed from + void* to size_t. + + * src/bdf/bdflib.c (hash_insert): Get size_t data, instead of + void* data. + (bdf_create_property): Get the name length of new property by + size_t variable, with a cut-off at FT_ULONG_MAX. + (_bdf_set_default_spacing): Get the name length of the face by + size_t variable, with a cut-off at 256. + (bdf_get_property): Get the property id by size_t variable to + reduce the casts between 32-bit prop ID & hashnode->data during + simple copying. + (_bdf_add_property): Ditto. + (_bdf_parse_start): Calculate the index to the property array + by size_t variable. + (bdf_get_font_property): Drop a cast to unsigned long. + +2009-09-10 suzuki toshiya + + [Win64] Improve the computation of random seed from stack address. + + On LLP64 platform, the conversion from pointer to FT_Fixed need + to drop higher 32-bit. Explict casts are required. Reported by + NightStrike from MinGW-w64 project. See + http://lists.gnu.org/archive/html/freetype/2009-09/msg00000.html + + * src/cff/cffgload.c: Convert the pointers to FT_Fixed explicitly. + + * src/psaux/t1decode.c: Ditto. + + +2009-09-03 Werner Lemberg + + [raster] Improvements for stand-alone mode. + + * src/raster/rules.mk: Don't handle ftmisc.h. It is needed for + stand-alone mode only. + + * src/raster/ftmisc.h (FT_MemoryRec , FT_Alloc_Func, FT_Free_Func, + FT_Realloc_Func): Copy declarations from ftsystem.h. + +2009-09-02 Bram Tassyns + + Improve vertical metrics calculation (Savannah bug #27364). + + The calculation of `vertBearingX' is not defined in the OTF font + spec so FreeType does a `best effort' attempt. However, this value + is defined in the PDF and PostScript specs, and that algorithm is + better than the one FreeType currently uses: + + FreeType: Use the middle of the bounding box as the X coordinate + of the vertical origin. + + Adobe PDF spec: Use the middle of the horizontal advance vector as + the X coordinate of the vertical origin. + + FreeType's algorithm goes wrong if you have a really small glyph + (like the full-width, circle-like dot at the end of the sentence, as + used in CJK scripts) with large bearings. With the FreeType + algorithm this dot gets centered on the baseline; with the PDF + algorithm it gets the correct location (in the top right). Note + that this is a serious issue, it's like printing the dot at the end + of a Roman sentence at the center of the textline instead of on the + baseline like it should. So i believe the PDF spec's algorithm + should be used in FreeType as well. + + The `vertBearingY' value for such small glyphs is also very strange + if no `vmtx' information is present, since the height of the bbox is + not representable for the height of the glyph visually (the + whitespace up to the baseline is part of the glyph). The fix also + includes some code for a better estimate of `vertBearingY'. + + * src/base/ftobjs.c (ft_synthesize_vertical_metrics): `vertBearingX' + is now calculated as described by the Adobe PDF Spec. Estimate for + `vertBearingY' now works better for small glyphs completely above or + below the baseline into account. + + * src/cff/cffgload.c (cff_slot_load): `vertBearingX' is now + calculated as described by the Adobe PDF Spec. Vertical metrics + information was always ignored when FT_CONFIG_OPTION_OLD_INTERNALS + was not defined. + + * src/truetype/ttgload.c (compute_glyph_metrics): `vertBearingX' is + now calculated as described by the Adobe PDF Spec. + +2009-09-01 John Tytgat + + Fix custom cmap for empty Type 1 font (Savannah bug #27294). + + * include/freetype/internal/t1types.h (T1_EncodingRecRec_): Update + comment to reflect revised code_last meaning. + * src/type1/t1load.c (T1_Open_Face), src/type42/t42objs.c + (T42_Open_Face): Assign max_char as highest character code + 1 and + use this for T1_EncodingRecRec_::code_last. + * src/psaux/t1cmap.c (t1_cmap_custom_init): Follow revised + T1_EncodingRecRec_::code_last meaning. + +2009-08-25 Werner Lemberg + + Fix rendering of horizontally compressed CFFs. + Bug reported by Ivan Nincic . + + * src/cff/cffgload.c (cff_slot_load): Thinko: Check `xx' element of + `font_matrix' also. + + * docs/CHANGES: Updated. + +2009-08-03 suyu0925@gmail.com + + Don't call `ft_fseek' every time when executing `ft_fread'. + + * src/base/ftstream.c (FT_Stream_Seek), src/base/ftsystem.c + (ft_ansi_stream_io): Implement it. + +2009-07-31 suzuki toshiya + + sfnt: Cast a charcode to 32-bit in cmap format 14 parser. + + * src/sfnt/ttcmap.c (tt_cmap14_char_var_index, + tt_cmap14_char_var_isdefault, tt_cmap14_char_variants, + tt_cmap14_variant_chars): Correct mismatches from + FT_CMap_CharVarIndexFunc prototype, FT_ULong arguments + are replaced by FT_UInt32 arguments. + +2009-07-31 suzuki toshiya + + sfnt: Cast a charcode to 32-bit in cmap format 12 parser. + + * src/sfnt/ttcmap.c (tt_cmap12_char_next): + Insert explicit cast from FT_UFast to FT_UInt32 + for return value. + +2009-07-31 suzuki toshiya + + psaux: Fix a few casts to FT_Int32 value. + + * src/psaux/t1decode.c (t1_decoder_parse_charstrings): + Fix a few casts setting `value' from FT_Long to FT_Int32, + because `value' is typed as FT_Int32 since 2009-06-22. + +2009-07-31 suzuki toshiya + + sfnt: Fix a data type mismatching with its source. + + * src/sfnt/ttcmap.c (tt_cmap13_char_next): Fix the + type of `gindex' from FT_ULong to FT_UInt because + it is set by FT_UInt tt_cmap13_char_map_binary() or + TT_CMap13->cur_gindex. + +2009-07-31 suzuki toshiya + + sfnt: Extend a few local variables to load 32-bit values. + + * src/sfnt/ttkern.c (tt_face_load_kern): Extend `count' + and `kern' to load 32-bit values. + +2009-07-31 suzuki toshiya + + pfr: Extend `num_aux' to take 32-bit value. + + * src/pfr/pfrload.c (pfr_phy_font_load): Extend + `num_aux' to load 32-bit value. + +2009-07-31 suzuki toshiya + + pcf: Truncate FT_ULong `nprops' to fit to int PCF_Face->nprops. + + * src/pcf/pcfread.c (pcf_get_properties): Load `nprops' + as FT_ULong value from PCF file, but truncate it as + int to fit PCF_Face->nprops. The number of truncated + properties is shown in the trace message. + +2009-07-31 suzuki toshiya + + gxvalid: Extend a few local variables to reduce the casts. + + * src/gxvalid/gxvmorx.c (gxv_morx_subtables_validate): + Extend `type' and `rest' to take FT_ULong values. + +2009-07-31 suzuki toshiya + + gxvalid: Extend `settingTable' to take 32-bit offset. + + * src/gxvalid/gxvfeat.c (gxv_feat_name_validate): + Extend `settingTable' to take 32-bit offset. + +2009-07-31 suzuki toshiya + + autofit: Cast FT_Long glyph_count to compare with FT_UInt GID. + + * src/autofit/afglobal.c (af_face_globals_is_digit, + af_face_globals_compute_script_coverage): Cast FT_Long + globals->glyph_count to FT_ULong, to compare with FT_UInt + gindex. + +2009-07-31 suzuki toshiya + + smooth: Exclude 16-bit system in invalid pitch/height check. + + * src/smooth/ftsmooth.c (ft_smooth_render_generic): + pitch and height are typed as FT_UInt but checked to fit + 16-bit range, to avoid the overflows. On 16-bit system, + this checking inserts a conditional that never occurs. + +2009-07-03 suzuki toshiya + + cff: Type large constants > 0x7FFF as long for 16-bit systems. + + * src/cff/cffload.c (cff_charset_load): Type large + constants > 0x7FFF as long, because normal constants + are typed signed integer that is less than 0x8000 on + 16-bit systems. + +2009-07-31 suzuki toshiya + + base: Remove an unused variable. + + * src/base/ftglyph.c (FT_Glyph_To_Bitmap): Remove an + unused variable `library'. glyph->library is used. + +2009-07-31 suzuki toshiya + + cache: Check higher bits in flags for non ILP32 systems. + + 4 public functions ought to take FT_ULong flags, but take + FT_UInt flags. To keep binary compatibility, we drop higher + bits on non ILP32 platforms, + ILP64 systems: No drop occurs. + LP64 systems: Higher bits are not used. + 16-bit systems: Drop can occur. + See + http://lists.gnu.org/archive/html/freetype-devel/2008-12/msg00065.html + These functions will be refined to take FT_ULong flags in + next bump with incompatible API change. + + * src/cache/ftcbasic.c (FTC_ImageCache_Lookup): + Check `flags' in `type', the 2nd argument. + (FTC_SBitCache_Lookup): Ditto. + (FTC_ImageCache_LookupScaler): Check `load_flags', + the 3rd argument. + (FTC_SBitCache_LookupScaler): Ditto. + +2009-07-31 suzuki toshiya + + sfnt: Ignore invalid GIDs in glyph name lookup. + + * include/freetype/internal/fttrace.h: + New trace module for sfdriver.c is added. + + * src/sfnt/sfdriver.c (sfnt_get_name_index): + Restrict glyph name lookup to FT_UInt GID. + Genuine TrueType can hold 16-bit glyphs. + +2009-07-31 suzuki toshiya + + pcf: Fix a comparison between FT_Long and FT_ULong. + + * src/pcf/pcfread.c (pcf_get_bitmaps): Return an error + if PCF_Face->nemetrics is negative. + +2009-07-31 suzuki toshiya + + gxvalid: Guarantee `nFeatureFlags' size up to 32-bit. + + * src/gxvalid/gxvmort.c (gxv_mort_featurearray_validate): + Extend the 3rd argument `nFeatureFlags' to FT_ULong. + * src/gxvalid/gxvmort.h: Ditto. + +2009-07-31 suzuki toshiya + + sfnt: Insert explicit cast for LP64 system. + + * src/sfnt/ttkern.c (tt_face_load_kern): Insert + cast from unsigned long to FT_UInt32. + +2009-07-31 suzuki toshiya + + gxvalid: Guarantee `just' table size upto 32-bit. + + * src/gxvalid/gxvjust.c (gxv_just_validate): + The type of `offset' is changed from FT_UInt to + FT_Offset, for 16-bit platforms. + +2009-07-31 suzuki toshiya + + gxvalid: Guarantee `trak' table size upto 32-bit. + + * src/gxvalid/gxvtrak.c (gxv_trak_validate): + The type of `offset' is changed from FT_UInt to + FT_Offset, for 16-bit platforms. + +2009-07-31 suzuki toshiya + + type1: Fix a data type mismatching with its source. + + * include/freetype/internal/t1types.h: The type of + T1_Face->buildchar is matched with T1_Decorder->top. + +2009-07-31 suzuki toshiya + + pfr: Fix a data type mismatching with its source. + + * src/pfr/pfrtypes.h: The type of PFR_KernItem->offset + is extended from FT_UInt32 to FT_Offset, because it is + calculated with the pointer difference, in + pfr_extra_item_load_kerning_pairs(). + +2009-07-31 suzuki toshiya + + pfr: Fix a data type mismatching with its source. + + * src/pfr/pfrtypes.h: The type of PFR_PhysFont->chars_offset + is extended from FT_UInt32 to FT_Offset, because it is + calculated with the pointer difference in pfr_phy_font_load(). + +2009-07-31 suzuki toshiya + + pfr: Fix a data type mismatching with its source. + + * src/pfr/pfrtypes.h: The type of PFR_PhyFont->bct_offset + is extended from FT_UInt32 to FT_Long, because it is + loaded by FT_STREAM_POS() in pfr_phy_font_load(). + +2009-07-31 suzuki toshiya + + smooth: Improve the format in debug message. + + * src/smooth/ftgrays.c (gray_dump_cells): Improve the + format specifications to dump variables. + +2009-07-31 suzuki toshiya + + sfnt: Fix a data type mismatching with its source. + + * src/sfnt/sfobjs.c (sfnt_load_face): The type of + local `flags' is matched with FT_Face->face_flags. + +2009-07-31 suzuki toshiya + + psaux: Fix a data type mismatching with its source. + + * include/freetype/internal/psaux.h: The type of + T1_DecorderRec.buildchar is matched with + T1_DecorderRec.top. + +2009-07-31 suzuki toshiya + + truetype: Extend TrueType GX packed deltas to FT_Offset. + + * src/truetype/ttgxvar.c (ft_var_readpackeddeltas): + The type of 2nd argument `delta_cnt' is changed from + FT_Int to FT_Offset, because its source can be cvt + table size calculated from stream position. + +2009-07-31 suzuki toshiya + + truetype: Extend mmvar_len to hold size_t values. + + * src/truetype/ttgxvar.h: The type of + GX_BlendRec.mmvar_len is changed from FT_Int to + FT_Offset, because TT_Get_MM_Var() calculates it + by sizeof() results. + +2009-07-31 suzuki toshiya + + truetype: Check invalid function number in IDEF instruction. + + * src/truetype/ttinterp.c (Ins_IDEF): Check + if the operand fits to 8-bit opcode limitation. + +2009-07-31 suzuki toshiya + + truetype: Check invalid function number in FDEF instruction. + + * src/truetype/ttinterp.c (Ins_FDEF): Check + if the operand fits 16-bit function number. + +2009-07-31 suzuki toshiya + + truetype: Truncate the deltas of composite glyph at 16-bit values. + + * src/truetype/ttgload.c (load_truetype_glyph): + Insert cast from FT_Long (deltas[i].{x,y}) to + FT_Int16 in the summation of deltas[] for composite + glyphs. Because deltas[i] is typed as FT_Pos, + its component x, y are typed as FT_Long, but + their sources are always FT_Int16 when they are + loaded by ft_var_readpackeddeltas(). However, + the limitation about the summed deltas is unclear. + +2009-07-31 suzuki toshiya + + truetype: Truncate the instructions upto 16-bit per a glyph. + + * src/truetype/ttgload.c (TT_Hint_Glyph): Truncate + the instructions upto 16-bit length per a glyph. + +2009-07-31 suzuki toshiya + + truetype: Cast the numerical operands to 32-bit for LP64 systems. + + * src/truetype/ttinterp.c (Ins_SPHIX, INS_MIAP, + Ins_MIRP): Insert cast from long (args[], the + operands passed to TrueType operator) to FT_Int32 + (the argument of TT_MulFix14()). + +2009-07-31 suzuki toshiya + + truetype: Cast the project vector to 32-bit for LP64 system. + + * src/truetype/ttinterp.c (Project, DualProject): + Insert casts from FT_Pos (the arguments `dx', `dy') + to FT_UInt32 (the argument to TT_DotFix14()). + +2009-07-31 suzuki toshiya + + truetype: Cast the scaling params to 32-bit for LP64 system. + + * src/truetype/ttgload.c (TT_Process_Composite_Component): + Insert casts from long (return value of FT_MulFix()) to + FT_Int32 (the argument to FT_SqrtFixed()). + +2009-07-31 suzuki toshiya + + sfnt: Cast a character code to FT_UInt32 for LP64 system. + + * src/sfnt/ttcmap.c (tt_cmap14_char_map_nondef_binary, + tt_cmap14_variants, tt_cmap14_char_variants, + tt_cmap14_def_char_count, tt_cmap14_get_def_chars, + tt_cmap14_get_nondef_chars, tt_cmap14_variant_chars) + Insert casts when FT_UInt32 variable is loaded by + TT_NEXT_{UINT24|ULONG}. Because most of them are + compared with FT_UInt32 values in public API, replacing + FT_UFast is not recommended. + +2009-07-31 suzuki toshiya + + sfnt: Cast a character code to FT_UInt32 for LP64 system. + + * src/sfnt/ttcmap.c (tt_cmap4_init, tt_cmap4_next): + Insert the casts from unsigned long constant to + FT_UInt32. + +2009-07-31 suzuki toshiya + + sfnt: Extend TT_BDF->strings_size to FT_ULong for huge BDF. + + * include/freetype/internal/tttypes.h: The type + of TT_BDF->string_size is extended from FT_UInt32 + to FT_ULong, because BDF specification does not + restrict the length of string. + * src/sfnt/ttbdf.c: The scratch variable `strings' + to load TT_BDF->string_size is matched with + TT_BDF->string_size. + +2009-07-31 suzuki toshiya + + psaux: Handle the string length by FT_Offset variables. + + * src/psaux/afmparse.c (afm_parser_next_key, + afm_tokenize, afm_parse_track_kern, + afm_parse_kern_pairs, afm_parse_kern_data, + afm_parser_skip_section, afm_parser_parse): + The length of key is handled by FT_Offset, + instead of FT_UInt. Although the length of + PostScript strings or name object is 16-bit, + AFM_STREAM_KEY_LEN() calculates the length + from the pointer difference. + + * src/psaux/afmparse.h (afm_parser_next_key): + Ditto. + +2009-07-31 suzuki toshiya + + pcf: Fix some data types mismatching with their sources. + + * src/pcf/pcfread.c (pcf_get_bitmaps): The types + of `nbitmaps', `i', `sizebitmaps' are matched with + the type of area FT_Bitmap.pitch * FT_Bitmap.rows. + +2009-07-31 suzuki toshiya + + pcf: Handle the string length by size_t variables. + + * src/pcf/pcfread.c (pcf_interpret_style): The types + of nn, len, lengths[4] are changed to size_t, because + they are loaded by (or compared with) ft_strlen(). + + * src/pcf/pcfutil.c (BitOrderInvert, TwoByteSwap, + FourByteSwap): The type of the 2nd argument `nbytes' + is changed to size_t, for similarity with ANSI C + string functions. + + * src/pcf/pcfdrivr.c (PCF_Glyph_Load): The type of + `bytes' is changed to FT_Offset, because it is passed + to FT_ALLOC(), via ft_glyphslot_alloc_bitmap(). At + least, using unsigned type is better. + +2009-07-31 suzuki toshiya + + pcf: Fix some data types mismatching with their sources. + + * src/pcf/pcfread.c (pcf_seek_to_table_type, + pcf_has_table_type): The type of 3rd argument + `ntables' is matched with PCF_Toc->count. + +2009-07-31 suzuki toshiya + + otvalid: Truncate the glyph index to 16-bit. + + * src/otvalid/otvalid.c (otv_validate): Checks + face->num_glyphs does not exceed 16-bit limit, + pass FT_UInt num_glyphs to backend functions + otv_{GPOS|GSUB|GDEF|JSTF|MATH}_validate(). + +2009-07-31 suzuki toshiya + + cache: Insert explict casts for LP64 systems. + + * src/cache/ftcbasic.c (FTC_ImageCache_Lookup, + FTC_SBitCache_Lookup): The type of FTC_ImageType->width + is FT_Int, so the cast to unsigned larger type FT_ULong + is introduced for the comparisons with 0x10000L for + LP64 platform. + +2009-07-31 suzuki toshiya + + cache: Fix some data types mismatching with their sources. + + * src/cache/ftccache.h: The type of return value + by FTC_Node_WeightFunc function is changed to + FT_Offset. The type of FTC_CacheClass->cache_size + is changed to FT_Offset, too. + + * src/cache/ftccback.h (ft_inode_weight, + ftc_snode_weight): Ditto. + + * src/cache/ftccmap.c (ftc_cmap_node_weight): Ditto. + + * src/cache/ftcimage.c (ftc_inode_weight, + FTC_INode_Weight): Ditto. + + * src/cache/ftcsbits.c (ftc_snode_weight, + FTC_SNode_Weight): Ditto. + + * src/cache/ftcmru.h: The type of + FTC_MruListClass->node_size is changed to FT_Offset, + because it is passed to FT_ALLOC() to specify the + size of buffer. + +2009-07-31 suzuki toshiya + + XXX_cmap_encoding_char_next() return FT_UInt32 values. + + * include/freetype/internal/services/svpscmap.h: + The size of the charcode value returned by + the function typed PS_Unicodes_CharNextFunc is + matched with its input charcode value. + + * src/cff/cffmap.c (cff_cmap_encoding_char_next, + cff_cmap_unicode_char_next): Ditto. + + * src/pfr/pfrmap.c (pfr_cmap_encoding_char_next): + Ditto. + + * src/psaux/t1cmap.c (t1_cmap_std_char_next, + t1_cmap_custom_char_next, t1_cmap_unicode_char_next): + Ditto. + + * src/psnames/psmodule.c (ps_unicodes_char_next): + Ditto. + + * src/winfonts/winfnt.c (fnt_cmap_char_next): + Ditto. + + * src/sfnt/ttcmap.c (tt_cmap0_char_next, + tt_cmap2_char_next, tt_cmap4_char_next, + tt_cmap6_char_next, tt_cmap10_char_next, + tt_cmap12_char_next, tt_cmap13_char_next): Ditto. + (tt_cmap14_char_variants): Handle base unicode + codepoint by FT_UInt32 variable to avoid overflow + on 16-bit platforms. + (tt_cmap14_ensure): The type of `num_results' is + extend to FT_UInt32, to cover unsigned 32-bit + `numVarSelectorRecords' in cmap14 table header. + +2009-07-31 suzuki toshiya + + truetype: Extend TT_Face->num_locations for broken TTFs. + + * include/freetype/internal/tttypes.h: + TT_Face->num_locations are extended from FT_UInt + to FT_ULong, to stand with broken huge loca table. + Some people insists there are broken TTF including + the glyphs over 16-bit limitation, in PRC market. + * src/truetype/ttpload.c (tt_face_load_loca): + Remove unrequired 16-bit truncation for FT_UInt + TT_Face->num_locations. + +2009-07-31 suzuki toshiya + + smooth: Fix some data types mismatching with their sources. + + * src/smooth/ftgrays.c: The type of `TCoord' is + matched to `TPos', because they are mixed in + gray_set_cell(). The type of TCell->x is extended + to `TPos', because gray_find_cell() sets it by + TWorker.ex. The type of TCell->cover is extended + to `TCoord', because gray_render_scanline() adds + TCoord value to it. The type of TWork.cover is matched + with TCell->cover. The types of + TWork.{max_cells,num_cells} are changed to FT_PtrDist, + because they are calculated from the memory addresses. + The type of TWork.ycount is changed to TPos, because + it is calculated from TPos variables. + (gray_find_cell): The type of `x' is matched with + its initial value ras.ex. + (gray_render_scanline): The types of `mod', `lift' + and `rem' are changed to TCoord, because their values + are set with explicit casts to TCoord. When ras.area + is updated by the differential values including + `delta', they are explicitly cast to TArea, because + the type of `delta' is not TArea but TCoord. + (gray_render_line): The type of `mod' is extended + from int to TCoord, because (TCoord)dy is added to mod. + (gray_hline): The argument `acount' is extended to + TCoord, to match with the parameters in the callers. + +2009-07-31 suzuki toshiya + + cff: Fix some data types mismatching with their sources. + + * src/cff/cffobjs.c (cff_face_init): The type of + `scaling' is matched with the scaling parameter + in FT_Matrix_Multiply_Scaled() and + FT_Vector_Transform_Scaled(). + + * src/cff/cffparse.c (cff_parse_real): The type of + `power_ten', `scaling', `exponent_add', + `integer_length', `fraction_length', + `new_fraction_length' and `shift' are matched with + the type of `exponent' to avoid unexpected truncation. + (cff_parse_fixed_scaled): The type of `scaling' is + matched with the `scaling' argument to + cff_parse_real(). + (cff_parse_fixed_dynamic): Ditto. + (cff_parse_font_matrix): The type of `scaling' is + matched with the `scaling' argument to + cff_parse_dynamic(). + +2009-07-31 suzuki toshiya + + autofit: Fix some data types mismatching with their sources. + + * src/autofit/afglobal.c: Correct the type of + AF_FaceGlobalsRec.glyph_count to match with + FT_Face->num_glyphs. + (af_face_globals_compute_script_coverage): + Insert explicit cast to compare + FT_Long AF_FaceGlobalsRec.glyph_count versus + FT_UInt gindex. The type of `nn' is changed + to scan glyph index upto AF_FaceGlobalsRec.glyph_count. + (af_face_globals_get_metrics): The type of `script_max' + is changed to cover size_t value. Insert explicit cast + to compare FT_Long AF_FaceGlobalsRec.glyph_count versus + FT_UInt gindex. + + * src/autofit/afhints.c (af_axis_hints_new_segment): + Insert explicit cast to calculate `big_max' from + integer and size_t values. + (af_axis_hints_new_edge): Ditto. + + * src/autofit/aflatin.c (af_latin_metrics_init_blues): + The type of `best_y' is matched to FT_Vector.y. + (af_latin_compute_stem_width): The type of `delta' is + matched to `dist' and `org_dist'. + +2009-07-31 suzuki toshiya + + autofit: Count the size of the memory object by ptrdiff_t. + + * src/autofit/afcjk.c (af_cjk_hint_edges): The + number of edges `n_edges' should be counted by + FT_PtrDist variable instead of FT_Int. + + * src/autofit/aflatin.c (af_latin_hint_edges): + Ditto. + + * src/autofit/aftypes.h: In AF_ScriptClassRec, + the size of metric `script_metrics_size' should + be counted by FT_Offset variable instead of FT_UInt. + + * src/autofit/afhints.c + (af_glyph_hints_align_strong_points): The cursors + for the edges `min', `max', `mid' in the memory + buffer should be typed FT_PtrDist. + +2009-07-31 suzuki toshiya + + autofit: Fix for unused variable `first'. + + * src/autofit/afhints.c (af_glyph_hints_reload): Insert + FT_UNUSED() to hide the unused variable warning. + +2009-07-31 suzuki toshiya + + Improve bitmap size or pixel variables for 16-bit systems. + + * include/freetype/config/ftstdlib.h: Introduce + FT_INT_MIN, to use in signed integer overflow in + 16-bit and 64-bit platforms. + + * include/freetype/internal/fttrace.h: Add a tracer + to ftsynth.c. + + * src/base/ftbitmap.c (FT_Bitmap_Embolden): Check + invalid strength causing integer overflow on 16-bit + platform. + + * src/base/ftcalc.c (ft_corner_orientation): Change + the internal calculation from FT_Int to FT_Long, to + avoid an overflow on 16-bit platforms. The caller of + this function should use only the sign of result, + so the cast to FT_Int is acceptable. + + * src/base/ftsynth.c: Introduce a tracer for synth module. + (FT_GlyphSlot_Embolden): Check invalid strength causing + integer overflow on 16-bit platform. + + * src/bdf/bdfdrivr.c (BDF_Face_Init): The glyph index + in FT2 API is typed as FT_UInt, although BDF driver + can handle unsigned long glyph index internally. To + avoid integer overflow on 16-bit platform, too large + glyph index should be excluded. + (BDF_Glyph_Load): The glyph pitch in FT2 is typed as + FT_UInt, although BDF driver can handle unsigned long + glyph pitch internally. To avoid integer overflow on + 16-bit platform, too large glyph pitch should not be + returned. + + * src/pfr/pfrsbit.c (pfr_slot_load_bitmap): The glyph + pitch in FT2 is typed as FT_UInt, although PFR font + format can include huge bitmap glyph with 24-bit pitch + (however, a glyph spends 16.7 pixel, it's not realistic). + To avoid integer overflow on 16-bit platform, huge + bitmap glyph should be excluded. + + * src/smooth/ftgrays.c (gray_hline): As FT_Span.x is + truncated to fit its type (16-bit short), FT_Span.y + should be truncated to fit its type (FT_Int). + + * src/cff/cffdrivr.c (cff_get_ros): CFF specification + defines the supplement in ROS as a real number. + Truncate it to fit public FT2 API. + + * src/cff/cffparse.c (cff_parse_cid_ros): Warn the + supplement if it is truncated or rounded in cff_get_ros(). + + * src/cff/cfftypes.h: Change the type of internal variable + `supplement' from FT_Long to FT_ULong to fit the signedness + to the type in public API. + +2009-07-31 suzuki toshiya + + psaux: Prevent invalid arguments to afm_parser_read_vals(). + + * src/psaux/afmparse.c (afm_parser_read_vals): Change + the type of `n' to prevent negative number how many + arguments should be parsed. + + * src/psaux/afmparse.h (afm_parser_read_vals): Ditto. + +2009-07-31 suzuki toshiya + + base: Prevent some overflows on LP64 systems. + + * src/base/ftadvance.c (FT_Get_Advances): Cast the + unsigned long constant FT_LOAD_ADVANCE_ONLY to FT_UInt32 + for LP64 platforms. + + * src/base/ftcalc.c (FT_Sqrt32): All internal variables + are changed to FT_UInt32 from FT_ULong. + (FT_MulDiv): Insert casts to FT_Int32 for LP64 platforms. + This function is designed for 32-bit integer, although + their arguments and return value are FT_Long. + + * src/base/ftobjs.c (FT_Get_Char_Index): Check `charcode' + is within unsigned 32-bit integer for LP64 platforms. + (FT_Face_GetCharVariantIndex): Check `charcode' and + `variantSelector' are within 32-bit integer for LP64 + platforms. + (FT_Face_GetCharsOfVariant): Check `variantSelector' is + within unsigned 32-bit integer for LP64 platforms. + + * src/base/fttrigon.c (ft_trig_downscale): The FT_Fixed + variable `val' and unsigned long constant FT_TRIG_SCALE + are cast to FT_UInt32, when calculates FT_UInt32. + (FT_Vector_Rotate): The long constant 1L is cast to + FT_Int32 to calculate FT_Int32 `half'. + +2009-07-31 suzuki toshiya + + cff: Cast the long variables to 32-bit for LP64 systems. + + * src/cff/cffdrivr.c (cff_get_advances): Insert + explicit cast to modify a 32-bit flag by unsigned + long constant. + + * src/cff/cffobjs.c (cff_face_init): Ditto. + + * src/cff/cffgload.c (cff_decoder_parse_charstrings): + Replace the casts to FT_Long by the casts to FT_Int32 + for LP64 platforms. + +2009-07-31 suzuki toshiya + + pcf: Improve PCF_PropertyRec.value names on LP64 platforms. + + * src/pcf/pcf.h: In PCF_PropertyRec.value, the member + `integer' is replaced by `l', `cardinal' is replaced + by `ul', to fix the difference between the name and + the types on LP64 platforms. + + * src/pcf/pcfdrivr.c (pcf_get_bdf_property): Reflect + PCF_PropertyRec.value change, with appropriate casts + to FT_Int32/FT_UInt32. Their destinations + BDF_PropertyRec.{integer|cardinal} are public and + explicitly defined as FT_Int32/FT_UInt32. + + * src/pcf/pcfread.c (pcf_get_properties, pcf_load_font): + Reflect PCF_PropertyRec.value change. + +2009-07-31 suzuki toshiya + + pcf: Fix some data types mismatching with their sources. + + * src/pcf/pcfdrivr.c (pcf_cmap_char_index): The type of + `code' is matched to PCF_Encoding->enc. + (pcf_cmap_char_next): The type of `charcode' is matched + to PCF_Encoding->enc. When *acharcode is set by charcode, + an overflow is checked and cast to unsigned 32-bit + integer. + +2009-07-31 suzuki toshiya + + bdf: Improve bdf_property_t.value names for LP64 platforms. + + * src/bdf/bdf.h: In bdf_property_t.value, the member + `int32' is replaced by `l', `card32' is replaced by + `ul', to fix the difference between the name and the + types on LP64 platforms. + + * src/bdf/bdfdrivr.c (BDF_Face_Init): Reflect + bdf_property_t.value change. + (bdf_get_bdf_property): Reflect bdf_property_t.value + change, with appropriate casts to FT_Int32/FT_UInt32. + Their destinations BDF_PropertyRec.{integer|cardinal} + are public and explicitly defined as FT_Int32/FT_UInt32. + + * src/bdf/bdflib.c (_bdf_add_property): Reflect + bdf_property_t.value change. + +2009-07-31 suzuki toshiya + + bdf: Fix some data types mismatching with their sources. + + * src/bdf/bdrdrivr.c (bdf_cmap_char_index): The type + of `code' is matched with BDF_encoding_el->enc. + (bdf_cmap_char_next): The type of `charcode' is + matched with BDF_encoding_el->enc. When *acharcode + is set by charcode, an overflow is checked and + cast to unsigned 32-bit integer. + +2009-07-31 suzuki toshiya + + autofit: Improve Unicode range definitions. + + * src/autofit/aftypes.h (AF_UNIRANGE_REC): New macro + to declare a range by two unsigned 32-bit integer, + to avoid 64-bit range definition on LP64 platforms. + + * src/autofit/aflatin.c (af_latin_uniranges): Ditto. + + * src/autofit/aflatin2.c (af_latin2_uniranges): Ditto. + + * src/autofit/afindic.c (af_indic_uniranges): Ditto. + + * src/autofit/afcjk.c (af_cjk_uniranges): Declare + the ranges by AF_UNIRANGE_REC. + +2009-07-31 suzuki toshiya + + smooth: Fix a data type mismatching with its source. + + * src/smooth/ftgrays.c (gray_sweep): The type of + `area' is matched with the 3rd argument `area' + of gray_hline(). + +2009-07-31 suzuki toshiya + + smooth: Fix a data type mismatching with its source. + + * src/smooth/ftgrays.c (gray_render_line): The type + of `area' is matched with TWorker.area. + +2009-07-31 suzuki toshiya + + cache: Disable the legacy compatibility if 16-bit system. + + * src/cache/ftcbasic.c (FTC_ImageCache_Lookup): Exclude + the legacy behaviour from 16-bit platform, because the + current hack cannot detect the caller uses this function + via legacy convension. + (FTC_SBitCache_Lookup): Ditto. + +2009-07-31 suzuki toshiya + + cache: Check 32-bit glyph index on 16-bit systems. + + * src/cache/ftcbasic.c (ftc_basic_family_get_count): + Check overflow caused by the face including large + number of glyphs > 64k. + +2009-07-31 suzuki toshiya + + cache: Fix some data types mismatching with their sources. + + * src/cache/ftccache.c (ftc_cache_resize): The types of + `p', `mask', `count' are matched with FTC_Cache->{p,mask}. + (FTC_Cache_Clear): The type of `old_index' is matched to + FTC_Cache->{p,mask}. + + * src/cache/ftccache.h (FTC_CACHE_LOOKUP_CMP): The type + of `_idx' is matched with FTC_Cache->{p,mask}. + +2009-07-31 suzuki toshiya + + cache: Fix some data types mismatching with their sources. + + * src/cache/ftcsbits.c (ftc_snode_load): The types + of `xadvance' and `yadvance' are matched with + FT_GlyphSlot->advance.{x|y}. + +2009-07-31 suzuki toshiya + + cache: Cast NULL to a required function type explicitly. + + * src/cache/ftcmanag.c (FTC_Manager_RemoveFaceID): + Insert explicit cast from NULL to function type. + +2009-07-31 suzuki toshiya + + fttypes.h: Cast FT_MAKE_TAG output to FT_Tag exlicitly. + + * include/freetype/fttypes.h (FT_MAKE_TAG): + Cast the result to FT_Tag. + +2009-07-31 suzuki toshiya + + psnames: Handle Unicode codepoints by FT_UInt32 variables. + + * src/psnames/psmodule.c (BASE_GLYPH): Cast the result + to unsigned 32-bit integer for LP64 platform. + (ps_unicode_value): Return the value by unsigned 32-bit + integer instead of unsigned long. + +2009-07-31 suzuki toshiya + + psaux: Use size_t variable to pass the buffer size. + + * src/psaux/psaux.h (to_bytes): The type of `max_bytes' + (the argument to pass the buffer size) is changed to + size_t, to match with ANSI C string functions. + + * src/psaux/psconv.h (PS_Conv_StringDecode, + PS_Conv_ASCIIHexDecode, PS_Conv_EexecDecode): Ditto. + + * src/psaux/psconv.c (PS_Conv_StringDecode, + PS_Conv_ASCIIHexDecode, PS_Conv_EexecDecode): Ditto. + + * src/psaux/psobjs.h (ps_parser_to_bytes): Ditto. + + * src/psaux/psobjs.c (ps_parser_to_bytes): Ditto. + +2009-07-31 suzuki toshiya + + type1: Use size_t variable to pass the string length. + + * psaux.h: The type of `len' (the argument to pass + the buffer size to the function in AFM_ParserRec) + is changed to size_t, to match with ANSI C string + functions. + + * t1afm.c (t1_get_index): Ditto. + + * test_afm.c (dummy_get_index): Ditto. + + * afmparse.c (afm_parser_read_vals): To call + AFM_ParserRec.get_index, the length of token + `len' is cast to size_t. + +2009-07-31 suzuki toshiya + + cid: Fix some data types mismatching with their sources. + + * src/cid/cidparse.c (cid_parser_new): The types of + `read_len' and `stream_len' are matched to + FT_Stream->size. Unrequired cast is removed. + +2009-07-31 suzuki toshiya + + cff: Fix for unused variable `rest'. + + * src/cff/cffparse.c (cff_parse_real): Insert + FT_UNUSED() to hide the unused variable warning. + +2009-07-31 suzuki toshiya + + cff: Fix some data types mismatching with their sources. + + * src/cff/cffgload.c (cff_slot_load): The types of + `top_upm' and `sub_upm' are matched with + CFF_FontRecDict->units_per_em. + + * src/cff/cffobjs.c (cff_size_select): Ditto. + (cff_size_request): Ditto. + +2009-07-31 suzuki toshiya + + bdf: Fix some data types mismatching with their sources. + + * bdflib.c (_bdf_list_ensure): The type of `num_items' + is matched with _bdf_list_t.used. Also the types of + `oldsize', `newsize', `bigsize' are matched too. + (_bdf_readstream): `cursor' is used as an offset to + the pointer, it should be typed as FT_Offset. Also + the types of `bytes', `start', `end', `avail' are matched. + + * bdfdrivr.c: The type of BDF_CMap->num_encodings is + matched with FT_CMap->clazz->size. + (bdf_cmap_char_index): The types of `min', `max', `mid' + are matched with BDF_CMap->num_encodings. The type of + `result' is matched with encoding->glyph. + (bdf_cmap_char_next): Ditto, the type of `code' is + matched with BDF_encoding_el.enc. + (bdf_interpret_style): The type of `lengths' is changed + to size_t, to take the value by ft_strlen(). Also the + types of `len', `nn', `mm' are matched. + +2009-07-31 suzuki toshiya + + sfnt: Count the size of the memory object by ptrdiff_t. + + * src/sfnt/ttbdf.c (tt_face_find_bdf_prop): The type of + `peroperty_len' is changed from FT_UInt to FT_Offset, + to match with size_t, which is appropriate type for the + object in the memory buffer. + +2009-07-31 suzuki toshiya + + lzw: Count the size of the memory object by ptrdiff_t. + + * src/lzw/ftzopen.h: The types of FT_LzwState->{buf_total, + stack_size} are changed from FT_UInt to FT_Offset, to match + with size_t, which is appropriate type for the object in + the memory buffer. + + * src/lzw/ftzopen.c (ft_lzwstate_stack_grow): The types of + `old_size' and `new_size' are changed from FT_UInt to + FT_Offset, to match with size_t, which is appropriate type + for the object in the memory buffer. + +2009-07-31 suzuki toshiya + + otvalid: Count the table size on memory by ptrdiff_t. + + * src/otvalid/otvgpos.c (otv_ValueRecord_validate): + Change the type of table size from FT_UInt to + FT_PtrDist because it is calculated by the memory + addresses. + +2009-07-31 suzuki toshiya + + otvalid: Prevent an overflow by GPOS/GSUB 32b-bit offset. + + * src/otvalid/otvgpos.c (otv_ExtensionPos_validate): + Extend ExtensionOffset from FT_UInt to FT_ULong, to + cover 32-bit offset on 16-bit platform. + + * src/otvalid/otvgsub.c (otv_ExtensionSubst_validate): + Ditto. + +2009-07-31 suzuki toshiya + + ftobjs.c: Prevent an overflow in glyph index handling. + + * src/base/ftobjs.c (FT_Face_GetCharsOfVariant): + Improve the cast in comparison to avoid the truncation. + +2009-07-31 suzuki toshiya + + Improve the variable types in raccess_make_file_name(). + + * src/base/ftrfork.c (raccess_make_file_name): + Change the type of cursor variable `tmp' to const char*, + to prevent the unexpected modification of original pathname. + (raccess_make_file_name): Change the type of new_length + to size_t. + +2009-07-31 suzuki toshiya + + ftpatent.c: Fix for unused variable `error'. + + * src/base/ftpatent.c (_tt_check_patents_in_range): + Fix warning for unused variable `error'. + +2009-07-31 suzuki toshiya + + type1: Check invalid string longer than PostScript limit. + + * src/type1/t1afm.c (t1_get_index): Check invalid string + which exceeds the limit of PostScript string/name objects. + +2009-07-31 suzuki toshiya + + gzip: Use FT2 zcalloc() & zfree() in ftgzip.c by default. + + * src/gzip/ftgzip.c (zcalloc, zcfree): Disable all + zcalloc() & zfree() by zlib in zutil.c, those in + ftgzip.c by FT2 are enabled by default. To use + zlib zcalloc() & zfree(), define USE_ZLIB_ZCALLOC. + See discussion: + http://lists.gnu.org/archive/html/freetype-devel/2009-02/msg00000.html + +2009-07-31 suzuki toshiya + + gzip: Distinguish PureC from TurboC on MSDOS. + + * src/gzip/zutil.c (zcalloc, zcfree): Enable only for + MSDOS platform. + +2009-07-31 suzuki toshiya + + gxvalid: Insert PureC pragma to allow unevaluated variables. + + * builds/atari/ATARI.H: Insert PureC pragma not to + warn against set-but-unevaluated variable in gxvalid + module. + +2009-07-31 suzuki toshiya + + gxvalid: Pass the union by the pointer instead of the value. + + * src/gxvalid/gxvcommn.h: + - Declare new type `GXV_LookupValueCPtr'. + - Update the type of the 2nd argument to pass GXV_LookupValueDesc + data to the function prototyped as GXV_Lookup_Value_Validate_Func, + from GXV_LookupValueDesc to GXV_LookupValueCPtr. + - Likewise for the function prototyped as + GXV_Lookup_Fmt4_Transit_Func. + + - Declare new type `GXV_StateTable_GlyphOffsetCPtr'. + - Update the type of the 3rd argument to pass + GXV_StateTable_GlyphOffsetDesc data to the function prototyped + as GXV_StateTable_Entry_Validate_Func, from + GXV_StateTable_GlyphOffsetDesc to GXV_StateTable_GlyphOffsetCPtr. + + - Declare new type `GXV_XStateTable_GlyphOffsetCPtr'. + - Update the type of the 3rd argument to pass + GXV_XStateTable_GlyphOffsetDesc data to the function prototyped + as GXV_XStateTable_Entry_Validate_Func, + from GXV_XStateTable_GlyphOffsetDesc + to GXV_XStateTable_GlyphOffsetCPtr. + + * src/gxvalid/gxvcommn.c (gxv_LookupTable_fmt0_validate, + gxv_XClassTable_lookupval_validate, + gxv_XClassTable_lookupfmt4_transit): + Update from GXV_LookupValueDesc to GXV_LookupValueCPtr. + + * src/gxvalid/gxvbsln.c (gxv_bsln_LookupValue_validate, + gxv_bsln_LookupFmt4_transit): Ditto. + + * src/gxvalid/gxvjust.c + (gxv_just_pcTable_LookupValue_entry_validate, + gxv_just_classTable_entry_validate, + gxv_just_wdcTable_LookupValue_validate): Ditto. + + * src/gxvalid/gxvkern.c + (gxv_kern_subtable_fmt1_entry_validate): Ditto. + + * src/gxvalid/gxvlcar.c (gxv_lcar_LookupValue_validate, + gxv_lcar_LookupFmt4_transit): Ditto. + + * src/gxvalid/gxvopbd.c (gxv_opbd_LookupValue_validate, + gxv_opbd_LookupFmt4_transit): Ditto. + + * src/gxvalid/gxvprop.c (gxv_prop_LookupValue_validate, + gxv_prop_LookupFmt4_transit): Ditto. + + * src/gxvalid/gxvmort4.c + (gxv_mort_subtable_type4_lookupval_validate): Ditto. + + * src/gxvalid/gxvmort0.c + (gxv_mort_subtable_type0_entry_validate): Update + from GXV_StateTable_GlyphOffsetDesc + to GXV_StateTable_GlyphOffsetCPtr. + + * src/gxvalid/gxvmort1.c + (gxv_mort_subtable_type1_entry_validate): Ditto. + + * src/gxvalid/gxvmort2.c + (gxv_mort_subtable_type2_entry_validate): Ditto. + + * src/gxvalid/gxvmort5.c + (gxv_mort_subtable_type5_entry_validate): Ditto. + + * src/gxvalid/gxvmorx2.c + (gxv_morx_subtable_type2_entry_validate): Ditto. + + * src/gxvalid/gxvmorx5.c + (gxv_morx_subtable_type5_entry_validate): Ditto. + + * src/gxvalid/gxvmorx1.c + (gxv_morx_subtable_type1_entry_validate): Ditto. + (gxv_morx_subtable_type1_LookupValue_validate, + gxv_morx_subtable_type1_LookupFmt4_transit): + Update from GXV_LookupValueDesc to GXV_LookupValueCPtr. + + * src/gxvalid/gxvmorx0.c + (gxv_morx_subtable_type0_entry_validate): Update + from GXV_XStateTable_GlyphOffsetDesc + to GXV_XStateTable_GlyphOffsetCPtr. + +2009-07-29 Fabrice Bellet + + Fix Redhat bugzilla #513582 and Savannah bug #26849. + + * src/cache/ftccache.h (FTC_CACHE_LOOKUP_CMP) : Fix + aliasing bug. + +2009-07-19 Werner Lemberg + + Document recent library changes. + + * docs/CHANGES: Do it. + +2009-07-17 Werner Lemberg + + Fix Savannah bug #23786. + + * src/truetype/ttobjs.c (tt_size_init_bytecode): Don't reset x_ppem + and y_ppem. Otherwise the `*_CVT_Stretched' functions in ttinterp.c + get never called. + An anonymous guy suggested this change on Savannah, and it seems to + be the right solution. + +2009-07-15 Werner Lemberg + + * docs/release: Updated. + +2009-07-15 Werner Lemberg + + README.CVS -> README.git + + * README.CVS: Renamed to... + * README.git: This. + Updated. + +2009-07-15 suzuki toshiya + + Borland C++ compiler patch proposed by Mirco Babin. + http://lists.gnu.org/archive/html/freetype/2009-07/msg00016.html. + + * builds/exports.mk: Delete unused flags, CCexe_{CFLAGS,LDFLAGS}. + Fix APINAMES_C and APINAMES_EXE pathnames to reflect the platform + specific pathname syntax. + * builds/compiler/bcc.mk: Remove unused flag, CCexe_LDFLAGS. + Define TE = `-e' separately (bcc32 cannot specify the pathname of + binary executable by T = `-o'). + Extend the large page size in linking freetype.lib. + Add extra CLEAN target to delete bcc specific temporary files. + * builds/compiler/bcc-dev.mk: Ditto. + +2009-07-14 Werner Lemberg + + Fix Savannah bug #27026. + + * builds/win32/vc2005/freetype.sln: Use correct version number. + +2009-07-12 suzuki toshiya + + Add a script to check the undefined and unused trace macros. + + * src/tools/chktrcmp.py: A script to check trace_XXXX macros + that are used in C source but undefined in fttrace.h, or + defined in fttrace.h but unused in C sources. See + http://lists.gnu.org/archive/html/freetype-devel/2009-07/msg00013.html. + * docs/DEBUG: Mention on chktrcmp.py. + * docs/release: Ditto. + +2009-07-09 Werner Lemberg + + [ftraster] Make it compile again with -D_STANDALONE_. + + * src/raster/ftraster.c [_STANDALONE_]: Define + FT_CONFIG_STANDARD_LIBRARY_H. + Include `string.h'. + Don't include `rastpic.h'. + Define FT_DEFINE_RASTER_FUNCS. + +2009-07-09 suzuki toshiya + + smooth: Check glyph size by width/height, instead of pitch/height. + Suggested by der Mouse . + + * src/smooth/ftsmooth.c (ft_smooth_render_generic): Improve + the check for too large glyph. Replace the pair of `pitch' and + `height' by the pair of `width' and `height'. `pitch' cannot + be greater than `height'. The required is checking the product + `pitch' * `height' <= FT_ULONG_MAX, but we use cheap checks for + the realistic case only. + +2009-07-09 suzuki toshiya + + Register 2 missing trace components, t1afm and ttbdf. + + * include/freetype/internal/fttrace.h: Add FT_TRACE_DEF( t1afm ) + and FT_TRACE_DEF( ttbdf ). See + http://lists.gnu.org/archive/html/freetype-devel/2009-07/msg00013.html + +2009-07-09 suzuki toshiya + + Register a trace component for ftgloadr.c. + + * include/freetype/internal/fttrace.h: Add FT_TRACE_DEF( gloader ). + The macro `trace_gloader' was already used in the initial version + on 2002-02-24. + +2009-07-08 suzuki toshiya + + Prevent the overflows by a glyph with too many points or contours. + The bug is reported by Boris Letocha . See + http://lists.gnu.org/archive/html/freetype-devel/2009-06/msg00031.html + http://lists.gnu.org/archive/html/freetype-devel/2009-07/msg00002.html + + * include/freetype/ftimage.h (FT_OUTLINE_CONTOURS_MAX, + FT_OUTLINE_POINTS_MAX): New macros to declare the maximum + values of FT_Outline.{n_contours,n_points}. + * src/base/ftgloadr.c (FT_GlyphLoader_CheckPoints): Check the + total numbers of points and contours cause no overflows in + FT_Outline.{n_contours,n_points}. + + * include/freetype/internal/ftgloadr.h (FT_GLYPHLOADER_CHECK_P, + FT_GLYPHLOADER_CHECK_C): Compare the numbers of points and + contours as unsigned long number, instead of signed int, to + prevent the overflows on 16-bit systems. + +2009-07-05 Bram Tassyns + + Improve compatibility to Acroread. + This fixes Savannah bug #26944. + + * src/cff/cffload.c (cff_charset_compute_cids): For multiple GID to + single CID mappings, make the lowest value win. + +2009-06-28 suzuki toshiya + + ftpatent: Fix a bug by wrong usage of service->table_info(). + http://lists.gnu.org/archive/html/freetype-devel/2008-12/msg00039.html + + * include/freetype/internal/services/svsfnt.h: Extend + FT_SFNT_TableInfoFunc() to take new argument to obtain the offset + to the specified table. + * src/sfnt/sfdriver.c (sfnt_table_info): Extend to return the + table-offset to the caller function. + * src/base/ftpatent.c (_tt_check_patents_in_table): Use new + service->table_info(). + * src/base/ftobjs.c (FT_Sfnt_Table_Info): Synchronize to new + service->table_info(). + +2009-06-28 Werner Lemberg + + [psaux, cff] Protect against nested `seac' calls. + + * include/freetype/internal/psaux.h (T1_Decoder), src/cff/cffgload.h + (CFF_Decoder): Add `seac' boolean variable. + + * src/cff/cffgload.c (cff_operator_seac), src/psaux/t1decode.c + (t1operator_seac): Use it. + +2009-06-28 Werner Lemberg + + Thinko. + + * src/psaux/t1decode.c (t1operator_seac) + [FT_CONFIG_OPTION_INCREMENTAL]: Test for existence of incremental + interface. + +2009-06-28 Werner Lemberg + + * devel/ftoption.h [FT_CONFIG_OPTION_INCREMENTAL]: Define. + +2009-06-27 suzuki toshiya + + Add tools to preprocess the source files for AtariST PureC. + + * builds/atari/deflinejoiner.awk: New file to filter C source files + for broken C preprocessor of PureC compiler. + + * builds/atari/gen-purec-patch.sh: New file to generate a patch set + for PureC, by using deflinejoiner.awk. + +2009-06-27 suzuki toshiya + + Keep existing modules.cfg in the building tree. + + * configure: If `configure' is executed outside of the source tree, + an existing `modules.cfg' file in the build directory should be + kept, not overwritten by the version in the source tree. + +2009-06-27 suzuki toshiya + + Filter --srcdir= option before invoking builds/unix/configure. + + * configure: If builds/unix/configure is invoked with --srcdir + option, the option should take `builds/unix' directory instead of + the top source directory. Thus the configure script in the top + directory should modify the --srcdir= option if + `builds/unix/configure' is invoked. + +2009-06-27 suzuki toshiya + + Improve configure.raw for cross-building on exe-suffixed systems. + + * builds/unix/configure.raw: Fix a bug in sed script to extract + native suffix for binary executables, patch by Peter Breitenlohner. + http://lists.gnu.org/archive/html/freetype-devel/2009-04/msg00036.html + +2009-06-26 Werner Lemberg + + [truetype] Remove TT_SubGlyphRec. + + * src/truetype/ttobjs.h (TT_SubGlyphRec): Removed, unused. + +2009-06-26 Werner Lemberg + + * */*: For warning messages, replace FT_ERROR with FT_TRACE0. + + FT_ERROR is now used only if a function produces a non-zero `error' + value. + + Formatting, improving and harmonizing debug strings. + +2009-06-25 Werner Lemberg + + Provide version information better. + + * src/base/ftinit.c (FT_Init_FreeType): Don't set version here + but... + * src/base/ftobjs.c (FT_New_Library): Here. + +2009-06-22 Werner Lemberg + + Use 16.16 format while parsing Type 1 charstrings. + This fixes Savannah bug #26867. + + Previously, only integers have been used which can lead to serious + rounding errors. + + However, fractional values are only used internally; after the + charstrings (of either Type 1 or 2) have been processed, the + resulting coordinates get rounded to integers currently -- before + applying scaling. This should be fixed; at the same time a new load + flag should be introduced, to be used in combination with + FT_LOAD_NO_SCALE, which indicates that font units are returned in + 16.16 format. Similarly, the incremental interface should be + extended to allow fractional values for metrics. + + * include/freetype/internal/psaux.h (T1_BuilderRec): Remove `shift' + field. + * include/freetype/internal/pshints.h (T1_Hints_SetStemFunc, + T1_Hints_SetStem3Func): Use FT_Fixed for coordinates. + + * src/psaux/psobjs.c: Include FT_INTERNAL_CALC_H. + (t1_build_add_point): Always convert fixed to integer. + * src/psaux/t1decode.c (t1_decoder_parse_charstrings): + Use 16.16 format everywhere (except for large integers followed by a + `div'). + [CAN_HANDLE_NON_INTEGRAL_T1_OPERANDS]: Remove #ifdef and activate + code uncoditionally. + Add support for random numbers and update remaining code + accordingly; this should work now. + (t1_operator_seac): Updated. + * src/psaux/pshrec.c: Include FT_INTERNAL_CALC_H. + (ps_hints_t1stem3, t1_hints_stem): Updated. + + * src/cid/cidgload.c: Include FT_INTERNAL_CALC_H. + (cid_load_glyph) [FT_CONFIG_OPTION_INCREMENTAL], + (cid_face_compute_max_advance, cid_slot_load_glyph): Updated. + + * src/type1/t1gload.c (T1_Parse_Glyph_And_Get_Char_String) + [FT_CONFIG_OPTION_INCREMENTAL], (T1_Get_Advances, T1_Load_Glyph): + Updated. + * src/type1/t1load.c: Include FT_INTERNAL_CALC_H. + * src/type1/t1objs.c (T1_Face_Init): Updated. + +2009-06-21 Werner Lemberg + + * src/pshinter/pshrec.c: Use PSH_Err_Ok. + +2009-06-21 Werner Lemberg + + Code beautification. + + * src/type1/t1load.c (FT_INT_TO_FIXED): Removed. + Replace everywhere with INT_TO_FIXED. + (FT_FIXED_TO_INT): Move to ... + * include/freetype/internal/ftcalc.h (FIXED_TO_INT): Here. + Update all users. + +2009-06-20 Werner Lemberg + + Remove unused variables. + + * include/freetype/internal/psaux.h (T1_BuilderRec), + src/cff/cffgload.h (CFF_Builder): Remove `last'. + Update all users. + +2009-06-20 Werner Lemberg + + [psaux] Check large integers while parsing charstrings. + + * src/psaux/t1decode.c (t1_decoder_parse_charstrings): Large + integers must be followed by a `div' operator. + +2009-06-20 Werner Lemberg + + [cff] Revert last change. + + * src/cff/cffgload.c (cff_decoder_parse_charstrings): Do it. + Next time, don't confuse Type 2 charstring opcodes with TOP DICT + values... + +2009-06-20 Werner Lemberg + + * src/autofit/aflatin.c (af_latin_metrics_check_digits): Fix + compiler warning. + +2009-06-20 Werner Lemberg + + * builds/compiler/gcc.mk (CFLAGS): Use -O3, not -O6. + +2009-06-19 Werner Lemberg + + [cff] Fix handling of reserved byte 0xFF. + + * src/cff/cffgload.c (cff_decoder_parse_charstrings): Abort if byte + 0xFF is encountered. + +2009-06-19 Werner Lemberg + + Improve debug messages for Type1 charstrings. + + * src/psaux/t1decode.c (t1_decoder_parse_charstrings): Emit newlines + after instructions. + Prettify output. + +2009-06-19 Werner Lemberg + + More ftgray fixes for FT_STATIC_RASTER. + Problems reported by suyu@cooee.cn. + + * src/smooth/ftgrays.c (gray_move_to, gray_raster_render): Use + RAS_VAR. + +2009-06-18 Werner Lemberg + + * docs/CHANGES: Updated. + +2009-06-18 Werner Lemberg + + Fix B/W rasterization of subglyphs with different drop-out modes. + + Normally, the SCANMODE instruction (if present) to set the drop-out + mode in a TrueType font is located in the `prep' table only and thus + valid for all glyphs. However, there are fonts like `pala.ttf' + which additionally contain this instruction in the hinting code of + some glyphs (but not all). As a result it can happen that a + composite glyph needs multiple drop-out modes for its subglyphs + since the rendering state gets reset for each subglyph. + + FreeType collects the hinted outlines from all subglyphs, then it + sends the data to the rasterizer. It also sends the drop-out mode + -- after hinting has been applied -- and here is the error: It sends + the drop-out mode of the last subglyph only; drop-out modes of all + other subglyphs are lost. + + This patch fixes the problem; it adds a second, alternative + mechanism to pass the drop-out mode: For each contour, the + rasterizer now checks the first `tags' array element. If bit 2 is + set, bits 5-7 contain the contour's drop-out mode, overriding the + global drop-out mode. + + * include/freetype/ftimage.h (FT_CURVE_TAG_HAS_SCANMODE): New macro. + + * src/truetype/ttgload.c (TT_Hint_Glyph): Store drop-out mode in + `tags[0]'. + + * src/raster/ftraster.c (Flow_Up, Overshoot_Top, Overshoot_Bottom): + Use bits 3-5 instead of 0-2. + (New_Profile): Set the drop-out mode in the profile's `flags' field. + (Decompose_Curve): Check `tags[0]' and set `dropOutControl' if + necessary. + (Vertical_Sweep_Drop, Horizontal_Sweep_Drop, + Horizontal_Gray_Sweep_Drop, Draw_Sweep): Use the profile's drop-out + mode. + +2009-06-16 Werner Lemberg + + Improve scan conversion rules 4 and 6. + + Two new constraints are introduced to better identify a `stub' -- a + concept which is only vaguely described in the OpenType + specification. The old code was too rigorous and suppressed more + pixel than it should. + + . The intersection of the two profiles with the scanline is less + than a half pixel. Code related to this was already present in + the sources but has been commented out. + + . The endpoint of the original contour forming a profile has a + distance (`overshoot') less than half a pixel to the scanline. + + Note that the two additional conditions fix almost all differences + to the Windows rasterizer, but some problematic cases remain. + + * src/raster/ftraster.c (Overshoot_Top, Overshoot_Bottom): New + macros for the `flags' field in the `TProfile' structure. + (IS_BOTTOM_OVERSHOOT, IS_TOP_OVERSHOOT): New macros. + (New_Profile, End_Profile): Pass overshoot flag as an argument and + set it accordingly. + Update callers. + (Vertical_Sweep_Drop, Horizontal_Sweep_Drop): Implement the two new + constraints. + +2009-06-11 Werner Lemberg + + Increase precision for B/W rasterizer. + + * src/raster/ftraster.c (Set_High_Precision): Add two more bits to + the precision. This corrects rendering of some small glyphs, for + example, glyph `xi' in verdana.ttf at 13 ppem. Testing with ftbench + on my GNU/Linux box I don't see a performance degradation. + +2009-06-08 Michael Zucchi + + Handle FT_STROKER_LINECAP_BUTT. + This fixes Savannah bug #26757. + + * src/base/ftstroke.c (ft_stroker_cap): Implement it. + +2009-06-07 Harald Fernengel + + Fix some potential out-of-memory crashes. + + * src/base/ftobjs.c (ft_glyphslot_done): Check `slot->internal'. + * src/base/ftstream.c (FT_Stream_ReleaseFrame): Check `stream'. + * src/truetype/ttinterp.c (TT_New_Context): Avoid double-free of + `exec' in case of failure. + +2009-06-07 Werner Lemberg + + Simplify math. + Suggested by Alexei Podtelezhnikov . + + * src/raster/ftraster.c (Vertical_Sweep_Drop, Horizontal_Sweep_Drop, + Horizontal_Gray_Sweep_Drop): Do it. + +2009-06-04 Werner Lemberg + + Preparation for fixing scan conversion rules 4 and 6. + + * src/raster/ftraster.c (TFlow): Replace enumeration with... + (Flow_Up): This macro. + (TProfile): Replace `flow' member with `flags' bit field. + Update all affected code. + +2009-05-29 James Cloos + + Enable autohinting for glyphs rotated by multiples of 90°. + + * src/base/ftobjs.c (FT_Load_Glyph): Alter check for permitted + matrices to allow rotations by multiples of 90°, not only unrotated, + possibly slanted matrices. + +2009-05-28 Werner Lemberg + + Remove compiler warning. + Reported by Krzysztof Kowalczyk . + + * src/autofit/aflatin2.c (af_latin2_hint_edges): Move declaration of + `n_edges' into `#if' block. + +2009-05-28 Werner Lemberg + + Make compilation work with FT_CONFIG_OPTION_USE_ZLIB not defined. + Reported by Krzysztof Kowalczyk . + + * src/pcf/pcfdrivr.c (PCF_Face_Init) [!FT_CONFIG_OPTION_USE_ZLIB]: + Make it work. + Simplify #ifdef logic. + +2009-05-22 Werner Lemberg + + Improve b/w rasterizer. + Problem reported by Krzysztof Kotlenga . + + * src/raster/raster.c (Vertical_Sweep_Drop, Horizontal_Sweep_Drop, + Horizontal_Gray_Sweep_Drop): For smart drop-out mode, if + intersections are equally distant relative to next pixel center, + select the left pixel, not the right one. + +2009-05-19 Werner Lemberg + + Fix Savannah bug #26600. + + * src/type42/t42parse.c (t42_load_keyword): Handle + T1_FIELD_LOCATION_FONT_EXTRA. + +2009-04-30 Werner Lemberg + + Document recent changes to ftview. + + * docs/CHANGES: Do it. + +2009-04-27 Werner Lemberg + + autohinter: Don't change digit widths if all widths are the same. + This fixes FreeDesktop bug #21197. + + * src/autofit/afglobal.c (AF_DIGIT): New macro. + (af_face_globals_compute_script_coverage): Mark ASCII digits in + `glyph_scripts' array. + (af_face_globals_get_metrics): Updated. + (af_face_globals_is_digit): New function. + * src/autofit/afglobal.h: Updated. + (AF_ScriptMetricsRec): Add `digits_have_same_width' flag. + + * src/autofit/aflatin.c: Include FT_ADVANCES_H. + (af_latin_metrics_check_digits): New function. + (af_latin_metrics_init): Use it. + * src/autofit/aflatin.h: Updated. + * src/autofit/afcjk.c (af_cjk_metrics_init): Updated. + + * src/autofit/aflatin2.c: Similar changes as with aflatin.c. + + * src/autofit/afloader.c (af_loader_load_g): Test digit width. + + * docs/CHANGES: Document it. + +2009-04-26 Werner Lemberg + + Make ftgrays compile with _STANDALONE_ and FT_STATIC_RASTER again. + Problems reported by suyu@cooee.cn. + + * src/smooth/ftgrays.c (FT_DEFINE_OUTLINE_FUNCS, + FT_DEFINE_RASTER_FUNCS) [_STANDALONE_]: Define. + [!_STANDALONE_]: Include ftspic.h only here. + (ras): Define/declare after definition of `TWorker'. + Use `RAS_VAR_' where necessary. + +2009-04-21 Karl Berry + + Fix AC_CHECK_FT2. + + * builds/unix/freetype2.m4: Only check PATH for freetype-config if + we did not already find it from a prefix option. + +2009-04-05 Oran Agra + + Add #error to modules and files that do not support PIC yet. + + When FT_CONFIG_OPTION_PIC is defined the following files will + create #error: + * src/bdf/bdfdrivr.h + * src/cache/ftcmanag.c + * src/cid/cidriver.h + * src/gxvalid/gxvmod.h + * src/gzip/ftgzip.c + * src/lzw/ftlzw.c + * src/otvalid/otvmod.h + * src/pcf/pcfdrivr.h + * src/pfr/pfrdrivr.h + * src/psaux/psauxmod.h + * src/type1/t1driver.h + * src/type42/t42drivr.h + * src/winfonts/winfnt.h + +2009-04-05 Oran Agra + + Position Independent Code (PIC) support in autofit module. + + * include/freetype/internal/autohint.h add macros to init + instances of FT_AutoHinter_ServiceRec. + + * src/autofit/afmodule.h declare autofit_module_class + using macros from ftmodapi.h, + when FT_CONFIG_OPTION_PIC is defined create and destroy + functions will be declared. + * src/autofit/afmodule.c when FT_CONFIG_OPTION_PIC is defined + af_autofitter_service and autofit_module_class structs + will have functions to init or create and destroy them + instead of being allocated in the global scope. + And macros will be used from afpic.h in order to access them. + + * src/autofit/aftypes.h add macros to init and declare + instances of AF_ScriptClassRec. + + * src/autofit/afcjk.h declare af_cjk_script_class + using macros from aftypes.h, + when FT_CONFIG_OPTION_PIC is defined init function will be declared. + * src/autofit/afcjk.c when FT_CONFIG_OPTION_PIC is defined + af_cjk_script_class struct will have function to init it instead of + being allocated in the global scope. + + * src/autofit/afdummy.h declare af_dummy_script_class + using macros from aftypes.h, + when FT_CONFIG_OPTION_PIC is defined init function will be declared. + * src/autofit/afdummy.c when FT_CONFIG_OPTION_PIC is defined + af_dummy_script_class struct will have function to init it instead of + being allocated in the global scope. + + * src/autofit/afindic.h declare af_indic_script_class + using macros from aftypes.h, + when FT_CONFIG_OPTION_PIC is defined init function will be declared. + * src/autofit/afindic.c when FT_CONFIG_OPTION_PIC is defined + af_indic_script_class struct will have function to init it instead of + being allocated in the global scope. + + * src/autofit/aflatin.h declare af_latin_script_class + using macros from aftypes.h, + when FT_CONFIG_OPTION_PIC is defined init function will be declared. + * src/autofit/aflatin.c when FT_CONFIG_OPTION_PIC is defined + af_latin_script_class struct will have function to init it instead of + being allocated in the global scope. + Change af_latin_blue_chars to be PIC-compatible by being a two + dimentional array rather than array of pointers. + + + * src/autofit/aflatin2.h declare af_latin2_script_class + using macros from aftypes.h, + when FT_CONFIG_OPTION_PIC is defined init function will be declared. + * src/autofit/aflatin2.c when FT_CONFIG_OPTION_PIC is defined + af_latin2_script_class struct will have function to init it instead of + being allocated in the global scope. + Change af_latin2_blue_chars to be PIC-compatible by being a two + dimentional array rather than array of pointers. + + * src/autofit/afglobal.c when FT_CONFIG_OPTION_PIC is defined + af_script_classes array initialization was moved to afpic.c and + is later refered using macros defeined in afpic.h. + + New Files: + * src/autofit/afpic.h declare struct to hold PIC globals for autofit + module and macros to access them. + * src/autofit/afpic.c implement functions to allocate, destroy and + initialize PIC globals for autofit module. + + * src/autofit/autofit.c add new file to build: afpic.c. + * src/autofit/jamfile add new files to FT2_MULTI build: afpic.c. + +2009-04-05 Oran Agra + + Position Independent Code (PIC) support in pshinter module. + + * include/freetype/internal/pshints.h add macros to init + instances of PSHinter_Interface. + + * src/pshinter/pshmod.h declare pshinter_module_class + using macros from ftmodapi.h, + when FT_CONFIG_OPTION_PIC is defined create and destroy + functions will be declared. + * src/pshinter/pshmod.c when FT_CONFIG_OPTION_PIC is defined + pshinter_interface and pshinter_module_class structs + will have functions to init or create and destroy them + instead of being allocated in the global scope. + And macros will be used from pshpic.h in order to access them. + + New Files: + * src/pshinter/pshpic.h declare struct to hold PIC globals for pshinter + module and macros to access them. + * src/pshinter/pshpic.c implement functions to allocate, destroy and + initialize PIC globals for pshinter module. + + * src/pshinter/pshinter.c add new file to build: pshpic.c. + * src/pshinter/jamfile add new files to FT2_MULTI build: pshpic.c. + +2009-04-05 Oran Agra + + Position Independent Code (PIC) support in psnames module. + + * include/freetype/internal/services/svpscmap.h add macros to init + instances of FT_Service_PsCMapsRec. + + * src/psnames/psmodule.h declare psnames_module_class + using macros from ftmodapi.h, + when FT_CONFIG_OPTION_PIC is defined create and destroy + functions will be declared. + * src/psnames/psmodule.c when FT_CONFIG_OPTION_PIC is defined + pscmaps_interface and pscmaps_services structs + and psnames_module_class array + will have functions to init or create and destroy them + instead of being allocated in the global scope. + And macros will be used from pspic.h in order to access them. + + New Files: + * src/psnames/pspic.h declare struct to hold PIC globals for psnames + module and macros to access them. + * src/psnames/pspic.c implement functions to allocate, destroy and + initialize PIC globals for psnames module. + + * src/psnames/psnames.c add new file to build: pspic.c. + * src/psnames/jamfile add new files to FT2_MULTI build: pspic.c. + +2009-04-05 Oran Agra + + Position Independent Code (PIC) support in raster renderer. + + * src/raster/ftrend1.h declare ft_raster1_renderer_class + and ft_raster5_renderer_class + using macros from ftrender.h, + when FT_CONFIG_OPTION_PIC is defined create and destroy + functions will be declared. + * src/smooth/ftrend1.c when FT_CONFIG_OPTION_PIC is defined + ft_raster1_renderer_class and ft_raster5_renderer_class structs + will have functions to init or create and destroy them + instead of being allocated in the global scope. + Macros will be used from rastpic.h in order to access + ft_standard_raster from the pic_container (allocated in ftraster.c). + In ft_raster1_render when PIC is enabled, the last letter of + module_name is used to verfy the renderer class rather than the + class pointer. + + * src/raster/ftraster.c when FT_CONFIG_OPTION_PIC is defined + ft_standard_raster struct will have function to init it + instead of being allocated in the global scope. + + New Files: + * src/raster/rastpic.h declare struct to hold PIC globals for raster + renderer and macros to access them. + * src/raster/rastpic.c implement functions to allocate, destroy and + initialize PIC globals for raster renderer. + + * src/raster/raster.c add new file to build: rastpic.c. + * src/raster/jamfile add new files to FT2_MULTI build: rastpic.c. + +2009-04-05 Oran Agra + + Position Independent Code (PIC) support in smooth renderer. + + * src/smooth/ftsmooth.h declare ft_smooth_renderer_class, + ft_smooth_lcd_renderer_class and ft_smooth_lcd_v_renderer_class + using macros from ftrender.h, + when FT_CONFIG_OPTION_PIC is defined create and destroy + functions will be declared. + * src/smooth/ftsmooth.c when FT_CONFIG_OPTION_PIC is defined + the following structs: + ft_smooth_renderer_class, ft_smooth_lcd_renderer_class + and ft_smooth_lcd_v_renderer_class + will have functions to init or create and destroy them + instead of being allocated in the global scope. + And macros will be used from ftspic.h in order to access + ft_grays_raster from the pic_container (allocated in ftgrays.c). + + * src/smooth/ftgrays.h include FT_CONFIG_CONFIG_H + * src/smooth/ftgrays.c when FT_CONFIG_OPTION_PIC is NOT defined + func_interface was moved from gray_convert_glyph_inner function + to the global scope. + When FT_CONFIG_OPTION_PIC is defined + func_interface and ft_grays_raster structs + will have functions to init them + instead of being allocated in the global scope. + And func_interface will be allocated on the stack of + gray_convert_glyph_inner. + + New Files: + * src/smooth/ftspic.h declare struct to hold PIC globals for smooth + renderer and macros to access them. + * src/smooth/ftspic.c implement functions to allocate, destroy and + initialize PIC globals for smooth renderer. + + * src/smooth/smooth.c add new file to build: ftspic.c. + * src/smooth/jamfile add new files to FT2_MULTI build: ftspic.c. + +2009-04-05 Oran Agra + + Position Independent Code (PIC) support in cff driver. + + * include/freetype/internal/services/svcid.h add macros to init + instances of FT_Service_CIDRec. + * include/freetype/internal/services/svpsinfo.h add macros to init + instances of FT_Service_PsInfoRec. + + * src/cff/cffcmap.h declare cff_cmap_encoding_class_rec + and cff_cmap_unicode_class_rec using macros from + ftobjs.h, when FT_CONFIG_OPTION_PIC is defined create and destroy + functions will be declared. + * src/cff/cffcmap.c when FT_CONFIG_OPTION_PIC is defined + the following structs: + cff_cmap_encoding_class_rec and cff_cmap_unicode_class_rec + will have functions to init or create and destroy them + instead of being allocated in the global scope. + + * src/cff/cffdrivr.h declare cff_driver_class using macros from + ftdriver.h, when FT_CONFIG_OPTION_PIC is defined create and destroy + functions will be declared. + * src/cff/cffdrivr.c when FT_CONFIG_OPTION_PIC is defined + the following structs: + cff_service_glyph_dict, cff_service_ps_info, cff_service_ps_name + cff_service_get_cmap_info, cff_service_cid_info, cff_driver_class, + and cff_services array + will have functions to init or create and destroy them + instead of being allocated in the global scope. + And macros will be used from cffpic.h in order to access them + from the pic_container. + Use macros from cffpic.h in order to access the + structs allocated in cffcmap.c + + * src/cff/cffobjs.c Use macros from cffpic.h in order to access the + structs allocated in cffcmap.c + + * src/cff/parser.c when FT_CONFIG_OPTION_PIC is defined + implement functions to create and destroy cff_field_handlers array + instead of being allocated in the global scope. + And macros will be used from cffpic.h in order to access it + from the pic_container. + + New Files: + * src/cff/cffpic.h declare struct to hold PIC globals for cff + driver and macros to access them. + * src/cff/cffpic.c implement functions to allocate, destroy and + initialize PIC globals for cff driver. + + * src/cff/cff.c add new file to build: cffpic.c. + * src/cff/jamfile add new files to FT2_MULTI build: cffpic.c. + +2009-04-05 Oran Agra + + Position Independent Code (PIC) support in sfnt driver. + + * include/freetype/internal/services/svbdf.h add macros to init + instances of FT_Service_BDFRec. + * include/freetype/internal/services/svgldict.h add macros to init + instances of FT_Service_GlyphDictRec. + * include/freetype/internal/services/svpostnm.h add macros to init + instances of FT_Service_PsFontNameRec. + * include/freetype/internal/services/svsfnt.h add macros to init + instances of FT_Service_SFNT_TableRec. + * include/freetype/internal/services/svttcmap.h add macros to init + instances of FT_Service_TTCMapsRec. + * include/freetype/internal/sfnt.h add macros to init + instances of SFNT_Interface. + + * src/sfnt/sfdriver.h declare sfnt_module_class using macros from + ftmodapi.h, when FT_CONFIG_OPTION_PIC is defined create and destroy + functions will be declared. + * src/sfnt/sfdriver.c when FT_CONFIG_OPTION_PIC is defined + the following structs: + sfnt_service_sfnt_table, sfnt_service_glyph_dict, sfnt_service_ps_name + tt_service_get_cmap_info, sfnt_service_bdf, sfnt_interface, + sfnt_module_class, and sfnt_services array + will have functions to init or create and destroy them + instead of being allocated in the global scope. + And macros will be used from sfntpic.h in order to access them + from the pic_container. + + * src/sfnt/ttcmap.h add macros to init + instances of TT_CMap_ClassRec. + * src/sfnt/ttcmap.c when FT_CONFIG_OPTION_PIC is defined + the following structs: + tt_cmap0_class_rec, tt_cmap2_class_rec, tt_cmap4_class_rec + tt_cmap6_class_rec, tt_cmap8_class_rec, tt_cmap10_class_rec, + tt_cmap12_class_rec, tt_cmap14_class_rec and tt_cmap_classes array + will have functions to init or create and destroy them + instead of being allocated in the global scope. + And macros will be used from sfntpic.h in order to access them + from the pic_container. + The content of tt_cmap_classes is now described in the + new file 'ttcmapc.h'. + + New Files: + * src/sfnt/sfntpic.h declare struct to hold PIC globals for sfnt + driver and macros to access them. + * src/sfnt/sfntpic.c implement functions to allocate, destroy and + initialize PIC globals for sfnt driver. + * src/sfnt/ttcmapc.h describing the content of + tt_cmap_classes allocated in ttcmap.c + + * src/sfnt/sfnt.c add new file to build: sfntpic.c. + * src/sfnt/jamfile add new files to FT2_MULTI build: sfntpic.c. + +2009-04-05 Oran Agra + + Position Independent Code (PIC) support in truetype driver. + + * include/freetype/internal/services/svmm.h add macros to init + instances of FT_Service_MultiMastersRec. + * include/freetype/internal/services/svttglyf.h add macros to init + instances of FT_Service_TTGlyfRec. + + * src/truetype/ttdriver.h declare tt_driver_class using macros from + ftdriver.h, when FT_CONFIG_OPTION_PIC is defined create and destroy + functions will be declared. + * src/truetype/ttdriver.c when FT_CONFIG_OPTION_PIC is defined + the following structs: + tt_service_gx_multi_masters, tt_service_truetype_glyf, tt_driver_class + and tt_services array, + will have functions to init or create and destroy them + instead of being allocated in the global scope. + And macros will be used from ttpic.h in order to access them + from the pic_container. + * src/truetype/ttobjs.c change trick_names array to be + PIC-compatible by being a two dimentional array rather than array + of pointers. + + New Files: + * src/truetype/ttpic.h declare struct to hold PIC globals for truetype + driver and macros to access them. + * src/truetype/ttpic.c implement functions to allocate, destroy and + initialize PIC globals for truetype driver. + + * src/truetype/truetype.c add new file to build: ttpic.c. + * src/truetype/jamfile add new files to FT2_MULTI build: ttpic.c. + +2009-04-05 Oran Agra + + Position Independent Code (PIC) support and infrastructure in base. + + * include/freetype/config/ftoption.h add FT_CONFIG_OPTION_PIC + * include/freetype/internal/ftobjs.h Add pic_container member to + FT_LibraryRec. + Add macros to declare and init instances of FT_CMap_ClassRec. + Add macros to init instances of FT_Outline_Funcs and FT_Raster_Funcs. + Add macros to declare, allocate and initialize modules + (FT_Module_Class). + Add macros to declare, allocate and initialize renderers + (FT_Renderer_Class). + Add macro to init instances of FT_Glyph_Class. + Add macros to declare, allocate and initialize drivers + (FT_Driver_ClassRec). + * include/freetype/internal/ftpic.h new file to declare the + FT_PIC_Container struct and the functions to allocate and detroy it. + * include/freetype/internal/ftserv.h add macros to allocate and + destory arrays of FT_ServiceDescRec. + * include/freetype/internal/internal.h define macro to include + ftpic.h. + + New Files: + * src/base/ftpic.c implement functions to allocate and destory the + global pic_container. + * src/base/basepic.h declare struct to hold PIC globals for base and + macros to access them. + * src/base/basepic.c implement functions to allocate, destroy and + initialize PIC globals for base. + + * src/base/ftinit.c when FT_CONFIG_OPTION_PIC is defined implement + functions that allocate and destroy ft_default_modules according to + FT_CONFIG_MODULES_H in the pic_container instead of the global scope + and use macro from basepic.h to access it. + * src/base/ftobjs.c add calls to the functions that allocate and + destroy the global pic_container when the library is created and + destroyed. + + * src/base/jamfile add new files to FT2_MULTI build: + ftpic.c and basepic.c. + * src/base/ftbase.c add new files to build: + ftpic.c and basepic.c. + + * src/base/ftglyph.c when FT_CONFIG_OPTION_PIC is defined + ft_bitmap_glyph_class and ft_outline_glyph_class will be allocated + in the pic_container instead of the global scope and use macros from + basepic.h to access them. + * src/base/ftbbox.c allocate bbox_interface stract on the stack + instead of the global scope when FT_CONFIG_OPTION_PIC is defined. + * src/base/ftstroke.c access ft_outline_glyph_class allocated in + ftglyph.c via macros from basepic.h + +2009-04-05 Oran Agra + + Preparing changes in cff parser later needed for PIC version. + + * src/cff/cffload.c, src/cff/cffload.h, src/cff/cffobjs.c, + src/cff/cffparse.c, src/cff/cffparse.h: Add library pointer to + 'CFF_ParserRec' set by `cff_parser_init'. + Route library pointer from 'cff_face_init' to 'cff_subfont_load' + for `cff_parser_init'. + + * src/cff/cffparse.c (CFF_Field_Handler): Move it to... + * src/cff/cffparse.h: This file, to be used by other C files. + +2009-04-05 Oran Agra + + Minor change in ftstroke.c. + + * src/base/ftstroke.c (FT_StrokerRec): Replace `memory' member with + `library' needed for PIC version. + Update all callers. + +2009-04-04 Werner Lemberg + + ftnames.c -> ftsnames.c + + * src/base/ftnames.c: Rename to... + * src/base/ftsnames.c: This. + * src/base/Jamfile, src/base/rules.mk, src/base/ftbase.c: Updated. + +2009-04-04 Werner Lemberg + + Add support for cmap type 13. + + * devel/ftoption.h, include/freetype/config/ftoption.h + (TT_CONFIG_CMAP_FORMAT_13): New macro. + + * src/sfnt/ttcmap.c (TT_CMap13Rec, tt_cmap13_init, + tt_cmap13_validate, tt_cmap13_char_index, tt_cmap13_char_next, + tt_cmap13_get_info, tt_cmap13_char_map_def_binary, + tt_cmap14_class_rec): New functions and structures for cmap 13 + support. + (tt_cmap_classes): Register tt_cmap13_class_rec. + + * docs/CHANGES: Mention cmap 13 support. + +2009-04-01 Werner Lemberg + + Ignore empty contours in CFF glyphs. + + Problem reported by Albert Astals Cid . + + * src/cff/cffgload.c (cff_builder_close_contour): Synchronize with + t1_builder_close_contour. + +2009-03-21 Werner Lemberg + + Another redundant header inclusion. + + * src/truetype/ttgxvar.c: Fix Ghostscript Coverity issue #4041. + +2009-03-21 Werner Lemberg + + Remove redundant header inclusions. + + This covers many Ghostscript Coverity issues. + + * src/*: Do it. + +2009-03-21 Werner Lemberg + + Fix Ghostscript Coverity issue #3904. + + * src/truetype/ttgxvar.c (ft_var_readpackedpoints): Protect against + invalid values of `runcnt'. + +2009-03-20 Werner Lemberg + + Fix `make multi' run. + + * src/smooth/ftsmooth.h: Include FT_INTERNAL_DEBUG_H. + +2009-03-20 Werner Lemberg + + Fix Savannah bug #25923. + + * src/cache/ftccmap.c (FTC_CMAP_HASH): Fix typo. + +2009-03-20 Werner Lemberg + + Protect against too large glyphs. + + Problem reported by Tavis Ormandy . + + * src/smooth/ftsmooth.c (ft_smooth_render_generic): Don't allow + `pitch' or `height' to be larger than 0xFFFF. + +2009-03-20 Werner Lemberg + Tavis Ormandy + + Fix validation for various cmap table formats. + + * src/sfnt/ttcmap.c (tt_cmap8_validate, tt_cmap10_validate, + tt_cmap12_validate): Check `length' correctly. + (tt_cmap_14_validate): Check `length' and `numMappings' correctly. + +2009-03-20 Werner Lemberg + + Protect against malformed compressed data. + + * src/lzw/ftzopen.c (ft_lzwstate_io): Test whether `state->prefix' is + zero. + +2009-03-20 Werner Lemberg + + Protect against invalid SID values in CFFs. + + Problem reported by Tavis Ormandy . + + * src/cff/cffload.c (cff_charset_load): Reject SID values larger + than 64999. + +2009-03-19 Vincent Richomme + + Update WinCE Visual C project files. + + * builds/wince/vc2005-ce/freetype.vcproj, + builds/wince/vc2008-ce/freetype.vcproj: Add missing base extension + files. + +2009-03-19 Werner Lemberg + + Remove unused Win32 code. + + * builds/wince/ftdebug.c: Remove code guarded with `!_WIN32_WCE'. + Since Win32 is handled separately this is no longer needed. + +2009-03-19 Vincent Richomme + + Make `gzip' module compile on WinCE. + + * src/gzip/zconf.h [_WIN32_WCE]: Define NO_ERRNO_H. + +2009-03-19 Werner Lemberg + + Remove unused WinCE code. + + * builds/win32/ftdebug.c: Remove code guarded with `_WIN32_WCE'. + Since WinCE is handled separately this is no longer needed. + +2009-03-16 Werner Lemberg + + docmaker: Don't ignore single-line code blocks. + + * src/tools/docmaker/content.py (DocBlock::_init__): Fix change from + 2009-01-31. + +2009-03-15 Steve Langasek + + Use __asm__ for declaring assembly instead of asm. + + * builds/unix/ftconfig.in (FT_MulFix_arm): Use __asm__ instead of + asm on arm, fixing a build failure on armel with -pedantic. + +2009-03-14 Werner Lemberg + + Fix valgrind warning. + + * src/sfnt/ttsbit0.c (tt_sbit_decoder_load_bit_aligned): Don't read + past the end of the frame. + +2009-03-12 Werner Lemberg + + * Version 2.3.9 released. + ========================= + + + Tag sources with `VER-2-3-9'. + +2009-03-12 Werner Lemberg + + * builds/unix/freetype2.in: Move @FT2_EXTRA_LIBS@ to `Libs.private'. + +2009-03-12 Werner Lemberg + + Fix some FreeType Coverity issues as reported for Ghostscript. + + * src/base/ftobjs.c (FT_New_Face, FT_New_Memory_Face): Initialize + `args.stream' (#3874, #3875). + (open_face_PS_from_sfnt_stream): Improve error management (#3786). + * src/base/ftmm.c (ft_face_get_mm_service): Fix check of `aservice' + (#3870). + * src/base/ftstroke.c (ft_stroke_border_get_counts): Remove dead + code (#3790). + * src/base/ftrfork.c (raccess_guess_apple_generic): Check error + value of `FT_Stream_Skip' (#3784). + + * src/type1/t1gload.c (T1_Load_Glyph): Check `size' before accessing + it (#3872) + + * src/pcf/pcfdrivr.c (PCF_Glyph_Load): Check `face' before accessing + it (#3871). + * src/pcf/pcfread.c (pcf_get_metrics): Handle return value of + `pcf_get_metric' (#3789, #3782). + (pcf_get_properties): Use FT_STREAM_SKIP (#3783). + + * src/cache/ftcmanag.c (FTC_Manager_RegisterCache): Fix check of + `acache' (#3797) + + * src/cff/cffdrivr.c (cff_ps_get_font_info): Fix check of `cff' + (#3796). + * src/cff/cffgload.c (cff_decoder_prepare): Check `size' (#3795). + * src/cff/cffload.c (cff_index_get_pointers): Add comment (#3794). + + * src/bdf/bdflib.c (_bdf_add_property): Check `fp->value.atom' + (#3793). + (_bdf_parse_start): Add comment (#3792). + + * src/raster/ftraster.c (Finalize_Profile_Table): Check + `ras.fProfile' (#3791). + + * src/sfnt/ttsbit.c (Load_SBit_Image): Use FT_STREAM_SKIP (#3785). + + * src/gzip/ftgzip.c (ft_gzip_get_uncompressed_size): Properly ignore + seek error (#3781). + +2009-03-11 Michael Toftdal + + Extend CID service functions to handle CID-keyed CFFs as CID fonts. + + * include/freetype/ftcid.h (FT_Get_CID_Is_Internally_CID_keyed, + FT_Get_CID_From_Glyph_Index): New functions. + + * include/freetype/internal/services/svcid.h + (FT_CID_GetIsInternallyCIDKeyedFunc, + FT_CID_GetCIDFromGlyphIndexFunc): New function typedefs. + (CID Service): Use them. + + * src/base/ftcid.c: Include FT_CID_H. + (FT_Get_CID_Is_Internally_CID_keyed, FT_Get_CID_From_Glyph_Index): + New functions. + + * src/cff/cffdrivr.c (cff_get_is_cid, cff_get_cid_from_glyph_index): + New functions. + (cff_service_cid_info): Add them. + * src/cff/cffload.c (cff_font_load): Don't free `font->charset.sids' + -- it is needed for access as a CID-keyed font. It gets deleted + later on. + + * src/cid/cidriver.c (cid_get_is_cid, cid_get_cid_from_glyph_index): + New functions. + (cid_service_cid_info): Add them. + + * docs/CHANGES: Updated. + +2009-03-11 Bram Tassyns + + Fix Savannah bug #25597. + + * src/cff/cffparse.c (cff_parse_real): Don't allow fraction_length + to become larger than 9. + +2009-03-11 Werner Lemberg + + Fix Savannah bug #25814. + + * builds/unix/freetype2.in: As suggested in the bug report, move + @LIBZ@ to `Libs.private'. + +2009-03-11 Werner Lemberg + + Fix Savannah bug #25781. + We now simply check for a valid `offset', no longer handling `delta + = 1' specially. + + * src/sfnt/ttcmap.c (tt_cmap4_validate): Don't check `delta' for + last segment. + (tt_cmap4_set_range, tt_cmap4_char_map_linear, + tt_cmap4_char_map_binary): Check offset. + +2009-03-11 Werner Lemberg + + * src/base/Jamfile: Fix handling of ftadvanc.c. + Reported by Oran Agra . + +2009-03-10 Vincent Richomme + + Restructure Win32 and Wince compiler support. + + * src/builds/win32: Remove files for WinCE. + Move VC 2005 support to a separate directory. + Add directory for VC 2008 support. + + * src/builds/wince: New directory hierarchy for WinCE compilers + (VC 2005 and VC 2008). + +2009-03-09 Werner Lemberg + + More preparations for 2.3.9 release. + + * docs/CHANGES: Updated. + + * Jamfile, README: s/2.3.8/2.3.9/, s/238/239/. + +2009-03-09 Werner Lemberg + + * src/sfnt/rules.mk (SFNT_DRV_H): Add ttsbit0.c. + +2009-03-09 Alexey Kryukov + + Fix handling of EBDT formats 8 and 9 (part 2). + + This patch fixes the following problems in ttsbit0.c: + + . Bitmaps for compound glyphs were never allocated. + + . `SBitDecoder' refused to load metrics if some other metrics have + already been loaded. This condition certainly makes no sense for + recursive calls, so I've just disabled it. Another possibility + would be resetting `decoder->metrics_loaded' to false before + loading each composite component. However, we must restore the + original metrics after finishing the recursion; otherwise we can + get a misaligned glyph. + + . `tt_sbit_decoder_load_bit_aligned' incorrectly handled `x_pos', + causing some glyph components to be shifted too far to the right + (especially noticeable for small sizes). + + Note that support for grayscale bitmaps (not necessarily compound) is + completely broken in ttsbit0.c. + + * src/sfnt/tt_sbit_decoder_load_metrics: Always load metrics. + (tt_sbit_decoder_load_bit_aligned): Handle `x_pos' correctly in case + of `h == height'. + (tt_sbit_decoder_load_compound): Reset metrics after loading + components. + Allocate bitmap. + +2009-03-09 Werner Lemberg + + * builds/unix/configure.raw (version_info): Set to 9:20:3. + +2009-03-03 David Turner + + Protect SFNT kerning table parser against malformed tables. + + This closes Savannah BUG #25750. + + * src/sfnt/ttkern.c (tt_face_load_kern, tt_face_get_kerning): Fix a + bug where a malformed table would be successfully loaded but later + crash the engine during parsing. + +2009-03-03 David Turner + + Update documentation and bump version number to 2.3.9. + + * include/freetype/freetype.h: Bump patch version to 9. + * docs/CHANGES: Document the ABI break in 2.3.8. + * docs/VERSION.DLL: Update version numbers table for 2.3.9. + +2009-03-03 David Turner + + Remove ABI-breaking field in public PS_InfoFontRec definition. + + Instead, we define a new internal PS_FontExtraRec structure to + hold the additional field, then place it in various internal + positions of the corresponding FT_Face derived objects. + + * include/freetype/t1tables.h (PS_FontInfoRec): Remove the + `fs_type' field from the public structure. + * include/freetype/internal/psaux.h (T1_FieldLocation): New + enumeration `T1_FIELD_LOCATION_FONT_EXTRA'. + * include/freetype/internal/t1types.h (PS_FontExtraRec): New + structure. + (T1_FontRec, CID_FaceRec): Add it. + + * src/cid/cidload.c (cid_load_keyword): Handle + T1_FIELD_LOCATION_FONT_EXTRA. + * src/cid/cidtoken.h, src/type1/t1tokens.h, src/type42/t42parse.c: + Adjust FT_STRUCTURE and T1CODE properly to handle `FSType'. + * src/type1/t1load.c (t1_load_keyword): Handle + T1_FIELD_LOCATION_FONT_EXTRA. + + * include/freetype/internal/services/svpsinfo.h (PsInfo service): + Add `PS_GetFontExtraFunc' function typedef. + + * src/base/ftfstype.c: Include FT_INTERNAL_SERVICE_H and + FT_SERVICE_POSTSCRIPT_INFO_H. + (FT_Get_FSType_Flags): Use POSTSCRIPT_INFO service. + + * src/cff/cffdrivr.c (cff_service_ps_info): Updated. + * src/cid/cidriver.c (cid_ps_get_font_extra): New function. + (cid_service_ps_info): Updated. + * src/type1/t1driver.c (t1_ps_get_font_extra): New function. + (t1_service_ps_info): Updated. + * src/type42/t42drivr.c (t42_ps_get_font_extra): New function. + (t42_service_ps_info): Updated. + +2009-03-02 Alexey Kryukov + + Fix handling of EBDT formats 8 and 9. + + The main cycle in `blit_sbit' makes too many iterations: it actually + needs the count of lines in the source bitmap rather than in the + target image. + + * src/sfnt/ttsbit.c (blit_sbit) [FT_CONFIG_OPTION_OLD_INTERNALS]: + Add parameter `source_height' and use it for main loop. + (Load_SBit_Single) [FT_CONFIG_OPTION_OLD_INTERNALS]: Updated. + +2009-02-23 Werner Lemberg + + Fix Savannah bug #25669. + + * src/base/ftadvanc.h (FT_Get_Advances): Fix serious typo. + + * src/base/ftobjs.c (FT_Select_Metrics, FT_Request_Metrics): Fix + scaling factor for non-scalable fonts. + + * src/cff/cffdrivr.c (cff_get_advances): Use correct advance width + value to prevent incorrect scaling. + + * docs/CHANGES: Document it. + +2009-02-15 Matt Godbolt + + Fix Savannah bug #25588. + + * builds/unix/ftconfig.in (FT_MulFix_arm): Use correct syntax for + `orr' instruction. + +2009-02-11 Werner Lemberg + + * src/truetype/ttobjs.c (tt_check_trickyness): Add `DFKaiShu'. + Reported by David Bevan . + +2009-02-09 Werner Lemberg + + Fix Savannah bug #25495. + + * src/sfnt/sfobjs.c (sfnt_load_face): Test for bitmap strikes before + setting metrics and bbox values. This ensures that the check for a + font with neither a `glyf' table nor bitmap strikes can be performed + early enough to set metrics and bbox values too. + +2009-02-04 Werner Lemberg + + Fix Savannah bug #25480. + + * builds/unix/freetype-config.in: For --ftversion, don't use $prefix + but $includedir. + +2009-01-31 Werner Lemberg + + Minor docmaker improvements. + + * src/tools/docmaker/content.py (DocBlock::__init__): Ignore empty + code blocks. + +2009-01-25 Werner Lemberg + + Fix SCANCTRL handling in TTFs. + Problem reported by Alexey Kryukov . + + * src/truetype/ttinterp.c (Ins_SCANCTRL): Fix threshold handling. + +2009-01-23 Werner Lemberg + + Move FT_Get_FSType_Flags to a separate file. + Problem reported by Mickey Gabel . + + * src/base/ftobjs.c (FT_Get_FSType_Flags): Move to... + * src/base/ftfstype.c: This new file. + + * modules.cfg (BASE_EXTENSION): Add ftfstype.c. + + * docs/INSTALL.ANY: Updated. + + * builds/mac/*.txt, builds/amiga/*makefile*, + builds/win32/{visualc,visualce}/freetype.*, builds/symbian/*: + Updated. + +2009-01-22 suzuki toshiya + + * builds/unix/ftsystem.c (FT_Stream_Open): Fix 2 error + messages ending without "\n". + +2009-01-22 suzuki toshiya + + Fix Savannah bug #25347. + + * src/base/ftobjs.c (open_face_PS_from_sfnt_stream): Rewind + the stream to the original position passed to this function, + when ft_lookup_PS_in_sfnt_stream() failed. + (Mac_Read_sfnt_Resource): Rewind the stream to the head of + sfnt resource body, when open_face_PS_from_sfnt_stream() + failed. + +2009-01-19 Michael Lotz + + Fix Savannah bug #25355. + + * include/freetype/config/ftconfig.h (FT_MulFix_i386): Make + assembler code work with gcc 2.95.3 (as used by the Haiku project). + Add `cc' register to the clobber list. + +2009-01-18 Werner Lemberg + + Protect FT_Get_Next_Char. + + * src/sfnt/ttcmap.c (tt_cmap4_set_range): Apply fix similar to + change from 2008-07-22. + + Patch from Ronen Ghoshal . + +2009-01-18 Werner Lemberg + + Implement FT_Get_Name_Index for SFNT driver. + + * src/sfnt/sfdriver.c (sfnt_get_name_index): New function. + (sfnt_service_glyph_dict): Use it. + + Problem reported by Truc Truong . + +2009-01-18 Werner Lemberg + + * include/freetype/ftstroke.h (FT_Outline_GetInsideBorder): Fix + documentation. Problem reported by Truc Truong . + + * docs/CHANGES: Updated. + +2009-01-14 Werner Lemberg + + * Version 2.3.8 released. + ========================= + + + Tag sources with `VER-2-3-8'. + + * docs/VERSION.DLL: Update documentation and bump version number to + 2.3.8. + + * README, Jamfile (RefDoc), builds/win32/visualc/index.html, + builds/win32/visualc/freetype.dsp, + builds/win32/visualc/freetype.vcproj, + builds/win32/visualce/index.html, + builds/win32/visualce/freetype.dsp, + builds/win32/visualce/freetype.vcproj: s/2.3.7/2.3.8/, s/237/238/. + + * include/freetype/freetype.h (FREETYPE_PATCH): Set to 8. + + * builds/unix/configure.raw (version_info): Set to 9:19:3. + + * docs/release: Updated. + +2009-01-14 Werner Lemberg + + * builds/toplevel.mk (dist): Compress better. + +2009-01-13 Werner Lemberg + + * src/base/ftobjs.c (FT_Get_FSType_Flags): Cast for compilation + with C++. + +2009-01-13 Werner Lemberg + + Don't use stdlib.h and friends directly. + Reported by Mickey Gabel . + + * src/base/ftdbgmem.c: s//FT_CONFIG_STANDARD_LIBRARY_H/. + + * src/gzip/ftgzip.c, src/lzw/ftlzw.c, src/raster/ftmisc.h: + s//FT_CONFIG_STANDARD_LIBRARY_H/. + + * src/autofit/aftypes.h, src/autofit/afhints.c, + src/pshinter/pshalgo.c: s//FT_CONFIG_STANDARD_LIBRARY_H/ + + * src/lzw/ftlzw.c, src/base/ftdbgmem.c: Don't include stdio.h. + +2009-01-12 Werner Lemberg + + Avoid compiler warnings. + + * */*: s/do ; while ( 0 )/do { } while ( 0 )/. + Reported by Sean McBride . + +2009-01-12 Werner Lemberg + + Fix stdlib dependencies. + + Problem reported by Mickey Gabel . + + * include/freetype/config/ftstdlib.h (ft_exit): Removed. Unused. + + * src/autofit/afhints.c, src/base/ftlcdfil.c, src/smooth/ftsmooth.c: + s/memcpy/ft_memcpy/. + * src/psaux/t1decode.c: s/memset/ft_memset/, s/memcpy/ft_memcpy/. + +2009-01-11 Werner Lemberg + + * docs/formats.txt: Add link to PCF specification. + + * include/freetype/ftbdf.h (FT_Get_BDF_Property): Improve + documentation. + +2009-01-09 suzuki toshiya + + * src/base/ftadvanc.c (_ft_face_scale_advances, FT_Get_Advance, + FT_Get_Advances): Change the type of load_flags from FT_UInt32 to + FT_Int32, to match with the flags for FT_Load_Glyph(). + * src/cff/cffdrivr.c (cff_get_advances): Ditto. + * src/truetype/ttdriver.c (tt_get_advances): Ditto. + * include/freetype/ftadvanc.h (FT_Get_Advance, FT_Get_Advances): + Ditto. + * include/freetype/internal/ftdriver.h (FT_Face_GetAdvancesFunc): + Ditto. + +2009-01-09 Daniel Zimmermann + + * src/gxvalid/gxvmort.c (gxv_mort_feature_validate): Fix wrong + length check. From Savannah patch #6682. + +2009-01-09 Werner Lemberg + + Fix problem with T1_FIELD_{NUM,FIXED}_TABLE2. + + * src/psaux/psobjs.c (ps_parser_load_field_table): Don't handle + `count_offset' if it is zero (i.e., unused). Otherwise, the first + element of the structure which holds the data is erroneously + modified. Problem reported by Chi Nguyen . + +2009-01-09 suzuki toshiya + + * src/base/ftadvanc.c (_ft_face_scale_advances, FT_Get_Advance, + FT_Get_Advances): Extend the type of load_flags from FT_UInt to + FT_UInt32, to pass 32-bit flags on 16bit platforms. + * src/cff/cffdrivr.c (cff_get_advances): Ditto. + * src/truetype/ttdriver.c (tt_get_advances): Ditto. + * include/freetype/ftadvanc.h (FT_Get_Advance, FT_Get_Advances): + Ditto. + * include/freetype/internal/ftdriver.h (FT_Face_GetAdvancesFunc): + Ditto. + +2009-01-09 suzuki toshiya + + * src/base/ftobjs.c (FT_Done_Library): Issue an error message when + FT_Done_Face() cannot free all faces. If the list of the opened + faces includes broken face which FT_Done_Face() cannot free, + FT_Done_Library() retries FT_Done_Face() and it can fall into + an endless loop. See the discussion: + http://lists.gnu.org/archive/html/freetype-devel/2008-09/msg00047.html + http://lists.gnu.org/archive/html/freetype-devel/2008-10/msg00000.html + +2009-01-07 Werner Lemberg + + * docs/CHANGES: Document new key `a' in ftdiff. + +2009-01-06 Werner Lemberg + + * autogen.sh: Don't use GNUisms while calling sed. Problem reported + by Sean McBride. + +2009-01-06 Werner Lemberg + + * src/base/ftbitmap.c (FT_Bitmap_Convert): Handle FT_PIXEL_MODE_LCD + and FT_PIXEL_MODE_LCD_V. Problem reported by Chi Nguyen + . + +2009-01-06 Diego Pettenò + + * builds/unix/configure.raw: Don't call AC_CANONICAL_BUILD and + AC_CANONICAL_TARGET and use $host_os only. A nice explanation for + this change can be found at + http://blog.flameeyes.eu/s/canonical-target. + + From Savannah patch #6712. + +2009-01-06 Sean McBride + + * src/base/ftdbgmem.c (_debug_mem_dummy): Make it static. + + * src/base/ftmac.c: Remove some #undefs. + +2008-12-26 Werner Lemberg + + Set `face_index' field in FT_Face for all font formats. + + * cff/cffobjs.c (cff_face_init), winfonts/winfnt.c (FNT_Face_Init), + sfnt/sfobjs.c (sfnt_init_face): Do it. + + * docs/CHANGES: Document it. + +2008-12-22 Steve Grubb + + * builds/unix/ftsystem.c (FT_Stream_Open): Reject zero-length files. + Patch from Savannah bug #25151. + +2008-12-21 Werner Lemberg + + * src/pfr/pfrdrivr.c, src/winfonts/winfnt.c, src/cache/ftcmanag.c, + src/smooth/ftgrays.c, src/base/ftobjc.s, src/sfobjs.c: + s/_Err_Bad_Argument/_Err_Invalid_Argument/. The former is for + errors in the bytecode interpreter only. + +2008-12-21 Werner Lemberg + + * src/base/ftpfr.c (FT_Get_PFR_Metrics): Protect against NULL + arguments. + Fix return value for non-PFR fonts. Both problems reported by Chi + Nguyen . + +2008-12-21 anonymous + + FT_USE_MODULE declares things as: + + extern const FT_Module_Class + + (or similar for C++). However, the actual types of the variables + being declared are often different, e.g., FT_Driver_ClassRec or + FT_Renderer_Class. (Some are, indeed, FT_Module_Class.) + + This works with most C compilers (since those structs begin with an + FT_Module_Class struct), but technically it's undefined behavior. + + To quote the ISO/IEC 9899:TC2 final committee draft, section 6.2.7 + paragraph 2: + + All declarations that refer to the same object or function shall + have compatible type; otherwise, the behavior is undefined. + + (And they are not compatible types.) + + Most C compilers don't reject (or even detect!) code which has this + issue, but the GCC LTO development branch compiler does. (It + outputs the types of the objects while generating .o files, along + with a bunch of other information, then compares them when doing the + final link-time code generation pass.) + + Patch from Savannah bug #25133. + + * src/base/ftinit.c (FT_USE_MODULE): Include variable type. + + * builds/amiga/include/freetype/config/ftmodule.h, + include/freetype/config/ftmodule.h, */module.mk: Updated to declare + pass correct types to FT_USE_MODULE. + +2008-12-21 Hongbo Ni + + * src/autofit/aflatin.c (af_latin_hint_edges), + src/autofit/aflatin2.c (af_latin2_hint_edges), src/autofit/afcjk.c + (af_cjk_hint_edges): Protect against division by zero. This fixes + Savannah bug #25124. + +2008-12-18 Werner Lemberg + + * docs/CHANGES: Updated. + +2008-12-18 Bevan, David + + Provide API for accessing embedding and subsetting restriction + information. + + * include/freetype.h (FT_FSTYPE_INSTALLABLE_EMBEDDING, + FT_FSTYPE_RESTRICTED_LICENSE_EMBEDDING, + FT_FSTYPE_PREVIEW_AND_PRINT_EMBEDDING, FT_FSTYPE_EDITABLE_EMBEDDING, + FT_FSTYPE_NO_SUBSETTING, FT_FSTYPE_BITMAP_EMBEDDING_ONLY): New + macros. + (FT_Get_FSType_Flags): New function declaration. + + * src/base/ftobjs.c (FT_Get_FSType_Flags): New function. + + * src/cid/cidtoken.h, src/type1/t1tokens.h, src/type42/t42parse.c + (t42_keywords): Handle `FSType'. + + * include/freetype/t1tables.h (PS_FontInfoRec): Add `fs_type' field. + +2008-12-17 Werner Lemberg + + * src/base/ftsynth.c (FT_GlyphSlot_Embolden): Don't use internal + macros so that copying the source code into an application works + out of the box. + +2008-12-17 Werner Lemberg + + * include/freetype/ftsynth.h, src/base/ftsynth.c: Move + FT_GlyphSlot_Own_Bitmap to... + * include/freetype/ftbitmap.h, src/base/ftbitmap.c: These files. + + * docs/CHANGES: Document it. + +2008-12-10 Werner Lemberg + + Generalize the concept of `tricky' fonts by introducing + FT_FACE_FLAG_TRICKY to indicate that the font format's hinting + engine is necessary for correct rendering. + + At the same time, slightly modify the behaviour of tricky fonts: + FT_LOAD_NO_HINTING is now ignored. To really force raw loading + of tricky fonts (without hinting), both FT_LOAD_NO_HINTING and + FT_LOAD_NO_AUTOHINT must be used. + + Finally, tricky TrueType fonts always use the bytecode interpreter + even if the patented code is used. + + * include/freetype/freetype.h (FT_FACE_FLAG_TRICKY, FT_IS_TRICKY): + New macros. + + * src/truetype/ttdriver.c (Load_Glyph): Handle new load flags + semantics as described above. + + * src/truetype/ttobjs.c (tt_check_trickyness): New function, using + code of ... + (tt_face_init): This function, now simplified and updated to new + semantics. + + * src/base/ftobjs.c (FT_Load_Glyph): Don't use autohinter for tricky + fonts. + + * docs/CHANGES: Document it. + +2008-12-09 Werner Lemberg + + Really fix Savannah bug #25010: An SFNT font with neither outlines + nor bitmaps can be considered as containing space `glyphs' only. + + * src/truetype/ttpload.c (tt_face_load_loca): Handle the case where + a `glyf' table is missing. + + * src/truetype/ttgload.c (load_truetype_glyph): Abort if we have no + `glyf' table but a non-zero `loca' entry. + (tt_loader_init): Handle missing `glyf' table. + + * src/base/ftobjs.c (FT_Load_Glyph): Undo change 2008-12-05. + + * src/sfnt/sfobjs.c (sfnt_load_face): A font with neither outlines + nor bitmaps is scalable. + +2008-12-05 Werner Lemberg + + * src/autofit/aflatin.c (af_latin_uniranges): Add more ranges. This + fixes Savannah bug #21190 which also provides a basic patch. + +2008-12-05 Werner Lemberg + + * include/freetype/freetype.h (FT_LOAD_ADVANCE_ONLY): Use value + 0x100 instead of 0x10000; the latter value is already occupied by + FT_LOAD_TARGET_LIGHT. Bug reported by James Cloos. + + + Handle SFNT with neither outlines nor bitmaps. This fixes Savannah + bug #25010. + + * src/base/ftobjs.c (FT_Load_Glyph): Reject fonts with neither + outlines nor bitmaps. + + * src/sfnt/sfobjs.c (sfnt_load_face): Don't return an error if there + is no table with glyphs. + + + * src/sfnt/ttload.c (tt_face_lookup_table): Improve debugging + message. + +2008-12-01 Werner Lemberg + + GDEF tables need `glyph_count' too for validation. Problem reported + by Chi Nguyen . + + * src/otvalid/otvgdef.c (otv_GDEF_validate), src/otvalid/otvalid.h + (otv_GDEF_validate), src/otvalid/otvmod.c (otv_validate): Pass + `glyph_count'. + +2008-11-29 Werner Lemberg + + * src/autofit/afcjk.c, src/base/ftoutln.c, src/base/ftrfork.c, + src/bdf/bdfdrivr.c, src/gxvalid/gxvmorx.c, src/otvalid/otvmath.c, + src/pcf/pcfdrivr.c, src/psnames/pstables.h, src/smooth/ftgrays.c, + src/tools/glnames.py, src/truetype/ttinterp.c, src/type1/t1load.c, + src/type42/t42objs.c, src/winfonts/winfnt.c: Fix compiler warnings + (Atari PureC). + +2008-11-29 James Cloos + + * src/type/t1load.c (mm_axis_unmap): Revert previous patch and fix + it correctly by using FT_INT_TO_FIXED (FreeType expects 16.16 values + in the /BlendDesignMap space). + +2008-11-29 James Cloos + + * src/type1/t1load.c (mm_axis_unmap): `blend_points' is FT_Fixed*, + whereas `design_points' is FT_Long*. Therefore, return blend rather + than design points. + +2008-11-27 Werner Lemberg + + * src/cff/cffparse.c (cff_parse_real): Handle more than nine + significant digits correctly. This fixes Savannah bug #24953. + +2008-11-25 Daniel Zimmermann + + * src/base/ftstream.c (FT_Stream_ReadFields): Don't access stream + before the NULL check. From Savannah patch #6681. + +2008-11-24 Werner Lemberg + + Fixes from the gnuwin32 port. + + * src/base/ftlcdfil.c: s/EXPORT/EXPORT_DEF/. + + * src/base/ftotval.c: Include FT_OPENTYPE_VALIDATE_H. + + * src/psaux/psobjs.c (ps_table_add): Check `length'. + +2008-11-15 Werner Lemberg + + * src/truetype/ttinterp.c (tt_default_graphics_state): The default + value for `scan_type' is zero, as confirmed by Greg Hitchcock from + Microsoft. Problem reported by Michal Nowakowski + . + +2008-11-12 Tor Andersson + + * src/cff/cffdrivr.c (cff_get_cmap_info): Initialize `format' field. + This fixes Savannah bug #24819. + +2008-11-08 Werner Lemberg + + * src/sfnt/sfobjs.c (sfnt_load_face): Remove #if 0/#endif guards + since OpenType version 1.5 has been released. + + * include/ttnameid.h (TT_NAME_ID_WWS_FAMILY, + TT_NAME_ID_WWS_SUBFAMILY): New macros for OpenType 1.5. + (TT_URC_COPTIC, TT_URC_VAI, TT_URC_NKO, TT_URC_BALINESE, + TT_URC_PHAGSPA, TT_URC_NON_PLANE_0, TT_URC_PHOENICIAN, + TT_URC_TAI_LE, TT_URC_NEW_TAI_LUE, TT_URC_BUGINESE, + TT_URC_GLAGOLITIC, TT_URC_YIJING, TT_URC_SYLOTI_NAGRI, + TT_URC_LINEAR_B, TT_URC_ANCIENT_GREEK_NUMBERS, TT_URC_UGARITIC, + TT_URC_OLD_PERSIAN, TT_URC_SHAVIAN, TT_URC_OSMANYA, + TT_URC_CYPRIOT_SYLLABARY, TT_URC_KHAROSHTHI, TT_URC_TAI_XUAN_JING, + TT_URC_CUNEIFORM, TT_URC_COUNTING_ROD_NUMERALS, TT_URC_SUNDANESE, + TT_URC_LEPCHA, TT_URC_OL_CHIKI, TT_URC_SAURASHTRA, TT_URC_KAYAH_LI, + TT_URC_REJANG, TT_URC_CHAM, TT_URC_ANCIENT_SYMBOLS, + TT_URC_PHAISTOS_DISC, TT_URC_OLD_ANATOLIAN, TT_URC_GAME_TILES): New + macros for OpenType 1.5. + +2008-11-08 Wenlin Institute + + * src/base/ftobjs.c (ft_glyphslot_free_bitmap): Protect against + slot->internal == NULL. Reported by Graham Asher. + +2008-11-08 Werner Lemberg + + * src/sfnt/sfobjs.c (tt_face_get_name): Modified to return an error + code so that memory allocation problems can be distinguished from + missing table entries. Reported by Graham Asher. + (GET_NAME): New macro. + (sfnt_load_face): Use it. + +2008-11-05 Werner Lemberg + + * devel/ftoption.h, include/freetype/config/ftoption.h + [TT_CONFIG_OPTION_BYTECODE_INTERPRETER]: Undefine + TT_CONFIG_OPTION_UNPATENTED_HINTING. This fixes the return value of + `FT_Get_TrueType_Engine_Type' (and makes it work as documented). + Reported in bug #441638 of bugzilla.novell.com. + + * docs/CHANGES: Document it. + +2008-11-03 Werner Lemberg + + * src/type1/t1load.c (parse_subrs): Use an endless loop. There are + fonts (like HELVI.PFB version 003.001, used on OS/2) which define + some `subrs' elements more than once. Problem reported by Peter + Weilbacher . + +2008-10-15 Graham Asher + + * src/sfnt/ttpost.c (tt_post_default_names): Add `const'. + +2008-10-15 David Turner + + * src/truetype/ttgxvar.c (TT_Set_MM_Blend): Disambiguate for + meddlesome compilers' warning against `for ( ...; ...; ...) ;'. + +2008-10-14 Werner Lemberg + + * src/cff/cffobjs.c (cff_face_init): Remove compiler warning. + Suggested by Bram Tassyns in Savannah patch #6651. + +2008-10-12 Graham Asher + + * src/sfnt/sfobjs.c (sfnt_load_face): Fix computation of + `underline_position'. + +2008-10-12 Werner Lemberg + + * docs/CHANGES: Updated. + +2008-10-09 suzuki toshiya + + Fix Savannah bug #24468. + + According to include/freetype/internal/ftobjs.h, the appropriate + type to interchange single character codepoint is FT_UInt32. It + should be distinguished from FT_UInt which can be 16bit integer. + + * src/sfnt/ttcmap.c (tt_cmap4_char_map_linear): Change the type + of the second argument `pcharcode' from FT_UInt* to FT_UInt32*. + (tt_cmap4_char_map_binary): Ditto. + (tt_cmap14_get_nondef_chars): Change the type of return value + from FT_UInt* to FT_UInt32*. + +2008-10-08 John Tytgat + + Fix Savannah bug #24485. + + * src/type1/t1load.c (parse_charstrings): Assure that we always have + a .notdef glyph. + +2008-10-05 suzuki toshiya + + * src/base/ftmac.c: Include FT_TRUETYPE_TAGS_H for multi build. + * builds/mac/ftmac.c: Ditto. + +2008-10-05 suzuki toshiya + + * include/freetype/tttags.h (TTAG_TYP1, TTAG_typ1): Fix definitions. + * src/base/ftobjs.c: Include FT_TRUETYPE_TAGS_H. + +2008-10-05 suzuki toshiya + + * src/sfnt/sfobjs.c (sfnt_open_font): Allow `typ1' version tag in + the beginning of sfnt container. + * src/sfnt/ttload.c (check_table_dir): Return + `SFNT_Err_Table_Missing' when sfnt table directory structure is + correct but essential tables for TrueType fonts (`head', `bhed' or + `SING') are missing. Other errors are returned by + SFNT_Err_Unknown_File_Format. + + * src/base/ftobjs.c (FT_Open_Face): When TrueType driver returns + `FT_Err_Table_Missing', try `open_face_PS_from_sfnt_stream'. It is + enabled only when old mac font support is configured. + +2008-10-04 suzuki toshiya + + * include/freetype/tttags.h (TTAG_CID, TTAG_FOND, TTAG_LWFN, + TTAG_POST, TTAG_sfnt, TTAG_TYP1, TTAG_typ1): New tags to simplify + the repeated calculations of these values in ftobjs.c and ftmac.c. + * src/base/ftobjs.c: Replace all FT_MAKE_TAG by new tags. + * src/base/ftmac.c: Ditto. + * builds/mac/ftmac.c: Ditto. + +2008-10-04 suzuki toshiya + + * src/base/ftobjs.c (ft_lookup_PS_in_sfnt_stream): Remove wrong + initialization of *is_sfnt_cid. + +2008-10-04 Werner Lemberg + + * src/base/ftobjs.c (open_face_PS_from_sfnt_stream): Remove compiler + warnings. + +2008-10-04 suzuki toshiya + + * src/base/ftobjs.c (ft_lookup_PS_in_sfnt): Replaced by... + (ft_lookup_PS_in_sfnt_stream): This. + (open_face_PS_from_sfnt_stream): New function. It checks whether + the stream is sfnt-wrapped Type1 PS font or sfnt-wrapped CID-keyed + font, then try to open a face for given face_index. + (Mac_Read_sfnt_Resource): Replace the combination of + `ft_lookup_PS_in_sfnt' and `open_face_from_buffer' by + `open_face_PS_from_sfnt_stream'. + * src/base/ftmac.c (FT_New_Face_From_SFNT): Ditto. + * builds/mac/ftmac.c (FT_New_Face_From_SFNT): Ditto. + * src/base/ftbase.h: Remove `ft_lookup_PS_in_sfnt' and add + `open_face_PS_from_sfnt_stream'. + +2008-10-03 suzuki toshiya + + * src/base/ftobjs.c (ft_lookup_PS_in_sfnt): Set *is_sfnt_cid to + FALSE if neither `CID ' nor `TYP1' is found in the sfnt container. + +2008-10-03 suzuki toshiya + + * include/freetype/config/ftconfig.h: Define FT_MACINTOSH when SC or + MrC compiler of MPW is used. These compilers do not define the + macro __APPLE__ by themselves. + * builds/unix/ftconfig.in: Ditto. + * builds/vms/ftconfig.h: Ditto. + * src/base/ftbase.c: Use FT_MACINTOSH instead of __APPLE__, to + include ftmac.c if FreeType 2 is built by MPW. + * src/base/ftobjs.c: Use FT_MACINTOSH instead of __APPLE__, to + enable shared functions for ftmac.c if FreeType 2 is built by MPW. + + * builds/mac/ftmac.c: Include ftbase.h. + (memory_stream_close): Removed. + (new_memory_stream): Ditto. + (open_face_from_buffer): Removed. Use the implementation in + ftobjs.c. + (ft_lookup_PS_in_sfnt): Ditto. + + * builds/mac/FreeType.m68k_far.make.txt: Build ftmac.c as an + included part of ftbase.c, to share the functions in ftobjs.c. The + rule compiling ftmac.c separately is removed and the rule copying + ftbase.c from src/base/ftbase.c to builds/mac/ftbase.c is added. + * builds/mac/FreeType.m68k_cfm.make.txt: Ditto. + * builds/mac/FreeType.ppc_classic.make.txt: Ditto. + * builds/mac/FreeType.ppc_carbon.make.txt: Ditto. + +2008-10-02 Bram Tassyns + + * src/cff/cffgload.c (cff_slot_load): Map CID 0 to GID 0. This + fixes Savannah bug #24430. + +2008-10-02 Werner Lemberg + + * builds/freetype.mk (BASE_H): Rename to... + (INTERNAL_H): This. + (FREETYPE_H): Updated. + * src/base/rules.mk: (BASE_OBJ_S, OBJ_DIR/%.$O): Add BASE_H. + * src/bdf/rules.mk (BDF_DRV_H): Add bdferror.h. + * src/cache/rules.mk (CACHE_DRV_H): Add ftccache.h and ftcsbits.h. + * src/pcf/rules.mk (PCF_DRV_H): Add pcfread.h. + * src/raster/rules.mk (RASTER_DRV_H): Add ftmisc.h. + * src/type42/rules.mk (T42_DRV_H): Add t42types.h. + +2008-10-02 suzuki toshiya + + * src/base/ftbase.h: New file to declare the private utility + functions shared by the sources of base modules. Currently, + `ft_lookup_PS_in_sfnt' and `open_face_from_buffer' are declared to + share between ftobjs.c and ftmac.c. + + * src/base/rule.mk: Add ftbase.h. + + * src/base/ftobjs.c: Include ftbase.h. + (memory_stream_close): Build on any platform when old MacOS font + support is enabled. + (new_memory_stream): Ditto. + (open_face_from_buffer): Build on any platform when old MacOS font + support is enabled. The counting of the face in a font file is + slightly different between Carbon-dependent parser and Carbon-free + parser. They are merged with the platform-specific conditional. + (ft_lookup_PS_in_sfnt): Ditto. + + * src/base/ftmac.c: Include ftbase.h. + (memory_stream_close): Removed. + (new_memory_stream): Ditto. + (open_face_from_buffer): Removed. Use the implementation in + ftobjs.c. + (ft_lookup_PS_in_sfnt): Ditto. + +2008-10-02 Werner Lemberg + + * src/sfnt/sfobjs.c (sfnt_load_face): `psnames_error' is only needed + if TT_CONFIG_OPTION_POSTSCRIPT_NAMES is defined. + +2008-10-01 Werner Lemberg + + * src/truetype/ttobjs.c (tt_face_done), src/cff/cffobjs.c + (cff_face_done), src/pfr/pfrobjs.c (pfr_face_done), + src/pcf/pcfdrivr.c (PCF_Face_Done), src/cid/cidobjs.c + (cid_face_done), src/bdf/bdfdrivr. (BDF_Face_Done), + src/sfnt/sfobjs.c (sfnt_face_done): Protect against face == 0. + Reported by Graham Asher. + +2008-09-30 suzuki toshiya + + * src/base/rules.mk: Add conditional source to BASE_SRC, for `make + multi' on Mac OS X. If the macro $(ftmac_c) is defined, + $(BASE_DIR)/$(ftmac_c) is added to BASE_SRC. In a normal build, the + lack of ftmac.c in BASE_SRC is not serious because ftbase.c includes + ftmac.c. + * builds/unix/unix-def.in: Add a macro definition of $(ftmac_c). + * builds/unix/configure.raw: Add procedure to set up appropriate + value of $(ftmac_c) with the consideration of the availability of + Carbon framework. + +2008-09-30 suzuki toshiya + + * src/base/Jamfile: Add target for multi build by jam on Mac OS X. + * src/base/ftobjs.c (FT_New_Face): Fix the condition to include this + function for MPW building. It is synchronized the condition to + include ftmac.c source into ftbase.c. + +2008-09-22 Werner Lemberg + + * src/cff/cffgload.c (CFF_Operator, cff_argument_counts, + cff_decoder_parse_charstrings): Handle (invalid) + `callothersubr' and `pop' instructions. + +2008-09-22 John Tytgat + + Fix Savannah bug #24307. + + * include/freetype/internal/t1types.h (CID_FaceRec), + src/type42/t42types.h (T42_FaceRec): Comment out `afm_data'. + +2008-09-21 Werner Lemberg + + * src/smooth/ftgrays.c (gray_raster_render): Don't dereference + `target_map' if FT_RASTER_FLAG_DIRECT is set. Problem reported by + Stephan T. Lavavej . + +2008-09-21 suzuki toshiya + + * src/otvalid/Jamfile: Add missing target `otvmath' for multi build + by jam. + * src/sfnt/Jamfile: Add missing target `ttmtx' for multi build by + jam. + +2008-09-20 Werner Lemberg + + * src/smooth/ftgrays.c (gray_find_cell): Fix threshold. The values + passed to this function are already `normalized'. Problem reported + by Stephan T. Lavavej . + + * docs/CHANGES: Document it. + +2008-09-20 Werner Lemberg + + * src/base/ftoutln.c: Include FT_INTERNAL_DEBUG_H. + (FT_Outline_Decompose): Decorate with tracing messages. + + * src/smooth/ftgrays.c [DEBUG_GRAYS]: Replace with + FT_DEBUG_LEVEL_TRACE. + [_STANDALONE_ && FT_DEBUG_LEVEL_TRACE]: Include stdio.h and + stdarg.h. + + (FT_TRACE) [_STANDALONE_]: Remove. + (FT_Message) [_STANDALONE_ && FT_DEBUG_LEVEL_TRACE]: New function. + (FT_TRACE5, FT_TRACE7) [_STANDALONE_]: New macros. + (FT_ERROR) [_STANDALONE_]: Updated. + + (gray_hline) [FT_DEBUG_LEVEL_TRACE]: Fix condition. + Use FT_TRACE7. + (gray_dump_cells): Make it `static void'. + (gray_convert_glyph): Use FT_TRACE7. + + (FT_Outline_Decompose) [_STANDALONE_]: Synchronize with version in + ftoutln.c. + + * src/base/ftadvanc.c (FT_Get_Advance, FT_Get_Advances): Use + FT_ERROR_BASE. + + * docs/formats.txt: Updated. + +2008-09-19 suzuki toshiya + + * src/base/ftmac.c: Import sfnt-wrapped Type1 and sfnt-wrapped + CID-keyed font support. + * builds/mac/ftmac.c: Ditto. + +2008-09-19 suzuki toshiya + + * src/base/ftobjs.c (Mac_Read_sfnt_Resource): Fix double free bug in + sfnt-wrapped Type1 and sfnt-wrapped CID-keyed font support code. + `open_face_from_buffer' frees the passed buffer if it cannot open a + face from the buffer, so the caller must not free it. + +2008-09-19 suzuki toshiya + + * src/base/ftobjs.c (Mac_Read_sfnt_Resource): Add initial support + for sfnt-wrapped Type1 and sfnt-wrapped CID-keyed font. + (ft_lookup_PS_in_sfnt): New function to look up `TYP1' or `CID ' + table in sfnt table directory. It is used before loading TrueType + font driver. + + * docs/CHANGES: Add note about the current status of sfnt-wrapped + Type1 and sfnt-wrapped CID-keyed font support. + +2008-09-18 Werner Lemberg + + * src/base/ftsystem.c (FT_Done_Memory): Use ft_sfree directly for + orthogonality (ft_free and ft_sfree could belong to different memory + pools). This fixes Savannah bug #24297. + +2008-09-18 suzuki toshiya + + * src/cff/cffobjs.c (cff_face_init): Use TTAG_OTTO defined + in ttags.h instead of numerical value 0x4F54544FL. + +2008-09-16 Werner Lemberg + + * src/cff/cffgload.h, src/cff/cffgload.c + (cff_decoder_set_width_only): Eliminate function call. + +2008-09-15 George Williams + + Fix Savannah bug #24179, reported by Bram Tassyns. + + * src/type1/t1load.c (mm_axis_unmap, T1_Get_MM_Var): Fix computation + of default values. + +2008-09-15 Werner Lemberg + + * src/tools/glnames.py (main): Surround `ft_get_adobe_glyph_index' + and `ft_adobe_glyph_list' with FT_CONFIG_OPTION_ADOBE_GLYPH_LIST to + prevent unconditional definition. This fixes Savannah bug #24241. + + * src/psnames/pstables.h: Regenerated. + +2008-09-13 Werner Lemberg + + * autogen.sh, builds/unix/configure.raw, + include/freetype/config/ftconfig.h, builds/unix/ftconfig.in: Minor + beautifying. + + * include/freetype/ftadvanc.h, include/freetype/ftgasp.h, + include/freetype/ftlcdfil.h: Protect against FreeType 1. + Some other minor fixes. + + * devel/ftoption.h: Synchronize with + include/freetype/config/ftoption.h. + +2008-09-11 Werner Lemberg + + * src/base/ftbase.c: Include ftadvanc.c. + +2008-09-11 suzuki toshiya + + * builds/unix/ftconfig.in: Duplicate the cpp computation of + FT_SIZEOF_{INT|LONG} from include/freetype/config/ftconfig.h. + (FT_USE_AUTOCONF_SIZEOF_TYPES): New macro. If defined, the cpp + computation is disabled and the statically configured sizes are + used. This fixes Savannah bug #21250. + + * builds/unix/configure.raw: Add the checks to compare the cpp + computation results of the bit length of int and long versus the + sizes detected by running `configure'. If the results are + different, FT_USE_AUTOCONF_SIZEOF_TYPES is defined to prioritize the + results. + New option --{enable|disable}-biarch-config is added to define or + undefine FT_USE_AUTOCONF_SIZEOF_TYPES manually. + +2008-09-05 suzuki toshiya + + * builds/unix/configure.raw: Clear FT2_EXTRA_LIBS when Carbon or + ApplicationService framework is missing. Although this value is not + used in building of FreeType2, it is written in `freetype2.pc' and + `freetype-config'. + +2008-09-01 david turner + + * src/cache/ftccmap.c (FTC_CMapCache_Lookup): Accept a negative cmap + index to mean `use default cached FT_Face's charmap'. This fixes + Savannah bug #22625. + * include/freetype/ftcache.h: Document it. + + + Make FT_MulFix an inlined function. This is done to speed up + FreeType a little (on x86 3% when loading+hinting, 10% when + rendering, ARM savings are more important though). Disable this by + undefining FT_CONFIG_OPTION_INLINE_MULFIX. + + Use of assembler code can now be controlled with + FT_CONFIG_OPTION_NO_ASSEMBLER. + + * include/freetype/config/ftconfig.h, builds/unix/ftconfig.in + [!FT_CONFIG_OPTION_NO_ASSEMBLER] (FT_MulFix_arm): New assembler + implementation. + [!FT_CONFIG_OPTION_NO_ASSEMBLER] (FT_MulFix_i386): Assembler + implementation taken from `ftcalc.c'. + [!FT_CONFIG_OPTION_NO_ASSEMBLER] (FT_MULFIX_ASSEMBLER): New macro + which is defined to the platform-specific assembler implementation + of FT_MulFix. + [FT_CONFIG_OPTION_INLINE_MULFIX && FT_MULFIX_ASSEMBLER] + (FT_MULFIX_INLINED): New macro. + + * include/freetype/config/ftoption.h (FT_CONFIG_OPTION_NO_ASSEMBLER, + FT_CONFIG_OPTION_INLINE_MULFIX): New macros. + + * include/freetype/freetype.h: Updated to handle FT_MULFIX_INLINED. + + * src/base/ftcalc.c: Updated to use FT_MULFIX_ASSEMBLER and + FT_MULFIX_INLINED. + + + Add a new header named FT_ADVANCES_H declaring some new APIs to + extract the advances of one or more glyphs without necessarily + loading their outlines. Also provide `fast loaders' for the + TrueType, Type1, and CFF font drivers (more to come later). + + * src/base/ftadvanc.c, include/freetype/ftadvanc.h: New files. + + * include/freetype/config/ftheader.h (FT_ADVANCES_H): New macro. + * include/freetype/freetype.h (FT_LOAD_ADVANCE_ONLY): New macro. + + * include/freetype/internal/ftdriver.h (FT_Face_GetAdvancesFunc): + `flags' and `advances' are now of type `FT_UInt' and `FT_Fixed', + respectively. + + * src/base/Jamfile (_sources), src/base/rules.mk (BASE_SRC): Add + ftadvanc.c. + + * src/cff/cffdrivr.c (cff_get_advances): New function. + (cff_driver_class): Register it. + + * src/cff/cffgload.c (cff_decoder_set_width_only): New function. + (cff_decoder_parse_charstrings): Handle `width_only'. + (cff_slot_load): Handle FT_LOAD_ADVANCE_ONLY. + + * src/cff/cffgload.h (cff_decoder): New element `width_only'. + (cff_decoder_set_width_only): New declaration. + + * src/truetype/ttdriver.c (tt_get_advances): New function. + (tt_driver_class): Register it. + + * src/truetype/ttgload.c (Get_HMetrics, Get_VMetrics): Renamed to... + (TT_Get_HMetrics, TT_Get_VMetrics): This. + Update callers. + * src/truetype/ttgload.h: Declare them. + + * src/type1/t1gload.h, src/type1/t1gload.c (T1_Get_Advances): New + function. + * src/type1/t1driver.c (t1_driver_class): Register T1_Get_Advances. + + + Add checks for minimum version of the `autotools' stuff. + + * autogen.sh: Implement it. + (get_major_version, get_minor_version, get_patch_version, + compare_to_minimum_version, check_tool_version): New auxiliary + functions. + + * README.CVS: Document it. + +2008-08-29 suzuki toshiya + + * src/sfnt/sfobjs.c (sfnt_open_font): Use TTAG_OTTO defined in + ttags.h instead of FT_MAKE_TAG( 'O', 'T', 'T', 'O' ). + +2008-08-28 Werner Lemberg + + * src/type1/t1load.c (parse_encoding): Protect against infinite + loop. This fixes Savannah bug #24150 (where a patch has been posted + too). + +2008-08-23 Werner Lemberg + + * src/type/t1afm.c (compare_kern_pairs), src/pxaux/afmparse.c + (afm_compare_kern_pairs): Fix comparison. This fixes Savannah bug + #24119. + +2008-08-19 suzuki toshiya + + * src/base/ftobjs.c (FT_Stream_New): Initialize *astream always, + even if passed library or arguments are invalid. This fixes a bug + that an uninitialized stream is freed when an invalid library handle + is passed. Originally proposed by Mike Fabian, 2008/08/18 on + freetype-devel. + (FT_Open_Face): Ditto (stream). + (load_face_in_embedded_rfork): Ditto (stream2). + +2008-08-18 suzuki toshiya + + * src/base/ftmac.c: Add a fallback to guess the availability of the + `ResourceIndex' type. It is used when built without configure + (e.g., a build with Jam). + * builds/mac/ftmac.c: Ditto. + * builds/unix/configure.raw: Set HAVE_TYPE_RESOURCE_INDEX to 1 or 0 + explicitly, even if `ResourceIndex' is unavailable. + +2008-08-18 suzuki toshiya + + * builds/unix/configure.raw: In checking of Mac OS X features, + all-in-one header file `Carbon.h' is replaced by the minimum + header file `CoreServices.h', similar to current src/base/ftmac.c. + +2008-08-18 suzuki toshiya + + * src/sfnt/ttcmap.c (tt_cmap2_validate): Skip the validation of + sub-header when its code_count is 0. Many Japanese Dynalab fonts + include such an empty sub-header (code_count == 0, first_code == 0 + delta == 0, but offset != 0) as the second sub-header in SJIS cmap. + +2008-08-04 Werner Lemberg + + * src/type1/t1tokens.h: Handle `ForceBold' keyword. This fixes + Savannah bug #23995. + + * src/cid/cidload.c (parse_expansion_factor): New callback function. + (cid_field_records): Use it for `ExpansionFactor'. + * src/cod/cidtoken.h: Handle `ForceBold' keyword. + Don't handle `ExpansionFactor'. + +2008-08-04 Bram Tassyns + + * src/cff/cffparse.c (cff_parse_fixed_scaled): Fix thinko which + resulted in incorrect scaling. This fixes Savannah bug #23973. + +2008-08-04 Werner Lemberg + + Be more tolerant w.r.t. invalid entries in SFNT table directory. + + * src/sfnt/ttload.c (check_table_dir): Ignore invalid entries and + adjust table count. + Add more trace messages. + (tt_face_load_font_dir): Updated. + +2008-07-30 Werner Lemberg + + * src/cff/cffgload.c (cff_decoder_parse_charstrings): No longer + assume that the first argument on the stack is the bottom-most + element. Two reasons: + + o According to people from Adobe it is missing in the Type 2 + specification that pushing of additional, superfluous arguments + on the stack is prohibited. + + o Acroread in general handles fonts differently, namely by popping + the number of arguments needed for a particular operand (as a PS + interpreter would do). In case of buggy fonts this causes a + different interpretation which of the elements on the stack are + superfluous and which not. + + Since there are CFF subfonts (embedded in PDFs) which rely on + Acroread's behaviour, FreeType now does the same. + +2008-07-27 Werner Lemberg + + Add extra mappings for `Tcommaaccent' and `tcommaaccent'. This + fixes Savannah bug #23940. + + * src/psnames/psmodule.c (WGL_EXTRA_LIST_SIZE): Rename to... + (EXTRA_GLYPH_LIST_SIZE): This. + Increase by 2. + (ft_wgl_extra_unicodes): Rename to... + (ft_extra_glyph_unicodes): This. + Add two code values. + (ft_wgl_extra_glyph_names): Rename to... + (ft_extra_glyph_names): This. + Add two glyphs. + (ft_wgl_extra_glyph_name_offsets): Rename to... + (ft_extra_glyph_name_offsets): This. + Add two offsets. + + (ps_check_wgl_name, ps_check_wgl_unicode): Rename to... + (ps_check_extra_glyph_name, ps_check_extra_glyph_unicode): This. + Updated. + (ps_unicodes_init): Updated. + +2008-07-26 Werner Lemberg + + * src/cff/cffgload.c (cff_decoder_prepare, + cff_decoder_parse_charstrings): Improve debug output. + +2008-07-22 Martin McBride + + * src/sfnt/ttcmap.c (tt_cmap4_validate, tt_cmap4_char_map_linear, + tt_cmap4_char_map_binary): Handle fonts which treat the last segment + specially. According to the specification, such fonts would be + invalid but acroread accepts them. + +2008-07-16 Jon Foster + + * src/pfr/pfrdrivr.c (pfr_get_advance): Fix off-by-one error. + + * src/base/ftcalc.c (FT_MulFix): Fix portability issue. + + * src/sfnt/ttpost.c (MAC_NAME) [!FT_CONFIG_OPTION_POSTSCRIPT_NAMES]: + Fix compiler warning. + +2008-07-16 Werner Lemberg + + Handle CID-keyed fonts wrapped in an SFNT (with cmaps) correctly. + + * src/cff/cffload.c (cff_font_load): Pass `pure_cff'. + Invert sids table only if `pure_cff' is set. + * src/cff/cffload.h: Udpated. + + * src/cff/cffobjs.c (cff_face_init): Updated. + Set FT_FACE_FLAG_CID_KEYED only if pure_cff is set. + + * docs/CHANGES: Updated. + +2008-07-09 Werner Lemberg + + * src/truetype/ttpload.c (tt_face_load_loca): Handle buggy fonts + where num_locations < num_glyphs. Problem reported by Ding Li. + +2008-07-05 Werner Lemberg + + Since FreeType uses `$(value ...)', we now need GNU make 3.80 or + newer. This fixes Savannah bug #23648. + + * configure: zsh doesn't like ${1+"$@"}. + Update needed GNU make version. + * builds/toplevel.mk: Check for `$(eval ...)'. + * docs/INSTALL.GNU, docs/INSTALL.CROSS, docs/INSTALL.UNIX: Document + it. + +2008-07-04 Werner Lemberg + + * src/raster/ftraster.c (Draw_Sweep): If span is smaller than one + pixel, only check for dropouts if neither start nor end point lies + on a pixel center. This fixes Savannah bug #23762. + +2008-06-29 Werner Lemberg + + * Version 2.3.7 released. + ========================= + + + Tag sources with `VER-2-3-7'. + + * docs/CHANGES, docs/VERSION.DLL: Update documentation and bump + version number to 2.3.7. + + * README, Jamfile (RefDoc), builds/win32/visualc/index.html, + builds/win32/visualc/freetype.dsp, + builds/win32/visualc/freetype.vcproj, + builds/win32/visualce/index.html, + builds/win32/visualce/freetype.dsp, + builds/win32/visualce/freetype.vcproj: s/2.3.6/2.3.7/, s/236/237/. + + * include/freetype/freetype.h (FREETYPE_PATCH): Set to 7. + + * builds/unix/configure.raw (version_info): Set to 9:18:3. + + * docs/release: Updated. + +2008-06-28 Werner Lemberg + + * src/ftglyph.c (FT_Matrix_Multiply, FT_Matrix_Invert): Move to... + * src/ftcalc.c: Here. This fixes Savannah bug #23729. + +2008-06-27 Werner Lemberg + + * src/raster/ftraster.c (Vertical_Sweep_Drop, Horizontal_Sweep_Drop, + Horizontal_Gray_Sweep_Drop): Test for intersections which + degenerate to a single point can be ignored; this has been confirmed + by Greg Hitchcock from Microsoft. (This was commented out code.) + +2008-06-26 Werner Lemberg + + Improve navigation in API reference. + + * src/tools/docmaker/tohtml.py (html_header_3): Renamed to... + (html_header_6): This. + (html_header_3, html_header_3i, html_header_4, html_header_5, + html_header_5t): New strings. + (toc_footer_start, toc_footer_end): New strings. + (HtmlFormatter::html_header): Updated. + (HtmlFormatter::html_index_header, HtmlFormatter::html_toc_header): + New strings. + (HtmlFormatter::index_enter): Use `html_index_header'. + (HtmlFormatter::index_exit): Print `html_footer'. + (HtmlFormatter::toc_enter): Use `html_toc_header'. + (HtmlFormatter::toc_exit): Print proper footer. + + Convert ~ to non-breakable space. + + * src/tools/docmaker/tohtml.py (make_html_para): Implement it. + Update header files accordingly. + +2008-06-24 suzuki toshiya + + * builds/unix/configure.raw: Check type `ResourceIndex' explicitly + and define HAVE_TYPE_RESOURCE_INDEX if it is defined. Mac OS X 10.5 + bundles 10.4u SDK with MAC_OS_X_VERSION_10_5 macro but without + ResourceIndex type definition. The macro does not inform the type + availability. + * src/base/ftmac.c: More parentheses are inserted to clarify the + conditionals to disable legacy APIs in `10.5 and later' cases. If + HAVE_TYPE_RESOURCE_INDEX is not defined, ResourceIndex is defined. + +2008-06-24 Werner Lemberg + + * src/truetype/ttinterp.c (Ins_SCANTYPE): Don't check rendering + mode. + + * src/raster/ftraster.c (Render_Glyph, Render_Gray_Glyph, + Draw_Sweep): No-dropout mode is value 2, not value 0. + (Draw_Sweep): Really skip dropout handling for no-dropout mode. + +2008-06-24 Werner Lemberg + + * src/psaux/psobjs.c (t1_builder_close_contour): Don't add contour + if it consists of one point only. Based on a patch from Savannah + bug #23683 (from John Tytgat). + +2008-06-22 Werner Lemberg + + * src/truetype/ttgload.c (TT_Load_Glyph): Protect bytecode stuff + with IS_HINTED. + + * docs/CHANGES: Updated. + +2008-06-22 suzuki toshiya + + * builds/unix/configure.raw: If CFLAGS has `-isysroot XXX' option + but LDFLAGS does not, import it to LDFLAGS. The option is used to + specify non-default SDK on Mac OS X (e.g., universal binary SDK for + Mac OS X 10.4 on PowerPC platform). Although Apple TechNote 2137 + recommends to add the option only to CFLAGS, LDFLAGS should include + it because libfreetype.la is built with -no-undefined. This fixes a + bug reported by Ryan Schmidt in MacPorts, + http://trac.macports.org/ticket/15331. + +2008-06-21 Werner Lemberg + + Enable access to the various dropout rules of the B&W rasterizer. + Pass dropout rules from the TT bytecode interpreter to the + rasterizer. + + * include/freetype/ftimage.h (FT_OUTLINE_SMART_DROPOUTS, + FT_OUTLINE_EXCLUDE_STUBS): New flags for FT_Outline. + + * src/raster/ftraster.c (Vertical_Sweep_Drop, Horizontal_Sweep_Drop, + Horizontal_Gray_Sweep_Drop): Use same mode numbers as given in the + OpenType specification. + Fix mode 4 computation. + (Render_Glyph, Render_Gray_Glyph): Handle new outline flags. + + * src/truetype/ttgload.c (TT_Load_Glyph) Convert scan conversion + mode to FT_OUTLINE_XXX flags. + + * src/truetype/ttinterp.c (Ins_SCANCTRL): Enable ppem check. + +2008-06-19 Werner Lemberg + + * src/cff/cffobjs.c (cff_face_init): Compute final + `dict->units_per_em' value before assigning it to + `cffface->units_per_EM'. Otherwise, CFFs without subfonts are + scaled incorrectly if the font matrix is non-standard. This fixes + Savannah bug #23630. + + * docs/CHANGES: Updated. + +2008-06-19 Werner Lemberg + + * src/type/t1objs.c (T1_Face_Init): Slightly improve algorithm fix + from 2008-06-19. + +2008-06-18 Werner Lemberg + + * src/type/t1objs.c (T1_Face_Init): Fix change from 2008-03-21. + Reported by Peter Weilbacher . + + * docs/CHANGES: Updated. + +2008-06-15 George Williams + + * src/otvalid/otvgpos.c (otv_MarkBasePos_validate): Set + `valid->extra2' to 1. This is undocumented in the OpenType 1.5 + specification. + +2008-06-15 Werner Lemberg + + * src/base/ftcalc.c (FT_MulFix) : Protect registers correctly + from clobbering. Patch from Savannah bug report #23556. + + * docs/CHANGES: Document it. + +2008-06-10 Werner Lemberg + + * autogen.sh: Add option `--install' to libtoolize. + +2008-06-10 Werner Lemberg + + * Version 2.3.6 released. + ========================= + + + Tag sources with `VER-2-3-6'. + + * docs/CHANGES, docs/VERSION.DLL: Update documentation and bump + version number to 2.3.6. + + * README, Jamfile (RefDoc), builds/win32/visualc/index.html, + builds/win32/visualc/freetype.dsp, + builds/win32/visualc/freetype.vcproj, + builds/win32/visualce/index.html, + builds/win32/visualce/freetype.dsp, + builds/win32/visualce/freetype.vcproj: s/2.3.5/2.3.6/, s/235/236/. + + * include/freetype/freetype.h (FREETYPE_PATCH): Set to 6. + + * builds/unix/configure.raw (version_info): Set to 9:17:3. + + + * include/freetype/internal/psaux.h (T1_BuilderRec): Remove `scale_x' + and `scale_y'. + * src/cff/cffgload.h (CFF_Builder): Remove `scale_x' and `scale_y'. + + + * src/cff/cffparse.c: Include FT_INTERNAL_DEBUG_H. + * src/cff/cffobjs.h: Include FT_INTERNAL_POSTSCRIPT_HINTS_H. + +2008-06-10 Werner Lemberg + + * src/base/ftobjs.c (open_face): Check `clazz->init_face' and + `clazz->done_face'. + +2008-06-09 VaDiM + + Support debugging on WinCE. From Savannah patch #6536; this fixes + bug #23497. + + * builds/win32/ftdebug.c (OutputDebugStringEx): New function/macro + as a replacement for OutputDebugStringA (which WinCE doesn't have). + Update all callers. + (ft_debug_init) [_WIN32_CE]: WinCE apparently doesn't have + environment variables. + +2008-06-09 Werner Lemberg + + * README.CVS: Updated. + + * builds/unix/configure.raw, builds/unix/freetype-config.in: Updated + for newer versions of autoconf and friends. + +2008-06-08 Werner Lemberg + + * src/type1/t1parse.h (T1_ParserRec): Make `base_len' and + `private_len' unsigned. + + * src/type1/t1parse.c (read_pfb_tag): Make `asize' unsigned and read + it as such. + (T1_New_Parser, T1_Get_Private_Dict): Make `size' unsigned. + + + * src/base/ftstream.c (FT_Stream_Skip): Reject negative values. + + + * src/type1/t1load.c (parse_blend_design_positions): Check `n_axis' + for sane value. + Fix typo. + + + * src/psaux/psobjs.c (ps_table_add): Check `idx' correctly. + + + * src/truetype/ttinterp (Ins_SHC): Use BOUNDS() to check + `last_point'. + + + * src/sfnt/ttload.c (tt_face_load_max_profile): Limit + `maxTwilightPoints'. + +2008-06-06 Werner Lemberg + + * src/truetype/ttinterp.c (Ins_IP): Handle case `org_dist == 0' + correctly. This fixes glyphs `t' and `h' of Arial Narrow at 12ppem. + +2008-06-03 Werner Lemberg + + * include/freetype/ftcache.h (FTC_FaceID): Change type back to + FT_Pointer. Reported by Ian Britten . + +2008-06-02 Werner Lemberg + + Emit header info for defined FreeType objects in reference. + + * src/tools/docmaker/content.py (re_header_macro): New regexp. + (ContentProcessor::__init__): Initialize new dictionary `headers'. + (DocBlock::__init__): Collect macro header definitions. + + * src/tools/docmaker/tohtml.py (header_location_header, + header_location_footer): New strings. + (HtmlFormatter::__init__): Pass `headers' dictionary. + (HtmlFormatter::print_html_field): Don't emit paragraph tags. + (HtmlFormatter::print_html_field_list): Emit empty paragraph. + (HtmlFormatter::block_enter): Emit header info. + +2008-06-01 Werner Lemberg + + * include/freetype/config/ftheader.h (FT_UNPATENTED_HINTING_H, + FT_INCREMENTAL_H): Added. + +2008-05-28 Werner Lemberg + + * src/tools/docmaker/sources.py (SourceBlock::__init__): While + looking for markup tags, return immediately as soon a single one is + found. + +2008-05-28 Werner Lemberg + + * src/truetype/ttinterp.c (Ins_MD): The MD instruction also uses + original, unscaled input values. Confirmed by Greg Hitchcock from + Microsoft. + +2008-05-27 Werner Lemberg + + * src/tools/docmaker/tohtml.py (block_footer_start, + block_footer_middle): Beautify output. + +2008-05-25 Werner Lemberg + + * src/raster/ftraster.c (fc_black_render): Return 0 when we are + trying to render into a zero-width/height bitmap, not an error code. + + * src/truetype/ttgload.c (load_truetype_glyph): Move initialization + of the graphics state for subglyphs to... + (TT_Hint_Glyph): This function. + Hinting instructions for a composite glyph apparently refer to the + just hinted subglyphs, not the unhinted, unscaled outline. This + seems to fix Savannah bugs #20973 and (at least partially) #23310. + +2008-05-20 suzuki toshiya + + * src/base/ftmac.c (FT_New_Face_From_Suitcase): Check if valid + `aface' is returned by FT_New_Face_From_FOND(). The patch was + proposed by an anonymous reporter of Savannah bug #23204. + +2008-05-18 Werner Lemberg + + * src/pshinter/pshalgo.c (ps_hints_apply): Reset scale values after + correction for pixel boundary. Without this patch, the effect can + be cumulative under certain circumstances, making glyphs taller and + taller after each call. This fixes Savannah bug #19976. + +2008-05-18 Werner Lemberg + + * src/base/ftdebug.c (FT_Message, FT_Panic): Send output to stderr. + This fixes Savannah bug #23280. + + * docs/CHANGES: Updated. + +2008-05-18 David Turner + + * src/psnames/psmodule.c (ft_wgl_extra_unicodes, + ft_wgl_extra_glyph_names, ft_wgl_extra_glyph_name_offsets, + ps_check_wgl_name, ps_check_wgl_unicode): Use `static' to make + declarations non-global. + + * src/type1/t1load.c: Add missing comment. + +2008-05-17 Sam Hocevar + + * src/truetype/ttgload.c (TT_Load_Simple_Glyph): Handle zero-contour + glyphs correctly. Patch from Savannah bug #23277. + +2008-05-16 Werner Lemberg + + * docs/CHANGES: Updated. + +2008-05-16 Sergey Tolstov + + Improve support for WGL4 encoded fonts. + + * src/psnames/psmodule.c (WGL_EXTRA_LIST_SIZE): New macro. + (ft_wgl_extra_unicodes, ft_wgl_extra_glyph_names, + ft_wgl_extra_glyph_name_offsets): New arrays. + (ps_check_wgl_name, ps_check_wgl_unicode): New functions. + (ps_unicodes_init): Use them to add additional Unicode mappings. + +2008-05-15 Werner Lemberg + + * src/psaux/t1decode.c (t1_decoder_parse_charstrings) + : `closepath' without a path is a no-op, not an error + (cf. the PS reference manual). + + Reported by Martin McBride. + +2008-05-15 Werner Lemberg + + * builds/toplevel.mk (CONFIG_GUESS, CONFIG_SUB): Updated. + +2008-05-15 Werner Lemberg + + * src/type1/t1load.c (parse_subrs): Accept fonts with a subrs array + which contains a single but empty entry. This is technically + invalid (since it must end with `return'), but... + + Reported by Martin McBride. + +2008-05-14 Werner Lemberg + + Finish fix of scaling bug of CID-keyed CFF subfonts. + + * include/freetype/internal/ftcalc.h, src/base/ftcalc.c + (FT_Matrix_Multiply_Scaled, FT_Vector_Transform_Scaled): New + functions. + + * src/cff/cffobjs.h (CFF_Internal): New struct. It is used to + provide global hinting data for both the top-font and all subfonts + (with proper scaling). + + * src/cff/cffobjs.c (cff_make_private_dict): New function, using + code from `cff_size_init'. + (cff_size_init, cff_size_done, cff_size_select, cff_size_request): + Use CFF_Internal and handle subfonts. + (cff_face_init): Handle top-dict and subfont matrices correctly; + apply some heuristic in case of unlikely matrix concatenation + results. This has been discussed with people from Adobe (thanks + goes mainly to David Lemon) who confirm that the CFF specs are fuzzy + and not correct. + + * src/cff/cffgload.h (cff_decoder_prepare): Add `size' argument. + + * src/cff/cffgload.c (cff_builder_init): Updated. + (cff_decoder_prepare): Handle hints globals for subfonts. + Update all callers. + (cff_slot_load): Handling scaling of subfonts properly. + + * src/cff/cffparse.c (cff_parse_fixed_dynamic): New function. + (cff_parse_font_matrix): Use it. + + * src/cff/cfftypes.h (CFF_FontDictRec): Make `units_per_em' + FT_ULong. + + * docs/CHANGES: Document it. + +2008-05-13 Werner Lemberg + + * src/winfonts/winfnt.c (fnt_face_get_dll_font, FNT_Face_Init): + Handle case `face_index < 0'. + * docs/CHANGES: Document it. + +2008-05-04 Werner Lemberg + + First steps to fix the scaling bug of CID-keyed CFF subfonts, + reported by Ding Li on 2008/03/28 on freetype-devel. + + * src/base/cff/cffparse.c (power_tens): New array. + (cff_parse_real): Rewritten to introduce a fourth parameter which + returns the `scaling' of the real number so that we have no + precision loss. This is not used yet. + Update all callers. + (cff_parse_fixed_thousand): Replace with... + (cff_parse_fixed_scaled): This function. Update all callers. + +2008-05-03 Werner Lemberg + + * src/base/ftobjs.c (FT_Load_Glyph): Call the auto-hinter without + transformation since it recursively calls FT_Load_Glyph. This fixes + Savannah bug #23143. + +2008-04-26 Werner Lemberg + + * include/freetype/internal/psaux.h (T1_BuilderRec): Mark `scale_x' + and `scale_y' as obsolete since they aren't used. + * src/psaux/psobjs.c (t1_builder_init): Updated. + + * src/cff/cffgload.h (CFF_Builder): Mark `scale_x' and `scale_y' as + obsolete since they aren't used. + * src/cff/cffgload.c (cff_builder_init): Updated. + +2008-04-14 Werner Lemberg + + * src/pcf/pcfdrivr.c (PCF_Face_Init): Protect call to + `FT_Stream_OpenLZW' with `FT_CONFIG_OPTION_USE_LZ'. From Savannah + bug #22909. + +2008-04-13 Werner Lemberg + + * src/psaux/psconv.c (PS_Conv_ToFixed): Increase precision if + integer part is zero. + +2008-04-01 Werner Lemberg + + Fix compilation with g++ 4.1 (with both `single' and `multi' + targets). + + * src/base/ftobjs.c (FT_Open_Face): Don't define a variable in block + which is crossed by a `goto'. + + * src/otvalid/otvalid.h (otv_MATH_validate): Add prototype. + +2008-03-31 Werner Lemberg + + Fix support for subsetted CID-keyed CFFs. + + * include/freetype/freetype.h (FT_FACE_FLAG_CID_KEYED, + FT_IS_CID_KEYED): New macros. + + * src/cff/cffobjs.c (cff_face_init): Set number of glyphs to the + maximum CID value in CID-keyed CFFs. + Handle FT_FACE_FLAG_CID_KEYED flag. + + * docs/CHANGES: Document it. + + + Fix CFF font matrix calculation and improve precision. + + * src/cff/cffparse.c (cff_parse_real): Increase precision if integer + part is zero. + (cff_parse_font_matrix): Simplify computation of `units_per_em'; + this prevents overflow also. + + + Support FT_Get_CID_Registry_Ordering_Supplement for PS CID fonts. + + * src/cid/cidriver.c: Include FT_SERVICE_CID_H. + (cid_get_ros): New function. + (cid_service_cid_info): New service structure. + (cid_services): Register it. + +2008-03-23 Werner Lemberg + + Adjustments for Visual C++ 8.0, as reported by Rainer Deyke. + + * builds/compiler/visualc.mk (CFLAGS): Remove /W5. + (ANSIFLAGS): Add _CRT_SECURE_NO_DEPRECATE. + +2008-03-21 Laurence Darby + + * src/type1/t1objs.c (T1_Face_Init): Use `/Weight'. Patch from + Savannah bug #22675. + +2008-03-13 Derek Clegg + + * src/truetype/ttgxvar.c (TT_Get_MM_Var): Fix named style loop. + Patch from Savannah bug #22541. + +2008-03-03 Masatoshi Kimura + + * src/sfnt/ttcmap.c (tt_cmap14_char_map_nondef_binary, + tt_cmap14_find_variant): Return correct value. + (tt_cmap14_variant_chars): Fix check for `di'. + +2008-02-29 Wermer Lemberg + + * docs/CHANGES: Updated. + +2008-02-29 Wolf + + Add build support for symbian platform. From Savannah bug #22440. + + * builds/symbian/*: New files. + +2008-02-21 suzuki toshiya + + * src/base/ftmac.c (parse_fond): Fix a bug of PostScript font name + synthesis. For any face of a specified FOND, always the name for + the first face was used. Except of a FOND that refers multiple + Type1 font files, wrong synthesized font names are not used at all, + so this is an invisible bug. A few limit checks are added too. + + * builds/mac/ftmac.c: Ditto. + +2008-02-21 suzuki toshiya + + * builds/unix/configure.raw: Split compiler option to link Carbon + frameworks to one option for CoreServices framework and another + option for ApplicationServices framework. The split options can be + managed by GNU libtool to avoid unrequired duplication when FreeType + is linked with other applications. Suggested by Daniel Macks, + Savannah bug #22366. + +2008-02-18 Victor Stinner + + * src/truetype/ttinterp.c (Ins_IUP): Check number of points. Fix + from Savannah bug #22356. + +2008-02-17 Jonathan Blow + + * src/autofit/afloader.c (af_loader_load_g, af_loader_load_glyph): + Check for valid callback pointers. + +2008-02-15 suzuki toshiya + + * src/base/ftmac.c (FT_New_Face_From_SFNT): Check the sfnt resource + handle by its value instead of ResError(), fix provided by Deron + Kazmaier. According to the Resource Manager Reference, + GetResource(), Get1Resource(), GetNamedResource(), + Get1NamedResource() and RGetResource() set noErr but return NULL + handle when they can not find the requested resource. These + functions never return undefined values, so it is sufficient to + check if the handle is not NULL. + + * builds/mac/ftmac.c (FT_New_Face_From_SFNT): Ditto. + +2008-02-14 suzuki toshiya + + * src/base/ftbase.c: is replaced by "ftmac.c" as other + inclusion styles. Now it always includes src/base/ftmac.c; + builds/mac/ftmac.c is never included in any configuration. + + * builds/unix/configure.raw: Print warning if configure is executed + with options to specify Carbon functionalities explicitly. + + * docs/INSTALL.MAC: Note that legacy builds/mac/ftmac.c is not + included automatically and manual replacement is required. + +2008-02-11 Werner Lemberg + + * builds/modules.mk (CLOSE_MODULE, REMOVE_MODULE), builds/detect.mk + (dos_setup), builds/freetype.mk (clean_project_dos, + distclean_project_dos): Don't use \ but $(SEP). Reported by Duncan + Murdoch. + +2008-01-18 Sylvain Pasche + + * src/base/ftlcdfil.c (_ft_lcd_filter_legacy): Updated comment to + mention intra-pixel algorithm. + + * include/freetype/freetype.h (FT_Render_Mode): Mention that + FT_Library_SetLcdFilter can be used to reduce fringes. + +2008-01-16 Werner Lemberg + + * src/raster/ftraster.c (ft_black_render): Check `outline' before + using it. Reported by Allan Yang. + +2008-01-12 Werner Lemberg + + * src/raster/ftraster.c (FT_CONFIG_OPTION_5_GRAY_LEVELS): Remove. + +2008-01-12 Allan Yang, Jian Hua - SH + + * src/raster/ftraster.c (ft_black_init) + [FT_RASTER_OPTION_ANTI_ALIASING]: Fix compilation. + +2008-01-10 Werner Lemberg + + * src/truetype/ttgload.c (load_truetype_glyph): Handle the case + where the number of contours in a simple glyph is zero (and which + does contain an entry in the `glyf' table). This fixes Savannah bug + #21990. + +2008-01-04 suzuki toshiya + + Formatting suggested by Sean McBride. + + * builds/mac/ftmac.c: Formatting (tab expanded). + * src/autofit/afindic.c: Ditto. + * src/base/ftcid.c: Ditto. + * src/base/ftmac.c: Ditto. + +2007-12-30 Werner Lemberg + + * src/smooth/ftgrays.c (gray_raster_render): Check `outline' + correctly. + +2007-12-21 suzuki toshiya + + Improvement of POSIX resource-fork accessor to load unsorted + references in a resource. In HelveLTMM (resource-fork PostScript + Type1 font bundled with Mac OS X since 10.3.x), the appearance order + of PFB chunks is not sorted; sorting the chunks by reference IDs is + required. + + * include/freetype/internal/ftrfork.h (FT_RFork_Ref): New structure + type to store a pair of reference ID and offset to the chunk. + + * src/base/ftrfork.c (ft_raccess_sort_ref_by_id): New function to + sort FT_RFork_Ref by their reference IDs. + + (FT_Raccess_Get_DataOffsets): Returns an array of offsets that is + sorted by reference ID. + +2007-12-14 Werner Lemberg + + * src/cff/cffparse.c (cff_parse_real): Don't apply `power_ten' + division too early; otherwise the most significant digit(s) of the + final result are lost as the value is truncated to an integer. This + fixes Savannah bug #21794 (where the patch has been posted too). + +2007-12-06 Fix <4d876b82@gmail.com> + + Pass options from one configure script to another as-is (not + expanded). This is needed for options like + --includedir='${prefix}/include'. + + * builds/unix/detect.mk, configure: Prevent argument expansion in + call to the (real) `configure' script. + +2007-12-06 Werner Lemberg + + * src/truetype/ttgload.c (load_truetype_glyph): Fix compilation if + TT_USE_BYTECODE_INTERPRETER isn't defined. + +2007-12-06 Werner Lemberg + + There exist CFFs which contain opcodes for the Type 1 operators + `hsbw' and `closepath' which are both invalid in Type 2 charstrings. + However, it doesn't harm to support them. + + * src/cff/cffgload.c (CFF_Operator): Add `cff_op_hsbw' and + `cff_op_closepath.' + (cff_argument_counts): Ditto. + + (cff_decoder_parse_charstrings): Handle Type 1 opcodes 9 (closepath) + and 13 (hsbw) which are invalid in Type 2 charstrings. + +2007-12-06 suzuki toshiya + + * src/base/ftrfork.c (raccess_guess_darwin_newvfs): New function to + support new pathname syntax `..namedfork/rsrc' to access a resource + fork on Mac OS X. The legacy syntax `/rsrc' does not work on + case-sensitive HFS+. + (raccess_guess_darwin_hfsplus): Fix a bug in the calculation of + buffer size to store a pathname. + * include/freetype/internal/ftrfork.h: Increment the number of + resource fork guessing rule. + +2007-12-06 suzuki toshiya + + * builds/unix/configure.raw: Improve the compile tests to search + Carbon functions. + * builds/mac/ftmac.c: Import fixes for Carbon incompatibilities + proposed by Sean McBride from src/base/ftmac.c (see 2007-11-16). + +2007-12-06 suzuki toshiya + + The documents and comments for Mac OS X are improved by Sean + McBride. + + * src/base/ftmac.c: Fix a comment. + * include/freetype/ftmac.h: Ditto. + * docs/INSTALL.MAC: Improve English and add comment on lowest + system version specified by MACOSX_DEPLOYMENT_TARGET. + +2007-12-04 Werner Lemberg + + * src/cff/cffload.c (cff_subfont_load): Don't use logical OR to + concatenate error codes. + * src/sfnt/ttsbit.c (Load_SBit_Range): Ditto. + +2007-12-04 Graham Asher + + * src/truetype/ttobjs.c (tt_face_init): Don't use logical OR to + concatenate error codes. + +2007-12-04 Sean McBride + + * src/pfr/pfrgload.c (pfr_glyph_load_compound): Remove compiler + warning. + +2007-11-20 suzuki toshiya + + Fix MacOS legacy font support by Masatake Yamato on Mac OS X. It is + not working since 2.3.5. In FT_Open_New(), if FT_New_Stream() + cannot mmap() the specified file and cannot seek to head of the + specified file, it returns NULL stream and FT_Open_New() returns the + error immediately. On MacOS, most legacy MacOS fonts fall into such + a scenario because their data forks are zero-sized and cannot be + sought. To proceed to guessing of resource fork fonts, the + functions for legacy MacOS font must properly handle the NULL stream + returned by FT_New_Stream(). + + * src/base/ftobjs.c (IsMacBinary): Return error + FT_Err_Invalid_Stream_Operation immediately when NULL stream is + passed. + (FT_Open_Face): Even when FT_New_Stream() returns an error, proceed + to fallback. Originally, legacy MacOS font is tested in the cases + of FT_Err_Invalid_Stream_Operation (occurs when data fork is empty) + or FT_Err_Unknown_File_Format (occurs when AppleSingle header or + .dfont header is combined). Now the case of + FT_Err_Cannot_Open_Stream is included. + + * src/base/ftrfork.c (FT_Raccess_Guess): When passed stream is NULL, + skip FT_Stream_Seek(), which seeks to the head of stream, and + proceed to unit testing of raccess_guess_XXX(). FT_Stream_Seek() + for a NULL stream causes a Bus error on Mac OS X. + (raccess_guess_apple_double): Return FT_Err_Cannot_Open_Stream + immediately if passed stream is NULL. + (raccess_guess_apple_single): Ditto. + +2007-11-16 suzuki toshiya + + Fix for Carbon incompatibilities since Mac OS X 10.5, + proposed by Sean McBride. + + * doc/INSTALL.MAC: Comment on MACOSX_DEPLOYMENT_TARGET. + + * include/freetype/ftmac.h: Deprecate FT_New_Face_From_FOND and + FT_GetFilePath_From_Mac_ATS_Name. Since Mac OS X 10.5, calling + Carbon functions from a forked process is classified as unsafe + by Apple. All Carbon-dependent functions should be deprecated. + + * src/base/ftmac.c: Use essential header files + and + instead of + all-in-one header file . + + Include and replace HFS_MAXPATHLEN by Apple + genuine macro PATH_MAX. + + Add fallback macro for kATSOptionFlagsUnRestrictedScope which + is not found in Mac OS X 10.0. + + Multi-character constants ('POST', 'sfnt' etc) are replaced by + 64bit constants calculated by FT_MAKE_TAG() macro. + + For the index in the segment of resource fork, new portable + type ResourceIndex is introduced for better compatibility. + This type is since Mac OS X 10.5, so it is defined as short + when built on older platforms. + + (FT_ATSFontGetFileReference): If build target is only the systems + 10.5 and newer, it calls Apple genuine ATSFontGetFileReference(). + + (FT_GetFile_From_Mac_ATS_Name): Return an error if system is 10.5 + and newer or 64bit platform, because legacy type FSSpec type is + removed completely. + + (FT_New_Face_From_FSSpec): Ditto. + +2007-11-01 Werner Lemberg + + * src/sfnt/sfobjs.c (sfnt_done_face): Check `sfnt' everywhere. This + fixes Savannah bug #21485. + +2007-10-29 Daniel Svoboda + + * src/winfonts/winfnt.c (FNT_Face_Init): Check first that the driver + can handle the font at all, then check `face_index'. Otherwise, the + driver might return the wrong error code. This fixes Savannah bug + #21468. + +2007-10-21 Werner Lemberg + + * src/sfnt/sfobjs.c (sfnt_load_face): Support bit 9 and prepare + support for bit 8 of the `fsSelection' field in the `OS/2' table. + MS is already using this; hopefully, this becomes part of OpenType + 1.5. + Prepare also support for `name' IDs 21 (WWS_FAMILY) and 22 + (WWS_SUBFAMILY). + +2007-10-20 Werner Lemberg + + * src/tools/docmaker/tohtml.py (html_header_2): Fix typo. + Add `td.left' element to CSS. + (toc_section_enter): Use it. + +2007-10-18 David Turner + + * include/freetype/freetype.h, src/base/ftobjs.c: Rename API + functions related to cmap type 14 support to the + `FT_Object_ActionName' scheme: + + FT_Get_Char_Variant_index -> FT_Face_GetCharVariantIndex + FT_Get_Char_Variant_IsDefault -> FT_Face_GetCharVariantIsDefault + FT_Get_Variant_Selectors -> FT_Face_GetVariantSelectors + FT_Get_Variants_Of_Char -> FT_Face_GetVariantsOfChar + FT_Get_Chars_Of_Variant -> FT_Face_GetCharsOfVariant + + Update documentation accordingly. + + * src/sfnt/ttcmap.c: Stronger cmap 14 validation. + Make the code a little more consistent with FreeType coding + conventions and modify the cmap14 functions that returned a newly + allocated array to use a persistent vector from the TT_CMap14 object + instead. + + (TT_CMap14Rec): Provide array and auxiliary data for result. + (tt_cmap14_done, tt_cmap14_ensure): New functions. + + (tt_cmap14_init, tt_cmap14_validate, tt_cmap14_char_map_def_binary, + tt_cmap14_char_map_nondef_binary, tt_cmap14_find_variant, + tt_cmap14_char_var_index, tt_cmap14_variants, + tt_cmap14_char_variants, tt_cmap14_def_char_count, + tt_cmap14_get_def_chars, tt_cmap14_get_nondef_chars, + tt_cmap14_variant_chars, tt_cmap14_class_rec): Updated and improved. + +2007-10-15 George Williams + + Add support for cmap type 14. + + * devel/ftoption.h, include/freetype/config/ftoption.h + (TT_CONFIG_CMAP_FORMAT_14): New macro. + + * include/freetype/internal/ftobjs.h (FT_CMap_CharVarIndexFunc, + FT_CMap_CharVarIsDefaultFunc, FT_CMap_VariantListFunc, + FT_CMap_CharVariantListFunc, FT_CMap_VariantCharListFunc): New + support function prototypes. + (FT_CMap_ClassRec): Add them. + Update all users. + + * include/freetype/ttnameid.h (TT_APPLE_ID_VARIANT_SELECTOR): New + macro. + + * include/freetype/freetype.h (FT_Get_Char_Variant_Index, + FT_Get_Char_Variant_IsDefault, FT_Get_Variant_Selectors, + FT_Get_Variants_Of_Char, FT_Get_Chars_Of_Variant): New API + functions. + + * src/base/ftobjs.c (find_variant_selector_charmap): New auxiliary + function. + (FT_Set_Charmap): Disallow cmaps of type 14. + (FT_Get_Char_Variant_Index, FT_Get_Char_Variant_IsDefault, + FT_Get_Variant_Selectors, FT_Get_Variants_Of_Char, + FT_Get_Chars_Of_Variant): New API functions. + + * src/sfnt/ttcmap.c (TT_PEEK_UINT24, TT_NEXT_UINT24): New macros. + + (TT_CMap14Rec, tt_cmap14_init, tt_cmap14_validate, + tt_cmap14_char_index, tt_cmap14_char_next, tt_cmap14_get_info, + tt_cmap14_char_map_def_binary, tt_cmap14_char_map_nondef_binary, + tt_cmap14_find_variant, tt_cmap14_char_var_index, + tt_cmap14_char_var_isdefault, tt_cmap14_variants, + tt_cmap14_char_variants, tt_cmap14_def_char_count, + tt_cmap14_get_def_chars, tt_cmap14_get_nondef_chars, + tt_cmap14_variant_chars, tt_cmap14_class_rec): New functions and + structures for cmap 14 support. + (tt_cmap_classes): Register tt_cmap14_class_rec. + (tt_face_build_cmaps): One more error message. + + * docs/CHANGES: Mention cmap 14 support. + +2007-10-01 Werner Lemberg + + * src/base/ftobjs.c (find_unicode_charmap): If search for a UCS-4 + charmap fails, do the loop again while searching a UCS-2 charmap. + This favours MS charmaps over Apple ones. + +2007-08-29 suzuki toshiya + + * src/base/ftmac.c: Introduction of abstract `short' data types, + ResFileRefNum and ResID. These types were introduced for Copland, + then backported to MPW. The variables exchanged with FileManager + QuickDraw frameworks are redefined by these data types. Patch was + proposed by Sean McBride. + * builds/mac/ftmac.c: Ditto. + +2007-08-18 Werner Lemberg + + * src/otvalid/otvcmmn.c (otv_x_y_ux_sy): Skip context glyphs. Found + by Imran Yousaf. Fixes Savannah bug #20773. + + (otv_Lookup_validate): Correct handling of LookupType. Found by + Imran Yousaf. Fixes Savannah bug #20782. + +2007-08-17 George Williams + + * src/otvalid/otvgsub.c (otv_SingleSubst_validate): Fix handling of + SingleSubstFormat1. + +2007-08-11 suzuki toshiya + + * builds/unix/configure.raw: Fix a bug which sets CC_BUILD by + ${build-gcc} (unchecked) instead of by ${build}-gcc (checked). + Found by Ryan Hill. + +2007-08-11 George Williams + + * src/otvalid/otvcommn.c, src/otvalid/otvcommn.h + (otv_Coverage_validate): Add fourth argument to pass an expected + count value. Update all users. + Check glyph IDs. + (otv_ClassDef_validate): Check `StartGlyph'. + + * src/otvalid/otvgsub.c (otv_SingleSubst_validate): More glyph ID + checks. + + * src/otvalid/otvmath.c (otv_MathConstants_validate): There are only + 56 constants. + (otv_GlyphAssembly_validate, otv_MathGlyphConstruction_validate): + Check glyph IDs. + +2007-08-08 Werner Lemberg + + * src/otvalid/otvbase.c, src/otvalid/otvcommn.c, + src/otvalid/otvgdef.c, src/otvalid/otvgpos.c, src/otvalid/otvgsub.c, + src/otvalid/otvjstf.c: s/FT_INVALID_DATA/FT_INVALID_FORMAT/ where + appropriate. Reported by George. + + * include/freetype/internal/fttrace.h: Define `trace_otvmath'. + + * src/otvalid/rules.mk (OTV_DRV_SRC): Add otvmath.c. + + * docs/CHANGES: Updated. + +2007-08-08 George Williams + + Add `MATH' validating support to otvalid module. + + * include/freetype/tttags.h (TTAG_MATH): New macro. + * include/freetype/ftotval.h (FT_VALIDATE_MATH): New macro. + (FT_VALIDATE_OT): Updated. + + * src/otvalid/otmath.c: New file. + + * src/otvalid/otvalid.c: Include otvmath.c. + * src/otvalid/otvmod.c (otv_validate): Handle `MATH' table. + +2007-08-04 Werner Lemberg + + * builds/unix/configure.raw: Add call to AC_LIBTOOL_WIN32_DLL. + Fixes Savannah bug #20686. + +2007-08-03 Werner Lemberg + + * src/psnames/psmodule.c: Fix usage of + FT_CONFIG_OPTION_POSTSCRIPT_NAMES macro. Reported by Graham Asher. + +2007-07-31 suzuki toshiya + + * src/base/ftmac.c (open_face_from_buffer): The argument + `driver_name' is typed as `const char*' to match with the + callers in FT_New_Face_From_LWFN and FT_New_Face_From_SFNT. + This is same with open_face_from_buffer in src/base/ftobjs.c. + Found and fixed by Sean McBride. + +2007-07-28 Werner Lemberg + + * src/raster/ftraster.c (count_table): Make it conditional. + * src/base/ftobjs.c (FT_New_Library): Check FT_RENDER_POOL_SIZE with + a preprocessor statement. + +2007-07-27 Werner Lemberg + + * src/base/ftoutln.c (FT_Outline_Translate): Check `outline' before + first usage. From Savannah patch #6115. + +2007-07-16 Werner Lemberg + + * docs/CHANGES: Updated. + +2007-07-16 Derek Clegg + + Add new service for getting the ROS from a CID font. + + * include/freetype/config/ftheader.h (FT_CID_H): New macro. + * include/freetype/ftcid.h: New file. + + * include/freetype/internal/ftserv.h (FT_SERVIVE_CID_H): New macro. + * include/freetype/internal/services/svcid.h: New file. + + * src/base/ftcid.c: New file. + + * src/cff/cffdrivr.c: Include FT_SERVICE_CID_H. + (cff_get_ros): New function. + (cff_service_cid_info): New service structure. + (cff_services): Register it. + + * src/cff/cffload.c (cff_font_done): Free registry and ordering. + + * src/cff/cfftypes.h (CFF_FontRec): Add `registry' and `ordering'. + + * modules.cfg (BASE_EXTENSIONS): Add ftcid.c. + +2007-07-11 Derek Clegg + + Add support for postscript name service to CFF driver. + + * src/cff/cffdrivr.c: Include FT_SERVICE_POSTSCRIPT_NAME_H. + (cff_get_ps_name): New function. + (cff_service_ps_name): New service structure. + (cff_services): Register it. + +2007-07-07 Werner Lemberg + + * src/base/ftglyph.c (FT_Glyph_Copy): Fix initialization of + `target'. Reported by Sean McBride. + +2007-07-06 Werner Lemberg + + * src/pfr/pfrcmap.c: Include pfrerror.h. + + * src/autofit/afindic.c: Add some external declarations to pacify + `make multi' compilation. + + * src/cid/cidgload.c (cid_load_glyph): Pacify compiler. + + * src/cff/cffdrivr.c (cff_ps_get_font_info), src/cff/cffobjs.c + (cff_strcpy), include/freetype/internal/ftmemory.h (FT_MEM_STRDUP), + src/autofit/aflatin.c (af_latin_hints_compute_edges), + src/autofit/afcjk.c (af_cjk_hints_compute_edges), src/sfnt/ttmtx.c + (tt_face_get_metrics), src/base/ftobjs.c (open_face) + [FT_CONFIG_OPTION_INCREMENTAL]: Fix compilation with C++ compiler. + + * docs/release: Mention test compilation targets. + +2007-07-04 Werner Lemberg + + * docs/PROBLEMS: Mention that some PS based fonts can't be + handled correctly by FreeType. + + * src/truetype/ttgload.c (load_truetype_glyph): Always allow a + recursion depth of 1. This was the maximum value in TrueType 1.0, + and some older fonts don't set this field correctly. + + * src/gxvalid/gxvmort1.c + (gxv_mort_subtable_type1_substTable_validate): Fix tracing message. + +2007-07-03 Werner Lemberg + + * src/autofit/aflatin.c (af_latin_metrics_init_blues): Initialize + `round' to pacify compiler. + +2007-07-02 Werner Lemberg + + + * Version 2.3.5 released. + ========================= + + + Tag sources with `VER-2-3-5'. + + * docs/CHANGES, docs/VERSION.DLL: Update documentation and bump + version number to 2.3.5. + + * README, Jamfile (RefDoc), builds/win32/visualc/index.html, + builds/win32/visualc/freetype.dsp, + builds/win32/visualc/freetype.vcproj, + builds/win32/visualce/index.html, + builds/win32/visualce/freetype.dsp, + builds/win32/visualce/freetype.vcproj: s/2.3.4/2.3.5/, s/234/235/. + + * include/freetype/freetype.h (FREETYPE_PATCH): Set to 5. + + * builds/unix/configure.raw (version_info): Set to 9:16:3. + +2007-07-01 David Turner + + * include/freetype/freetype.h, src/base/ftpatent.c + (FT_Face_SetUnpatentedHinting): New function to dynamically change + the setting after a face is created. + + * src/truetype/ttgload.c (TT_Load_Simple_Glyph): Fix a small bug + that created distortions in the bytecode interpreter results. + +2007-06-30 David Turner + + * src/truetype/ttinterp.c (Ins_IUP): Add missing variable + initialization. + + * src/autofit/aflatin.c (af_latin_metric_init_blues): Get rid of an + infinite loop in the case of degenerate fonts. + +2007-06-26 Rahul Bhalerao + + Add autofit module for Indic scripts. This currently just reuses + the CJK-specific functions. + + * include/freetype/config/ftoption.h (AF_CONFIG_OPTION_INDIC): New + macro. + * devel/ftoption.h: Synchronize with + include/freetype/config/ftoption.h. + + * src/autofit/afindic.c, src/autofit/afindic.h: New files. + + * src/autofit/afglobal.c, src/autofit/aftypes.h, + src/autofit/autofit.c: Updated. + + * src/autofit/Jamfile (_sources), * src/autofit/rules.mk + (AUTOF_DRV_SRC): Updated. + +2007-06-23 David Turner + + * src/truetype/ttgload.c (TT_Load_Simple): Fix change from + 2007-06-16 that prevented the TrueType module from loading most + glyphs. + +2007-06-20 Werner Lemberg + + * src/cff/cffgload.c (cff_slot_load): Fix logic of 2007-05-28 + change. + +2007-06-19 Werner Lemberg + + * src/type1/t1load.c (parse_encoding): Handle one more error. + +2007-06-19 Dmitry Timoshkov + + * src/winfonts/winfnt.c (fnt_face_get_dll_font): Return error + FNT_Err_Invalid_File_Format if file format was recognized but + the file doesn't contain any FNT(NE) or RT_FONT(PE) resources. + Add verbose debug logs to make it easier to debug failing load + attempts. + (FNT_Face_Init): A single FNT font can't contain more than 1 face, + so return an error if requested face index is > 0. + Do not do further attempt to load fonts if a previous attempt has + failed but returned error FNT_Err_Invalid_File_Format, i.e., the + file format has been recognized but no fonts found in the file. + +2007-07-19 suzuki toshiya + + * src/base/ftmac.c: Apply patches proposed by Sean McBride. + (FT_GetFile_From_Mac_Name): Insert FT_UNUSED macros to fix + the compiler warnings against unused arguments. + (FT_ATSFontGetFileReference): Ditto. + (FT_GetFile_From_Mac_ATS_Name): Ditto. + (FT_New_Face_From_FSSpec): Ditto. + (lookup_lwfn_by_fond): Fix wrong comment. + Replace `const StringPtr' by more appropriate type + `ConstStr255Param'. + FSRefMakePathPath always returns UTF8 POSIX pathname in + Mach-O, thus HFS pathname support is dropped. + (count_faces): Remove HLock and HUnlock which is not + required on Mac OS X anymore. + (FT_New_Face_From_SFNT): Ditto. + (FT_New_Face_From_FOND): Ditto. + * builds/mac/ftmac.c: Synchronize to src/base/ftmac.c, + except of HFS pathname support and HLock/HUnlock. + They are required on classic CFM environment. + +2007-06-18 Werner Lemberg + + * src/psaux/psobjs.c (ps_parser_skip_PS_token): Remove incorrect + assertion. + (ps_parser_to_bytes): Fix error message. + + * src/type42/t42objs.c (T42_Open_Face): Handle one more error. + * src/type42/t42parse.c (t42_parse_sfnts): s/alloc/allocated/. + Don't allow mixed binary and hex strings. + Handle string_size == 0 and string_buf == 0. + (t42_parse_encoding): Handle one more error. + +2007-06-18 Werner Lemberg + + * src/psaux/psobjs.c (ps_tofixedarray, ps_tocoordarray): Fix exit + logic. + (ps_parser_load_field) : Skip delimiters + correctly. + (ps_parser_load_field_table): Use `fields->array_max' instead of + T1_MAX_TABLE_ELEMENTS to limit the number of arguments. + + * src/cff/cffgload.c (cff_decoder_prepare): Fix change from + 2007-06-06. + +2007-06-17 Werner Lemberg + + * src/tools/ftrandom.c (font_size): New global variable. + (TestFace): Use it. + (main): Handle new option `--size' to set `font_size'. + (Usage): Updated. + + * src/winfonts/winfnt.c (fnt_face_get_dll_font): Exit in case of + invalid font. + (FNT_Load_Glyph): Protect against invalid bitmap width. + +2007-06-16 David Turner + + * src/smooth/ftgrays.c (gray_find_cell, gray_set_cell, gray_hline): + Prevent integer overflows when rendering very large outlines. + + * src/truetype/ttgload.c (TT_Load_Simple_Glyph): Check the + well-formedness of the contours array when loading a glyph. + + * src/truetype/ttinterp.c (TT_Load_Context): Initialize `zp0', `zp1', + and `zp2'. + (Ins_IP): Check argument ranges to reject bogus operations properly. + (IUP_WorkerRec): Add `max_points' member. + (_iup_worker_interpolate): Check argument ranges. + (Ins_IUP): Ignore empty outlines. + +2007-06-16 Dmitry Timoshkov + + * src/winfonts/winfnt.h: Add necessary structures for PE resource + parsing. + (WinPE32_HeaderRec): New structure. + (WinPE32_SectionRec): New structure. + (WinPE_RsrcDirRec): New structure. + (WinPE_RsrcDirEntryRec): New structure. + (WinPE_RsrcDataEntryRec): New structure. + (FNT_FontRec): Remove unused `size_shift' field. + + * src/winfonts/winfnt.c (fnt_face_get_dll_font): Add support for + loading bitmap .fon files in PE format. + +2007-06-15 Dmitry Timoshkov + + * builds/win32/ftdebug.c: Unify debug level handling with other + platforms. + +2007-06-14 Dmitry Timoshkov + + * builds/win32/ftdebug.c (FT_Message): Send debug output to the + console as well as to the debugger. + +2007-06-14 Werner Lemberg + + * src/autofit/aflatin.c (af_latin_uniranges): Expand structure to + cover all ranges which could possibly be handled by the aflatin + module (since the default fallback for unknown ranges is now the + afcjk module). It might be necessary to fine-tune this further by + splitting off modules for Greek, Cyrillic, or other blocks. + +2007-06-11 David Turner + + * src/autofit/aflatin.c (af_latin_hints_link_segments): Fix + incorrect segment linking computation. This was the root cause of + Savannah bug #19565. + + + * src/autofit/* [FT_OPTION_AUTOFIT2]: Some very experimental changes + to improve the Latin auto-hinter. Note that the new code is + disabled by default since it is not stabilized yet. + + * src/autofit/aflatin2.c, src/autofit/aflatin2.h: New files + (disabled currently). + + * src/autofit/afhints.c: Remove dead code. + (af_axis_hints_new_edge): Add argument to handle segment directions. + (af_edge_flags_to_string): New function. + (af_glyph_hints_dump_segments, af_glyph_hints_dump_edges): Handle + option flags. + (af_glyph_hints_reload): Add argument to handle inflections. + Simplify. + (af_direction_compute): Fine tuning. + (af_glyph_hints_align_edge_points): Fix logic. + (af_glyph_hints_align_strong_points): Do linear search for small + edge counts. + (af_glyph_hints_align_weak_points): Skip any touched neighbors. + (af_iup_shift): Handle zero `delta'. + + * src/autofit/afhints.h: Updated. + (AF_SORT_SEGMENTS): New macro (disabled). + (AF_AxisHintsRec) [AF_SORT_SEGMENTS]: New member `mid_segments'. + + * src/autofit/afglobal.c (af_face_globals_get_metrics): Add + argument to pass option flags for handling scripts. + * src/autofit/afglobal.h: Updated. + + * src/autofit/afcjk.c: Updated. + * src/autofit/aflatin.c: Updated. + (af_latin_metrics_scale_dim): Don't reduce scale by 2%. + + (af_latin_hints_compute_segments) [AF_HINT_METRICS]: Remove dead code. + (af_latin_hints_compute_edges) [AF_HINT_METRICS]: Remove dead code. + Don't set `edge->dir' + (af_latin_hint_edges): Add more logging. + + * src/autofit/afloader.c: Updated. + +2007-06-11 Werner Lemberg + + * docs/CHANGES: Document FT_Face_CheckTrueTypePatents. + +2007-06-10 David Turner + + * src/truetype/ttgload.c (TT_Load_Simple_Glyph): Slight speed-up to + the TrueType glyph loader. + + * include/freetype/config/ftoption.h: Clarify documentation + regarding unpatented hinting. + + + Add new `FT_Face_CheckTrueTypePatents' API. + + * include/freetype/freetype.h (FT_Face_CheckTrueTypePatents): New + declaration. + + * include/freetype/internal/services/svttglyf.h, + src/base/ftpatent.c: New files. + + * include/freetype/internal/ftserv.h (FT_SERVICE_TRUETYPE_GLYF_H): + New macro. + + * src/truetype/ttdriver.c: Include FT_SERVICE_TRUETYPE_GLYF_H and + `ttpload.h'. + (tt_service_truetype_glyf): New service structure. + (tt_services): Register it. + + * modules.cfg (BASE_EXTENSIONS), src/base/Jamfile (_sources): Add + `ftpatent.c'. + +2007-06-08 Werner Lemberg + + * src/sfnt/sfobjs.c (sfnt_load_face): Undo change from 2007-04-28. + Fonts without a cmap must be handled correctly by FreeType (anything + else would be a bug). + + + * src/psaux/t1decode.c (t1_decoder_parse_charstrings) + [FT_DEBUG_LEVEL_TRACE]: Improve tracing message. + +2007-06-07 Werner Lemberg + + * src/sfnt/ttsbit0.c (tt_sbit_decoder_init, + tt_sbit_decoder_load_image): Protect against integer overflows. + + + * src/pfr/pfrgload.c (pfr_glyph_load_simple): More bounding checks + for `x_control' and `y_control'. + +2007-06-06 Werner Lemberg + + * src/base/ftoutln.c (FT_Outline_Decompose): Check `last'. + + + * src/pfr/pfrcmap.c (pfr_cmap_init): Convert assertion into normal + FreeType error. + + + * src/winfonts/winfnt.c (fnt_face_get_dll_font): Do a rough check of + `font_count'. + + + * src/type1/t1load.c (parse_font_matrix): Check `temp_scale'. + + + * src/cff/cffgload.c (cff_decoder_prepare): Change return type to + `FT_Error'. + Check `fd_index'. + (cff_slot_load): Updated. + * src/cff/cffgload.h: Updated. + +2007-06-05 Werner Lemberg + + * src/pfr/pfrgload.c (pfr_glyph_done): Comment out unused code. + (pfr_glyph_load_simple): Convert assertion into normal FreeType + error. + Check `idx'. + (pfr_glyph_load_compound, pfr_glyph_curve_to, pfr_glyph_line_to): + Convert assertion into normal FreeType error. + + * src/pfr/pfrtypes.h (PFR_GlyphRec): Comment out unused code. + + + * src/winfonts/winfnt.c (FNT_Face_Init): Check `family_size'. + + + * src/psaux/psobjs.c (ps_tocoordarray, ps_tofixedarray): Return -1 + in case of parsing error. + (ps_parser_load_field): Updated. + + * src/type1/t1load.c (parse_font_matrix): Updated. + +2007-06-04 Werner Lemberg + + * src/cid/cidgload.c (cid_load_glyph): Check `fd_select'. + + * src/tools/ftrandom/Makefile: Depend on `libfreetype.a'. + +2007-06-03 Werner Lemberg + + * src/tools/ftrandom/*: Add the `ftrandom' test program written by + George Williams (with some modifications). + +2007-06-03 Werner Lemberg + + * src/base/ftobjs.c (destroy_charmaps), src/type1/t1objs.c + (T1_Face_Done), src/winfonts/winfnt.c (FNT_Face_Done): Check for + face == NULL. Suggested by Graham Asher. + +2007-06-03 Ismail Dönmez + + * src/base/ftobjs.c (FT_Request_Metrics): Fix compiler warning. + +2007-06-02 Werner Lemberg + + * include/freetype/fterrdef.h (FT_Err_Corrupted_Font_Header, + FT_Err_Corrupted_Font_Glyphs): New error codes for BDF files. + + * src/bdf/bdflib.c (bdf_load_font): Use them. + + * src/bdf/bdflib.c (_bdf_parse_start): Check `FONT' better. + +2007-06-01 Werner Lemberg + + * src/base/ftobjs.c (FT_Request_Metrics), src/cache/ftccmap.c + (FTC_CMapCache_Lookup): Remove unused code. + +2007-06-01 Sean McBride + + * src/truetype/ttinterp.c (Null_Vector, NULL_Vector): Removed, + unused. + +2007-06-01 Werner Lemberg + + * src/cid/cidparse.c (cid_parser_new): Don't continue second search + pass for `StartData' if an error has occurred. + Exit properly if no `StartData' has been seen at all. + + * builds/unix/ftsystem.c (FT_Stream_Open): Don't use ULONG_MAX but + LONG_MAX to avoid compiler warning. Suggested by Sean McBride. + +2007-05-30 Werner Lemberg + + * src/type1/t1load.c (parse_subrs, parse_charstrings): Protect + against too small binary data strings. + + * src/bdf/bdflib.c (_bdf_parse_glyphs): Check `STARTCHAR' better. + +2007-05-28 David Turner + + * src/cff/cffgload.c (cff_slot_load): Do not apply the identity + transformation. This significantly reduces the loading time of CFF + glyphs. + + * docs/CHANGES: Updated. + + * src/autofit/afglobal.c (AF_SCRIPT_LIST_DEFAULT): Change default + hinting script to CJK, since it works well with more scripts than + latin. Thanks to Rahul Bhalerao for pointing + this out! + +2007-05-25 Werner Lemberg + + * docs/CHANGES: Updated. + +2007-05-24 Werner Lemberg + + * src/truetype/ttobjs.h (tt_size_ready_bytecode): Move declaration + into TT_USE_BYTECODE_INTERPRETER preprocessor block. + +2007-05-24 Graham Asher + + * src/truetype/ttobjs.c (tt_size_ready_bytecode) + [!TT_USE_BYTECODE_INTERPRETER]: Removed. Unused. + +2007-05-22 David Turner + + * src/truetype/ttgload.c (load_truetype_glyph): Fix last change to + avoid crashes in case the bytecode interpreter is not used. + + + Avoid heap blowup with very large .Z font files. This fixes + Savannah bug #19910. + + * src/lzw/ftzopen.h (FT_LzwStateRec): Remove `in_cursor', + `in_limit', `pad', `pad_bits', and `in_buff' members. + Add `buf_tab', `buf_offset', `buf_size', `buf_clear', and + `buf_total' members. + + * src/lzw/ftzopen.c (ft_lzwstate_get_code): Rewritten. It now takes + only one argument. + (ft_lzwstate_refill, ft_lzwstate_reset, ft_lzwstate_io): Updated. + +2007-05-20 Ismail Dönmez + + * src/pshinter/pshrec.c (ps_mask_table_set_bits): Add `const'. + (ps_dimension_set_mask_bits): Remove `const'. + +2007-05-19 Werner Lemberg + + * src/sfnt/ttmtx.c (tt_face_get_metrics) + [!FT_CONFIG_OPTION_OLD_INTERNALS]: Another type-punning fix. + +2007-05-19 Derek Clegg + + Savannah patch #5929. + + * include/freetype/tttables.h, src/base/ftobjcs.c + (FT_Get_CMap_Format): New function. + + * include/freetype/internal/services/svttcmap.c (TT_CMapInfo): Add + `format' member. + * src/sfnt/ttcmap.c (tt_cmap{0,2,4,6,8,10,12}_get_info): Set + cmap_info->format. + +2007-05-19 Werner Lemberg + + * src/truetype/ttgload.c (load_truetype_glyph): Save graphics state + before handling subglyphs so that it can be reinitialized each time. + This fixes Savannah bug #19859. + +2007-05-16 Werner Lemberg + + * src/cache/ftccache.c (ftc_node_mru_link, ftc_node_mru_unlink), + src/cache/ftccache.h (FTC_CACHE_LOOKUP_CMP), src/cache/ftcglyph.h + (FTC_GCACHE_LOOKUP_CMP), src/pshinter/pshmod.c (ps_hinter_init), + src/sfnt/ttmtx.c (tt_face_load_hmtx, tt_face_load_hhea, + tt_face_get_metrics): Fix type-punning issues. + +2007-05-15 David Turner + + * include/freetype/config/ftstdlib.h, + include/freetype/internal/ftobjs.h: As suggested by Graham Asher, + ensure that ft_isalnum, ft_isdigit, etc., use hard-coded values + instead on relying on the locale-dependent functions provided by + . + +2007-05-15 Graham Asher + + * src/autofit/afcjk.c (af_cjk_hints_compute_edges): Remove unused + variable. + * src/autofit/afloader.c (af_loader_load_g): Ditto. + + * src/base/ftobjs.c (ft_validator_error): Use `ft_jmp_buf'. + (open_face_from_buffer): Initialize `stream'. + (FT_Request_Metrics): Remove unused variable. + Remove redundant `break' statements. + (FT_Get_Track_Kerning): Remove unused variable. + + * src/psaux/afmparse.c (afm_parse_track_kern, afm_parse_kern_pairs, + afm_parse_kern_data): Remove redundant + `break' statements. + (afm_parser_parse): Ditto. + Don't use uninitialized variables. + + * src/psnames/psmodule.c (VARIANT_BIT): Define as unsigned long. + Use `|' operator instead of `^' to set it. + Update all users. + + * src/sfnt/ttcmap.c (tt_face_build_cmaps): Use `ft_jmp_buf'. + * src/sfnt/ttkern.c (tt_face_load_kern): Remove unused variable. + + * src/truetype/ttgload.c (TT_Load_Simple_Glyph): Remove redundant + comparison. + (TT_Process_Simple_Glyph): Use FT_UInt for `n_points' and `i'. + (TT_Load_Glyph): Remove unused variable. + +2007-05-13 Derek Clegg + + * src/base/ftobjs.c (FT_New_Library): Only allocate rendering pool + if FT_RENDER_POOL_SIZE is > 0. From Savannah patch #5928. + +2007-05-11 David Turner + + * src/cache/ftbasic.c, include/freetype/ftcache.h + (FTC_ImageCache_LookupScaler, FTC_SBit_Cache_LookupScaler): Two new + functions that allow us to look up glyphs using an FTC_Scaler object + to specify the size, making it possible to use fractional pixel + sizes. + + * src/truetype/ttobjs.c (tt_size_ready_bytecode): Set + `size->cvt_ready'. Reported by Boris Letocha. + +2007-05-09 Graham Asher + + * src/truetype/ttinterp.c (Ins_IP), src/autofit/aflatin.c + (af_latin_metrics_scale_dim): Fix compiler warnings. + +2007-05-06 Werner Lemberg + + * builds/win32/visualce/freetype.sln: Removed, as requested by + Vincent. + +2007-05-04 Vincent RICHOMME + + * builds/win32/visualce/*: Add Visual C++ project files for Pocket + PC targets. + + * docs/CHANGES: Document them. + +2007-05-04 + + * builds/unix/ftsystem.c (FT_Stream_Open): Handle return value 0 of + mmap (which might happen on some RTOS). From Savannah patch #5909. + +2007-05-03 Werner Lemberg + + * src/base/ftobjs.c (FT_Set_Char_Size): Simplify code. + * include/freetype/freetype.h (FT_Set_Char_Size): Update + documentation. + +2007-04-28 Victor Stinner + + * src/sfnt/sfobjs.c (sfnt_load_face): Check error code after loading + `cmap'. + +2007-04-27 Werner Lemberg + + * src/truetype/ttgload.c (TT_Load_Simple_Glyph): Check for negative + number of points in contours. Problem reported by Victor Stinner + . + (TT_Process_Simple_Glyph): Synchronize variable types. + +2007-04-26 Werner Lemberg + + * src/base/ftglyph.c (FT_Glyph_Copy): Always set second argument to + zero in case of error. This fixes Savannah bug #19689. + +2007-04-25 Boris Letocha + + * src/truetype/ttobjs.c: Fix a typo that created a speed regression + in the TrueType bytecode loader. + +2007-04-10 Martin Horak + + * src/sfnt/sfobjs.c (sfnt_load_face) [FT_CONFIG_OPTION_INCREMENTAL]: + Ignore `hhea' table. This fixes Savannah bug #19261. + +2007-04-09 Werner Lemberg + + + * Version 2.3.4 released. + ========================= + + + Tag sources with `VER-2-3-4'. + + * docs/CHANGES, docs/VERSION.DLL: Update documentation and bump + version number to 2.3.4. + + * README, Jamfile (RefDoc), builds/win32/visualc/index.html, + builds/win32/visualc/freetype.dsp, + builds/win32/visualc/freetype.vcproj: s/2.3.3/2.3.4/, s/233/234/. + + * include/freetype/freetype.h (FREETYPE_PATCH): Set to 4. + + * builds/unix/configure.raw (version_info): Set to 9:15:3. + +2007-04-09 Martin Horak + + * src/truetype/ttgload.c (load_truetype_glyph): Save and restore + memory stream to avoid a crash with the incremental memory + interface (Savannah bug #19260). + +2007-04-06 David Turner + + * src/base/ftbimap.c (ft_bitmap_assure_buffer): Fix buffer-overwrite bug + (Savannah bug #19536). + +2007-04-04 Werner Lemberg + + + * Version 2.3.3 released. + ========================= + + + Tag sources with `VER-2-3-3'. + + * docs/CHANGES: Mention CVE-2007-1351. + +2007-04-03 David Turner + + * src/base/ftobjs.c (FT_Set_Char_Size): As suggested by James Cloos, + if one of the resolution values is 0, treat it as if it were the + same as the other value. + +2007-04-02 David Turner + + Add special code to detect `extra-light' fonts and do not snap their + stem widths too much to avoid bizarre hinting effects. + + * src/autofit/aflatin.h (AF_LatinAxisRec): Add `standard_width' and + `extra_light' members. + + * src/autofit/aflatin.c (af_latin_metrics_init_widths): Initialize + them. + (af_latin_metrics_scale_dim): Set `extra_light'. + (af_latin_compute_stem_width): Use `extra_light'. + +2007-03-28 David Turner + + * src/base/ftbitmap.c (ft_bitmap_assure_buffer): Fix zero-ing of the + padding. + +2007-03-28 Werner Lemberg + + * src/bdf/bdflib.c (setsbit, sbitset): Handle values >= 128 + gracefully. + (_bdf_set_default_spacing): Increase `name' buffer size to 256 and + issue an error for longer names. This fixes CVE-2007-1351. + (_bdf_parse_glyphs): Limit allowed number of glyphs in font to the + number of code points in Unicode. + + * builds/win32/visualc/index.html, + builds/win32/visualc/freetype.dsp, + builds/win32/visualc/freetype.vcproj, README: s/2.3.2/2.3.3/, + s/232/233/. + + * docs/CHANGES: Mention ftdiff. + +2007-03-26 David Turner + + * src/truetype/ttinterp.c [FIX_BYTECODE]: Remove it and + corresponding code. + (Ins_MD): Last regression fix. + + * src/autofit/aflatin.c (af_latin_metrics_init_blues): Fix blues + computations in order to ignore single-point contours. These are + never rasterized and correspond in certain fonts to mark-attach + points that are very far from the glyph's real outline, ruining the + computation. + + * src/autofit/afloader.c (af_loader_load_g): In the case of + monospaced fonts, always set `rsb_delta' and `lsb_delta' to 0. + Otherwise code that uses them will most certainly ruin the fixed + advance property. + + * docs/CHANGES, docs/VERSION.DLL, README, Jamfile (RefDoc): Update + documentation and bump version number to 2.3.3. + + * include/freetype/freetype.h (FREETYPE_PATCH): Set to 3. + + * builds/unix/configure.raw (version_info): Set to 9:14:3. + +2007-03-26 suzuki toshiya + + * builds/unix/ftconfig.in: Disable Carbon framework dependency on + 64bit ABI on Mac OS X 10.4.x (ppc & i386). Found by Sean McBride. + * builds/vms/ftconfig.h: Ditto. + * include/freetype/config/ftconfig.h: Ditto. + +2007-03-22 suzuki toshiya + + * builds/unix/ftsystem.c (FT_Stream_Open): Temporary fix to prevent + 32bit unsigned long overflow by 64bit filesize on LP64 platform, as + proposed by Sean McBride: + http://lists.gnu.org/archive/html/freetype-devel/2007-03/msg00032.html + +2007-03-22 suzuki toshiya + + * builds/unix/ftconfig.in: Suppress SGI compiler's warning against + setjmp, proposed by Sean McBride: + http://lists.gnu.org/archive/html/freetype-devel/2007-03/msg00032.html + +2007-03-19 suzuki toshiya + + * builds/unix/configure.raw: Dequote `OS_INLINE' in comment of + conftest.c, to avoid unexpected shell evaluation. Possibly it is a + bug or undocumented behaviour of autoconf. + +2007-03-18 David Turner + + * src/truetype/ttinterp.c (Ins_MDRP): Another bytecode regression + fix; testing still needed. + + * src/truetype/ttinterp.c (Ins_MD): Another bytecode regression fix. + +2007-03-17 David Turner + + * src/truetype/ttinterp.c (Ins_IP): Fix wrong handling of the + (undocumented) twilight zone special case. + +2007-03-09 Werner Lemberg + + + * Version 2.3.2 released. + ========================= + + + Tag sources with `VER-2-3-2'. + + * builds/win32/visualc/index.html, + builds/win32/visualc/freetype.dsp, + builds/win32/visualc/freetype.vcproj, README: s/2.3.1/2.3.2/, + s/231/232/. + +2007-03-08 David Turner + + * docs/CHANGES, docs/VERSION.DLL: Updated for upcoming release. + + * builds/unix/configure.raw (version_info): Set to 9:13:3. + + * include/freetype/freetype.h (FREETYPE_PATCH): Set to 2. + + * README, Jamfile (RefDoc): s/2.3.1/2.3.2/. + + * src/base/ftutil.c (ft_mem_strcpyn): Fix a bug that prevented the + function to work properly, over-writing user-provided buffers in + some cases. Reported by James Cloos . + + +2007-03-05 Werner Lemberg + + * include/freetype/config/ftstdlib.h (ft_strstr): New wrapper + macro for `strstr'. + + * src/truetype/ttobjs.c (tt_face_init): Use ft_strstr for scanning + `trick_names', as suggested by Ivan Nincic. + +2007-03-05 David Turner + + * src/base/ftinit.c (FT_Init_FreeType): Fix a small memory leak in + case FT_Init_FreeType fails for some reason. Problem reported by + Maximilian Schwerin . + + * src/truetype/ttobs.c (tt_size_init_bytecode): Clear the `x_ppem' + and `y_ppem' fields of the `TT_Size.metrics' structure, not those of + `TT_Size.root.metrics'. Problem reported by Daniel Glöckner + . + + * src/type1/t1afm.c (T1_Read_PFM): Read kerning values as 16-bit + signed values, not unsigned ones. Problem reported by Johannes + Walther . + +2007-02-21 David Turner + + * src/pshinter/pshalgo.c (psh_hint_align): Fix a bug in the hinting + of small and ghost stems in the Postscript interpreter. + +2007-02-20 suzuki toshiya + + * src/base/ftmac.c (FT_GetFileRef_From_Mac_ATS_Name): Fix memory + leak, patch by "Jjgod Jiang" . + * builds/mac/ftmac.c (FT_GetFileRef_From_Mac_ATS_Name): Ditto. + +2007-02-16 Werner Lemberg + + * src/truetype/ttinterp.c (Ins_MD): Remove unused variable. + * src/autofit/aflatin.c (af_latin_hints_link_segments): Ditto. + +2007-02-14 David Turner + + It seems that the following changes fix most of the known + interpreter problems with my fonts, but more testing is needed, + though. + + * src/truetype/ttinterp.c (FIX_BYTECODE): Activate. + (TT_MulFix14): Rewrite. + (Ins_MD, Ins_MDRP, Ins_IP) [FIX_BYTECODE]: Improved and updated. + (Ins_MIRP): Ditto. + +2007-02-12 Werner Lemberg + + * src/truetype/ttinterp.c (Project_x, Project_y): Remove compiler + warnings. + + * src/pcf/pcfread.c (pcf_interpret_style), src/bdf/bdfdrivr.c + (bdf_interpret_style): Ditto. + +2007-02-12 David Turner + + Simplify projection and dual-projection code interface. + + * src/truetype/ttinterp.h (TT_Project_Func): Use `FT_Pos', not + FT_Vector' as argument type. + * src/truetype/ttinterp.c (CUR_Func_project, CUR_Func_dualproj): + Updated. + (CUR_fast_project, CUR_fast_dualproj): New macros. + (Project, Dual_Project, Project_x, Project_y): Updated. + (Ins_GC, Ins_SCFS, Ins_MDAP, Ins_MIAP, Ins_IP): Use new `fast' + macros. + + + * src/autofit/afloader.c (af_loader_load_g): Improve spacing + adjustments for the non-light auto-hinted modes. Gets rid of + `inter-letter spacing is too wide' problems. + + * src/autofit/aflatin.c (af_latin_hints_link_segments, + af_latin_hints_compute_edges): Slight optimization of the segment + linker and better handling of serif segments to get rid of broken + `9' in Arial at 9pt (96dpi). + + + Introduce new string functions and the corresponding macros to get + rid of various uses of strcpy and other `evil' functions, as well as + to simplify a few things. + + * include/freetype/internal/ftmemory.h (ft_mem_strdup, ft_mem_dup, + ft_mem_strcpyn): New declarations. + (FT_MEM_STRDUP, FT_STRDUP, FT_MEM_DUP, FT_DUP, FT_STRCPYN): New + macros. + * src/base/ftutil.c (ft_mem_dup, ft_mem_strdup, ft_mem_strcpyn): New + functions. + + * src/bfd/bfddrivr.c (bdf_interpret_style, BDF_Face_Init), + src/bdf/bdflib.c (_bdf_add_property), src/pcf/pcfread.c + (pcf_get_properties, pcf_interpret_style, pcf_load_font), + src/cff/cffdrivr.c (cff_get_glyph_name), src/cff/cffload.c + (cff_index_get_sid_string), src/cff/cffobjs.c (cff_strcpy), + src/sfnt/sfdriver.c (sfnt_get_glyph_name), src/type1/t1driver.c + (t1_get_glyph_name), src/type42/t42drivr.c (t42_get_glyph_name, + t42_get_name_index): Use new functions and simplify code. + + * builds/mac/ftmac.c (FT_FSPathMakeSpec): Don't use FT_MIN. + +2007-02-11 Werner Lemberg + + * src/autofit/afloader.c (af_loader_load_g): Don't change width for + non-spacing glyphs. + +2007-02-07 Tom Parker + + * src/cff/cffdrivr.c (cff_get_name_index): Protect against NULL + pointer. + +2007-02-05 suzuki toshiya + + * include/freetype/ftmac.h (FT_DEPRECATED_ATTRIBUTE): + Introduce __attribute((deprecated))__ to warn functions + which use non-ANSI data types in its interfaces. + (FT_GetFile_From_Mac_Name): Deprecated, using FSSpec. + (FT_GetFile_From_Mac_ATS_Name): Deprecated, using FSSpec. + (FT_New_Face_From_FSSpec): Deprecated, using FSSpec. + (FT_New_Face_From_FSRef): Deprecated, using FSRef. + + * src/base/ftmac.c: Predefine FT_DEPRECATED_ATTRIBUTE as void + to avoid warning in building FreeType. + * builds/mac/ftmac.c: Ditto. + +2007-02-05 suzuki toshiya + + * src/base/ftbase.c: Fix to use builds/mac/ftmac.c, if configured + `--with-fsspec' etc. Replace #include "ftmac.c" with + #include . + +2007-02-05 suzuki toshiya + + * include/freetype/ftmac.h (FT_GetFilePath_From_Mac_ATS_Name): + Introduced as replacement of FT_GetFile_From_Mac_ATS_Name. + * src/base/ftmac.c (FT_GetFilePath_From_Mac_ATS_Name): Ditto. + (FT_GetFile_From_Mac_ATS_Name): Rewritten as wrapper of + FT_GetFilePath_From_Mac_ATS_Name. + * builds/mac/ftmac.c: Ditto. + +2007-02-05 suzuki toshiya + + * include/freetype/ftmac.h: Fixed wrong comment: FSSpec of + FT_GetFile_From_Mac_Name, FT_GetFile_From_Mac_ATS_Name are + for passing to FT_New_Face_From_FSSpec. + +2007-02-05 suzuki toshiya + + * builds/unix/configure.raw: Check whether Mac OS X system headers + can be built under ANSI C mode. + + * src/base/ftmac.c (OS_INLINE): Redefine OS_INLINE by a version + compatible to ANSI C in case system headers are ANSI C incompatible. + * builds/mac/ftmac.c (OS_INLINE): Ditto. + +2007-02-01 Werner Lemberg + + * include/freetype/ttnameid.h (TT_MS_LANGID_DZONGHKA_BHUTAN): + Explain why applications shouldn't use it. Found by Alexei. + +2007-02-01 Alexei Podtelezhnikov + + * builds/unix/freetype2.m4 (AC_CHECK_FT2): Fix spelling of warning + message. + + * src/gxvalid/gxvmort1.c + (gxv_mort_subtable_type1_substTable_validate): Fix debugging + message. + +2007-01-31 Werner Lemberg + + + * Version 2.3.1 released. + ========================= + + + Tag sources with `VER-2-3-1-FINAL'. + + * builds/win32/visualc/freetype.dsp, + builds/win32/visualc/freetype.vcproj: s/230/231/. + * builds/win32/visualc/index.html: s/221/231/. + + * vms_make.com: Add `ftgasp'. + +2007-01-30 David Turner + + Tag sources with VER-2-3-1 to prepare release. + + * include/freetype/freetype.h (FREETYPE_PATCH): Set to 1. + + * docs/VERSION.DLL, docs/release, README, Jamfile (RefDoc): + s/2.3.0/2.3.1/. + + * builds/unix/configure.raw (version_info): Set to 9:12:3. + + + * src/autofit/aftypes.h (AF_USE_WARPER), src/autofit/afloader.c + (af_loader_load_g): Disable the warper (i.e., the light hinting + improvements) to make a 2.3.1 bugfix release before introducing a + new feature. This should give us more time to tune and improve the + warper for the next release. + + * docs/CHANGES: Update accordingly. + +2007-01-25 David Turner + + For light auto-hinting, improve glyph advance widths and resurrect + normal/full hinting to its normal quality. + + * src/autofit/afhints.h (AF_GlyphHintsRec): New members `xmin_delta' + and `xmax_delta'. + * src/autofit/afhints.c (af_glyph_hints_reload): Reset `xmin_delta' + and `xmax_delta'. + + * src/autofit/afloader.c (af_loader_load_g) : Replace + preprocessor conditional with if-clause, handling both light and + normal mode. + + * src/autofit/afwarp.c (AF_WarpScore): Fine-tune again. + (af_warper_compute): Handle `xmin_delta' and `xmax_delta'. + +2007-01-25 Werner Lemberg + + * docs/release: Updated -- Savannah uses a new uploading scheme. + +2007-01-25 David Turner + + * src/cff/cffload.c (cff_index_get_pointers): Improve previous fix. + + * src/cff/cffgload.c (cff_decoder_parse_charstrings) + : Fix sanity check for empty + functions. + + * docs/CHANGES: Document light auto-hinting improvement. + +2007-01-25 Werner Lemberg + + * src/cff/cffload.c (cff_index_get_pointers): Handle last entry + correctly in a sanity check. Since this function is only used to + load local and global functions, any charstring that called the last + local/global function would fail otherwise. This fixes Savannah bug + #18867. + + * docs/CHANGES: Document it. + +2007-01-23 David Turner + + * src/truetype/ttobjs.c (tt_size_ready_bytecode): Fix typo that + prevented compilation when disabling both the unpatented and the + bytecode interpreter in the TrueType font driver. + + + Fix and enable the warper to improve `light' hinting mode. This is + not necessarily a final version, but it seems to work well. + + * src/autofit/aflatin.c (af_latin_hints_init) [AF_USE_WARPER]: + Disable code. + (af_latin_hints_apply) [AF_USE_WARPER]: Handle FT_RENDER_MODE_LIGHT. + * src/autofit/aftypes.h: Activate AF_USE_WARPER. + + * src/autofit/afwarp.c (AF_WarpScore): Tune table. + (af_warper_compute_line_best): Fix array size of `scores'. + (af_warper_compute): Better handling of border cases. + * src/autofit/afwarp.h (AF_WarperRec): Remove unused members `X1' + and `X2'. + +2007-01-21 Werner Lemberg + + * ChangeLog: Split off older entries into... + * ChangeLog.22: This new file. + +2007-01-21 Werner Lemberg + + * docs/CHANGES: Document SHZ fix. + +2007-01-21 George Williams + + * src/truetype/ttinterp.c (Ins_SHZ): SHZ doesn't move phantom + points. + +2007-01-21 Werner Lemberg + + * src/sfnt/ttmtx.c (tt_face_get_metrics) + [!FT_CONFIG_OPTION_OLD_INTERNALS]: Fix limit check. + +2007-01-17 Werner Lemberg + + + * Version 2.3.0 released. + ========================= + + + Tag sources with `VER-2-3-0-FINAL'. + +2007-01-17 Werner Lemberg + + * docs/release: Updated. + +2007-01-16 David Turner + + * src/autofit/aflatin.c (af_latin_hints_compute_segments), + src/cff/cffdriver.c (cff_ps_get_font_info), src/truetype/ttobjs.c + (tt_face_init), src/truetype/ttinterp.c (Ins_SHC): Fix compiler + warnings. + +2007-01-15 Detlef Würkner + + * builds/amiga/makefile, builds/amiga/makefile.os4, + builds/amiga/smakefile: Add `ftgasp.c' and `ftlcdfil.c'. + + * builds/amiga/include/freetype/config/ftconfig.h: Synchronize. + +2007-01-14 Detlef Würkner + + Fix various compiler warnings. + + * src/truetype/ttdriver.c (tt_size_select), src/cff/cffobjs.h, + src/cff/cffobjs.c (cff_size_request), src/type42/t42objs.h: + s/index/strike_index/. + * src/base/ftobjs.c (FT_Match_Size): s/index/size_index/. + + * src/gxvalid/gxvmorx5.c + (gxv_morx_subtable_type5_InsertList_validate): s/index/table_index/. + + * src/truetype/ttinterp.c (Compute_Point_Displacement), + src/pcf/pcfread.c (pcf_seek_to_table_type): Avoid possibly + uninitialized variables. + +2007-01-13 suzuki toshiya + + * docs/CHANGES, docs/INSTALL.MAC: Improvements. + +2007-01-13 Werner Lemberg + + * src/type1/t1afm.c (T1_Read_Metrics): MS Windows allows PFM + versions up to 0x3FF without complaining. + +2007-01-13 Derek Clegg + + Add FT_Get_PS_Font_Info interface to CFF driver. + + * src/cff/cfftypes.h: Include FT_TYPE1_TABLES_H. + (CFF_FontRec): Add `font_info' field. + + * src/cff/cffload.c: Include FT_TYPE1_TABLES_H. + (cff_font_done): Free font->font_info if necessary. + + * src/cff/cffdrvr.c (cff_ps_get_font_info): New function. + (cff_service_ps_info): Register cff_ps_get_font_info. + +2007-01-13 Werner Lemberg + + * src/base/ftoutln.c (FT_Outline_Get_Orientation): Fix compilation + with C++ compiler. + + * src/autofit/afhints.c (af_glyph_hints_dump_segments, + af_glyph_hints_dump_edges): Ditto. + + * src/base/rules.mk (BASE_SRC): Remove ftgasp.c (it's already in + `modules.cfg'). + + * src/sfnt/ttsbit0.h: Remove. + + * src/sfnt/rules.mk (SFNT_DRV_SRC): Don't include ttsbit0.c. + +2007-01-12 David Turner + + * src/base/ftbitmap.c (ft_bitmap_assure_buffer): Fix memory stomping + bug in the bitmap emboldener if the pitch of the source bitmap is + much larger than its width. + + * src/truetype/ttinterp.c (Update_Max): Fix aliasing-related + compilation warning. + +2007-01-12 Werner Lemberg + + * builds/unix/install-sh, builds/unix/mkinstalldirs: Updated from + `automake' CVS module from sources.redhat.com. + +2007-01-11 Werner Lemberg + + * src/type1/t1load.c (is_space): Removed. + (parse_encoding, parse_charstrings): Use IS_PS_DELIM. + (parse_charstrings): Use IS_PS_TOKEN. + + + * autogen.sh: Avoid bash specific syntax. + +2007-01-11 David Turner + + * docs/CHANGES: Small update. + + * builds/unix/configure.raw (version_info): Set to 9:11:3. + + * src/base/ftobjs.c (IsMacResource): Fix a small bug that caused a + crash with some Mac OS X .dfont files. Submitted by Masatake + Yamato. + + * autogen.sh: Small fix to get it working on Mac OS X properly: + The issue is that GNU libtool is called `glibtool' on this platform, + and we must call `glibtoolize', since `libtoolize' doesn't exist. + +2007-01-10 David Turner + + * all-sources: Tag all sources with VER-2-3-0-RC1 and + VER-2-3-0. + + * Jamfile (RefDoc), README, builds/win32/visualc/freetype.dsp, + builds/win32/visualc/freetype.vcproj, docs/VERSION.DLL: Update + version number to 2.3.0. + + * include/freetype/freetype.h (FREETYPE_MINOR): Set to 3. + (FREETYPE_PATCH): Set to 0. + + * include/freetype/ftchapters.h, include/freetype/ftgasp.h, + include/freetype/ftlcdfil.h: Update reference documentation with + GASP support and LCD filtering sections. + + * src/pshinter/pshalgo.c (psh_glyph_compute_inflections): Fix a typo + which created an endless loop with some malformed font files. + +2007-01-10 Derek Clegg + + * src/type1/t1load.c (T1_Get_MM_Var): Always return fixed point + values. + +2007-01-08 David Turner + + * docs/CHANGES: Updated. + + * include/freetype/ftgasp.h, src/base/ftgasp.c: New files which add + a new API `FT_Get_Gasp' to return entries of the `gasp' table + corresponding to a given character pixel size. + + * src/sfnt/ttload.c (tt_face_load_gasp): Add version check for the + `gasp' table, in order to avoid potential problems with later + versions. + + * include/freetype/config/ftheader.h (FT_GASP_H): New macro for + . + + * src/base/rules.mk (BASE_SRC), src/base/Jamfile (_sources), + modules.cfg (BASE_EXTENSIONS), builds/win32/visualc/freetype.dsp, + builds/win32/visualc/freetype.vcproj: Add src/base/ftgasp.c to the + default build. + +2007-01-07 Werner Lemberg + + * src/cid/cidparse.c (cid_parser_new): Improve error message for + Type 11 fonts. + Scan for `/sfnts' token. + +2007-01-07 Werner Lemberg + + * src/cid/cidparse.c (cid_parser_new): Reject Type 11 fonts. + +2007-01-06 Werner Lemberg + + * src/cff/cffload.c (cff_index_init): Remove unused variable. + (cff_index_read_offset): s/perror/errorp/ to avoid global shadowing. + +2007-01-04 David Turner + + * src/pfr/pfrobjs.c (pfr_face_init): Detect non-scalable fonts + correctly. This fixes Savannah bug #17876. + + + Do not allocate interpreter-specific tables in memory if we are not + going to load glyphs with the bytecode interpreter anyway. + + * src/truetype/ttgload.c (tt_loader_init): Load execution context + only if glyph is hinted. + Updated. + * src/truetype/ttobjs.h (TT_SizeRec): Add members `bytecode_ready' + and `cvs_ready'. + Add `tt_size_ready_bytecode' declaration. + * src/truetype/ttobjs.c (tt_size_done_bytecode, + tt_size_init_bytecode, tt_size_ready_bytecode): New functions. + (tt_size_init): Move most code into `tt_size_init_bytecode'. + (tt_size_done): Move most code into `tt_size_done_bytecode'. + (tt_size_reset): Move some code to `tt_size_ready_bytecode'. + + + Don't extract the metrics table from the SFNT font file. Instead, + reparse it on each glyph load. The runtime difference is not + noticeable, and it can save a lot of heap memory when memory-mapped + files are not used. + + * include/freetype/internal/tttypes.h (TT_FaceRec): Add members + `horz_metrics_offset' and `vert_metrics_ofset'. + * src/sfnt/ttmtx.c (tt_face_load_hmtx, tt_face_get_metrics): + Updated. + + + * src/sfnt/ttcmap.c (tt_cmap4_validate): Slight optimization. + + + Do not load the CFF index offsets into memory, since this wastes a + *lot* of heap memory with large Asian CFF fonts. There is no + significant performance loss. + + * src/cff/cffload.h: Add `cff_charset_cid_to_gindex' declaration. + * src/cff/cfftypes.h (CFF_IndexRec): Add fields `start' and + `data_size'. + (CFF_CharsetRec): Add field `num_glyphs'. + + * src/cff/cffload.c (cff_index_read_offset, cff_index_load_offsets, + cff_charset_cid_to_gindex): New functions. + (cff_new_index): Renamed to... + (cff_index_init): This. Update all callers. + Updated -- some code has been moved to `cff_index_load_offsets'. + (cff_done_index): Renamed to... + (cff_index_done): This. Update all callers. + (cff_index_get_pointers, cff_index_access_element): Updated to use + stream offsets. + (cff_charset_compute_cids): Set `num_glyphs' field. + (cff_encoding_load): Updated. + + * src/cff/cffgload.c (cff_slot_load): Updated. + +2007-01-04 David Turner + + * docs/INSTALL.UNIX: Simplify some parts, add reference to + autogen.sh and pointer to README.CVS. + + * README.CVS: Add common problem description and solution + when running autogen.sh. + + * docs/INSTALL: Add reference to MacOS X. + + * docs/MAKEPP, docs/INSTALL.MAC: New documentation files. + + * docs/TODO: Remove obsolete items. + + * src/raster/ftraster.c: (TRaster_Instance): Replace it with... + (TWorker): This. + Remove `count_table' and `memory'. + Make `grays' a pointer. + (TRaster): New structure. + (count_table): New static array. + (RAS_ARGS, RAS_ARG, RAS_VARS, RAS_VAR, FT_UNUSED_RASTER, cur_ras, + Vertical_Gray_Sweep_Step, ft_black_new, ft_black_done, + ft_black_set_mode, ft_black_render): Updated. + (ft_black_init): Don't initialize `count_table'. + (ft_black_reset): Use the render pool. This saves about 6KB of + heap space for each FT_Library instance. + + * src/smooth/ftgrays.c (TRaster): Replaced with... + (TWorker): This. + Remove `memory'. + (TRaster): New structure. + + (RAS_ARG_, RAS_ARG, RAS_VAR_, RAS_VAR, ras, gray_render_line, + gray_move_to, gray_line_to, gray_conic_to, gray_cubic_to, + gray_render_span, gray_raster_render): Updated. + (gray_raster_reset): Use the render pool. This saves about 6KB of + heap space for each FT_Library instance. + + * src/sfnt/sfobjs.c, src/sfnt/ttkern.c, src/sfnt/ttkern.h, + src/sfnt/ttmtx.c, src/sfnt/ttsbit.c, src/sfnt/ttsbit.h, + src/truetype/ttpload.c, include/freetype/config/ftoption.h: Remove + FT_OPTIMIZE_MEMORY macro (and code for !FT_OPTIMIZE_MEMORY) since + the optimization is no longer experimental. + + * src/pshinter/pshalgo.c (psh_glyph_interpolate_normal_points): + Remove a typo that results in no hinting and a memory leak with some + large Asian CFF fonts. + + * src/base/ftobjs.c (FT_Done_Library): Remove a subtle memory leak + which happens when FT_Done_Library is called with still opened + CFF_Faces in it. We need to close all faces before destroying the + modules, or else some bad things (memory leaks) may happen. + +2007-01-02 Werner Lemberg + + * src/gxvalid/gxvkern.c (gxv_kern_subtable_fmt0_pairs_validate): + Remove compiler warning. + +2007-01-02 David Turner + + * src/sfnt/sfobjs.c: Add documentation comment. + +2006-12-31 Masatake YAMATO + + * src/gxvalid/gxvkern.c (gxv_kern_subtable_fmt0_pairs_validate): New + function. + Check uniqueness of the gid pairs. + (gxv_kern_subtable_fmt0_validate): Move some code to + `gxv_kern_subtable_fmt0_pairs_validate'. + +2006-12-22 David Turner + + * src/autofit/aflatin.c, src/truetype/ttgload.c: Remove compiler + warnings. + + * builds/win32/visualc/freetype.vcproj: Add _CRT_SECURE_NO_DEPRECATE + to avoid deprecation warnings with Visual C++ 8. + +2006-12-16 Anders Kaseorg + + * src/base/ftlcdfil.c (FT_Library_SetLcdFilter) + [FT_FORCE_LIGHT_LCD_FILTER]: Fix typo. + +2006-12-15 suzuki toshiya + + * include/freetype/internal/services/svotval.h: Add `volatile' to + sync with the modification by Jens Claudius on 2006-08-22; cf. + http://cvs.savannah.gnu.org/viewcvs/freetype/freetype2/src/otvalid/otvmod.c?r1=1.4&r2=1.5 + +2006-12-15 suzuki toshiya + + * src/base/ftmac.c: Specialized for Mac OS X only. + * builds/unix/ftconfig.in: Fixed for ppc64 missing Carbon framework. + * builds/unix/configure.raw: Ditto. When explicit switches for + FSSpec/FSRef/QuickDraw/ATS availability are given to configure, + builds/mac/ftmac.c is used instead of default src/base/ftmac.c. + +2006-12-15 suzuki toshiya + + * builds/mac/ftmac.c: Copied src/base/ftmac.c for legacy system. + * builds/mac/FreeType.m68k_cfm.make.txt: Fix to use builds/mac/ftmac.c + instead of src/base/ftmac.c + * builds/mac/FreeType.ppc_carbon.make.txt: Ditto. + * builds/mac/FreeType.ppc_classic.make.txt: Ditto. + * builds/mac/FreeType.m68k_far.make.txt: Ditto, and exclude gxvalid.c + that cannot be built at present. + +2006-12-15 suzuki toshiya + + * src/base/ftobjs.c: Improvement of resource fork handler for + POSIX, cf. + http://lists.gnu.org/archive/html/freetype-devel/2006-10/msg00025.html + (Mac_Read_sfnt_Resource): Count only `sfnt' resource of suitcase font + format or .dfont, to simulate the face index number counted by ftmac.c. + (IsMacResource): Return the number of scalable faces correctly. + +2006-12-10 Werner Lemberg + + * builds/toplevel.mk (version): Protect against `distclean' target. + +2006-12-09 Werner Lemberg + + * builds/*/*def.mk, builds/*/detect.mk (CAT): Define to either `cat' + or `type'. + + * builds/freetype.mk (version): Extracted from freetype.h, using + GNU make's built-in string functions. + (refdoc): Use $(version) instead of static version number. + +2006-12-08 Werner Lemberg + + * builds/toplevel.mk (dist): Extract version number from freetype.h. + +2006-12-08 Vladimir Volovich + + * src/tools/apinames.c (State): Remove final comma in structure -- + xlc v5 under AIX 4.3 doesn't like this. + +2006-12-07 David Turner + + * src/autofit/afloader.c (af_loader_load_g): Small adjustment + to the spacing of auto-fitted glyphs. This only impacts rare + cases (e.g., Arial Bold at rather small character sizes). + +2006-12-03 Werner Lemberg + + * src/sfnt/rules.mk (SFNT_DRV_SRC): Add ttsbit0.c. + +2006-12-01 Werner Lemberg + + * src/sfnt/sfobjs.c (tt_face_get_name): All Unicode strings are + encoded in UTF-16BE. Patch from Rajeev Pahuja . + (tt_name_entry_ascii_from_ucs4): Removed. + + + * include/freetype/ftxf86.h: Fix and extend comment so that it + appears in the documentation. + + * include/freetype/ftchapters.h: Add `font_format' section. + + + * src/tools/docmaker/tohtml.py (HtmlFormatter::index_exit): Add link + to TOC in index page. + +2006-11-28 David Turner + + * src/smooth/ftgrays.c (gray_raster_render): Return 0 when we are + trying to render into a zero-width/height bitmap, not an error code. + + * src/truetype/ttobjs.c (tt_face_init): Fix typo in previous patch. + + * src/smooth/ftgrays.c: Remove hard-coded error values; use FreeType + ones instead. + + * src/autofit/afhints.c (af_glyph_hints_dump_segments): Remove unused + variable. + +2006-11-26 Pierre Hanser + + * src/truetype/ttobjs.c (tt_face_init): Protect against NULL pointer. + +2006-11-25 David Turner + + * src/autofit/afhints.c (af_glyph_hints_dump_points, + af_glyph_hints_dump_segments, af_glyph_hints_dumpedges) [!AF_DEBUG]: + Add stubs to link the `ftgrid' test program when debugging is + disabled in the auto-hinter. + +2006-11-23 David Turner + + * src/autofit/afhints.c, src/autofit/afhints.h, src/autofit/aflatin.c, + src/autofit/aftypes.h: Miscellaneous auto-hinter improvements. + + * src/autofit/afhints.c (af_glyph_hints_dump_segments) [AF_DEBUG]: + Emit more sensible information. + + * src/autofit/afhints.h (AF_SegmentRec): Add `height' member. + + * src/autofit/aflatin.c (af_latin_metrics_scale_dim): Improve + rounding of blue values. + (af_latin_hints_compute_segments): Hint segment heights. + (af_latin_hints_link_segments): Reduce `len_score' value. + (af_latin_hints_compute_edges): Increase `segment_length_threshold' + value and use `height' member for comparisons. + (af_latin_hint_edges): Extend logging message. + Improve handling of remaining edges. + +2006-11-22 Werner Lemberg + + Fix Savannah bug #15553. + + * src/truetype/ttgload.c (tt_loader_init): Re-execute the CVT + program after a change from mono to grayscaling (and vice versa). + Use correct constant for comparison to get `exec->grayscale'. + +2006-11-18 Werner Lemberg + + Because FT_Load_Glyph expects CID values for CID-keyed fonts, the + test for a valid glyph index must be deferred to the font drivers. + This patch fixes Savannah bug #18301. + + * src/base/ftobjs.c (FT_Load_Glyph): Don't check `glyph_index'. + * src/bdf/bdfdrivr.c (BDF_Glyph_Load), src/cff/cffgload.c + (cff_slot_load), src/cid/cidgload.c (cid_slot_load_glyph), + src/pcf/pcfdrivr.c (PCF_Glyph_Load), src/pfr/pfrobjs.c + (pfr_slot_load), src/truetype/ttdriver.c (Load_Glyph), + src/type1/t1gload.c (T1_Load_Glyph), src/winfonts/winfnt.c + (FNT_Load_Glyph): Check validity of `glyph_index'. + +2006-11-13 David Turner + + * src/truetype/ttinterp.c (FIX_BYTECODE): Undefine. The interpreter + `enhancements' are still too buggy for general use. + + * src/base/ftlcdfil.c: Add support for FT_FORCE_LIGHT_LCD_FILTER and + FT_FORCE_LEGACY_LCD_FILTER at compile time. Define these macros + when building the library to change the default LCD filter to be + used. This is only useful for experimentation. + + * include/freetype/ftlcdfil.h: Update documentation. + +2006-11-10 David Turner + + * src/smooth/ftsmooth.c: API change for the LCD + filter. The FT_LcdFilter value is an enumeration describing which + filter to apply, with new values FT_LCD_FILTER_LIGHT and + FT_LCD_FILTER_LEGACY (the latter implements the LibXft original + algorithm which produces strong color fringes for everything + except very-well hinted text). + + * include/freetype/ftlcdfil.h (FT_Library_SetLcdFilter): Change + second parameter to an enum type. + + * src/base/ftlcdfil.c (USE_LEGACY): Define. + (_ft_lcd_filter): Rename to... + (_ft_lcd_filter_fir): This. + Update parameters. + (_ft_lcd_filter_legacy) [USE_LEGACY]: New filter function. + (FT_Library_Set_LcdFilter): Update parameters. + Handle new filter modes. + + * include/internal/ftobjs.h: Include FT_LCD_FILTER_H. + (FT_Bitmap_LcdFilterFunc): Change third argument to `FT_Library'. + (FT_LibraryRec) [FT_CONFIG_OPTION_SUBPIXEL_RENDERING]: Add filtering + callback and update other fields. + + * src/smooth/ftsmooth.c (ft_smooth_render_generic) + [FT_CONFIG_OPTION_SUBPIXEL_RENDERING]: Update. + Other minor improvements. + + * src/autofit/aflatin.c: Various tiny improvements that drastically + improve the handling of serif fonts and of LCD/LCD_V hinting modes. + (af_latin_hints_compute_edges): Fix typo. + (af_latin_compute_stem_width): Take better care of diagonal stems. + +2006-11-09 David Turner + + * src/pshinter/pshalgo.c (psh_glyph_compute_inflections): Fix + typo which created a variable-used-before-initialized bug. + +2006-11-07 Zhe Su + + * src/base/ftsynth.c (FT_GlyphSlot_Embolden): Handle vertical layout + also. + +2006-11-03 Werner Lemberg + + * src/base/ftcalc.c: Don't use `long long' but `FT_Int64'. + +2006-11-02 David Turner + + Add a few tweaks to better handle serif fonts. + Add more debugging messages. + + * src/autofit/aflatin.c (af_latin_hints_compute_edges): Ignore + segments that are less than 1.5 pixels high. This gets rid of + *many* corner cases with serifs. + (af_latin_align_linked_edge): Add logging message. + (af_latin_hint_edges): Use AF_HINTS_DO_BLUES. + Add logging messages. + Handle AF_EDGE_FLAG flag specially. + + * src/autofit/afmodule.c [AF_DEBUG]: Add _af_debug, + _af_debug_disable_blue_hints, and _af_debug_hints variables. + + * src/autofit/aftypes.h (AF_LOG) [AF_DEBUG]: Use _af_debug. + Update external declarations. + (af_corner_orientation, af_corner_is_flat): Replaced by... + + * include/freetype/internal/ftcalc.h (ft_corner_orientation, + ft_corner_is_flat): These declarations. + + * src/autofit/afangles.c (af_corner_orientation, af_corner_is_flat): + Comment out. Replaced by... + + * src/base/ftcalc.h (ft_corner_orientation, ft_corner_is_flat): + These functions. Update all callers. + (FT_Add64) [!FT_LONG64]: Simplify. + + * src/autofit/afhints.c: Include FT_INTERNAL_CALC_H. + (af_direction_compute): Add a missing FT_ABS call. This bug caused + production of garbage by missing lots of segments. + + * src/autofit/afhints.h (AF_HINTS_DO_BLUES): New macro. + + * src/autofit/afloader.c (af_loader_init, af_loader_done) + [AF_DEBUG]: Set _af_debug_hints. + + + * src/pshinter/pshalgo.c: Include FT_INTERNAL_CALC_H. + (psh_corner_is_flat, psh_corner_orientation): Use ft_corner_is_flat + and ft_corner_orientation. + + + * src/gzip/inftrees.c (huft_build): Remove compiler warning. + +2006-10-24 Werner Lemberg + + * src/cff/cffload.c (cff_encoding_load): Remove unused variable. + + * src/base/ftobjs.c (FT_Select_Charmap): Disallow FT_ENCODING_NONE + as argument. + +2006-10-23 Zhe Su + + * src/base/ftoutln.c (FT_Outline_Get_Orientation): Re-implement to + better deal with broken Asian fonts with strange glyphs, having + self-intersections and other peculiarities. The used algorithm is + based on the nonzero winding rule. + +2006-10-23 David Turner + + Speed up the CFF font loader. With some large CFF fonts, + FT_Open_Face is now more than three times faster. + + * src/cff/cffload.c (cff_get_offset): Removed. + (cff_new_index): Inline functionality of `cff_get_offset'. + (cff_charset_compute_cids, cff_charset_free_cids): New functions. + (cff_charset_done): Call `cff_charset_free_cids'. + (cff_charset_load): Call `cff_charset_compute_cids'. + (cff_encoding_load) : Ditto, to replace inefficient loop. + + * src/sfnt/ttmtx.c (tt_face_load_hmtx): Replace calls to FT_GET_XXX + with FT_NEXT_XXX. + + + Speed up the Postscript hinter, with more than 100% speed increase + on my machine. + + * src/pshinter/pshalgo.c (psh_corner_is_flat, + psh_corner_orientation): New functions. + (psh_glyph_compute_inflections): Merge loops for efficiency. + Use `psh_corner_orientation'. + (psh_glyph_init): Use `psh_corner_is_flat'. + (psh_hint_table_find_strong_point): Renamed to... + (psh_hint_table_find_strong_points): This. + Rewrite, adding argument to handle all points at once. + Update all callers. + (PSH_MAX_STRONG_INTERNAL): New macro. + (psh_glyph_interpolate_normal_points): Rewrite for efficiency. + +2006-10-15 suzuki toshiya + + * src/base/ftmac.c (FT_New_Face_From_FOND): Initialize variable + `error' with FT_Err_Ok. + +2006-10-14 suzuki toshiya + + * docs/INSTALL.CROSS: New document file for cross-building. + + * builds/unix/configure.raw: Preliminary cross-building support. + Find native C compiler and pass it by CC_BUILD, and + find suffix for native executable and pass it by EXEEXT_BUILD. + Also suffix for target executable is passed by EXEEXT. + + * builds/unix/unix-cc.in (CCraw_build, E_BUILD): New variables to + build `apinames' which runs on building system. They are set by + CC_BUILD and EXEEXT_BUILD. + + * builds/exports.mk (APINAMES_EXE): Change the extension for + apinames from the suffix for target (E) to that for building host + (E_BUILD). + +2006-10-12 Werner Lemberg + + * docs/INSTALL.UNX, docs/UPGRADE.UNX: Renamed to... + * docs/INSTALL.UNIX, docs/UPGRADE.UNIX: This. Update all documents + which reference those files. + +2006-10-12 suzuki toshiya + + * builds/unix/configure.raw (FT2_EXTRA_LIBS): New variable. It is + embedded in freetype2.pc and freetype-config. Use it to record + Carbon dependency of MacOSX. + + * builds/unix/freetype2.in: Embed FT2_EXTRA_LIBS. + + * builds/unix/freetype-config.in: Ditto. + +2006-10-11 Werner Lemberg + + * devel/ftoption.h (FT_CONFIG_OPTION_SUBPIXEL_RENDERING): Define for + development. + +2006-10-03 Jens Claudius + + * include/freetype/config/ftstdlib.h: Cast away volatileness from + argument to ft_setjmp. + + * include/freetype/internal/ftvalid.h: Add comment that + ft_validator_run must not be used. + +2006-10-01 Werner Lemberg + + * src/base/ftbase.c: Undo change from 2006-09-30. + + * src/base/rules.mk (BASE_SRC): Remove `ftlcdfil.c'. + +2006-09-30 David Turner + + * include/freetype/internal/ftobjs.h (FT_Face_InternalRec): + s/unpatented_hinting/ignore_unpatented_hinter/. + Update all callers. + + * src/base/ftobjs.c (FT_Load_Glyph): Refine the algorithm whether + auto-hinting shall be used or not. + + * src/truetype/ttobjs.c (tt_face_init): Ditto. + +2006-09-30 Werner Lemberg + + * src/base/rules.mk (BASE_SRC): Remove `ftapi.c' (which is no longer + in use). + + * src/base/ftbase.c: Include `ftlcdfil.c'. + +2006-09-29 Werner Lemberg + + * src/sfnt/ttcmap.c (tt_cmap4_char_map_binary): Fix algorithm for + overlapping segments. Bug reported by Stefan Koch. + +2006-09-28 David Turner + + Fix a bug in the automatic unpatented hinting support which prevents + normal bytecode hinting to work properly. + + * include/freetype/internal/ftobjs.h (FT_Face_InternalRec): + s/force_autohint/unpatented_hinting/. Update all callers. + + * src/base/ftobjs.c (FT_Load_Glyph): Updated code. + + * src/autofit/aftypes.h (AF_DEBUG): Undefine to get rid of traces. + +2006-09-27 David Turner + + * include/freetype/freetype.h (FT_FREETYPE_PATCH): Set to 2. + + + Add a new API to support color filtering of subpixel glyph bitmaps. + In a default build, the function `FT_Library_SetLcdFilter' returns + `FT_Err_Unimplemented_Feature'; you need to #define + FT_CONFIG_OPTION_SUBPIXEL_RENDERING in ftoption.h to compile the + real implementation. + + * include/freetype/ftlcdfil.h, src/base/ftlcdfil.c: New files. + + * include/freetype/internal/ftobjs.h (FT_Bitmap_LcdFilterFunc): New + typedef. + (FT_LibraryRec) [FT_CONFIG_OPTION_SUBPIXEL_RENDERING]: New members + `lcd_filter_weights' and `lcd_filter'. + + * src/smooth/ftsmooth.c (ft_smooth_render_generic): Remove arguments + `hmul' and `vmul'. + + Handle subpixel rendering. + Simplify function. + (ft_smooth_render_lcd): Use `FT_RENDER_MODE_LCD'. + (ft_smooth_render_lcd_v): Use `FT_RENDER_MODE_LCD_V'. + + * include/freetype/config/ftheader.h (FT_LCD_FILTER_H): New macro, + pointing to . + + * src/base/Jamfile (_sources), src/base/rules.mk (BASE_SRC), + vms_make.com: Add `ftlcdfil.c' to the list of compiled source files. + + * modules.cfg (BASE_EXTENSIONS): Add ftlcdfil.c. + +2006-09-26 David Bustin + + * src/pfr/pfrobjs.c (pfr_face_get_kerning): Skip adjustment bytes + correctly. Reported as Savannah bug #17843. + +2006-09-26 David Turner + + * src/autofit/afhints.h (AF_HINTS_DO_HORIZONTAL, + AF_HINTS_DO_VERTICAL, AF_HINTS_DO_ADVANCE): New macros to disable + horizontal and vertical hinting for the purpose of debugging the + auto-fitter. + + * src/autofit/afmodule.c (_af_debug_disable_horz_hints, + _af_debug_disable_vert_hints) [AF_DEBUG]: New global variables. + + * src/autofit/aftypes.h [AF_DEBUG]: Declare above variables. + + * include/freetype/config/ftoption.h, devel/ftoption.h + (FT_CONFIG_OPTION_SUBPIXEL_RENDERING): New macro to control whether + we want to compile LCD-optimized rendering code (à la ClearType) or + not. The macro *must* be disabled in default builds of the library + for patent reasons. + + * src/smooth/ftsmooth.c (ft_smooth_render_generic): Disable + LCD-specific rendering when FT_CONFIG_OPTION_SUBPIXEL_RENDERING + isn't defined at compile time. This only changes the content of the + rendered glyph to match the one of normal gray-level rendering, + hence clients should not need to be modified. + + * docs/CHANGES: Updated. + +2006-09-18 Garrick Meeker + + * src/base/ftmac.c (FT_New_Face_From_FOND): Fall back to SFNT if + LWFN fails and both are available. + +2006-09-11 David Turner + + * src/sfnt/sfobjs.c (tt_face_get_name): Support some fonts which + report their English names through an Apple Roman + (platform,encoding) pair, with language_id != English. + + If the font uses another name entry with language_id == English, it + will be selected correctly, though. + + * src/truetype/ttobjs.c (tt_face_init): Add unpatented hinting + selection for `mingli.ttf'. + +2006-09-05 Werner Lemberg + + * src/truetype/ttpload.c (tt_face_load_hdmx): Handle `record_size' + values which have the upper two bytes set to 0xFF instead of 0x00 + (as it happens in at least two CJKV fonts, `HAN NOM A.ttf' and + `HAN NOM B.ttf'). + + * src/smooth/ftgrays.c [GRAYS_USE_GAMMA]: Really remove all code. + +2006-09-05 David Turner + + Minor source cleanups and optimizations. + + * src/smooth/ftgrays.c (GRAYS_COMPACT): Removed. + (TRaster): Remove `count_ex' and `count_ey'. + (gray_find_cell): Remove 2nd and 3rd argument. + (gray_alloc_cell): Merged with `gray_find_cell'. + (gray_record_cell): Simplify. + (gray_set_cell): Rewrite. + (gray_start_cell): Apply offsets to `ras.ex' and `ras.ey'. + (gray_render_span): Don't use FT_MEM_SET for small values. + (gray_dump_cells) [DEBUG_GRAYS]: New function. + (gray_sweep): Avoid buffer overwrites when to drawing the end of a + bitmap scanline. + (gray_convert_glyph): Fix speed-up. + +2006-09-04 David Turner + + * src/smooth/ftgrays.c (gray_convert_glyphs): Make it work with + 64bit processors. + +2006-09-03 Werner Lemberg + + * devel/ftoption.h: Synchronize with + include/freetype/config/ftoption.h. + + * src/smooth/ftgrays.c (gray_record_cell): Remove shadowing + variable declaration. + (gray_convert_glyph): Fix compiler warnings. + +2006-09-01 David Turner + + * src/truetype/ttobjs.c (tt_face_init): Update the TrueType loader + to recognize a few fonts that require the automatic unpatented + loader. + + * src/smooth/ftgrays.c: Optmize the performance of the anti-aliased + rasterizer. The speed improvement is between 15% and 25%, depending + on the font data. + + (GRAYS_USE_GAMMA, GRAYS_COMPACT): Removed, and all associated code. + (TCell): Redefine. + (TRaster): New members `buffer', `buffer_size', `ycells', `ycount'. + (gray_init_cells): Updated. + (gray_find_cell, gray_alloc_cell): New functions. + (gray_record_cell): Rewritten to use `gray_find_cell' and + `gray_alloc_cell'. + (PACK, LESS_THAN, SWAP_CELLS, DEBUG_SORT, QUICK_SORT, SHELL_SORT, + QSORT_THRESHOLD): + Removed. + (gray_shell_sort, gray_quick_sort, gray_check_sort, + gray_dump_cells): Removed. + (gray_sweep): Rewritten. + (gray_convert_glyph): Rewrite code which used one of the sorting + functions. + (gray_raster_render): Updated. + +2006-08-29 Dr. Werner Fink + + * configure: Make it possible to handle configure options which + have strings containing spaces. + +2006-08-27 David Turner + + * include/freetype/config/ftoption.h (TT_USE_BYTECODE_INTERPRETER): + New macro, defined if either TT_CONFIG_OPTION_BYTECODE_INTERPRETER + or TT_CONFIG_OPTION_UNPATENTED_HINTING is defined. + + * include/freetype/internal/ftcalc.h, src/base/ftcalc.c, + src/truetype/truetype.c, src/truetype/ttdriver.c, + src/truetype/ttgload.c, src/truetype/ttgload.h, + src/truetype/ttinterp.c, src/truetype/ttobjs.c, + src/truetype/ttobjs.h, src/truetype/ttpload.c, src/type42/t42drivr.c: + s/TT_CONFIG_OPTION_BYTECODE_INTERPRETER/TT_USE_BYTECODE_INTERPRETER/. + + * include/freetype/internal/ftobjs.h (FT_Face_InternalRec): New + member `force_autohint'. + + * src/base/ftobjs.c (FT_Load_Glyph): Use `force_autohint'. + + * src/truetype/ttobjs.c (tt_face_init): Prepare code for testing + against a list of font names which need the bytecode interpreter. + +2006-08-27 Jens Claudius + + Fix miscellaneous compiler warnings. + + * include/freetype/internal/ftobjs.h: Close comment with `*/' to + avoid `/* in comment' compiler warning. + + * src/base/ftdbgmem.c (ft_mem_table_get_source): Turn cast + `(FT_UInt32)(void*)' into `(FT_UInt32)(FT_PtrDist)(void*)' since on + 64-bit platforms void* is larger than FT_UInt32. + + * src/base/ftobjs.c (t_validator_error): Cast away + volatileness of argument to ft_longjmp. Spotted by Werner + `Putzfrau' Lemberg. + + * src/bdf/bdflib.c (bdf_load_font): Initialize local + variable `lineno'. + + * src/gxvalid/gxvmod.c (classic_kern_validate): Mark local variable + `error' as volatile. + +2006-08-27 Werner Lemberg + + * builds/unix/ftconfig.in: Synchronize with main ftconfig.h. + Reported by Jens. + +2006-08-22 Jens Claudius + + Fix for previous commit, which caused many compiler warnings/errors + about addresses of volatile objects passed as function arguments as + non-volatile pointers. + + * include/freetype/internal/ftvalid.h: Make FT_Validator typedef a + pointer to a volatile object. + + * src/gxvalid/gxvmod.c (gxv_load_table): Make function argument + `table' a pointer to a volatile object. + + * src/otvalid/otvmod.c (otv_load_table): Make function argument + `table' a pointer to a volatile object. + +2006-08-18 Jens Claudius + + * src/gxvalid/gxvmod.c (GXV_TABLE_DECL): Mark local variable `_sfnt' + as volatile since it must keep its value across a call to ft_setjmp. + (gxv_validate): Same for local variables `memory' and `valid'. + (classic_kern_validate): Same for local variables `memory', + `ckern', and `valid'. + + * src/otvalid/otvmod.c (otv_validate): Same for function parameter + `face' and local variables `base', `gdef', `gpos', `gsub', `jstf', + and 'valid'. + + * src/sfnt/ttcmap.c (tt_face_build_cmaps): Same for local variable + `cmap'. + +2006-08-16 David Turner + + * src/cid/cidgload.c (cid_slot_load_glyph): Remove compiler + warnings. + + * src/base/ftobjs.c (ft_validator_run): Disable function; it is + buggy by design. Always return -1. + + + Improvements to native TrueType hinting. This is a first try, + controlled by the FIX_BYTECODE macro in src/truetype/ttinterp.c. + + * include/freetype/internal/ftgloadr.h (FT_GlyphLoadRec): Add member + `extra_points2'. + + * include/freetype/internal/tttypes.h (TT_GlyphZoneRec): Add member + `orus'. + + * src/base/ftgloadr.c (FT_GlyphLoader_Reset, + FT_GlyphLoader_Adjust_Points, FT_GlyphLoader_CreateExtra, + FT_GlyphLoader_CheckPoints, FT_GlyphLoader_CopyPoints): Updated to + handle `extra_points2'. + + * src/truetype/ttgload.c (tt_prepare_zone): Handle `orus'. + Remove compiler warning. + (cur_to_arg): Remove macro. + (TT_Hint_Glyph): Updated. + (TT_Process_Simple_Glyph): Handle `orus'. + + * src/truetype/ttinterp.c (FIX_BYTECODE): New macro. + (Ins_MD, Ins_MDRP, Ins_IP) [FIX_BYTECODE]: Handle `orus'. + (LOC_Ins_IUP): Renamed to... + (IUP_WorkerRec): This. + Add `orus' member. + (Shift): Renamed to... + (_iup_worker_shift): This. + Updated. + (Interp): Renamed to... + (_iup_worker_interpolate): This. + Updated to handle `orus'. + (Ins_IUP): Updated. + + * src/truetype/ttobjs.c (tt_glyphzone_done, tt_glyphzone_new): + Handle `orus'. + +2006-08-15 suzuki toshiya + + * modules.cfg (BASE_EXTENSIONS): Compile in ftgxval.c by default to + build ftvalid in ft2demos. This has been inadvertedly changed + 2006-08-13. + +2006-08-15 suzuki toshiya + + `ft_validator_run' wrapping `setjmp' can cause a crash, as found by + Jens: + http://lists.gnu.org/archive/html/freetype-devel/2006-08/msg00004.htm. + + * src/otvalid/otvmod.c: Replace `ft_validator_run' by `ft_setjmp'. + It reverts the change introduced on 2005-08-20. + + * src/gxvalid/gxvmod.c: Ditto. + +2006-08-13 Jens Claudius + + * finclude/freetype/internal/psaux.h: (T1_TokenType): Add + T1_TOKEN_TYPE_KEY. + (T1_FieldRec): Add `dict'. + (T1_FIELD_DICT_FONTDICT, T1_FIELD_DICT_PRIVATE): New macros. + (T1_NEW_XXX, T1_FIELD_XXX): Update to take the dictionary where a PS + keyword is expected as an additional argument. + + * src/cid/cidload.c: (cid_field_records): Adjust invocations of + T1_FIELD_XXX. + + * src/cid/cidtoken.h: Adjust invocations of T1_FIELD_XXX. + + * src/psaux/psobjs.c: Add macro FT_COMPONENT for tracing. + (ps_parser_to_token): Report a PostScript key as T1_TOKEN_TYPE_KEY, + not T1_TOKEN_TYPE_ANY. + (ps_parser_load_field): Make sure a token that should be a string or + name is really a string or name. + Avoid memory leak if a keyword has been already encountered and its + value is overwritten. + * src/type1/t1load.c: (t1_keywords): Adjust invocations of + T1_FIELD_XXX. + (parse_dict): Ignore keywords that occur in the wrong dictionary + (e.g., in `Private' instead of `FontDict'). + + * src/type1/t1tokens.h: Adjust invocations of T1_FIELD_XXX. + + * src/type42/t42parse.c: (t42_keywords): Adjust invocations of + T1_FIELD_XXX. + +2006-07-18 Jens Claudius + + Move creation of field `buildchar' of T1_DecoderRec out of + `t1_decoder_init' and let the caller of `t1_decoder_init' take care + of it. + + Call the finisher for T1_Decoder in `cid_face_compute_max_advance' + and `T1_Compute_Max_Advance'. + + * include/freetype/internal/psaux.h (T1_DecoderRec): Remove field + `face', add `len_buildchar'. + + * include/freetype/internal/t1types.h (T1_FaceRec): Add field + `buildchar'. + + * src/cid/cidgload.c (cid_face_compute_max_advance): Call finisher + for T1_Decoder. + (cid_slot_load_glyph): Do not ignore failure when initializing the + T1_Decoder. + + * src/psaux/t1decode.c (t1_decoder_parse_charstrings): Updated. + (t1_decoder_init): Remove initialization of fields `buildchar' and + `len_buildchar'. + (t1_decoder_done): Remove deallocation of field `buildchar'. + + * freetype/src/type1/t1gload.c (T1_Compute_Max_Advance): Initialize + T1_Decoder's `buildchar' and `len_buildchar'; call finisher for + T1_Decoder. + (T1_Load_Glyph): Initialize T1_Decoder's `buildchar' and + `len_buildchar'; make sure to call finisher for T1_Decoder even in + case of error. + + * src/type1/t1load.c (T1_Open_Face): Allocate new field `buildchar' + of T1_FaceRec. + + * src/type1/t1objs.c (T1_Face_Done): Free new field `buildchar' of + T1_FaceRec. + +2006-07-14 Jens Claudius + + * include/freetype/internal/psaux.h: New macros IS_PS_NEWLINE, + IS_PS_SPACE, IS_PS_SPECIAL, IS_PS_DELIM, IS_PS_DIGIT, IS_PS_XDIGIT, + and IS_PS_BASE85 (from src/psaux/psconv.h). + (T1_FieldLocation): Add T1_FIELD_LOCATION_LOADER, + T1_FIELD_LOCATION_FACE, and T1_FIELD_LOCATION_BLEND. + (T1_DecoderRec): New fields `buildchar' and `face'. + (IS_PS_TOKEN): New macro. + + * include/freetype/internal/t1types.h (T1_FaceRec): New fields + `ndv_idx', `cdv_idx', and `len_buildchar'. + + * include/freetype/t1tables.h (PS_BlendRec): New fields + `default_design_vector' and `num_default_design_vector'. + + * src/psaux/psconv.h: Move macros IS_PS_NEWLINE, IS_PS_SPACE, + IS_PS_SPECIAL, IS_PS_DELIM, IS_PS_DIGIT, IS_PS_XDIGIT, and + IS_PS_BASE85 to include/freetype/internal/psaux.h. + + * src/psaux/psobjs.c (ps_parser_to_token_array): Allow `token' + argument to be NULL if we want only to count the number of tokens. + (ps_tocoordarray): Allow `coords' argument to be NULL if we just + want to skip the array. + (ps_tofixedarray): Allow `values' argument to be NULL if we just + want to skip the array. + + * src/psaux/t1decode.c (t1_decoder_parse_charstrings): Add support + for (partially commented out) othersubrs 19-25, 27, and 28. + (t1_decoder_init): Initialize new fields `face' and `buildchar'. + (t1_decoder_done): Release new field `buildchar'. + + * src/type1/t1load.c (parse_buildchar, parse_private): New + functions. + (t1_keywords): Register them. + (t1_allocate_blend): Updated. + (t1_load_keyword): Handle field types T1_FIELD_LOCATION_LOADER, + T1_FIELD_LOCATION_FACE and T1_FIELD_LOCATION_BLEND. + (parse_dict): Remove `keyword_flags' argument. + Use new macro IS_PS_TOKEN. + Changed function so that later PostScript definitions override + earlier ones. + (t1_init_loader): Initialize new field `keywords_encountered'. + (T1_Open_Face): Initialize new fields `ndv_idx', `cdv_idx', and + `len_buildchar'. + Remove `keywords_flags'. + + * src/type1/t1load.h (T1_LoaderRect): New field + `keywords_encountered'. + (T1_PRIVATE, T1_FONTDIR_AFTER_PRIVATE): New macros. + + * src/type1/t1tokens.h [!T1_CONFIG_OPTION_NO_MM_SUPPORT]: New + entries for parsing /NDV, /CDV, and /DesignVector. + +2006-07-07 Werner Lemberg + + Add many checks to protect against malformed PCF files. + + * src/pcf/pcfdrivr.c (PCF_Face_Done): Protect against NULL pointers. + (PCF_Face_Init): Add calls to PCF_Face_Done in case of errors. + + * src/pcf/pcfread.c (pcf_read_TOC): Protect against malformed table + data and check that tables don't overlap (using a simple + bubblesort). + (PCF_METRIC_SIZE, PCF_COMPRESSED_METRIC_SIZE, PCF_PROPERTY_SIZE): + New macros which give the size of data structures in the data + stream. + (pcf_get_properties): Use rough estimates to get array size limits. + Assign `face->nprops' and `face->properties' earlier so that a call + to PCF_Face_Done can do the clean-up in case of error. + Protect against invalid string offsets. + (pcf_get_metrics): Clean up code. + Adjust tracing message levels. + Use rough estimate to get array size limit. + (pcf_get_bitmaps): Clean up code. + Adjust tracing message levels. + Use rough estimates to get offset limits. + (pcf_get_encodings): Adjust tracing message level. + (pcf_get_accel): Clean up code. + +2006-06-26 Werner Lemberg + + * src/bdf/bdfdrivr.c (BDF_Face_Init): Handle fonts correctly which + don't have a POINT_SIZE property. This fixes Savannah bug #16914. + +2006-06-26 Jens Claudius + + * src/psaux/t1decode.c (T1_Operator, t1_args_count): Add opcode 15. + (t1_decoder_parse_charstrings): Operator with + opcode 15 pops its two arguments. + Handle the case where the pops of an othersubr may be part of a + subroutine. + Handle unknown othersubrs gracefully: count their operands and let + the following pop operators push the operands as the results onto + the Type1 stack. + Improve handling of setcurrentpoint opcode. + +2006-06-25 Jens Claudius + + The Type 1 parser now skips over top-level procedures as required + for a `Simplified Parser'. This makes the parser more robust as it + doesn't poke around in PostScript code. Additionally, it makes the + FontDirectory hackery in src/type1/t1load.c unnecessary. + + * src/psaux/psobjs.c (IS_OCTAL_DIGIT): New macro. + (skip_literal_string): Add FT_Error as return value. + Handle escapes better. + (skip_string): Add FT_Error as return value. + Don't set `parser->error' but return error code directly. + (skip_procedure): New function. + (ps_parser_skip_PS_token): Handle procedures. + Update code. + (ps_parser_to_token): Update code. + (ps_parser_load_field_table): Handle bbox entries also. + + * src/type1/t1load.c (parse_dict): Remove FontDirectory hackery. + Add commented-out code for synthetic fonts. + +2006-06-24 Eugeniy Meshcheryakov + + Fix two hinting bugs as reported in + http://lists.gnu.org/archive/html/freetype-devel/2006-06/msg00057.html. + + * include/freetype/internal/tttypes.h (TT_GlyphZoneRec): Add + `first_point' member. + + * src/truetype/ttgload.c (tt_prepare_zone): Initialize + `first_point'. + (TT_Process_Composite_Glyph): Always untouch points. + + * src/truetype/ttinterp.c (Ins_SHC): Fix computation of + `first_point' and `last_point' in case of composite glyphs. + (Ins_IUP): Fix computation of `end_point'. + +2006-06-22 suzuki toshiya + + Insert EndianS16_BtoN and EndianS32_BtoN as workaround for Intel + Mac. The original patch was written by David Sachitano and Lawrence + Coopet, and modified by Sean McBride for MPW compatibility. Only + required data are converted; unused data are left in big endian. + + * src/base/ftmac.c: Include for byteorder macros for non + Mac OS X platforms. + (OS_INLINE): Undefine before definition. + (count_faces_sfnt): Insert EndianS16_BtoN to parse the header of + FontAssociation table in FOND resource. + (count_faces_scalable): Insert EndianS16_BtoN to parse the header + and fontSize at each entry of FontAssociation table in FOND + resource. + (parse_fond): Insert EndianS16_BtoN and EndianS32_BtoN to parse + ffStylOff of FamilyRecord header of FOND resource, the header, + fontSize, fontID at each entry of FontAssociation table, and + StyleMapping table. + (count_faces): Call `HUnlock' after all FOND utilization. + +2006-06-08 suzuki toshiya + + Public API of TrueTypeGX, OpenType, and classic kern table validator + should return `FT_Err_Unimplemented_Feature' if validation service + is unavailable (disabled in `modules.cfg'). It is originally + suggested by David Turner, cf. + http://lists.gnu.org/archive/html/freetype-devel/2005-11/msg00078.html + + * src/base/ftgxval.c (FT_TrueTypeGX_Validate): Return + FT_Err_Unimplemented_Feature if TrueTypeGX validation service is + unavailable. + (FT_ClassicKern_Validate): Return FT_Err_Unimplemented_Feature if + classic kern table validation service is unavailable. + + * src/base/ftotval.c (FT_OpenType_Validate): Return + FT_Err_Unimplemented_Feature if OpenType validation service is + unavailable. + +2006-06-08 Werner Lemberg + + * src/bdf/bdflib.c (bdf_load_font): Fix memory leaks in case of + errors. + +2006-06-07 David Turner + + * src/type1/t1afm.c (KERN_INDEX): Make it more robust. + (T1_Read_Metrics): Fix memory leak which happened when the metrics + file doesn't have kerning pairs. This fixes Savannah bug #16768. + +2006-06-06 David Turner + + Fix memory leak described in Savannah bug #16759. + + We change `ps_unicodes_init' so that it also takes a + `free_glyph_name' callback to release the glyph names returned by + `get_glyph_name' + + * include/freetype/internal/services/svpscmap.h (PS_Glyph_NameFunc): + Renamed to ... + (PS_GetGlyphNameFunc): This. + (PS_FreeGlyphNameFunc): New typedef. + (PS_Unicodes_InitFunc): Add variable for PS_FreeGlyphNameFunc. + + * src/cff/cffcmap.c (cff_sid_to_glyph_name): Use `TT_Face' for first + argument. + (cff_sid_free_glyph_name): New function. + (cff_cmap_unicode_init): Updated. + + * src/psaux/t1cmap.c (t1_cmap_unicode_init): Updated. + + * src/psnames/psmodule.c (ps_unicodes_init): Add variable for + PS_FreeGlyphNameFunc and use it. + + +2006-06-04 David Turner + + * src/base/ftutil.c (ft_mem_qrealloc): Fix the function to accept + `item_size == 0' as well -- though this sounds weird, it can + theoretically happen. This fixes Savannah bug #16669. + + * src/pfr/pfrobjs.c (pfr_face_init): Fix the computation + of `face->num_glyphs' which missed the last glyph, due to + the offset-by-1 computation, since the PFR format doesn't + guarantee that glyph index 0 corresponds to the `missing + glyph. This fixes Savannah bug #16668. + +2006-05-25 Werner Lemberg + + * builds/unix/unix-cc.in (LINK_LIBRARY): Don't comment out + `-no-undefined'. Reported by Christian Biesinger. + +2006-05-19 Brian Weed + + * builds/win32/visualc/freetype.dsp: Release libraries no longer + have debug information, and debug libraries use `C7 compatible' + debug info. + +2006-05-19 suzuki toshiya + + Apply patch by Derek Clegg to fix two memory leaks in the MacOS + resource fork handler. This fixes Savannah bug #16631. + + * src/base/ftobjs.c (load_face_in_embedded_rfork): Replace + `FT_Stream_Close' by `FT_Stream_Free' to fix memory leak. + + * src/base/ftrfrk.c (raccess_guess_linux_double_from_file_name): + Replace `FT_Stream_Close' by `FT_Stream_Free' to fix memory leak. + +2006-05-19 suzuki toshiya + + * build/unix/configure.raw: Add a fallback to disable Carbon + dependency, if configured with no options on Mac OS X. + +2006-05-19 suzuki toshiya + + * src/base/ftmac.c (open_face_from_buffer): Deallocate stream when + its content cannot be parsed as supported font. This fixes + the second part of Savannah bug #16590. + +2006-05-18 Werner Lemberg + + * src/truetype/ttgload.c (TT_Load_Composite_Glyph) + [FT_CONFIG_OPTION_BYTECODE_INTERPRETER]: Make it compilable again. + +2006-05-17 David Turner + + This is a major patch used to drastically improve the performance of + loading glyphs. This both speeds up loading the glyph vectors + themselves and the auto-fitter module. + + We now use inline assembler code with GCC to implement `FT_MulFix', + which is probably the most important function related to the + engine's performance. + + The resulting speed-up is about 25%. + + + * include/freetype/internal/tttypes.h (TT_LoaderRec): Add fields + `cursor' and `limit'. + + * src/autofit/afangles.c (af_corner_is_flat, af_corner_orientation): + New functions. + (AF_ATAN_BITS, af_arctan, af_angle_atan): Comment out. + [TEST]: Remove. + + * src/autofit/afcjk.c (AF_Script_UniRangeRec): Comment out test + code. + + * src/autofit/afhints.c (af_axis_hints_new_segment): Don't call + `FT_ZERO' + (af_direction_compute, af_glyph_hints_compute_inflections): Rewritten. + (af_glyph_hints_reload: Rewrite recognition of weak points. + + * src/autofit/aflatin.c (af_latin_hints_compute_segments): Move + constant values out of the loops. + + * src/autofit/aftypes.h: Updated. + + * src/base/ftcalc.c (FT_MulFix): Use inline assembler code. + + * src/base/ftoutln.c (FT_Outline_Get_Orientation): Use vector + product to get orientation. + + * src/gzip/ftgzip.c (ft_get_uncompressed_size): New function. + (FT_Stream_OpenGzip): Use it to handle small files directly in + memory. + + * src/psaux/psconv.c (PS_Conv_ASCIIHexDecode, PS_ConvEexecDecode): + Improve performance. + + * src/truetype/ttgload.c (TT_Access_Glyph_Frame): Set `cursor' and + `limit'. + + (TT_Load_Glyph_Header, TT_Load_Simple_Glyph, + TT_Load_Composite_Glyph): Updated. Add threshold to protect against + exceedingly large values of number of contours. Speed up by + reducing the number of loops. + + * src/type1/t1gload.c (T1_Load_Glyph): Don't apply unit matrix. + + + * src/cache/ftccmap.c (FTC_CMapCache_Lookup): Change the threshold + used to detect rogue clients from 4 to 16. This is to prevent some + segmentation faults with fonts like `KozMinProVI-Regular.otf' which + comes from the Japanese Adobe Reader Asian Font pack. + +2007-05-17 Werner Lemberg + + * src/cff/cffload.c (cff_font_done): Deallocate subfont array. This + fixes the first part of Savannah bug #16590. + +2006-05-16 Werner Lemberg + + * docs/PROBLEMS: Updated icl issues. + +---------------------------------------------------------------------------- + +Copyright 2006, 2007, 2008, 2009, 2010 by +David Turner, Robert Wilhelm, and Werner Lemberg. + +This file is part of the FreeType project, and may only be used, modified, +and distributed under the terms of the FreeType project license, +LICENSE.TXT. By continuing to use, modify, or distribute this file you +indicate that you have read the license and understand and accept it +fully. + + +Local Variables: +version-control: never +coding: utf-8 +End: diff --git a/reactos/lib/3rdparty/freetype/Jamfile b/reactos/lib/3rdparty/freetype/Jamfile index d8c1bbada29..0ef8b625094 100644 --- a/reactos/lib/3rdparty/freetype/Jamfile +++ b/reactos/lib/3rdparty/freetype/Jamfile @@ -1,6 +1,6 @@ # FreeType 2 top Jamfile. # -# Copyright 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 by +# Copyright 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 by # David Turner, Robert Wilhelm, and Werner Lemberg. # # This file is part of the FreeType project, and may only be used, modified, @@ -194,7 +194,7 @@ rule RefDoc actions RefDoc { - python $(FT2_SRC)/tools/docmaker/docmaker.py --prefix=ft2 --title=FreeType-2.3.12 --output=$(DOC_DIR) $(FT2_INCLUDE)/freetype/*.h $(FT2_INCLUDE)/freetype/config/*.h + python $(FT2_SRC)/tools/docmaker/docmaker.py --prefix=ft2 --title=FreeType-2.4.4 --output=$(DOC_DIR) $(FT2_INCLUDE)/freetype/*.h $(FT2_INCLUDE)/freetype/config/*.h } RefDoc refdoc ; diff --git a/reactos/lib/3rdparty/freetype/README b/reactos/lib/3rdparty/freetype/README index 282791ef087..07c6f5fd752 100644 --- a/reactos/lib/3rdparty/freetype/README +++ b/reactos/lib/3rdparty/freetype/README @@ -9,8 +9,8 @@ is called `libttf'. They are *not* compatible! - FreeType 2.3.12 - =============== + FreeType 2.4.4 + ============== Please read the docs/CHANGES file, it contains IMPORTANT INFORMATION. @@ -26,9 +26,9 @@ and download one of the following files. - freetype-doc-2.3.12.tar.bz2 - freetype-doc-2.3.12.tar.gz - ftdoc2312.zip + freetype-doc-2.4.4.tar.bz2 + freetype-doc-2.4.4.tar.gz + ftdoc244.zip Bugs diff --git a/reactos/lib/3rdparty/freetype/README.git b/reactos/lib/3rdparty/freetype/README.git index bb36cf7b303..673200aa622 100644 --- a/reactos/lib/3rdparty/freetype/README.git +++ b/reactos/lib/3rdparty/freetype/README.git @@ -33,7 +33,7 @@ should work on all platforms which have GNU make (or makepp). ---------------------------------------------------------------------- -Copyright 2005, 2006, 2007, 2008, 2009 by +Copyright 2005, 2006, 2007, 2008, 2009, 2010 by David Turner, Robert Wilhelm, and Werner Lemberg. This file is part of the FreeType project, and may only be used, @@ -43,4 +43,4 @@ this file you indicate that you have read the license and understand and accept it fully. ---- end of README.CVS --- +--- end of README.git --- diff --git a/reactos/lib/3rdparty/freetype/configure b/reactos/lib/3rdparty/freetype/configure index 2efa2696797..b3975562410 100644 --- a/reactos/lib/3rdparty/freetype/configure +++ b/reactos/lib/3rdparty/freetype/configure @@ -1,6 +1,6 @@ #!/bin/sh # -# Copyright 2002, 2003, 2004, 2005, 2006, 2008, 2009 by +# Copyright 2002, 2003, 2004, 2005, 2006, 2008, 2009, 2010 by # David Turner, Robert Wilhelm, and Werner Lemberg. # # This file is part of the FreeType project, and may only be used, modified, @@ -78,10 +78,15 @@ if test $# -gt 0; then done fi -# build a dummy Makefile if we are not building in the source tree +# build a dummy Makefile if we are not building in the source tree; +# we use inodes to avoid issues with symbolic links +inode_src=`ls -id $abs_ft2_dir | awk '{print $1}'` +inode_dst=`ls -id $abs_curr_dir | awk '{print $1}'` -if test "$abs_curr_dir" != "$abs_ft2_dir"; then - mkdir reference +if test $inode_src -ne $inode_dst; then + if test ! -d reference; then + mkdir reference + fi if test ! -r $abs_curr_dir/modules.cfg; then echo "Copying \`modules.cfg'" cp $abs_ft2_dir/modules.cfg $abs_curr_dir @@ -91,7 +96,7 @@ if test "$abs_curr_dir" != "$abs_ft2_dir"; then echo "OBJ_DIR := $abs_curr_dir" >> Makefile echo "OBJ_BUILD := \$(OBJ_DIR)" >> Makefile echo "DOC_DIR := \$(OBJ_DIR)/reference" >> Makefile - echo "LIBTOOL := \$(OBJ_DIR)/libtool" >> Makefile + echo "FT_LIBTOOL_DIR := \$(OBJ_DIR)" >> Makefile echo "ifndef FT2DEMOS" >> Makefile echo " include \$(TOP_DIR)/Makefile" >> Makefile echo "else" >> Makefile diff --git a/reactos/lib/3rdparty/freetype/devel/ftoption.h b/reactos/lib/3rdparty/freetype/devel/ftoption.h index 9c6c2fe4594..5392d1e87f1 100644 --- a/reactos/lib/3rdparty/freetype/devel/ftoption.h +++ b/reactos/lib/3rdparty/freetype/devel/ftoption.h @@ -488,8 +488,7 @@ FT_BEGIN_HEADER /*************************************************************************/ /* */ /* Define TT_CONFIG_OPTION_BYTECODE_INTERPRETER if you want to compile */ - /* a bytecode interpreter in the TrueType driver. Note that there are */ - /* important patent issues related to the use of the interpreter. */ + /* a bytecode interpreter in the TrueType driver. */ /* */ /* By undefining this, you will only compile the code necessary to load */ /* TrueType glyphs without hinting. */ @@ -504,10 +503,13 @@ FT_BEGIN_HEADER /* */ /* If you define TT_CONFIG_OPTION_UNPATENTED_HINTING, a special version */ /* of the TrueType bytecode interpreter is used that doesn't implement */ - /* any of the patented opcodes and algorithms. Note that the */ - /* TT_CONFIG_OPTION_UNPATENTED_HINTING macro is *ignored* if you define */ - /* TT_CONFIG_OPTION_BYTECODE_INTERPRETER; in other words, either define */ - /* TT_CONFIG_OPTION_BYTECODE_INTERPRETER or */ + /* any of the patented opcodes and algorithms. The patents related to */ + /* TrueType hinting have expired worldwide since May 2010; this option */ + /* is now deprecated. */ + /* */ + /* Note that the TT_CONFIG_OPTION_UNPATENTED_HINTING macro is *ignored* */ + /* if you define TT_CONFIG_OPTION_BYTECODE_INTERPRETER; in other words, */ + /* either define TT_CONFIG_OPTION_BYTECODE_INTERPRETER or */ /* TT_CONFIG_OPTION_UNPATENTED_HINTING but not both at the same time. */ /* */ /* This macro is only useful for a small number of font files (mostly */ @@ -687,7 +689,28 @@ FT_BEGIN_HEADER * is recommended to disable the macro since it reduces the library's code * size and activates a few memory-saving optimizations as well. */ -/* #define FT_CONFIG_OPTION_OLD_INTERNALS */ +/* #define FT_CONFIG_OPTION_OLD_INTERNALS xxx */ + + + /* + * To detect legacy cache-lookup call from a rogue client (<= 2.1.7), + * we restrict the number of charmaps in a font. The current API of + * FTC_CMapCache_Lookup() takes cmap_index & charcode, but old API + * takes charcode only. To determine the passed value is for cmap_index + * or charcode, the possible cmap_index is restricted not to exceed + * the minimum possible charcode by a rogue client. It is also very + * unlikely that a rogue client is interested in Unicode values 0 to 15. + * + * NOTE: The original threshold was 4 deduced from popular number of + * cmap subtables in UCS-4 TrueType fonts, but now it is not + * irregular for OpenType fonts to have more than 4 subtables, + * because variation selector subtables are available for Apple + * and Microsoft platforms. + */ + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS +#define FT_MAX_CHARMAP_CACHEABLE 15 +#endif /* diff --git a/reactos/lib/3rdparty/freetype/freetype.rbuild b/reactos/lib/3rdparty/freetype/freetype.rbuild index 5c41eb1d442..081cf018a72 100644 --- a/reactos/lib/3rdparty/freetype/freetype.rbuild +++ b/reactos/lib/3rdparty/freetype/freetype.rbuild @@ -4,12 +4,6 @@ include - - - - - - ftbase.c diff --git a/reactos/lib/3rdparty/freetype/include/freetype/config/ftconfig.h b/reactos/lib/3rdparty/freetype/include/freetype/config/ftconfig.h index 43d587e02b9..cbe30f26899 100644 --- a/reactos/lib/3rdparty/freetype/include/freetype/config/ftconfig.h +++ b/reactos/lib/3rdparty/freetype/include/freetype/config/ftconfig.h @@ -363,7 +363,7 @@ FT_BEGIN_HEADER #endif /* __arm__ && !__thumb__ && !( __CC_ARM || __ARMCC__ ) */ -#if defined( i386 ) +#if defined( __i386__ ) #define FT_MULFIX_ASSEMBLER FT_MulFix_i386 /* documentation is in freetype.h */ diff --git a/reactos/lib/3rdparty/freetype/include/freetype/config/ftoption.h b/reactos/lib/3rdparty/freetype/include/freetype/config/ftoption.h index 443c0d8bf4d..2b46259c152 100644 --- a/reactos/lib/3rdparty/freetype/include/freetype/config/ftoption.h +++ b/reactos/lib/3rdparty/freetype/include/freetype/config/ftoption.h @@ -317,7 +317,7 @@ FT_BEGIN_HEADER /* supply font data incrementally as the document is parsed, such */ /* as the Ghostscript interpreter for the PostScript language. */ /* */ -/* #define FT_CONFIG_OPTION_INCREMENTAL */ +#define FT_CONFIG_OPTION_INCREMENTAL /*************************************************************************/ @@ -488,8 +488,7 @@ FT_BEGIN_HEADER /*************************************************************************/ /* */ /* Define TT_CONFIG_OPTION_BYTECODE_INTERPRETER if you want to compile */ - /* a bytecode interpreter in the TrueType driver. Note that there are */ - /* important patent issues related to the use of the interpreter. */ + /* a bytecode interpreter in the TrueType driver. */ /* */ /* By undefining this, you will only compile the code necessary to load */ /* TrueType glyphs without hinting. */ @@ -497,17 +496,20 @@ FT_BEGIN_HEADER /* Do not #undef this macro here, since the build system might */ /* define it for certain configurations only. */ /* */ -/* #define TT_CONFIG_OPTION_BYTECODE_INTERPRETER */ +#define TT_CONFIG_OPTION_BYTECODE_INTERPRETER /*************************************************************************/ /* */ /* If you define TT_CONFIG_OPTION_UNPATENTED_HINTING, a special version */ /* of the TrueType bytecode interpreter is used that doesn't implement */ - /* any of the patented opcodes and algorithms. Note that the */ - /* TT_CONFIG_OPTION_UNPATENTED_HINTING macro is *ignored* if you define */ - /* TT_CONFIG_OPTION_BYTECODE_INTERPRETER; in other words, either define */ - /* TT_CONFIG_OPTION_BYTECODE_INTERPRETER or */ + /* any of the patented opcodes and algorithms. The patents related to */ + /* TrueType hinting have expired worldwide since May 2010; this option */ + /* is now deprecated. */ + /* */ + /* Note that the TT_CONFIG_OPTION_UNPATENTED_HINTING macro is *ignored* */ + /* if you define TT_CONFIG_OPTION_BYTECODE_INTERPRETER; in other words, */ + /* either define TT_CONFIG_OPTION_BYTECODE_INTERPRETER or */ /* TT_CONFIG_OPTION_UNPATENTED_HINTING but not both at the same time. */ /* */ /* This macro is only useful for a small number of font files (mostly */ @@ -544,7 +546,7 @@ FT_BEGIN_HEADER /* ... */ /* } */ /* */ -//#define TT_CONFIG_OPTION_UNPATENTED_HINTING +/* #define TT_CONFIG_OPTION_UNPATENTED_HINTING */ /*************************************************************************/ @@ -690,6 +692,27 @@ FT_BEGIN_HEADER #define FT_CONFIG_OPTION_OLD_INTERNALS + /* + * To detect legacy cache-lookup call from a rogue client (<= 2.1.7), + * we restrict the number of charmaps in a font. The current API of + * FTC_CMapCache_Lookup() takes cmap_index & charcode, but old API + * takes charcode only. To determine the passed value is for cmap_index + * or charcode, the possible cmap_index is restricted not to exceed + * the minimum possible charcode by a rogue client. It is also very + * unlikely that a rogue client is interested in Unicode values 0 to 15. + * + * NOTE: The original threshold was 4 deduced from popular number of + * cmap subtables in UCS-4 TrueType fonts, but now it is not + * irregular for OpenType fonts to have more than 4 subtables, + * because variation selector subtables are available for Apple + * and Microsoft platforms. + */ + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS +#define FT_MAX_CHARMAP_CACHEABLE 15 +#endif + + /* * This macro is defined if either unpatented or native TrueType * hinting is requested by the definitions above. diff --git a/reactos/lib/3rdparty/freetype/include/freetype/freetype.h b/reactos/lib/3rdparty/freetype/include/freetype/freetype.h index 942a740f00a..70c39008b8d 100644 --- a/reactos/lib/3rdparty/freetype/include/freetype/freetype.h +++ b/reactos/lib/3rdparty/freetype/include/freetype/freetype.h @@ -1952,6 +1952,9 @@ FT_BEGIN_HEADER /* Each new face object created with this function also owns a */ /* default @FT_Size object, accessible as `face->size'. */ /* */ + /* See the discussion of reference counters in the description of */ + /* @FT_Reference_Face. */ + /* */ FT_EXPORT( FT_Error ) FT_Open_Face( FT_Library library, const FT_Open_Args* args, @@ -2016,6 +2019,33 @@ FT_BEGIN_HEADER FT_Open_Args* parameters ); + /*************************************************************************/ + /* */ + /* */ + /* FT_Reference_Face */ + /* */ + /* */ + /* A counter gets initialized to~1 at the time an @FT_Face structure */ + /* is created. This function increments the counter. @FT_Done_Face */ + /* then only destroys a face if the counter is~1, otherwise it simply */ + /* decrements the counter. */ + /* */ + /* This function helps in managing life-cycles of structures which */ + /* reference @FT_Face objects. */ + /* */ + /* */ + /* face :: A handle to a target face object. */ + /* */ + /* */ + /* FreeType error code. 0~means success. */ + /* */ + /* */ + /* 2.4.2 */ + /* */ + FT_EXPORT( FT_Error ) + FT_Reference_Face( FT_Face face ); + + /*************************************************************************/ /* */ /* */ @@ -2031,6 +2061,10 @@ FT_BEGIN_HEADER /* */ /* FreeType error code. 0~means success. */ /* */ + /* */ + /* See the discussion of reference counters in the description of */ + /* @FT_Reference_Face. */ + /* */ FT_EXPORT( FT_Error ) FT_Done_Face( FT_Face face ); @@ -2997,7 +3031,7 @@ FT_BEGIN_HEADER * * @return: * The index into the array of character maps within the face to which - * `charmap' belongs. + * `charmap' belongs. If an error occurs, -1 is returned. * */ FT_EXPORT( FT_Int ) @@ -3773,8 +3807,8 @@ FT_BEGIN_HEADER * */ #define FREETYPE_MAJOR 2 -#define FREETYPE_MINOR 3 -#define FREETYPE_PATCH 12 +#define FREETYPE_MINOR 4 +#define FREETYPE_PATCH 4 /*************************************************************************/ @@ -3834,6 +3868,9 @@ FT_BEGIN_HEADER /* 1~if this is a TrueType font that uses one of the patented */ /* opcodes, 0~otherwise. */ /* */ + /* */ + /* Since May 2010, TrueType hinting is no longer patented. */ + /* */ /* */ /* 2.3.5 */ /* */ @@ -3861,6 +3898,9 @@ FT_BEGIN_HEADER /* an SFNT font, or if the unpatented hinter is not compiled in this */ /* instance of the library. */ /* */ + /* */ + /* Since May 2010, TrueType hinting is no longer patented. */ + /* */ /* */ /* 2.3.5 */ /* */ diff --git a/reactos/lib/3rdparty/freetype/include/freetype/ftcache.h b/reactos/lib/3rdparty/freetype/include/freetype/ftcache.h index 0916d70a37e..6af53062283 100644 --- a/reactos/lib/3rdparty/freetype/include/freetype/ftcache.h +++ b/reactos/lib/3rdparty/freetype/include/freetype/ftcache.h @@ -4,7 +4,7 @@ /* */ /* FreeType Cache subsystem (specification). */ /* */ -/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 by */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2010 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -56,9 +56,12 @@ FT_BEGIN_HEADER * interpret them in any way. * * Second, the cache calls, only when needed, a client-provided function - * to convert a @FTC_FaceID into a new @FT_Face object. The latter is + * to convert an @FTC_FaceID into a new @FT_Face object. The latter is * then completely managed by the cache, including its termination - * through @FT_Done_Face. + * through @FT_Done_Face. To monitor termination of face objects, the + * finalizer callback in the `generic' field of the @FT_Face object can + * be used, which might also be used to store the @FTC_FaceID of the + * face. * * Clients are free to map face IDs to anything else. The most simple * usage is to associate them to a (pathname,face_index) pair that is @@ -211,12 +214,17 @@ FT_BEGIN_HEADER /* */ +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + + /* these macros are incompatible with LLP64, should not be used */ + #define FT_POINTER_TO_ULONG( p ) ( (FT_ULong)(FT_Pointer)(p) ) #define FTC_FACE_ID_HASH( i ) \ ((FT_UInt32)(( FT_POINTER_TO_ULONG( i ) >> 3 ) ^ \ ( FT_POINTER_TO_ULONG( i ) << 7 ) ) ) +#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ /*************************************************************************/ /*************************************************************************/ @@ -263,10 +271,10 @@ FT_BEGIN_HEADER /* reference-counted. A node with a count of~0 might be flushed */ /* out of a full cache whenever a lookup request is performed. */ /* */ - /* If you lookup nodes, you have the ability to `acquire' them, i.e., */ - /* to increment their reference count. This will prevent the node */ - /* from being flushed out of the cache until you explicitly `release' */ - /* it (see @FTC_Node_Unref). */ + /* If you look up nodes, you have the ability to `acquire' them, */ + /* i.e., to increment their reference count. This will prevent the */ + /* node from being flushed out of the cache until you explicitly */ + /* `release' it (see @FTC_Node_Unref). */ /* */ /* See also @FTC_SBitCache_Lookup and @FTC_ImageCache_Lookup. */ /* */ @@ -697,11 +705,17 @@ FT_BEGIN_HEADER (d1)->width == (d2)->width && \ (d1)->flags == (d2)->flags ) +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + + /* this macro is incompatible with LLP64, should not be used */ + #define FTC_IMAGE_TYPE_HASH( d ) \ (FT_UFast)( FTC_FACE_ID_HASH( (d)->face_id ) ^ \ ( (d)->width << 8 ) ^ (d)->height ^ \ ( (d)->flags << 4 ) ) +#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ + /*************************************************************************/ /* */ @@ -1093,6 +1107,7 @@ FT_BEGIN_HEADER (f1)->pix_width == (f2)->pix_width && \ (f1)->pix_height == (f2)->pix_height ) + /* this macro is incompatible with LLP64, should not be used */ #define FTC_FONT_HASH( f ) \ (FT_UInt32)( FTC_FACE_ID_HASH((f)->face_id) ^ \ ((f)->pix_width << 8) ^ \ diff --git a/reactos/lib/3rdparty/freetype/include/freetype/fterrdef.h b/reactos/lib/3rdparty/freetype/include/freetype/fterrdef.h index d7ad256bdb0..bf522206032 100644 --- a/reactos/lib/3rdparty/freetype/include/freetype/fterrdef.h +++ b/reactos/lib/3rdparty/freetype/include/freetype/fterrdef.h @@ -4,7 +4,7 @@ /* */ /* FreeType error codes (specification). */ /* */ -/* Copyright 2002, 2004, 2006, 2007 by */ +/* Copyright 2002, 2004, 2006, 2007, 2010 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -211,6 +211,9 @@ "argument stack underflow" ) FT_ERRORDEF_( Ignore, 0xA2, \ "ignore" ) + FT_ERRORDEF_( No_Unicode_Glyph_Name, 0xA3, \ + "no Unicode glyph name found" ) + /* BDF errors */ @@ -220,19 +223,21 @@ "`FONT' field missing" ) FT_ERRORDEF_( Missing_Size_Field, 0xB2, \ "`SIZE' field missing" ) - FT_ERRORDEF_( Missing_Chars_Field, 0xB3, \ + FT_ERRORDEF_( Missing_Fontboundingbox_Field, 0xB3, \ + "`FONTBOUNDINGBOX' field missing" ) + FT_ERRORDEF_( Missing_Chars_Field, 0xB4, \ "`CHARS' field missing" ) - FT_ERRORDEF_( Missing_Startchar_Field, 0xB4, \ + FT_ERRORDEF_( Missing_Startchar_Field, 0xB5, \ "`STARTCHAR' field missing" ) - FT_ERRORDEF_( Missing_Encoding_Field, 0xB5, \ + FT_ERRORDEF_( Missing_Encoding_Field, 0xB6, \ "`ENCODING' field missing" ) - FT_ERRORDEF_( Missing_Bbx_Field, 0xB6, \ + FT_ERRORDEF_( Missing_Bbx_Field, 0xB7, \ "`BBX' field missing" ) - FT_ERRORDEF_( Bbx_Too_Big, 0xB7, \ + FT_ERRORDEF_( Bbx_Too_Big, 0xB8, \ "`BBX' too big" ) - FT_ERRORDEF_( Corrupted_Font_Header, 0xB8, \ + FT_ERRORDEF_( Corrupted_Font_Header, 0xB9, \ "Font header corrupted or missing fields" ) - FT_ERRORDEF_( Corrupted_Font_Glyphs, 0xB9, \ + FT_ERRORDEF_( Corrupted_Font_Glyphs, 0xBA, \ "Font glyphs corrupted or missing fields" ) diff --git a/reactos/lib/3rdparty/freetype/include/freetype/ftimage.h b/reactos/lib/3rdparty/freetype/include/freetype/ftimage.h index 0272e92d2b3..04b5e04f7bb 100644 --- a/reactos/lib/3rdparty/freetype/include/freetype/ftimage.h +++ b/reactos/lib/3rdparty/freetype/include/freetype/ftimage.h @@ -268,9 +268,21 @@ FT_BEGIN_HEADER /* flow. In all cases, the pitch is an offset to add */ /* to a bitmap pointer in order to go down one row. */ /* */ + /* Note that `padding' means the alignment of a */ + /* bitmap to a byte border, and FreeType functions */ + /* normally align to the smallest possible integer */ + /* value. */ + /* */ /* For the B/W rasterizer, `pitch' is always an even */ /* number. */ /* */ + /* To change the pitch of a bitmap (say, to make it a */ + /* multiple of 4), use @FT_Bitmap_Convert. */ + /* Alternatively, you might use callback functions to */ + /* directly render to the application's surface; see */ + /* the file `example2.cpp' in the tutorial for a */ + /* demonstration. */ + /* */ /* buffer :: A typeless pointer to the bitmap buffer. This */ /* value should be aligned on 32-bit boundaries in */ /* most cases. */ diff --git a/reactos/lib/3rdparty/freetype/include/freetype/ftlcdfil.h b/reactos/lib/3rdparty/freetype/include/freetype/ftlcdfil.h index c6201b38e99..0b55ebee65c 100644 --- a/reactos/lib/3rdparty/freetype/include/freetype/ftlcdfil.h +++ b/reactos/lib/3rdparty/freetype/include/freetype/ftlcdfil.h @@ -5,7 +5,7 @@ /* FreeType API for color filtering of subpixel bitmap glyphs */ /* (specification). */ /* */ -/* Copyright 2006, 2007, 2008 by */ +/* Copyright 2006, 2007, 2008, 2010 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -58,7 +58,7 @@ FT_BEGIN_HEADER /**************************************************************************** * - * @func: + * @enum: * FT_LcdFilter * * @description: @@ -161,6 +161,47 @@ FT_BEGIN_HEADER FT_Library_SetLcdFilter( FT_Library library, FT_LcdFilter filter ); + + /************************************************************************** + * + * @func: + * FT_Library_SetLcdFilterWeights + * + * @description: + * Use this function to override the filter weights selected by + * @FT_Library_SetLcdFilter. By default, FreeType uses the quintuple + * (0x00, 0x55, 0x56, 0x55, 0x00) for FT_LCD_FILTER_LIGHT, and (0x10, + * 0x40, 0x70, 0x40, 0x10) for FT_LCD_FILTER_DEFAULT and + * FT_LCD_FILTER_LEGACY. + * + * @input: + * library :: + * A handle to the target library instance. + * + * weights :: + * A pointer to an array; the function copies the first five bytes and + * uses them to specify the filter weights. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * Due to *PATENTS* covering subpixel rendering, this function doesn't + * do anything except returning `FT_Err_Unimplemented_Feature' if the + * configuration macro FT_CONFIG_OPTION_SUBPIXEL_RENDERING is not + * defined in your build of the library, which should correspond to all + * default builds of FreeType. + * + * This function must be called after @FT_Library_SetLcdFilter to have + * any effect. + * + * @since: + * 2.4.0 + */ + FT_EXPORT( FT_Error ) + FT_Library_SetLcdFilterWeights( FT_Library library, + unsigned char *weights ); + /* */ diff --git a/reactos/lib/3rdparty/freetype/include/freetype/ftlist.h b/reactos/lib/3rdparty/freetype/include/freetype/ftlist.h index 93b05fc0d62..bb6f7f119d3 100644 --- a/reactos/lib/3rdparty/freetype/include/freetype/ftlist.h +++ b/reactos/lib/3rdparty/freetype/include/freetype/ftlist.h @@ -4,7 +4,7 @@ /* */ /* Generic list support for FreeType (specification). */ /* */ -/* Copyright 1996-2001, 2003, 2007 by */ +/* Copyright 1996-2001, 2003, 2007, 2010 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -255,6 +255,10 @@ FT_BEGIN_HEADER /* user :: A user-supplied field which is passed as the last */ /* argument to the destructor. */ /* */ + /* */ + /* This function expects that all nodes added by @FT_List_Add or */ + /* @FT_List_Insert have been dynamically allocated. */ + /* */ FT_EXPORT( void ) FT_List_Finalize( FT_List list, FT_List_Destructor destroy, diff --git a/reactos/lib/3rdparty/freetype/include/freetype/ftmodapi.h b/reactos/lib/3rdparty/freetype/include/freetype/ftmodapi.h index 3c9b876dfee..8f2e0179475 100644 --- a/reactos/lib/3rdparty/freetype/include/freetype/ftmodapi.h +++ b/reactos/lib/3rdparty/freetype/include/freetype/ftmodapi.h @@ -4,7 +4,7 @@ /* */ /* FreeType modules public interface (specification). */ /* */ -/* Copyright 1996-2001, 2002, 2003, 2006, 2008, 2009 by */ +/* Copyright 1996-2001, 2002, 2003, 2006, 2008, 2009, 2010 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -249,6 +249,33 @@ FT_BEGIN_HEADER FT_Module module ); + /*************************************************************************/ + /* */ + /* */ + /* FT_Reference_Library */ + /* */ + /* */ + /* A counter gets initialized to~1 at the time an @FT_Library */ + /* structure is created. This function increments the counter. */ + /* @FT_Done_Library then only destroys a library if the counter is~1, */ + /* otherwise it simply decrements the counter. */ + /* */ + /* This function helps in managing life-cycles of structures which */ + /* reference @FT_Library objects. */ + /* */ + /* */ + /* library :: A handle to a target library object. */ + /* */ + /* */ + /* FreeType error code. 0~means success. */ + /* */ + /* */ + /* 2.4.2 */ + /* */ + FT_EXPORT( FT_Error ) + FT_Reference_Library( FT_Library library ); + + /*************************************************************************/ /* */ /* */ @@ -263,6 +290,9 @@ FT_BEGIN_HEADER /* @FT_Add_Default_Modules or a series of calls to @FT_Add_Module) */ /* instead of @FT_Init_FreeType to initialize the FreeType library. */ /* */ + /* Don't use @FT_Done_FreeType but @FT_Done_Library to destroy a */ + /* library instance. */ + /* */ /* */ /* memory :: A handle to the original memory object. */ /* */ @@ -272,6 +302,10 @@ FT_BEGIN_HEADER /* */ /* FreeType error code. 0~means success. */ /* */ + /* */ + /* See the discussion of reference counters in the description of */ + /* @FT_Reference_Library. */ + /* */ FT_EXPORT( FT_Error ) FT_New_Library( FT_Memory memory, FT_Library *alibrary ); @@ -292,6 +326,10 @@ FT_BEGIN_HEADER /* */ /* FreeType error code. 0~means success. */ /* */ + /* */ + /* See the discussion of reference counters in the description of */ + /* @FT_Reference_Library. */ + /* */ FT_EXPORT( FT_Error ) FT_Done_Library( FT_Library library ); @@ -394,8 +432,8 @@ FT_BEGIN_HEADER * * FT_TRUETYPE_ENGINE_TYPE_PATENTED :: * The library implements a bytecode interpreter that covers - * the full instruction set of the TrueType virtual machine. - * See the file `docs/PATENTS' for legal aspects. + * the full instruction set of the TrueType virtual machine (this + * was governed by patents until May 2010, hence the name). * * @since: * 2.2 diff --git a/reactos/lib/3rdparty/freetype/include/freetype/ftrender.h b/reactos/lib/3rdparty/freetype/include/freetype/ftrender.h index 41c31eac48c..e06a8142e65 100644 --- a/reactos/lib/3rdparty/freetype/include/freetype/ftrender.h +++ b/reactos/lib/3rdparty/freetype/include/freetype/ftrender.h @@ -4,7 +4,7 @@ /* */ /* FreeType renderer modules public interface (specification). */ /* */ -/* Copyright 1996-2001, 2005, 2006 by */ +/* Copyright 1996-2001, 2005, 2006, 2010 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -141,10 +141,6 @@ FT_BEGIN_HEADER /* raster_class :: For @FT_GLYPH_FORMAT_OUTLINE renderers only. */ /* This is a pointer to its raster's class. */ /* */ - /* raster :: For @FT_GLYPH_FORMAT_OUTLINE renderers only. */ - /* This is a pointer to the corresponding raster */ - /* object, if any. */ - /* */ typedef struct FT_Renderer_Class_ { FT_Module_Class root; diff --git a/reactos/lib/3rdparty/freetype/include/freetype/ftsystem.h b/reactos/lib/3rdparty/freetype/include/freetype/ftsystem.h index a95b2c76b61..e07460c55d4 100644 --- a/reactos/lib/3rdparty/freetype/include/freetype/ftsystem.h +++ b/reactos/lib/3rdparty/freetype/include/freetype/ftsystem.h @@ -4,7 +4,7 @@ /* */ /* FreeType low-level system interface definition (specification). */ /* */ -/* Copyright 1996-2001, 2002, 2005 by */ +/* Copyright 1996-2001, 2002, 2005, 2010 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -240,7 +240,8 @@ FT_BEGIN_HEADER * * @note: * This function might be called to perform a seek or skip operation - * with a `count' of~0. + * with a `count' of~0. A non-zero return value then indicates an + * error. * */ typedef unsigned long @@ -301,7 +302,7 @@ FT_BEGIN_HEADER * The stream's input function. * * close :: - * The stream;s close function. + * The stream's close function. * * memory :: * The memory manager to use to preload frames. This is set diff --git a/reactos/lib/3rdparty/freetype/include/freetype/internal/ftmemory.h b/reactos/lib/3rdparty/freetype/include/freetype/internal/ftmemory.h index 2010ca90d7e..026aa63eaa9 100644 --- a/reactos/lib/3rdparty/freetype/include/freetype/internal/ftmemory.h +++ b/reactos/lib/3rdparty/freetype/include/freetype/internal/ftmemory.h @@ -4,7 +4,7 @@ /* */ /* The FreeType memory management macros (specification). */ /* */ -/* Copyright 1996-2001, 2002, 2004, 2005, 2006, 2007 by */ +/* Copyright 1996-2001, 2002, 2004, 2005, 2006, 2007, 2010 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -58,15 +58,27 @@ FT_BEGIN_HEADER /* - * C++ refuses to handle statements like p = (void*)anything; where `p' - * is a typed pointer. Since we don't have a `typeof' operator in - * standard C++, we have to use ugly casts. + * C++ refuses to handle statements like p = (void*)anything, with `p' a + * typed pointer. Since we don't have a `typeof' operator in standard + * C++, we have to use a template to emulate it. */ #ifdef __cplusplus -#define FT_ASSIGNP( p, val ) *((void**)&(p)) = (val) + + extern "C++" + template inline T* + cplusplus_typeof( T*, + void *v ) + { + return static_cast ( v ); + } + +#define FT_ASSIGNP( p, val ) (p) = cplusplus_typeof( (p), (val) ) + #else + #define FT_ASSIGNP( p, val ) (p) = (val) + #endif diff --git a/reactos/lib/3rdparty/freetype/include/freetype/internal/ftobjs.h b/reactos/lib/3rdparty/freetype/include/freetype/internal/ftobjs.h index 574cf582967..670eb78a845 100644 --- a/reactos/lib/3rdparty/freetype/include/freetype/internal/ftobjs.h +++ b/reactos/lib/3rdparty/freetype/include/freetype/internal/ftobjs.h @@ -4,7 +4,7 @@ /* */ /* The FreeType private base classes (specification). */ /* */ -/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2008 by */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2008, 2010 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -311,6 +311,12 @@ FT_BEGIN_HEADER /* in the case when the unpatented hinter is compiled within the */ /* library. */ /* */ + /* refcount :: */ + /* A counter initialized to~1 at the time an @FT_Face structure is */ + /* created. @FT_Reference_Face increments this counter, and */ + /* @FT_Done_Face only destroys a face if the counter is~1, */ + /* otherwise it simply decrements it. */ + /* */ typedef struct FT_Face_InternalRec_ { #ifdef FT_CONFIG_OPTION_OLD_INTERNALS @@ -328,6 +334,7 @@ FT_BEGIN_HEADER #endif FT_Bool ignore_unpatented_hinter; + FT_UInt refcount; } FT_Face_InternalRec; @@ -805,10 +812,28 @@ FT_BEGIN_HEADER /* */ /* debug_hooks :: XXX */ /* */ + /* lcd_filter :: If subpixel rendering is activated, the */ + /* selected LCD filter mode. */ + /* */ + /* lcd_extra :: If subpixel rendering is activated, the number */ + /* of extra pixels needed for the LCD filter. */ + /* */ + /* lcd_weights :: If subpixel rendering is activated, the LCD */ + /* filter weights, if any. */ + /* */ + /* lcd_filter_func :: If subpixel rendering is activated, the LCD */ + /* filtering callback function. */ + /* */ /* pic_container :: Contains global structs and tables, instead */ /* of defining them globallly. */ /* */ - + /* refcount :: A counter initialized to~1 at the time an */ + /* @FT_Library structure is created. */ + /* @FT_Reference_Library increments this counter, */ + /* and @FT_Done_Library only destroys a library */ + /* if the counter is~1, otherwise it simply */ + /* decrements it. */ + /* */ typedef struct FT_LibraryRec_ { FT_Memory memory; /* library's memory manager */ @@ -843,6 +868,8 @@ FT_BEGIN_HEADER FT_PIC_Container pic_container; #endif + FT_UInt refcount; + } FT_LibraryRec; diff --git a/reactos/lib/3rdparty/freetype/include/freetype/ttnameid.h b/reactos/lib/3rdparty/freetype/include/freetype/ttnameid.h index cbeac78db1e..66aef0432e0 100644 --- a/reactos/lib/3rdparty/freetype/include/freetype/ttnameid.h +++ b/reactos/lib/3rdparty/freetype/include/freetype/ttnameid.h @@ -64,7 +64,7 @@ FT_BEGIN_HEADER * MacOS systems (even if they contain a Microsoft charmap as well). * * TT_PLATFORM_ISO :: - * This value was used to specify Unicode charmaps. It is however + * This value was used to specify ISO/IEC 10646 charmaps. It is however * now deprecated. See @TT_ISO_ID_XXX for a list of corresponding * `encoding_id' values. * diff --git a/reactos/lib/3rdparty/freetype/include/freetype/tttables.h b/reactos/lib/3rdparty/freetype/include/freetype/tttables.h index c12b1726896..4610e501f27 100644 --- a/reactos/lib/3rdparty/freetype/include/freetype/tttables.h +++ b/reactos/lib/3rdparty/freetype/include/freetype/tttables.h @@ -5,7 +5,7 @@ /* Basic SFNT/TrueType tables definitions and interface */ /* (specification only). */ /* */ -/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2008, 2009 by */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2008, 2009, 2010 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -557,13 +557,13 @@ FT_BEGIN_HEADER /* */ typedef enum FT_Sfnt_Tag_ { - ft_sfnt_head = 0, - ft_sfnt_maxp = 1, - ft_sfnt_os2 = 2, - ft_sfnt_hhea = 3, - ft_sfnt_vhea = 4, - ft_sfnt_post = 5, - ft_sfnt_pclt = 6, + ft_sfnt_head = 0, /* TT_Header */ + ft_sfnt_maxp = 1, /* TT_MaxProfile */ + ft_sfnt_os2 = 2, /* TT_OS2 */ + ft_sfnt_hhea = 3, /* TT_HoriHeader */ + ft_sfnt_vhea = 4, /* TT_VertHeader */ + ft_sfnt_post = 5, /* TT_Postscript */ + ft_sfnt_pclt = 6, /* TT_PCLT */ sfnt_max /* internal end mark */ @@ -590,6 +590,9 @@ FT_BEGIN_HEADER /* error, or if the corresponding table was not found *OR* loaded */ /* from the file. */ /* */ + /* Use a typecast according to `tag' to access the structure */ + /* elements. */ + /* */ /* */ /* The table is owned by the face object and disappears with it. */ /* */ diff --git a/reactos/lib/3rdparty/freetype/src/autofit/afcjk.c b/reactos/lib/3rdparty/freetype/src/autofit/afcjk.c index bab0c42bade..f3b1067edf2 100644 --- a/reactos/lib/3rdparty/freetype/src/autofit/afcjk.c +++ b/reactos/lib/3rdparty/freetype/src/autofit/afcjk.c @@ -4,7 +4,7 @@ /* */ /* Auto-fitter hinting routines for CJK script (body). */ /* */ -/* Copyright 2006, 2007, 2008, 2009 by */ +/* Copyright 2006, 2007, 2008, 2009, 2010 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -1371,7 +1371,7 @@ FT_UNUSED( metrics ); - error = af_glyph_hints_reload( hints, outline, 0 ); + error = af_glyph_hints_reload( hints, outline ); if ( error ) goto Exit; diff --git a/reactos/lib/3rdparty/freetype/src/autofit/afglobal.c b/reactos/lib/3rdparty/freetype/src/autofit/afglobal.c index ac293619d3d..178c884cd24 100644 --- a/reactos/lib/3rdparty/freetype/src/autofit/afglobal.c +++ b/reactos/lib/3rdparty/freetype/src/autofit/afglobal.c @@ -4,7 +4,7 @@ /* */ /* Auto-fitter routines to compute global hinting values (body). */ /* */ -/* Copyright 2003, 2004, 2005, 2006, 2007, 2008, 2009 by */ +/* Copyright 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -167,8 +167,11 @@ for ( nn = 0; nn < globals->glyph_count; nn++ ) { - if ( gscripts[nn] == AF_SCRIPT_LIST_NONE ) - gscripts[nn] = AF_SCRIPT_LIST_DEFAULT; + if ( ( gscripts[nn] & ~AF_DIGIT ) == AF_SCRIPT_LIST_NONE ) + { + gscripts[nn] &= ~AF_SCRIPT_LIST_NONE; + gscripts[nn] |= AF_SCRIPT_LIST_DEFAULT; + } } } @@ -183,7 +186,7 @@ { FT_Error error; FT_Memory memory; - AF_FaceGlobals globals; + AF_FaceGlobals globals = NULL; memory = face->memory; diff --git a/reactos/lib/3rdparty/freetype/src/autofit/afhints.c b/reactos/lib/3rdparty/freetype/src/autofit/afhints.c index fe38fba9954..c3497091dd6 100644 --- a/reactos/lib/3rdparty/freetype/src/autofit/afhints.c +++ b/reactos/lib/3rdparty/freetype/src/autofit/afhints.c @@ -4,7 +4,7 @@ /* */ /* Auto-fitter hinting routines (body). */ /* */ -/* Copyright 2003, 2004, 2005, 2006, 2007, 2009 by */ +/* Copyright 2003, 2004, 2005, 2006, 2007, 2009, 2010 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -377,120 +377,6 @@ } - /* compute all inflex points in a given glyph */ - - static void - af_glyph_hints_compute_inflections( AF_GlyphHints hints ) - { - AF_Point* contour = hints->contours; - AF_Point* contour_limit = contour + hints->num_contours; - - - /* do each contour separately */ - for ( ; contour < contour_limit; contour++ ) - { - AF_Point point = contour[0]; - AF_Point first = point; - AF_Point start = point; - AF_Point end = point; - AF_Point before; - AF_Point after; - FT_Pos in_x, in_y, out_x, out_y; - AF_Angle orient_prev, orient_cur; - FT_Int finished = 0; - - - /* compute first segment in contour */ - first = point; - - start = end = first; - do - { - end = end->next; - if ( end == first ) - goto Skip; - - in_x = end->fx - start->fx; - in_y = end->fy - start->fy; - - } while ( in_x == 0 && in_y == 0 ); - - /* extend the segment start whenever possible */ - before = start; - do - { - do - { - start = before; - before = before->prev; - if ( before == first ) - goto Skip; - - out_x = start->fx - before->fx; - out_y = start->fy - before->fy; - - } while ( out_x == 0 && out_y == 0 ); - - orient_prev = ft_corner_orientation( in_x, in_y, out_x, out_y ); - - } while ( orient_prev == 0 ); - - first = start; - - in_x = out_x; - in_y = out_y; - - /* now process all segments in the contour */ - do - { - /* first, extend current segment's end whenever possible */ - after = end; - do - { - do - { - end = after; - after = after->next; - if ( after == first ) - finished = 1; - - out_x = after->fx - end->fx; - out_y = after->fy - end->fy; - - } while ( out_x == 0 && out_y == 0 ); - - orient_cur = ft_corner_orientation( in_x, in_y, out_x, out_y ); - - } while ( orient_cur == 0 ); - - if ( ( orient_prev + orient_cur ) == 0 ) - { - /* we have an inflection point here */ - do - { - start->flags |= AF_FLAG_INFLECTION; - start = start->next; - - } while ( start != end ); - - start->flags |= AF_FLAG_INFLECTION; - } - - start = end; - end = after; - - orient_prev = orient_cur; - in_x = out_x; - in_y = out_y; - - } while ( !finished ); - - Skip: - ; - } - } - - FT_LOCAL_DEF( void ) af_glyph_hints_init( AF_GlyphHints hints, FT_Memory memory ) @@ -551,8 +437,7 @@ FT_LOCAL_DEF( FT_Error ) af_glyph_hints_reload( AF_GlyphHints hints, - FT_Outline* outline, - FT_Bool get_inflections ) + FT_Outline* outline ) { FT_Error error = AF_Err_Ok; AF_Point points; @@ -639,13 +524,11 @@ { FT_Vector* vec = outline->points; char* tag = outline->tags; - AF_Point first = points; AF_Point end = points + outline->contours[0]; AF_Point prev = end; FT_Int contour_index = 0; - FT_UNUSED( first ); for ( point = points; point < point_limit; point++, vec++, tag++ ) { point->fx = (FT_Short)vec->x; @@ -673,9 +556,8 @@ { if ( ++contour_index < outline->n_contours ) { - first = point + 1; - end = points + outline->contours[contour_index]; - prev = end; + end = points + outline->contours[contour_index]; + prev = end; } } } @@ -752,11 +634,6 @@ } } - /* compute inflection points -- */ - /* disabled due to no longer perceived benefits */ - if ( 0 && get_inflections ) - af_glyph_hints_compute_inflections( hints ); - Exit: return error; } diff --git a/reactos/lib/3rdparty/freetype/src/autofit/afhints.h b/reactos/lib/3rdparty/freetype/src/autofit/afhints.h index 675826835ae..10e673b3f5c 100644 --- a/reactos/lib/3rdparty/freetype/src/autofit/afhints.h +++ b/reactos/lib/3rdparty/freetype/src/autofit/afhints.h @@ -4,7 +4,7 @@ /* */ /* Auto-fitter hinting routines (specification). */ /* */ -/* Copyright 2003, 2004, 2005, 2006, 2007, 2008 by */ +/* Copyright 2003, 2004, 2005, 2006, 2007, 2008, 2010 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -286,8 +286,7 @@ FT_BEGIN_HEADER FT_LOCAL( FT_Error ) af_glyph_hints_reload( AF_GlyphHints hints, - FT_Outline* outline, - FT_Bool get_inflections ); + FT_Outline* outline ); FT_LOCAL( void ) af_glyph_hints_save( AF_GlyphHints hints, diff --git a/reactos/lib/3rdparty/freetype/src/autofit/aflatin.c b/reactos/lib/3rdparty/freetype/src/autofit/aflatin.c index e6882d5e7b5..63491e31055 100644 --- a/reactos/lib/3rdparty/freetype/src/autofit/aflatin.c +++ b/reactos/lib/3rdparty/freetype/src/autofit/aflatin.c @@ -4,7 +4,7 @@ /* */ /* Auto-fitter hinting routines for latin script (body). */ /* */ -/* Copyright 2003, 2004, 2005, 2006, 2007, 2008, 2009 by */ +/* Copyright 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -77,7 +77,7 @@ af_glyph_hints_rescale( hints, (AF_ScriptMetrics)dummy ); - error = af_glyph_hints_reload( hints, &face->glyph->outline, 0 ); + error = af_glyph_hints_reload( hints, &face->glyph->outline ); if ( error ) goto Exit; @@ -1534,21 +1534,18 @@ /* compare to standard width */ - if ( axis->width_count > 0 ) + delta = dist - axis->widths[0].cur; + + if ( delta < 0 ) + delta = -delta; + + if ( delta < 40 ) { - delta = dist - axis->widths[0].cur; + dist = axis->widths[0].cur; + if ( dist < 48 ) + dist = 48; - if ( delta < 0 ) - delta = -delta; - - if ( delta < 40 ) - { - dist = axis->widths[0].cur; - if ( dist < 48 ) - dist = 48; - - goto Done_Width; - } + goto Done_Width; } if ( dist < 3 * 64 ) @@ -2105,7 +2102,7 @@ int dim; - error = af_glyph_hints_reload( hints, outline, 1 ); + error = af_glyph_hints_reload( hints, outline ); if ( error ) goto Exit; diff --git a/reactos/lib/3rdparty/freetype/src/autofit/aflatin2.c b/reactos/lib/3rdparty/freetype/src/autofit/aflatin2.c index 5cbeb296b58..6546475a163 100644 --- a/reactos/lib/3rdparty/freetype/src/autofit/aflatin2.c +++ b/reactos/lib/3rdparty/freetype/src/autofit/aflatin2.c @@ -4,7 +4,7 @@ /* */ /* Auto-fitter hinting routines for latin script (body). */ /* */ -/* Copyright 2003, 2004, 2005, 2006, 2007, 2008, 2009 by */ +/* Copyright 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -84,7 +84,7 @@ af_glyph_hints_rescale( hints, (AF_ScriptMetrics)dummy ); - error = af_glyph_hints_reload( hints, &face->glyph->outline, 0 ); + error = af_glyph_hints_reload( hints, &face->glyph->outline ); if ( error ) goto Exit; @@ -545,7 +545,8 @@ FT_Pos fitted = ( scaled + 40 ) & ~63; #if 1 - if ( scaled != fitted ) { + if ( scaled != fitted ) + { scale = FT_MulDiv( scale, fitted, scaled ); AF_LOG(( "== scaled x-top = %.2g fitted = %.2g, scaling = %.4g\n", scaled/64.0, fitted/64.0, (fitted*1.0)/scaled )); } @@ -2249,7 +2250,7 @@ int dim; - error = af_glyph_hints_reload( hints, outline, 1 ); + error = af_glyph_hints_reload( hints, outline ); if ( error ) goto Exit; diff --git a/reactos/lib/3rdparty/freetype/src/autofit/afpic.c b/reactos/lib/3rdparty/freetype/src/autofit/afpic.c index 76822c301a8..5b9aba69194 100644 --- a/reactos/lib/3rdparty/freetype/src/autofit/afpic.c +++ b/reactos/lib/3rdparty/freetype/src/autofit/afpic.c @@ -4,7 +4,7 @@ /* */ /* The FreeType position independent code services for autofit module. */ /* */ -/* Copyright 2009 by */ +/* Copyright 2009, 2010 by */ /* Oran Agra and Mickey Gabel. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -45,19 +45,21 @@ } } + FT_Error - autofit_module_class_pic_init( FT_Library library ) + autofit_module_class_pic_init( FT_Library library ) { - FT_PIC_Container* pic_container = &library->pic_container; - FT_UInt ss; - FT_Error error = FT_Err_Ok; - AFModulePIC* container; - FT_Memory memory = library->memory; + FT_PIC_Container* pic_container = &library->pic_container; + FT_UInt ss; + FT_Error error = AF_Err_Ok; + AFModulePIC* container; + FT_Memory memory = library->memory; + /* allocate pointer, clear and set global container pointer */ if ( FT_ALLOC ( container, sizeof ( *container ) ) ) return error; - FT_MEM_SET( container, 0, sizeof(*container) ); + FT_MEM_SET( container, 0, sizeof ( *container ) ); pic_container->autofit = container; /* initialize pointer table - this is how the module usually expects this data */ diff --git a/reactos/lib/3rdparty/freetype/src/base/ftbase.h b/reactos/lib/3rdparty/freetype/src/base/ftbase.h index 1dc49f3bdf6..6375613b2dd 100644 --- a/reactos/lib/3rdparty/freetype/src/base/ftbase.h +++ b/reactos/lib/3rdparty/freetype/src/base/ftbase.h @@ -49,6 +49,17 @@ FT_BEGIN_HEADER FT_Face *aface ); +#ifdef FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK + /* Mac OS X/Darwin kernel often changes recommended method to access */ + /* the resource fork and older methods makes the kernel issue the */ + /* warning of deprecated method. To calm it down, the methods based */ + /* on Darwin VFS should be grouped and skip the rest methods after */ + /* the case the resource is opened but found to lack a font in it. */ + FT_LOCAL( FT_Bool ) + raccess_rule_by_darwin_vfs( FT_UInt rule_index ); +#endif /* FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK */ + + FT_END_HEADER #endif /* __FTBASE_H__ */ diff --git a/reactos/lib/3rdparty/freetype/src/base/ftdbgmem.c b/reactos/lib/3rdparty/freetype/src/base/ftdbgmem.c index 160269d1929..12fed04bb94 100644 --- a/reactos/lib/3rdparty/freetype/src/base/ftdbgmem.c +++ b/reactos/lib/3rdparty/freetype/src/base/ftdbgmem.c @@ -47,7 +47,7 @@ typedef struct FT_MemTableRec_* FT_MemTable; -#define FT_MEM_VAL( addr ) ((FT_ULong)(FT_Pointer)( addr )) +#define FT_MEM_VAL( addr ) ((FT_PtrDist)(FT_Pointer)( addr )) /* * This structure holds statistics for a single allocation/release @@ -275,7 +275,7 @@ for ( i = 0; i < table->size; i++ ) { FT_MemNode node, next, *pnode; - FT_ULong hash; + FT_PtrDist hash; node = table->buckets[i]; @@ -430,7 +430,7 @@ ft_mem_table_get_nodep( FT_MemTable table, FT_Byte* address ) { - FT_ULong hash; + FT_PtrDist hash; FT_MemNode *pnode, node; diff --git a/reactos/lib/3rdparty/freetype/src/base/ftgloadr.c b/reactos/lib/3rdparty/freetype/src/base/ftgloadr.c index ac0010ddd88..8483450192c 100644 --- a/reactos/lib/3rdparty/freetype/src/base/ftgloadr.c +++ b/reactos/lib/3rdparty/freetype/src/base/ftgloadr.c @@ -4,7 +4,7 @@ /* */ /* The FreeType glyph loader (body). */ /* */ -/* Copyright 2002, 2003, 2004, 2005, 2006 by */ +/* Copyright 2002, 2003, 2004, 2005, 2006, 2010 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -69,7 +69,7 @@ FT_GlyphLoader_New( FT_Memory memory, FT_GlyphLoader *aloader ) { - FT_GlyphLoader loader; + FT_GlyphLoader loader = NULL; FT_Error error; diff --git a/reactos/lib/3rdparty/freetype/src/base/ftglyph.c b/reactos/lib/3rdparty/freetype/src/base/ftglyph.c index 3505d6dde9a..b22050800b7 100644 --- a/reactos/lib/3rdparty/freetype/src/base/ftglyph.c +++ b/reactos/lib/3rdparty/freetype/src/base/ftglyph.c @@ -4,7 +4,7 @@ /* */ /* FreeType convenience functions to handle glyphs (body). */ /* */ -/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2007, 2008 by */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2007, 2008, 2010 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -282,7 +282,7 @@ { FT_Memory memory = library->memory; FT_Error error; - FT_Glyph glyph; + FT_Glyph glyph = NULL; *aglyph = 0; diff --git a/reactos/lib/3rdparty/freetype/src/base/ftgxval.c b/reactos/lib/3rdparty/freetype/src/base/ftgxval.c index 32662bed872..aeeb8ce4fc9 100644 --- a/reactos/lib/3rdparty/freetype/src/base/ftgxval.c +++ b/reactos/lib/3rdparty/freetype/src/base/ftgxval.c @@ -4,7 +4,7 @@ /* */ /* FreeType API for validating TrueTyepGX/AAT tables (body). */ /* */ -/* Copyright 2004, 2005, 2006 by */ +/* Copyright 2004, 2005, 2006, 2010 by */ /* Masatake YAMATO, Redhat K.K, */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ @@ -73,9 +73,14 @@ FT_TrueTypeGX_Free( FT_Face face, FT_Bytes table ) { - FT_Memory memory = FT_FACE_MEMORY( face ); + FT_Memory memory; + if ( !face ) + return; + + memory = FT_FACE_MEMORY( face ); + FT_FREE( table ); } @@ -119,7 +124,13 @@ FT_ClassicKern_Free( FT_Face face, FT_Bytes table ) { - FT_Memory memory = FT_FACE_MEMORY( face ); + FT_Memory memory; + + + if ( !face ) + return; + + memory = FT_FACE_MEMORY( face ); FT_FREE( table ); diff --git a/reactos/lib/3rdparty/freetype/src/base/ftinit.c b/reactos/lib/3rdparty/freetype/src/base/ftinit.c index f94f25a83c1..305177a7e16 100644 --- a/reactos/lib/3rdparty/freetype/src/base/ftinit.c +++ b/reactos/lib/3rdparty/freetype/src/base/ftinit.c @@ -98,7 +98,8 @@ #undef FT_USE_MODULE #define FT_USE_MODULE( type, x ) MODULE_CLASS_##x, - enum { + enum + { #include FT_CONFIG_MODULES_H FT_NUM_MODULE_CLASSES }; diff --git a/reactos/lib/3rdparty/freetype/src/base/ftlcdfil.c b/reactos/lib/3rdparty/freetype/src/base/ftlcdfil.c index 80640111c4f..0da4ba160e3 100644 --- a/reactos/lib/3rdparty/freetype/src/base/ftlcdfil.c +++ b/reactos/lib/3rdparty/freetype/src/base/ftlcdfil.c @@ -4,7 +4,7 @@ /* */ /* FreeType API for color filtering of subpixel bitmap glyphs (body). */ /* */ -/* Copyright 2006, 2008, 2009 by */ +/* Copyright 2006, 2008, 2009, 2010 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -267,18 +267,31 @@ FT_EXPORT_DEF( FT_Error ) - FT_Library_SetLcdFilter( FT_Library library, - FT_LcdFilter filter ) + FT_Library_SetLcdFilterWeights( FT_Library library, + unsigned char *weights ) + { + if ( !library || !weights ) + return FT_Err_Invalid_Argument; + + ft_memcpy( library->lcd_weights, weights, 5 ); + + return FT_Err_Ok; + } + + + FT_EXPORT_DEF( FT_Error ) + FT_Library_SetLcdFilter( FT_Library library, + FT_LcdFilter filter ) { static const FT_Byte light_filter[5] = - { 0, 85, 86, 85, 0 }; + { 0x00, 0x55, 0x56, 0x55, 0x00 }; /* the values here sum up to a value larger than 256, */ /* providing a cheap gamma correction */ static const FT_Byte default_filter[5] = { 0x10, 0x40, 0x70, 0x40, 0x10 }; - if ( library == NULL ) + if ( !library ) return FT_Err_Invalid_Argument; switch ( filter ) @@ -330,11 +343,23 @@ } library->lcd_filter = filter; - return 0; + + return FT_Err_Ok; } #else /* !FT_CONFIG_OPTION_SUBPIXEL_RENDERING */ + FT_EXPORT_DEF( FT_Error ) + FT_Library_SetLcdFilterWeights( FT_Library library, + unsigned char *weights ) + { + FT_UNUSED( library ); + FT_UNUSED( weights ); + + return FT_Err_Unimplemented_Feature; + } + + FT_EXPORT_DEF( FT_Error ) FT_Library_SetLcdFilter( FT_Library library, FT_LcdFilter filter ) diff --git a/reactos/lib/3rdparty/freetype/src/base/ftobjs.c b/reactos/lib/3rdparty/freetype/src/base/ftobjs.c index 46bcd3bb8b2..cb44b8cca43 100644 --- a/reactos/lib/3rdparty/freetype/src/base/ftobjs.c +++ b/reactos/lib/3rdparty/freetype/src/base/ftobjs.c @@ -29,7 +29,6 @@ #include FT_TRUETYPE_TABLES_H #include FT_TRUETYPE_TAGS_H #include FT_TRUETYPE_IDS_H -#include FT_OUTLINE_H #include FT_SERVICE_SFNT_H #include FT_SERVICE_POSTSCRIPT_NAME_H @@ -143,7 +142,7 @@ if ( !args ) return FT_Err_Invalid_Argument; - memory = library->memory; + memory = library->memory; if ( FT_NEW( stream ) ) goto Exit; @@ -230,11 +229,11 @@ static FT_Error ft_glyphslot_init( FT_GlyphSlot slot ) { - FT_Driver driver = slot->face->driver; - FT_Driver_Class clazz = driver->clazz; - FT_Memory memory = driver->root.memory; - FT_Error error = FT_Err_Ok; - FT_Slot_Internal internal; + FT_Driver driver = slot->face->driver; + FT_Driver_Class clazz = driver->clazz; + FT_Memory memory = driver->root.memory; + FT_Error error = FT_Err_Ok; + FT_Slot_Internal internal = NULL; slot->library = driver->root.library; @@ -992,6 +991,14 @@ ( cur[0]->platform_id == TT_PLATFORM_APPLE_UNICODE && cur[0]->encoding_id == TT_APPLE_ID_UNICODE_32 ) ) { +#ifdef FT_MAX_CHARMAP_CACHEABLE + if ( cur - first > FT_MAX_CHARMAP_CACHEABLE ) + { + FT_ERROR(( "find_unicode_charmap: UCS-4 cmap is found " + "at too late position (%d)\n", cur - first )); + continue; + } +#endif face->charmap = cur[0]; return FT_Err_Ok; } @@ -1006,6 +1013,14 @@ { if ( cur[0]->encoding == FT_ENCODING_UNICODE ) { +#ifdef FT_MAX_CHARMAP_CACHEABLE + if ( cur - first > FT_MAX_CHARMAP_CACHEABLE ) + { + FT_ERROR(( "find_unicode_charmap: UCS-2 cmap is found " + "at too late position (%d)\n", cur - first )); + continue; + } +#endif face->charmap = cur[0]; return FT_Err_Ok; } @@ -1047,7 +1062,17 @@ if ( cur[0]->platform_id == TT_PLATFORM_APPLE_UNICODE && cur[0]->encoding_id == TT_APPLE_ID_VARIANT_SELECTOR && FT_Get_CMap_Format( cur[0] ) == 14 ) + { +#ifdef FT_MAX_CHARMAP_CACHEABLE + if ( cur - first > FT_MAX_CHARMAP_CACHEABLE ) + { + FT_ERROR(( "find_unicode_charmap: UVS cmap is found " + "at too late position (%d)\n", cur - first )); + continue; + } +#endif return cur[0]; + } } return NULL; @@ -1548,11 +1573,26 @@ goto Exit; if ( FT_READ_USHORT( flags ) ) goto Exit; - rlen -= 2; /* the flags are part of the resource */ + FT_TRACE3(( "POST fragment[%d]: offsets=0x%08x, rlen=0x%08x, flags=0x%04x\n", + i, offsets[i], rlen, flags )); + + /* postpone the check of rlen longer than buffer until FT_Stream_Read() */ + if ( ( flags >> 8 ) == 0 ) /* Comment, should not be loaded */ + continue; + + /* the flags are part of the resource, so rlen >= 2. */ + /* but some fonts declare rlen = 0 for empty fragment */ + if ( rlen > 2 ) + rlen -= 2; + else + rlen = 0; + if ( ( flags >> 8 ) == type ) len += rlen; else { + if ( pfb_lenpos + 3 > pfb_len + 2 ) + goto Exit2; pfb_data[pfb_lenpos ] = (FT_Byte)( len ); pfb_data[pfb_lenpos + 1] = (FT_Byte)( len >> 8 ); pfb_data[pfb_lenpos + 2] = (FT_Byte)( len >> 16 ); @@ -1561,6 +1601,8 @@ if ( ( flags >> 8 ) == 5 ) /* End of font mark */ break; + if ( pfb_pos + 6 > pfb_len + 2 ) + goto Exit2; pfb_data[pfb_pos++] = 0x80; type = flags >> 8; @@ -1574,13 +1616,23 @@ pfb_data[pfb_pos++] = 0; } + error = FT_Err_Cannot_Open_Resource; + if ( pfb_pos > pfb_len || pfb_pos + rlen > pfb_len ) + goto Exit2; + error = FT_Stream_Read( stream, (FT_Byte *)pfb_data + pfb_pos, rlen ); + if ( error ) + goto Exit2; pfb_pos += rlen; } + if ( pfb_pos + 2 > pfb_len + 2 ) + goto Exit2; pfb_data[pfb_pos++] = 0x80; pfb_data[pfb_pos++] = 3; + if ( pfb_lenpos + 3 > pfb_len + 2 ) + goto Exit2; pfb_data[pfb_lenpos ] = (FT_Byte)( len ); pfb_data[pfb_lenpos + 1] = (FT_Byte)( len >> 8 ); pfb_data[pfb_lenpos + 2] = (FT_Byte)( len >> 16 ); @@ -1799,6 +1851,7 @@ char * file_names[FT_RACCESS_N_RULES]; FT_Long offsets[FT_RACCESS_N_RULES]; FT_Error errors[FT_RACCESS_N_RULES]; + FT_Bool is_darwin_vfs, vfs_rfork_has_no_font = FALSE; /* not tested */ FT_Open_Args args2; FT_Stream stream2 = 0; @@ -1809,6 +1862,15 @@ for ( i = 0; i < FT_RACCESS_N_RULES; i++ ) { + is_darwin_vfs = raccess_rule_by_darwin_vfs( i ); + if ( is_darwin_vfs && vfs_rfork_has_no_font ) + { + FT_TRACE3(( "Skip rule %d: darwin vfs resource fork" + " is already checked and" + " no font is found\n", i )); + continue; + } + if ( errors[i] ) { FT_TRACE3(( "Error[%d] has occurred in rule %d\n", errors[i], i )); @@ -1822,6 +1884,9 @@ i, args2.pathname, offsets[i] )); error = FT_Stream_New( library, &args2, &stream2 ); + if ( is_darwin_vfs && error == FT_Err_Cannot_Open_Stream ) + vfs_rfork_has_no_font = TRUE; + if ( error ) { FT_TRACE3(( "failed\n" )); @@ -1836,6 +1901,8 @@ if ( !error ) break; + else if ( is_darwin_vfs ) + vfs_rfork_has_no_font = TRUE; } for (i = 0; i < FT_RACCESS_N_RULES; i++) @@ -1915,9 +1982,9 @@ FT_Error error; FT_Driver driver; FT_Memory memory; - FT_Stream stream = 0; - FT_Face face = 0; - FT_ListNode node = 0; + FT_Stream stream = NULL; + FT_Face face = NULL; + FT_ListNode node = NULL; FT_Bool external_stream; FT_Module* cur; FT_Module* limit; @@ -2141,6 +2208,8 @@ internal->transform_delta.x = 0; internal->transform_delta.y = 0; + + internal->refcount = 1; } if ( aface ) @@ -2226,6 +2295,17 @@ } + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Reference_Face( FT_Face face ) + { + face->internal->refcount++; + + return FT_Err_Ok; + } + + /* documentation is in freetype.h */ FT_EXPORT_DEF( FT_Error ) @@ -2240,22 +2320,29 @@ error = FT_Err_Invalid_Face_Handle; if ( face && face->driver ) { - driver = face->driver; - memory = driver->root.memory; - - /* find face in driver's list */ - node = FT_List_Find( &driver->faces_list, face ); - if ( node ) - { - /* remove face object from the driver's list */ - FT_List_Remove( &driver->faces_list, node ); - FT_FREE( node ); - - /* now destroy the object proper */ - destroy_face( memory, face, driver ); + face->internal->refcount--; + if ( face->internal->refcount > 0 ) error = FT_Err_Ok; + else + { + driver = face->driver; + memory = driver->root.memory; + + /* find face in driver's list */ + node = FT_List_Find( &driver->faces_list, face ); + if ( node ) + { + /* remove face object from the driver's list */ + FT_List_Remove( &driver->faces_list, node ); + FT_FREE( node ); + + /* now destroy the object proper */ + destroy_face( memory, face, driver ); + error = FT_Err_Ok; + } } } + return error; } @@ -2901,6 +2988,15 @@ { if ( cur[0]->encoding == encoding ) { +#ifdef FT_MAX_CHARMAP_CACHEABLE + if ( cur - face->charmaps > FT_MAX_CHARMAP_CACHEABLE ) + { + FT_ERROR(( "FT_Select_Charmap: requested charmap is found (%d), " + "but in too late position to cache\n", + cur - face->charmaps )); + continue; + } +#endif face->charmap = cur[0]; return 0; } @@ -2935,6 +3031,15 @@ { if ( cur[0] == charmap ) { +#ifdef FT_MAX_CHARMAP_CACHEABLE + if ( cur - face->charmaps > FT_MAX_CHARMAP_CACHEABLE ) + { + FT_ERROR(( "FT_Set_Charmap: requested charmap is found (%d), " + "but in too late position to cache\n", + cur - face->charmaps )); + continue; + } +#endif face->charmap = cur[0]; return 0; } @@ -2951,12 +3056,24 @@ FT_Int i; + if ( !charmap || !charmap->face ) + return -1; + for ( i = 0; i < charmap->face->num_charmaps; i++ ) if ( charmap->face->charmaps[i] == charmap ) break; FT_ASSERT( i < charmap->face->num_charmaps ); +#ifdef FT_MAX_CHARMAP_CACHEABLE + if ( i > FT_MAX_CHARMAP_CACHEABLE ) + { + FT_ERROR(( "FT_Get_Charmap_Index: requested charmap is found (%d), " + "but in too late position to cache\n", + i )); + return -i; + } +#endif return i; } @@ -3095,7 +3212,7 @@ } result = cmap->clazz->char_index( cmap, (FT_UInt32)charcode ); } - return result; + return result; } @@ -3109,14 +3226,14 @@ FT_UInt gindex = 0; - if ( face && face->charmap ) + if ( face && face->charmap && face->num_glyphs ) { gindex = FT_Get_Char_Index( face, 0 ); - if ( gindex == 0 ) + if ( gindex == 0 || gindex >= (FT_UInt)face->num_glyphs ) result = FT_Get_Next_Char( face, 0, &gindex ); } - if ( agindex ) + if ( agindex ) *agindex = gindex; return result; @@ -3134,13 +3251,16 @@ FT_UInt gindex = 0; - if ( face && face->charmap ) + if ( face && face->charmap && face->num_glyphs ) { FT_UInt32 code = (FT_UInt32)charcode; FT_CMap cmap = FT_CMAP( face->charmap ); - gindex = cmap->clazz->char_next( cmap, &code ); + do { + gindex = cmap->clazz->char_next( cmap, &code ); + } while ( gindex >= (FT_UInt)face->num_glyphs ); + result = ( gindex == 0 ) ? 0 : code; } @@ -3645,7 +3765,7 @@ FT_Library library = module->library; FT_Memory memory = library->memory; FT_Error error; - FT_ListNode node; + FT_ListNode node = NULL; if ( FT_NEW( node ) ) @@ -3661,7 +3781,7 @@ /* allocate raster object if needed */ if ( clazz->glyph_format == FT_GLYPH_FORMAT_OUTLINE && - clazz->raster_class->raster_new ) + clazz->raster_class->raster_new ) { error = clazz->raster_class->raster_new( memory, &render->raster ); if ( error ) @@ -3702,7 +3822,8 @@ /* release raster object, if any */ - if ( render->raster ) + if ( render->clazz->glyph_format == FT_GLYPH_FORMAT_OUTLINE && + render->raster ) render->clazz->raster_class->raster_done( render->raster ); /* remove from list */ @@ -3842,7 +3963,7 @@ FT_Library library; - if ( !slot ) + if ( !slot || !slot->face ) return FT_Err_Invalid_Argument; library = FT_FACE_LIBRARY( slot->face ); @@ -4029,7 +4150,8 @@ FT_Renderer renderer = FT_RENDERER( module ); - if ( renderer->raster ) + if ( renderer->clazz->glyph_format == FT_GLYPH_FORMAT_OUTLINE && + renderer->raster ) renderer->clazz->raster_class->raster_done( renderer->raster ); } @@ -4182,13 +4304,24 @@ /*************************************************************************/ + /* documentation is in ftmodapi.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Reference_Library( FT_Library library ) + { + library->refcount++; + + return FT_Err_Ok; + } + + /* documentation is in ftmodapi.h */ FT_EXPORT_DEF( FT_Error ) FT_New_Library( FT_Memory memory, FT_Library *alibrary ) { - FT_Library library = 0; + FT_Library library = NULL; FT_Error error; @@ -4224,6 +4357,8 @@ library->version_minor = FREETYPE_MINOR; library->version_patch = FREETYPE_PATCH; + library->refcount = 1; + /* That's ok now */ *alibrary = library; @@ -4280,40 +4415,64 @@ if ( !library ) return FT_Err_Invalid_Library_Handle; + library->refcount--; + if ( library->refcount > 0 ) + goto Exit; + memory = library->memory; /* Discard client-data */ if ( library->generic.finalizer ) library->generic.finalizer( library ); - /* Close all faces in the library. If we don't do - * this, we can have some subtle memory leaks. + /* + * Close all faces in the library. If we don't do this, we can have + * some subtle memory leaks. + * * Example: * * - the cff font driver uses the pshinter module in cff_size_done * - if the pshinter module is destroyed before the cff font driver, * opened FT_Face objects managed by the driver are not properly * destroyed, resulting in a memory leak + * + * Some faces are dependent on other faces, like Type42 faces that + * depend on TrueType faces synthesized internally. + * + * The order of drivers should be specified in driver_name[]. */ { - FT_UInt n; + FT_UInt m, n; + const char* driver_name[] = { "type42", NULL }; - for ( n = 0; n < library->num_modules; n++ ) + for ( m = 0; + m < sizeof ( driver_name ) / sizeof ( driver_name[0] ); + m++ ) { - FT_Module module = library->modules[n]; - FT_List faces; - - - if ( ( module->clazz->module_flags & FT_MODULE_FONT_DRIVER ) == 0 ) - continue; - - faces = &FT_DRIVER(module)->faces_list; - while ( faces->head ) + for ( n = 0; n < library->num_modules; n++ ) { - FT_Done_Face( FT_FACE( faces->head->data ) ); - if ( faces->head ) - FT_TRACE0(( "FT_Done_Library: failed to free some faces\n" )); + FT_Module module = library->modules[n]; + const char* module_name = module->clazz->module_name; + FT_List faces; + + + if ( driver_name[m] && + ft_strcmp( module_name, driver_name[m] ) != 0 ) + continue; + + if ( ( module->clazz->module_flags & FT_MODULE_FONT_DRIVER ) == 0 ) + continue; + + FT_TRACE7(( "FT_Done_Library: close faces for %s\n", module_name )); + + faces = &FT_DRIVER( module )->faces_list; + while ( faces->head ) + { + FT_Done_Face( FT_FACE( faces->head->data ) ); + if ( faces->head ) + FT_TRACE0(( "FT_Done_Library: failed to free some faces\n" )); + } } } } @@ -4355,6 +4514,8 @@ #endif FT_FREE( library ); + + Exit: return FT_Err_Ok; } @@ -4467,6 +4628,8 @@ #endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ + /* documentation is in freetype.h */ + FT_EXPORT_DEF( FT_Error ) FT_Get_SubGlyph_Info( FT_GlyphSlot glyph, FT_UInt sub_index, @@ -4479,7 +4642,8 @@ FT_Error error = FT_Err_Invalid_Argument; - if ( glyph != NULL && + if ( glyph && + glyph->subglyphs && glyph->format == FT_GLYPH_FORMAT_COMPOSITE && sub_index < glyph->num_subglyphs ) { diff --git a/reactos/lib/3rdparty/freetype/src/base/ftotval.c b/reactos/lib/3rdparty/freetype/src/base/ftotval.c index 20ed686eee6..694fd2b87a0 100644 --- a/reactos/lib/3rdparty/freetype/src/base/ftotval.c +++ b/reactos/lib/3rdparty/freetype/src/base/ftotval.c @@ -4,7 +4,7 @@ /* */ /* FreeType API for validating OpenType tables (body). */ /* */ -/* Copyright 2004, 2006, 2008 by */ +/* Copyright 2004, 2006, 2008, 2010 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -74,9 +74,14 @@ FT_OpenType_Free( FT_Face face, FT_Bytes table ) { - FT_Memory memory = FT_FACE_MEMORY( face ); + FT_Memory memory; + if ( !face ) + return; + + memory = FT_FACE_MEMORY( face ); + FT_FREE( table ); } diff --git a/reactos/lib/3rdparty/freetype/src/base/ftoutln.c b/reactos/lib/3rdparty/freetype/src/base/ftoutln.c index b69df84c04c..356b1561161 100644 --- a/reactos/lib/3rdparty/freetype/src/base/ftoutln.c +++ b/reactos/lib/3rdparty/freetype/src/base/ftoutln.c @@ -990,7 +990,8 @@ int i; FT_Pos ray_y[3]; - FT_Orientation result[3]; + FT_Orientation result[3] = + { FT_ORIENTATION_NONE, FT_ORIENTATION_NONE, FT_ORIENTATION_NONE }; if ( !outline || outline->n_points <= 0 ) diff --git a/reactos/lib/3rdparty/freetype/src/base/ftpfr.c b/reactos/lib/3rdparty/freetype/src/base/ftpfr.c index f9592bb1bba..3a0f92d07ae 100644 --- a/reactos/lib/3rdparty/freetype/src/base/ftpfr.c +++ b/reactos/lib/3rdparty/freetype/src/base/ftpfr.c @@ -4,7 +4,7 @@ /* */ /* FreeType API for accessing PFR-specific data (body). */ /* */ -/* Copyright 2002, 2003, 2004, 2008 by */ +/* Copyright 2002, 2003, 2004, 2008, 2010 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -24,10 +24,11 @@ static FT_Service_PfrMetrics ft_pfr_check( FT_Face face ) { - FT_Service_PfrMetrics service; + FT_Service_PfrMetrics service = NULL; - FT_FACE_LOOKUP_SERVICE( face, service, PFR_METRICS ); + if ( face ) + FT_FACE_LOOKUP_SERVICE( face, service, PFR_METRICS ); return service; } diff --git a/reactos/lib/3rdparty/freetype/src/base/ftrfork.c b/reactos/lib/3rdparty/freetype/src/base/ftrfork.c index 133c2de0575..6df2def7750 100644 --- a/reactos/lib/3rdparty/freetype/src/base/ftrfork.c +++ b/reactos/lib/3rdparty/freetype/src/base/ftrfork.c @@ -4,7 +4,7 @@ /* */ /* Embedded resource forks accessor (body). */ /* */ -/* Copyright 2004, 2005, 2006, 2007, 2008, 2009 by */ +/* Copyright 2004, 2005, 2006, 2007, 2008, 2009, 2010 by */ /* Masatake YAMATO and Redhat K.K. */ /* */ /* FT_Raccess_Get_HeaderInfo() and raccess_guess_darwin_hfsplus() are */ @@ -349,6 +349,42 @@ const char *insertion ); + typedef enum FT_RFork_Rule_ { + FT_RFork_Rule_invalid = -2, + FT_RFork_Rule_uknown, /* -1 */ + FT_RFork_Rule_apple_double, + FT_RFork_Rule_apple_single, + FT_RFork_Rule_darwin_ufs_export, + FT_RFork_Rule_darwin_newvfs, + FT_RFork_Rule_darwin_hfsplus, + FT_RFork_Rule_vfat, + FT_RFork_Rule_linux_cap, + FT_RFork_Rule_linux_double, + FT_RFork_Rule_linux_netatalk + } FT_RFork_Rule; + + /* For fast translation between rule index and rule type, + * the macros FT_RFORK_xxx should be kept consistent with + * the raccess_guess_funcs table + */ + typedef struct raccess_guess_rec_ { + raccess_guess_func func; + FT_RFork_Rule type; + } raccess_guess_rec; + + static raccess_guess_rec raccess_guess_table[FT_RACCESS_N_RULES] = + { + { raccess_guess_apple_double, FT_RFork_Rule_apple_double, }, + { raccess_guess_apple_single, FT_RFork_Rule_apple_single, }, + { raccess_guess_darwin_ufs_export, FT_RFork_Rule_darwin_ufs_export, }, + { raccess_guess_darwin_newvfs, FT_RFork_Rule_darwin_newvfs, }, + { raccess_guess_darwin_hfsplus, FT_RFork_Rule_darwin_hfsplus, }, + { raccess_guess_vfat, FT_RFork_Rule_vfat, }, + { raccess_guess_linux_cap, FT_RFork_Rule_linux_cap, }, + { raccess_guess_linux_double, FT_RFork_Rule_linux_double, }, + { raccess_guess_linux_netatalk, FT_RFork_Rule_linux_netatalk, }, + }; + FT_BASE_DEF( void ) FT_Raccess_Guess( FT_Library library, FT_Stream stream, @@ -360,19 +396,6 @@ FT_Long i; - raccess_guess_func funcs[FT_RACCESS_N_RULES] = - { - raccess_guess_apple_double, - raccess_guess_apple_single, - raccess_guess_darwin_ufs_export, - raccess_guess_darwin_newvfs, - raccess_guess_darwin_hfsplus, - raccess_guess_vfat, - raccess_guess_linux_cap, - raccess_guess_linux_double, - raccess_guess_linux_netatalk, - }; - for ( i = 0; i < FT_RACCESS_N_RULES; i++ ) { new_names[i] = NULL; @@ -384,14 +407,41 @@ if ( errors[i] ) continue ; - errors[i] = (funcs[i])( library, stream, base_name, - &(new_names[i]), &(offsets[i]) ); + errors[i] = (raccess_guess_table[i].func)( library, + stream, base_name, + &(new_names[i]), + &(offsets[i]) ); } return; } + static FT_RFork_Rule + raccess_get_rule_type_from_rule_index( FT_UInt rule_index ) + { + if ( rule_index >= FT_RACCESS_N_RULES ) + return FT_RFork_Rule_invalid; + + return raccess_guess_table[rule_index].type; + } + + + FT_LOCAL_DEF( FT_Bool ) + raccess_rule_by_darwin_vfs( FT_UInt rule_index ) + { + switch( raccess_get_rule_type_from_rule_index( rule_index ) ) + { + case FT_RFork_Rule_darwin_newvfs: + case FT_RFork_Rule_darwin_hfsplus: + return TRUE; + + default: + return FALSE; + } + } + + static FT_Error raccess_guess_apple_double( FT_Library library, FT_Stream stream, @@ -751,7 +801,7 @@ const char *original_name, const char *insertion ) { - char* new_name; + char* new_name = NULL; const char* tmp; const char* slash; size_t new_length; diff --git a/reactos/lib/3rdparty/freetype/src/base/ftstream.c b/reactos/lib/3rdparty/freetype/src/base/ftstream.c index b638599dbcf..210aaa48348 100644 --- a/reactos/lib/3rdparty/freetype/src/base/ftstream.c +++ b/reactos/lib/3rdparty/freetype/src/base/ftstream.c @@ -4,7 +4,7 @@ /* */ /* I/O stream support (body). */ /* */ -/* Copyright 2000-2001, 2002, 2004, 2005, 2006, 2008, 2009 by */ +/* Copyright 2000-2001, 2002, 2004, 2005, 2006, 2008, 2009, 2010 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -246,6 +246,18 @@ /* allocate the frame in memory */ FT_Memory memory = stream->memory; + + /* simple sanity check */ + if ( count > stream->size ) + { + FT_ERROR(( "FT_Stream_EnterFrame:" + " frame size (%lu) larger than stream size (%lu)\n", + count, stream->size )); + + error = FT_Err_Invalid_Stream_Operation; + goto Exit; + } + #ifdef FT_DEBUG_MEMORY /* assume _ft_debug_file and _ft_debug_lineno are already set */ stream->base = (unsigned char*)ft_mem_qalloc( memory, count, &error ); @@ -275,7 +287,7 @@ { /* check current and new position */ if ( stream->pos >= stream->size || - stream->pos + count > stream->size ) + stream->size - stream->pos < count ) { FT_ERROR(( "FT_Stream_EnterFrame:" " invalid i/o; pos = 0x%lx, count = %lu, size = 0x%lx\n", diff --git a/reactos/lib/3rdparty/freetype/src/base/ftsynth.c b/reactos/lib/3rdparty/freetype/src/base/ftsynth.c index ba3c633e28e..d4ec0da570a 100644 --- a/reactos/lib/3rdparty/freetype/src/base/ftsynth.c +++ b/reactos/lib/3rdparty/freetype/src/base/ftsynth.c @@ -90,7 +90,7 @@ if ( slot->format != FT_GLYPH_FORMAT_OUTLINE && - slot->format != FT_GLYPH_FORMAT_BITMAP ) + slot->format != FT_GLYPH_FORMAT_BITMAP ) return; /* some reasonable strength */ @@ -108,7 +108,7 @@ xstr = xstr * 2; ystr = xstr; } - else if ( slot->format == FT_GLYPH_FORMAT_BITMAP ) + else /* slot->format == FT_GLYPH_FORMAT_BITMAP */ { /* round to full pixels */ xstr &= ~63; diff --git a/reactos/lib/3rdparty/freetype/src/base/ftsystem.c b/reactos/lib/3rdparty/freetype/src/base/ftsystem.c index 4d06d6db5cc..66c5d76a9d0 100644 --- a/reactos/lib/3rdparty/freetype/src/base/ftsystem.c +++ b/reactos/lib/3rdparty/freetype/src/base/ftsystem.c @@ -4,7 +4,7 @@ /* */ /* ANSI-specific FreeType low-level system interface (body). */ /* */ -/* Copyright 1996-2001, 2002, 2006, 2008, 2009 by */ +/* Copyright 1996-2001, 2002, 2006, 2008, 2009, 2010 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -192,7 +192,9 @@ /* count :: The number of bytes to read from the stream. */ /* */ /* */ - /* The number of bytes actually read. */ + /* The number of bytes actually read. If `count' is zero (this is, */ + /* the function is used for seeking), a non-zero return value */ + /* indicates an error. */ /* */ FT_CALLBACK_DEF( unsigned long ) ft_ansi_stream_io( FT_Stream stream, @@ -203,6 +205,9 @@ FT_FILE* file; + if ( !count && offset > stream->size ) + return 1; + file = STREAM_FILE( stream ); if ( stream->pos != offset ) @@ -224,6 +229,13 @@ if ( !stream ) return FT_Err_Invalid_Stream_Handle; + stream->descriptor.pointer = NULL; + stream->pathname.pointer = (char*)filepathname; + stream->base = 0; + stream->pos = 0; + stream->read = NULL; + stream->close = NULL; + file = ft_fopen( filepathname, "rb" ); if ( !file ) { @@ -235,12 +247,16 @@ ft_fseek( file, 0, SEEK_END ); stream->size = ft_ftell( file ); + if ( !stream->size ) + { + FT_ERROR(( "FT_Stream_Open:" )); + FT_ERROR(( " opened `%s' but zero-sized\n", filepathname )); + ft_fclose( file ); + return FT_Err_Cannot_Open_Stream; + } ft_fseek( file, 0, SEEK_SET ); stream->descriptor.pointer = file; - stream->pathname.pointer = (char*)filepathname; - stream->pos = 0; - stream->read = ft_ansi_stream_io; stream->close = ft_ansi_stream_close; diff --git a/reactos/lib/3rdparty/freetype/src/bdf/bdfdrivr.c b/reactos/lib/3rdparty/freetype/src/bdf/bdfdrivr.c index 631ec460e7c..47d0eae89fe 100644 --- a/reactos/lib/3rdparty/freetype/src/bdf/bdfdrivr.c +++ b/reactos/lib/3rdparty/freetype/src/bdf/bdfdrivr.c @@ -30,6 +30,7 @@ THE SOFTWARE. #include FT_INTERNAL_STREAM_H #include FT_INTERNAL_OBJECTS_H #include FT_BDF_H +#include FT_TRUETYPE_IDS_H #include FT_SERVICE_BDF_H #include FT_SERVICE_XFREE86_NAME_H @@ -540,14 +541,15 @@ THE SOFTWARE. charmap.face = FT_FACE( face ); charmap.encoding = FT_ENCODING_NONE; - charmap.platform_id = 0; - charmap.encoding_id = 0; + /* initial platform/encoding should indicate unset status? */ + charmap.platform_id = TT_PLATFORM_APPLE_UNICODE; + charmap.encoding_id = TT_APPLE_ID_DEFAULT; if ( unicode_charmap ) { charmap.encoding = FT_ENCODING_UNICODE; - charmap.platform_id = 3; - charmap.encoding_id = 1; + charmap.platform_id = TT_PLATFORM_MICROSOFT; + charmap.encoding_id = TT_MS_ID_UNICODE_CS; } error = FT_CMap_New( &bdf_cmap_class, NULL, &charmap, NULL ); @@ -571,8 +573,8 @@ THE SOFTWARE. charmap.face = FT_FACE( face ); charmap.encoding = FT_ENCODING_ADOBE_STANDARD; - charmap.platform_id = 7; - charmap.encoding_id = 0; + charmap.platform_id = TT_PLATFORM_ADOBE; + charmap.encoding_id = TT_ADOBE_ID_STANDARD; error = FT_CMap_New( &bdf_cmap_class, NULL, &charmap, NULL ); diff --git a/reactos/lib/3rdparty/freetype/src/bdf/bdflib.c b/reactos/lib/3rdparty/freetype/src/bdf/bdflib.c index 5fa5868c715..21b8d9d40e1 100644 --- a/reactos/lib/3rdparty/freetype/src/bdf/bdflib.c +++ b/reactos/lib/3rdparty/freetype/src/bdf/bdflib.c @@ -1,6 +1,6 @@ /* * Copyright 2000 Computing Research Labs, New Mexico State University - * Copyright 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2009 + * Copyright 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2009, 2010 * Francesco Zappa Nardelli * * Permission is hereby granted, free of charge, to any person obtaining a @@ -470,6 +470,11 @@ } + /* An empty string for empty fields. */ + + static const char empty[1] = { 0 }; /* XXX eliminate this */ + + static char * _bdf_list_join( _bdf_list_t* list, int c, @@ -494,18 +499,14 @@ if ( i + 1 < list->used ) dp[j++] = (char)c; } - dp[j] = 0; + if ( dp != empty ) + dp[j] = 0; *alen = j; return dp; } - /* An empty string for empty fields. */ - - static const char empty[1] = { 0 }; /* XXX eliminate this */ - - static FT_Error _bdf_list_split( _bdf_list_t* list, char* separators, @@ -648,8 +649,9 @@ { if ( refill ) { - bytes = (ptrdiff_t)FT_Stream_TryRead( stream, (FT_Byte*)buf + cursor, - (FT_ULong)(buf_size - cursor) ); + bytes = (ptrdiff_t)FT_Stream_TryRead( + stream, (FT_Byte*)buf + cursor, + (FT_ULong)( buf_size - cursor ) ); avail = cursor + bytes; cursor = 0; refill = 0; @@ -719,6 +721,10 @@ { error = (*cb)( buf + start, end - start, lineno, (void*)&cb, client_data ); + /* Redo if we have encountered CHARS without properties. */ + if ( error == -1 ) + error = (*cb)( buf + start, end - start, lineno, + (void*)&cb, client_data ); if ( error ) break; } @@ -1371,7 +1377,8 @@ /* If the property happens to be a comment, then it doesn't need */ /* to be added to the internal hash table. */ - if ( ft_memcmp( name, "COMMENT", 7 ) != 0 ) { + if ( ft_memcmp( name, "COMMENT", 7 ) != 0 ) + { /* Add the property to the font property table. */ error = hash_insert( fp->name, font->props_used, @@ -1867,6 +1874,9 @@ error = BDF_Err_Invalid_File_Format; Exit: + if ( error && ( p->flags & _BDF_GLYPH ) ) + FT_FREE( p->glyph_name ); + return error; } @@ -2077,6 +2087,14 @@ /* Check for the start of the properties. */ if ( ft_memcmp( line, "STARTPROPERTIES", 15 ) == 0 ) { + if ( !( p->flags & _BDF_FONT_BBX ) ) + { + /* Missing the FONTBOUNDINGBOX field. */ + FT_ERROR(( "_bdf_parse_start: " ERRMSG1, lineno, "FONTBOUNDINGBOX" )); + error = BDF_Err_Missing_Fontboundingbox_Field; + goto Exit; + } + error = _bdf_list_split( &p->list, (char *)" +", line, linelen ); if ( error ) goto Exit; @@ -2095,7 +2113,7 @@ /* Check for the FONTBOUNDINGBOX field. */ if ( ft_memcmp( line, "FONTBOUNDINGBOX", 15 ) == 0 ) { - if ( !(p->flags & _BDF_SIZE ) ) + if ( !( p->flags & _BDF_SIZE ) ) { /* Missing the SIZE field. */ FT_ERROR(( "_bdf_parse_start: " ERRMSG1, lineno, "SIZE" )); @@ -2139,6 +2157,9 @@ goto Exit; } + /* Allowing multiple `FONT' lines (which is invalid) doesn't hurt... */ + FT_FREE( p->font->name ); + if ( FT_NEW_ARRAY( p->font->name, slen + 1 ) ) goto Exit; FT_MEM_COPY( p->font->name, s, slen + 1 ); @@ -2208,6 +2229,45 @@ goto Exit; } + /* Check for the CHARS field -- font properties are optional */ + if ( ft_memcmp( line, "CHARS", 5 ) == 0 ) + { + char nbuf[128]; + + + if ( !( p->flags & _BDF_FONT_BBX ) ) + { + /* Missing the FONTBOUNDINGBOX field. */ + FT_ERROR(( "_bdf_parse_start: " ERRMSG1, lineno, "FONTBOUNDINGBOX" )); + error = BDF_Err_Missing_Fontboundingbox_Field; + goto Exit; + } + + /* Add the two standard X11 properties which are required */ + /* for compiling fonts. */ + p->font->font_ascent = p->font->bbx.ascent; + ft_sprintf( nbuf, "%hd", p->font->bbx.ascent ); + error = _bdf_add_property( p->font, (char *)"FONT_ASCENT", nbuf ); + if ( error ) + goto Exit; + FT_TRACE2(( "_bdf_parse_properties: " ACMSG1, p->font->bbx.ascent )); + + p->font->font_descent = p->font->bbx.descent; + ft_sprintf( nbuf, "%hd", p->font->bbx.descent ); + error = _bdf_add_property( p->font, (char *)"FONT_DESCENT", nbuf ); + if ( error ) + goto Exit; + FT_TRACE2(( "_bdf_parse_properties: " ACMSG2, p->font->bbx.descent )); + + p->font->modified = 1; + + *next = _bdf_parse_glyphs; + + /* A special return value. */ + error = -1; + goto Exit; + } + error = BDF_Err_Invalid_File_Format; Exit: @@ -2229,7 +2289,7 @@ bdf_font_t* *font ) { unsigned long lineno = 0; /* make compiler happy */ - _bdf_parse_t *p; + _bdf_parse_t *p = NULL; FT_Memory memory = extmemory; FT_Error error = BDF_Err_Ok; @@ -2344,7 +2404,8 @@ /* Make sure the comments are NULL terminated if they exist. */ memory = p->font->memory; - if ( p->font->comments_len > 0 ) { + if ( p->font->comments_len > 0 ) + { if ( FT_RENEW_ARRAY( p->font->comments, p->font->comments_len, p->font->comments_len + 1 ) ) @@ -2448,8 +2509,8 @@ hash_free( &(font->proptbl), memory ); /* Free up the user defined properties. */ - for (prop = font->user_props, i = 0; - i < font->nuser_props; i++, prop++ ) + for ( prop = font->user_props, i = 0; + i < font->nuser_props; i++, prop++ ) { FT_FREE( prop->name ); if ( prop->format == BDF_ATOM ) diff --git a/reactos/lib/3rdparty/freetype/src/cache/ftcbasic.c b/reactos/lib/3rdparty/freetype/src/cache/ftcbasic.c index ebc8871ccc0..609ff78e564 100644 --- a/reactos/lib/3rdparty/freetype/src/cache/ftcbasic.c +++ b/reactos/lib/3rdparty/freetype/src/cache/ftcbasic.c @@ -4,7 +4,7 @@ /* */ /* The FreeType basic cache interface (body). */ /* */ -/* Copyright 2003, 2004, 2005, 2006, 2007, 2009 by */ +/* Copyright 2003, 2004, 2005, 2006, 2007, 2009, 2010 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -318,7 +318,7 @@ FTC_BasicQueryRec query; FTC_Node node = 0; /* make compiler happy */ FT_Error error; - FT_UInt32 hash; + FT_PtrDist hash; /* some argument checks are delayed to FTC_Cache_Lookup */ @@ -414,7 +414,7 @@ FTC_BasicQueryRec query; FTC_Node node = 0; /* make compiler happy */ FT_Error error; - FT_UInt32 hash; + FT_PtrDist hash; /* some argument checks are delayed to FTC_Cache_Lookup */ @@ -656,7 +656,7 @@ FT_Error error; FTC_BasicQueryRec query; FTC_Node node = 0; /* make compiler happy */ - FT_UInt32 hash; + FT_PtrDist hash; if ( anode ) @@ -753,7 +753,7 @@ FT_Error error; FTC_BasicQueryRec query; FTC_Node node = 0; /* make compiler happy */ - FT_UInt32 hash; + FT_PtrDist hash; if ( anode ) @@ -834,7 +834,7 @@ if ( !desc ) - return FT_Err_Invalid_Argument; + return FTC_Err_Invalid_Argument; ftc_image_type_from_old_desc( &type0, desc ); diff --git a/reactos/lib/3rdparty/freetype/src/cache/ftccache.c b/reactos/lib/3rdparty/freetype/src/cache/ftccache.c index 463addd99be..a5a915e0894 100644 --- a/reactos/lib/3rdparty/freetype/src/cache/ftccache.c +++ b/reactos/lib/3rdparty/freetype/src/cache/ftccache.c @@ -4,7 +4,7 @@ /* */ /* The FreeType internal cache interface (body). */ /* */ -/* Copyright 2000-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2009 by */ +/* Copyright 2000-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2009, 2010 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -346,7 +346,7 @@ static void FTC_Cache_Clear( FTC_Cache cache ) { - if ( cache ) + if ( cache && cache->buckets ) { FTC_Manager manager = cache->manager; FT_UFast i; @@ -410,7 +410,7 @@ static void ftc_cache_add( FTC_Cache cache, - FT_UInt32 hash, + FT_PtrDist hash, FTC_Node node ) { node->hash = hash; @@ -438,7 +438,7 @@ FT_LOCAL_DEF( FT_Error ) FTC_Cache_NewNode( FTC_Cache cache, - FT_UInt32 hash, + FT_PtrDist hash, FT_Pointer query, FTC_Node *anode ) { @@ -477,7 +477,7 @@ FT_LOCAL_DEF( FT_Error ) FTC_Cache_Lookup( FTC_Cache cache, - FT_UInt32 hash, + FT_PtrDist hash, FT_Pointer query, FTC_Node *anode ) { @@ -485,13 +485,13 @@ FTC_Node* bucket; FTC_Node* pnode; FTC_Node node; - FT_Error error = 0; + FT_Error error = FTC_Err_Ok; FTC_Node_CompareFunc compare = cache->clazz.node_compare; if ( cache == NULL || anode == NULL ) - return FT_Err_Invalid_Argument; + return FTC_Err_Invalid_Argument; idx = hash & cache->mask; if ( idx < cache->p ) diff --git a/reactos/lib/3rdparty/freetype/src/cache/ftccache.h b/reactos/lib/3rdparty/freetype/src/cache/ftccache.h index 2082bc4f4f0..10830a9f8a4 100644 --- a/reactos/lib/3rdparty/freetype/src/cache/ftccache.h +++ b/reactos/lib/3rdparty/freetype/src/cache/ftccache.h @@ -4,7 +4,7 @@ /* */ /* FreeType internal cache interface (specification). */ /* */ -/* Copyright 2000-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2009 by */ +/* Copyright 2000-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2009, 2010 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -24,6 +24,9 @@ FT_BEGIN_HEADER +#define _FTC_FACE_ID_HASH( i ) \ + ((FT_PtrDist)(( (FT_PtrDist)(i) >> 3 ) ^ ( (FT_PtrDist)(i) << 7 ))) + /* handle to cache object */ typedef struct FTC_CacheRec_* FTC_Cache; @@ -56,7 +59,7 @@ FT_BEGIN_HEADER { FTC_MruNodeRec mru; /* circular mru list pointer */ FTC_Node link; /* used for hashing */ - FT_UInt32 hash; /* used for hashing too */ + FT_PtrDist hash; /* used for hashing too */ FT_UShort cache_index; /* index of cache the node belongs to */ FT_Short ref_count; /* reference count for this node */ @@ -168,14 +171,14 @@ FT_BEGIN_HEADER #ifndef FTC_INLINE FT_LOCAL( FT_Error ) FTC_Cache_Lookup( FTC_Cache cache, - FT_UInt32 hash, + FT_PtrDist hash, FT_Pointer query, FTC_Node *anode ); #endif FT_LOCAL( FT_Error ) FTC_Cache_NewNode( FTC_Cache cache, - FT_UInt32 hash, + FT_PtrDist hash, FT_Pointer query, FTC_Node *anode ); @@ -200,12 +203,12 @@ FT_BEGIN_HEADER FT_BEGIN_STMNT \ FTC_Node *_bucket, *_pnode, _node; \ FTC_Cache _cache = FTC_CACHE(cache); \ - FT_UInt32 _hash = (FT_UInt32)(hash); \ + FT_PtrDist _hash = (FT_PtrDist)(hash); \ FTC_Node_CompareFunc _nodcomp = (FTC_Node_CompareFunc)(nodecmp); \ FT_UFast _idx; \ \ \ - error = 0; \ + error = FTC_Err_Ok; \ node = NULL; \ _idx = _hash & _cache->mask; \ if ( _idx < _cache->p ) \ @@ -288,7 +291,7 @@ FT_BEGIN_HEADER #define FTC_CACHE_TRYLOOP_END() \ - if ( !error || error != FT_Err_Out_Of_Memory ) \ + if ( !error || error != FTC_Err_Out_Of_Memory ) \ break; \ \ _try_done = FTC_Manager_FlushN( _try_manager, _try_count ); \ diff --git a/reactos/lib/3rdparty/freetype/src/cache/ftccmap.c b/reactos/lib/3rdparty/freetype/src/cache/ftccmap.c index a802b0557c7..15060baf76a 100644 --- a/reactos/lib/3rdparty/freetype/src/cache/ftccmap.c +++ b/reactos/lib/3rdparty/freetype/src/cache/ftccmap.c @@ -4,7 +4,8 @@ /* */ /* FreeType CharMap cache (body) */ /* */ -/* Copyright 2000-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 by */ +/* Copyright 2000-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, */ +/* 2010 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -86,7 +87,7 @@ /* compute a query/node hash */ #define FTC_CMAP_HASH( faceid, index, charcode ) \ - ( FTC_FACE_ID_HASH( faceid ) + 211 * (index) + \ + ( _FTC_FACE_ID_HASH( faceid ) + 211 * (index) + \ ( (charcode) / FTC_CMAP_INDICES_MAX ) ) /* the charmap query */ @@ -153,7 +154,7 @@ FTC_CMapQuery query = (FTC_CMapQuery)ftcquery; FT_Error error; FT_Memory memory = cache->memory; - FTC_CMapNode node; + FTC_CMapNode node = NULL; FT_UInt nn; @@ -286,7 +287,7 @@ FTC_Node node; FT_Error error; FT_UInt gindex = 0; - FT_UInt32 hash; + FT_PtrDist hash; FT_Int no_cmap_change = 0; @@ -310,19 +311,11 @@ #ifdef FT_CONFIG_OPTION_OLD_INTERNALS /* - * Detect a call from a rogue client that thinks it is linking - * to FreeType 2.1.7. This is possible because the third parameter - * is then a character code, and we have never seen any font with - * more than a few charmaps, so if the index is very large... - * - * It is also very unlikely that a rogue client is interested - * in Unicode values 0 to 15. - * - * NOTE: The original threshold was 4, but we found a font from the - * Adobe Acrobat Reader Pack, named `KozMinProVI-Regular.otf', - * which contains more than 5 charmaps. + * If cmap_index is greater than the maximum number of cachable + * charmaps, we assume the request is from a legacy rogue client + * using old internal header. See include/config/ftoption.h. */ - if ( cmap_index >= 16 && !no_cmap_change ) + if ( cmap_index > FT_MAX_CHARMAP_CACHEABLE && !no_cmap_change ) { FTC_OldCMapDesc desc = (FTC_OldCMapDesc) face_id; @@ -384,7 +377,7 @@ /* something rotten can happen with rogue clients */ if ( (FT_UInt)( char_code - FTC_CMAP_NODE( node )->first >= FTC_CMAP_INDICES_MAX ) ) - return 0; + return 0; /* XXX: should return appropriate error */ gindex = FTC_CMAP_NODE( node )->indices[char_code - FTC_CMAP_NODE( node )->first]; @@ -401,6 +394,12 @@ if ( error ) goto Exit; +#ifdef FT_MAX_CHARMAP_CACHEABLE + /* something rotten can happen with rogue clients */ + if ( cmap_index > FT_MAX_CHARMAP_CACHEABLE ) + return 0; /* XXX: should return appropriate error */ +#endif + if ( (FT_UInt)cmap_index < (FT_UInt)face->num_charmaps ) { FT_CharMap old, cmap = NULL; diff --git a/reactos/lib/3rdparty/freetype/src/cache/ftcglyph.c b/reactos/lib/3rdparty/freetype/src/cache/ftcglyph.c index a9ab0c319f7..a73e2431e66 100644 --- a/reactos/lib/3rdparty/freetype/src/cache/ftcglyph.c +++ b/reactos/lib/3rdparty/freetype/src/cache/ftcglyph.c @@ -175,7 +175,7 @@ FT_LOCAL_DEF( FT_Error ) FTC_GCache_Lookup( FTC_GCache cache, - FT_UInt32 hash, + FT_PtrDist hash, FT_UInt gindex, FTC_GQuery query, FTC_Node *anode ) diff --git a/reactos/lib/3rdparty/freetype/src/cache/ftcglyph.h b/reactos/lib/3rdparty/freetype/src/cache/ftcglyph.h index c18f9c3af31..2bc5624c6c5 100644 --- a/reactos/lib/3rdparty/freetype/src/cache/ftcglyph.h +++ b/reactos/lib/3rdparty/freetype/src/cache/ftcglyph.h @@ -254,7 +254,7 @@ FT_BEGIN_HEADER #ifndef FTC_INLINE FT_LOCAL( FT_Error ) FTC_GCache_Lookup( FTC_GCache cache, - FT_UInt32 hash, + FT_PtrDist hash, FT_UInt gindex, FTC_GQuery query, FTC_Node *anode ); diff --git a/reactos/lib/3rdparty/freetype/src/cache/ftcimage.c b/reactos/lib/3rdparty/freetype/src/cache/ftcimage.c index 417daf2aaea..c242ece021e 100644 --- a/reactos/lib/3rdparty/freetype/src/cache/ftcimage.c +++ b/reactos/lib/3rdparty/freetype/src/cache/ftcimage.c @@ -4,7 +4,7 @@ /* */ /* FreeType Image cache (body). */ /* */ -/* Copyright 2000-2001, 2003, 2004, 2006 by */ +/* Copyright 2000-2001, 2003, 2004, 2006, 2010 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -61,7 +61,7 @@ { FT_Memory memory = cache->memory; FT_Error error; - FTC_INode inode; + FTC_INode inode = NULL; if ( !FT_NEW( inode ) ) diff --git a/reactos/lib/3rdparty/freetype/src/cache/ftcmanag.c b/reactos/lib/3rdparty/freetype/src/cache/ftcmanag.c index f2a298e7d90..548ebe951fd 100644 --- a/reactos/lib/3rdparty/freetype/src/cache/ftcmanag.c +++ b/reactos/lib/3rdparty/freetype/src/cache/ftcmanag.c @@ -4,7 +4,7 @@ /* */ /* FreeType Cache Manager (body). */ /* */ -/* Copyright 2000-2001, 2002, 2003, 2004, 2005, 2006, 2008, 2009 by */ +/* Copyright 2000-2001, 2002, 2003, 2004, 2005, 2006, 2008, 2009, 2010 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -670,7 +670,7 @@ * the face_id as well */ FTC_MruList_RemoveSelection( &manager->faces, - (FTC_MruNode_CompareFunc)NULL, + ftc_face_node_compare, face_id ); for ( nn = 0; nn < manager->num_caches; nn++ ) diff --git a/reactos/lib/3rdparty/freetype/src/cache/ftcmanag.h b/reactos/lib/3rdparty/freetype/src/cache/ftcmanag.h index 3fdc2c773b4..13f26bb108a 100644 --- a/reactos/lib/3rdparty/freetype/src/cache/ftcmanag.h +++ b/reactos/lib/3rdparty/freetype/src/cache/ftcmanag.h @@ -161,7 +161,7 @@ FT_BEGIN_HEADER (a)->y_res == (b)->y_res ) ) ) #define FTC_SCALER_HASH( q ) \ - ( FTC_FACE_ID_HASH( (q)->face_id ) + \ + ( _FTC_FACE_ID_HASH( (q)->face_id ) + \ (q)->width + (q)->height*7 + \ ( (q)->pixel ? 0 : ( (q)->x_res*33 ^ (q)->y_res*61 ) ) ) diff --git a/reactos/lib/3rdparty/freetype/src/cache/ftcmru.h b/reactos/lib/3rdparty/freetype/src/cache/ftcmru.h index 5739439f450..8c3797fb055 100644 --- a/reactos/lib/3rdparty/freetype/src/cache/ftcmru.h +++ b/reactos/lib/3rdparty/freetype/src/cache/ftcmru.h @@ -4,7 +4,7 @@ /* */ /* Simple MRU list-cache (specification). */ /* */ -/* Copyright 2000-2001, 2003, 2004, 2005, 2006 by */ +/* Copyright 2000-2001, 2003, 2004, 2005, 2006, 2010 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -166,7 +166,7 @@ FT_BEGIN_HEADER FTC_MruNode _first, _node; \ \ \ - error = 0; \ + error = FTC_Err_Ok; \ _first = *(_pfirst); \ _node = NULL; \ \ diff --git a/reactos/lib/3rdparty/freetype/src/cache/ftcsbits.c b/reactos/lib/3rdparty/freetype/src/cache/ftcsbits.c index 60d46aa7a06..83245af1e24 100644 --- a/reactos/lib/3rdparty/freetype/src/cache/ftcsbits.c +++ b/reactos/lib/3rdparty/freetype/src/cache/ftcsbits.c @@ -4,7 +4,7 @@ /* */ /* FreeType sbits manager (body). */ /* */ -/* Copyright 2000-2001, 2002, 2003, 2004, 2005, 2006, 2009 by */ +/* Copyright 2000-2001, 2002, 2003, 2004, 2005, 2006, 2009, 2010 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -160,7 +160,11 @@ !CHECK_CHAR( slot->bitmap_top ) || !CHECK_CHAR( xadvance ) || !CHECK_CHAR( yadvance ) ) + { + FT_TRACE2(( "ftc_snode_load:" + " glyph too large for small bitmap cache\n")); goto BadGlyph; + } sbit->width = (FT_Byte)bitmap->width; sbit->height = (FT_Byte)bitmap->rows; @@ -191,7 +195,7 @@ sbit->width = 255; sbit->height = 0; sbit->buffer = NULL; - error = 0; + error = FTC_Err_Ok; if ( asize ) *asize = 0; } @@ -218,7 +222,7 @@ total = clazz->family_get_count( family, cache->manager ); if ( total == 0 || gindex >= total ) { - error = FT_Err_Invalid_Argument; + error = FTC_Err_Invalid_Argument; goto Exit; } diff --git a/reactos/lib/3rdparty/freetype/src/cff/cffcmap.c b/reactos/lib/3rdparty/freetype/src/cff/cffcmap.c index 46d603e3a89..1298371105d 100644 --- a/reactos/lib/3rdparty/freetype/src/cff/cffcmap.c +++ b/reactos/lib/3rdparty/freetype/src/cff/cffcmap.c @@ -4,7 +4,7 @@ /* */ /* CFF character mapping table (cmap) support (body). */ /* */ -/* Copyright 2002, 2003, 2004, 2005, 2006, 2007 by */ +/* Copyright 2002, 2003, 2004, 2005, 2006, 2007, 2010 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -120,27 +120,15 @@ /*************************************************************************/ FT_CALLBACK_DEF( const char* ) - cff_sid_to_glyph_name( TT_Face face, - FT_UInt idx ) + cff_sid_to_glyph_name( TT_Face face, + FT_UInt idx ) { - CFF_Font cff = (CFF_Font)face->extra.data; - CFF_Charset charset = &cff->charset; - FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)cff->psnames; - FT_UInt sid = charset->sids[idx]; + CFF_Font cff = (CFF_Font)face->extra.data; + CFF_Charset charset = &cff->charset; + FT_UInt sid = charset->sids[idx]; - return cff_index_get_sid_string( &cff->string_index, sid, psnames ); - } - - - FT_CALLBACK_DEF( void ) - cff_sid_free_glyph_name( TT_Face face, - const char* gname ) - { - FT_Memory memory = FT_FACE_MEMORY( face ); - - - FT_FREE( gname ); + return cff_index_get_sid_string( cff, sid ); } @@ -155,14 +143,15 @@ /* can't build Unicode map for CID-keyed font */ + /* because we don't know glyph names. */ if ( !charset->sids ) - return CFF_Err_Invalid_Argument; + return CFF_Err_No_Unicode_Glyph_Name; return psnames->unicodes_init( memory, unicodes, cff->num_glyphs, (PS_GetGlyphNameFunc)&cff_sid_to_glyph_name, - (PS_FreeGlyphNameFunc)&cff_sid_free_glyph_name, + (PS_FreeGlyphNameFunc)NULL, (FT_Pointer)face ); } diff --git a/reactos/lib/3rdparty/freetype/src/cff/cffdrivr.c b/reactos/lib/3rdparty/freetype/src/cff/cffdrivr.c index dad0b65d8b1..39f04ee1be9 100644 --- a/reactos/lib/3rdparty/freetype/src/cff/cffdrivr.c +++ b/reactos/lib/3rdparty/freetype/src/cff/cffdrivr.c @@ -4,7 +4,8 @@ /* */ /* OpenType font driver implementation (body). */ /* */ -/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 by */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, */ +/* 2010 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -22,7 +23,6 @@ #include FT_INTERNAL_STREAM_H #include FT_INTERNAL_SFNT_H #include FT_SERVICE_CID_H -#include FT_SERVICE_POSTSCRIPT_CMAPS_H #include FT_SERVICE_POSTSCRIPT_INFO_H #include FT_SERVICE_POSTSCRIPT_NAME_H #include FT_SERVICE_TT_CMAP_H @@ -228,16 +228,13 @@ FT_Pointer buffer, FT_UInt buffer_max ) { - CFF_Font font = (CFF_Font)face->extra.data; - FT_Memory memory = FT_FACE_MEMORY( face ); - FT_String* gname; - FT_UShort sid; - FT_Service_PsCMaps psnames; - FT_Error error; + CFF_Font font = (CFF_Font)face->extra.data; + FT_String* gname; + FT_UShort sid; + FT_Error error; - FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS ); - if ( !psnames ) + if ( !font->psnames ) { FT_ERROR(( "cff_get_glyph_name:" " cannot get glyph name from CFF & CEF fonts\n" @@ -251,12 +248,11 @@ sid = font->charset.sids[glyph_index]; /* now, lookup the name itself */ - gname = cff_index_get_sid_string( &font->string_index, sid, psnames ); + gname = cff_index_get_sid_string( font, sid ); if ( gname ) FT_STRCPYN( buffer, gname, buffer_max ); - FT_FREE( gname ); error = CFF_Err_Ok; Exit: @@ -271,11 +267,9 @@ CFF_Font cff; CFF_Charset charset; FT_Service_PsCMaps psnames; - FT_Memory memory = FT_FACE_MEMORY( face ); FT_String* name; FT_UShort sid; FT_UInt i; - FT_Int result; cff = (CFF_FontRec *)face->extra.data; @@ -290,19 +284,14 @@ sid = charset->sids[i]; if ( sid > 390 ) - name = cff_index_get_name( &cff->string_index, sid - 391 ); + name = cff_index_get_string( cff, sid - 391 ); else name = (FT_String *)psnames->adobe_std_strings( sid ); if ( !name ) continue; - result = ft_strcmp( glyph_name, name ); - - if ( sid > 390 ) - FT_FREE( name ); - - if ( !result ) + if ( !ft_strcmp( glyph_name, name ) ) return i; } @@ -333,35 +322,29 @@ PS_FontInfoRec* afont_info ) { CFF_Font cff = (CFF_Font)face->extra.data; - FT_Error error = FT_Err_Ok; + FT_Error error = CFF_Err_Ok; if ( cff && cff->font_info == NULL ) { - CFF_FontRecDict dict = &cff->top_font.font_dict; - PS_FontInfoRec *font_info; - FT_Memory memory = face->root.memory; - FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)cff->psnames; + CFF_FontRecDict dict = &cff->top_font.font_dict; + PS_FontInfoRec *font_info; + FT_Memory memory = face->root.memory; if ( FT_ALLOC( font_info, sizeof ( *font_info ) ) ) goto Fail; - font_info->version = cff_index_get_sid_string( &cff->string_index, - dict->version, - psnames ); - font_info->notice = cff_index_get_sid_string( &cff->string_index, - dict->notice, - psnames ); - font_info->full_name = cff_index_get_sid_string( &cff->string_index, - dict->full_name, - psnames ); - font_info->family_name = cff_index_get_sid_string( &cff->string_index, - dict->family_name, - psnames ); - font_info->weight = cff_index_get_sid_string( &cff->string_index, - dict->weight, - psnames ); + font_info->version = cff_index_get_sid_string( cff, + dict->version ); + font_info->notice = cff_index_get_sid_string( cff, + dict->notice ); + font_info->full_name = cff_index_get_sid_string( cff, + dict->full_name ); + font_info->family_name = cff_index_get_sid_string( cff, + dict->family_name ); + font_info->weight = cff_index_get_sid_string( cff, + dict->weight ); font_info->italic_angle = dict->italic_angle; font_info->is_fixed_pitch = dict->is_fixed_pitch; font_info->underline_position = (FT_Short)dict->underline_position; @@ -467,8 +450,7 @@ if ( cff ) { - CFF_FontRecDict dict = &cff->top_font.font_dict; - FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)cff->psnames; + CFF_FontRecDict dict = &cff->top_font.font_dict; if ( dict->cid_registry == 0xFFFFU ) @@ -480,18 +462,16 @@ if ( registry ) { if ( cff->registry == NULL ) - cff->registry = cff_index_get_sid_string( &cff->string_index, - dict->cid_registry, - psnames ); + cff->registry = cff_index_get_sid_string( cff, + dict->cid_registry ); *registry = cff->registry; } if ( ordering ) { if ( cff->ordering == NULL ) - cff->ordering = cff_index_get_sid_string( &cff->string_index, - dict->cid_ordering, - psnames ); + cff->ordering = cff_index_get_sid_string( cff, + dict->cid_ordering ); *ordering = cff->ordering; } diff --git a/reactos/lib/3rdparty/freetype/src/cff/cffgload.c b/reactos/lib/3rdparty/freetype/src/cff/cffgload.c index 9330c058823..e99ee706e38 100644 --- a/reactos/lib/3rdparty/freetype/src/cff/cffgload.c +++ b/reactos/lib/3rdparty/freetype/src/cff/cffgload.c @@ -22,7 +22,6 @@ #include FT_INTERNAL_STREAM_H #include FT_INTERNAL_SFNT_H #include FT_OUTLINE_H -#include FT_INTERNAL_POSTSCRIPT_HINTS_H #include "cffobjs.h" #include "cffload.h" @@ -394,7 +393,7 @@ /* initialize Type2 decoder */ decoder->cff = cff; - decoder->num_globals = cff->num_global_subrs; + decoder->num_globals = cff->global_subrs_index.count; decoder->globals = cff->global_subrs; decoder->globals_bias = cff_compute_bias( cff->top_font.font_dict.charstring_type, @@ -430,7 +429,7 @@ goto Exit; } - FT_TRACE4(( "glyph index %d (subfont %d):\n", glyph_index, fd_index )); + FT_TRACE3(( "glyph index %d (subfont %d):\n", glyph_index, fd_index )); sub = cff->subfonts[fd_index]; @@ -445,10 +444,10 @@ } #ifdef FT_DEBUG_LEVEL_TRACE else - FT_TRACE4(( "glyph index %d:\n", glyph_index )); + FT_TRACE3(( "glyph index %d:\n", glyph_index )); #endif - decoder->num_locals = sub->num_local_subrs; + decoder->num_locals = sub->local_subrs_index.count; decoder->locals = sub->local_subrs; decoder->locals_bias = cff_compute_bias( decoder->cff->top_font.font_dict.charstring_type, @@ -812,10 +811,10 @@ charstring_len ); decoder->seac = FALSE; + cff_free_glyph_data( face, &charstring, charstring_len ); + if ( error ) goto Exit; - - cff_free_glyph_data( face, &charstring, charstring_len ); } /* Save the left bearing, advance and glyph width of the base */ @@ -842,10 +841,10 @@ charstring_len ); decoder->seac = FALSE; + cff_free_glyph_data( face, &charstring, charstring_len ); + if ( error ) goto Exit; - - cff_free_glyph_data( face, &charstring, charstring_len ); } /* Restore the left side bearing, advance and glyph width */ @@ -1340,6 +1339,14 @@ decoder->num_hints += num_args / 2; } + /* In a valid charstring there must be at least one byte */ + /* after `hintmask' or `cntrmask' (e.g., for a `return' */ + /* instruction). Additionally, there must be space for */ + /* `num_hints' bits. */ + + if ( ( ip + ( ( decoder->num_hints + 7 ) >> 3 ) ) >= limit ) + goto Syntax_Error; + if ( hinter ) { if ( op == cff_op_hintmask ) @@ -1358,20 +1365,18 @@ FT_UInt maskbyte; - FT_TRACE4(( " (maskbytes: " )); + FT_TRACE4(( " (maskbytes:" )); for ( maskbyte = 0; - maskbyte < (FT_UInt)(( decoder->num_hints + 7 ) >> 3); + maskbyte < (FT_UInt)( ( decoder->num_hints + 7 ) >> 3 ); maskbyte++, ip++ ) - FT_TRACE4(( "0x%02X", *ip )); + FT_TRACE4(( " 0x%02X", *ip )); FT_TRACE4(( ")\n" )); } #else ip += ( decoder->num_hints + 7 ) >> 3; #endif - if ( ip >= limit ) - goto Syntax_Error; args = stack; break; @@ -2275,7 +2280,11 @@ /* subsequent `pop' operands should add the arguments, */ /* this is the implementation described for `unknown' other */ /* subroutines in the Type1 spec. */ + /* */ + /* XXX Fix return arguments (see discussion below). */ args -= 2 + ( args[-2] >> 16 ); + if ( args < stack ) + goto Stack_Underflow; break; case cff_op_pop: @@ -2285,6 +2294,22 @@ FT_TRACE4(( " pop (invalid op)\n" )); + /* XXX Increasing `args' is wrong: After a certain number of */ + /* `pop's we get a stack overflow. Reason for doing it is */ + /* code like this (actually found in a CFF font): */ + /* */ + /* 17 1 3 callothersubr */ + /* pop */ + /* callsubr */ + /* */ + /* Since we handle `callothersubr' as a no-op, and */ + /* `callsubr' needs at least one argument, `pop' can't be a */ + /* no-op too as it basically should be. */ + /* */ + /* The right solution would be to provide real support for */ + /* `callothersubr' as done in `t1decode.c', however, given */ + /* the fact that CFF fonts with `pop' are invalid, it is */ + /* questionable whether it is worth the time. */ args++; break; @@ -2448,7 +2473,10 @@ return CFF_Err_Unimplemented_Feature; } - decoder->top = args; + decoder->top = args; + + if ( decoder->top - stack >= CFF_MAX_OPERANDS ) + goto Stack_Overflow; } /* general operator processing */ @@ -2668,11 +2696,15 @@ /* this scaling is only relevant if the PS hinter isn't active */ if ( cff->num_subfonts ) { - FT_Byte fd_index = cff_fd_select_get( &cff->fd_select, - glyph_index ); + FT_ULong top_upm, sub_upm; + FT_Byte fd_index = cff_fd_select_get( &cff->fd_select, + glyph_index ); - FT_ULong top_upm = cff->top_font.font_dict.units_per_em; - FT_ULong sub_upm = cff->subfonts[fd_index]->font_dict.units_per_em; + if ( fd_index >= cff->num_subfonts ) + fd_index = cff->num_subfonts - 1; + + top_upm = cff->top_font.font_dict.units_per_em; + sub_upm = cff->subfonts[fd_index]->font_dict.units_per_em; font_matrix = cff->subfonts[fd_index]->font_dict.font_matrix; @@ -2717,48 +2749,53 @@ /* now load the unscaled outline */ error = cff_get_glyph_data( face, glyph_index, &charstring, &charstring_len ); - if ( !error ) - { - error = cff_decoder_prepare( &decoder, size, glyph_index ); - if ( !error ) - { - error = cff_decoder_parse_charstrings( &decoder, - charstring, - charstring_len ); + if ( error ) + goto Glyph_Build_Finished; - cff_free_glyph_data( face, &charstring, charstring_len ); + error = cff_decoder_prepare( &decoder, size, glyph_index ); + if ( error ) + goto Glyph_Build_Finished; + error = cff_decoder_parse_charstrings( &decoder, + charstring, + charstring_len ); + + cff_free_glyph_data( face, &charstring, charstring_len ); + + if ( error ) + goto Glyph_Build_Finished; #ifdef FT_CONFIG_OPTION_INCREMENTAL - /* Control data and length may not be available for incremental */ - /* fonts. */ - if ( face->root.internal->incremental_interface ) - { - glyph->root.control_data = 0; - glyph->root.control_len = 0; - } - else + /* Control data and length may not be available for incremental */ + /* fonts. */ + if ( face->root.internal->incremental_interface ) + { + glyph->root.control_data = 0; + glyph->root.control_len = 0; + } + else #endif /* FT_CONFIG_OPTION_INCREMENTAL */ - /* We set control_data and control_len if charstrings is loaded. */ - /* See how charstring loads at cff_index_access_element() in */ - /* cffload.c. */ - { - CFF_Index csindex = &cff->charstrings_index; + /* We set control_data and control_len if charstrings is loaded. */ + /* See how charstring loads at cff_index_access_element() in */ + /* cffload.c. */ + { + CFF_Index csindex = &cff->charstrings_index; - if ( csindex->offsets ) - { - glyph->root.control_data = csindex->bytes + - csindex->offsets[glyph_index] - 1; - glyph->root.control_len = charstring_len; - } - } + if ( csindex->offsets ) + { + glyph->root.control_data = csindex->bytes + + csindex->offsets[glyph_index] - 1; + glyph->root.control_len = charstring_len; } } - /* save new glyph tables */ - cff_builder_done( &decoder.builder ); + Glyph_Build_Finished: + /* save new glyph tables, if no error */ + if ( !error ) + cff_builder_done( &decoder.builder ); + /* XXX: anything to do for broken glyph entry? */ } #ifdef FT_CONFIG_OPTION_INCREMENTAL diff --git a/reactos/lib/3rdparty/freetype/src/cff/cffload.c b/reactos/lib/3rdparty/freetype/src/cff/cffload.c index 64d13957235..000cbe3ac5e 100644 --- a/reactos/lib/3rdparty/freetype/src/cff/cffload.c +++ b/reactos/lib/3rdparty/freetype/src/cff/cffload.c @@ -4,7 +4,8 @@ /* */ /* OpenType and CFF data/program tables loader (body). */ /* */ -/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 by */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, */ +/* 2010 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -20,7 +21,6 @@ #include FT_INTERNAL_DEBUG_H #include FT_INTERNAL_OBJECTS_H #include FT_INTERNAL_STREAM_H -#include FT_SERVICE_POSTSCRIPT_CMAPS_H #include FT_TRUETYPE_TAGS_H #include FT_TYPE1_TABLES_H @@ -251,7 +251,7 @@ if ( offsize < 1 || offsize > 4 ) { - error = FT_Err_Invalid_Table; + error = CFF_Err_Invalid_Table; goto Exit; } @@ -377,18 +377,21 @@ } - /* allocate a table containing pointers to an index's elements */ + /* Allocate a table containing pointers to an index's elements. */ + /* The `pool' argument makes this function convert the index */ + /* entries to C-style strings (this is, NULL-terminated). */ static FT_Error cff_index_get_pointers( CFF_Index idx, - FT_Byte*** table ) + FT_Byte*** table, + FT_Byte** pool ) { - FT_Error error = CFF_Err_Ok; - FT_Memory memory = idx->stream->memory; - FT_ULong n, offset, old_offset; + FT_Error error = CFF_Err_Ok; + FT_Memory memory = idx->stream->memory; FT_Byte** t; + FT_Byte* new_bytes = NULL; - *table = 0; + *table = NULL; if ( idx->offsets == NULL ) { @@ -397,28 +400,65 @@ goto Exit; } - if ( idx->count > 0 && !FT_NEW_ARRAY( t, idx->count + 1 ) ) + if ( idx->count > 0 && + !FT_NEW_ARRAY( t, idx->count + 1 ) && + ( !pool || !FT_ALLOC( new_bytes, + idx->data_size + idx->count ) ) ) { - old_offset = 1; - for ( n = 0; n <= idx->count; n++ ) + FT_ULong n, cur_offset; + FT_ULong extra = 0; + FT_Byte* org_bytes = idx->bytes; + + + /* at this point, `idx->offsets' can't be NULL */ + cur_offset = idx->offsets[0] - 1; + + /* sanity check */ + if ( cur_offset >= idx->data_size ) { - /* at this point, `idx->offsets' can't be NULL */ - offset = idx->offsets[n]; - if ( !offset ) - offset = old_offset; + FT_TRACE0(( "cff_index_get_pointers:" + " invalid first offset value %d set to zero\n", + cur_offset )); + cur_offset = 0; + } - /* two sanity checks for invalid offset tables */ - else if ( offset < old_offset ) - offset = old_offset; + if ( !pool ) + t[0] = org_bytes + cur_offset; + else + t[0] = new_bytes + cur_offset; - else if ( offset - 1 >= idx->data_size && n < idx->count ) - offset = old_offset; + for ( n = 1; n <= idx->count; n++ ) + { + FT_ULong next_offset = idx->offsets[n] - 1; - t[n] = idx->bytes + offset - 1; - old_offset = offset; + /* empty slot + two sanity checks for invalid offset tables */ + if ( next_offset == 0 || + next_offset < cur_offset || + ( next_offset >= idx->data_size && n < idx->count ) ) + next_offset = cur_offset; + + if ( !pool ) + t[n] = org_bytes + next_offset; + else + { + t[n] = new_bytes + next_offset + extra; + + if ( next_offset != cur_offset ) + { + FT_MEM_COPY( t[n - 1], org_bytes + cur_offset, t[n] - t[n - 1] ); + t[n][0] = '\0'; + t[n] += 1; + extra++; + } + } + + cur_offset = next_offset; } *table = t; + + if ( pool ) + *pool = new_bytes; } Exit: @@ -479,6 +519,18 @@ } } + /* XXX: should check off2 does not exceed the end of this entry; */ + /* at present, only truncate off2 at the end of this stream */ + if ( off2 > stream->size + 1 || + idx->data_offset > stream->size - off2 + 1 ) + { + FT_ERROR(( "cff_index_access_element:" + " offset to next entry (%d)" + " exceeds the end of stream (%d)\n", + off2, stream->size - idx->data_offset + 1 )); + off2 = stream->size - idx->data_offset + 1; + } + /* access element */ if ( off1 && off2 > off1 ) { @@ -526,10 +578,12 @@ } + /* get an entry from Name INDEX */ FT_LOCAL_DEF( FT_String* ) - cff_index_get_name( CFF_Index idx, - FT_UInt element ) + cff_index_get_name( CFF_Font font, + FT_UInt element ) { + CFF_Index idx = &font->name_index; FT_Memory memory = idx->stream->memory; FT_Byte* bytes; FT_ULong byte_len; @@ -553,42 +607,35 @@ } + /* get an entry from String INDEX */ FT_LOCAL_DEF( FT_String* ) - cff_index_get_sid_string( CFF_Index idx, - FT_UInt sid, - FT_Service_PsCMaps psnames ) + cff_index_get_string( CFF_Font font, + FT_UInt element ) + { + return ( element < font->num_strings ) + ? (FT_String*)font->strings[element] + : NULL; + } + + + FT_LOCAL_DEF( FT_String* ) + cff_index_get_sid_string( CFF_Font font, + FT_UInt sid ) { /* value 0xFFFFU indicates a missing dictionary entry */ if ( sid == 0xFFFFU ) - return 0; + return NULL; /* if it is not a standard string, return it */ if ( sid > 390 ) - return cff_index_get_name( idx, sid - 391 ); + return cff_index_get_string( font, sid - 391 ); /* CID-keyed CFF fonts don't have glyph names */ - if ( !psnames ) - return 0; + if ( !font->psnames ) + return NULL; - /* that's a standard string, fetch a copy from the PSName module */ - { - FT_String* name = 0; - const char* adobe_name = psnames->adobe_std_strings( sid ); - - - if ( adobe_name ) - { - FT_Memory memory = idx->stream->memory; - FT_Error error; - - - (void)FT_STRDUP( name, adobe_name ); - - FT_UNUSED( error ); - } - - return name; - } + /* this is a standard string */ + return (FT_String *)font->psnames->adobe_std_strings( sid ); } @@ -734,7 +781,7 @@ FT_UInt num_glyphs, FT_Memory memory ) { - FT_Error error = FT_Err_Ok; + FT_Error error = CFF_Err_Ok; FT_UInt i; FT_Long j; FT_UShort max_cid = 0; @@ -744,11 +791,12 @@ goto Exit; for ( i = 0; i < num_glyphs; i++ ) + { if ( charset->sids[i] > max_cid ) max_cid = charset->sids[i]; - max_cid++; + } - if ( FT_NEW_ARRAY( charset->cids, max_cid ) ) + if ( FT_NEW_ARRAY( charset->cids, (FT_ULong)max_cid + 1 ) ) goto Exit; /* When multiple GIDs map to the same CID, we choose the lowest */ @@ -772,7 +820,7 @@ FT_UInt result = 0; - if ( cid < charset->max_cid ) + if ( cid <= charset->max_cid ) result = charset->cids[cid]; return result; @@ -846,20 +894,7 @@ goto Exit; for ( j = 1; j < num_glyphs; j++ ) - { - FT_UShort sid = FT_GET_USHORT(); - - - /* this constant is given in the CFF specification */ - if ( sid < 65000L ) - charset->sids[j] = sid; - else - { - FT_TRACE0(( "cff_charset_load:" - " invalid SID value %d set to zero\n", sid )); - charset->sids[j] = 0; - } - } + charset->sids[j] = FT_GET_USHORT(); FT_FRAME_EXIT(); } @@ -892,18 +927,12 @@ goto Exit; } - /* check whether the range contains at least one valid glyph; */ - /* the constant is given in the CFF specification */ - if ( glyph_sid >= 65000L ) { - FT_ERROR(( "cff_charset_load: invalid SID range\n" )); - error = CFF_Err_Invalid_File_Format; - goto Exit; - } - /* try to rescue some of the SIDs if `nleft' is too large */ - if ( nleft > 65000L - 1L || glyph_sid >= 65000L - nleft ) { - FT_ERROR(( "cff_charset_load: invalid SID range trimmed\n" )); - nleft = ( FT_UInt )( 65000L - 1L - glyph_sid ); + if ( glyph_sid > 0xFFFFL - nleft ) + { + FT_ERROR(( "cff_charset_load: invalid SID range trimmed" + " nleft=%d -> %d\n", nleft, 0xFFFFL - glyph_sid )); + nleft = ( FT_UInt )( 0xFFFFL - glyph_sid ); } /* Fill in the range of sids -- `nleft + 1' glyphs. */ @@ -1240,9 +1269,7 @@ if ( gid != 0 ) { encoding->codes[j] = (FT_UShort)gid; - - if ( encoding->count < j + 1 ) - encoding->count = j + 1; + encoding->count = j + 1; } else { @@ -1361,9 +1388,8 @@ if ( error ) goto Exit; - font->num_local_subrs = font->local_subrs_index.count; error = cff_index_get_pointers( &font->local_subrs_index, - &font->local_subrs ); + &font->local_subrs, NULL ); if ( error ) goto Exit; } @@ -1409,9 +1435,11 @@ FT_Memory memory = stream->memory; FT_ULong base_offset; CFF_FontRecDict dict; + CFF_IndexRec string_index; FT_ZERO( font ); + FT_ZERO( &string_index ); font->stream = stream; font->memory = memory; @@ -1438,15 +1466,20 @@ /* read the name, top dict, string and global subrs index */ if ( FT_SET_ERROR( cff_index_init( &font->name_index, - stream, 0 ) ) || + stream, 0 ) ) || FT_SET_ERROR( cff_index_init( &font->font_dict_index, - stream, 0 ) ) || - FT_SET_ERROR( cff_index_init( &font->string_index, - stream, 0 ) ) || + stream, 0 ) ) || + FT_SET_ERROR( cff_index_init( &string_index, + stream, 1 ) ) || FT_SET_ERROR( cff_index_init( &font->global_subrs_index, - stream, 1 ) ) ) + stream, 1 ) ) || + FT_SET_ERROR( cff_index_get_pointers( &string_index, + &font->strings, + &font->string_pool ) ) ) goto Exit; + font->num_strings = string_index.count; + /* well, we don't really forget the `disabled' fonts... */ font->num_faces = font->name_index.count; if ( face_index >= (FT_Int)font->num_faces ) @@ -1542,12 +1575,10 @@ goto Exit; } - /* explicit the global subrs */ - font->num_global_subrs = font->global_subrs_index.count; - font->num_glyphs = font->charstrings_index.count; + font->num_glyphs = font->charstrings_index.count; error = cff_index_get_pointers( &font->global_subrs_index, - &font->global_subrs ) ; + &font->global_subrs, NULL ); if ( error ) goto Exit; @@ -1579,9 +1610,11 @@ /* get the font name (/CIDFontName for CID-keyed fonts, */ /* /FontName otherwise) */ - font->font_name = cff_index_get_name( &font->name_index, face_index ); + font->font_name = cff_index_get_name( font, face_index ); Exit: + cff_index_done( &string_index ); + return error; } @@ -1594,7 +1627,6 @@ cff_index_done( &font->global_subrs_index ); - cff_index_done( &font->string_index ); cff_index_done( &font->font_dict_index ); cff_index_done( &font->name_index ); cff_index_done( &font->charstrings_index ); @@ -1617,21 +1649,12 @@ CFF_Done_FD_Select( &font->fd_select, font->stream ); - if (font->font_info != NULL) - { - FT_FREE( font->font_info->version ); - FT_FREE( font->font_info->notice ); - FT_FREE( font->font_info->full_name ); - FT_FREE( font->font_info->family_name ); - FT_FREE( font->font_info->weight ); - FT_FREE( font->font_info ); - } + FT_FREE( font->font_info ); - FT_FREE( font->registry ); - FT_FREE( font->ordering ); - - FT_FREE( font->global_subrs ); FT_FREE( font->font_name ); + FT_FREE( font->global_subrs ); + FT_FREE( font->strings ); + FT_FREE( font->string_pool ); } diff --git a/reactos/lib/3rdparty/freetype/src/cff/cffload.h b/reactos/lib/3rdparty/freetype/src/cff/cffload.h index 2b313acf06e..c755de9a200 100644 --- a/reactos/lib/3rdparty/freetype/src/cff/cffload.h +++ b/reactos/lib/3rdparty/freetype/src/cff/cffload.h @@ -4,7 +4,7 @@ /* */ /* OpenType & CFF data/program tables loader (specification). */ /* */ -/* Copyright 1996-2001, 2002, 2003, 2007, 2008 by */ +/* Copyright 1996-2001, 2002, 2003, 2007, 2008, 2010 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -22,7 +22,6 @@ #include #include "cfftypes.h" -#include FT_SERVICE_POSTSCRIPT_CMAPS_H FT_BEGIN_HEADER @@ -32,13 +31,12 @@ FT_BEGIN_HEADER FT_LOCAL( FT_String* ) - cff_index_get_name( CFF_Index idx, - FT_UInt element ); + cff_index_get_string( CFF_Font font, + FT_UInt element ); FT_LOCAL( FT_String* ) - cff_index_get_sid_string( CFF_Index idx, - FT_UInt sid, - FT_Service_PsCMaps psnames ); + cff_index_get_sid_string( CFF_Font font, + FT_UInt sid ); FT_LOCAL( FT_Error ) @@ -51,6 +49,10 @@ FT_BEGIN_HEADER cff_index_forget_element( CFF_Index idx, FT_Byte** pbytes ); + FT_LOCAL( FT_String* ) + cff_index_get_name( CFF_Font font, + FT_UInt element ); + FT_LOCAL( FT_UInt ) cff_charset_cid_to_gindex( CFF_Charset charset, diff --git a/reactos/lib/3rdparty/freetype/src/cff/cffobjs.c b/reactos/lib/3rdparty/freetype/src/cff/cffobjs.c index bd56c4ba11d..1cd35c96ca0 100644 --- a/reactos/lib/3rdparty/freetype/src/cff/cffobjs.c +++ b/reactos/lib/3rdparty/freetype/src/cff/cffobjs.c @@ -4,7 +4,8 @@ /* */ /* OpenType objects manager (body). */ /* */ -/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 by */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, */ +/* 2010 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -24,8 +25,6 @@ #include FT_TRUETYPE_IDS_H #include FT_TRUETYPE_TAGS_H #include FT_INTERNAL_SFNT_H -#include FT_SERVICE_POSTSCRIPT_CMAPS_H -#include FT_INTERNAL_POSTSCRIPT_HINTS_H #include "cffobjs.h" #include "cffload.h" #include "cffcmap.h" @@ -58,7 +57,7 @@ { CFF_Face face = (CFF_Face)size->root.face; CFF_Font font = (CFF_Font)face->extra.data; - PSHinter_Service pshinter = (PSHinter_Service)font->pshinter; + PSHinter_Service pshinter = font->pshinter; FT_Module module; @@ -349,7 +348,7 @@ { CFF_Face face = (CFF_Face)slot->face; CFF_Font font = (CFF_Font)face->extra.data; - PSHinter_Service pshinter = (PSHinter_Service)font->pshinter; + PSHinter_Service pshinter = font->pshinter; if ( pshinter ) @@ -395,6 +394,41 @@ } + /* Strip all subset prefixes of the form `ABCDEF+'. Usually, there */ + /* is only one, but font names like `APCOOG+JFABTD+FuturaBQ-Bold' */ + /* have been seen in the wild. */ + + static void + remove_subset_prefix( FT_String* name ) + { + FT_Int32 idx = 0; + FT_Int32 length = strlen( name ) + 1; + FT_Bool continue_search = 1; + + + while ( continue_search ) + { + if ( length >= 7 && name[6] == '+' ) + { + for ( idx = 0; idx < 6; idx++ ) + { + /* ASCII uppercase letters */ + if ( !( 'A' <= name[idx] && name[idx] <= 'Z' ) ) + continue_search = 0; + } + + if ( continue_search ) + { + for ( idx = 7; idx < length; idx++ ) + name[idx - 7] = name[idx]; + } + } + else + continue_search = 0; + } + } + + FT_LOCAL_DEF( FT_Error ) cff_face_init( FT_Stream stream, FT_Face cffface, /* CFF_Face */ @@ -412,14 +446,6 @@ FT_Library library = cffface->driver->root.library; -#if 0 - FT_FACE_FIND_GLOBAL_SERVICE( face, sfnt, SFNT ); - FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_NAMES ); - FT_FACE_FIND_GLOBAL_SERVICE( face, pshinter, POSTSCRIPT_HINTER ); - - if ( !sfnt ) - goto Bad_Format; -#else sfnt = (SFNT_Service)FT_Get_Module_Interface( library, "sfnt" ); if ( !sfnt ) @@ -429,7 +455,6 @@ pshinter = (PSHinter_Service)FT_Get_Module_Interface( library, "pshinter" ); -#endif /* create input stream from resource */ if ( FT_STREAM_SEEK( 0 ) ) @@ -514,7 +539,7 @@ goto Exit; cff->pshinter = pshinter; - cff->psnames = (void*)psnames; + cff->psnames = psnames; cffface->face_index = face_index; @@ -652,7 +677,7 @@ /* compute number of glyphs */ if ( dict->cid_registry != 0xFFFFU ) - cffface->num_glyphs = cff->charset.max_cid; + cffface->num_glyphs = cff->charset.max_cid + 1; else cffface->num_glyphs = cff->charstrings_index.count; @@ -678,24 +703,22 @@ (FT_Short)( dict->underline_thickness >> 16 ); /* retrieve font family & style name */ - cffface->family_name = cff_index_get_name( &cff->name_index, - face_index ); - + cffface->family_name = cff_index_get_name( cff, face_index ); if ( cffface->family_name ) { - char* full = cff_index_get_sid_string( &cff->string_index, - dict->full_name, - psnames ); + char* full = cff_index_get_sid_string( cff, + dict->full_name ); char* fullp = full; char* family = cffface->family_name; - char* family_name = 0; + char* family_name = NULL; + remove_subset_prefix( cffface->family_name ); + if ( dict->family_name ) { - family_name = cff_index_get_sid_string( &cff->string_index, - dict->family_name, - psnames); + family_name = cff_index_get_sid_string( cff, + dict->family_name ); if ( family_name ) family = family_name; } @@ -738,23 +761,18 @@ } break; } - - if ( family_name ) - FT_FREE( family_name ); - FT_FREE( full ); } } else { char *cid_font_name = - cff_index_get_sid_string( &cff->string_index, - dict->cid_font_name, - psnames ); + cff_index_get_sid_string( cff, + dict->cid_font_name ); /* do we have a `/FontName' for a CID-keyed font? */ if ( cid_font_name ) - cffface->family_name = cid_font_name; + cffface->family_name = cff_strcpy( memory, cid_font_name ); } if ( style_name ) @@ -797,16 +815,14 @@ flags |= FT_STYLE_FLAG_ITALIC; { - char *weight = cff_index_get_sid_string( &cff->string_index, - dict->weight, - psnames ); + char *weight = cff_index_get_sid_string( cff, + dict->weight ); if ( weight ) if ( !ft_strcmp( weight, "Bold" ) || !ft_strcmp( weight, "Black" ) ) flags |= FT_STYLE_FLAG_BOLD; - FT_FREE( weight ); } /* double check */ @@ -849,13 +865,14 @@ { cmap = cffface->charmaps[nn]; - /* Windows Unicode (3,1)? */ - if ( cmap->platform_id == 3 && cmap->encoding_id == 1 ) + /* Windows Unicode? */ + if ( cmap->platform_id == TT_PLATFORM_MICROSOFT && + cmap->encoding_id == TT_MS_ID_UNICODE_CS ) goto Skip_Unicode; - /* Deprecated Unicode platform id? */ - if ( cmap->platform_id == 0 ) - goto Skip_Unicode; /* Standard Unicode (deprecated) */ + /* Apple Unicode platform id? */ + if ( cmap->platform_id == TT_PLATFORM_APPLE_UNICODE ) + goto Skip_Unicode; /* Apple Unicode */ } /* since CID-keyed fonts don't contain glyph names, we can't */ @@ -863,28 +880,51 @@ if ( pure_cff && cff->top_font.font_dict.cid_registry != 0xFFFFU ) goto Exit; +#ifdef FT_MAX_CHARMAP_CACHEABLE + if ( nn + 1 > FT_MAX_CHARMAP_CACHEABLE ) + { + FT_ERROR(( "cff_face_init: no Unicode cmap is found, " + "and too many subtables (%d) to add synthesized cmap\n", + nn )); + goto Exit; + } +#endif + /* we didn't find a Unicode charmap -- synthesize one */ cmaprec.face = cffface; - cmaprec.platform_id = 3; - cmaprec.encoding_id = 1; + cmaprec.platform_id = TT_PLATFORM_MICROSOFT; + cmaprec.encoding_id = TT_MS_ID_UNICODE_CS; cmaprec.encoding = FT_ENCODING_UNICODE; nn = (FT_UInt)cffface->num_charmaps; - FT_CMap_New( &FT_CFF_CMAP_UNICODE_CLASS_REC_GET, NULL, &cmaprec, NULL ); + error = FT_CMap_New( &FT_CFF_CMAP_UNICODE_CLASS_REC_GET, NULL, + &cmaprec, NULL ); + if ( error && FT_Err_No_Unicode_Glyph_Name != error ) + goto Exit; + error = FT_Err_Ok; /* if no Unicode charmap was previously selected, select this one */ if ( cffface->charmap == NULL && nn != (FT_UInt)cffface->num_charmaps ) cffface->charmap = cffface->charmaps[nn]; Skip_Unicode: +#ifdef FT_MAX_CHARMAP_CACHEABLE + if ( nn > FT_MAX_CHARMAP_CACHEABLE ) + { + FT_ERROR(( "cff_face_init: Unicode cmap is found, " + "but too many preceding subtables (%d) to access\n", + nn - 1 )); + goto Exit; + } +#endif if ( encoding->count > 0 ) { FT_CMap_Class clazz; cmaprec.face = cffface; - cmaprec.platform_id = 7; /* Adobe platform id */ + cmaprec.platform_id = TT_PLATFORM_ADOBE; /* Adobe platform id */ if ( encoding->offset == 0 ) { @@ -905,7 +945,7 @@ clazz = &FT_CFF_CMAP_ENCODING_CLASS_REC_GET; } - FT_CMap_New( clazz, NULL, &cmaprec, NULL ); + error = FT_CMap_New( clazz, NULL, &cmaprec, NULL ); } } } diff --git a/reactos/lib/3rdparty/freetype/src/cff/cffparse.c b/reactos/lib/3rdparty/freetype/src/cff/cffparse.c index 01266a193d2..0d11a72786b 100644 --- a/reactos/lib/3rdparty/freetype/src/cff/cffparse.c +++ b/reactos/lib/3rdparty/freetype/src/cff/cffparse.c @@ -4,7 +4,7 @@ /* */ /* CFF token stream parser (body) */ /* */ -/* Copyright 1996-2001, 2002, 2003, 2004, 2007, 2008, 2009 by */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2007, 2008, 2009, 2010 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -137,26 +137,23 @@ FT_UInt nib; FT_UInt phase; - FT_Long result, number, rest, exponent; + FT_Long result, number, exponent; FT_Int sign = 0, exponent_sign = 0; FT_Long exponent_add, integer_length, fraction_length; if ( scaling ) - *scaling = 0; + *scaling = 0; result = 0; number = 0; - rest = 0; exponent = 0; exponent_add = 0; integer_length = 0; fraction_length = 0; - FT_UNUSED( rest ); - /* First of all, read the integer part. */ phase = 4; @@ -332,11 +329,19 @@ goto Exit; /* Remove non-significant digits. */ - if ( integer_length < 0 ) { + if ( integer_length < 0 ) + { number /= power_tens[-integer_length]; fraction_length += integer_length; } + /* this can only happen if exponent was non-zero */ + if ( fraction_length == 10 ) + { + number /= 10; + fraction_length -= 1; + } + /* Convert into 16.16 format. */ if ( fraction_length > 0 ) { @@ -702,7 +707,7 @@ clazz[i].count_offset = 0; *output_class = clazz; - return FT_Err_Ok; + return CFF_Err_Ok; } diff --git a/reactos/lib/3rdparty/freetype/src/cff/cffpic.c b/reactos/lib/3rdparty/freetype/src/cff/cffpic.c index 568956d6a93..5d01bd45e17 100644 --- a/reactos/lib/3rdparty/freetype/src/cff/cffpic.c +++ b/reactos/lib/3rdparty/freetype/src/cff/cffpic.c @@ -4,7 +4,7 @@ /* */ /* The FreeType position independent code services for cff module. */ /* */ -/* Copyright 2009 by */ +/* Copyright 2009, 2010 by */ /* Oran Agra and Mickey Gabel. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -59,18 +59,20 @@ } } + FT_Error - cff_driver_class_pic_init( FT_Library library ) + cff_driver_class_pic_init( FT_Library library ) { - FT_PIC_Container* pic_container = &library->pic_container; - FT_Error error = FT_Err_Ok; - CffModulePIC* container; - FT_Memory memory = library->memory; + FT_PIC_Container* pic_container = &library->pic_container; + FT_Error error = CFF_Err_Ok; + CffModulePIC* container; + FT_Memory memory = library->memory; + /* allocate pointer, clear and set global container pointer */ if ( FT_ALLOC ( container, sizeof ( *container ) ) ) return error; - FT_MEM_SET( container, 0, sizeof(*container) ); + FT_MEM_SET( container, 0, sizeof ( *container ) ); pic_container->cff = container; /* initialize pointer table - this is how the module usually expects this data */ diff --git a/reactos/lib/3rdparty/freetype/src/cff/cfftypes.h b/reactos/lib/3rdparty/freetype/src/cff/cfftypes.h index df92e9a1ac3..d4053576574 100644 --- a/reactos/lib/3rdparty/freetype/src/cff/cfftypes.h +++ b/reactos/lib/3rdparty/freetype/src/cff/cfftypes.h @@ -5,7 +5,7 @@ /* Basic OpenType/CFF type definitions and interface (specification */ /* only). */ /* */ -/* Copyright 1996-2001, 2002, 2003, 2006, 2007, 2008 by */ +/* Copyright 1996-2001, 2002, 2003, 2006, 2007, 2008, 2010 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -24,6 +24,9 @@ #include #include FT_FREETYPE_H #include FT_TYPE1_TABLES_H +#include FT_INTERNAL_SERVICE_H +#include FT_SERVICE_POSTSCRIPT_CMAPS_H +#include FT_INTERNAL_POSTSCRIPT_HINTS_H FT_BEGIN_HEADER @@ -204,8 +207,7 @@ FT_BEGIN_HEADER CFF_PrivateRec private_dict; CFF_IndexRec local_subrs_index; - FT_UInt num_local_subrs; - FT_Byte** local_subrs; + FT_Byte** local_subrs; /* array of pointers into Local Subrs INDEX data */ } CFF_SubFontRec, *CFF_SubFont; @@ -229,7 +231,6 @@ FT_BEGIN_HEADER CFF_IndexRec name_index; CFF_IndexRec top_dict_index; - CFF_IndexRec string_index; CFF_IndexRec global_subrs_index; CFF_EncodingRec encoding; @@ -241,9 +242,15 @@ FT_BEGIN_HEADER CFF_IndexRec local_subrs_index; FT_String* font_name; - FT_UInt num_global_subrs; + + /* array of pointers into Global Subrs INDEX data */ FT_Byte** global_subrs; + /* array of pointers into String INDEX data stored at string_pool */ + FT_UInt num_strings; + FT_Byte** strings; + FT_Byte* string_pool; + CFF_SubFontRec top_font; FT_UInt num_subfonts; CFF_SubFont subfonts[CFF_MAX_CID_FONTS]; @@ -251,10 +258,10 @@ FT_BEGIN_HEADER CFF_FDSelectRec fd_select; /* interface to PostScript hinter */ - void* pshinter; + PSHinter_Service pshinter; /* interface to Postscript Names service */ - void* psnames; + FT_Service_PsCMaps psnames; /* since version 2.3.0 */ PS_FontInfoRec* font_info; /* font info dictionary */ diff --git a/reactos/lib/3rdparty/freetype/src/cid/cidgload.c b/reactos/lib/3rdparty/freetype/src/cid/cidgload.c index ea61b4e1283..81742d167a1 100644 --- a/reactos/lib/3rdparty/freetype/src/cid/cidgload.c +++ b/reactos/lib/3rdparty/freetype/src/cid/cidgload.c @@ -272,7 +272,6 @@ FT_Int32 load_flags ) { CID_GlyphSlot glyph = (CID_GlyphSlot)cidglyph; - CID_Size size = (CID_Size)cidsize; FT_Error error; T1_DecoderRec decoder; CID_Face face = (CID_Face)cidglyph->face; @@ -375,7 +374,7 @@ cidglyph->format = FT_GLYPH_FORMAT_OUTLINE; - if ( size && cidsize->metrics.y_ppem < 24 ) + if ( cidsize->metrics.y_ppem < 24 ) cidglyph->outline.flags |= FT_OUTLINE_HIGH_PRECISION; /* apply the font matrix */ diff --git a/reactos/lib/3rdparty/freetype/src/cid/cidobjs.c b/reactos/lib/3rdparty/freetype/src/cid/cidobjs.c index 82678af0d4b..eb82168888c 100644 --- a/reactos/lib/3rdparty/freetype/src/cid/cidobjs.c +++ b/reactos/lib/3rdparty/freetype/src/cid/cidobjs.c @@ -4,7 +4,7 @@ /* */ /* CID objects manager (body). */ /* */ -/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2008 by */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2008, 2010 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -131,7 +131,7 @@ cid_size_init( FT_Size cidsize ) /* CID_Size */ { CID_Size size = (CID_Size)cidsize; - FT_Error error = 0; + FT_Error error = CID_Err_Ok; PSH_Globals_Funcs funcs = cid_size_get_globals_funcs( size ); diff --git a/reactos/lib/3rdparty/freetype/src/gxvalid/gxvcommn.c b/reactos/lib/3rdparty/freetype/src/gxvalid/gxvcommn.c index de7ce6fdef1..211f97201ed 100644 --- a/reactos/lib/3rdparty/freetype/src/gxvalid/gxvcommn.c +++ b/reactos/lib/3rdparty/freetype/src/gxvalid/gxvcommn.c @@ -4,7 +4,7 @@ /* */ /* TrueTypeGX/AAT common tables validation (body). */ /* */ -/* Copyright 2004, 2005, 2009 */ +/* Copyright 2004, 2005, 2009, 2010 */ /* by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ @@ -908,7 +908,7 @@ nnames = FT_Get_Sfnt_Name_Count( valid->face ); for ( i = 0; i < nnames; i++ ) { - if ( FT_Get_Sfnt_Name( valid->face, i, &name ) != FT_Err_Ok ) + if ( FT_Get_Sfnt_Name( valid->face, i, &name ) != GXV_Err_Ok ) continue ; if ( name.name_id == name_index ) diff --git a/reactos/lib/3rdparty/freetype/src/gzip/ftgzip.c b/reactos/lib/3rdparty/freetype/src/gzip/ftgzip.c index 6f0c515723e..e914e56025f 100644 --- a/reactos/lib/3rdparty/freetype/src/gzip/ftgzip.c +++ b/reactos/lib/3rdparty/freetype/src/gzip/ftgzip.c @@ -8,7 +8,7 @@ /* parse compressed PCF fonts, as found with many X11 server */ /* distributions. */ /* */ -/* Copyright 2002, 2003, 2004, 2005, 2006, 2009 by */ +/* Copyright 2002, 2003, 2004, 2005, 2006, 2009, 2010 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -107,7 +107,7 @@ { FT_ULong sz = (FT_ULong)size * items; FT_Error error; - FT_Pointer p; + FT_Pointer p = NULL; (void)FT_ALLOC( p, sz ); @@ -390,7 +390,7 @@ ft_gzip_file_fill_output( FT_GZipFile zip ) { z_stream* zstream = &zip->zstream; - FT_Error error = 0; + FT_Error error = Gzip_Err_Ok; zip->cursor = zip->buffer; @@ -656,7 +656,7 @@ ft_gzip_file_io( zip, 0, NULL, 0 ); FT_FREE( zip_buff ); } - error = 0; + error = Gzip_Err_Ok; } } diff --git a/reactos/lib/3rdparty/freetype/src/lzw/ftlzw.c b/reactos/lib/3rdparty/freetype/src/lzw/ftlzw.c index 6e57dedb971..0b798fe54df 100644 --- a/reactos/lib/3rdparty/freetype/src/lzw/ftlzw.c +++ b/reactos/lib/3rdparty/freetype/src/lzw/ftlzw.c @@ -171,7 +171,7 @@ { FT_LzwState lzw = &zip->lzw; FT_ULong count; - FT_Error error = 0; + FT_Error error = LZW_Err_Ok; zip->cursor = zip->buffer; diff --git a/reactos/lib/3rdparty/freetype/src/otvalid/otvmath.c b/reactos/lib/3rdparty/freetype/src/otvalid/otvmath.c index 50ed10cf284..96f841f2a9c 100644 --- a/reactos/lib/3rdparty/freetype/src/otvalid/otvmath.c +++ b/reactos/lib/3rdparty/freetype/src/otvalid/otvmath.c @@ -248,7 +248,8 @@ otv_MathItalicsCorrectionInfo_validate( table + MathTopAccentAttachment, valid, FALSE ); - if ( ExtendedShapeCoverage ) { + if ( ExtendedShapeCoverage ) + { OTV_NAME_ENTER( "ExtendedShapeCoverage" ); otv_Coverage_validate( table + ExtendedShapeCoverage, valid, -1 ); OTV_EXIT; diff --git a/reactos/lib/3rdparty/freetype/src/otvalid/otvmod.c b/reactos/lib/3rdparty/freetype/src/otvalid/otvmod.c index 3248564560c..620e45233dd 100644 --- a/reactos/lib/3rdparty/freetype/src/otvalid/otvmod.c +++ b/reactos/lib/3rdparty/freetype/src/otvalid/otvmod.c @@ -214,7 +214,8 @@ *ot_jstf = (FT_Bytes)jstf; Exit: - if ( error ) { + if ( error ) + { FT_Memory memory = FT_FACE_MEMORY( face ); @@ -224,6 +225,7 @@ FT_FREE( gsub ); FT_FREE( jstf ); } + { FT_Memory memory = FT_FACE_MEMORY( face ); diff --git a/reactos/lib/3rdparty/freetype/src/pcf/pcfdrivr.c b/reactos/lib/3rdparty/freetype/src/pcf/pcfdrivr.c index b34e542aeb0..6c0aa0f9ee5 100644 --- a/reactos/lib/3rdparty/freetype/src/pcf/pcfdrivr.c +++ b/reactos/lib/3rdparty/freetype/src/pcf/pcfdrivr.c @@ -34,6 +34,7 @@ THE SOFTWARE. #include FT_LZW_H #include FT_ERRORS_H #include FT_BDF_H +#include FT_TRUETYPE_IDS_H #include "pcf.h" #include "pcfdrivr.h" @@ -227,7 +228,8 @@ THE SOFTWARE. { prop = &face->properties[i]; - if ( prop ) { + if ( prop ) + { FT_FREE( prop->name ); if ( prop->isString ) FT_FREE( prop->value.atom ); @@ -358,14 +360,15 @@ THE SOFTWARE. charmap.face = FT_FACE( face ); charmap.encoding = FT_ENCODING_NONE; - charmap.platform_id = 0; - charmap.encoding_id = 0; + /* initial platform/encoding should indicate unset status? */ + charmap.platform_id = TT_PLATFORM_APPLE_UNICODE; + charmap.encoding_id = TT_APPLE_ID_DEFAULT; if ( unicode_charmap ) { charmap.encoding = FT_ENCODING_UNICODE; - charmap.platform_id = 3; - charmap.encoding_id = 1; + charmap.platform_id = TT_PLATFORM_MICROSOFT; + charmap.encoding_id = TT_MS_ID_UNICODE_CS; } error = FT_CMap_New( &pcf_cmap_class, NULL, &charmap, NULL ); diff --git a/reactos/lib/3rdparty/freetype/src/pcf/pcfread.c b/reactos/lib/3rdparty/freetype/src/pcf/pcfread.c index 08becf99ce3..f7326238c00 100644 --- a/reactos/lib/3rdparty/freetype/src/pcf/pcfread.c +++ b/reactos/lib/3rdparty/freetype/src/pcf/pcfread.c @@ -2,7 +2,8 @@ FreeType font driver for pcf fonts - Copyright 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 by + Copyright 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, + 2010 by Francesco Zappa Nardelli Permission is hereby granted, free of charge, to any person obtaining a copy @@ -607,6 +608,9 @@ THE SOFTWARE. face->nmetrics = nmetrics; + if ( !nmetrics ) + return PCF_Err_Invalid_Table; + FT_TRACE4(( "pcf_get_metrics:\n" )); FT_TRACE4(( " number of metrics: %d\n", nmetrics )); diff --git a/reactos/lib/3rdparty/freetype/src/pfr/pfrdrivr.c b/reactos/lib/3rdparty/freetype/src/pfr/pfrdrivr.c index 15cca9854e4..0053050a2ad 100644 --- a/reactos/lib/3rdparty/freetype/src/pfr/pfrdrivr.c +++ b/reactos/lib/3rdparty/freetype/src/pfr/pfrdrivr.c @@ -4,7 +4,7 @@ /* */ /* FreeType PFR driver interface (body). */ /* */ -/* Copyright 2002, 2003, 2004, 2006, 2008 by */ +/* Copyright 2002, 2003, 2004, 2006, 2008, 2010 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -84,7 +84,7 @@ if ( gindex < phys->num_chars ) { *anadvance = phys->chars[gindex].advance; - error = 0; + error = PFR_Err_Ok; } } diff --git a/reactos/lib/3rdparty/freetype/src/pfr/pfrgload.c b/reactos/lib/3rdparty/freetype/src/pfr/pfrgload.c index 6fe6e4225ab..6f65b01f5e9 100644 --- a/reactos/lib/3rdparty/freetype/src/pfr/pfrgload.c +++ b/reactos/lib/3rdparty/freetype/src/pfr/pfrgload.c @@ -4,7 +4,7 @@ /* */ /* FreeType PFR glyph loader (body). */ /* */ -/* Copyright 2002, 2003, 2005, 2007 by */ +/* Copyright 2002, 2003, 2005, 2007, 2010 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -248,7 +248,7 @@ FT_Byte* p, FT_Byte* limit ) { - FT_Error error = 0; + FT_Error error = PFR_Err_Ok; FT_Memory memory = glyph->loader->memory; FT_UInt flags, x_count, y_count, i, count, mask; FT_Int x; @@ -268,8 +268,8 @@ { PFR_CHECK( 1 ); count = PFR_NEXT_BYTE( p ); - x_count = ( count & 15 ); - y_count = ( count >> 4 ); + x_count = count & 15; + y_count = count >> 4; } else { @@ -388,7 +388,7 @@ case 2: /* horizontal line to */ FT_TRACE6(( "- horizontal line to cx.%d", format_low )); - if ( format_low > x_count ) + if ( format_low >= x_count ) goto Failure; pos[0].x = glyph->x_control[format_low]; pos[0].y = pos[3].y; @@ -398,7 +398,7 @@ case 3: /* vertical line to */ FT_TRACE6(( "- vertical line to cy.%d", format_low )); - if ( format_low > y_count ) + if ( format_low >= y_count ) goto Failure; pos[0].x = pos[3].x; pos[0].y = glyph->y_control[format_low]; @@ -440,7 +440,7 @@ case 0: /* 8-bit index */ PFR_CHECK( 1 ); idx = PFR_NEXT_BYTE( p ); - if ( idx > x_count ) + if ( idx >= x_count ) goto Failure; cur->x = glyph->x_control[idx]; FT_TRACE7(( " cx#%d", idx )); @@ -470,7 +470,7 @@ case 0: /* 8-bit index */ PFR_CHECK( 1 ); idx = PFR_NEXT_BYTE( p ); - if ( idx > y_count ) + if ( idx >= y_count ) goto Failure; cur->y = glyph->y_control[idx]; FT_TRACE7(( " cy#%d", idx )); @@ -558,7 +558,7 @@ FT_Byte* p, FT_Byte* limit ) { - FT_Error error = 0; + FT_Error error = PFR_Err_Ok; FT_GlyphLoader loader = glyph->loader; FT_Memory memory = loader->memory; PFR_SubGlyph subglyph; @@ -598,6 +598,16 @@ FT_UInt new_max = ( org_count + count + 3 ) & (FT_UInt)-4; + /* we arbitrarily limit the number of subglyphs */ + /* to avoid endless recursion */ + if ( new_max > 64 ) + { + error = PFR_Err_Invalid_Table; + FT_ERROR(( "pfr_glyph_load_compound:" + " too many compound glyphs components\n" )); + goto Exit; + } + if ( FT_RENEW_ARRAY( glyph->subs, glyph->max_subs, new_max ) ) goto Exit; @@ -743,6 +753,9 @@ count = glyph->num_subs - old_count; + FT_TRACE4(( "compound glyph with %d elements (offset %lu):\n", + count, offset )); + /* now, load each individual glyph */ for ( n = 0; n < count; n++ ) { @@ -750,6 +763,8 @@ PFR_SubGlyph subglyph; + FT_TRACE4(( "subglyph %d:\n", n )); + subglyph = glyph->subs + old_count + n; old_points = base->n_points; @@ -757,7 +772,7 @@ subglyph->gps_offset, subglyph->gps_size ); if ( error ) - goto Exit; + break; /* note that `glyph->subs' might have been re-allocated */ subglyph = glyph->subs + old_count + n; @@ -791,9 +806,13 @@ /* proceed to next sub-glyph */ } + + FT_TRACE4(( "end compound glyph with %d elements\n", count )); } else { + FT_TRACE4(( "simple glyph (offset %lu)\n", offset )); + /* load a simple glyph */ error = pfr_glyph_load_simple( glyph, p, limit ); @@ -805,9 +824,6 @@ } - - - FT_LOCAL_DEF( FT_Error ) pfr_glyph_load( PFR_Glyph glyph, FT_Stream stream, diff --git a/reactos/lib/3rdparty/freetype/src/pfr/pfrload.c b/reactos/lib/3rdparty/freetype/src/pfr/pfrload.c index bc5c035f3da..e919fa5b9fa 100644 --- a/reactos/lib/3rdparty/freetype/src/pfr/pfrload.c +++ b/reactos/lib/3rdparty/freetype/src/pfr/pfrload.c @@ -4,7 +4,7 @@ /* */ /* FreeType PFR loader (body). */ /* */ -/* Copyright 2002, 2003, 2004, 2005, 2007, 2009 by */ +/* Copyright 2002, 2003, 2004, 2005, 2007, 2009, 2010 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -49,7 +49,7 @@ PFR_ExtraItem item_list, FT_Pointer item_data ) { - FT_Error error = 0; + FT_Error error = PFR_Err_Ok; FT_Byte* p = *pp; FT_UInt num_items, item_type, item_size; @@ -353,7 +353,7 @@ PFR_Strike strike; FT_UInt flags0; FT_UInt n, count, size1; - FT_Error error = 0; + FT_Error error = PFR_Err_Ok; PFR_CHECK( 5 ); @@ -449,7 +449,7 @@ FT_Byte* limit, PFR_PhyFont phy_font ) { - FT_Error error = 0; + FT_Error error = PFR_Err_Ok; FT_Memory memory = phy_font->memory; FT_PtrDist len = limit - p; @@ -477,7 +477,7 @@ { FT_UInt count, num_vert, num_horz; FT_Int* snaps; - FT_Error error = 0; + FT_Error error = PFR_Err_Ok; FT_Memory memory = phy_font->memory; @@ -520,8 +520,8 @@ FT_Byte* limit, PFR_PhyFont phy_font ) { - PFR_KernItem item; - FT_Error error = 0; + PFR_KernItem item = NULL; + FT_Error error = PFR_Err_Ok; FT_Memory memory = phy_font->memory; @@ -631,7 +631,7 @@ FT_Memory memory, FT_String* *astring ) { - FT_Error error = 0; + FT_Error error = PFR_Err_Ok; FT_String* result = NULL; FT_UInt n, ok; diff --git a/reactos/lib/3rdparty/freetype/src/pfr/pfrobjs.c b/reactos/lib/3rdparty/freetype/src/pfr/pfrobjs.c index 56d617d880a..3e5e86e2109 100644 --- a/reactos/lib/3rdparty/freetype/src/pfr/pfrobjs.c +++ b/reactos/lib/3rdparty/freetype/src/pfr/pfrobjs.c @@ -4,7 +4,7 @@ /* */ /* FreeType PFR object methods (body). */ /* */ -/* Copyright 2002, 2003, 2004, 2005, 2006, 2007, 2008 by */ +/* Copyright 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2010 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -23,6 +23,7 @@ #include "pfrsbit.h" #include FT_OUTLINE_H #include FT_INTERNAL_DEBUG_H +#include FT_TRUETYPE_IDS_H #include "pfrerror.h" @@ -147,7 +148,16 @@ break; if ( nn == phy_font->num_chars ) - pfrface->face_flags = 0; /* not scalable */ + { + if ( phy_font->num_strikes > 0 ) + pfrface->face_flags = 0; /* not scalable */ + else + { + FT_ERROR(( "pfr_face_init: font doesn't contain glyphs\n" )); + error = PFR_Err_Invalid_File_Format; + goto Exit; + } + } } if ( (phy_font->flags & PFR_PHY_PROPORTIONAL) == 0 ) @@ -243,11 +253,11 @@ charmap.face = pfrface; - charmap.platform_id = 3; - charmap.encoding_id = 1; + charmap.platform_id = TT_PLATFORM_MICROSOFT; + charmap.encoding_id = TT_MS_ID_UNICODE_CS; charmap.encoding = FT_ENCODING_UNICODE; - FT_CMap_New( &pfr_cmap_class_rec, NULL, &charmap, NULL ); + error = FT_CMap_New( &pfr_cmap_class_rec, NULL, &charmap, NULL ); #if 0 /* Select default charmap */ diff --git a/reactos/lib/3rdparty/freetype/src/pfr/pfrsbit.c b/reactos/lib/3rdparty/freetype/src/pfr/pfrsbit.c index d2f17dc9ceb..52bc2c8c39a 100644 --- a/reactos/lib/3rdparty/freetype/src/pfr/pfrsbit.c +++ b/reactos/lib/3rdparty/freetype/src/pfr/pfrsbit.c @@ -4,7 +4,7 @@ /* */ /* FreeType PFR bitmap loader (body). */ /* */ -/* Copyright 2002, 2003, 2006, 2009 by */ +/* Copyright 2002, 2003, 2006, 2009, 2010 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -353,7 +353,7 @@ FT_Long *aadvance, FT_UInt *aformat ) { - FT_Error error = 0; + FT_Error error = PFR_Err_Ok; FT_Byte flags; FT_Char b; FT_Byte* p = *pdata; @@ -484,7 +484,7 @@ FT_Bool decreasing, FT_Bitmap* target ) { - FT_Error error = 0; + FT_Error error = PFR_Err_Ok; PFR_BitWriterRec writer; diff --git a/reactos/lib/3rdparty/freetype/src/psaux/afmparse.c b/reactos/lib/3rdparty/freetype/src/psaux/afmparse.c index 91a17e2362e..d7de3736f7f 100644 --- a/reactos/lib/3rdparty/freetype/src/psaux/afmparse.c +++ b/reactos/lib/3rdparty/freetype/src/psaux/afmparse.c @@ -4,7 +4,7 @@ /* */ /* AFM parser (body). */ /* */ -/* Copyright 2006, 2007, 2008, 2009 by */ +/* Copyright 2006, 2007, 2008, 2009, 2010 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -527,7 +527,7 @@ FT_Byte* base, FT_Byte* limit ) { - AFM_Stream stream; + AFM_Stream stream = NULL; FT_Error error; diff --git a/reactos/lib/3rdparty/freetype/src/psaux/afmparse.h b/reactos/lib/3rdparty/freetype/src/psaux/afmparse.h index de2a530b2f0..35d96046c5d 100644 --- a/reactos/lib/3rdparty/freetype/src/psaux/afmparse.h +++ b/reactos/lib/3rdparty/freetype/src/psaux/afmparse.h @@ -56,7 +56,8 @@ FT_BEGIN_HEADER typedef struct AFM_ValueRec_ { enum AFM_ValueType_ type; - union { + union + { char* s; FT_Fixed f; FT_Int i; diff --git a/reactos/lib/3rdparty/freetype/src/psaux/psobjs.c b/reactos/lib/3rdparty/freetype/src/psaux/psobjs.c index fe8398ae388..45c7419141a 100644 --- a/reactos/lib/3rdparty/freetype/src/psaux/psobjs.c +++ b/reactos/lib/3rdparty/freetype/src/psaux/psobjs.c @@ -4,7 +4,8 @@ /* */ /* Auxiliary functions for PostScript fonts (body). */ /* */ -/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 by */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, */ +/* 2010 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -1588,6 +1589,13 @@ FT_Error error; + /* this might happen in invalid fonts */ + if ( !outline ) + { + FT_ERROR(( "t1_builder_add_contour: no outline to add points to\n" )); + return PSaux_Err_Invalid_File_Format; + } + if ( !builder->load_points ) { outline->n_contours++; @@ -1621,7 +1629,7 @@ if ( builder->parse_state == T1_Parse_Have_Path ) error = PSaux_Err_Ok; - else if ( builder->parse_state == T1_Parse_Have_Moveto ) + else { builder->parse_state = T1_Parse_Have_Path; error = t1_builder_add_contour( builder ); diff --git a/reactos/lib/3rdparty/freetype/src/psaux/t1decode.c b/reactos/lib/3rdparty/freetype/src/psaux/t1decode.c index 31554ff1ba7..ea31c51b174 100644 --- a/reactos/lib/3rdparty/freetype/src/psaux/t1decode.c +++ b/reactos/lib/3rdparty/freetype/src/psaux/t1decode.c @@ -373,15 +373,6 @@ #endif - /* we don't want to touch the source code -- use macro trick */ -#define start_point t1_builder_start_point -#define check_points t1_builder_check_points -#define add_point t1_builder_add_point -#define add_point1 t1_builder_add_point1 -#define add_contour t1_builder_add_contour -#define close_contour t1_builder_close_contour - - /* compute random seed from stack address of parameter */ seed = (FT_Fixed)( ( (FT_PtrDist)(char*)&seed ^ (FT_PtrDist)(char*)&decoder ^ @@ -739,8 +730,10 @@ decoder->flex_state = 1; decoder->num_flex_vectors = 0; - if ( start_point( builder, x, y ) || - check_points( builder, 6 ) ) + if ( ( error = t1_builder_start_point( builder, x, y ) ) + != PSaux_Err_Ok || + ( error = t1_builder_check_points( builder, 6 ) ) + != PSaux_Err_Ok ) goto Fail; break; @@ -757,10 +750,10 @@ /* point without adding any point to the outline */ idx = decoder->num_flex_vectors++; if ( idx > 0 && idx < 7 ) - add_point( builder, - x, - y, - (FT_Byte)( idx == 3 || idx == 6 ) ); + t1_builder_add_point( builder, + x, + y, + (FT_Byte)( idx == 3 || idx == 6 ) ); } break; @@ -777,6 +770,8 @@ } /* the two `results' are popped by the following setcurrentpoint */ + top[0] = x; + top[1] = y; known_othersubr_result_cnt = 2; break; @@ -1075,7 +1070,7 @@ case op_endchar: FT_TRACE4(( " endchar\n" )); - close_contour( builder ); + t1_builder_close_contour( builder ); /* close hints recording session */ if ( hinter ) @@ -1174,7 +1169,7 @@ /* if there is no path, `closepath' is a no-op */ if ( builder->parse_state == T1_Parse_Have_Path || builder->parse_state == T1_Parse_Have_Moveto ) - close_contour( builder ); + t1_builder_close_contour( builder ); builder->parse_state = T1_Parse_Have_Width; break; @@ -1182,7 +1177,8 @@ case op_hlineto: FT_TRACE4(( " hlineto" )); - if ( start_point( builder, x, y ) ) + if ( ( error = t1_builder_start_point( builder, x, y ) ) + != PSaux_Err_Ok ) goto Fail; x += top[0]; @@ -1203,30 +1199,34 @@ case op_hvcurveto: FT_TRACE4(( " hvcurveto" )); - if ( start_point( builder, x, y ) || - check_points( builder, 3 ) ) + if ( ( error = t1_builder_start_point( builder, x, y ) ) + != PSaux_Err_Ok || + ( error = t1_builder_check_points( builder, 3 ) ) + != PSaux_Err_Ok ) goto Fail; x += top[0]; - add_point( builder, x, y, 0 ); + t1_builder_add_point( builder, x, y, 0 ); x += top[1]; y += top[2]; - add_point( builder, x, y, 0 ); + t1_builder_add_point( builder, x, y, 0 ); y += top[3]; - add_point( builder, x, y, 1 ); + t1_builder_add_point( builder, x, y, 1 ); break; case op_rlineto: FT_TRACE4(( " rlineto" )); - if ( start_point( builder, x, y ) ) + if ( ( error = t1_builder_start_point( builder, x, y ) ) + != PSaux_Err_Ok ) goto Fail; x += top[0]; y += top[1]; Add_Line: - if ( add_point1( builder, x, y ) ) + if ( ( error = t1_builder_add_point1( builder, x, y ) ) + != PSaux_Err_Ok ) goto Fail; break; @@ -1246,43 +1246,48 @@ case op_rrcurveto: FT_TRACE4(( " rrcurveto" )); - if ( start_point( builder, x, y ) || - check_points( builder, 3 ) ) + if ( ( error = t1_builder_start_point( builder, x, y ) ) + != PSaux_Err_Ok || + ( error = t1_builder_check_points( builder, 3 ) ) + != PSaux_Err_Ok ) goto Fail; x += top[0]; y += top[1]; - add_point( builder, x, y, 0 ); + t1_builder_add_point( builder, x, y, 0 ); x += top[2]; y += top[3]; - add_point( builder, x, y, 0 ); + t1_builder_add_point( builder, x, y, 0 ); x += top[4]; y += top[5]; - add_point( builder, x, y, 1 ); + t1_builder_add_point( builder, x, y, 1 ); break; case op_vhcurveto: FT_TRACE4(( " vhcurveto" )); - if ( start_point( builder, x, y ) || - check_points( builder, 3 ) ) + if ( ( error = t1_builder_start_point( builder, x, y ) ) + != PSaux_Err_Ok || + ( error = t1_builder_check_points( builder, 3 ) ) + != PSaux_Err_Ok ) goto Fail; y += top[0]; - add_point( builder, x, y, 0 ); + t1_builder_add_point( builder, x, y, 0 ); x += top[1]; y += top[2]; - add_point( builder, x, y, 0 ); + t1_builder_add_point( builder, x, y, 0 ); x += top[3]; - add_point( builder, x, y, 1 ); + t1_builder_add_point( builder, x, y, 1 ); break; case op_vlineto: FT_TRACE4(( " vlineto" )); - if ( start_point( builder, x, y ) ) + if ( ( error = t1_builder_start_point( builder, x, y ) ) + != PSaux_Err_Ok ) goto Fail; y += top[0]; @@ -1480,8 +1485,12 @@ goto Syntax_Error; } else + ... #endif - decoder->flex_state = 0; + + x = top[0]; + y = top[1]; + decoder->flex_state = 0; break; case op_unknown15: diff --git a/reactos/lib/3rdparty/freetype/src/pshinter/pshalgo.c b/reactos/lib/3rdparty/freetype/src/pshinter/pshalgo.c index 417dcee547a..d798978914a 100644 --- a/reactos/lib/3rdparty/freetype/src/pshinter/pshalgo.c +++ b/reactos/lib/3rdparty/freetype/src/pshinter/pshalgo.c @@ -4,7 +4,8 @@ /* */ /* PostScript hinting algorithm (body). */ /* */ -/* Copyright 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 by */ +/* Copyright 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 */ +/* by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used */ @@ -1690,7 +1691,10 @@ /* process secondary hints to `selected' points */ if ( num_masks > 1 && glyph->num_points > 0 ) { - first = mask->end_point; + /* the `endchar' op can reduce the number of points */ + first = mask->end_point > glyph->num_points + ? glyph->num_points + : mask->end_point; mask++; for ( ; num_masks > 1; num_masks--, mask++ ) { @@ -1698,7 +1702,9 @@ FT_Int count; - next = mask->end_point; + next = mask->end_point > glyph->num_points + ? glyph->num_points + : mask->end_point; count = next - first; if ( count > 0 ) { @@ -1856,12 +1862,10 @@ point->cur_u = hint->cur_pos + hint->cur_len + FT_MulFix( delta - hint->org_len, scale ); - else if ( hint->org_len > 0 ) + else /* hint->org_len > 0 */ point->cur_u = hint->cur_pos + FT_MulDiv( delta, hint->cur_len, hint->org_len ); - else - point->cur_u = hint->cur_pos; } psh_point_set_fitted( point ); } diff --git a/reactos/lib/3rdparty/freetype/src/pshinter/pshglob.c b/reactos/lib/3rdparty/freetype/src/pshinter/pshglob.c index 8a69aa1e845..31231ad0094 100644 --- a/reactos/lib/3rdparty/freetype/src/pshinter/pshglob.c +++ b/reactos/lib/3rdparty/freetype/src/pshinter/pshglob.c @@ -5,7 +5,7 @@ /* PostScript hinter global hinting management (body). */ /* Inspired by the new auto-hinter module. */ /* */ -/* Copyright 2001, 2002, 2003, 2004, 2006 by */ +/* Copyright 2001, 2002, 2003, 2004, 2006, 2010 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used */ @@ -624,7 +624,7 @@ T1_Private* priv, PSH_Globals *aglobals ) { - PSH_Globals globals; + PSH_Globals globals = NULL; FT_Error error; diff --git a/reactos/lib/3rdparty/freetype/src/pshinter/pshpic.c b/reactos/lib/3rdparty/freetype/src/pshinter/pshpic.c index 51a08798883..5efb4229489 100644 --- a/reactos/lib/3rdparty/freetype/src/pshinter/pshpic.c +++ b/reactos/lib/3rdparty/freetype/src/pshinter/pshpic.c @@ -4,7 +4,7 @@ /* */ /* The FreeType position independent code services for pshinter module. */ /* */ -/* Copyright 2009 by */ +/* Copyright 2009, 2010 by */ /* Oran Agra and Mickey Gabel. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -38,18 +38,20 @@ } } + FT_Error - pshinter_module_class_pic_init( FT_Library library ) + pshinter_module_class_pic_init( FT_Library library ) { - FT_PIC_Container* pic_container = &library->pic_container; - FT_Error error = FT_Err_Ok; - PSHinterPIC* container; - FT_Memory memory = library->memory; + FT_PIC_Container* pic_container = &library->pic_container; + FT_Error error = PSH_Err_Ok; + PSHinterPIC* container; + FT_Memory memory = library->memory; + /* allocate pointer, clear and set global container pointer */ if ( FT_ALLOC ( container, sizeof ( *container ) ) ) return error; - FT_MEM_SET( container, 0, sizeof(*container) ); + FT_MEM_SET( container, 0, sizeof ( *container ) ); pic_container->pshinter = container; /* add call to initialization function when you add new scripts */ diff --git a/reactos/lib/3rdparty/freetype/src/psnames/psmodule.c b/reactos/lib/3rdparty/freetype/src/psnames/psmodule.c index 35188504936..7528696938a 100644 --- a/reactos/lib/3rdparty/freetype/src/psnames/psmodule.c +++ b/reactos/lib/3rdparty/freetype/src/psnames/psmodule.c @@ -366,11 +366,13 @@ if ( count == 0 ) { + /* No unicode chars here! */ FT_FREE( table->maps ); if ( !error ) - error = PSnames_Err_Invalid_Argument; /* No unicode chars here! */ + error = PSnames_Err_No_Unicode_Glyph_Name; } - else { + else + { /* Reallocate if the number of used entries is much smaller. */ if ( count < num_glyphs / 2 ) { @@ -561,8 +563,7 @@ psnames_get_service( FT_Module module, const char* service_id ) { - FT_Library library = module->library; - FT_UNUSED(library); + FT_UNUSED( module ); return ft_service_list_lookup( FT_PSCMAPS_SERVICES_GET, service_id ); } diff --git a/reactos/lib/3rdparty/freetype/src/psnames/pspic.c b/reactos/lib/3rdparty/freetype/src/psnames/pspic.c index ed7dadda393..b9075d5a5a6 100644 --- a/reactos/lib/3rdparty/freetype/src/psnames/pspic.c +++ b/reactos/lib/3rdparty/freetype/src/psnames/pspic.c @@ -4,7 +4,7 @@ /* */ /* The FreeType position independent code services for psnames module. */ /* */ -/* Copyright 2009 by */ +/* Copyright 2009, 2010 by */ /* Oran Agra and Mickey Gabel. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -44,13 +44,15 @@ } } + FT_Error - psnames_module_class_pic_init( FT_Library library ) + psnames_module_class_pic_init( FT_Library library ) { - FT_PIC_Container* pic_container = &library->pic_container; - FT_Error error = FT_Err_Ok; - PSModulePIC* container; - FT_Memory memory = library->memory; + FT_PIC_Container* pic_container = &library->pic_container; + FT_Error error = PSnames_Err_Ok; + PSModulePIC* container; + FT_Memory memory = library->memory; + /* allocate pointer, clear and set global container pointer */ if ( FT_ALLOC ( container, sizeof ( *container ) ) ) diff --git a/reactos/lib/3rdparty/freetype/src/raster/ftmisc.h b/reactos/lib/3rdparty/freetype/src/raster/ftmisc.h index f04b5404bb8..7773924feb6 100644 --- a/reactos/lib/3rdparty/freetype/src/raster/ftmisc.h +++ b/reactos/lib/3rdparty/freetype/src/raster/ftmisc.h @@ -5,7 +5,7 @@ /* Miscellaneous macros for stand-alone rasterizer (specification */ /* only). */ /* */ -/* Copyright 2005, 2009 by */ +/* Copyright 2005, 2009, 2010 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used */ @@ -27,6 +27,7 @@ #ifndef __FTMISC_H__ #define __FTMISC_H__ + /* memset */ #include FT_CONFIG_STANDARD_LIBRARY_H @@ -35,6 +36,7 @@ #define FT_LOCAL_DEF( x ) static x + /* from include/freetype2/fttypes.h */ typedef unsigned char FT_Byte; @@ -77,12 +79,22 @@ } FT_MemoryRec; + /* from src/ftcalc.c */ -#include +#if ( defined _WIN32 || defined _WIN64 ) + + typedef __int64 FT_Int64; + +#else + +#include "inttypes.h" typedef int64_t FT_Int64; +#endif + + static FT_Long FT_MulDiv( FT_Long a, FT_Long b, diff --git a/reactos/lib/3rdparty/freetype/src/raster/ftraster.c b/reactos/lib/3rdparty/freetype/src/raster/ftraster.c index 23ad592653c..9638dfb026c 100644 --- a/reactos/lib/3rdparty/freetype/src/raster/ftraster.c +++ b/reactos/lib/3rdparty/freetype/src/raster/ftraster.c @@ -4,7 +4,7 @@ /* */ /* The FreeType glyph rasterizer (body). */ /* */ -/* Copyright 1996-2001, 2002, 2003, 2005, 2007, 2008, 2009 by */ +/* Copyright 1996-2001, 2002, 2003, 2005, 2007, 2008, 2009, 2010 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -302,7 +302,6 @@ typedef short Short; typedef unsigned short UShort, *PUShort; typedef long Long, *PLong; - typedef unsigned long ULong; typedef unsigned char Byte, *PByte; typedef char Bool; @@ -448,7 +447,6 @@ Int precision_bits; /* precision related variables */ Int precision; Int precision_half; - Long precision_mask; Int precision_shift; Int precision_step; Int precision_jitter; @@ -671,7 +669,6 @@ ras.precision = 1 << ras.precision_bits; ras.precision_half = ras.precision / 2; ras.precision_shift = ras.precision_bits - Pixel_Bits; - ras.precision_mask = -ras.precision; } @@ -725,13 +722,13 @@ if ( overshoot ) ras.cProfile->flags |= Overshoot_Bottom; - FT_TRACE6(( "New ascending profile = %lx\n", (long)ras.cProfile )); + FT_TRACE6(( "New ascending profile = %p\n", ras.cProfile )); break; case Descending_State: if ( overshoot ) ras.cProfile->flags |= Overshoot_Top; - FT_TRACE6(( "New descending profile = %lx\n", (long)ras.cProfile )); + FT_TRACE6(( "New descending profile = %p\n", ras.cProfile )); break; default: @@ -784,8 +781,8 @@ if ( h > 0 ) { - FT_TRACE6(( "Ending profile %lx, start = %ld, height = %ld\n", - (long)ras.cProfile, ras.cProfile->start, h )); + FT_TRACE6(( "Ending profile %p, start = %ld, height = %ld\n", + ras.cProfile, ras.cProfile->start, h )); ras.cProfile->height = h; if ( overshoot ) @@ -1094,7 +1091,7 @@ return SUCCESS; else { - x1 += FMulDiv( Dx, ras.precision - f1, Dy ); + x1 += SMulDiv( Dx, ras.precision - f1, Dy ); e1 += 1; } } @@ -1122,13 +1119,13 @@ if ( Dx > 0 ) { - Ix = ( ras.precision * Dx ) / Dy; + Ix = SMulDiv( ras.precision, Dx, Dy); Rx = ( ras.precision * Dx ) % Dy; Dx = 1; } else { - Ix = -( ( ras.precision * -Dx ) / Dy ); + Ix = SMulDiv( ras.precision, -Dx, Dy) * -1; Rx = ( ras.precision * -Dx ) % Dy; Dx = -1; } @@ -1931,18 +1928,21 @@ y1 = SCALED( point[-2].y ); x2 = SCALED( point[-1].x ); y2 = SCALED( point[-1].y ); - x3 = SCALED( point[ 0].x ); - y3 = SCALED( point[ 0].y ); if ( flipped ) { SWAP_( x1, y1 ); SWAP_( x2, y2 ); - SWAP_( x3, y3 ); } if ( point <= limit ) { + x3 = SCALED( point[0].x ); + y3 = SCALED( point[0].y ); + + if ( flipped ) + SWAP_( x3, y3 ); + if ( Cubic_To( RAS_VARS x1, y1, x2, y2, x3, y3 ) ) goto Fail; continue; @@ -2495,7 +2495,7 @@ PByte p; - p = bits - e1*ras.target.pitch; + p = bits - e1 * ras.target.pitch; if ( ras.target.pitch > 0 ) p += ( ras.target.rows - 1 ) * ras.target.pitch; @@ -3382,6 +3382,7 @@ FT_Raster *araster ) { static TRaster the_raster; + FT_UNUSED( memory ); *araster = (FT_Raster)&the_raster; @@ -3400,7 +3401,7 @@ } -#else /* _STANDALONE_ */ +#else /* !_STANDALONE_ */ static int @@ -3408,7 +3409,7 @@ PRaster *araster ) { FT_Error error; - PRaster raster; + PRaster raster = NULL; *araster = 0; @@ -3432,7 +3433,7 @@ } -#endif /* _STANDALONE_ */ +#endif /* !_STANDALONE_ */ static void @@ -3447,9 +3448,8 @@ PWorker worker = (PWorker)pool_base; - raster->buffer = pool_base + ( (sizeof ( *worker ) + 7 ) & ~7 ); - raster->buffer_size = ( ( pool_base + pool_size ) - - (char*)raster->buffer ) / sizeof ( Long ); + raster->buffer = pool_base + ( ( sizeof ( *worker ) + 7 ) & ~7 ); + raster->buffer_size = pool_base + pool_size - (char*)raster->buffer; raster->worker = worker; } else diff --git a/reactos/lib/3rdparty/freetype/src/raster/rastpic.c b/reactos/lib/3rdparty/freetype/src/raster/rastpic.c index 3c264877b6d..e31c5497633 100644 --- a/reactos/lib/3rdparty/freetype/src/raster/rastpic.c +++ b/reactos/lib/3rdparty/freetype/src/raster/rastpic.c @@ -4,7 +4,7 @@ /* */ /* The FreeType position independent code services for raster module. */ /* */ -/* Copyright 2009 by */ +/* Copyright 2009, 2010 by */ /* Oran Agra and Mickey Gabel. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -43,16 +43,17 @@ FT_Error - ft_raster1_renderer_class_pic_init( FT_Library library ) + ft_raster1_renderer_class_pic_init( FT_Library library ) { FT_PIC_Container* pic_container = &library->pic_container; - FT_Error error = FT_Err_Ok; - RasterPIC* container; - FT_Memory memory = library->memory; + FT_Error error = Raster_Err_Ok; + RasterPIC* container; + FT_Memory memory = library->memory; + /* since this function also serve raster5 renderer, it implements reference counting */ - if(pic_container->raster) + if ( pic_container->raster ) { ((RasterPIC*)pic_container->raster)->ref_count++; return error; diff --git a/reactos/lib/3rdparty/freetype/src/sfnt/sfdriver.c b/reactos/lib/3rdparty/freetype/src/sfnt/sfdriver.c index 1097efb86d7..b74679b31af 100644 --- a/reactos/lib/3rdparty/freetype/src/sfnt/sfdriver.c +++ b/reactos/lib/3rdparty/freetype/src/sfnt/sfdriver.c @@ -4,7 +4,7 @@ /* */ /* High-level SFNT driver interface (body). */ /* */ -/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2009 by */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2009, 2010 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -362,7 +362,7 @@ *acharset_registry = registry.u.atom; } else - error = FT_Err_Invalid_Argument; + error = SFNT_Err_Invalid_Argument; } } @@ -436,7 +436,7 @@ FT_UNUSED( face_index ); FT_UNUSED( header ); - return FT_Err_Unimplemented_Feature; + return SFNT_Err_Unimplemented_Feature; } @@ -449,7 +449,7 @@ FT_UNUSED( stream ); FT_UNUSED( header ); - return FT_Err_Unimplemented_Feature; + return SFNT_Err_Unimplemented_Feature; } @@ -460,7 +460,7 @@ FT_UNUSED( face ); FT_UNUSED( stream ); - return FT_Err_Unimplemented_Feature; + return SFNT_Err_Unimplemented_Feature; } @@ -513,7 +513,7 @@ * is only there for some rogue clients which would want to call it * directly (which doesn't make much sense). */ - return FT_Err_Unimplemented_Feature; + return SFNT_Err_Unimplemented_Feature; } @@ -534,7 +534,7 @@ FT_UNUSED( cmap ); FT_UNUSED( input ); - return FT_Err_Unimplemented_Feature; + return SFNT_Err_Unimplemented_Feature; } @@ -545,7 +545,7 @@ FT_UNUSED( face ); FT_UNUSED( cmap ); - return 0; + return SFNT_Err_Ok; } #endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ diff --git a/reactos/lib/3rdparty/freetype/src/sfnt/sfntpic.c b/reactos/lib/3rdparty/freetype/src/sfnt/sfntpic.c index fd3cf4e923e..53aca17b519 100644 --- a/reactos/lib/3rdparty/freetype/src/sfnt/sfntpic.c +++ b/reactos/lib/3rdparty/freetype/src/sfnt/sfntpic.c @@ -4,7 +4,7 @@ /* */ /* The FreeType position independent code services for sfnt module. */ /* */ -/* Copyright 2009 by */ +/* Copyright 2009, 2010 by */ /* Oran Agra and Mickey Gabel. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -60,15 +60,16 @@ FT_Error sfnt_module_class_pic_init( FT_Library library ) { - FT_PIC_Container* pic_container = &library->pic_container; - FT_Error error = FT_Err_Ok; - sfntModulePIC* container; - FT_Memory memory = library->memory; + FT_PIC_Container* pic_container = &library->pic_container; + FT_Error error = SFNT_Err_Ok; + sfntModulePIC* container; + FT_Memory memory = library->memory; + /* allocate pointer, clear and set global container pointer */ if ( FT_ALLOC ( container, sizeof ( *container ) ) ) return error; - FT_MEM_SET( container, 0, sizeof(*container) ); + FT_MEM_SET( container, 0, sizeof ( *container ) ); pic_container->sfnt = container; /* initialize pointer table - this is how the module usually expects this data */ diff --git a/reactos/lib/3rdparty/freetype/src/sfnt/sfobjs.c b/reactos/lib/3rdparty/freetype/src/sfnt/sfobjs.c index b74b1a93a9b..5a1d0031ed8 100644 --- a/reactos/lib/3rdparty/freetype/src/sfnt/sfobjs.c +++ b/reactos/lib/3rdparty/freetype/src/sfnt/sfobjs.c @@ -4,7 +4,7 @@ /* */ /* SFNT object management (base). */ /* */ -/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 by */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2010 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -50,9 +50,9 @@ tt_name_entry_ascii_from_utf16( TT_NameEntry entry, FT_Memory memory ) { - FT_String* string; + FT_String* string = NULL; FT_UInt len, code, n; - FT_Byte* read = (FT_Byte*)entry->string; + FT_Byte* read = (FT_Byte*)entry->string; FT_Error error; @@ -81,9 +81,9 @@ tt_name_entry_ascii_from_other( TT_NameEntry entry, FT_Memory memory ) { - FT_String* string; + FT_String* string = NULL; FT_UInt len, code, n; - FT_Byte* read = (FT_Byte*)entry->string; + FT_Byte* read = (FT_Byte*)entry->string; FT_Error error; @@ -160,7 +160,7 @@ /* According to the OpenType 1.3 specification, only Microsoft or */ /* Apple platform IDs might be used in the `name' table. The */ /* `Unicode' platform is reserved for the `cmap' table, and the */ - /* `Iso' one is deprecated. */ + /* `ISO' one is deprecated. */ /* */ /* However, the Apple TrueType specification doesn't say the same */ /* thing and goes to suggest that all Unicode `name' table entries */ @@ -691,9 +691,7 @@ LOAD_( os2 ); if ( error ) { - if ( error != SFNT_Err_Table_Missing ) - goto Exit; - + /* we treat the table as missing if there are any errors */ face->os2.version = 0xFFFFU; } } diff --git a/reactos/lib/3rdparty/freetype/src/sfnt/ttbdf.c b/reactos/lib/3rdparty/freetype/src/sfnt/ttbdf.c index 206cecee5ed..18845c39c2e 100644 --- a/reactos/lib/3rdparty/freetype/src/sfnt/ttbdf.c +++ b/reactos/lib/3rdparty/freetype/src/sfnt/ttbdf.c @@ -4,7 +4,7 @@ /* */ /* TrueType and OpenType embedded BDF properties (body). */ /* */ -/* Copyright 2005, 2006 by */ +/* Copyright 2005, 2006, 2010 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -74,7 +74,7 @@ length < 8 || FT_FRAME_EXTRACT( length, bdf->table ) ) { - error = FT_Err_Invalid_Table; + error = SFNT_Err_Invalid_Table; goto Exit; } @@ -131,7 +131,7 @@ BadTable: FT_FRAME_RELEASE( bdf->table ); FT_ZERO( bdf ); - error = FT_Err_Invalid_Table; + error = SFNT_Err_Invalid_Table; goto Exit; } @@ -143,7 +143,7 @@ { TT_BDF bdf = &face->bdf; FT_Size size = FT_FACE(face)->size; - FT_Error error = 0; + FT_Error error = SFNT_Err_Ok; FT_Byte* p; FT_UInt count; FT_Byte* strike; @@ -163,7 +163,7 @@ p = bdf->table + 8; strike = p + 4 * count; - error = FT_Err_Invalid_Argument; + error = SFNT_Err_Invalid_Argument; if ( size == NULL || property_name == NULL ) goto Exit; @@ -215,7 +215,7 @@ { aprop->type = BDF_PROPERTY_TYPE_ATOM; aprop->u.atom = (const char*)bdf->strings + value; - error = 0; + error = SFNT_Err_Ok; goto Exit; } break; @@ -223,13 +223,13 @@ case 0x02: aprop->type = BDF_PROPERTY_TYPE_INTEGER; aprop->u.integer = (FT_Int32)value; - error = 0; + error = SFNT_Err_Ok; goto Exit; case 0x03: aprop->type = BDF_PROPERTY_TYPE_CARDINAL; aprop->u.cardinal = value; - error = 0; + error = SFNT_Err_Ok; goto Exit; default: diff --git a/reactos/lib/3rdparty/freetype/src/sfnt/ttcmap.c b/reactos/lib/3rdparty/freetype/src/sfnt/ttcmap.c index b283f6d1621..544750ab17f 100644 --- a/reactos/lib/3rdparty/freetype/src/sfnt/ttcmap.c +++ b/reactos/lib/3rdparty/freetype/src/sfnt/ttcmap.c @@ -4,7 +4,7 @@ /* */ /* TrueType character mapping table (cmap) support (body). */ /* */ -/* Copyright 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 by */ +/* Copyright 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -2689,7 +2689,7 @@ FT_Memory memory ) { FT_UInt32 old_max = cmap->max_results; - FT_Error error = 0; + FT_Error error = SFNT_Err_Ok; if ( num_results > cmap->max_results ) @@ -2787,7 +2787,8 @@ } /* and the non-default table (these glyphs are specified here) */ - if ( nondefOff != 0 ) { + if ( nondefOff != 0 ) + { FT_Byte* ndp = table + nondefOff; FT_ULong numMappings = TT_NEXT_ULONG( ndp ); FT_ULong i, lastUni = 0; @@ -3375,7 +3376,7 @@ clazz[i] = NULL; *output_class = clazz; - return FT_Err_Ok; + return SFNT_Err_Ok; } #endif /*FT_CONFIG_OPTION_PIC*/ @@ -3391,11 +3392,12 @@ FT_Byte* limit = table + face->cmap_size; FT_UInt volatile num_cmaps; FT_Byte* volatile p = table; - FT_Library library = FT_FACE_LIBRARY(face); - FT_UNUSED(library); + FT_Library library = FT_FACE_LIBRARY( face ); + + FT_UNUSED( library ); - if ( p + 4 > limit ) + if ( !p || p + 4 > limit ) return SFNT_Err_Invalid_Table; /* only recognize format 0 */ @@ -3409,6 +3411,12 @@ } num_cmaps = TT_NEXT_USHORT( p ); +#ifdef FT_MAX_CHARMAP_CACHEABLE + if ( num_cmaps > FT_MAX_CHARMAP_CACHEABLE ) + FT_ERROR(( "tt_face_build_cmaps: too many cmap subtables(%d) " + "subtable#%d and later are loaded but cannot be searched\n", + num_cmaps, FT_MAX_CHARMAP_CACHEABLE + 1 )); +#endif for ( ; num_cmaps > 0 && p + 8 <= limit; num_cmaps-- ) { diff --git a/reactos/lib/3rdparty/freetype/src/sfnt/ttkern.c b/reactos/lib/3rdparty/freetype/src/sfnt/ttkern.c index c1540802b87..46888988e4a 100644 --- a/reactos/lib/3rdparty/freetype/src/sfnt/ttkern.c +++ b/reactos/lib/3rdparty/freetype/src/sfnt/ttkern.c @@ -5,7 +5,7 @@ /* Load the basic TrueType kerning table. This doesn't handle */ /* kerning data within the GPOS table at the moment. */ /* */ -/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2009 by */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2009, 2010 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -115,7 +115,7 @@ num_pairs = FT_NEXT_USHORT( p ); p += 6; - if ( ( p_next - p ) / 6 < (int)num_pairs ) /* handle broken count */ + if ( ( p_next - p ) < 6 * (int)num_pairs ) /* handle broken count */ num_pairs = (FT_UInt)( ( p_next - p ) / 6 ); avail |= mask; @@ -220,7 +220,7 @@ num_pairs = FT_NEXT_USHORT( p ); p += 6; - if ( ( next - p ) / 6 < (int)num_pairs ) /* handle broken count */ + if ( ( next - p ) < 6 * (int)num_pairs ) /* handle broken count */ num_pairs = (FT_UInt)( ( next - p ) / 6 ); switch ( coverage >> 8 ) diff --git a/reactos/lib/3rdparty/freetype/src/sfnt/ttload.c b/reactos/lib/3rdparty/freetype/src/sfnt/ttload.c index 3ad33bd6d86..20bac73d209 100644 --- a/reactos/lib/3rdparty/freetype/src/sfnt/ttload.c +++ b/reactos/lib/3rdparty/freetype/src/sfnt/ttload.c @@ -5,7 +5,8 @@ /* Load the basic TrueType tables, i.e., tables that can be either in */ /* TTF or OTF fonts (body). */ /* */ -/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 by */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, */ +/* 2010 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -77,7 +78,8 @@ { /* For compatibility with Windows, we consider */ /* zero-length tables the same as missing tables. */ - if ( entry->Tag == tag ) { + if ( entry->Tag == tag ) + { if ( entry->Length != 0 ) { FT_TRACE4(( "found table.\n" )); @@ -382,6 +384,10 @@ entry = face->dir_tables; + FT_TRACE2(( "\n" + " tag offset length checksum\n" + " ----------------------------------\n" )); + for ( nn = 0; nn < sfnt.num_tables; nn++ ) { entry->Tag = FT_GET_TAG4(); @@ -394,13 +400,14 @@ continue; else { - FT_TRACE2(( " %c%c%c%c - %08lx - %08lx\n", + FT_TRACE2(( " %c%c%c%c %08lx %08lx %08lx\n", (FT_Char)( entry->Tag >> 24 ), (FT_Char)( entry->Tag >> 16 ), (FT_Char)( entry->Tag >> 8 ), (FT_Char)( entry->Tag ), entry->Offset, - entry->Length )); + entry->Length, + entry->CheckSum )); entry++; } } @@ -678,9 +685,9 @@ /* broken fonts like `Keystrokes MT' :-( */ /* */ /* We allocate 64 function entries by default when */ - /* the maxFunctionDefs field is null. */ + /* the maxFunctionDefs value is smaller. */ - if ( maxProfile->maxFunctionDefs == 0 ) + if ( maxProfile->maxFunctionDefs < 64 ) maxProfile->maxFunctionDefs = 64; /* we add 4 phantom points later */ @@ -693,6 +700,15 @@ maxProfile->maxTwilightPoints = 0xFFFFU - 4; } + + /* we arbitrarily limit recursion to avoid stack exhaustion */ + if ( maxProfile->maxComponentDepth > 100 ) + { + FT_TRACE0(( "tt_face_load_maxp:" + " abnormally large component depth (%d) set to 100\n", + maxProfile->maxComponentDepth )); + maxProfile->maxComponentDepth = 100; + } } FT_TRACE3(( "numGlyphs: %u\n", maxProfile->numGlyphs )); diff --git a/reactos/lib/3rdparty/freetype/src/sfnt/ttpost.c b/reactos/lib/3rdparty/freetype/src/sfnt/ttpost.c index aa0bf1ec419..6f4bb1d0d32 100644 --- a/reactos/lib/3rdparty/freetype/src/sfnt/ttpost.c +++ b/reactos/lib/3rdparty/freetype/src/sfnt/ttpost.c @@ -5,7 +5,7 @@ /* Postcript name table processing for TrueType and OpenType fonts */ /* (body). */ /* */ -/* Copyright 1996-2001, 2002, 2003, 2006, 2007, 2008, 2009 by */ +/* Copyright 1996-2001, 2002, 2003, 2006, 2007, 2008, 2009, 2010 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -26,6 +26,7 @@ #include +#include FT_INTERNAL_DEBUG_H #include FT_INTERNAL_STREAM_H #include FT_TRUETYPE_TAGS_H #include "ttpost.h" @@ -153,7 +154,8 @@ static FT_Error load_format_20( TT_Face face, - FT_Stream stream ) + FT_Stream stream, + FT_Long post_limit ) { FT_Memory memory = stream->memory; FT_Error error; @@ -230,13 +232,46 @@ FT_UInt len; - if ( FT_READ_BYTE ( len ) || - FT_NEW_ARRAY( name_strings[n], len + 1 ) || - FT_STREAM_READ ( name_strings[n], len ) ) + if ( FT_STREAM_POS() >= post_limit ) + break; + else + { + FT_TRACE6(( "load_format_20: %d byte left in post table\n", + post_limit - FT_STREAM_POS() )); + + if ( FT_READ_BYTE( len ) ) + goto Fail1; + } + + if ( (FT_Int)len > post_limit || + FT_STREAM_POS() > post_limit - (FT_Int)len ) + { + FT_ERROR(( "load_format_20:" + " exceeding string length (%d)," + " truncating at end of post table (%d byte left)\n", + len, post_limit - FT_STREAM_POS() )); + len = FT_MAX( 0, post_limit - FT_STREAM_POS() ); + } + + if ( FT_NEW_ARRAY( name_strings[n], len + 1 ) || + FT_STREAM_READ( name_strings[n], len ) ) goto Fail1; name_strings[n][len] = '\0'; } + + if ( n < num_names ) + { + FT_ERROR(( "load_format_20:" + " all entries in post table are already parsed," + " using NULL names for gid %d - %d\n", + n, num_names - 1 )); + for ( ; n < num_names; n++ ) + if ( FT_NEW_ARRAY( name_strings[n], 1 ) ) + goto Fail1; + else + name_strings[n][0] = '\0'; + } } /* all right, set table fields and exit successfully */ @@ -271,7 +306,8 @@ static FT_Error load_format_25( TT_Face face, - FT_Stream stream ) + FT_Stream stream, + FT_Long post_limit ) { FT_Memory memory = stream->memory; FT_Error error; @@ -279,6 +315,8 @@ FT_Int num_glyphs; FT_Char* offset_table = 0; + FT_UNUSED( post_limit ); + /* UNDOCUMENTED! This value appears only in the Apple TT specs. */ if ( FT_READ_USHORT( num_glyphs ) ) @@ -338,16 +376,20 @@ FT_Stream stream; FT_Error error; FT_Fixed format; + FT_ULong post_len; + FT_Long post_limit; /* get a stream for the face's resource */ stream = face->root.stream; /* seek to the beginning of the PS names table */ - error = face->goto_table( face, TTAG_post, stream, 0 ); + error = face->goto_table( face, TTAG_post, stream, &post_len ); if ( error ) goto Exit; + post_limit = FT_STREAM_POS() + post_len; + format = face->postscript.FormatType; /* go to beginning of subtable */ @@ -356,9 +398,9 @@ /* now read postscript table */ if ( format == 0x00020000L ) - error = load_format_20( face, stream ); + error = load_format_20( face, stream, post_limit ); else if ( format == 0x00028000L ) - error = load_format_25( face, stream ); + error = load_format_25( face, stream, post_limit ); else error = SFNT_Err_Invalid_File_Format; diff --git a/reactos/lib/3rdparty/freetype/src/sfnt/ttsbit.c b/reactos/lib/3rdparty/freetype/src/sfnt/ttsbit.c index 833bb2add29..faa8f88fd7c 100644 --- a/reactos/lib/3rdparty/freetype/src/sfnt/ttsbit.c +++ b/reactos/lib/3rdparty/freetype/src/sfnt/ttsbit.c @@ -4,7 +4,8 @@ /* */ /* TrueType and OpenType embedded bitmap support (body). */ /* */ -/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 by */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, */ +/* 2010 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -417,7 +418,7 @@ tt_face_load_eblc( TT_Face face, FT_Stream stream ) { - FT_Error error = 0; + FT_Error error = SFNT_Err_Ok; FT_Memory memory = stream->memory; FT_Fixed version; FT_ULong num_strikes; diff --git a/reactos/lib/3rdparty/freetype/src/smooth/ftgrays.c b/reactos/lib/3rdparty/freetype/src/smooth/ftgrays.c index 846e454e667..a85e16086e7 100644 --- a/reactos/lib/3rdparty/freetype/src/smooth/ftgrays.c +++ b/reactos/lib/3rdparty/freetype/src/smooth/ftgrays.c @@ -4,7 +4,7 @@ /* */ /* A new `perfect' anti-aliasing renderer (body). */ /* */ -/* Copyright 2000-2001, 2002, 2003, 2005, 2006, 2007, 2008, 2009 by */ +/* Copyright 2000-2001, 2002, 2003, 2005, 2006, 2007, 2008, 2009, 2010 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -103,10 +103,12 @@ #include #endif +#include #include #include #include #define FT_UINT_MAX UINT_MAX +#define FT_INT_MAX INT_MAX #define ft_memset memset @@ -114,6 +116,8 @@ #define ft_longjmp longjmp #define ft_jmp_buf jmp_buf +typedef ptrdiff_t FT_PtrDist; + #define ErrRaster_Invalid_Mode -2 #define ErrRaster_Invalid_Outline -1 @@ -183,7 +187,7 @@ shift_, \ delta_ \ }; - + #define FT_DEFINE_RASTER_FUNCS( class_, glyph_format_, \ raster_new_, raster_reset_, \ raster_set_mode_, raster_render_, \ @@ -350,8 +354,6 @@ int band_size; int band_shoot; - int conic_level; - int cubic_level; ft_jmp_buf jump_buffer; @@ -875,47 +877,7 @@ FT_Vector* arc; - dx = DOWNSCALE( ras.x ) + to->x - ( control->x << 1 ); - if ( dx < 0 ) - dx = -dx; - dy = DOWNSCALE( ras.y ) + to->y - ( control->y << 1 ); - if ( dy < 0 ) - dy = -dy; - if ( dx < dy ) - dx = dy; - - level = 1; - dx = dx / ras.conic_level; - while ( dx > 0 ) - { - dx >>= 2; - level++; - } - - /* a shortcut to speed things up */ - if ( level <= 1 ) - { - /* we compute the mid-point directly in order to avoid */ - /* calling gray_split_conic() */ - TPos to_x, to_y, mid_x, mid_y; - - - to_x = UPSCALE( to->x ); - to_y = UPSCALE( to->y ); - mid_x = ( ras.x + to_x + 2 * UPSCALE( control->x ) ) / 4; - mid_y = ( ras.y + to_y + 2 * UPSCALE( control->y ) ) / 4; - - gray_render_line( RAS_VAR_ mid_x, mid_y ); - gray_render_line( RAS_VAR_ to_x, to_y ); - - return; - } - - arc = ras.bez_stack; - levels = ras.lev_stack; - top = 0; - levels[0] = level; - + arc = ras.bez_stack; arc[0].x = UPSCALE( to->x ); arc[0].y = UPSCALE( to->y ); arc[1].x = UPSCALE( control->x ); @@ -923,6 +885,28 @@ arc[2].x = ras.x; arc[2].y = ras.y; + dx = FT_ABS( arc[2].x + arc[0].x - 2 * arc[1].x ); + dy = FT_ABS( arc[2].y + arc[0].y - 2 * arc[1].y ); + if ( dx < dy ) + dx = dy; + + if ( dx <= ONE_PIXEL / 4 ) + { + gray_render_line( RAS_VAR_ arc[0].x, arc[0].y ); + return; + } + + level = 0; + while ( dx > ONE_PIXEL / 4 ) + { + dx >>= 2; + level++; + } + + levels = ras.lev_stack; + levels[0] = level; + top = 0; + while ( top >= 0 ) { level = levels[top]; @@ -953,21 +937,9 @@ } Draw: - { - TPos to_x, to_y, mid_x, mid_y; - - - to_x = arc[0].x; - to_y = arc[0].y; - mid_x = ( ras.x + to_x + 2 * arc[1].x ) / 4; - mid_y = ( ras.y + to_y + 2 * arc[1].y ) / 4; - - gray_render_line( RAS_VAR_ mid_x, mid_y ); - gray_render_line( RAS_VAR_ to_x, to_y ); - - top--; - arc -= 2; - } + gray_render_line( RAS_VAR_ arc[0].x, arc[0].y ); + top--; + arc -= 2; } return; @@ -1007,59 +979,9 @@ const FT_Vector* control2, const FT_Vector* to ) { - TPos dx, dy, da, db; - int top, level; - int* levels; FT_Vector* arc; - dx = DOWNSCALE( ras.x ) + to->x - ( control1->x << 1 ); - if ( dx < 0 ) - dx = -dx; - dy = DOWNSCALE( ras.y ) + to->y - ( control1->y << 1 ); - if ( dy < 0 ) - dy = -dy; - if ( dx < dy ) - dx = dy; - da = dx; - - dx = DOWNSCALE( ras.x ) + to->x - 3 * ( control1->x + control2->x ); - if ( dx < 0 ) - dx = -dx; - dy = DOWNSCALE( ras.y ) + to->y - 3 * ( control1->x + control2->y ); - if ( dy < 0 ) - dy = -dy; - if ( dx < dy ) - dx = dy; - db = dx; - - level = 1; - da = da / ras.cubic_level; - db = db / ras.conic_level; - while ( da > 0 || db > 0 ) - { - da >>= 2; - db >>= 3; - level++; - } - - if ( level <= 1 ) - { - TPos to_x, to_y, mid_x, mid_y; - - - to_x = UPSCALE( to->x ); - to_y = UPSCALE( to->y ); - mid_x = ( ras.x + to_x + - 3 * UPSCALE( control1->x + control2->x ) ) / 8; - mid_y = ( ras.y + to_y + - 3 * UPSCALE( control1->y + control2->y ) ) / 8; - - gray_render_line( RAS_VAR_ mid_x, mid_y ); - gray_render_line( RAS_VAR_ to_x, to_y ); - return; - } - arc = ras.bez_stack; arc[0].x = UPSCALE( to->x ); arc[0].y = UPSCALE( to->y ); @@ -1070,60 +992,129 @@ arc[3].x = ras.x; arc[3].y = ras.y; - levels = ras.lev_stack; - top = 0; - levels[0] = level; - - while ( top >= 0 ) + for (;;) { - level = levels[top]; - if ( level > 1 ) + /* Check that the arc crosses the current band. */ + TPos min, max, y; + + + min = max = arc[0].y; + + y = arc[1].y; + if ( y < min ) + min = y; + if ( y > max ) + max = y; + + y = arc[2].y; + if ( y < min ) + min = y; + if ( y > max ) + max = y; + + y = arc[3].y; + if ( y < min ) + min = y; + if ( y > max ) + max = y; + + if ( TRUNC( min ) >= ras.max_ey || TRUNC( max ) < ras.min_ey ) + goto Draw; + + /* Decide whether to split or draw. See `Rapid Termination */ + /* Evaluation for Recursive Subdivision of Bezier Curves' by Thomas */ + /* F. Hain, at */ + /* http://www.cis.southalabama.edu/~hain/general/Publications/Bezier/Camera-ready%20CISST02%202.pdf */ + { - /* check that the arc crosses the current band */ - TPos min, max, y; + TPos dx, dy, dx_, dy_; + TPos dx1, dy1, dx2, dy2; + TPos L, s, s_limit; - min = max = arc[0].y; - y = arc[1].y; - if ( y < min ) min = y; - if ( y > max ) max = y; - y = arc[2].y; - if ( y < min ) min = y; - if ( y > max ) max = y; - y = arc[3].y; - if ( y < min ) min = y; - if ( y > max ) max = y; - if ( TRUNC( min ) >= ras.max_ey || TRUNC( max ) < 0 ) - goto Draw; - gray_split_cubic( arc ); - arc += 3; - top ++; - levels[top] = levels[top - 1] = level - 1; - continue; + /* dx and dy are x and y components of the P0-P3 chord vector. */ + dx = arc[3].x - arc[0].x; + dy = arc[3].y - arc[0].y; + + /* L is an (under)estimate of the Euclidean distance P0-P3. */ + /* */ + /* If dx >= dy, then r = sqrt(dx^2 + dy^2) can be overestimated */ + /* with least maximum error by */ + /* */ + /* r_upperbound = dx + (sqrt(2) - 1) * dy , */ + /* */ + /* where sqrt(2) - 1 can be (over)estimated by 107/256, giving an */ + /* error of no more than 8.4%. */ + /* */ + /* Similarly, some elementary calculus shows that r can be */ + /* underestimated with least maximum error by */ + /* */ + /* r_lowerbound = sqrt(2 + sqrt(2)) / 2 * dx */ + /* + sqrt(2 - sqrt(2)) / 2 * dy . */ + /* */ + /* 236/256 and 97/256 are (under)estimates of the two algebraic */ + /* numbers, giving an error of no more than 8.1%. */ + + dx_ = FT_ABS( dx ); + dy_ = FT_ABS( dy ); + + /* This is the same as */ + /* */ + /* L = ( 236 * FT_MAX( dx_, dy_ ) */ + /* + 97 * FT_MIN( dx_, dy_ ) ) >> 8; */ + L = ( dx_ > dy_ ? 236 * dx_ + 97 * dy_ + : 97 * dx_ + 236 * dy_ ) >> 8; + + /* Avoid possible arithmetic overflow below by splitting. */ + if ( L > 32767 ) + goto Split; + + /* Max deviation may be as much as (s/L) * 3/4 (if Hain's v = 1). */ + s_limit = L * (TPos)( ONE_PIXEL / 6 ); + + /* s is L * the perpendicular distance from P1 to the line P0-P3. */ + dx1 = arc[1].x - arc[0].x; + dy1 = arc[1].y - arc[0].y; + s = FT_ABS( dy * dx1 - dx * dy1 ); + + if ( s > s_limit ) + goto Split; + + /* s is L * the perpendicular distance from P2 to the line P0-P3. */ + dx2 = arc[2].x - arc[0].x; + dy2 = arc[2].y - arc[0].y; + s = FT_ABS( dy * dx2 - dx * dy2 ); + + if ( s > s_limit ) + goto Split; + + /* If P1 or P2 is outside P0-P3, split the curve. */ + if ( dy * dy1 + dx * dx1 < 0 || + dy * dy2 + dx * dx2 < 0 || + dy * (arc[3].y - arc[1].y) + dx * (arc[3].x - arc[1].x) < 0 || + dy * (arc[3].y - arc[2].y) + dx * (arc[3].x - arc[2].x) < 0 ) + goto Split; + + /* No reason to split. */ + goto Draw; } + Split: + gray_split_cubic( arc ); + arc += 3; + continue; + Draw: - { - TPos to_x, to_y, mid_x, mid_y; + gray_render_line( RAS_VAR_ arc[0].x, arc[0].y ); + if ( arc == ras.bez_stack ) + return; - to_x = arc[0].x; - to_y = arc[0].y; - mid_x = ( ras.x + to_x + 3 * ( arc[1].x + arc[2].x ) ) / 8; - mid_y = ( ras.y + to_y + 3 * ( arc[1].y + arc[2].y ) ) / 8; - - gray_render_line( RAS_VAR_ mid_x, mid_y ); - gray_render_line( RAS_VAR_ to_x, to_y ); - top --; - arc -= 3; - } + arc -= 3; } - - return; } - static int gray_move_to( const FT_Vector* to, PWorker worker ) @@ -1189,7 +1180,7 @@ /* first of all, compute the scanline offset */ p = (unsigned char*)map->buffer - y * map->pitch; if ( map->pitch >= 0 ) - p += ( map->rows - 1 ) * map->pitch; + p += (unsigned)( ( map->rows - 1 ) * map->pitch ); for ( ; count > 0; count--, spans++ ) { @@ -1759,25 +1750,6 @@ ras.count_ex = ras.max_ex - ras.min_ex; ras.count_ey = ras.max_ey - ras.min_ey; - /* simple heuristic used to speed up the bezier decomposition -- see */ - /* the code in gray_render_conic() and gray_render_cubic() for more */ - /* details */ - ras.conic_level = 32; - ras.cubic_level = 16; - - { - int level = 0; - - - if ( ras.count_ex > 24 || ras.count_ey > 24 ) - level++; - if ( ras.count_ex > 120 || ras.count_ey > 120 ) - level++; - - ras.conic_level <<= level; - ras.cubic_level <<= level; - } - /* set up vertical bands */ num_bands = (int)( ( ras.max_ey - ras.min_ey ) / ras.band_size ); if ( num_bands == 0 ) @@ -2003,14 +1975,14 @@ FT_UNUSED( raster ); } -#else /* _STANDALONE_ */ +#else /* !_STANDALONE_ */ static int gray_raster_new( FT_Memory memory, FT_Raster* araster ) { FT_Error error; - PRaster raster; + PRaster raster = NULL; *araster = 0; @@ -2033,7 +2005,7 @@ FT_FREE( raster ); } -#endif /* _STANDALONE_ */ +#endif /* !_STANDALONE_ */ static void diff --git a/reactos/lib/3rdparty/freetype/src/smooth/ftsmooth.c b/reactos/lib/3rdparty/freetype/src/smooth/ftsmooth.c index eed63531572..eb12f1802e8 100644 --- a/reactos/lib/3rdparty/freetype/src/smooth/ftsmooth.c +++ b/reactos/lib/3rdparty/freetype/src/smooth/ftsmooth.c @@ -4,7 +4,7 @@ /* */ /* Anti-aliasing renderer interface (body). */ /* */ -/* Copyright 2000-2001, 2002, 2003, 2004, 2005, 2006, 2009 by */ +/* Copyright 2000-2001, 2002, 2003, 2004, 2005, 2006, 2009, 2010 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -140,8 +140,26 @@ cbox.xMax = FT_PIX_CEIL( cbox.xMax ); cbox.yMax = FT_PIX_CEIL( cbox.yMax ); - width = (FT_UInt)( ( cbox.xMax - cbox.xMin ) >> 6 ); - height = (FT_UInt)( ( cbox.yMax - cbox.yMin ) >> 6 ); + if ( cbox.xMin < 0 && cbox.xMax > FT_INT_MAX + cbox.xMin ) + { + FT_ERROR(( "ft_smooth_render_generic: glyph too large:" + " xMin = %d, xMax = %d\n", + cbox.xMin >> 6, cbox.xMax >> 6 )); + return Smooth_Err_Raster_Overflow; + } + else + width = (FT_UInt)( ( cbox.xMax - cbox.xMin ) >> 6 ); + + if ( cbox.yMin < 0 && cbox.yMax > FT_INT_MAX + cbox.yMin ) + { + FT_ERROR(( "ft_smooth_render_generic: glyph too large:" + " yMin = %d, yMax = %d\n", + cbox.yMin >> 6, cbox.yMax >> 6 )); + return Smooth_Err_Raster_Overflow; + } + else + height = (FT_UInt)( ( cbox.yMax - cbox.yMin ) >> 6 ); + bitmap = &slot->bitmap; memory = render->root.memory; @@ -200,9 +218,9 @@ /* Required check is ( pitch * height < FT_ULONG_MAX ), */ /* but we care realistic cases only. Always pitch <= width. */ - if ( width > 0xFFFFU || height > 0xFFFFU ) + if ( width > 0x7FFFU || height > 0x7FFFU ) { - FT_ERROR(( "ft_smooth_render_generic: glyph too large: %d x %d\n", + FT_ERROR(( "ft_smooth_render_generic: glyph too large: %u x %u\n", width, height )); return Smooth_Err_Raster_Overflow; } diff --git a/reactos/lib/3rdparty/freetype/src/smooth/ftspic.c b/reactos/lib/3rdparty/freetype/src/smooth/ftspic.c index aa547fceb6d..7adaab17d2f 100644 --- a/reactos/lib/3rdparty/freetype/src/smooth/ftspic.c +++ b/reactos/lib/3rdparty/freetype/src/smooth/ftspic.c @@ -4,7 +4,7 @@ /* */ /* The FreeType position independent code services for smooth module. */ /* */ -/* Copyright 2009 by */ +/* Copyright 2009, 2010 by */ /* Oran Agra and Mickey Gabel. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -43,12 +43,13 @@ FT_Error - ft_smooth_renderer_class_pic_init( FT_Library library ) + ft_smooth_renderer_class_pic_init( FT_Library library ) { - FT_PIC_Container* pic_container = &library->pic_container; - FT_Error error = FT_Err_Ok; - SmoothPIC* container; - FT_Memory memory = library->memory; + FT_PIC_Container* pic_container = &library->pic_container; + FT_Error error = Smooth_Err_Ok; + SmoothPIC* container; + FT_Memory memory = library->memory; + /* since this function also serve smooth_lcd and smooth_lcdv renderers, it implements reference counting */ diff --git a/reactos/lib/3rdparty/freetype/src/tools/apinames.c b/reactos/lib/3rdparty/freetype/src/tools/apinames.c index 7f191e19c91..99e3028c934 100644 --- a/reactos/lib/3rdparty/freetype/src/tools/apinames.c +++ b/reactos/lib/3rdparty/freetype/src/tools/apinames.c @@ -10,7 +10,7 @@ * accepted if you are using GCC for compilation (and probably by * other compilers too). * - * Author: David Turner, 2005, 2006, 2008, 2009 + * Author: David Turner, 2005, 2006, 2008, 2009, 2010 * * This code is explicitly placed into the public domain. * @@ -126,6 +126,7 @@ names_dump( FILE* out, { int nn; + switch ( format ) { case OUTPUT_WINDOWS_DEF: @@ -151,22 +152,25 @@ names_dump( FILE* out, case OUTPUT_WATCOM_LBC: { /* we must omit the .dll suffix from the library name */ - char temp[512]; - char* dot; + char temp[512]; + const char* dot; + if ( dll_name == NULL ) { fprintf( stderr, - "you must provide a DLL name with the -d option !!\n" ); - exit(4); + "you must provide a DLL name with the -d option!\n" ); + exit( 4 ); } dot = strchr( dll_name, '.' ); if ( dot != NULL ) { - int len = (dot - dll_name); - if ( len > (int)(sizeof(temp)-1) ) - len = sizeof(temp)-1; + int len = dot - dll_name; + + + if ( len > (int)( sizeof( temp ) - 1 ) ) + len = sizeof ( temp ) - 1; memcpy( temp, dll_name, len ); temp[len] = 0; diff --git a/reactos/lib/3rdparty/freetype/src/truetype/ttgload.c b/reactos/lib/3rdparty/freetype/src/truetype/ttgload.c index 57ea0baa770..3a69b7be8d2 100644 --- a/reactos/lib/3rdparty/freetype/src/truetype/ttgload.c +++ b/reactos/lib/3rdparty/freetype/src/truetype/ttgload.c @@ -161,8 +161,31 @@ &top_bearing, &advance_height ); + loader->left_bearing = left_bearing; + loader->advance = advance_width; + loader->top_bearing = top_bearing; + loader->vadvance = advance_height; + + if ( !loader->linear_def ) + { + loader->linear_def = 1; + loader->linear = advance_width; + } + } + + #ifdef FT_CONFIG_OPTION_INCREMENTAL + static void + tt_get_metrics_incr_overrides( TT_Loader loader, + FT_UInt glyph_index ) + { + TT_Face face = (TT_Face)loader->face; + + FT_Short left_bearing = 0, top_bearing = 0; + FT_UShort advance_width = 0, advance_height = 0; + + /* If this is an incrementally loaded font check whether there are */ /* overriding metrics for this glyph. */ if ( face->root.internal->incremental_interface && @@ -172,9 +195,9 @@ FT_Error error; - metrics.bearing_x = left_bearing; + metrics.bearing_x = loader->left_bearing; metrics.bearing_y = 0; - metrics.advance = advance_width; + metrics.advance = loader->advance; metrics.advance_v = 0; error = face->root.internal->incremental_interface->funcs->get_glyph_metrics( @@ -190,8 +213,8 @@ /* GWW: Do I do the same for vertical metrics? */ metrics.bearing_x = 0; - metrics.bearing_y = top_bearing; - metrics.advance = advance_height; + metrics.bearing_y = loader->top_bearing; + metrics.advance = loader->vadvance; error = face->root.internal->incremental_interface->funcs->get_glyph_metrics( face->root.internal->incremental_interface->object, @@ -204,24 +227,24 @@ #endif /* 0 */ + loader->left_bearing = left_bearing; + loader->advance = advance_width; + loader->top_bearing = top_bearing; + loader->vadvance = advance_height; + + if ( !loader->linear_def ) + { + loader->linear_def = 1; + loader->linear = advance_width; + } } Exit: + return; + } #endif /* FT_CONFIG_OPTION_INCREMENTAL */ - loader->left_bearing = left_bearing; - loader->advance = advance_width; - loader->top_bearing = top_bearing; - loader->vadvance = advance_height; - - if ( !loader->linear_def ) - { - loader->linear_def = 1; - loader->linear = advance_width; - } - } - /*************************************************************************/ /* */ @@ -271,7 +294,7 @@ FT_UNUSED( glyph_index ); - FT_TRACE5(( "Glyph %ld\n", glyph_index )); + FT_TRACE4(( "Glyph %ld\n", glyph_index )); /* the following line sets the `error' variable through macros! */ if ( FT_STREAM_SEEK( offset ) || FT_FRAME_ENTER( byte_count ) ) @@ -367,7 +390,7 @@ if ( cont[0] <= prev_cont ) { /* unordered contours: this is invalid */ - error = FT_Err_Invalid_Table; + error = TT_Err_Invalid_Table; goto Fail; } prev_cont = cont[0]; @@ -1118,7 +1141,8 @@ { FT_Stream stream = loader->stream; - FT_UShort n_ins; + FT_UShort n_ins, max_ins; + FT_ULong tmp; /* TT_Load_Composite_Glyph only gives us the offset of instructions */ @@ -1130,12 +1154,27 @@ FT_TRACE5(( " Instructions size = %d\n", n_ins )); /* check it */ - if ( n_ins > ((TT_Face)loader->face)->max_profile.maxSizeOfInstructions ) + max_ins = ((TT_Face)loader->face)->max_profile.maxSizeOfInstructions; + if ( n_ins > max_ins ) { - FT_TRACE0(( "TT_Process_Composite_Glyph: too many instructions (%d)\n", - n_ins )); + /* acroread ignores this field, so we only do a rough safety check */ + if ( (FT_Int)n_ins > loader->byte_len ) + { + FT_TRACE1(( "TT_Process_Composite_Glyph: " + "too many instructions (%d) for glyph with length %d\n", + n_ins, loader->byte_len )); + return TT_Err_Too_Many_Hints; + } - return TT_Err_Too_Many_Hints; + tmp = loader->exec->glyphSize; + error = Update_Max( loader->exec->memory, + &tmp, + sizeof ( FT_Byte ), + (void*)&loader->exec->glyphIns, + n_ins ); + loader->exec->glyphSize = (FT_UShort)tmp; + if ( error ) + return error; } else if ( n_ins == 0 ) return TT_Err_Ok; @@ -1316,8 +1355,14 @@ if ( header_only ) goto Exit; + /* must initialize points before (possibly) overriding */ + /* glyph metrics from the incremental interface */ TT_LOADER_SET_PP( loader ); +#ifdef FT_CONFIG_OPTION_INCREMENTAL + tt_get_metrics_incr_overrides( loader, glyph_index ); +#endif + #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT if ( ((TT_Face)(loader->face))->doblend ) @@ -1353,8 +1398,14 @@ goto Exit; } + /* must initialize points before (possibly) overriding */ + /* glyph metrics from the incremental interface */ TT_LOADER_SET_PP( loader ); +#ifdef FT_CONFIG_OPTION_INCREMENTAL + tt_get_metrics_incr_overrides( loader, glyph_index ); +#endif + /***********************************************************************/ /***********************************************************************/ /***********************************************************************/ @@ -1481,6 +1532,7 @@ FT_UInt num_base_subgs = gloader->base.num_subglyphs; FT_Stream old_stream = loader->stream; + FT_Int old_byte_len = loader->byte_len; FT_GlyphLoader_Add( gloader ); @@ -1535,7 +1587,8 @@ num_base_points ); } - loader->stream = old_stream; + loader->stream = old_stream; + loader->byte_len = old_byte_len; /* process the glyph */ loader->ins_pos = ins_pos; @@ -1857,6 +1910,9 @@ FT_UInt i; + FT_TRACE4(( "tt_loader_init: grayscale change," + " re-executing `prep' table\n" )); + exec->grayscale = grayscale; for ( i = 0; i < size->cvt_size; i++ ) @@ -2031,9 +2087,11 @@ glyph->outline = loader.gloader->base.outline; glyph->outline.flags &= ~FT_OUTLINE_SINGLE_PASS; - /* In case bit 1 of the `flags' field in the `head' table isn't */ - /* set, translate array so that (0,0) is the glyph's origin. */ - if ( ( face->header.Flags & 2 ) == 0 && loader.pp1.x ) + /* Translate array so that (0,0) is the glyph's origin. Note */ + /* that this behaviour is independent on the value of bit 1 of */ + /* the `flags' field in the `head' table -- at least major */ + /* applications like Acroread indicate that. */ + if ( loader.pp1.x ) FT_Outline_Translate( &glyph->outline, -loader.pp1.x, 0 ); } diff --git a/reactos/lib/3rdparty/freetype/src/truetype/ttgxvar.c b/reactos/lib/3rdparty/freetype/src/truetype/ttgxvar.c index ef25aafb5bf..47bb9fcca44 100644 --- a/reactos/lib/3rdparty/freetype/src/truetype/ttgxvar.c +++ b/reactos/lib/3rdparty/freetype/src/truetype/ttgxvar.c @@ -4,7 +4,7 @@ /* */ /* TrueType GX Font Variation loader */ /* */ -/* Copyright 2004, 2005, 2006, 2007, 2008, 2009 by */ +/* Copyright 2004, 2005, 2006, 2007, 2008, 2009, 2010 by */ /* David Turner, Robert Wilhelm, Werner Lemberg, and George Williams. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -130,7 +130,7 @@ FT_Int j; FT_Int first; FT_Memory memory = stream->memory; - FT_Error error = TT_Err_Ok; + FT_Error error = TT_Err_Ok; FT_UNUSED( error ); @@ -154,7 +154,7 @@ runcnt = runcnt & GX_PT_POINT_RUN_COUNT_MASK; first = points[i++] = FT_GET_USHORT(); - if ( runcnt < 1 ) + if ( runcnt < 1 || i + runcnt >= n ) goto Exit; /* first point not included in runcount */ @@ -165,7 +165,7 @@ { first = points[i++] = FT_GET_BYTE(); - if ( runcnt < 1 ) + if ( runcnt < 1 || i + runcnt >= n ) goto Exit; for ( j = 0; j < runcnt; ++j ) @@ -210,12 +210,12 @@ ft_var_readpackeddeltas( FT_Stream stream, FT_Offset delta_cnt ) { - FT_Short *deltas; + FT_Short *deltas = NULL; FT_UInt runcnt; FT_Offset i; FT_UInt j; FT_Memory memory = stream->memory; - FT_Error error = TT_Err_Ok; + FT_Error error = TT_Err_Ok; FT_UNUSED( error ); @@ -682,7 +682,11 @@ if ( fvar_head.version != (FT_Long)0x00010000L || fvar_head.countSizePairs != 2 || fvar_head.axisSize != 20 || + /* axisCount limit implied by 16-bit instanceSize */ + fvar_head.axisCount > 0x3FFE || fvar_head.instanceSize != 4 + 4 * fvar_head.axisCount || + /* instanceCount limit implied by limited range of name IDs */ + fvar_head.instanceCount > 0x7EFF || fvar_head.offsetToData + fvar_head.axisCount * 20U + fvar_head.instanceCount * fvar_head.instanceSize > table_len ) { @@ -693,7 +697,7 @@ if ( FT_NEW( face->blend ) ) goto Exit; - /* XXX: TODO - check for overflows */ + /* cannot overflow 32-bit arithmetic because of limits above */ face->blend->mmvar_len = sizeof ( FT_MM_Var ) + fvar_head.axisCount * sizeof ( FT_Var_Axis ) + diff --git a/reactos/lib/3rdparty/freetype/src/truetype/ttinterp.c b/reactos/lib/3rdparty/freetype/src/truetype/ttinterp.c index 13aa9a27c4c..f55b8eeabfe 100644 --- a/reactos/lib/3rdparty/freetype/src/truetype/ttinterp.c +++ b/reactos/lib/3rdparty/freetype/src/truetype/ttinterp.c @@ -4,8 +4,9 @@ /* */ /* TrueType bytecode interpreter (body). */ /* */ -/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, */ +/* 2010 */ +/* by David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ /* modified, and distributed under the terms of the FreeType project */ @@ -223,9 +224,10 @@ /*************************************************************************/ /* */ - /* A simple bounds-checking macro. */ + /* Two simple bounds-checking macros. */ /* */ -#define BOUNDS( x, n ) ( (FT_UInt)(x) >= (FT_UInt)(n) ) +#define BOUNDS( x, n ) ( (FT_UInt)(x) >= (FT_UInt)(n) ) +#define BOUNDSL( x, n ) ( (FT_ULong)(x) >= (FT_ULong)(n) ) #undef SUCCESS #define SUCCESS 0 @@ -476,8 +478,7 @@ return TT_Err_Ok; Fail_Memory: - FT_ERROR(( "Init_Context: not enough memory for 0x%08lx\n", - (FT_Long)exec )); + FT_ERROR(( "Init_Context: not enough memory for %p\n", exec )); TT_Done_Context( exec ); return error; @@ -508,7 +509,7 @@ /* */ /* FreeType error code. 0 means success. */ /* */ - static FT_Error + FT_LOCAL_DEF( FT_Error ) Update_Max( FT_Memory memory, FT_ULong* size, FT_Long multiplier, @@ -594,6 +595,12 @@ exec->storage = size->storage; exec->twilight = size->twilight; + + /* In case of multi-threading it can happen that the old size object */ + /* no longer exists, thus we must clear all glyph zone references. */ + ft_memset( &exec->zp0, 0, sizeof ( exec->zp0 ) ); + exec->zp1 = exec->zp0; + exec->zp2 = exec->zp0; } /* XXX: We reserve a little more elements on the stack to deal safely */ @@ -1111,6 +1118,287 @@ }; +#ifdef FT_DEBUG_LEVEL_TRACE + + static + const char* const opcode_name[256] = + { + "SVTCA y", + "SVTCA x", + "SPvTCA y", + "SPvTCA x", + "SFvTCA y", + "SFvTCA x", + "SPvTL ||", + "SPvTL +", + "SFvTL ||", + "SFvTL +", + "SPvFS", + "SFvFS", + "GPV", + "GFV", + "SFvTPv", + "ISECT", + + "SRP0", + "SRP1", + "SRP2", + "SZP0", + "SZP1", + "SZP2", + "SZPS", + "SLOOP", + "RTG", + "RTHG", + "SMD", + "ELSE", + "JMPR", + "SCvTCi", + "SSwCi", + "SSW", + + "DUP", + "POP", + "CLEAR", + "SWAP", + "DEPTH", + "CINDEX", + "MINDEX", + "AlignPTS", + "INS_$28", + "UTP", + "LOOPCALL", + "CALL", + "FDEF", + "ENDF", + "MDAP[0]", + "MDAP[1]", + + "IUP[0]", + "IUP[1]", + "SHP[0]", + "SHP[1]", + "SHC[0]", + "SHC[1]", + "SHZ[0]", + "SHZ[1]", + "SHPIX", + "IP", + "MSIRP[0]", + "MSIRP[1]", + "AlignRP", + "RTDG", + "MIAP[0]", + "MIAP[1]", + + "NPushB", + "NPushW", + "WS", + "RS", + "WCvtP", + "RCvt", + "GC[0]", + "GC[1]", + "SCFS", + "MD[0]", + "MD[1]", + "MPPEM", + "MPS", + "FlipON", + "FlipOFF", + "DEBUG", + + "LT", + "LTEQ", + "GT", + "GTEQ", + "EQ", + "NEQ", + "ODD", + "EVEN", + "IF", + "EIF", + "AND", + "OR", + "NOT", + "DeltaP1", + "SDB", + "SDS", + + "ADD", + "SUB", + "DIV", + "MUL", + "ABS", + "NEG", + "FLOOR", + "CEILING", + "ROUND[0]", + "ROUND[1]", + "ROUND[2]", + "ROUND[3]", + "NROUND[0]", + "NROUND[1]", + "NROUND[2]", + "NROUND[3]", + + "WCvtF", + "DeltaP2", + "DeltaP3", + "DeltaCn[0]", + "DeltaCn[1]", + "DeltaCn[2]", + "SROUND", + "S45Round", + "JROT", + "JROF", + "ROFF", + "INS_$7B", + "RUTG", + "RDTG", + "SANGW", + "AA", + + "FlipPT", + "FlipRgON", + "FlipRgOFF", + "INS_$83", + "INS_$84", + "ScanCTRL", + "SDVPTL[0]", + "SDVPTL[1]", + "GetINFO", + "IDEF", + "ROLL", + "MAX", + "MIN", + "ScanTYPE", + "InstCTRL", + "INS_$8F", + + "INS_$90", + "INS_$91", + "INS_$92", + "INS_$93", + "INS_$94", + "INS_$95", + "INS_$96", + "INS_$97", + "INS_$98", + "INS_$99", + "INS_$9A", + "INS_$9B", + "INS_$9C", + "INS_$9D", + "INS_$9E", + "INS_$9F", + + "INS_$A0", + "INS_$A1", + "INS_$A2", + "INS_$A3", + "INS_$A4", + "INS_$A5", + "INS_$A6", + "INS_$A7", + "INS_$A8", + "INS_$A9", + "INS_$AA", + "INS_$AB", + "INS_$AC", + "INS_$AD", + "INS_$AE", + "INS_$AF", + + "PushB[0]", + "PushB[1]", + "PushB[2]", + "PushB[3]", + "PushB[4]", + "PushB[5]", + "PushB[6]", + "PushB[7]", + "PushW[0]", + "PushW[1]", + "PushW[2]", + "PushW[3]", + "PushW[4]", + "PushW[5]", + "PushW[6]", + "PushW[7]", + + "MDRP[00]", + "MDRP[01]", + "MDRP[02]", + "MDRP[03]", + "MDRP[04]", + "MDRP[05]", + "MDRP[06]", + "MDRP[07]", + "MDRP[08]", + "MDRP[09]", + "MDRP[10]", + "MDRP[11]", + "MDRP[12]", + "MDRP[13]", + "MDRP[14]", + "MDRP[15]", + + "MDRP[16]", + "MDRP[17]", + "MDRP[18]", + "MDRP[19]", + "MDRP[20]", + "MDRP[21]", + "MDRP[22]", + "MDRP[23]", + "MDRP[24]", + "MDRP[25]", + "MDRP[26]", + "MDRP[27]", + "MDRP[28]", + "MDRP[29]", + "MDRP[30]", + "MDRP[31]", + + "MIRP[00]", + "MIRP[01]", + "MIRP[02]", + "MIRP[03]", + "MIRP[04]", + "MIRP[05]", + "MIRP[06]", + "MIRP[07]", + "MIRP[08]", + "MIRP[09]", + "MIRP[10]", + "MIRP[11]", + "MIRP[12]", + "MIRP[13]", + "MIRP[14]", + "MIRP[15]", + + "MIRP[16]", + "MIRP[17]", + "MIRP[18]", + "MIRP[19]", + "MIRP[20]", + "MIRP[21]", + "MIRP[22]", + "MIRP[23]", + "MIRP[24]", + "MIRP[25]", + "MIRP[26]", + "MIRP[27]", + "MIRP[28]", + "MIRP[29]", + "MIRP[30]", + "MIRP[31]" + }; + +#endif /* FT_DEBUG_LEVEL_TRACE */ + + static const FT_Char opcode_length[256] = { @@ -1727,7 +2015,8 @@ if ( distance && val < 0 ) val = 0; } - else { + else + { val = distance - compensation; if ( val > 0 ) val = 0; @@ -2892,24 +3181,30 @@ } -#define DO_JROT \ - if ( args[1] != 0 ) \ - { \ - CUR.IP += args[0]; \ - CUR.step_ins = FALSE; \ +#define DO_JROT \ + if ( args[1] != 0 ) \ + { \ + CUR.IP += args[0]; \ + if ( CUR.IP < 0 ) \ + CUR.error = TT_Err_Bad_Argument; \ + CUR.step_ins = FALSE; \ } -#define DO_JMPR \ - CUR.IP += args[0]; \ +#define DO_JMPR \ + CUR.IP += args[0]; \ + if ( CUR.IP < 0 ) \ + CUR.error = TT_Err_Bad_Argument; \ CUR.step_ins = FALSE; -#define DO_JROF \ - if ( args[1] == 0 ) \ - { \ - CUR.IP += args[0]; \ - CUR.step_ins = FALSE; \ +#define DO_JROF \ + if ( args[1] == 0 ) \ + { \ + CUR.IP += args[0]; \ + if ( CUR.IP < 0 ) \ + CUR.error = TT_Err_Bad_Argument; \ + CUR.step_ins = FALSE; \ } @@ -2992,39 +3287,39 @@ args[0] = FT_PIX_CEIL( args[0] ); -#define DO_RS \ - { \ - FT_ULong I = (FT_ULong)args[0]; \ - \ - \ - if ( BOUNDS( I, CUR.storeSize ) ) \ - { \ - if ( CUR.pedantic_hinting ) \ - { \ - ARRAY_BOUND_ERROR; \ - } \ - else \ - args[0] = 0; \ - } \ - else \ - args[0] = CUR.storage[I]; \ +#define DO_RS \ + { \ + FT_ULong I = (FT_ULong)args[0]; \ + \ + \ + if ( BOUNDSL( I, CUR.storeSize ) ) \ + { \ + if ( CUR.pedantic_hinting ) \ + { \ + ARRAY_BOUND_ERROR; \ + } \ + else \ + args[0] = 0; \ + } \ + else \ + args[0] = CUR.storage[I]; \ } -#define DO_WS \ - { \ - FT_ULong I = (FT_ULong)args[0]; \ - \ - \ - if ( BOUNDS( I, CUR.storeSize ) ) \ - { \ - if ( CUR.pedantic_hinting ) \ - { \ - ARRAY_BOUND_ERROR; \ - } \ - } \ - else \ - CUR.storage[I] = args[1]; \ +#define DO_WS \ + { \ + FT_ULong I = (FT_ULong)args[0]; \ + \ + \ + if ( BOUNDSL( I, CUR.storeSize ) ) \ + { \ + if ( CUR.pedantic_hinting ) \ + { \ + ARRAY_BOUND_ERROR; \ + } \ + } \ + else \ + CUR.storage[I] = args[1]; \ } @@ -3033,7 +3328,7 @@ FT_ULong I = (FT_ULong)args[0]; \ \ \ - if ( BOUNDS( I, CUR.cvtSize ) ) \ + if ( BOUNDSL( I, CUR.cvtSize ) ) \ { \ if ( CUR.pedantic_hinting ) \ { \ @@ -3052,7 +3347,7 @@ FT_ULong I = (FT_ULong)args[0]; \ \ \ - if ( BOUNDS( I, CUR.cvtSize ) ) \ + if ( BOUNDSL( I, CUR.cvtSize ) ) \ { \ if ( CUR.pedantic_hinting ) \ { \ @@ -3069,7 +3364,7 @@ FT_ULong I = (FT_ULong)args[0]; \ \ \ - if ( BOUNDS( I, CUR.cvtSize ) ) \ + if ( BOUNDSL( I, CUR.cvtSize ) ) \ { \ if ( CUR.pedantic_hinting ) \ { \ @@ -4390,7 +4685,7 @@ /* first of all, check the index */ F = args[0]; - if ( BOUNDS( F, CUR.maxFunc + 1 ) ) + if ( BOUNDSL( F, CUR.maxFunc + 1 ) ) goto Fail; /* Except for some old Apple fonts, all functions in a TrueType */ @@ -4466,7 +4761,7 @@ /* first of all, check the index */ F = args[1]; - if ( BOUNDS( F, CUR.maxFunc + 1 ) ) + if ( BOUNDSL( F, CUR.maxFunc + 1 ) ) goto Fail; /* Except for some old Apple fonts, all functions in a TrueType */ @@ -4569,7 +4864,7 @@ } def->opc = (FT_Byte)args[0]; - def->start = CUR.IP+1; + def->start = CUR.IP + 1; def->range = CUR.curRange; def->active = TRUE; @@ -4741,7 +5036,7 @@ L = (FT_ULong)args[0]; - if ( BOUNDS( L, CUR.zp2.n_points ) ) + if ( BOUNDSL( L, CUR.zp2.n_points ) ) { if ( CUR.pedantic_hinting ) { @@ -4825,8 +5120,8 @@ K = (FT_UShort)args[1]; L = (FT_UShort)args[0]; - if( BOUNDS( L, CUR.zp0.n_points ) || - BOUNDS( K, CUR.zp1.n_points ) ) + if ( BOUNDS( L, CUR.zp0.n_points ) || + BOUNDS( K, CUR.zp1.n_points ) ) { if ( CUR.pedantic_hinting ) { @@ -5480,12 +5775,12 @@ static void Ins_SHZ( INS_ARG ) { - TT_GlyphZoneRec zp; - FT_UShort refp; - FT_F26Dot6 dx, - dy; + TT_GlyphZoneRec zp; + FT_UShort refp; + FT_F26Dot6 dx, + dy; - FT_UShort last_point, i; + FT_UShort last_point, i; if ( BOUNDS( args[0], 2 ) ) @@ -5505,7 +5800,16 @@ if ( CUR.GS.gep2 == 0 && CUR.zp2.n_points > 0 ) last_point = (FT_UShort)( CUR.zp2.n_points - 1 ); else if ( CUR.GS.gep2 == 1 && CUR.zp2.n_contours > 0 ) + { last_point = (FT_UShort)( CUR.zp2.contours[CUR.zp2.n_contours - 1] ); + + if ( BOUNDS( last_point, CUR.zp2.n_points ) ) + { + if ( CUR.pedantic_hinting ) + CUR.error = TT_Err_Invalid_Reference; + return; + } + } else last_point = 0; @@ -5687,8 +5991,8 @@ cvtEntry = (FT_ULong)args[1]; point = (FT_UShort)args[0]; - if ( BOUNDS( point, CUR.zp0.n_points ) || - BOUNDS( cvtEntry, CUR.cvtSize ) ) + if ( BOUNDS( point, CUR.zp0.n_points ) || + BOUNDSL( cvtEntry, CUR.cvtSize ) ) { if ( CUR.pedantic_hinting ) CUR.error = TT_Err_Invalid_Reference; @@ -5880,7 +6184,7 @@ /* XXX: UNDOCUMENTED! cvt[-1] = 0 always */ if ( BOUNDS( point, CUR.zp1.n_points ) || - BOUNDS( cvtEntry, CUR.cvtSize + 1 ) || + BOUNDSL( cvtEntry, CUR.cvtSize + 1 ) || BOUNDS( CUR.GS.rp0, CUR.zp0.n_points ) ) { if ( CUR.pedantic_hinting ) @@ -6131,8 +6435,8 @@ p1 = (FT_UShort)args[0]; p2 = (FT_UShort)args[1]; - if ( BOUNDS( args[0], CUR.zp1.n_points ) || - BOUNDS( args[1], CUR.zp0.n_points ) ) + if ( BOUNDS( p1, CUR.zp1.n_points ) || + BOUNDS( p2, CUR.zp0.n_points ) ) { if ( CUR.pedantic_hinting ) CUR.error = TT_Err_Invalid_Reference; @@ -6466,8 +6770,8 @@ end_point = CUR.pts.contours[contour] - CUR.pts.first_point; first_point = point; - if ( CUR.pts.n_points <= end_point ) - end_point = CUR.pts.n_points; + if ( BOUNDS ( end_point, CUR.pts.n_points ) ) + end_point = CUR.pts.n_points - 1; while ( point <= end_point && ( CUR.pts.tags[point] & mask ) == 0 ) point++; @@ -6483,12 +6787,11 @@ { if ( ( CUR.pts.tags[point] & mask ) != 0 ) { - if ( point > 0 ) - _iup_worker_interpolate( &V, - cur_touched + 1, - point - 1, - cur_touched, - point ); + _iup_worker_interpolate( &V, + cur_touched + 1, + point - 1, + cur_touched, + point ); cur_touched = point; } @@ -6661,7 +6964,7 @@ A = (FT_ULong)CUR.stack[CUR.args + 1]; B = CUR.stack[CUR.args]; - if ( BOUNDS( A, CUR.cvtSize ) ) + if ( BOUNDSL( A, CUR.cvtSize ) ) { if ( CUR.pedantic_hinting ) { @@ -6771,7 +7074,7 @@ call = CUR.callStack + CUR.callTop++; call->Caller_Range = CUR.curRange; - call->Caller_IP = CUR.IP+1; + call->Caller_IP = CUR.IP + 1; call->Cur_Count = 1; call->Cur_Restart = def->start; @@ -7140,6 +7443,10 @@ { CUR.opcode = CUR.code[CUR.IP]; + FT_TRACE7(( " " )); + FT_TRACE7(( opcode_name[CUR.opcode] )); + FT_TRACE7(( "\n" )); + if ( ( CUR.length = opcode_length[CUR.opcode] ) < 0 ) { if ( CUR.IP + 1 > CUR.codeSize ) @@ -7834,6 +8141,15 @@ *exc = cur; #endif + /* If any errors have occurred, function tables may be broken. */ + /* Force a re-execution of `prep' and `fpgm' tables if no */ + /* bytecode debugger is run. */ + if ( CUR.error && !CUR.instruction_trap ) + { + FT_TRACE1(( " The interpreter returned error 0x%x\n", CUR.error )); + exc->size->cvt_ready = FALSE; + } + return CUR.error; } diff --git a/reactos/lib/3rdparty/freetype/src/truetype/ttinterp.h b/reactos/lib/3rdparty/freetype/src/truetype/ttinterp.h index 07a8972cb3d..c480dfa506e 100644 --- a/reactos/lib/3rdparty/freetype/src/truetype/ttinterp.h +++ b/reactos/lib/3rdparty/freetype/src/truetype/ttinterp.h @@ -4,7 +4,7 @@ /* */ /* TrueType bytecode interpreter (specification). */ /* */ -/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007 by */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2010 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -150,7 +150,7 @@ FT_BEGIN_HEADER FT_Bool step_ins; /* true if the interpreter must */ /* increment IP after ins. exec */ - FT_Long cvtSize; + FT_ULong cvtSize; FT_Long* cvt; FT_UInt glyphSize; /* glyph instructions buffer size */ @@ -239,6 +239,14 @@ FT_BEGIN_HEADER FT_Int range ); + FT_LOCAL( FT_Error ) + Update_Max( FT_Memory memory, + FT_ULong* size, + FT_Long multiplier, + void* _pbuff, + FT_ULong new_max ); + + /*************************************************************************/ /* */ /* */ diff --git a/reactos/lib/3rdparty/freetype/src/truetype/ttobjs.c b/reactos/lib/3rdparty/freetype/src/truetype/ttobjs.c index 11d662d2d49..8fe86ad10ee 100644 --- a/reactos/lib/3rdparty/freetype/src/truetype/ttobjs.c +++ b/reactos/lib/3rdparty/freetype/src/truetype/ttobjs.c @@ -4,7 +4,8 @@ /* */ /* Objects manager (body). */ /* */ -/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 by */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, */ +/* 2010 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -146,28 +147,28 @@ /* This list shall be expanded as we find more of them. */ static FT_Bool - tt_check_trickyness( FT_String* name ) + tt_check_trickyness_family( FT_String* name ) { + #define TRICK_NAMES_MAX_CHARACTERS 16 -#define TRICK_NAMES_COUNT 7 - static const char trick_names[TRICK_NAMES_COUNT][TRICK_NAMES_MAX_CHARACTERS+1] = +#define TRICK_NAMES_COUNT 8 + + static const char trick_names[TRICK_NAMES_COUNT] + [TRICK_NAMES_MAX_CHARACTERS + 1] = { "DFKaiSho-SB", /* dfkaisb.ttf */ "DFKaiShu", "DFKai-SB", /* kaiu.ttf */ + "HuaTianKaiTi?", /* htkt2.ttf */ "HuaTianSongTi?", /* htst3.ttf */ "MingLiU", /* mingliu.ttf & mingliu.ttc */ "PMingLiU", /* mingliu.ttc */ "MingLi43", /* mingli.ttf */ }; + int nn; - if ( !name ) - return FALSE; - - /* Note that we only check the face name at the moment; it might */ - /* be worth to do more checks for a few special cases. */ for ( nn = 0; nn < TRICK_NAMES_COUNT; nn++ ) if ( ft_strstr( name, trick_names[nn] ) ) return TRUE; @@ -176,6 +177,181 @@ } + /* XXX: This function should be in the `sfnt' module. */ + + /* Some PDF generators clear the checksums in the TrueType header table. */ + /* For example, Quartz ContextPDF clears all entries, or Bullzip PDF */ + /* Printer clears the entries for subsetted subtables. We thus have to */ + /* recalculate the checksums where necessary. */ + + static FT_UInt32 + tt_synth_sfnt_checksum( FT_Stream stream, + FT_ULong length ) + { + FT_Error error; + FT_UInt32 checksum = 0; + int i; + + + if ( FT_FRAME_ENTER( length ) ) + return 0; + + for ( ; length > 3; length -= 4 ) + checksum += (FT_UInt32)FT_GET_ULONG(); + + for ( i = 3; length > 0; length --, i-- ) + checksum += (FT_UInt32)( FT_GET_BYTE() << ( i * 8 ) ); + + FT_FRAME_EXIT(); + + return checksum; + } + + + /* XXX: This function should be in the `sfnt' module. */ + + static FT_ULong + tt_get_sfnt_checksum( TT_Face face, + FT_UShort i ) + { + if ( face->dir_tables[i].CheckSum ) + return face->dir_tables[i].CheckSum; + + else if ( !face->goto_table ) + return 0; + + else if ( !face->goto_table( face, + face->dir_tables[i].Tag, + face->root.stream, + NULL ) ) + return 0; + + return (FT_ULong)tt_synth_sfnt_checksum( face->root.stream, + face->dir_tables[i].Length ); + } + + + typedef struct tt_sfnt_id_rec_ + { + FT_ULong CheckSum; + FT_ULong Length; + + } tt_sfnt_id_rec; + + + static FT_Bool + tt_check_trickyness_sfnt_ids( TT_Face face ) + { +#define TRICK_SFNT_IDS_PER_FACE 3 +#define TRICK_SFNT_IDS_NUM_FACES 5 + + static const tt_sfnt_id_rec sfnt_id[TRICK_SFNT_IDS_NUM_FACES] + [TRICK_SFNT_IDS_PER_FACE] = { + +#define TRICK_SFNT_ID_cvt 0 +#define TRICK_SFNT_ID_fpgm 1 +#define TRICK_SFNT_ID_prep 2 + + { /* MingLiU 1995 */ + { 0x05bcf058, 0x000002e4 }, /* cvt */ + { 0x28233bf1, 0x000087c4 }, /* fpgm */ + { 0xa344a1ea, 0x000001e1 } /* prep */ + }, + { /* MingLiU 1996- */ + { 0x05bcf058, 0x000002e4 }, /* cvt */ + { 0x28233bf1, 0x000087c4 }, /* fpgm */ + { 0xa344a1eb, 0x000001e1 } /* prep */ + }, + { /* DFKaiShu */ + { 0x11e5ead4, 0x00000350 }, /* cvt */ + { 0x5a30ca3b, 0x00009063 }, /* fpgm */ + { 0x13a42602, 0x0000007e } /* prep */ + }, + { /* HuaTianKaiTi */ + { 0xfffbfffc, 0x00000008 }, /* cvt */ + { 0x9c9e48b8, 0x0000bea2 }, /* fpgm */ + { 0x70020112, 0x00000008 } /* prep */ + }, + { /* HuaTianSongTi */ + { 0xfffbfffc, 0x00000008 }, /* cvt */ + { 0x0a5a0483, 0x00017c39 }, /* fpgm */ + { 0x70020112, 0x00000008 } /* prep */ + } + }; + + FT_ULong checksum; + int num_matched_ids[TRICK_SFNT_IDS_NUM_FACES]; + int i, j, k; + + + FT_MEM_SET( num_matched_ids, 0, + sizeof( int ) * TRICK_SFNT_IDS_NUM_FACES ); + + for ( i = 0; i < face->num_tables; i++ ) + { + checksum = 0; + + switch( face->dir_tables[i].Tag ) + { + case TTAG_cvt: + k = TRICK_SFNT_ID_cvt; + break; + + case TTAG_fpgm: + k = TRICK_SFNT_ID_fpgm; + break; + + case TTAG_prep: + k = TRICK_SFNT_ID_prep; + break; + + default: + continue; + } + + for ( j = 0; j < TRICK_SFNT_IDS_NUM_FACES; j++ ) + if ( face->dir_tables[i].Length == sfnt_id[j][k].Length ) + { + if ( !checksum ) + checksum = tt_get_sfnt_checksum( face, i ); + + if ( sfnt_id[j][k].CheckSum == checksum ) + num_matched_ids[j]++; + + if ( num_matched_ids[j] == TRICK_SFNT_IDS_PER_FACE ) + return TRUE; + } + } + + return FALSE; + } + + + static FT_Bool + tt_check_trickyness( FT_Face face ) + { + if ( !face ) + return FALSE; + + /* First, check the face name. */ + if ( face->family_name ) + { + if ( tt_check_trickyness_family( face->family_name ) ) + return TRUE; + else + return FALSE; + } + + /* Type42 fonts may lack `name' tables, we thus try to identify */ + /* tricky fonts by checking the checksums of Type42-persistent */ + /* sfnt tables (`cvt', `fpgm', and `prep'). */ + if ( tt_check_trickyness_sfnt_ids( (TT_Face)face ) ) + return TRUE; + + return FALSE; + } + + /*************************************************************************/ /* */ /* */ @@ -250,7 +426,7 @@ if ( error ) goto Exit; - if ( tt_check_trickyness( ttface->family_name ) ) + if ( tt_check_trickyness( ttface ) ) ttface->face_flags |= FT_FACE_FLAG_TRICKY; error = tt_face_load_hdmx( face, stream ); @@ -458,7 +634,11 @@ error = TT_Goto_CodeRange( exec, tt_coderange_font, 0 ); if ( !error ) + { + FT_TRACE4(( "Executing `fpgm' table.\n" )); + error = face->interpreter( exec ); + } } else error = TT_Err_Ok; @@ -520,7 +700,11 @@ error = TT_Goto_CodeRange( exec, tt_coderange_cvt, 0 ); if ( !error && !size->debug ) + { + FT_TRACE4(( "Executing `prep' table.\n" )); + error = face->interpreter( exec ); + } } else error = TT_Err_Ok; diff --git a/reactos/lib/3rdparty/freetype/src/truetype/ttpic.c b/reactos/lib/3rdparty/freetype/src/truetype/ttpic.c index 27ec4a1d5e5..5d725742c78 100644 --- a/reactos/lib/3rdparty/freetype/src/truetype/ttpic.c +++ b/reactos/lib/3rdparty/freetype/src/truetype/ttpic.c @@ -4,7 +4,7 @@ /* */ /* The FreeType position independent code services for truetype module. */ /* */ -/* Copyright 2009 by */ +/* Copyright 2009, 2010 by */ /* Oran Agra and Mickey Gabel. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -45,13 +45,15 @@ } } + FT_Error - tt_driver_class_pic_init( FT_Library library ) + tt_driver_class_pic_init( FT_Library library ) { - FT_PIC_Container* pic_container = &library->pic_container; - FT_Error error = FT_Err_Ok; - TTModulePIC* container; - FT_Memory memory = library->memory; + FT_PIC_Container* pic_container = &library->pic_container; + FT_Error error = TT_Err_Ok; + TTModulePIC* container; + FT_Memory memory = library->memory; + /* allocate pointer, clear and set global container pointer */ if ( FT_ALLOC ( container, sizeof ( *container ) ) ) diff --git a/reactos/lib/3rdparty/freetype/src/truetype/ttpload.c b/reactos/lib/3rdparty/freetype/src/truetype/ttpload.c index a311b03c00c..68a54531504 100644 --- a/reactos/lib/3rdparty/freetype/src/truetype/ttpload.c +++ b/reactos/lib/3rdparty/freetype/src/truetype/ttpload.c @@ -4,7 +4,7 @@ /* */ /* TrueType-specific tables loader (body). */ /* */ -/* Copyright 1996-2001, 2002, 2004, 2005, 2006, 2007, 2008, 2009 by */ +/* Copyright 1996-2001, 2002, 2004, 2005, 2006, 2007, 2008, 2009, 2010 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -137,6 +137,12 @@ dist = diff; } + if ( entry == limit ) + { + /* `loca' is the last table */ + dist = stream->size - pos; + } + if ( new_loca_len <= dist ) { face->num_locations = face->root.num_glyphs; @@ -203,6 +209,26 @@ } } + /* Check broken location data */ + if ( pos1 >= face->glyf_len ) + { + FT_TRACE1(( "tt_face_get_location:" + " too large offset=0x%08lx found for gid=0x%04lx," + " exceeding the end of glyf table (0x%08lx)\n", + pos1, gindex, face->glyf_len )); + *asize = 0; + return 0; + } + + if ( pos2 >= face->glyf_len ) + { + FT_TRACE1(( "tt_face_get_location:" + " too large offset=0x%08lx found for gid=0x%04lx," + " truncate at the end of glyf table (0x%08lx)\n", + pos2, gindex + 1, face->glyf_len )); + pos2 = face->glyf_len; + } + /* The `loca' table must be ordered; it refers to the length of */ /* an entry as the difference between the current and the next */ /* position. However, there do exist (malformed) fonts which */ @@ -287,7 +313,7 @@ FT_Short* limit = cur + face->cvt_size; - for ( ; cur < limit; cur++ ) + for ( ; cur < limit; cur++ ) *cur = FT_GET_SHORT(); } diff --git a/reactos/lib/3rdparty/freetype/src/type1/t1afm.c b/reactos/lib/3rdparty/freetype/src/type1/t1afm.c index ef343901a44..780ab33bf7e 100644 --- a/reactos/lib/3rdparty/freetype/src/type1/t1afm.c +++ b/reactos/lib/3rdparty/freetype/src/type1/t1afm.c @@ -4,7 +4,8 @@ /* */ /* AFM support for Type 1 fonts (body). */ /* */ -/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 by */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, */ +/* 2010 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -235,10 +236,10 @@ FT_Stream stream ) { PSAux_Service psaux; - FT_Memory memory = stream->memory; + FT_Memory memory = stream->memory; AFM_ParserRec parser; - AFM_FontInfo fi; - FT_Error error = T1_Err_Unknown_File_Format; + AFM_FontInfo fi = NULL; + FT_Error error = T1_Err_Unknown_File_Format; T1_Font t1_font = &( (T1_Face)t1_face )->type1; diff --git a/reactos/lib/3rdparty/freetype/src/type1/t1load.c b/reactos/lib/3rdparty/freetype/src/type1/t1load.c index d867e942c95..c9b6c1d0a20 100644 --- a/reactos/lib/3rdparty/freetype/src/type1/t1load.c +++ b/reactos/lib/3rdparty/freetype/src/type1/t1load.c @@ -4,7 +4,8 @@ /* */ /* Type 1 font loader (body). */ /* */ -/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 by */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, */ +/* 2010 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -1045,7 +1046,8 @@ if ( cur < limit && ft_isdigit( *cur ) ) { - *size = T1_ToInt( parser ); + FT_Long s = T1_ToInt( parser ); + T1_Skip_PS_Token( parser ); /* `RD' or `-|' or something else */ @@ -1053,8 +1055,12 @@ /* `RD' or `-|' token */ *base = parser->root.cursor + 1; - parser->root.cursor += *size + 1; - return !parser->root.error; + if ( s >= 0 && s < limit - *base ) + { + parser->root.cursor += s + 1; + *size = s; + return !parser->root.error; + } } FT_ERROR(( "read_binary_data: invalid size field\n" )); @@ -1111,7 +1117,7 @@ temp[2] = FT_DivFix( temp[2], temp_scale ); temp[4] = FT_DivFix( temp[4], temp_scale ); temp[5] = FT_DivFix( temp[5], temp_scale ); - temp[3] = 0x10000L; + temp[3] = temp[3] < 0 ? -0x10000L : 0x10000L; } matrix->xx = temp[0]; @@ -2180,7 +2186,7 @@ /* OK, we do the following: for each element in the encoding */ /* table, look up the index of the glyph having the same name */ /* the index is then stored in type1.encoding.char_index, and */ - /* a the name to type1.encoding.char_name */ + /* the name to type1.encoding.char_name */ min_char = 0; max_char = 0; diff --git a/reactos/lib/3rdparty/freetype/src/type1/t1objs.c b/reactos/lib/3rdparty/freetype/src/type1/t1objs.c index b1de6871967..58632109c74 100644 --- a/reactos/lib/3rdparty/freetype/src/type1/t1objs.c +++ b/reactos/lib/3rdparty/freetype/src/type1/t1objs.c @@ -494,14 +494,17 @@ charmap.face = root; /* first of all, try to synthesize a Unicode charmap */ - charmap.platform_id = 3; - charmap.encoding_id = 1; + charmap.platform_id = TT_PLATFORM_MICROSOFT; + charmap.encoding_id = TT_MS_ID_UNICODE_CS; charmap.encoding = FT_ENCODING_UNICODE; - FT_CMap_New( cmap_classes->unicode, NULL, &charmap, NULL ); + error = FT_CMap_New( cmap_classes->unicode, NULL, &charmap, NULL ); + if ( error && FT_Err_No_Unicode_Glyph_Name != error ) + goto Exit; + error = FT_Err_Ok; /* now, generate an Adobe Standard encoding when appropriate */ - charmap.platform_id = 7; + charmap.platform_id = TT_PLATFORM_ADOBE; clazz = NULL; switch ( type1->encoding_type ) @@ -535,7 +538,7 @@ } if ( clazz ) - FT_CMap_New( clazz, NULL, &charmap, NULL ); + error = FT_CMap_New( clazz, NULL, &charmap, NULL ); #if 0 /* Select default charmap */ diff --git a/reactos/lib/3rdparty/freetype/src/type42/t42objs.c b/reactos/lib/3rdparty/freetype/src/type42/t42objs.c index 9081ffc6d22..a5e0ee5e81f 100644 --- a/reactos/lib/3rdparty/freetype/src/type42/t42objs.c +++ b/reactos/lib/3rdparty/freetype/src/type42/t42objs.c @@ -21,6 +21,7 @@ #include "t42error.h" #include FT_INTERNAL_DEBUG_H #include FT_LIST_H +#include FT_TRUETYPE_IDS_H #undef FT_COMPONENT @@ -330,39 +331,42 @@ charmap.face = root; /* first of all, try to synthesize a Unicode charmap */ - charmap.platform_id = 3; - charmap.encoding_id = 1; + charmap.platform_id = TT_PLATFORM_MICROSOFT; + charmap.encoding_id = TT_MS_ID_UNICODE_CS; charmap.encoding = FT_ENCODING_UNICODE; - FT_CMap_New( cmap_classes->unicode, NULL, &charmap, NULL ); + error = FT_CMap_New( cmap_classes->unicode, NULL, &charmap, NULL ); + if ( error && FT_Err_No_Unicode_Glyph_Name != error ) + goto Exit; + error = FT_Err_Ok; /* now, generate an Adobe Standard encoding when appropriate */ - charmap.platform_id = 7; + charmap.platform_id = TT_PLATFORM_ADOBE; clazz = NULL; switch ( type1->encoding_type ) { case T1_ENCODING_TYPE_STANDARD: charmap.encoding = FT_ENCODING_ADOBE_STANDARD; - charmap.encoding_id = 0; + charmap.encoding_id = TT_ADOBE_ID_STANDARD; clazz = cmap_classes->standard; break; case T1_ENCODING_TYPE_EXPERT: charmap.encoding = FT_ENCODING_ADOBE_EXPERT; - charmap.encoding_id = 1; + charmap.encoding_id = TT_ADOBE_ID_EXPERT; clazz = cmap_classes->expert; break; case T1_ENCODING_TYPE_ARRAY: charmap.encoding = FT_ENCODING_ADOBE_CUSTOM; - charmap.encoding_id = 2; + charmap.encoding_id = TT_ADOBE_ID_CUSTOM; clazz = cmap_classes->custom; break; case T1_ENCODING_TYPE_ISOLATIN1: charmap.encoding = FT_ENCODING_ADOBE_LATIN_1; - charmap.encoding_id = 3; + charmap.encoding_id = TT_ADOBE_ID_LATIN_1; clazz = cmap_classes->unicode; break; @@ -371,7 +375,7 @@ } if ( clazz ) - FT_CMap_New( clazz, NULL, &charmap, NULL ); + error = FT_CMap_New( clazz, NULL, &charmap, NULL ); #if 0 /* Select default charmap */ diff --git a/reactos/lib/3rdparty/freetype/src/type42/t42parse.c b/reactos/lib/3rdparty/freetype/src/type42/t42parse.c index 13bda64c837..577426917bb 100644 --- a/reactos/lib/3rdparty/freetype/src/type42/t42parse.c +++ b/reactos/lib/3rdparty/freetype/src/type42/t42parse.c @@ -4,7 +4,7 @@ /* */ /* Type 42 font parser (body). */ /* */ -/* Copyright 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 by */ +/* Copyright 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 by */ /* Roberto Alameda. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -52,7 +52,8 @@ /* as Type42 fonts have no Private dict, */ /* we set the last argument of T1_FIELD_XXX to 0 */ static const - T1_FieldRec t42_keywords[] = { + T1_FieldRec t42_keywords[] = + { #undef FT_STRUCTURE #define FT_STRUCTURE T1_FontInfo @@ -268,7 +269,8 @@ temp_scale ) >> 16 ); /* we need to scale the values by 1.0/temp_scale */ - if ( temp_scale != 0x10000L ) { + if ( temp_scale != 0x10000L ) + { temp[0] = FT_DivFix( temp[0], temp_scale ); temp[1] = FT_DivFix( temp[1], temp_scale ); temp[2] = FT_DivFix( temp[2], temp_scale ); @@ -575,6 +577,12 @@ } string_size = T1_ToInt( parser ); + if ( string_size < 0 ) + { + FT_ERROR(( "t42_parse_sfnts: invalid string size\n" )); + error = T42_Err_Invalid_File_Format; + goto Fail; + } T1_Skip_PS_Token( parser ); /* `RD' */ if ( parser->root.error ) @@ -582,13 +590,14 @@ string_buf = parser->root.cursor + 1; /* one space after `RD' */ - parser->root.cursor += string_size + 1; - if ( parser->root.cursor >= limit ) + if ( limit - parser->root.cursor < string_size ) { FT_ERROR(( "t42_parse_sfnts: too many binary data\n" )); error = T42_Err_Invalid_File_Format; goto Fail; } + else + parser->root.cursor += string_size + 1; } if ( !string_buf ) diff --git a/reactos/lib/3rdparty/freetype/src/winfonts/winfnt.c b/reactos/lib/3rdparty/freetype/src/winfonts/winfnt.c index 6b3a4e17f20..ee17d16659b 100644 --- a/reactos/lib/3rdparty/freetype/src/winfonts/winfnt.c +++ b/reactos/lib/3rdparty/freetype/src/winfonts/winfnt.c @@ -4,7 +4,7 @@ /* */ /* FreeType font driver for Windows FNT/FON files */ /* */ -/* Copyright 1996-2001, 2002, 2003, 2004, 2006, 2007, 2008, 2009 by */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2006, 2007, 2008, 2009, 2010 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* Copyright 2003 Huw D M Davies for Codeweavers */ /* Copyright 2007 Dmitry Timoshkov for Codeweavers */ @@ -23,6 +23,7 @@ #include FT_INTERNAL_DEBUG_H #include FT_INTERNAL_STREAM_H #include FT_INTERNAL_OBJECTS_H +#include FT_TRUETYPE_IDS_H #include "winfnt.h" #include "fnterrs.h" @@ -802,15 +803,16 @@ charmap.encoding = FT_ENCODING_NONE; - charmap.platform_id = 0; - charmap.encoding_id = 0; + /* initial platform/encoding should indicate unset status? */ + charmap.platform_id = TT_PLATFORM_APPLE_UNICODE; + charmap.encoding_id = TT_APPLE_ID_DEFAULT; charmap.face = root; if ( font->header.charset == FT_WinFNT_ID_MAC ) { charmap.encoding = FT_ENCODING_APPLE_ROMAN; - charmap.platform_id = 1; -/* charmap.encoding_id = 0; */ + charmap.platform_id = TT_PLATFORM_MACINTOSH; +/* charmap.encoding_id = TT_MAC_ID_ROMAN; */ } error = FT_CMap_New( fnt_cmap_class, @@ -942,7 +944,7 @@ FT_Int32 load_flags ) { FNT_Face face = (FNT_Face)FT_SIZE_FACE( size ); - FNT_Font font = face->font; + FNT_Font font; FT_Error error = FNT_Err_Ok; FT_Byte* p; FT_Int len; @@ -953,7 +955,15 @@ FT_UNUSED( load_flags ); - if ( !face || !font || + if ( !face ) + { + error = FNT_Err_Invalid_Argument; + goto Exit; + } + + font = face->font; + + if ( !font || glyph_index >= (FT_UInt)( FT_FACE( face )->num_glyphs ) ) { error = FNT_Err_Invalid_Argument; From 8d7e24af8fca9cb88348468bd8f5e86434ba5fd6 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Mon, 2 May 2011 09:53:03 +0000 Subject: [PATCH 279/317] [FREETYPE] Add freetype/freetype_ros.diff See r46246 svn path=/trunk/; revision=51543 --- .../lib/3rdparty/freetype/freetype_ros.diff | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 reactos/lib/3rdparty/freetype/freetype_ros.diff diff --git a/reactos/lib/3rdparty/freetype/freetype_ros.diff b/reactos/lib/3rdparty/freetype/freetype_ros.diff new file mode 100644 index 00000000000..6505a6cb06d --- /dev/null +++ b/reactos/lib/3rdparty/freetype/freetype_ros.diff @@ -0,0 +1,37 @@ +Index: src/base/ftbitmap.c +=================================================================== +--- src/base/ftbitmap.c (Revision 51535) ++++ src/base/ftbitmap.c (Arbeitskopie) +@@ -451,15 +451,15 @@ + { + FT_Int val = ss[0]; /* avoid a byte->int cast on each line */ + ++ tt[0] = (FT_Byte)( ( val & 0x80 ) ? 0xff : 0); ++ tt[1] = (FT_Byte)( ( val & 0x40 ) ? 0xff : 0); ++ tt[2] = (FT_Byte)( ( val & 0x20 ) ? 0xff : 0); ++ tt[3] = (FT_Byte)( ( val & 0x10 ) ? 0xff : 0); ++ tt[4] = (FT_Byte)( ( val & 0x08 ) ? 0xff : 0); ++ tt[5] = (FT_Byte)( ( val & 0x04 ) ? 0xff : 0); ++ tt[6] = (FT_Byte)( ( val & 0x02 ) ? 0xff : 0); ++ tt[7] = (FT_Byte)( ( val & 0x01 ) ? 0xff : 0); + +- tt[0] = (FT_Byte)( ( val & 0x80 ) >> 7 ); +- tt[1] = (FT_Byte)( ( val & 0x40 ) >> 6 ); +- tt[2] = (FT_Byte)( ( val & 0x20 ) >> 5 ); +- tt[3] = (FT_Byte)( ( val & 0x10 ) >> 4 ); +- tt[4] = (FT_Byte)( ( val & 0x08 ) >> 3 ); +- tt[5] = (FT_Byte)( ( val & 0x04 ) >> 2 ); +- tt[6] = (FT_Byte)( ( val & 0x02 ) >> 1 ); +- tt[7] = (FT_Byte)( val & 0x01 ); + + tt += 8; + ss += 1; +@@ -474,7 +474,7 @@ + + for ( ; j > 0; j-- ) + { +- tt[0] = (FT_Byte)( ( val & 0x80 ) >> 7); ++ tt[0] = (FT_Byte)( ( val & 0x80 ) ? 0xff : 0); + val <<= 1; + tt += 1; + } From 6774978a84b1fb0d9325df7a263aed3fd3274f8c Mon Sep 17 00:00:00 2001 From: Rafal Harabien Date: Mon, 2 May 2011 11:38:30 +0000 Subject: [PATCH 280/317] [WIN32K] * Fix ShowingCursor counter interpretation. Values >= 0 means cursor is shown, values <0 means cursor is hidden. Fixes few user32:cursoricon tests. svn path=/trunk/; revision=51552 --- .../subsystems/win32/win32k/ntuser/cursoricon.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/reactos/subsystems/win32/win32k/ntuser/cursoricon.c b/reactos/subsystems/win32/win32k/ntuser/cursoricon.c index f749bda6dbd..7daa480494c 100644 --- a/reactos/subsystems/win32/win32k/ntuser/cursoricon.c +++ b/reactos/subsystems/win32/win32k/ntuser/cursoricon.c @@ -63,7 +63,7 @@ InitCursorImpl() gSysCursorInfo.bClipped = FALSE; gSysCursorInfo.LastBtnDown = 0; gSysCursorInfo.CurrentCursorObject = NULL; - gSysCursorInfo.ShowingCursor = 0; + gSysCursorInfo.ShowingCursor = -1; gSysCursorInfo.ClickLockActive = FALSE; gSysCursorInfo.ClickLockTime = 0; @@ -129,7 +129,7 @@ UserSetCursor( /* Do we have a new cursor? */ if (NewCursor) { - CurInfo->ShowingCursor = 1; + CurInfo->ShowingCursor = 0; CurInfo->CurrentCursorObject = NewCursor; /* Call GDI to set the new screen cursor */ @@ -144,7 +144,7 @@ UserSetCursor( else { /* Check if were diplaying a cursor */ - if (OldCursor && CurInfo->ShowingCursor) + if (OldCursor && CurInfo->ShowingCursor >= 0) { /* Remove the cursor */ GreMovePointer(hdcScreen, -1, -1); @@ -152,7 +152,7 @@ UserSetCursor( } CurInfo->CurrentCursorObject = NULL; - CurInfo->ShowingCursor = 0; + CurInfo->ShowingCursor = -1; } /* Return the old cursor */ @@ -219,13 +219,13 @@ int UserShowCursor(BOOL bShow) if (!(hdcScreen = IntGetScreenDC())) { - return 0; /* No mouse */ + return -1; /* No mouse */ } if (bShow == FALSE) { /* Check if were diplaying a cursor */ - if (CurInfo->ShowingCursor == 1) + if (CurInfo->ShowingCursor == 0) { /* Remove the pointer */ GreMovePointer(hdcScreen, -1, -1); @@ -235,7 +235,7 @@ int UserShowCursor(BOOL bShow) } else { - if (CurInfo->ShowingCursor == 0) + if (CurInfo->ShowingCursor == -1) { /*Show the pointer*/ GreMovePointer(hdcScreen, gpsi->ptCursor.x, gpsi->ptCursor.y); @@ -621,7 +621,7 @@ NtUserGetCursorInfo( CurIcon = (PCURICON_OBJECT)CurInfo->CurrentCursorObject; SafeCi.cbSize = sizeof(CURSORINFO); - SafeCi.flags = ((CurInfo->ShowingCursor && CurIcon) ? CURSOR_SHOWING : 0); + SafeCi.flags = ((CurIcon && CurInfo->ShowingCursor >= 0) ? CURSOR_SHOWING : 0); SafeCi.hCursor = (CurIcon ? (HCURSOR)CurIcon->Self : (HCURSOR)0); SafeCi.ptScreenPos = gpsi->ptCursor; From 94aaa3b4d56ab2606f8fc074ac8a7ac94c1808a3 Mon Sep 17 00:00:00 2001 From: Rafal Harabien Date: Mon, 2 May 2011 16:45:41 +0000 Subject: [PATCH 281/317] [TASKMGR] * Don't compare NTSTATUS to NO_ERROR. Use NT_SUCCESS macro instead. Spotted by dmex. svn path=/trunk/; revision=51556 --- reactos/base/applications/taskmgr/perfdata.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/reactos/base/applications/taskmgr/perfdata.c b/reactos/base/applications/taskmgr/perfdata.c index a82eb78ef1e..50132d0b2b2 100644 --- a/reactos/base/applications/taskmgr/perfdata.c +++ b/reactos/base/applications/taskmgr/perfdata.c @@ -60,7 +60,7 @@ BOOL PerfDataInitialize(void) * Get number of processors in the system */ status = NtQuerySystemInformation(SystemBasicInformation, &SystemBasicInfo, sizeof(SystemBasicInfo), NULL); - if (status != NO_ERROR) + if (!NT_SUCCESS(status)) return FALSE; /* @@ -180,24 +180,24 @@ void PerfDataRefresh(void) /* Get new system time */ status = NtQuerySystemInformation(SystemTimeOfDayInformation, &SysTimeInfo, sizeof(SysTimeInfo), 0); - if (status != NO_ERROR) + if (!NT_SUCCESS(status)) return; /* Get new CPU's idle time */ status = NtQuerySystemInformation(SystemPerformanceInformation, &SysPerfInfo, sizeof(SysPerfInfo), NULL); - if (status != NO_ERROR) + if (!NT_SUCCESS(status)) return; /* Get system cache information */ status = NtQuerySystemInformation(SystemFileCacheInformation, &SysCacheInfo, sizeof(SysCacheInfo), NULL); - if (status != NO_ERROR) + if (!NT_SUCCESS(status)) return; /* Get processor time information */ SysProcessorTimeInfo = (PSYSTEM_PROCESSOR_PERFORMANCE_INFORMATION)HeapAlloc(GetProcessHeap(), 0, sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION) * SystemBasicInfo.NumberOfProcessors); status = NtQuerySystemInformation(SystemProcessorPerformanceInformation, SysProcessorTimeInfo, sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION) * SystemBasicInfo.NumberOfProcessors, &ulSize); - if (status != NO_ERROR) + if (!NT_SUCCESS(status)) { if (SysProcessorTimeInfo != NULL) HeapFree(GetProcessHeap(), 0, SysProcessorTimeInfo); From 702353b092b0d6a672ceee7b78170af6e46fd39c Mon Sep 17 00:00:00 2001 From: Matthias Kupfer Date: Mon, 2 May 2011 17:32:43 +0000 Subject: [PATCH 282/317] firefox4 added svn path=/trunk/; revision=51557 --- .../applications/rapps/rapps/firefox4.txt | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 reactos/base/applications/rapps/rapps/firefox4.txt diff --git a/reactos/base/applications/rapps/rapps/firefox4.txt b/reactos/base/applications/rapps/rapps/firefox4.txt new file mode 100644 index 00000000000..650153b0176 --- /dev/null +++ b/reactos/base/applications/rapps/rapps/firefox4.txt @@ -0,0 +1,60 @@ +; UTF-8 + +[Section] +Name = Mozilla Firefox 4 +Version = 4.0.1 +Licence = MPL/GPL/LGPL +Description = The most popular and one of the best free Web Browsers out there. +Size = 11.9M +Category = 5 +URLSite = http://www.mozilla.com/en-US/ +URLDownload = http://mozilla.cdn.leaseweb.com/firefox/releases/4.0.1/win32/en-US/Firefox%20Setup%204.0.1.exe +CDPath = none + +[Section.0407] +Description = Der populärste und einer der besten freien Webbrowser. +Size = 11.7M +URLSite = http://www.mozilla-europe.org/de/ +URLDownload = http://mozilla.cdn.leaseweb.com/firefox/releases/4.0.1/win32/de/Firefox%20Setup%204.0.1.exe + +[Section.040a] +Description = El más popular y uno de los mejores navegadores web gratuitos que hay. +Size = 11.9M +URLSite = http://www.mozilla-europe.org/es/ +URLDownload = http://mozilla.cdn.leaseweb.com/firefox/releases/4.0.1/win32/es-ES/Firefox%20Setup%204.0.1.exe + +[Section.040c] +Description = Le navigateur web gratuit le plus populaire et l'un des meilleurs. +Size = 12.0M +URLSite = http://www.mozilla-europe.org/fr/ +URLDownload = http://mozilla.cdn.leaseweb.com/firefox/releases/4.0.1/win32/fr/Firefox%20Setup%204.0.1.exe + +[Section.0414] +Description = Mest populære og best også gratis nettleserene der ute. +Size = 11.7M +URLSite = http://www.mozilla-europe.org/no/ +URLDownload = http://mozilla.cdn.leaseweb.com/firefox/releases/4.0.1/win32/nb-NO/Firefox%20Setup%204.0.1.exe + +[Section.0415] +Description = Najpopularniejsza i jedna z najlepszych darmowych przeglądarek internetowych. +Size = 12.6M +URLSite = http://www.mozilla-europe.org/pl/ +URLDownload = http://mozilla.cdn.leaseweb.com/firefox/releases/4.0.1/win32/pl/Firefox%20Setup%204.0.1.exe + +[Section.0419] +Description = Один из самых популярных и лучших бесплатных браузеров. +Size = 12.2M +URLSite = http://www.mozilla-europe.org/ru/ +URLDownload = http://mozilla.cdn.leaseweb.com/firefox/releases/4.0.1/win32/ru/Firefox%20Setup%204.0.1.exe + +[Section.041b] +Description = Najpopulárnejší a jeden z najlepších slobodný webových prehliadačov. +Size = 12.4 MB +URLSite = http://www.mozilla-europe.org/sk/ +URLDownload = http://mozilla.cdn.leaseweb.com/firefox/releases/4.0.1/win32/sk/Firefox%20Setup%204.0.1.exe + +[Section.0422] +Description = Найпопулярніший та один з кращих безплатних веб-браузерів. +Size = 12.1M +URLSite = http://www.mozilla-europe.org/uk/ +URLDownload = http://mozilla.cdn.leaseweb.com/firefox/releases/4.0.1/win32/uk/Firefox%20Setup%204.0.1.exe From ec3f21cfa25ee5f23448263baa24abef466d3234 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Mon, 2 May 2011 19:38:23 +0000 Subject: [PATCH 283/317] [EVENTVWR/EVENTLOG] Fix a double off-by-one bug: - The eventlog service was reporting one event more than was available (+1). - The event viewer did not display the latest event from the eventlog service (-1). See issue #6182 for more details. svn path=/trunk/; revision=51558 --- reactos/base/applications/mscutils/eventvwr/eventvwr.c | 2 +- reactos/base/services/eventlog/rpc.c | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/reactos/base/applications/mscutils/eventvwr/eventvwr.c b/reactos/base/applications/mscutils/eventvwr/eventvwr.c index 7f0a5e51e2e..db3b6f736aa 100644 --- a/reactos/base/applications/mscutils/eventvwr/eventvwr.c +++ b/reactos/base/applications/mscutils/eventvwr/eventvwr.c @@ -503,7 +503,7 @@ QueryEventMessages(LPWSTR lpMachineName, HWND hwndDlg; HANDLE hEventLog; EVENTLOGRECORD *pevlr; - DWORD dwRead, dwNeeded, dwThisRecord, dwTotalRecords = 0, dwCurrentRecord = 1, dwRecordsToRead = 0, dwFlags, dwMaxLength; + DWORD dwRead, dwNeeded, dwThisRecord, dwTotalRecords = 0, dwCurrentRecord = 0, dwRecordsToRead = 0, dwFlags, dwMaxLength; LPWSTR lpSourceName; LPWSTR lpComputerName; LPSTR lpData; diff --git a/reactos/base/services/eventlog/rpc.c b/reactos/base/services/eventlog/rpc.c index cf855757292..5991da71f76 100644 --- a/reactos/base/services/eventlog/rpc.c +++ b/reactos/base/services/eventlog/rpc.c @@ -199,6 +199,7 @@ NTSTATUS ElfrNumberOfRecords( DWORD *NumberOfRecords) { PLOGHANDLE lpLogHandle; + DWORD dwRecords; lpLogHandle = ElfGetLogHandleEntryByHandle(LogHandle); if (!lpLogHandle) @@ -206,7 +207,9 @@ NTSTATUS ElfrNumberOfRecords( return STATUS_INVALID_HANDLE; } - *NumberOfRecords = lpLogHandle->LogFile->Header.CurrentRecordNumber; + dwRecords = lpLogHandle->LogFile->Header.CurrentRecordNumber; + + *NumberOfRecords = (dwRecords > 0) ? (dwRecords - 1) : 0; return STATUS_SUCCESS; } From 4fd826df1f34b144b664f07c8091bc0a07d360b7 Mon Sep 17 00:00:00 2001 From: Gregor Schneider Date: Mon, 2 May 2011 20:13:40 +0000 Subject: [PATCH 284/317] [libjpeg] Update to version 8c See issue #6022 for more details. svn path=/trunk/; revision=51559 --- reactos/dll/3rdparty/libjpeg/change.log | 11 ++ reactos/dll/3rdparty/libjpeg/cjpeg.c | 27 +++- reactos/dll/3rdparty/libjpeg/jcmarker.c | 36 ++--- reactos/dll/3rdparty/libjpeg/jcmaster.c | 194 +++++++++++++----------- 4 files changed, 162 insertions(+), 106 deletions(-) diff --git a/reactos/dll/3rdparty/libjpeg/change.log b/reactos/dll/3rdparty/libjpeg/change.log index f99a867dbb8..94865b3f9ce 100644 --- a/reactos/dll/3rdparty/libjpeg/change.log +++ b/reactos/dll/3rdparty/libjpeg/change.log @@ -1,6 +1,17 @@ CHANGE LOG for Independent JPEG Group's JPEG software +Version 8c 16-Jan-2011 +----------------------- + +Add option to compression library and cjpeg (-block N) to use +different DCT block size. +All N from 1 to 16 are possible. Default is 8 (baseline format). +Larger values produce higher compression, +smaller values produce higher quality. +SmartScale capable decoder (introduced with IJG JPEG 8) required. + + Version 8b 16-May-2010 ----------------------- diff --git a/reactos/dll/3rdparty/libjpeg/cjpeg.c b/reactos/dll/3rdparty/libjpeg/cjpeg.c index b9d57eb5c86..40d25215d1c 100644 --- a/reactos/dll/3rdparty/libjpeg/cjpeg.c +++ b/reactos/dll/3rdparty/libjpeg/cjpeg.c @@ -2,7 +2,7 @@ * cjpeg.c * * Copyright (C) 1991-1998, Thomas G. Lane. - * Modified 2003-2008 by Guido Vollbeding. + * Modified 2003-2010 by Guido Vollbeding. * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * @@ -165,6 +165,9 @@ usage (void) fprintf(stderr, " -targa Input file is Targa format (usually not needed)\n"); #endif fprintf(stderr, "Switches for advanced users:\n"); +#ifdef DCT_SCALING_SUPPORTED + fprintf(stderr, " -block N DCT block size (1..16; default is 8)\n"); +#endif #ifdef DCT_ISLOW_SUPPORTED fprintf(stderr, " -dct int Use integer DCT method%s\n", (JDCT_DEFAULT == JDCT_ISLOW ? " (default)" : "")); @@ -254,10 +257,30 @@ parse_switches (j_compress_ptr cinfo, int argc, char **argv, exit(EXIT_FAILURE); #endif - } else if (keymatch(arg, "baseline", 1)) { + } else if (keymatch(arg, "baseline", 2)) { /* Force baseline-compatible output (8-bit quantizer values). */ force_baseline = TRUE; + } else if (keymatch(arg, "block", 2)) { + /* Set DCT block size. */ +#if defined(DCT_SCALING_SUPPORTED) && defined(JPEG_LIB_VERSION_MAJOR) && \ + (JPEG_LIB_VERSION_MAJOR > 8 || (JPEG_LIB_VERSION_MAJOR == 8 && \ + defined(JPEG_LIB_VERSION_MINOR) && JPEG_LIB_VERSION_MINOR >= 3)) + int val; + + if (++argn >= argc) /* advance to next argument */ + usage(); + if (sscanf(argv[argn], "%d", &val) != 1) + usage(); + if (val < 1 || val > 16) + usage(); + cinfo->block_size = val; +#else + fprintf(stderr, "%s: sorry, block size setting not supported\n", + progname); + exit(EXIT_FAILURE); +#endif + } else if (keymatch(arg, "dct", 2)) { /* Select DCT algorithm. */ if (++argn >= argc) /* advance to next argument */ diff --git a/reactos/dll/3rdparty/libjpeg/jcmarker.c b/reactos/dll/3rdparty/libjpeg/jcmarker.c index 2e289834245..606c19af397 100644 --- a/reactos/dll/3rdparty/libjpeg/jcmarker.c +++ b/reactos/dll/3rdparty/libjpeg/jcmarker.c @@ -2,7 +2,7 @@ * jcmarker.c * * Copyright (C) 1991-1998, Thomas G. Lane. - * Modified 2003-2009 by Guido Vollbeding. + * Modified 2003-2010 by Guido Vollbeding. * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * @@ -231,10 +231,10 @@ emit_dac (j_compress_ptr cinfo) char ac_in_use[NUM_ARITH_TBLS]; int length, i; jpeg_component_info *compptr; - + for (i = 0; i < NUM_ARITH_TBLS; i++) dc_in_use[i] = ac_in_use[i] = 0; - + for (i = 0; i < cinfo->comps_in_scan; i++) { compptr = cinfo->cur_comp_info[i]; /* DC needs no table for refinement scan */ @@ -244,23 +244,25 @@ emit_dac (j_compress_ptr cinfo) if (cinfo->Se) ac_in_use[compptr->ac_tbl_no] = 1; } - + length = 0; for (i = 0; i < NUM_ARITH_TBLS; i++) length += dc_in_use[i] + ac_in_use[i]; - - emit_marker(cinfo, M_DAC); - - emit_2bytes(cinfo, length*2 + 2); - - for (i = 0; i < NUM_ARITH_TBLS; i++) { - if (dc_in_use[i]) { - emit_byte(cinfo, i); - emit_byte(cinfo, cinfo->arith_dc_L[i] + (cinfo->arith_dc_U[i]<<4)); - } - if (ac_in_use[i]) { - emit_byte(cinfo, i + 0x10); - emit_byte(cinfo, cinfo->arith_ac_K[i]); + + if (length) { + emit_marker(cinfo, M_DAC); + + emit_2bytes(cinfo, length*2 + 2); + + for (i = 0; i < NUM_ARITH_TBLS; i++) { + if (dc_in_use[i]) { + emit_byte(cinfo, i); + emit_byte(cinfo, cinfo->arith_dc_L[i] + (cinfo->arith_dc_U[i]<<4)); + } + if (ac_in_use[i]) { + emit_byte(cinfo, i + 0x10); + emit_byte(cinfo, cinfo->arith_ac_K[i]); + } } } #endif /* C_ARITH_CODING_SUPPORTED */ diff --git a/reactos/dll/3rdparty/libjpeg/jcmaster.c b/reactos/dll/3rdparty/libjpeg/jcmaster.c index 660883f459a..caf80a53b38 100644 --- a/reactos/dll/3rdparty/libjpeg/jcmaster.c +++ b/reactos/dll/3rdparty/libjpeg/jcmaster.c @@ -2,7 +2,7 @@ * jcmaster.c * * Copyright (C) 1991-1997, Thomas G. Lane. - * Modified 2003-2010 by Guido Vollbeding. + * Modified 2003-2011 by Guido Vollbeding. * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * @@ -55,125 +55,140 @@ jpeg_calc_jpeg_dimensions (j_compress_ptr cinfo) { #ifdef DCT_SCALING_SUPPORTED + /* Sanity check on input image dimensions to prevent overflow in + * following calculation. + * We do check jpeg_width and jpeg_height in initial_setup below, + * but image_width and image_height can come from arbitrary data, + * and we need some space for multiplication by block_size. + */ + if (((long) cinfo->image_width >> 24) || ((long) cinfo->image_height >> 24)) + ERREXIT1(cinfo, JERR_IMAGE_TOO_BIG, (unsigned int) JPEG_MAX_DIMENSION); + /* Compute actual JPEG image dimensions and DCT scaling choices. */ - if (cinfo->scale_num >= cinfo->scale_denom * 8) { - /* Provide 8/1 scaling */ - cinfo->jpeg_width = cinfo->image_width << 3; - cinfo->jpeg_height = cinfo->image_height << 3; + if (cinfo->scale_num >= cinfo->scale_denom * cinfo->block_size) { + /* Provide block_size/1 scaling */ + cinfo->jpeg_width = cinfo->image_width * cinfo->block_size; + cinfo->jpeg_height = cinfo->image_height * cinfo->block_size; cinfo->min_DCT_h_scaled_size = 1; cinfo->min_DCT_v_scaled_size = 1; - } else if (cinfo->scale_num >= cinfo->scale_denom * 4) { - /* Provide 4/1 scaling */ - cinfo->jpeg_width = cinfo->image_width << 2; - cinfo->jpeg_height = cinfo->image_height << 2; + } else if (cinfo->scale_num * 2 >= cinfo->scale_denom * cinfo->block_size) { + /* Provide block_size/2 scaling */ + cinfo->jpeg_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 2L); + cinfo->jpeg_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 2L); cinfo->min_DCT_h_scaled_size = 2; cinfo->min_DCT_v_scaled_size = 2; - } else if (cinfo->scale_num * 3 >= cinfo->scale_denom * 8) { - /* Provide 8/3 scaling */ - cinfo->jpeg_width = (cinfo->image_width << 1) + (JDIMENSION) - jdiv_round_up((long) cinfo->image_width * 2, 3L); - cinfo->jpeg_height = (cinfo->image_height << 1) + (JDIMENSION) - jdiv_round_up((long) cinfo->image_height * 2, 3L); + } else if (cinfo->scale_num * 3 >= cinfo->scale_denom * cinfo->block_size) { + /* Provide block_size/3 scaling */ + cinfo->jpeg_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 3L); + cinfo->jpeg_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 3L); cinfo->min_DCT_h_scaled_size = 3; cinfo->min_DCT_v_scaled_size = 3; - } else if (cinfo->scale_num >= cinfo->scale_denom * 2) { - /* Provide 2/1 scaling */ - cinfo->jpeg_width = cinfo->image_width << 1; - cinfo->jpeg_height = cinfo->image_height << 1; + } else if (cinfo->scale_num * 4 >= cinfo->scale_denom * cinfo->block_size) { + /* Provide block_size/4 scaling */ + cinfo->jpeg_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 4L); + cinfo->jpeg_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 4L); cinfo->min_DCT_h_scaled_size = 4; cinfo->min_DCT_v_scaled_size = 4; - } else if (cinfo->scale_num * 5 >= cinfo->scale_denom * 8) { - /* Provide 8/5 scaling */ - cinfo->jpeg_width = cinfo->image_width + (JDIMENSION) - jdiv_round_up((long) cinfo->image_width * 3, 5L); - cinfo->jpeg_height = cinfo->image_height + (JDIMENSION) - jdiv_round_up((long) cinfo->image_height * 3, 5L); + } else if (cinfo->scale_num * 5 >= cinfo->scale_denom * cinfo->block_size) { + /* Provide block_size/5 scaling */ + cinfo->jpeg_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 5L); + cinfo->jpeg_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 5L); cinfo->min_DCT_h_scaled_size = 5; cinfo->min_DCT_v_scaled_size = 5; - } else if (cinfo->scale_num * 3 >= cinfo->scale_denom * 4) { - /* Provide 4/3 scaling */ - cinfo->jpeg_width = cinfo->image_width + (JDIMENSION) - jdiv_round_up((long) cinfo->image_width, 3L); - cinfo->jpeg_height = cinfo->image_height + (JDIMENSION) - jdiv_round_up((long) cinfo->image_height, 3L); + } else if (cinfo->scale_num * 6 >= cinfo->scale_denom * cinfo->block_size) { + /* Provide block_size/6 scaling */ + cinfo->jpeg_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 6L); + cinfo->jpeg_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 6L); cinfo->min_DCT_h_scaled_size = 6; cinfo->min_DCT_v_scaled_size = 6; - } else if (cinfo->scale_num * 7 >= cinfo->scale_denom * 8) { - /* Provide 8/7 scaling */ - cinfo->jpeg_width = cinfo->image_width + (JDIMENSION) - jdiv_round_up((long) cinfo->image_width, 7L); - cinfo->jpeg_height = cinfo->image_height + (JDIMENSION) - jdiv_round_up((long) cinfo->image_height, 7L); + } else if (cinfo->scale_num * 7 >= cinfo->scale_denom * cinfo->block_size) { + /* Provide block_size/7 scaling */ + cinfo->jpeg_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 7L); + cinfo->jpeg_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 7L); cinfo->min_DCT_h_scaled_size = 7; cinfo->min_DCT_v_scaled_size = 7; - } else if (cinfo->scale_num >= cinfo->scale_denom) { - /* Provide 1/1 scaling */ - cinfo->jpeg_width = cinfo->image_width; - cinfo->jpeg_height = cinfo->image_height; + } else if (cinfo->scale_num * 8 >= cinfo->scale_denom * cinfo->block_size) { + /* Provide block_size/8 scaling */ + cinfo->jpeg_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 8L); + cinfo->jpeg_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 8L); cinfo->min_DCT_h_scaled_size = 8; cinfo->min_DCT_v_scaled_size = 8; - } else if (cinfo->scale_num * 9 >= cinfo->scale_denom * 8) { - /* Provide 8/9 scaling */ + } else if (cinfo->scale_num * 9 >= cinfo->scale_denom * cinfo->block_size) { + /* Provide block_size/9 scaling */ cinfo->jpeg_width = (JDIMENSION) - jdiv_round_up((long) cinfo->image_width * 8, 9L); + jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 9L); cinfo->jpeg_height = (JDIMENSION) - jdiv_round_up((long) cinfo->image_height * 8, 9L); + jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 9L); cinfo->min_DCT_h_scaled_size = 9; cinfo->min_DCT_v_scaled_size = 9; - } else if (cinfo->scale_num * 5 >= cinfo->scale_denom * 4) { - /* Provide 4/5 scaling */ + } else if (cinfo->scale_num * 10 >= cinfo->scale_denom * cinfo->block_size) { + /* Provide block_size/10 scaling */ cinfo->jpeg_width = (JDIMENSION) - jdiv_round_up((long) cinfo->image_width * 4, 5L); + jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 10L); cinfo->jpeg_height = (JDIMENSION) - jdiv_round_up((long) cinfo->image_height * 4, 5L); + jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 10L); cinfo->min_DCT_h_scaled_size = 10; cinfo->min_DCT_v_scaled_size = 10; - } else if (cinfo->scale_num * 11 >= cinfo->scale_denom * 8) { - /* Provide 8/11 scaling */ + } else if (cinfo->scale_num * 11 >= cinfo->scale_denom * cinfo->block_size) { + /* Provide block_size/11 scaling */ cinfo->jpeg_width = (JDIMENSION) - jdiv_round_up((long) cinfo->image_width * 8, 11L); + jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 11L); cinfo->jpeg_height = (JDIMENSION) - jdiv_round_up((long) cinfo->image_height * 8, 11L); + jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 11L); cinfo->min_DCT_h_scaled_size = 11; cinfo->min_DCT_v_scaled_size = 11; - } else if (cinfo->scale_num * 3 >= cinfo->scale_denom * 2) { - /* Provide 2/3 scaling */ + } else if (cinfo->scale_num * 12 >= cinfo->scale_denom * cinfo->block_size) { + /* Provide block_size/12 scaling */ cinfo->jpeg_width = (JDIMENSION) - jdiv_round_up((long) cinfo->image_width * 2, 3L); + jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 12L); cinfo->jpeg_height = (JDIMENSION) - jdiv_round_up((long) cinfo->image_height * 2, 3L); + jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 12L); cinfo->min_DCT_h_scaled_size = 12; cinfo->min_DCT_v_scaled_size = 12; - } else if (cinfo->scale_num * 13 >= cinfo->scale_denom * 8) { - /* Provide 8/13 scaling */ + } else if (cinfo->scale_num * 13 >= cinfo->scale_denom * cinfo->block_size) { + /* Provide block_size/13 scaling */ cinfo->jpeg_width = (JDIMENSION) - jdiv_round_up((long) cinfo->image_width * 8, 13L); + jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 13L); cinfo->jpeg_height = (JDIMENSION) - jdiv_round_up((long) cinfo->image_height * 8, 13L); + jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 13L); cinfo->min_DCT_h_scaled_size = 13; cinfo->min_DCT_v_scaled_size = 13; - } else if (cinfo->scale_num * 7 >= cinfo->scale_denom * 4) { - /* Provide 4/7 scaling */ + } else if (cinfo->scale_num * 14 >= cinfo->scale_denom * cinfo->block_size) { + /* Provide block_size/14 scaling */ cinfo->jpeg_width = (JDIMENSION) - jdiv_round_up((long) cinfo->image_width * 4, 7L); + jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 14L); cinfo->jpeg_height = (JDIMENSION) - jdiv_round_up((long) cinfo->image_height * 4, 7L); + jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 14L); cinfo->min_DCT_h_scaled_size = 14; cinfo->min_DCT_v_scaled_size = 14; - } else if (cinfo->scale_num * 15 >= cinfo->scale_denom * 8) { - /* Provide 8/15 scaling */ + } else if (cinfo->scale_num * 15 >= cinfo->scale_denom * cinfo->block_size) { + /* Provide block_size/15 scaling */ cinfo->jpeg_width = (JDIMENSION) - jdiv_round_up((long) cinfo->image_width * 8, 15L); + jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 15L); cinfo->jpeg_height = (JDIMENSION) - jdiv_round_up((long) cinfo->image_height * 8, 15L); + jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 15L); cinfo->min_DCT_h_scaled_size = 15; cinfo->min_DCT_v_scaled_size = 15; } else { - /* Provide 1/2 scaling */ + /* Provide block_size/16 scaling */ cinfo->jpeg_width = (JDIMENSION) - jdiv_round_up((long) cinfo->image_width, 2L); + jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 16L); cinfo->jpeg_height = (JDIMENSION) - jdiv_round_up((long) cinfo->image_height, 2L); + jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 16L); cinfo->min_DCT_h_scaled_size = 16; cinfo->min_DCT_v_scaled_size = 16; } @@ -193,25 +208,11 @@ jpeg_calc_jpeg_dimensions (j_compress_ptr cinfo) LOCAL(void) jpeg_calc_trans_dimensions (j_compress_ptr cinfo) { - if (cinfo->min_DCT_h_scaled_size < 1 || cinfo->min_DCT_h_scaled_size > 16 - || cinfo->min_DCT_h_scaled_size != cinfo->min_DCT_v_scaled_size) + if (cinfo->min_DCT_h_scaled_size != cinfo->min_DCT_v_scaled_size) ERREXIT2(cinfo, JERR_BAD_DCTSIZE, cinfo->min_DCT_h_scaled_size, cinfo->min_DCT_v_scaled_size); cinfo->block_size = cinfo->min_DCT_h_scaled_size; - - switch (cinfo->block_size) { - case 2: cinfo->natural_order = jpeg_natural_order2; break; - case 3: cinfo->natural_order = jpeg_natural_order3; break; - case 4: cinfo->natural_order = jpeg_natural_order4; break; - case 5: cinfo->natural_order = jpeg_natural_order5; break; - case 6: cinfo->natural_order = jpeg_natural_order6; break; - case 7: cinfo->natural_order = jpeg_natural_order7; break; - default: cinfo->natural_order = jpeg_natural_order; break; - } - - cinfo->lim_Se = cinfo->block_size < DCTSIZE ? - cinfo->block_size * cinfo->block_size - 1 : DCTSIZE2-1; } @@ -229,6 +230,25 @@ initial_setup (j_compress_ptr cinfo, boolean transcode_only) else jpeg_calc_jpeg_dimensions(cinfo); + /* Sanity check on block_size */ + if (cinfo->block_size < 1 || cinfo->block_size > 16) + ERREXIT2(cinfo, JERR_BAD_DCTSIZE, cinfo->block_size, cinfo->block_size); + + /* Derive natural_order from block_size */ + switch (cinfo->block_size) { + case 2: cinfo->natural_order = jpeg_natural_order2; break; + case 3: cinfo->natural_order = jpeg_natural_order3; break; + case 4: cinfo->natural_order = jpeg_natural_order4; break; + case 5: cinfo->natural_order = jpeg_natural_order5; break; + case 6: cinfo->natural_order = jpeg_natural_order6; break; + case 7: cinfo->natural_order = jpeg_natural_order7; break; + default: cinfo->natural_order = jpeg_natural_order; break; + } + + /* Derive lim_Se from block_size */ + cinfo->lim_Se = cinfo->block_size < DCTSIZE ? + cinfo->block_size * cinfo->block_size - 1 : DCTSIZE2-1; + /* Sanity check on image dimensions */ if (cinfo->jpeg_height <= 0 || cinfo->jpeg_width <= 0 || cinfo->num_components <= 0 || cinfo->input_components <= 0) From f4e0b88a0ac7f531b4a6b06406f0df169364d6c0 Mon Sep 17 00:00:00 2001 From: Rafal Harabien Date: Mon, 2 May 2011 20:56:02 +0000 Subject: [PATCH 285/317] [KERNEL32] * Revert 51485. It needs more work. svn path=/trunk/; revision=51560 --- reactos/dll/win32/kernel32/file/volume.c | 1269 +++++++++++----------- 1 file changed, 608 insertions(+), 661 deletions(-) diff --git a/reactos/dll/win32/kernel32/file/volume.c b/reactos/dll/win32/kernel32/file/volume.c index 1f64e0bbc79..0e336661a6b 100644 --- a/reactos/dll/win32/kernel32/file/volume.c +++ b/reactos/dll/win32/kernel32/file/volume.c @@ -29,41 +29,41 @@ DEBUG_CHANNEL(kernel32file); static HANDLE InternalOpenDirW(LPCWSTR DirName, - BOOLEAN Write) + BOOLEAN Write) { - UNICODE_STRING NtPathU; - OBJECT_ATTRIBUTES ObjectAttributes; - NTSTATUS errCode; - IO_STATUS_BLOCK IoStatusBlock; - HANDLE hFile; + UNICODE_STRING NtPathU; + OBJECT_ATTRIBUTES ObjectAttributes; + NTSTATUS errCode; + IO_STATUS_BLOCK IoStatusBlock; + HANDLE hFile; - if (!RtlDosPathNameToNtPathName_U(DirName, - &NtPathU, - NULL, - NULL)) + if (!RtlDosPathNameToNtPathName_U(DirName, + &NtPathU, + NULL, + NULL)) { - WARN("Invalid path\n"); - SetLastError(ERROR_BAD_PATHNAME); - return INVALID_HANDLE_VALUE; + WARN("Invalid path\n"); + SetLastError(ERROR_BAD_PATHNAME); + return INVALID_HANDLE_VALUE; } InitializeObjectAttributes(&ObjectAttributes, - &NtPathU, - OBJ_CASE_INSENSITIVE, - NULL, - NULL); + &NtPathU, + OBJ_CASE_INSENSITIVE, + NULL, + NULL); errCode = NtCreateFile (&hFile, - Write ? FILE_GENERIC_WRITE : FILE_GENERIC_READ, - &ObjectAttributes, - &IoStatusBlock, - NULL, - 0, - FILE_SHARE_READ|FILE_SHARE_WRITE, - FILE_OPEN, - 0, - NULL, - 0); + Write ? FILE_GENERIC_WRITE : FILE_GENERIC_READ, + &ObjectAttributes, + &IoStatusBlock, + NULL, + 0, + FILE_SHARE_READ|FILE_SHARE_WRITE, + FILE_OPEN, + 0, + NULL, + 0); RtlFreeHeap(RtlGetProcessHeap(), 0, @@ -71,8 +71,8 @@ InternalOpenDirW(LPCWSTR DirName, if (!NT_SUCCESS(errCode)) { - SetLastErrorByStatus (errCode); - return INVALID_HANDLE_VALUE; + SetLastErrorByStatus (errCode); + return INVALID_HANDLE_VALUE; } return hFile; } @@ -84,34 +84,34 @@ InternalOpenDirW(LPCWSTR DirName, /* Synced to Wine-2008/12/28 */ DWORD WINAPI GetLogicalDriveStringsA(DWORD nBufferLength, - LPSTR lpBuffer) + LPSTR lpBuffer) { - DWORD drive, count; - DWORD dwDriveMap; - LPSTR p; + DWORD drive, count; + DWORD dwDriveMap; + LPSTR p; - dwDriveMap = GetLogicalDrives(); + dwDriveMap = GetLogicalDrives(); - for (drive = count = 0; drive < MAX_DOS_DRIVES; drive++) - { - if (dwDriveMap & (1< nBufferLength) return ((count * 4) + 1); + if ((count * 4) + 1 > nBufferLength) return ((count * 4) + 1); - p = lpBuffer; + p = lpBuffer; - for (drive = 0; drive < MAX_DOS_DRIVES; drive++) - if (dwDriveMap & (1< nBufferLength) return ((count * 4) + 1); @@ -161,24 +161,24 @@ GetLogicalDriveStringsW(DWORD nBufferLength, DWORD WINAPI GetLogicalDrives(VOID) { - NTSTATUS Status; - PROCESS_DEVICEMAP_INFORMATION ProcessDeviceMapInfo; + NTSTATUS Status; + PROCESS_DEVICEMAP_INFORMATION ProcessDeviceMapInfo; - /* Get the Device Map for this Process */ - Status = NtQueryInformationProcess(NtCurrentProcess(), - ProcessDeviceMap, - &ProcessDeviceMapInfo, - sizeof(ProcessDeviceMapInfo), - NULL); + /* Get the Device Map for this Process */ + Status = NtQueryInformationProcess(NtCurrentProcess(), + ProcessDeviceMap, + &ProcessDeviceMapInfo, + sizeof(ProcessDeviceMapInfo), + NULL); - /* Return the Drive Map */ - if (!NT_SUCCESS(Status)) - { - SetLastErrorByStatus(Status); - return 0; - } + /* Return the Drive Map */ + if (!NT_SUCCESS(Status)) + { + SetLastErrorByStatus(Status); + return 0; + } - return ProcessDeviceMapInfo.Query.DriveMap; + return ProcessDeviceMapInfo.Query.DriveMap; } @@ -187,26 +187,26 @@ GetLogicalDrives(VOID) */ BOOL WINAPI GetDiskFreeSpaceA ( - LPCSTR lpRootPathName, - LPDWORD lpSectorsPerCluster, - LPDWORD lpBytesPerSector, - LPDWORD lpNumberOfFreeClusters, - LPDWORD lpTotalNumberOfClusters -) + LPCSTR lpRootPathName, + LPDWORD lpSectorsPerCluster, + LPDWORD lpBytesPerSector, + LPDWORD lpNumberOfFreeClusters, + LPDWORD lpTotalNumberOfClusters + ) { - PWCHAR RootPathNameW=NULL; + PWCHAR RootPathNameW=NULL; - if (lpRootPathName) - { - if (!(RootPathNameW = FilenameA2W(lpRootPathName, FALSE))) - return FALSE; - } + if (lpRootPathName) + { + if (!(RootPathNameW = FilenameA2W(lpRootPathName, FALSE))) + return FALSE; + } - return GetDiskFreeSpaceW (RootPathNameW, - lpSectorsPerCluster, - lpBytesPerSector, - lpNumberOfFreeClusters, - lpTotalNumberOfClusters); + return GetDiskFreeSpaceW (RootPathNameW, + lpSectorsPerCluster, + lpBytesPerSector, + lpNumberOfFreeClusters, + lpTotalNumberOfClusters); } @@ -220,7 +220,7 @@ GetDiskFreeSpaceW( LPDWORD lpBytesPerSector, LPDWORD lpNumberOfFreeClusters, LPDWORD lpTotalNumberOfClusters -) + ) { FILE_FS_SIZE_INFORMATION FileFsSize; IO_STATUS_BLOCK IoStatusBlock; @@ -238,11 +238,11 @@ GetDiskFreeSpaceW( } RootPathName[3] = 0; - hFile = InternalOpenDirW(RootPathName, FALSE); - if (INVALID_HANDLE_VALUE == hFile) + hFile = InternalOpenDirW(RootPathName, FALSE); + if (INVALID_HANDLE_VALUE == hFile) { - SetLastError(ERROR_PATH_NOT_FOUND); - return FALSE; + SetLastError(ERROR_PATH_NOT_FOUND); + return FALSE; } errCode = NtQueryVolumeInformationFile(hFile, @@ -276,24 +276,24 @@ GetDiskFreeSpaceW( */ BOOL WINAPI GetDiskFreeSpaceExA ( - LPCSTR lpDirectoryName OPTIONAL, - PULARGE_INTEGER lpFreeBytesAvailableToCaller, - PULARGE_INTEGER lpTotalNumberOfBytes, - PULARGE_INTEGER lpTotalNumberOfFreeBytes -) + LPCSTR lpDirectoryName OPTIONAL, + PULARGE_INTEGER lpFreeBytesAvailableToCaller, + PULARGE_INTEGER lpTotalNumberOfBytes, + PULARGE_INTEGER lpTotalNumberOfFreeBytes + ) { - PWCHAR DirectoryNameW=NULL; + PWCHAR DirectoryNameW=NULL; - if (lpDirectoryName) - { - if (!(DirectoryNameW = FilenameA2W(lpDirectoryName, FALSE))) - return FALSE; - } + if (lpDirectoryName) + { + if (!(DirectoryNameW = FilenameA2W(lpDirectoryName, FALSE))) + return FALSE; + } - return GetDiskFreeSpaceExW (DirectoryNameW , - lpFreeBytesAvailableToCaller, - lpTotalNumberOfBytes, - lpTotalNumberOfFreeBytes); + return GetDiskFreeSpaceExW (DirectoryNameW , + lpFreeBytesAvailableToCaller, + lpTotalNumberOfBytes, + lpTotalNumberOfFreeBytes); } @@ -306,7 +306,7 @@ GetDiskFreeSpaceExW( PULARGE_INTEGER lpFreeBytesAvailableToCaller, PULARGE_INTEGER lpTotalNumberOfBytes, PULARGE_INTEGER lpTotalNumberOfFreeBytes -) + ) { union { @@ -417,12 +417,12 @@ GetDiskFreeSpaceExW( UINT WINAPI GetDriveTypeA(LPCSTR lpRootPathName) { - PWCHAR RootPathNameW; + PWCHAR RootPathNameW; - if (!(RootPathNameW = FilenameA2W(lpRootPathName, FALSE))) - return DRIVE_UNKNOWN; + if (!(RootPathNameW = FilenameA2W(lpRootPathName, FALSE))) + return DRIVE_UNKNOWN; - return GetDriveTypeW(RootPathNameW); + return GetDriveTypeW(RootPathNameW); } @@ -432,105 +432,52 @@ GetDriveTypeA(LPCSTR lpRootPathName) UINT WINAPI GetDriveTypeW(LPCWSTR lpRootPathName) { - FILE_FS_DEVICE_INFORMATION FileFsDevice; - IO_STATUS_BLOCK IoStatusBlock; - HANDLE hFile; - NTSTATUS Status; - UNICODE_STRING NtPath; - OBJECT_ATTRIBUTES ObjectAttributes; - WCHAR Buffer[MAX_PATH+1]; + FILE_FS_DEVICE_INFORMATION FileFsDevice; + IO_STATUS_BLOCK IoStatusBlock; - if (!lpRootPathName) - { - DWORD cBytes; + HANDLE hFile; + NTSTATUS errCode; - /* Get current directory */ - cBytes = RtlGetCurrentDirectory_U(sizeof(Buffer), Buffer); - if(cBytes < sizeof(Buffer)) + hFile = InternalOpenDirW(lpRootPathName, FALSE); + if (hFile == INVALID_HANDLE_VALUE) + { + return DRIVE_NO_ROOT_DIR; /* According to WINE regression tests */ + } + + errCode = NtQueryVolumeInformationFile (hFile, + &IoStatusBlock, + &FileFsDevice, + sizeof(FILE_FS_DEVICE_INFORMATION), + FileFsDeviceInformation); + if (!NT_SUCCESS(errCode)) + { + CloseHandle(hFile); + SetLastErrorByStatus (errCode); + return 0; + } + CloseHandle(hFile); + + switch (FileFsDevice.DeviceType) { - ASSERT(cBytes < MAX_PATH*sizeof(WCHAR)); - Buffer[cBytes/sizeof(WCHAR)] = L'\\'; - Buffer[cBytes/sizeof(WCHAR)+1] = L'\0'; - lpRootPathName = Buffer; - } /* else fail... should we allow longer current dirs? */ - } + case FILE_DEVICE_CD_ROM: + case FILE_DEVICE_CD_ROM_FILE_SYSTEM: + return DRIVE_CDROM; + case FILE_DEVICE_VIRTUAL_DISK: + return DRIVE_RAMDISK; + case FILE_DEVICE_NETWORK_FILE_SYSTEM: + return DRIVE_REMOTE; + case FILE_DEVICE_DISK: + case FILE_DEVICE_DISK_FILE_SYSTEM: + if (FileFsDevice.Characteristics & FILE_REMOTE_DEVICE) + return DRIVE_REMOTE; + if (FileFsDevice.Characteristics & FILE_REMOVABLE_MEDIA) + return DRIVE_REMOVABLE; + return DRIVE_FIXED; + } - if (!RtlDosPathNameToNtPathName_U(lpRootPathName, &NtPath, NULL, NULL)) - { - WARN("Invalid path: %ls\n", lpRootPathName); - return DRIVE_NO_ROOT_DIR; - } + ERR("Returning DRIVE_UNKNOWN for device type %d\n", FileFsDevice.DeviceType); - /* Path from RtlDosPathNameToNtPathName_U does not contain '/' and multiple '\\' in a row */ - if(!NtPath.Length || NtPath.Buffer[NtPath.Length/sizeof(WCHAR)-1] != L'\\') - { - /* Path must be ended by slash */ - WARN("Invalid path: %ls\n", NtPath.Buffer); - return DRIVE_NO_ROOT_DIR; - } - - /* Remove ending slash */ - NtPath.Length -= sizeof(WCHAR); - - InitializeObjectAttributes(&ObjectAttributes, - &NtPath, - OBJ_CASE_INSENSITIVE, - NULL, - NULL); - - Status = NtCreateFile(&hFile, - FILE_GENERIC_READ, - &ObjectAttributes, - &IoStatusBlock, - NULL, - 0, - FILE_SHARE_READ|FILE_SHARE_WRITE, - FILE_OPEN, - 0, - NULL, - 0); - - RtlFreeUnicodeString(&NtPath); - - if (!NT_SUCCESS(Status)) - { - WARN("Invalid path: %ls\n", lpRootPathName); - return DRIVE_NO_ROOT_DIR; /* According to WINE regression tests */ - } - - Status = NtQueryVolumeInformationFile (hFile, - &IoStatusBlock, - &FileFsDevice, - sizeof(FILE_FS_DEVICE_INFORMATION), - FileFsDeviceInformation); - CloseHandle(hFile); - if (!NT_SUCCESS(Status)) - { - ERR("NtQueryVolumeInformationFile failed for %ls\n", lpRootPathName); - return DRIVE_UNKNOWN; - } - - switch (FileFsDevice.DeviceType) - { - case FILE_DEVICE_CD_ROM: - case FILE_DEVICE_CD_ROM_FILE_SYSTEM: - return DRIVE_CDROM; - case FILE_DEVICE_VIRTUAL_DISK: - return DRIVE_RAMDISK; - case FILE_DEVICE_NETWORK_FILE_SYSTEM: - return DRIVE_REMOTE; - case FILE_DEVICE_DISK: - case FILE_DEVICE_DISK_FILE_SYSTEM: - if (FileFsDevice.Characteristics & FILE_REMOTE_DEVICE) - return DRIVE_REMOTE; - if (FileFsDevice.Characteristics & FILE_REMOVABLE_MEDIA) - return DRIVE_REMOVABLE; - return DRIVE_FIXED; - } - - ERR("Returning DRIVE_UNKNOWN for device type %d\n", FileFsDevice.DeviceType); - - return DRIVE_UNKNOWN; + return DRIVE_UNKNOWN; } @@ -539,134 +486,134 @@ GetDriveTypeW(LPCWSTR lpRootPathName) */ BOOL WINAPI GetVolumeInformationA( - LPCSTR lpRootPathName, - LPSTR lpVolumeNameBuffer, - DWORD nVolumeNameSize, - LPDWORD lpVolumeSerialNumber, - LPDWORD lpMaximumComponentLength, - LPDWORD lpFileSystemFlags, - LPSTR lpFileSystemNameBuffer, - DWORD nFileSystemNameSize -) + LPCSTR lpRootPathName, + LPSTR lpVolumeNameBuffer, + DWORD nVolumeNameSize, + LPDWORD lpVolumeSerialNumber, + LPDWORD lpMaximumComponentLength, + LPDWORD lpFileSystemFlags, + LPSTR lpFileSystemNameBuffer, + DWORD nFileSystemNameSize + ) { - UNICODE_STRING FileSystemNameU; - UNICODE_STRING VolumeNameU = { 0, 0, NULL }; - ANSI_STRING VolumeName; - ANSI_STRING FileSystemName; - PWCHAR RootPathNameW; - BOOL Result; + UNICODE_STRING FileSystemNameU; + UNICODE_STRING VolumeNameU = { 0, 0, NULL }; + ANSI_STRING VolumeName; + ANSI_STRING FileSystemName; + PWCHAR RootPathNameW; + BOOL Result; - if (!(RootPathNameW = FilenameA2W(lpRootPathName, FALSE))) - return FALSE; + if (!(RootPathNameW = FilenameA2W(lpRootPathName, FALSE))) + return FALSE; - if (lpVolumeNameBuffer) + if (lpVolumeNameBuffer) { - VolumeNameU.MaximumLength = (USHORT)nVolumeNameSize * sizeof(WCHAR); - VolumeNameU.Buffer = RtlAllocateHeap (RtlGetProcessHeap (), - 0, - VolumeNameU.MaximumLength); - if (VolumeNameU.Buffer == NULL) - { - goto FailNoMem; - } + VolumeNameU.MaximumLength = (USHORT)nVolumeNameSize * sizeof(WCHAR); + VolumeNameU.Buffer = RtlAllocateHeap (RtlGetProcessHeap (), + 0, + VolumeNameU.MaximumLength); + if (VolumeNameU.Buffer == NULL) + { + goto FailNoMem; + } } - if (lpFileSystemNameBuffer) + if (lpFileSystemNameBuffer) { - FileSystemNameU.Length = 0; - FileSystemNameU.MaximumLength = (USHORT)nFileSystemNameSize * sizeof(WCHAR); - FileSystemNameU.Buffer = RtlAllocateHeap (RtlGetProcessHeap (), - 0, - FileSystemNameU.MaximumLength); - if (FileSystemNameU.Buffer == NULL) - { - if (VolumeNameU.Buffer != NULL) - { - RtlFreeHeap(RtlGetProcessHeap(), - 0, - VolumeNameU.Buffer); - } + FileSystemNameU.Length = 0; + FileSystemNameU.MaximumLength = (USHORT)nFileSystemNameSize * sizeof(WCHAR); + FileSystemNameU.Buffer = RtlAllocateHeap (RtlGetProcessHeap (), + 0, + FileSystemNameU.MaximumLength); + if (FileSystemNameU.Buffer == NULL) + { + if (VolumeNameU.Buffer != NULL) + { + RtlFreeHeap(RtlGetProcessHeap(), + 0, + VolumeNameU.Buffer); + } FailNoMem: - SetLastError(ERROR_NOT_ENOUGH_MEMORY); - return FALSE; - } + SetLastError(ERROR_NOT_ENOUGH_MEMORY); + return FALSE; + } } - Result = GetVolumeInformationW (RootPathNameW, - lpVolumeNameBuffer ? VolumeNameU.Buffer : NULL, - nVolumeNameSize, - lpVolumeSerialNumber, - lpMaximumComponentLength, - lpFileSystemFlags, - lpFileSystemNameBuffer ? FileSystemNameU.Buffer : NULL, - nFileSystemNameSize); + Result = GetVolumeInformationW (RootPathNameW, + lpVolumeNameBuffer ? VolumeNameU.Buffer : NULL, + nVolumeNameSize, + lpVolumeSerialNumber, + lpMaximumComponentLength, + lpFileSystemFlags, + lpFileSystemNameBuffer ? FileSystemNameU.Buffer : NULL, + nFileSystemNameSize); - if (Result) + if (Result) { - if (lpVolumeNameBuffer) + if (lpVolumeNameBuffer) { - VolumeNameU.Length = wcslen(VolumeNameU.Buffer) * sizeof(WCHAR); - VolumeName.Length = 0; - VolumeName.MaximumLength = (USHORT)nVolumeNameSize; - VolumeName.Buffer = lpVolumeNameBuffer; - } + VolumeNameU.Length = wcslen(VolumeNameU.Buffer) * sizeof(WCHAR); + VolumeName.Length = 0; + VolumeName.MaximumLength = (USHORT)nVolumeNameSize; + VolumeName.Buffer = lpVolumeNameBuffer; + } - if (lpFileSystemNameBuffer) - { - FileSystemNameU.Length = wcslen(FileSystemNameU.Buffer) * sizeof(WCHAR); - FileSystemName.Length = 0; - FileSystemName.MaximumLength = (USHORT)nFileSystemNameSize; - FileSystemName.Buffer = lpFileSystemNameBuffer; - } + if (lpFileSystemNameBuffer) + { + FileSystemNameU.Length = wcslen(FileSystemNameU.Buffer) * sizeof(WCHAR); + FileSystemName.Length = 0; + FileSystemName.MaximumLength = (USHORT)nFileSystemNameSize; + FileSystemName.Buffer = lpFileSystemNameBuffer; + } - /* convert unicode strings to ansi (or oem) */ - if (bIsFileApiAnsi) + /* convert unicode strings to ansi (or oem) */ + if (bIsFileApiAnsi) { - if (lpVolumeNameBuffer) - { - RtlUnicodeStringToAnsiString (&VolumeName, - &VolumeNameU, - FALSE); - } - if (lpFileSystemNameBuffer) - { - RtlUnicodeStringToAnsiString (&FileSystemName, - &FileSystemNameU, - FALSE); - } - } - else + if (lpVolumeNameBuffer) + { + RtlUnicodeStringToAnsiString (&VolumeName, + &VolumeNameU, + FALSE); + } + if (lpFileSystemNameBuffer) + { + RtlUnicodeStringToAnsiString (&FileSystemName, + &FileSystemNameU, + FALSE); + } + } + else { - if (lpVolumeNameBuffer) - { - RtlUnicodeStringToOemString (&VolumeName, - &VolumeNameU, - FALSE); - } - if (lpFileSystemNameBuffer) - { - RtlUnicodeStringToOemString (&FileSystemName, - &FileSystemNameU, - FALSE); - } - } + if (lpVolumeNameBuffer) + { + RtlUnicodeStringToOemString (&VolumeName, + &VolumeNameU, + FALSE); + } + if (lpFileSystemNameBuffer) + { + RtlUnicodeStringToOemString (&FileSystemName, + &FileSystemNameU, + FALSE); + } + } } - if (lpVolumeNameBuffer) + if (lpVolumeNameBuffer) { - RtlFreeHeap (RtlGetProcessHeap (), - 0, - VolumeNameU.Buffer); + RtlFreeHeap (RtlGetProcessHeap (), + 0, + VolumeNameU.Buffer); } - if (lpFileSystemNameBuffer) + if (lpFileSystemNameBuffer) { - RtlFreeHeap (RtlGetProcessHeap (), - 0, - FileSystemNameU.Buffer); + RtlFreeHeap (RtlGetProcessHeap (), + 0, + FileSystemNameU.Buffer); } - return Result; + return Result; } #define FS_VOLUME_BUFFER_SIZE (MAX_PATH * sizeof(WCHAR) + sizeof(FILE_FS_VOLUME_INFORMATION)) @@ -686,106 +633,106 @@ GetVolumeInformationW( LPDWORD lpFileSystemFlags, LPWSTR lpFileSystemNameBuffer, DWORD nFileSystemNameSize -) + ) { - PFILE_FS_VOLUME_INFORMATION FileFsVolume; - PFILE_FS_ATTRIBUTE_INFORMATION FileFsAttribute; - IO_STATUS_BLOCK IoStatusBlock; - WCHAR RootPathName[MAX_PATH]; - UCHAR Buffer[max(FS_VOLUME_BUFFER_SIZE, FS_ATTRIBUTE_BUFFER_SIZE)]; + PFILE_FS_VOLUME_INFORMATION FileFsVolume; + PFILE_FS_ATTRIBUTE_INFORMATION FileFsAttribute; + IO_STATUS_BLOCK IoStatusBlock; + WCHAR RootPathName[MAX_PATH]; + UCHAR Buffer[max(FS_VOLUME_BUFFER_SIZE, FS_ATTRIBUTE_BUFFER_SIZE)]; - HANDLE hFile; - NTSTATUS errCode; + HANDLE hFile; + NTSTATUS errCode; - FileFsVolume = (PFILE_FS_VOLUME_INFORMATION)Buffer; - FileFsAttribute = (PFILE_FS_ATTRIBUTE_INFORMATION)Buffer; + FileFsVolume = (PFILE_FS_VOLUME_INFORMATION)Buffer; + FileFsAttribute = (PFILE_FS_ATTRIBUTE_INFORMATION)Buffer; - TRACE("FileFsVolume %p\n", FileFsVolume); - TRACE("FileFsAttribute %p\n", FileFsAttribute); + TRACE("FileFsVolume %p\n", FileFsVolume); + TRACE("FileFsAttribute %p\n", FileFsAttribute); - if (!lpRootPathName || !wcscmp(lpRootPathName, L"")) + if (!lpRootPathName || !wcscmp(lpRootPathName, L"")) + { + GetCurrentDirectoryW (MAX_PATH, RootPathName); + } + else + { + wcsncpy (RootPathName, lpRootPathName, 3); + } + RootPathName[3] = 0; + + hFile = InternalOpenDirW(RootPathName, FALSE); + if (hFile == INVALID_HANDLE_VALUE) { - GetCurrentDirectoryW (MAX_PATH, RootPathName); - } - else - { - wcsncpy (RootPathName, lpRootPathName, 3); - } - RootPathName[3] = 0; - - hFile = InternalOpenDirW(RootPathName, FALSE); - if (hFile == INVALID_HANDLE_VALUE) - { - return FALSE; + return FALSE; } - TRACE("hFile: %x\n", hFile); - errCode = NtQueryVolumeInformationFile(hFile, - &IoStatusBlock, - FileFsVolume, - FS_VOLUME_BUFFER_SIZE, - FileFsVolumeInformation); - if ( !NT_SUCCESS(errCode) ) + TRACE("hFile: %x\n", hFile); + errCode = NtQueryVolumeInformationFile(hFile, + &IoStatusBlock, + FileFsVolume, + FS_VOLUME_BUFFER_SIZE, + FileFsVolumeInformation); + if ( !NT_SUCCESS(errCode) ) { - WARN("Status: %x\n", errCode); - CloseHandle(hFile); - SetLastErrorByStatus (errCode); - return FALSE; + WARN("Status: %x\n", errCode); + CloseHandle(hFile); + SetLastErrorByStatus (errCode); + return FALSE; } - if (lpVolumeSerialNumber) - *lpVolumeSerialNumber = FileFsVolume->VolumeSerialNumber; + if (lpVolumeSerialNumber) + *lpVolumeSerialNumber = FileFsVolume->VolumeSerialNumber; - if (lpVolumeNameBuffer) + if (lpVolumeNameBuffer) { - if (nVolumeNameSize * sizeof(WCHAR) >= FileFsVolume->VolumeLabelLength + sizeof(WCHAR)) + if (nVolumeNameSize * sizeof(WCHAR) >= FileFsVolume->VolumeLabelLength + sizeof(WCHAR)) { - memcpy(lpVolumeNameBuffer, - FileFsVolume->VolumeLabel, - FileFsVolume->VolumeLabelLength); - lpVolumeNameBuffer[FileFsVolume->VolumeLabelLength / sizeof(WCHAR)] = 0; - } - else + memcpy(lpVolumeNameBuffer, + FileFsVolume->VolumeLabel, + FileFsVolume->VolumeLabelLength); + lpVolumeNameBuffer[FileFsVolume->VolumeLabelLength / sizeof(WCHAR)] = 0; + } + else { - CloseHandle(hFile); - SetLastError(ERROR_MORE_DATA); - return FALSE; - } + CloseHandle(hFile); + SetLastError(ERROR_MORE_DATA); + return FALSE; + } } - errCode = NtQueryVolumeInformationFile (hFile, - &IoStatusBlock, - FileFsAttribute, - FS_ATTRIBUTE_BUFFER_SIZE, - FileFsAttributeInformation); - CloseHandle(hFile); - if (!NT_SUCCESS(errCode)) + errCode = NtQueryVolumeInformationFile (hFile, + &IoStatusBlock, + FileFsAttribute, + FS_ATTRIBUTE_BUFFER_SIZE, + FileFsAttributeInformation); + CloseHandle(hFile); + if (!NT_SUCCESS(errCode)) { - WARN("Status: %x\n", errCode); - SetLastErrorByStatus (errCode); - return FALSE; + WARN("Status: %x\n", errCode); + SetLastErrorByStatus (errCode); + return FALSE; } - if (lpFileSystemFlags) - *lpFileSystemFlags = FileFsAttribute->FileSystemAttributes; - if (lpMaximumComponentLength) - *lpMaximumComponentLength = FileFsAttribute->MaximumComponentNameLength; - if (lpFileSystemNameBuffer) + if (lpFileSystemFlags) + *lpFileSystemFlags = FileFsAttribute->FileSystemAttributes; + if (lpMaximumComponentLength) + *lpMaximumComponentLength = FileFsAttribute->MaximumComponentNameLength; + if (lpFileSystemNameBuffer) { - if (nFileSystemNameSize * sizeof(WCHAR) >= FileFsAttribute->FileSystemNameLength + sizeof(WCHAR)) + if (nFileSystemNameSize * sizeof(WCHAR) >= FileFsAttribute->FileSystemNameLength + sizeof(WCHAR)) { - memcpy(lpFileSystemNameBuffer, - FileFsAttribute->FileSystemName, - FileFsAttribute->FileSystemNameLength); - lpFileSystemNameBuffer[FileFsAttribute->FileSystemNameLength / sizeof(WCHAR)] = 0; - } - else + memcpy(lpFileSystemNameBuffer, + FileFsAttribute->FileSystemName, + FileFsAttribute->FileSystemNameLength); + lpFileSystemNameBuffer[FileFsAttribute->FileSystemNameLength / sizeof(WCHAR)] = 0; + } + else { - SetLastError(ERROR_MORE_DATA); - return FALSE; - } + SetLastError(ERROR_MORE_DATA); + return FALSE; + } } - return TRUE; + return TRUE; } @@ -795,34 +742,34 @@ GetVolumeInformationW( BOOL WINAPI SetVolumeLabelA ( - LPCSTR lpRootPathName, - LPCSTR lpVolumeName /* NULL if deleting label */ -) + LPCSTR lpRootPathName, + LPCSTR lpVolumeName /* NULL if deleting label */ + ) { - PWCHAR RootPathNameW; - PWCHAR VolumeNameW = NULL; - BOOL Result; + PWCHAR RootPathNameW; + PWCHAR VolumeNameW = NULL; + BOOL Result; - if (!(RootPathNameW = FilenameA2W(lpRootPathName, FALSE))) - return FALSE; + if (!(RootPathNameW = FilenameA2W(lpRootPathName, FALSE))) + return FALSE; - if (lpVolumeName) - { - if (!(VolumeNameW = FilenameA2W(lpVolumeName, TRUE))) - return FALSE; - } + if (lpVolumeName) + { + if (!(VolumeNameW = FilenameA2W(lpVolumeName, TRUE))) + return FALSE; + } - Result = SetVolumeLabelW (RootPathNameW, - VolumeNameW); + Result = SetVolumeLabelW (RootPathNameW, + VolumeNameW); - if (VolumeNameW) - { - RtlFreeHeap (RtlGetProcessHeap (), - 0, - VolumeNameW ); - } + if (VolumeNameW) + { + RtlFreeHeap (RtlGetProcessHeap (), + 0, + VolumeNameW ); + } - return Result; + return Result; } @@ -831,61 +778,61 @@ SetVolumeLabelA ( */ BOOL WINAPI SetVolumeLabelW( - LPCWSTR lpRootPathName, - LPCWSTR lpVolumeName /* NULL if deleting label */ -) + LPCWSTR lpRootPathName, + LPCWSTR lpVolumeName /* NULL if deleting label */ + ) { - PFILE_FS_LABEL_INFORMATION LabelInfo; - IO_STATUS_BLOCK IoStatusBlock; - ULONG LabelLength; - HANDLE hFile; - NTSTATUS Status; + PFILE_FS_LABEL_INFORMATION LabelInfo; + IO_STATUS_BLOCK IoStatusBlock; + ULONG LabelLength; + HANDLE hFile; + NTSTATUS Status; - LabelLength = wcslen(lpVolumeName) * sizeof(WCHAR); - LabelInfo = RtlAllocateHeap(RtlGetProcessHeap(), - 0, - sizeof(FILE_FS_LABEL_INFORMATION) + - LabelLength); - if (LabelInfo == NULL) - { - SetLastError(ERROR_NOT_ENOUGH_MEMORY); - return FALSE; - } - LabelInfo->VolumeLabelLength = LabelLength; - memcpy(LabelInfo->VolumeLabel, - lpVolumeName, - LabelLength); + LabelLength = wcslen(lpVolumeName) * sizeof(WCHAR); + LabelInfo = RtlAllocateHeap(RtlGetProcessHeap(), + 0, + sizeof(FILE_FS_LABEL_INFORMATION) + + LabelLength); + if (LabelInfo == NULL) + { + SetLastError(ERROR_NOT_ENOUGH_MEMORY); + return FALSE; + } + LabelInfo->VolumeLabelLength = LabelLength; + memcpy(LabelInfo->VolumeLabel, + lpVolumeName, + LabelLength); - hFile = InternalOpenDirW(lpRootPathName, TRUE); - if (INVALID_HANDLE_VALUE == hFile) - { + hFile = InternalOpenDirW(lpRootPathName, TRUE); + if (INVALID_HANDLE_VALUE == hFile) + { RtlFreeHeap(RtlGetProcessHeap(), - 0, - LabelInfo); + 0, + LabelInfo); return FALSE; - } + } - Status = NtSetVolumeInformationFile(hFile, - &IoStatusBlock, - LabelInfo, - sizeof(FILE_FS_LABEL_INFORMATION) + - LabelLength, - FileFsLabelInformation); + Status = NtSetVolumeInformationFile(hFile, + &IoStatusBlock, + LabelInfo, + sizeof(FILE_FS_LABEL_INFORMATION) + + LabelLength, + FileFsLabelInformation); - RtlFreeHeap(RtlGetProcessHeap(), - 0, - LabelInfo); + RtlFreeHeap(RtlGetProcessHeap(), + 0, + LabelInfo); - if (!NT_SUCCESS(Status)) - { - WARN("Status: %x\n", Status); - CloseHandle(hFile); - SetLastErrorByStatus(Status); - return FALSE; - } + if (!NT_SUCCESS(Status)) + { + WARN("Status: %x\n", Status); + CloseHandle(hFile); + SetLastErrorByStatus(Status); + return FALSE; + } - CloseHandle(hFile); - return TRUE; + CloseHandle(hFile); + return TRUE; } /** @@ -909,217 +856,217 @@ SetVolumeLabelW( BOOL WINAPI GetVolumeNameForVolumeMountPointW( - IN LPCWSTR VolumeMountPoint, - OUT LPWSTR VolumeName, - IN DWORD VolumeNameLength) + IN LPCWSTR VolumeMountPoint, + OUT LPWSTR VolumeName, + IN DWORD VolumeNameLength) { - UNICODE_STRING NtFileName; - OBJECT_ATTRIBUTES ObjectAttributes; - HANDLE FileHandle; - IO_STATUS_BLOCK Iosb; - ULONG BufferLength; - PMOUNTDEV_NAME MountDevName; - PMOUNTMGR_MOUNT_POINT MountPoint; - ULONG MountPointSize; - PMOUNTMGR_MOUNT_POINTS MountPoints; - ULONG Index; - PUCHAR SymbolicLinkName; - BOOL Result; - NTSTATUS Status; + UNICODE_STRING NtFileName; + OBJECT_ATTRIBUTES ObjectAttributes; + HANDLE FileHandle; + IO_STATUS_BLOCK Iosb; + ULONG BufferLength; + PMOUNTDEV_NAME MountDevName; + PMOUNTMGR_MOUNT_POINT MountPoint; + ULONG MountPointSize; + PMOUNTMGR_MOUNT_POINTS MountPoints; + ULONG Index; + PUCHAR SymbolicLinkName; + BOOL Result; + NTSTATUS Status; - if (!VolumeMountPoint || !VolumeMountPoint[0]) - { - SetLastError(ERROR_PATH_NOT_FOUND); - return FALSE; - } + if (!VolumeMountPoint || !VolumeMountPoint[0]) + { + SetLastError(ERROR_PATH_NOT_FOUND); + return FALSE; + } - /* - * First step is to convert the passed volume mount point name to - * an NT acceptable name. - */ + /* + * First step is to convert the passed volume mount point name to + * an NT acceptable name. + */ - if (!RtlDosPathNameToNtPathName_U(VolumeMountPoint, &NtFileName, NULL, NULL)) - { - SetLastError(ERROR_PATH_NOT_FOUND); - return FALSE; - } + if (!RtlDosPathNameToNtPathName_U(VolumeMountPoint, &NtFileName, NULL, NULL)) + { + SetLastError(ERROR_PATH_NOT_FOUND); + return FALSE; + } - if (NtFileName.Length > sizeof(WCHAR) && - NtFileName.Buffer[(NtFileName.Length / sizeof(WCHAR)) - 1] == '\\') - { - NtFileName.Length -= sizeof(WCHAR); - } + if (NtFileName.Length > sizeof(WCHAR) && + NtFileName.Buffer[(NtFileName.Length / sizeof(WCHAR)) - 1] == '\\') + { + NtFileName.Length -= sizeof(WCHAR); + } - /* - * Query mount point device name which we will later use for determining - * the volume name. - */ + /* + * Query mount point device name which we will later use for determining + * the volume name. + */ - InitializeObjectAttributes(&ObjectAttributes, &NtFileName, 0, NULL, NULL); - Status = NtOpenFile(&FileHandle, FILE_READ_ATTRIBUTES | SYNCHRONIZE, - &ObjectAttributes, &Iosb, - FILE_SHARE_READ | FILE_SHARE_WRITE, - FILE_SYNCHRONOUS_IO_NONALERT); - RtlFreeUnicodeString(&NtFileName); - if (!NT_SUCCESS(Status)) - { - SetLastErrorByStatus(Status); - return FALSE; - } + InitializeObjectAttributes(&ObjectAttributes, &NtFileName, 0, NULL, NULL); + Status = NtOpenFile(&FileHandle, FILE_READ_ATTRIBUTES | SYNCHRONIZE, + &ObjectAttributes, &Iosb, + FILE_SHARE_READ | FILE_SHARE_WRITE, + FILE_SYNCHRONOUS_IO_NONALERT); + RtlFreeUnicodeString(&NtFileName); + if (!NT_SUCCESS(Status)) + { + SetLastErrorByStatus(Status); + return FALSE; + } - BufferLength = sizeof(MOUNTDEV_NAME) + 50 * sizeof(WCHAR); - do - { - MountDevName = RtlAllocateHeap(RtlGetProcessHeap(), 0, BufferLength); - if (MountDevName == NULL) - { + BufferLength = sizeof(MOUNTDEV_NAME) + 50 * sizeof(WCHAR); + do + { + MountDevName = RtlAllocateHeap(RtlGetProcessHeap(), 0, BufferLength); + if (MountDevName == NULL) + { + NtClose(FileHandle); + SetLastError(ERROR_NOT_ENOUGH_MEMORY); + return FALSE; + } + + Status = NtDeviceIoControlFile(FileHandle, NULL, NULL, NULL, &Iosb, + IOCTL_MOUNTDEV_QUERY_DEVICE_NAME, + NULL, 0, MountDevName, BufferLength); + if (!NT_SUCCESS(Status)) + { + RtlFreeHeap(GetProcessHeap(), 0, MountDevName); + if (Status == STATUS_BUFFER_OVERFLOW) + { + BufferLength = sizeof(MOUNTDEV_NAME) + MountDevName->NameLength; + continue; + } + else + { NtClose(FileHandle); - SetLastError(ERROR_NOT_ENOUGH_MEMORY); + SetLastErrorByStatus(Status); return FALSE; - } + } + } + } + while (!NT_SUCCESS(Status)); - Status = NtDeviceIoControlFile(FileHandle, NULL, NULL, NULL, &Iosb, - IOCTL_MOUNTDEV_QUERY_DEVICE_NAME, - NULL, 0, MountDevName, BufferLength); - if (!NT_SUCCESS(Status)) - { - RtlFreeHeap(GetProcessHeap(), 0, MountDevName); - if (Status == STATUS_BUFFER_OVERFLOW) + NtClose(FileHandle); + + /* + * Get the mount point information from mount manager. + */ + + MountPointSize = MountDevName->NameLength + sizeof(MOUNTMGR_MOUNT_POINT); + MountPoint = RtlAllocateHeap(GetProcessHeap(), 0, MountPointSize); + if (MountPoint == NULL) + { + RtlFreeHeap(GetProcessHeap(), 0, MountDevName); + SetLastError(ERROR_NOT_ENOUGH_MEMORY); + return FALSE; + } + RtlZeroMemory(MountPoint, sizeof(MOUNTMGR_MOUNT_POINT)); + MountPoint->DeviceNameOffset = sizeof(MOUNTMGR_MOUNT_POINT); + MountPoint->DeviceNameLength = MountDevName->NameLength; + RtlCopyMemory(MountPoint + 1, MountDevName->Name, MountDevName->NameLength); + RtlFreeHeap(RtlGetProcessHeap(), 0, MountDevName); + + RtlInitUnicodeString(&NtFileName, L"\\??\\MountPointManager"); + InitializeObjectAttributes(&ObjectAttributes, &NtFileName, 0, NULL, NULL); + Status = NtOpenFile(&FileHandle, FILE_GENERIC_READ | SYNCHRONIZE, &ObjectAttributes, + &Iosb, FILE_SHARE_READ | FILE_SHARE_WRITE, + FILE_SYNCHRONOUS_IO_NONALERT); + if (!NT_SUCCESS(Status)) + { + SetLastErrorByStatus(Status); + RtlFreeHeap(RtlGetProcessHeap(), 0, MountPoint); + return FALSE; + } + + BufferLength = sizeof(MOUNTMGR_MOUNT_POINTS); + do + { + MountPoints = RtlAllocateHeap(RtlGetProcessHeap(), 0, BufferLength); + if (MountPoints == NULL) + { + RtlFreeHeap(RtlGetProcessHeap(), 0, MountPoint); + NtClose(FileHandle); + SetLastError(ERROR_NOT_ENOUGH_MEMORY); + return FALSE; + } + + Status = NtDeviceIoControlFile(FileHandle, NULL, NULL, NULL, &Iosb, + IOCTL_MOUNTMGR_QUERY_POINTS, + MountPoint, MountPointSize, + MountPoints, BufferLength); + if (!NT_SUCCESS(Status)) + { + if (Status == STATUS_BUFFER_OVERFLOW) + { + BufferLength = MountPoints->Size; + RtlFreeHeap(RtlGetProcessHeap(), 0, MountPoints); + continue; + } + else if (!NT_SUCCESS(Status)) + { + RtlFreeHeap(RtlGetProcessHeap(), 0, MountPoint); + RtlFreeHeap(RtlGetProcessHeap(), 0, MountPoints); + NtClose(FileHandle); + SetLastErrorByStatus(Status); + return FALSE; + } + } + } + while (!NT_SUCCESS(Status)); + + RtlFreeHeap(RtlGetProcessHeap(), 0, MountPoint); + NtClose(FileHandle); + + /* + * Now we've gathered info about all mount points mapped to our device, so + * select the correct one and copy it into the output buffer. + */ + + for (Index = 0; Index < MountPoints->NumberOfMountPoints; Index++) + { + MountPoint = MountPoints->MountPoints + Index; + SymbolicLinkName = (PUCHAR)MountPoints + MountPoint->SymbolicLinkNameOffset; + + /* + * Check for "\\?\Volume{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}\" + * (with the last slash being optional) style symbolic links. + */ + + if (MountPoint->SymbolicLinkNameLength == 48 * sizeof(WCHAR) || + (MountPoint->SymbolicLinkNameLength == 49 * sizeof(WCHAR) && + SymbolicLinkName[48] == L'\\')) + { + if (RtlCompareMemory(SymbolicLinkName, L"\\??\\Volume{", + 11 * sizeof(WCHAR)) == 11 * sizeof(WCHAR) && + SymbolicLinkName[19] == L'-' && SymbolicLinkName[24] == L'-' && + SymbolicLinkName[29] == L'-' && SymbolicLinkName[34] == L'-' && + SymbolicLinkName[47] == L'}') + { + if (VolumeNameLength >= MountPoint->SymbolicLinkNameLength / sizeof(WCHAR)) { - BufferLength = sizeof(MOUNTDEV_NAME) + MountDevName->NameLength; - continue; + RtlCopyMemory(VolumeName, + (PUCHAR)MountPoints + MountPoint->SymbolicLinkNameOffset, + MountPoint->SymbolicLinkNameLength); + VolumeName[1] = L'\\'; + Result = TRUE; } else { - NtClose(FileHandle); - SetLastErrorByStatus(Status); - return FALSE; + SetLastError(ERROR_FILENAME_EXCED_RANGE); + Result = FALSE; } - } - } - while (!NT_SUCCESS(Status)); - NtClose(FileHandle); + RtlFreeHeap(RtlGetProcessHeap(), 0, MountPoints); - /* - * Get the mount point information from mount manager. - */ + return Result; + } + } + } - MountPointSize = MountDevName->NameLength + sizeof(MOUNTMGR_MOUNT_POINT); - MountPoint = RtlAllocateHeap(GetProcessHeap(), 0, MountPointSize); - if (MountPoint == NULL) - { - RtlFreeHeap(GetProcessHeap(), 0, MountDevName); - SetLastError(ERROR_NOT_ENOUGH_MEMORY); - return FALSE; - } - RtlZeroMemory(MountPoint, sizeof(MOUNTMGR_MOUNT_POINT)); - MountPoint->DeviceNameOffset = sizeof(MOUNTMGR_MOUNT_POINT); - MountPoint->DeviceNameLength = MountDevName->NameLength; - RtlCopyMemory(MountPoint + 1, MountDevName->Name, MountDevName->NameLength); - RtlFreeHeap(RtlGetProcessHeap(), 0, MountDevName); + RtlFreeHeap(RtlGetProcessHeap(), 0, MountPoints); + SetLastError(ERROR_INVALID_PARAMETER); - RtlInitUnicodeString(&NtFileName, L"\\??\\MountPointManager"); - InitializeObjectAttributes(&ObjectAttributes, &NtFileName, 0, NULL, NULL); - Status = NtOpenFile(&FileHandle, FILE_GENERIC_READ | SYNCHRONIZE, &ObjectAttributes, - &Iosb, FILE_SHARE_READ | FILE_SHARE_WRITE, - FILE_SYNCHRONOUS_IO_NONALERT); - if (!NT_SUCCESS(Status)) - { - SetLastErrorByStatus(Status); - RtlFreeHeap(RtlGetProcessHeap(), 0, MountPoint); - return FALSE; - } - - BufferLength = sizeof(MOUNTMGR_MOUNT_POINTS); - do - { - MountPoints = RtlAllocateHeap(RtlGetProcessHeap(), 0, BufferLength); - if (MountPoints == NULL) - { - RtlFreeHeap(RtlGetProcessHeap(), 0, MountPoint); - NtClose(FileHandle); - SetLastError(ERROR_NOT_ENOUGH_MEMORY); - return FALSE; - } - - Status = NtDeviceIoControlFile(FileHandle, NULL, NULL, NULL, &Iosb, - IOCTL_MOUNTMGR_QUERY_POINTS, - MountPoint, MountPointSize, - MountPoints, BufferLength); - if (!NT_SUCCESS(Status)) - { - if (Status == STATUS_BUFFER_OVERFLOW) - { - BufferLength = MountPoints->Size; - RtlFreeHeap(RtlGetProcessHeap(), 0, MountPoints); - continue; - } - else if (!NT_SUCCESS(Status)) - { - RtlFreeHeap(RtlGetProcessHeap(), 0, MountPoint); - RtlFreeHeap(RtlGetProcessHeap(), 0, MountPoints); - NtClose(FileHandle); - SetLastErrorByStatus(Status); - return FALSE; - } - } - } - while (!NT_SUCCESS(Status)); - - RtlFreeHeap(RtlGetProcessHeap(), 0, MountPoint); - NtClose(FileHandle); - - /* - * Now we've gathered info about all mount points mapped to our device, so - * select the correct one and copy it into the output buffer. - */ - - for (Index = 0; Index < MountPoints->NumberOfMountPoints; Index++) - { - MountPoint = MountPoints->MountPoints + Index; - SymbolicLinkName = (PUCHAR)MountPoints + MountPoint->SymbolicLinkNameOffset; - - /* - * Check for "\\?\Volume{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}\" - * (with the last slash being optional) style symbolic links. - */ - - if (MountPoint->SymbolicLinkNameLength == 48 * sizeof(WCHAR) || - (MountPoint->SymbolicLinkNameLength == 49 * sizeof(WCHAR) && - SymbolicLinkName[48] == L'\\')) - { - if (RtlCompareMemory(SymbolicLinkName, L"\\??\\Volume{", - 11 * sizeof(WCHAR)) == 11 * sizeof(WCHAR) && - SymbolicLinkName[19] == L'-' && SymbolicLinkName[24] == L'-' && - SymbolicLinkName[29] == L'-' && SymbolicLinkName[34] == L'-' && - SymbolicLinkName[47] == L'}') - { - if (VolumeNameLength >= MountPoint->SymbolicLinkNameLength / sizeof(WCHAR)) - { - RtlCopyMemory(VolumeName, - (PUCHAR)MountPoints + MountPoint->SymbolicLinkNameOffset, - MountPoint->SymbolicLinkNameLength); - VolumeName[1] = L'\\'; - Result = TRUE; - } - else - { - SetLastError(ERROR_FILENAME_EXCED_RANGE); - Result = FALSE; - } - - RtlFreeHeap(RtlGetProcessHeap(), 0, MountPoints); - - return Result; - } - } - } - - RtlFreeHeap(RtlGetProcessHeap(), 0, MountPoints); - SetLastError(ERROR_INVALID_PARAMETER); - - return FALSE; + return FALSE; } /* @@ -1131,7 +1078,7 @@ GetVolumeNameForVolumeMountPointA( LPCSTR lpszVolumeMountPoint, LPSTR lpszVolumeName, DWORD cchBufferLength -) + ) { BOOL ret; WCHAR volumeW[50], *pathW = NULL; @@ -1155,9 +1102,9 @@ GetVolumeNameForVolumeMountPointA( HANDLE WINAPI FindFirstVolumeW( - LPWSTR volume, - DWORD len -) + LPWSTR volume, + DWORD len + ) { DWORD size = 1024; HANDLE mgr = CreateFileW( MOUNTMGR_DOS_DEVICE_NAME, 0, FILE_SHARE_READ|FILE_SHARE_WRITE, @@ -1204,9 +1151,9 @@ FindFirstVolumeW( HANDLE WINAPI FindFirstVolumeA( - LPSTR volume, - DWORD len -) + LPSTR volume, + DWORD len + ) { WCHAR *buffer = NULL; HANDLE handle; @@ -1240,7 +1187,7 @@ BOOL WINAPI FindVolumeClose( HANDLE hFindVolume -) + ) { return RtlFreeHeap(RtlGetProcessHeap(), 0, hFindVolume); } @@ -1328,12 +1275,12 @@ GetVolumePathNameW(LPCWSTR lpszFileName, } while (!GetVolumeNameForVolumeMountPointW(UnicodeFilePath.Buffer, - VolumeName, - MAX_PATH)) + VolumeName, + MAX_PATH)) { if (((UnicodeFilePath.Length == 4) && (UnicodeFilePath.Buffer[0] == '\\') && - (UnicodeFilePath.Buffer[1] == '\\')) || ((UnicodeFilePath.Length == 6) && - (UnicodeFilePath.Buffer[1] == ':'))) + (UnicodeFilePath.Buffer[1] == '\\')) || ((UnicodeFilePath.Length == 6) && + (UnicodeFilePath.Buffer[1] == ':'))) { break; } From 68e29fb6fce2f94dd1e7252dab3d7d182ab52d73 Mon Sep 17 00:00:00 2001 From: Gregor Schneider Date: Mon, 2 May 2011 21:01:14 +0000 Subject: [PATCH 286/317] [libjpeg] Forgotten files from r51559 svn path=/trunk/; revision=51561 --- reactos/include/reactos/libs/libjpeg/jmorecfg.h | 4 ---- reactos/include/reactos/libs/libjpeg/jpeglib.h | 8 +++++--- reactos/include/reactos/libs/libjpeg/jversion.h | 6 +++--- 3 files changed, 8 insertions(+), 10 deletions(-) diff --git a/reactos/include/reactos/libs/libjpeg/jmorecfg.h b/reactos/include/reactos/libs/libjpeg/jmorecfg.h index ce741f84c6e..b543a04fd55 100644 --- a/reactos/include/reactos/libs/libjpeg/jmorecfg.h +++ b/reactos/include/reactos/libs/libjpeg/jmorecfg.h @@ -23,10 +23,6 @@ #define BITS_IN_JSAMPLE 8 /* use 8 or 12 */ -#if (defined (_MSC_VER) && (_MSC_VER >= 800)) -#define HAVE_UNSIGNED_CHAR -#define EXTERN(type) extern type __cdecl -#endif /* * Maximum number of components (color channels) allowed in JPEG image. diff --git a/reactos/include/reactos/libs/libjpeg/jpeglib.h b/reactos/include/reactos/libs/libjpeg/jpeglib.h index 5039d4bf4c4..1eb1fac033f 100644 --- a/reactos/include/reactos/libs/libjpeg/jpeglib.h +++ b/reactos/include/reactos/libs/libjpeg/jpeglib.h @@ -2,7 +2,7 @@ * jpeglib.h * * Copyright (C) 1991-1998, Thomas G. Lane. - * Modified 2002-2009 by Guido Vollbeding. + * Modified 2002-2010 by Guido Vollbeding. * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * @@ -33,11 +33,13 @@ extern "C" { #endif #endif -/* Version ID for the JPEG library. +/* Version IDs for the JPEG library. * Might be useful for tests like "#if JPEG_LIB_VERSION >= 80". */ -#define JPEG_LIB_VERSION 80 /* Version 8.0 */ +#define JPEG_LIB_VERSION 80 /* Compatibility version 8.0 */ +#define JPEG_LIB_VERSION_MAJOR 8 +#define JPEG_LIB_VERSION_MINOR 3 /* Various constants determining the sizes of things. diff --git a/reactos/include/reactos/libs/libjpeg/jversion.h b/reactos/include/reactos/libs/libjpeg/jversion.h index 70c8b6fe176..e868538c884 100644 --- a/reactos/include/reactos/libs/libjpeg/jversion.h +++ b/reactos/include/reactos/libs/libjpeg/jversion.h @@ -1,7 +1,7 @@ /* * jversion.h * - * Copyright (C) 1991-2010, Thomas G. Lane, Guido Vollbeding. + * Copyright (C) 1991-2011, Thomas G. Lane, Guido Vollbeding. * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * @@ -9,6 +9,6 @@ */ -#define JVERSION "8b 16-May-2010" +#define JVERSION "8c 16-Jan-2011" -#define JCOPYRIGHT "Copyright (C) 2010, Thomas G. Lane, Guido Vollbeding" +#define JCOPYRIGHT "Copyright (C) 2011, Thomas G. Lane, Guido Vollbeding" From 7aadf33a619b77d8d0dafa963729f5694742dd55 Mon Sep 17 00:00:00 2001 From: James Tabor Date: Mon, 2 May 2011 22:44:48 +0000 Subject: [PATCH 287/317] [Win32k] - Fix TranslateAccelerator and added the missing routines. User32 wine msg test_accelerators works. - Test application: http://www.transmissionzero.co.uk/computing/win32-apps-with-mingw/ svn path=/trunk/; revision=51562 --- .../win32/win32k/ntuser/accelerator.c | 119 ++++++++---------- reactos/subsystems/win32/win32k/ntuser/menu.c | 77 ++++++++++++ 2 files changed, 131 insertions(+), 65 deletions(-) diff --git a/reactos/subsystems/win32/win32k/ntuser/accelerator.c b/reactos/subsystems/win32/win32k/ntuser/accelerator.c index 06240449ffc..778b18c7159 100644 --- a/reactos/subsystems/win32/win32k/ntuser/accelerator.c +++ b/reactos/subsystems/win32/win32k/ntuser/accelerator.c @@ -35,6 +35,10 @@ #define NDEBUG #include +UINT FASTCALL IntFindSubMenu(HMENU *hMenu, HMENU hSubTarget ); +HMENU FASTCALL IntGetSubMenu( HMENU hMenu, int nPos); +UINT FASTCALL IntGetMenuState( HMENU hMenu, UINT uId, UINT uFlags); + /* FUNCTIONS *****************************************************************/ INIT_FUNCTION @@ -102,16 +106,14 @@ co_IntTranslateAccelerator( return FALSE; } - DPRINT("NtUserGetKeyState(VK_SHIFT) = 0x%x\n", - UserGetKeyState(VK_SHIFT)); - DPRINT("NtUserGetKeyState(VK_CONTROL) = 0x%x\n", - UserGetKeyState(VK_CONTROL)); - DPRINT("NtUserGetKeyState(VK_MENU) = 0x%x\n", - UserGetKeyState(VK_MENU)); + DPRINT("NtUserGetKeyState(VK_CONTROL) = 0x%x\n",UserGetKeyState(VK_CONTROL)); + DPRINT("NtUserGetKeyState(VK_MENU) = 0x%x\n",UserGetKeyState(VK_MENU)); + DPRINT("NtUserGetKeyState(VK_SHIFT) = 0x%x\n",UserGetKeyState(VK_SHIFT)); if (UserGetKeyState(VK_CONTROL) & 0x8000) mask |= FCONTROL; if (UserGetKeyState(VK_MENU) & 0x8000) mask |= FALT; if (UserGetKeyState(VK_SHIFT) & 0x8000) mask |= FSHIFT; + DPRINT("Mask 0x%x\n",mask); if (message == WM_CHAR || message == WM_SYSCHAR) { @@ -129,7 +131,7 @@ co_IntTranslateAccelerator( wParam, 0xff & HIWORD(lParam)); if (mask == (fVirt & (FSHIFT | FCONTROL | FALT))) goto found; - DPRINT("but incorrect SHIFT/CTRL/ALT-state\n"); + DPRINT("but incorrect SHIFT/CTRL/ALT-state mask %x fVirt %x\n",mask,fVirt); } else { @@ -152,20 +154,13 @@ co_IntTranslateAccelerator( found: if (message == WM_KEYUP || message == WM_SYSKEYUP) mesg = 1; - else if (IntGetCaptureWindow()) - mesg = 2; - else if (Window->style & WS_DISABLED) - mesg = 3; else { -#if 0 HMENU hMenu, hSubMenu, hSysMenu; UINT uSysStat = (UINT)-1, uStat = (UINT)-1, nPos; PMENU_OBJECT MenuObject, SubMenu; - MENU_ITEM MenuItem; + PMENU_ITEM MenuItem; -// hMenu = (UserGetWindowLongW(hWnd, GWL_STYLE) & WS_CHILD) ? 0 : GetMenu(hWnd); -// hSysMenu = get_win_sys_menu(hWnd); hMenu = (Window->style & WS_CHILD) ? 0 : (HMENU)Window->IDMenu; hSysMenu = Window->SystemMenu; MenuObject = IntGetMenuObject(Window->SystemMenu); @@ -173,41 +168,8 @@ found: /* find menu item and ask application to initialize it */ /* 1. in the system menu */ hSubMenu = hSysMenu; -// nPos = cmd; -// if(MENU_FindItem(&hSubMenu, &nPos, MF_BYCOMMAND)) - nPos = IntGetMenuItemByFlag( MenuObject, - cmd, - MF_BYCOMMAND, - &SubMenu, - &MenuItem, - NULL); - - if (MenuItem && (nPos != (UINT)-1)) + if (MenuObject) { - hSubMenu = MenuItem.hSubMenu; - - if (IntGetCaptureWindow()) - mesg = 2; - if (Window->style & WS_DISABLED) - mesg = 3; - else - { - co_IntSendMessage(hWnd, WM_INITMENU, (WPARAM)hSysMenu, 0L); - if(hSubMenu != hSysMenu) - { - nPos = MENU_FindSubMenu(&hSysMenu, hSubMenu); - DPRINT("hSysMenu = %p, hSubMenu = %p, nPos = %d\n", hSysMenu, hSubMenu, nPos); - co_IntSendMessage(hWnd, WM_INITMENUPOPUP, (WPARAM)hSubMenu, MAKELPARAM(nPos, TRUE)); - } - uSysStat = GetMenuState(GetSubMenu(hSysMenu, 0), cmd, MF_BYCOMMAND); - } - } - else /* 2. in the window's menu */ - { - MenuObject = IntGetMenuObject(hMenu); - hSubMenu = hMenu; -// nPos = cmd; -// if(MENU_FindItem(&hSubMenu, &nPos, MF_BYCOMMAND)) nPos = IntGetMenuItemByFlag( MenuObject, cmd, MF_BYCOMMAND, @@ -217,24 +179,58 @@ found: if (MenuItem && (nPos != (UINT)-1)) { + hSubMenu = MenuItem->hSubMenu; + if (IntGetCaptureWindow()) mesg = 2; if (Window->style & WS_DISABLED) mesg = 3; else - { - co_IntSendMessage(hWnd, WM_INITMENU, (WPARAM)hMenu, 0L); - if(hSubMenu != hMenu) + { + co_IntSendMessage(hWnd, WM_INITMENU, (WPARAM)hSysMenu, 0L); + if (hSubMenu != hSysMenu) { - nPos = MENU_FindSubMenu(&hMenu, hSubMenu); - DPRINT("hMenu = %p, hSubMenu = %p, nPos = %d\n", hMenu, hSubMenu, nPos); - co_IntSendMessage(hWnd, WM_INITMENUPOPUP, (WPARAM)hSubMenu, MAKELPARAM(nPos, FALSE)); + nPos = IntFindSubMenu(&hSysMenu, hSubMenu); + DPRINT("hSysMenu = %p, hSubMenu = %p, nPos = %d\n", hSysMenu, hSubMenu, nPos); + co_IntSendMessage(hWnd, WM_INITMENUPOPUP, (WPARAM)hSubMenu, MAKELPARAM(nPos, TRUE)); + } + uSysStat = IntGetMenuState(IntGetSubMenu(hSysMenu, 0), cmd, MF_BYCOMMAND); + } + } + else /* 2. in the window's menu */ + { + MenuObject = IntGetMenuObject(hMenu); + hSubMenu = hMenu; + if (MenuObject) + { + nPos = IntGetMenuItemByFlag( MenuObject, + cmd, + MF_BYCOMMAND, + &SubMenu, + &MenuItem, + NULL); + + if (MenuItem && (nPos != (UINT)-1)) + { + if (IntGetCaptureWindow()) + mesg = 2; + if (Window->style & WS_DISABLED) + mesg = 3; + else + { + co_IntSendMessage(hWnd, WM_INITMENU, (WPARAM)hMenu, 0L); + if (hSubMenu != hMenu) + { + nPos = IntFindSubMenu(&hMenu, hSubMenu); + DPRINT("hMenu = %p, hSubMenu = %p, nPos = %d\n", hMenu, hSubMenu, nPos); + co_IntSendMessage(hWnd, WM_INITMENUPOPUP, (WPARAM)hSubMenu, MAKELPARAM(nPos, FALSE)); + } + uStat = IntGetMenuState(hMenu, cmd, MF_BYCOMMAND); + } } - uStat = GetMenuState(hMenu, cmd, MF_BYCOMMAND); } } } - if (mesg == 0) { if (uSysStat != (UINT)-1) @@ -264,10 +260,6 @@ found: } } } -#else - DPRINT1("Menu search not implemented\n"); - mesg = WM_COMMAND; -#endif } if (mesg == WM_COMMAND) @@ -291,7 +283,7 @@ found: * #5: it's a menu option, but window is iconic * #6: it's a menu option, but disabled */ - DPRINT(", but won't send WM_{SYS}COMMAND, reason is #%d\n", mesg); + DPRINT1(", but won't send WM_{SYS}COMMAND, reason is #%d\n", mesg); if (mesg == 0) { DPRINT1(" unknown reason - please report!"); @@ -434,8 +426,6 @@ CLEANUP: END_CLEANUP; } - - BOOLEAN APIENTRY NtUserDestroyAcceleratorTable( @@ -473,7 +463,6 @@ CLEANUP: END_CLEANUP; } - int APIENTRY NtUserTranslateAccelerator( diff --git a/reactos/subsystems/win32/win32k/ntuser/menu.c b/reactos/subsystems/win32/win32k/ntuser/menu.c index 2c2a18f001c..1c76f37e60d 100644 --- a/reactos/subsystems/win32/win32k/ntuser/menu.c +++ b/reactos/subsystems/win32/win32k/ntuser/menu.c @@ -1467,6 +1467,83 @@ UserInsertMenuItem( return FALSE; } +UINT FASTCALL IntGetMenuState( HMENU hMenu, UINT uId, UINT uFlags) +{ + PMENU_OBJECT MenuObject, SubMenu; + PMENU_ITEM mi; + + if (!(MenuObject = UserGetMenuObject(hMenu))) + { + return (UINT)-1; + } + + if (IntGetMenuItemByFlag(MenuObject, uId, uFlags, &SubMenu, &mi, NULL)) + { + if (mi->hSubMenu) + { + if (SubMenu) + { + UINT nSubItems = SubMenu->MenuInfo.MenuItemCount; + return (nSubItems << 8) | ((mi->fState | mi->fType) & 0xff); + } + else + return (UINT)-1; + } + return (mi->fType | mi->fState); + } + return (UINT)-1; +} + +HMENU FASTCALL IntGetSubMenu( HMENU hMenu, int nPos) +{ + PMENU_OBJECT MenuObject, SubMenu; + + if (!(MenuObject = UserGetMenuObject(hMenu))) + { + return NULL; + } + if (IntGetMenuItemByFlag(MenuObject, nPos, MF_BYPOSITION, &SubMenu, NULL, NULL)) + { + return SubMenu ? UserHMGetHandle(SubMenu) : NULL; + } + return NULL; +} + +UINT FASTCALL IntFindSubMenu(HMENU *hMenu, HMENU hSubTarget ) +{ + PMENU_OBJECT MenuObject; + PMENU_ITEM mi; + UINT i; + + if ( (*hMenu) == (HMENU)0xffff || !(MenuObject = UserGetMenuObject(*hMenu)) ) + return NO_SELECTED_ITEM; + + for (i = 0; i < MenuObject->MenuInfo.MenuItemCount; i++) + { + if (!IntGetMenuItemByFlag(MenuObject, i, MF_BYPOSITION, NULL, &mi, NULL)) + { + return NO_SELECTED_ITEM; + } + + if (!(mi->fType & MF_POPUP)) continue; + + if (mi->hSubMenu == hSubTarget) + { + return i; + } + else + { + HMENU hsubmenu = mi->hSubMenu; + UINT pos = IntFindSubMenu(&hsubmenu, hSubTarget ); + if (pos != NO_SELECTED_ITEM) + { + *hMenu = hsubmenu; + return pos; + } + } + } + return NO_SELECTED_ITEM; +} /* FUNCTIONS *****************************************************************/ From b221e005e6a6049b73d6e01f506ae11f41b2fbed Mon Sep 17 00:00:00 2001 From: James Tabor Date: Tue, 3 May 2011 00:21:08 +0000 Subject: [PATCH 288/317] Turn on test_accelerators. svn path=/trunk/; revision=51564 --- rostests/winetests/user32/msg.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/rostests/winetests/user32/msg.c b/rostests/winetests/user32/msg.c index aef282018f1..d3e24097072 100755 --- a/rostests/winetests/user32/msg.c +++ b/rostests/winetests/user32/msg.c @@ -12572,10 +12572,7 @@ START_TEST(msg) test_paint_messages(); test_interthread_messages(); test_message_conversion(); - if(!winetest_interactive) - skip("skipping test_accelerators, that hangs on reactos\n"); - else - test_accelerators(); + test_accelerators(); test_timers(); test_timers_no_wnd(); if (hCBT_hook) test_set_hook(); From 82189efb3a78393eb68e0b9bb382b871105eb71f Mon Sep 17 00:00:00 2001 From: James Tabor Date: Tue, 3 May 2011 02:01:59 +0000 Subject: [PATCH 289/317] - Turn on User32 msg test_menu_messages. The Alt-E/F keys work now. This is what the test is for. WM_SYSCHAR is translated but not being passed back to Alt-Space and friends in defwnd.c. These applications need to be reexamined to clarify this issue. Notepad accelerator keys work now but Alt-E/F/Space etc do not. Referencing base bug 1091. svn path=/trunk/; revision=51565 --- rostests/winetests/user32/msg.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/rostests/winetests/user32/msg.c b/rostests/winetests/user32/msg.c index d3e24097072..e0494ef2a06 100755 --- a/rostests/winetests/user32/msg.c +++ b/rostests/winetests/user32/msg.c @@ -12593,10 +12593,7 @@ START_TEST(msg) test_dialog_messages(); test_nullCallback(); test_dbcs_wm_char(); - if(!winetest_interactive) - skip("skipping test_menu_messages, that hangs on reactos\n"); - else - test_menu_messages(); + test_menu_messages(); test_paintingloop(); test_defwinproc(); test_clipboard_viewers(); From a3c6e37bce1ef148afc633333e1aca735dfb9ba9 Mon Sep 17 00:00:00 2001 From: Gabriel Ilardi Date: Tue, 3 May 2011 14:55:52 +0000 Subject: [PATCH 290/317] [win32k] - Handle font height == 0 also in TextIntGetTextExtentPoint (bug 5305) - Remove hardcoded font height (11) and replace it with the default font height from the device context by Timo. svn path=/trunk/; revision=51566 --- .../win32/win32k/objects/freetype.c | 31 +++++++++---------- 1 file changed, 14 insertions(+), 17 deletions(-) diff --git a/reactos/subsystems/win32/win32k/objects/freetype.c b/reactos/subsystems/win32/win32k/objects/freetype.c index 994d513f32f..2315b9058cc 100644 --- a/reactos/subsystems/win32/win32k/objects/freetype.c +++ b/reactos/subsystems/win32/win32k/objects/freetype.c @@ -1569,8 +1569,8 @@ ftGdiGetGlyphOutline( // FT_Set_Pixel_Sizes(ft_face, // TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfWidth, /* FIXME should set character height if neg */ -// (TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfHeight < 0 ? - TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfHeight : -// TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfHeight == 0 ? 11 : TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfHeight)); +// (TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfHeight == 0 ? +// dc->ppdev->devinfo.lfDefaultFont.lfHeight : abs(TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfHeight))); TEXTOBJ_UnlockText(TextObj); @@ -2165,9 +2165,8 @@ TextIntGetTextExtentPoint(PDC dc, error = FT_Set_Pixel_Sizes(face, TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfWidth, /* FIXME should set character height if neg */ - (TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfHeight < 0 ? - - TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfHeight : - TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfHeight == 0 ? 11 : TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfHeight)); + (TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfHeight == 0 ? + dc->ppdev->devinfo.lfDefaultFont.lfHeight : abs(TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfHeight))); if (error) { DPRINT1("Error in setting pixel sizes: %u\n", error); @@ -2228,7 +2227,8 @@ TextIntGetTextExtentPoint(PDC dc, IntUnLockFreeType; Size->cx = (TotalWidth + 32) >> 6; - Size->cy = (TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfHeight < 0 ? - TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfHeight : TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfHeight); + Size->cy = (TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfHeight == 0 ? + dc->ppdev->devinfo.lfDefaultFont.lfHeight : abs(TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfHeight)); Size->cy = EngMulDiv(Size->cy, dc->ppdev->gdiinfo.ulLogPixelsY, 72); return TRUE; @@ -2452,9 +2452,8 @@ ftGdiGetTextMetricsW( Error = FT_Set_Pixel_Sizes(Face, TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfWidth, /* FIXME should set character height if neg */ - (TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfHeight < 0 ? - - TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfHeight : - TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfHeight == 0 ? 11 : TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfHeight)); + (TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfHeight == 0 ? + dc->ppdev->devinfo.lfDefaultFont.lfHeight : abs(TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfHeight))); IntUnLockFreeType; if (0 != Error) { @@ -3304,9 +3303,8 @@ GreExtTextOutW( face, TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfWidth, /* FIXME should set character height if neg */ - (TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfHeight < 0 ? - - TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfHeight : - TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfHeight == 0 ? 11 : TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfHeight)); + (TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfHeight == 0 ? + dc->ppdev->devinfo.lfDefaultFont.lfHeight : abs(TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfHeight))); if (error) { DPRINT1("Error in setting pixel sizes: %u\n", error); @@ -3843,8 +3841,8 @@ NtGdiGetCharABCWidthsW( FT_Set_Pixel_Sizes(face, TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfWidth, /* FIXME should set character height if neg */ - (TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfHeight < 0 ? - TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfHeight : - TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfHeight == 0 ? 11 : TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfHeight)); + (TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfHeight == 0 ? + dc->ppdev->devinfo.lfDefaultFont.lfHeight : abs(TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfHeight))); for (i = FirstChar; i < FirstChar+Count; i++) { @@ -4010,9 +4008,8 @@ NtGdiGetCharWidthW( FT_Set_Pixel_Sizes(face, TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfWidth, /* FIXME should set character height if neg */ - (TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfHeight < 0 ? - - TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfHeight : - TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfHeight == 0 ? 11 : TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfHeight)); + (TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfHeight == 0 ? + dc->ppdev->devinfo.lfDefaultFont.lfHeight : abs(TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfHeight))); for (i = FirstChar; i < FirstChar+Count; i++) { From fd8c53e19ce950584f47c97dfdb84c1086ad0dd6 Mon Sep 17 00:00:00 2001 From: Gregor Schneider Date: Tue, 3 May 2011 21:05:41 +0000 Subject: [PATCH 291/317] [explorer] Remove debug outputs added in r51524 svn path=/trunk/; revision=51568 --- reactos/base/shell/explorer/desktop/desktop.cpp | 2 +- reactos/base/shell/explorer/taskbar/desktopbar.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/base/shell/explorer/desktop/desktop.cpp b/reactos/base/shell/explorer/desktop/desktop.cpp index 4c35f37243b..52c5dce1898 100644 --- a/reactos/base/shell/explorer/desktop/desktop.cpp +++ b/reactos/base/shell/explorer/desktop/desktop.cpp @@ -469,7 +469,7 @@ LRESULT DesktopWindow::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) // forward message to common controls SendMessage(g_Globals._hwndShellView, WM_SYSCOLORCHANGE, 0, 0); - SendMessage(_desktopBar, WM_SYSCOLORCHANGE, 0, 0);OutputDebugStringA("WM_SYSCOLORCHANGE desktop\n"); + SendMessage(_desktopBar, WM_SYSCOLORCHANGE, 0, 0); break; default: def: diff --git a/reactos/base/shell/explorer/taskbar/desktopbar.cpp b/reactos/base/shell/explorer/taskbar/desktopbar.cpp index c52a1671a06..51c846cfa83 100644 --- a/reactos/base/shell/explorer/taskbar/desktopbar.cpp +++ b/reactos/base/shell/explorer/taskbar/desktopbar.cpp @@ -345,7 +345,7 @@ LRESULT DesktopBar::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) case PM_GET_NOTIFYAREA: return (LRESULT)(HWND)_hwndNotify; - case WM_SYSCOLORCHANGE:OutputDebugStringA("WM_SYSCOLORCHANGE desktopbar\n"); + case WM_SYSCOLORCHANGE: /* Forward WM_SYSCOLORCHANGE to common controls */ #ifndef _NO_REBAR SendMessage(_hwndrebar, WM_SYSCOLORCHANGE, 0, 0); From 40222f1c75006939a2b3fda175efd7508e73e165 Mon Sep 17 00:00:00 2001 From: James Tabor Date: Wed, 4 May 2011 01:31:47 +0000 Subject: [PATCH 292/317] [Win32k] - Move up the chain to convert F10 to system key mode before going into the queue, so when in menu tracking, the message can be removed and processed, see bug 1009. svn path=/trunk/; revision=51571 --- reactos/subsystems/win32/win32k/ntuser/input.c | 7 ++++++- reactos/subsystems/win32/win32k/ntuser/msgqueue.c | 4 ---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/reactos/subsystems/win32/win32k/ntuser/input.c b/reactos/subsystems/win32/win32k/ntuser/input.c index 604ede7cabc..5c7637f0056 100644 --- a/reactos/subsystems/win32/win32k/ntuser/input.c +++ b/reactos/subsystems/win32/win32k/ntuser/input.c @@ -482,7 +482,7 @@ static VOID APIENTRY co_IntKeyboardSendAltKeyMsg() { DPRINT1("co_IntKeyboardSendAltKeyMsg\n"); -// co_MsqPostKeyboardMessage(WM_SYSCOMMAND,SC_KEYMENU,0); This sends everything into a msg loop! + //co_MsqPostKeyboardMessage(WM_SYSCOMMAND,SC_KEYMENU,0); // This sends everything into a msg loop! } static VOID APIENTRY @@ -860,6 +860,11 @@ KeyboardThreadMain(PVOID StartContext) /* There is no focused window to receive a keyboard message */ continue; } + if ( msg.wParam == VK_F10 ) // Bypass this key before it is in the queue. + { + if (msg.message == WM_KEYUP) msg.message = WM_SYSKEYUP; + if (msg.message == WM_KEYDOWN) msg.message = WM_SYSKEYDOWN; + } /* * Post a keyboard message. */ diff --git a/reactos/subsystems/win32/win32k/ntuser/msgqueue.c b/reactos/subsystems/win32/win32k/ntuser/msgqueue.c index e34d0a3101b..b14cd967d53 100644 --- a/reactos/subsystems/win32/win32k/ntuser/msgqueue.c +++ b/reactos/subsystems/win32/win32k/ntuser/msgqueue.c @@ -1340,10 +1340,6 @@ BOOL co_IntProcessKeyboardMessage(MSG* Msg, BOOL* RemoveMessages) case VK_LMENU: case VK_RMENU: Msg->wParam = VK_MENU; break; - case VK_F10: - if (Msg->message == WM_KEYUP) Msg->message = WM_SYSKEYUP; - if (Msg->message == WM_KEYDOWN) Msg->message = WM_SYSKEYDOWN; - break; } } From 0c937e4c3717ea3e354528aef3f5511d57ad65bb Mon Sep 17 00:00:00 2001 From: James Tabor Date: Wed, 4 May 2011 12:18:57 +0000 Subject: [PATCH 293/317] [User32] - Fix loop when using arrow keys in menu mode, other miscellaneous code changes. svn path=/trunk/; revision=51574 --- reactos/dll/win32/user32/windows/menu.c | 97 ++++++++++++------------- 1 file changed, 47 insertions(+), 50 deletions(-) diff --git a/reactos/dll/win32/user32/windows/menu.c b/reactos/dll/win32/user32/windows/menu.c index e98084950c3..d6332ac5dcf 100644 --- a/reactos/dll/win32/user32/windows/menu.c +++ b/reactos/dll/win32/user32/windows/menu.c @@ -2913,8 +2913,8 @@ MenuDoNextMenu(MTRACKER* Mt, UINT Vk, UINT wFlags) if (NewWnd != Mt->OwnerWnd) { Mt->OwnerWnd = NewWnd; - SetCapture(Mt->OwnerWnd); - (void)NtUserSetGUIThreadHandle(MSQ_STATE_MENUOWNER, Mt->OwnerWnd); + (void)NtUserSetGUIThreadHandle(MSQ_STATE_MENUOWNER, Mt->OwnerWnd); // 1 + SetCapture(Mt->OwnerWnd); // 2 } Mt->TopMenu = Mt->CurrentMenu = NewMenu; /* all subpopups are hidden */ @@ -2936,37 +2936,35 @@ MenuDoNextMenu(MTRACKER* Mt, UINT Vk, UINT wFlags) * going to hide it anyway. */ static BOOL FASTCALL -MenuSuspendPopup(MTRACKER* Mt, UINT Message) +MenuSuspendPopup(MTRACKER* Mt, UINT uMsg) { - MSG Msg; + MSG msg; - Msg.hwnd = Mt->OwnerWnd; + msg.hwnd = Mt->OwnerWnd; - PeekMessageW(&Msg, 0, 0, 0, PM_NOYIELD | PM_REMOVE); - Mt->TrackFlags |= TF_SKIPREMOVE; + PeekMessageW( &msg, 0, uMsg, uMsg, PM_NOYIELD | PM_REMOVE); // ported incorrectly since 8317 GvG +// Mt->TrackFlags |= TF_SKIPREMOVE; // This sends TrackMenu into a loop with arrow keys!!!! - switch (Message) + switch( uMsg ) { - case WM_KEYDOWN: - PeekMessageW(&Msg, 0, 0, 0, PM_NOYIELD | PM_NOREMOVE); - if (WM_KEYUP == Msg.message || WM_PAINT == Msg.message) - { - PeekMessageW(&Msg, 0, 0, 0, PM_NOYIELD | PM_REMOVE); - PeekMessageW(&Msg, 0, 0, 0, PM_NOYIELD | PM_NOREMOVE); - if (WM_KEYDOWN == Msg.message - && (VK_LEFT == Msg.wParam || VK_RIGHT == Msg.wParam)) - { - Mt->TrackFlags |= TF_SUSPENDPOPUP; - return TRUE; - } - } - break; + case WM_KEYDOWN: + PeekMessageW( &msg, 0, 0, 0, PM_NOYIELD | PM_NOREMOVE); + if( msg.message == WM_KEYUP || msg.message == WM_PAINT ) + { + PeekMessageW( &msg, 0, 0, 0, PM_NOYIELD | PM_REMOVE); + PeekMessageW( &msg, 0, 0, 0, PM_NOYIELD | PM_NOREMOVE); + if( msg.message == WM_KEYDOWN && + (msg.wParam == VK_LEFT || msg.wParam == VK_RIGHT)) + { + Mt->TrackFlags |= TF_SUSPENDPOPUP; + return TRUE; + } + } + break; } - - /* failures go through this */ - Mt->TrackFlags &= ~TF_SUSPENDPOPUP; - - return FALSE; + /* failures go through this */ + Mt->TrackFlags &= ~TF_SUSPENDPOPUP; + return FALSE; } /*********************************************************************** @@ -3029,14 +3027,14 @@ MenuKeyLeft(MTRACKER* Mt, UINT Flags) } /* Try to move 1 column left (if possible) */ - if (NO_SELECTED_ITEM != (PrevCol = MenuGetStartOfPrevColumn(&MenuInfo))) - { - if (MenuGetRosMenuInfo(&MenuInfo, Mt->CurrentMenu)) - { + if ( (PrevCol = MenuGetStartOfPrevColumn(&MenuInfo)) != NO_SELECTED_ITEM) + { + if (MenuGetRosMenuInfo(&MenuInfo, Mt->CurrentMenu)) + { MenuSelectItem(Mt->OwnerWnd, &MenuInfo, PrevCol, TRUE, 0); - } - return; - } + } + return; + } /* close topmost popup */ while (MenuTmp != Mt->CurrentMenu) @@ -3056,16 +3054,16 @@ MenuKeyLeft(MTRACKER* Mt, UINT Flags) { return; } - if ((MenuPrev == Mt->TopMenu) && 0 == (TopMenuInfo.Flags & MF_POPUP)) + if ((MenuPrev == Mt->TopMenu) && !(TopMenuInfo.Flags & MF_POPUP)) { /* move menu bar selection if no more popups are left */ - if (! MenuDoNextMenu(Mt, VK_LEFT, Flags)) + if (!MenuDoNextMenu(Mt, VK_LEFT, Flags)) { MenuMoveSelection(Mt->OwnerWnd, &TopMenuInfo, ITEM_PREV); } - if (MenuPrev != MenuTmp || 0 != (Mt->TrackFlags & TF_SUSPENDPOPUP)) + if (MenuPrev != MenuTmp || Mt->TrackFlags & TF_SUSPENDPOPUP) { /* A sublevel menu was displayed - display the next one * unless there is another displacement coming up */ @@ -3110,23 +3108,23 @@ static void FASTCALL MenuKeyRight(MTRACKER *Mt, UINT Flags) if (hmenutmp != Mt->CurrentMenu) return; } - if (! MenuGetRosMenuInfo(&CurrentMenuInfo, Mt->CurrentMenu)) + if (! MenuGetRosMenuInfo(&CurrentMenuInfo, Mt->CurrentMenu)) { return; } - /* Check to see if there's another column */ - if (NO_SELECTED_ITEM != (NextCol = MenuGetStartOfNextColumn(&CurrentMenuInfo))) + /* Check to see if there's another column */ + if ( (NextCol = MenuGetStartOfNextColumn(&CurrentMenuInfo)) != NO_SELECTED_ITEM) { - TRACE("Going to %d.\n", NextCol); - if (MenuGetRosMenuInfo(&MenuInfo, Mt->CurrentMenu)) - { + TRACE("Going to %d.\n", NextCol); + if (MenuGetRosMenuInfo(&MenuInfo, Mt->CurrentMenu)) + { MenuSelectItem(Mt->OwnerWnd, &MenuInfo, NextCol, TRUE, 0); - } - return; + } + return; } - if (0 == (MenuInfo.Flags & MF_POPUP)) /* menu bar tracking */ + if (!(MenuInfo.Flags & MF_POPUP)) /* menu bar tracking */ { if (Mt->CurrentMenu != Mt->TopMenu) { @@ -3325,8 +3323,8 @@ static INT FASTCALL MenuTrackMenu(HMENU hmenu, UINT wFlags, INT x, INT y, if (hmenu) fEndMenu |= !MenuMouseMove( &mt, hmenu, wFlags ); - } /* switch(msg.message) - mouse */ - } + } /* switch(msg.message) - mouse */ + } else if ((msg.message >= WM_KEYFIRST) && (msg.message <= WM_KEYLAST)) { fRemove = TRUE; /* Keyboard messages are always removed */ @@ -3339,7 +3337,7 @@ static INT FASTCALL MenuTrackMenu(HMENU hmenu, UINT wFlags, INT x, INT y, case VK_MENU: case VK_F10: fEndMenu = TRUE; - break; + break; case VK_HOME: case VK_END: @@ -3668,7 +3666,6 @@ VOID MenuTrackKbdMenuBar(HWND hwnd, UINT wParam, WCHAR wChar) track_menu: MenuTrackMenu( hTrackMenu, wFlags, 0, 0, hwnd, NULL ); MenuExitTracking( hwnd, FALSE ); - } /********************************************************************** From 0b6d767a29d9825651822ef1b7f19d5b61a6a7a8 Mon Sep 17 00:00:00 2001 From: Gabriel Ilardi Date: Wed, 4 May 2011 15:48:34 +0000 Subject: [PATCH 294/317] [LIBXML2] - Update to version 2.7.8. Patch by Carlo Bramini. - Installed and booted successfully to the desktop. Tested abiword 2.6.4 and FF 2.0.0.20. See issue #4988 for more details. svn path=/trunk/; revision=51577 --- .../include/reactos/libs/libxml/HTMLparser.h | 1 + .../include/reactos/libs/libxml/Makefile.am | 3 - .../include/reactos/libs/libxml/Makefile.in | 349 +- .../include/reactos/libs/libxml/encoding.h | 14 + reactos/include/reactos/libs/libxml/nanoftp.h | 67 +- reactos/include/reactos/libs/libxml/parser.h | 2 +- reactos/include/reactos/libs/libxml/xmlsave.h | 3 +- .../include/reactos/libs/libxml/xmlversion.h | 19 +- .../reactos/libs/libxml/xmlversion.h.in | 9 + reactos/lib/3rdparty/libxml2/HTMLparser.c | 21 +- reactos/lib/3rdparty/libxml2/Makefile.am | 4 +- reactos/lib/3rdparty/libxml2/Makefile.in | 12 +- reactos/lib/3rdparty/libxml2/SAX2.c | 8 +- reactos/lib/3rdparty/libxml2/catalog.c | 7 +- reactos/lib/3rdparty/libxml2/config.h.in | 3 + reactos/lib/3rdparty/libxml2/configure | 13413 ++++------------ reactos/lib/3rdparty/libxml2/configure.in | 68 +- reactos/lib/3rdparty/libxml2/debugXML.c | 2 +- reactos/lib/3rdparty/libxml2/encoding.c | 886 +- .../lib/3rdparty/libxml2/include/Makefile.in | 6 +- reactos/lib/3rdparty/libxml2/libxml2.spec | 6 +- reactos/lib/3rdparty/libxml2/ltmain.sh | 1739 +- reactos/lib/3rdparty/libxml2/nanoftp.c | 215 +- reactos/lib/3rdparty/libxml2/nanohttp.c | 67 +- reactos/lib/3rdparty/libxml2/parser.c | 212 +- reactos/lib/3rdparty/libxml2/testapi.c | 61 +- reactos/lib/3rdparty/libxml2/threads.c | 6 +- reactos/lib/3rdparty/libxml2/tree.c | 15 +- reactos/lib/3rdparty/libxml2/uri.c | 2 +- reactos/lib/3rdparty/libxml2/xmllint.c | 46 +- reactos/lib/3rdparty/libxml2/xmlreader.c | 12 +- reactos/lib/3rdparty/libxml2/xmlsave.c | 124 +- reactos/lib/3rdparty/libxml2/xmlschemas.c | 5 + .../lib/3rdparty/libxml2/xmlschemastypes.c | 11 +- reactos/lib/3rdparty/libxml2/xpath.c | 46 +- 35 files changed, 5547 insertions(+), 11917 deletions(-) diff --git a/reactos/include/reactos/libs/libxml/HTMLparser.h b/reactos/include/reactos/libs/libxml/HTMLparser.h index cde0ac6d763..fbcc811e0e6 100644 --- a/reactos/include/reactos/libs/libxml/HTMLparser.h +++ b/reactos/include/reactos/libs/libxml/HTMLparser.h @@ -177,6 +177,7 @@ XMLPUBFUN void XMLCALL */ typedef enum { HTML_PARSE_RECOVER = 1<<0, /* Relaxed parsing */ + HTML_PARSE_NODEFDTD = 1<<2, /* do not default a doctype if not found */ HTML_PARSE_NOERROR = 1<<5, /* suppress error reports */ HTML_PARSE_NOWARNING= 1<<6, /* suppress warning reports */ HTML_PARSE_PEDANTIC = 1<<7, /* pedantic error reporting */ diff --git a/reactos/include/reactos/libs/libxml/Makefile.am b/reactos/include/reactos/libs/libxml/Makefile.am index bf03a3b2228..cf9297aad66 100644 --- a/reactos/include/reactos/libs/libxml/Makefile.am +++ b/reactos/include/reactos/libs/libxml/Makefile.am @@ -51,7 +51,4 @@ xmlinc_HEADERS = \ xmlsave.h \ schematron.h -install-exec-hook: - $(mkinstalldirs) $(DESTDIR)$(xmlincdir) - EXTRA_DIST = xmlversion.h.in diff --git a/reactos/include/reactos/libs/libxml/Makefile.in b/reactos/include/reactos/libs/libxml/Makefile.in index ea503c3d495..6e219c735eb 100644 --- a/reactos/include/reactos/libs/libxml/Makefile.in +++ b/reactos/include/reactos/libs/libxml/Makefile.in @@ -14,7 +14,6 @@ # PARTICULAR PURPOSE. @SET_MAKE@ - VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ @@ -34,9 +33,8 @@ PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ -subdir = include/libxml -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ - $(srcdir)/xmlversion.h.in $(xmlinc_HEADERS) +subdir = include +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ @@ -44,38 +42,53 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) -mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h -CONFIG_CLEAN_FILES = xmlversion.h +CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = -am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; -am__vpath_adj = case $$p in \ - $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ - *) f=$$p;; \ - esac; -am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; -am__install_max = 40 -am__nobase_strip_setup = \ - srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` -am__nobase_strip = \ - for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" -am__nobase_list = $(am__nobase_strip_setup); \ - for p in $$list; do echo "$$p $$p"; done | \ - sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ - $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ - if (++n[$$2] == $(am__install_max)) \ - { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ - END { for (dir in files) print dir, files[dir] }' -am__base_list = \ - sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ - sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' -am__installdirs = "$(DESTDIR)$(xmlincdir)" -HEADERS = $(xmlinc_HEADERS) +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-dvi-recursive install-exec-recursive \ + install-html-recursive install-info-recursive \ + install-pdf-recursive install-ps-recursive install-recursive \ + installcheck-recursive installdirs-recursive pdf-recursive \ + ps-recursive uninstall-recursive +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ + $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ + distdir ETAGS = etags CTAGS = ctags +DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ @@ -153,6 +166,7 @@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PERL = @PERL@ @@ -201,6 +215,7 @@ VERSION_SCRIPT_FLAGS = @VERSION_SCRIPT_FLAGS@ WGET = @WGET@ WIN32_EXTRA_LDFLAGS = @WIN32_EXTRA_LDFLAGS@ WIN32_EXTRA_LIBADD = @WIN32_EXTRA_LIBADD@ +WIN32_EXTRA_PYTHON_LIBADD = @WIN32_EXTRA_PYTHON_LIBADD@ WITH_C14N = @WITH_C14N@ WITH_CATALOG = @WITH_CATALOG@ WITH_DEBUG = @WITH_DEBUG@ @@ -209,6 +224,7 @@ WITH_FTP = @WITH_FTP@ WITH_HTML = @WITH_HTML@ WITH_HTTP = @WITH_HTTP@ WITH_ICONV = @WITH_ICONV@ +WITH_ICU = @WITH_ICU@ WITH_ISO8859X = @WITH_ISO8859X@ WITH_LEGACY = @WITH_LEGACY@ WITH_MEM_DEBUG = @WITH_MEM_DEBUG@ @@ -279,7 +295,6 @@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ -lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ @@ -296,58 +311,9 @@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ -xmlincdir = $(includedir)/libxml2/libxml -xmlinc_HEADERS = \ - SAX.h \ - entities.h \ - encoding.h \ - parser.h \ - parserInternals.h \ - xmlerror.h \ - HTMLparser.h \ - HTMLtree.h \ - debugXML.h \ - tree.h \ - list.h \ - hash.h \ - xpath.h \ - xpathInternals.h \ - xpointer.h \ - xinclude.h \ - xmlIO.h \ - xmlmemory.h \ - nanohttp.h \ - nanoftp.h \ - uri.h \ - valid.h \ - xlink.h \ - xmlversion.h \ - DOCBparser.h \ - catalog.h \ - threads.h \ - globals.h \ - c14n.h \ - xmlautomata.h \ - xmlregexp.h \ - xmlmodule.h \ - xmlschemas.h \ - schemasInternals.h \ - xmlschemastypes.h \ - xmlstring.h \ - xmlunicode.h \ - xmlreader.h \ - relaxng.h \ - dict.h \ - SAX2.h \ - xmlexports.h \ - xmlwriter.h \ - chvalid.h \ - pattern.h \ - xmlsave.h \ - schematron.h - -EXTRA_DIST = xmlversion.h.in -all: all-am +SUBDIRS = libxml +EXTRA_DIST = win32config.h wsockcompat.h +all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @@ -359,9 +325,9 @@ $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) exit 1;; \ esac; \ done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu include/libxml/Makefile'; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu include/Makefile'; \ $(am__cd) $(top_srcdir) && \ - $(AUTOMAKE) --gnu include/libxml/Makefile + $(AUTOMAKE) --gnu include/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ @@ -380,34 +346,82 @@ $(top_srcdir)/configure: $(am__configure_deps) $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): -xmlversion.h: $(top_builddir)/config.status $(srcdir)/xmlversion.h.in - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs -install-xmlincHEADERS: $(xmlinc_HEADERS) - @$(NORMAL_INSTALL) - test -z "$(xmlincdir)" || $(MKDIR_P) "$(DESTDIR)$(xmlincdir)" - @list='$(xmlinc_HEADERS)'; test -n "$(xmlincdir)" || list=; \ - for p in $$list; do \ - if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ - echo "$$d$$p"; \ - done | $(am__base_list) | \ - while read files; do \ - echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(xmlincdir)'"; \ - $(INSTALL_HEADER) $$files "$(DESTDIR)$(xmlincdir)" || exit $$?; \ - done -uninstall-xmlincHEADERS: - @$(NORMAL_UNINSTALL) - @list='$(xmlinc_HEADERS)'; test -n "$(xmlincdir)" || list=; \ - files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ - test -n "$$files" || exit 0; \ - echo " ( cd '$(DESTDIR)$(xmlincdir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(xmlincdir)" && rm -f $$files +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +$(RECURSIVE_CLEAN_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ @@ -419,10 +433,23 @@ ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) mkid -fID $$unique tags: TAGS -TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ @@ -441,7 +468,7 @@ TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ fi; \ fi ctags: CTAGS -CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ @@ -491,22 +518,48 @@ distdir: $(DISTFILES) || exit 1; \ fi; \ done -check-am: all-am -check: check-am -all-am: Makefile $(HEADERS) -installdirs: - for dir in "$(DESTDIR)$(xmlincdir)"; do \ - test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + fi; \ done -install: install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-recursive +all-am: Makefile +installdirs: installdirs-recursive +installdirs-am: +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am -installcheck: installcheck-am +installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ @@ -523,92 +576,90 @@ distclean-generic: maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -clean: clean-am +clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am -distclean: distclean-am +distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags -dvi: dvi-am +dvi: dvi-recursive dvi-am: -html: html-am +html: html-recursive html-am: -info: info-am +info: info-recursive info-am: -install-data-am: install-xmlincHEADERS +install-data-am: -install-dvi: install-dvi-am +install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: - @$(NORMAL_INSTALL) - $(MAKE) $(AM_MAKEFLAGS) install-exec-hook -install-html: install-html-am + +install-html: install-html-recursive install-html-am: -install-info: install-info-am +install-info: install-info-recursive install-info-am: install-man: -install-pdf: install-pdf-am +install-pdf: install-pdf-recursive install-pdf-am: -install-ps: install-ps-am +install-ps: install-ps-recursive install-ps-am: installcheck-am: -maintainer-clean: maintainer-clean-am +maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic -mostlyclean: mostlyclean-am +mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool -pdf: pdf-am +pdf: pdf-recursive pdf-am: -ps: ps-am +ps: ps-recursive ps-am: -uninstall-am: uninstall-xmlincHEADERS +uninstall-am: -.MAKE: install-am install-exec-am install-strip +.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ + install-am install-strip tags-recursive -.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ - clean-libtool ctags distclean distclean-generic \ +.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ + all all-am check check-am clean clean-generic clean-libtool \ + ctags ctags-recursive distclean distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ - install-exec-am install-exec-hook install-html install-html-am \ - install-info install-info-am install-man install-pdf \ - install-pdf-am install-ps install-ps-am install-strip \ - install-xmlincHEADERS installcheck installcheck-am installdirs \ - maintainer-clean maintainer-clean-generic mostlyclean \ - mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ - tags uninstall uninstall-am uninstall-xmlincHEADERS + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs installdirs-am maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ + uninstall uninstall-am -install-exec-hook: - $(mkinstalldirs) $(DESTDIR)$(xmlincdir) - # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: diff --git a/reactos/include/reactos/libs/libxml/encoding.h b/reactos/include/reactos/libs/libxml/encoding.h index c74b25f3cbb..3a3b9b2d820 100644 --- a/reactos/include/reactos/libs/libxml/encoding.h +++ b/reactos/include/reactos/libs/libxml/encoding.h @@ -27,6 +27,9 @@ #ifdef LIBXML_ICONV_ENABLED #include #endif +#ifdef LIBXML_ICU_ENABLED +#include +#endif #ifdef __cplusplus extern "C" { #endif @@ -125,6 +128,13 @@ typedef int (* xmlCharEncodingOutputFunc)(unsigned char *out, int *outlen, * Block defining the handlers for non UTF-8 encodings. * If iconv is supported, there are two extra fields. */ +#ifdef LIBXML_ICU_ENABLED +struct _uconv_t { + UConverter *uconv; /* for conversion between an encoding and UTF-16 */ + UConverter *utf8; /* for conversion between UTF-8 and UTF-16 */ +}; +typedef struct _uconv_t uconv_t; +#endif typedef struct _xmlCharEncodingHandler xmlCharEncodingHandler; typedef xmlCharEncodingHandler *xmlCharEncodingHandlerPtr; @@ -136,6 +146,10 @@ struct _xmlCharEncodingHandler { iconv_t iconv_in; iconv_t iconv_out; #endif /* LIBXML_ICONV_ENABLED */ +#ifdef LIBXML_ICU_ENABLED + uconv_t *uconv_in; + uconv_t *uconv_out; +#endif /* LIBXML_ICU_ENABLED */ }; #ifdef __cplusplus diff --git a/reactos/include/reactos/libs/libxml/nanoftp.h b/reactos/include/reactos/libs/libxml/nanoftp.h index e3c28a01424..397bbba74f6 100644 --- a/reactos/include/reactos/libs/libxml/nanoftp.h +++ b/reactos/include/reactos/libs/libxml/nanoftp.h @@ -7,7 +7,7 @@ * * Author: Daniel Veillard */ - + #ifndef __NANO_FTP_H__ #define __NANO_FTP_H__ @@ -15,12 +15,31 @@ #ifdef LIBXML_FTP_ENABLED +/* Needed for portability to Windows 64 bits */ +#if defined(__MINGW32__) || defined(_WIN32_WCE) +#include +#else +/** + * SOCKET: + * + * macro used to provide portability of code to windows sockets + */ +#define SOCKET int +/** + * INVALID_SOCKET: + * + * macro used to provide portability of code to windows sockets + * the value to be used when the socket is not valid + */ +#define INVALID_SOCKET (-1) +#endif + #ifdef __cplusplus extern "C" { #endif /** - * ftpListCallback: + * ftpListCallback: * @userData: user provided data for the callback * @filename: the file name (including "->" when links are shown) * @attrib: the attribute string @@ -44,7 +63,7 @@ typedef void (*ftpListCallback) (void *userData, const char *month, int day, int hour, int minute); /** - * ftpDataCallback: + * ftpDataCallback: * @userData: the user provided context * @data: the data received * @len: its size in bytes @@ -60,78 +79,78 @@ typedef void (*ftpDataCallback) (void *userData, */ XMLPUBFUN void XMLCALL xmlNanoFTPInit (void); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlNanoFTPCleanup (void); /* * Creating/freeing contexts. */ -XMLPUBFUN void * XMLCALL +XMLPUBFUN void * XMLCALL xmlNanoFTPNewCtxt (const char *URL); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlNanoFTPFreeCtxt (void * ctx); -XMLPUBFUN void * XMLCALL +XMLPUBFUN void * XMLCALL xmlNanoFTPConnectTo (const char *server, int port); /* * Opening/closing session connections. */ -XMLPUBFUN void * XMLCALL +XMLPUBFUN void * XMLCALL xmlNanoFTPOpen (const char *URL); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlNanoFTPConnect (void *ctx); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlNanoFTPClose (void *ctx); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlNanoFTPQuit (void *ctx); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlNanoFTPScanProxy (const char *URL); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlNanoFTPProxy (const char *host, int port, const char *user, const char *passwd, int type); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlNanoFTPUpdateURL (void *ctx, const char *URL); /* * Rather internal commands. */ -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlNanoFTPGetResponse (void *ctx); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlNanoFTPCheckResponse (void *ctx); /* * CD/DIR/GET handlers. */ -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlNanoFTPCwd (void *ctx, const char *directory); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlNanoFTPDele (void *ctx, const char *file); -XMLPUBFUN int XMLCALL +XMLPUBFUN SOCKET XMLCALL xmlNanoFTPGetConnection (void *ctx); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlNanoFTPCloseConnection(void *ctx); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlNanoFTPList (void *ctx, ftpListCallback callback, void *userData, const char *filename); -XMLPUBFUN int XMLCALL +XMLPUBFUN SOCKET XMLCALL xmlNanoFTPGetSocket (void *ctx, const char *filename); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlNanoFTPGet (void *ctx, ftpDataCallback callback, void *userData, const char *filename); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlNanoFTPRead (void *ctx, void *dest, int len); diff --git a/reactos/include/reactos/libs/libxml/parser.h b/reactos/include/reactos/libs/libxml/parser.h index dd79c426f23..47b3df15251 100644 --- a/reactos/include/reactos/libs/libxml/parser.h +++ b/reactos/include/reactos/libs/libxml/parser.h @@ -1222,6 +1222,7 @@ typedef enum { XML_WITH_DEBUG_MEM = 29, XML_WITH_DEBUG_RUN = 30, XML_WITH_ZLIB = 31, + XML_WITH_ICU = 32, XML_WITH_NONE = 99999 /* just to be sure of allocation size */ } xmlFeature; @@ -1232,4 +1233,3 @@ XMLPUBFUN int XMLCALL } #endif #endif /* __XML_PARSER_H__ */ - diff --git a/reactos/include/reactos/libs/libxml/xmlsave.h b/reactos/include/reactos/libs/libxml/xmlsave.h index 4201b4d13dc..fb329b22dbc 100644 --- a/reactos/include/reactos/libs/libxml/xmlsave.h +++ b/reactos/include/reactos/libs/libxml/xmlsave.h @@ -33,7 +33,8 @@ typedef enum { XML_SAVE_NO_XHTML = 1<<3, /* disable XHTML1 specific rules */ XML_SAVE_XHTML = 1<<4, /* force XHTML1 specific rules */ XML_SAVE_AS_XML = 1<<5, /* force XML serialization on HTML doc */ - XML_SAVE_AS_HTML = 1<<6 /* force HTML serialization on XML doc */ + XML_SAVE_AS_HTML = 1<<6, /* force HTML serialization on XML doc */ + XML_SAVE_WSNONSIG = 1<<7 /* format with non-significant whitespace */ } xmlSaveOption; diff --git a/reactos/include/reactos/libs/libxml/xmlversion.h b/reactos/include/reactos/libs/libxml/xmlversion.h index a2fadbc6b79..b96855d5c89 100644 --- a/reactos/include/reactos/libs/libxml/xmlversion.h +++ b/reactos/include/reactos/libs/libxml/xmlversion.h @@ -29,28 +29,28 @@ XMLPUBFUN void XMLCALL xmlCheckVersion(int version); * * the version string like "1.2.3" */ -#define LIBXML_DOTTED_VERSION "2.7.7" +#define LIBXML_DOTTED_VERSION "2.7.8" /** * LIBXML_VERSION: * * the version number: 1.2.3 value is 10203 */ -#define LIBXML_VERSION 20707 +#define LIBXML_VERSION 20708 /** * LIBXML_VERSION_STRING: * * the version number string, 1.2.3 value is "10203" */ -#define LIBXML_VERSION_STRING "20707" +#define LIBXML_VERSION_STRING "20708" /** * LIBXML_VERSION_EXTRA: * * extra version information, used to show a CVS compilation */ -#define LIBXML_VERSION_EXTRA "-GITv2.7.6-36-g06c93b7" +#define LIBXML_VERSION_EXTRA "-GITv2.7.7-40-g82143f4" /** * LIBXML_TEST_VERSION: @@ -58,7 +58,7 @@ XMLPUBFUN void XMLCALL xmlCheckVersion(int version); * Macro to check that the libxml version in use is compatible with * the version the software has been compiled against */ -#define LIBXML_TEST_VERSION xmlCheckVersion(20707); +#define LIBXML_TEST_VERSION xmlCheckVersion(20708); #ifndef VMS #if 0 @@ -268,6 +268,15 @@ XMLPUBFUN void XMLCALL xmlCheckVersion(int version); #define LIBXML_ICONV_ENABLED #endif +/** + * LIBXML_ICU_ENABLED: + * + * Whether icu support is available + */ +#if 0 +#define LIBXML_ICU_ENABLED +#endif + /** * LIBXML_ISO8859X_ENABLED: * diff --git a/reactos/include/reactos/libs/libxml/xmlversion.h.in b/reactos/include/reactos/libs/libxml/xmlversion.h.in index 4739f3ab9ad..95856541617 100644 --- a/reactos/include/reactos/libs/libxml/xmlversion.h.in +++ b/reactos/include/reactos/libs/libxml/xmlversion.h.in @@ -268,6 +268,15 @@ XMLPUBFUN void XMLCALL xmlCheckVersion(int version); #define LIBXML_ICONV_ENABLED #endif +/** + * LIBXML_ICU_ENABLED: + * + * Whether icu support is available + */ +#if @WITH_ICU@ +#define LIBXML_ICU_ENABLED +#endif + /** * LIBXML_ISO8859X_ENABLED: * diff --git a/reactos/lib/3rdparty/libxml2/HTMLparser.c b/reactos/lib/3rdparty/libxml2/HTMLparser.c index 42dc776ae58..4d43b93d371 100644 --- a/reactos/lib/3rdparty/libxml2/HTMLparser.c +++ b/reactos/lib/3rdparty/libxml2/HTMLparser.c @@ -2887,9 +2887,11 @@ htmlParseScript(htmlParserCtxtPtr ctxt) { } if ((!(IS_CHAR_CH(cur))) && (!((cur == 0) && (ctxt->progressive)))) { - htmlParseErrInt(ctxt, XML_ERR_INVALID_CHAR, - "Invalid char in CDATA 0x%X\n", cur); - NEXT; + htmlParseErrInt(ctxt, XML_ERR_INVALID_CHAR, + "Invalid char in CDATA 0x%X\n", cur); + if (ctxt->input->cur < ctxt->input->end) { + NEXT; + } } if ((nbchar != 0) && (ctxt->sax != NULL) && (!ctxt->disableSAX)) { @@ -3275,7 +3277,7 @@ htmlParseCharRef(htmlParserCtxtPtr ctxt) { val = val * 16 + (CUR - 'A') + 10; else { htmlParseErr(ctxt, XML_ERR_INVALID_HEX_CHARREF, - "htmlParseCharRef: missing semicolumn\n", + "htmlParseCharRef: missing semicolon\n", NULL, NULL); break; } @@ -3290,7 +3292,7 @@ htmlParseCharRef(htmlParserCtxtPtr ctxt) { val = val * 10 + (CUR - '0'); else { htmlParseErr(ctxt, XML_ERR_INVALID_DEC_CHARREF, - "htmlParseCharRef: missing semicolumn\n", + "htmlParseCharRef: missing semicolon\n", NULL, NULL); break; } @@ -4670,7 +4672,7 @@ htmlParseDocument(htmlParserCtxtPtr ctxt) { if ((ctxt->sax) && (ctxt->sax->endDocument != NULL)) ctxt->sax->endDocument(ctxt->userData); - if (ctxt->myDoc != NULL) { + if ((!(ctxt->options & HTML_PARSE_NODEFDTD)) && (ctxt->myDoc != NULL)) { dtd = xmlGetIntSubset(ctxt->myDoc); if (dtd == NULL) ctxt->myDoc->intSubset = @@ -5609,7 +5611,7 @@ htmlParseTryOrFinish(htmlParserCtxtPtr ctxt, int terminate) { int idx; xmlChar val; - idx = htmlParseLookupSequence(ctxt, '<', '/', 0, 0, 1); + idx = htmlParseLookupSequence(ctxt, '<', '/', 0, 0, 0); if (idx < 0) goto done; val = in->cur[idx + 2]; @@ -6451,6 +6453,7 @@ htmlCtxtReset(htmlParserCtxtPtr ctxt) ctxt->wellFormed = 1; ctxt->nsWellFormed = 1; + ctxt->disableSAX = 0; ctxt->valid = 1; ctxt->vctxt.userData = ctxt; ctxt->vctxt.error = xmlParserValidityError; @@ -6530,6 +6533,10 @@ htmlCtxtUseOptions(htmlParserCtxtPtr ctxt, int options) ctxt->options |= XML_PARSE_HUGE; options -= XML_PARSE_HUGE; } + if (options & HTML_PARSE_NODEFDTD) { + ctxt->options |= HTML_PARSE_NODEFDTD; + options -= HTML_PARSE_NODEFDTD; + } ctxt->dictNames = 0; return (options); } diff --git a/reactos/lib/3rdparty/libxml2/Makefile.am b/reactos/lib/3rdparty/libxml2/Makefile.am index 967afbdb57d..b8cbb4a6a3c 100644 --- a/reactos/lib/3rdparty/libxml2/Makefile.am +++ b/reactos/lib/3rdparty/libxml2/Makefile.am @@ -1213,9 +1213,9 @@ DOC_MODULE=libxml2-$(VERSION) EXAMPLES_DIR=$(BASE_DIR)/$(DOC_MODULE)/examples install-data-local: - $(mkinstalldirs) $(DESTDIR)$(BASE_DIR)/$(DOC_MODULE) + @MKDIR_P@ $(DESTDIR)$(BASE_DIR)/$(DOC_MODULE) -@INSTALL@ -m 0644 $(srcdir)/Copyright $(DESTDIR)$(BASE_DIR)/$(DOC_MODULE) - $(mkinstalldirs) $(DESTDIR)$(EXAMPLES_DIR) + @MKDIR_P@ $(DESTDIR)$(EXAMPLES_DIR) -@INSTALL@ -m 0644 $(srcdir)/xmllint.c $(DESTDIR)$(EXAMPLES_DIR) -@INSTALL@ -m 0644 $(srcdir)/testSAX.c $(DESTDIR)$(EXAMPLES_DIR) -@INSTALL@ -m 0644 $(srcdir)/testHTML.c $(DESTDIR)$(EXAMPLES_DIR) diff --git a/reactos/lib/3rdparty/libxml2/Makefile.in b/reactos/lib/3rdparty/libxml2/Makefile.in index df1b84a841c..1e0e461c9f8 100644 --- a/reactos/lib/3rdparty/libxml2/Makefile.in +++ b/reactos/lib/3rdparty/libxml2/Makefile.in @@ -52,7 +52,7 @@ DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \ $(srcdir)/libxml-2.0.pc.in $(srcdir)/libxml.spec.in \ $(srcdir)/xml2-config.in $(top_srcdir)/configure AUTHORS \ COPYING ChangeLog INSTALL NEWS TODO acconfig.h config.guess \ - config.sub depcomp install-sh ltmain.sh missing mkinstalldirs + config.sub depcomp install-sh ltmain.sh missing ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ @@ -62,7 +62,7 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno -mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +mkinstalldirs = $(install_sh) -d CONFIG_HEADER = config.h CONFIG_CLEAN_FILES = libxml2.spec xml2-config libxml-2.0.pc \ libxml-2.0-uninstalled.pc @@ -418,6 +418,7 @@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PERL = @PERL@ @@ -466,6 +467,7 @@ VERSION_SCRIPT_FLAGS = @VERSION_SCRIPT_FLAGS@ WGET = @WGET@ WIN32_EXTRA_LDFLAGS = @WIN32_EXTRA_LDFLAGS@ WIN32_EXTRA_LIBADD = @WIN32_EXTRA_LIBADD@ +WIN32_EXTRA_PYTHON_LIBADD = @WIN32_EXTRA_PYTHON_LIBADD@ WITH_C14N = @WITH_C14N@ WITH_CATALOG = @WITH_CATALOG@ WITH_DEBUG = @WITH_DEBUG@ @@ -474,6 +476,7 @@ WITH_FTP = @WITH_FTP@ WITH_HTML = @WITH_HTML@ WITH_HTTP = @WITH_HTTP@ WITH_ICONV = @WITH_ICONV@ +WITH_ICU = @WITH_ICU@ WITH_ISO8859X = @WITH_ISO8859X@ WITH_LEGACY = @WITH_LEGACY@ WITH_MEM_DEBUG = @WITH_MEM_DEBUG@ @@ -544,7 +547,6 @@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ -lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ @@ -2700,9 +2702,9 @@ xml2Conf.sh: xml2Conf.sh.in Makefile && mv xml2Conf.tmp xml2Conf.sh install-data-local: - $(mkinstalldirs) $(DESTDIR)$(BASE_DIR)/$(DOC_MODULE) + @MKDIR_P@ $(DESTDIR)$(BASE_DIR)/$(DOC_MODULE) -@INSTALL@ -m 0644 $(srcdir)/Copyright $(DESTDIR)$(BASE_DIR)/$(DOC_MODULE) - $(mkinstalldirs) $(DESTDIR)$(EXAMPLES_DIR) + @MKDIR_P@ $(DESTDIR)$(EXAMPLES_DIR) -@INSTALL@ -m 0644 $(srcdir)/xmllint.c $(DESTDIR)$(EXAMPLES_DIR) -@INSTALL@ -m 0644 $(srcdir)/testSAX.c $(DESTDIR)$(EXAMPLES_DIR) -@INSTALL@ -m 0644 $(srcdir)/testHTML.c $(DESTDIR)$(EXAMPLES_DIR) diff --git a/reactos/lib/3rdparty/libxml2/SAX2.c b/reactos/lib/3rdparty/libxml2/SAX2.c index 84c1f00481c..c0482c0b681 100644 --- a/reactos/lib/3rdparty/libxml2/SAX2.c +++ b/reactos/lib/3rdparty/libxml2/SAX2.c @@ -2242,8 +2242,12 @@ xmlSAX2StartElementNs(void *ctx, if ((URI != NULL) && (prefix == pref)) ret->ns = ns; } else { - xmlSAX2ErrMemory(ctxt, "xmlSAX2StartElementNs"); - return; + /* + * any out of memory error would already have been raised + * but we can't be garanteed it's the actual error due to the + * API, best is to skip in this case + */ + continue; } #ifdef LIBXML_VALID_ENABLED if ((!ctxt->html) && ctxt->validate && ctxt->wellFormed && diff --git a/reactos/lib/3rdparty/libxml2/catalog.c b/reactos/lib/3rdparty/libxml2/catalog.c index af84b7c4bc6..f33a0aa9909 100644 --- a/reactos/lib/3rdparty/libxml2/catalog.c +++ b/reactos/lib/3rdparty/libxml2/catalog.c @@ -997,18 +997,15 @@ xmlLoadFileContent(const char *filename) } #ifdef HAVE_STAT len = read(fd, content, size); + close(fd); #else len = fread(content, 1, size, fd); + fclose(fd); #endif if (len < 0) { xmlFree(content); return (NULL); } -#ifdef HAVE_STAT - close(fd); -#else - fclose(fd); -#endif content[len] = 0; return(content); diff --git a/reactos/lib/3rdparty/libxml2/config.h.in b/reactos/lib/3rdparty/libxml2/config.h.in index 6f45c6ca503..d60f3627cd7 100644 --- a/reactos/lib/3rdparty/libxml2/config.h.in +++ b/reactos/lib/3rdparty/libxml2/config.h.in @@ -274,6 +274,9 @@ /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME +/* Define to the home page for this package. */ +#undef PACKAGE_URL + /* Define to the version of this package. */ #undef PACKAGE_VERSION diff --git a/reactos/lib/3rdparty/libxml2/configure b/reactos/lib/3rdparty/libxml2/configure index 91011e5ec01..605e8c4c359 100644 --- a/reactos/lib/3rdparty/libxml2/configure +++ b/reactos/lib/3rdparty/libxml2/configure @@ -1,18 +1,22 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.63. +# Generated by GNU Autoconf 2.66. +# # # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, -# 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. +# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software +# Foundation, Inc. +# +# # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. -## --------------------- ## -## M4sh Initialization. ## -## --------------------- ## +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which @@ -20,23 +24,15 @@ if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else - case `(set -o) 2>/dev/null` in - *posix*) set -o posix ;; + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; esac - fi - - -# PATH needs CR -# Avoid depending upon Character Ranges. -as_cr_letters='abcdefghijklmnopqrstuvwxyz' -as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' -as_cr_Letters=$as_cr_letters$as_cr_LETTERS -as_cr_digits='0123456789' -as_cr_alnum=$as_cr_Letters$as_cr_digits - as_nl=' ' export as_nl @@ -44,7 +40,13 @@ export as_nl as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo -if (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else @@ -55,7 +57,7 @@ else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; - case $arg in + case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; @@ -78,13 +80,6 @@ if test "${PATH_SEPARATOR+set}" != set; then } fi -# Support unset when possible. -if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then - as_unset=unset -else - as_unset=false -fi - # IFS # We need space, tab and new line, in precisely that order. Quoting is @@ -94,15 +89,15 @@ fi IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. -case $0 in +case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break -done + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done IFS=$as_save_IFS ;; @@ -114,12 +109,16 @@ if test "x$as_myself" = x; then fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 - { (exit 1); exit 1; } + exit 1 fi -# Work around bugs in pre-3.0 UWIN ksh. -for as_var in ENV MAIL MAILPATH -do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' @@ -131,7 +130,256 @@ export LC_ALL LANGUAGE=C export LANGUAGE -# Required to use basename. +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +if test "x$CONFIG_SHELL" = x; then + as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi +" + as_required="as_fn_return () { (exit \$1); } +as_fn_success () { as_fn_return 0; } +as_fn_failure () { as_fn_return 1; } +as_fn_ret_success () { return 0; } +as_fn_ret_failure () { return 1; } + +exitcode=0 +as_fn_success || { exitcode=1; echo as_fn_success failed.; } +as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } +as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } +as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } +if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : + +else + exitcode=1; echo positional parameters were not saved. +fi +test x\$exitcode = x0 || exit 1" + as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO + as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO + eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && + test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 +test \$(( 1 + 1 )) = 2 || exit 1 + + test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( + ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' + ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO + ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO + PATH=/empty FPATH=/empty; export PATH FPATH + test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ + || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1" + if (eval "$as_required") 2>/dev/null; then : + as_have_required=yes +else + as_have_required=no +fi + if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : + +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_found=false +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + as_found=: + case $as_dir in #( + /*) + for as_base in sh bash ksh sh5; do + # Try only shells that exist, to save several forks. + as_shell=$as_dir/$as_base + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : + CONFIG_SHELL=$as_shell as_have_required=yes + if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : + break 2 +fi +fi + done;; + esac + as_found=false +done +$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : + CONFIG_SHELL=$SHELL as_have_required=yes +fi; } +IFS=$as_save_IFS + + + if test "x$CONFIG_SHELL" != x; then : + # We cannot yet assume a decent shell, so we have to provide a + # neutralization value for shells without unset; and this also + # works around shells that cannot unset nonexistent variables. + BASH_ENV=/dev/null + ENV=/dev/null + (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} +fi + + if test x$as_have_required = xno; then : + $as_echo "$0: This script requires a shell more modern than all" + $as_echo "$0: the shells that I found on your system." + if test x${ZSH_VERSION+set} = xset ; then + $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" + $as_echo "$0: be upgraded to zsh 4.3.4 or later." + else + $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, +$0: including any error possibly output before this +$0: message. Then install a modern shell, or manually run +$0: the script under such a shell if you do have one." + fi + exit 1 +fi +fi +fi +SHELL=${CONFIG_SHELL-/bin/sh} +export SHELL +# Unset more variables known to interfere with behavior of common tools. +CLICOLOR_FORCE= GREP_OPTIONS= +unset CLICOLOR_FORCE GREP_OPTIONS + +## --------------------- ## +## M4sh Shell Functions. ## +## --------------------- ## +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr @@ -145,8 +393,12 @@ else as_basename=false fi +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi -# Name of the executable. as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ @@ -166,295 +418,19 @@ $as_echo X/"$0" | } s/.*/./; q'` -# CDPATH. -$as_unset CDPATH +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits -if test "x$CONFIG_SHELL" = x; then - if (eval ":") 2>/dev/null; then - as_have_required=yes -else - as_have_required=no -fi - - if test $as_have_required = yes && (eval ": -(as_func_return () { - (exit \$1) -} -as_func_success () { - as_func_return 0 -} -as_func_failure () { - as_func_return 1 -} -as_func_ret_success () { - return 0 -} -as_func_ret_failure () { - return 1 -} - -exitcode=0 -if as_func_success; then - : -else - exitcode=1 - echo as_func_success failed. -fi - -if as_func_failure; then - exitcode=1 - echo as_func_failure succeeded. -fi - -if as_func_ret_success; then - : -else - exitcode=1 - echo as_func_ret_success failed. -fi - -if as_func_ret_failure; then - exitcode=1 - echo as_func_ret_failure succeeded. -fi - -if ( set x; as_func_ret_success y && test x = \"\$1\" ); then - : -else - exitcode=1 - echo positional parameters were not saved. -fi - -test \$exitcode = 0) || { (exit 1); exit 1; } - -( - as_lineno_1=\$LINENO - as_lineno_2=\$LINENO - test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" && - test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; } -") 2> /dev/null; then - : -else - as_candidate_shells= - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - case $as_dir in - /*) - for as_base in sh bash ksh sh5; do - as_candidate_shells="$as_candidate_shells $as_dir/$as_base" - done;; - esac -done -IFS=$as_save_IFS - - - for as_shell in $as_candidate_shells $SHELL; do - # Try only shells that exist, to save several forks. - if { test -f "$as_shell" || test -f "$as_shell.exe"; } && - { ("$as_shell") 2> /dev/null <<\_ASEOF -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then - emulate sh - NULLCMD=: - # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which - # is contrary to our usage. Disable this feature. - alias -g '${1+"$@"}'='"$@"' - setopt NO_GLOB_SUBST -else - case `(set -o) 2>/dev/null` in - *posix*) set -o posix ;; -esac - -fi - - -: -_ASEOF -}; then - CONFIG_SHELL=$as_shell - as_have_required=yes - if { "$as_shell" 2> /dev/null <<\_ASEOF -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then - emulate sh - NULLCMD=: - # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which - # is contrary to our usage. Disable this feature. - alias -g '${1+"$@"}'='"$@"' - setopt NO_GLOB_SUBST -else - case `(set -o) 2>/dev/null` in - *posix*) set -o posix ;; -esac - -fi - - -: -(as_func_return () { - (exit $1) -} -as_func_success () { - as_func_return 0 -} -as_func_failure () { - as_func_return 1 -} -as_func_ret_success () { - return 0 -} -as_func_ret_failure () { - return 1 -} - -exitcode=0 -if as_func_success; then - : -else - exitcode=1 - echo as_func_success failed. -fi - -if as_func_failure; then - exitcode=1 - echo as_func_failure succeeded. -fi - -if as_func_ret_success; then - : -else - exitcode=1 - echo as_func_ret_success failed. -fi - -if as_func_ret_failure; then - exitcode=1 - echo as_func_ret_failure succeeded. -fi - -if ( set x; as_func_ret_success y && test x = "$1" ); then - : -else - exitcode=1 - echo positional parameters were not saved. -fi - -test $exitcode = 0) || { (exit 1); exit 1; } - -( - as_lineno_1=$LINENO - as_lineno_2=$LINENO - test "x$as_lineno_1" != "x$as_lineno_2" && - test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; } - -_ASEOF -}; then - break -fi - -fi - - done - - if test "x$CONFIG_SHELL" != x; then - for as_var in BASH_ENV ENV - do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var - done - export CONFIG_SHELL - exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} -fi - - - if test $as_have_required = no; then - echo This script requires a shell more modern than all the - echo shells that I found on your system. Please install a - echo modern shell, or manually run the script under such a - echo shell if you do have one. - { (exit 1); exit 1; } -fi - - -fi - -fi - - - -(eval "as_func_return () { - (exit \$1) -} -as_func_success () { - as_func_return 0 -} -as_func_failure () { - as_func_return 1 -} -as_func_ret_success () { - return 0 -} -as_func_ret_failure () { - return 1 -} - -exitcode=0 -if as_func_success; then - : -else - exitcode=1 - echo as_func_success failed. -fi - -if as_func_failure; then - exitcode=1 - echo as_func_failure succeeded. -fi - -if as_func_ret_success; then - : -else - exitcode=1 - echo as_func_ret_success failed. -fi - -if as_func_ret_failure; then - exitcode=1 - echo as_func_ret_failure succeeded. -fi - -if ( set x; as_func_ret_success y && test x = \"\$1\" ); then - : -else - exitcode=1 - echo positional parameters were not saved. -fi - -test \$exitcode = 0") || { - echo No shell found that supports shell functions. - echo Please tell bug-autoconf@gnu.org about your system, - echo including any error possibly output before this message. - echo This can help us improve future autoconf versions. - echo Configuration will now proceed without shell functions. -} - - - - as_lineno_1=$LINENO - as_lineno_2=$LINENO - test "x$as_lineno_1" != "x$as_lineno_2" && - test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { - - # Create $as_me.lineno as a copy of $as_myself, but with $LINENO - # uniformly replaced by the line number. The first 'sed' inserts a - # line-number line after each line using $LINENO; the second 'sed' - # does the real work. The second script uses 'N' to pair each - # line-number line with the line containing $LINENO, and appends - # trailing '-' during substitution so that $LINENO is not a special - # case at line end. - # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the - # scripts with optimization help from Paolo Bonzini. Blame Lee - # E. McMahon (1931-1989) for sed's syntax. :-) + as_lineno_1=$LINENO as_lineno_1a=$LINENO + as_lineno_2=$LINENO as_lineno_2a=$LINENO + eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && + test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { + # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= @@ -471,8 +447,7 @@ test \$exitcode = 0") || { s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || - { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 - { (exit 1); exit 1; }; } + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the @@ -482,29 +457,18 @@ test \$exitcode = 0") || { exit } - -if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then - as_dirname=dirname -else - as_dirname=false -fi - ECHO_C= ECHO_N= ECHO_T= -case `echo -n x` in +case `echo -n x` in #((((( -n*) - case `echo 'x\c'` in + case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. - *) ECHO_C='\c';; + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac -if expr a : '\(a\)' >/dev/null 2>&1 && - test "X`expr 00001 : '.*\(...\)'`" = X001; then - as_expr=expr -else - as_expr=false -fi rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then @@ -534,7 +498,7 @@ rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then - as_mkdir_p=: + as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false @@ -553,10 +517,10 @@ else if test -d "$1"; then test -d "$1/."; else - case $1 in + case $1 in #( -*)set "./$1";; esac; - case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( ???[sx]*):;;*)false;;esac;fi '\'' sh ' @@ -569,161 +533,14 @@ as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" - - - -# Check that we are running under the correct shell. SHELL=${CONFIG_SHELL-/bin/sh} -case X$lt_ECHO in -X*--fallback-echo) - # Remove one level of quotation (which was required for Make). - ECHO=`echo "$lt_ECHO" | sed 's,\\\\\$\\$0,'$0','` - ;; -esac -ECHO=${lt_ECHO-echo} -if test "X$1" = X--no-reexec; then - # Discard the --no-reexec flag, and continue. - shift -elif test "X$1" = X--fallback-echo; then - # Avoid inline document here, it may be left over - : -elif test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' ; then - # Yippee, $ECHO works! - : -else - # Restart under the correct shell. - exec $SHELL "$0" --no-reexec ${1+"$@"} -fi - -if test "X$1" = X--fallback-echo; then - # used as fallback echo - shift - cat <<_LT_EOF -$* -_LT_EOF - exit 0 -fi - -# The HP-UX ksh and POSIX shell print the target directory to stdout -# if CDPATH is set. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH - -if test -z "$lt_ECHO"; then - if test "X${echo_test_string+set}" != Xset; then - # find a string as large as possible, as long as the shell can cope with it - for cmd in 'sed 50q "$0"' 'sed 20q "$0"' 'sed 10q "$0"' 'sed 2q "$0"' 'echo test'; do - # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ... - if { echo_test_string=`eval $cmd`; } 2>/dev/null && - { test "X$echo_test_string" = "X$echo_test_string"; } 2>/dev/null - then - break - fi - done - fi - - if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' && - echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` && - test "X$echo_testing_string" = "X$echo_test_string"; then - : - else - # The Solaris, AIX, and Digital Unix default echo programs unquote - # backslashes. This makes it impossible to quote backslashes using - # echo "$something" | sed 's/\\/\\\\/g' - # - # So, first we look for a working echo in the user's PATH. - - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - for dir in $PATH /usr/ucb; do - IFS="$lt_save_ifs" - if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && - test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && - echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && - test "X$echo_testing_string" = "X$echo_test_string"; then - ECHO="$dir/echo" - break - fi - done - IFS="$lt_save_ifs" - - if test "X$ECHO" = Xecho; then - # We didn't find a better echo, so look for alternatives. - if test "X`{ print -r '\t'; } 2>/dev/null`" = 'X\t' && - echo_testing_string=`{ print -r "$echo_test_string"; } 2>/dev/null` && - test "X$echo_testing_string" = "X$echo_test_string"; then - # This shell has a builtin print -r that does the trick. - ECHO='print -r' - elif { test -f /bin/ksh || test -f /bin/ksh$ac_exeext; } && - test "X$CONFIG_SHELL" != X/bin/ksh; then - # If we have ksh, try running configure again with it. - ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} - export ORIGINAL_CONFIG_SHELL - CONFIG_SHELL=/bin/ksh - export CONFIG_SHELL - exec $CONFIG_SHELL "$0" --no-reexec ${1+"$@"} - else - # Try using printf. - ECHO='printf %s\n' - if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' && - echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` && - test "X$echo_testing_string" = "X$echo_test_string"; then - # Cool, printf works - : - elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` && - test "X$echo_testing_string" = 'X\t' && - echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` && - test "X$echo_testing_string" = "X$echo_test_string"; then - CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL - export CONFIG_SHELL - SHELL="$CONFIG_SHELL" - export SHELL - ECHO="$CONFIG_SHELL $0 --fallback-echo" - elif echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` && - test "X$echo_testing_string" = 'X\t' && - echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` && - test "X$echo_testing_string" = "X$echo_test_string"; then - ECHO="$CONFIG_SHELL $0 --fallback-echo" - else - # maybe with a smaller string... - prev=: - - for cmd in 'echo test' 'sed 2q "$0"' 'sed 10q "$0"' 'sed 20q "$0"' 'sed 50q "$0"'; do - if { test "X$echo_test_string" = "X`eval $cmd`"; } 2>/dev/null - then - break - fi - prev="$cmd" - done - - if test "$prev" != 'sed 50q "$0"'; then - echo_test_string=`eval $prev` - export echo_test_string - exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "$0" ${1+"$@"} - else - # Oops. We lost completely, so just stick with echo. - ECHO=echo - fi - fi - fi - fi - fi -fi - -# Copy echo and quote the copy suitably for passing to libtool from -# the Makefile, instead of quoting the original, which is used later. -lt_ECHO=$ECHO -if test "X$lt_ECHO" = "X$CONFIG_SHELL $0 --fallback-echo"; then - lt_ECHO="$CONFIG_SHELL \\\$\$0 --fallback-echo" -fi - - - - -exec 7<&0 &1 +test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. -# hostname on some systems (SVR3.2, Linux) returns a bogus exit status, +# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` @@ -738,7 +555,6 @@ cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= -SHELL=${CONFIG_SHELL-/bin/sh} # Identity of this package. PACKAGE_NAME= @@ -746,6 +562,7 @@ PACKAGE_TARNAME= PACKAGE_VERSION= PACKAGE_STRING= PACKAGE_BUGREPORT= +PACKAGE_URL= ac_unique_file="entities.c" # Factoring default headers for most tests. @@ -805,6 +622,7 @@ XML_LIBDIR XML_CFLAGS CYGWIN_EXTRA_PYTHON_LIBADD CYGWIN_EXTRA_LDFLAGS +WIN32_EXTRA_PYTHON_LIBADD WIN32_EXTRA_LDFLAGS WIN32_EXTRA_LIBADD WITH_RUN_DEBUG @@ -819,6 +637,7 @@ WITH_SCHEMAS TEST_SCHEMATRON WITH_SCHEMATRON WITH_ISO8859X +WITH_ICU WITH_ICONV WITH_OUTPUT TEST_XPATH @@ -894,7 +713,6 @@ OTOOL LIPO NMEDIT DSYMUTIL -lt_ECHO RANLIB AR LN_S @@ -1004,6 +822,7 @@ bindir program_transform_name prefix exec_prefix +PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION @@ -1033,6 +852,7 @@ with_html_dir with_html_subdir with_http with_iconv +with_icu with_iso8859x with_legacy with_mem_debug @@ -1179,8 +999,7 @@ do ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - { $as_echo "$as_me: error: invalid feature name: $ac_useropt" >&2 - { (exit 1); exit 1; }; } + as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in @@ -1206,8 +1025,7 @@ do ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - { $as_echo "$as_me: error: invalid feature name: $ac_useropt" >&2 - { (exit 1); exit 1; }; } + as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in @@ -1411,8 +1229,7 @@ do ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - { $as_echo "$as_me: error: invalid package name: $ac_useropt" >&2 - { (exit 1); exit 1; }; } + as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in @@ -1428,8 +1245,7 @@ do ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - { $as_echo "$as_me: error: invalid package name: $ac_useropt" >&2 - { (exit 1); exit 1; }; } + as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in @@ -1459,17 +1275,17 @@ do | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; - -*) { $as_echo "$as_me: error: unrecognized option: $ac_option -Try \`$0 --help' for more information." >&2 - { (exit 1); exit 1; }; } + -*) as_fn_error $? "unrecognized option: \`$ac_option' +Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. - expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && - { $as_echo "$as_me: error: invalid variable name: $ac_envvar" >&2 - { (exit 1); exit 1; }; } + case $ac_envvar in #( + '' | [0-9]* | *[!_$as_cr_alnum]* ) + as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; + esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; @@ -1486,15 +1302,13 @@ done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` - { $as_echo "$as_me: error: missing argument to $ac_option" >&2 - { (exit 1); exit 1; }; } + as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; - fatal) { $as_echo "$as_me: error: unrecognized options: $ac_unrecognized_opts" >&2 - { (exit 1); exit 1; }; } ;; + fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi @@ -1517,8 +1331,7 @@ do [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac - { $as_echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 - { (exit 1); exit 1; }; } + as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' @@ -1532,8 +1345,8 @@ target=$target_alias if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe - $as_echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. - If a cross compiler is detected then cross compile mode will be used." >&2 + $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host. + If a cross compiler is detected then cross compile mode will be used" >&2 elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi @@ -1548,11 +1361,9 @@ test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || - { $as_echo "$as_me: error: working directory cannot be determined" >&2 - { (exit 1); exit 1; }; } + as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || - { $as_echo "$as_me: error: pwd does not report name of working directory" >&2 - { (exit 1); exit 1; }; } + as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. @@ -1591,13 +1402,11 @@ else fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." - { $as_echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 - { (exit 1); exit 1; }; } + as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( - cd "$srcdir" && test -r "./$ac_unique_file" || { $as_echo "$as_me: error: $ac_msg" >&2 - { (exit 1); exit 1; }; } + cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then @@ -1637,7 +1446,7 @@ Configuration: --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit - -q, --quiet, --silent do not print \`checking...' messages + -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files @@ -1729,6 +1538,7 @@ Optional Packages: $PACKAGE-$VERSION/html --with-http add the HTTP support (on) --with-iconv[=DIR] add ICONV support (on) + --with-icu add ICU support (off) --with-iso8859x add ISO8859X support if no iconv (on) --with-legacy add deprecated APIs for compatibility (on) --with-mem-debug add the memory debugging module (off) @@ -1762,13 +1572,14 @@ Some influential environment variables: LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l - CPPFLAGS C/C++/Objective C preprocessor flags, e.g. -I if + CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. +Report bugs to the package provider. _ACEOF ac_status=$? fi @@ -1832,21 +1643,372 @@ test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF configure -generated by GNU Autoconf 2.63 +generated by GNU Autoconf 2.66 -Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, -2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. +Copyright (C) 2010 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi + +## ------------------------ ## +## Autoconf initialization. ## +## ------------------------ ## + +# ac_fn_c_try_compile LINENO +# -------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + as_fn_set_status $ac_retval + +} # ac_fn_c_try_compile + +# ac_fn_c_try_cpp LINENO +# ---------------------- +# Try to preprocess conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + as_fn_set_status $ac_retval + +} # ac_fn_c_try_cpp + +# ac_fn_c_try_run LINENO +# ---------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes +# that executables *can* be run. +ac_fn_c_try_run () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then : + ac_retval=0 +else + $as_echo "$as_me: program exited with status $ac_status" >&5 + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=$ac_status +fi + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + as_fn_set_status $ac_retval + +} # ac_fn_c_try_run + +# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists, giving a warning if it cannot be compiled using +# the include files in INCLUDES and setting the cache variable VAR +# accordingly. +ac_fn_c_check_header_mongrel () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if eval "test \"\${$3+set}\"" = set; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval "test \"\${$3+set}\"" = set; then : + $as_echo_n "(cached) " >&6 +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 +$as_echo_n "checking $2 usability... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_header_compiler=yes +else + ac_header_compiler=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 +$as_echo_n "checking $2 presence... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <$2> +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + ac_header_preproc=yes +else + ac_header_preproc=no +fi +rm -f conftest.err conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( + yes:no: ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} + ;; + no:yes:* ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} + ;; +esac + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval "test \"\${$3+set}\"" = set; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=\$ac_header_compiler" +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +fi + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + +} # ac_fn_c_check_header_mongrel + +# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists and can be compiled using the include files in +# INCLUDES, setting the cache variable VAR accordingly. +ac_fn_c_check_header_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval "test \"\${$3+set}\"" = set; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + +} # ac_fn_c_check_header_compile + +# ac_fn_c_try_link LINENO +# ----------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + as_fn_set_status $ac_retval + +} # ac_fn_c_try_link + +# ac_fn_c_check_func LINENO FUNC VAR +# ---------------------------------- +# Tests whether FUNC exists, setting the cache variable VAR accordingly +ac_fn_c_check_func () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval "test \"\${$3+set}\"" = set; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Define $2 to an innocuous variant, in case declares $2. + For example, HP-UX 11i declares gettimeofday. */ +#define $2 innocuous_$2 + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $2 (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $2 + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $2 (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$2 || defined __stub___$2 +choke me +#endif + +int +main () +{ +return $2 (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + +} # ac_fn_c_check_func cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by $as_me, which was -generated by GNU Autoconf 2.63. Invocation command line was +generated by GNU Autoconf 2.66. Invocation command line was $ $0 $@ @@ -1882,8 +2044,8 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - $as_echo "PATH: $as_dir" -done + $as_echo "PATH: $as_dir" + done IFS=$as_save_IFS } >&5 @@ -1920,9 +2082,9 @@ do ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in - 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; + 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) - ac_configure_args1="$ac_configure_args1 '$ac_arg'" + as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else @@ -1938,13 +2100,13 @@ do -* ) ac_must_keep_next=true ;; esac fi - ac_configure_args="$ac_configure_args '$ac_arg'" + as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done -$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } -$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; } +{ ac_configure_args0=; unset ac_configure_args0;} +{ ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there @@ -1956,11 +2118,9 @@ trap 'exit_status=$? { echo - cat <<\_ASBOX -## ---------------- ## + $as_echo "## ---------------- ## ## Cache variables. ## -## ---------------- ## -_ASBOX +## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( @@ -1969,13 +2129,13 @@ _ASBOX case $ac_val in #( *${as_nl}*) case $ac_var in #( - *_cv_*) { $as_echo "$as_me:$LINENO: WARNING: cache variable $ac_var contains a newline" >&5 + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( - *) $as_unset $ac_var ;; + *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done @@ -1994,11 +2154,9 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; ) echo - cat <<\_ASBOX -## ----------------- ## + $as_echo "## ----------------- ## ## Output variables. ## -## ----------------- ## -_ASBOX +## ----------------- ##" echo for ac_var in $ac_subst_vars do @@ -2011,11 +2169,9 @@ _ASBOX echo if test -n "$ac_subst_files"; then - cat <<\_ASBOX -## ------------------- ## + $as_echo "## ------------------- ## ## File substitutions. ## -## ------------------- ## -_ASBOX +## ------------------- ##" echo for ac_var in $ac_subst_files do @@ -2029,11 +2185,9 @@ _ASBOX fi if test -s confdefs.h; then - cat <<\_ASBOX -## ----------- ## + $as_echo "## ----------- ## ## confdefs.h. ## -## ----------- ## -_ASBOX +## ----------- ##" echo cat confdefs.h echo @@ -2047,46 +2201,53 @@ _ASBOX exit $exit_status ' 0 for ac_signal in 1 2 13 15; do - trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal + trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h +$as_echo "/* confdefs.h */" > confdefs.h + # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF - cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF - cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF - cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF - cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF +cat >>confdefs.h <<_ACEOF +#define PACKAGE_URL "$PACKAGE_URL" +_ACEOF + # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then - ac_site_file1=$CONFIG_SITE + # We do not want a PATH search for config.site. + case $CONFIG_SITE in #(( + -*) ac_site_file1=./$CONFIG_SITE;; + */*) ac_site_file1=$CONFIG_SITE;; + *) ac_site_file1=./$CONFIG_SITE;; + esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site @@ -2097,19 +2258,23 @@ fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue - if test -r "$ac_site_file"; then - { $as_echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 + if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 - . "$ac_site_file" + . "$ac_site_file" \ + || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "failed to load site script $ac_site_file +See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then - # Some versions of bash will fail to source /dev/null (special - # files actually), so we avoid doing that. - if test -f "$cache_file"; then - { $as_echo "$as_me:$LINENO: loading cache $cache_file" >&5 + # Some versions of bash will fail to source /dev/null (special files + # actually), so we avoid doing that. DJGPP emulates it as a regular file. + if test /dev/null != "$cache_file" && test -f "$cache_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; @@ -2117,7 +2282,7 @@ $as_echo "$as_me: loading cache $cache_file" >&6;} esac fi else - { $as_echo "$as_me:$LINENO: creating cache $cache_file" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi @@ -2132,11 +2297,11 @@ for ac_var in $ac_precious_vars; do eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) - { $as_echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) - { $as_echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; @@ -2146,17 +2311,17 @@ $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then - { $as_echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else - { $as_echo "$as_me:$LINENO: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi - { $as_echo "$as_me:$LINENO: former value: \`$ac_old_val'" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} - { $as_echo "$as_me:$LINENO: current value: \`$ac_new_val'" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac @@ -2168,35 +2333,20 @@ $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. - *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; + *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then - { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} - { $as_echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} - { { $as_echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 -$as_echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi - - - - - - - - - - - - - - - - +## -------------------- ## +## Main body of script. ## +## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' @@ -2225,9 +2375,7 @@ for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do fi done if test -z "$ac_aux_dir"; then - { { $as_echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&5 -$as_echo "$as_me: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, @@ -2241,35 +2389,27 @@ ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || - { { $as_echo "$as_me:$LINENO: error: cannot run $SHELL $ac_aux_dir/config.sub" >&5 -$as_echo "$as_me: error: cannot run $SHELL $ac_aux_dir/config.sub" >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 -{ $as_echo "$as_me:$LINENO: checking build system type" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } -if test "${ac_cv_build+set}" = set; then +if test "${ac_cv_build+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && - { { $as_echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5 -$as_echo "$as_me: error: cannot guess build type; you must specify one" >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || - { { $as_echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&5 -$as_echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_build" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; -*) { { $as_echo "$as_me:$LINENO: error: invalid value of canonical build" >&5 -$as_echo "$as_me: error: invalid value of canonical build" >&2;} - { (exit 1); exit 1; }; };; +*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' @@ -2285,28 +2425,24 @@ IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac -{ $as_echo "$as_me:$LINENO: checking host system type" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } -if test "${ac_cv_host+set}" = set; then +if test "${ac_cv_host+set}" = set; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || - { { $as_echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&5 -$as_echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_host" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; -*) { { $as_echo "$as_me:$LINENO: error: invalid value of canonical host" >&5 -$as_echo "$as_me: error: invalid value of canonical host" >&2;} - { (exit 1); exit 1; }; };; +*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' @@ -2325,7 +2461,7 @@ case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac LIBXML_MAJOR_VERSION=2 LIBXML_MINOR_VERSION=7 -LIBXML_MICRO_VERSION=7 +LIBXML_MICRO_VERSION=8 LIBXML_MICRO_VERSION_SUFFIX= LIBXML_VERSION=$LIBXML_MAJOR_VERSION.$LIBXML_MINOR_VERSION.$LIBXML_MICRO_VERSION$LIBXML_MICRO_VERSION_SUFFIX LIBXML_VERSION_INFO=`expr $LIBXML_MAJOR_VERSION + $LIBXML_MINOR_VERSION`:$LIBXML_MICRO_VERSION:$LIBXML_MINOR_VERSION @@ -2382,10 +2518,10 @@ am__api_version='1.11' # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. -{ $as_echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then -if test "${ac_cv_path_install+set}" = set; then +if test "${ac_cv_path_install+set}" = set; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -2393,11 +2529,11 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - # Account for people who put trailing slashes in PATH elements. -case $as_dir/ in - ./ | .// | /cC/* | \ + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in #(( + ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ - ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \ + ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. @@ -2434,7 +2570,7 @@ case $as_dir/ in ;; esac -done + done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir @@ -2450,7 +2586,7 @@ fi INSTALL=$ac_install_sh fi fi -{ $as_echo "$as_me:$LINENO: result: $INSTALL" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. @@ -2461,7 +2597,7 @@ test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' -{ $as_echo "$as_me:$LINENO: checking whether build environment is sane" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Just in case sleep 1 @@ -2472,15 +2608,11 @@ am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) - { { $as_echo "$as_me:$LINENO: error: unsafe absolute working directory name" >&5 -$as_echo "$as_me: error: unsafe absolute working directory name" >&2;} - { (exit 1); exit 1; }; };; + as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) - { { $as_echo "$as_me:$LINENO: error: unsafe srcdir value: \`$srcdir'" >&5 -$as_echo "$as_me: error: unsafe srcdir value: \`$srcdir'" >&2;} - { (exit 1); exit 1; }; };; + as_fn_error $? "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;; esac # Do `set' in a subshell so we don't clobber the current shell's @@ -2502,11 +2634,8 @@ if ( # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". - { { $as_echo "$as_me:$LINENO: error: ls -t appears to fail. Make sure there is not a broken -alias in your environment" >&5 -$as_echo "$as_me: error: ls -t appears to fail. Make sure there is not a broken -alias in your environment" >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "ls -t appears to fail. Make sure there is not a broken +alias in your environment" "$LINENO" 5 fi test "$2" = conftest.file @@ -2515,13 +2644,10 @@ then # Ok. : else - { { $as_echo "$as_me:$LINENO: error: newly created file is older than distributed files! -Check your system clock" >&5 -$as_echo "$as_me: error: newly created file is older than distributed files! -Check your system clock" >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "newly created file is older than distributed files! +Check your system clock" "$LINENO" 5 fi -{ $as_echo "$as_me:$LINENO: result: yes" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" @@ -2549,7 +2675,7 @@ if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= - { $as_echo "$as_me:$LINENO: WARNING: \`missing' script is too old or missing" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} fi @@ -2570,9 +2696,9 @@ if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_STRIP+set}" = set; then +if test "${ac_cv_prog_STRIP+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then @@ -2583,24 +2709,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then - { $as_echo "$as_me:$LINENO: result: $STRIP" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -2610,9 +2736,9 @@ if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then +if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then @@ -2623,24 +2749,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_STRIP="strip" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then - { $as_echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -2649,7 +2775,7 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac @@ -2662,10 +2788,10 @@ fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" -{ $as_echo "$as_me:$LINENO: checking for a thread-safe mkdir -p" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then - if test "${ac_cv_path_mkdir+set}" = set; then + if test "${ac_cv_path_mkdir+set}" = set; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -2673,7 +2799,7 @@ for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_prog in mkdir gmkdir; do + for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( @@ -2685,11 +2811,12 @@ do esac done done -done + done IFS=$as_save_IFS fi + test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else @@ -2697,11 +2824,10 @@ fi # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. - test -d ./--version && rmdir ./--version MKDIR_P="$ac_install_sh -d" fi fi -{ $as_echo "$as_me:$LINENO: result: $MKDIR_P" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } mkdir_p="$MKDIR_P" @@ -2714,9 +2840,9 @@ for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_AWK+set}" = set; then +if test "${ac_cv_prog_AWK+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then @@ -2727,24 +2853,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_AWK="$ac_prog" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then - { $as_echo "$as_me:$LINENO: result: $AWK" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -2752,11 +2878,11 @@ fi test -n "$AWK" && break done -{ $as_echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` -if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then +if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\"" = set; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF @@ -2764,7 +2890,7 @@ SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF -# GNU make sometimes prints "make[1]: Entering...", which would confuse us. +# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; @@ -2774,11 +2900,11 @@ esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then - { $as_echo "$as_me:$LINENO: result: yes" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi @@ -2798,9 +2924,7 @@ if test "`cd $srcdir && pwd`" != "`pwd`"; then am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then - { { $as_echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5 -$as_echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi @@ -2865,9 +2989,9 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_CC+set}" = set; then +if test "${ac_cv_prog_CC+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then @@ -2878,24 +3002,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}gcc" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - { $as_echo "$as_me:$LINENO: result: $CC" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -2905,9 +3029,9 @@ if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_CC+set}" = set; then +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then @@ -2918,24 +3042,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="gcc" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -2944,7 +3068,7 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac @@ -2958,9 +3082,9 @@ if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_CC+set}" = set; then +if test "${ac_cv_prog_CC+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then @@ -2971,24 +3095,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}cc" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - { $as_echo "$as_me:$LINENO: result: $CC" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -2998,9 +3122,9 @@ fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_CC+set}" = set; then +if test "${ac_cv_prog_CC+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then @@ -3012,18 +3136,18 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then @@ -3042,10 +3166,10 @@ fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - { $as_echo "$as_me:$LINENO: result: $CC" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -3057,9 +3181,9 @@ if test -z "$CC"; then do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_CC+set}" = set; then +if test "${ac_cv_prog_CC+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then @@ -3070,24 +3194,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - { $as_echo "$as_me:$LINENO: result: $CC" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -3101,9 +3225,9 @@ if test -z "$CC"; then do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_CC+set}" = set; then +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then @@ -3114,24 +3238,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="$ac_prog" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -3144,7 +3268,7 @@ done else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac @@ -3155,57 +3279,37 @@ fi fi -test -z "$CC" && { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -{ { $as_echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH -See \`config.log' for more details." >&5 -$as_echo "$as_me: error: no acceptable C compiler found in \$PATH -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; }; } +as_fn_error $? "no acceptable C compiler found in \$PATH +See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. -$as_echo "$as_me:$LINENO: checking for C compiler version" >&5 +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 -{ (ac_try="$ac_compiler --version >&5" +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compiler --version >&5") 2>&5 +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } -{ (ac_try="$ac_compiler -v >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compiler -v >&5") 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } -{ (ac_try="$ac_compiler -V >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compiler -V >&5") 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -3221,8 +3325,8 @@ ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. -{ $as_echo "$as_me:$LINENO: checking for C compiler default output file name" >&5 -$as_echo_n "checking for C compiler default output file name... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 +$as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: @@ -3238,17 +3342,17 @@ do done rm -f $ac_rmfiles -if { (ac_try="$ac_link_default" +if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, @@ -3265,7 +3369,7 @@ do # certainly right. break;; *.* ) - if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; + if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi @@ -3284,84 +3388,41 @@ test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi - -{ $as_echo "$as_me:$LINENO: result: $ac_file" >&5 -$as_echo "$ac_file" >&6; } -if test -z "$ac_file"; then - $as_echo "$as_me: failed program was:" >&5 +if test -z "$ac_file"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +$as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -{ { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -{ { $as_echo "$as_me:$LINENO: error: C compiler cannot create executables -See \`config.log' for more details." >&5 -$as_echo "$as_me: error: C compiler cannot create executables -See \`config.log' for more details." >&2;} - { (exit 77); exit 77; }; }; } -fi - -ac_exeext=$ac_cv_exeext - -# Check that the compiler produces executables we can run. If not, either -# the compiler is broken, or we cross compile. -{ $as_echo "$as_me:$LINENO: checking whether the C compiler works" >&5 -$as_echo_n "checking whether the C compiler works... " >&6; } -# FIXME: These cross compiler hacks should be removed for Autoconf 3.0 -# If not cross compiling, check that we can run a simple program. -if test "$cross_compiling" != yes; then - if { ac_try='./$ac_file' - { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - cross_compiling=no - else - if test "$cross_compiling" = maybe; then - cross_compiling=yes - else - { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -{ { $as_echo "$as_me:$LINENO: error: cannot run C compiled programs. -If you meant to cross compile, use \`--host'. -See \`config.log' for more details." >&5 -$as_echo "$as_me: error: cannot run C compiled programs. -If you meant to cross compile, use \`--host'. -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; }; } - fi - fi -fi -{ $as_echo "$as_me:$LINENO: result: yes" >&5 +as_fn_error 77 "C compiler cannot create executables +See \`config.log' for more details" "$LINENO" 5; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 +$as_echo_n "checking for C compiler default output file name... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 +$as_echo "$ac_file" >&6; } +ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save -# Check that the compiler produces executables we can run. If not, either -# the compiler is broken, or we cross compile. -{ $as_echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 -$as_echo_n "checking whether we are cross compiling... " >&6; } -{ $as_echo "$as_me:$LINENO: result: $cross_compiling" >&5 -$as_echo "$cross_compiling" >&6; } - -{ $as_echo "$as_me:$LINENO: checking for suffix of executables" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } -if { (ac_try="$ac_link" +if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with @@ -3376,32 +3437,83 @@ for ac_file in conftest.exe conftest conftest.*; do esac done else - { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -{ { $as_echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link -See \`config.log' for more details." >&5 -$as_echo "$as_me: error: cannot compute suffix of executables: cannot compile and link -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; }; } +as_fn_error $? "cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details" "$LINENO" 5; } fi - -rm -f conftest$ac_cv_exeext -{ $as_echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 +rm -f conftest conftest$ac_cv_exeext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT -{ $as_echo "$as_me:$LINENO: checking for suffix of object files" >&5 +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +FILE *f = fopen ("conftest.out", "w"); + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +ac_clean_files="$ac_clean_files conftest.out" +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 +$as_echo_n "checking whether we are cross compiling... " >&6; } +if test "$cross_compiling" != yes; then + { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if { ac_try='./conftest$ac_cv_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details" "$LINENO" 5; } + fi + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 +$as_echo "$cross_compiling" >&6; } + +rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } -if test "${ac_cv_objext+set}" = set; then +if test "${ac_cv_objext+set}" = set; then : $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -3413,17 +3525,17 @@ main () } _ACEOF rm -f conftest.o conftest.obj -if { (ac_try="$ac_compile" +if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in @@ -3436,31 +3548,23 @@ else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -{ { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -{ { $as_echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile -See \`config.log' for more details." >&5 -$as_echo "$as_me: error: cannot compute suffix of object files: cannot compile -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; }; } +as_fn_error $? "cannot compute suffix of object files: cannot compile +See \`config.log' for more details" "$LINENO" 5; } fi - rm -f conftest.$ac_cv_objext conftest.$ac_ext fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT -{ $as_echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } -if test "${ac_cv_c_compiler_gnu+set}" = set; then +if test "${ac_cv_c_compiler_gnu+set}" = set; then : $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -3474,37 +3578,16 @@ main () return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then +if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_compiler_gnu=no + ac_compiler_gnu=no fi - rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes @@ -3513,20 +3596,16 @@ else fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS -{ $as_echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } -if test "${ac_cv_prog_cc_g+set}" = set; then +if test "${ac_cv_prog_cc_g+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -3537,35 +3616,11 @@ main () return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then +if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - CFLAGS="" - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -3576,36 +3631,12 @@ main () return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - : -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 +if ac_fn_c_try_compile "$LINENO"; then : - ac_c_werror_flag=$ac_save_c_werror_flag +else + ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -3616,42 +3647,17 @@ main () return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then +if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - fi - rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi - rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi - rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS @@ -3668,18 +3674,14 @@ else CFLAGS= fi fi -{ $as_echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } -if test "${ac_cv_prog_cc_c89+set}" = set; then +if test "${ac_cv_prog_cc_c89+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include @@ -3736,32 +3738,9 @@ for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" - rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then + if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - fi - rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done @@ -3772,17 +3751,19 @@ fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) - { $as_echo "$as_me:$LINENO: result: none needed" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) - { $as_echo "$as_me:$LINENO: result: unsupported" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" - { $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac +if test "x$ac_cv_prog_cc_c89" != xno; then : +fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' @@ -3801,7 +3782,7 @@ am__doit: .PHONY: am__doit END # If we don't find an include directive, just comment out the code. -{ $as_echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 $as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= @@ -3829,12 +3810,12 @@ if test "$am__include" = "#"; then fi -{ $as_echo "$as_me:$LINENO: result: $_am_result" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 $as_echo "$_am_result" >&6; } rm -f confinc confmf # Check whether --enable-dependency-tracking was given. -if test "${enable_dependency_tracking+set}" = set; then +if test "${enable_dependency_tracking+set}" = set; then : enableval=$enable_dependency_tracking; fi @@ -3854,9 +3835,9 @@ fi depcc="$CC" am_compiler_list= -{ $as_echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } -if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then +if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then @@ -3964,7 +3945,7 @@ else fi fi -{ $as_echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type @@ -3979,112 +3960,21 @@ else fi -# Find a good install program. We prefer a C program (faster), -# so one script is as good as another. But avoid the broken or -# incompatible versions: -# SysV /etc/install, /usr/sbin/install -# SunOS /usr/etc/install -# IRIX /sbin/install -# AIX /bin/install -# AmigaOS /C/install, which installs bootblocks on floppy discs -# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag -# AFS /usr/afsws/bin/install, which mishandles nonexistent args -# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" -# OS/2's system install, which has a completely different semantic -# ./install, which can be erroneously created by make from ./install.sh. -# Reject install programs that cannot install multiple files. -{ $as_echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 -$as_echo_n "checking for a BSD-compatible install... " >&6; } -if test -z "$INSTALL"; then -if test "${ac_cv_path_install+set}" = set; then - $as_echo_n "(cached) " >&6 -else - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - # Account for people who put trailing slashes in PATH elements. -case $as_dir/ in - ./ | .// | /cC/* | \ - /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ - ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \ - /usr/ucb/* ) ;; - *) - # OSF1 and SCO ODT 3.0 have their own names for install. - # Don't use installbsd from OSF since it installs stuff as root - # by default. - for ac_prog in ginstall scoinst install; do - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then - if test $ac_prog = install && - grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then - # AIX install. It has an incompatible calling convention. - : - elif test $ac_prog = install && - grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then - # program-specific install script used by HP pwplus--don't use. - : - else - rm -rf conftest.one conftest.two conftest.dir - echo one > conftest.one - echo two > conftest.two - mkdir conftest.dir - if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && - test -s conftest.one && test -s conftest.two && - test -s conftest.dir/conftest.one && - test -s conftest.dir/conftest.two - then - ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" - break 3 - fi - fi - fi - done - done - ;; -esac -done -IFS=$as_save_IFS - -rm -rf conftest.one conftest.two conftest.dir - -fi - if test "${ac_cv_path_install+set}" = set; then - INSTALL=$ac_cv_path_install - else - # As a last resort, use the slow shell script. Don't cache a - # value for INSTALL within a source directory, because that will - # break other packages using the cache if that directory is - # removed, or if the value is a relative name. - INSTALL=$ac_install_sh - fi -fi -{ $as_echo "$as_me:$LINENO: result: $INSTALL" >&5 -$as_echo "$INSTALL" >&6; } - -# Use test -z because SunOS4 sh mishandles braces in ${var-val}. -# It thinks the first close brace ends the variable substitution. -test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' - -test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' - -test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu -{ $as_echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then - if test "${ac_cv_prog_CPP+set}" = set; then + if test "${ac_cv_prog_CPP+set}" = set; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded @@ -4099,11 +3989,7 @@ do # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include @@ -4112,78 +3998,34 @@ cat >>conftest.$ac_ext <<_ACEOF #endif Syntax error _ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - : -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 +if ac_fn_c_try_cpp "$LINENO"; then : +else # Broken: fails on valid input. continue fi - rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then +if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - # Passes both tests. ac_preproc_ok=: break fi - rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext -if $ac_preproc_ok; then +if $ac_preproc_ok; then : break fi @@ -4195,7 +4037,7 @@ fi else ac_cv_prog_CPP=$CPP fi -{ $as_echo "$as_me:$LINENO: result: $CPP" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes @@ -4206,11 +4048,7 @@ do # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include @@ -4219,87 +4057,40 @@ cat >>conftest.$ac_ext <<_ACEOF #endif Syntax error _ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - : -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 +if ac_fn_c_try_cpp "$LINENO"; then : +else # Broken: fails on valid input. continue fi - rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then +if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - # Passes both tests. ac_preproc_ok=: break fi - rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext -if $ac_preproc_ok; then - : +if $ac_preproc_ok; then : + else - { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -{ { $as_echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check -See \`config.log' for more details." >&5 -$as_echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; }; } +as_fn_error $? "C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c @@ -4310,9 +4101,9 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu # Extract the first word of "rm", so it can be a program name with args. set dummy rm; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_RM+set}" = set; then +if test "${ac_cv_path_RM+set}" = set; then : $as_echo_n "(cached) " >&6 else case $RM in @@ -4325,14 +4116,14 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_RM="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS test -z "$ac_cv_path_RM" && ac_cv_path_RM="/bin/rm" @@ -4341,19 +4132,19 @@ esac fi RM=$ac_cv_path_RM if test -n "$RM"; then - { $as_echo "$as_me:$LINENO: result: $RM" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RM" >&5 $as_echo "$RM" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "mv", so it can be a program name with args. set dummy mv; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_MV+set}" = set; then +if test "${ac_cv_path_MV+set}" = set; then : $as_echo_n "(cached) " >&6 else case $MV in @@ -4366,14 +4157,14 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_MV="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS test -z "$ac_cv_path_MV" && ac_cv_path_MV="/bin/mv" @@ -4382,19 +4173,19 @@ esac fi MV=$ac_cv_path_MV if test -n "$MV"; then - { $as_echo "$as_me:$LINENO: result: $MV" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MV" >&5 $as_echo "$MV" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "tar", so it can be a program name with args. set dummy tar; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_TAR+set}" = set; then +if test "${ac_cv_path_TAR+set}" = set; then : $as_echo_n "(cached) " >&6 else case $TAR in @@ -4407,14 +4198,14 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_TAR="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS test -z "$ac_cv_path_TAR" && ac_cv_path_TAR="/bin/tar" @@ -4423,19 +4214,19 @@ esac fi TAR=$ac_cv_path_TAR if test -n "$TAR"; then - { $as_echo "$as_me:$LINENO: result: $TAR" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $TAR" >&5 $as_echo "$TAR" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "perl", so it can be a program name with args. set dummy perl; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_PERL+set}" = set; then +if test "${ac_cv_path_PERL+set}" = set; then : $as_echo_n "(cached) " >&6 else case $PERL in @@ -4448,14 +4239,14 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_PERL="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS test -z "$ac_cv_path_PERL" && ac_cv_path_PERL="/usr/bin/perl" @@ -4464,19 +4255,19 @@ esac fi PERL=$ac_cv_path_PERL if test -n "$PERL"; then - { $as_echo "$as_me:$LINENO: result: $PERL" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PERL" >&5 $as_echo "$PERL" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "wget", so it can be a program name with args. set dummy wget; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_WGET+set}" = set; then +if test "${ac_cv_path_WGET+set}" = set; then : $as_echo_n "(cached) " >&6 else case $WGET in @@ -4489,14 +4280,14 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_WGET="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS test -z "$ac_cv_path_WGET" && ac_cv_path_WGET="/usr/bin/wget" @@ -4505,19 +4296,19 @@ esac fi WGET=$ac_cv_path_WGET if test -n "$WGET"; then - { $as_echo "$as_me:$LINENO: result: $WGET" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $WGET" >&5 $as_echo "$WGET" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "xmllint", so it can be a program name with args. set dummy xmllint; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_XMLLINT+set}" = set; then +if test "${ac_cv_path_XMLLINT+set}" = set; then : $as_echo_n "(cached) " >&6 else case $XMLLINT in @@ -4530,14 +4321,14 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_XMLLINT="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS test -z "$ac_cv_path_XMLLINT" && ac_cv_path_XMLLINT="/usr/bin/xmllint" @@ -4546,19 +4337,19 @@ esac fi XMLLINT=$ac_cv_path_XMLLINT if test -n "$XMLLINT"; then - { $as_echo "$as_me:$LINENO: result: $XMLLINT" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XMLLINT" >&5 $as_echo "$XMLLINT" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "xsltproc", so it can be a program name with args. set dummy xsltproc; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_XSLTPROC+set}" = set; then +if test "${ac_cv_path_XSLTPROC+set}" = set; then : $as_echo_n "(cached) " >&6 else case $XSLTPROC in @@ -4571,14 +4362,14 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_XSLTPROC="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS test -z "$ac_cv_path_XSLTPROC" && ac_cv_path_XSLTPROC="/usr/bin/xsltproc" @@ -4587,40 +4378,36 @@ esac fi XSLTPROC=$ac_cv_path_XSLTPROC if test -n "$XSLTPROC"; then - { $as_echo "$as_me:$LINENO: result: $XSLTPROC" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XSLTPROC" >&5 $as_echo "$XSLTPROC" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi -{ $as_echo "$as_me:$LINENO: checking for function prototypes" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for function prototypes" >&5 $as_echo_n "checking for function prototypes... " >&6; } if test "$ac_cv_prog_cc_c89" != no; then - { $as_echo "$as_me:$LINENO: result: yes" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } -cat >>confdefs.h <<\_ACEOF -#define PROTOTYPES 1 -_ACEOF +$as_echo "#define PROTOTYPES 1" >>confdefs.h -cat >>confdefs.h <<\_ACEOF -#define __PROTOTYPES 1 -_ACEOF +$as_echo "#define __PROTOTYPES 1" >>confdefs.h else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi -{ $as_echo "$as_me:$LINENO: checking for grep that handles long lines and -e" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } -if test "${ac_cv_path_GREP+set}" = set; then +if test "${ac_cv_path_GREP+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then @@ -4631,7 +4418,7 @@ for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_prog in grep ggrep; do + for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue @@ -4651,7 +4438,7 @@ case `"$ac_path_GREP" --version 2>&1` in $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - ac_count=`expr $ac_count + 1` + as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" @@ -4666,26 +4453,24 @@ esac $ac_path_GREP_found && break 3 done done -done + done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then - { { $as_echo "$as_me:$LINENO: error: no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 -$as_echo "$as_me: error: no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_path_GREP" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" -{ $as_echo "$as_me:$LINENO: checking for egrep" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } -if test "${ac_cv_path_EGREP+set}" = set; then +if test "${ac_cv_path_EGREP+set}" = set; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 @@ -4699,7 +4484,7 @@ for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_prog in egrep; do + for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue @@ -4719,7 +4504,7 @@ case `"$ac_path_EGREP" --version 2>&1` in $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - ac_count=`expr $ac_count + 1` + as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" @@ -4734,12 +4519,10 @@ esac $ac_path_EGREP_found && break 3 done done -done + done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then - { { $as_echo "$as_me:$LINENO: error: no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 -$as_echo "$as_me: error: no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP @@ -4747,21 +4530,17 @@ fi fi fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_path_EGREP" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" -{ $as_echo "$as_me:$LINENO: checking for ANSI C header files" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } -if test "${ac_cv_header_stdc+set}" = set; then +if test "${ac_cv_header_stdc+set}" = set; then : $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include @@ -4776,48 +4555,23 @@ main () return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then +if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_header_stdc=no + ac_cv_header_stdc=no fi - rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "memchr" >/dev/null 2>&1; then - : + $EGREP "memchr" >/dev/null 2>&1; then : + else ac_cv_header_stdc=no fi @@ -4827,18 +4581,14 @@ fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "free" >/dev/null 2>&1; then - : + $EGREP "free" >/dev/null 2>&1; then : + else ac_cv_header_stdc=no fi @@ -4848,14 +4598,10 @@ fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. - if test "$cross_compiling" = yes; then + if test "$cross_compiling" = yes; then : : else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include @@ -4882,118 +4628,33 @@ main () return 0; } _ACEOF -rm -f conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - : +if ac_fn_c_try_run "$LINENO"; then : + else - $as_echo "$as_me: program exited with status $ac_status" >&5 -$as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -( exit $ac_status ) -ac_cv_header_stdc=no + ac_cv_header_stdc=no fi -rm -rf conftest.dSYM -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext fi - fi fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then -cat >>confdefs.h <<\_ACEOF -#define STDC_HEADERS 1 -_ACEOF +$as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. - - - - - - - - - for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h -do -as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default - -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - eval "$as_ac_Header=yes" -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - eval "$as_ac_Header=no" -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -as_val=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - if test "x$as_val" = x""yes; then +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default +" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF @@ -5011,146 +4672,12 @@ else fi # Ensure some checks needed by ansi2knr itself. - for ac_header in string.h -do -as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -else - # Is the header compilable? -{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 -$as_echo_n "checking $ac_header usability... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_header_compiler=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_compiler=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -$as_echo "$ac_header_compiler" >&6; } - -# Is the header present? -{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 -$as_echo_n "checking $ac_header presence... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - ac_header_preproc=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi - -rm -f conftest.err conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -$as_echo "$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - - ;; -esac -{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - -fi -as_val=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - if test "x$as_val" = x""yes; then +do : + ac_fn_c_check_header_mongrel "$LINENO" "string.h" "ac_cv_header_string_h" "$ac_includes_default" +if test "x$ac_cv_header_string_h" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define HAVE_STRING_H 1 _ACEOF fi @@ -5158,20 +4685,18 @@ fi done -test "x$U" != "x" && { { $as_echo "$as_me:$LINENO: error: Compiler not ANSI compliant" >&5 -$as_echo "$as_me: error: Compiler not ANSI compliant" >&2;} - { (exit 1); exit 1; }; } +test "x$U" != "x" && as_fn_error $? "Compiler not ANSI compliant" "$LINENO" 5 enable_win32_dll=yes case $host in -*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-cegcc*) +*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args. set dummy ${ac_tool_prefix}as; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_AS+set}" = set; then +if test "${ac_cv_prog_AS+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$AS"; then @@ -5182,24 +4707,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_AS="${ac_tool_prefix}as" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi AS=$ac_cv_prog_AS if test -n "$AS"; then - { $as_echo "$as_me:$LINENO: result: $AS" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AS" >&5 $as_echo "$AS" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -5209,9 +4734,9 @@ if test -z "$ac_cv_prog_AS"; then ac_ct_AS=$AS # Extract the first word of "as", so it can be a program name with args. set dummy as; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_AS+set}" = set; then +if test "${ac_cv_prog_ac_ct_AS+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_AS"; then @@ -5222,24 +4747,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_AS="as" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi ac_ct_AS=$ac_cv_prog_ac_ct_AS if test -n "$ac_ct_AS"; then - { $as_echo "$as_me:$LINENO: result: $ac_ct_AS" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AS" >&5 $as_echo "$ac_ct_AS" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -5248,7 +4773,7 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac @@ -5261,9 +4786,9 @@ fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. set dummy ${ac_tool_prefix}dlltool; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_DLLTOOL+set}" = set; then +if test "${ac_cv_prog_DLLTOOL+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$DLLTOOL"; then @@ -5274,24 +4799,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi DLLTOOL=$ac_cv_prog_DLLTOOL if test -n "$DLLTOOL"; then - { $as_echo "$as_me:$LINENO: result: $DLLTOOL" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 $as_echo "$DLLTOOL" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -5301,9 +4826,9 @@ if test -z "$ac_cv_prog_DLLTOOL"; then ac_ct_DLLTOOL=$DLLTOOL # Extract the first word of "dlltool", so it can be a program name with args. set dummy dlltool; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_DLLTOOL+set}" = set; then +if test "${ac_cv_prog_ac_ct_DLLTOOL+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DLLTOOL"; then @@ -5314,24 +4839,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_DLLTOOL="dlltool" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL if test -n "$ac_ct_DLLTOOL"; then - { $as_echo "$as_me:$LINENO: result: $ac_ct_DLLTOOL" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 $as_echo "$ac_ct_DLLTOOL" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -5340,7 +4865,7 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac @@ -5353,9 +4878,9 @@ fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. set dummy ${ac_tool_prefix}objdump; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_OBJDUMP+set}" = set; then +if test "${ac_cv_prog_OBJDUMP+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$OBJDUMP"; then @@ -5366,24 +4891,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi OBJDUMP=$ac_cv_prog_OBJDUMP if test -n "$OBJDUMP"; then - { $as_echo "$as_me:$LINENO: result: $OBJDUMP" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 $as_echo "$OBJDUMP" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -5393,9 +4918,9 @@ if test -z "$ac_cv_prog_OBJDUMP"; then ac_ct_OBJDUMP=$OBJDUMP # Extract the first word of "objdump", so it can be a program name with args. set dummy objdump; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_OBJDUMP+set}" = set; then +if test "${ac_cv_prog_ac_ct_OBJDUMP+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OBJDUMP"; then @@ -5406,24 +4931,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_OBJDUMP="objdump" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP if test -n "$ac_ct_OBJDUMP"; then - { $as_echo "$as_me:$LINENO: result: $ac_ct_OBJDUMP" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 $as_echo "$ac_ct_OBJDUMP" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -5432,7 +4957,7 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac @@ -5467,14 +4992,14 @@ test -z "$OBJDUMP" && OBJDUMP=objdump case `pwd` in *\ * | *\ *) - { $as_echo "$as_me:$LINENO: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 $as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; esac -macro_version='2.2.6b' -macro_revision='1.3017' +macro_version='2.2.10' +macro_revision='1.3175' @@ -5490,9 +5015,78 @@ macro_revision='1.3017' ltmain="$ac_aux_dir/ltmain.sh" -{ $as_echo "$as_me:$LINENO: checking for a sed that does not truncate output" >&5 +# Backslashify metacharacters that are still active within +# double-quoted strings. +sed_quote_subst='s/\(["`$\\]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\(["`\\]\)/\\\1/g' + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to delay expansion of an escaped single quote. +delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' + +ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 +$as_echo_n "checking how to print strings... " >&6; } +# Test print first, because it will be a builtin if present. +if test "X`print -r -- -n 2>/dev/null`" = X-n && \ + test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='print -r --' +elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='printf %s\n' +else + # Use this function as a fallback that always works. + func_fallback_echo () + { + eval 'cat <<_LTECHO_EOF +$1 +_LTECHO_EOF' + } + ECHO='func_fallback_echo' +fi + +# func_echo_all arg... +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "" +} + +case "$ECHO" in + printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5 +$as_echo "printf" >&6; } ;; + print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 +$as_echo "print -r" >&6; } ;; + *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5 +$as_echo "cat" >&6; } ;; +esac + + + + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 $as_echo_n "checking for a sed that does not truncate output... " >&6; } -if test "${ac_cv_path_SED+set}" = set; then +if test "${ac_cv_path_SED+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ @@ -5500,7 +5094,7 @@ else ac_script="$ac_script$as_nl$ac_script" done echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed - $as_unset ac_script || ac_script= + { ac_script=; unset ac_script;} if test -z "$SED"; then ac_path_SED_found=false # Loop through the user's path and test for each of PROGNAME-LIST @@ -5509,7 +5103,7 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_prog in sed gsed; do + for ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_SED" && $as_test_x "$ac_path_SED"; } || continue @@ -5529,7 +5123,7 @@ case `"$ac_path_SED" --version 2>&1` in $as_echo '' >> "conftest.nl" "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - ac_count=`expr $ac_count + 1` + as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_SED_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_SED="$ac_path_SED" @@ -5544,19 +5138,17 @@ esac $ac_path_SED_found && break 3 done done -done + done IFS=$as_save_IFS if test -z "$ac_cv_path_SED"; then - { { $as_echo "$as_me:$LINENO: error: no acceptable sed could be found in \$PATH" >&5 -$as_echo "$as_me: error: no acceptable sed could be found in \$PATH" >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 fi else ac_cv_path_SED=$SED fi fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_path_SED" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 $as_echo "$ac_cv_path_SED" >&6; } SED="$ac_cv_path_SED" rm -f conftest.sed @@ -5574,9 +5166,9 @@ Xsed="$SED -e 1s/^X//" -{ $as_echo "$as_me:$LINENO: checking for fgrep" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 $as_echo_n "checking for fgrep... " >&6; } -if test "${ac_cv_path_FGREP+set}" = set; then +if test "${ac_cv_path_FGREP+set}" = set; then : $as_echo_n "(cached) " >&6 else if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 @@ -5590,7 +5182,7 @@ for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_prog in fgrep; do + for ac_prog in fgrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_FGREP" && $as_test_x "$ac_path_FGREP"; } || continue @@ -5610,7 +5202,7 @@ case `"$ac_path_FGREP" --version 2>&1` in $as_echo 'FGREP' >> "conftest.nl" "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - ac_count=`expr $ac_count + 1` + as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_FGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_FGREP="$ac_path_FGREP" @@ -5625,12 +5217,10 @@ esac $ac_path_FGREP_found && break 3 done done -done + done IFS=$as_save_IFS if test -z "$ac_cv_path_FGREP"; then - { { $as_echo "$as_me:$LINENO: error: no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 -$as_echo "$as_me: error: no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_FGREP=$FGREP @@ -5638,7 +5228,7 @@ fi fi fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_path_FGREP" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 $as_echo "$ac_cv_path_FGREP" >&6; } FGREP="$ac_cv_path_FGREP" @@ -5664,7 +5254,7 @@ test -z "$GREP" && GREP=grep # Check whether --with-gnu-ld was given. -if test "${with_gnu_ld+set}" = set; then +if test "${with_gnu_ld+set}" = set; then : withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no @@ -5673,7 +5263,7 @@ fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. - { $as_echo "$as_me:$LINENO: checking for ld used by $CC" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 $as_echo_n "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) @@ -5703,13 +5293,13 @@ $as_echo_n "checking for ld used by $CC... " >&6; } ;; esac elif test "$with_gnu_ld" = yes; then - { $as_echo "$as_me:$LINENO: checking for GNU ld" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else - { $as_echo "$as_me:$LINENO: checking for non-GNU ld" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi -if test "${lt_cv_path_LD+set}" = set; then +if test "${lt_cv_path_LD+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -z "$LD"; then @@ -5740,18 +5330,16 @@ fi LD="$lt_cv_path_LD" if test -n "$LD"; then - { $as_echo "$as_me:$LINENO: result: $LD" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5 $as_echo "$LD" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi -test -z "$LD" && { { $as_echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5 -$as_echo "$as_me: error: no acceptable ld found in \$PATH" >&2;} - { (exit 1); exit 1; }; } -{ $as_echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5 +test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } -if test "${lt_cv_prog_gnu_ld+set}" = set; then +if test "${lt_cv_prog_gnu_ld+set}" = set; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU lds only accept -v. @@ -5764,7 +5352,7 @@ case `$LD -v 2>&1 &5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5 $as_echo "$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld @@ -5776,9 +5364,9 @@ with_gnu_ld=$lt_cv_prog_gnu_ld -{ $as_echo "$as_me:$LINENO: checking for BSD- or MS-compatible name lister (nm)" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 $as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } -if test "${lt_cv_path_NM+set}" = set; then +if test "${lt_cv_path_NM+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$NM"; then @@ -5825,20 +5413,23 @@ else : ${lt_cv_path_NM=no} fi fi -{ $as_echo "$as_me:$LINENO: result: $lt_cv_path_NM" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 $as_echo "$lt_cv_path_NM" >&6; } if test "$lt_cv_path_NM" != "no"; then NM="$lt_cv_path_NM" else # Didn't find any BSD compatible name lister, look for dumpbin. - if test -n "$ac_tool_prefix"; then - for ac_prog in "dumpbin -symbols" "link -dump -symbols" + if test -n "$DUMPBIN"; then : + # Let the user override the test. + else + if test -n "$ac_tool_prefix"; then + for ac_prog in dumpbin "link -dump" do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_DUMPBIN+set}" = set; then +if test "${ac_cv_prog_DUMPBIN+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$DUMPBIN"; then @@ -5849,24 +5440,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi DUMPBIN=$ac_cv_prog_DUMPBIN if test -n "$DUMPBIN"; then - { $as_echo "$as_me:$LINENO: result: $DUMPBIN" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 $as_echo "$DUMPBIN" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -5876,13 +5467,13 @@ fi fi if test -z "$DUMPBIN"; then ac_ct_DUMPBIN=$DUMPBIN - for ac_prog in "dumpbin -symbols" "link -dump -symbols" + for ac_prog in dumpbin "link -dump" do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_DUMPBIN+set}" = set; then +if test "${ac_cv_prog_ac_ct_DUMPBIN+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DUMPBIN"; then @@ -5893,24 +5484,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN if test -n "$ac_ct_DUMPBIN"; then - { $as_echo "$as_me:$LINENO: result: $ac_ct_DUMPBIN" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 $as_echo "$ac_ct_DUMPBIN" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -5923,7 +5514,7 @@ done else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac @@ -5931,6 +5522,15 @@ esac fi fi + case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in + *COFF*) + DUMPBIN="$DUMPBIN -symbols" + ;; + *) + DUMPBIN=: + ;; + esac + fi if test "$DUMPBIN" != ":"; then NM="$DUMPBIN" @@ -5943,44 +5543,44 @@ test -z "$NM" && NM=nm -{ $as_echo "$as_me:$LINENO: checking the name lister ($NM) interface" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 $as_echo_n "checking the name lister ($NM) interface... " >&6; } -if test "${lt_cv_nm_interface+set}" = set; then +if test "${lt_cv_nm_interface+set}" = set; then : $as_echo_n "(cached) " >&6 else lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext - (eval echo "\"\$as_me:5953: $ac_compile\"" >&5) + (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&5 - (eval echo "\"\$as_me:5956: $NM \\\"conftest.$ac_objext\\\"\"" >&5) + (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&5 - (eval echo "\"\$as_me:5959: output\"" >&5) + (eval echo "\"\$as_me:$LINENO: output\"" >&5) cat conftest.out >&5 if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest* fi -{ $as_echo "$as_me:$LINENO: result: $lt_cv_nm_interface" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 $as_echo "$lt_cv_nm_interface" >&6; } -{ $as_echo "$as_me:$LINENO: checking whether ln -s works" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 $as_echo_n "checking whether ln -s works... " >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then - { $as_echo "$as_me:$LINENO: result: yes" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else - { $as_echo "$as_me:$LINENO: result: no, using $LN_S" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 $as_echo "no, using $LN_S" >&6; } fi # find the maximum length of command line arguments -{ $as_echo "$as_me:$LINENO: checking the maximum length of command line arguments" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 $as_echo_n "checking the maximum length of command line arguments... " >&6; } -if test "${lt_cv_sys_max_cmd_len+set}" = set; then +if test "${lt_cv_sys_max_cmd_len+set}" = set; then : $as_echo_n "(cached) " >&6 else i=0 @@ -6013,6 +5613,11 @@ else lt_cv_sys_max_cmd_len=8192; ;; + mint*) + # On MiNT this can take a long time and run out of memory. + lt_cv_sys_max_cmd_len=8192; + ;; + amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. @@ -6077,8 +5682,8 @@ else # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. - while { test "X"`$SHELL $0 --fallback-echo "X$teststring$teststring" 2>/dev/null` \ - = "XX$teststring$teststring"; } >/dev/null 2>&1 && + while { test "X"`func_fallback_echo "$teststring$teststring" 2>/dev/null` \ + = "X$teststring$teststring"; } >/dev/null 2>&1 && test $i != 17 # 1/2 MB should be enough do i=`expr $i + 1` @@ -6098,10 +5703,10 @@ else fi if test -n $lt_cv_sys_max_cmd_len ; then - { $as_echo "$as_me:$LINENO: result: $lt_cv_sys_max_cmd_len" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 $as_echo "$lt_cv_sys_max_cmd_len" >&6; } else - { $as_echo "$as_me:$LINENO: result: none" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 $as_echo "none" >&6; } fi max_cmd_len=$lt_cv_sys_max_cmd_len @@ -6115,7 +5720,7 @@ max_cmd_len=$lt_cv_sys_max_cmd_len : ${MV="mv -f"} : ${RM="rm -f"} -{ $as_echo "$as_me:$LINENO: checking whether the shell understands some XSI constructs" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5 $as_echo_n "checking whether the shell understands some XSI constructs... " >&6; } # Try some XSI features xsi_shell=no @@ -6125,17 +5730,17 @@ xsi_shell=no && eval 'test $(( 1 + 1 )) -eq 2 \ && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ && xsi_shell=yes -{ $as_echo "$as_me:$LINENO: result: $xsi_shell" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5 $as_echo "$xsi_shell" >&6; } -{ $as_echo "$as_me:$LINENO: checking whether the shell understands \"+=\"" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5 $as_echo_n "checking whether the shell understands \"+=\"... " >&6; } lt_shell_append=no ( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \ >/dev/null 2>&1 \ && lt_shell_append=yes -{ $as_echo "$as_me:$LINENO: result: $lt_shell_append" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5 $as_echo "$lt_shell_append" >&6; } @@ -6170,14 +5775,14 @@ esac -{ $as_echo "$as_me:$LINENO: checking for $LD option to reload object files" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 $as_echo_n "checking for $LD option to reload object files... " >&6; } -if test "${lt_cv_ld_reload_flag+set}" = set; then +if test "${lt_cv_ld_reload_flag+set}" = set; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_reload_flag='-r' fi -{ $as_echo "$as_me:$LINENO: result: $lt_cv_ld_reload_flag" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 $as_echo "$lt_cv_ld_reload_flag" >&6; } reload_flag=$lt_cv_ld_reload_flag case $reload_flag in @@ -6206,9 +5811,9 @@ esac if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. set dummy ${ac_tool_prefix}objdump; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_OBJDUMP+set}" = set; then +if test "${ac_cv_prog_OBJDUMP+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$OBJDUMP"; then @@ -6219,24 +5824,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi OBJDUMP=$ac_cv_prog_OBJDUMP if test -n "$OBJDUMP"; then - { $as_echo "$as_me:$LINENO: result: $OBJDUMP" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 $as_echo "$OBJDUMP" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -6246,9 +5851,9 @@ if test -z "$ac_cv_prog_OBJDUMP"; then ac_ct_OBJDUMP=$OBJDUMP # Extract the first word of "objdump", so it can be a program name with args. set dummy objdump; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_OBJDUMP+set}" = set; then +if test "${ac_cv_prog_ac_ct_OBJDUMP+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OBJDUMP"; then @@ -6259,24 +5864,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_OBJDUMP="objdump" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP if test -n "$ac_ct_OBJDUMP"; then - { $as_echo "$as_me:$LINENO: result: $ac_ct_OBJDUMP" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 $as_echo "$ac_ct_OBJDUMP" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -6285,7 +5890,7 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac @@ -6302,9 +5907,9 @@ test -z "$OBJDUMP" && OBJDUMP=objdump -{ $as_echo "$as_me:$LINENO: checking how to recognize dependent libraries" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 $as_echo_n "checking how to recognize dependent libraries... " >&6; } -if test "${lt_cv_deplibs_check_method+set}" = set; then +if test "${lt_cv_deplibs_check_method+set}" = set; then : $as_echo_n "(cached) " >&6 else lt_cv_file_magic_cmd='$MAGIC_CMD' @@ -6346,16 +5951,18 @@ mingw* | pw32*) # Base MSYS/MinGW do not provide the 'file' command needed by # func_win32_libid shell function, so use a weaker test based on 'objdump', # unless we find 'file', for example because we are cross-compiling. - if ( file / ) >/dev/null 2>&1; then + # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin. + if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else - lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' + # Keep this pattern in sync with the one in func_win32_libid. + lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; -cegcc) +cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' @@ -6385,6 +5992,10 @@ gnu*) lt_cv_deplibs_check_method=pass_all ;; +haiku*) + lt_cv_deplibs_check_method=pass_all + ;; + hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in @@ -6393,11 +6004,11 @@ hpux10.20* | hpux11*) lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) - lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]' + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]' lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) - lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library' + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac @@ -6419,7 +6030,7 @@ irix5* | irix6* | nonstopux*) ;; # This must be Linux ELF. -linux* | k*bsd*-gnu) +linux* | k*bsd*-gnu | kopensolaris*-gnu) lt_cv_deplibs_check_method=pass_all ;; @@ -6498,7 +6109,7 @@ tpf*) esac fi -{ $as_echo "$as_me:$LINENO: result: $lt_cv_deplibs_check_method" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 $as_echo "$lt_cv_deplibs_check_method" >&6; } file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method @@ -6518,9 +6129,9 @@ test -z "$deplibs_check_method" && deplibs_check_method=unknown if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. set dummy ${ac_tool_prefix}ar; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_AR+set}" = set; then +if test "${ac_cv_prog_AR+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$AR"; then @@ -6531,24 +6142,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_AR="${ac_tool_prefix}ar" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then - { $as_echo "$as_me:$LINENO: result: $AR" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 $as_echo "$AR" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -6558,9 +6169,9 @@ if test -z "$ac_cv_prog_AR"; then ac_ct_AR=$AR # Extract the first word of "ar", so it can be a program name with args. set dummy ar; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_AR+set}" = set; then +if test "${ac_cv_prog_ac_ct_AR+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_AR"; then @@ -6571,24 +6182,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_AR="ar" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then - { $as_echo "$as_me:$LINENO: result: $ac_ct_AR" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 $as_echo "$ac_ct_AR" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -6597,7 +6208,7 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac @@ -6623,9 +6234,9 @@ test -z "$AR_FLAGS" && AR_FLAGS=cru if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_STRIP+set}" = set; then +if test "${ac_cv_prog_STRIP+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then @@ -6636,24 +6247,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then - { $as_echo "$as_me:$LINENO: result: $STRIP" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -6663,9 +6274,9 @@ if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then +if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then @@ -6676,24 +6287,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_STRIP="strip" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then - { $as_echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -6702,7 +6313,7 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac @@ -6722,9 +6333,9 @@ test -z "$STRIP" && STRIP=: if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_RANLIB+set}" = set; then +if test "${ac_cv_prog_RANLIB+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then @@ -6735,24 +6346,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then - { $as_echo "$as_me:$LINENO: result: $RANLIB" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -6762,9 +6373,9 @@ if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then +if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then @@ -6775,24 +6386,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_RANLIB="ranlib" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then - { $as_echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -6801,7 +6412,7 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac @@ -6835,6 +6446,18 @@ if test -n "$RANLIB"; then old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" fi +case $host_os in + darwin*) + lock_old_archive_extraction=yes ;; + *) + lock_old_archive_extraction=no ;; +esac + + + + + + @@ -6879,9 +6502,9 @@ compiler=$CC # Check for command to grab the raw symbol name followed by C symbol from nm. -{ $as_echo "$as_me:$LINENO: checking command to parse $NM output from $compiler object" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 $as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } -if test "${lt_cv_sys_global_symbol_pipe+set}" = set; then +if test "${lt_cv_sys_global_symbol_pipe+set}" = set; then : $as_echo_n "(cached) " >&6 else @@ -6997,18 +6620,18 @@ void nm_test_func(void){} int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF - if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then # Now try to grab the symbols. nlist=conftest.nm - if { (eval echo "$as_me:$LINENO: \"$NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist\"") >&5 - (eval $NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) 2>&5 + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5 + (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5 ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && test -s "$nlist"; then + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" @@ -7061,11 +6684,11 @@ _LT_EOF lt_save_CFLAGS="$CFLAGS" LIBS="conftstm.$ac_objext" CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" - if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && test -s conftest${ac_exeext}; then + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest${ac_exeext}; then pipe_works=yes fi LIBS="$lt_save_LIBS" @@ -7099,10 +6722,10 @@ if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then - { $as_echo "$as_me:$LINENO: result: failed" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 $as_echo "failed" >&6; } else - { $as_echo "$as_me:$LINENO: result: ok" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 $as_echo "ok" >&6; } fi @@ -7128,7 +6751,7 @@ fi # Check whether --enable-libtool-lock was given. -if test "${enable_libtool_lock+set}" = set; then +if test "${enable_libtool_lock+set}" = set; then : enableval=$enable_libtool_lock; fi @@ -7140,11 +6763,11 @@ case $host in ia64-*-hpux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext - if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE="32" @@ -7158,12 +6781,12 @@ ia64-*-hpux*) ;; *-*-irix6*) # Find out which ABI we are using. - echo '#line 7161 "configure"' > conftest.$ac_ext - if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + echo '#line '$LINENO' "configure"' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then if test "$lt_cv_prog_gnu_ld" = yes; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) @@ -7197,11 +6820,11 @@ x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext - if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *32-bit*) case $host in @@ -7250,9 +6873,9 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" - { $as_echo "$as_me:$LINENO: checking whether the C compiler needs -belf" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 $as_echo_n "checking whether the C compiler needs -belf... " >&6; } -if test "${lt_cv_cc_needs_belf+set}" = set; then +if test "${lt_cv_cc_needs_belf+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_ext=c @@ -7261,11 +6884,7 @@ ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -7276,38 +6895,13 @@ main () return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then +if ac_fn_c_try_link "$LINENO"; then : lt_cv_cc_needs_belf=yes else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - lt_cv_cc_needs_belf=no + lt_cv_cc_needs_belf=no fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -7315,7 +6909,7 @@ ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi -{ $as_echo "$as_me:$LINENO: result: $lt_cv_cc_needs_belf" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 $as_echo "$lt_cv_cc_needs_belf" >&6; } if test x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf @@ -7325,11 +6919,11 @@ $as_echo "$lt_cv_cc_needs_belf" >&6; } sparc*-*solaris*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext - if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in @@ -7355,9 +6949,9 @@ need_locks="$enable_libtool_lock" if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_DSYMUTIL+set}" = set; then +if test "${ac_cv_prog_DSYMUTIL+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$DSYMUTIL"; then @@ -7368,24 +6962,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi DSYMUTIL=$ac_cv_prog_DSYMUTIL if test -n "$DSYMUTIL"; then - { $as_echo "$as_me:$LINENO: result: $DSYMUTIL" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 $as_echo "$DSYMUTIL" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -7395,9 +6989,9 @@ if test -z "$ac_cv_prog_DSYMUTIL"; then ac_ct_DSYMUTIL=$DSYMUTIL # Extract the first word of "dsymutil", so it can be a program name with args. set dummy dsymutil; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_DSYMUTIL+set}" = set; then +if test "${ac_cv_prog_ac_ct_DSYMUTIL+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DSYMUTIL"; then @@ -7408,24 +7002,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL if test -n "$ac_ct_DSYMUTIL"; then - { $as_echo "$as_me:$LINENO: result: $ac_ct_DSYMUTIL" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 $as_echo "$ac_ct_DSYMUTIL" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -7434,7 +7028,7 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac @@ -7447,9 +7041,9 @@ fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. set dummy ${ac_tool_prefix}nmedit; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_NMEDIT+set}" = set; then +if test "${ac_cv_prog_NMEDIT+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$NMEDIT"; then @@ -7460,24 +7054,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi NMEDIT=$ac_cv_prog_NMEDIT if test -n "$NMEDIT"; then - { $as_echo "$as_me:$LINENO: result: $NMEDIT" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 $as_echo "$NMEDIT" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -7487,9 +7081,9 @@ if test -z "$ac_cv_prog_NMEDIT"; then ac_ct_NMEDIT=$NMEDIT # Extract the first word of "nmedit", so it can be a program name with args. set dummy nmedit; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_NMEDIT+set}" = set; then +if test "${ac_cv_prog_ac_ct_NMEDIT+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_NMEDIT"; then @@ -7500,24 +7094,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_NMEDIT="nmedit" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT if test -n "$ac_ct_NMEDIT"; then - { $as_echo "$as_me:$LINENO: result: $ac_ct_NMEDIT" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 $as_echo "$ac_ct_NMEDIT" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -7526,7 +7120,7 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac @@ -7539,9 +7133,9 @@ fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. set dummy ${ac_tool_prefix}lipo; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_LIPO+set}" = set; then +if test "${ac_cv_prog_LIPO+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$LIPO"; then @@ -7552,24 +7146,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_LIPO="${ac_tool_prefix}lipo" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi LIPO=$ac_cv_prog_LIPO if test -n "$LIPO"; then - { $as_echo "$as_me:$LINENO: result: $LIPO" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 $as_echo "$LIPO" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -7579,9 +7173,9 @@ if test -z "$ac_cv_prog_LIPO"; then ac_ct_LIPO=$LIPO # Extract the first word of "lipo", so it can be a program name with args. set dummy lipo; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_LIPO+set}" = set; then +if test "${ac_cv_prog_ac_ct_LIPO+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_LIPO"; then @@ -7592,24 +7186,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_LIPO="lipo" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO if test -n "$ac_ct_LIPO"; then - { $as_echo "$as_me:$LINENO: result: $ac_ct_LIPO" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 $as_echo "$ac_ct_LIPO" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -7618,7 +7212,7 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac @@ -7631,9 +7225,9 @@ fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. set dummy ${ac_tool_prefix}otool; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_OTOOL+set}" = set; then +if test "${ac_cv_prog_OTOOL+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$OTOOL"; then @@ -7644,24 +7238,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_OTOOL="${ac_tool_prefix}otool" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi OTOOL=$ac_cv_prog_OTOOL if test -n "$OTOOL"; then - { $as_echo "$as_me:$LINENO: result: $OTOOL" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 $as_echo "$OTOOL" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -7671,9 +7265,9 @@ if test -z "$ac_cv_prog_OTOOL"; then ac_ct_OTOOL=$OTOOL # Extract the first word of "otool", so it can be a program name with args. set dummy otool; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_OTOOL+set}" = set; then +if test "${ac_cv_prog_ac_ct_OTOOL+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OTOOL"; then @@ -7684,24 +7278,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_OTOOL="otool" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL if test -n "$ac_ct_OTOOL"; then - { $as_echo "$as_me:$LINENO: result: $ac_ct_OTOOL" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 $as_echo "$ac_ct_OTOOL" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -7710,7 +7304,7 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac @@ -7723,9 +7317,9 @@ fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. set dummy ${ac_tool_prefix}otool64; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_OTOOL64+set}" = set; then +if test "${ac_cv_prog_OTOOL64+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$OTOOL64"; then @@ -7736,24 +7330,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi OTOOL64=$ac_cv_prog_OTOOL64 if test -n "$OTOOL64"; then - { $as_echo "$as_me:$LINENO: result: $OTOOL64" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 $as_echo "$OTOOL64" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -7763,9 +7357,9 @@ if test -z "$ac_cv_prog_OTOOL64"; then ac_ct_OTOOL64=$OTOOL64 # Extract the first word of "otool64", so it can be a program name with args. set dummy otool64; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_OTOOL64+set}" = set; then +if test "${ac_cv_prog_ac_ct_OTOOL64+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OTOOL64"; then @@ -7776,24 +7370,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_OTOOL64="otool64" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 if test -n "$ac_ct_OTOOL64"; then - { $as_echo "$as_me:$LINENO: result: $ac_ct_OTOOL64" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 $as_echo "$ac_ct_OTOOL64" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -7802,7 +7396,7 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac @@ -7838,9 +7432,9 @@ fi - { $as_echo "$as_me:$LINENO: checking for -single_module linker flag" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 $as_echo_n "checking for -single_module linker flag... " >&6; } -if test "${lt_cv_apple_cc_single_mod+set}" = set; then +if test "${lt_cv_apple_cc_single_mod+set}" = set; then : $as_echo_n "(cached) " >&6 else lt_cv_apple_cc_single_mod=no @@ -7865,22 +7459,18 @@ else rm -f conftest.* fi fi -{ $as_echo "$as_me:$LINENO: result: $lt_cv_apple_cc_single_mod" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 $as_echo "$lt_cv_apple_cc_single_mod" >&6; } - { $as_echo "$as_me:$LINENO: checking for -exported_symbols_list linker flag" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 $as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } -if test "${lt_cv_ld_exported_symbols_list+set}" = set; then +if test "${lt_cv_ld_exported_symbols_list+set}" = set; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -7891,43 +7481,50 @@ main () return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then +if ac_fn_c_try_link "$LINENO"; then : lt_cv_ld_exported_symbols_list=yes else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - lt_cv_ld_exported_symbols_list=no + lt_cv_ld_exported_symbols_list=no fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LDFLAGS="$save_LDFLAGS" fi -{ $as_echo "$as_me:$LINENO: result: $lt_cv_ld_exported_symbols_list" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 $as_echo "$lt_cv_ld_exported_symbols_list" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 +$as_echo_n "checking for -force_load linker flag... " >&6; } +if test "${lt_cv_ld_force_load+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_force_load=no + cat > conftest.c << _LT_EOF +int forced_loaded() { return 2;} +_LT_EOF + echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 + $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 + echo "$AR cru libconftest.a conftest.o" >&5 + $AR cru libconftest.a conftest.o 2>&5 + echo "$RANLIB libconftest.a" >&5 + $RANLIB libconftest.a 2>&5 + cat > conftest.c << _LT_EOF +int main() { return 0;} +_LT_EOF + echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 + $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err + _lt_result=$? + if test -f conftest && test ! -s conftest.err && test $_lt_result = 0 && $GREP forced_load conftest 2>&1 >/dev/null; then + lt_cv_ld_force_load=yes + else + cat conftest.err >&5 + fi + rm -f conftest.err libconftest.a conftest conftest.c + rm -rf conftest.dSYM + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 +$as_echo "$lt_cv_ld_force_load" >&6; } case $host_os in rhapsody* | darwin1.[012]) _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; @@ -7955,7 +7552,7 @@ $as_echo "$lt_cv_ld_exported_symbols_list" >&6; } else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' fi - if test "$DSYMUTIL" != ":"; then + if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= @@ -7963,62 +7560,13 @@ $as_echo "$lt_cv_ld_exported_symbols_list" >&6; } ;; esac - for ac_header in dlfcn.h -do -as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default - -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - eval "$as_ac_Header=yes" -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - eval "$as_ac_Header=no" -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -as_val=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - if test "x$as_val" = x""yes; then +do : + ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default +" +if test "x$ac_cv_header_dlfcn_h" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define HAVE_DLFCN_H 1 _ACEOF fi @@ -8027,6 +7575,8 @@ done + + # Set options @@ -8036,7 +7586,7 @@ done # Check whether --enable-shared was given. -if test "${enable_shared+set}" = set; then +if test "${enable_shared+set}" = set; then : enableval=$enable_shared; p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; @@ -8067,7 +7617,7 @@ fi # Check whether --enable-static was given. -if test "${enable_static+set}" = set; then +if test "${enable_static+set}" = set; then : enableval=$enable_static; p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; @@ -8099,7 +7649,7 @@ fi # Check whether --with-pic was given. -if test "${with_pic+set}" = set; then +if test "${with_pic+set}" = set; then : withval=$with_pic; pic_mode="$withval" else pic_mode=default @@ -8115,7 +7665,7 @@ test -z "$pic_mode" && pic_mode=default # Check whether --enable-fast-install was given. -if test "${enable_fast_install+set}" = set; then +if test "${enable_fast_install+set}" = set; then : enableval=$enable_fast_install; p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; @@ -8175,6 +7725,7 @@ LIBTOOL='$(SHELL) $(top_builddir)/libtool' + test -z "$LN_S" && LN_S="ln -s" @@ -8196,9 +7747,9 @@ if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi -{ $as_echo "$as_me:$LINENO: checking for objdir" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 $as_echo_n "checking for objdir... " >&6; } -if test "${lt_cv_objdir+set}" = set; then +if test "${lt_cv_objdir+set}" = set; then : $as_echo_n "(cached) " >&6 else rm -f .libs 2>/dev/null @@ -8211,7 +7762,7 @@ else fi rmdir .libs 2>/dev/null fi -{ $as_echo "$as_me:$LINENO: result: $lt_cv_objdir" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 $as_echo "$lt_cv_objdir" >&6; } objdir=$lt_cv_objdir @@ -8226,19 +7777,6 @@ _ACEOF - - - - - - - - - - - - - case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some @@ -8251,23 +7789,6 @@ aix3*) ;; esac -# Sed substitution that helps us do robust quoting. It backslashifies -# metacharacters that are still active within double-quoted strings. -sed_quote_subst='s/\(["`$\\]\)/\\\1/g' - -# Same as above, but do not quote variable references. -double_quote_subst='s/\(["`\\]\)/\\\1/g' - -# Sed substitution to delay expansion of an escaped shell variable in a -# double_quote_subst'ed string. -delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' - -# Sed substitution to delay expansion of an escaped single quote. -delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' - -# Sed substitution to avoid accidental globbing in evaled expressions -no_glob_subst='s/\*/\\\*/g' - # Global variables: ofile=libtool can_build_shared=yes @@ -8296,7 +7817,7 @@ for cc_temp in $compiler""; do *) break;; esac done -cc_basename=`$ECHO "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` +cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` # Only perform the check for file, if the check method requires it @@ -8304,9 +7825,9 @@ test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then - { $as_echo "$as_me:$LINENO: checking for ${ac_tool_prefix}file" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 $as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } -if test "${lt_cv_path_MAGIC_CMD+set}" = set; then +if test "${lt_cv_path_MAGIC_CMD+set}" = set; then : $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in @@ -8357,10 +7878,10 @@ fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then - { $as_echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -8370,9 +7891,9 @@ fi if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then - { $as_echo "$as_me:$LINENO: checking for file" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 $as_echo_n "checking for file... " >&6; } -if test "${lt_cv_path_MAGIC_CMD+set}" = set; then +if test "${lt_cv_path_MAGIC_CMD+set}" = set; then : $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in @@ -8423,10 +7944,10 @@ fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then - { $as_echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -8505,11 +8026,16 @@ if test -n "$compiler"; then lt_prog_compiler_no_builtin_flag= if test "$GCC" = yes; then - lt_prog_compiler_no_builtin_flag=' -fno-builtin' + case $cc_basename in + nvcc*) + lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; + *) + lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; + esac - { $as_echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 $as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } -if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then +if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_rtti_exceptions=no @@ -8525,15 +8051,15 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:8528: $lt_compile\"" >&5) + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:8532: \$? = $ac_status" >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. - $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_rtti_exceptions=yes @@ -8542,7 +8068,7 @@ else $RM conftest* fi -{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 $as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then @@ -8562,7 +8088,7 @@ fi lt_prog_compiler_pic= lt_prog_compiler_static= -{ $as_echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 $as_echo_n "checking for $compiler option to produce PIC... " >&6; } if test "$GCC" = yes; then @@ -8611,6 +8137,12 @@ $as_echo_n "checking for $compiler option to produce PIC... " >&6; } lt_prog_compiler_pic='-fno-common' ;; + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + lt_prog_compiler_static= + ;; + hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag @@ -8653,6 +8185,13 @@ $as_echo_n "checking for $compiler option to produce PIC... " >&6; } lt_prog_compiler_pic='-fPIC' ;; esac + + case $cc_basename in + nvcc*) # Cuda Compiler Driver 2.2 + lt_prog_compiler_wl='-Xlinker ' + lt_prog_compiler_pic='-Xcompiler -fPIC' + ;; + esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in @@ -8694,7 +8233,7 @@ $as_echo_n "checking for $compiler option to produce PIC... " >&6; } lt_prog_compiler_static='-non_shared' ;; - linux* | k*bsd*-gnu) + linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in # old Intel for x86_64 which still supported -KPIC. ecc*) @@ -8715,7 +8254,7 @@ $as_echo_n "checking for $compiler option to produce PIC... " >&6; } lt_prog_compiler_pic='--shared' lt_prog_compiler_static='--static' ;; - pgcc* | pgf77* | pgf90* | pgf95*) + pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) lt_prog_compiler_wl='-Wl,' @@ -8727,26 +8266,26 @@ $as_echo_n "checking for $compiler option to produce PIC... " >&6; } # All Alpha code is PIC. lt_prog_compiler_static='-non_shared' ;; - xl*) - # IBM XL C 8.0/Fortran 10.1 on PPC + xl* | bgxl* | bgf* | mpixl*) + # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-qpic' lt_prog_compiler_static='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in + *Sun\ F* | *Sun*Fortran*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='' + ;; *Sun\ C*) # Sun C 5.9 lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Wl,' ;; - *Sun\ F*) - # Sun Fortran 8.3 passes all unrecognized flags to the linker - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - lt_prog_compiler_wl='' - ;; esac ;; esac @@ -8777,7 +8316,7 @@ $as_echo_n "checking for $compiler option to produce PIC... " >&6; } lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' case $cc_basename in - f77* | f90* | f95*) + f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) lt_prog_compiler_wl='-Qoption ld ';; *) lt_prog_compiler_wl='-Wl,';; @@ -8834,7 +8373,7 @@ case $host_os in lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" ;; esac -{ $as_echo "$as_me:$LINENO: result: $lt_prog_compiler_pic" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_prog_compiler_pic" >&5 $as_echo "$lt_prog_compiler_pic" >&6; } @@ -8846,9 +8385,9 @@ $as_echo "$lt_prog_compiler_pic" >&6; } # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic"; then - { $as_echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 $as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } -if test "${lt_cv_prog_compiler_pic_works+set}" = set; then +if test "${lt_cv_prog_compiler_pic_works+set}" = set; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_works=no @@ -8864,15 +8403,15 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:8867: $lt_compile\"" >&5) + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:8871: \$? = $ac_status" >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. - $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works=yes @@ -8881,7 +8420,7 @@ else $RM conftest* fi -{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_pic_works" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 $as_echo "$lt_cv_prog_compiler_pic_works" >&6; } if test x"$lt_cv_prog_compiler_pic_works" = xyes; then @@ -8905,9 +8444,9 @@ fi # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" -{ $as_echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 $as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } -if test "${lt_cv_prog_compiler_static_works+set}" = set; then +if test "${lt_cv_prog_compiler_static_works+set}" = set; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_static_works=no @@ -8920,7 +8459,7 @@ else if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 - $ECHO "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works=yes @@ -8933,7 +8472,7 @@ else LDFLAGS="$save_LDFLAGS" fi -{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_static_works" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 $as_echo "$lt_cv_prog_compiler_static_works" >&6; } if test x"$lt_cv_prog_compiler_static_works" = xyes; then @@ -8948,9 +8487,9 @@ fi - { $as_echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } -if test "${lt_cv_prog_compiler_c_o+set}" = set; then +if test "${lt_cv_prog_compiler_c_o+set}" = set; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o=no @@ -8969,16 +8508,16 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:8972: $lt_compile\"" >&5) + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:8976: \$? = $ac_status" >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings - $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes @@ -8995,7 +8534,7 @@ else $RM conftest* fi -{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 $as_echo "$lt_cv_prog_compiler_c_o" >&6; } @@ -9003,9 +8542,9 @@ $as_echo "$lt_cv_prog_compiler_c_o" >&6; } - { $as_echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } -if test "${lt_cv_prog_compiler_c_o+set}" = set; then +if test "${lt_cv_prog_compiler_c_o+set}" = set; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o=no @@ -9024,16 +8563,16 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:9027: $lt_compile\"" >&5) + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:9031: \$? = $ac_status" >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings - $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes @@ -9050,7 +8589,7 @@ else $RM conftest* fi -{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 $as_echo "$lt_cv_prog_compiler_c_o" >&6; } @@ -9059,7 +8598,7 @@ $as_echo "$lt_cv_prog_compiler_c_o" >&6; } hard_links="nottested" if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user - { $as_echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 $as_echo_n "checking if we can lock with hard links... " >&6; } hard_links=yes $RM conftest* @@ -9067,10 +8606,10 @@ $as_echo_n "checking if we can lock with hard links... " >&6; } touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no - { $as_echo "$as_me:$LINENO: result: $hard_links" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 $as_echo "$hard_links" >&6; } if test "$hard_links" = no; then - { $as_echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 $as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi @@ -9083,7 +8622,7 @@ fi - { $as_echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } runpath_var= @@ -9146,7 +8685,33 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie esac ld_shlibs=yes + + # On some targets, GNU ld is compatible enough with the native linker + # that we're better off using the native interface for both. + lt_use_gnu_ld_interface=no if test "$with_gnu_ld" = yes; then + case $host_os in + aix*) + # The AIX port of GNU ld has always aspired to compatibility + # with the native linker. However, as the warning in the GNU ld + # block says, versions before 2.19.5* couldn't really create working + # shared libraries, regardless of the interface used. + case `$LD -v 2>&1` in + *\ \(GNU\ Binutils\)\ 2.19.5*) ;; + *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; + *\ \(GNU\ Binutils\)\ [3-9]*) ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + fi + + if test "$lt_use_gnu_ld_interface" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' @@ -9164,6 +8729,7 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie fi supports_anon_versioning=no case `$LD -v 2>&1` in + *GNU\ gold*) supports_anon_versioning=yes ;; *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... @@ -9179,11 +8745,12 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie ld_shlibs=no cat <<_LT_EOF 1>&2 -*** Warning: the GNU linker, at least up to release 2.9.1, is reported +*** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you -*** really care for shared libraries, you may want to modify your PATH -*** so that a non-GNU linker is found, and then restart. +*** really care for shared libraries, you may want to install binutils +*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. +*** You will then need to restart the configuration process. _LT_EOF fi @@ -9219,6 +8786,7 @@ _LT_EOF # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec='-L$libdir' + export_dynamic_flag_spec='${wl}--export-all-symbols' allow_undefined_flag=unsupported always_export_symbols=no enable_shared_with_static_runtimes=yes @@ -9240,6 +8808,11 @@ _LT_EOF fi ;; + haiku*) + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + link_all_deplibs=yes + ;; + interix[3-9]*) hardcode_direct=no hardcode_shlibpath_var=no @@ -9255,7 +8828,7 @@ _LT_EOF archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; - gnu* | linux* | tpf* | k*bsd*-gnu) + gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test "$host_os" = linux-dietlibc; then case $cc_basename in @@ -9269,11 +8842,12 @@ _LT_EOF tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler - whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' + whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; - pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers - whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' + pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group f77 and f90 compilers + whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; @@ -9284,13 +8858,17 @@ _LT_EOF lf95*) # Lahey Fortran 8.1 whole_archive_flag_spec= tmp_sharedflag='--shared' ;; - xl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) + xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; + nvcc*) # Cuda Compiler Driver 2.2 + whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + compiler_needs_object=yes + ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 - whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' + whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 @@ -9306,17 +8884,17 @@ _LT_EOF fi case $cc_basename in - xlf*) + xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' hardcode_libdir_flag_spec= hardcode_libdir_flag_spec_ld='-rpath $libdir' - archive_cmds='$LD -shared $libobjs $deplibs $compiler_flags -soname $soname -o $lib' + archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ - $LD -shared $libobjs $deplibs $compiler_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' + $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac @@ -9437,8 +9015,10 @@ _LT_EOF else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm + # Also, AIX nm treats weak defined symbols like other global + # defined symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then - export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi @@ -9525,11 +9105,7 @@ _LT_EOF allow_undefined_flag='-berok' # Determine the default libpath from the value encoded in an # empty executable. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -9540,27 +9116,7 @@ main () return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then +if ac_fn_c_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { @@ -9574,20 +9130,13 @@ aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpat if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" - archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' @@ -9596,11 +9145,7 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi else # Determine the default libpath from the value encoded in an # empty executable. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -9611,27 +9156,7 @@ main () return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then +if ac_fn_c_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { @@ -9645,16 +9170,9 @@ aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpat if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" @@ -9662,8 +9180,13 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi # -berok will link without error, but may produce a broken library. no_undefined_flag=' ${wl}-bernotok' allow_undefined_flag=' ${wl}-berok' - # Exported symbols can be pulled into shared objects from archives - whole_archive_flag_spec='$convenience' + if test "$with_gnu_ld" = yes; then + # We only use this code for GNU lds that support --whole-archive. + whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec='$convenience' + fi archive_cmds_need_lc=yes # This is similar to how AIX traditionally builds its shared libraries. archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' @@ -9702,7 +9225,7 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. - archive_cmds='$CC -o $lib $libobjs $compiler_flags `$ECHO "X$deplibs" | $Xsed -e '\''s/ -lc$//'\''` -link -dll~linknames=' + archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. old_archive_from_new_cmds='true' # FIXME: Should let the user specify the lib program. @@ -9718,7 +9241,11 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_direct=no hardcode_automatic=yes hardcode_shlibpath_var=unsupported - whole_archive_flag_spec='' + if test "$lt_cv_ld_force_load" = "yes"; then + whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + else + whole_archive_flag_spec='' + fi link_all_deplibs=yes allow_undefined_flag="$_lt_dar_allow_undefined" case $cc_basename in @@ -9726,7 +9253,7 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then - output_verbose_link_cmd=echo + output_verbose_link_cmd=func_echo_all archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" @@ -9792,7 +9319,7 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi ;; hpux10*) - if test "$GCC" = yes -a "$with_gnu_ld" = no; then + if test "$GCC" = yes && test "$with_gnu_ld" = no; then archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' @@ -9811,7 +9338,7 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi ;; hpux11*) - if test "$GCC" = yes -a "$with_gnu_ld" = no; then + if test "$GCC" = yes && test "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' @@ -9832,7 +9359,46 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) - archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + + # Older versions of the 11.00 compiler do not understand -b yet + # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 +$as_echo_n "checking if $CC understands -b... " >&6; } +if test "${lt_cv_prog_compiler__b+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler__b=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS -b" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler__b=yes + fi + else + lt_cv_prog_compiler__b=yes + fi + fi + $RM -r conftest* + LDFLAGS="$save_LDFLAGS" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 +$as_echo "$lt_cv_prog_compiler__b" >&6; } + +if test x"$lt_cv_prog_compiler__b" = xyes; then + archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' +else + archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' +fi + ;; esac fi @@ -9860,52 +9426,26 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" - cat >conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ int foo(void) {} _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' - -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - +if ac_fn_c_try_link "$LINENO"; then : + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LDFLAGS="$save_LDFLAGS" else - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' - archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' @@ -9967,17 +9507,17 @@ rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes allow_undefined_flag=unsupported - archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$ECHO DATA >> $output_objdir/$libname.def~$ECHO " SINGLE NONSHARED" >> $output_objdir/$libname.def~$ECHO EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' - archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else allow_undefined_flag=' -expect_unresolved \*' - archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' @@ -9987,13 +9527,13 @@ rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' - archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' else allow_undefined_flag=' -expect_unresolved \*' - archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ - $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' + $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly hardcode_libdir_flag_spec='-rpath $libdir' @@ -10157,7 +9697,7 @@ rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ fi fi -{ $as_echo "$as_me:$LINENO: result: $ld_shlibs" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 $as_echo "$ld_shlibs" >&6; } test "$ld_shlibs" = no && can_build_shared=no @@ -10194,46 +9734,52 @@ x|xyes) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. - { $as_echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 $as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } - $RM conftest* - echo "$lt_simple_compile_test_code" > conftest.$ac_ext +if test "${lt_cv_archive_cmds_need_lc+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + $RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext - if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } 2>conftest.err; then - soname=conftest - lib=conftest - libobjs=conftest.$ac_objext - deplibs= - wl=$lt_prog_compiler_wl - pic_flag=$lt_prog_compiler_pic - compiler_flags=-v - linker_flags=-v - verstring= - output_objdir=. - libname=conftest - lt_save_allow_undefined_flag=$allow_undefined_flag - allow_undefined_flag= - if { (eval echo "$as_me:$LINENO: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\"") >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl + pic_flag=$lt_prog_compiler_pic + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag + allow_undefined_flag= + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } - then - archive_cmds_need_lc=no - else - archive_cmds_need_lc=yes - fi - allow_undefined_flag=$lt_save_allow_undefined_flag - else - cat conftest.err 1>&5 - fi - $RM conftest* - { $as_echo "$as_me:$LINENO: result: $archive_cmds_need_lc" >&5 -$as_echo "$archive_cmds_need_lc" >&6; } + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + then + lt_cv_archive_cmds_need_lc=no + else + lt_cv_archive_cmds_need_lc=yes + fi + allow_undefined_flag=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 +$as_echo "$lt_cv_archive_cmds_need_lc" >&6; } + archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc ;; esac fi @@ -10396,7 +9942,7 @@ esac - { $as_echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 $as_echo_n "checking dynamic linker characteristics... " >&6; } if test "$GCC" = yes; then @@ -10404,16 +9950,23 @@ if test "$GCC" = yes; then darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; *) lt_awk_arg="/^libraries:/" ;; esac - lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e "s,=/,/,g"` - if $ECHO "$lt_search_path_spec" | $GREP ';' >/dev/null ; then + case $host_os in + mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;; + *) lt_sed_strip_eq="s,=/,/,g" ;; + esac + lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` + case $lt_search_path_spec in + *\;*) # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. - lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED -e 's/;/ /g'` - else - lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - fi + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` + ;; + *) + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` + ;; + esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary. lt_tmp_lt_search_path_spec= @@ -10426,7 +9979,7 @@ if test "$GCC" = yes; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done - lt_search_path_spec=`$ECHO $lt_tmp_lt_search_path_spec | awk ' + lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS=" "; FS="/|\n";} { lt_foo=""; lt_count=0; @@ -10446,7 +9999,13 @@ BEGIN {RS=" "; FS="/|\n";} { if (lt_foo != "") { lt_freq[lt_foo]++; } if (lt_freq[lt_foo] == 1) { print lt_foo; } }'` - sys_lib_search_path_spec=`$ECHO $lt_search_path_spec` + # AWK program above erroneously prepends '/' to C:/dos/paths + # for these hosts. + case $host_os in + mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ + $SED 's,/\([A-Za-z]:\),\1,g'` ;; + esac + sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi @@ -10534,7 +10093,7 @@ amigaos*) m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. - finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$ECHO "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; @@ -10587,23 +10146,12 @@ cygwin* | mingw* | pw32* | cegcc*) cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" + + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - sys_lib_search_path_spec=`$CC -print-search-dirs | $GREP "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` - if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then - # It is most probably a Windows format PATH printed by - # mingw gcc, but we are running on Cygwin. Gcc prints its search - # path with ; separators, and with drive letters. We can handle the - # drive letters (cygwin fileutils understands them), so leave them, - # especially as we might pass files found there to a mingw objdump, - # which wouldn't understand a cygwinified path. Ahh. - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` - else - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - fi ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' @@ -10703,6 +10251,19 @@ gnu*) hardcode_into_libs=yes ;; +haiku*) + version_type=linux + need_lib_prefix=no + need_version=no + dynamic_linker="$host_os runtime_loader" + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LIBRARY_PATH + shlibpath_overrides_runpath=yes + sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' + hardcode_into_libs=yes + ;; + hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. @@ -10745,8 +10306,10 @@ hpux9* | hpux10* | hpux11*) soname_spec='${libname}${release}${shared_ext}$major' ;; esac - # HP-UX runs *really* slowly unless shared libraries are mode 555. + # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' + # or fails outright, so override atomically: + install_override_mode=555 ;; interix[3-9]*) @@ -10804,7 +10367,7 @@ linux*oldld* | linux*aout* | linux*coff*) ;; # This must be Linux ELF. -linux* | k*bsd*-gnu) +linux* | k*bsd*-gnu | kopensolaris*-gnu) version_type=linux need_lib_prefix=no need_version=no @@ -10813,16 +10376,17 @@ linux* | k*bsd*-gnu) finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no + # Some binutils ld are patched to set DT_RUNPATH - save_LDFLAGS=$LDFLAGS - save_libdir=$libdir - eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ - LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + if test "${lt_cv_shlibpath_overrides_runpath+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_shlibpath_overrides_runpath=no + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ + LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -10833,43 +10397,19 @@ main () return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then - shlibpath_overrides_runpath=yes +if ac_fn_c_try_link "$LINENO"; then : + if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : + lt_cv_shlibpath_overrides_runpath=yes fi - -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir fi -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext - LDFLAGS=$save_LDFLAGS - libdir=$save_libdir + shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install @@ -10881,8 +10421,9 @@ rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then - lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra" + fi # We used to test for /lib/ld.so.1 and disable shared libraries on @@ -11082,7 +10623,7 @@ uts4*) dynamic_linker=no ;; esac -{ $as_echo "$as_me:$LINENO: result: $dynamic_linker" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 $as_echo "$dynamic_linker" >&6; } test "$dynamic_linker" = no && can_build_shared=no @@ -11184,7 +10725,12 @@ fi - { $as_echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 $as_echo_n "checking how to hardcode library paths into programs... " >&6; } hardcode_action= if test -n "$hardcode_libdir_flag_spec" || @@ -11209,7 +10755,7 @@ else # directories. hardcode_action=unsupported fi -{ $as_echo "$as_me:$LINENO: result: $hardcode_action" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 $as_echo "$hardcode_action" >&6; } if test "$hardcode_action" = relink || @@ -11254,18 +10800,14 @@ else darwin*) # if libdl is installed we need to link against it - { $as_echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } -if test "${ac_cv_lib_dl_dlopen+set}" = set; then +if test "${ac_cv_lib_dl_dlopen+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. @@ -11283,43 +10825,18 @@ return dlopen (); return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then +if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_lib_dl_dlopen=no + ac_cv_lib_dl_dlopen=no fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } -if test "x$ac_cv_lib_dl_dlopen" = x""yes; then +if test "x$ac_cv_lib_dl_dlopen" = x""yes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else @@ -11332,106 +10849,18 @@ fi ;; *) - { $as_echo "$as_me:$LINENO: checking for shl_load" >&5 -$as_echo_n "checking for shl_load... " >&6; } -if test "${ac_cv_func_shl_load+set}" = set; then - $as_echo_n "(cached) " >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define shl_load to an innocuous variant, in case declares shl_load. - For example, HP-UX 11i declares gettimeofday. */ -#define shl_load innocuous_shl_load - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char shl_load (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef shl_load - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char shl_load (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined __stub_shl_load || defined __stub___shl_load -choke me -#endif - -int -main () -{ -return shl_load (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - ac_cv_func_shl_load=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_func_shl_load=no -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5 -$as_echo "$ac_cv_func_shl_load" >&6; } -if test "x$ac_cv_func_shl_load" = x""yes; then + ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" +if test "x$ac_cv_func_shl_load" = x""yes; then : lt_cv_dlopen="shl_load" else - { $as_echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 $as_echo_n "checking for shl_load in -ldld... " >&6; } -if test "${ac_cv_lib_dld_shl_load+set}" = set; then +if test "${ac_cv_lib_dld_shl_load+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. @@ -11449,145 +10878,32 @@ return shl_load (); return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then +if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_shl_load=yes else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_lib_dld_shl_load=no + ac_cv_lib_dld_shl_load=no fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 $as_echo "$ac_cv_lib_dld_shl_load" >&6; } -if test "x$ac_cv_lib_dld_shl_load" = x""yes; then +if test "x$ac_cv_lib_dld_shl_load" = x""yes; then : lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld" else - { $as_echo "$as_me:$LINENO: checking for dlopen" >&5 -$as_echo_n "checking for dlopen... " >&6; } -if test "${ac_cv_func_dlopen+set}" = set; then - $as_echo_n "(cached) " >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define dlopen to an innocuous variant, in case declares dlopen. - For example, HP-UX 11i declares gettimeofday. */ -#define dlopen innocuous_dlopen - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char dlopen (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef dlopen - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char dlopen (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined __stub_dlopen || defined __stub___dlopen -choke me -#endif - -int -main () -{ -return dlopen (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - ac_cv_func_dlopen=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_func_dlopen=no -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5 -$as_echo "$ac_cv_func_dlopen" >&6; } -if test "x$ac_cv_func_dlopen" = x""yes; then + ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" +if test "x$ac_cv_func_dlopen" = x""yes; then : lt_cv_dlopen="dlopen" else - { $as_echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } -if test "${ac_cv_lib_dl_dlopen+set}" = set; then +if test "${ac_cv_lib_dl_dlopen+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. @@ -11605,57 +10921,28 @@ return dlopen (); return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then +if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_lib_dl_dlopen=no + ac_cv_lib_dl_dlopen=no fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } -if test "x$ac_cv_lib_dl_dlopen" = x""yes; then +if test "x$ac_cv_lib_dl_dlopen" = x""yes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else - { $as_echo "$as_me:$LINENO: checking for dlopen in -lsvld" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 $as_echo_n "checking for dlopen in -lsvld... " >&6; } -if test "${ac_cv_lib_svld_dlopen+set}" = set; then +if test "${ac_cv_lib_svld_dlopen+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsvld $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. @@ -11673,57 +10960,28 @@ return dlopen (); return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then +if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_svld_dlopen=yes else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_lib_svld_dlopen=no + ac_cv_lib_svld_dlopen=no fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_svld_dlopen" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 $as_echo "$ac_cv_lib_svld_dlopen" >&6; } -if test "x$ac_cv_lib_svld_dlopen" = x""yes; then +if test "x$ac_cv_lib_svld_dlopen" = x""yes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" else - { $as_echo "$as_me:$LINENO: checking for dld_link in -ldld" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 $as_echo_n "checking for dld_link in -ldld... " >&6; } -if test "${ac_cv_lib_dld_dld_link+set}" = set; then +if test "${ac_cv_lib_dld_dld_link+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. @@ -11741,43 +10999,18 @@ return dld_link (); return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then +if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_dld_link=yes else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_lib_dld_dld_link=no + ac_cv_lib_dld_dld_link=no fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_dld_dld_link" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 $as_echo "$ac_cv_lib_dld_dld_link" >&6; } -if test "x$ac_cv_lib_dld_dld_link" = x""yes; then +if test "x$ac_cv_lib_dld_dld_link" = x""yes; then : lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld" fi @@ -11816,9 +11049,9 @@ fi save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" - { $as_echo "$as_me:$LINENO: checking whether a program can dlopen itself" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 $as_echo_n "checking whether a program can dlopen itself... " >&6; } -if test "${lt_cv_dlopen_self+set}" = set; then +if test "${lt_cv_dlopen_self+set}" = set; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : @@ -11827,7 +11060,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 11830 "configure" +#line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -11868,7 +11101,13 @@ else # endif #endif -void fnord() { int i=42;} +/* When -fvisbility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +void fnord () __attribute__((visibility("default"))); +#endif + +void fnord () { int i=42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); @@ -11877,7 +11116,11 @@ int main () if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; - else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } /* dlclose (self); */ } else @@ -11886,11 +11129,11 @@ int main () return status; } _LT_EOF - if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in @@ -11907,14 +11150,14 @@ rm -fr conftest* fi -{ $as_echo "$as_me:$LINENO: result: $lt_cv_dlopen_self" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 $as_echo "$lt_cv_dlopen_self" >&6; } if test "x$lt_cv_dlopen_self" = xyes; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" - { $as_echo "$as_me:$LINENO: checking whether a statically linked program can dlopen itself" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 $as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } -if test "${lt_cv_dlopen_self_static+set}" = set; then +if test "${lt_cv_dlopen_self_static+set}" = set; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : @@ -11923,7 +11166,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 11926 "configure" +#line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -11964,7 +11207,13 @@ else # endif #endif -void fnord() { int i=42;} +/* When -fvisbility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +void fnord () __attribute__((visibility("default"))); +#endif + +void fnord () { int i=42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); @@ -11973,7 +11222,11 @@ int main () if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; - else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } /* dlclose (self); */ } else @@ -11982,11 +11235,11 @@ int main () return status; } _LT_EOF - if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in @@ -12003,7 +11256,7 @@ rm -fr conftest* fi -{ $as_echo "$as_me:$LINENO: result: $lt_cv_dlopen_self_static" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 $as_echo "$lt_cv_dlopen_self_static" >&6; } fi @@ -12042,12 +11295,12 @@ fi striplib= old_striplib= -{ $as_echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 $as_echo_n "checking whether stripping libraries is possible... " >&6; } if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" - { $as_echo "$as_me:$LINENO: result: yes" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else # FIXME - insert some real tests, host_os isn't really good enough @@ -12056,15 +11309,15 @@ else if test -n "$STRIP" ; then striplib="$STRIP -x" old_striplib="$STRIP -S" - { $as_echo "$as_me:$LINENO: result: yes" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi ;; *) - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } ;; esac @@ -12082,12 +11335,12 @@ fi # Report which library types will actually be built - { $as_echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 $as_echo_n "checking if libtool supports shared libraries... " >&6; } - { $as_echo "$as_me:$LINENO: result: $can_build_shared" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 $as_echo "$can_build_shared" >&6; } - { $as_echo "$as_me:$LINENO: checking whether to build shared libraries" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 $as_echo_n "checking whether to build shared libraries... " >&6; } test "$can_build_shared" = "no" && enable_shared=no @@ -12108,14 +11361,14 @@ $as_echo_n "checking whether to build shared libraries... " >&6; } fi ;; esac - { $as_echo "$as_me:$LINENO: result: $enable_shared" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 $as_echo "$enable_shared" >&6; } - { $as_echo "$as_me:$LINENO: checking whether to build static libraries" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 $as_echo_n "checking whether to build static libraries... " >&6; } # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes - { $as_echo "$as_me:$LINENO: result: $enable_static" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 $as_echo "$enable_static" >&6; } @@ -12161,7 +11414,7 @@ else esac fi - if test -n "$VERSION_SCRIPT_FLAGS"; then + if test -z "$VERSION_SCRIPT_FLAGS"; then USE_VERSION_SCRIPT_TRUE= USE_VERSION_SCRIPT_FALSE='#' else @@ -12176,55 +11429,55 @@ _ldflags="${LDFLAGS}" # Check whether --with-c14n was given. -if test "${with_c14n+set}" = set; then +if test "${with_c14n+set}" = set; then : withval=$with_c14n; fi # Check whether --with-catalog was given. -if test "${with_catalog+set}" = set; then +if test "${with_catalog+set}" = set; then : withval=$with_catalog; fi # Check whether --with-debug was given. -if test "${with_debug+set}" = set; then +if test "${with_debug+set}" = set; then : withval=$with_debug; fi # Check whether --with-docbook was given. -if test "${with_docbook+set}" = set; then +if test "${with_docbook+set}" = set; then : withval=$with_docbook; fi # Check whether --with-fexceptions was given. -if test "${with_fexceptions+set}" = set; then +if test "${with_fexceptions+set}" = set; then : withval=$with_fexceptions; fi # Check whether --with-ftp was given. -if test "${with_ftp+set}" = set; then +if test "${with_ftp+set}" = set; then : withval=$with_ftp; fi # Check whether --with-history was given. -if test "${with_history+set}" = set; then +if test "${with_history+set}" = set; then : withval=$with_history; fi # Check whether --with-html was given. -if test "${with_html+set}" = set; then +if test "${with_html+set}" = set; then : withval=$with_html; fi # Check whether --with-html-dir was given. -if test "${with_html_dir+set}" = set; then +if test "${with_html_dir+set}" = set; then : withval=$with_html_dir; HTML_DIR=$withval else HTML_DIR='$(datadir)/doc' @@ -12233,7 +11486,7 @@ fi # Check whether --with-html-subdir was given. -if test "${with_html_subdir+set}" = set; then +if test "${with_html_subdir+set}" = set; then : withval=$with_html_subdir; test "x$withval" != "x" && HTML_DIR="$HTML_DIR/$withval" else HTML_DIR="$HTML_DIR/\$(PACKAGE)-\$(VERSION)/html" @@ -12242,73 +11495,79 @@ fi # Check whether --with-http was given. -if test "${with_http+set}" = set; then +if test "${with_http+set}" = set; then : withval=$with_http; fi # Check whether --with-iconv was given. -if test "${with_iconv+set}" = set; then +if test "${with_iconv+set}" = set; then : withval=$with_iconv; fi +# Check whether --with-icu was given. +if test "${with_icu+set}" = set; then : + withval=$with_icu; +fi + + # Check whether --with-iso8859x was given. -if test "${with_iso8859x+set}" = set; then +if test "${with_iso8859x+set}" = set; then : withval=$with_iso8859x; fi # Check whether --with-legacy was given. -if test "${with_legacy+set}" = set; then +if test "${with_legacy+set}" = set; then : withval=$with_legacy; fi # Check whether --with-mem_debug was given. -if test "${with_mem_debug+set}" = set; then +if test "${with_mem_debug+set}" = set; then : withval=$with_mem_debug; fi # Check whether --with-minimum was given. -if test "${with_minimum+set}" = set; then +if test "${with_minimum+set}" = set; then : withval=$with_minimum; fi # Check whether --with-output was given. -if test "${with_output+set}" = set; then +if test "${with_output+set}" = set; then : withval=$with_output; fi # Check whether --with-pattern was given. -if test "${with_pattern+set}" = set; then +if test "${with_pattern+set}" = set; then : withval=$with_pattern; fi # Check whether --with-push was given. -if test "${with_push+set}" = set; then +if test "${with_push+set}" = set; then : withval=$with_push; fi # Check whether --with-python was given. -if test "${with_python+set}" = set; then +if test "${with_python+set}" = set; then : withval=$with_python; fi # Check whether --with-reader was given. -if test "${with_reader+set}" = set; then +if test "${with_reader+set}" = set; then : withval=$with_reader; fi # Check whether --with-readline was given. -if test "${with_readline+set}" = set; then +if test "${with_readline+set}" = set; then : withval=$with_readline; if test "$withval" != "no" -a "$withval" != "yes"; then RDL_DIR=$withval @@ -12320,91 +11579,91 @@ fi # Check whether --with-regexps was given. -if test "${with_regexps+set}" = set; then +if test "${with_regexps+set}" = set; then : withval=$with_regexps; fi # Check whether --with-run_debug was given. -if test "${with_run_debug+set}" = set; then +if test "${with_run_debug+set}" = set; then : withval=$with_run_debug; fi # Check whether --with-sax1 was given. -if test "${with_sax1+set}" = set; then +if test "${with_sax1+set}" = set; then : withval=$with_sax1; fi # Check whether --with-schemas was given. -if test "${with_schemas+set}" = set; then +if test "${with_schemas+set}" = set; then : withval=$with_schemas; fi # Check whether --with-schematron was given. -if test "${with_schematron+set}" = set; then +if test "${with_schematron+set}" = set; then : withval=$with_schematron; fi # Check whether --with-threads was given. -if test "${with_threads+set}" = set; then +if test "${with_threads+set}" = set; then : withval=$with_threads; fi # Check whether --with-thread-alloc was given. -if test "${with_thread_alloc+set}" = set; then +if test "${with_thread_alloc+set}" = set; then : withval=$with_thread_alloc; fi # Check whether --with-tree was given. -if test "${with_tree+set}" = set; then +if test "${with_tree+set}" = set; then : withval=$with_tree; fi # Check whether --with-valid was given. -if test "${with_valid+set}" = set; then +if test "${with_valid+set}" = set; then : withval=$with_valid; fi # Check whether --with-writer was given. -if test "${with_writer+set}" = set; then +if test "${with_writer+set}" = set; then : withval=$with_writer; fi # Check whether --with-xinclude was given. -if test "${with_xinclude+set}" = set; then +if test "${with_xinclude+set}" = set; then : withval=$with_xinclude; fi # Check whether --with-xpath was given. -if test "${with_xpath+set}" = set; then +if test "${with_xpath+set}" = set; then : withval=$with_xpath; fi # Check whether --with-xptr was given. -if test "${with_xptr+set}" = set; then +if test "${with_xptr+set}" = set; then : withval=$with_xptr; fi # Check whether --with-modules was given. -if test "${with_modules+set}" = set; then +if test "${with_modules+set}" = set; then : withval=$with_modules; fi # Check whether --with-zlib was given. -if test "${with_zlib+set}" = set; then +if test "${with_zlib+set}" = set; then : withval=$with_zlib; if test "$withval" != "no" -a "$withval" != "yes"; then Z_DIR=$withval @@ -12416,13 +11675,13 @@ fi # Check whether --with-coverage was given. -if test "${with_coverage+set}" = set; then +if test "${with_coverage+set}" = set; then : withval=$with_coverage; fi # Check whether --enable-rebuild-docs was given. -if test "${enable_rebuild_docs+set}" = set; then +if test "${enable_rebuild_docs+set}" = set; then : enableval=$enable_rebuild_docs; fi @@ -12602,159 +11861,21 @@ WITH_ZLIB=0 if test "$with_zlib" = "no"; then echo "Disabling compression support" else - -for ac_header in zlib.h -do -as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -else - # Is the header compilable? -{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 -$as_echo_n "checking $ac_header usability... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_header_compiler=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_compiler=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -$as_echo "$ac_header_compiler" >&6; } - -# Is the header present? -{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 -$as_echo_n "checking $ac_header presence... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - ac_header_preproc=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi - -rm -f conftest.err conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -$as_echo "$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - - ;; -esac -{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - -fi -as_val=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - if test "x$as_val" = x""yes; then + for ac_header in zlib.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "zlib.h" "ac_cv_header_zlib_h" "$ac_includes_default" +if test "x$ac_cv_header_zlib_h" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define HAVE_ZLIB_H 1 _ACEOF - { $as_echo "$as_me:$LINENO: checking for gzread in -lz" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gzread in -lz" >&5 $as_echo_n "checking for gzread in -lz... " >&6; } -if test "${ac_cv_lib_z_gzread+set}" = set; then +if test "${ac_cv_lib_z_gzread+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lz $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. @@ -12772,48 +11893,21 @@ return gzread (); return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then +if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_z_gzread=yes else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_lib_z_gzread=no + ac_cv_lib_z_gzread=no fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_z_gzread" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_z_gzread" >&5 $as_echo "$ac_cv_lib_z_gzread" >&6; } -if test "x$ac_cv_lib_z_gzread" = x""yes; then +if test "x$ac_cv_lib_z_gzread" = x""yes; then : -cat >>confdefs.h <<\_ACEOF -#define HAVE_LIBZ 1 -_ACEOF +$as_echo "#define HAVE_LIBZ 1" >>confdefs.h WITH_ZLIB=1 if test "x${Z_DIR}" != "x"; then @@ -12844,24 +11938,15 @@ LDFLAGS=${_ldflags} echo Checking headers - - - - - ac_header_dirent=no for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h; do as_ac_Header=`$as_echo "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh` -{ $as_echo "$as_me:$LINENO: checking for $ac_hdr that defines DIR" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_hdr that defines DIR" >&5 $as_echo_n "checking for $ac_hdr that defines DIR... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then +if eval "test \"\${$as_ac_Header+set}\"" = set; then : $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include <$ac_hdr> @@ -12875,41 +11960,17 @@ return 0; return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then +if ac_fn_c_try_compile "$LINENO"; then : eval "$as_ac_Header=yes" else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - eval "$as_ac_Header=no" + eval "$as_ac_Header=no" fi - rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +eval ac_res=\$$as_ac_Header + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } -as_val=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - if test "x$as_val" = x""yes; then +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_hdr" | $as_tr_cpp` 1 _ACEOF @@ -12920,17 +11981,13 @@ fi done # Two versions of opendir et al. are in -ldir and -lx on SCO Xenix. if test $ac_header_dirent = dirent.h; then - { $as_echo "$as_me:$LINENO: checking for library containing opendir" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 $as_echo_n "checking for library containing opendir... " >&6; } -if test "${ac_cv_search_opendir+set}" = set; then +if test "${ac_cv_search_opendir+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. @@ -12955,70 +12012,39 @@ for ac_lib in '' dir; do ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi - rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then + if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_opendir=$ac_res -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext - if test "${ac_cv_search_opendir+set}" = set; then +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if test "${ac_cv_search_opendir+set}" = set; then : break fi done -if test "${ac_cv_search_opendir+set}" = set; then - : +if test "${ac_cv_search_opendir+set}" = set; then : + else ac_cv_search_opendir=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_search_opendir" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 $as_echo "$ac_cv_search_opendir" >&6; } ac_res=$ac_cv_search_opendir -if test "$ac_res" != no; then +if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi else - { $as_echo "$as_me:$LINENO: checking for library containing opendir" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 $as_echo_n "checking for library containing opendir... " >&6; } -if test "${ac_cv_search_opendir+set}" = set; then +if test "${ac_cv_search_opendir+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. @@ -13043,70 +12069,39 @@ for ac_lib in '' x; do ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi - rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then + if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_opendir=$ac_res -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext - if test "${ac_cv_search_opendir+set}" = set; then +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if test "${ac_cv_search_opendir+set}" = set; then : break fi done -if test "${ac_cv_search_opendir+set}" = set; then - : +if test "${ac_cv_search_opendir+set}" = set; then : + else ac_cv_search_opendir=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_search_opendir" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 $as_echo "$ac_cv_search_opendir" >&6; } ac_res=$ac_cv_search_opendir -if test "$ac_res" != no; then +if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi fi -{ $as_echo "$as_me:$LINENO: checking for ANSI C header files" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } -if test "${ac_cv_header_stdc+set}" = set; then +if test "${ac_cv_header_stdc+set}" = set; then : $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include @@ -13121,48 +12116,23 @@ main () return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then +if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_header_stdc=no + ac_cv_header_stdc=no fi - rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "memchr" >/dev/null 2>&1; then - : + $EGREP "memchr" >/dev/null 2>&1; then : + else ac_cv_header_stdc=no fi @@ -13172,18 +12142,14 @@ fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "free" >/dev/null 2>&1; then - : + $EGREP "free" >/dev/null 2>&1; then : + else ac_cv_header_stdc=no fi @@ -13193,14 +12159,10 @@ fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. - if test "$cross_compiling" = yes; then + if test "$cross_compiling" = yes; then : : else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include @@ -13227,4275 +12189,419 @@ main () return 0; } _ACEOF -rm -f conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - : +if ac_fn_c_try_run "$LINENO"; then : + else - $as_echo "$as_me: program exited with status $ac_status" >&5 -$as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -( exit $ac_status ) -ac_cv_header_stdc=no + ac_cv_header_stdc=no fi -rm -rf conftest.dSYM -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext fi - fi fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then -cat >>confdefs.h <<\_ACEOF -#define STDC_HEADERS 1 -_ACEOF +$as_echo "#define STDC_HEADERS 1" >>confdefs.h fi - for ac_header in fcntl.h -do -as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -else - # Is the header compilable? -{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 -$as_echo_n "checking $ac_header usability... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_header_compiler=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_compiler=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -$as_echo "$ac_header_compiler" >&6; } - -# Is the header present? -{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 -$as_echo_n "checking $ac_header presence... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - ac_header_preproc=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi - -rm -f conftest.err conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -$as_echo "$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - - ;; -esac -{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - -fi -as_val=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - if test "x$as_val" = x""yes; then +do : + ac_fn_c_check_header_mongrel "$LINENO" "fcntl.h" "ac_cv_header_fcntl_h" "$ac_includes_default" +if test "x$ac_cv_header_fcntl_h" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define HAVE_FCNTL_H 1 _ACEOF fi done - for ac_header in unistd.h -do -as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -else - # Is the header compilable? -{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 -$as_echo_n "checking $ac_header usability... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_header_compiler=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_compiler=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -$as_echo "$ac_header_compiler" >&6; } - -# Is the header present? -{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 -$as_echo_n "checking $ac_header presence... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - ac_header_preproc=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi - -rm -f conftest.err conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -$as_echo "$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - - ;; -esac -{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - -fi -as_val=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - if test "x$as_val" = x""yes; then +do : + ac_fn_c_check_header_mongrel "$LINENO" "unistd.h" "ac_cv_header_unistd_h" "$ac_includes_default" +if test "x$ac_cv_header_unistd_h" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define HAVE_UNISTD_H 1 _ACEOF fi done - for ac_header in ctype.h -do -as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -else - # Is the header compilable? -{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 -$as_echo_n "checking $ac_header usability... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_header_compiler=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_compiler=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -$as_echo "$ac_header_compiler" >&6; } - -# Is the header present? -{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 -$as_echo_n "checking $ac_header presence... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - ac_header_preproc=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi - -rm -f conftest.err conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -$as_echo "$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - - ;; -esac -{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - -fi -as_val=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - if test "x$as_val" = x""yes; then +do : + ac_fn_c_check_header_mongrel "$LINENO" "ctype.h" "ac_cv_header_ctype_h" "$ac_includes_default" +if test "x$ac_cv_header_ctype_h" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define HAVE_CTYPE_H 1 _ACEOF fi done - for ac_header in dirent.h -do -as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -else - # Is the header compilable? -{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 -$as_echo_n "checking $ac_header usability... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_header_compiler=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_compiler=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -$as_echo "$ac_header_compiler" >&6; } - -# Is the header present? -{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 -$as_echo_n "checking $ac_header presence... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - ac_header_preproc=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi - -rm -f conftest.err conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -$as_echo "$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - - ;; -esac -{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - -fi -as_val=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - if test "x$as_val" = x""yes; then +do : + ac_fn_c_check_header_mongrel "$LINENO" "dirent.h" "ac_cv_header_dirent_h" "$ac_includes_default" +if test "x$ac_cv_header_dirent_h" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define HAVE_DIRENT_H 1 _ACEOF fi done - for ac_header in errno.h -do -as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -else - # Is the header compilable? -{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 -$as_echo_n "checking $ac_header usability... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_header_compiler=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_compiler=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -$as_echo "$ac_header_compiler" >&6; } - -# Is the header present? -{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 -$as_echo_n "checking $ac_header presence... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - ac_header_preproc=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi - -rm -f conftest.err conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -$as_echo "$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - - ;; -esac -{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - -fi -as_val=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - if test "x$as_val" = x""yes; then +do : + ac_fn_c_check_header_mongrel "$LINENO" "errno.h" "ac_cv_header_errno_h" "$ac_includes_default" +if test "x$ac_cv_header_errno_h" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define HAVE_ERRNO_H 1 _ACEOF fi done - for ac_header in malloc.h -do -as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -else - # Is the header compilable? -{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 -$as_echo_n "checking $ac_header usability... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_header_compiler=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_compiler=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -$as_echo "$ac_header_compiler" >&6; } - -# Is the header present? -{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 -$as_echo_n "checking $ac_header presence... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - ac_header_preproc=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi - -rm -f conftest.err conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -$as_echo "$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - - ;; -esac -{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - -fi -as_val=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - if test "x$as_val" = x""yes; then +do : + ac_fn_c_check_header_mongrel "$LINENO" "malloc.h" "ac_cv_header_malloc_h" "$ac_includes_default" +if test "x$ac_cv_header_malloc_h" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define HAVE_MALLOC_H 1 _ACEOF fi done - for ac_header in stdarg.h -do -as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -else - # Is the header compilable? -{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 -$as_echo_n "checking $ac_header usability... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_header_compiler=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_compiler=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -$as_echo "$ac_header_compiler" >&6; } - -# Is the header present? -{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 -$as_echo_n "checking $ac_header presence... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - ac_header_preproc=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi - -rm -f conftest.err conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -$as_echo "$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - - ;; -esac -{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - -fi -as_val=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - if test "x$as_val" = x""yes; then +do : + ac_fn_c_check_header_mongrel "$LINENO" "stdarg.h" "ac_cv_header_stdarg_h" "$ac_includes_default" +if test "x$ac_cv_header_stdarg_h" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define HAVE_STDARG_H 1 _ACEOF fi done - for ac_header in sys/stat.h -do -as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -else - # Is the header compilable? -{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 -$as_echo_n "checking $ac_header usability... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_header_compiler=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_compiler=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -$as_echo "$ac_header_compiler" >&6; } - -# Is the header present? -{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 -$as_echo_n "checking $ac_header presence... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - ac_header_preproc=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi - -rm -f conftest.err conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -$as_echo "$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - - ;; -esac -{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - -fi -as_val=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - if test "x$as_val" = x""yes; then +do : + ac_fn_c_check_header_mongrel "$LINENO" "sys/stat.h" "ac_cv_header_sys_stat_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_stat_h" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define HAVE_SYS_STAT_H 1 _ACEOF fi done - for ac_header in sys/types.h -do -as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -else - # Is the header compilable? -{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 -$as_echo_n "checking $ac_header usability... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_header_compiler=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_compiler=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -$as_echo "$ac_header_compiler" >&6; } - -# Is the header present? -{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 -$as_echo_n "checking $ac_header presence... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - ac_header_preproc=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi - -rm -f conftest.err conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -$as_echo "$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - - ;; -esac -{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - -fi -as_val=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - if test "x$as_val" = x""yes; then +do : + ac_fn_c_check_header_mongrel "$LINENO" "sys/types.h" "ac_cv_header_sys_types_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_types_h" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define HAVE_SYS_TYPES_H 1 _ACEOF fi done - for ac_header in stdint.h -do -as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -else - # Is the header compilable? -{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 -$as_echo_n "checking $ac_header usability... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_header_compiler=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_compiler=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -$as_echo "$ac_header_compiler" >&6; } - -# Is the header present? -{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 -$as_echo_n "checking $ac_header presence... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - ac_header_preproc=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi - -rm -f conftest.err conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -$as_echo "$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - - ;; -esac -{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - -fi -as_val=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - if test "x$as_val" = x""yes; then +do : + ac_fn_c_check_header_mongrel "$LINENO" "stdint.h" "ac_cv_header_stdint_h" "$ac_includes_default" +if test "x$ac_cv_header_stdint_h" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define HAVE_STDINT_H 1 _ACEOF fi done - for ac_header in inttypes.h.h -do -as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -else - # Is the header compilable? -{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 -$as_echo_n "checking $ac_header usability... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_header_compiler=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_compiler=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -$as_echo "$ac_header_compiler" >&6; } - -# Is the header present? -{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 -$as_echo_n "checking $ac_header presence... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - ac_header_preproc=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi - -rm -f conftest.err conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -$as_echo "$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - - ;; -esac -{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - -fi -as_val=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - if test "x$as_val" = x""yes; then +do : + ac_fn_c_check_header_mongrel "$LINENO" "inttypes.h.h" "ac_cv_header_inttypes_h_h" "$ac_includes_default" +if test "x$ac_cv_header_inttypes_h_h" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define HAVE_INTTYPES_H_H 1 _ACEOF fi done - for ac_header in time.h -do -as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -else - # Is the header compilable? -{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 -$as_echo_n "checking $ac_header usability... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_header_compiler=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_compiler=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -$as_echo "$ac_header_compiler" >&6; } - -# Is the header present? -{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 -$as_echo_n "checking $ac_header presence... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - ac_header_preproc=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi - -rm -f conftest.err conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -$as_echo "$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - - ;; -esac -{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - -fi -as_val=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - if test "x$as_val" = x""yes; then +do : + ac_fn_c_check_header_mongrel "$LINENO" "time.h" "ac_cv_header_time_h" "$ac_includes_default" +if test "x$ac_cv_header_time_h" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define HAVE_TIME_H 1 _ACEOF fi done - for ac_header in ansidecl.h -do -as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -else - # Is the header compilable? -{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 -$as_echo_n "checking $ac_header usability... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_header_compiler=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_compiler=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -$as_echo "$ac_header_compiler" >&6; } - -# Is the header present? -{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 -$as_echo_n "checking $ac_header presence... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - ac_header_preproc=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi - -rm -f conftest.err conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -$as_echo "$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - - ;; -esac -{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - -fi -as_val=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - if test "x$as_val" = x""yes; then +do : + ac_fn_c_check_header_mongrel "$LINENO" "ansidecl.h" "ac_cv_header_ansidecl_h" "$ac_includes_default" +if test "x$ac_cv_header_ansidecl_h" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define HAVE_ANSIDECL_H 1 _ACEOF fi done - for ac_header in ieeefp.h -do -as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -else - # Is the header compilable? -{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 -$as_echo_n "checking $ac_header usability... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_header_compiler=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_compiler=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -$as_echo "$ac_header_compiler" >&6; } - -# Is the header present? -{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 -$as_echo_n "checking $ac_header presence... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - ac_header_preproc=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi - -rm -f conftest.err conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -$as_echo "$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - - ;; -esac -{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - -fi -as_val=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - if test "x$as_val" = x""yes; then +do : + ac_fn_c_check_header_mongrel "$LINENO" "ieeefp.h" "ac_cv_header_ieeefp_h" "$ac_includes_default" +if test "x$ac_cv_header_ieeefp_h" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define HAVE_IEEEFP_H 1 _ACEOF fi done - for ac_header in nan.h -do -as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -else - # Is the header compilable? -{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 -$as_echo_n "checking $ac_header usability... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_header_compiler=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_compiler=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -$as_echo "$ac_header_compiler" >&6; } - -# Is the header present? -{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 -$as_echo_n "checking $ac_header presence... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - ac_header_preproc=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi - -rm -f conftest.err conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -$as_echo "$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - - ;; -esac -{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - -fi -as_val=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - if test "x$as_val" = x""yes; then +do : + ac_fn_c_check_header_mongrel "$LINENO" "nan.h" "ac_cv_header_nan_h" "$ac_includes_default" +if test "x$ac_cv_header_nan_h" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define HAVE_NAN_H 1 _ACEOF fi done - for ac_header in math.h -do -as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -else - # Is the header compilable? -{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 -$as_echo_n "checking $ac_header usability... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_header_compiler=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_compiler=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -$as_echo "$ac_header_compiler" >&6; } - -# Is the header present? -{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 -$as_echo_n "checking $ac_header presence... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - ac_header_preproc=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi - -rm -f conftest.err conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -$as_echo "$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - - ;; -esac -{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - -fi -as_val=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - if test "x$as_val" = x""yes; then +do : + ac_fn_c_check_header_mongrel "$LINENO" "math.h" "ac_cv_header_math_h" "$ac_includes_default" +if test "x$ac_cv_header_math_h" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define HAVE_MATH_H 1 _ACEOF fi done - for ac_header in limits.h -do -as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -else - # Is the header compilable? -{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 -$as_echo_n "checking $ac_header usability... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_header_compiler=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_compiler=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -$as_echo "$ac_header_compiler" >&6; } - -# Is the header present? -{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 -$as_echo_n "checking $ac_header presence... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - ac_header_preproc=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi - -rm -f conftest.err conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -$as_echo "$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - - ;; -esac -{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - -fi -as_val=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - if test "x$as_val" = x""yes; then +do : + ac_fn_c_check_header_mongrel "$LINENO" "limits.h" "ac_cv_header_limits_h" "$ac_includes_default" +if test "x$ac_cv_header_limits_h" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define HAVE_LIMITS_H 1 _ACEOF fi done - for ac_header in fp_class.h -do -as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -else - # Is the header compilable? -{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 -$as_echo_n "checking $ac_header usability... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_header_compiler=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_compiler=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -$as_echo "$ac_header_compiler" >&6; } - -# Is the header present? -{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 -$as_echo_n "checking $ac_header presence... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - ac_header_preproc=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi - -rm -f conftest.err conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -$as_echo "$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - - ;; -esac -{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - -fi -as_val=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - if test "x$as_val" = x""yes; then +do : + ac_fn_c_check_header_mongrel "$LINENO" "fp_class.h" "ac_cv_header_fp_class_h" "$ac_includes_default" +if test "x$ac_cv_header_fp_class_h" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define HAVE_FP_CLASS_H 1 _ACEOF fi done - for ac_header in float.h -do -as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -else - # Is the header compilable? -{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 -$as_echo_n "checking $ac_header usability... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_header_compiler=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_compiler=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -$as_echo "$ac_header_compiler" >&6; } - -# Is the header present? -{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 -$as_echo_n "checking $ac_header presence... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - ac_header_preproc=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi - -rm -f conftest.err conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -$as_echo "$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - - ;; -esac -{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - -fi -as_val=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - if test "x$as_val" = x""yes; then +do : + ac_fn_c_check_header_mongrel "$LINENO" "float.h" "ac_cv_header_float_h" "$ac_includes_default" +if test "x$ac_cv_header_float_h" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define HAVE_FLOAT_H 1 _ACEOF fi done - for ac_header in stdlib.h -do -as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -else - # Is the header compilable? -{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 -$as_echo_n "checking $ac_header usability... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_header_compiler=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_compiler=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -$as_echo "$ac_header_compiler" >&6; } - -# Is the header present? -{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 -$as_echo_n "checking $ac_header presence... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - ac_header_preproc=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi - -rm -f conftest.err conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -$as_echo "$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - - ;; -esac -{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - -fi -as_val=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - if test "x$as_val" = x""yes; then +do : + ac_fn_c_check_header_mongrel "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default" +if test "x$ac_cv_header_stdlib_h" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define HAVE_STDLIB_H 1 _ACEOF fi done - for ac_header in sys/socket.h -do -as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#if HAVE_SYS_TYPES_H +do : + ac_fn_c_check_header_compile "$LINENO" "sys/socket.h" "ac_cv_header_sys_socket_h" "#if HAVE_SYS_TYPES_H # include # endif - -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - eval "$as_ac_Header=yes" -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - eval "$as_ac_Header=no" -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -as_val=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - if test "x$as_val" = x""yes; then +" +if test "x$ac_cv_header_sys_socket_h" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define HAVE_SYS_SOCKET_H 1 _ACEOF fi done - for ac_header in netinet/in.h -do -as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#if HAVE_SYS_TYPES_H +do : + ac_fn_c_check_header_compile "$LINENO" "netinet/in.h" "ac_cv_header_netinet_in_h" "#if HAVE_SYS_TYPES_H # include # endif - -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - eval "$as_ac_Header=yes" -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - eval "$as_ac_Header=no" -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -as_val=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - if test "x$as_val" = x""yes; then +" +if test "x$ac_cv_header_netinet_in_h" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define HAVE_NETINET_IN_H 1 _ACEOF fi done - for ac_header in arpa/inet.h -do -as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#if HAVE_SYS_TYPES_H +do : + ac_fn_c_check_header_compile "$LINENO" "arpa/inet.h" "ac_cv_header_arpa_inet_h" "#if HAVE_SYS_TYPES_H # include # endif #if HAVE_ARPA_INET_H # include # endif - -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - eval "$as_ac_Header=yes" -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - eval "$as_ac_Header=no" -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -as_val=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - if test "x$as_val" = x""yes; then +" +if test "x$ac_cv_header_arpa_inet_h" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define HAVE_ARPA_INET_H 1 _ACEOF fi done - for ac_header in netdb.h -do -as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -else - # Is the header compilable? -{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 -$as_echo_n "checking $ac_header usability... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_header_compiler=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_compiler=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -$as_echo "$ac_header_compiler" >&6; } - -# Is the header present? -{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 -$as_echo_n "checking $ac_header presence... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - ac_header_preproc=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi - -rm -f conftest.err conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -$as_echo "$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - - ;; -esac -{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - -fi -as_val=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - if test "x$as_val" = x""yes; then +do : + ac_fn_c_check_header_mongrel "$LINENO" "netdb.h" "ac_cv_header_netdb_h" "$ac_includes_default" +if test "x$ac_cv_header_netdb_h" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define HAVE_NETDB_H 1 _ACEOF fi done - for ac_header in sys/time.h -do -as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -else - # Is the header compilable? -{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 -$as_echo_n "checking $ac_header usability... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_header_compiler=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_compiler=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -$as_echo "$ac_header_compiler" >&6; } - -# Is the header present? -{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 -$as_echo_n "checking $ac_header presence... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - ac_header_preproc=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi - -rm -f conftest.err conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -$as_echo "$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - - ;; -esac -{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - -fi -as_val=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - if test "x$as_val" = x""yes; then +do : + ac_fn_c_check_header_mongrel "$LINENO" "sys/time.h" "ac_cv_header_sys_time_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_time_h" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define HAVE_SYS_TIME_H 1 _ACEOF fi done - for ac_header in sys/select.h -do -as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -else - # Is the header compilable? -{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 -$as_echo_n "checking $ac_header usability... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_header_compiler=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_compiler=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -$as_echo "$ac_header_compiler" >&6; } - -# Is the header present? -{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 -$as_echo_n "checking $ac_header presence... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - ac_header_preproc=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi - -rm -f conftest.err conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -$as_echo "$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - - ;; -esac -{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - -fi -as_val=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - if test "x$as_val" = x""yes; then +do : + ac_fn_c_check_header_mongrel "$LINENO" "sys/select.h" "ac_cv_header_sys_select_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_select_h" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define HAVE_SYS_SELECT_H 1 _ACEOF fi done - for ac_header in poll.h -do -as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -else - # Is the header compilable? -{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 -$as_echo_n "checking $ac_header usability... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_header_compiler=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_compiler=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -$as_echo "$ac_header_compiler" >&6; } - -# Is the header present? -{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 -$as_echo_n "checking $ac_header presence... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - ac_header_preproc=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi - -rm -f conftest.err conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -$as_echo "$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - - ;; -esac -{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - -fi -as_val=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - if test "x$as_val" = x""yes; then +do : + ac_fn_c_check_header_mongrel "$LINENO" "poll.h" "ac_cv_header_poll_h" "$ac_includes_default" +if test "x$ac_cv_header_poll_h" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define HAVE_POLL_H 1 _ACEOF fi done - for ac_header in sys/mman.h -do -as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -else - # Is the header compilable? -{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 -$as_echo_n "checking $ac_header usability... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_header_compiler=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_compiler=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -$as_echo "$ac_header_compiler" >&6; } - -# Is the header present? -{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 -$as_echo_n "checking $ac_header presence... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - ac_header_preproc=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi - -rm -f conftest.err conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -$as_echo "$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - - ;; -esac -{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - -fi -as_val=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - if test "x$as_val" = x""yes; then +do : + ac_fn_c_check_header_mongrel "$LINENO" "sys/mman.h" "ac_cv_header_sys_mman_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_mman_h" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define HAVE_SYS_MMAN_H 1 _ACEOF fi done - for ac_header in sys/timeb.h -do -as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -else - # Is the header compilable? -{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 -$as_echo_n "checking $ac_header usability... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_header_compiler=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_compiler=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -$as_echo "$ac_header_compiler" >&6; } - -# Is the header present? -{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 -$as_echo_n "checking $ac_header presence... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - ac_header_preproc=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi - -rm -f conftest.err conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -$as_echo "$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - - ;; -esac -{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - -fi -as_val=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - if test "x$as_val" = x""yes; then +do : + ac_fn_c_check_header_mongrel "$LINENO" "sys/timeb.h" "ac_cv_header_sys_timeb_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_timeb_h" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define HAVE_SYS_TIMEB_H 1 _ACEOF fi done - for ac_header in signal.h -do -as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -else - # Is the header compilable? -{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 -$as_echo_n "checking $ac_header usability... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_header_compiler=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_compiler=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -$as_echo "$ac_header_compiler" >&6; } - -# Is the header present? -{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 -$as_echo_n "checking $ac_header presence... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - ac_header_preproc=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi - -rm -f conftest.err conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -$as_echo "$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - - ;; -esac -{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - -fi -as_val=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - if test "x$as_val" = x""yes; then +do : + ac_fn_c_check_header_mongrel "$LINENO" "signal.h" "ac_cv_header_signal_h" "$ac_includes_default" +if test "x$ac_cv_header_signal_h" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define HAVE_SIGNAL_H 1 _ACEOF fi done - for ac_header in arpa/nameser.h -do -as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#if HAVE_SYS_TYPES_H +do : + ac_fn_c_check_header_compile "$LINENO" "arpa/nameser.h" "ac_cv_header_arpa_nameser_h" "#if HAVE_SYS_TYPES_H # include # endif - -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - eval "$as_ac_Header=yes" -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - eval "$as_ac_Header=no" -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -as_val=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - if test "x$as_val" = x""yes; then +" +if test "x$ac_cv_header_arpa_nameser_h" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define HAVE_ARPA_NAMESER_H 1 _ACEOF fi done - for ac_header in resolv.h -do -as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#if HAVE_SYS_TYPES_H +do : + ac_fn_c_check_header_compile "$LINENO" "resolv.h" "ac_cv_header_resolv_h" "#if HAVE_SYS_TYPES_H # include # endif #if HAVE_NETINET_IN_H @@ -17505,338 +12611,34 @@ cat >>conftest.$ac_ext <<_ACEOF # include # endif - -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - eval "$as_ac_Header=yes" -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - eval "$as_ac_Header=no" -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -as_val=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - if test "x$as_val" = x""yes; then +" +if test "x$ac_cv_header_resolv_h" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define HAVE_RESOLV_H 1 _ACEOF fi done - for ac_header in dl.h -do -as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -else - # Is the header compilable? -{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 -$as_echo_n "checking $ac_header usability... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_header_compiler=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_compiler=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -$as_echo "$ac_header_compiler" >&6; } - -# Is the header present? -{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 -$as_echo_n "checking $ac_header presence... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - ac_header_preproc=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi - -rm -f conftest.err conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -$as_echo "$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - - ;; -esac -{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - -fi -as_val=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - if test "x$as_val" = x""yes; then +do : + ac_fn_c_check_header_mongrel "$LINENO" "dl.h" "ac_cv_header_dl_h" "$ac_includes_default" +if test "x$ac_cv_header_dl_h" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define HAVE_DL_H 1 _ACEOF fi done - for ac_header in dlfcn.h -do -as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -else - # Is the header compilable? -{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 -$as_echo_n "checking $ac_header usability... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_header_compiler=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_compiler=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -$as_echo "$ac_header_compiler" >&6; } - -# Is the header present? -{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 -$as_echo_n "checking $ac_header presence... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - ac_header_preproc=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi - -rm -f conftest.err conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -$as_echo "$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - - ;; -esac -{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - -fi -as_val=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - if test "x$as_val" = x""yes; then +do : + ac_fn_c_check_header_mongrel "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default" +if test "x$ac_cv_header_dlfcn_h" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define HAVE_DLFCN_H 1 _ACEOF fi @@ -17847,118 +12649,24 @@ done echo Checking libraries - for ac_func in strftime -do -as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` -{ $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 -$as_echo_n "checking for $ac_func... " >&6; } -if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define $ac_func to an innocuous variant, in case declares $ac_func. - For example, HP-UX 11i declares gettimeofday. */ -#define $ac_func innocuous_$ac_func - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $ac_func - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char $ac_func (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined __stub_$ac_func || defined __stub___$ac_func -choke me -#endif - -int -main () -{ -return $ac_func (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - eval "$as_ac_var=yes" -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - eval "$as_ac_var=no" -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -fi -ac_res=`eval 'as_val=${'$as_ac_var'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -as_val=`eval 'as_val=${'$as_ac_var'} - $as_echo "$as_val"'` - if test "x$as_val" = x""yes; then +do : + ac_fn_c_check_func "$LINENO" "strftime" "ac_cv_func_strftime" +if test "x$ac_cv_func_strftime" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +#define HAVE_STRFTIME 1 _ACEOF else # strftime is in -lintl on SCO UNIX. -{ $as_echo "$as_me:$LINENO: checking for strftime in -lintl" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for strftime in -lintl" >&5 $as_echo_n "checking for strftime in -lintl... " >&6; } -if test "${ac_cv_lib_intl_strftime+set}" = set; then +if test "${ac_cv_lib_intl_strftime+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lintl $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. @@ -17976,46 +12684,19 @@ return strftime (); return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then +if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_intl_strftime=yes else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_lib_intl_strftime=no + ac_cv_lib_intl_strftime=no fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_intl_strftime" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_strftime" >&5 $as_echo "$ac_cv_lib_intl_strftime" >&6; } -if test "x$ac_cv_lib_intl_strftime" = x""yes; then - cat >>confdefs.h <<\_ACEOF -#define HAVE_STRFTIME 1 -_ACEOF +if test "x$ac_cv_lib_intl_strftime" = x""yes; then : + $as_echo "#define HAVE_STRFTIME 1" >>confdefs.h LIBS="-lintl $LIBS" fi @@ -18023,102 +12704,11 @@ fi fi done - - - for ac_func in strdup strndup strerror -do -as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` -{ $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 -$as_echo_n "checking for $ac_func... " >&6; } -if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define $ac_func to an innocuous variant, in case declares $ac_func. - For example, HP-UX 11i declares gettimeofday. */ -#define $ac_func innocuous_$ac_func - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $ac_func - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char $ac_func (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined __stub_$ac_func || defined __stub___$ac_func -choke me -#endif - -int -main () -{ -return $ac_func (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - eval "$as_ac_var=yes" -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - eval "$as_ac_var=no" -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -fi -ac_res=`eval 'as_val=${'$as_ac_var'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -as_val=`eval 'as_val=${'$as_ac_var'} - $as_echo "$as_val"'` - if test "x$as_val" = x""yes; then +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF @@ -18126,104 +12716,11 @@ _ACEOF fi done - - - - - for ac_func in finite isnand fp_class class fpclass -do -as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` -{ $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 -$as_echo_n "checking for $ac_func... " >&6; } -if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define $ac_func to an innocuous variant, in case declares $ac_func. - For example, HP-UX 11i declares gettimeofday. */ -#define $ac_func innocuous_$ac_func - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $ac_func - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char $ac_func (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined __stub_$ac_func || defined __stub___$ac_func -choke me -#endif - -int -main () -{ -return $ac_func (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - eval "$as_ac_var=yes" -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - eval "$as_ac_var=no" -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -fi -ac_res=`eval 'as_val=${'$as_ac_var'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -as_val=`eval 'as_val=${'$as_ac_var'} - $as_echo "$as_val"'` - if test "x$as_val" = x""yes; then +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF @@ -18231,103 +12728,11 @@ _ACEOF fi done - - - - for ac_func in strftime localtime gettimeofday ftime -do -as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` -{ $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 -$as_echo_n "checking for $ac_func... " >&6; } -if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define $ac_func to an innocuous variant, in case declares $ac_func. - For example, HP-UX 11i declares gettimeofday. */ -#define $ac_func innocuous_$ac_func - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $ac_func - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char $ac_func (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined __stub_$ac_func || defined __stub___$ac_func -choke me -#endif - -int -main () -{ -return $ac_func (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - eval "$as_ac_var=yes" -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - eval "$as_ac_var=no" -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -fi -ac_res=`eval 'as_val=${'$as_ac_var'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -as_val=`eval 'as_val=${'$as_ac_var'} - $as_echo "$as_val"'` - if test "x$as_val" = x""yes; then +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF @@ -18335,102 +12740,11 @@ _ACEOF fi done - - - for ac_func in stat _stat signal -do -as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` -{ $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 -$as_echo_n "checking for $ac_func... " >&6; } -if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define $ac_func to an innocuous variant, in case declares $ac_func. - For example, HP-UX 11i declares gettimeofday. */ -#define $ac_func innocuous_$ac_func - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $ac_func - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char $ac_func (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined __stub_$ac_func || defined __stub___$ac_func -choke me -#endif - -int -main () -{ -return $ac_func (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - eval "$as_ac_var=yes" -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - eval "$as_ac_var=no" -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -fi -ac_res=`eval 'as_val=${'$as_ac_var'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -as_val=`eval 'as_val=${'$as_ac_var'} - $as_echo "$as_val"'` - if test "x$as_val" = x""yes; then +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF @@ -18439,107 +12753,11 @@ fi done - - - - - - - - for ac_func in printf sprintf fprintf snprintf vfprintf vsprintf vsnprintf sscanf -do -as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` -{ $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 -$as_echo_n "checking for $ac_func... " >&6; } -if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define $ac_func to an innocuous variant, in case declares $ac_func. - For example, HP-UX 11i declares gettimeofday. */ -#define $ac_func innocuous_$ac_func - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $ac_func - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char $ac_func (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined __stub_$ac_func || defined __stub___$ac_func -choke me -#endif - -int -main () -{ -return $ac_func (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - eval "$as_ac_var=yes" -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - eval "$as_ac_var=no" -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -fi -ac_res=`eval 'as_val=${'$as_ac_var'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -as_val=`eval 'as_val=${'$as_ac_var'} - $as_echo "$as_val"'` - if test "x$as_val" = x""yes; then +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF @@ -18550,13 +12768,9 @@ fi done -{ $as_echo "$as_me:$LINENO: checking for va_copy" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for va_copy" >&5 $as_echo_n "checking for va_copy... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include va_list ap1,ap2; @@ -18568,54 +12782,23 @@ va_copy(ap1,ap2); return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then +if ac_fn_c_try_link "$LINENO"; then : have_va_copy=yes else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - have_va_copy=no + have_va_copy=no fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $have_va_copy" >&5 +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_va_copy" >&5 $as_echo "$have_va_copy" >&6; } if test x"$have_va_copy" = x"yes"; then -cat >>confdefs.h <<\_ACEOF -#define HAVE_VA_COPY 1 -_ACEOF +$as_echo "#define HAVE_VA_COPY 1" >>confdefs.h else - { $as_echo "$as_me:$LINENO: checking for __va_copy" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __va_copy" >&5 $as_echo_n "checking for __va_copy... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include va_list ap1,ap2; @@ -18627,60 +12810,29 @@ __va_copy(ap1,ap2); return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then +if ac_fn_c_try_link "$LINENO"; then : have___va_copy=yes else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - have___va_copy=no + have___va_copy=no fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $have___va_copy" >&5 +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have___va_copy" >&5 $as_echo "$have___va_copy" >&6; } if test x"$have___va_copy" = x"yes"; then -cat >>confdefs.h <<\_ACEOF -#define HAVE___VA_COPY 1 -_ACEOF +$as_echo "#define HAVE___VA_COPY 1" >>confdefs.h fi fi -{ $as_echo "$as_me:$LINENO: checking for library containing gethostent" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing gethostent" >&5 $as_echo_n "checking for library containing gethostent... " >&6; } -if test "${ac_cv_search_gethostent+set}" = set; then +if test "${ac_cv_search_gethostent+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. @@ -18705,69 +12857,38 @@ for ac_lib in '' nsl; do ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi - rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then + if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_gethostent=$ac_res -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext - if test "${ac_cv_search_gethostent+set}" = set; then +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if test "${ac_cv_search_gethostent+set}" = set; then : break fi done -if test "${ac_cv_search_gethostent+set}" = set; then - : +if test "${ac_cv_search_gethostent+set}" = set; then : + else ac_cv_search_gethostent=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_search_gethostent" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_gethostent" >&5 $as_echo "$ac_cv_search_gethostent" >&6; } ac_res=$ac_cv_search_gethostent -if test "$ac_res" != no; then +if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi -{ $as_echo "$as_me:$LINENO: checking for library containing setsockopt" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing setsockopt" >&5 $as_echo_n "checking for library containing setsockopt... " >&6; } -if test "${ac_cv_search_setsockopt+set}" = set; then +if test "${ac_cv_search_setsockopt+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. @@ -18792,69 +12913,38 @@ for ac_lib in '' socket net network; do ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi - rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then + if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_setsockopt=$ac_res -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext - if test "${ac_cv_search_setsockopt+set}" = set; then +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if test "${ac_cv_search_setsockopt+set}" = set; then : break fi done -if test "${ac_cv_search_setsockopt+set}" = set; then - : +if test "${ac_cv_search_setsockopt+set}" = set; then : + else ac_cv_search_setsockopt=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_search_setsockopt" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_setsockopt" >&5 $as_echo "$ac_cv_search_setsockopt" >&6; } ac_res=$ac_cv_search_setsockopt -if test "$ac_res" != no; then +if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi -{ $as_echo "$as_me:$LINENO: checking for library containing connect" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing connect" >&5 $as_echo_n "checking for library containing connect... " >&6; } -if test "${ac_cv_search_connect+set}" = set; then +if test "${ac_cv_search_connect+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. @@ -18879,63 +12969,36 @@ for ac_lib in '' inet; do ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi - rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then + if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_connect=$ac_res -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext - if test "${ac_cv_search_connect+set}" = set; then +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if test "${ac_cv_search_connect+set}" = set; then : break fi done -if test "${ac_cv_search_connect+set}" = set; then - : +if test "${ac_cv_search_connect+set}" = set; then : + else ac_cv_search_connect=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_search_connect" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_connect" >&5 $as_echo "$ac_cv_search_connect" >&6; } ac_res=$ac_cv_search_connect -if test "$ac_res" != no; then +if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi -{ $as_echo "$as_me:$LINENO: checking for type of socket length (socklen_t)" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for type of socket length (socklen_t)" >&5 $as_echo_n "checking for type of socket length (socklen_t)... " >&6; } cat > conftest.$ac_ext < @@ -18946,10 +13009,10 @@ int main(void) { (void)getsockopt (1, 1, 1, NULL, (socklen_t *)NULL) ; return 0; } EOF -if { (eval echo configure:18949: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; _out=`eval $ac_compile 2>&1` && test "x$_out" = x; }; then +if { (eval echo configure:13012: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; _out=`eval $ac_compile 2>&1` && test "x$_out" = x; }; then rm -rf conftest* - { $as_echo "$as_me:$LINENO: result: socklen_t *" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: socklen_t *" >&5 $as_echo "socklen_t *" >&6; } XML_SOCKLEN_T=socklen_t else @@ -18958,7 +13021,7 @@ else rm -rf conftest* cat > conftest.$ac_ext < @@ -18969,10 +13032,10 @@ int main(void) { (void)getsockopt (1, 1, 1, NULL, (size_t *)NULL) ; return 0; } EOF -if { (eval echo configure:18972: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; _out=`eval $ac_compile 2>&1` && test "x$_out" = x; }; then +if { (eval echo configure:13035: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; _out=`eval $ac_compile 2>&1` && test "x$_out" = x; }; then rm -rf conftest* - { $as_echo "$as_me:$LINENO: result: size_t *" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: size_t *" >&5 $as_echo "size_t *" >&6; } XML_SOCKLEN_T=size_t else @@ -18981,7 +13044,7 @@ else rm -rf conftest* cat > conftest.$ac_ext < @@ -18992,10 +13055,10 @@ int main(void) { (void)getsockopt (1, 1, 1, NULL, (int *)NULL) ; return 0; } EOF -if { (eval echo configure:18995: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; _out=`eval $ac_compile 2>&1` && test "x$_out" = x; }; then +if { (eval echo configure:13058: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; _out=`eval $ac_compile 2>&1` && test "x$_out" = x; }; then rm -rf conftest* - { $as_echo "$as_me:$LINENO: result: int *" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: int *" >&5 $as_echo "int *" >&6; } XML_SOCKLEN_T=int else @@ -19003,7 +13066,7 @@ else cat conftest.$ac_ext >&5 rm -rf conftest* - { $as_echo "$as_me:$LINENO: WARNING: could not determine" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: could not determine" >&5 $as_echo "$as_me: WARNING: could not determine" >&2;} XML_SOCKLEN_T="int" fi @@ -19019,10 +13082,10 @@ _ACEOF -{ $as_echo "$as_me:$LINENO: checking whether to enable IPv6" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable IPv6" >&5 $as_echo_n "checking whether to enable IPv6... " >&6; } # Check whether --enable-ipv6 was given. -if test "${enable_ipv6+set}" = set; then +if test "${enable_ipv6+set}" = set; then : enableval=$enable_ipv6; else enable_ipv6=yes @@ -19034,11 +13097,7 @@ then fi if test $enable_ipv6 = yes; then have_ipv6=no - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include @@ -19055,52 +13114,25 @@ main () return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then +if ac_fn_c_try_compile "$LINENO"; then : have_ipv6=yes else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - have_ipv6=no + have_ipv6=no fi - rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $have_ipv6" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_ipv6" >&5 $as_echo "$have_ipv6" >&6; } if test $have_ipv6 = yes; then -cat >>confdefs.h <<\_ACEOF -#define SUPPORT_IP6 /**/ -_ACEOF +$as_echo "#define SUPPORT_IP6 /**/" >>confdefs.h have_broken_ss_family=no - { $as_echo "$as_me:$LINENO: checking struct sockaddr::ss_family" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking struct sockaddr::ss_family" >&5 $as_echo_n "checking struct sockaddr::ss_family... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include @@ -19117,44 +13149,19 @@ main () return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then +if ac_fn_c_try_compile "$LINENO"; then : have_ss_family=yes else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - have_ss_family=no + have_ss_family=no fi - rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $have_ss_family" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_ss_family" >&5 $as_echo "$have_ss_family" >&6; } if test x$have_ss_family = xno ; then - { $as_echo "$as_me:$LINENO: checking broken struct sockaddr::ss_family" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking broken struct sockaddr::ss_family" >&5 $as_echo_n "checking broken struct sockaddr::ss_family... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include @@ -19171,158 +13178,45 @@ main () return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then +if ac_fn_c_try_compile "$LINENO"; then : have_broken_ss_family=yes else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - have_broken_ss_family=no + have_broken_ss_family=no fi - rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $have_broken_ss_family" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_broken_ss_family" >&5 $as_echo "$have_broken_ss_family" >&6; } if test x$have_broken_ss_family = xyes ; then -cat >>confdefs.h <<\_ACEOF -#define HAVE_BROKEN_SS_FAMILY /**/ -_ACEOF +$as_echo "#define HAVE_BROKEN_SS_FAMILY /**/" >>confdefs.h -cat >>confdefs.h <<\_ACEOF -#define ss_family __ss_family -_ACEOF +$as_echo "#define ss_family __ss_family" >>confdefs.h else - { $as_echo "$as_me:$LINENO: WARNING: ss_family and __ss_family not found" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: ss_family and __ss_family not found" >&5 $as_echo "$as_me: WARNING: ss_family and __ss_family not found" >&2;} fi fi have_getaddrinfo=no - { $as_echo "$as_me:$LINENO: checking for getaddrinfo" >&5 -$as_echo_n "checking for getaddrinfo... " >&6; } -if test "${ac_cv_func_getaddrinfo+set}" = set; then - $as_echo_n "(cached) " >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define getaddrinfo to an innocuous variant, in case declares getaddrinfo. - For example, HP-UX 11i declares gettimeofday. */ -#define getaddrinfo innocuous_getaddrinfo - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char getaddrinfo (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef getaddrinfo - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char getaddrinfo (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined __stub_getaddrinfo || defined __stub___getaddrinfo -choke me -#endif - -int -main () -{ -return getaddrinfo (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - ac_cv_func_getaddrinfo=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_func_getaddrinfo=no -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_func_getaddrinfo" >&5 -$as_echo "$ac_cv_func_getaddrinfo" >&6; } -if test "x$ac_cv_func_getaddrinfo" = x""yes; then + ac_fn_c_check_func "$LINENO" "getaddrinfo" "ac_cv_func_getaddrinfo" +if test "x$ac_cv_func_getaddrinfo" = x""yes; then : have_getaddrinfo=yes fi if test $have_getaddrinfo != yes; then for lib in bsd socket inet; do as_ac_Lib=`$as_echo "ac_cv_lib_$lib''_getaddrinfo" | $as_tr_sh` -{ $as_echo "$as_me:$LINENO: checking for getaddrinfo in -l$lib" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for getaddrinfo in -l$lib" >&5 $as_echo_n "checking for getaddrinfo in -l$lib... " >&6; } -if { as_var=$as_ac_Lib; eval "test \"\${$as_var+set}\" = set"; }; then +if eval "test \"\${$as_ac_Lib+set}\"" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$lib $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. @@ -19340,47 +13234,19 @@ return getaddrinfo (); return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then +if ac_fn_c_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - eval "$as_ac_Lib=no" + eval "$as_ac_Lib=no" fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -ac_res=`eval 'as_val=${'$as_ac_Lib'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +eval ac_res=\$$as_ac_Lib + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } -as_val=`eval 'as_val=${'$as_ac_Lib'} - $as_echo "$as_val"'` - if test "x$as_val" = x""yes; then +if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : LIBS="$LIBS -l$lib";have_getaddrinfo=yes;break fi @@ -19389,119 +13255,27 @@ fi if test $have_getaddrinfo = yes; then -cat >>confdefs.h <<\_ACEOF -#define HAVE_GETADDRINFO /**/ -_ACEOF +$as_echo "#define HAVE_GETADDRINFO /**/" >>confdefs.h fi fi fi -{ $as_echo "$as_me:$LINENO: checking for isnan" >&5 -$as_echo_n "checking for isnan... " >&6; } -if test "${ac_cv_func_isnan+set}" = set; then - $as_echo_n "(cached) " >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define isnan to an innocuous variant, in case declares isnan. - For example, HP-UX 11i declares gettimeofday. */ -#define isnan innocuous_isnan +ac_fn_c_check_func "$LINENO" "isnan" "ac_cv_func_isnan" +if test "x$ac_cv_func_isnan" = x""yes; then : -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char isnan (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef isnan - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char isnan (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined __stub_isnan || defined __stub___isnan -choke me -#endif - -int -main () -{ -return isnan (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - ac_cv_func_isnan=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_func_isnan=no -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_func_isnan" >&5 -$as_echo "$ac_cv_func_isnan" >&6; } -if test "x$ac_cv_func_isnan" = x""yes; then - -cat >>confdefs.h <<\_ACEOF -#define HAVE_ISNAN /**/ -_ACEOF +$as_echo "#define HAVE_ISNAN /**/" >>confdefs.h else - { $as_echo "$as_me:$LINENO: checking for isnan in -lm" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for isnan in -lm" >&5 $as_echo_n "checking for isnan in -lm... " >&6; } -if test "${ac_cv_lib_m_isnan+set}" = set; then +if test "${ac_cv_lib_m_isnan+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lm $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. @@ -19519,157 +13293,40 @@ return isnan (); return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then +if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_m_isnan=yes else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_lib_m_isnan=no + ac_cv_lib_m_isnan=no fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_m_isnan" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_isnan" >&5 $as_echo "$ac_cv_lib_m_isnan" >&6; } -if test "x$ac_cv_lib_m_isnan" = x""yes; then +if test "x$ac_cv_lib_m_isnan" = x""yes; then : -cat >>confdefs.h <<\_ACEOF -#define HAVE_ISNAN /**/ -_ACEOF +$as_echo "#define HAVE_ISNAN /**/" >>confdefs.h fi fi -{ $as_echo "$as_me:$LINENO: checking for isinf" >&5 -$as_echo_n "checking for isinf... " >&6; } -if test "${ac_cv_func_isinf+set}" = set; then - $as_echo_n "(cached) " >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define isinf to an innocuous variant, in case declares isinf. - For example, HP-UX 11i declares gettimeofday. */ -#define isinf innocuous_isinf +ac_fn_c_check_func "$LINENO" "isinf" "ac_cv_func_isinf" +if test "x$ac_cv_func_isinf" = x""yes; then : -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char isinf (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef isinf - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char isinf (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined __stub_isinf || defined __stub___isinf -choke me -#endif - -int -main () -{ -return isinf (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - ac_cv_func_isinf=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_func_isinf=no -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_func_isinf" >&5 -$as_echo "$ac_cv_func_isinf" >&6; } -if test "x$ac_cv_func_isinf" = x""yes; then - -cat >>confdefs.h <<\_ACEOF -#define HAVE_ISINF /**/ -_ACEOF +$as_echo "#define HAVE_ISINF /**/" >>confdefs.h else - { $as_echo "$as_me:$LINENO: checking for isinf in -lm" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for isinf in -lm" >&5 $as_echo_n "checking for isinf in -lm... " >&6; } -if test "${ac_cv_lib_m_isinf+set}" = set; then +if test "${ac_cv_lib_m_isinf+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lm $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. @@ -19687,47 +13344,20 @@ return isinf (); return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then +if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_m_isinf=yes else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_lib_m_isinf=no + ac_cv_lib_m_isinf=no fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_m_isinf" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_isinf" >&5 $as_echo "$ac_cv_lib_m_isinf" >&6; } -if test "x$ac_cv_lib_m_isinf" = x""yes; then +if test "x$ac_cv_lib_m_isinf" = x""yes; then : -cat >>confdefs.h <<\_ACEOF -#define HAVE_ISINF /**/ -_ACEOF +$as_echo "#define HAVE_ISINF /**/" >>confdefs.h fi @@ -19805,21 +13435,26 @@ if test "$with_python" != "no" ; then echo Found python in $with_python/bin/python PYTHON="$with_python/bin/python" else - if test -x "$with_python" - then - echo Found python in $with_python - PYTHON="$with_python" - else - if test -x "$PYTHON" - then - echo Found python in environment PYTHON=$PYTHON - with_python=`$PYTHON -c "import sys; print sys.exec_prefix"` - else - # Extract the first word of "python python2.6 python2.5 python2.4 python2.3 python2.2 python2.1 python2.0 python1.6 python1.5", so it can be a program name with args. + if test -x "$with_python/python.exe" + then + echo Found python in $with_python/python.exe + PYTHON="$with_python/python.exe" + else + if test -x "$with_python" + then + echo Found python in $with_python + PYTHON="$with_python" + else + if test -x "$PYTHON" + then + echo Found python in environment PYTHON=$PYTHON + with_python=`$PYTHON -c "import sys; print sys.exec_prefix"` + else + # Extract the first word of "python python2.6 python2.5 python2.4 python2.3 python2.2 python2.1 python2.0 python1.6 python1.5", so it can be a program name with args. set dummy python python2.6 python2.5 python2.4 python2.3 python2.2 python2.1 python2.0 python1.6 python1.5; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_PYTHON+set}" = set; then +if test "${ac_cv_path_PYTHON+set}" = set; then : $as_echo_n "(cached) " >&6 else case $PYTHON in @@ -19832,14 +13467,14 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do + for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_PYTHON="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS ;; @@ -19847,14 +13482,15 @@ esac fi PYTHON=$ac_cv_path_PYTHON if test -n "$PYTHON"; then - { $as_echo "$as_me:$LINENO: result: $PYTHON" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYTHON" >&5 $as_echo "$PYTHON" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi + fi fi fi fi @@ -19881,7 +13517,14 @@ fi PYTHON_INCLUDES=/usr/include/python$PYTHON_VERSION PYTHON_SITE_PACKAGES=$libdir/python$PYTHON_VERSION/site-packages else - echo could not find python$PYTHON_VERSION/Python.h + if test -r $with_python/include/Python.h -a \ + -d $with_python/lib/site-packages + then + PYTHON_INCLUDES=$with_python/include + PYTHON_SITE_PACKAGES=$with_python/lib/site-packages + else + echo could not find python$PYTHON_VERSION/Python.h or $with_python/include/Python.h + fi fi fi if test ! -d "$PYTHON_SITE_PACKAGES" @@ -19925,18 +13568,14 @@ if test "$with_modules" != "no" ; then case "$host" in *-*-cygwin*) MODULE_EXTENSION=".dll" - { $as_echo "$as_me:$LINENO: checking for dlopen in -lcygwin" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lcygwin" >&5 $as_echo_n "checking for dlopen in -lcygwin... " >&6; } -if test "${ac_cv_lib_cygwin_dlopen+set}" = set; then +if test "${ac_cv_lib_cygwin_dlopen+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcygwin $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. @@ -19954,50 +13593,23 @@ return dlopen (); return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then +if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_cygwin_dlopen=yes else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_lib_cygwin_dlopen=no + ac_cv_lib_cygwin_dlopen=no fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_cygwin_dlopen" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_cygwin_dlopen" >&5 $as_echo "$ac_cv_lib_cygwin_dlopen" >&6; } -if test "x$ac_cv_lib_cygwin_dlopen" = x""yes; then +if test "x$ac_cv_lib_cygwin_dlopen" = x""yes; then : WITH_MODULES=1 MODULE_PLATFORM_LIBS= -cat >>confdefs.h <<\_ACEOF -#define HAVE_DLOPEN /**/ -_ACEOF +$as_echo "#define HAVE_DLOPEN /**/" >>confdefs.h fi @@ -20008,107 +13620,19 @@ fi WITH_MODULES=1 ;; *) - { $as_echo "$as_me:$LINENO: checking for shl_load" >&5 -$as_echo_n "checking for shl_load... " >&6; } -if test "${ac_cv_func_shl_load+set}" = set; then - $as_echo_n "(cached) " >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define shl_load to an innocuous variant, in case declares shl_load. - For example, HP-UX 11i declares gettimeofday. */ -#define shl_load innocuous_shl_load - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char shl_load (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef shl_load - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char shl_load (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined __stub_shl_load || defined __stub___shl_load -choke me -#endif - -int -main () -{ -return shl_load (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - ac_cv_func_shl_load=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_func_shl_load=no -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5 -$as_echo "$ac_cv_func_shl_load" >&6; } -if test "x$ac_cv_func_shl_load" = x""yes; then + ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" +if test "x$ac_cv_func_shl_load" = x""yes; then : libxml_have_shl_load=yes else - { $as_echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 $as_echo_n "checking for shl_load in -ldld... " >&6; } -if test "${ac_cv_lib_dld_shl_load+set}" = set; then +if test "${ac_cv_lib_dld_shl_load+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. @@ -20126,149 +13650,36 @@ return shl_load (); return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then +if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_shl_load=yes else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_lib_dld_shl_load=no + ac_cv_lib_dld_shl_load=no fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 $as_echo "$ac_cv_lib_dld_shl_load" >&6; } -if test "x$ac_cv_lib_dld_shl_load" = x""yes; then +if test "x$ac_cv_lib_dld_shl_load" = x""yes; then : MODULE_PLATFORM_LIBS="-ldld" libxml_have_shl_load=yes else - { $as_echo "$as_me:$LINENO: checking for dlopen" >&5 -$as_echo_n "checking for dlopen... " >&6; } -if test "${ac_cv_func_dlopen+set}" = set; then - $as_echo_n "(cached) " >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define dlopen to an innocuous variant, in case declares dlopen. - For example, HP-UX 11i declares gettimeofday. */ -#define dlopen innocuous_dlopen - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char dlopen (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef dlopen - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char dlopen (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined __stub_dlopen || defined __stub___dlopen -choke me -#endif - -int -main () -{ -return dlopen (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - ac_cv_func_dlopen=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_func_dlopen=no -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5 -$as_echo "$ac_cv_func_dlopen" >&6; } -if test "x$ac_cv_func_dlopen" = x""yes; then + ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" +if test "x$ac_cv_func_dlopen" = x""yes; then : libxml_have_dlopen=yes else - { $as_echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } -if test "${ac_cv_lib_dl_dlopen+set}" = set; then +if test "${ac_cv_lib_dl_dlopen+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. @@ -20286,43 +13697,18 @@ return dlopen (); return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then +if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_lib_dl_dlopen=no + ac_cv_lib_dl_dlopen=no fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } -if test "x$ac_cv_lib_dl_dlopen" = x""yes; then +if test "x$ac_cv_lib_dl_dlopen" = x""yes; then : MODULE_PLATFORM_LIBS="-ldl" libxml_have_dlopen=yes @@ -20339,9 +13725,7 @@ fi MODULE_EXTENSION=".sl" WITH_MODULES=1 -cat >>confdefs.h <<\_ACEOF -#define HAVE_SHLLOAD /**/ -_ACEOF +$as_echo "#define HAVE_SHLLOAD /**/" >>confdefs.h fi @@ -20357,9 +13741,7 @@ _ACEOF WITH_MODULES=1 -cat >>confdefs.h <<\_ACEOF -#define HAVE_DLOPEN /**/ -_ACEOF +$as_echo "#define HAVE_DLOPEN /**/" >>confdefs.h fi ;; @@ -20431,146 +13813,16 @@ if test "$with_threads" = "no" ; then else echo Enabling multithreaded support if test "$with_threads" = "pthread" || test "$with_threads" = "" || test "$with_threads" = "yes" ; then - if test "${ac_cv_header_pthread_h+set}" = set; then - { $as_echo "$as_me:$LINENO: checking for pthread.h" >&5 -$as_echo_n "checking for pthread.h... " >&6; } -if test "${ac_cv_header_pthread_h+set}" = set; then - $as_echo_n "(cached) " >&6 -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_pthread_h" >&5 -$as_echo "$ac_cv_header_pthread_h" >&6; } -else - # Is the header compilable? -{ $as_echo "$as_me:$LINENO: checking pthread.h usability" >&5 -$as_echo_n "checking pthread.h usability... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_header_compiler=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_compiler=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -$as_echo "$ac_header_compiler" >&6; } - -# Is the header present? -{ $as_echo "$as_me:$LINENO: checking pthread.h presence" >&5 -$as_echo_n "checking pthread.h presence... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - ac_header_preproc=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi - -rm -f conftest.err conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -$as_echo "$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { $as_echo "$as_me:$LINENO: WARNING: pthread.h: accepted by the compiler, rejected by the preprocessor!" >&5 -$as_echo "$as_me: WARNING: pthread.h: accepted by the compiler, rejected by the preprocessor!" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: pthread.h: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: pthread.h: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { $as_echo "$as_me:$LINENO: WARNING: pthread.h: present but cannot be compiled" >&5 -$as_echo "$as_me: WARNING: pthread.h: present but cannot be compiled" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: pthread.h: check for missing prerequisite headers?" >&5 -$as_echo "$as_me: WARNING: pthread.h: check for missing prerequisite headers?" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: pthread.h: see the Autoconf documentation" >&5 -$as_echo "$as_me: WARNING: pthread.h: see the Autoconf documentation" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: pthread.h: section \"Present But Cannot Be Compiled\"" >&5 -$as_echo "$as_me: WARNING: pthread.h: section \"Present But Cannot Be Compiled\"" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: pthread.h: proceeding with the preprocessor's result" >&5 -$as_echo "$as_me: WARNING: pthread.h: proceeding with the preprocessor's result" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: pthread.h: in the future, the compiler will take precedence" >&5 -$as_echo "$as_me: WARNING: pthread.h: in the future, the compiler will take precedence" >&2;} - - ;; -esac -{ $as_echo "$as_me:$LINENO: checking for pthread.h" >&5 -$as_echo_n "checking for pthread.h... " >&6; } -if test "${ac_cv_header_pthread_h+set}" = set; then - $as_echo_n "(cached) " >&6 -else - ac_cv_header_pthread_h=$ac_header_preproc -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_pthread_h" >&5 -$as_echo "$ac_cv_header_pthread_h" >&6; } - -fi -if test "x$ac_cv_header_pthread_h" = x""yes; then - { $as_echo "$as_me:$LINENO: checking for pthread_join in -lpthread" >&5 + ac_fn_c_check_header_mongrel "$LINENO" "pthread.h" "ac_cv_header_pthread_h" "$ac_includes_default" +if test "x$ac_cv_header_pthread_h" = x""yes; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_join in -lpthread" >&5 $as_echo_n "checking for pthread_join in -lpthread... " >&6; } -if test "${ac_cv_lib_pthread_pthread_join+set}" = set; then +if test "${ac_cv_lib_pthread_pthread_join+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpthread $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. @@ -20588,54 +13840,25 @@ return pthread_join (); return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then +if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_pthread_pthread_join=yes else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_lib_pthread_pthread_join=no + ac_cv_lib_pthread_pthread_join=no fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_pthread_pthread_join" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_join" >&5 $as_echo "$ac_cv_lib_pthread_pthread_join" >&6; } -if test "x$ac_cv_lib_pthread_pthread_join" = x""yes; then +if test "x$ac_cv_lib_pthread_pthread_join" = x""yes; then : THREAD_LIBS="-lpthread" -cat >>confdefs.h <<\_ACEOF -#define HAVE_LIBPTHREAD /**/ -_ACEOF +$as_echo "#define HAVE_LIBPTHREAD /**/" >>confdefs.h -cat >>confdefs.h <<\_ACEOF -#define HAVE_PTHREAD_H /**/ -_ACEOF +$as_echo "#define HAVE_PTHREAD_H /**/" >>confdefs.h WITH_THREADS="1" fi @@ -20700,18 +13923,14 @@ if test "$with_history" = "yes" ; then unset tcap for termlib in ncurses curses termcap terminfo termlib; do as_ac_Lib=`$as_echo "ac_cv_lib_${termlib}''_tputs" | $as_tr_sh` -{ $as_echo "$as_me:$LINENO: checking for tputs in -l${termlib}" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for tputs in -l${termlib}" >&5 $as_echo_n "checking for tputs in -l${termlib}... " >&6; } -if { as_var=$as_ac_Lib; eval "test \"\${$as_var+set}\" = set"; }; then +if eval "test \"\${$as_ac_Lib+set}\"" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l${termlib} $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. @@ -20729,193 +13948,35 @@ return tputs (); return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then +if ac_fn_c_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - eval "$as_ac_Lib=no" + eval "$as_ac_Lib=no" fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -ac_res=`eval 'as_val=${'$as_ac_Lib'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +eval ac_res=\$$as_ac_Lib + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } -as_val=`eval 'as_val=${'$as_ac_Lib'} - $as_echo "$as_val"'` - if test "x$as_val" = x""yes; then +if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : tcap="-l$termlib" fi test -n "$tcap" && break done - if test "${ac_cv_header_readline_history_h+set}" = set; then - { $as_echo "$as_me:$LINENO: checking for readline/history.h" >&5 -$as_echo_n "checking for readline/history.h... " >&6; } -if test "${ac_cv_header_readline_history_h+set}" = set; then - $as_echo_n "(cached) " >&6 -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_readline_history_h" >&5 -$as_echo "$ac_cv_header_readline_history_h" >&6; } -else - # Is the header compilable? -{ $as_echo "$as_me:$LINENO: checking readline/history.h usability" >&5 -$as_echo_n "checking readline/history.h usability... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_header_compiler=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_compiler=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -$as_echo "$ac_header_compiler" >&6; } - -# Is the header present? -{ $as_echo "$as_me:$LINENO: checking readline/history.h presence" >&5 -$as_echo_n "checking readline/history.h presence... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - ac_header_preproc=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi - -rm -f conftest.err conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -$as_echo "$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { $as_echo "$as_me:$LINENO: WARNING: readline/history.h: accepted by the compiler, rejected by the preprocessor!" >&5 -$as_echo "$as_me: WARNING: readline/history.h: accepted by the compiler, rejected by the preprocessor!" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: readline/history.h: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: readline/history.h: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { $as_echo "$as_me:$LINENO: WARNING: readline/history.h: present but cannot be compiled" >&5 -$as_echo "$as_me: WARNING: readline/history.h: present but cannot be compiled" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: readline/history.h: check for missing prerequisite headers?" >&5 -$as_echo "$as_me: WARNING: readline/history.h: check for missing prerequisite headers?" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: readline/history.h: see the Autoconf documentation" >&5 -$as_echo "$as_me: WARNING: readline/history.h: see the Autoconf documentation" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: readline/history.h: section \"Present But Cannot Be Compiled\"" >&5 -$as_echo "$as_me: WARNING: readline/history.h: section \"Present But Cannot Be Compiled\"" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: readline/history.h: proceeding with the preprocessor's result" >&5 -$as_echo "$as_me: WARNING: readline/history.h: proceeding with the preprocessor's result" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: readline/history.h: in the future, the compiler will take precedence" >&5 -$as_echo "$as_me: WARNING: readline/history.h: in the future, the compiler will take precedence" >&2;} - - ;; -esac -{ $as_echo "$as_me:$LINENO: checking for readline/history.h" >&5 -$as_echo_n "checking for readline/history.h... " >&6; } -if test "${ac_cv_header_readline_history_h+set}" = set; then - $as_echo_n "(cached) " >&6 -else - ac_cv_header_readline_history_h=$ac_header_preproc -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_readline_history_h" >&5 -$as_echo "$ac_cv_header_readline_history_h" >&6; } - -fi -if test "x$ac_cv_header_readline_history_h" = x""yes; then - { $as_echo "$as_me:$LINENO: checking for append_history in -lhistory" >&5 + ac_fn_c_check_header_mongrel "$LINENO" "readline/history.h" "ac_cv_header_readline_history_h" "$ac_includes_default" +if test "x$ac_cv_header_readline_history_h" = x""yes; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for append_history in -lhistory" >&5 $as_echo_n "checking for append_history in -lhistory... " >&6; } -if test "${ac_cv_lib_history_append_history+set}" = set; then +if test "${ac_cv_lib_history_append_history+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lhistory $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. @@ -20933,195 +13994,38 @@ return append_history (); return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then +if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_history_append_history=yes else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_lib_history_append_history=no + ac_cv_lib_history_append_history=no fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_history_append_history" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_history_append_history" >&5 $as_echo "$ac_cv_lib_history_append_history" >&6; } -if test "x$ac_cv_lib_history_append_history" = x""yes; then +if test "x$ac_cv_lib_history_append_history" = x""yes; then : RDL_LIBS="-lhistory" -cat >>confdefs.h <<\_ACEOF -#define HAVE_LIBHISTORY /**/ -_ACEOF +$as_echo "#define HAVE_LIBHISTORY /**/" >>confdefs.h fi fi - if test "${ac_cv_header_readline_readline_h+set}" = set; then - { $as_echo "$as_me:$LINENO: checking for readline/readline.h" >&5 -$as_echo_n "checking for readline/readline.h... " >&6; } -if test "${ac_cv_header_readline_readline_h+set}" = set; then - $as_echo_n "(cached) " >&6 -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_readline_readline_h" >&5 -$as_echo "$ac_cv_header_readline_readline_h" >&6; } -else - # Is the header compilable? -{ $as_echo "$as_me:$LINENO: checking readline/readline.h usability" >&5 -$as_echo_n "checking readline/readline.h usability... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_header_compiler=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_compiler=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -$as_echo "$ac_header_compiler" >&6; } - -# Is the header present? -{ $as_echo "$as_me:$LINENO: checking readline/readline.h presence" >&5 -$as_echo_n "checking readline/readline.h presence... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - ac_header_preproc=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi - -rm -f conftest.err conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -$as_echo "$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { $as_echo "$as_me:$LINENO: WARNING: readline/readline.h: accepted by the compiler, rejected by the preprocessor!" >&5 -$as_echo "$as_me: WARNING: readline/readline.h: accepted by the compiler, rejected by the preprocessor!" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: readline/readline.h: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: readline/readline.h: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { $as_echo "$as_me:$LINENO: WARNING: readline/readline.h: present but cannot be compiled" >&5 -$as_echo "$as_me: WARNING: readline/readline.h: present but cannot be compiled" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: readline/readline.h: check for missing prerequisite headers?" >&5 -$as_echo "$as_me: WARNING: readline/readline.h: check for missing prerequisite headers?" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: readline/readline.h: see the Autoconf documentation" >&5 -$as_echo "$as_me: WARNING: readline/readline.h: see the Autoconf documentation" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: readline/readline.h: section \"Present But Cannot Be Compiled\"" >&5 -$as_echo "$as_me: WARNING: readline/readline.h: section \"Present But Cannot Be Compiled\"" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: readline/readline.h: proceeding with the preprocessor's result" >&5 -$as_echo "$as_me: WARNING: readline/readline.h: proceeding with the preprocessor's result" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: readline/readline.h: in the future, the compiler will take precedence" >&5 -$as_echo "$as_me: WARNING: readline/readline.h: in the future, the compiler will take precedence" >&2;} - - ;; -esac -{ $as_echo "$as_me:$LINENO: checking for readline/readline.h" >&5 -$as_echo_n "checking for readline/readline.h... " >&6; } -if test "${ac_cv_header_readline_readline_h+set}" = set; then - $as_echo_n "(cached) " >&6 -else - ac_cv_header_readline_readline_h=$ac_header_preproc -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_readline_readline_h" >&5 -$as_echo "$ac_cv_header_readline_readline_h" >&6; } - -fi -if test "x$ac_cv_header_readline_readline_h" = x""yes; then - { $as_echo "$as_me:$LINENO: checking for readline in -lreadline" >&5 + ac_fn_c_check_header_mongrel "$LINENO" "readline/readline.h" "ac_cv_header_readline_readline_h" "$ac_includes_default" +if test "x$ac_cv_header_readline_readline_h" = x""yes; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for readline in -lreadline" >&5 $as_echo_n "checking for readline in -lreadline... " >&6; } -if test "${ac_cv_lib_readline_readline+set}" = set; then +if test "${ac_cv_lib_readline_readline+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lreadline $tcap $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. @@ -21139,49 +14043,22 @@ return readline (); return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then +if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_readline_readline=yes else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_lib_readline_readline=no + ac_cv_lib_readline_readline=no fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_readline_readline" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_readline_readline" >&5 $as_echo "$ac_cv_lib_readline_readline" >&6; } -if test "x$ac_cv_lib_readline_readline" = x""yes; then +if test "x$ac_cv_lib_readline_readline" = x""yes; then : RDL_LIBS="-lreadline $RDL_LIBS $tcap" -cat >>confdefs.h <<\_ACEOF -#define HAVE_LIBREADLINE /**/ -_ACEOF +$as_echo "#define HAVE_LIBREADLINE /**/" >>confdefs.h fi @@ -21447,141 +14324,11 @@ else ICONV_LIBS="-L$with_iconv/lib" fi - if test "${ac_cv_header_iconv_h+set}" = set; then - { $as_echo "$as_me:$LINENO: checking for iconv.h" >&5 -$as_echo_n "checking for iconv.h... " >&6; } -if test "${ac_cv_header_iconv_h+set}" = set; then - $as_echo_n "(cached) " >&6 -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_iconv_h" >&5 -$as_echo "$ac_cv_header_iconv_h" >&6; } -else - # Is the header compilable? -{ $as_echo "$as_me:$LINENO: checking iconv.h usability" >&5 -$as_echo_n "checking iconv.h usability... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_header_compiler=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_compiler=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -$as_echo "$ac_header_compiler" >&6; } - -# Is the header present? -{ $as_echo "$as_me:$LINENO: checking iconv.h presence" >&5 -$as_echo_n "checking iconv.h presence... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - ac_header_preproc=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi - -rm -f conftest.err conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -$as_echo "$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { $as_echo "$as_me:$LINENO: WARNING: iconv.h: accepted by the compiler, rejected by the preprocessor!" >&5 -$as_echo "$as_me: WARNING: iconv.h: accepted by the compiler, rejected by the preprocessor!" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: iconv.h: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: iconv.h: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { $as_echo "$as_me:$LINENO: WARNING: iconv.h: present but cannot be compiled" >&5 -$as_echo "$as_me: WARNING: iconv.h: present but cannot be compiled" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: iconv.h: check for missing prerequisite headers?" >&5 -$as_echo "$as_me: WARNING: iconv.h: check for missing prerequisite headers?" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: iconv.h: see the Autoconf documentation" >&5 -$as_echo "$as_me: WARNING: iconv.h: see the Autoconf documentation" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: iconv.h: section \"Present But Cannot Be Compiled\"" >&5 -$as_echo "$as_me: WARNING: iconv.h: section \"Present But Cannot Be Compiled\"" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: iconv.h: proceeding with the preprocessor's result" >&5 -$as_echo "$as_me: WARNING: iconv.h: proceeding with the preprocessor's result" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: iconv.h: in the future, the compiler will take precedence" >&5 -$as_echo "$as_me: WARNING: iconv.h: in the future, the compiler will take precedence" >&2;} - - ;; -esac -{ $as_echo "$as_me:$LINENO: checking for iconv.h" >&5 -$as_echo_n "checking for iconv.h... " >&6; } -if test "${ac_cv_header_iconv_h+set}" = set; then - $as_echo_n "(cached) " >&6 -else - ac_cv_header_iconv_h=$ac_header_preproc -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_iconv_h" >&5 -$as_echo "$ac_cv_header_iconv_h" >&6; } - -fi -if test "x$ac_cv_header_iconv_h" = x""yes; then - { $as_echo "$as_me:$LINENO: checking for iconv" >&5 + ac_fn_c_check_header_mongrel "$LINENO" "iconv.h" "ac_cv_header_iconv_h" "$ac_includes_default" +if test "x$ac_cv_header_iconv_h" = x""yes; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for iconv" >&5 $as_echo_n "checking for iconv... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include @@ -21595,39 +14342,16 @@ iconv (cd, NULL, NULL, NULL, NULL); return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then +if ac_fn_c_try_link "$LINENO"; then : - { $as_echo "$as_me:$LINENO: result: yes" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } WITH_ICONV=1 else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } - { $as_echo "$as_me:$LINENO: checking for iconv in -liconv" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for iconv in -liconv" >&5 $as_echo_n "checking for iconv in -liconv... " >&6; } _ldflags="${LDFLAGS}" @@ -21635,11 +14359,7 @@ $as_echo_n "checking for iconv in -liconv... " >&6; } LDFLAGS="${LDFLAGS} ${ICONV_LIBS}" LIBS="${LIBS} -liconv" - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include @@ -21653,69 +14373,38 @@ iconv (cd, NULL, NULL, NULL, NULL); return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then +if ac_fn_c_try_link "$LINENO"; then : - { $as_echo "$as_me:$LINENO: result: yes" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } WITH_ICONV=1 ICONV_LIBS="${ICONV_LIBS} -liconv" LIBS="${_libs}" LDFLAGS="${_ldflags}" else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } LIBS="${_libs}" LDFLAGS="${_ldflags}" fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext fi if test "$WITH_ICONV" = "1" ; then - { $as_echo "$as_me:$LINENO: checking for iconv declaration" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for iconv declaration" >&5 $as_echo_n "checking for iconv declaration... " >&6; } - if test "${xml_cv_iconv_arg2+set}" = set; then + if test "${xml_cv_iconv_arg2+set}" = set; then : $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include @@ -21737,38 +14426,17 @@ main () return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then +if ac_fn_c_try_compile "$LINENO"; then : xml_cv_iconv_arg2="" else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xml_cv_iconv_arg2="const" + xml_cv_iconv_arg2="const" fi - rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi xml_cv_iconv_decl="extern size_t iconv (iconv_t cd, $xml_cv_iconv_arg2 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);" - { $as_echo "$as_me:$LINENO: result: ${xml_xxx:- + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${xml_xxx:- }$xml_cv_iconv_decl" >&5 $as_echo "${xml_xxx:- }$xml_cv_iconv_decl" >&6; } @@ -21793,6 +14461,23 @@ XML_LIBS="-lxml2 $Z_LIBS $THREAD_LIBS $ICONV_LIBS $M_LIBS $LIBS" XML_LIBTOOLLIBS="libxml2.la" +WITH_ICU=0 +if test "$with_icu" != "yes" ; then + echo Disabling ICU support +else + ICU_CONFIG=icu-config + if ${ICU_CONFIG} --cflags >/dev/null 2>&1 + then + ICU_LIBS=`icu-config --ldflags` + LDFLAGS="$LDFLAGS $ICU_LIBS" + WITH_ICU=1 + echo Enabling ICU support + else + as_fn_error $? "libicu config program icu-config not found" "$LINENO" 5 + fi +fi + + WITH_ISO8859X=1 if test "$WITH_ICONV" != "1" ; then if test "$with_iso8859x" = "no" ; then @@ -21882,26 +14567,25 @@ WIN32_EXTRA_LIBADD= WIN32_EXTRA_LDFLAGS= CYGWIN_EXTRA_LDFLAGS= CYGWIN_EXTRA_PYTHON_LIBADD= +WIN32_EXTRA_PYTHON_LIBADD= case "$host" in *-*-mingw*) CPPFLAGS="$CPPFLAGS -DWIN32" WIN32_EXTRA_LIBADD="-lws2_32" WIN32_EXTRA_LDFLAGS="-no-undefined" -cat >>confdefs.h <<\_ACEOF -#define _WINSOCKAPI_ 1 -_ACEOF +$as_echo "#define _WINSOCKAPI_ 1" >>confdefs.h -cat >>confdefs.h <<\_ACEOF -#define snprintf _snprintf -_ACEOF +$as_echo "#define snprintf _snprintf" >>confdefs.h -cat >>confdefs.h <<\_ACEOF -#define vsnprintf _vsnprintf -_ACEOF +$as_echo "#define vsnprintf _vsnprintf" >>confdefs.h + if test "${PYTHON}" != "" + then + WIN32_EXTRA_PYTHON_LIBADD="-L${pythondir}/../../libs -lpython${PYTHON_VERSION//./}" + fi ;; *-*-cygwin*) CYGWIN_EXTRA_LDFLAGS="-no-undefined" @@ -21916,6 +14600,7 @@ esac + if test "$with_coverage" = "yes" -a "${GCC}" = "yes" then echo Enabling code coverage for GCC @@ -21983,13 +14668,13 @@ _ACEOF case $ac_val in #( *${as_nl}*) case $ac_var in #( - *_cv_*) { $as_echo "$as_me:$LINENO: WARNING: cache variable $ac_var contains a newline" >&5 + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( - *) $as_unset $ac_var ;; + *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done @@ -21997,8 +14682,8 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) - # `set' does not quote correctly, so add quotes (double-quote - # substitution turns \\\\ into \\, and sed turns \\ into \). + # `set' does not quote correctly, so add quotes: double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" @@ -22021,11 +14706,11 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then test "x$cache_file" != "x/dev/null" && - { $as_echo "$as_me:$LINENO: updating cache $cache_file" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} cat confcache >$cache_file else - { $as_echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi @@ -22045,8 +14730,8 @@ for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. - ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext" - ac_ltlibobjs="$ac_ltlibobjs \${LIBOBJDIR}$ac_i"'$U.lo' + as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" + as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs @@ -22062,55 +14747,38 @@ else fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then - { { $as_echo "$as_me:$LINENO: error: conditional \"AMDEP\" was never defined. -Usually this means the macro was only invoked conditionally." >&5 -$as_echo "$as_me: error: conditional \"AMDEP\" was never defined. -Usually this means the macro was only invoked conditionally." >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then - { { $as_echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined. -Usually this means the macro was only invoked conditionally." >&5 -$as_echo "$as_me: error: conditional \"am__fastdepCC\" was never defined. -Usually this means the macro was only invoked conditionally." >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_VERSION_SCRIPT_TRUE}" && test -z "${USE_VERSION_SCRIPT_FALSE}"; then - { { $as_echo "$as_me:$LINENO: error: conditional \"USE_VERSION_SCRIPT\" was never defined. -Usually this means the macro was only invoked conditionally." >&5 -$as_echo "$as_me: error: conditional \"USE_VERSION_SCRIPT\" was never defined. -Usually this means the macro was only invoked conditionally." >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "conditional \"USE_VERSION_SCRIPT\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${REBUILD_DOCS_TRUE}" && test -z "${REBUILD_DOCS_FALSE}"; then - { { $as_echo "$as_me:$LINENO: error: conditional \"REBUILD_DOCS\" was never defined. -Usually this means the macro was only invoked conditionally." >&5 -$as_echo "$as_me: error: conditional \"REBUILD_DOCS\" was never defined. -Usually this means the macro was only invoked conditionally." >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "conditional \"REBUILD_DOCS\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${WITH_PYTHON_TRUE}" && test -z "${WITH_PYTHON_FALSE}"; then - { { $as_echo "$as_me:$LINENO: error: conditional \"WITH_PYTHON\" was never defined. -Usually this means the macro was only invoked conditionally." >&5 -$as_echo "$as_me: error: conditional \"WITH_PYTHON\" was never defined. -Usually this means the macro was only invoked conditionally." >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "conditional \"WITH_PYTHON\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${WITH_TRIO_SOURCES_TRUE}" && test -z "${WITH_TRIO_SOURCES_FALSE}"; then - { { $as_echo "$as_me:$LINENO: error: conditional \"WITH_TRIO_SOURCES\" was never defined. -Usually this means the macro was only invoked conditionally." >&5 -$as_echo "$as_me: error: conditional \"WITH_TRIO_SOURCES\" was never defined. -Usually this means the macro was only invoked conditionally." >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "conditional \"WITH_TRIO_SOURCES\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : ${CONFIG_STATUS=./config.status} ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" -{ $as_echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} -cat >$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +as_write_fail=0 +cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. @@ -22120,17 +14788,18 @@ cat >$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 debug=false ac_cs_recheck=false ac_cs_silent=false -SHELL=\${CONFIG_SHELL-$SHELL} -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -## --------------------- ## -## M4sh Initialization. ## -## --------------------- ## +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which @@ -22138,23 +14807,15 @@ if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else - case `(set -o) 2>/dev/null` in - *posix*) set -o posix ;; + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; esac - fi - - -# PATH needs CR -# Avoid depending upon Character Ranges. -as_cr_letters='abcdefghijklmnopqrstuvwxyz' -as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' -as_cr_Letters=$as_cr_letters$as_cr_LETTERS -as_cr_digits='0123456789' -as_cr_alnum=$as_cr_Letters$as_cr_digits - as_nl=' ' export as_nl @@ -22162,7 +14823,13 @@ export as_nl as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo -if (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else @@ -22173,7 +14840,7 @@ else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; - case $arg in + case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; @@ -22196,13 +14863,6 @@ if test "${PATH_SEPARATOR+set}" != set; then } fi -# Support unset when possible. -if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then - as_unset=unset -else - as_unset=false -fi - # IFS # We need space, tab and new line, in precisely that order. Quoting is @@ -22212,15 +14872,15 @@ fi IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. -case $0 in +case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break -done + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done IFS=$as_save_IFS ;; @@ -22232,12 +14892,16 @@ if test "x$as_myself" = x; then fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 - { (exit 1); exit 1; } + exit 1 fi -# Work around bugs in pre-3.0 UWIN ksh. -for as_var in ENV MAIL MAILPATH -do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' @@ -22249,7 +14913,89 @@ export LC_ALL LANGUAGE=C export LANGUAGE -# Required to use basename. +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr @@ -22263,8 +15009,12 @@ else as_basename=false fi +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi -# Name of the executable. as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ @@ -22284,76 +15034,25 @@ $as_echo X/"$0" | } s/.*/./; q'` -# CDPATH. -$as_unset CDPATH - - - - as_lineno_1=$LINENO - as_lineno_2=$LINENO - test "x$as_lineno_1" != "x$as_lineno_2" && - test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { - - # Create $as_me.lineno as a copy of $as_myself, but with $LINENO - # uniformly replaced by the line number. The first 'sed' inserts a - # line-number line after each line using $LINENO; the second 'sed' - # does the real work. The second script uses 'N' to pair each - # line-number line with the line containing $LINENO, and appends - # trailing '-' during substitution so that $LINENO is not a special - # case at line end. - # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the - # scripts with optimization help from Paolo Bonzini. Blame Lee - # E. McMahon (1931-1989) for sed's syntax. :-) - sed -n ' - p - /[$]LINENO/= - ' <$as_myself | - sed ' - s/[$]LINENO.*/&-/ - t lineno - b - :lineno - N - :loop - s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ - t loop - s/-\n.*// - ' >$as_me.lineno && - chmod +x "$as_me.lineno" || - { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 - { (exit 1); exit 1; }; } - - # Don't try to exec as it changes $[0], causing all sort of problems - # (the dirname of $[0] is not the place where we might find the - # original and so on. Autoconf is especially sensitive to this). - . "./$as_me.lineno" - # Exit status is that of the last command. - exit -} - - -if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then - as_dirname=dirname -else - as_dirname=false -fi +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= -case `echo -n x` in +case `echo -n x` in #((((( -n*) - case `echo 'x\c'` in + case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. - *) ECHO_C='\c';; + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac -if expr a : '\(a\)' >/dev/null 2>&1 && - test "X`expr 00001 : '.*\(...\)'`" = X001; then - as_expr=expr -else - as_expr=false -fi rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then @@ -22382,8 +15081,56 @@ fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then - as_mkdir_p=: + as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false @@ -22402,10 +15149,10 @@ else if test -d "$1"; then test -d "$1/."; else - case $1 in + case $1 in #( -*)set "./$1";; esac; - case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( ???[sx]*):;;*)false;;esac;fi '\'' sh ' @@ -22420,13 +15167,19 @@ as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 +## ----------------------------------- ## +## Main body of $CONFIG_STATUS script. ## +## ----------------------------------- ## +_ASEOF +test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 -# Save the log message, to keep $[0] and so on meaningful, and to +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by $as_me, which was -generated by GNU Autoconf 2.63. Invocation command line was +generated by GNU Autoconf 2.66. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS @@ -22458,13 +15211,15 @@ _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ -\`$as_me' instantiates files from templates according to the -current configuration. +\`$as_me' instantiates files and other configuration actions +from templates according to the current configuration. Unless the files +and actions are specified as TAGs, all are instantiated by default. -Usage: $0 [OPTION]... [FILE]... +Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit + --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files @@ -22483,16 +15238,17 @@ $config_headers Configuration commands: $config_commands -Report bugs to ." +Report bugs to the package provider." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ config.status -configured by $0, generated by GNU Autoconf 2.63, - with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" +configured by $0, generated by GNU Autoconf 2.66, + with options \\"\$ac_cs_config\\" -Copyright (C) 2008 Free Software Foundation, Inc. +Copyright (C) 2010 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." @@ -22528,6 +15284,8 @@ do ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; + --config | --confi | --conf | --con | --co | --c ) + $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) @@ -22535,20 +15293,19 @@ do case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac - CONFIG_FILES="$CONFIG_FILES '$ac_optarg'" + as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac - CONFIG_HEADERS="$CONFIG_HEADERS '$ac_optarg'" + as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header - { $as_echo "$as_me: error: ambiguous option: $1 -Try \`$0 --help' for more information." >&2 - { (exit 1); exit 1; }; };; + as_fn_error $? "ambiguous option: \`$1' +Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ @@ -22556,11 +15313,10 @@ Try \`$0 --help' for more information." >&2 ac_cs_silent=: ;; # This is an error. - -*) { $as_echo "$as_me: error: unrecognized option: $1 -Try \`$0 --help' for more information." >&2 - { (exit 1); exit 1; }; } ;; + -*) as_fn_error $? "unrecognized option: \`$1' +Try \`$0 --help' for more information." ;; - *) ac_config_targets="$ac_config_targets $1" + *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac @@ -22611,133 +15367,148 @@ AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' -AS='`$ECHO "X$AS" | $Xsed -e "$delay_single_quote_subst"`' -DLLTOOL='`$ECHO "X$DLLTOOL" | $Xsed -e "$delay_single_quote_subst"`' -OBJDUMP='`$ECHO "X$OBJDUMP" | $Xsed -e "$delay_single_quote_subst"`' -macro_version='`$ECHO "X$macro_version" | $Xsed -e "$delay_single_quote_subst"`' -macro_revision='`$ECHO "X$macro_revision" | $Xsed -e "$delay_single_quote_subst"`' -enable_shared='`$ECHO "X$enable_shared" | $Xsed -e "$delay_single_quote_subst"`' -enable_static='`$ECHO "X$enable_static" | $Xsed -e "$delay_single_quote_subst"`' -pic_mode='`$ECHO "X$pic_mode" | $Xsed -e "$delay_single_quote_subst"`' -enable_fast_install='`$ECHO "X$enable_fast_install" | $Xsed -e "$delay_single_quote_subst"`' -host_alias='`$ECHO "X$host_alias" | $Xsed -e "$delay_single_quote_subst"`' -host='`$ECHO "X$host" | $Xsed -e "$delay_single_quote_subst"`' -host_os='`$ECHO "X$host_os" | $Xsed -e "$delay_single_quote_subst"`' -build_alias='`$ECHO "X$build_alias" | $Xsed -e "$delay_single_quote_subst"`' -build='`$ECHO "X$build" | $Xsed -e "$delay_single_quote_subst"`' -build_os='`$ECHO "X$build_os" | $Xsed -e "$delay_single_quote_subst"`' -SED='`$ECHO "X$SED" | $Xsed -e "$delay_single_quote_subst"`' -Xsed='`$ECHO "X$Xsed" | $Xsed -e "$delay_single_quote_subst"`' -GREP='`$ECHO "X$GREP" | $Xsed -e "$delay_single_quote_subst"`' -EGREP='`$ECHO "X$EGREP" | $Xsed -e "$delay_single_quote_subst"`' -FGREP='`$ECHO "X$FGREP" | $Xsed -e "$delay_single_quote_subst"`' -LD='`$ECHO "X$LD" | $Xsed -e "$delay_single_quote_subst"`' -NM='`$ECHO "X$NM" | $Xsed -e "$delay_single_quote_subst"`' -LN_S='`$ECHO "X$LN_S" | $Xsed -e "$delay_single_quote_subst"`' -max_cmd_len='`$ECHO "X$max_cmd_len" | $Xsed -e "$delay_single_quote_subst"`' -ac_objext='`$ECHO "X$ac_objext" | $Xsed -e "$delay_single_quote_subst"`' -exeext='`$ECHO "X$exeext" | $Xsed -e "$delay_single_quote_subst"`' -lt_unset='`$ECHO "X$lt_unset" | $Xsed -e "$delay_single_quote_subst"`' -lt_SP2NL='`$ECHO "X$lt_SP2NL" | $Xsed -e "$delay_single_quote_subst"`' -lt_NL2SP='`$ECHO "X$lt_NL2SP" | $Xsed -e "$delay_single_quote_subst"`' -reload_flag='`$ECHO "X$reload_flag" | $Xsed -e "$delay_single_quote_subst"`' -reload_cmds='`$ECHO "X$reload_cmds" | $Xsed -e "$delay_single_quote_subst"`' -deplibs_check_method='`$ECHO "X$deplibs_check_method" | $Xsed -e "$delay_single_quote_subst"`' -file_magic_cmd='`$ECHO "X$file_magic_cmd" | $Xsed -e "$delay_single_quote_subst"`' -AR='`$ECHO "X$AR" | $Xsed -e "$delay_single_quote_subst"`' -AR_FLAGS='`$ECHO "X$AR_FLAGS" | $Xsed -e "$delay_single_quote_subst"`' -STRIP='`$ECHO "X$STRIP" | $Xsed -e "$delay_single_quote_subst"`' -RANLIB='`$ECHO "X$RANLIB" | $Xsed -e "$delay_single_quote_subst"`' -old_postinstall_cmds='`$ECHO "X$old_postinstall_cmds" | $Xsed -e "$delay_single_quote_subst"`' -old_postuninstall_cmds='`$ECHO "X$old_postuninstall_cmds" | $Xsed -e "$delay_single_quote_subst"`' -old_archive_cmds='`$ECHO "X$old_archive_cmds" | $Xsed -e "$delay_single_quote_subst"`' -CC='`$ECHO "X$CC" | $Xsed -e "$delay_single_quote_subst"`' -CFLAGS='`$ECHO "X$CFLAGS" | $Xsed -e "$delay_single_quote_subst"`' -compiler='`$ECHO "X$compiler" | $Xsed -e "$delay_single_quote_subst"`' -GCC='`$ECHO "X$GCC" | $Xsed -e "$delay_single_quote_subst"`' -lt_cv_sys_global_symbol_pipe='`$ECHO "X$lt_cv_sys_global_symbol_pipe" | $Xsed -e "$delay_single_quote_subst"`' -lt_cv_sys_global_symbol_to_cdecl='`$ECHO "X$lt_cv_sys_global_symbol_to_cdecl" | $Xsed -e "$delay_single_quote_subst"`' -lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "X$lt_cv_sys_global_symbol_to_c_name_address" | $Xsed -e "$delay_single_quote_subst"`' -lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "X$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $Xsed -e "$delay_single_quote_subst"`' -objdir='`$ECHO "X$objdir" | $Xsed -e "$delay_single_quote_subst"`' -SHELL='`$ECHO "X$SHELL" | $Xsed -e "$delay_single_quote_subst"`' -ECHO='`$ECHO "X$ECHO" | $Xsed -e "$delay_single_quote_subst"`' -MAGIC_CMD='`$ECHO "X$MAGIC_CMD" | $Xsed -e "$delay_single_quote_subst"`' -lt_prog_compiler_no_builtin_flag='`$ECHO "X$lt_prog_compiler_no_builtin_flag" | $Xsed -e "$delay_single_quote_subst"`' -lt_prog_compiler_wl='`$ECHO "X$lt_prog_compiler_wl" | $Xsed -e "$delay_single_quote_subst"`' -lt_prog_compiler_pic='`$ECHO "X$lt_prog_compiler_pic" | $Xsed -e "$delay_single_quote_subst"`' -lt_prog_compiler_static='`$ECHO "X$lt_prog_compiler_static" | $Xsed -e "$delay_single_quote_subst"`' -lt_cv_prog_compiler_c_o='`$ECHO "X$lt_cv_prog_compiler_c_o" | $Xsed -e "$delay_single_quote_subst"`' -need_locks='`$ECHO "X$need_locks" | $Xsed -e "$delay_single_quote_subst"`' -DSYMUTIL='`$ECHO "X$DSYMUTIL" | $Xsed -e "$delay_single_quote_subst"`' -NMEDIT='`$ECHO "X$NMEDIT" | $Xsed -e "$delay_single_quote_subst"`' -LIPO='`$ECHO "X$LIPO" | $Xsed -e "$delay_single_quote_subst"`' -OTOOL='`$ECHO "X$OTOOL" | $Xsed -e "$delay_single_quote_subst"`' -OTOOL64='`$ECHO "X$OTOOL64" | $Xsed -e "$delay_single_quote_subst"`' -libext='`$ECHO "X$libext" | $Xsed -e "$delay_single_quote_subst"`' -shrext_cmds='`$ECHO "X$shrext_cmds" | $Xsed -e "$delay_single_quote_subst"`' -extract_expsyms_cmds='`$ECHO "X$extract_expsyms_cmds" | $Xsed -e "$delay_single_quote_subst"`' -archive_cmds_need_lc='`$ECHO "X$archive_cmds_need_lc" | $Xsed -e "$delay_single_quote_subst"`' -enable_shared_with_static_runtimes='`$ECHO "X$enable_shared_with_static_runtimes" | $Xsed -e "$delay_single_quote_subst"`' -export_dynamic_flag_spec='`$ECHO "X$export_dynamic_flag_spec" | $Xsed -e "$delay_single_quote_subst"`' -whole_archive_flag_spec='`$ECHO "X$whole_archive_flag_spec" | $Xsed -e "$delay_single_quote_subst"`' -compiler_needs_object='`$ECHO "X$compiler_needs_object" | $Xsed -e "$delay_single_quote_subst"`' -old_archive_from_new_cmds='`$ECHO "X$old_archive_from_new_cmds" | $Xsed -e "$delay_single_quote_subst"`' -old_archive_from_expsyms_cmds='`$ECHO "X$old_archive_from_expsyms_cmds" | $Xsed -e "$delay_single_quote_subst"`' -archive_cmds='`$ECHO "X$archive_cmds" | $Xsed -e "$delay_single_quote_subst"`' -archive_expsym_cmds='`$ECHO "X$archive_expsym_cmds" | $Xsed -e "$delay_single_quote_subst"`' -module_cmds='`$ECHO "X$module_cmds" | $Xsed -e "$delay_single_quote_subst"`' -module_expsym_cmds='`$ECHO "X$module_expsym_cmds" | $Xsed -e "$delay_single_quote_subst"`' -with_gnu_ld='`$ECHO "X$with_gnu_ld" | $Xsed -e "$delay_single_quote_subst"`' -allow_undefined_flag='`$ECHO "X$allow_undefined_flag" | $Xsed -e "$delay_single_quote_subst"`' -no_undefined_flag='`$ECHO "X$no_undefined_flag" | $Xsed -e "$delay_single_quote_subst"`' -hardcode_libdir_flag_spec='`$ECHO "X$hardcode_libdir_flag_spec" | $Xsed -e "$delay_single_quote_subst"`' -hardcode_libdir_flag_spec_ld='`$ECHO "X$hardcode_libdir_flag_spec_ld" | $Xsed -e "$delay_single_quote_subst"`' -hardcode_libdir_separator='`$ECHO "X$hardcode_libdir_separator" | $Xsed -e "$delay_single_quote_subst"`' -hardcode_direct='`$ECHO "X$hardcode_direct" | $Xsed -e "$delay_single_quote_subst"`' -hardcode_direct_absolute='`$ECHO "X$hardcode_direct_absolute" | $Xsed -e "$delay_single_quote_subst"`' -hardcode_minus_L='`$ECHO "X$hardcode_minus_L" | $Xsed -e "$delay_single_quote_subst"`' -hardcode_shlibpath_var='`$ECHO "X$hardcode_shlibpath_var" | $Xsed -e "$delay_single_quote_subst"`' -hardcode_automatic='`$ECHO "X$hardcode_automatic" | $Xsed -e "$delay_single_quote_subst"`' -inherit_rpath='`$ECHO "X$inherit_rpath" | $Xsed -e "$delay_single_quote_subst"`' -link_all_deplibs='`$ECHO "X$link_all_deplibs" | $Xsed -e "$delay_single_quote_subst"`' -fix_srcfile_path='`$ECHO "X$fix_srcfile_path" | $Xsed -e "$delay_single_quote_subst"`' -always_export_symbols='`$ECHO "X$always_export_symbols" | $Xsed -e "$delay_single_quote_subst"`' -export_symbols_cmds='`$ECHO "X$export_symbols_cmds" | $Xsed -e "$delay_single_quote_subst"`' -exclude_expsyms='`$ECHO "X$exclude_expsyms" | $Xsed -e "$delay_single_quote_subst"`' -include_expsyms='`$ECHO "X$include_expsyms" | $Xsed -e "$delay_single_quote_subst"`' -prelink_cmds='`$ECHO "X$prelink_cmds" | $Xsed -e "$delay_single_quote_subst"`' -file_list_spec='`$ECHO "X$file_list_spec" | $Xsed -e "$delay_single_quote_subst"`' -variables_saved_for_relink='`$ECHO "X$variables_saved_for_relink" | $Xsed -e "$delay_single_quote_subst"`' -need_lib_prefix='`$ECHO "X$need_lib_prefix" | $Xsed -e "$delay_single_quote_subst"`' -need_version='`$ECHO "X$need_version" | $Xsed -e "$delay_single_quote_subst"`' -version_type='`$ECHO "X$version_type" | $Xsed -e "$delay_single_quote_subst"`' -runpath_var='`$ECHO "X$runpath_var" | $Xsed -e "$delay_single_quote_subst"`' -shlibpath_var='`$ECHO "X$shlibpath_var" | $Xsed -e "$delay_single_quote_subst"`' -shlibpath_overrides_runpath='`$ECHO "X$shlibpath_overrides_runpath" | $Xsed -e "$delay_single_quote_subst"`' -libname_spec='`$ECHO "X$libname_spec" | $Xsed -e "$delay_single_quote_subst"`' -library_names_spec='`$ECHO "X$library_names_spec" | $Xsed -e "$delay_single_quote_subst"`' -soname_spec='`$ECHO "X$soname_spec" | $Xsed -e "$delay_single_quote_subst"`' -postinstall_cmds='`$ECHO "X$postinstall_cmds" | $Xsed -e "$delay_single_quote_subst"`' -postuninstall_cmds='`$ECHO "X$postuninstall_cmds" | $Xsed -e "$delay_single_quote_subst"`' -finish_cmds='`$ECHO "X$finish_cmds" | $Xsed -e "$delay_single_quote_subst"`' -finish_eval='`$ECHO "X$finish_eval" | $Xsed -e "$delay_single_quote_subst"`' -hardcode_into_libs='`$ECHO "X$hardcode_into_libs" | $Xsed -e "$delay_single_quote_subst"`' -sys_lib_search_path_spec='`$ECHO "X$sys_lib_search_path_spec" | $Xsed -e "$delay_single_quote_subst"`' -sys_lib_dlsearch_path_spec='`$ECHO "X$sys_lib_dlsearch_path_spec" | $Xsed -e "$delay_single_quote_subst"`' -hardcode_action='`$ECHO "X$hardcode_action" | $Xsed -e "$delay_single_quote_subst"`' -enable_dlopen='`$ECHO "X$enable_dlopen" | $Xsed -e "$delay_single_quote_subst"`' -enable_dlopen_self='`$ECHO "X$enable_dlopen_self" | $Xsed -e "$delay_single_quote_subst"`' -enable_dlopen_self_static='`$ECHO "X$enable_dlopen_self_static" | $Xsed -e "$delay_single_quote_subst"`' -old_striplib='`$ECHO "X$old_striplib" | $Xsed -e "$delay_single_quote_subst"`' -striplib='`$ECHO "X$striplib" | $Xsed -e "$delay_single_quote_subst"`' +AS='`$ECHO "$AS" | $SED "$delay_single_quote_subst"`' +DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' +OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' +macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' +macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' +enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' +enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' +pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' +enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' +SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' +ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' +host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' +host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' +host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' +build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' +build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' +build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' +SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' +Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' +GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' +EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' +FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' +LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' +NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' +LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' +max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' +ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' +exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' +lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' +lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' +lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' +reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' +reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' +deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' +file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' +AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' +AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' +STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' +RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' +old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' +old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' +old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' +lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' +CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' +CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' +compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' +GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' +objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' +MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' +lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' +need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' +DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' +NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' +LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' +OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' +OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' +libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' +shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' +extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' +archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' +enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' +export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' +whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' +compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' +old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' +old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' +archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' +archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' +module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' +module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' +with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' +allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' +no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec_ld='`$ECHO "$hardcode_libdir_flag_spec_ld" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' +hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' +hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' +hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' +hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' +hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' +inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' +link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' +fix_srcfile_path='`$ECHO "$fix_srcfile_path" | $SED "$delay_single_quote_subst"`' +always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' +export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' +exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' +include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' +prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' +file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' +variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' +need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' +need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' +version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' +runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' +shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' +shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' +libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' +library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' +soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' +install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' +postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' +postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' +finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' +finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' +hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' +sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' +sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`' +hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' +enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' +enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' +enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' +old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' +striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$1 +_LTECHO_EOF' +} + # Quote evaled strings. -for var in SED \ +for var in AS \ +DLLTOOL \ +OBJDUMP \ +SHELL \ +ECHO \ +SED \ GREP \ EGREP \ FGREP \ @@ -22760,8 +15531,6 @@ lt_cv_sys_global_symbol_pipe \ lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_c_name_address \ lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ -SHELL \ -ECHO \ lt_prog_compiler_no_builtin_flag \ lt_prog_compiler_wl \ lt_prog_compiler_pic \ @@ -22791,12 +15560,13 @@ variables_saved_for_relink \ libname_spec \ library_names_spec \ soname_spec \ +install_override_mode \ finish_eval \ old_striplib \ striplib; do - case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) - eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" @@ -22823,9 +15593,9 @@ postuninstall_cmds \ finish_cmds \ sys_lib_search_path_spec \ sys_lib_dlsearch_path_spec; do - case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) - eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" @@ -22833,12 +15603,6 @@ sys_lib_dlsearch_path_spec; do esac done -# Fix-up fallback echo if it was mangled by the above quoting rules. -case \$lt_ECHO in -*'\\\$0 --fallback-echo"') lt_ECHO=\`\$ECHO "X\$lt_ECHO" | \$Xsed -e 's/\\\\\\\\\\\\\\\$0 --fallback-echo"\$/\$0 --fallback-echo"/'\` - ;; -esac - ac_aux_dir='$ac_aux_dir' xsi_shell='$xsi_shell' lt_shell_append='$lt_shell_append' @@ -22887,9 +15651,7 @@ do "libxml-2.0-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES libxml-2.0-uninstalled.pc" ;; "python/setup.py") CONFIG_FILES="$CONFIG_FILES python/setup.py" ;; - *) { { $as_echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 -$as_echo "$as_me: error: invalid argument: $ac_config_target" >&2;} - { (exit 1); exit 1; }; };; + *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done @@ -22916,7 +15678,7 @@ $debug || trap 'exit_status=$? { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status ' 0 - trap '{ (exit 1); exit 1; }' 1 2 13 15 + trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. @@ -22927,11 +15689,7 @@ $debug || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") -} || -{ - $as_echo "$as_me: cannot create a temporary directory in ." >&2 - { (exit 1); exit 1; } -} +} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. @@ -22939,8 +15697,13 @@ $debug || if test -n "$CONFIG_FILES"; then -ac_cr=' -' +ac_cr=`echo X | tr X '\015'` +# On cygwin, bash can eat \r inside `` if the user requested igncr. +# But we know of no other shell where ac_cr would be empty at this +# point, so we can use a bashism as a fallback. +if test "x$ac_cr" = x; then + eval ac_cr=\$\'\\r\' +fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' @@ -22957,24 +15720,18 @@ _ACEOF echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || - { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 -$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} - { (exit 1); exit 1; }; } -ac_delim_num=`echo "$ac_subst_vars" | grep -c '$'` + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 +ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || - { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 -$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then - { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 -$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi @@ -22996,7 +15753,7 @@ s/'"$ac_delim"'$// t delim :nl h -s/\(.\{148\}\).*/\1/ +s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p @@ -23010,7 +15767,7 @@ s/.\{148\}// t nl :delim h -s/\(.\{148\}\).*/\1/ +s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p @@ -23063,22 +15820,28 @@ if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then else cat fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \ - || { { $as_echo "$as_me:$LINENO: error: could not setup config files machinery" >&5 -$as_echo "$as_me: error: could not setup config files machinery" >&2;} - { (exit 1); exit 1; }; } + || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF -# VPATH may cause trouble with some makes, so we remove $(srcdir), -# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and +# VPATH may cause trouble with some makes, so we remove sole $(srcdir), +# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then - ac_vpsub='/^[ ]*VPATH[ ]*=/{ -s/:*\$(srcdir):*/:/ -s/:*\${srcdir}:*/:/ -s/:*@srcdir@:*/:/ -s/^\([^=]*=[ ]*\):*/\1/ + ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ +h +s/// +s/^/:/ +s/[ ]*$/:/ +s/:\$(srcdir):/:/g +s/:\${srcdir}:/:/g +s/:@srcdir@:/:/g +s/^:*// s/:*$// +x +s/\(=[ ]*\).*/\1/ +G +s/\n// s/^[^=]*=[ ]*$// }' fi @@ -23106,9 +15869,7 @@ for ac_last_try in false false :; do if test -z "$ac_t"; then break elif $ac_last_try; then - { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_HEADERS" >&5 -$as_echo "$as_me: error: could not make $CONFIG_HEADERS" >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi @@ -23193,9 +15954,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 - { { $as_echo "$as_me:$LINENO: error: could not setup config headers machinery" >&5 -$as_echo "$as_me: error: could not setup config headers machinery" >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" @@ -23208,9 +15967,7 @@ do esac case $ac_mode$ac_tag in :[FHL]*:*);; - :L* | :C*:*) { { $as_echo "$as_me:$LINENO: error: invalid tag $ac_tag" >&5 -$as_echo "$as_me: error: invalid tag $ac_tag" >&2;} - { (exit 1); exit 1; }; };; + :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac @@ -23238,12 +15995,10 @@ $as_echo "$as_me: error: invalid tag $ac_tag" >&2;} [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || - { { $as_echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5 -$as_echo "$as_me: error: cannot find input file: $ac_f" >&2;} - { (exit 1); exit 1; }; };; + as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac - ac_file_inputs="$ac_file_inputs '$ac_f'" + as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't @@ -23254,7 +16009,7 @@ $as_echo "$as_me: error: cannot find input file: $ac_f" >&2;} `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" - { $as_echo "$as_me:$LINENO: creating $ac_file" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. @@ -23267,9 +16022,7 @@ $as_echo "$as_me: creating $ac_file" >&6;} case $ac_tag in *:-:* | *:-) cat >"$tmp/stdin" \ - || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 -$as_echo "$as_me: error: could not create $ac_file" >&2;} - { (exit 1); exit 1; }; } ;; + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac @@ -23297,47 +16050,7 @@ $as_echo X"$ac_file" | q } s/.*/./; q'` - { as_dir="$ac_dir" - case $as_dir in #( - -*) as_dir=./$as_dir;; - esac - test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { - as_dirs= - while :; do - case $as_dir in #( - *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( - *) as_qdir=$as_dir;; - esac - as_dirs="'$as_qdir' $as_dirs" - as_dir=`$as_dirname -- "$as_dir" || -$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - test -d "$as_dir" && break - done - test -z "$as_dirs" || eval "mkdir $as_dirs" - } || test -d "$as_dir" || { { $as_echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 -$as_echo "$as_me: error: cannot create directory $as_dir" >&2;} - { (exit 1); exit 1; }; }; } + as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in @@ -23394,7 +16107,6 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= - ac_sed_dataroot=' /datarootdir/ { p @@ -23404,12 +16116,11 @@ ac_sed_dataroot=' /@docdir@/p /@infodir@/p /@localedir@/p -/@mandir@/p -' +/@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) - { $as_echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 @@ -23419,7 +16130,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g - s&\\\${datarootdir}&$datarootdir&g' ;; + s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF @@ -23448,26 +16159,22 @@ s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \ - || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 -$as_echo "$as_me: error: could not create $ac_file" >&2;} - { (exit 1); exit 1; }; } + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && - { $as_echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir' -which seems to be undefined. Please make sure it is defined." >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' -which seems to be undefined. Please make sure it is defined." >&2;} +which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$tmp/stdin" case $ac_file in -) cat "$tmp/out" && rm -f "$tmp/out";; *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";; esac \ - || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 -$as_echo "$as_me: error: could not create $ac_file" >&2;} - { (exit 1); exit 1; }; } + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # @@ -23478,25 +16185,19 @@ $as_echo "$as_me: error: could not create $ac_file" >&2;} $as_echo "/* $configure_input */" \ && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" } >"$tmp/config.h" \ - || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 -$as_echo "$as_me: error: could not create $ac_file" >&2;} - { (exit 1); exit 1; }; } + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1; then - { $as_echo "$as_me:$LINENO: $ac_file is unchanged" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$tmp/config.h" "$ac_file" \ - || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 -$as_echo "$as_me: error: could not create $ac_file" >&2;} - { (exit 1); exit 1; }; } + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" \ - || { { $as_echo "$as_me:$LINENO: error: could not create -" >&5 -$as_echo "$as_me: error: could not create -" >&2;} - { (exit 1); exit 1; }; } + || as_fn_error $? "could not create -" "$LINENO" 5 fi # Compute "$ac_file"'s index in $config_headers. _am_arg="$ac_file" @@ -23534,7 +16235,7 @@ $as_echo X"$_am_arg" | s/.*/./; q'`/stamp-h$_am_stamp_count ;; - :C) { $as_echo "$as_me:$LINENO: executing $ac_file commands" >&5 + :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac @@ -23629,47 +16330,7 @@ $as_echo X"$file" | q } s/.*/./; q'` - { as_dir=$dirpart/$fdir - case $as_dir in #( - -*) as_dir=./$as_dir;; - esac - test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { - as_dirs= - while :; do - case $as_dir in #( - *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( - *) as_qdir=$as_dir;; - esac - as_dirs="'$as_qdir' $as_dirs" - as_dir=`$as_dirname -- "$as_dir" || -$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - test -d "$as_dir" && break - done - test -z "$as_dirs" || eval "mkdir $as_dirs" - } || test -d "$as_dir" || { { $as_echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 -$as_echo "$as_me: error: cannot create directory $as_dir" >&2;} - { (exit 1); exit 1; }; }; } + as_dir=$dirpart/$fdir; as_fn_mkdir_p # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done @@ -23697,7 +16358,8 @@ $as_echo "$as_me: error: cannot create directory $as_dir" >&2;} # NOTE: Changes made to this file will be lost: look at ltmain.sh. # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, -# 2006, 2007, 2008 Free Software Foundation, Inc. +# 2006, 2007, 2008, 2009, 2010 Free Software Foundation, +# Inc. # Written by Gordon Matzigkeit, 1996 # # This file is part of GNU Libtool. @@ -23730,13 +16392,13 @@ available_tags="" # ### BEGIN LIBTOOL CONFIG # Assembler program. -AS=$AS +AS=$lt_AS # DLL creation program. -DLLTOOL=$DLLTOOL +DLLTOOL=$lt_DLLTOOL # Object dumper program. -OBJDUMP=$OBJDUMP +OBJDUMP=$lt_OBJDUMP # Which release of libtool.m4 was used? macro_version=$macro_version @@ -23754,6 +16416,12 @@ pic_mode=$pic_mode # Whether or not to optimize for fast installation. fast_install=$enable_fast_install +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# An echo program that protects backslashes. +ECHO=$lt_ECHO + # The host system. host_alias=$host_alias host=$host @@ -23803,10 +16471,6 @@ SP2NL=$lt_lt_SP2NL # turn newlines into spaces. NL2SP=$lt_lt_NL2SP -# How to create reloadable object files. -reload_flag=$lt_reload_flag -reload_cmds=$lt_reload_cmds - # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method @@ -23825,6 +16489,9 @@ RANLIB=$lt_RANLIB old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds +# Whether to use a lock for old archive extraction. +lock_old_archive_extraction=$lock_old_archive_extraction + # A C compiler. LTCC=$lt_CC @@ -23846,12 +16513,6 @@ global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name # The name of the directory that contains temporary libtool files. objdir=$objdir -# Shell to use when invoking shell scripts. -SHELL=$lt_SHELL - -# An echo program that does not interpret backslashes. -ECHO=$lt_ECHO - # Used to examine libraries when file_magic_cmd begins with "file". MAGIC_CMD=$MAGIC_CMD @@ -23914,6 +16575,9 @@ library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec +# Permission mode override for installation of shared libraries. +install_override_mode=$lt_install_override_mode + # Command to use after installation of a shared archive. postinstall_cmds=$lt_postinstall_cmds @@ -23953,6 +16617,10 @@ striplib=$lt_striplib # The linker used to build libraries. LD=$lt_LD +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds @@ -24212,7 +16880,7 @@ _LT_EOF func_dirname () { # Extract subdirectory from the argument. - func_dirname_result=`$ECHO "X${1}" | $Xsed -e "$dirname"` + func_dirname_result=`$ECHO "${1}" | $SED "$dirname"` if test "X$func_dirname_result" = "X${1}"; then func_dirname_result="${3}" else @@ -24223,7 +16891,7 @@ func_dirname () # func_basename file func_basename () { - func_basename_result=`$ECHO "X${1}" | $Xsed -e "$basename"` + func_basename_result=`$ECHO "${1}" | $SED "$basename"` } @@ -24236,10 +16904,8 @@ func_basename () func_stripname () { case ${2} in - .*) func_stripname_result=`$ECHO "X${3}" \ - | $Xsed -e "s%^${1}%%" -e "s%\\\\${2}\$%%"`;; - *) func_stripname_result=`$ECHO "X${3}" \ - | $Xsed -e "s%^${1}%%" -e "s%${2}\$%%"`;; + .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; + *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; esac } @@ -24250,20 +16916,20 @@ my_sed_long_arg='1s/^-[^=]*=//' # func_opt_split func_opt_split () { - func_opt_split_opt=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_opt"` - func_opt_split_arg=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_arg"` + func_opt_split_opt=`$ECHO "${1}" | $SED "$my_sed_long_opt"` + func_opt_split_arg=`$ECHO "${1}" | $SED "$my_sed_long_arg"` } # func_lo2o object func_lo2o () { - func_lo2o_result=`$ECHO "X${1}" | $Xsed -e "$lo2o"` + func_lo2o_result=`$ECHO "${1}" | $SED "$lo2o"` } # func_xform libobj-or-source func_xform () { - func_xform_result=`$ECHO "X${1}" | $Xsed -e 's/\.[^.]*$/.lo/'` + func_xform_result=`$ECHO "${1}" | $SED 's/\.[^.]*$/.lo/'` } # func_arith arithmetic-term... @@ -24322,15 +16988,12 @@ _LT_EOF done # for ac_tag -{ (exit 0); exit 0; } +as_fn_exit 0 _ACEOF -chmod +x $CONFIG_STATUS ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || - { { $as_echo "$as_me:$LINENO: error: write failure creating $CONFIG_STATUS" >&5 -$as_echo "$as_me: error: write failure creating $CONFIG_STATUS" >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. @@ -24351,10 +17014,10 @@ if test "$no_create" != yes; then exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. - $ac_cs_success || { (exit 1); exit 1; } + $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then - { $as_echo "$as_me:$LINENO: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi diff --git a/reactos/lib/3rdparty/libxml2/configure.in b/reactos/lib/3rdparty/libxml2/configure.in index 17c11cde682..59d0629e658 100644 --- a/reactos/lib/3rdparty/libxml2/configure.in +++ b/reactos/lib/3rdparty/libxml2/configure.in @@ -1,4 +1,5 @@ dnl Process this file with autoconf to produce a configure script. +AC_PREREQ(2.59) AC_INIT(entities.c) AM_CONFIG_HEADER(config.h) AC_CONFIG_MACRO_DIR([m4]) @@ -6,7 +7,7 @@ AC_CANONICAL_HOST LIBXML_MAJOR_VERSION=2 LIBXML_MINOR_VERSION=7 -LIBXML_MICRO_VERSION=7 +LIBXML_MICRO_VERSION=8 LIBXML_MICRO_VERSION_SUFFIX= LIBXML_VERSION=$LIBXML_MAJOR_VERSION.$LIBXML_MINOR_VERSION.$LIBXML_MICRO_VERSION$LIBXML_MICRO_VERSION_SUFFIX LIBXML_VERSION_INFO=`expr $LIBXML_MAJOR_VERSION + $LIBXML_MINOR_VERSION`:$LIBXML_MICRO_VERSION:$LIBXML_MINOR_VERSION @@ -52,6 +53,7 @@ AM_INIT_AUTOMAKE(libxml2, $VERSION) dnl Checks for programs. AC_PROG_CC AC_PROG_INSTALL +AC_PROG_MKDIR_P AC_PROG_CPP AC_PATH_PROG(RM, rm, /bin/rm) AC_PATH_PROG(MV, mv, /bin/mv) @@ -82,7 +84,7 @@ else esac fi AC_SUBST(VERSION_SCRIPT_FLAGS) -AM_CONDITIONAL([USE_VERSION_SCRIPT], [test -n "$VERSION_SCRIPT_FLAGS"]) +AM_CONDITIONAL([USE_VERSION_SCRIPT], [test -z "$VERSION_SCRIPT_FLAGS"]) dnl dnl We process the AC_ARG_WITH first so that later we can modify @@ -126,6 +128,8 @@ AC_ARG_WITH(http, [ --with-http add the HTTP support (on)]) AC_ARG_WITH(iconv, [ --with-iconv[[=DIR]] add ICONV support (on)]) +AC_ARG_WITH(icu, +[ --with-icu add ICU support (off)]) AC_ARG_WITH(iso8859x, [ --with-iso8859x add ISO8859X support if no iconv (on)]) AC_ARG_WITH(legacy, @@ -702,17 +706,23 @@ if test "$with_python" != "no" ; then echo Found python in $with_python/bin/python PYTHON="$with_python/bin/python" else - if test -x "$with_python" - then - echo Found python in $with_python - PYTHON="$with_python" - else - if test -x "$PYTHON" - then - echo Found python in environment PYTHON=$PYTHON - with_python=`$PYTHON -c "import sys; print sys.exec_prefix"` - else - AC_PATH_PROG(PYTHON, python python2.6 python2.5 python2.4 python2.3 python2.2 python2.1 python2.0 python1.6 python1.5) + if test -x "$with_python/python.exe" + then + echo Found python in $with_python/python.exe + PYTHON="$with_python/python.exe" + else + if test -x "$with_python" + then + echo Found python in $with_python + PYTHON="$with_python" + else + if test -x "$PYTHON" + then + echo Found python in environment PYTHON=$PYTHON + with_python=`$PYTHON -c "import sys; print sys.exec_prefix"` + else + AC_PATH_PROG(PYTHON, python python2.6 python2.5 python2.4 python2.3 python2.2 python2.1 python2.0 python1.6 python1.5) + fi fi fi fi @@ -739,7 +749,14 @@ if test "$with_python" != "no" ; then PYTHON_INCLUDES=/usr/include/python$PYTHON_VERSION PYTHON_SITE_PACKAGES=$libdir/python$PYTHON_VERSION/site-packages else - echo could not find python$PYTHON_VERSION/Python.h + if test -r $with_python/include/Python.h -a \ + -d $with_python/lib/site-packages + then + PYTHON_INCLUDES=$with_python/include + PYTHON_SITE_PACKAGES=$with_python/lib/site-packages + else + echo could not find python$PYTHON_VERSION/Python.h or $with_python/include/Python.h + fi fi fi if test ! -d "$PYTHON_SITE_PACKAGES" @@ -1306,6 +1323,23 @@ XML_LIBS="-lxml2 $Z_LIBS $THREAD_LIBS $ICONV_LIBS $M_LIBS $LIBS" XML_LIBTOOLLIBS="libxml2.la" AC_SUBST(WITH_ICONV) +WITH_ICU=0 +if test "$with_icu" != "yes" ; then + echo Disabling ICU support +else + ICU_CONFIG=icu-config + if ${ICU_CONFIG} --cflags >/dev/null 2>&1 + then + ICU_LIBS=`icu-config --ldflags` + LDFLAGS="$LDFLAGS $ICU_LIBS" + WITH_ICU=1 + echo Enabling ICU support + else + AC_MSG_ERROR([libicu config program icu-config not found]) + fi +fi +AC_SUBST(WITH_ICU) + WITH_ISO8859X=1 if test "$WITH_ICONV" != "1" ; then if test "$with_iso8859x" = "no" ; then @@ -1395,6 +1429,7 @@ WIN32_EXTRA_LIBADD= WIN32_EXTRA_LDFLAGS= CYGWIN_EXTRA_LDFLAGS= CYGWIN_EXTRA_PYTHON_LIBADD= +WIN32_EXTRA_PYTHON_LIBADD= case "$host" in *-*-mingw*) CPPFLAGS="$CPPFLAGS -DWIN32" @@ -1403,6 +1438,10 @@ case "$host" in AC_DEFINE([_WINSOCKAPI_],1,[Using the Win32 Socket implementation]) AC_DEFINE([snprintf],[_snprintf],[Win32 Std C name mangling work-around]) AC_DEFINE([vsnprintf],[_vsnprintf],[Win32 Std C name mangling work-around]) + if test "${PYTHON}" != "" + then + WIN32_EXTRA_PYTHON_LIBADD="-L${pythondir}/../../libs -lpython${PYTHON_VERSION//./}" + fi ;; *-*-cygwin*) CYGWIN_EXTRA_LDFLAGS="-no-undefined" @@ -1414,6 +1453,7 @@ case "$host" in esac AC_SUBST(WIN32_EXTRA_LIBADD) AC_SUBST(WIN32_EXTRA_LDFLAGS) +AC_SUBST(WIN32_EXTRA_PYTHON_LIBADD) AC_SUBST(CYGWIN_EXTRA_LDFLAGS) AC_SUBST(CYGWIN_EXTRA_PYTHON_LIBADD) diff --git a/reactos/lib/3rdparty/libxml2/debugXML.c b/reactos/lib/3rdparty/libxml2/debugXML.c index 415889a657e..c26217a3f31 100644 --- a/reactos/lib/3rdparty/libxml2/debugXML.c +++ b/reactos/lib/3rdparty/libxml2/debugXML.c @@ -2941,7 +2941,7 @@ xmlShell(xmlDocPtr doc, char *filename, xmlShellReadlineFunc input, xmlGenericError(xmlGenericErrorContext, "Write command requires a filename argument\n"); else - xmlShellWrite(ctxt, arg, NULL, NULL); + xmlShellWrite(ctxt, arg, ctxt->node, NULL); #endif /* LIBXML_OUTPUT_ENABLED */ } else if (!strcmp(command, "grep")) { xmlShellGrep(ctxt, arg, ctxt->node, NULL); diff --git a/reactos/lib/3rdparty/libxml2/encoding.c b/reactos/lib/3rdparty/libxml2/encoding.c index b86a547e403..d1140bf2dcc 100644 --- a/reactos/lib/3rdparty/libxml2/encoding.c +++ b/reactos/lib/3rdparty/libxml2/encoding.c @@ -1,7 +1,7 @@ /* * encoding.c : implements the encoding conversion functions needed for XML * - * Related specs: + * Related specs: * rfc2044 (UTF-8 and UTF-16) F. Yergeau Alis Technologies * rfc2781 UTF-16, an encoding of ISO 10646, P. Hoffman, F. Yergeau * [ISO-10646] UTF-8 and UTF-16 in Annexes @@ -58,7 +58,7 @@ static xmlCharEncodingAliasPtr xmlCharEncodingAliases = NULL; static int xmlCharEncodingAliasesNb = 0; static int xmlCharEncodingAliasesMax = 0; -#ifdef LIBXML_ICONV_ENABLED +#if defined(LIBXML_ICONV_ENABLED) || defined(LIBXML_ICU_ENABLED) #if 0 #define DEBUG_ENCODING /* Define this to get encoding traces */ #endif @@ -97,6 +97,54 @@ xmlEncodingErr(xmlParserErrors error, const char *msg, const char *val) NULL, 0, val, NULL, NULL, 0, 0, msg, val); } +#ifdef LIBXML_ICU_ENABLED +static uconv_t* +openIcuConverter(const char* name, int toUnicode) +{ + UErrorCode status = U_ZERO_ERROR; + uconv_t *conv = (uconv_t *) xmlMalloc(sizeof(uconv_t)); + if (conv == NULL) + return NULL; + + conv->uconv = ucnv_open(name, &status); + if (U_FAILURE(status)) + goto error; + + status = U_ZERO_ERROR; + if (toUnicode) { + ucnv_setToUCallBack(conv->uconv, UCNV_TO_U_CALLBACK_STOP, + NULL, NULL, NULL, &status); + } + else { + ucnv_setFromUCallBack(conv->uconv, UCNV_FROM_U_CALLBACK_STOP, + NULL, NULL, NULL, &status); + } + if (U_FAILURE(status)) + goto error; + + status = U_ZERO_ERROR; + conv->utf8 = ucnv_open("UTF-8", &status); + if (U_SUCCESS(status)) + return conv; + +error: + if (conv->uconv) + ucnv_close(conv->uconv); + xmlFree(conv); + return NULL; +} + +static void +closeIcuConverter(uconv_t *conv) +{ + if (conv != NULL) { + ucnv_close(conv->uconv); + ucnv_close(conv->utf8); + xmlFree(conv); + } +} +#endif /* LIBXML_ICU_ENABLED */ + /************************************************************************ * * * Conversions To/From UTF8 encoding * @@ -135,12 +183,12 @@ asciiToUTF8(unsigned char* out, int *outlen, break; if (c < 0x80) { *out++ = c; - } else { + } else { *outlen = out - outstart; *inlen = processed - base; return(-1); } - + processed = (const unsigned char*) in; } *outlen = out - outstart; @@ -206,7 +254,7 @@ UTF8Toascii(unsigned char* out, int *outlen, if (inend - in < trailing) { break; - } + } for ( ; trailing; trailing--) { if ((in >= inend) || (((d= *in++) & 0xC0) != 0x80)) @@ -263,19 +311,19 @@ isolat1ToUTF8(unsigned char* out, int *outlen, outend = out + *outlen; inend = in + (*inlen); instop = inend; - - while (in < inend && out < outend - 1) { - if (*in >= 0x80) { + + while ((in < inend) && (out < outend - 1)) { + if (*in >= 0x80) { *out++ = (((*in) >> 6) & 0x1F) | 0xC0; - *out++ = ((*in) & 0x3F) | 0x80; + *out++ = ((*in) & 0x3F) | 0x80; ++in; } - if (instop - in > outend - out) instop = in + (outend - out); - while (in < instop && *in < 0x80) { + if ((instop - in) > (outend - out)) instop = in + (outend - out); + while ((in < instop) && (*in < 0x80)) { *out++ = *in++; } - } - if (in < inend && out < outend && *in < 0x80) { + } + if ((in < inend) && (out < outend) && (*in < 0x80)) { *out++ = *in++; } *outlen = out - outstart; @@ -379,7 +427,7 @@ UTF8Toisolat1(unsigned char* out, int *outlen, if (inend - in < trailing) { break; - } + } for ( ; trailing; trailing--) { if (in >= inend) @@ -487,7 +535,7 @@ UTF16LEToUTF8(unsigned char* out, int *outlen, else if (c < 0x800) { *out++= ((c >> 6) & 0x1F) | 0xC0; bits= 0; } else if (c < 0x10000) { *out++= ((c >> 12) & 0x0F) | 0xE0; bits= 6; } else { *out++= ((c >> 18) & 0x07) | 0xF0; bits= 12; } - + for ( ; bits >= 0; bits-= 6) { if (out >= outend) break; @@ -512,7 +560,7 @@ UTF16LEToUTF8(unsigned char* out, int *outlen, * block of chars out. * * Returns the number of bytes written, or -1 if lack of space, or -2 - * if the transcoding failed. + * if the transcoding failed. */ static int UTF8ToUTF16LE(unsigned char* outb, int *outlen, @@ -558,7 +606,7 @@ UTF8ToUTF16LE(unsigned char* outb, int *outlen, if (inend - in < trailing) { break; - } + } for ( ; trailing; trailing--) { if ((in >= inend) || (((d= *in++) & 0xC0) != 0x80)) @@ -621,7 +669,7 @@ UTF8ToUTF16LE(unsigned char* outb, int *outlen, * block of chars out. * * Returns the number of bytes written, or -1 if lack of space, or -2 - * if the transcoding failed. + * if the transcoding failed. */ static int UTF8ToUTF16(unsigned char* outb, int *outlen, @@ -693,7 +741,7 @@ UTF16BEToUTF8(unsigned char* out, int *outlen, in++; } else { c= *in++; - } + } if ((c & 0xFC00) == 0xD800) { /* surrogates */ if (in >= inend) { /* (in > inend) shouldn't happens */ *outlen = out - outstart; @@ -723,15 +771,15 @@ UTF16BEToUTF8(unsigned char* out, int *outlen, } /* assertion: c is a single UTF-4 value */ - if (out >= outend) + if (out >= outend) break; if (c < 0x80) { *out++= c; bits= -6; } else if (c < 0x800) { *out++= ((c >> 6) & 0x1F) | 0xC0; bits= 0; } else if (c < 0x10000) { *out++= ((c >> 12) & 0x0F) | 0xE0; bits= 6; } else { *out++= ((c >> 18) & 0x07) | 0xF0; bits= 12; } - + for ( ; bits >= 0; bits-= 6) { - if (out >= outend) + if (out >= outend) break; *out++= ((c >> bits) & 0x3F) | 0x80; } @@ -754,7 +802,7 @@ UTF16BEToUTF8(unsigned char* out, int *outlen, * block of chars out. * * Returns the number of byte written, or -1 by lack of space, or -2 - * if the transcoding failed. + * if the transcoding failed. */ static int UTF8ToUTF16BE(unsigned char* outb, int *outlen, @@ -800,7 +848,7 @@ UTF8ToUTF16BE(unsigned char* outb, int *outlen, if (inend - in < trailing) { break; - } + } for ( ; trailing; trailing--) { if ((in >= inend) || (((d= *in++) & 0xC0) != 0x80)) break; @@ -864,13 +912,13 @@ UTF8ToUTF16BE(unsigned char* outb, int *outlen, * * Guess the encoding of the entity using the first bytes of the entity content * according to the non-normative appendix F of the XML-1.0 recommendation. - * + * * Returns one of the XML_CHAR_ENCODING_... values. */ xmlCharEncoding xmlDetectCharEncoding(const unsigned char* in, int len) { - if (in == NULL) + if (in == NULL) return(XML_CHAR_ENCODING_NONE); if (len >= 4) { if ((in[0] == 0x00) && (in[1] == 0x00) && @@ -951,7 +999,7 @@ xmlCleanupEncodingAliases(void) { * @alias: the alias name as parsed, in UTF-8 format (ASCII actually) * * Lookup an encoding name for the given alias. - * + * * Returns NULL if not found, otherwise the original name */ const char * @@ -989,7 +1037,7 @@ xmlGetEncodingAlias(const char *alias) { * * Registers an alias @alias for an encoding named @name. Existing alias * will be overwritten. - * + * * Returns 0 in case of success, -1 in case of error */ int @@ -1009,13 +1057,13 @@ xmlAddEncodingAlias(const char *name, const char *alias) { if (xmlCharEncodingAliases == NULL) { xmlCharEncodingAliasesNb = 0; xmlCharEncodingAliasesMax = 20; - xmlCharEncodingAliases = (xmlCharEncodingAliasPtr) + xmlCharEncodingAliases = (xmlCharEncodingAliasPtr) xmlMalloc(xmlCharEncodingAliasesMax * sizeof(xmlCharEncodingAlias)); if (xmlCharEncodingAliases == NULL) return(-1); } else if (xmlCharEncodingAliasesNb >= xmlCharEncodingAliasesMax) { xmlCharEncodingAliasesMax *= 2; - xmlCharEncodingAliases = (xmlCharEncodingAliasPtr) + xmlCharEncodingAliases = (xmlCharEncodingAliasPtr) xmlRealloc(xmlCharEncodingAliases, xmlCharEncodingAliasesMax * sizeof(xmlCharEncodingAlias)); } @@ -1046,7 +1094,7 @@ xmlAddEncodingAlias(const char *name, const char *alias) { * @alias: the alias name as parsed, in UTF-8 format (ASCII actually) * * Unregisters an encoding alias @alias - * + * * Returns 0 in case of success, -1 in case of error */ int @@ -1081,7 +1129,7 @@ xmlDelEncodingAlias(const char *alias) { * Compare the string to the encoding schemes already known. Note * that the comparison is case insensitive accordingly to the section * [XML] 4.3.3 Character Encoding in Entities. - * + * * Returns one of the XML_CHAR_ENCODING_... values or XML_CHAR_ENCODING_NONE * if not recognized. */ @@ -1118,7 +1166,7 @@ xmlParseCharEncoding(const char* name) */ if (!strcmp(upper, "UTF-16")) return(XML_CHAR_ENCODING_UTF16LE); if (!strcmp(upper, "UTF16")) return(XML_CHAR_ENCODING_UTF16LE); - + if (!strcmp(upper, "ISO-10646-UCS-2")) return(XML_CHAR_ENCODING_UCS2); if (!strcmp(upper, "UCS-2")) return(XML_CHAR_ENCODING_UCS2); if (!strcmp(upper, "UCS2")) return(XML_CHAR_ENCODING_UCS2); @@ -1131,7 +1179,7 @@ xmlParseCharEncoding(const char* name) if (!strcmp(upper, "UCS-4")) return(XML_CHAR_ENCODING_UCS4LE); if (!strcmp(upper, "UCS4")) return(XML_CHAR_ENCODING_UCS4LE); - + if (!strcmp(upper, "ISO-8859-1")) return(XML_CHAR_ENCODING_8859_1); if (!strcmp(upper, "ISO-LATIN-1")) return(XML_CHAR_ENCODING_8859_1); if (!strcmp(upper, "ISO LATIN 1")) return(XML_CHAR_ENCODING_8859_1); @@ -1254,7 +1302,7 @@ static xmlCharEncodingHandlerPtr xmlDefaultCharEncodingHandler = NULL; * Returns the xmlCharEncodingHandlerPtr created (or NULL in case of error). */ xmlCharEncodingHandlerPtr -xmlNewCharEncodingHandler(const char *name, +xmlNewCharEncodingHandler(const char *name, xmlCharEncodingInputFunc input, xmlCharEncodingOutputFunc output) { xmlCharEncodingHandlerPtr handler; @@ -1299,6 +1347,7 @@ xmlNewCharEncodingHandler(const char *name, xmlEncodingErrMemory("xmlNewCharEncodingHandler : out of memory !\n"); return(NULL); } + memset(handler, 0, sizeof(xmlCharEncodingHandler)); handler->input = input; handler->output = output; handler->name = up; @@ -1306,7 +1355,11 @@ xmlNewCharEncodingHandler(const char *name, #ifdef LIBXML_ICONV_ENABLED handler->iconv_in = NULL; handler->iconv_out = NULL; -#endif /* LIBXML_ICONV_ENABLED */ +#endif +#ifdef LIBXML_ICU_ENABLED + handler->uconv_in = NULL; + handler->uconv_out = NULL; +#endif /* * registers and returns the handler. @@ -1330,7 +1383,7 @@ xmlNewCharEncodingHandler(const char *name, void xmlInitCharEncodingHandlers(void) { unsigned short int tst = 0x1234; - unsigned char *ptr = (unsigned char *) &tst; + unsigned char *ptr = (unsigned char *) &tst; if (handlers != NULL) return; @@ -1350,9 +1403,9 @@ xmlInitCharEncodingHandlers(void) { } xmlNewCharEncodingHandler("UTF-8", UTF8ToUTF8, UTF8ToUTF8); #ifdef LIBXML_OUTPUT_ENABLED - xmlUTF16LEHandler = + xmlUTF16LEHandler = xmlNewCharEncodingHandler("UTF-16LE", UTF16LEToUTF8, UTF8ToUTF16LE); - xmlUTF16BEHandler = + xmlUTF16BEHandler = xmlNewCharEncodingHandler("UTF-16BE", UTF16BEToUTF8, UTF8ToUTF16BE); xmlNewCharEncodingHandler("UTF-16", UTF16LEToUTF8, UTF8ToUTF16); xmlNewCharEncodingHandler("ISO-8859-1", isolat1ToUTF8, UTF8Toisolat1); @@ -1362,16 +1415,16 @@ xmlInitCharEncodingHandlers(void) { xmlNewCharEncodingHandler("HTML", NULL, UTF8ToHtml); #endif #else - xmlUTF16LEHandler = + xmlUTF16LEHandler = xmlNewCharEncodingHandler("UTF-16LE", UTF16LEToUTF8, NULL); - xmlUTF16BEHandler = + xmlUTF16BEHandler = xmlNewCharEncodingHandler("UTF-16BE", UTF16BEToUTF8, NULL); xmlNewCharEncodingHandler("UTF-16", UTF16LEToUTF8, NULL); xmlNewCharEncodingHandler("ISO-8859-1", isolat1ToUTF8, NULL); xmlNewCharEncodingHandler("ASCII", asciiToUTF8, NULL); xmlNewCharEncodingHandler("US-ASCII", asciiToUTF8, NULL); #endif /* LIBXML_OUTPUT_ENABLED */ -#ifndef LIBXML_ICONV_ENABLED +#if !defined(LIBXML_ICONV_ENABLED) && !defined(LIBXML_ICU_ENABLED) #ifdef LIBXML_ISO8859X_ENABLED xmlRegisterCharEncodingHandlersISO8859x (); #endif @@ -1550,10 +1603,10 @@ xmlGetCharEncodingHandler(xmlCharEncoding enc) { handler = xmlFindCharEncodingHandler("EUC-JP"); if (handler != NULL) return(handler); break; - default: + default: break; } - + #ifdef DEBUG_ENCODING xmlGenericError(xmlGenericErrorContext, "No handler found for encoding %d\n", enc); @@ -1578,6 +1631,10 @@ xmlFindCharEncodingHandler(const char *name) { xmlCharEncodingHandlerPtr enc; iconv_t icv_in, icv_out; #endif /* LIBXML_ICONV_ENABLED */ +#ifdef LIBXML_ICU_ENABLED + xmlCharEncodingHandlerPtr encu; + uconv_t *ucv_in, *ucv_out; +#endif /* LIBXML_ICU_ENABLED */ char upper[100]; int i; @@ -1632,6 +1689,7 @@ xmlFindCharEncodingHandler(const char *name) { iconv_close(icv_out); return(NULL); } + memset(enc, 0, sizeof(xmlCharEncodingHandler)); enc->name = xmlMemStrdup(name); enc->input = NULL; enc->output = NULL; @@ -1647,6 +1705,36 @@ xmlFindCharEncodingHandler(const char *name) { "iconv : problems with filters for '%s'\n", name); } #endif /* LIBXML_ICONV_ENABLED */ +#ifdef LIBXML_ICU_ENABLED + /* check whether icu can handle this */ + ucv_in = openIcuConverter(name, 1); + ucv_out = openIcuConverter(name, 0); + if (ucv_in != NULL && ucv_out != NULL) { + encu = (xmlCharEncodingHandlerPtr) + xmlMalloc(sizeof(xmlCharEncodingHandler)); + if (encu == NULL) { + closeIcuConverter(ucv_in); + closeIcuConverter(ucv_out); + return(NULL); + } + memset(encu, 0, sizeof(xmlCharEncodingHandler)); + encu->name = xmlMemStrdup(name); + encu->input = NULL; + encu->output = NULL; + encu->uconv_in = ucv_in; + encu->uconv_out = ucv_out; +#ifdef DEBUG_ENCODING + xmlGenericError(xmlGenericErrorContext, + "Found ICU converter handler for encoding %s\n", name); +#endif + return encu; + } else if (ucv_in != NULL || ucv_out != NULL) { + closeIcuConverter(ucv_in); + closeIcuConverter(ucv_out); + xmlEncodingErr(XML_ERR_INTERNAL_ERROR, + "ICU converter : problems with filters for '%s'\n", name); + } +#endif /* LIBXML_ICU_ENABLED */ #ifdef DEBUG_ENCODING xmlGenericError(xmlGenericErrorContext, @@ -1684,12 +1772,12 @@ xmlFindCharEncodingHandler(const char *name) { * @in: a pointer to an array of ISO Latin 1 chars * @inlen: the length of @in * - * Returns 0 if success, or + * Returns 0 if success, or * -1 by lack of space, or * -2 if the transcoding fails (for *in is not valid utf8 string or * the result of transformation can't fit into the encoding we want), or * -3 if there the last byte can't form a single output char. - * + * * The value of @inlen after return is the number of octets consumed * as the return value is positive, else unpredictable. * The value of @outlen after return is the number of ocetes consumed. @@ -1735,6 +1823,75 @@ xmlIconvWrapper(iconv_t cd, unsigned char *out, int *outlen, } #endif /* LIBXML_ICONV_ENABLED */ +/************************************************************************ + * * + * ICU based generic conversion functions * + * * + ************************************************************************/ + +#ifdef LIBXML_ICU_ENABLED +/** + * xmlUconvWrapper: + * @cd: ICU uconverter data structure + * @toUnicode : non-zero if toUnicode. 0 otherwise. + * @out: a pointer to an array of bytes to store the result + * @outlen: the length of @out + * @in: a pointer to an array of ISO Latin 1 chars + * @inlen: the length of @in + * + * Returns 0 if success, or + * -1 by lack of space, or + * -2 if the transcoding fails (for *in is not valid utf8 string or + * the result of transformation can't fit into the encoding we want), or + * -3 if there the last byte can't form a single output char. + * + * The value of @inlen after return is the number of octets consumed + * as the return value is positive, else unpredictable. + * The value of @outlen after return is the number of ocetes consumed. + */ +static int +xmlUconvWrapper(uconv_t *cd, int toUnicode, unsigned char *out, int *outlen, + const unsigned char *in, int *inlen) { + const char *ucv_in = (const char *) in; + char *ucv_out = (char *) out; + UErrorCode err = U_ZERO_ERROR; + + if ((out == NULL) || (outlen == NULL) || (inlen == NULL) || (in == NULL)) { + if (outlen != NULL) *outlen = 0; + return(-1); + } + + /* + * TODO(jungshik) + * 1. is ucnv_convert(To|From)Algorithmic better? + * 2. had we better use an explicit pivot buffer? + * 3. error returned comes from 'fromUnicode' only even + * when toUnicode is true ! + */ + if (toUnicode) { + /* encoding => UTF-16 => UTF-8 */ + ucnv_convertEx(cd->utf8, cd->uconv, &ucv_out, ucv_out + *outlen, + &ucv_in, ucv_in + *inlen, NULL, NULL, NULL, NULL, + 0, TRUE, &err); + } else { + /* UTF-8 => UTF-16 => encoding */ + ucnv_convertEx(cd->uconv, cd->utf8, &ucv_out, ucv_out + *outlen, + &ucv_in, ucv_in + *inlen, NULL, NULL, NULL, NULL, + 0, TRUE, &err); + } + *inlen = ucv_in - (const char*) in; + *outlen = ucv_out - (char *) out; + if (U_SUCCESS(err)) + return 0; + if (err == U_BUFFER_OVERFLOW_ERROR) + return -1; + if (err == U_INVALID_CHAR_FOUND || err == U_ILLEGAL_CHAR_FOUND) + return -2; + /* if (err == U_TRUNCATED_CHAR_FOUND) */ + return -3; +} +#endif /* LIBXML_ICU_ENABLED */ + /************************************************************************ * * * The real API used by libxml for on-the-fly conversion * @@ -1810,6 +1967,16 @@ xmlCharEncFirstLineInt(xmlCharEncodingHandler *handler, xmlBufferPtr out, if (ret == -1) ret = -3; } #endif /* LIBXML_ICONV_ENABLED */ +#ifdef LIBXML_ICU_ENABLED + else if (handler->uconv_in != NULL) { + ret = xmlUconvWrapper(handler->uconv_in, 1, &out->content[out->use], + &written, in->content, &toconv); + xmlBufferShrink(in, toconv); + out->use += written; + out->content[out->use] = 0; + if (ret == -1) ret = -3; + } +#endif /* LIBXML_ICU_ENABLED */ #ifdef DEBUG_ENCODING switch (ret) { case 0: @@ -1915,6 +2082,17 @@ xmlCharEncInFunc(xmlCharEncodingHandler * handler, xmlBufferPtr out, ret = -3; } #endif /* LIBXML_ICONV_ENABLED */ +#ifdef LIBXML_ICU_ENABLED + else if (handler->uconv_in != NULL) { + ret = xmlUconvWrapper(handler->uconv_in, 1, &out->content[out->use], + &written, in->content, &toconv); + xmlBufferShrink(in, toconv); + out->use += written; + out->content[out->use] = 0; + if (ret == -1) + ret = -3; + } +#endif /* LIBXML_ICU_ENABLED */ switch (ret) { case 0: #ifdef DEBUG_ENCODING @@ -1940,7 +2118,7 @@ xmlCharEncInFunc(xmlCharEncodingHandler * handler, xmlBufferPtr out, case -2: { char buf[50]; - snprintf(&buf[0], 49, "0x%02X 0x%02X 0x%02X 0x%02X", + snprintf(&buf[0], 49, "0x%02X 0x%02X 0x%02X 0x%02X", in->content[0], in->content[1], in->content[2], in->content[3]); buf[49] = 0; @@ -1962,15 +2140,15 @@ xmlCharEncInFunc(xmlCharEncodingHandler * handler, xmlBufferPtr out, * @handler: char enconding transformation data structure * @out: an xmlBuffer for the output. * @in: an xmlBuffer for the input - * + * * Generic front-end for the encoding handler output function - * a first call with @in == NULL has to be made firs to initiate the + * a first call with @in == NULL has to be made firs to initiate the * output in case of non-stateless encoding needing to initiate their * state or the output (like the BOM in UTF16). * In case of UTF8 sequence conversion errors for the given encoder, * the content will be automatically remapped to a CharRef sequence. - * - * Returns the number of byte written if success, or + * + * Returns the number of byte written if success, or * -1 general error * -2 if the transcoding fails (for *in is not valid utf8 string or * the result of transformation can't fit into the encoding we want), or @@ -1988,7 +2166,7 @@ xmlCharEncOutFunc(xmlCharEncodingHandler *handler, xmlBufferPtr out, if (out == NULL) return(-1); retry: - + written = out->size - out->use; if (written > 0) @@ -2015,6 +2193,15 @@ retry: out->content[out->use] = 0; } #endif /* LIBXML_ICONV_ENABLED */ +#ifdef LIBXML_ICU_ENABLED + else if (handler->uconv_out != NULL) { + ret = xmlUconvWrapper(handler->uconv_out, 0, + &out->content[out->use], + &written, NULL, &toconv); + out->use += written; + out->content[out->use] = 0; + } +#endif /* LIBXML_ICU_ENABLED */ #ifdef DEBUG_ENCODING xmlGenericError(xmlGenericErrorContext, "initialized encoder\n"); @@ -2039,7 +2226,7 @@ retry: xmlBufferShrink(in, toconv); out->use += written; writtentot += written; - } + } out->content[out->use] = 0; } #ifdef LIBXML_ICONV_ENABLED @@ -2061,6 +2248,26 @@ retry: } } #endif /* LIBXML_ICONV_ENABLED */ +#ifdef LIBXML_ICU_ENABLED + else if (handler->uconv_out != NULL) { + ret = xmlUconvWrapper(handler->uconv_out, 0, + &out->content[out->use], + &written, in->content, &toconv); + xmlBufferShrink(in, toconv); + out->use += written; + writtentot += written; + out->content[out->use] = 0; + if (ret == -1) { + if (written > 0) { + /* + * Can be a limitation of iconv + */ + goto retry; + } + ret = -3; + } + } +#endif /* LIBXML_ICU_ENABLED */ else { xmlEncodingErr(XML_I18N_NO_OUTPUT, "xmlCharEncOutFunc: no output function !\n", NULL); @@ -2122,7 +2329,7 @@ retry: } else { char buf[50]; - snprintf(&buf[0], 49, "0x%02X 0x%02X 0x%02X 0x%02X", + snprintf(&buf[0], 49, "0x%02X 0x%02X 0x%02X 0x%02X", in->content[0], in->content[1], in->content[2], in->content[3]); buf[49] = 0; @@ -2141,7 +2348,7 @@ retry: /** * xmlCharEncCloseFunc: * @handler: char enconding transformation data structure - * + * * Generic front-end for encoding handler close function * * Returns 0 if success, or -1 in case of error @@ -2149,6 +2356,7 @@ retry: int xmlCharEncCloseFunc(xmlCharEncodingHandler *handler) { int ret = 0; + int tofree = 0; if (handler == NULL) return(-1); if (handler->name == NULL) return(-1); #ifdef LIBXML_ICONV_ENABLED @@ -2157,9 +2365,7 @@ xmlCharEncCloseFunc(xmlCharEncodingHandler *handler) { * and the associated icon resources. */ if ((handler->iconv_out != NULL) || (handler->iconv_in != NULL)) { - if (handler->name != NULL) - xmlFree(handler->name); - handler->name = NULL; + tofree = 1; if (handler->iconv_out != NULL) { if (iconv_close(handler->iconv_out)) ret = -1; @@ -2170,9 +2376,28 @@ xmlCharEncCloseFunc(xmlCharEncodingHandler *handler) { ret = -1; handler->iconv_in = NULL; } - xmlFree(handler); } #endif /* LIBXML_ICONV_ENABLED */ +#ifdef LIBXML_ICU_ENABLED + if ((handler->uconv_out != NULL) || (handler->uconv_in != NULL)) { + tofree = 1; + if (handler->uconv_out != NULL) { + closeIcuConverter(handler->uconv_out); + handler->uconv_out = NULL; + } + if (handler->uconv_in != NULL) { + closeIcuConverter(handler->uconv_in); + handler->uconv_in = NULL; + } + } +#endif + if (tofree) { + /* free up only dynamic handlers iconv/uconv */ + if (handler->name != NULL) + xmlFree(handler->name); + handler->name = NULL; + xmlFree(handler); + } #ifdef DEBUG_ENCODING if (ret) xmlGenericError(xmlGenericErrorContext, @@ -2202,7 +2427,7 @@ xmlCharEncCloseFunc(xmlCharEncodingHandler *handler) { long xmlByteConsumed(xmlParserCtxtPtr ctxt) { xmlParserInputPtr in; - + if (ctxt == NULL) return(-1); in = ctxt->input; if (in == NULL) return(-1); @@ -2247,6 +2472,23 @@ xmlByteConsumed(xmlParserCtxtPtr ctxt) { unused += written; cur += toconv; } while (ret == -2); +#endif +#ifdef LIBXML_ICU_ENABLED + } else if (handler->uconv_out != NULL) { + do { + toconv = in->end - cur; + written = 32000; + ret = xmlUconvWrapper(handler->uconv_out, 0, &convbuf[0], + &written, cur, &toconv); + if (ret < 0) { + if (written > 0) + ret = -2; + else + return(-1); + } + unused += written; + cur += toconv; + } while (ret == -2); #endif } else { /* could not find a converter */ @@ -2260,7 +2502,7 @@ xmlByteConsumed(xmlParserCtxtPtr ctxt) { return(in->consumed + (in->cur - in->base)); } -#ifndef LIBXML_ICONV_ENABLED +#if !defined(LIBXML_ICONV_ENABLED) && !defined(LIBXML_ICU_ENABLED) #ifdef LIBXML_ISO8859X_ENABLED /** @@ -2286,6 +2528,7 @@ UTF8ToISO8859x(unsigned char* out, int *outlen, const unsigned char* outstart = out; const unsigned char* inend; const unsigned char* instart = in; + const unsigned char* processed = in; if ((out == NULL) || (outlen == NULL) || (inlen == NULL) || (xlattable == NULL)) @@ -2302,81 +2545,82 @@ UTF8ToISO8859x(unsigned char* out, int *outlen, while (in < inend) { unsigned char d = *in++; if (d < 0x80) { - *out++ = d; + *out++ = d; } else if (d < 0xC0) { /* trailing byte in leading position */ *outlen = out - outstart; - *inlen = in - instart - 1; + *inlen = processed - instart; return(-2); } else if (d < 0xE0) { unsigned char c; if (!(in < inend)) { /* trailing byte not in input buffer */ *outlen = out - outstart; - *inlen = in - instart - 1; - return(-2); + *inlen = processed - instart; + return(-3); } c = *in++; if ((c & 0xC0) != 0x80) { /* not a trailing byte */ *outlen = out - outstart; - *inlen = in - instart - 2; + *inlen = processed - instart; return(-2); } - c = c & 0x3F; + c = c & 0x3F; d = d & 0x1F; d = xlattable [48 + c + xlattable [d] * 64]; if (d == 0) { /* not in character set */ *outlen = out - outstart; - *inlen = in - instart - 2; + *inlen = processed - instart; return(-2); } - *out++ = d; + *out++ = d; } else if (d < 0xF0) { unsigned char c1; unsigned char c2; if (!(in < inend - 1)) { /* trailing bytes not in input buffer */ *outlen = out - outstart; - *inlen = in - instart - 1; - return(-2); + *inlen = processed - instart; + return(-3); } c1 = *in++; if ((c1 & 0xC0) != 0x80) { /* not a trailing byte (c1) */ *outlen = out - outstart; - *inlen = in - instart - 2; + *inlen = processed - instart; return(-2); } c2 = *in++; if ((c2 & 0xC0) != 0x80) { /* not a trailing byte (c2) */ *outlen = out - outstart; - *inlen = in - instart - 2; + *inlen = processed - instart; return(-2); } - c1 = c1 & 0x3F; - c2 = c2 & 0x3F; + c1 = c1 & 0x3F; + c2 = c2 & 0x3F; d = d & 0x0F; - d = xlattable [48 + c2 + xlattable [48 + c1 + + d = xlattable [48 + c2 + xlattable [48 + c1 + xlattable [32 + d] * 64] * 64]; if (d == 0) { /* not in character set */ *outlen = out - outstart; - *inlen = in - instart - 3; + *inlen = processed - instart; return(-2); } - *out++ = d; + *out++ = d; } else { /* cannot transcode >= U+010000 */ *outlen = out - outstart; - *inlen = in - instart - 1; + *inlen = processed - instart; return(-2); } + processed = in; } *outlen = out - outstart; - *inlen = in - instart; + *inlen = processed - instart; return(*outlen); } @@ -2410,16 +2654,16 @@ ISO8859xToUTF8(unsigned char* out, int *outlen, outend = out + *outlen; inend = in + *inlen; instop = inend; - c = *in; - while (in < inend && out < outend - 1) { - if (c >= 0x80) { - c = unicodetable [c - 0x80]; + + while ((in < inend) && (out < outend - 2)) { + if (*in >= 0x80) { + c = unicodetable [*in - 0x80]; if (c == 0) { /* undefined code point */ *outlen = out - outstart; *inlen = in - instart; return (-1); - } + } if (c < 0x800) { *out++ = ((c >> 6) & 0x1F) | 0xC0; *out++ = (c & 0x3F) | 0x80; @@ -2427,48 +2671,47 @@ ISO8859xToUTF8(unsigned char* out, int *outlen, *out++ = ((c >> 12) & 0x0F) | 0xE0; *out++ = ((c >> 6) & 0x3F) | 0x80; *out++ = (c & 0x3F) | 0x80; - } + } ++in; - c = *in; } - if (instop - in > outend - out) instop = in + (outend - out); - while (c < 0x80 && in < instop) { - *out++ = c; - ++in; - c = *in; + if (instop - in > outend - out) instop = in + (outend - out); + while ((*in < 0x80) && (in < instop)) { + *out++ = *in++; } - } - if (in < inend && out < outend && c < 0x80) { - *out++ = c; - ++in; + } + if ((in < inend) && (out < outend) && (*in < 0x80)) { + *out++ = *in++; + } + if ((in < inend) && (out < outend) && (*in < 0x80)) { + *out++ = *in++; } *outlen = out - outstart; *inlen = in - instart; return (*outlen); } - + /************************************************************************ * Lookup tables for ISO-8859-2..ISO-8859-16 transcoding * ************************************************************************/ static unsigned short const xmlunicodetable_ISO8859_2 [128] = { - 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, - 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, - 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, - 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, - 0x00a0, 0x0104, 0x02d8, 0x0141, 0x00a4, 0x013d, 0x015a, 0x00a7, - 0x00a8, 0x0160, 0x015e, 0x0164, 0x0179, 0x00ad, 0x017d, 0x017b, - 0x00b0, 0x0105, 0x02db, 0x0142, 0x00b4, 0x013e, 0x015b, 0x02c7, - 0x00b8, 0x0161, 0x015f, 0x0165, 0x017a, 0x02dd, 0x017e, 0x017c, - 0x0154, 0x00c1, 0x00c2, 0x0102, 0x00c4, 0x0139, 0x0106, 0x00c7, - 0x010c, 0x00c9, 0x0118, 0x00cb, 0x011a, 0x00cd, 0x00ce, 0x010e, - 0x0110, 0x0143, 0x0147, 0x00d3, 0x00d4, 0x0150, 0x00d6, 0x00d7, - 0x0158, 0x016e, 0x00da, 0x0170, 0x00dc, 0x00dd, 0x0162, 0x00df, - 0x0155, 0x00e1, 0x00e2, 0x0103, 0x00e4, 0x013a, 0x0107, 0x00e7, - 0x010d, 0x00e9, 0x0119, 0x00eb, 0x011b, 0x00ed, 0x00ee, 0x010f, - 0x0111, 0x0144, 0x0148, 0x00f3, 0x00f4, 0x0151, 0x00f6, 0x00f7, - 0x0159, 0x016f, 0x00fa, 0x0171, 0x00fc, 0x00fd, 0x0163, 0x02d9, + 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, + 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, + 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, + 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, + 0x00a0, 0x0104, 0x02d8, 0x0141, 0x00a4, 0x013d, 0x015a, 0x00a7, + 0x00a8, 0x0160, 0x015e, 0x0164, 0x0179, 0x00ad, 0x017d, 0x017b, + 0x00b0, 0x0105, 0x02db, 0x0142, 0x00b4, 0x013e, 0x015b, 0x02c7, + 0x00b8, 0x0161, 0x015f, 0x0165, 0x017a, 0x02dd, 0x017e, 0x017c, + 0x0154, 0x00c1, 0x00c2, 0x0102, 0x00c4, 0x0139, 0x0106, 0x00c7, + 0x010c, 0x00c9, 0x0118, 0x00cb, 0x011a, 0x00cd, 0x00ce, 0x010e, + 0x0110, 0x0143, 0x0147, 0x00d3, 0x00d4, 0x0150, 0x00d6, 0x00d7, + 0x0158, 0x016e, 0x00da, 0x0170, 0x00dc, 0x00dd, 0x0162, 0x00df, + 0x0155, 0x00e1, 0x00e2, 0x0103, 0x00e4, 0x013a, 0x0107, 0x00e7, + 0x010d, 0x00e9, 0x0119, 0x00eb, 0x011b, 0x00ed, 0x00ee, 0x010f, + 0x0111, 0x0144, 0x0148, 0x00f3, 0x00f4, 0x0151, 0x00f6, 0x00f7, + 0x0159, 0x016f, 0x00fa, 0x0171, 0x00fc, 0x00fd, 0x0163, 0x02d9, }; static unsigned char const xmltranscodetable_ISO8859_2 [48 + 6 * 64] = { @@ -2502,22 +2745,22 @@ static unsigned char const xmltranscodetable_ISO8859_2 [48 + 6 * 64] = { }; static unsigned short const xmlunicodetable_ISO8859_3 [128] = { - 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, - 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, - 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, - 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, - 0x00a0, 0x0126, 0x02d8, 0x00a3, 0x00a4, 0x0000, 0x0124, 0x00a7, - 0x00a8, 0x0130, 0x015e, 0x011e, 0x0134, 0x00ad, 0x0000, 0x017b, - 0x00b0, 0x0127, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x0125, 0x00b7, - 0x00b8, 0x0131, 0x015f, 0x011f, 0x0135, 0x00bd, 0x0000, 0x017c, - 0x00c0, 0x00c1, 0x00c2, 0x0000, 0x00c4, 0x010a, 0x0108, 0x00c7, - 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, - 0x0000, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x0120, 0x00d6, 0x00d7, - 0x011c, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x016c, 0x015c, 0x00df, - 0x00e0, 0x00e1, 0x00e2, 0x0000, 0x00e4, 0x010b, 0x0109, 0x00e7, - 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, - 0x0000, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x0121, 0x00f6, 0x00f7, - 0x011d, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x016d, 0x015d, 0x02d9, + 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, + 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, + 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, + 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, + 0x00a0, 0x0126, 0x02d8, 0x00a3, 0x00a4, 0x0000, 0x0124, 0x00a7, + 0x00a8, 0x0130, 0x015e, 0x011e, 0x0134, 0x00ad, 0x0000, 0x017b, + 0x00b0, 0x0127, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x0125, 0x00b7, + 0x00b8, 0x0131, 0x015f, 0x011f, 0x0135, 0x00bd, 0x0000, 0x017c, + 0x00c0, 0x00c1, 0x00c2, 0x0000, 0x00c4, 0x010a, 0x0108, 0x00c7, + 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, + 0x0000, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x0120, 0x00d6, 0x00d7, + 0x011c, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x016c, 0x015c, 0x00df, + 0x00e0, 0x00e1, 0x00e2, 0x0000, 0x00e4, 0x010b, 0x0109, 0x00e7, + 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, + 0x0000, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x0121, 0x00f6, 0x00f7, + 0x011d, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x016d, 0x015d, 0x02d9, }; static unsigned char const xmltranscodetable_ISO8859_3 [48 + 7 * 64] = { @@ -2555,22 +2798,22 @@ static unsigned char const xmltranscodetable_ISO8859_3 [48 + 7 * 64] = { }; static unsigned short const xmlunicodetable_ISO8859_4 [128] = { - 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, - 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, - 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, - 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, - 0x00a0, 0x0104, 0x0138, 0x0156, 0x00a4, 0x0128, 0x013b, 0x00a7, - 0x00a8, 0x0160, 0x0112, 0x0122, 0x0166, 0x00ad, 0x017d, 0x00af, - 0x00b0, 0x0105, 0x02db, 0x0157, 0x00b4, 0x0129, 0x013c, 0x02c7, - 0x00b8, 0x0161, 0x0113, 0x0123, 0x0167, 0x014a, 0x017e, 0x014b, - 0x0100, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x012e, - 0x010c, 0x00c9, 0x0118, 0x00cb, 0x0116, 0x00cd, 0x00ce, 0x012a, - 0x0110, 0x0145, 0x014c, 0x0136, 0x00d4, 0x00d5, 0x00d6, 0x00d7, - 0x00d8, 0x0172, 0x00da, 0x00db, 0x00dc, 0x0168, 0x016a, 0x00df, - 0x0101, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x012f, - 0x010d, 0x00e9, 0x0119, 0x00eb, 0x0117, 0x00ed, 0x00ee, 0x012b, - 0x0111, 0x0146, 0x014d, 0x0137, 0x00f4, 0x00f5, 0x00f6, 0x00f7, - 0x00f8, 0x0173, 0x00fa, 0x00fb, 0x00fc, 0x0169, 0x016b, 0x02d9, + 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, + 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, + 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, + 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, + 0x00a0, 0x0104, 0x0138, 0x0156, 0x00a4, 0x0128, 0x013b, 0x00a7, + 0x00a8, 0x0160, 0x0112, 0x0122, 0x0166, 0x00ad, 0x017d, 0x00af, + 0x00b0, 0x0105, 0x02db, 0x0157, 0x00b4, 0x0129, 0x013c, 0x02c7, + 0x00b8, 0x0161, 0x0113, 0x0123, 0x0167, 0x014a, 0x017e, 0x014b, + 0x0100, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x012e, + 0x010c, 0x00c9, 0x0118, 0x00cb, 0x0116, 0x00cd, 0x00ce, 0x012a, + 0x0110, 0x0145, 0x014c, 0x0136, 0x00d4, 0x00d5, 0x00d6, 0x00d7, + 0x00d8, 0x0172, 0x00da, 0x00db, 0x00dc, 0x0168, 0x016a, 0x00df, + 0x0101, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x012f, + 0x010d, 0x00e9, 0x0119, 0x00eb, 0x0117, 0x00ed, 0x00ee, 0x012b, + 0x0111, 0x0146, 0x014d, 0x0137, 0x00f4, 0x00f5, 0x00f6, 0x00f7, + 0x00f8, 0x0173, 0x00fa, 0x00fb, 0x00fc, 0x0169, 0x016b, 0x02d9, }; static unsigned char const xmltranscodetable_ISO8859_4 [48 + 6 * 64] = { @@ -2604,22 +2847,22 @@ static unsigned char const xmltranscodetable_ISO8859_4 [48 + 6 * 64] = { }; static unsigned short const xmlunicodetable_ISO8859_5 [128] = { - 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, - 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, - 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, - 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, - 0x00a0, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0406, 0x0407, - 0x0408, 0x0409, 0x040a, 0x040b, 0x040c, 0x00ad, 0x040e, 0x040f, - 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, - 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f, - 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, - 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f, - 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, - 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f, - 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, - 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f, - 0x2116, 0x0451, 0x0452, 0x0453, 0x0454, 0x0455, 0x0456, 0x0457, - 0x0458, 0x0459, 0x045a, 0x045b, 0x045c, 0x00a7, 0x045e, 0x045f, + 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, + 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, + 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, + 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, + 0x00a0, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0406, 0x0407, + 0x0408, 0x0409, 0x040a, 0x040b, 0x040c, 0x00ad, 0x040e, 0x040f, + 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, + 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f, + 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, + 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f, + 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, + 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f, + 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, + 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f, + 0x2116, 0x0451, 0x0452, 0x0453, 0x0454, 0x0455, 0x0456, 0x0457, + 0x0458, 0x0459, 0x045a, 0x045b, 0x045c, 0x00a7, 0x045e, 0x045f, }; static unsigned char const xmltranscodetable_ISO8859_5 [48 + 6 * 64] = { @@ -2653,22 +2896,22 @@ static unsigned char const xmltranscodetable_ISO8859_5 [48 + 6 * 64] = { }; static unsigned short const xmlunicodetable_ISO8859_6 [128] = { - 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, - 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, - 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, - 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, - 0x00a0, 0x0000, 0x0000, 0x0000, 0x00a4, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x060c, 0x00ad, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x061b, 0x0000, 0x0000, 0x0000, 0x061f, - 0x0000, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627, - 0x0628, 0x0629, 0x062a, 0x062b, 0x062c, 0x062d, 0x062e, 0x062f, - 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x0637, - 0x0638, 0x0639, 0x063a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0640, 0x0641, 0x0642, 0x0643, 0x0644, 0x0645, 0x0646, 0x0647, - 0x0648, 0x0649, 0x064a, 0x064b, 0x064c, 0x064d, 0x064e, 0x064f, - 0x0650, 0x0651, 0x0652, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, + 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, + 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, + 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, + 0x00a0, 0x0000, 0x0000, 0x0000, 0x00a4, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x060c, 0x00ad, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x061b, 0x0000, 0x0000, 0x0000, 0x061f, + 0x0000, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627, + 0x0628, 0x0629, 0x062a, 0x062b, 0x062c, 0x062d, 0x062e, 0x062f, + 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x0637, + 0x0638, 0x0639, 0x063a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0640, 0x0641, 0x0642, 0x0643, 0x0644, 0x0645, 0x0646, 0x0647, + 0x0648, 0x0649, 0x064a, 0x064b, 0x064c, 0x064d, 0x064e, 0x064f, + 0x0650, 0x0651, 0x0652, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, }; static unsigned char const xmltranscodetable_ISO8859_6 [48 + 5 * 64] = { @@ -2698,22 +2941,22 @@ static unsigned char const xmltranscodetable_ISO8859_6 [48 + 5 * 64] = { }; static unsigned short const xmlunicodetable_ISO8859_7 [128] = { - 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, - 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, - 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, - 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, - 0x00a0, 0x2018, 0x2019, 0x00a3, 0x0000, 0x0000, 0x00a6, 0x00a7, - 0x00a8, 0x00a9, 0x0000, 0x00ab, 0x00ac, 0x00ad, 0x0000, 0x2015, - 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x0384, 0x0385, 0x0386, 0x00b7, - 0x0388, 0x0389, 0x038a, 0x00bb, 0x038c, 0x00bd, 0x038e, 0x038f, - 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, - 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f, - 0x03a0, 0x03a1, 0x0000, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7, - 0x03a8, 0x03a9, 0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03ae, 0x03af, - 0x03b0, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7, - 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf, - 0x03c0, 0x03c1, 0x03c2, 0x03c3, 0x03c4, 0x03c5, 0x03c6, 0x03c7, - 0x03c8, 0x03c9, 0x03ca, 0x03cb, 0x03cc, 0x03cd, 0x03ce, 0x0000, + 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, + 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, + 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, + 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, + 0x00a0, 0x2018, 0x2019, 0x00a3, 0x0000, 0x0000, 0x00a6, 0x00a7, + 0x00a8, 0x00a9, 0x0000, 0x00ab, 0x00ac, 0x00ad, 0x0000, 0x2015, + 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x0384, 0x0385, 0x0386, 0x00b7, + 0x0388, 0x0389, 0x038a, 0x00bb, 0x038c, 0x00bd, 0x038e, 0x038f, + 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, + 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f, + 0x03a0, 0x03a1, 0x0000, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7, + 0x03a8, 0x03a9, 0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03ae, 0x03af, + 0x03b0, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7, + 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf, + 0x03c0, 0x03c1, 0x03c2, 0x03c3, 0x03c4, 0x03c5, 0x03c6, 0x03c7, + 0x03c8, 0x03c9, 0x03ca, 0x03cb, 0x03cc, 0x03cd, 0x03ce, 0x0000, }; static unsigned char const xmltranscodetable_ISO8859_7 [48 + 7 * 64] = { @@ -2751,22 +2994,22 @@ static unsigned char const xmltranscodetable_ISO8859_7 [48 + 7 * 64] = { }; static unsigned short const xmlunicodetable_ISO8859_8 [128] = { - 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, - 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, - 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, - 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, - 0x00a0, 0x0000, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, - 0x00a8, 0x00a9, 0x00d7, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, - 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, - 0x00b8, 0x00b9, 0x00f7, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2017, - 0x05d0, 0x05d1, 0x05d2, 0x05d3, 0x05d4, 0x05d5, 0x05d6, 0x05d7, - 0x05d8, 0x05d9, 0x05da, 0x05db, 0x05dc, 0x05dd, 0x05de, 0x05df, - 0x05e0, 0x05e1, 0x05e2, 0x05e3, 0x05e4, 0x05e5, 0x05e6, 0x05e7, - 0x05e8, 0x05e9, 0x05ea, 0x0000, 0x0000, 0x200e, 0x200f, 0x0000, + 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, + 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, + 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, + 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, + 0x00a0, 0x0000, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, + 0x00a8, 0x00a9, 0x00d7, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, + 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, + 0x00b8, 0x00b9, 0x00f7, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2017, + 0x05d0, 0x05d1, 0x05d2, 0x05d3, 0x05d4, 0x05d5, 0x05d6, 0x05d7, + 0x05d8, 0x05d9, 0x05da, 0x05db, 0x05dc, 0x05dd, 0x05de, 0x05df, + 0x05e0, 0x05e1, 0x05e2, 0x05e3, 0x05e4, 0x05e5, 0x05e6, 0x05e7, + 0x05e8, 0x05e9, 0x05ea, 0x0000, 0x0000, 0x200e, 0x200f, 0x0000, }; static unsigned char const xmltranscodetable_ISO8859_8 [48 + 7 * 64] = { @@ -2804,22 +3047,22 @@ static unsigned char const xmltranscodetable_ISO8859_8 [48 + 7 * 64] = { }; static unsigned short const xmlunicodetable_ISO8859_9 [128] = { - 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, - 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, - 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, - 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, - 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, - 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, - 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, - 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf, - 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7, - 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, - 0x011e, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, - 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x0130, 0x015e, 0x00df, - 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, - 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, - 0x011f, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, - 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x0131, 0x015f, 0x00ff, + 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, + 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, + 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, + 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, + 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, + 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, + 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, + 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf, + 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7, + 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, + 0x011e, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, + 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x0130, 0x015e, 0x00df, + 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, + 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, + 0x011f, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, + 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x0131, 0x015f, 0x00ff, }; static unsigned char const xmltranscodetable_ISO8859_9 [48 + 5 * 64] = { @@ -2849,22 +3092,22 @@ static unsigned char const xmltranscodetable_ISO8859_9 [48 + 5 * 64] = { }; static unsigned short const xmlunicodetable_ISO8859_10 [128] = { - 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, - 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, - 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, - 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, - 0x00a0, 0x0104, 0x0112, 0x0122, 0x012a, 0x0128, 0x0136, 0x00a7, - 0x013b, 0x0110, 0x0160, 0x0166, 0x017d, 0x00ad, 0x016a, 0x014a, - 0x00b0, 0x0105, 0x0113, 0x0123, 0x012b, 0x0129, 0x0137, 0x00b7, - 0x013c, 0x0111, 0x0161, 0x0167, 0x017e, 0x2015, 0x016b, 0x014b, - 0x0100, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x012e, - 0x010c, 0x00c9, 0x0118, 0x00cb, 0x0116, 0x00cd, 0x00ce, 0x00cf, - 0x00d0, 0x0145, 0x014c, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x0168, - 0x00d8, 0x0172, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df, - 0x0101, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x012f, - 0x010d, 0x00e9, 0x0119, 0x00eb, 0x0117, 0x00ed, 0x00ee, 0x00ef, - 0x00f0, 0x0146, 0x014d, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x0169, - 0x00f8, 0x0173, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x0138, + 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, + 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, + 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, + 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, + 0x00a0, 0x0104, 0x0112, 0x0122, 0x012a, 0x0128, 0x0136, 0x00a7, + 0x013b, 0x0110, 0x0160, 0x0166, 0x017d, 0x00ad, 0x016a, 0x014a, + 0x00b0, 0x0105, 0x0113, 0x0123, 0x012b, 0x0129, 0x0137, 0x00b7, + 0x013c, 0x0111, 0x0161, 0x0167, 0x017e, 0x2015, 0x016b, 0x014b, + 0x0100, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x012e, + 0x010c, 0x00c9, 0x0118, 0x00cb, 0x0116, 0x00cd, 0x00ce, 0x00cf, + 0x00d0, 0x0145, 0x014c, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x0168, + 0x00d8, 0x0172, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df, + 0x0101, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x012f, + 0x010d, 0x00e9, 0x0119, 0x00eb, 0x0117, 0x00ed, 0x00ee, 0x00ef, + 0x00f0, 0x0146, 0x014d, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x0169, + 0x00f8, 0x0173, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x0138, }; static unsigned char const xmltranscodetable_ISO8859_10 [48 + 7 * 64] = { @@ -2902,22 +3145,22 @@ static unsigned char const xmltranscodetable_ISO8859_10 [48 + 7 * 64] = { }; static unsigned short const xmlunicodetable_ISO8859_11 [128] = { - 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, - 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, - 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, - 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, - 0x00a0, 0x0e01, 0x0e02, 0x0e03, 0x0e04, 0x0e05, 0x0e06, 0x0e07, - 0x0e08, 0x0e09, 0x0e0a, 0x0e0b, 0x0e0c, 0x0e0d, 0x0e0e, 0x0e0f, - 0x0e10, 0x0e11, 0x0e12, 0x0e13, 0x0e14, 0x0e15, 0x0e16, 0x0e17, - 0x0e18, 0x0e19, 0x0e1a, 0x0e1b, 0x0e1c, 0x0e1d, 0x0e1e, 0x0e1f, - 0x0e20, 0x0e21, 0x0e22, 0x0e23, 0x0e24, 0x0e25, 0x0e26, 0x0e27, - 0x0e28, 0x0e29, 0x0e2a, 0x0e2b, 0x0e2c, 0x0e2d, 0x0e2e, 0x0e2f, - 0x0e30, 0x0e31, 0x0e32, 0x0e33, 0x0e34, 0x0e35, 0x0e36, 0x0e37, - 0x0e38, 0x0e39, 0x0e3a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0e3f, - 0x0e40, 0x0e41, 0x0e42, 0x0e43, 0x0e44, 0x0e45, 0x0e46, 0x0e47, - 0x0e48, 0x0e49, 0x0e4a, 0x0e4b, 0x0e4c, 0x0e4d, 0x0e4e, 0x0e4f, - 0x0e50, 0x0e51, 0x0e52, 0x0e53, 0x0e54, 0x0e55, 0x0e56, 0x0e57, - 0x0e58, 0x0e59, 0x0e5a, 0x0e5b, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, + 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, + 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, + 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, + 0x00a0, 0x0e01, 0x0e02, 0x0e03, 0x0e04, 0x0e05, 0x0e06, 0x0e07, + 0x0e08, 0x0e09, 0x0e0a, 0x0e0b, 0x0e0c, 0x0e0d, 0x0e0e, 0x0e0f, + 0x0e10, 0x0e11, 0x0e12, 0x0e13, 0x0e14, 0x0e15, 0x0e16, 0x0e17, + 0x0e18, 0x0e19, 0x0e1a, 0x0e1b, 0x0e1c, 0x0e1d, 0x0e1e, 0x0e1f, + 0x0e20, 0x0e21, 0x0e22, 0x0e23, 0x0e24, 0x0e25, 0x0e26, 0x0e27, + 0x0e28, 0x0e29, 0x0e2a, 0x0e2b, 0x0e2c, 0x0e2d, 0x0e2e, 0x0e2f, + 0x0e30, 0x0e31, 0x0e32, 0x0e33, 0x0e34, 0x0e35, 0x0e36, 0x0e37, + 0x0e38, 0x0e39, 0x0e3a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0e3f, + 0x0e40, 0x0e41, 0x0e42, 0x0e43, 0x0e44, 0x0e45, 0x0e46, 0x0e47, + 0x0e48, 0x0e49, 0x0e4a, 0x0e4b, 0x0e4c, 0x0e4d, 0x0e4e, 0x0e4f, + 0x0e50, 0x0e51, 0x0e52, 0x0e53, 0x0e54, 0x0e55, 0x0e56, 0x0e57, + 0x0e58, 0x0e59, 0x0e5a, 0x0e5b, 0x0000, 0x0000, 0x0000, 0x0000, }; static unsigned char const xmltranscodetable_ISO8859_11 [48 + 6 * 64] = { @@ -2951,22 +3194,22 @@ static unsigned char const xmltranscodetable_ISO8859_11 [48 + 6 * 64] = { }; static unsigned short const xmlunicodetable_ISO8859_13 [128] = { - 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, - 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, - 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, - 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, - 0x00a0, 0x201d, 0x00a2, 0x00a3, 0x00a4, 0x201e, 0x00a6, 0x00a7, - 0x00d8, 0x00a9, 0x0156, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00c6, - 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x201c, 0x00b5, 0x00b6, 0x00b7, - 0x00f8, 0x00b9, 0x0157, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00e6, - 0x0104, 0x012e, 0x0100, 0x0106, 0x00c4, 0x00c5, 0x0118, 0x0112, - 0x010c, 0x00c9, 0x0179, 0x0116, 0x0122, 0x0136, 0x012a, 0x013b, - 0x0160, 0x0143, 0x0145, 0x00d3, 0x014c, 0x00d5, 0x00d6, 0x00d7, - 0x0172, 0x0141, 0x015a, 0x016a, 0x00dc, 0x017b, 0x017d, 0x00df, - 0x0105, 0x012f, 0x0101, 0x0107, 0x00e4, 0x00e5, 0x0119, 0x0113, - 0x010d, 0x00e9, 0x017a, 0x0117, 0x0123, 0x0137, 0x012b, 0x013c, - 0x0161, 0x0144, 0x0146, 0x00f3, 0x014d, 0x00f5, 0x00f6, 0x00f7, - 0x0173, 0x0142, 0x015b, 0x016b, 0x00fc, 0x017c, 0x017e, 0x2019, + 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, + 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, + 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, + 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, + 0x00a0, 0x201d, 0x00a2, 0x00a3, 0x00a4, 0x201e, 0x00a6, 0x00a7, + 0x00d8, 0x00a9, 0x0156, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00c6, + 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x201c, 0x00b5, 0x00b6, 0x00b7, + 0x00f8, 0x00b9, 0x0157, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00e6, + 0x0104, 0x012e, 0x0100, 0x0106, 0x00c4, 0x00c5, 0x0118, 0x0112, + 0x010c, 0x00c9, 0x0179, 0x0116, 0x0122, 0x0136, 0x012a, 0x013b, + 0x0160, 0x0143, 0x0145, 0x00d3, 0x014c, 0x00d5, 0x00d6, 0x00d7, + 0x0172, 0x0141, 0x015a, 0x016a, 0x00dc, 0x017b, 0x017d, 0x00df, + 0x0105, 0x012f, 0x0101, 0x0107, 0x00e4, 0x00e5, 0x0119, 0x0113, + 0x010d, 0x00e9, 0x017a, 0x0117, 0x0123, 0x0137, 0x012b, 0x013c, + 0x0161, 0x0144, 0x0146, 0x00f3, 0x014d, 0x00f5, 0x00f6, 0x00f7, + 0x0173, 0x0142, 0x015b, 0x016b, 0x00fc, 0x017c, 0x017e, 0x2019, }; static unsigned char const xmltranscodetable_ISO8859_13 [48 + 7 * 64] = { @@ -3004,22 +3247,22 @@ static unsigned char const xmltranscodetable_ISO8859_13 [48 + 7 * 64] = { }; static unsigned short const xmlunicodetable_ISO8859_14 [128] = { - 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, - 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, - 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, - 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, - 0x00a0, 0x1e02, 0x1e03, 0x00a3, 0x010a, 0x010b, 0x1e0a, 0x00a7, - 0x1e80, 0x00a9, 0x1e82, 0x1e0b, 0x1ef2, 0x00ad, 0x00ae, 0x0178, - 0x1e1e, 0x1e1f, 0x0120, 0x0121, 0x1e40, 0x1e41, 0x00b6, 0x1e56, - 0x1e81, 0x1e57, 0x1e83, 0x1e60, 0x1ef3, 0x1e84, 0x1e85, 0x1e61, - 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7, - 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, - 0x0174, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x1e6a, - 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x0176, 0x00df, - 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, - 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, - 0x0175, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x1e6b, - 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x0177, 0x00ff, + 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, + 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, + 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, + 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, + 0x00a0, 0x1e02, 0x1e03, 0x00a3, 0x010a, 0x010b, 0x1e0a, 0x00a7, + 0x1e80, 0x00a9, 0x1e82, 0x1e0b, 0x1ef2, 0x00ad, 0x00ae, 0x0178, + 0x1e1e, 0x1e1f, 0x0120, 0x0121, 0x1e40, 0x1e41, 0x00b6, 0x1e56, + 0x1e81, 0x1e57, 0x1e83, 0x1e60, 0x1ef3, 0x1e84, 0x1e85, 0x1e61, + 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7, + 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, + 0x0174, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x1e6a, + 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x0176, 0x00df, + 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, + 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, + 0x0175, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x1e6b, + 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x0177, 0x00ff, }; static unsigned char const xmltranscodetable_ISO8859_14 [48 + 10 * 64] = { @@ -3069,22 +3312,22 @@ static unsigned char const xmltranscodetable_ISO8859_14 [48 + 10 * 64] = { }; static unsigned short const xmlunicodetable_ISO8859_15 [128] = { - 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, - 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, - 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, - 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, - 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x20ac, 0x00a5, 0x0160, 0x00a7, - 0x0161, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, - 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x017d, 0x00b5, 0x00b6, 0x00b7, - 0x017e, 0x00b9, 0x00ba, 0x00bb, 0x0152, 0x0153, 0x0178, 0x00bf, - 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7, - 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, - 0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, - 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df, - 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, - 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, - 0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, - 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00ff, + 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, + 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, + 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, + 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, + 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x20ac, 0x00a5, 0x0160, 0x00a7, + 0x0161, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, + 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x017d, 0x00b5, 0x00b6, 0x00b7, + 0x017e, 0x00b9, 0x00ba, 0x00bb, 0x0152, 0x0153, 0x0178, 0x00bf, + 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7, + 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, + 0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, + 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df, + 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, + 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, + 0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, + 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00ff, }; static unsigned char const xmltranscodetable_ISO8859_15 [48 + 6 * 64] = { @@ -3118,22 +3361,22 @@ static unsigned char const xmltranscodetable_ISO8859_15 [48 + 6 * 64] = { }; static unsigned short const xmlunicodetable_ISO8859_16 [128] = { - 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, - 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, - 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, - 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, - 0x00a0, 0x0104, 0x0105, 0x0141, 0x20ac, 0x201e, 0x0160, 0x00a7, - 0x0161, 0x00a9, 0x0218, 0x00ab, 0x0179, 0x00ad, 0x017a, 0x017b, - 0x00b0, 0x00b1, 0x010c, 0x0142, 0x017d, 0x201d, 0x00b6, 0x00b7, - 0x017e, 0x010d, 0x0219, 0x00bb, 0x0152, 0x0153, 0x0178, 0x017c, - 0x00c0, 0x00c1, 0x00c2, 0x0102, 0x00c4, 0x0106, 0x00c6, 0x00c7, - 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, - 0x0110, 0x0143, 0x00d2, 0x00d3, 0x00d4, 0x0150, 0x00d6, 0x015a, - 0x0170, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x0118, 0x021a, 0x00df, - 0x00e0, 0x00e1, 0x00e2, 0x0103, 0x00e4, 0x0107, 0x00e6, 0x00e7, - 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, - 0x0111, 0x0144, 0x00f2, 0x00f3, 0x00f4, 0x0151, 0x00f6, 0x015b, - 0x0171, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x0119, 0x021b, 0x00ff, + 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, + 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, + 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, + 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, + 0x00a0, 0x0104, 0x0105, 0x0141, 0x20ac, 0x201e, 0x0160, 0x00a7, + 0x0161, 0x00a9, 0x0218, 0x00ab, 0x0179, 0x00ad, 0x017a, 0x017b, + 0x00b0, 0x00b1, 0x010c, 0x0142, 0x017d, 0x201d, 0x00b6, 0x00b7, + 0x017e, 0x010d, 0x0219, 0x00bb, 0x0152, 0x0153, 0x0178, 0x017c, + 0x00c0, 0x00c1, 0x00c2, 0x0102, 0x00c4, 0x0106, 0x00c6, 0x00c7, + 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, + 0x0110, 0x0143, 0x00d2, 0x00d3, 0x00d4, 0x0150, 0x00d6, 0x015a, + 0x0170, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x0118, 0x021a, 0x00df, + 0x00e0, 0x00e1, 0x00e2, 0x0103, 0x00e4, 0x0107, 0x00e6, 0x00e7, + 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, + 0x0111, 0x0144, 0x00f2, 0x00f3, 0x00f4, 0x0151, 0x00f6, 0x015b, + 0x0171, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x0119, 0x021b, 0x00ff, }; static unsigned char const xmltranscodetable_ISO8859_16 [48 + 9 * 64] = { @@ -3332,4 +3575,3 @@ xmlRegisterCharEncodingHandlersISO8859x (void) { #define bottom_encoding #include "elfgcchack.h" - diff --git a/reactos/lib/3rdparty/libxml2/include/Makefile.in b/reactos/lib/3rdparty/libxml2/include/Makefile.in index c0d974c75a3..6e219c735eb 100644 --- a/reactos/lib/3rdparty/libxml2/include/Makefile.in +++ b/reactos/lib/3rdparty/libxml2/include/Makefile.in @@ -42,7 +42,7 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) -mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = @@ -166,6 +166,7 @@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PERL = @PERL@ @@ -214,6 +215,7 @@ VERSION_SCRIPT_FLAGS = @VERSION_SCRIPT_FLAGS@ WGET = @WGET@ WIN32_EXTRA_LDFLAGS = @WIN32_EXTRA_LDFLAGS@ WIN32_EXTRA_LIBADD = @WIN32_EXTRA_LIBADD@ +WIN32_EXTRA_PYTHON_LIBADD = @WIN32_EXTRA_PYTHON_LIBADD@ WITH_C14N = @WITH_C14N@ WITH_CATALOG = @WITH_CATALOG@ WITH_DEBUG = @WITH_DEBUG@ @@ -222,6 +224,7 @@ WITH_FTP = @WITH_FTP@ WITH_HTML = @WITH_HTML@ WITH_HTTP = @WITH_HTTP@ WITH_ICONV = @WITH_ICONV@ +WITH_ICU = @WITH_ICU@ WITH_ISO8859X = @WITH_ISO8859X@ WITH_LEGACY = @WITH_LEGACY@ WITH_MEM_DEBUG = @WITH_MEM_DEBUG@ @@ -292,7 +295,6 @@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ -lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ diff --git a/reactos/lib/3rdparty/libxml2/libxml2.spec b/reactos/lib/3rdparty/libxml2/libxml2.spec index 94a2a3f9d4c..42fa672138c 100644 --- a/reactos/lib/3rdparty/libxml2/libxml2.spec +++ b/reactos/lib/3rdparty/libxml2/libxml2.spec @@ -1,6 +1,6 @@ Summary: Library providing XML and HTML support Name: libxml2 -Version: 2.7.7 +Version: 2.7.8 Release: 1 License: MIT Group: Development/Libraries @@ -127,6 +127,6 @@ rm -fr %{buildroot} %doc doc/python.html %changelog -* Mon Mar 15 2010 Daniel Veillard -- upstream release 2.7.7 see http://xmlsoft.org/news.html +* Thu Nov 4 2010 Daniel Veillard +- upstream release 2.7.8 see http://xmlsoft.org/news.html diff --git a/reactos/lib/3rdparty/libxml2/ltmain.sh b/reactos/lib/3rdparty/libxml2/ltmain.sh index a72f2fd78bf..d8efb57b1d7 100644 --- a/reactos/lib/3rdparty/libxml2/ltmain.sh +++ b/reactos/lib/3rdparty/libxml2/ltmain.sh @@ -1,9 +1,10 @@ # Generated from ltmain.m4sh. -# ltmain.sh (GNU libtool) 2.2.6b +# libtool (GNU libtool) 2.2.10 # Written by Gordon Matzigkeit , 1996 -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, 2007 2008 Free Software Foundation, Inc. +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, +# 2007, 2008, 2009, 2010 Free Software Foundation, Inc. # This is free software; see the source for copying conditions. There is NO # warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. @@ -32,50 +33,54 @@ # # Provide generalized library-building support services. # -# --config show all configuration variables -# --debug enable verbose shell tracing -# -n, --dry-run display commands without modifying any files -# --features display basic configuration information and exit -# --mode=MODE use operation mode MODE -# --preserve-dup-deps don't remove duplicate dependency libraries -# --quiet, --silent don't print informational messages -# --tag=TAG use configuration variables from tag TAG -# -v, --verbose print informational messages (default) -# --version print version information -# -h, --help print short or long help message +# --config show all configuration variables +# --debug enable verbose shell tracing +# -n, --dry-run display commands without modifying any files +# --features display basic configuration information and exit +# --mode=MODE use operation mode MODE +# --preserve-dup-deps don't remove duplicate dependency libraries +# --quiet, --silent don't print informational messages +# --no-quiet, --no-silent +# print informational messages (default) +# --tag=TAG use configuration variables from tag TAG +# -v, --verbose print more informational messages than default +# --no-verbose don't print the extra informational messages +# --version print version information +# -h, --help, --help-all print short, long, or detailed help message # # MODE must be one of the following: # -# clean remove files from the build directory -# compile compile a source file into a libtool object -# execute automatically set library path, then run a program -# finish complete the installation of libtool libraries -# install install libraries or executables -# link create a library or an executable -# uninstall remove libraries from an installed directory +# clean remove files from the build directory +# compile compile a source file into a libtool object +# execute automatically set library path, then run a program +# finish complete the installation of libtool libraries +# install install libraries or executables +# link create a library or an executable +# uninstall remove libraries from an installed directory # -# MODE-ARGS vary depending on the MODE. +# MODE-ARGS vary depending on the MODE. When passed as first option, +# `--mode=MODE' may be abbreviated as `MODE' or a unique abbreviation of that. # Try `$progname --help --mode=MODE' for a more detailed description of MODE. # # When reporting a bug, please describe a test case to reproduce it and # include the following information: # -# host-triplet: $host -# shell: $SHELL -# compiler: $LTCC -# compiler flags: $LTCFLAGS -# linker: $LD (gnu? $with_gnu_ld) -# $progname: (GNU libtool) 2.2.6b -# automake: $automake_version -# autoconf: $autoconf_version +# host-triplet: $host +# shell: $SHELL +# compiler: $LTCC +# compiler flags: $LTCFLAGS +# linker: $LD (gnu? $with_gnu_ld) +# $progname: (GNU libtool) 2.2.10 +# automake: $automake_version +# autoconf: $autoconf_version # # Report bugs to . -PROGRAM=ltmain.sh +PROGRAM=libtool PACKAGE=libtool -VERSION=2.2.6b +VERSION=2.2.10 TIMESTAMP="" -package_revision=1.3017 +package_revision=1.3175 # Be Bourne compatible if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then @@ -91,10 +96,15 @@ fi BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +$1 +_LTECHO_EOF' +} + # NLS nuisances: We save the old values to restore during execute mode. -# Only set LANG and LC_ALL to C if already set. -# These must not be set unconditionally because not all systems understand -# e.g. LANG=C (notably SCO). lt_user_locale= lt_safe_locale= for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES @@ -107,15 +117,24 @@ do lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\" fi" done +LC_ALL=C +LANGUAGE=C +export LANGUAGE LC_ALL $lt_unset CDPATH +# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh +# is ksh but when the shell is invoked as "sh" and the current value of +# the _XPG environment variable is not equal to 1 (one), the special +# positional parameter $0, within a function call, is the name of the +# function. +progpath="$0" : ${CP="cp -f"} -: ${ECHO="echo"} +test "${ECHO+set}" = set || ECHO=${as_echo-'printf %s\n'} : ${EGREP="/bin/grep -E"} : ${FGREP="/bin/grep -F"} : ${GREP="/bin/grep"} @@ -159,32 +178,168 @@ basename="s,^.*/,," func_dirname_and_basename () { # Extract subdirectory from the argument. - func_dirname_result=`$ECHO "X${1}" | $Xsed -e "$dirname"` + func_dirname_result=`$ECHO "${1}" | $SED -e "$dirname"` if test "X$func_dirname_result" = "X${1}"; then func_dirname_result="${3}" else func_dirname_result="$func_dirname_result${2}" fi - func_basename_result=`$ECHO "X${1}" | $Xsed -e "$basename"` + func_basename_result=`$ECHO "${1}" | $SED -e "$basename"` } # Generated shell functions inserted here. -# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh -# is ksh but when the shell is invoked as "sh" and the current value of -# the _XPG environment variable is not equal to 1 (one), the special -# positional parameter $0, within a function call, is the name of the -# function. -progpath="$0" +# These SED scripts presuppose an absolute path with a trailing slash. +pathcar='s,^/\([^/]*\).*$,\1,' +pathcdr='s,^/[^/]*,,' +removedotparts=':dotsl + s@/\./@/@g + t dotsl + s,/\.$,/,' +collapseslashes='s@/\{1,\}@/@g' +finalslash='s,/*$,/,' + +# func_normal_abspath PATH +# Remove doubled-up and trailing slashes, "." path components, +# and cancel out any ".." path components in PATH after making +# it an absolute path. +# value returned in "$func_normal_abspath_result" +func_normal_abspath () +{ + # Start from root dir and reassemble the path. + func_normal_abspath_result= + func_normal_abspath_tpath=$1 + func_normal_abspath_altnamespace= + case $func_normal_abspath_tpath in + "") + # Empty path, that just means $cwd. + func_stripname '' '/' "`pwd`" + func_normal_abspath_result=$func_stripname_result + return + ;; + # The next three entries are used to spot a run of precisely + # two leading slashes without using negated character classes; + # we take advantage of case's first-match behaviour. + ///*) + # Unusual form of absolute path, do nothing. + ;; + //*) + # Not necessarily an ordinary path; POSIX reserves leading '//' + # and for example Cygwin uses it to access remote file shares + # over CIFS/SMB, so we conserve a leading double slash if found. + func_normal_abspath_altnamespace=/ + ;; + /*) + # Absolute path, do nothing. + ;; + *) + # Relative path, prepend $cwd. + func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath + ;; + esac + # Cancel out all the simple stuff to save iterations. We also want + # the path to end with a slash for ease of parsing, so make sure + # there is one (and only one) here. + func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$removedotparts" -e "$collapseslashes" -e "$finalslash"` + while :; do + # Processed it all yet? + if test "$func_normal_abspath_tpath" = / ; then + # If we ascended to the root using ".." the result may be empty now. + if test -z "$func_normal_abspath_result" ; then + func_normal_abspath_result=/ + fi + break + fi + func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$pathcar"` + func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$pathcdr"` + # Figure out what to do with it + case $func_normal_abspath_tcomponent in + "") + # Trailing empty path component, ignore it. + ;; + ..) + # Parent dir; strip last assembled component from result. + func_dirname "$func_normal_abspath_result" + func_normal_abspath_result=$func_dirname_result + ;; + *) + # Actual path component, append it. + func_normal_abspath_result=$func_normal_abspath_result/$func_normal_abspath_tcomponent + ;; + esac + done + # Restore leading double-slash if one was found on entry. + func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result +} + +# func_relative_path SRCDIR DSTDIR +# generates a relative path from SRCDIR to DSTDIR, with a trailing +# slash if non-empty, suitable for immediately appending a filename +# without needing to append a separator. +# value returned in "$func_relative_path_result" +func_relative_path () +{ + func_relative_path_result= + func_normal_abspath "$1" + func_relative_path_tlibdir=$func_normal_abspath_result + func_normal_abspath "$2" + func_relative_path_tbindir=$func_normal_abspath_result + + # Ascend the tree starting from libdir + while :; do + # check if we have found a prefix of bindir + case $func_relative_path_tbindir in + $func_relative_path_tlibdir) + # found an exact match + func_relative_path_tcancelled= + break + ;; + $func_relative_path_tlibdir*) + # found a matching prefix + func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" + func_relative_path_tcancelled=$func_stripname_result + if test -z "$func_relative_path_result"; then + func_relative_path_result=. + fi + break + ;; + *) + func_dirname $func_relative_path_tlibdir + func_relative_path_tlibdir=${func_dirname_result} + if test "x$func_relative_path_tlibdir" = x ; then + # Have to descend all the way to the root! + func_relative_path_result=../$func_relative_path_result + func_relative_path_tcancelled=$func_relative_path_tbindir + break + fi + func_relative_path_result=../$func_relative_path_result + ;; + esac + done + + # Now calculate path; take care to avoid doubling-up slashes. + func_stripname '' '/' "$func_relative_path_result" + func_relative_path_result=$func_stripname_result + func_stripname '/' '/' "$func_relative_path_tcancelled" + if test "x$func_stripname_result" != x ; then + func_relative_path_result=${func_relative_path_result}/${func_stripname_result} + fi + + # Normalisation. If bindir is libdir, return empty string, + # else relative path ending with a slash; either way, target + # file name can be directly appended. + if test ! -z "$func_relative_path_result"; then + func_stripname './' '' "$func_relative_path_result/" + func_relative_path_result=$func_stripname_result + fi +} # The name of this program: -# In the unlikely event $progname began with a '-', it would play havoc with -# func_echo (imagine progname=-n), so we prepend ./ in that case: func_dirname_and_basename "$progpath" progname=$func_basename_result -case $progname in - -*) progname=./$progname ;; -esac # Make sure we have an absolute path for reexecution: case $progpath in @@ -258,6 +413,13 @@ func_verbose () : } +# func_echo_all arg... +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "$*" +} + # func_error arg... # Echo program name prefixed message to standard error. func_error () @@ -326,9 +488,9 @@ func_mkdir_p () case $my_directory_path in */*) ;; *) break ;; esac # ...otherwise throw away the child directory and loop - my_directory_path=`$ECHO "X$my_directory_path" | $Xsed -e "$dirname"` + my_directory_path=`$ECHO "$my_directory_path" | $SED -e "$dirname"` done - my_dir_list=`$ECHO "X$my_dir_list" | $Xsed -e 's,:*$,,'` + my_dir_list=`$ECHO "$my_dir_list" | $SED 's,:*$,,'` save_mkdir_p_IFS="$IFS"; IFS=':' for my_dir in $my_dir_list; do @@ -378,7 +540,7 @@ func_mktempdir () func_fatal_error "cannot create temporary directory \`$my_tmpdir'" fi - $ECHO "X$my_tmpdir" | $Xsed + $ECHO "$my_tmpdir" } @@ -392,7 +554,7 @@ func_quote_for_eval () { case $1 in *[\\\`\"\$]*) - func_quote_for_eval_unquoted_result=`$ECHO "X$1" | $Xsed -e "$sed_quote_subst"` ;; + func_quote_for_eval_unquoted_result=`$ECHO "$1" | $SED "$sed_quote_subst"` ;; *) func_quote_for_eval_unquoted_result="$1" ;; esac @@ -419,7 +581,7 @@ func_quote_for_expand () { case $1 in *[\\\`\"]*) - my_arg=`$ECHO "X$1" | $Xsed \ + my_arg=`$ECHO "$1" | $SED \ -e "$double_quote_subst" -e "$sed_double_backslash"` ;; *) my_arg="$1" ;; @@ -489,14 +651,19 @@ func_show_eval_locale () } - - - # func_version # Echo version message to standard output and exit. func_version () { - $SED -n '/^# '$PROGRAM' (GNU /,/# warranty; / { + $SED -n '/(C)/!b go + :more + /\./!{ + N + s/\n# / / + b more + } + :go + /^# '$PROGRAM' (GNU /,/# warranty; / { s/^# // s/^# *$// s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/ @@ -509,19 +676,20 @@ func_version () # Echo short help message to standard output and exit. func_usage () { - $SED -n '/^# Usage:/,/# -h/ { + $SED -n '/^# Usage:/,/^# *.*--help/ { s/^# // s/^# *$// s/\$progname/'$progname'/ p }' < "$progpath" - $ECHO + echo $ECHO "run \`$progname --help | more' for full usage" exit $? } -# func_help -# Echo long help message to standard output and exit. +# func_help [NOEXIT] +# Echo long help message to standard output and exit, +# unless 'noexit' is passed as argument. func_help () { $SED -n '/^# Usage:/,/# Report bugs to/ { @@ -538,7 +706,10 @@ func_help () s/\$autoconf_version/'"`(autoconf --version) 2>/dev/null |$SED 1q`"'/ p }' < "$progpath" - exit $? + ret=$? + if test -z "$1"; then + exit $ret + fi } # func_missing_arg argname @@ -546,7 +717,7 @@ func_help () # exit_cmd. func_missing_arg () { - func_error "missing argument for $1" + func_error "missing argument for $1." exit_cmd=exit } @@ -556,29 +727,6 @@ exit_cmd=: -# Check that we have a working $ECHO. -if test "X$1" = X--no-reexec; then - # Discard the --no-reexec flag, and continue. - shift -elif test "X$1" = X--fallback-echo; then - # Avoid inline document here, it may be left over - : -elif test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t'; then - # Yippee, $ECHO works! - : -else - # Restart under the correct shell, and then maybe $ECHO will work. - exec $SHELL "$progpath" --no-reexec ${1+"$@"} -fi - -if test "X$1" = X--fallback-echo; then - # used as fallback echo - shift - cat </dev/null; then + case $nonopt in *shtool*) :;; *) false;; esac; then # Aesthetically quote it. func_quote_for_eval "$nonopt" install_prog="$func_quote_for_eval_result " @@ -1867,6 +2067,11 @@ func_mode_install () # Aesthetically quote it. func_quote_for_eval "$arg" install_prog="$install_prog$func_quote_for_eval_result" + install_shared_prog=$install_prog + case " $install_prog " in + *[\\\ /]cp\ *) install_cp=: ;; + *) install_cp=false ;; + esac # We need to accept at least all the BSD install flags. dest= @@ -1876,8 +2081,10 @@ func_mode_install () install_type= isdir=no stripme= + no_mode=: for arg do + arg2= if test -n "$dest"; then files="$files $dest" dest=$arg @@ -1887,10 +2094,9 @@ func_mode_install () case $arg in -d) isdir=yes ;; -f) - case " $install_prog " in - *[\\\ /]cp\ *) ;; - *) prev=$arg ;; - esac + if $install_cp; then :; else + prev=$arg + fi ;; -g | -m | -o) prev=$arg @@ -1904,6 +2110,10 @@ func_mode_install () *) # If the previous option needed an argument, then skip it. if test -n "$prev"; then + if test "x$prev" = x-m && test -n "$install_override_mode"; then + arg2=$install_override_mode + no_mode=false + fi prev= else dest=$arg @@ -1915,6 +2125,10 @@ func_mode_install () # Aesthetically quote the argument. func_quote_for_eval "$arg" install_prog="$install_prog $func_quote_for_eval_result" + if test -n "$arg2"; then + func_quote_for_eval "$arg2" + fi + install_shared_prog="$install_shared_prog $func_quote_for_eval_result" done test -z "$install_prog" && \ @@ -1923,6 +2137,13 @@ func_mode_install () test -n "$prev" && \ func_fatal_help "the \`$prev' option requires an argument" + if test -n "$install_override_mode" && $no_mode; then + if $install_cp; then :; else + func_quote_for_eval "$install_override_mode" + install_shared_prog="$install_shared_prog -m $func_quote_for_eval_result" + fi + fi + if test -z "$files"; then if test -z "$dest"; then func_fatal_help "no file or destination specified" @@ -2010,7 +2231,7 @@ func_mode_install () if test -n "$relink_command"; then # Determine the prefix the user has applied to our future dir. - inst_prefix_dir=`$ECHO "X$destdir" | $Xsed -e "s%$libdir\$%%"` + inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"` # Don't allow the user to place us outside of our expected # location b/c this prevents finding dependent libraries that @@ -2023,9 +2244,9 @@ func_mode_install () if test -n "$inst_prefix_dir"; then # Stick the inst_prefix_dir data into the link command. - relink_command=`$ECHO "X$relink_command" | $Xsed -e "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` + relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` else - relink_command=`$ECHO "X$relink_command" | $Xsed -e "s%@inst_prefix_dir@%%"` + relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"` fi func_warning "relinking \`$file'" @@ -2043,7 +2264,7 @@ func_mode_install () test -n "$relink_command" && srcname="$realname"T # Install the shared library and build the symlinks. - func_show_eval "$install_prog $dir/$srcname $destdir/$realname" \ + func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \ 'exit $?' tstripme="$stripme" case $host_os in @@ -2183,7 +2404,7 @@ func_mode_install () if test -f "$lib"; then func_source "$lib" fi - libfile="$libdir/"`$ECHO "X$lib" | $Xsed -e 's%^.*/%%g'` ### testsuite: skip nested quoting test + libfile="$libdir/"`$ECHO "$lib" | $SED 's%^.*/%%g'` ### testsuite: skip nested quoting test if test -n "$libdir" && test ! -f "$libfile"; then func_warning "\`$lib' has not been installed in \`$libdir'" finalize=no @@ -2202,7 +2423,7 @@ func_mode_install () file="$func_basename_result" outputname="$tmpdir/$file" # Replace the output file specification. - relink_command=`$ECHO "X$relink_command" | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g'` + relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` $opt_silent || { func_quote_for_expand "$relink_command" @@ -2221,7 +2442,7 @@ func_mode_install () } else # Install the binary that we compiled earlier. - file=`$ECHO "X$file$stripped_ext" | $Xsed -e "s%\([^/]*\)$%$objdir/\1%"` + file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"` fi fi @@ -2323,6 +2544,10 @@ func_generate_dlsyms () extern \"C\" { #endif +#if defined(__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) +#pragma GCC diagnostic ignored \"-Wstrict-prototypes\" +#endif + /* External symbol declarations for the compiler. */\ " @@ -2332,7 +2557,7 @@ extern \"C\" { $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" # Add our own program objects to the symbol list. - progfiles=`$ECHO "X$objs$old_deplibs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` for progfile in $progfiles; do func_verbose "extracting global C symbols from \`$progfile'" $opt_dry_run || eval "$NM $progfile | $global_symbol_pipe >> '$nlist'" @@ -2371,7 +2596,7 @@ extern \"C\" { eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' case $host in - *cygwin | *mingw* | *cegcc* ) + *cygwin* | *mingw* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' ;; @@ -2415,10 +2640,10 @@ extern \"C\" { if test -f "$nlist"S; then eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' else - $ECHO '/* NONE */' >> "$output_objdir/$my_dlsyms" + echo '/* NONE */' >> "$output_objdir/$my_dlsyms" fi - $ECHO >> "$output_objdir/$my_dlsyms" "\ + echo >> "$output_objdir/$my_dlsyms" "\ /* The mapping between symbol names and symbols. */ typedef struct { @@ -2428,7 +2653,7 @@ typedef struct { " case $host in *cygwin* | *mingw* | *cegcc* ) - $ECHO >> "$output_objdir/$my_dlsyms" "\ + echo >> "$output_objdir/$my_dlsyms" "\ /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */" @@ -2441,7 +2666,7 @@ typedef struct { lt_dlsym_const=const ;; esac - $ECHO >> "$output_objdir/$my_dlsyms" "\ + echo >> "$output_objdir/$my_dlsyms" "\ extern $lt_dlsym_const lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[]; $lt_dlsym_const lt_dlsymlist @@ -2457,7 +2682,7 @@ lt_${my_prefix}_LTX_preloaded_symbols[] = eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; esac - $ECHO >> "$output_objdir/$my_dlsyms" "\ + echo >> "$output_objdir/$my_dlsyms" "\ {0, (void *) 0} }; @@ -2515,16 +2740,16 @@ static const void *lt_preloaded_setup() { case $host in *cygwin* | *mingw* | *cegcc* ) if test -f "$output_objdir/$my_outputname.def"; then - compile_command=`$ECHO "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` - finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` else - compile_command=`$ECHO "X$compile_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"` - finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"` + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` fi ;; *) - compile_command=`$ECHO "X$compile_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"` - finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"` + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` ;; esac ;; @@ -2538,8 +2763,8 @@ static const void *lt_preloaded_setup() { # really was required. # Nullify the symbol file. - compile_command=`$ECHO "X$compile_command" | $Xsed -e "s% @SYMFILE@%%"` - finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s% @SYMFILE@%%"` + compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"` fi } @@ -2549,6 +2774,7 @@ static const void *lt_preloaded_setup() { # Need a lot of goo to handle *both* DLLs and import libs # Has to be a shell function in order to 'eat' the argument # that is supplied when $file_magic_command is called. +# Despite the name, also deal with 64 bit binaries. func_win32_libid () { $opt_debug @@ -2559,8 +2785,9 @@ func_win32_libid () win32_libid_type="x86 archive import" ;; *ar\ archive*) # could be an import, or static + # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | - $EGREP 'file format pe-i386(.*architecture: i386)?' >/dev/null ; then + $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then win32_nmres=`eval $NM -f posix -A $1 | $SED -n -e ' 1,100{ @@ -2598,7 +2825,18 @@ func_extract_an_archive () $opt_debug f_ex_an_ar_dir="$1"; shift f_ex_an_ar_oldlib="$1" - func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" 'exit $?' + if test "$lock_old_archive_extraction" = yes; then + lockfile=$f_ex_an_ar_oldlib.lock + until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do + func_echo "Waiting for $lockfile to be removed" + sleep 2 + done + fi + func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ + 'stat=$?; rm -f "$lockfile"; exit $stat' + if test "$lock_old_archive_extraction" = yes; then + $opt_dry_run || rm -f "$lockfile" + fi if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then : else @@ -2669,7 +2907,7 @@ func_extract_archives () darwin_file= darwin_files= for darwin_file in $darwin_filelist; do - darwin_files=`find unfat-$$ -name $darwin_file -print | $NL2SP` + darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP` $LIPO -create -output "$darwin_file" $darwin_files done # $darwin_filelist $RM -rf unfat-$$ @@ -2684,25 +2922,30 @@ func_extract_archives () func_extract_an_archive "$my_xdir" "$my_xabs" ;; esac - my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | $NL2SP` + my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` done func_extract_archives_result="$my_oldobjs" } - -# func_emit_wrapper_part1 [arg=no] +# func_emit_wrapper [arg=no] # -# Emit the first part of a libtool wrapper script on stdout. -# For more information, see the description associated with -# func_emit_wrapper(), below. -func_emit_wrapper_part1 () +# Emit a libtool wrapper script on stdout. +# Don't directly open a file because we may want to +# incorporate the script contents within a cygwin/mingw +# wrapper executable. Must ONLY be called from within +# func_mode_link because it depends on a number of variables +# set therein. +# +# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR +# variable will take. If 'yes', then the emitted script +# will assume that the directory in which it is stored is +# the $objdir directory. This is a cygwin/mingw-specific +# behavior. +func_emit_wrapper () { - func_emit_wrapper_part1_arg1=no - if test -n "$1" ; then - func_emit_wrapper_part1_arg1=$1 - fi + func_emit_wrapper_arg1=${1-no} $ECHO "\ #! $SHELL @@ -2718,7 +2961,6 @@ func_emit_wrapper_part1 () # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. -Xsed='${SED} -e 1s/^X//' sed_quote_subst='$sed_quote_subst' # Be Bourne compatible @@ -2749,31 +2991,132 @@ if test \"\$libtool_install_magic\" = \"$magic\"; then else # When we are sourced in execute mode, \$file and \$ECHO are already set. if test \"\$libtool_execute_magic\" != \"$magic\"; then - ECHO=\"$qecho\" - file=\"\$0\" - # Make sure echo works. - if test \"X\$1\" = X--no-reexec; then - # Discard the --no-reexec flag, and continue. - shift - elif test \"X\`{ \$ECHO '\t'; } 2>/dev/null\`\" = 'X\t'; then - # Yippee, \$ECHO works! - : - else - # Restart under the correct shell, and then maybe \$ECHO will work. - exec $SHELL \"\$0\" --no-reexec \${1+\"\$@\"} - fi - fi\ + file=\"\$0\"" + + qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"` + $ECHO "\ + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$1 +_LTECHO_EOF' +} + ECHO=\"$qECHO\" + fi + +# Very basic option parsing. These options are (a) specific to +# the libtool wrapper, (b) are identical between the wrapper +# /script/ and the wrapper /executable/ which is used only on +# windows platforms, and (c) all begin with the string "--lt-" +# (application programs are unlikely to have options which match +# this pattern). +# +# There are only two supported options: --lt-debug and +# --lt-dump-script. There is, deliberately, no --lt-help. +# +# The first argument to this parsing function should be the +# script's $0 value, followed by "$@". +lt_option_debug= +func_parse_lt_options () +{ + lt_script_arg0=\$0 + shift + for lt_opt + do + case \"\$lt_opt\" in + --lt-debug) lt_option_debug=1 ;; + --lt-dump-script) + lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` + test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. + lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` + cat \"\$lt_dump_D/\$lt_dump_F\" + exit 0 + ;; + --lt-*) + \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 + exit 1 + ;; + esac + done + + # Print the debug banner immediately: + if test -n \"\$lt_option_debug\"; then + echo \"${outputname}:${output}:\${LINENO}: libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\" 1>&2 + fi +} + +# Used when --lt-debug. Prints its arguments to stdout +# (redirection is the responsibility of the caller) +func_lt_dump_args () +{ + lt_dump_args_N=1; + for lt_arg + do + \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[\$lt_dump_args_N]: \$lt_arg\" + lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` + done +} + +# Core function for launching the target application +func_exec_program_core () +{ " - $ECHO "\ + case $host in + # Backslashes separate directories on plain windows + *-*-mingw | *-*-os2* | *-cegcc*) + $ECHO "\ + if test -n \"\$lt_option_debug\"; then + \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir\\\\\$program\" 1>&2 + func_lt_dump_args \${1+\"\$@\"} 1>&2 + fi + exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} +" + ;; + + *) + $ECHO "\ + if test -n \"\$lt_option_debug\"; then + \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir/\$program\" 1>&2 + func_lt_dump_args \${1+\"\$@\"} 1>&2 + fi + exec \"\$progdir/\$program\" \${1+\"\$@\"} +" + ;; + esac + $ECHO "\ + \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 + exit 1 +} + +# A function to encapsulate launching the target application +# Strips options in the --lt-* namespace from \$@ and +# launches target application with the remaining arguments. +func_exec_program () +{ + for lt_wr_arg + do + case \$lt_wr_arg in + --lt-*) ;; + *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; + esac + shift + done + func_exec_program_core \${1+\"\$@\"} +} + + # Parse options + func_parse_lt_options \"\$0\" \${1+\"\$@\"} # Find the directory that this script lives in. - thisdir=\`\$ECHO \"X\$file\" | \$Xsed -e 's%/[^/]*$%%'\` + thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\` test \"x\$thisdir\" = \"x\$file\" && thisdir=. # Follow symbolic links until we get to the real thisdir. - file=\`ls -ld \"\$file\" | ${SED} -n 's/.*-> //p'\` + file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\` while test -n \"\$file\"; do - destdir=\`\$ECHO \"X\$file\" | \$Xsed -e 's%/[^/]*\$%%'\` + destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\` # If there was a directory component, then change thisdir. if test \"x\$destdir\" != \"x\$file\"; then @@ -2783,30 +3126,13 @@ else esac fi - file=\`\$ECHO \"X\$file\" | \$Xsed -e 's%^.*/%%'\` - file=\`ls -ld \"\$thisdir/\$file\" | ${SED} -n 's/.*-> //p'\` + file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\` + file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` done -" -} -# end: func_emit_wrapper_part1 - -# func_emit_wrapper_part2 [arg=no] -# -# Emit the second part of a libtool wrapper script on stdout. -# For more information, see the description associated with -# func_emit_wrapper(), below. -func_emit_wrapper_part2 () -{ - func_emit_wrapper_part2_arg1=no - if test -n "$1" ; then - func_emit_wrapper_part2_arg1=$1 - fi - - $ECHO "\ # Usually 'no', except on cygwin/mingw when embedded into # the cwrapper. - WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_part2_arg1 + WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then # special case for '.' if test \"\$thisdir\" = \".\"; then @@ -2814,7 +3140,7 @@ func_emit_wrapper_part2 () fi # remove .libs from thisdir case \"\$thisdir\" in - *[\\\\/]$objdir ) thisdir=\`\$ECHO \"X\$thisdir\" | \$Xsed -e 's%[\\\\/][^\\\\/]*$%%'\` ;; + *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;; $objdir ) thisdir=. ;; esac fi @@ -2877,7 +3203,7 @@ func_emit_wrapper_part2 () # Some systems cannot cope with colon-terminated $shlibpath_var # The second colon is a workaround for a bug in BeOS R4 sed - $shlibpath_var=\`\$ECHO \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\` + $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\` export $shlibpath_var " @@ -2894,64 +3220,18 @@ func_emit_wrapper_part2 () $ECHO "\ if test \"\$libtool_execute_magic\" != \"$magic\"; then # Run the actual program with our arguments. -" - case $host in - # Backslashes separate directories on plain windows - *-*-mingw | *-*-os2* | *-cegcc*) - $ECHO "\ - exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} -" - ;; - - *) - $ECHO "\ - exec \"\$progdir/\$program\" \${1+\"\$@\"} -" - ;; - esac - $ECHO "\ - \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 - exit 1 + func_exec_program \${1+\"\$@\"} fi else # The program doesn't exist. \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2 \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 - $ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 + \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 exit 1 fi fi\ " } -# end: func_emit_wrapper_part2 - - -# func_emit_wrapper [arg=no] -# -# Emit a libtool wrapper script on stdout. -# Don't directly open a file because we may want to -# incorporate the script contents within a cygwin/mingw -# wrapper executable. Must ONLY be called from within -# func_mode_link because it depends on a number of variables -# set therein. -# -# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR -# variable will take. If 'yes', then the emitted script -# will assume that the directory in which it is stored is -# the $objdir directory. This is a cygwin/mingw-specific -# behavior. -func_emit_wrapper () -{ - func_emit_wrapper_arg1=no - if test -n "$1" ; then - func_emit_wrapper_arg1=$1 - fi - - # split this up so that func_emit_cwrapperexe_src - # can call each part independently. - func_emit_wrapper_part1 "${func_emit_wrapper_arg1}" - func_emit_wrapper_part2 "${func_emit_wrapper_arg1}" -} # func_to_host_path arg @@ -2978,23 +3258,19 @@ func_emit_wrapper () func_to_host_path () { func_to_host_path_result="$1" - if test -n "$1" ; then + if test -n "$1"; then case $host in *mingw* ) lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' case $build in *mingw* ) # actually, msys # awkward: cmd appends spaces to result - lt_sed_strip_trailing_spaces="s/[ ]*\$//" - func_to_host_path_tmp1=`( cmd //c echo "$1" |\ - $SED -e "$lt_sed_strip_trailing_spaces" ) 2>/dev/null || echo ""` - func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\ - $SED -e "$lt_sed_naive_backslashify"` + func_to_host_path_result=`( cmd //c echo "$1" ) 2>/dev/null | + $SED -e 's/[ ]*$//' -e "$lt_sed_naive_backslashify"` ;; *cygwin* ) - func_to_host_path_tmp1=`cygpath -w "$1"` - func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\ - $SED -e "$lt_sed_naive_backslashify"` + func_to_host_path_result=`cygpath -w "$1" | + $SED -e "$lt_sed_naive_backslashify"` ;; * ) # Unfortunately, winepath does not exit with a non-zero @@ -3006,17 +3282,17 @@ func_to_host_path () # the odd construction: func_to_host_path_tmp1=`winepath -w "$1" 2>/dev/null` if test "$?" -eq 0 && test -n "${func_to_host_path_tmp1}"; then - func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\ + func_to_host_path_result=`$ECHO "$func_to_host_path_tmp1" | $SED -e "$lt_sed_naive_backslashify"` else # Allow warning below. - func_to_host_path_result="" + func_to_host_path_result= fi ;; esac if test -z "$func_to_host_path_result" ; then func_error "Could not determine host path corresponding to" - func_error " '$1'" + func_error " \`$1'" func_error "Continuing, but uninstalled executables may not work." # Fallback: func_to_host_path_result="$1" @@ -3049,30 +3325,24 @@ func_to_host_path () func_to_host_pathlist () { func_to_host_pathlist_result="$1" - if test -n "$1" ; then + if test -n "$1"; then case $host in *mingw* ) lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' # Remove leading and trailing path separator characters from # ARG. msys behavior is inconsistent here, cygpath turns them # into '.;' and ';.', and winepath ignores them completely. - func_to_host_pathlist_tmp2="$1" - # Once set for this call, this variable should not be - # reassigned. It is used in tha fallback case. - func_to_host_pathlist_tmp1=`echo "$func_to_host_pathlist_tmp2" |\ - $SED -e 's|^:*||' -e 's|:*$||'` + func_stripname : : "$1" + func_to_host_pathlist_tmp1=$func_stripname_result case $build in *mingw* ) # Actually, msys. # Awkward: cmd appends spaces to result. - lt_sed_strip_trailing_spaces="s/[ ]*\$//" - func_to_host_pathlist_tmp2=`( cmd //c echo "$func_to_host_pathlist_tmp1" |\ - $SED -e "$lt_sed_strip_trailing_spaces" ) 2>/dev/null || echo ""` - func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp2" |\ - $SED -e "$lt_sed_naive_backslashify"` + func_to_host_pathlist_result=` + ( cmd //c echo "$func_to_host_pathlist_tmp1" ) 2>/dev/null | + $SED -e 's/[ ]*$//' -e "$lt_sed_naive_backslashify"` ;; *cygwin* ) - func_to_host_pathlist_tmp2=`cygpath -w -p "$func_to_host_pathlist_tmp1"` - func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp2" |\ + func_to_host_pathlist_result=`cygpath -w -p "$func_to_host_pathlist_tmp1" | $SED -e "$lt_sed_naive_backslashify"` ;; * ) @@ -3088,18 +3358,17 @@ func_to_host_pathlist () if test -z "$func_to_host_pathlist_result" ; then func_to_host_pathlist_result="$func_to_host_path_result" else - func_to_host_pathlist_result="$func_to_host_pathlist_result;$func_to_host_path_result" + func_append func_to_host_pathlist_result ";$func_to_host_path_result" fi fi fi - IFS=: done IFS=$func_to_host_pathlist_oldIFS ;; esac - if test -z "$func_to_host_pathlist_result" ; then + if test -z "$func_to_host_pathlist_result"; then func_error "Could not determine the host path(s) corresponding to" - func_error " '$1'" + func_error " \`$1'" func_error "Continuing, but uninstalled executables may not work." # Fallback. This may break if $1 contains DOS-style drive # specifications. The fix is not to complicate the expression @@ -3116,7 +3385,7 @@ func_to_host_pathlist () ;; esac case "$1" in - *: ) func_to_host_pathlist_result="$func_to_host_pathlist_result;" + *: ) func_append func_to_host_pathlist_result ";" ;; esac ;; @@ -3141,31 +3410,23 @@ func_emit_cwrapperexe_src () This wrapper executable should never be moved out of the build directory. If it is, it will not operate correctly. - - Currently, it simply execs the wrapper *script* "$SHELL $output", - but could eventually absorb all of the scripts functionality and - exec $objdir/$outputname directly. */ EOF cat <<"EOF" +#ifdef _MSC_VER +# define _CRT_SECURE_NO_DEPRECATE 1 +#endif #include #include #ifdef _MSC_VER # include # include # include -# define setmode _setmode #else # include # include # ifdef __CYGWIN__ # include -# define HAVE_SETENV -# ifdef __STRICT_ANSI__ -char *realpath (const char *, char *); -int putenv (char *); -int setenv (const char *, const char *, int); -# endif # endif #endif #include @@ -3177,6 +3438,44 @@ int setenv (const char *, const char *, int); #include #include +/* declarations of non-ANSI functions */ +#if defined(__MINGW32__) +# ifdef __STRICT_ANSI__ +int _putenv (const char *); +# endif +#elif defined(__CYGWIN__) +# ifdef __STRICT_ANSI__ +char *realpath (const char *, char *); +int putenv (char *); +int setenv (const char *, const char *, int); +# endif +/* #elif defined (other platforms) ... */ +#endif + +/* portability defines, excluding path handling macros */ +#if defined(_MSC_VER) +# define setmode _setmode +# define stat _stat +# define chmod _chmod +# define getcwd _getcwd +# define putenv _putenv +# define S_IXUSR _S_IEXEC +# ifndef _INTPTR_T_DEFINED +# define _INTPTR_T_DEFINED +# define intptr_t int +# endif +#elif defined(__MINGW32__) +# define setmode _setmode +# define stat _stat +# define chmod _chmod +# define getcwd _getcwd +# define putenv _putenv +#elif defined(__CYGWIN__) +# define HAVE_SETENV +# define FOPEN_WB "wb" +/* #elif defined (other platforms) ... */ +#endif + #if defined(PATH_MAX) # define LT_PATHMAX PATH_MAX #elif defined(MAXPATHLEN) @@ -3192,14 +3491,7 @@ int setenv (const char *, const char *, int); # define S_IXGRP 0 #endif -#ifdef _MSC_VER -# define S_IXUSR _S_IEXEC -# define stat _stat -# ifndef _INTPTR_T_DEFINED -# define intptr_t int -# endif -#endif - +/* path handling portability macros */ #ifndef DIR_SEPARATOR # define DIR_SEPARATOR '/' # define PATH_SEPARATOR ':' @@ -3230,10 +3522,6 @@ int setenv (const char *, const char *, int); # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) #endif /* PATH_SEPARATOR_2 */ -#ifdef __CYGWIN__ -# define FOPEN_WB "wb" -#endif - #ifndef FOPEN_WB # define FOPEN_WB "w" #endif @@ -3246,22 +3534,13 @@ int setenv (const char *, const char *, int); if (stale) { free ((void *) stale); stale = 0; } \ } while (0) -#undef LTWRAPPER_DEBUGPRINTF -#if defined DEBUGWRAPPER -# define LTWRAPPER_DEBUGPRINTF(args) ltwrapper_debugprintf args -static void -ltwrapper_debugprintf (const char *fmt, ...) -{ - va_list args; - va_start (args, fmt); - (void) vfprintf (stderr, fmt, args); - va_end (args); -} +#if defined(LT_DEBUGWRAPPER) +static int lt_debug = 1; #else -# define LTWRAPPER_DEBUGPRINTF(args) +static int lt_debug = 0; #endif -const char *program_name = NULL; +const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */ void *xmalloc (size_t num); char *xstrdup (const char *string); @@ -3271,32 +3550,18 @@ char *chase_symlinks (const char *pathspec); int make_executable (const char *path); int check_executable (const char *path); char *strendzap (char *str, const char *pat); -void lt_fatal (const char *message, ...); +void lt_debugprintf (const char *file, int line, const char *fmt, ...); +void lt_fatal (const char *file, int line, const char *message, ...); +static const char *nonnull (const char *s); +static const char *nonempty (const char *s); void lt_setenv (const char *name, const char *value); char *lt_extend_str (const char *orig_value, const char *add, int to_end); -void lt_opt_process_env_set (const char *arg); -void lt_opt_process_env_prepend (const char *arg); -void lt_opt_process_env_append (const char *arg); -int lt_split_name_value (const char *arg, char** name, char** value); void lt_update_exe_path (const char *name, const char *value); void lt_update_lib_path (const char *name, const char *value); - -static const char *script_text_part1 = +char **prepare_spawn (char **argv); +void lt_dump_script (FILE *f); EOF - func_emit_wrapper_part1 yes | - $SED -e 's/\([\\"]\)/\\\1/g' \ - -e 's/^/ "/' -e 's/$/\\n"/' - echo ";" - cat <"))); + lt_debugprintf (__FILE__, __LINE__, "(main) lt_argv_zero: %s\n", + nonnull (lt_argv_zero)); for (i = 0; i < newargc; i++) { - LTWRAPPER_DEBUGPRINTF (("(main) newargz[%d] : %s\n", i, (newargz[i] ? newargz[i] : ""))); + lt_debugprintf (__FILE__, __LINE__, "(main) newargz[%d]: %s\n", + i, nonnull (newargz[i])); } EOF @@ -3560,11 +3782,14 @@ EOF mingw*) cat <<"EOF" /* execv doesn't actually work on mingw as expected on unix */ + newargz = prepare_spawn (newargz); rval = _spawnv (_P_WAIT, lt_argv_zero, (const char * const *) newargz); if (rval == -1) { /* failed to start process */ - LTWRAPPER_DEBUGPRINTF (("(main) failed to launch target \"%s\": errno = %d\n", lt_argv_zero, errno)); + lt_debugprintf (__FILE__, __LINE__, + "(main) failed to launch target \"%s\": %s\n", + lt_argv_zero, nonnull (strerror (errno))); return 127; } return rval; @@ -3586,7 +3811,7 @@ xmalloc (size_t num) { void *p = (void *) malloc (num); if (!p) - lt_fatal ("Memory exhausted"); + lt_fatal (__FILE__, __LINE__, "memory exhausted"); return p; } @@ -3620,8 +3845,8 @@ check_executable (const char *path) { struct stat st; - LTWRAPPER_DEBUGPRINTF (("(check_executable) : %s\n", - path ? (*path ? path : "EMPTY!") : "NULL!")); + lt_debugprintf (__FILE__, __LINE__, "(check_executable): %s\n", + nonempty (path)); if ((!path) || (!*path)) return 0; @@ -3638,8 +3863,8 @@ make_executable (const char *path) int rval = 0; struct stat st; - LTWRAPPER_DEBUGPRINTF (("(make_executable) : %s\n", - path ? (*path ? path : "EMPTY!") : "NULL!")); + lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", + nonempty (path)); if ((!path) || (!*path)) return 0; @@ -3665,8 +3890,8 @@ find_executable (const char *wrapper) int tmp_len; char *concat_name; - LTWRAPPER_DEBUGPRINTF (("(find_executable) : %s\n", - wrapper ? (*wrapper ? wrapper : "EMPTY!") : "NULL!")); + lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", + nonempty (wrapper)); if ((wrapper == NULL) || (*wrapper == '\0')) return NULL; @@ -3719,7 +3944,8 @@ find_executable (const char *wrapper) { /* empty path: current directory */ if (getcwd (tmp, LT_PATHMAX) == NULL) - lt_fatal ("getcwd failed"); + lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", + nonnull (strerror (errno))); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); @@ -3744,7 +3970,8 @@ find_executable (const char *wrapper) } /* Relative path | not found in path: prepend cwd */ if (getcwd (tmp, LT_PATHMAX) == NULL) - lt_fatal ("getcwd failed"); + lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", + nonnull (strerror (errno))); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); @@ -3770,8 +3997,9 @@ chase_symlinks (const char *pathspec) int has_symlinks = 0; while (strlen (tmp_pathspec) && !has_symlinks) { - LTWRAPPER_DEBUGPRINTF (("checking path component for symlinks: %s\n", - tmp_pathspec)); + lt_debugprintf (__FILE__, __LINE__, + "checking path component for symlinks: %s\n", + tmp_pathspec); if (lstat (tmp_pathspec, &s) == 0) { if (S_ISLNK (s.st_mode) != 0) @@ -3793,8 +4021,9 @@ chase_symlinks (const char *pathspec) } else { - char *errstr = strerror (errno); - lt_fatal ("Error accessing file %s (%s)", tmp_pathspec, errstr); + lt_fatal (__FILE__, __LINE__, + "error accessing file \"%s\": %s", + tmp_pathspec, nonnull (strerror (errno))); } } XFREE (tmp_pathspec); @@ -3807,7 +4036,8 @@ chase_symlinks (const char *pathspec) tmp_pathspec = realpath (pathspec, buf); if (tmp_pathspec == 0) { - lt_fatal ("Could not follow symlinks for %s", pathspec); + lt_fatal (__FILE__, __LINE__, + "could not follow symlinks for %s", pathspec); } return xstrdup (tmp_pathspec); #endif @@ -3833,11 +4063,25 @@ strendzap (char *str, const char *pat) return str; } +void +lt_debugprintf (const char *file, int line, const char *fmt, ...) +{ + va_list args; + if (lt_debug) + { + (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); + va_start (args, fmt); + (void) vfprintf (stderr, fmt, args); + va_end (args); + } +} + static void -lt_error_core (int exit_status, const char *mode, +lt_error_core (int exit_status, const char *file, + int line, const char *mode, const char *message, va_list ap) { - fprintf (stderr, "%s: %s: ", program_name, mode); + fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); vfprintf (stderr, message, ap); fprintf (stderr, ".\n"); @@ -3846,20 +4090,32 @@ lt_error_core (int exit_status, const char *mode, } void -lt_fatal (const char *message, ...) +lt_fatal (const char *file, int line, const char *message, ...) { va_list ap; va_start (ap, message); - lt_error_core (EXIT_FAILURE, "FATAL", message, ap); + lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); va_end (ap); } +static const char * +nonnull (const char *s) +{ + return s ? s : "(null)"; +} + +static const char * +nonempty (const char *s) +{ + return (s && !*s) ? "(empty)" : nonnull (s); +} + void lt_setenv (const char *name, const char *value) { - LTWRAPPER_DEBUGPRINTF (("(lt_setenv) setting '%s' to '%s'\n", - (name ? name : ""), - (value ? value : ""))); + lt_debugprintf (__FILE__, __LINE__, + "(lt_setenv) setting '%s' to '%s'\n", + nonnull (name), nonnull (value)); { #ifdef HAVE_SETENV /* always make a copy, for consistency with !HAVE_SETENV */ @@ -3904,95 +4160,12 @@ lt_extend_str (const char *orig_value, const char *add, int to_end) return new_value; } -int -lt_split_name_value (const char *arg, char** name, char** value) -{ - const char *p; - int len; - if (!arg || !*arg) - return 1; - - p = strchr (arg, (int)'='); - - if (!p) - return 1; - - *value = xstrdup (++p); - - len = strlen (arg) - strlen (*value); - *name = XMALLOC (char, len); - strncpy (*name, arg, len-1); - (*name)[len - 1] = '\0'; - - return 0; -} - -void -lt_opt_process_env_set (const char *arg) -{ - char *name = NULL; - char *value = NULL; - - if (lt_split_name_value (arg, &name, &value) != 0) - { - XFREE (name); - XFREE (value); - lt_fatal ("bad argument for %s: '%s'", env_set_opt, arg); - } - - lt_setenv (name, value); - XFREE (name); - XFREE (value); -} - -void -lt_opt_process_env_prepend (const char *arg) -{ - char *name = NULL; - char *value = NULL; - char *new_value = NULL; - - if (lt_split_name_value (arg, &name, &value) != 0) - { - XFREE (name); - XFREE (value); - lt_fatal ("bad argument for %s: '%s'", env_prepend_opt, arg); - } - - new_value = lt_extend_str (getenv (name), value, 0); - lt_setenv (name, new_value); - XFREE (new_value); - XFREE (name); - XFREE (value); -} - -void -lt_opt_process_env_append (const char *arg) -{ - char *name = NULL; - char *value = NULL; - char *new_value = NULL; - - if (lt_split_name_value (arg, &name, &value) != 0) - { - XFREE (name); - XFREE (value); - lt_fatal ("bad argument for %s: '%s'", env_append_opt, arg); - } - - new_value = lt_extend_str (getenv (name), value, 1); - lt_setenv (name, new_value); - XFREE (new_value); - XFREE (name); - XFREE (value); -} - void lt_update_exe_path (const char *name, const char *value) { - LTWRAPPER_DEBUGPRINTF (("(lt_update_exe_path) modifying '%s' by prepending '%s'\n", - (name ? name : ""), - (value ? value : ""))); + lt_debugprintf (__FILE__, __LINE__, + "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", + nonnull (name), nonnull (value)); if (name && *name && value && *value) { @@ -4011,9 +4184,9 @@ lt_update_exe_path (const char *name, const char *value) void lt_update_lib_path (const char *name, const char *value) { - LTWRAPPER_DEBUGPRINTF (("(lt_update_lib_path) modifying '%s' by prepending '%s'\n", - (name ? name : ""), - (value ? value : ""))); + lt_debugprintf (__FILE__, __LINE__, + "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", + nonnull (name), nonnull (value)); if (name && *name && value && *value) { @@ -4023,11 +4196,152 @@ lt_update_lib_path (const char *name, const char *value) } } +EOF + case $host_os in + mingw*) + cat <<"EOF" +/* Prepares an argument vector before calling spawn(). + Note that spawn() does not by itself call the command interpreter + (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : + ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); + GetVersionEx(&v); + v.dwPlatformId == VER_PLATFORM_WIN32_NT; + }) ? "cmd.exe" : "command.com"). + Instead it simply concatenates the arguments, separated by ' ', and calls + CreateProcess(). We must quote the arguments since Win32 CreateProcess() + interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a + special way: + - Space and tab are interpreted as delimiters. They are not treated as + delimiters if they are surrounded by double quotes: "...". + - Unescaped double quotes are removed from the input. Their only effect is + that within double quotes, space and tab are treated like normal + characters. + - Backslashes not followed by double quotes are not special. + - But 2*n+1 backslashes followed by a double quote become + n backslashes followed by a double quote (n >= 0): + \" -> " + \\\" -> \" + \\\\\" -> \\" + */ +#define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" +#define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" +char ** +prepare_spawn (char **argv) +{ + size_t argc; + char **new_argv; + size_t i; + + /* Count number of arguments. */ + for (argc = 0; argv[argc] != NULL; argc++) + ; + + /* Allocate new argument vector. */ + new_argv = XMALLOC (char *, argc + 1); + + /* Put quoted arguments into the new argument vector. */ + for (i = 0; i < argc; i++) + { + const char *string = argv[i]; + + if (string[0] == '\0') + new_argv[i] = xstrdup ("\"\""); + else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) + { + int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); + size_t length; + unsigned int backslashes; + const char *s; + char *quoted_string; + char *p; + + length = 0; + backslashes = 0; + if (quote_around) + length++; + for (s = string; *s != '\0'; s++) + { + char c = *s; + if (c == '"') + length += backslashes + 1; + length++; + if (c == '\\') + backslashes++; + else + backslashes = 0; + } + if (quote_around) + length += backslashes + 1; + + quoted_string = XMALLOC (char, length + 1); + + p = quoted_string; + backslashes = 0; + if (quote_around) + *p++ = '"'; + for (s = string; *s != '\0'; s++) + { + char c = *s; + if (c == '"') + { + unsigned int j; + for (j = backslashes + 1; j > 0; j--) + *p++ = '\\'; + } + *p++ = c; + if (c == '\\') + backslashes++; + else + backslashes = 0; + } + if (quote_around) + { + unsigned int j; + for (j = backslashes; j > 0; j--) + *p++ = '\\'; + *p++ = '"'; + } + *p = '\0'; + + new_argv[i] = quoted_string; + } + else + new_argv[i] = (char *) string; + } + new_argv[argc] = NULL; + + return new_argv; +} +EOF + ;; + esac + + cat <<"EOF" +void lt_dump_script (FILE* f) +{ +EOF + func_emit_wrapper yes | + $SED -e 's/\([\\"]\)/\\\1/g' \ + -e 's/^/ fputs ("/' -e 's/$/\\n", f);/' + + cat <<"EOF" +} EOF } # end: func_emit_cwrapperexe_src +# func_win32_import_lib_p ARG +# True if ARG is an import lib, as indicated by $file_magic_cmd +func_win32_import_lib_p () +{ + $opt_debug + case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in + *import*) : ;; + *) false ;; + esac +} + # func_mode_link arg... func_mode_link () { @@ -4072,6 +4386,7 @@ func_mode_link () new_inherited_linker_flags= avoid_version=no + bindir= dlfiles= dlprefiles= dlself=no @@ -4164,6 +4479,11 @@ func_mode_link () esac case $prev in + bindir) + bindir="$arg" + prev= + continue + ;; dlfiles|dlprefiles) if test "$preload" = no; then # Add the symbol object into the linking commands. @@ -4425,6 +4745,11 @@ func_mode_link () continue ;; + -bindir) + prev=bindir + continue + ;; + -dlopen) prev=dlfiles continue @@ -4503,7 +4828,7 @@ func_mode_link () esac case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) - testbindir=`$ECHO "X$dir" | $Xsed -e 's*/lib$*/bin*'` + testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` case :$dllsearchpath: in *":$dir:"*) ;; ::) dllsearchpath=$dir;; @@ -4522,7 +4847,7 @@ func_mode_link () -l*) if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then case $host in - *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc*) + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) # These systems don't actually have a C or math library (as such) continue ;; @@ -4708,7 +5033,7 @@ func_mode_link () for flag in $args; do IFS="$save_ifs" func_quote_for_eval "$flag" - arg="$arg $wl$func_quote_for_eval_result" + arg="$arg $func_quote_for_eval_result" compiler_flags="$compiler_flags $func_quote_for_eval_result" done IFS="$save_ifs" @@ -4754,18 +5079,19 @@ func_mode_link () arg="$func_quote_for_eval_result" ;; - # -64, -mips[0-9] enable 64-bit mode on the SGI compiler - # -r[0-9][0-9]* specifies the processor on the SGI compiler - # -xarch=*, -xtarget=* enable 64-bit mode on the Sun compiler - # +DA*, +DD* enable 64-bit mode on the HP compiler - # -q* pass through compiler args for the IBM compiler - # -m*, -t[45]*, -txscale* pass through architecture-specific - # compiler args for GCC - # -F/path gives path to uninstalled frameworks, gcc on darwin - # -p, -pg, --coverage, -fprofile-* pass through profiling flag for GCC - # @file GCC response files + # Flags to be passed through unchanged, with rationale: + # -64, -mips[0-9] enable 64-bit mode for the SGI compiler + # -r[0-9][0-9]* specify processor for the SGI compiler + # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler + # +DA*, +DD* enable 64-bit mode for the HP compiler + # -q* compiler args for the IBM compiler + # -m*, -t[45]*, -txscale* architecture-specific flags for GCC + # -F/path path to uninstalled frameworks, gcc on darwin + # -p, -pg, --coverage, -fprofile-* profiling flags for GCC + # @file GCC response files + # -tp=* Portland pgcc target processor selection -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ - -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*) + -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" func_append compile_command " $arg" @@ -4925,7 +5251,7 @@ func_mode_link () if test -n "$shlibpath_var"; then # get the directories listed in $shlibpath_var - eval shlib_search_path=\`\$ECHO \"X\${$shlibpath_var}\" \| \$Xsed -e \'s/:/ /g\'\` + eval shlib_search_path=\`\$ECHO \"\${$shlibpath_var}\" \| \$SED \'s/:/ /g\'\` else shlib_search_path= fi @@ -5048,7 +5374,8 @@ func_mode_link () # Collect preopened libtool deplibs, except any this library # has declared as weak libs for deplib in $dependency_libs; do - deplib_base=`$ECHO "X$deplib" | $Xsed -e "$basename"` + func_basename "$deplib" + deplib_base=$func_basename_result case " $weak_libs " in *" $deplib_base "*) ;; *) deplibs="$deplibs $deplib" ;; @@ -5227,7 +5554,7 @@ func_mode_link () match_pattern*) set dummy $deplibs_check_method; shift match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` - if eval "\$ECHO \"X$deplib\"" 2>/dev/null | $Xsed -e 10q \ + if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \ | $EGREP "$match_pattern_regex" > /dev/null; then valid_a_lib=yes fi @@ -5237,15 +5564,15 @@ func_mode_link () ;; esac if test "$valid_a_lib" != yes; then - $ECHO + echo $ECHO "*** Warning: Trying to link with static lib archive $deplib." - $ECHO "*** I have the capability to make that library automatically link in when" - $ECHO "*** you link to this library. But I can only do this if you have a" - $ECHO "*** shared version of the library, which you do not appear to have" - $ECHO "*** because the file extensions .$libext of this argument makes me believe" - $ECHO "*** that it is just a static archive that I should not use here." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because the file extensions .$libext of this argument makes me believe" + echo "*** that it is just a static archive that I should not use here." else - $ECHO + echo $ECHO "*** Warning: Linking the shared library $output against the" $ECHO "*** static library $deplib is not portable!" deplibs="$deplib $deplibs" @@ -5318,7 +5645,7 @@ func_mode_link () # Convert "-framework foo" to "foo.ltframework" if test -n "$inherited_linker_flags"; then - tmp_inherited_linker_flags=`$ECHO "X$inherited_linker_flags" | $Xsed -e 's/-framework \([^ $]*\)/\1.ltframework/g'` + tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'` for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do case " $new_inherited_linker_flags " in *" $tmp_inherited_linker_flag "*) ;; @@ -5326,7 +5653,7 @@ func_mode_link () esac done fi - dependency_libs=`$ECHO "X $dependency_libs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` + dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` if test "$linkmode,$pass" = "lib,link" || test "$linkmode,$pass" = "prog,scan" || { test "$linkmode" != prog && test "$linkmode" != lib; }; then @@ -5580,7 +5907,7 @@ func_mode_link () fi done if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then - $ECHO + echo if test "$linkmode" = prog; then $ECHO "*** Warning: Linking the executable $output against the loadable module" else @@ -5683,9 +6010,9 @@ func_mode_link () if test "X$dlopenmodule" != "X$lib"; then $ECHO "*** Warning: lib $linklib is a module, not a shared library" if test -z "$old_library" ; then - $ECHO - $ECHO "*** And there doesn't seem to be a static archive available" - $ECHO "*** The link will probably fail, sorry" + echo + echo "*** And there doesn't seem to be a static archive available" + echo "*** The link will probably fail, sorry" else add="$dir/$old_library" fi @@ -5825,21 +6152,21 @@ func_mode_link () # Just print a warning and add the library to dependency_libs so # that the program can be linked against the static library. - $ECHO + echo $ECHO "*** Warning: This system can not link to static lib archive $lib." - $ECHO "*** I have the capability to make that library automatically link in when" - $ECHO "*** you link to this library. But I can only do this if you have a" - $ECHO "*** shared version of the library, which you do not appear to have." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have." if test "$module" = yes; then - $ECHO "*** But as you try to build a module library, libtool will still create " - $ECHO "*** a static module, that should work as long as the dlopening application" - $ECHO "*** is linked with the -dlopen flag to resolve symbols at runtime." + echo "*** But as you try to build a module library, libtool will still create " + echo "*** a static module, that should work as long as the dlopening application" + echo "*** is linked with the -dlopen flag to resolve symbols at runtime." if test -z "$global_symbol_pipe"; then - $ECHO - $ECHO "*** However, this would only work if libtool was able to extract symbol" - $ECHO "*** lists from a program, using \`nm' or equivalent, but libtool could" - $ECHO "*** not find such a program. So, this module is probably useless." - $ECHO "*** \`nm' from GNU binutils and a full rebuild may help." + echo + echo "*** However, this would only work if libtool was able to extract symbol" + echo "*** lists from a program, using \`nm' or equivalent, but libtool could" + echo "*** not find such a program. So, this module is probably useless." + echo "*** \`nm' from GNU binutils and a full rebuild may help." fi if test "$build_old_libs" = no; then build_libtool_libs=module @@ -5893,6 +6220,7 @@ func_mode_link () if test "$link_all_deplibs" != no; then # Add the search paths of all dependency libraries for deplib in $dependency_libs; do + path= case $deplib in -L*) path="$deplib" ;; *.la) @@ -5958,7 +6286,7 @@ func_mode_link () compile_deplibs="$new_inherited_linker_flags $compile_deplibs" finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" else - compiler_flags="$compiler_flags "`$ECHO "X $new_inherited_linker_flags" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` + compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` fi fi dependency_libs="$newdependency_libs" @@ -6126,7 +6454,7 @@ func_mode_link () if test "$deplibs_check_method" != pass_all; then func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs" else - $ECHO + echo $ECHO "*** Warning: Linking the shared library $output against the non-libtool" $ECHO "*** objects $objs is not portable!" libobjs="$libobjs $objs" @@ -6194,7 +6522,7 @@ func_mode_link () age="$number_minor" revision="$number_revision" ;; - freebsd-aout|freebsd-elf|sunos) + freebsd-aout|freebsd-elf|qnx|sunos) current="$number_major" revision="$number_minor" age="0" @@ -6428,14 +6756,14 @@ func_mode_link () oldlibs="$oldlibs $output_objdir/$libname.$libext" # Transform .lo files to .o files. - oldobjs="$objs "`$ECHO "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP` + oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; $lo2o" | $NL2SP` fi # Eliminate all temporary directories. #for path in $notinst_path; do - # lib_search_path=`$ECHO "X$lib_search_path " | $Xsed -e "s% $path % %g"` - # deplibs=`$ECHO "X$deplibs " | $Xsed -e "s% -L$path % %g"` - # dependency_libs=`$ECHO "X$dependency_libs " | $Xsed -e "s% -L$path % %g"` + # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"` + # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"` + # dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"` #done if test -n "$xrpath"; then @@ -6476,7 +6804,7 @@ func_mode_link () if test "$build_libtool_libs" = yes; then if test -n "$rpath"; then case $host in - *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc*) + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*) # these systems don't actually have a c library (as such)! ;; *-*-rhapsody* | *-*-darwin1.[012]) @@ -6561,13 +6889,13 @@ EOF newdeplibs="$newdeplibs $i" else droppeddeps=yes - $ECHO + echo $ECHO "*** Warning: dynamic linker does not accept needed library $i." - $ECHO "*** I have the capability to make that library automatically link in when" - $ECHO "*** you link to this library. But I can only do this if you have a" - $ECHO "*** shared version of the library, which I believe you do not have" - $ECHO "*** because a test_compile did reveal that the linker did not use it for" - $ECHO "*** its dynamic dependency list that programs get resolved with at runtime." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which I believe you do not have" + echo "*** because a test_compile did reveal that the linker did not use it for" + echo "*** its dynamic dependency list that programs get resolved with at runtime." fi fi ;; @@ -6604,22 +6932,22 @@ EOF newdeplibs="$newdeplibs $i" else droppeddeps=yes - $ECHO + echo $ECHO "*** Warning: dynamic linker does not accept needed library $i." - $ECHO "*** I have the capability to make that library automatically link in when" - $ECHO "*** you link to this library. But I can only do this if you have a" - $ECHO "*** shared version of the library, which you do not appear to have" - $ECHO "*** because a test_compile did reveal that the linker did not use this one" - $ECHO "*** as a dynamic dependency that programs can get resolved with at runtime." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because a test_compile did reveal that the linker did not use this one" + echo "*** as a dynamic dependency that programs can get resolved with at runtime." fi fi else droppeddeps=yes - $ECHO + echo $ECHO "*** Warning! Library $i is needed by this library but I was not able to" - $ECHO "*** make it link in! You will probably need to install it or some" - $ECHO "*** library that it depends on before this library will be fully" - $ECHO "*** functional. Installing it before continuing would be even better." + echo "*** make it link in! You will probably need to install it or some" + echo "*** library that it depends on before this library will be fully" + echo "*** functional. Installing it before continuing would be even better." fi ;; *) @@ -6665,7 +6993,7 @@ EOF potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` case $potliblink in [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; - *) potlib=`$ECHO "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";; + *) potlib=`$ECHO "$potlib" | $SED 's,[^/]*$,,'`"$potliblink";; esac done if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | @@ -6680,12 +7008,12 @@ EOF fi if test -n "$a_deplib" ; then droppeddeps=yes - $ECHO + echo $ECHO "*** Warning: linker path does not have real file for library $a_deplib." - $ECHO "*** I have the capability to make that library automatically link in when" - $ECHO "*** you link to this library. But I can only do this if you have a" - $ECHO "*** shared version of the library, which you do not appear to have" - $ECHO "*** because I did check the linker path looking for a file starting" + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib" ; then $ECHO "*** with $libname but no candidates were found. (...for file magic test)" else @@ -6723,7 +7051,7 @@ EOF potential_libs=`ls $i/$libname[.-]* 2>/dev/null` for potent_lib in $potential_libs; do potlib="$potent_lib" # see symlink-check above in file_magic test - if eval "\$ECHO \"X$potent_lib\"" 2>/dev/null | $Xsed -e 10q | \ + if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \ $EGREP "$match_pattern_regex" > /dev/null; then newdeplibs="$newdeplibs $a_deplib" a_deplib="" @@ -6734,12 +7062,12 @@ EOF fi if test -n "$a_deplib" ; then droppeddeps=yes - $ECHO + echo $ECHO "*** Warning: linker path does not have real file for library $a_deplib." - $ECHO "*** I have the capability to make that library automatically link in when" - $ECHO "*** you link to this library. But I can only do this if you have a" - $ECHO "*** shared version of the library, which you do not appear to have" - $ECHO "*** because I did check the linker path looking for a file starting" + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib" ; then $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" else @@ -6757,25 +7085,25 @@ EOF ;; none | unknown | *) newdeplibs="" - tmp_deplibs=`$ECHO "X $deplibs" | $Xsed \ - -e 's/ -lc$//' -e 's/ -[LR][^ ]*//g'` + tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'` if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then for i in $predeps $postdeps ; do # can't use Xsed below, because $i might contain '/' - tmp_deplibs=`$ECHO "X $tmp_deplibs" | $Xsed -e "s,$i,,"` + tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s,$i,,"` done fi - if $ECHO "X $tmp_deplibs" | $Xsed -e 's/[ ]//g' | - $GREP . >/dev/null; then - $ECHO + case $tmp_deplibs in + *[!\ \ ]*) + echo if test "X$deplibs_check_method" = "Xnone"; then - $ECHO "*** Warning: inter-library dependencies are not supported in this platform." + echo "*** Warning: inter-library dependencies are not supported in this platform." else - $ECHO "*** Warning: inter-library dependencies are not known to be supported." + echo "*** Warning: inter-library dependencies are not known to be supported." fi - $ECHO "*** All declared inter-library dependencies are being dropped." + echo "*** All declared inter-library dependencies are being dropped." droppeddeps=yes - fi + ;; + esac ;; esac versuffix=$versuffix_save @@ -6787,23 +7115,23 @@ EOF case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library with the System framework - newdeplibs=`$ECHO "X $newdeplibs" | $Xsed -e 's/ -lc / System.ltframework /'` + newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'` ;; esac if test "$droppeddeps" = yes; then if test "$module" = yes; then - $ECHO - $ECHO "*** Warning: libtool could not satisfy all declared inter-library" + echo + echo "*** Warning: libtool could not satisfy all declared inter-library" $ECHO "*** dependencies of module $libname. Therefore, libtool will create" - $ECHO "*** a static module, that should work as long as the dlopening" - $ECHO "*** application is linked with the -dlopen flag." + echo "*** a static module, that should work as long as the dlopening" + echo "*** application is linked with the -dlopen flag." if test -z "$global_symbol_pipe"; then - $ECHO - $ECHO "*** However, this would only work if libtool was able to extract symbol" - $ECHO "*** lists from a program, using \`nm' or equivalent, but libtool could" - $ECHO "*** not find such a program. So, this module is probably useless." - $ECHO "*** \`nm' from GNU binutils and a full rebuild may help." + echo + echo "*** However, this would only work if libtool was able to extract symbol" + echo "*** lists from a program, using \`nm' or equivalent, but libtool could" + echo "*** not find such a program. So, this module is probably useless." + echo "*** \`nm' from GNU binutils and a full rebuild may help." fi if test "$build_old_libs" = no; then oldlibs="$output_objdir/$libname.$libext" @@ -6813,16 +7141,16 @@ EOF build_libtool_libs=no fi else - $ECHO "*** The inter-library dependencies that have been dropped here will be" - $ECHO "*** automatically added whenever a program is linked with this library" - $ECHO "*** or is declared to -dlopen it." + echo "*** The inter-library dependencies that have been dropped here will be" + echo "*** automatically added whenever a program is linked with this library" + echo "*** or is declared to -dlopen it." if test "$allow_undefined" = no; then - $ECHO - $ECHO "*** Since this library must not contain undefined symbols," - $ECHO "*** because either the platform does not support them or" - $ECHO "*** it was explicitly requested with -no-undefined," - $ECHO "*** libtool will only create a static version of it." + echo + echo "*** Since this library must not contain undefined symbols," + echo "*** because either the platform does not support them or" + echo "*** it was explicitly requested with -no-undefined," + echo "*** libtool will only create a static version of it." if test "$build_old_libs" = no; then oldlibs="$output_objdir/$libname.$libext" build_libtool_libs=module @@ -6839,9 +7167,9 @@ EOF # Time to change all our "foo.ltframework" stuff back to "-framework foo" case $host in *-*-darwin*) - newdeplibs=`$ECHO "X $newdeplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` - new_inherited_linker_flags=`$ECHO "X $new_inherited_linker_flags" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` - deplibs=`$ECHO "X $deplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` + newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` ;; esac @@ -6963,7 +7291,7 @@ EOF done # Use standard objects if they are pic - test -z "$pic_flag" && libobjs=`$ECHO "X$libobjs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP` test "X$libobjs" = "X " && libobjs= delfiles= @@ -7029,7 +7357,7 @@ EOF if test -n "$export_symbols" && test -n "$include_expsyms"; then tmp_export_symbols="$export_symbols" test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" - $opt_dry_run || eval '$ECHO "X$include_expsyms" | $Xsed | $SP2NL >> "$tmp_export_symbols"' + $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' fi if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then @@ -7130,7 +7458,8 @@ EOF save_libobjs=$libobjs fi save_output=$output - output_la=`$ECHO "X$output" | $Xsed -e "$basename"` + func_basename "$output" + output_la=$func_basename_result # Clear the reloadable object creation command queue and # initialize k to one. @@ -7143,12 +7472,12 @@ EOF if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then output=${output_objdir}/${output_la}.lnkscript func_verbose "creating GNU ld script: $output" - $ECHO 'INPUT (' > $output + echo 'INPUT (' > $output for obj in $save_libobjs do $ECHO "$obj" >> $output done - $ECHO ')' >> $output + echo ')' >> $output delfiles="$delfiles $output" elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then output=${output_objdir}/${output_la}.lnk @@ -7190,17 +7519,19 @@ EOF # command to the queue. if test "$k" -eq 1 ; then # The first file doesn't have a previous command to add. - eval concat_cmds=\"$reload_cmds $objlist $last_robj\" + reload_objs=$objlist + eval concat_cmds=\"$reload_cmds\" else # All subsequent reloadable object files will link in # the last one created. - eval concat_cmds=\"\$concat_cmds~$reload_cmds $objlist $last_robj~\$RM $last_robj\" + reload_objs="$objlist $last_robj" + eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\" fi last_robj=$output_objdir/$output_la-${k}.$objext func_arith $k + 1 k=$func_arith_result output=$output_objdir/$output_la-${k}.$objext - objlist=$obj + objlist=" $obj" func_len " $last_robj" func_arith $len0 + $func_len_result len=$func_arith_result @@ -7210,7 +7541,8 @@ EOF # reloadable object file. All subsequent reloadable object # files will link in the last one created. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ - eval concat_cmds=\"\${concat_cmds}$reload_cmds $objlist $last_robj\" + reload_objs="$objlist $last_robj" + eval concat_cmds=\"\${concat_cmds}$reload_cmds\" if test -n "$last_robj"; then eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\" fi @@ -7269,7 +7601,7 @@ EOF if test -n "$export_symbols" && test -n "$include_expsyms"; then tmp_export_symbols="$export_symbols" test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" - $opt_dry_run || eval '$ECHO "X$include_expsyms" | $Xsed | $SP2NL >> "$tmp_export_symbols"' + $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' fi if test -n "$orig_export_symbols"; then @@ -7434,7 +7766,7 @@ EOF if test -n "$convenience"; then if test -n "$whole_archive_flag_spec"; then eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" - reload_conv_objs=$reload_objs\ `$ECHO "X$tmp_whole_archive_flags" | $Xsed -e 's|,| |g'` + reload_conv_objs=$reload_objs\ `$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` else gentop="$output_objdir/${obj}x" generated="$generated $gentop" @@ -7445,7 +7777,7 @@ EOF fi # Create the old-style object. - reload_objs="$objs$old_deplibs "`$ECHO "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test + reload_objs="$objs$old_deplibs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; /\.lib$/d; $lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test output="$obj" func_execute_cmds "$reload_cmds" 'exit $?' @@ -7505,8 +7837,8 @@ EOF case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library is the System framework - compile_deplibs=`$ECHO "X $compile_deplibs" | $Xsed -e 's/ -lc / System.ltframework /'` - finalize_deplibs=`$ECHO "X $finalize_deplibs" | $Xsed -e 's/ -lc / System.ltframework /'` + compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'` + finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'` ;; esac @@ -7523,8 +7855,8 @@ EOF esac fi # Time to change all our "foo.ltframework" stuff back to "-framework foo" - compile_deplibs=`$ECHO "X $compile_deplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` - finalize_deplibs=`$ECHO "X $finalize_deplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` + compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` ;; esac @@ -7661,8 +7993,8 @@ EOF if test -n "$libobjs" && test "$build_old_libs" = yes; then # Transform all the library objects into standard objects. - compile_command=`$ECHO "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` - finalize_command=`$ECHO "X$finalize_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP` + finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP` fi func_generate_dlsyms "$outputname" "@PROGRAM@" "no" @@ -7674,15 +8006,15 @@ EOF wrappers_required=yes case $host in + *cegcc* | *mingw32ce*) + # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. + wrappers_required=no + ;; *cygwin* | *mingw* ) if test "$build_libtool_libs" != yes; then wrappers_required=no fi ;; - *cegcc) - # Disable wrappers for cegcc, we are cross compiling anyway. - wrappers_required=no - ;; *) if test "$need_relink" = no || test "$build_libtool_libs" != yes; then wrappers_required=no @@ -7691,7 +8023,7 @@ EOF esac if test "$wrappers_required" = no; then # Replace the output file specification. - compile_command=`$ECHO "X$compile_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` + compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'` link_command="$compile_command$compile_rpath" # We have no uninstalled library dependencies, so finalize right now. @@ -7738,7 +8070,7 @@ EOF # We don't need to create a wrapper script. link_command="$compile_var$compile_command$compile_rpath" # Replace the output file specification. - link_command=`$ECHO "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` + link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'` # Delete the old output file. $opt_dry_run || $RM $output # Link the executable and exit @@ -7757,7 +8089,7 @@ EOF if test "$fast_install" != no; then link_command="$finalize_var$compile_command$finalize_rpath" if test "$fast_install" = yes; then - relink_command=`$ECHO "X$compile_var$compile_command$compile_rpath" | $Xsed -e 's%@OUTPUT@%\$progdir/\$file%g'` + relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'` else # fast_install is set to needless relink_command= @@ -7769,7 +8101,7 @@ EOF fi # Replace the output file specification. - link_command=`$ECHO "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` + link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` # Delete the old output files. $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname @@ -7793,18 +8125,7 @@ EOF fi done relink_command="(cd `pwd`; $relink_command)" - relink_command=`$ECHO "X$relink_command" | $Xsed -e "$sed_quote_subst"` - fi - - # Quote $ECHO for shipping. - if test "X$ECHO" = "X$SHELL $progpath --fallback-echo"; then - case $progpath in - [\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $progpath --fallback-echo";; - *) qecho="$SHELL `pwd`/$progpath --fallback-echo";; - esac - qecho=`$ECHO "X$qecho" | $Xsed -e "$sed_quote_subst"` - else - qecho=`$ECHO "X$ECHO" | $Xsed -e "$sed_quote_subst"` + relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` fi # Only actually do things if not in dry run mode. @@ -7925,7 +8246,7 @@ EOF done | sort | sort -uc >/dev/null 2>&1); then : else - $ECHO "copying selected object files to avoid basename conflicts..." + echo "copying selected object files to avoid basename conflicts..." gentop="$output_objdir/${outputname}x" generated="$generated $gentop" func_mkdir_p "$gentop" @@ -8036,7 +8357,7 @@ EOF done # Quote the link command for shipping. relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" - relink_command=`$ECHO "X$relink_command" | $Xsed -e "$sed_quote_subst"` + relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` if test "$hardcode_automatic" = yes ; then relink_command= fi @@ -8121,9 +8442,27 @@ EOF fi $RM $output # place dlname in correct position for cygwin + # In fact, it would be nice if we could use this code for all target + # systems that can't hard-code library paths into their executables + # and that have no shared library path variable independent of PATH, + # but it turns out we can't easily determine that from inspecting + # libtool variables, so we have to hard-code the OSs to which it + # applies here; at the moment, that means platforms that use the PE + # object format with DLL files. See the long comment at the top of + # tests/bindir.at for full details. tdlname=$dlname case $host,$output,$installed,$module,$dlname in - *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;; + *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) + # If a -bindir argument was supplied, place the dll there. + if test "x$bindir" != x ; + then + func_relative_path "$install_libdir" "$bindir" + tdlname=$func_relative_path_result$dlname + else + # Otherwise fall back on heuristic. + tdlname=../bin/$dlname + fi + ;; esac $ECHO > $output "\ # $outputname - a libtool library file diff --git a/reactos/lib/3rdparty/libxml2/nanoftp.c b/reactos/lib/3rdparty/libxml2/nanoftp.c index a54b85b3a54..a7ca5b6b047 100644 --- a/reactos/lib/3rdparty/libxml2/nanoftp.c +++ b/reactos/lib/3rdparty/libxml2/nanoftp.c @@ -78,7 +78,9 @@ #if defined(__MINGW32__) || defined(_WIN32_WCE) +#ifndef _WINSOCKAPI_ #define _WINSOCKAPI_ +#endif #include #include #undef XML_SOCKLEN_T @@ -92,7 +94,6 @@ #if !defined(__BEOS__) || defined(__HAIKU__) #define closesocket(s) close(s) #endif -#define SOCKET int #endif #ifdef __BEOS__ @@ -484,7 +485,7 @@ xmlNanoFTPNewCtxt(const char *URL) { ret->returnValue = 0; ret->controlBufIndex = 0; ret->controlBufUsed = 0; - ret->controlFd = -1; + ret->controlFd = INVALID_SOCKET; unescaped = xmlURIUnescapeString(URL, 0, NULL); if (unescaped != NULL) { @@ -511,8 +512,8 @@ xmlNanoFTPFreeCtxt(void * ctx) { if (ctxt->protocol != NULL) xmlFree(ctxt->protocol); if (ctxt->path != NULL) xmlFree(ctxt->path); ctxt->passive = 1; - if (ctxt->controlFd >= 0) closesocket(ctxt->controlFd); - ctxt->controlFd = -1; + if (ctxt->controlFd != INVALID_SOCKET) closesocket(ctxt->controlFd); + ctxt->controlFd = INVALID_SOCKET; ctxt->controlBufIndex = -1; ctxt->controlBufUsed = -1; xmlFree(ctxt); @@ -567,7 +568,7 @@ xmlNanoFTPGetMore(void *ctx) { int len; int size; - if ((ctxt == NULL) || (ctxt->controlFd < 0)) return(-1); + if ((ctxt == NULL) || (ctxt->controlFd == INVALID_SOCKET)) return(-1); if ((ctxt->controlBufIndex < 0) || (ctxt->controlBufIndex > FTP_BUF_SIZE)) { #ifdef DEBUG_FTP @@ -619,8 +620,8 @@ xmlNanoFTPGetMore(void *ctx) { if ((len = recv(ctxt->controlFd, &ctxt->controlBuf[ctxt->controlBufIndex], size, 0)) < 0) { __xmlIOErr(XML_FROM_FTP, 0, "recv failed"); - closesocket(ctxt->controlFd); ctxt->controlFd = -1; - ctxt->controlFd = -1; + closesocket(ctxt->controlFd); ctxt->controlFd = INVALID_SOCKET; + ctxt->controlFd = INVALID_SOCKET; return(-1); } #ifdef DEBUG_FTP @@ -648,7 +649,7 @@ xmlNanoFTPReadResponse(void *ctx) { int len; int res = -1, cur = -1; - if ((ctxt == NULL) || (ctxt->controlFd < 0)) return(-1); + if ((ctxt == NULL) || (ctxt->controlFd == INVALID_SOCKET)) return(-1); get_more: /* @@ -737,7 +738,7 @@ xmlNanoFTPCheckResponse(void *ctx) { fd_set rfd; struct timeval tv; - if ((ctxt == NULL) || (ctxt->controlFd < 0)) return(-1); + if ((ctxt == NULL) || (ctxt->controlFd == INVALID_SOCKET)) return(-1); tv.tv_sec = 0; tv.tv_usec = 0; FD_ZERO(&rfd); @@ -826,7 +827,7 @@ xmlNanoFTPQuit(void *ctx) { char buf[200]; int len, res; - if ((ctxt == NULL) || (ctxt->controlFd < 0)) return(-1); + if ((ctxt == NULL) || (ctxt->controlFd == INVALID_SOCKET)) return(-1); snprintf(buf, sizeof(buf), "QUIT\r\n"); len = strlen(buf); @@ -951,7 +952,7 @@ xmlNanoFTPConnect(void *ctx) { addrlen = sizeof (struct sockaddr_in); } - if (ctxt->controlFd < 0) { + if (ctxt->controlFd == INVALID_SOCKET) { __xmlIOErr(XML_FROM_FTP, 0, "socket failed"); return(-1); } @@ -962,8 +963,8 @@ xmlNanoFTPConnect(void *ctx) { if (connect(ctxt->controlFd, (struct sockaddr *) &ctxt->ftpAddr, addrlen) < 0) { __xmlIOErr(XML_FROM_FTP, 0, "Failed to create a connection"); - closesocket(ctxt->controlFd); ctxt->controlFd = -1; - ctxt->controlFd = -1; + closesocket(ctxt->controlFd); ctxt->controlFd = INVALID_SOCKET; + ctxt->controlFd = INVALID_SOCKET; return(-1); } @@ -972,8 +973,8 @@ xmlNanoFTPConnect(void *ctx) { */ res = xmlNanoFTPGetResponse(ctxt); if (res != 2) { - closesocket(ctxt->controlFd); ctxt->controlFd = -1; - ctxt->controlFd = -1; + closesocket(ctxt->controlFd); ctxt->controlFd = INVALID_SOCKET; + ctxt->controlFd = INVALID_SOCKET; return(-1); } @@ -1030,7 +1031,7 @@ xmlNanoFTPConnect(void *ctx) { if (res < 0) { __xmlIOErr(XML_FROM_FTP, 0, "send failed"); closesocket(ctxt->controlFd); - ctxt->controlFd = -1; + ctxt->controlFd = INVALID_SOCKET; return(res); } res = xmlNanoFTPGetResponse(ctxt); @@ -1052,13 +1053,13 @@ xmlNanoFTPConnect(void *ctx) { if (res < 0) { __xmlIOErr(XML_FROM_FTP, 0, "send failed"); closesocket(ctxt->controlFd); - ctxt->controlFd = -1; + ctxt->controlFd = INVALID_SOCKET; return(res); } res = xmlNanoFTPGetResponse(ctxt); if (res > 3) { closesocket(ctxt->controlFd); - ctxt->controlFd = -1; + ctxt->controlFd = INVALID_SOCKET; return(-1); } break; @@ -1069,7 +1070,7 @@ xmlNanoFTPConnect(void *ctx) { case -1: default: closesocket(ctxt->controlFd); - ctxt->controlFd = -1; + ctxt->controlFd = INVALID_SOCKET; return(-1); } } @@ -1092,8 +1093,8 @@ xmlNanoFTPConnect(void *ctx) { res = send(ctxt->controlFd, buf, len, 0); if (res < 0) { __xmlIOErr(XML_FROM_FTP, 0, "send failed"); - closesocket(ctxt->controlFd); ctxt->controlFd = -1; - ctxt->controlFd = -1; + closesocket(ctxt->controlFd); ctxt->controlFd = INVALID_SOCKET; + ctxt->controlFd = INVALID_SOCKET; return(res); } res = xmlNanoFTPGetResponse(ctxt); @@ -1103,8 +1104,8 @@ xmlNanoFTPConnect(void *ctx) { break; } if (proxyType == 1) { - closesocket(ctxt->controlFd); ctxt->controlFd = -1; - ctxt->controlFd = -1; + closesocket(ctxt->controlFd); ctxt->controlFd = INVALID_SOCKET; + ctxt->controlFd = INVALID_SOCKET; return(-1); } case 2: @@ -1123,8 +1124,8 @@ xmlNanoFTPConnect(void *ctx) { res = send(ctxt->controlFd, buf, len, 0); if (res < 0) { __xmlIOErr(XML_FROM_FTP, 0, "send failed"); - closesocket(ctxt->controlFd); ctxt->controlFd = -1; - ctxt->controlFd = -1; + closesocket(ctxt->controlFd); ctxt->controlFd = INVALID_SOCKET; + ctxt->controlFd = INVALID_SOCKET; return(res); } res = xmlNanoFTPGetResponse(ctxt); @@ -1145,8 +1146,8 @@ xmlNanoFTPConnect(void *ctx) { res = send(ctxt->controlFd, buf, len, 0); if (res < 0) { __xmlIOErr(XML_FROM_FTP, 0, "send failed"); - closesocket(ctxt->controlFd); ctxt->controlFd = -1; - ctxt->controlFd = -1; + closesocket(ctxt->controlFd); ctxt->controlFd = INVALID_SOCKET; + ctxt->controlFd = INVALID_SOCKET; return(res); } res = xmlNanoFTPGetResponse(ctxt); @@ -1156,8 +1157,8 @@ xmlNanoFTPConnect(void *ctx) { return(0); } if (proxyType == 2) { - closesocket(ctxt->controlFd); ctxt->controlFd = -1; - ctxt->controlFd = -1; + closesocket(ctxt->controlFd); ctxt->controlFd = INVALID_SOCKET; + ctxt->controlFd = INVALID_SOCKET; return(-1); } case 3: @@ -1166,8 +1167,8 @@ xmlNanoFTPConnect(void *ctx) { * send the code or at least the sequence in use. */ default: - closesocket(ctxt->controlFd); ctxt->controlFd = -1; - ctxt->controlFd = -1; + closesocket(ctxt->controlFd); ctxt->controlFd = INVALID_SOCKET; + ctxt->controlFd = INVALID_SOCKET; return(-1); } } @@ -1176,8 +1177,8 @@ xmlNanoFTPConnect(void *ctx) { */ res = xmlNanoFTPSendUser(ctxt); if (res < 0) { - closesocket(ctxt->controlFd); ctxt->controlFd = -1; - ctxt->controlFd = -1; + closesocket(ctxt->controlFd); ctxt->controlFd = INVALID_SOCKET; + ctxt->controlFd = INVALID_SOCKET; return(-1); } res = xmlNanoFTPGetResponse(ctxt); @@ -1191,14 +1192,14 @@ xmlNanoFTPConnect(void *ctx) { case 5: case -1: default: - closesocket(ctxt->controlFd); ctxt->controlFd = -1; - ctxt->controlFd = -1; + closesocket(ctxt->controlFd); ctxt->controlFd = INVALID_SOCKET; + ctxt->controlFd = INVALID_SOCKET; return(-1); } res = xmlNanoFTPSendPasswd(ctxt); if (res < 0) { - closesocket(ctxt->controlFd); ctxt->controlFd = -1; - ctxt->controlFd = -1; + closesocket(ctxt->controlFd); ctxt->controlFd = INVALID_SOCKET; + ctxt->controlFd = INVALID_SOCKET; return(-1); } res = xmlNanoFTPGetResponse(ctxt); @@ -1213,8 +1214,8 @@ xmlNanoFTPConnect(void *ctx) { case 5: case -1: default: - closesocket(ctxt->controlFd); ctxt->controlFd = -1; - ctxt->controlFd = -1; + closesocket(ctxt->controlFd); ctxt->controlFd = INVALID_SOCKET; + ctxt->controlFd = INVALID_SOCKET; return(-1); } @@ -1270,7 +1271,7 @@ xmlNanoFTPCwd(void *ctx, const char *directory) { int len; int res; - if ((ctxt == NULL) || (ctxt->controlFd < 0)) return(-1); + if ((ctxt == NULL) || (ctxt->controlFd == INVALID_SOCKET)) return(-1); if (directory == NULL) return 0; /* @@ -1319,7 +1320,7 @@ xmlNanoFTPDele(void *ctx, const char *file) { int len; int res; - if ((ctxt == NULL) || (ctxt->controlFd < 0) || (file == NULL)) return(-1); + if ((ctxt == NULL) || (ctxt->controlFd == INVALID_SOCKET) || (file == NULL)) return(-1); if (file == NULL) return (0); /* @@ -1362,7 +1363,7 @@ xmlNanoFTPDele(void *ctx, const char *file) { * Returns -1 incase of error, 0 otherwise */ -int +SOCKET xmlNanoFTPGetConnection(void *ctx) { xmlNanoFTPCtxtPtr ctxt = (xmlNanoFTPCtxtPtr) ctx; char buf[200], *cur; @@ -1377,7 +1378,7 @@ xmlNanoFTPGetConnection(void *ctx) { #endif XML_SOCKLEN_T dataAddrLen; - if (ctxt == NULL) return(-1); + if (ctxt == NULL) return INVALID_SOCKET; memset (&dataAddr, 0, sizeof(dataAddr)); #ifdef SUPPORT_IP6 @@ -1393,9 +1394,9 @@ xmlNanoFTPGetConnection(void *ctx) { dataAddrLen = sizeof (struct sockaddr_in); } - if (ctxt->dataFd < 0) { + if (ctxt->dataFd == INVALID_SOCKET) { __xmlIOErr(XML_FROM_FTP, 0, "socket failed"); - return (-1); + return INVALID_SOCKET; } if (ctxt->passive) { @@ -1412,19 +1413,19 @@ xmlNanoFTPGetConnection(void *ctx) { res = send(ctxt->controlFd, buf, len, 0); if (res < 0) { __xmlIOErr(XML_FROM_FTP, 0, "send failed"); - closesocket(ctxt->dataFd); ctxt->dataFd = -1; - return(res); + closesocket(ctxt->dataFd); ctxt->dataFd = INVALID_SOCKET; + return INVALID_SOCKET; } res = xmlNanoFTPReadResponse(ctx); if (res != 2) { if (res == 5) { - closesocket(ctxt->dataFd); ctxt->dataFd = -1; - return(-1); + closesocket(ctxt->dataFd); ctxt->dataFd = INVALID_SOCKET; + return INVALID_SOCKET; } else { /* * retry with an active connection */ - closesocket(ctxt->dataFd); ctxt->dataFd = -1; + closesocket(ctxt->dataFd); ctxt->dataFd = INVALID_SOCKET; ctxt->passive = 0; } } @@ -1435,10 +1436,10 @@ xmlNanoFTPGetConnection(void *ctx) { if (sscanf (cur, "%u", &temp[0]) != 1) { __xmlIOErr(XML_FROM_FTP, XML_FTP_EPSV_ANSWER, "Invalid answer to EPSV\n"); - if (ctxt->dataFd != -1) { - closesocket (ctxt->dataFd); ctxt->dataFd = -1; + if (ctxt->dataFd != INVALID_SOCKET) { + closesocket (ctxt->dataFd); ctxt->dataFd = INVALID_SOCKET; } - return (-1); + return INVALID_SOCKET; } memcpy (&((struct sockaddr_in6 *)&dataAddr)->sin6_addr, &((struct sockaddr_in6 *)&ctxt->ftpAddr)->sin6_addr, sizeof(struct in6_addr)); ((struct sockaddr_in6 *)&dataAddr)->sin6_port = htons (temp[0]); @@ -1450,10 +1451,10 @@ xmlNanoFTPGetConnection(void *ctx) { &temp[3], &temp[4], &temp[5]) != 6) { __xmlIOErr(XML_FROM_FTP, XML_FTP_PASV_ANSWER, "Invalid answer to PASV\n"); - if (ctxt->dataFd != -1) { - closesocket (ctxt->dataFd); ctxt->dataFd = -1; + if (ctxt->dataFd != INVALID_SOCKET) { + closesocket (ctxt->dataFd); ctxt->dataFd = INVALID_SOCKET; } - return (-1); + return INVALID_SOCKET; } for (i=0; i<6; i++) ad[i] = (unsigned char) (temp[i] & 0xff); memcpy (&((struct sockaddr_in *)&dataAddr)->sin_addr, &ad[0], 4); @@ -1462,8 +1463,8 @@ xmlNanoFTPGetConnection(void *ctx) { if (connect(ctxt->dataFd, (struct sockaddr *) &dataAddr, dataAddrLen) < 0) { __xmlIOErr(XML_FROM_FTP, 0, "Failed to create a data connection"); - closesocket(ctxt->dataFd); ctxt->dataFd = -1; - return (-1); + closesocket(ctxt->dataFd); ctxt->dataFd = INVALID_SOCKET; + return INVALID_SOCKET; } } else { getsockname(ctxt->dataFd, (struct sockaddr *) &dataAddr, &dataAddrLen); @@ -1476,15 +1477,15 @@ xmlNanoFTPGetConnection(void *ctx) { if (bind(ctxt->dataFd, (struct sockaddr *) &dataAddr, dataAddrLen) < 0) { __xmlIOErr(XML_FROM_FTP, 0, "bind failed"); - closesocket(ctxt->dataFd); ctxt->dataFd = -1; - return (-1); + closesocket(ctxt->dataFd); ctxt->dataFd = INVALID_SOCKET; + return INVALID_SOCKET; } getsockname(ctxt->dataFd, (struct sockaddr *) &dataAddr, &dataAddrLen); if (listen(ctxt->dataFd, 1) < 0) { __xmlIOErr(XML_FROM_FTP, 0, "listen failed"); - closesocket(ctxt->dataFd); ctxt->dataFd = -1; - return (-1); + closesocket(ctxt->dataFd); ctxt->dataFd = INVALID_SOCKET; + return INVALID_SOCKET; } #ifdef SUPPORT_IP6 if ((ctxt->ftpAddr).ss_family == AF_INET6) { @@ -1513,13 +1514,13 @@ xmlNanoFTPGetConnection(void *ctx) { res = send(ctxt->controlFd, buf, len, 0); if (res < 0) { __xmlIOErr(XML_FROM_FTP, 0, "send failed"); - closesocket(ctxt->dataFd); ctxt->dataFd = -1; - return(res); + closesocket(ctxt->dataFd); ctxt->dataFd = INVALID_SOCKET; + return INVALID_SOCKET; } res = xmlNanoFTPGetResponse(ctxt); if (res != 2) { - closesocket(ctxt->dataFd); ctxt->dataFd = -1; - return(-1); + closesocket(ctxt->dataFd); ctxt->dataFd = INVALID_SOCKET; + return INVALID_SOCKET; } } return(ctxt->dataFd); @@ -1542,9 +1543,9 @@ xmlNanoFTPCloseConnection(void *ctx) { fd_set rfd, efd; struct timeval tv; - if ((ctxt == NULL) || (ctxt->controlFd < 0)) return(-1); + if ((ctxt == NULL) || (ctxt->controlFd == INVALID_SOCKET)) return(-1); - closesocket(ctxt->dataFd); ctxt->dataFd = -1; + closesocket(ctxt->dataFd); ctxt->dataFd = INVALID_SOCKET; tv.tv_sec = 15; tv.tv_usec = 0; FD_ZERO(&rfd); @@ -1556,7 +1557,7 @@ xmlNanoFTPCloseConnection(void *ctx) { #ifdef DEBUG_FTP perror("select"); #endif - closesocket(ctxt->controlFd); ctxt->controlFd = -1; + closesocket(ctxt->controlFd); ctxt->controlFd = INVALID_SOCKET; return(-1); } if (res == 0) { @@ -1564,11 +1565,11 @@ xmlNanoFTPCloseConnection(void *ctx) { xmlGenericError(xmlGenericErrorContext, "xmlNanoFTPCloseConnection: timeout\n"); #endif - closesocket(ctxt->controlFd); ctxt->controlFd = -1; + closesocket(ctxt->controlFd); ctxt->controlFd = INVALID_SOCKET; } else { res = xmlNanoFTPGetResponse(ctxt); if (res != 2) { - closesocket(ctxt->controlFd); ctxt->controlFd = -1; + closesocket(ctxt->controlFd); ctxt->controlFd = INVALID_SOCKET; return(-1); } } @@ -1729,7 +1730,7 @@ xmlNanoFTPList(void *ctx, ftpListCallback callback, void *userData, if (xmlNanoFTPCwd(ctxt, ctxt->path) < 1) return(-1); ctxt->dataFd = xmlNanoFTPGetConnection(ctxt); - if (ctxt->dataFd == -1) + if (ctxt->dataFd == INVALID_SOCKET) return(-1); snprintf(buf, sizeof(buf), "LIST -L\r\n"); } else { @@ -1738,7 +1739,7 @@ xmlNanoFTPList(void *ctx, ftpListCallback callback, void *userData, return(-1); } ctxt->dataFd = xmlNanoFTPGetConnection(ctxt); - if (ctxt->dataFd == -1) + if (ctxt->dataFd == INVALID_SOCKET) return(-1); snprintf(buf, sizeof(buf), "LIST -L %s\r\n", filename); } @@ -1750,12 +1751,12 @@ xmlNanoFTPList(void *ctx, ftpListCallback callback, void *userData, res = send(ctxt->controlFd, buf, len, 0); if (res < 0) { __xmlIOErr(XML_FROM_FTP, 0, "send failed"); - closesocket(ctxt->dataFd); ctxt->dataFd = -1; + closesocket(ctxt->dataFd); ctxt->dataFd = INVALID_SOCKET; return(res); } res = xmlNanoFTPReadResponse(ctxt); if (res != 1) { - closesocket(ctxt->dataFd); ctxt->dataFd = -1; + closesocket(ctxt->dataFd); ctxt->dataFd = INVALID_SOCKET; return(-res); } @@ -1771,18 +1772,18 @@ xmlNanoFTPList(void *ctx, ftpListCallback callback, void *userData, #ifdef DEBUG_FTP perror("select"); #endif - closesocket(ctxt->dataFd); ctxt->dataFd = -1; + closesocket(ctxt->dataFd); ctxt->dataFd = INVALID_SOCKET; return(-1); } if (res == 0) { res = xmlNanoFTPCheckResponse(ctxt); if (res < 0) { - closesocket(ctxt->dataFd); ctxt->dataFd = -1; - ctxt->dataFd = -1; + closesocket(ctxt->dataFd); ctxt->dataFd = INVALID_SOCKET; + ctxt->dataFd = INVALID_SOCKET; return(-1); } if (res == 2) { - closesocket(ctxt->dataFd); ctxt->dataFd = -1; + closesocket(ctxt->dataFd); ctxt->dataFd = INVALID_SOCKET; return(0); } @@ -1791,8 +1792,8 @@ xmlNanoFTPList(void *ctx, ftpListCallback callback, void *userData, if ((len = recv(ctxt->dataFd, &buf[indx], sizeof(buf) - (indx + 1), 0)) < 0) { __xmlIOErr(XML_FROM_FTP, 0, "recv"); - closesocket(ctxt->dataFd); ctxt->dataFd = -1; - ctxt->dataFd = -1; + closesocket(ctxt->dataFd); ctxt->dataFd = INVALID_SOCKET; + ctxt->dataFd = INVALID_SOCKET; return(-1); } #ifdef DEBUG_FTP @@ -1824,18 +1825,18 @@ xmlNanoFTPList(void *ctx, ftpListCallback callback, void *userData, */ -int +SOCKET xmlNanoFTPGetSocket(void *ctx, const char *filename) { xmlNanoFTPCtxtPtr ctxt = (xmlNanoFTPCtxtPtr) ctx; char buf[300]; int res, len; if (ctx == NULL) - return(-1); + return INVALID_SOCKET; if ((filename == NULL) && (ctxt->path == NULL)) - return(-1); + return INVALID_SOCKET; ctxt->dataFd = xmlNanoFTPGetConnection(ctxt); - if (ctxt->dataFd == -1) - return(-1); + if (ctxt->dataFd == INVALID_SOCKET) + return INVALID_SOCKET; snprintf(buf, sizeof(buf), "TYPE I\r\n"); len = strlen(buf); @@ -1845,13 +1846,13 @@ xmlNanoFTPGetSocket(void *ctx, const char *filename) { res = send(ctxt->controlFd, buf, len, 0); if (res < 0) { __xmlIOErr(XML_FROM_FTP, 0, "send failed"); - closesocket(ctxt->dataFd); ctxt->dataFd = -1; - return(res); + closesocket(ctxt->dataFd); ctxt->dataFd = INVALID_SOCKET; + return INVALID_SOCKET; } res = xmlNanoFTPReadResponse(ctxt); if (res != 2) { - closesocket(ctxt->dataFd); ctxt->dataFd = -1; - return(-res); + closesocket(ctxt->dataFd); ctxt->dataFd = INVALID_SOCKET; + return INVALID_SOCKET; } if (filename == NULL) snprintf(buf, sizeof(buf), "RETR %s\r\n", ctxt->path); @@ -1865,13 +1866,13 @@ xmlNanoFTPGetSocket(void *ctx, const char *filename) { res = send(ctxt->controlFd, buf, len, 0); if (res < 0) { __xmlIOErr(XML_FROM_FTP, 0, "send failed"); - closesocket(ctxt->dataFd); ctxt->dataFd = -1; - return(res); + closesocket(ctxt->dataFd); ctxt->dataFd = INVALID_SOCKET; + return INVALID_SOCKET; } res = xmlNanoFTPReadResponse(ctxt); if (res != 1) { - closesocket(ctxt->dataFd); ctxt->dataFd = -1; - return(-res); + closesocket(ctxt->dataFd); ctxt->dataFd = INVALID_SOCKET; + return INVALID_SOCKET; } return(ctxt->dataFd); } @@ -1903,7 +1904,7 @@ xmlNanoFTPGet(void *ctx, ftpDataCallback callback, void *userData, return(-1); if (callback == NULL) return(-1); - if (xmlNanoFTPGetSocket(ctxt, filename) < 0) + if (xmlNanoFTPGetSocket(ctxt, filename) == INVALID_SOCKET) return(-1); do { @@ -1916,18 +1917,18 @@ xmlNanoFTPGet(void *ctx, ftpDataCallback callback, void *userData, #ifdef DEBUG_FTP perror("select"); #endif - closesocket(ctxt->dataFd); ctxt->dataFd = -1; + closesocket(ctxt->dataFd); ctxt->dataFd = INVALID_SOCKET; return(-1); } if (res == 0) { res = xmlNanoFTPCheckResponse(ctxt); if (res < 0) { - closesocket(ctxt->dataFd); ctxt->dataFd = -1; - ctxt->dataFd = -1; + closesocket(ctxt->dataFd); ctxt->dataFd = INVALID_SOCKET; + ctxt->dataFd = INVALID_SOCKET; return(-1); } if (res == 2) { - closesocket(ctxt->dataFd); ctxt->dataFd = -1; + closesocket(ctxt->dataFd); ctxt->dataFd = INVALID_SOCKET; return(0); } @@ -1936,7 +1937,7 @@ xmlNanoFTPGet(void *ctx, ftpDataCallback callback, void *userData, if ((len = recv(ctxt->dataFd, buf, sizeof(buf), 0)) < 0) { __xmlIOErr(XML_FROM_FTP, 0, "recv failed"); callback(userData, buf, len); - closesocket(ctxt->dataFd); ctxt->dataFd = -1; + closesocket(ctxt->dataFd); ctxt->dataFd = INVALID_SOCKET; return(-1); } callback(userData, buf, len); @@ -1962,7 +1963,7 @@ xmlNanoFTPRead(void *ctx, void *dest, int len) { xmlNanoFTPCtxtPtr ctxt = (xmlNanoFTPCtxtPtr) ctx; if (ctx == NULL) return(-1); - if (ctxt->dataFd < 0) return(0); + if (ctxt->dataFd == INVALID_SOCKET) return(0); if (dest == NULL) return(-1); if (len <= 0) return(0); @@ -1990,7 +1991,7 @@ xmlNanoFTPRead(void *ctx, void *dest, int len) { void* xmlNanoFTPOpen(const char *URL) { xmlNanoFTPCtxtPtr ctxt; - int sock; + SOCKET sock; xmlNanoFTPInit(); if (URL == NULL) return(NULL); @@ -2003,7 +2004,7 @@ xmlNanoFTPOpen(const char *URL) { return(NULL); } sock = xmlNanoFTPGetSocket(ctxt, ctxt->path); - if (sock < 0) { + if (sock == INVALID_SOCKET) { xmlNanoFTPFreeCtxt(ctxt); return(NULL); } @@ -2026,14 +2027,14 @@ xmlNanoFTPClose(void *ctx) { if (ctxt == NULL) return(-1); - if (ctxt->dataFd >= 0) { + if (ctxt->dataFd != INVALID_SOCKET) { closesocket(ctxt->dataFd); - ctxt->dataFd = -1; + ctxt->dataFd = INVALID_SOCKET; } - if (ctxt->controlFd >= 0) { + if (ctxt->controlFd != INVALID_SOCKET) { xmlNanoFTPQuit(ctxt); closesocket(ctxt->controlFd); - ctxt->controlFd = -1; + ctxt->controlFd = INVALID_SOCKET; } xmlNanoFTPFreeCtxt(ctxt); return(0); diff --git a/reactos/lib/3rdparty/libxml2/nanohttp.c b/reactos/lib/3rdparty/libxml2/nanohttp.c index 542c4eac943..f6694575328 100644 --- a/reactos/lib/3rdparty/libxml2/nanohttp.c +++ b/reactos/lib/3rdparty/libxml2/nanohttp.c @@ -75,18 +75,18 @@ #ifdef VMS #include #define XML_SOCKLEN_T unsigned int -#define SOCKET int #endif #if defined(__MINGW32__) || defined(_WIN32_WCE) +#ifndef _WINSOCKAPI_ #define _WINSOCKAPI_ +#endif #include #include #undef XML_SOCKLEN_T #define XML_SOCKLEN_T unsigned int #endif - #include #include #include @@ -103,6 +103,7 @@ #define closesocket(s) close(s) #endif #define SOCKET int +#define INVALID_SOCKET (-1) #endif #ifdef __BEOS__ @@ -114,9 +115,6 @@ #ifndef XML_SOCKLEN_T #define XML_SOCKLEN_T unsigned int #endif -#ifndef SOCKET -#define SOCKET int -#endif #ifdef STANDALONE #define DEBUG_HTTP @@ -196,10 +194,10 @@ static int socket_errno(void) { #ifdef SUPPORT_IP6 static int have_ipv6(void) { - int s; + SOCKET s; s = socket (AF_INET6, SOCK_STREAM, 0); - if (s != -1) { + if (s != INVALID_SOCKET) { close (s); return (1); } @@ -393,7 +391,7 @@ xmlNanoHTTPNewCtxt(const char *URL) { memset(ret, 0, sizeof(xmlNanoHTTPCtxt)); ret->port = 80; ret->returnValue = 0; - ret->fd = -1; + ret->fd = INVALID_SOCKET; ret->ContentLength = -1; xmlNanoHTTPScanURL(ret, URL); @@ -430,8 +428,8 @@ xmlNanoHTTPFreeCtxt(xmlNanoHTTPCtxtPtr ctxt) { #endif ctxt->state = XML_NANO_HTTP_NONE; - if (ctxt->fd >= 0) closesocket(ctxt->fd); - ctxt->fd = -1; + if (ctxt->fd != INVALID_SOCKET) closesocket(ctxt->fd); + ctxt->fd = INVALID_SOCKET; xmlFree(ctxt); } @@ -842,7 +840,7 @@ xmlNanoHTTPScanAnswer(xmlNanoHTTPCtxtPtr ctxt, const char *line) { * Returns -1 in case of failure, the file descriptor number otherwise */ -static int +static SOCKET xmlNanoHTTPConnectAttempt(struct sockaddr *addr) { #ifndef HAVE_POLL_H @@ -870,12 +868,12 @@ xmlNanoHTTPConnectAttempt(struct sockaddr *addr) s = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); addrlen = sizeof(struct sockaddr_in); } - if (s == -1) { + if (s == INVALID_SOCKET) { #ifdef DEBUG_HTTP perror("socket"); #endif __xmlIOErr(XML_FROM_HTTP, 0, "socket failed\n"); - return (-1); + return INVALID_SOCKET; } #ifdef _WINSOCKAPI_ { @@ -916,7 +914,7 @@ xmlNanoHTTPConnectAttempt(struct sockaddr *addr) #endif __xmlIOErr(XML_FROM_HTTP, 0, "error setting non-blocking IO\n"); closesocket(s); - return (-1); + return INVALID_SOCKET; } #endif /* !__BEOS__ */ #endif /* !VMS */ @@ -931,7 +929,7 @@ xmlNanoHTTPConnectAttempt(struct sockaddr *addr) __xmlIOErr(XML_FROM_HTTP, 0, "error connecting to HTTP server"); closesocket(s); - return (-1); + return INVALID_SOCKET; } } #ifndef HAVE_POLL_H @@ -944,7 +942,7 @@ xmlNanoHTTPConnectAttempt(struct sockaddr *addr) #endif #ifndef _WINSOCKAPI_ if (s > FD_SETSIZE) - return -1; + return INVALID_SOCKET; #endif FD_ZERO(&wfd); FD_SET(s, &wfd); @@ -972,12 +970,12 @@ xmlNanoHTTPConnectAttempt(struct sockaddr *addr) /* Time out */ __xmlIOErr(XML_FROM_HTTP, 0, "Connect attempt timed out"); closesocket(s); - return (-1); + return INVALID_SOCKET; case -1: /* Ermm.. ?? */ __xmlIOErr(XML_FROM_HTTP, 0, "Connect failed"); closesocket(s); - return (-1); + return INVALID_SOCKET; } #ifndef HAVE_POLL_H @@ -998,7 +996,7 @@ xmlNanoHTTPConnectAttempt(struct sockaddr *addr) 0) { /* Solaris error code */ __xmlIOErr(XML_FROM_HTTP, 0, "getsockopt failed\n"); - return (-1); + return INVALID_SOCKET; } #endif if (status) { @@ -1006,13 +1004,13 @@ xmlNanoHTTPConnectAttempt(struct sockaddr *addr) "Error connecting to remote host"); closesocket(s); errno = status; - return (-1); + return INVALID_SOCKET; } } else { /* pbm */ __xmlIOErr(XML_FROM_HTTP, 0, "select failed\n"); closesocket(s); - return (-1); + return INVALID_SOCKET; } return (s); @@ -1029,7 +1027,7 @@ xmlNanoHTTPConnectAttempt(struct sockaddr *addr) * Returns -1 in case of failure, the file descriptor number otherwise */ -static int +static SOCKET xmlNanoHTTPConnectHost(const char *host, int port) { struct hostent *h; @@ -1042,7 +1040,7 @@ xmlNanoHTTPConnectHost(const char *host, int port) struct sockaddr_in6 sockin6; #endif int i; - int s; + SOCKET s; memset (&sockin, 0, sizeof(sockin)); #ifdef SUPPORT_IP6 @@ -1073,7 +1071,7 @@ xmlNanoHTTPConnectHost(const char *host, int port) status = getaddrinfo (host, NULL, &hints, &result); if (status) { __xmlIOErr(XML_FROM_HTTP, 0, "getaddrinfo failed\n"); - return (-1); + return INVALID_SOCKET; } for (res = result; res; res = res->ai_next) { @@ -1081,7 +1079,7 @@ xmlNanoHTTPConnectHost(const char *host, int port) if (res->ai_addrlen > sizeof(sockin)) { __xmlIOErr(XML_FROM_HTTP, 0, "address size mismatch\n"); freeaddrinfo (result); - return (-1); + return INVALID_SOCKET; } memcpy (&sockin, res->ai_addr, res->ai_addrlen); sockin.sin_port = htons (port); @@ -1091,7 +1089,7 @@ xmlNanoHTTPConnectHost(const char *host, int port) if (res->ai_addrlen > sizeof(sockin6)) { __xmlIOErr(XML_FROM_HTTP, 0, "address size mismatch\n"); freeaddrinfo (result); - return (-1); + return INVALID_SOCKET; } memcpy (&sockin6, res->ai_addr, res->ai_addrlen); sockin6.sin6_port = htons (port); @@ -1101,7 +1099,7 @@ xmlNanoHTTPConnectHost(const char *host, int port) continue; /* for */ s = xmlNanoHTTPConnectAttempt (addr); - if (s != -1) { + if (s != INVALID_SOCKET) { freeaddrinfo (result); return (s); } @@ -1155,7 +1153,7 @@ xmlNanoHTTPConnectHost(const char *host, int port) #else __xmlIOErr(XML_FROM_HTTP, 0, "Failed to resolve host"); #endif - return (-1); + return INVALID_SOCKET; } for (i = 0; h->h_addr_list[i]; i++) { @@ -1163,7 +1161,7 @@ xmlNanoHTTPConnectHost(const char *host, int port) /* A records (IPv4) */ if ((unsigned int) h->h_length > sizeof(ia)) { __xmlIOErr(XML_FROM_HTTP, 0, "address size mismatch\n"); - return (-1); + return INVALID_SOCKET; } memcpy (&ia, h->h_addr_list[i], h->h_length); sockin.sin_family = h->h_addrtype; @@ -1175,7 +1173,7 @@ xmlNanoHTTPConnectHost(const char *host, int port) /* AAAA records (IPv6) */ if ((unsigned int) h->h_length > sizeof(ia6)) { __xmlIOErr(XML_FROM_HTTP, 0, "address size mismatch\n"); - return (-1); + return INVALID_SOCKET; } memcpy (&ia6, h->h_addr_list[i], h->h_length); sockin6.sin6_family = h->h_addrtype; @@ -1187,7 +1185,7 @@ xmlNanoHTTPConnectHost(const char *host, int port) break; /* for */ s = xmlNanoHTTPConnectAttempt (addr); - if (s != -1) + if (s != INVALID_SOCKET) return (s); } } @@ -1198,7 +1196,7 @@ xmlNanoHTTPConnectHost(const char *host, int port) "xmlNanoHTTPConnectHost: unable to connect to '%s'.\n", host); #endif - return (-1); + return INVALID_SOCKET; } @@ -1342,7 +1340,8 @@ xmlNanoHTTPMethodRedir(const char *URL, const char *method, const char *input, const char *headers, int ilen ) { xmlNanoHTTPCtxtPtr ctxt; char *bp, *p; - int blen, ret; + int blen; + SOCKET ret; int nbRedirects = 0; char *redirURL = NULL; #ifdef DEBUG_HTTP @@ -1386,7 +1385,7 @@ retry: blen = strlen(ctxt->hostname); ret = xmlNanoHTTPConnectHost(ctxt->hostname, ctxt->port); } - if (ret < 0) { + if (ret == INVALID_SOCKET) { xmlNanoHTTPFreeCtxt(ctxt); if (redirURL != NULL) xmlFree(redirURL); return(NULL); diff --git a/reactos/lib/3rdparty/libxml2/parser.c b/reactos/lib/3rdparty/libxml2/parser.c index 85e759969a1..d1c7888a9fc 100644 --- a/reactos/lib/3rdparty/libxml2/parser.c +++ b/reactos/lib/3rdparty/libxml2/parser.c @@ -953,6 +953,12 @@ xmlHasFeature(xmlFeature feature) return(1); #else return(0); +#endif + case XML_WITH_ICU: +#ifdef LIBXML_ICU_ENABLED + return(1); +#else + return(0); #endif default: break; @@ -1297,60 +1303,182 @@ xmlCleanSpecialAttr(xmlParserCtxtPtr ctxt) * [37] UserCode ::= ('x' | 'X') '-' ([a-z] | [A-Z])+ * [38] Subcode ::= ([a-z] | [A-Z])+ * + * The current REC reference the sucessors of RFC 1766, currently 5646 + * + * http://www.rfc-editor.org/rfc/rfc5646.txt + * langtag = language + * ["-" script] + * ["-" region] + * *("-" variant) + * *("-" extension) + * ["-" privateuse] + * language = 2*3ALPHA ; shortest ISO 639 code + * ["-" extlang] ; sometimes followed by + * ; extended language subtags + * / 4ALPHA ; or reserved for future use + * / 5*8ALPHA ; or registered language subtag + * + * extlang = 3ALPHA ; selected ISO 639 codes + * *2("-" 3ALPHA) ; permanently reserved + * + * script = 4ALPHA ; ISO 15924 code + * + * region = 2ALPHA ; ISO 3166-1 code + * / 3DIGIT ; UN M.49 code + * + * variant = 5*8alphanum ; registered variants + * / (DIGIT 3alphanum) + * + * extension = singleton 1*("-" (2*8alphanum)) + * + * ; Single alphanumerics + * ; "x" reserved for private use + * singleton = DIGIT ; 0 - 9 + * / %x41-57 ; A - W + * / %x59-5A ; Y - Z + * / %x61-77 ; a - w + * / %x79-7A ; y - z + * + * it sounds right to still allow Irregular i-xxx IANA and user codes too + * The parser below doesn't try to cope with extension or privateuse + * that could be added but that's not interoperable anyway + * * Returns 1 if correct 0 otherwise **/ int xmlCheckLanguageID(const xmlChar * lang) { - const xmlChar *cur = lang; + const xmlChar *cur = lang, *nxt; if (cur == NULL) return (0); if (((cur[0] == 'i') && (cur[1] == '-')) || - ((cur[0] == 'I') && (cur[1] == '-'))) { + ((cur[0] == 'I') && (cur[1] == '-')) || + ((cur[0] == 'x') && (cur[1] == '-')) || + ((cur[0] == 'X') && (cur[1] == '-'))) { /* - * IANA code + * Still allow IANA code and user code which were coming + * from the previous version of the XML-1.0 specification + * it's deprecated but we should not fail */ cur += 2; - while (((cur[0] >= 'A') && (cur[0] <= 'Z')) || /* non input consuming */ - ((cur[0] >= 'a') && (cur[0] <= 'z'))) - cur++; - } else if (((cur[0] == 'x') && (cur[1] == '-')) || - ((cur[0] == 'X') && (cur[1] == '-'))) { - /* - * User code - */ - cur += 2; - while (((cur[0] >= 'A') && (cur[0] <= 'Z')) || /* non input consuming */ - ((cur[0] >= 'a') && (cur[0] <= 'z'))) - cur++; - } else if (((cur[0] >= 'A') && (cur[0] <= 'Z')) || - ((cur[0] >= 'a') && (cur[0] <= 'z'))) { - /* - * ISO639 - */ - cur++; - if (((cur[0] >= 'A') && (cur[0] <= 'Z')) || - ((cur[0] >= 'a') && (cur[0] <= 'z'))) - cur++; - else - return (0); - } else - return (0); - while (cur[0] != 0) { /* non input consuming */ - if (cur[0] != '-') - return (0); - cur++; - if (((cur[0] >= 'A') && (cur[0] <= 'Z')) || - ((cur[0] >= 'a') && (cur[0] <= 'z'))) - cur++; - else - return (0); - while (((cur[0] >= 'A') && (cur[0] <= 'Z')) || /* non input consuming */ + while (((cur[0] >= 'A') && (cur[0] <= 'Z')) || ((cur[0] >= 'a') && (cur[0] <= 'z'))) cur++; + return(cur[0] == 0); } + nxt = cur; + while (((nxt[0] >= 'A') && (nxt[0] <= 'Z')) || + ((nxt[0] >= 'a') && (nxt[0] <= 'z'))) + nxt++; + if (nxt - cur >= 4) { + /* + * Reserved + */ + if ((nxt - cur > 8) || (nxt[0] != 0)) + return(0); + return(1); + } + if (nxt - cur < 2) + return(0); + /* we got an ISO 639 code */ + if (nxt[0] == 0) + return(1); + if (nxt[0] != '-') + return(0); + + nxt++; + cur = nxt; + /* now we can have extlang or script or region or variant */ + if ((nxt[0] >= '0') && (nxt[0] <= '9')) + goto region_m49; + + while (((nxt[0] >= 'A') && (nxt[0] <= 'Z')) || + ((nxt[0] >= 'a') && (nxt[0] <= 'z'))) + nxt++; + if (nxt - cur == 4) + goto script; + if (nxt - cur == 2) + goto region; + if ((nxt - cur >= 5) && (nxt - cur <= 8)) + goto variant; + if (nxt - cur != 3) + return(0); + /* we parsed an extlang */ + if (nxt[0] == 0) + return(1); + if (nxt[0] != '-') + return(0); + + nxt++; + cur = nxt; + /* now we can have script or region or variant */ + if ((nxt[0] >= '0') && (nxt[0] <= '9')) + goto region_m49; + + while (((nxt[0] >= 'A') && (nxt[0] <= 'Z')) || + ((nxt[0] >= 'a') && (nxt[0] <= 'z'))) + nxt++; + if (nxt - cur == 2) + goto region; + if ((nxt - cur >= 5) && (nxt - cur <= 8)) + goto variant; + if (nxt - cur != 4) + return(0); + /* we parsed a script */ +script: + if (nxt[0] == 0) + return(1); + if (nxt[0] != '-') + return(0); + + nxt++; + cur = nxt; + /* now we can have region or variant */ + if ((nxt[0] >= '0') && (nxt[0] <= '9')) + goto region_m49; + + while (((nxt[0] >= 'A') && (nxt[0] <= 'Z')) || + ((nxt[0] >= 'a') && (nxt[0] <= 'z'))) + nxt++; + + if ((nxt - cur >= 5) && (nxt - cur <= 8)) + goto variant; + if (nxt - cur != 2) + return(0); + /* we parsed a region */ +region: + if (nxt[0] == 0) + return(1); + if (nxt[0] != '-') + return(0); + + nxt++; + cur = nxt; + /* now we can just have a variant */ + while (((nxt[0] >= 'A') && (nxt[0] <= 'Z')) || + ((nxt[0] >= 'a') && (nxt[0] <= 'z'))) + nxt++; + + if ((nxt - cur < 5) || (nxt - cur > 8)) + return(0); + + /* we parsed a variant */ +variant: + if (nxt[0] == 0) + return(1); + if (nxt[0] != '-') + return(0); + /* extensions and private use subtags not checked */ return (1); + +region_m49: + if (((nxt[1] >= '0') && (nxt[1] <= '9')) && + ((nxt[2] >= '0') && (nxt[2] <= '9'))) { + nxt += 3; + goto region; + } + return(0); } /************************************************************************ @@ -6609,7 +6737,7 @@ xmlParseExternalSubset(xmlParserCtxtPtr ctxt, const xmlChar *ExternalID, xmlDetectSAX2(ctxt); GROW; - if ((ctxt->encoding == (const xmlChar *)XML_CHAR_ENCODING_NONE) && + if ((ctxt->encoding == NULL) && (ctxt->input->end - ctxt->input->cur >= 4)) { xmlChar start[4]; xmlCharEncoding enc; @@ -10105,7 +10233,7 @@ xmlParseDocument(xmlParserCtxtPtr ctxt) { if ((ctxt->sax) && (ctxt->sax->setDocumentLocator)) ctxt->sax->setDocumentLocator(ctxt->userData, &xmlDefaultSAXLocator); - if ((ctxt->encoding == (const xmlChar *)XML_CHAR_ENCODING_NONE) && + if ((ctxt->encoding == NULL) && ((ctxt->input->end - ctxt->input->cur) >= 4)) { /* * Get the 4 first bytes and decode the charset @@ -11567,7 +11695,7 @@ xmldecl_done: * if size is greater than len. Otherwise, memmove in xmlBufferAdd * will blindly copy extra bytes from memory. */ - if (size > len) { + if ((unsigned int) size > len) { remain = size - len; size = len; } else { @@ -14004,8 +14132,8 @@ xmlInitParser(void) { __xmlGlobalInitMutexLock(); if (xmlParserInitialized == 0) { #endif - xmlInitGlobals(); xmlInitThreads(); + xmlInitGlobals(); if ((xmlGenericError == xmlGenericErrorDefaultFunc) || (xmlGenericError == NULL)) initGenericErrorDefaultFunc(NULL); diff --git a/reactos/lib/3rdparty/libxml2/testapi.c b/reactos/lib/3rdparty/libxml2/testapi.c index da6ce1bcd1c..df14820aa18 100644 --- a/reactos/lib/3rdparty/libxml2/testapi.c +++ b/reactos/lib/3rdparty/libxml2/testapi.c @@ -11639,32 +11639,8 @@ static int test_xmlNanoFTPGetConnection(void) { int test_ret = 0; -#if defined(LIBXML_FTP_ENABLED) - int mem_base; - int ret_val; - void * ctx; /* an FTP context */ - int n_ctx; - - for (n_ctx = 0;n_ctx < gen_nb_xmlNanoFTPCtxtPtr;n_ctx++) { - mem_base = xmlMemBlocks(); - ctx = gen_xmlNanoFTPCtxtPtr(n_ctx, 0); - - ret_val = xmlNanoFTPGetConnection(ctx); - desret_int(ret_val); - call_tests++; - des_xmlNanoFTPCtxtPtr(n_ctx, ctx, 0); - xmlResetLastError(); - if (mem_base != xmlMemBlocks()) { - printf("Leak of %d blocks found in xmlNanoFTPGetConnection", - xmlMemBlocks() - mem_base); - test_ret++; - printf(" %d", n_ctx); - printf("\n"); - } - } - function_tests++; -#endif + /* missing type support */ return(test_ret); } @@ -11707,39 +11683,8 @@ static int test_xmlNanoFTPGetSocket(void) { int test_ret = 0; -#if defined(LIBXML_FTP_ENABLED) - int mem_base; - int ret_val; - void * ctx; /* an FTP context */ - int n_ctx; - const char * filename; /* the file to retrieve (or NULL if path is in context). */ - int n_filename; - - for (n_ctx = 0;n_ctx < gen_nb_xmlNanoFTPCtxtPtr;n_ctx++) { - for (n_filename = 0;n_filename < gen_nb_filepath;n_filename++) { - mem_base = xmlMemBlocks(); - ctx = gen_xmlNanoFTPCtxtPtr(n_ctx, 0); - filename = gen_filepath(n_filename, 1); - - ret_val = xmlNanoFTPGetSocket(ctx, filename); - desret_int(ret_val); - call_tests++; - des_xmlNanoFTPCtxtPtr(n_ctx, ctx, 0); - des_filepath(n_filename, filename, 1); - xmlResetLastError(); - if (mem_base != xmlMemBlocks()) { - printf("Leak of %d blocks found in xmlNanoFTPGetSocket", - xmlMemBlocks() - mem_base); - test_ret++; - printf(" %d", n_ctx); - printf(" %d", n_filename); - printf("\n"); - } - } - } - function_tests++; -#endif + /* missing type support */ return(test_ret); } @@ -12043,7 +11988,7 @@ static int test_nanoftp(void) { int test_ret = 0; - if (quiet == 0) printf("Testing nanoftp : 16 of 22 functions ...\n"); + if (quiet == 0) printf("Testing nanoftp : 14 of 22 functions ...\n"); test_ret += test_xmlNanoFTPCheckResponse(); test_ret += test_xmlNanoFTPCleanup(); test_ret += test_xmlNanoFTPCloseConnection(); diff --git a/reactos/lib/3rdparty/libxml2/threads.c b/reactos/lib/3rdparty/libxml2/threads.c index 98fd2c23f2e..1eeac0e1765 100644 --- a/reactos/lib/3rdparty/libxml2/threads.c +++ b/reactos/lib/3rdparty/libxml2/threads.c @@ -439,7 +439,8 @@ __xmlGlobalInitMutexLock(void) /* Make sure the global init lock is initialized and then lock it. */ #ifdef HAVE_PTHREAD_H /* The mutex is statically initialized, so we just lock it. */ - pthread_mutex_lock(&global_init_lock); + if (pthread_mutex_lock) + pthread_mutex_lock(&global_init_lock); #elif defined HAVE_WIN32_THREADS LPCRITICAL_SECTION cs; @@ -508,7 +509,8 @@ void __xmlGlobalInitMutexUnlock(void) { #ifdef HAVE_PTHREAD_H - pthread_mutex_unlock(&global_init_lock); + if (pthread_mutex_unlock) + pthread_mutex_unlock(&global_init_lock); #elif defined HAVE_WIN32_THREADS if (global_init_lock != NULL) { LeaveCriticalSection(global_init_lock); diff --git a/reactos/lib/3rdparty/libxml2/tree.c b/reactos/lib/3rdparty/libxml2/tree.c index 1e1a23a10e7..24db82af787 100644 --- a/reactos/lib/3rdparty/libxml2/tree.c +++ b/reactos/lib/3rdparty/libxml2/tree.c @@ -721,8 +721,19 @@ xmlNewNs(xmlNodePtr node, const xmlChar *href, const xmlChar *prefix) { if ((node != NULL) && (node->type != XML_ELEMENT_NODE)) return(NULL); - if ((prefix != NULL) && (xmlStrEqual(prefix, BAD_CAST "xml"))) - return(NULL); + if ((prefix != NULL) && (xmlStrEqual(prefix, BAD_CAST "xml"))) { + /* xml namespace is predefined, no need to add it */ + if (xmlStrEqual(href, XML_XML_NAMESPACE)) + return(NULL); + + /* + * Problem, this is an attempt to bind xml prefix to a wrong + * namespace, which breaks + * Namespace constraint: Reserved Prefixes and Namespace Names + * from XML namespace. But documents authors may not care in + * their context so let's proceed. + */ + } /* * Allocate a new Namespace and fill the fields. diff --git a/reactos/lib/3rdparty/libxml2/uri.c b/reactos/lib/3rdparty/libxml2/uri.c index 950e177bd62..1ae5768b537 100644 --- a/reactos/lib/3rdparty/libxml2/uri.c +++ b/reactos/lib/3rdparty/libxml2/uri.c @@ -127,7 +127,7 @@ static void xmlCleanURI(xmlURIPtr uri); (((*(p) == '!')) || ((*(p) == '$')) || ((*(p) == '&')) || \ ((*(p) == '(')) || ((*(p) == ')')) || ((*(p) == '*')) || \ ((*(p) == '+')) || ((*(p) == ',')) || ((*(p) == ';')) || \ - ((*(p) == '='))) + ((*(p) == '=')) || ((*(p) == '\''))) /* * gen-delims = ":" / "/" / "?" / "#" / "[" / "]" / "@" diff --git a/reactos/lib/3rdparty/libxml2/xmllint.c b/reactos/lib/3rdparty/libxml2/xmllint.c index 2a75e3bd53d..b7af32f090f 100644 --- a/reactos/lib/3rdparty/libxml2/xmllint.c +++ b/reactos/lib/3rdparty/libxml2/xmllint.c @@ -162,6 +162,9 @@ static int html = 0; static int xmlout = 0; #endif static int htmlout = 0; +#if defined(LIBXML_HTML_ENABLED) +static int nodefdtd = 0; +#endif #ifdef LIBXML_PUSH_ENABLED static int push = 0; #endif /* LIBXML_PUSH_ENABLED */ @@ -2507,14 +2510,14 @@ static void parseAndPrintFile(char *filename, xmlParserCtxtPtr rectxt) { htmlSaveFile(output ? output : "-", doc); } else if (encoding != NULL) { - if ( format ) { + if (format == 1) { htmlSaveFileFormat(output ? output : "-", doc, encoding, 1); } else { htmlSaveFileFormat(output ? output : "-", doc, encoding, 0); } } - else if (format) { + else if (format == 1) { htmlSaveFileFormat(output ? output : "-", doc, NULL, 1); } else { @@ -2586,13 +2589,13 @@ static void parseAndPrintFile(char *filename, xmlParserCtxtPtr rectxt) { int len; if (encoding != NULL) { - if ( format ) { + if (format == 1) { xmlDocDumpFormatMemoryEnc(doc, &result, &len, encoding, 1); } else { xmlDocDumpMemoryEnc(doc, &result, &len, encoding); } } else { - if (format) + if (format == 1) xmlDocDumpFormatMemory(doc, &result, &len, 1); else xmlDocDumpMemory(doc, &result, &len); @@ -2611,7 +2614,7 @@ static void parseAndPrintFile(char *filename, xmlParserCtxtPtr rectxt) { xmlSaveFile(output ? output : "-", doc); } else if (oldout) { if (encoding != NULL) { - if ( format ) { + if (format == 1) { ret = xmlSaveFormatFileEnc(output ? output : "-", doc, encoding, 1); } @@ -2624,7 +2627,7 @@ static void parseAndPrintFile(char *filename, xmlParserCtxtPtr rectxt) { output ? output : "-"); progresult = XMLLINT_ERR_OUT; } - } else if (format) { + } else if (format == 1) { ret = xmlSaveFormatFile(output ? output : "-", doc, 1); if (ret < 0) { fprintf(stderr, "failed save to %s\n", @@ -2653,8 +2656,10 @@ static void parseAndPrintFile(char *filename, xmlParserCtxtPtr rectxt) { xmlSaveCtxtPtr ctxt; int saveOpts = 0; - if (format) + if (format == 1) saveOpts |= XML_SAVE_FORMAT; + else if (format == 2) + saveOpts |= XML_SAVE_WSNONSIG; #if defined(LIBXML_HTML_ENABLED) || defined(LIBXML_VALID_ENABLED) if (xmlout) @@ -2995,6 +3000,7 @@ static void usage(const char *name) { #ifdef LIBXML_HTML_ENABLED printf("\t--html : use the HTML parser\n"); printf("\t--xmlout : force to use the XML serializer when using --html\n"); + printf("\t--nodefdtd : do not default HTML doctype\n"); #endif #ifdef LIBXML_PUSH_ENABLED printf("\t--push : use the push mode of the parser\n"); @@ -3010,6 +3016,10 @@ static void usage(const char *name) { printf("\t--format : reformat/reindent the input\n"); printf("\t--encode encoding : output in the given encoding\n"); printf("\t--dropdtd : remove the DOCTYPE of the input docs\n"); + printf("\t--pretty STYLE : pretty-print in a particular style\n"); + printf("\t 0 Do not pretty print\n"); + printf("\t 1 Format the XML content, as --format\n"); + printf("\t 2 Add whitespace inside tags, preserving content\n"); #endif /* LIBXML_OUTPUT_ENABLED */ printf("\t--c14n : save in W3C canonical format v1.0 (with comments)\n"); printf("\t--c14n11 : save in W3C canonical format v1.1 (with comments)\n"); @@ -3157,6 +3167,10 @@ main(int argc, char **argv) { else if ((!strcmp(argv[i], "-xmlout")) || (!strcmp(argv[i], "--xmlout"))) { xmlout++; + } else if ((!strcmp(argv[i], "-nodefdtd")) || + (!strcmp(argv[i], "--nodefdtd"))) { + nodefdtd++; + options |= HTML_PARSE_NODEFDTD; } #endif /* LIBXML_HTML_ENABLED */ else if ((!strcmp(argv[i], "-loaddtd")) || @@ -3326,10 +3340,21 @@ main(int argc, char **argv) { (!strcmp(argv[i], "--format"))) { noblanks++; #ifdef LIBXML_OUTPUT_ENABLED - format++; + format = 1; #endif /* LIBXML_OUTPUT_ENABLED */ xmlKeepBlanksDefault(0); } + else if ((!strcmp(argv[i], "-pretty")) || + (!strcmp(argv[i], "--pretty"))) { + i++; +#ifdef LIBXML_OUTPUT_ENABLED + format = atoi(argv[i]); +#endif /* LIBXML_OUTPUT_ENABLED */ + if (format == 1) { + noblanks++; + xmlKeepBlanksDefault(0); + } + } #ifdef LIBXML_READER_ENABLED else if ((!strcmp(argv[i], "-stream")) || (!strcmp(argv[i], "--stream"))) { @@ -3616,6 +3641,11 @@ main(int argc, char **argv) { i++; continue; } + if ((!strcmp(argv[i], "-pretty")) || + (!strcmp(argv[i], "--pretty"))) { + i++; + continue; + } if ((!strcmp(argv[i], "-schema")) || (!strcmp(argv[i], "--schema"))) { i++; diff --git a/reactos/lib/3rdparty/libxml2/xmlreader.c b/reactos/lib/3rdparty/libxml2/xmlreader.c index c2afac7f1cb..97c71abbf39 100644 --- a/reactos/lib/3rdparty/libxml2/xmlreader.c +++ b/reactos/lib/3rdparty/libxml2/xmlreader.c @@ -1709,9 +1709,9 @@ xmlTextReaderReadInnerXml(xmlTextReaderPtr reader ATTRIBUTE_UNUSED) * * Reads the contents of the current node, including child nodes and markup. * - * Returns a string containing the XML content, or NULL if the current node - * is neither an element nor attribute, or has no child nodes. The - * string must be deallocated by the caller. + * Returns a string containing the node and any XML content, or NULL if the + * current node cannot be serialized. The string must be deallocated + * by the caller. */ xmlChar * xmlTextReaderReadOuterXml(xmlTextReaderPtr reader ATTRIBUTE_UNUSED) @@ -1726,7 +1726,11 @@ xmlTextReaderReadOuterXml(xmlTextReaderPtr reader ATTRIBUTE_UNUSED) if (xmlTextReaderExpand(reader) == NULL) { return NULL; } - node = xmlDocCopyNode(node, doc, 1); + if (node->type == XML_DTD_NODE) { + node = (xmlNodePtr) xmlCopyDtd((xmlDtdPtr) node); + } else { + node = xmlDocCopyNode(node, doc, 1); + } buff = xmlBufferCreate(); if (xmlNodeDump(buff, doc, node, 0, 0) == -1) { xmlFreeNode(node); diff --git a/reactos/lib/3rdparty/libxml2/xmlsave.c b/reactos/lib/3rdparty/libxml2/xmlsave.c index aaa5da8af6d..ddf7143c10b 100644 --- a/reactos/lib/3rdparty/libxml2/xmlsave.c +++ b/reactos/lib/3rdparty/libxml2/xmlsave.c @@ -408,6 +408,8 @@ xmlNewSaveCtxt(const char *encoding, int options) ret->options = options; if (options & XML_SAVE_FORMAT) ret->format = 1; + else if (options & XML_SAVE_WSNONSIG) + ret->format = 2; return(ret); } @@ -500,32 +502,90 @@ static void xmlNodeDumpOutputInternal(xmlSaveCtxtPtr ctxt, xmlNodePtr cur); void xmlNsListDumpOutput(xmlOutputBufferPtr buf, xmlNsPtr cur); static int xmlDocContentDumpOutput(xmlSaveCtxtPtr ctxt, xmlDocPtr cur); +/** + * xmlOutputBufferWriteWSNonSig: + * @ctxt: The save context + * @extra: Number of extra indents to apply to ctxt->level + * + * Write out formatting for non-significant whitespace output. + */ +static void +xmlOutputBufferWriteWSNonSig(xmlSaveCtxtPtr ctxt, int extra) +{ + int i; + if ((ctxt == NULL) || (ctxt->buf == NULL)) + return; + xmlOutputBufferWrite(ctxt->buf, 1, "\n"); + for (i = 0; i < (ctxt->level + extra); i += ctxt->indent_nr) { + xmlOutputBufferWrite(ctxt->buf, ctxt->indent_size * + ((ctxt->level + extra - i) > ctxt->indent_nr ? + ctxt->indent_nr : (ctxt->level + extra - i)), + ctxt->indent); + } +} + /** * xmlNsDumpOutput: * @buf: the XML buffer output * @cur: a namespace + * @ctxt: the output save context. Optional. * * Dump a local Namespace definition. * Should be called in the context of attributes dumps. + * If @ctxt is supplied, @buf should be its buffer. */ static void -xmlNsDumpOutput(xmlOutputBufferPtr buf, xmlNsPtr cur) { +xmlNsDumpOutput(xmlOutputBufferPtr buf, xmlNsPtr cur, xmlSaveCtxtPtr ctxt) { if ((cur == NULL) || (buf == NULL)) return; if ((cur->type == XML_LOCAL_NAMESPACE) && (cur->href != NULL)) { if (xmlStrEqual(cur->prefix, BAD_CAST "xml")) return; + if (ctxt != NULL && ctxt->format == 2) + xmlOutputBufferWriteWSNonSig(ctxt, 2); + else + xmlOutputBufferWrite(buf, 1, " "); + /* Within the context of an element attributes */ if (cur->prefix != NULL) { - xmlOutputBufferWrite(buf, 7, " xmlns:"); + xmlOutputBufferWrite(buf, 6, "xmlns:"); xmlOutputBufferWriteString(buf, (const char *)cur->prefix); } else - xmlOutputBufferWrite(buf, 6, " xmlns"); + xmlOutputBufferWrite(buf, 5, "xmlns"); xmlOutputBufferWrite(buf, 1, "="); xmlBufferWriteQuotedString(buf->buffer, cur->href); } } +/** + * xmlNsDumpOutputCtxt + * @ctxt: the save context + * @cur: a namespace + * + * Dump a local Namespace definition to a save context. + * Should be called in the context of attribute dumps. + */ +static void +xmlNsDumpOutputCtxt(xmlSaveCtxtPtr ctxt, xmlNsPtr cur) { + xmlNsDumpOutput(ctxt->buf, cur, ctxt); +} + +/** + * xmlNsListDumpOutputCtxt + * @ctxt: the save context + * @cur: the first namespace + * + * Dump a list of local namespace definitions to a save context. + * Should be called in the context of attribute dumps. + */ +static void +xmlNsListDumpOutputCtxt(xmlSaveCtxtPtr ctxt, xmlNsPtr cur) { + while (cur != NULL) { + xmlNsDumpOutput(ctxt->buf, cur, ctxt); + cur = cur->next; + } +} + /** * xmlNsListDumpOutput: * @buf: the XML buffer output @@ -537,7 +597,7 @@ xmlNsDumpOutput(xmlOutputBufferPtr buf, xmlNsPtr cur) { void xmlNsListDumpOutput(xmlOutputBufferPtr buf, xmlNsPtr cur) { while (cur != NULL) { - xmlNsDumpOutput(buf, cur); + xmlNsDumpOutput(buf, cur, NULL); cur = cur->next; } } @@ -612,7 +672,10 @@ xmlAttrDumpOutput(xmlSaveCtxtPtr ctxt, xmlAttrPtr cur) { if (cur == NULL) return; buf = ctxt->buf; if (buf == NULL) return; - xmlOutputBufferWrite(buf, 1, " "); + if (ctxt->format == 2) + xmlOutputBufferWriteWSNonSig(ctxt, 2); + else + xmlOutputBufferWrite(buf, 1, " "); if ((cur->ns != NULL) && (cur->ns->prefix != NULL)) { xmlOutputBufferWriteString(buf, (const char *)cur->ns->prefix); xmlOutputBufferWrite(buf, 1, ":"); @@ -656,7 +719,7 @@ xmlNodeListDumpOutput(xmlSaveCtxtPtr ctxt, xmlNodePtr cur) { if (cur == NULL) return; buf = ctxt->buf; while (cur != NULL) { - if ((ctxt->format) && (xmlIndentTreeOutput) && + if ((ctxt->format == 1) && (xmlIndentTreeOutput) && ((cur->type == XML_ELEMENT_NODE) || (cur->type == XML_COMMENT_NODE) || (cur->type == XML_PI_NODE))) @@ -665,7 +728,7 @@ xmlNodeListDumpOutput(xmlSaveCtxtPtr ctxt, xmlNodePtr cur) { ctxt->indent_nr : ctxt->level), ctxt->indent); xmlNodeDumpOutputInternal(ctxt, cur); - if (ctxt->format) { + if (ctxt->format == 1) { xmlOutputBufferWrite(buf, 1, "\n"); } cur = cur->next; @@ -808,13 +871,18 @@ xmlNodeDumpOutputInternal(xmlSaveCtxtPtr ctxt, xmlNodePtr cur) { xmlOutputBufferWrite(buf, 2, "name); if (cur->content != NULL) { - xmlOutputBufferWrite(buf, 1, " "); + if (ctxt->format == 2) + xmlOutputBufferWriteWSNonSig(ctxt, 0); + else + xmlOutputBufferWrite(buf, 1, " "); xmlOutputBufferWriteString(buf, (const char *)cur->content); } xmlOutputBufferWrite(buf, 2, "?>"); } else { xmlOutputBufferWrite(buf, 2, "name); + if (ctxt->format == 2) + xmlOutputBufferWriteWSNonSig(ctxt, 0); xmlOutputBufferWrite(buf, 2, "?>"); } return; @@ -862,7 +930,7 @@ xmlNodeDumpOutputInternal(xmlSaveCtxtPtr ctxt, xmlNodePtr cur) { return; } if (cur->type == XML_NAMESPACE_DECL) { - xmlNsDumpOutput(buf, (xmlNsPtr) cur); + xmlNsDumpOutputCtxt(ctxt, (xmlNsPtr) cur); return; } @@ -887,26 +955,30 @@ xmlNodeDumpOutputInternal(xmlSaveCtxtPtr ctxt, xmlNodePtr cur) { xmlOutputBufferWriteString(buf, (const char *)cur->name); if (cur->nsDef) - xmlNsListDumpOutput(buf, cur->nsDef); + xmlNsListDumpOutputCtxt(ctxt, cur->nsDef); if (cur->properties != NULL) xmlAttrListDumpOutput(ctxt, cur->properties); if (((cur->type == XML_ELEMENT_NODE) || (cur->content == NULL)) && (cur->children == NULL) && ((ctxt->options & XML_SAVE_NO_EMPTY) == 0)) { + if (ctxt->format == 2) + xmlOutputBufferWriteWSNonSig(ctxt, 0); xmlOutputBufferWrite(buf, 2, "/>"); ctxt->format = format; return; } + if (ctxt->format == 2) + xmlOutputBufferWriteWSNonSig(ctxt, 1); xmlOutputBufferWrite(buf, 1, ">"); if ((cur->type != XML_ELEMENT_NODE) && (cur->content != NULL)) { xmlOutputBufferWriteEscape(buf, cur->content, ctxt->escape); } if (cur->children != NULL) { - if (ctxt->format) xmlOutputBufferWrite(buf, 1, "\n"); + if (ctxt->format == 1) xmlOutputBufferWrite(buf, 1, "\n"); if (ctxt->level >= 0) ctxt->level++; xmlNodeListDumpOutput(ctxt, cur->children); if (ctxt->level > 0) ctxt->level--; - if ((xmlIndentTreeOutput) && (ctxt->format)) + if ((xmlIndentTreeOutput) && (ctxt->format == 1)) xmlOutputBufferWrite(buf, ctxt->indent_size * (ctxt->level > ctxt->indent_nr ? ctxt->indent_nr : ctxt->level), @@ -919,6 +991,8 @@ xmlNodeDumpOutputInternal(xmlSaveCtxtPtr ctxt, xmlNodePtr cur) { } xmlOutputBufferWriteString(buf, (const char *)cur->name); + if (ctxt->format == 2) + xmlOutputBufferWriteWSNonSig(ctxt, 0); xmlOutputBufferWrite(buf, 1, ">"); ctxt->format = format; } @@ -1254,14 +1328,14 @@ xhtmlNodeListDumpOutput(xmlSaveCtxtPtr ctxt, xmlNodePtr cur) { if (cur == NULL) return; buf = ctxt->buf; while (cur != NULL) { - if ((ctxt->format) && (xmlIndentTreeOutput) && + if ((ctxt->format == 1) && (xmlIndentTreeOutput) && (cur->type == XML_ELEMENT_NODE)) xmlOutputBufferWrite(buf, ctxt->indent_size * (ctxt->level > ctxt->indent_nr ? ctxt->indent_nr : ctxt->level), ctxt->indent); xhtmlNodeDumpOutput(ctxt, cur); - if (ctxt->format) { + if (ctxt->format == 1) { xmlOutputBufferWrite(buf, 1, "\n"); } cur = cur->next; @@ -1410,7 +1484,7 @@ xhtmlNodeDumpOutput(xmlSaveCtxtPtr ctxt, xmlNodePtr cur) { xmlOutputBufferWriteString(buf, (const char *)cur->name); if (cur->nsDef) - xmlNsListDumpOutput(buf, cur->nsDef); + xmlNsListDumpOutputCtxt(ctxt, cur->nsDef); if ((xmlStrEqual(cur->name, BAD_CAST "html") && (cur->ns == NULL) && (cur->nsDef == NULL))) { /* @@ -1458,7 +1532,7 @@ xhtmlNodeDumpOutput(xmlSaveCtxtPtr ctxt, xmlNodePtr cur) { } else { if (addmeta == 1) { xmlOutputBufferWrite(buf, 1, ">"); - if (ctxt->format) { + if (ctxt->format == 1) { xmlOutputBufferWrite(buf, 1, "\n"); if (xmlIndentTreeOutput) xmlOutputBufferWrite(buf, ctxt->indent_size * @@ -1473,7 +1547,7 @@ xhtmlNodeDumpOutput(xmlSaveCtxtPtr ctxt, xmlNodePtr cur) { xmlOutputBufferWrite(buf, 5, "UTF-8"); } xmlOutputBufferWrite(buf, 4, "\" />"); - if (ctxt->format) + if (ctxt->format == 1) xmlOutputBufferWrite(buf, 1, "\n"); } else { xmlOutputBufferWrite(buf, 1, ">"); @@ -1493,7 +1567,7 @@ xhtmlNodeDumpOutput(xmlSaveCtxtPtr ctxt, xmlNodePtr cur) { } xmlOutputBufferWrite(buf, 1, ">"); if (addmeta == 1) { - if (ctxt->format) { + if (ctxt->format == 1) { xmlOutputBufferWrite(buf, 1, "\n"); if (xmlIndentTreeOutput) xmlOutputBufferWrite(buf, ctxt->indent_size * @@ -1588,13 +1662,13 @@ xhtmlNodeDumpOutput(xmlSaveCtxtPtr ctxt, xmlNodePtr cur) { if (cur->children != NULL) { int indent = ctxt->format; - if (format) xmlOutputBufferWrite(buf, 1, "\n"); + if (format == 1) xmlOutputBufferWrite(buf, 1, "\n"); if (ctxt->level >= 0) ctxt->level++; ctxt->format = format; xhtmlNodeListDumpOutput(ctxt, cur->children); if (ctxt->level > 0) ctxt->level--; ctxt->format = indent; - if ((xmlIndentTreeOutput) && (format)) + if ((xmlIndentTreeOutput) && (format == 1)) xmlOutputBufferWrite(buf, ctxt->indent_size * (ctxt->level > ctxt->indent_nr ? ctxt->indent_nr : ctxt->level), @@ -2132,7 +2206,7 @@ xmlNodeDumpOutput(xmlOutputBufferPtr buf, xmlDocPtr doc, xmlNodePtr cur, ctxt.doc = doc; ctxt.buf = buf; ctxt.level = level; - ctxt.format = format; + ctxt.format = format ? 1 : 0; ctxt.encoding = (const xmlChar *) encoding; xmlSaveCtxtInit(&ctxt); ctxt.options |= XML_SAVE_AS_XML; @@ -2218,7 +2292,7 @@ xmlDocDumpFormatMemoryEnc(xmlDocPtr out_doc, xmlChar **doc_txt_ptr, ctxt.doc = out_doc; ctxt.buf = out_buff; ctxt.level = 0; - ctxt.format = format; + ctxt.format = format ? 1 : 0; ctxt.encoding = (const xmlChar *) txt_encoding; xmlSaveCtxtInit(&ctxt); ctxt.options |= XML_SAVE_AS_XML; @@ -2337,7 +2411,7 @@ xmlDocFormatDump(FILE *f, xmlDocPtr cur, int format) { ctxt.doc = cur; ctxt.buf = buf; ctxt.level = 0; - ctxt.format = format; + ctxt.format = format ? 1 : 0; ctxt.encoding = (const xmlChar *) encoding; xmlSaveCtxtInit(&ctxt); ctxt.options |= XML_SAVE_AS_XML; @@ -2427,7 +2501,7 @@ xmlSaveFormatFileTo(xmlOutputBufferPtr buf, xmlDocPtr cur, ctxt.doc = cur; ctxt.buf = buf; ctxt.level = 0; - ctxt.format = format; + ctxt.format = format ? 1 : 0; ctxt.encoding = (const xmlChar *) encoding; xmlSaveCtxtInit(&ctxt); ctxt.options |= XML_SAVE_AS_XML; @@ -2482,7 +2556,7 @@ xmlSaveFormatFileEnc( const char * filename, xmlDocPtr cur, ctxt.doc = cur; ctxt.buf = buf; ctxt.level = 0; - ctxt.format = format; + ctxt.format = format ? 1 : 0; ctxt.encoding = (const xmlChar *) encoding; xmlSaveCtxtInit(&ctxt); ctxt.options |= XML_SAVE_AS_XML; diff --git a/reactos/lib/3rdparty/libxml2/xmlschemas.c b/reactos/lib/3rdparty/libxml2/xmlschemas.c index 9c86c756e84..5de7ca5ba16 100644 --- a/reactos/lib/3rdparty/libxml2/xmlschemas.c +++ b/reactos/lib/3rdparty/libxml2/xmlschemas.c @@ -26811,6 +26811,11 @@ xmlSchemaValidateElem(xmlSchemaValidCtxtPtr vctxt) vctxt->skipDepth = 0; return(ret); } + /* + * Augment the IDC definitions for the main schema and all imported ones + * NOTE: main schema is the first in the imported list + */ + xmlHashScan(vctxt->schema->schemasImports,(xmlHashScanner)xmlSchemaAugmentImportedIDC, vctxt); } if (vctxt->depth > 0) { /* diff --git a/reactos/lib/3rdparty/libxml2/xmlschemastypes.c b/reactos/lib/3rdparty/libxml2/xmlschemastypes.c index 1ce21e10bf1..1a5454c2497 100644 --- a/reactos/lib/3rdparty/libxml2/xmlschemastypes.c +++ b/reactos/lib/3rdparty/libxml2/xmlschemastypes.c @@ -2389,9 +2389,11 @@ xmlSchemaValAtomicType(xmlSchemaTypePtr type, const xmlChar * value, normOnTheFly); break; case XML_SCHEMAS_FLOAT: - case XML_SCHEMAS_DOUBLE:{ + case XML_SCHEMAS_DOUBLE: { const xmlChar *cur = value; int neg = 0; + int digits_before = 0; + int digits_after = 0; if (normOnTheFly) while IS_WSP_BLANK_CH(*cur) cur++; @@ -2464,12 +2466,17 @@ xmlSchemaValAtomicType(xmlSchemaTypePtr type, const xmlChar * value, goto return1; while ((*cur >= '0') && (*cur <= '9')) { cur++; + digits_before++; } if (*cur == '.') { cur++; - while ((*cur >= '0') && (*cur <= '9')) + while ((*cur >= '0') && (*cur <= '9')) { cur++; + digits_after++; + } } + if ((digits_before == 0) && (digits_after == 0)) + goto return1; if ((*cur == 'e') || (*cur == 'E')) { cur++; if ((*cur == '-') || (*cur == '+')) diff --git a/reactos/lib/3rdparty/libxml2/xpath.c b/reactos/lib/3rdparty/libxml2/xpath.c index 8482c40b958..4d6826d7779 100644 --- a/reactos/lib/3rdparty/libxml2/xpath.c +++ b/reactos/lib/3rdparty/libxml2/xpath.c @@ -8106,9 +8106,17 @@ xmlXPathNextPrecedingSibling(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) { xmlNodePtr xmlXPathNextFollowing(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) { if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL); - if (cur != NULL && cur->children != NULL) - return cur->children ; - if (cur == NULL) cur = ctxt->context->node; + if ((cur != NULL) && (cur->type != XML_ATTRIBUTE_NODE) && + (cur->type != XML_NAMESPACE_DECL) && (cur->children != NULL)) + return(cur->children); + + if (cur == NULL) { + cur = ctxt->context->node; + if (cur->type == XML_NAMESPACE_DECL) + return(NULL); + if (cur->type == XML_ATTRIBUTE_NODE) + cur = cur->parent; + } if (cur == NULL) return(NULL) ; /* ERROR */ if (cur->next != NULL) return(cur->next) ; do { @@ -8162,8 +8170,13 @@ xmlNodePtr xmlXPathNextPreceding(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) { if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL); - if (cur == NULL) + if (cur == NULL) { cur = ctxt->context->node; + if (cur->type == XML_NAMESPACE_DECL) + return(NULL); + if (cur->type == XML_ATTRIBUTE_NODE) + return(cur->parent); + } if (cur == NULL) return (NULL); if ((cur->prev != NULL) && (cur->prev->type == XML_DTD_NODE)) @@ -8207,8 +8220,8 @@ xmlXPathNextPrecedingInternal(xmlXPathParserContextPtr ctxt, cur = ctxt->context->node; if (cur == NULL) return (NULL); - if (cur->type == XML_NAMESPACE_DECL) - cur = (xmlNodePtr)((xmlNsPtr)cur)->next; + if (cur->type == XML_NAMESPACE_DECL) + return (NULL); ctxt->ancestor = cur->parent; } if ((cur->prev != NULL) && (cur->prev->type == XML_DTD_NODE)) @@ -10067,15 +10080,23 @@ xmlXPathCompNumber(xmlXPathParserContextPtr ctxt) } #endif if (CUR == '.') { + int v, frac = 0; + double fraction = 0; + NEXT; if (((CUR < '0') || (CUR > '9')) && (!ok)) { XP_ERROR(XPATH_NUMBER_ERROR); } - while ((CUR >= '0') && (CUR <= '9')) { - mult /= 10; - ret = ret + (CUR - '0') * mult; + while ((CUR >= '0') && (CUR <= '9') && (frac < MAX_FRAC)) { + v = (CUR - '0'); + fraction = fraction * 10 + v; + frac = frac + 1; NEXT; } + fraction /= my_pow10[frac]; + ret = ret + fraction; + while ((CUR >= '0') && (CUR <= '9')) + NEXT; } if ((CUR == 'e') || (CUR == 'E')) { NEXT; @@ -11249,7 +11270,10 @@ xmlXPathCompStep(xmlXPathParserContextPtr ctxt) { } } - CHECK_ERROR; + if (ctxt->error != XPATH_EXPRESSION_OK) { + xmlFree(name); + return; + } name = xmlXPathCompNodeTest(ctxt, &test, &type, &prefix, name); if (test == 0) @@ -12655,7 +12679,7 @@ xmlXPathCompOpEvalFirst(xmlXPathParserContextPtr ctxt, return (total); #ifdef XP_OPTIMIZED_FILTER_FIRST case XPATH_OP_FILTER: - total =+ xmlXPathCompOpEvalFilterFirst(ctxt, op, first); + total += xmlXPathCompOpEvalFilterFirst(ctxt, op, first); return (total); #endif default: From dd5eeec0f9034a6b5bc22fbef1f3db5889739f56 Mon Sep 17 00:00:00 2001 From: Pierre Schweitzer Date: Wed, 4 May 2011 17:33:08 +0000 Subject: [PATCH 295/317] [DESK] Fix & complete French translation svn path=/trunk/; revision=51578 --- reactos/dll/cpl/desk/lang/fr-FR.rc | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/reactos/dll/cpl/desk/lang/fr-FR.rc b/reactos/dll/cpl/desk/lang/fr-FR.rc index d95e8b42f87..a0b3ee3f6d6 100644 --- a/reactos/dll/cpl/desk/lang/fr-FR.rc +++ b/reactos/dll/cpl/desk/lang/fr-FR.rc @@ -56,7 +56,7 @@ BEGIN WS_VISIBLE | WS_BORDER, 7, 7, 232, 120 LTEXT "Modle de couleurs", IDC_STATIC, 7, 140, 64, 7 COMBOBOX IDC_APPEARANCE_UI_ITEM, 7, 169, 120, 54, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "&Effects...", IDC_APPEARANCE_EFFECTS, 182, 150, 56, 15 + PUSHBUTTON "&Effets...", IDC_APPEARANCE_EFFECTS, 182, 150, 56, 15 PUSHBUTTON "Avanc", IDC_APPEARANCE_ADVANCED, 182, 170, 56, 15 END @@ -101,22 +101,22 @@ END IDD_EFFAPPEARANCE DIALOGEX DISCARDABLE 0, 0, 340, 185 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU EXSTYLE WS_EX_DLGMODALFRAME | WS_EX_WINDOWEDGE -CAPTION "Effects" +CAPTION "Effets" FONT 8, "MS Shell Dlg" BEGIN - CONTROL "&Utilisez l'effet de transition suivant pour les menus et les bulles d'aides:",IDC_EFFAPPEARANCE_ANIMATION,"button", + CONTROL "&Utiliser l'effet de transition suivant pour les menus et les bulles d'aides :",IDC_EFFAPPEARANCE_ANIMATION,"button", BS_AUTOCHECKBOX | WS_TABSTOP, 10, 5, 330, 19 COMBOBOX IDC_EFFAPPEARANCE_ANIMATIONTYPE, 20, 25, 80, 19 , CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_CHILD | WS_VSCROLL | WS_TABSTOP - CONTROL "U&tilisez la mthode suivante pour aplanir les bords des polices d'cran:",IDC_EFFAPPEARANCE_SMOOTHING,"button", + CONTROL "U&tiliser la mthode suivante pour lisser les bords des polices d'cran :",IDC_EFFAPPEARANCE_SMOOTHING,"button", BS_AUTOCHECKBOX | WS_TABSTOP | WS_DISABLED, 10, 42, 330, 19 COMBOBOX IDC_EFFAPPEARANCE_SMOOTHINGTYPE, 20, 62, 80, 19 , CBS_DROPDOWNLIST | CBS_HASSTRINGS | CBS_SORT | WS_VSCROLL | WS_TABSTOP | WS_DISABLED CONTROL "Uti&liser de grandes icones",IDC_EFFAPPEARANCE_LARGEICONS,"button", BS_AUTOCHECKBOX | WS_TABSTOP | WS_DISABLED, 10, 80, 330, 19 - CONTROL "&Montrer ombrage sous les menus",IDC_EFFAPPEARANCE_SETDROPSHADOW,"button", + CONTROL "&Montrer les ombres sous les menus",IDC_EFFAPPEARANCE_SETDROPSHADOW,"button", BS_AUTOCHECKBOX | WS_TABSTOP | WS_DISABLED, 10, 95, 330, 19 - CONTROL "Montrer contenu des fentres lorsqu'elles sont bougs",IDC_EFFAPPEARANCE_DRAGFULLWINDOWS,"button", + CONTROL "Montrer le contenu des fentres lorsqu'elles sont bouges",IDC_EFFAPPEARANCE_DRAGFULLWINDOWS,"button", BS_AUTOCHECKBOX | WS_TABSTOP, 10, 110, 330, 19 - CONTROL "&Cacher les lettres soulignes pour la navigation du clavier jusqu' ce que j'appuie sur la touche Alt",IDC_EFFAPPEARANCE_KEYBOARDCUES,"button", + CONTROL "&Cacher les lettres soulignes pour la navigation au clavier jusqu' ce que j'appuie sur la touche Alt",IDC_EFFAPPEARANCE_KEYBOARDCUES,"button", BS_AUTOCHECKBOX | WS_TABSTOP, 10, 125, 330, 19 PUSHBUTTON "Annuler", IDCANCEL, 281, 165, 50, 14 DEFPUSHBUTTON "Accepter", IDOK, 227, 165, 50, 14 @@ -181,8 +181,8 @@ END STRINGTABLE DISCARDABLE BEGIN - IDS_SLIDEEFFECT "Slide effect" - IDS_FADEEFFECT "Fade effect" + IDS_SLIDEEFFECT "Effet de glissement" + IDS_FADEEFFECT "Effet de fondu" END STRINGTABLE DISCARDABLE @@ -263,6 +263,6 @@ END STRINGTABLE DISCARDABLE BEGIN IDS_DISPLAY_SETTINGS "Paramtres d'affichage" - IDS_APPLY_FAILED "Echec lors de l'application des nouveaux paramtres..." + IDS_APPLY_FAILED "chec lors de l'application des nouveaux paramtres..." IDS_APPLY_NEEDS_RESTART "Vous devez redmarrer votre ordinateur pour appliquer les modifications." END From ae63513829765fd5bc9ec7e185ec9fbfa6b9524d Mon Sep 17 00:00:00 2001 From: James Tabor Date: Wed, 4 May 2011 23:37:35 +0000 Subject: [PATCH 296/317] [Win32k] - Move hook call close to the keyboard message post. This allows the registering of Aly keys before the hook call. This fixes all but one GetKeyState Api Test. - Fix GetAsync/KeyState error codes and the return for GetAsyncKeyState. See http://appdb.winehq.org/objectManager.php?sClass=version&iId=8516&iTestingId=13644 - Fix TranslateMessage, check for window and use the window pti for re-posting to message queue. - Peeking hardware queue should be the same as other Peek queue. svn path=/trunk/; revision=51583 --- .../subsystems/win32/win32k/ntuser/input.c | 43 ++++++++-------- .../subsystems/win32/win32k/ntuser/keyboard.c | 51 +++++++++++++------ .../subsystems/win32/win32k/ntuser/msgqueue.c | 19 +++++-- 3 files changed, 72 insertions(+), 41 deletions(-) diff --git a/reactos/subsystems/win32/win32k/ntuser/input.c b/reactos/subsystems/win32/win32k/ntuser/input.c index 5c7637f0056..8e5d5f3d40d 100644 --- a/reactos/subsystems/win32/win32k/ntuser/input.c +++ b/reactos/subsystems/win32/win32k/ntuser/input.c @@ -1333,6 +1333,27 @@ IntKeyboardInput(KEYBDINPUT *ki, BOOL Injected) Msg.lParam = MAKELPARAM(1 /* repeat count */, ki->wScan); } + if (!(ki->dwFlags & KEYEVENTF_UNICODE)) + { + if (ki->dwFlags & KEYEVENTF_KEYUP) + { + gQueueKeyStateTable[wVk] &= ~0x80; + gQueueKeyStateTable[wVkStripped] = gQueueKeyStateTable[wVkL] | gQueueKeyStateTable[wVkR]; + } + else + { + if (!(gQueueKeyStateTable[wVk] & 0x80)) gQueueKeyStateTable[wVk] ^= 0x01; + gQueueKeyStateTable[wVk] |= 0xc0; + gQueueKeyStateTable[wVkStripped] = gQueueKeyStateTable[wVkL] | gQueueKeyStateTable[wVkR]; + } + + if (gQueueKeyStateTable[VK_MENU] & 0x80) flags |= KF_ALTDOWN; + + if (wVkStripped == VK_SHIFT) flags &= ~KF_EXTENDED; + + Msg.lParam = MAKELPARAM(1 /* repeat count */, flags); + } + FocusMessageQueue = IntGetFocusMessageQueue(); Msg.hwnd = 0; @@ -1365,27 +1386,6 @@ IntKeyboardInput(KEYBDINPUT *ki, BOOL Injected) return FALSE; } - if (!(ki->dwFlags & KEYEVENTF_UNICODE)) - { - if (ki->dwFlags & KEYEVENTF_KEYUP) - { - gQueueKeyStateTable[wVk] &= ~0x80; - gQueueKeyStateTable[wVkStripped] = gQueueKeyStateTable[wVkL] | gQueueKeyStateTable[wVkR]; - } - else - { - if (!(gQueueKeyStateTable[wVk] & 0x80)) gQueueKeyStateTable[wVk] ^= 0x01; - gQueueKeyStateTable[wVk] |= 0xc0; - gQueueKeyStateTable[wVkStripped] = gQueueKeyStateTable[wVkL] | gQueueKeyStateTable[wVkR]; - } - - if (gQueueKeyStateTable[VK_MENU] & 0x80) flags |= KF_ALTDOWN; - - if (wVkStripped == VK_SHIFT) flags &= ~KF_EXTENDED; - - Msg.lParam = MAKELPARAM(1 /* repeat count */, flags); - } - if (FocusMessageQueue == NULL) { DPRINT("No focus message queue\n"); @@ -1400,7 +1400,6 @@ IntKeyboardInput(KEYBDINPUT *ki, BOOL Injected) FocusMessageQueue->Desktop->pDeskInfo->LastInputWasKbd = TRUE; - Msg.pt = gpsi->ptCursor; // Post to hardware queue, based on the first part of wine "some GetMessage tests" // in test_PeekMessage() MsqPostMessage(FocusMessageQueue, &Msg, TRUE, QS_KEY); diff --git a/reactos/subsystems/win32/win32k/ntuser/keyboard.c b/reactos/subsystems/win32/win32k/ntuser/keyboard.c index 0583b0c9841..93e2d2fb150 100644 --- a/reactos/subsystems/win32/win32k/ntuser/keyboard.c +++ b/reactos/subsystems/win32/win32k/ntuser/keyboard.c @@ -341,8 +341,13 @@ DWORD FASTCALL UserGetAsyncKeyState(DWORD key) { ret = ((DWORD)(gQueueKeyStateTable[key] & KS_DOWN_BIT) << 8 ) | (gQueueKeyStateTable[key] & KS_LOCK_BIT); + if ( ret & 0x8000 ) + ret |= 0xFFFF0000; // If down, windows returns 0xFFFF8000. + } + else + { + EngSetLastError(ERROR_INVALID_PARAMETER); } - return ret; } @@ -355,19 +360,19 @@ WORD FASTCALL get_key_state(void) if (gpsi->aiSysMet[SM_SWAPBUTTON]) { - if (UserGetAsyncKeyState(VK_RBUTTON) & 0x80) ret |= MK_LBUTTON; - if (UserGetAsyncKeyState(VK_LBUTTON) & 0x80) ret |= MK_RBUTTON; + if (gQueueKeyStateTable[VK_RBUTTON] & 0x80) ret |= MK_LBUTTON; + if (gQueueKeyStateTable[VK_LBUTTON] & 0x80) ret |= MK_RBUTTON; } else { - if (UserGetAsyncKeyState(VK_LBUTTON) & 0x80) ret |= MK_LBUTTON; - if (UserGetAsyncKeyState(VK_RBUTTON) & 0x80) ret |= MK_RBUTTON; + if (gQueueKeyStateTable[VK_LBUTTON] & 0x80) ret |= MK_LBUTTON; + if (gQueueKeyStateTable[VK_RBUTTON] & 0x80) ret |= MK_RBUTTON; } - if (UserGetAsyncKeyState(VK_MBUTTON) & 0x80) ret |= MK_MBUTTON; - if (UserGetAsyncKeyState(VK_SHIFT) & 0x80) ret |= MK_SHIFT; - if (UserGetAsyncKeyState(VK_CONTROL) & 0x80) ret |= MK_CONTROL; - if (UserGetAsyncKeyState(VK_XBUTTON1) & 0x80) ret |= MK_XBUTTON1; - if (UserGetAsyncKeyState(VK_XBUTTON2) & 0x80) ret |= MK_XBUTTON2; + if (gQueueKeyStateTable[VK_MBUTTON] & 0x80) ret |= MK_MBUTTON; + if (gQueueKeyStateTable[VK_SHIFT] & 0x80) ret |= MK_SHIFT; + if (gQueueKeyStateTable[VK_CONTROL] & 0x80) ret |= MK_CONTROL; + if (gQueueKeyStateTable[VK_XBUTTON1] & 0x80) ret |= MK_XBUTTON1; + if (gQueueKeyStateTable[VK_XBUTTON2] & 0x80) ret |= MK_XBUTTON2; return ret; } @@ -401,9 +406,17 @@ IntTranslateKbdMessage(LPMSG lpMsg, WCHAR wp[2] = { 0 }; MSG NewMsg = { 0 }; PKBDTABLES keyLayout; + PWND pWndMsg; BOOL Result = FALSE; - pti = PsGetCurrentThreadWin32Thread(); + pWndMsg = UserGetWindowObject(lpMsg->hwnd); + if (!pWndMsg) // Must have a window! + { + DPRINT1("No Window for Translate.\n"); + return FALSE; + } + + pti = pWndMsg->head.pti; keyLayout = pti->KeyboardLayout->KBTables; if( !keyLayout ) return FALSE; @@ -416,6 +429,8 @@ IntTranslateKbdMessage(LPMSG lpMsg, /* All messages have to contain the cursor point. */ NewMsg.pt = gpsi->ptCursor; + DPRINT("IntTranslateKbdMessage %s\n", lpMsg->message == WM_SYSKEYDOWN ? "WM_SYSKEYDOWN" : "WM_KEYDOWN"); + switch (lpMsg->wParam) { case VK_PACKET: @@ -427,9 +442,13 @@ IntTranslateKbdMessage(LPMSG lpMsg, return TRUE; } - UState = ToUnicodeInner(lpMsg->wParam, HIWORD(lpMsg->lParam) & 0xff, - gQueueKeyStateTable, wp, 2, 0, - keyLayout ); + UState = ToUnicodeInner( lpMsg->wParam, + HIWORD(lpMsg->lParam) & 0xff, + gQueueKeyStateTable, + wp, + 2, + 0, + keyLayout ); if (UState == 1) { @@ -482,7 +501,7 @@ IntTranslateKbdMessage(LPMSG lpMsg, MsqPostMessage(pti->MessageQueue, &NewMsg, FALSE, QS_KEY); Result = TRUE; } - + DPRINT("IntTranslateKbdMessage E %s\n", NewMsg.message == WM_CHAR ? "WM_CHAR" : "WM_SYSCHAR"); return Result; } @@ -839,6 +858,8 @@ W32kKeyProcessMessage(LPMSG Msg, * * Shift and the LP_EXT_BIT cancel. */ ScanCode = (Msg->lParam >> 16) & 0xff; + DPRINT("ScanCode %04x\n",ScanCode); + BaseMapping = Msg->wParam = IntMapVirtualKeyEx( ScanCode, 1, KeyboardLayout ); if( Prefix == 0 ) diff --git a/reactos/subsystems/win32/win32k/ntuser/msgqueue.c b/reactos/subsystems/win32/win32k/ntuser/msgqueue.c index b14cd967d53..78561022f9b 100644 --- a/reactos/subsystems/win32/win32k/ntuser/msgqueue.c +++ b/reactos/subsystems/win32/win32k/ntuser/msgqueue.c @@ -56,7 +56,10 @@ DWORD FASTCALL UserGetKeyState(DWORD key) if (MessageQueue->KeyState[key] & KS_DOWN_BIT) ret |= 0xFF00; // If down, windows returns 0xFF80. } - + else + { + EngSetLastError(ERROR_INVALID_PARAMETER); + } return ret; } @@ -1457,9 +1460,17 @@ co_MsqPeekHardwareMessage(IN PUSER_MESSAGE_QUEUE MessageQueue, if (IsListEmpty(CurrentEntry)) break; if (!CurrentMessage) break; CurrentEntry = CurrentMessage->ListEntry.Flink; - - if ( (( MsgFilterLow == 0 && MsgFilterHigh == 0 ) && (CurrentMessage->QS_Flags & QSflags)) || - ( MsgFilterLow <= CurrentMessage->Msg.message && MsgFilterHigh >= CurrentMessage->Msg.message ) ) +/* + MSDN: + 1: any window that belongs to the current thread, and any messages on the current thread's message queue whose hwnd value is NULL. + 2: retrieves only messages on the current thread's message queue whose hwnd value is NULL. + 3: handle to the window whose messages are to be retrieved. + */ + if ( ( !Window || // 1 + ( Window == HWND_BOTTOM && CurrentMessage->Msg.hwnd == NULL ) || // 2 + ( Window != HWND_BOTTOM && Window->head.h == CurrentMessage->Msg.hwnd ) ) && // 3 + ( ( ( MsgFilterLow == 0 && MsgFilterHigh == 0 ) && CurrentMessage->QS_Flags & QSflags ) || + ( MsgFilterLow <= CurrentMessage->Msg.message && MsgFilterHigh >= CurrentMessage->Msg.message ) ) ) { msg = CurrentMessage->Msg; From c10792a4a1b381aba4e827a4eb7e8c52964e30bd Mon Sep 17 00:00:00 2001 From: Gabriel Ilardi Date: Thu, 5 May 2011 12:06:34 +0000 Subject: [PATCH 297/317] [shell32] Folder options: - Load text from language file. - Fill in the extension and description. Patch by Edijs Kolesnikovics - Fix an Italian string. See issue #6208 for more details. svn path=/trunk/; revision=51586 --- reactos/dll/win32/shell32/folder_options.c | 12 +++++++++++- reactos/dll/win32/shell32/lang/bg-BG.rc | 5 ++++- reactos/dll/win32/shell32/lang/ca-ES.rc | 5 ++++- reactos/dll/win32/shell32/lang/cs-CZ.rc | 5 ++++- reactos/dll/win32/shell32/lang/da-DK.rc | 5 ++++- reactos/dll/win32/shell32/lang/de-DE.rc | 5 ++++- reactos/dll/win32/shell32/lang/el-GR.rc | 5 ++++- reactos/dll/win32/shell32/lang/en-GB.rc | 5 ++++- reactos/dll/win32/shell32/lang/en-US.rc | 5 ++++- reactos/dll/win32/shell32/lang/es-ES.rc | 3 +++ reactos/dll/win32/shell32/lang/fi-FI.rc | 5 ++++- reactos/dll/win32/shell32/lang/fr-FR.rc | 5 ++++- reactos/dll/win32/shell32/lang/hu-HU.rc | 5 ++++- reactos/dll/win32/shell32/lang/it-IT.rc | 7 +++++-- reactos/dll/win32/shell32/lang/ja-JP.rc | 6 +++++- reactos/dll/win32/shell32/lang/ko-KR.rc | 5 ++++- reactos/dll/win32/shell32/lang/nl-NL.rc | 5 ++++- reactos/dll/win32/shell32/lang/no-NO.rc | 5 ++++- reactos/dll/win32/shell32/lang/pl-PL.rc | 5 ++++- reactos/dll/win32/shell32/lang/pt-BR.rc | 5 ++++- reactos/dll/win32/shell32/lang/pt-PT.rc | 5 ++++- reactos/dll/win32/shell32/lang/ro-RO.rc | 5 ++++- reactos/dll/win32/shell32/lang/ru-RU.rc | 5 ++++- reactos/dll/win32/shell32/lang/sk-SK.rc | 5 ++++- reactos/dll/win32/shell32/lang/sl-SI.rc | 5 ++++- reactos/dll/win32/shell32/lang/sv-SE.rc | 5 ++++- reactos/dll/win32/shell32/lang/tr-TR.rc | 5 ++++- reactos/dll/win32/shell32/lang/uk-UA.rc | 5 ++++- reactos/dll/win32/shell32/lang/zh-CN.rc | 5 ++++- reactos/dll/win32/shell32/lang/zh-TW.rc | 5 ++++- reactos/dll/win32/shell32/shresdef.h | 1 + 31 files changed, 129 insertions(+), 30 deletions(-) diff --git a/reactos/dll/win32/shell32/folder_options.c b/reactos/dll/win32/shell32/folder_options.c index 0e8ccbfe93d..8d9b643dcef 100644 --- a/reactos/dll/win32/shell32/folder_options.c +++ b/reactos/dll/win32/shell32/folder_options.c @@ -399,7 +399,7 @@ FolderOptionsFileTypesDlg( { LPNMLISTVIEW lppl; LVITEMW lvItem; - WCHAR Buffer[200], FormatBuffer[100]; + WCHAR Buffer[200], FormatBuffer[100]; //FIXME PFOLDER_FILE_TYPE_ENTRY pItem; OPENASINFO Info; @@ -451,6 +451,16 @@ FolderOptionsFileTypesDlg( swprintf(Buffer, FormatBuffer, &pItem->FileExtension[1]); /* update dialog */ SendDlgItemMessageW(hwndDlg, 14003, WM_SETTEXT, 0, (LPARAM)Buffer); + + if (!LoadStringW(shell32_hInstance, IDS_FILE_DETAILSADV, FormatBuffer, sizeof(FormatBuffer) / sizeof(WCHAR))) + { + /* use default english format string */ + wcscpy(FormatBuffer, L"Files with extension '%s' are of type '%s'. To change settings that affect all '%s' files, click Advanced."); + } + /* format buffer */ + swprintf(Buffer, FormatBuffer, &pItem->FileExtension[1], &pItem->FileDescription[0], &pItem->FileDescription[0]); + /* update dialog */ + SendDlgItemMessageW(hwndDlg, 14007, WM_SETTEXT, 0, (LPARAM)Buffer); } } break; diff --git a/reactos/dll/win32/shell32/lang/bg-BG.rc b/reactos/dll/win32/shell32/lang/bg-BG.rc index 4f199976db9..39be8ade1fa 100644 --- a/reactos/dll/win32/shell32/lang/bg-BG.rc +++ b/reactos/dll/win32/shell32/lang/bg-BG.rc @@ -423,7 +423,7 @@ LTEXT " //ICON LTEXT " ", 14005, 100, 140, 40, 10 PUSHBUTTON "&...", 14006, 180, 140, 50, 14, WS_TABSTOP -LTEXT " '%s' '%s'.\n , '%s'\n, .", 14007, 12, 155, 160, 32 +LTEXT " '%s' '%s'. , '%s' , .", 14007, 12, 155, 160, 32 PUSHBUTTON "&", 14008, 180, 175, 50, 14, WS_TABSTOP END @@ -759,6 +759,9 @@ BEGIN IDS_COPY_OF " " IDS_SHLEXEC_NOASSOC " , ." + + IDS_FILE_DETAILS " '%s" + IDS_FILE_DETAILSADV " '%s' '%s'. , '%s' , ." END diff --git a/reactos/dll/win32/shell32/lang/ca-ES.rc b/reactos/dll/win32/shell32/lang/ca-ES.rc index bf4f9402ae4..f3159e9f2be 100644 --- a/reactos/dll/win32/shell32/lang/ca-ES.rc +++ b/reactos/dll/win32/shell32/lang/ca-ES.rc @@ -424,7 +424,7 @@ LTEXT "Opens with:", -1, 12, 140, 40, 10 //ICON LTEXT "Appname", 14005, 100, 140, 40, 10 PUSHBUTTON "&Change...", 14006, 180, 140, 50, 14, WS_TABSTOP -LTEXT "Files with extension '%s' are of type '%s'. To\nchange settings that affect all '%s' files, click\nAdvanced.", 14007, 12, 155, 160, 30 +LTEXT "Files with extension '%s' are of type '%s'. To change settings that affect all '%s' files, click Advanced.", 14007, 12, 155, 160, 30 PUSHBUTTON "Ad&vanced", 14008, 180, 175, 50, 14, WS_TABSTOP END @@ -758,4 +758,7 @@ BEGIN IDS_COPY_OF "Copy of" IDS_SHLEXEC_NOASSOC "There is no Windows program configured to open this type of file." + + IDS_FILE_DETAILS "Details for '%s' extension" + IDS_FILE_DETAILSADV "Files with extension '%s' are of type '%s'. To change settings that affect all '%s' files, click Advanced." END diff --git a/reactos/dll/win32/shell32/lang/cs-CZ.rc b/reactos/dll/win32/shell32/lang/cs-CZ.rc index c160a1c26d4..bc8f9aa6c11 100644 --- a/reactos/dll/win32/shell32/lang/cs-CZ.rc +++ b/reactos/dll/win32/shell32/lang/cs-CZ.rc @@ -412,7 +412,7 @@ LTEXT "Otev //ICON LTEXT "Appname", 14005, 100, 140, 40, 10 PUSHBUTTON "&Zmnit...", 14006, 180, 140, 50, 14, WS_TABSTOP -LTEXT "Soubory s pponou '%s' jsou typu '%s'. Kliknutm\nna tlatko Pokroil lze zmnit nastaven pro vechny\nsoubory '%s'.", 14007, 12, 155, 160, 30 +LTEXT "Soubory s pponou '%s' jsou typu '%s'. Kliknutm na tlatko Pokroil lze zmnit nastaven pro vechny soubory '%s'.", 14007, 12, 155, 160, 30 PUSHBUTTON "&Pokroil", 14008, 180, 175, 50, 14, WS_TABSTOP END @@ -745,4 +745,7 @@ BEGIN IDS_COPY_OF "Kopie " IDS_SHLEXEC_NOASSOC "Pro oteven tohoto souboru nen nakonfigurovn dn program." + + IDS_FILE_DETAILS "Podrobnosti pro typ soubor '%s'" + IDS_FILE_DETAILSADV "Soubory s pponou '%s' jsou typu '%s'. Kliknutm na tlatko Pokroil lze zmnit nastaven pro vechny soubory '%s'." END diff --git a/reactos/dll/win32/shell32/lang/da-DK.rc b/reactos/dll/win32/shell32/lang/da-DK.rc index 0e0616499b5..e9c5e412872 100644 --- a/reactos/dll/win32/shell32/lang/da-DK.rc +++ b/reactos/dll/win32/shell32/lang/da-DK.rc @@ -413,7 +413,7 @@ LTEXT "Opens with:", -1, 12, 140, 40, 10 //ICON LTEXT "Appname", 14005, 100, 140, 40, 10 PUSHBUTTON "&Change...", 14006, 180, 140, 50, 14, WS_TABSTOP -LTEXT "Files with extension '%s' are of type '%s'. To\nchange settings that affect all '%s' files, click\nAdvanced.", 14007, 12, 155, 160, 30 +LTEXT "Files with extension '%s' are of type '%s'. To change settings that affect all '%s' files, click Advanced.", 14007, 12, 155, 160, 30 PUSHBUTTON "Ad&vanced", 14008, 180, 175, 50, 14, WS_TABSTOP END @@ -747,4 +747,7 @@ BEGIN IDS_COPY_OF "Copy of" IDS_SHLEXEC_NOASSOC "There is no Windows program configured to open this type of file." + + IDS_FILE_DETAILS "Details for '%s' extension" + IDS_FILE_DETAILSADV "Files with extension '%s' are of type '%s'. To change settings that affect all '%s' files, click Advanced." END diff --git a/reactos/dll/win32/shell32/lang/de-DE.rc b/reactos/dll/win32/shell32/lang/de-DE.rc index bf4ccfa66f2..72182abc024 100644 --- a/reactos/dll/win32/shell32/lang/de-DE.rc +++ b/reactos/dll/win32/shell32/lang/de-DE.rc @@ -427,7 +427,7 @@ BEGIN //ICON LTEXT "Anwendungsname", 14005, 100, 140, 40, 10 PUSHBUTTON "n&dern...", 14006, 180, 140, 50, 14, WS_TABSTOP - LTEXT "Um\ndie Einstellungen, die alle Dateien des Typs '%s' betreffen zu ndern, klicken Sie auf Erweitert.", 14007, 12, 155, 160, 30 + LTEXT "Umdie Einstellungen, die alle Dateien des Typs '%s' betreffen zu ndern, klicken Sie auf Erweitert.", 14007, 12, 155, 160, 30 PUSHBUTTON "&Erweitert", 14008, 180, 175, 50, 14, WS_TABSTOP END @@ -762,4 +762,7 @@ BEGIN IDS_COPY_OF "Kopie von" IDS_SHLEXEC_NOASSOC "Es ist kein Programm mit diesem Dateityp verknpft." + + IDS_FILE_DETAILS "Details zum Dateityp '%s'" + IDS_FILE_DETAILSADV "Umdie Einstellungen, die alle Dateien des Typs '%s' betreffen zu ndern, klicken Sie auf Erweitert." END diff --git a/reactos/dll/win32/shell32/lang/el-GR.rc b/reactos/dll/win32/shell32/lang/el-GR.rc index f47854c8841..8b0198f936c 100644 --- a/reactos/dll/win32/shell32/lang/el-GR.rc +++ b/reactos/dll/win32/shell32/lang/el-GR.rc @@ -424,7 +424,7 @@ LTEXT "Opens with:", -1, 12, 140, 40, 10 //ICON LTEXT "Appname", 14005, 100, 140, 40, 10 PUSHBUTTON "&Change...", 14006, 180, 140, 50, 14, WS_TABSTOP -LTEXT "Files with extension '%s' are of type '%s'. To\nchange settings that affect all '%s' files, click\nAdvanced.", 14007, 12, 155, 160, 30 +LTEXT "Files with extension '%s' are of type '%s'. To change settings that affect all '%s' files, click Advanced.", 14007, 12, 155, 160, 30 PUSHBUTTON "Ad&vanced", 14008, 180, 175, 50, 14, WS_TABSTOP END @@ -759,4 +759,7 @@ BEGIN IDS_COPY_OF "Copy of" IDS_SHLEXEC_NOASSOC "There is no Windows program configured to open this type of file." + + IDS_FILE_DETAILS "Details for '%s' extension" + IDS_FILE_DETAILSADV "Files with extension '%s' are of type '%s'. To change settings that affect all '%s' files, click Advanced." END diff --git a/reactos/dll/win32/shell32/lang/en-GB.rc b/reactos/dll/win32/shell32/lang/en-GB.rc index 5e693394fc5..8791d765b1b 100644 --- a/reactos/dll/win32/shell32/lang/en-GB.rc +++ b/reactos/dll/win32/shell32/lang/en-GB.rc @@ -424,7 +424,7 @@ LTEXT "Opens with:", -1, 12, 140, 40, 10 //ICON LTEXT "Appname", 14005, 100, 140, 40, 10 PUSHBUTTON "&Change...", 14006, 180, 140, 50, 14, WS_TABSTOP -LTEXT "Files with extension '%s' are of type '%s'. To\nchange settings that affect all '%s' files, click\nAdvanced.", 14007, 12, 155, 160, 30 +LTEXT "Files with extension '%s' are of type '%s'. To change settings that affect all '%s' files, click Advanced.", 14007, 12, 155, 160, 30 PUSHBUTTON "Ad&vanced", 14008, 180, 175, 50, 14, WS_TABSTOP END @@ -758,4 +758,7 @@ BEGIN IDS_COPY_OF "Copy of" IDS_SHLEXEC_NOASSOC "There is no Windows program configured to open this type of file." + + IDS_FILE_DETAILS "Details for '%s' extension" + IDS_FILE_DETAILSADV "Files with extension '%s' are of type '%s'. To change settings that affect all '%s' files, click Advanced." END diff --git a/reactos/dll/win32/shell32/lang/en-US.rc b/reactos/dll/win32/shell32/lang/en-US.rc index 946a4ebcdcb..31266b4859c 100644 --- a/reactos/dll/win32/shell32/lang/en-US.rc +++ b/reactos/dll/win32/shell32/lang/en-US.rc @@ -435,7 +435,7 @@ LTEXT "Opens with:", -1, 12, 140, 40, 10 //ICON LTEXT "Appname", 14005, 100, 140, 40, 10 PUSHBUTTON "&Change...", 14006, 180, 140, 50, 14, WS_TABSTOP -LTEXT "Files with extension '%s' are of type '%s'. To\nchange settings that affect all '%s' files, click\nAdvanced.", 14007, 12, 155, 160, 30 +LTEXT "Files with extension '%s' are of type '%s'. To change settings that affect all '%s' files, click Advanced.", 14007, 12, 155, 160, 30 PUSHBUTTON "Ad&vanced", 14008, 180, 175, 50, 14, WS_TABSTOP END @@ -769,4 +769,7 @@ BEGIN IDS_COPY_OF "Copy of" IDS_SHLEXEC_NOASSOC "There is no Windows program configured to open this type of file." + + IDS_FILE_DETAILS "Details for '%s' extension" + IDS_FILE_DETAILSADV "Files with extension '%s' are of type '%s'. To change settings that affect all '%s' files, click Advanced." END diff --git a/reactos/dll/win32/shell32/lang/es-ES.rc b/reactos/dll/win32/shell32/lang/es-ES.rc index 95dd072026a..accc4cecd02 100644 --- a/reactos/dll/win32/shell32/lang/es-ES.rc +++ b/reactos/dll/win32/shell32/lang/es-ES.rc @@ -771,4 +771,7 @@ BEGIN IDS_COPY_OF "Copia de" IDS_SHLEXEC_NOASSOC "No hay ningn programa configurado en ReactOS para abrir este tipo de archivo." + + IDS_FILE_DETAILS "Detalles para el tipo de archivo '%s'" + IDS_FILE_DETAILSADV "Los archivos con extensin '%s' son del tipo '%s'. Para cambiar la configuracin de los archivos '%s', haga clic en Opciones avanzadas." END diff --git a/reactos/dll/win32/shell32/lang/fi-FI.rc b/reactos/dll/win32/shell32/lang/fi-FI.rc index f8958cfa903..c6e70ca085d 100644 --- a/reactos/dll/win32/shell32/lang/fi-FI.rc +++ b/reactos/dll/win32/shell32/lang/fi-FI.rc @@ -424,7 +424,7 @@ LTEXT "Opens with:", -1, 12, 140, 40, 10 //ICON LTEXT "Appname", 14005, 100, 140, 40, 10 PUSHBUTTON "&Change...", 14006, 180, 140, 50, 14, WS_TABSTOP -LTEXT "Files with extension '%s' are of type '%s'. To\nchange settings that affect all '%s' files, click\nAdvanced.", 14007, 12, 155, 160, 30 +LTEXT "Files with extension '%s' are of type '%s'. To change settings that affect all '%s' files, click Advanced.", 14007, 12, 155, 160, 30 PUSHBUTTON "Ad&vanced", 14008, 180, 175, 50, 14, WS_TABSTOP END @@ -758,4 +758,7 @@ BEGIN IDS_COPY_OF "Copy of" IDS_SHLEXEC_NOASSOC "There is no Windows program configured to open this type of file." + + IDS_FILE_DETAILS "Details for '%s' extension" + IDS_FILE_DETAILSADV "Files with extension '%s' are of type '%s'. To change settings that affect all '%s' files, click Advanced." END diff --git a/reactos/dll/win32/shell32/lang/fr-FR.rc b/reactos/dll/win32/shell32/lang/fr-FR.rc index 3b2c1fdba51..19964ae3d33 100644 --- a/reactos/dll/win32/shell32/lang/fr-FR.rc +++ b/reactos/dll/win32/shell32/lang/fr-FR.rc @@ -428,7 +428,7 @@ LTEXT "Ouvrir avec :", -1, 12, 140, 40, 10 //ICON LTEXT "Nom de l'application", 14005, 100, 140, 40, 10 PUSHBUTTON "&Modifier...", 14006, 180, 140, 50, 14, WS_TABSTOP -LTEXT "Les fichiers avec l'extension '%s' sont de type '%s'. Pour\nmodifier les paramtres qui concernent tous les fichiers '%s', cliquez\nsur Avanc.", 14007, 12, 155, 160, 30 +LTEXT "Les fichiers avec l'extension '%s' sont de type '%s'. Pour modifier les paramtres qui concernent tous les fichiers '%s', cliquez sur Avanc.", 14007, 12, 155, 160, 30 PUSHBUTTON "A&vanc", 14008, 180, 175, 50, 14, WS_TABSTOP END @@ -762,4 +762,7 @@ BEGIN IDS_COPY_OF "Copie de" IDS_SHLEXEC_NOASSOC "Aucun programme Windows n'est configur pour ouvrir ce type de fichier." + + IDS_FILE_DETAILS "Dtails concernant l'extension '%s'" + IDS_FILE_DETAILSADV "Les fichiers avec l'extension '%s' sont de type '%s'. Pour modifier les paramtres qui concernent tous les fichiers '%s', cliquez sur Avanc." END diff --git a/reactos/dll/win32/shell32/lang/hu-HU.rc b/reactos/dll/win32/shell32/lang/hu-HU.rc index e9f12f71ed3..9381fcb27bd 100644 --- a/reactos/dll/win32/shell32/lang/hu-HU.rc +++ b/reactos/dll/win32/shell32/lang/hu-HU.rc @@ -427,7 +427,7 @@ LTEXT "Opens with:", -1, 12, 140, 40, 10 //ICON LTEXT "Appname", 14005, 100, 140, 40, 10 PUSHBUTTON "&Change...", 14006, 180, 140, 50, 14, WS_TABSTOP -LTEXT "Files with extension '%s' are of type '%s'. To\nchange settings that affect all '%s' files, click\nAdvanced.", 14007, 12, 155, 160, 30 +LTEXT "Files with extension '%s' are of type '%s'. To change settings that affect all '%s' files, click Advanced.", 14007, 12, 155, 160, 30 PUSHBUTTON "Ad&vanced", 14008, 180, 175, 50, 14, WS_TABSTOP END @@ -761,4 +761,7 @@ BEGIN IDS_COPY_OF "Copy of" IDS_SHLEXEC_NOASSOC "There is no Windows program configured to open this type of file." + + IDS_FILE_DETAILS "Details for '%s' extension" + IDS_FILE_DETAILSADV "Files with extension '%s' are of type '%s'. To change settings that affect all '%s' files, click Advanced." END diff --git a/reactos/dll/win32/shell32/lang/it-IT.rc b/reactos/dll/win32/shell32/lang/it-IT.rc index 134c6979aa5..39ace93692d 100644 --- a/reactos/dll/win32/shell32/lang/it-IT.rc +++ b/reactos/dll/win32/shell32/lang/it-IT.rc @@ -129,7 +129,7 @@ BEGIN LTEXT "Versione " KERNEL_VERSION_STR " (" KERNEL_VERSION_BUILD_STR ")", IDC_STATIC, 35, 65, 235, 10 LTEXT REACTOS_DEFAULT_STR_LEGAL_COPYRIGHT, IDC_STATIC, 35, 75, 210, 10 LTEXT "", IDC_SHELL_ABOUT_OTHERSTUFF, 35, 90, 180, 20 - LTEXT "Questa versione di ReactOS registrata da:", IDC_STATIC, 35, 115, 180, 10 + LTEXT "Questa versione di ReactOS registrata a nome di:", IDC_STATIC, 35, 115, 180, 10 LTEXT "", IDC_SHELL_ABOUT_REG_USERNAME, 45, 125, 180, 10 LTEXT "", IDC_SHELL_ABOUT_REG_ORGNAME, 45, 135, 180, 10 LTEXT "", IDC_STATIC, 35, 147, 235, 1, SS_ETCHEDHORZ @@ -435,7 +435,7 @@ LTEXT "Si apre con:", -1, 12, 140, 40, 10 //ICON LTEXT "Nome", 14005, 100, 140, 40, 10 PUSHBUTTON "&Cambia...", 14006, 180, 140, 50, 14, WS_TABSTOP -LTEXT "I files con estensione '%s' sono di tipo '%s'.\nPer cambiare le impostazioni che influenzano tutti i file '%s', cliccare\nAvanzate.", 14007, 12, 155, 160, 30 +LTEXT "I files con estensione '%s' sono di tipo '%s'. Per cambiare le impostazioni per tutti i file '%s', cliccare su Avanzate.", 14007, 12, 155, 160, 30 PUSHBUTTON "A&vanzate", 14008, 180, 175, 50, 14, WS_TABSTOP END @@ -769,4 +769,7 @@ BEGIN IDS_COPY_OF "Copia di" IDS_SHLEXEC_NOASSOC "Non c' un programma configurato per aprire questo tipo di file." + + IDS_FILE_DETAILS "Dettagli per l'estensione '%s'" + IDS_FILE_DETAILSADV "I files con estensione '%s' sono di tipo '%s'. Per modificare le impostazioni per tutti i file '%s', cliccare su Avanzate." END diff --git a/reactos/dll/win32/shell32/lang/ja-JP.rc b/reactos/dll/win32/shell32/lang/ja-JP.rc index 9545f6c9c67..cb62fdb740c 100644 --- a/reactos/dll/win32/shell32/lang/ja-JP.rc +++ b/reactos/dll/win32/shell32/lang/ja-JP.rc @@ -424,7 +424,7 @@ LTEXT " //ICON LTEXT "Av", 14005, 100, 140, 40, 10 PUSHBUTTON "ύX(&C)...", 14006, 180, 140, 50, 14, WS_TABSTOP -LTEXT "gq '%s' ̃t@C̎ނ'%s'łB\n'%s' ̃t@CׂĂɑ΂ݒύXɂ\nڍאݒNbNĂB", 14007, 12, 155, 160, 30 +LTEXT "gq '%s' ̃t@C̎ނ'%s'łB '%s' ̃t@CׂĂɑ΂ݒύXɂ ڍאݒNbNĂB", 14007, 12, 155, 160, 30 PUSHBUTTON "ڍאݒ(&V)", 14008, 180, 175, 50, 14, WS_TABSTOP END @@ -757,4 +757,8 @@ BEGIN IDS_DEFAULT_CLUSTER_SIZE "ftHg AP[V TCY" IDS_COPY_OF "Rs[ `" + IDS_SHLEXEC_NOASSOC "There is no Windows program configured to open this type of file." + + IDS_FILE_DETAILS "gq '%s' ̏ڍ" + IDS_FILE_DETAILSADV "gq '%s' ̃t@C̎ނ'%s'łB '%s' ̃t@CׂĂɑ΂ݒύXɂ ڍאݒNbNĂB" END diff --git a/reactos/dll/win32/shell32/lang/ko-KR.rc b/reactos/dll/win32/shell32/lang/ko-KR.rc index 37565bd4f39..0bb1f329674 100644 --- a/reactos/dll/win32/shell32/lang/ko-KR.rc +++ b/reactos/dll/win32/shell32/lang/ko-KR.rc @@ -424,7 +424,7 @@ LTEXT "Opens with:", -1, 12, 140, 40, 10 //ICON LTEXT "Appname", 14005, 100, 140, 40, 10 PUSHBUTTON "&Change...", 14006, 180, 140, 50, 14, WS_TABSTOP -LTEXT "Files with extension '%s' are of type '%s'. To\nchange settings that affect all '%s' files, click\nAdvanced.", 14007, 12, 155, 160, 30 +LTEXT "Files with extension '%s' are of type '%s'. To change settings that affect all '%s' files, click Advanced.", 14007, 12, 155, 160, 30 PUSHBUTTON "Ad&vanced", 14008, 180, 175, 50, 14, WS_TABSTOP END @@ -758,4 +758,7 @@ BEGIN IDS_COPY_OF "Copy of" IDS_SHLEXEC_NOASSOC "There is no Windows program configured to open this type of file." + + IDS_FILE_DETAILS "Details for '%s' extension" + IDS_FILE_DETAILSADV "Files with extension '%s' are of type '%s'. To change settings that affect all '%s' files, click Advanced." END diff --git a/reactos/dll/win32/shell32/lang/nl-NL.rc b/reactos/dll/win32/shell32/lang/nl-NL.rc index 5e957b7485a..784be8dec05 100644 --- a/reactos/dll/win32/shell32/lang/nl-NL.rc +++ b/reactos/dll/win32/shell32/lang/nl-NL.rc @@ -424,7 +424,7 @@ LTEXT "Opens with:", -1, 12, 140, 40, 10 //ICON LTEXT "Appname", 14005, 100, 140, 40, 10 PUSHBUTTON "&Change...", 14006, 180, 140, 50, 14, WS_TABSTOP -LTEXT "Files with extension '%s' are of type '%s'. To\nchange settings that affect all '%s' files, click\nAdvanced.", 14007, 12, 155, 160, 30 +LTEXT "Files with extension '%s' are of type '%s'. To change settings that affect all '%s' files, click Advanced.", 14007, 12, 155, 160, 30 PUSHBUTTON "Ad&vanced", 14008, 180, 175, 50, 14, WS_TABSTOP END @@ -758,4 +758,7 @@ BEGIN IDS_COPY_OF "Copy of" IDS_SHLEXEC_NOASSOC "Er is geen Windows-programma geconfigureerd om dit soort bestanden te openen." + + IDS_FILE_DETAILS "Details for '%s' extension" + IDS_FILE_DETAILSADV "Files with extension '%s' are of type '%s'. To change settings that affect all '%s' files, click Advanced." END diff --git a/reactos/dll/win32/shell32/lang/no-NO.rc b/reactos/dll/win32/shell32/lang/no-NO.rc index e204a77d957..41464164dae 100644 --- a/reactos/dll/win32/shell32/lang/no-NO.rc +++ b/reactos/dll/win32/shell32/lang/no-NO.rc @@ -425,7 +425,7 @@ LTEXT " //ICON LTEXT "Appname", 14005, 100, 140, 40, 10 PUSHBUTTON "&Endre...", 14006, 180, 140, 50, 14, WS_TABSTOP -LTEXT "Filer med utvidelser '%s' er av typen '%s'. For \nendre innstillingene som er av filen '%s', trykk p\navansert.", 14007, 12, 155, 160, 30 +LTEXT "Filer med utvidelser '%s' er av typen '%s'. For endre innstillingene som er av filen '%s', trykk p avansert.", 14007, 12, 155, 160, 30 PUSHBUTTON "Av&ansert", 14008, 180, 175, 50, 14, WS_TABSTOP END @@ -761,4 +761,7 @@ BEGIN IDS_COPY_OF "Copy of" IDS_SHLEXEC_NOASSOC "Intet Windows-program er satt opp til pne denne filtypen." + + IDS_FILE_DETAILS "Detailjer for '%s' utvidelser" + IDS_FILE_DETAILSADV "Filer med utvidelser '%s' er av typen '%s'. For endre innstillingene som er av filen '%s', trykk p avansert." END diff --git a/reactos/dll/win32/shell32/lang/pl-PL.rc b/reactos/dll/win32/shell32/lang/pl-PL.rc index 65e85133323..283ddbf3db9 100644 --- a/reactos/dll/win32/shell32/lang/pl-PL.rc +++ b/reactos/dll/win32/shell32/lang/pl-PL.rc @@ -432,7 +432,7 @@ LTEXT "Otwiera z:", -1, 12, 140, 40, 10 //ICON LTEXT "Nazwa Aplikacji", 14005, 100, 140, 40, 10 PUSHBUTTON "Z&mie", 14006, 180, 140, 50, 14, WS_TABSTOP -LTEXT "Pliki z rozszerzeniem '%s' nale do typu: '%s'. Aby\nzmieni ustawienia dotyczce wszystkich plikw '%s', wybierz\nZaawansowane.", 14007, 12, 155, 160, 30 +LTEXT "Pliki z rozszerzeniem '%s' nale do typu: '%s'. Aby zmieni ustawienia dotyczce wszystkich plikw '%s', wybierz Zaawansowane.", 14007, 12, 155, 160, 30 PUSHBUTTON "Zaawa&nsowane", 14008, 180, 175, 50, 14, WS_TABSTOP END @@ -766,4 +766,7 @@ BEGIN IDS_COPY_OF "Kopia" IDS_SHLEXEC_NOASSOC "aden program nie jest skonfigurowany, by otwiera pliki tego typu." + + IDS_FILE_DETAILS "Szczegy dla rozszerzenia '%s'" + IDS_FILE_DETAILSADV "Pliki z rozszerzeniem '%s' s typu '%s'. Aby zmieni ustawienia, ktre dotycz wszystkich plikw '%s', kliknij przycisk Zaawansowane." END diff --git a/reactos/dll/win32/shell32/lang/pt-BR.rc b/reactos/dll/win32/shell32/lang/pt-BR.rc index c06bf15c70c..008950441fa 100644 --- a/reactos/dll/win32/shell32/lang/pt-BR.rc +++ b/reactos/dll/win32/shell32/lang/pt-BR.rc @@ -426,7 +426,7 @@ LTEXT "Opens with:", -1, 12, 140, 40, 10 //ICON LTEXT "Appname", 14005, 100, 140, 40, 10 PUSHBUTTON "&Change...", 14006, 180, 140, 50, 14, WS_TABSTOP -LTEXT "Files with extension '%s' are of type '%s'. To\nchange settings that affect all '%s' files, click\nAdvanced.", 14007, 12, 155, 160, 30 +LTEXT "Files with extension '%s' are of type '%s'. To change settings that affect all '%s' files, click Advanced.", 14007, 12, 155, 160, 30 PUSHBUTTON "Ad&vanced", 14008, 180, 175, 50, 14, WS_TABSTOP END @@ -760,4 +760,7 @@ BEGIN IDS_COPY_OF "Copy of" IDS_SHLEXEC_NOASSOC "Nici un program Windows nu este configurat sa deschida fi?iere de acest tip." + + IDS_FILE_DETAILS "Details for '%s' extension" + IDS_FILE_DETAILSADV "Files with extension '%s' are of type '%s'. To change settings that affect all '%s' files, click Advanced." END diff --git a/reactos/dll/win32/shell32/lang/pt-PT.rc b/reactos/dll/win32/shell32/lang/pt-PT.rc index e34e5567909..d6b9c8ee078 100644 --- a/reactos/dll/win32/shell32/lang/pt-PT.rc +++ b/reactos/dll/win32/shell32/lang/pt-PT.rc @@ -427,7 +427,7 @@ LTEXT "Abre com:", -1, 12, 140, 40, 10 //ICON LTEXT "Appnome", 14005, 100, 140, 40, 10 PUSHBUTTON "&Mudar...", 14006, 180, 140, 50, 14, WS_TABSTOP -LTEXT "Ficheiros com extenso '%s' so do tipo '%s'. Para\nmudar definies que afectam todos '%s' ficheiros, click\nAvanado.", 14007, 12, 155, 160, 30 +LTEXT "Ficheiros com extenso '%s' so do tipo '%s'. Para mudar definies que afectam todos '%s' ficheiros, click Avanado.", 14007, 12, 155, 160, 30 PUSHBUTTON "A&vanado", 14008, 180, 175, 50, 14, WS_TABSTOP END @@ -761,4 +761,7 @@ BEGIN IDS_COPY_OF "Cpia de" IDS_SHLEXEC_NOASSOC "No existe um programa Windows configurado para abrir este tipo de ficheiro." + + IDS_FILE_DETAILS "Detalhes para '%s' extenso" + IDS_FILE_DETAILSADV "Ficheiros com extenso '%s' so do tipo '%s'. Para mudar definies que afectam todos '%s' ficheiros, click Avanado." END diff --git a/reactos/dll/win32/shell32/lang/ro-RO.rc b/reactos/dll/win32/shell32/lang/ro-RO.rc index ef9e21361f0..5c2310545ea 100644 --- a/reactos/dll/win32/shell32/lang/ro-RO.rc +++ b/reactos/dll/win32/shell32/lang/ro-RO.rc @@ -427,7 +427,7 @@ LTEXT "Deschidere cu:", -1, 12, 140, 40, 10 //ICON LTEXT "Nume ap.", 14005, 100, 140, 40, 10 PUSHBUTTON "&Schimbare", 14006, 180, 140, 50, 14, WS_TABSTOP -LTEXT "Fișierele cu extensia '%s' sunt de tipul '%s'. \nPentru a schimbat setări care vor afecta\ntoate fișierele '%s', clic pe Avansat.", 14007, 12, 155, 160, 30 +LTEXT "Fișierele cu extensia '%s' sunt de tipul '%s'. Pentru a schimbat setări care vor afecta toate fișierele '%s', clic pe Avansat.", 14007, 12, 155, 160, 30 PUSHBUTTON "A&vansat", 14008, 180, 175, 50, 14, WS_TABSTOP END @@ -760,6 +760,9 @@ BEGIN IDS_DEFAULT_CLUSTER_SIZE "Mărime de alocare implicită" IDS_SHLEXEC_NOASSOC "There is no Windows program configured to open this type of file." + + IDS_FILE_DETAILS "Detalii pentru extensia '%s'" + IDS_FILE_DETAILSADV "Fișierele cu extensia '%s' sunt de tipul '%s'. Pentru a schimbat setări care vor afecta toate fișierele '%s', clic pe Avansat." END #pragma code_page(default) diff --git a/reactos/dll/win32/shell32/lang/ru-RU.rc b/reactos/dll/win32/shell32/lang/ru-RU.rc index 62a4167f921..d038aa3f6d8 100644 --- a/reactos/dll/win32/shell32/lang/ru-RU.rc +++ b/reactos/dll/win32/shell32/lang/ru-RU.rc @@ -424,7 +424,7 @@ LTEXT " //ICON LTEXT ":", 14005, 100, 142, 54, 10 PUSHBUTTON "&...", 14006, 180, 140, 63, 14, WS_TABSTOP -LTEXT " '%s' '%s'. '%s', """".", 14007, 12, 155, 162, 36 +LTEXT " '%s' '%s'. '%s', ''.", 14007, 12, 155, 162, 36 PUSHBUTTON "&", 14008, 180, 175, 63, 14, WS_TABSTOP END @@ -757,4 +757,7 @@ BEGIN IDS_COPY_OF "Copy of" IDS_SHLEXEC_NOASSOC "There is no Windows program configured to open this type of file." + + IDS_FILE_DETAILS " '%s'" + IDS_FILE_DETAILSADV " '%s' '%s'. '%s', ''." END diff --git a/reactos/dll/win32/shell32/lang/sk-SK.rc b/reactos/dll/win32/shell32/lang/sk-SK.rc index dde08bb84d5..7e25164eee9 100644 --- a/reactos/dll/win32/shell32/lang/sk-SK.rc +++ b/reactos/dll/win32/shell32/lang/sk-SK.rc @@ -430,7 +430,7 @@ LTEXT "Opens with:", -1, 12, 140, 40, 10 //ICON LTEXT "Appname", 14005, 100, 140, 40, 10 PUSHBUTTON "&Zmeni...", 14006, 180, 140, 50, 14, WS_TABSTOP -LTEXT "Files with extension '%s' are of type '%s'. To\nchange settings that affect all '%s' files, click\nAdvanced.", 14007, 12, 155, 160, 30 +LTEXT "Files with extension '%s' are of type '%s'. To change settings that affect all '%s' files, click Advanced.", 14007, 12, 155, 160, 30 PUSHBUTTON "Ad&vanced", 14008, 180, 175, 50, 14, WS_TABSTOP END @@ -766,4 +766,7 @@ BEGIN // There is no Windows program configured to open this type of file. IDS_SHLEXEC_NOASSOC "Neexistuje iadny program nakonfigurovan tak, aby otvral tento typ sborov." // Na otvranie tohto typu sboru nie je nakonfigurovan iadny program systmu Windows. + + IDS_FILE_DETAILS "Details for '%s' extension" + IDS_FILE_DETAILSADV "Files with extension '%s' are of type '%s'. To change settings that affect all '%s' files, click Advanced." END diff --git a/reactos/dll/win32/shell32/lang/sl-SI.rc b/reactos/dll/win32/shell32/lang/sl-SI.rc index 79bd536fe1b..9b9f01b9a3e 100644 --- a/reactos/dll/win32/shell32/lang/sl-SI.rc +++ b/reactos/dll/win32/shell32/lang/sl-SI.rc @@ -424,7 +424,7 @@ LTEXT "Opens with:", -1, 12, 140, 40, 10 //ICON LTEXT "Appname", 14005, 100, 140, 40, 10 PUSHBUTTON "&Change...", 14006, 180, 140, 50, 14, WS_TABSTOP -LTEXT "Files with extension '%s' are of type '%s'. To\nchange settings that affect all '%s' files, click\nAdvanced.", 14007, 12, 155, 160, 30 +LTEXT "Files with extension '%s' are of type '%s'. To change settings that affect all '%s' files, click Advanced.", 14007, 12, 155, 160, 30 PUSHBUTTON "Ad&vanced", 14008, 180, 175, 50, 14, WS_TABSTOP END @@ -758,4 +758,7 @@ BEGIN IDS_COPY_OF "Copy of" IDS_SHLEXEC_NOASSOC "Noben Okenski program ni nastavljen, da bi odpiral ta tip datotek." + + IDS_FILE_DETAILS "Details for '%s' extension" + IDS_FILE_DETAILSADV "Files with extension '%s' are of type '%s'. To change settings that affect all '%s' files, click Advanced." END diff --git a/reactos/dll/win32/shell32/lang/sv-SE.rc b/reactos/dll/win32/shell32/lang/sv-SE.rc index 6bfcf61da75..117b1196d73 100644 --- a/reactos/dll/win32/shell32/lang/sv-SE.rc +++ b/reactos/dll/win32/shell32/lang/sv-SE.rc @@ -424,7 +424,7 @@ LTEXT "Opens with:", -1, 12, 140, 40, 10 //ICON LTEXT "Appname", 14005, 100, 140, 40, 10 PUSHBUTTON "&Change...", 14006, 180, 140, 50, 14, WS_TABSTOP -LTEXT "Files with extension '%s' are of type '%s'. To\nchange settings that affect all '%s' files, click\nAdvanced.", 14007, 12, 155, 160, 30 +LTEXT "Files with extension '%s' are of type '%s'. To change settings that affect all '%s' files, click Advanced.", 14007, 12, 155, 160, 30 PUSHBUTTON "Ad&vanced", 14008, 180, 175, 50, 14, WS_TABSTOP END @@ -758,4 +758,7 @@ BEGIN IDS_COPY_OF "Copy of" IDS_SHLEXEC_NOASSOC "There is no Windows program configured to open this type of file." + + IDS_FILE_DETAILS "Details for '%s' extension" + IDS_FILE_DETAILSADV "Files with extension '%s' are of type '%s'. To change settings that affect all '%s' files, click Advanced." END diff --git a/reactos/dll/win32/shell32/lang/tr-TR.rc b/reactos/dll/win32/shell32/lang/tr-TR.rc index b5f8e6258e3..b3153ac1f3e 100644 --- a/reactos/dll/win32/shell32/lang/tr-TR.rc +++ b/reactos/dll/win32/shell32/lang/tr-TR.rc @@ -424,7 +424,7 @@ LTEXT "Opens with:", -1, 12, 140, 40, 10 //ICON LTEXT "Appname", 14005, 100, 140, 40, 10 PUSHBUTTON "&Change...", 14006, 180, 140, 50, 14, WS_TABSTOP -LTEXT "Files with extension '%s' are of type '%s'. To\nchange settings that affect all '%s' files, click\nAdvanced.", 14007, 12, 155, 160, 30 +LTEXT "Files with extension '%s' are of type '%s'. To change settings that affect all '%s' files, click Advanced.", 14007, 12, 155, 160, 30 PUSHBUTTON "Ad&vanced", 14008, 180, 175, 50, 14, WS_TABSTOP END @@ -758,4 +758,7 @@ BEGIN IDS_COPY_OF "Copy of" IDS_SHLEXEC_NOASSOC "There is no Windows program configured to open this type of file." + + IDS_FILE_DETAILS "Details for '%s' extension" + IDS_FILE_DETAILSADV "Files with extension '%s' are of type '%s'. To change settings that affect all '%s' files, click Advanced." END diff --git a/reactos/dll/win32/shell32/lang/uk-UA.rc b/reactos/dll/win32/shell32/lang/uk-UA.rc index 181df04df91..9c48275745b 100644 --- a/reactos/dll/win32/shell32/lang/uk-UA.rc +++ b/reactos/dll/win32/shell32/lang/uk-UA.rc @@ -437,7 +437,7 @@ LTEXT "³ //ICON LTEXT "", 14005, 100, 140, 40, 10 PUSHBUTTON "&...", 14006, 180, 140, 50, 14, WS_TABSTOP -LTEXT " '%s' '%s'.\n , \n '%s', """".", 14007, 12, 155, 160, 30 +LTEXT " '%s' '%s'. , '%s', ''.", 14007, 12, 155, 160, 30 PUSHBUTTON "&", 14008, 180, 175, 50, 14, WS_TABSTOP END @@ -771,4 +771,7 @@ BEGIN IDS_COPY_OF "" IDS_SHLEXEC_NOASSOC " Windows, ." + + IDS_FILE_DETAILS " '%s'" + IDS_FILE_DETAILSADV " '%s' '%s'. , '%s', ''." END diff --git a/reactos/dll/win32/shell32/lang/zh-CN.rc b/reactos/dll/win32/shell32/lang/zh-CN.rc index ba4d7c8de10..8e6978bb86b 100644 --- a/reactos/dll/win32/shell32/lang/zh-CN.rc +++ b/reactos/dll/win32/shell32/lang/zh-CN.rc @@ -413,7 +413,7 @@ LTEXT "Opens with:", -1, 12, 140, 40, 10 //ICON LTEXT "Appname", 14005, 100, 140, 40, 10 PUSHBUTTON "&Change...", 14006, 180, 140, 50, 14, WS_TABSTOP -LTEXT "Files with extension '%s' are of type '%s'. To\nchange settings that affect all '%s' files, click\nAdvanced.", 14007, 12, 155, 160, 30 +LTEXT "Files with extension '%s' are of type '%s'. To change settings that affect all '%s' files, click Advanced.", 14007, 12, 155, 160, 30 PUSHBUTTON "Ad&vanced", 14008, 180, 175, 50, 14, WS_TABSTOP END @@ -746,5 +746,8 @@ BEGIN IDS_COPY_OF "Copy of" IDS_SHLEXEC_NOASSOC "There is no Windows program configured to open this type of file." + + IDS_FILE_DETAILS "Details for '%s' extension" + IDS_FILE_DETAILSADV "Files with extension '%s' are of type '%s'. To change settings that affect all '%s' files, click Advanced." END diff --git a/reactos/dll/win32/shell32/lang/zh-TW.rc b/reactos/dll/win32/shell32/lang/zh-TW.rc index 22dd7afc4d2..8b4a9893c77 100644 --- a/reactos/dll/win32/shell32/lang/zh-TW.rc +++ b/reactos/dll/win32/shell32/lang/zh-TW.rc @@ -425,7 +425,7 @@ LTEXT "Opens with:", -1, 12, 140, 40, 10 //ICON LTEXT "Appname", 14005, 100, 140, 40, 10 PUSHBUTTON "&Change...", 14006, 180, 140, 50, 14, WS_TABSTOP -LTEXT "Files with extension '%s' are of type '%s'. To\nchange settings that affect all '%s' files, click\nAdvanced.", 14007, 12, 155, 160, 30 +LTEXT "Files with extension '%s' are of type '%s'. To change settings that affect all '%s' files, click Advanced.", 14007, 12, 155, 160, 30 PUSHBUTTON "Ad&vanced", 14008, 180, 175, 50, 14, WS_TABSTOP END @@ -759,6 +759,9 @@ BEGIN IDS_COPY_OF "Copy of" IDS_SHLEXEC_NOASSOC "There is no Windows program configured to open this type of file." + + IDS_FILE_DETAILS "Details for '%s' extension" + IDS_FILE_DETAILSADV "Files with extension '%s' are of type '%s'. To change settings that affect all '%s' files, click Advanced." END #pragma code_page(default) diff --git a/reactos/dll/win32/shell32/shresdef.h b/reactos/dll/win32/shell32/shresdef.h index 1cb3903ee85..507d26b11ee 100644 --- a/reactos/dll/win32/shell32/shresdef.h +++ b/reactos/dll/win32/shell32/shresdef.h @@ -141,6 +141,7 @@ #define IDS_SHLEXEC_NOASSOC 173 #define IDS_FILE_TYPES 174 #define IDS_FILE_DETAILS 175 +#define IDS_FILE_DETAILSADV 176 #define IDS_RUNDLG_ERROR 180 #define IDS_RUNDLG_BROWSE_ERROR 181 From 8273f88beb5887e13973d8882dbbd21682f094cc Mon Sep 17 00:00:00 2001 From: James Tabor Date: Thu, 5 May 2011 12:43:31 +0000 Subject: [PATCH 298/317] [User32|Win32k] - Standardize keyboard flags for the input thread and send input. Next round will update the rest of user32 defwnd.c, combo.c and appswitch.c. - Add the missing keyboard flags needed for menu operations for in-user applications. - Setup a function to be used to get, set and clear queue flags of special use for User32 functions. svn path=/trunk/; revision=51587 --- reactos/dll/win32/user32/windows/dialog.c | 5 +++- .../subsystems/win32/win32k/ntuser/input.c | 22 +++++++++++----- reactos/subsystems/win32/win32k/ntuser/misc.c | 26 +++++++++++++++++++ .../subsystems/win32/win32k/ntuser/ntstubs.c | 11 -------- 4 files changed, 45 insertions(+), 19 deletions(-) diff --git a/reactos/dll/win32/user32/windows/dialog.c b/reactos/dll/win32/user32/windows/dialog.c index ac36d7366cd..54548278b7f 100644 --- a/reactos/dll/win32/user32/windows/dialog.c +++ b/reactos/dll/win32/user32/windows/dialog.c @@ -18,7 +18,7 @@ */ /* * PROJECT: ReactOS user32.dll - * FILE: lib/user32/windows/dialog.c + * FILE: dll/win32/user32/windows/dialog.c * PURPOSE: Input * PROGRAMMER: Casper S. Hornstrup (chorns@users.sourceforge.net) * Thomas Weidenmueller (w3seek@users.sourceforge.net) @@ -39,6 +39,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(user32); #define DF_END 0x0001 #define DF_OWNERENABLED 0x0002 +#define DF_DIALOGACTIVE 0x4000 #define DWLP_ROS_DIALOGINFO (DWLP_USER+sizeof(ULONG_PTR)) #define GETDLGINFO(hwnd) DIALOG_get_info(hwnd, FALSE) #define SETDLGINFO(hwnd, info) SetWindowLongPtrW((hwnd), DWLP_ROS_DIALOGINFO, (LONG_PTR)(info)) @@ -1131,6 +1132,7 @@ static LRESULT DEFDLG_Proc( HWND hwnd, UINT msg, WPARAM wParam, if (dlgInfo->hUserFont) DeleteObject( dlgInfo->hUserFont ); if (dlgInfo->hMenu) DestroyMenu( dlgInfo->hMenu ); HeapFree( GetProcessHeap(), 0, dlgInfo ); + NtUserSetThreadState(0,DF_DIALOGACTIVE); NtUserCallHwndParam( hwnd, 0, HWNDPARAM_ROUTINE_SETDIALOGPOINTER ); } /* Window clean-up */ @@ -1141,6 +1143,7 @@ static LRESULT DEFDLG_Proc( HWND hwnd, UINT msg, WPARAM wParam, return DefWindowProcA( hwnd, msg, wParam, lParam ); case WM_ACTIVATE: + NtUserSetThreadState(DF_DIALOGACTIVE,DF_DIALOGACTIVE); if (wParam) DEFDLG_RestoreFocus( hwnd ); else DEFDLG_SaveFocus( hwnd ); return 0; diff --git a/reactos/subsystems/win32/win32k/ntuser/input.c b/reactos/subsystems/win32/win32k/ntuser/input.c index 8e5d5f3d40d..81128b9c61e 100644 --- a/reactos/subsystems/win32/win32k/ntuser/input.c +++ b/reactos/subsystems/win32/win32k/ntuser/input.c @@ -769,7 +769,7 @@ KeyboardThreadMain(PVOID StartContext) (KeyInput.MakeCode == LastMakeCode)) { RepeatCount++; - lParam |= (1 << 30); + lParam |= (KF_REPEAT << 16); } else { @@ -782,7 +782,7 @@ KeyboardThreadMain(PVOID StartContext) { LastFlags = 0; LastMakeCode = 0; /* Should never match */ - lParam |= (1 << 30) | (1 << 31); + lParam |= (KF_UP << 16) | (KF_REPEAT << 16); } lParam |= RepeatCount; @@ -790,11 +790,11 @@ KeyboardThreadMain(PVOID StartContext) lParam |= (KeyInput.MakeCode & 0xff) << 16; if (KeyInput.Flags & KEY_E0) - lParam |= (1 << 24); + lParam |= (KF_EXTENDED << 16); if (ModifierState & MOD_ALT) { - lParam |= (1 << 29); // wine -> (HIWORD(lParam) & KEYDATA_ALT) #define KEYDATA_ALT 0x2000 + lParam |= (KF_ALTDOWN << 16); if (!(KeyInput.Flags & KEY_BREAK)) msg.message = WM_SYSKEYDOWN; @@ -821,6 +821,10 @@ KeyboardThreadMain(PVOID StartContext) { keyboardLayout = ((PTHREADINFO)FocusThread->Tcb.Win32Thread)->KeyboardLayout; } + if ( FocusQueue->QF_flags & QF_DIALOGACTIVE ) + lParam |= (KF_DLGMODE << 16); + if ( FocusQueue->MenuOwner )//FocusQueue->MenuState ) // MenuState needs a start flag... + lParam |= (KF_MENUMODE << 16); } if (!keyboardLayout) { @@ -1265,8 +1269,14 @@ IntKeyboardInput(KEYBDINPUT *ki, BOOL Injected) Msg.wParam = wVk; flags = LOBYTE(ki->wScan); + FocusMessageQueue = IntGetFocusMessageQueue(); + if (ki->dwFlags & KEYEVENTF_EXTENDEDKEY) flags |= KF_EXTENDED; /* FIXME: set KF_DLGMODE and KF_MENUMODE when needed */ + if ( FocusMessageQueue && FocusMessageQueue->QF_flags & QF_DIALOGACTIVE ) + flags |= KF_DLGMODE; + if ( FocusMessageQueue && FocusMessageQueue->MenuOwner )//FocusMessageQueue->MenuState ) // MenuState needs a start flag... + flags |= KF_MENUMODE; /* strip left/right for menu, control, shift */ switch (wVk) @@ -1354,8 +1364,6 @@ IntKeyboardInput(KEYBDINPUT *ki, BOOL Injected) Msg.lParam = MAKELPARAM(1 /* repeat count */, flags); } - FocusMessageQueue = IntGetFocusMessageQueue(); - Msg.hwnd = 0; if (FocusMessageQueue && (FocusMessageQueue->FocusWindow != (HWND)0)) @@ -1374,7 +1382,7 @@ IntKeyboardInput(KEYBDINPUT *ki, BOOL Injected) KbdHookData.vkCode = vk_hook; KbdHookData.scanCode = ki->wScan; - KbdHookData.flags = flags >> 8; + KbdHookData.flags = (flags & (KF_EXTENDED | KF_ALTDOWN | KF_UP)) >> 8; if (Injected) KbdHookData.flags |= LLKHF_INJECTED; KbdHookData.time = Msg.time; KbdHookData.dwExtraInfo = ki->dwExtraInfo; diff --git a/reactos/subsystems/win32/win32k/ntuser/misc.c b/reactos/subsystems/win32/win32k/ntuser/misc.c index a36403e49c1..92f50b402c0 100644 --- a/reactos/subsystems/win32/win32k/ntuser/misc.c +++ b/reactos/subsystems/win32/win32k/ntuser/misc.c @@ -150,6 +150,32 @@ NtUserGetThreadState( return ret; } +DWORD +APIENTRY +NtUserSetThreadState( + DWORD Set, + DWORD Flags) +{ + PTHREADINFO pti; + DWORD Ret = 0; + // Test the only flags user can change. + if (Set & ~(QF_FF10STATUS|QF_DIALOGACTIVE|QF_TABSWITCHING|QF_FMENUSTATUS|QF_FMENUSTATUSBREAK)) return 0; + if (Flags & ~(QF_FF10STATUS|QF_DIALOGACTIVE|QF_TABSWITCHING|QF_FMENUSTATUS|QF_FMENUSTATUSBREAK)) return 0; + UserEnterExclusive(); + pti = PsGetCurrentThreadWin32Thread(); + if (pti->MessageQueue) + { + Ret = pti->MessageQueue->QF_flags; // Get the queue flags. + if (Set) + pti->MessageQueue->QF_flags |= (Set&Flags); // Set the queue flags. + else + { + if (Flags) pti->MessageQueue->QF_flags &= ~Flags; // Clr the queue flags. + } + } + UserLeave(); + return Ret; +} UINT APIENTRY diff --git a/reactos/subsystems/win32/win32k/ntuser/ntstubs.c b/reactos/subsystems/win32/win32k/ntuser/ntstubs.c index 281fe7190a1..f9168806404 100644 --- a/reactos/subsystems/win32/win32k/ntuser/ntstubs.c +++ b/reactos/subsystems/win32/win32k/ntuser/ntstubs.c @@ -527,17 +527,6 @@ NtUserSetSysColors( return Ret; } -DWORD -APIENTRY -NtUserSetThreadState( - DWORD Unknown0, - DWORD Unknown1) -{ - UNIMPLEMENTED - - return 0; -} - DWORD APIENTRY NtUserUpdateInputContext( From 5ca533b988994fca9501e24f858e229869b9df6b Mon Sep 17 00:00:00 2001 From: Gregor Schneider Date: Thu, 5 May 2011 17:54:32 +0000 Subject: [PATCH 299/317] [shell32] Re-add spaces to German translation svn path=/trunk/; revision=51592 --- reactos/dll/win32/shell32/lang/de-DE.rc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/dll/win32/shell32/lang/de-DE.rc b/reactos/dll/win32/shell32/lang/de-DE.rc index 72182abc024..bfe735a5bc0 100644 --- a/reactos/dll/win32/shell32/lang/de-DE.rc +++ b/reactos/dll/win32/shell32/lang/de-DE.rc @@ -427,7 +427,7 @@ BEGIN //ICON LTEXT "Anwendungsname", 14005, 100, 140, 40, 10 PUSHBUTTON "n&dern...", 14006, 180, 140, 50, 14, WS_TABSTOP - LTEXT "Umdie Einstellungen, die alle Dateien des Typs '%s' betreffen zu ndern, klicken Sie auf Erweitert.", 14007, 12, 155, 160, 30 + LTEXT "Um die Einstellungen, die alle Dateien des Typs '%s' betreffen zu ndern, klicken Sie auf Erweitert.", 14007, 12, 155, 160, 30 PUSHBUTTON "&Erweitert", 14008, 180, 175, 50, 14, WS_TABSTOP END @@ -764,5 +764,5 @@ BEGIN IDS_SHLEXEC_NOASSOC "Es ist kein Programm mit diesem Dateityp verknpft." IDS_FILE_DETAILS "Details zum Dateityp '%s'" - IDS_FILE_DETAILSADV "Umdie Einstellungen, die alle Dateien des Typs '%s' betreffen zu ndern, klicken Sie auf Erweitert." + IDS_FILE_DETAILSADV "Um die Einstellungen, die alle Dateien des Typs '%s' betreffen zu ndern, klicken Sie auf Erweitert." END From 720bbb3f514ca221aaca0a31431c8050404bfadd Mon Sep 17 00:00:00 2001 From: Gregor Schneider Date: Thu, 5 May 2011 18:12:05 +0000 Subject: [PATCH 300/317] [ping] Return 1 if an error occurs during parameter parsing or socket setup See issue #6206 for more details. svn path=/trunk/; revision=51593 --- reactos/base/applications/network/ping/ping.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/reactos/base/applications/network/ping/ping.c b/reactos/base/applications/network/ping/ping.c index c0bd93201a1..7d04e83ed18 100644 --- a/reactos/base/applications/network/ping/ping.c +++ b/reactos/base/applications/network/ping/ping.c @@ -727,6 +727,10 @@ int wmain(int argc, LPWSTR argv[]) FormatOutput(IDS_MIN_MAX_AVERAGE, MinTime, MaxTime, AvgTime); } } + else + { + return 1; + } return 0; } From 40fc5d623a09ed7a689388d3caefb8eadee77806 Mon Sep 17 00:00:00 2001 From: Gregor Schneider Date: Thu, 5 May 2011 18:30:18 +0000 Subject: [PATCH 301/317] [fonts] - Update Dejavu fonts & documentation to version 2.33 (by Jon Voris, bug #6106) - Update GNU FreeFonts & documentation to version 2010-09-19 (by Jon Voris, bug #6115) - Update 3rdparty version info including recent Freetype sync svn path=/trunk/; revision=51594 --- reactos/media/doc/3rd Party Files.txt | 45 +- reactos/media/fonts/DejaVuSans-Bold.ttf | Bin 584396 -> 672300 bytes .../media/fonts/DejaVuSans-BoldOblique.ttf | Bin 524624 -> 611212 bytes reactos/media/fonts/DejaVuSans-Oblique.ttf | Bin 524396 -> 611556 bytes reactos/media/fonts/DejaVuSans.ttf | Bin 633604 -> 720012 bytes reactos/media/fonts/DejaVuSansMono-Bold.ttf | Bin 302868 -> 313856 bytes .../fonts/DejaVuSansMono-BoldOblique.ttf | Bin 224160 -> 235848 bytes .../media/fonts/DejaVuSansMono-Oblique.ttf | Bin 230244 -> 241972 bytes reactos/media/fonts/DejaVuSansMono.ttf | Bin 322524 -> 333636 bytes reactos/media/fonts/DejaVuSerif-Bold.ttf | Bin 307596 -> 341072 bytes .../media/fonts/DejaVuSerif-BoldItalic.ttf | Bin 295360 -> 332036 bytes reactos/media/fonts/DejaVuSerif-Italic.ttf | Bin 303004 -> 338776 bytes reactos/media/fonts/DejaVuSerif.ttf | Bin 330052 -> 363200 bytes reactos/media/fonts/FreeMono.ttf | Bin 495612 -> 343980 bytes reactos/media/fonts/FreeMonoBold.ttf | Bin 254864 -> 173608 bytes reactos/media/fonts/FreeMonoBoldOblique.ttf | Bin 196020 -> 169936 bytes reactos/media/fonts/FreeMonoOblique.ttf | Bin 287732 -> 208128 bytes reactos/media/fonts/doc/DejaVu_AUTHORS.txt | 8 +- reactos/media/fonts/doc/DejaVu_NEWS.txt | 84 +- reactos/media/fonts/doc/DejaVu_README.txt | 4 +- reactos/media/fonts/doc/DejaVu_langcover.txt | 26 +- reactos/media/fonts/doc/DejaVu_status.txt | 985 ++- reactos/media/fonts/doc/DejaVu_unicover.txt | 82 +- reactos/media/fonts/doc/FreeFont_AUTHORS.txt | 235 + reactos/media/fonts/doc/FreeFont_COPYING.txt | 674 ++ reactos/media/fonts/doc/FreeFont_CREDITS.txt | 582 ++ .../media/fonts/doc/FreeFont_ChangeLog.txt | 6325 +++++++++++++++++ reactos/media/fonts/doc/FreeFont_readme.txt | 4 +- 28 files changed, 8660 insertions(+), 394 deletions(-) create mode 100644 reactos/media/fonts/doc/FreeFont_AUTHORS.txt create mode 100644 reactos/media/fonts/doc/FreeFont_COPYING.txt create mode 100644 reactos/media/fonts/doc/FreeFont_CREDITS.txt create mode 100644 reactos/media/fonts/doc/FreeFont_ChangeLog.txt diff --git a/reactos/media/doc/3rd Party Files.txt b/reactos/media/doc/3rd Party Files.txt index 11cec93f2c2..2d73e925757 100644 --- a/reactos/media/doc/3rd Party Files.txt +++ b/reactos/media/doc/3rd Party Files.txt @@ -3,51 +3,56 @@ Files synched with Wine can be found in /media/doc/README.WINE Other Things synched with other projects: Title: RedHat Liberation Fonts -Version: 1.06 -Actual Version: 1.06 +Used Version: 1.06 +Latest Version: 1.06 Website: https://www.redhat.com/promo/fonts/ Title: DejaVu Fonts -Version: 2.31 -Actual Version: 2.32 +Used Version: 2.33 +Latest Version: 2.33 Website: http://dejavu.sourceforge.net Title: DXTN OpenGL Compression Libs -Version: 1.1 -Actual Version: 1.1 +Used Version: 1.1 +Latest Version: 1.1 Website: http://www.geocities.com/dborca/opengl/tc.html Title: FreeType -Version: 2.3.5 -Actual Version: 2.4.2 +Used Version: 2.4.4 +Latest Version: 2.4.4 Website: http://www.freetype.org Title: Mesa3D -Version: 7.4 -Actual Version: 7.8.2 +Used Version: 7.4 +Latest Version: 7.8.2 Website: http://www.mesa3d.org Title: GNU adns -Version: 1.0 REV 5 -Actual Version: 1.0 REV 5 +Used Version: 1.0 REV 5 +Latest Version: 1.0 REV 5 Website: http://www.chiark.greenend.org.uk/~ian/adns | http://adns.jgaa.com Title: BZip2 -Version: 1.0.5 -Actual Version: 1.0.5 +Used Version: 1.0.5 +Latest Version: 1.0.5 Website: http://www.bzip.org Title: Expat -Version: 2.0 -Actual Version: 2.0.1 +Used Version: 2.0 +Latest Version: 2.0.1 Website: http://expat.sourceforge.net Title: LibXML -Version: 2.7.6 -Actual Version: 2.7.7 +Used Version: 2.7.6 +Latest Version: 2.7.7 Website: http://xmlsoft.org Title: ZLib -Version: 1.2.3 -Actual Version: 1.2.5 +Used Version: 1.2.3 +Latest Version: 1.2.5 Website: http://www.zlib.net + +Title: GNU FreeFont +Used Version: 2010-09-19 +Latest Version: 2010-09-19 +Website: http://savannah.gnu.org/projects/freefont/ diff --git a/reactos/media/fonts/DejaVuSans-Bold.ttf b/reactos/media/fonts/DejaVuSans-Bold.ttf index 7b29accc1319396989cd62666c21943e311b489e..0f4d5e9d484c3b42f473956a1d5726c96357fc9a 100644 GIT binary patch delta 184230 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 diff --git a/reactos/media/fonts/DejaVuSans-BoldOblique.ttf b/reactos/media/fonts/DejaVuSans-BoldOblique.ttf index b5440d95e79b7ae5ef1d5b665c40bc023a61d3a4..48f06a863ad641f6670b098fd87ca98c67888568 100644 GIT binary patch delta 168316 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%0D_6@T&tAZ=m``Fo~%fMGQ3W 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 nUUz;e>Ip?*U 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 B?|}dS diff --git a/reactos/media/fonts/DejaVuSansMono-Bold.ttf b/reactos/media/fonts/DejaVuSansMono-Bold.ttf index 98bb6f62e21a97a4719c3b6689ed9b4507580c6a..09d42796a1e306e55d3d1fd0080d90ae8952d87b 100644 GIT binary patch delta 49363 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 delta 38162 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�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 b^QSCm@J+lE3mWE5Tqxs3nUmMq`l|i{SqbXE delta 27942 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

NmaOH@)M@eT;sQW(9edS$To-rk*?2Yv0g1h-j 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 z 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

_G|0J&$YMV`|JnaNX}wzRH2Q; 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 diff --git a/reactos/media/fonts/FreeMonoBold.ttf b/reactos/media/fonts/FreeMonoBold.ttf index 3dbb7a9ac76185e8a6878764e10c404fa5b0cb3e..3bce6129aeaf8998be2af0fc1f7b3c8c406cdf65 100644 GIT binary patch delta 80982 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 ZHE3Q<|0e%0i`2S*l#GtWj=J?p5wr9#WpsS#`y_ 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 seil$pNFo>b?N!pvWFJcb%P72qk|T6 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 FzW|9~=q~^O diff --git a/reactos/media/fonts/FreeMonoBoldOblique.ttf b/reactos/media/fonts/FreeMonoBoldOblique.ttf index 1776b2cca9405a1d40238062a3cd2da434a164a3..ffcf71a640faa48e435310d7c642c47580812988 100644 GIT binary patch delta 91004 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

(*QifgftA&;_!+U+oAq; zFh~rfQGiu!PjN0T!l&yV8~5}=qFk>)v|&2{#PG7~U1NOkkmB9VWGtFU#feS&VLNy+ z2ZRBl;D~;;xvbcDh1i%uo_PJsfe8ERpMQN{4GBqhshu0;XC%pI{^QumMu^$z7g&vNOboww0-um2O@c2-ly#b+aW5qny+`IH?&@ zEVQ~OM)S;FLEi{aKQ418@s&QUq`{A-tzMd9R5NDlP;Y2vMLCU5m~Wm+n{APNGuVf5 z)wV{Mft6|-JA|bxl!Ar&kGAeH=bG-?t8S0;sZ88`LH(}Z8dDQHHq>1V?b(D+*QrEf z8%q0#$b71`r2W2X7?|zQ*b>u4uFYwjoNKVDaG|9AB?!SOW-Sdl9_=sgfW{1~mDBba z5hr#NLQvU^+TPY_Mn$3Ut!NnobMt$|r4yRWrCbX#6H~9711f2Ww0*IFT7{Cow4A8Zq28(F3W9icCIxVtR&phIz=UMx!_qjCFOb3=E@qZHBZoH0UA z^Ipce#<(BN*L%+}-dH-DDW1IH^mVrjO59ijlexU;U2M1W<3x!dTji)TH{E-meu3SY z@YkSnWwPBpO2_abu&|*)q)905bBIewKEc*5c z|G3O=7ul|5{&umtP+i%l|6!Is8k=_f!D2QXeM;Ktas6E#r(Y6rD>cUnMe>PA^vP+b z+i_6_h(zL_4#wlLkUxFL+Uyb}u}XhpB;OVEhXN5d=mdk2a60THogWVeneCk4VNq&Jc3 z!*0n+NOeLC)=5h4t&j(hO_|dem9C^QZ`ei|Fw(6mn+)?NnGM}JG!RLc0^+0!M9nTd zJoKUX1^)qdkC8mq-}J6CWUO-P$o6cUC<0qT(A z1*h2~Bl+8J`H`=b>py+d+@mmzxLD7`Jsd?o$&yJ@r-J8nRrxnX99xMJU!q0ofmt2N zi2SS3~)2!6MjL)5{nlL8)K zGp*SLB+ROo;L!3Of-+a_{C+qo#mtA+De)i!qHbwc_J77SV zn#(-1+!(iVuyjn+YeS~X+X5s+h1&J_Iet8X9UoDbWz9%c76!f40RITfeQV84rju`Wfh)rdUMF< zC;TKS#k}KBG<}HYn2;Qi3bXFMeADhBmjOM z#0HdPr7AE>m`P_CeJgKI;t!j#s0e1FC7Am*n{CBBp7;bms|*bG4-buvnzQR`F1TFX z6PU<0f3lFhh$w6-lO2^Sh3j{*+#xS)Pww#Ex4eX9SmHcNnRma$Zxs@Yv`*mwVOtO6 zXTgep0o<5QL1kJpM^58_IS|s%+F-1s)Q5JIVD9IWe9dt#we4ggt6U1iP81Qlx<{v$ zEt@n1$sCezU%yt(_Q+4(^2WQI-CyPk{iK};4xQy#iwveUD0A(aDhY}$80)lY&tE+Y z9ncM%IqiQbk~HJG$OhS>K@y;r$$8^%OV4H%|Ktvm?{hvV=oAjUWD&)0E0o9qw?YZE zT9qla=roAvxwKQZ1(9NdswPUm50b~(PLo~L!42K)K+?CR=)_bsGu-786>;KxEh<%_^Pt1fizs>hx8HhGP2t`v z-QV)X!H1yEZ_c%1W|QVu8b^VO@fl3z7AXU)uL4vxZ~%_2+0hj*8uvw`akq;K?DE)#BiWt2z`3?`EA@YW>$vmN`q=MS+0^y* z5}!QZjUdcX_5Hf9HLOX}Acdi}-I?PX1OFJxA9jTtNg^rS@5a0rtAP1$N^pTjCA3tD zLB%ygGN0Y9=JJLX=*!Wvgvv;>ghPx%kcQbEl`ER?Q(fJxXm=T0->TmnLvVRLX{|3sjbcmDaEzM ztkTkqJMy--*IX{-AGwclzQv>-@%^W3CUtY~Dd5W?lw%Vt-3T7WBqVqSWjaHQ8UBJj zgVZ>nKl5+Q!I50PcW<~QJ{Q(Pb032v5wK|kJ;+#wn^8uJ?qWLA?`gR)&h5@#FDW+D z9_WYPM$}dR&fAuP(4ZH3>mzTU55x*|WO(G;yJ(l!0-gjBfC(RMvp>WHNmjQbQx(pP zY1z&@C*&On<}YKJnXi`7P?t*b-D5eZ!_Je5YQCF%AS zWO=Py1Xl)44^b_VwNH5|VwxI|H!fvcISY?W2p+{p7axUq1JNsTAWu%bxE+qG*Ta(5nf^dki=}nc z_xc0*s|=W2lJ*knSjv$>)8`Qgz4o)dqG%hcwV9RU5RIhF_|ZFP(ew)m-3T@OrZ(Ly z%V#PQhcJh4dI$I^G0zmx-o}1>y{`ps!AnDEky~M12Z^?BGdd;=j(ph_>1%DiGNape z{I2aipoRG(J}TD5SQjRdA`o*@BH;!m@Uq!`$Cqx z3z)b^=91|N-`Mh52v1?0~8zp@bbaUe#h zlkFEZ*|K|r`>K(F-4#gR8~X_K8+aGafq6Gz0+fG~cQeU#aelv(^yNB+%ZD`bb@r?w zHo*I|LuPChwRkdG(M;O%ZKhQR8m?JXO`VQRo+f$y(eDv*eLYG$NBqL)@P++qR@u7RQdvzWel549i ztH-M%*0Ss*GT9zqZ+~TUOt25{!9$D?AP?6ERRns14rMIsI7iN3>9#P!*n3x; z{`!&k-XQ!69SnDWfH3+wT0FeW*E*v4>m_E?dP#KD!8j~4!n1RYQ$|5T6~*Wm(wVxM zL3W?wxLdY2lhfppqDCpnAIuk=iAk>|%6jhntZ5GMbEHp5%5HZ0{K3c*w6)Wj0uYCh z36IXWvd3nmVTrnbj!DVvkh2(0`6bb))Se|qX5F!sMHHO89}k5kiN+sHIkN#vxH$94 zqcO*g#)=948&B20|K2W&b(wnneU(})la7(S$fm;4SAN}}>N_w|$}jG}`#>?@GgVHw z-}sFs*U4tW(b@IvEgQ(n-@P=L@W;A_Hb(n~R&SpNR;PJ;{_fwo7fC>^tICkpyg_56 zJ1z6Z+QtdYixyIGOVAfhzQLU9M>#hZj=VA(>~xS-EhOvTcwc`l5RXSABxc-bM<5tXCF8Dh86@o} z1zZLU9@70P=W*Wmx_045oi2!#)Rw4i5L&6sl#Lp_Y8-6I+2x2|y>Q7+%#57CfWHmd zP^y34iK7UUPE`&uY=ak-b32(HZBnhb8e~wS=P37(*qvvB0wk#_Rt$~;7)d12T=sV6 z?E8^i-u+|j`d2tP`;_*U!m~t$mFJGe)f-1S&rt@hbAuo&hglMa2(mUS9Ad+}p(BRj z+MWPIqAfX?ZN{LLLr%ZAPeCdbKl?lr-c|mcOdS_6sXLm@eCqvAxASWyQnTcU*jU^q z>z$#@$!w|0xLr;SkWXN(W#Y4pW-pK9r{b^HEhYi4Skfnb?GBo#3GSj14P?E9FInpF zqNzM7?K^OYjNtOp{`w<7fF0M8-O7@k1H3xyqgKbIH?;iS&2nXJi>fB?E`5-Sgy7Dfe$|Q0fb*fR~L;%GHXS<%GJaf<0L=4 zZHc)@C z(N%+okSKLVq97Jaqs5m$F*=y<$)HCS%Y5i@M`sT@J;Nb?KGQi|=+FGZjgNkF;TAH< znPh4(=oT{N{ugGV#lC_+6hg#KTWy+CH|+d3P)84wz}3zIqlk5ohq%gjVYIvT^ay3S zmv;7rd^J73`qRot2wxQ2$CP)Rkn@R0lP{p{$%da?TpOVcrvJwIWk8~)*IE&{89 zdF#^Zc;n!q!_rl0cAy7DTRii4c#mRf(i4R0N3VnO48MXjJDY?isqDDq@@~7FJ^)M2Q=E|au-NfO^X(ptWgR!D(ZL88rCw8>*%#?>%nbqN|-Y0IF@%B zW;VBD$%J^!c+;El1+_IA9cw!!oYmiLzNB`m52^692Erz#aM?iFW`^%Z=9;IqZon5$ zSxZ>MDvon&H%CdY`I@JXG37bHg~;&kTUqz97>D1L9_67$;CT2lv&sb`|1a`3qz%9soYD+)vK)x4Gvvt6ZxAx1+S!1f7W(oI1r8o zX+1L3IXfTmkIaQaePi7bDjk`>enGU{E|kbfse#O17qoEIqyVM;AAqmdT66k zoLY8oL=~T0y|n0>Lp&oo2x29oNYpIz&zq_!eC^!X4!iD`o6y*-HqWs`9>oqhM;vv2 zL3TrtA|mQ{vSg3EPllU4K=Cld~Er zNo$L#E2p$zwJ3b5_9?Mq)T}$_yd*S`3ue;w$M1|zgv0q{I9f=aO;8-ZP7i#Np3&Lk z)A!j>uF;`#YbzEf4=G2taQ?aV*PQPw7TQ8tX?mgc&Iu1LW#7j6`<{46J0-mc1{R|0V6Di<;I*#0d?{Trb;y zNw2nFZq`42VW_tL%%>Zciw);~$$c|KnH?j_tUrraK>myn1%BVX#OvpI-47T2<-Wu0 z%{1}SXSvds6&+e&B9)k!99UT_5=Vwvp)i2M)5>;9S*;y5X+>1WP;j!+fr&aFqX=5@ zssm#&_NQXOW&neA!EhlX*2kER=k#CdXonxO7bji+O8xGORie90(+*EhJs3Pyu$p6RVI8D-lx#I zJ&Z}t5B7E_d)4`vkg`a#6L?j)S;jSCQ+)2?OUc{k`243+=~0`EMfn2OzDwRRkW@9z z5ED|#26?9*{H@(LWA9_H?VDjTw(SPTSDR?Cd9Aeteqm#Qk1m`4xo;(3f7%Q4^%wqE zg|;rC**6I>ZdLAnMRRbH5Q8bQ#y5Vx7doYZD${?MTs7oNHn| zb+e&Hk7Jr|VK$Eg6{Y9jQPG{Rjz-Y-&FILeLS3}V_!(eTIf zUi!OV7&o-$KXQ7X?O`os@%4M{r=)ZE=}G=-x&6}* z*iS3=)2rN>2iiaV>NS76YJcl#YS_mb=TGcEFlNpmGpn2IKW;o{>Ms|ie{}GWu^pS&f#%r0;WTe) zOFsSKf0Z(>om`3Vbk8;553};Esg)xNBhj?HesQPhJ=$4J-0cz|0z2B=&okZ1gWTvn zNC)5Myl?N|nf5EOJGIuhH7i}B8%en?jx4VpJapUjH!OMjbR7U*kRuP>h}xcZK~A)g zM7%4V0XQ%qKbKzbC}(g^dpU;w1G%raWzb&U3DQ^inv;F z(V%Z-kq#VT%Oqooj(At+>M?Lvo;3BDtR%!%tWbFJrrgE+)Y;=FayOjzo`i}w3JvL$ z82OedX%6pWhE^o04=%5{hR)>00~<$%(hJkC|?Q;Bi>_(TQNcnWi#d$o&FhJn97xqFr?Pd z3U^p6Bo$&no6SKE;WoW?Y&*N1AD_2b-Y{Jav$lheULSF&ecwYe!@0%8M&y*aiQYzCh-VO5{H z6@1dx+`K4PXu>oFL2Qgc6dD+kLxkXNt7yeE;(Uuig!i(1WqtV*IsfR=Sp9}iY`D2x z{gt0ss^vRko&Ce>Yn9C|`cal+oxd;=3RjB!7f7=dB;HORv^1HCUukQK5@!-!diD*R zyOJwY%~ig!qOLL{`B^HKWJbtWP}FS$oSQ*ruGP`i$*8@Ok$E9wD3mugC{*Gn2*SIX z-D`r;oR_~a*VbjM|L7C%ch>6<|2{X;*Z&3n&h^Z&rntn7^uhK4{@m}w89={4{2r2y zJirY+fLi;GQvwT z6PtxZG89^BC;G0D3Q)^oLgl;|8rcFgvw_)$ z#!n8_!l^=`BawC=eE9xjcRu{+qei6hnx?4}mb%a}coQMfWqHluxh5Gruo(@0z#F_^ z6Wt7cp05L=dxMAdc4hG5(1m7Epzv^!*(kE*+?oB*Sk#s-qGU$RZWV+#=W^yQ=kDN8tcl|zw)U{EuK!tq8-;iX0;5~Gmusp;PrdY z`C2`kLc{+Aqjw!g5)QT1;`g((Rx3>MO#RhX!dzosG&T<=+*pXsBYMhH#?H8o&3!$a z`#J)s#vIlpjkmX%%hvM3QPAnz_UuA+Q%+E`!VQI_GT;~Y*d?paUIe0nWxQ&UT(%5ImF zNqza&Fxd>p9dNrYzp%1!E*YWS=VIT)FZIu6A`{7>Ox(Hn08^y(|Mzb>fnG;5rycO@ zqnH0@Ur$G{HxhkLrnYc!WdGsm%HsNb49-g?Uf1ND=>D*Kk#}z z{prE`C|&fl4~$+EBjb1SKmOTL3~oRC@VV~>O<1t z%G|1-Td>NS_*uEQDktjLNlF~j3+?NSSJIp$_tqL3lxxm%flpA{C=|BzMxp-YPe)U> zcpmy$C-m<>J(AQ}th}Hy?QO`J&kQ9s!S227nXW(ZnOkb#Xe)%$gaPGyD8{YQ@QlpL zamKwv7Y}TR$9;t_G_}32vW6hG*UVyj#QrgDf3|(d{&7Q_qwTp!_(d{7xJaZ1By*>K z$xAxP9^78eY^ER3@jF8~YUSA4AzY$;<`Ojy)aH2|gibH<(VJ(c3?)hO_>?ge{&!zXg5{r)u)RHy4tws$*W??zn6Cqfl* zU*WIVU!C?nnZL4Fvn}5FoA!GD?qBn|_xmvWP&Lx0pRRw--fi68?eFc~uKx548BLAt zY7Ba!J+_LC&HMeUO2wz^v!B(I-eT`|i@n>`pPnHHrFXj;vp&>*H!x1T?)|==<(K`v zHnvyUyWMT?cH5OF^@Iz~xEXu5WqW;-zj}H5-EOvb^M2nW%zE$kgU^<0r`=QbZrt?D z+f_R48TXLA+qDt1w+aLHZr<;=RRj>*LTw-u_5^8opEm2B*I}Vw^Lm?$&g~laK+NbFK&b;ln@q~*ComtpgMs>I{%9jE(^~Sbqk86Z)tKz%=!$2wF74NF;=Tr^?vmB_MBXUcz3*XKx^j^NS@l zYW6IX{+kMVExzg>{@f6X_5*I(8=_l`te?F8J~uWw90(TaX*iaz?|yEuSED{|&VfJK zduS=1m>a6hr*j<>eLclew0``Lhw)~6 zr&xEdx3`M3(Kh%;Qe|YiNmyQ`?HJZa3?bVATXxVxabhDp- zHq&|=AEd^G6Ovuzgy0?H_}lyfG7%ur@L@3KaQuZ26I0H`@rQn7ZhwSt)nI~BLJR&2 zGfd;xkwDTJwi?DM|_VfeAWhj{R-X6icknM}xm`k6l| z*FNoKC?ulMMkp#zxl{4TQz!RYUu-YM#HW)l-8BnV>!*~hoW>ag&mTA4g2ti=&o++F zHm7(DT7*%AWLFFxKB6%n&$bqZB^XbGq1MFsJl`R>e)4)Y&<*0#ZpKlTQyYNj@e_)9 z8$7l$)Qu(ZTx2`xSG3F|sj5f6J45Y2QVL zJ#pnx=7usnN>Sd?K6?NFbW+Yxs(e&K?ikWQ8Quh=n^q!vGd|lM9ko1-4p5niF%=PN zp&+l9&=D=fDbt}x-AHLXt6z8-_1gN!zEG@vvaRq$X~}caltutkwY<19=j9Lf|4jY> z=6lLS$yKA@nYO6Aaq!a4s`nkmNkJJ!g|GHA#%`17Ag9n(=^Yv-#)^Arii0_b0F3Cw zC?t(dFM$OHczK_mt}?{tjrOEVWwN!V>d~AaVRBIpg;I68MSm`faOn#lL@D<fLq2a;l8Sjq*>H%t#$$9>ZKY#xHuCI%l++pWWN$^ZarjBHa z$AHN1*>=NnljboRG&q+eU!8#Se%DFFoDTGW)lpi;MRY4_zwP|MV{&I(D?ZjyOCmF?URaC46bS+h>jU zbolm|cghc0GN9Rwv!`w`sPY%JYRCTa&iZfvWnb;E0PFT3gwdXQ)!yEKtGw+ijc}l? zqYl>H1As}aN9a@;_W;|m&EF!dF7X)!u`p1g4|=$2@30&Ydcw2wE7^t9Z#LcxKaOeUI{8JXIgUazlwX{eT;9Zi8e z>g*_wbPsdtqy)X}d;;y?ud}NJSzdLg@!tkWE}5gK)H(Xp4f@R%G-G0wD}S!tzc*Jd zj{=3YnFJ!$j6qDb2Ew-dWk`_f0Bq<%XQlpzFCAq!^z5#}?*3I@oKin|%SHCCF{GKt zvi1Q5SgU&~Bhebtfdjy3bX+_bgz3b?mHQHv9}cq9+?Q#Q^g)EJu%Sf6!O_h)5UloDU6w$?NdEsBAp z;5n&?LN$6%-B|oAVTse&i|us?3^tq!Rl}wpx&fWEv)d#9CUULm1wr{q?{8<)LzZ?- zh|*BFMizh$C~aAQ4}AG`Y#gE)cM|x8pB|H7o6YxC5(_fzm4dmYui(AWdxG>;qhwUh zMmPTZp5{-O(X|4$T+NgP9G&dhb^(WMQg~>^Vc%K~@X8lt)t~g0n}3#|t=0JdOVB>5 zI)#IprVokF^UyJo^)<+g>OARc%UWI#ni-CFPuVx1P#EGE^Vcl-nO)&{*~Y1_uCaWF zc`xa6%nKl*?PQV=B>F6Ksw^K|6Np2iSaEp@BkO@Lb&>g;_;AILPPc2zb0{M$8<>U$4fXWlE=D61SXt^Y%WpD_jG*WH*>`a zWGC(~{RxFpc7Q?ZKGqSY&tJ2PN+B>Y21STtDOOY{TBNFVMnI#h&TD1F#=OUGo?Xm& zZG!SwsL$+xZ+-1O0M#GG?9VW$s_z+ql(hpCeWQ16Hk|Go-bh$?c7st@3CHCTh^$&x zI4*)5Fb5Lo9`C5{3h$^(H!HR)iw}#V@b~BVog!U+2@6+`p3Ugsz3Ly@4Z__Y4=|l%~PC@BjR=g zl{OtOT}rlmI?V%?GXj^V_L|nbyy*w`)by#w86XBnxj=>@4*X~bN@OnYO~beT`Vm;E z7q{Ph$_J2Mo|C*W4=yJYMTlkOWo}xuT@vgE-L#24DLiUAylYcRUsk|!1JOhhOPIIp zL~{h&bROa6fk6+M?FgQ32|B;XI*avt|K?HGL)61kp5~l%)3e44Of}1(_QDzuphKt8 z!v&{s#_N_R-JJgqvy7Gf+~1twk@R*s-mYIF8zNMh|4l92Dzo-D>>(T&RbRD%QUDaLe-0N%}wOkMus`q|$Y zatAs)CS$q6=5+_p1cukw4|k3aZ@xPb>K;jTWO`=LZWOccWsUK95UF#%$(9@EzIakw zh&=6?u;M5ttV>fNhNtwoA>ROhMLz;?d4qm(60cJ&ymvagKt0B+70&|x0D}d8Mk@}H z7?@lbIaOqe?Fe?s(lKi<{-4i~65MYvjO(5ARAS2RL+yhw#_qr|1@!;Xw#*|?sg|Fy zG{Ro9Uev7dN(}Z7Nn90f4resv3p29A-pGXg_faSk4VdP7>$H4?2Y>V7XTaQ8leby6DGHIPL+lj?OuT!pn@SCqc%TfDBD2cy_%T0j!7M(lQ*?D~c|rkVJj4 z{>R@wgD1dAijnEr&q)ds)_|@z#wYA2!zg%R3_i;+V^JsPB2}6 z;`dhlZZ27W_xF~FXjEVuhS(LwPyR2=k=BM>ePg%^;Ld>lhqz_iBRpXJ;8i0Bz#%+~ zzGbk@&;cd4(PNju+ImjIx(;HlKj4d;ip7)Z;;3k@OUoRe8Pc2wbnx_Hwyt+F^ zpvzh&jF_9pGBGS}n$6@Satm}d_i9z`hY6^yeZBhqCopf^dZ%}P?EDn{)3`h4KImTe zG1==~cEf{UCgubKG^I{uIjOo5RkWi9{Jzj7{G0Du3w0e@`F~v_D$SwP+1Kx%K#1QK zc^sEQ+MIo)A?JMIQV8rz8E9h8OB&Jhp_P)5k%sk=?>`56L5hUy4Sasw>KmXZt-3*g zZ(~qBY&+UTIcbNT1!B@{JnoD_D<3;DPhsGw9{rpU|zvavfOVXK10X{ayc-@>;LYtjFFbGM9RO5Q@Vh_0&cQp zgQ>s>?-VuL#`p8p?bS}y%$nnEyE1c$1ctKHxOWx@CTGn2!|7LwSP3Cv3yTF$Mq%8p z1|RjVl*jXnS~}45qdxI>ujk}GX7_L1o2el8qZLaM3$Os86Llce0eEceTBRvP}i2Ht3V$!H(gQ5EKelVI^U$1TsPC0=}W#6%*{`!R<^u>pBWS9wxdd4#K zZ~kDAgE7Oyyw44i;-^8CK<&XdnO7eX2-}bE(l`yb%u&`Cs7!*| zxXE^j08npM_Ol3<=YqTCVNqx8c;7dF%WA71Zgov?Z#|&a%bZ)A@j%ZQa^e{{Y^g_ zIK26@q#^qhFY34&Z0vD@{MT@TIti@2%I`;hbaRb;Z@rzdSzd}r7dmn}#P+BnsL)RD zGrLgH^AN(;ZqvzmPTI`uA_vU?waxu2+DM-Ek9T>OtlB=BZ4u(@JR*nfHLvbmug>Ct) zS+FVFHNy(`^Aw?J7mOwjm6JVt0a~$rA1I$3w0oicp}!qSzVoI`?AEn2x5jiE)c@(n z{lPt}-^nQ7#whP+l>1~YSb9rgDkTAy2LvoeZNdrwBx#Jek401K6V}y`9@{Rm0Co~3 zAlCAWP={QqrZQ~9)^(6bb|wHt^mPr7co52*Qmyj~1NG~EGT`FpKj9}c{*{B}`kQ|; zTi-qVpNo`}@A+{McQ0U+2ry z3si_?t_%f@*{aha-@K?(6X%8^nxuH-9pStFW#1YDMkwOPt{N7m-8KLIz)L@-_xqmn z&+hf^YkUP?$=3+Y?PS_eeKOD`-is5K`}ehz&Ti2y?Y_o+6?fQvn@o?5;fSn(dXUGv zXeOCVDaY;DRbz|mBW19y`>8#YfA6Cr;4C{oa(?2zgLf-axFY)^c_L7ITBbxB+t*?5 zoc7RsJeNL1z&@$0rRD9QDqqZAjEBmoQFtLS0-X*^nBy~{i_xOt0->DOfJw_~Jhq|w zKYb=wf9t=`*2=))tgZXC$ZkFrNO#Gzz51wD;?Qnu9A)n^-a_^`lCIIMU+Ie4wu|KXa3ijk29Pm zPS8%&13iTK-lHr;XSLb_JQUH?nPs8`cyN@{VW4Q#FezlpOqQkT=TMb z)LhAJIQ2u9hq^J~KV&8D_qxowZ}GV>M~^r^WCUAVA!lE0OMZ8z4F>?oqxvPc@4j}fA6)u-9tg_fW6oI*-ifsj5V%{z2CX~6^_#z z-FNVJ8&_W28lW3ogu(gU%_}dy$N8}@$~K1L%4=Jd0IhdD!uYEFy_YUScPFLI9a1oN9 zWku_|Pjv31W3!nb?*mDqTw@88@BH7HpRF%tobI!FtG~yArFy~UIDBQtD%RB63*sVw zReQB)d)2%@aSNIuI$N?+FAzwk(kA;#%P}|WY;0|2or-g0>)xzWR?c4=PI_#(Rn1(F zva(245nU)~=IEJ1Adf5lIp7SS86*$3MIzxU_7`bf2hFck)|b&N)3dxgRD*cdfnZ<3J1Mv9$Z!Hzs+EX1YK+Fr_=wl2WLSKtM#j zg#+C5=U70b2`QAPC<0@JSinS{1w5U14%g82;a0HnaSK@wQ={D;iwpCz(ss~&UIik{ z;z@rDf2Elf;IKa!NOZ>2sX}qTX~E!^2*0nqori=n>%GE;+Ds;W*!DoEn_?@h8vz71`8YriG(}K;SZIgd zEEYc!ixzCLlGj|d%>oIg?Ob-R)d`xxBcszZCM}^Fd8xSdfs*rP+&Cm+-5T3+pYK0= zda;eU#hnh%tDrV*8bG+ijow-7kWge0_~{E?Fc11z>UzW4ReY6iC$wM7HE)he7VuYg z@Nn(|vUUA^9+rixQ|_nqu+;9PgXH7|beaOv1tWk}pilWYObkK{wui*nx~uHGw5GFW z_;mLlGlRY-lpe=fdmKkluRos$x!}EC*6UAezb+`<)7<~6v+Vml-$_pGuXgJ9-^!VN zuKPB7{r7!~y#B&jy}pLAy`%m51$+I)-Fm&T`=c8AgWex}(thyLgnsaB-sr>b|Ip!2 z`+1w!_Im@W^1*jHf0}Wff9POrBqCOUj6a3Yc2S8;TYT}8O-CBYnxK2C2t=#fqaguh zi8>6oMnwS0E3%2#D}!R7wc%;5cMzMEEF2r3IVnh`n-|m^W$D2w438LOZIYT)pXWT! z<+gh(29{!rzq`YE3B50UzsRWGKzembj)$sI>bRx$4xz#TTM&S$Wpk9w-fKP(m|%$= zpCuLmdIj@>Y}50OcFz*+Gs$8;VZGCN3U=K^2=qtpYsi9!%{S>3b05YCa9W4qWOZv@x<7mh4*%e4kUIS z5E#zgd{G%xQLXh;q$yYRmm|6Jy_x>OKC9H_v)ftpu=u$Sh6GrtBbXekUln)*n~Rhr z2Wo8A+4^#)GhCa0$xyOu#0|$5bNNX3^QIp4_<{SLbMn=Xxc^tymnP4R?3>LjZ1Ugi z{HF8#>+kQ5^-W}=BS#8_NcZAE;3?-eo_ohr&aFQ<)~DP3=}ga!6lHGoJ+CbyucWea zL_29ahb?f!Q(_SxW_PSsx9JBk%l0^>?XhR?;?kt@G|dT=H=`&h2vcC<`OQ-tF&dtq z)-oN=UYOiJv2o~tRa9nkJM#j*dQUHys`0GI$V;CJudxXIC*=%|wF4o@0TSG)(d2-_ zm{)!Yd#XBf4)YcYtNvnjedkY8OOp$y!_L{ho2#@Pb%I2Ey~D{Px8MC##|ac>oQ`nr zS!YizrwijQYD9tLSS1-4J~VPLm|UC~TKmhf?z|f;7RII*0tt5@lgtzomFrfc!Dw<{ zts~YkTFfmT>gt*fWrE#Z(c!*mrI7Ta8Zn_eoN0Xu8~Y)!5=*{!`m9VY&XtEJ9t!vp zxY3033anFX@>%dUP-h{fqOc0{muOq+O)|7O88yC&lsY%c<{K`p-KM+}(4ZpVVfIyy z5)r5yLjIP&qBH>UHzsU{^u1}qHLDboTT7lC8ckw4JLarnM;1VsI`$<31Du#tx6|iG zv}bF++nK;~>d9|Cy4xA4g*rR)MbxSuy!rhrPaNu*0UxI)?Bxj$uyLlv1QTq-?vhSO z!pgCLmayWD0~S~`k#U}3mS-5pK<^;6ZH-_-RVo3CGQIW&c#SaewkNhTqMqMI#&8z4 z{!6#>RI-FG*!?lK@hLc>{T>-1p-&y-lME92;bU)N*9^K!R!c#DH=i5g>l9zR zsf27M%MPNhoz%^#mn+i*5e1~#c0OlikY+Ds=T!Ol7A(u=5=N+~ ziJAYKil%~WC1LDC)XYwM;*3&kq1M-m!LH`k4zx{;a;wUq`V5$KQMJ@|@*Tufvm_`4 za9xs(5jzoi)YaL{R21_bMrCm8%RNp{V0bJV+1lkhfB$sH)E&2v3?m$Ca^&5iF)+a|AMT#s^}2bJu1@n|#=mVT@1vn9v0 zQdI~^&B$pSH_3q!kBgD2s`JuL!6P=1Q{9=eu$U}x^8^bya)e>V6dKdiCA$-hF5hj9 zLGcQSt_H@{C$Bk0%5s~Ak^-~P*9yO@IZt^++4DF_%&BP=eyq8lgmHYr0f4)AO-<3m ze55?c>(*$m^FGzJufROojIjwG_cts7`5hkD-4#aa@tlf^Zw4V9Ps))LyVv##V3r;h zprs+dkP`=@BjBSsaW1>=e8pGrs)NlTd^)L_Ol8lrXto4l10x(AuaKJUdFt432?InEqS%rEFV zY97?iCxI*35N7FOG!~Hbu2mWk#Uq9L0<(1VV zo@(0lxr=8hu?2#@8+ivECC{i2Eh(?HyfjNSF%-tm7kXXO8TN-fEvH7x-TAVy|Aml6`IhEX)96PXT2Hj+M5_Gt8uq!&Z z5V-Dv{0(m68Rz0R%!Ps(=cB`J#JO#sQ%FZJ|2;jE6*||H`(o)x@1emX<>9{6kUw#9 zA&^PN++bJP9nOS0^2x-=sYs@F_zpstFbnQm=l*;Z3!dim-`D0x;YWCFvXsEhaL(Y# zARMoht&&s%LaC0Dq;7t}ddo zCZ+v?^N3@=7;|qtaP;vp_w;Xd`m-N+(xaZsf1mQxeAx*M7M*)fucgBCn>VheLJOPI zi~0Pcf9)yf^7#i|TF!<1#R~iDvi zJGLpfn3t^j*#v-R*1K~TY@@U*j=*ItJ+$`>0u}Qp`*UwCn^= ztRFsG^H-kMevo^-uP?2*L+4T*xuCyy@U|oQ{M*Z@z&XW=_c(7)h5IBz;Hg!=$sA7L zJcjhvQ;o^RiJ7))GiwM0Y|CP{AA4o%%>&LzvfN!he%2kT6uO+q z`qm#0;LV2o3zxqYj8wXud#_*3Qo(h0e}ENzEvs|{D{G{O25MP&OEgC&D9Fq;Di#$t z%QSOQ9|wg&6o-FnFBG5t@%7sBH`cSkklSbL!rzX<%XQh>|_mJkNaS5biZUsyKcvx#yyXwmv@SbatVV8a?ui zY5#ShI|2j6eEE*~`PlR`_B*k|TR$9hinSM2|2dc5aK5i28NFN>S^MdT8}V0PcgGW7 zYcIX_+=+a#KGJrdkM913`x*#VxA=aaEv?gez>~3Dsy2Erq41_^Y~uzN|5oEac6%vv z@OL}o-nU{MB1xw^?;HyRB?_( zWV@xsgSv&>Rfjz_wy6`D~VugspNzg9-Q(I z7Do@HgVj=YKGf+S$V59j-AZ=u=FZVIMi zA%V}M{9>p3XyrUU`e&A3#FX;7l>grZ5trBh;yX$`@UmX_*mhp3;yaeAc*Qlp@4f!_ z_BwyT@7rS6+;=J&f_(8l-s<(dlOIC&7u+YhH30O(1X2$Hzmoqrz{-d4qxphbu*%jz z=&90M02McdC*)jd)uWn?zU#XrH&PO>ilXL6WXp}2JTj>;DehN=7Z!;xOG}C7fNXsM zxGTQa3x}Oo)~=)2C}CU3Xr&Jf|o83u=95!47runk>fn1A1 zP-qug4@$xvrgjOC^ZvWmOw4gtTu{`khvW$+g<}^)4qu$ORS!O%S#?skpsP`tyt1t9HOr*zkeb7 z%G+gQg01xG6k*>J^2Hh5Bg!;&W$6REa( zbhilN+_;b4^a7NoFt)3f09IW_r6WOv*7&N5FVId&HvEMwL-s z7oqP}V?PWpa7&xTHt-QiaQ%A!z#%BL7ytTMv#o z3yIlWFxy!SbOgvDZGB+O8I7(j1yg;c-^doWzQI39d_QvcHurn(4Md4Z-A^m4uV5G= zK&Kv$$PiGG)Vt}mV_upXO+|Px`tA_F_R#7#*QO|RilJJRJh3jG4AR(Igtj{hz=I@K zuV2B{0Na11Tv|NnY)y|l!|sg-w{9J0Fg>|MI$Rt%Fy66w?&h-xM()xMaeNQ#o^xOC zd>;S*kv{4AbTdBeEt-4g_k%9g_yiCVF<1V7g!qtlsK9@f8s3TL3*DYrZ#QNS)T>d9 z8g!kA(4#iffdZW-aqEraj)2ESj?Y`H!v%>*>li1QX52k6&E3=`_{S1UZaGOrhRB!E z>jK0Mz;&5+QPdPU(eet6iQtlCmq1}{XLBYc&Yv(k^0gWrU8MF226LViz>NG`c++HH z)V!I)St18kns5edlEyL*b^wLtic<(X?{dP?Vk%d5{r8SOv8&wQ_1(^LSKr{>WqonJ zG2*z9ST2z(xv9%P9eCQh`&GJtB+B_{ICZ`w)ln&@3j@vv_22jSW65MhKRNoA;DQq) zmei!@P%VE8K)3@UX5a7V{H4tCY5Mmu6`gYpN;J9vB^A9fr*Pia>?GxW0R-O2s0V8+ zXSdysLEEoRZimNiw>il#(j#_xe)%9M8=PI9^3sH}7;s}j@4pBlIh{4Z`e90UMT+tZ$;0XwfXJOn^W%E&Nmn?7zj)V_%; zy#w;_l=GI_5x3}jAqM=zHWs+o?pZ*ct7_F@J-U@}t;mij&pgOC+sg$tt}~bxK>>Jq z1qJr$(JLr|>F@+Ms{)yS(hE?q){Z%Jv>qhIW_<)9puwuGK%gp@C0#EK&VLLXAgh9Ot;< z>P?`ioxQu_I&|Q>$s8S_xD)EIi;zl$uAI z&)fNFDPLLwvN=phc7AYtq1rB!ZvC5$9^L|@pP@#2OpPFdnr)cGV$S#y^BTLU-JmQi zB-TK6`*5&by_3vMl6^PI*h#Ij0i+Y4+^Nu~7bA2m1dJydo3D8gD{;{Uue7*i#)3l4 z4)cF#=BSo`QjOD_Ny-T4GukO4ZQ!tCLzJ$=LZX^DR7eH3K0E8Ig@VCYqLA2%&N&OA zK!Oe!k*$q6tSJzQuk$F+@)r;mIpU^#&u2UTz9N9#zvcA@IeLS>quCm-ewCt1NA_KGFDSq1M=`y?BpCAN0|o`0*7KA@XJNgx{s6#u@f z1GF)f8PnjL2BVWWq&bOjYPQ?Vu4_KG&ubBipVPhtX=Xv`{)h9$Tu{kiI*+(azYzk>Xsz1OI+Rn+==>_MxTc2KVDz$I7@0*oP z?l+mTrTr(gw*`}LR;G9n)Cax+}Bg0nFu%zS%fxu^$W3I9OHFoB{7; zWVTnUJF_0eQ<*MN$Wn|1qI2^o3(<_%q)wHm1apF2F+wqOr|j$S4g$@ShS!=)vMa6eiS$IByCuMK@Bx0$A(qFzVv6|rW9KG0N#yhv+tp8^(m z5IRL$XYO!%x4Np%vv7p^vF)qa_M_@DOnm_naGu>*F5+K^;KgKY`zJctY@0Hyu#OLU zbU9E{13aO~$7-6`?4zdSYwlOcd`grzVX-fcEsid)t}U5+45{rX)q0(B_!`k@UZtQy z(QBj&TSL*x*6&oEb!Xq!*Q(Bnd*jKiu0>~|wo#qRkg2ni%Pu&gMttj8qz=q>FtV?6AfCm@R(*7y5d2-9ls0IAQP@@4fVu_b z0i3r+#U1I=S2VXIYcpAe4yzb3@11-Ji~uKV z6$e!Qyjt}PGjnQH=AqI<*=7NU8_t6oI1`u&BE`h=?$_^g9;Dz)zSC@4jJoO_zVq$V zfLMoGJe<EC{b7P=$XIxYP=cEBJfX|D%_WyCKA{2iSu ztDY2pCX3`j^Ay%}=X4@&7e4z|k|49l3y1T%F2mJcA~IwHhuWwjm`_n!Gj@s zlgZxJ_NfFC6al0cBVgVjQ3%zfq7lUAJW2iAN@ zsu-3??q46~xmD7MhqB4iv?>F0wgKSEaNjI4?IOo4VmB|Yar+HmN$p^z0FRk_*DNu4 z7p09Rz?iogUXF4HxP-vg$5)(5B!*+j!qyK~oRL}p#ghaHW5*zt6P&RP9|%3*nCA8p zJ6a=DwFME~DLtgyW4nL7fZb%bI*o&K%|p7D0<>b?*`SN26^;9KH2?sta2Y3hh328A zd?B0b?4mJ=4at;MR<@>BowwFr--a0{zaOSe_1d+F~Z*T4LNMPW|XtnB736m3-Vb~r7{k%rmmyu zP_t=vkxH?fyA>@!;M5uV+^X|LdGj4sSiR;kSk_sVReZI)d~bSAXq3Iyq^^Hj4B+O3)_aci z9wOS-pgoz97-a}xLalsnd&DQ!oR`(0T>+;s38w$)BD}a zqKb3^)a_=5fVk;W``aEzxy05h-*!E5sJy~KKnu5Z?0_>9i1xhkDOwWd}`Ba`{H1I_~7_+Inq zt=xt))}6}U^gtk+=^VZM0={&NIe$~??~L|Oyw&I1I=jJRjIoTk)h1($rm7*w)ZC?n z0=Nla38NF5-5G9|AINxv+?XeN1F9pGu@c_n_+^`Dlc1A>zMeUN+3fb1Z&>R^r2?GM zW;EB;y^=*H*3eT4TRq<}yoi=R&`zX0wBhu+2i>jT+;Han!M+n)f3V?9)S~_Um!Ceh zIkpadb8U2Go@D(UO#C|K@VGBW0QyT_Ybk3tjt+?l@oMw+RkyPp!^}Fjj)k2lLgl@% zQ!rMAop}tTsTt;!f4Afq!eJDcv|D_+=G5d`pIWvOqXmVF13TTqskMUzl}CQeR_{S) zERY{vAKN;05FmLh=6BYd?QG}h*+Z4;a^FbD*x!wIjNa3GDwF1BeiTDL$G`KLKa)C>SKC4)D390nT>&4UD6ZihD$rgybJQ&rN)g_g{QjN zk%xuiPX|+l6*2W(+{t+Vn7+h3?2LL=p?swc*&|q|+Ocyy?U9=~wSHs(n!&Stw-5Wi z16s-x%g;=+l>aYh?;R)URo!_%_o>tsx^k`#)m7cqIaPI>p3u{igC=RD8I4dFAw&?- zM1!OfNEn0(G6ITd1B<~Xn5ycU8LZ_)cpY|avZ`3zL6=Odq(k~o8+{2VwZ-iW$+`$w{{6q zoDiOjDTwz;mWIGFCHC?`hBRnSPO+QU)hC`wTM*f^&5@dhhxZqyakN2<&ueH%+Zz*u z=2|blxCFW6oN$`qX*`I>lq7%_7wERbZ>bNjvafMvpUO9ecB|V70YL|B*)Njhw!L=w zuW>7%lE@RQKgj1dB4{%r(AurUi)2EY!wxeTmH_q@kvOqZOzJYoQF)PL%-3Vgju1%Q zq-bjbz89ioO!TNk&n=INhHL!VZf(19J7T-`W87|9g3huC&0?)3#|}r0CjJ^j$Rl}j z1Cuk-dO_!oD7$e`g)P5q8#hNIg_#myoVJ`&{ni)<#U+~bN^QDZCOiogz1tic0`$iC zhI-Xaprj*Jhr0nrs6J!#BO!Xl(Ztjgb#|kB+c~(eRkdQu85UHOv>WrUAAp z%PGWce0W2>w!SF9VQLd5n-y9LB4Y!_B$Wzv!J8vnl-N*C z;n}Np)EcXBGh=vUX{t&LUUOSjC`N@a2P87pk3@?^n(4+Gfwe^z zm?EQD^1WzhDZCKVUW$!8qpTnhed(2<1L9D?DZs5 zvvWI!qdZy!qp7{Bp~9$>&+SzoY}~m|^&g@DSD#4O=`D9c3>c9-0>`p&$wBeu1V(O7 zi6OCph1;S9no<@m4P~wq32!{G4@_=N$YV9Xo7B+^;akb&z~0H_{3%gbo8E#Dw{xKA z(wYGc%N3(ARn>(xlCxUxt$_>bp&BjZPdi=h)9lqvY2YL)C6?b=$^|fZSWh6E{1{A8hy9*4u0Mks=brF_# zCy?5BfJ}zUG(Nsx9jZUAzE#SPX$5`tt5^aupyjPruB>m{osiD5hW}x7(HRhHJdLVg zJeYaIx~qkZM@+m4Cb?ajp3&p^@wH!PFlO;5CQWRT5(Ok6*BCqiZY0wfJD_fMhBTJ0 ze5*S&o9q*g7(*N3^njdD!%q!&l);C~xzUfGn-)J8r&s&A=kbr8gb0DMW)1u2i0Tulcd>KLCg)-1zJP@-H-T_62(5|9D_^{ctAs{b(YTcmTqJ z)xo*Z{#s2NZvJ>Y77loSA)e2MPT>CjDFc3-0cR*H*d}FTLii}Oz9Q1m3F(h$2p^Gh ziTAh*TFO^b0Um%S(>eO3%dJ6n@ePupAC#?#GSt)Rl7tdD?}RB3TZKb>i2^C$4H|?R zkWi4%8|sxhNuEyo0Y;tImK!4n)p;AG`-X#R?lv$KItEGQ7_6{{nvWr3Uu_PBvWx{6 zS3#N$c2F0hQZi_@U{o;VYH&TYdklx7TMGMIS+NK~B$)F0#%B(yXWdD7TgT#2;u_m6 z3Z4YhW_Wy%&?9|JbwsIq;(IW{r0;?+c43CKF&!6(HUxrLT(VNp7z{e%2Q&wTG6TId za7evWysWQ)s{0UlUg=)<8i#RA98Mh-p*j;g-;~(M1JXK6(;Ch&5_eP*&P;&@!cn#- zIeJ071;kYBVPA~{ZQB%lh^P^_5VHoU7s4>&D=4;+8D?ZtmC7PZjOc@h)Cl7ITZhzy z?LOQ1`$MR6b>&0PI(BAc+iKs<$Oe#OT?xZrb({L`Y0h-Fk{o=7ZANn7f>!`J&~sUs z{)Jqfq8uSQ5apMsYW9#RynS7G8{2f?)XjAKg77VA9}15#8yk;bvJ{6t7%-Vd7)1gw z$_*B!a##+1a{O9JGy1v1>Wy{#D>{Y0r=PqjMx9V&pS52|ir;+xynpzrHtP0XJz(EN z0ncvhu^%T#b_w86a;>^Haj8a8m1c_AUKLmbC)eiij1)ZUpcE%p$!i#(7$d<8>PeSDyD{T?iXgdUUhP<{RTU5gg;`K0@=Oft*N%_`m^um$VAEj+ z@YGr*NQQJ*NamzPQlr|8&1j2wsk*rq6IwX@Zp~stR6tUYqHZmIN_BV<+p$fgRW`;d z%@BNe*1>GX{{l|7Zl`zMd@VUti>)Y zX03cBCv!R-=8F@P`jJp4Kwyk5xQvpD6XaD?^^Z z(vDczRVa9qy%RIfnv)Z9Y{|P?d21|BGS;Mv--X&-A!bN?Sm*3PNJ!W_Luts#QMbp0J3aWE$=-q;PQLAFtHET<9uy%yA9Pz7ih z1O^O;-!>VkS9ZW&-iKw#+iTJwR=85gx{URS!hyqF;|nNQB-)_y1qlijJN{rSAPN)* zo11s?^Hm*QmmGI8QPBlNv4V80(ADes`I-^G<=u-Y3ME(L4{lH&b&}oM>2kzAs>PmI z)RvR>e!&fV*Jd+lCykuo_dqwk%WkmGpO*b^ul-2yRhYWq1|DW%W`sLa6sk}Ikf~}V zB^M|0AIS-#z1qGwY3!<++4AAM=uXo^}_ny#LhQ&=^hp$x3-5aw^i- zZwIm?`GwJRG#G1Kd2M8Fq>>v^brQOeItu+$jLLjyBJ==RU_C%)NAw&PijsB#pf0Ue zi~)9ICwhc1nbw^FuBoj7R<3uvIKqE*c=B7`p22K1=PCS`<6W1lwxC{>9U*A1Jqh(K z$G5`Byvm?nWiJ8|hLm(h)Y~WnffLJhS<`^?hC0ID%bg5Bj5;QqctJ8w5>JHh1ot9| zr?6xthUWFas40|-`eP|~;0Mt=26N@{J15TLypI22U*GU} zcp|#2j%_>YPQ=pX$6S7YFyQyOA=~V$9*s;@emk7a49Bvm@^5P?eipN_Lw$@$7s`HA zWd>9p+oX{hZP!@+!VndDv*7XP}?{S>!u5Vp`RbrB|z>ytCi4>yt0wgsrkf-U_?+I*!drfDCrq}d$D*#03#XC90)C%(7 z^p!{LmCmT&qMrBLxG|qWRo!9zlT$|8KgAOh)7(sEhru6L+iS8T58ceCd-!x|_wie` zFLS402)a+ddYLq6XP0?q2uO!6cc_(-Smgf8q%Jx~&70We=5Zae6npH(%k|DJ#x*<7 zq>QgJ8KWc=TDt(6wib8us<5Bw$YeM6NIbE16abU7I-yDZZR{YNQM@($*YL?_=$Wuk zUDBzX9&-jFA(OQyb}=)uu()yJHhH(k7gl%eKXCL0x}%>CO80jTXo*QS{`ri$Q}r}% zKdbh-(z$%&qh}$X315Ac{TLcypWvq@so6~EFkCASo=+@&0!SRLtqBe>jXWf_o?N~w$h82k3{Aoefgn@mkgfmDNWwnUl^J! zy!W|-iBwEQXr^>aHsH-=hjW=Dzcjq#Ytd}F{PvyEo_b~^JTvmV*SO;p)gAQEPze>O zPx_bAsrCRaH?<8K_(I%N%o-~v2YY)49U{Re@vIhB1Z%dr6c%0!(vlkL8N5t1&B2)I z+8v42VPS=rR}Sd85o)$et~oawe88yC8JxaL?C9$D9Zubs7T|6@jwytEY}f9^h@D02 z2U59c)*ZchF#p(tyT`+KN3+Ry22;scD0U>CeyqK_Bvsy{sDVdN13RqOIwm&gAu&)g zc@5y16q{w6amXuGZAjK)lRSrJf!-;pHz`1pZSATG+M(se#9j}(VZGI`U*X>n*aPkr zyZC~1FQ=%DO+D!%7)6|GYUBX^^{C{G@^|zm^MPO@|C4c5jtVF6YL@nAIUqjH($2}&ugltMUUgWE z1jVaKY#ds9iopy>Q1jW#0)jpYYe$i!HtR>8tBd7Y4^kGQ`5;VJMo0Txzjz#elF{~E zR~F!{I|0(NOLhACN1QeN&6VMa^;7pIZ95RkP!{7Jx8396YAoYUzTni|(M+P@Ec94* zSk-THN2umWM|z`Q{Njc%ZQOR{wOWW@!{Wb^#UB@vO9{Q`SSi&x6;|CO&*~%usv6fR zEgLxC0UHF&di$yx?BwLRXyU}W2YNIzABq7v->p`G5X@#UU@9bp3iBE|Q?hGPyer4L z;h! z=7cMQdEUt12XFdYPWr6~v?AC@p@GaM5belmVZ zDrN=-9W0)~I%z4Fy*}zB;5E^Jl#|GwkT(KtbG(r5&r;>V^5lm9PVqeM{2A}u@Wi>k zzUszn28JhYW6noie{zR_*6#4{mLGpJm}fUkCsNtrZ}TFO9Z$aD4WT}Hl^*?ebfz+0 z=Rb&MM7?+Cea*VZ@vn(M3QTCiq{YOqyEYkwcSU@dssHpeWO&Z{wKMHMHVx}ph|Ce4dT^hfouQ0doC9yzp^2|VPr2lh2J6pi$iTdM* z;;Bs0^|F_ZrH13F+|U=>q#MfN>`3Z)&kKaZ>ETEwUsRpXkG*ae3*UeBWA+QMcy>xV z7J1~GiM`UQrb!l<{2)kg9XP?lkqi={5{uw7iZ2RfemEk0JH(PEss58E9434?R3fT0 zH8ZP`h}R6h$KG>h{3jpnX^a)`k%4?)YVF2os62jef8IBk|JXefx+wT_TVlqZzuYK6(M5^|L6lmS+nvIhDo@~HDXs*dByqh7;NQrZBHQp`Hs z3Q&|Ib+cJzuL{wx`kGj(S6lDCCzfWP8W;126P_Mj&*E7S>nevsld|X?kLoCmoEYGy`8l=8gvk(!uW$=JI>Y#;i zRol5T;T9IEOJ6u5p=bdPw)%;@gJCNahje1g$;{WTJ8~tPr7ewRO+Qff0a*}nq*2bD zmEzpFyqvk|uq@S;H!c-N=c-4}td0)Ne{rr_s*m5iq8`eZzxK0qgNX)m0Ut@~?C{ry zx2sCF{8#F0!yLy5*&DGiUWcCDD`vH>rI3ss28MW^&9z!N3{L>MXMl|P7=k4n(mX~rKu33*dWiq07@m0lQY1UWF`VUP@=4f*+CR0cE z8YdcjouMkRU~Q--whUE#WsP)qAj4v<0>3vg-#Lk2XLU++U~oo?b3w$c(>OrD0c45w z7EsALR_af)W@J7I?sQY7jy-#Q^0aEdv_zitdi&BY4Zn>Qzzi31BWG=$LlZe z%iGcH@NIq14o5%b8O&6ox#aN2m0Jysemt7Zlp^W)s7w6b^oZlf?PX@B)vu6fdc*uS7Bg8u-&Y8{WbUgb~$HHV%44lNbrIeV#v?=K+%WN7)*L-QT zqUxuMm3V0H!ep#EGT=Y6JXD#l4V0mYzj>un42&<1?pbujt3zY%o0dm1BPR!jZWu0< zaDOUa8%|TPoi9&kqH`m`@JS+QN}{5Mja2H?rX(JImH4-P*`;e?=3YfS{PSWh@%gv; z{4@6J?-n#u^!xncFPvZKLO1@PV*k1clz;bCI}+BJ|G!QUi5eN1NJST8W*ew z48cvSN&+b>o}7;^6;s2KzSTwN&?8PzZyn_!@=g`|&w`k^KI9PstQFn*9E-{RL-=&eM zoeHY|5v^D+`JdEuuR{-sRmQ;l=?sUzp9#L!7_ z(HokNnN;v*BqZrc-PpPyh#=j>CBozhAG44PNKN)7PpH>T)tBVRaEvAR8J1ihJuif5 zxk=vxpV$x|y-(dL4VN_sG64otjV)R5-T=4hBpuK!yOB#$Zuy)x7;L(TZ!eaqfQApQCz1FTp&x>j&*CGM#fT=J78#9=%^4{~w*-zXsa08)Zf zci8yt7U{m0i_~(fN5UA;Da2SimgsvAsoA>6dLQ@tfAqZ))DMq?&iR}r>;dkYERybZ zP!-1C;n`Zvxp`|~LToa6t;a5RZ||)(gEO6KcP!27OlR8kK>$uhu0eFHTr6$iOF@pF zPQrg0(rej?)fgqNnn!Y)oj0jVZiQ!aJmi{EAyzy# zJ>!)BHMTvh>UE(mc@NL_d7ceoa0+r?BIFdEuz4r}RBb(8c7|M~VtCTZlEAl|3BYf_V{Ygb=Z7kD27(eOR5NJnh|j zAWu??TSWi9Lk0rzXD4GuFiHWcdF3PQKEqj}Wy50KWw{(?tVL||ndyI~jvEC4R z{0XlAu)co6IwyB%MrvL04pa{*x`PN;hjSxHZKVK4?kW8K`kt1OV(3;cu0T5&i1M0p zVcZ$|Aqjbl(~Pb0)z?#dDpK$SlmD=@n+ibse{4U|LD-S%W*nI&fJ8FP*-}QP^Jcms zm&wm`ppB5R2$zZMG+OfMPTDj{bmTV`cW5gZlP6ZXZtKCiE--2bHOUkuy%_10##66{ zfPd%DsR>f-Ph9vLhMrKU z=M6o*y%V7xe<H)^RIMJd{)alG!e;l-B<9~g zC4^I*-D7RdiL-lDxVwFr6s58(`D6JDvyt?l@E5=P2C#q#4&Q#*-iH=ND0wCW z>-hf{%EZ4Rl=eQ6NRdogWM%#6>a*4D_6wP_5`qMXL`x8D?raQ?sL)5*60ATW>F1bu zqtqDD2F_>qfo(d&b8P+169^1(ZO35GuRFru&8z9g(Ou@a>R(J+I`5=KOb6 zC59h12P>7AuxNGHyp=#e+vG0wQ#P7!RJ&Nr?_;ITV_N(0lVmYHdjBXm#--Vmqjmkv z`E@%&t1_d>=H`)3t+|EmOaLmhpppIKVS(K(B>7k zDX>xs(mkOLmmcO7#x6K>-DJ|uvE3n1qv6nCUV+RRP-S8Z{P*}H>KW%1$ASf??^l5* z5-sFuggik=wloY5QeNPCG_jRxpl)wNKd8Nymjjg+xlR}7Aalxf(~_qzazlwV?rD;{|V0`TgEp-#`HDi~{`yaD@S6!AELV?k26R)I&H0;fo>BB=E zF5TvVs;@^}G#_zCQ)x-<8g^RhCtK3o3?=aQZ<)$oT%AL4H+Vn0Otf)F|Lt17^e$ zMeT4nkvh~isGDgZ|0!vGtwDvz#*CUIM$Ew_HD3MmigvozWd^+ZpMCDfe_m~zGNohB z(HE zDeLDL+s|;_$u0;?FGvb9Zd1r3l{=8O02LNgqLj^9VhBoKJ1OK@50G=!U0sa)!7e4t zNL>G2Z&p9EkEUkU=hPEiKSo;q-#?ui-nBK2>9?r0kzuXKiEF5)KK^t=Bu+VYE>2tb zsZPB`-Labngi?;#5-=IcpOC-aJye(qSs%N{Y5_iqw|X&bB*yP{>2f!z`7@+vjrLpA zy{ju`muQ~$O}`b!bp$}5B)p;>I;kd-0urx}nQcj-PfN;zdG>*~f&wjza3c5gbY~p! z%mX~t#VFX{xSj$J6tg?QRY054mzpKpj97`JtWy-0F3QDG-GrMYzf6visMGS&sAyN8 zYbXJErBUcL^$#2VN{=h#x-0G({=uYYo*b?MCn06wyGh$JJPQn;LTay@8&_ zoo`b)Cj37uA+LU$+9ee%UYTxz<+1GlT2xvt3?e$QUC*GEmgP5TZe(y#lo*B-+`?(%pJU%qCT>M%*J(@48tjN=q zhrPYYLhQHn>)#Fb6^HsWVXgk}2Zt(BHV;3J7-J$}MKiI2#{&@0wh$HrT{st#{gju? zuyiz-2biZJ?M2hcmPK0n1@({^NqU0hJXn$nftpBwAOMA=QI>30mj*j*-vw<>U?Phi z53z2-X)gS08ET3y#1n(g*$|2`ui|vMYRun~p1)Rt@3e%_k)s1L3|Z(=39UQC-#Rxe z6G(^{y6jPnhtwVmRn33-3u?;k?=6ou(r;H2hv(L+Loz`}=KRwS%pE8t-OLb=@-C+6 zbv(+Dw3KA?MKnpzkD*}Yd=#dEP_JIX#yxLWx1Q!t2^HC|(0__$B2|jIuI#5@qfh2G zo8w7(Vi!F=OwWWwQrN85U-=K-u5Q^YErV9{shuHm0=1Q{=i^+|s<2xRmLz2=VRqzN zD4_MVVoqrbOSSTtdf5SU{>wu3i#w$Y=6~uo1tX1iUiZ6Qg36Ig>J7EEIUiHU!R0E# zI2QDfUu9TOA&$rs%fP!Jq$oImL-2;8$35zpSMdqZ2TA_`zV zFs_+0gmKSIZ2BGQrRTU!h1MJAJEC#Udh))YN)>v9av;w-KK70pWx1E zE)0Ug7dTtXUCV0to$CA%?5c-<$_4-Jt6dasc^c7~wf?aSzJm*{=nH;sYlLH3o`1^7 zo)YnlE&xnfPC)$9yWuj6R&3&G6uYR{d~%1(UtG z{J^j@N7T7IE52#dKUZV6dq{lf!#&5Dw_Xq^veyNvV=|rTk@S`^f@kLpNy>1nS&?1% z&kZSzqE+_Y^!NBA7SNh>kV)wnj4TO-nUHVGE3D2^t+Qm_xY=9VyZAC$42%J(PFdAs zmq;~-Sa;1Ne=C49%)Hhr=3Z+65H+ds%3dx~!E#s6u|07q*E zSDQ;b_cV_KFs-&=2=xZy&7zF{9q(43s^4dk`0Gaa26W$GMx>P5Q7Wg6zTUv1Ua-0>m^;y?kD@3BU|dN`3N6a66!wMY^Y^wVlPJ zJ^mgjwud;&c3Xd7wM(-9oHW2vcmGL`nt__r|5zLCl(Rtr1wRGDlbs2OTm~wu>_ptC z-0DiPRJ?gn7I50Pc2#(c5Ts7B;1RdqmF!zAmG2Bd0NmAqm-X1rE zHsBO7EivigA+of7YY@wE`wk6+kPc-5{an4#Og7RlHNXz%o#-C%71*t+arV8ccuLHX zMYInk2=YI!1O(kSY;G$Dheq&N=H{ctjmfD++a0L>a_-KF>R%5`g!8$?Kr{r6yBf$X z9Gn@RI5ne2PQLKK($J}uY~%OeONXs+GMn;7YT6tR3z|ULf>^nZdc>?gfC@3n3E4X`=QOUO9U=Yar1ZVeH#aEVqWH_C>_3)2^gi{L zjon&YO`@b59Ck#LXk0hIC}HB5_-DZRgQOCAT-Z1XE+%Knd*7$lP<>bkFS+^xdt7~n zN2b0XpL9QJy7WN1!5C>#;3L|j6{8vxz$}$$#Q72Z-Uvm=jt=*srX5Z{uf#x z?^`>lRp|uuoV3zKvCj5LlgUomtbfn7ZM2v9C@=8PRWVf82VL%fP$G*zmClImG1xDV z*6|5;2Q?$RWno&Yta@v0mo~8;ct7gVw*H6{_h$PuRGQCQzYH=}cD#{9%@>4^&`p^o zXFF5QYT=HM`ZGtZ1b>|59;GzSKywV#IjYbCt)W>4O8s80EV|MQ(|kJF*FRrbG|ESh zZ3Kcv_IT8ABpVtHMwE27TU@8P|j&yDRfO?Rje}tj`to{3hjc2SkLMZ?e zpu3~WTgs|9+Zi_-3&d6489xCb)YO!jRAL@oAtOB0s!Vaqh&#k#T5uJIX3E0@rh482 z@JNk?9_)Boa3X%1p!h5y(BVV+2Q&v{bYJ>_dW0fy(oAA}Ioea~P4p&nHEixGnXQm{ z$+_MdmYsyhM5nZ<*W-`)q9oY`fyg4t#Y1rv8{L*U08NJd=3f-z7sY{m4`6}Eaqu41 z`AtWQaMV%BjLy(77wmheghYeT9otFFN-o7YTc8|s3=eVl#t@#a?i1 zjX=#qby9Ot>*2Z8L95kIT5&yq6X*~1z@{Y}(X^aw1sAo9{lPC%Im!`C-nDENfspfz zGcGFb(w93$J+3C*dKNB2$SFlvT}?+DKY1zjc*{j>okFrtpKK6th9HF`YMG#k@r+=$ znv-UJW)QH8nL--bH)L}o)y8vvN&PbYm<8k7zm;m7Wj*K$KvvDM0f^ppO_J^0(1X(^ zWNP$EpzoIDLs|A00f5fZhLm1Ea?25%TXZc{pR#t^){b4eQY6^$mWb^Zp`b(;~#`Z z&w?=P_N&jcm+S>AkKtLh4qAV!bBZ;y5LiXK%&Wp|XWG1ChnqySY95+}f~s@CEY8N| z&YXG0u6N`Y-mRZ0G+sn^6=o8lYIUH+O7f?UQ2<#=5WS>-d zi3M(oZ``m9BAvumV+qc~_DG@#R;3+Bx(M1hh(Sh;YbSQH_Ic8*?xh~AC&}Kyf+h>U2r9xF*E6h5iawpieYPB8HKsi zygA9L+@clc&1O{wDeus<-Lh|vu`nCvbDR)kyEoS^cQxuc7Hi~Y7VF?@^B5>EuP2`? z)yu`P17{B(IeAJ%Y9rnm_f^+5Wx-6Wxl0NQH~q0?DU!$7*V^`gtg}Cv=-)=HBui@qaJs%ubgP?`-m`h zSkH0HksWfF5Z+j>b!;;<5D4*_W39p3sOtkzV>Hu|<&bV_4m5&Nfz|>p5lLGHSb{4# z5{?(5m}_iv(DTbH22r1i!+=Z-)+W}p!&*V!i?p{`4|`x_6|ydg7Mo5wFkVDu9_Jdb z{D}HxM)^{tY6X*0GwkcKw&-kU(2Nt%MAxJwGegTQ$BmYA&us=Pc^aA`85}tz1G1Dv z;yJvu<{2Sc-AU$Ibddxf8b*q}Cuw?Md59(W9JqO7;+NGcFhYKZ^Y=mQry3E9&syyw z_7hZ>PN;&y;r6`PybE2=lWruPZF;Dh4G((&x_Mc9hUx?~0GCKoSLRis7&8pDIS=4n zq8SCZ3+63PE}w;qYh?837$s+UTu3@+|e_3tTp9A%{*nsA|ZjbP~?UCcGVkQ{CLDz}`05)-%W+h!S z0%z61>IhF$MnVq5EO9`zW)GAa7W`}XA;@Y` zizyS=^RNA8jXcAcb6gTJ-wf1@1Wea&z*~0w1{q2PZ}~zv;`GbqOs9*AFbU&b!f}b= z)^?SIAjEhP)zwAqHVZXaEKUSS&`WXTighh)GF{*KM;}#lD&3g+ z7%h{=f{mL#rp9lIggmei*xF2c8DbKJ-*Vk*#)5 zuX^WQWNwI+9TY;2?RvJ@-+D8$c;S3C{kjlnoB}=KfRHmlp8vpz; z7Vk#FG3}hlP|%1>b++Ru^_AJqs`>2rY-hiDMP%fVex;hHXPb+cJ8MSvMd?v`f$x(wUf3 zq$#Xl>;9DT2dHQ?0d|fu84ZC~SL6A=3f&mF0rck`oXW?r2;2L}4LI5g3>%wWAiIWa zkvOH}y~L``BeR{uX2Ectw$-}!yi`#g7y6lQ_-DMT!)cBJJ9us6gsnO|;ardhIw6}9 zKWnqEFrbqw*;s2>qHF=!dCEpB9mL9a`&@&y)ot{MK753^wOaegMzn$?lADKPmv~03 z@`HzD){n&7#|8vb)+`g>81zZd76zN8ox7w_A{L*$|{_O>Gz!1^M0hmN4(*foIvw z9XGouFxbToc-hODFrDd5Fr(}(H-6{iYQ~=(D*3bC zbSm2Le?pA~2Nnkk?ip8<09Rx0C#V5KZM_{)eIKoN4qG>>0jqrkm284IIM@boCm|Zg z!6ts~1hiaLnznbUMqZHblh-yl3JG?25dyK{AmNagqQjkt&rG%H0oKRou(LE*x;}{B z>;vd5aGyN(F&d7i`+CZbF_(j4g8CgfSP1pBYCHLg2cYnpj(f11TYJO}A-}ZmkWA<} zZXz!3z@SGv*Yt)AN$;XoFEGE>5maGIq1eR2Yt51#Zr0+h!~9|MB-FF{+{)_OfrH16 z%gtCgy29_>r>DE|s!!0`&u(1$gxUjxUO3oLpH%Dho@i)tusV_(F5H#%hn_2^!H2Co z)b}9a%7O+al`bb;cSB(WTeXfdQzwyhAi!unC`x3aicFNz1oVa1_}_7CEh76IVi)a5 zI7b5k85dzv#dCTT)tXIPZ;Bv>RV+>k;gG{b)VTYT@FJ?lqo3rw%H$f4e^OQIY1FHP z?QXyN3T&*;5*DIuSX`DpEywXt7n9obZwUZiqgi%gE0vB^Fo3%DEH@Ceq1% z1NGP$YYmXhY?h%P+m7?At##L;ZY`~k)YcLoTCGvavDQI+M3U)nA#awChS@Gk|C+P$ z4oz?LVcc3=jS0$DZa=>Rg>fj!vQV>a%U%c?R1lMa9Lx_|HARR07O zNfC$hM^W2#Nf(2BUY%8MuI-=fdzsL$wfNhB6O-@#WcG=y^ zaOi-*rHqE5fkpHN_0x;(wQ17^Qx8JJn=+(FukKW5t-GQ=*W*_| z_b+t#0w?^4I${s%o9=XO>T^=YKvoIvAiMxaHBi_hE)4B7N~_1YEg^}vvVjhZkohum zjq^`J;lZ6=qR!g=Jl?45*9EgkdDE}Asb#Ug%iTUiEz79uaRr4MpFch%pHDKfuQIYx z*MB8QE1&<@_sQq~%=aJU`xVz`&s&W9vsYiL*X`3VS=?a1kTmoXAX4!@AOW2eE^D`Y zdKw(PL4rJlmPpaDhjS44*T&XIc(Q&zwE-jta1QEbSBtY9| zD7aHxwKi)iqXiw<_8TU(irk^9EMwWh@Z^9Z&;2h|Kf=2H59__4Mt{p$SJC2Nb#+#L z3l+>eJ;gr-f(+!lOLP6#|4R)uhW}Kp-g4Fe>ssMHG65_Y$lq3qo(Vc-N!uxM_p)jd zKIZV0mvSbME|iySF$37gbfUCFir9;=6d57E{ZG}K>T1f+qBZx|96z*qs@g8e(9?Pk zYyQg3v6&K_5bL#$6C*ncN!T^xlpaY0kBxEKoYzEIq7Z3W<3wV1kQg>QotB54)5p8 ztF7aQ&;TSN9|`V1vwp+TQ#bOc%{_uIiR?Du(}iuQ*C;%ilj01|?b$1Sz)d&v zy;hp=4&6AtK9~FzaqY0s6**lh7Y6;J5TP`0|4mo8imz z=C@C=8DtY@xbLU*eTPBtiNQ(}8t1-pHvr%0vNi?GdaE|>;T{vNC-gm@upZR+XmF3W z>3ck(@A1T(+~WyMV5{+?|E*q^Wjns$>Oa^&V?PkBSnh||q?Y@BZr?cjlp1X;|D`%y ze*w5D?k+Xh($l;u+7!qFDE(QfEH?a{l9`qUO;8KBillrlE-05Zp*6SFs>(P?L(3xP z$@Y?tj)aQ3MfXmGw4i1-`^|EC|nyrd(wtlnj~L za0Y}04u_xcf=drm8PF{Dv>_p%O-Z#=kiTv=gi34_Y=Tg9@3hw%Z~U5iqcrV)?bWC4MfIkr z&+5JUhgbU=Kl*Ek-!U-XZ+%;R*1jM7(-1t3Mqr%?8S!wxW8~mu5=S9$Cuksv54g-r zaWYeK(vnN>k6n!UEs1fPj$F4WO~wP9md%^UDz_wiqy$&zH=Tx7 zEjQjSbEnlmoqiE7I@F4I^+0Z&my@9Rb#+Vq#jxPZ#xaDvntR8oVQClTXu&_}btVM+ z6~%_{Dib2cYXBXk18QlI@`NFY1FZ+~LIO!ttCWQ^C#FokEE`>${GNP&y(~QrhybF-E(N|ESK2p<87L0IND-^O68&OG1Ff8K zGbv0P#E{pN;|jI?g-AG!@{(}{V=X_$ABcL}c8hKeHFE?#x|-s}K6|9`fp4hohr~kp zqVLi~iWni=i*bwdMOSIyWw0tHDf!pmP>bx1wE@;HQP3-qib&CIXZSEl8EQXb83V>oSYx(uNk0hVN1f*|!FrS9GZ8Lhq7cag*PtH zF{A8!Q$0V78hHQJQ}}96MP07HYy9@N*nO_=Sk{%hwf2AI)#K{dtta>$W})-hJNf?a z>+gSW>$5LjJ*S?u{)F#Qy6=4N?R@VG`g{Ml_1SCr?4thcpUh{_7=H_=_Fl}q0thkG zP4Nz5NK*16AYBjTybV)krq*>> z#$deCAI;UeaknLO&rybHDr0V7Y$;;ZutqPlYv{U*>B9B+W-PA# z58V+Cm=;PuijNsfBa(>~EwKk^k273I6|>y|H6r_rPE%l6>_1T`yOIeAd@f z$Rwfz#b3E?Qx^pPaN6B2NV2T-I*z5(y@tWyyzKzpYz#0Z_M>( zlQD1RbfM^@Qv(Oe+|}1pZ1+iw@|_Z~;IqlPbZe#KPm_K&DQ3FeBmc$tPZKNIhFD3^ zOSsWXNdGz$J1ALReJcq$YWd_z;XK!@$AHr3r125> zVN7<^^Aslw6(N&6iKN=bupxBSPDqv|E(!jq##6~yrdGE}ZWyimyzi?^b$In;6SSrf znWWr9dWZC3PiVjm4b>``p`pvIai@r)BKFi2OFqT5+qSDFh6>s)>=PV+$TWVQ(-F)e zK+{rJ$XO)!tMQ=AWXG14B`zkf5&y>WKdM(WPW_Wg)qiMeail5zLB=q~V1&&N?)>Jl z>gM>iG1MO+MPqbq4#;~4Q@xqhZ$i#upPFs%xZK*W%N)fNls54sp$!v)KE@mr_>Iif zem3&v+P3xGnkvYTzjjjcLJ02?0nvkpjviyOG;5?FO@ZwAGx(#|$P*6Ymr1%EFJwFN#mROZVz&=^i(J3KJu=aVTjP!m%1I+sTn(ogyHr&*C?p|4-^m7#+E* zC+!!hzp#2Ztao6~2)thif2eiY&X0xJR!-I)UOV^}NCnHVS_Dj0{ywZ%bO0ox16g*HOf*p2a4pMawV#JOl?*!&mC%;fS5 z5{Pd?0=>w}Z^xRY=!mZ+Vx1nUQgu!#hd#8$vh`>BNW9I=8uokS?C=kCQ_k6|e{0`j z-@zt61ERlO(o)A0;bBmJwk!{YLr&*-M6J2+a%a04y@26?PKe?aZ+qV`W1`Mv)X8v- z$J(V`IxM-JHWSm^L>y68^HrB2-@lon|31&bb;gfso?<`HtR@(;qL23nK#hl%5Lzw1pllm+KU8}{iS?v%sZc!V84NaF z_d~Tk`0~5mQTM*NnMxtu_|gw)^^Ou7Ly5iGuHnU;p@8Y54x!A{9mGaVh`bXk*UsJp zn|1R*7fmfyXoMsewN$sQ#6DqvddY0(IYzs^n#2CS+1CByeJSEz7kc4&z4aL~XwVA1 zQnJ{ipRNwSG@rH>5Ag6JlN);uA31u1$h9<6O=pbx{~UgK@AF^q!WX^l<*#_~$#LY`DqrGACq`1kwy|HCP7DxyLM zig~xZhg88D%Y~TRduPPuN~)v$PydEs z?{7S^BA=eupB|R~&&&Ijchix|?Y&w4%RCaXT`B#Ar#9q+d+#kI-0ltZC>F+c>(A{! z$Dtmgl!*R8S(_sJ*4j>18gBX!8?&$4RJdv*6N{uclja{VnI{5Bh60Yud^K$KrKTVgZ2aq~kmD+d0#?k9`4vi;!6`yY|5aZ49-(!6)J z^BS`aPRzDOs!Xm4@pp=o(}&K7GCZ_Sta{f1Osdi49bH6UZMkloQ7PQJq z&i?kcbGM52C=x-T`XQg_8vxcMBDh-M<#)H{TOEtYk`E!@^*J50_OL;Gm+RtCJ|JTZM>T1-yJFbo5_UZzIBKlN3&OMkHq|*yT^O@c!7V9 zM&(O>{cb!QIR5cS>`OV>snJ(YReAvZs+{cTo=SawARCDv;EVTU)XxW^pZGu|5T&>I zbDkqV1JMtB!u)*2D`Ni0m6r#iciw3}PzU*Wc3olx^BPOet;Cwet4;V&(f`p9YkMy2SJ1O zX^fBdnphwsmp5I5r!h4gY$?nMRS5Sxd$n*$U<^A_HED;+A#6Ze7-euebbaNsh?fuC zWc%g=2aT;nr9mB>8$pnkbT9@kw%LzD7KxY!N-$|!mbzk_lo<#Rx#i!B>;wr4g`?@r z?3~`)5U&~KvP^?OA$nUsAdc-pp&+)`86(?;W#uUYkcy~57@h1*-Yl0e`)V_ z_m9P*jWK1<)m>1DJ#D{-sVPB8eO~ojZM52C=ZJnv4GQbJp9e2*RyK;v%L%i~pskP+ z_|QzZVN|%MPixD}Nh4{gTzj zUnqM(roI8vbZ~0?_{LST>h z+V%iz^bP!i2U(*riknUf!fZuEb{T2y%$YdtagkiYQYIcKp^IHLCvN4eNOQF+c@7gx zR836g{AD^Ebz_EN89R74tCewLhCr-hK}0c-OeOLK%G&oIIH>U~gbv#t-Hco8%JJ=h zJ?O25t<@gW0if3M9E&<#JE`3$rmfNP*nN$r%MLX@0eh`Spry-=PxsjQ#{abK2^TEL z4WG+ib*JM#Z{vu|F4ju~M{c#gZ;**yA>1}APb_h@2|~cN&bodhjp?qF!h@HcGDX#V z#&uFC9HPymRl(ee@ZI*WWN$}oJu^Bsp($9G>HW9TRa})rI;Ji}uCZ{xS%7BsAVUq9X;@$=R(&6%^x} zrL+1@B4?4G6tst2_7N>x!T!7*M7B=8WP9UpT=uT;*s+bNVlL=g*}HmtHQCtdwyOxu zQwU9+2;daX(o0t}P#<>tvPd^1QlgVa;aXF*io zg%^n0%T_x{GoJ^T-J5h71hZRj-NW?ev0*qFTL(y1tf%Lz3mRq4r0(6P4btN$?|P<8 znB!*bbv&!Xgwj@a?pofxv3}s77_PURyY;r)<%|9C=5bK$U_>RCUeVMCWx9Oh*8p*8 zou;6QW4kq;mr_jhDFpc%1nJk&XL4)Fl+K`0t& zh@Rm8DkvL`GOYoZ!oNOEo#1*LI@`+JJXNDIQz$(n89d^UAcN3EDv`9935X2%t9}u} z)*hkw3T)*NPR2I#H+F$NmV zeiZSrx!RblGKqb$OD2tCfcy(O_8ydIOmpYnIESS~Ey$@&KdT=NLmtJ*+7^$cA00l{e z@Fu5>A;tovl7b*PpuNYy3=)y?jmb_UHrc zM?Ll)y2EIx%SH2QwKpMB7wk=l)HUw#+o`&O_z7_BWapR>oja=6>*>vn`8cz6TF;g| zyd!F*%ThCPQ2)v1g#M0khg9=H}?yuc1x%H-G6Beme+&+iE-*u#}E?yA!0QQ)2;mc9CoAvxXLCvRZi=xoEzf=0{cE~rjl^;K{JzByLD$$DL`|QY0qI&9RmvtTzk|gu+zAqVoMyPzHIqsnVMrv z@AkvuUmiJn^3>h(;2W{d#64%uKFgWj9Zc`ZBYJulm!@P9j9t7d)>@{X9xkBf_)$s( zVwa+0K#*A}`NMr0fU-T-p#(UgYlZsb7xIMwR-OFXC#4jUb37~Sa*+bxGkB`}=6d5T z*!Wz){&Tkf4z~Z@I_WCxF&L$)Xtn!gx*aBk1J&zuv6~b99%h#bl-ZrrZw!%yHbl3w zw89mz%giPfxh7&SVSH1I-<;Mkot!j36mwP5x$8kEpDPZ6JclG!qZ(8{415KMjyMT) zp{bFZEYa3Y_goE*E>2L5x3s){hX%t=$2%!ZRVv?P+5p)T@)TbnK(R_@b=$6Wb8Skt zOPol{R0Xd0`f0X70)HehJ!7(Gl=^|Zk5URuO2E?T15fON?(H*heBxz0E1nqgzcS-IUGfz)`_^wkcVTJ0Q>X=D!QbDE4@2pKL_TWUVCsC z5IN0N4NFcdlB4aHP6G)^PE3>Jz$Qn6Qb#$9z4i@fg|ZY9 z95|g1a0Cv5VM8r>SWlr5q}|RCp(&jp6PK@@>!-k*gRM(L6BMYQkkav(EqZ&!+t^v$ zhk-uOYu|N}8e8Yu1EjMIwO^(tT~!HqL_o{Mlu{Z-Hk83a83tu) zn~t(F%g}c_Hwo&SoD17GQuSsd;g+k1nJGf!NRn9OTw3vQQ#fLnnC=ruKjPeANzcv5 z^*073-o3GbUT|Z~BRDS8KYnBVbO}1k&AH;sLxgi0|2=Hq+$cuu->Ao|SJ>Mj*z6;U zA+RaN0D4G*=-nkwLFkkzhzGlTwE}0 znX+PXS_AkH{0ot`mM{~+&qz$#0(6p0QP^)PJy0hSl^QKeKB%DkF!;drmnd-1ao}aB znKJpH&yGi*IOk6F+P#u~nF&tShinyEDSCTS@r0VW^2Z@>wBYd;SDsubc^y910cPkB zGgQFmF+JPePVS@+zCgVRK*dljqOmpsNO5~)p>>_%DC1#*GQEmnR7MwhOBk&*Q0n{g zWVRd+#_B43r5z8;98K(aa#HnX2Xf(LV%YzV_sAUexCawNTb1=b{`*sAr(b3#fv9L^ zLnc;8hXQsw#`GV2|Ww|a<2cp|E!HKdx zGm**rf_5zOr>7~%2?jGEHSpv@*%NwFW+;)0U-@G-;|-O2y+s|OK8F~81qmLb^zf9U zFrdyilA9BT)33J^MQJ>?InJ|C7b!5gsac_hv|4dgN2^csDne5-x!SV9<6rc6Q?ywh zHLC4&%zhE5lQ+=-V2^!F7j8e`aP>=i(aRneTCL4O$jjBawJ18cS6Tz4sfL*n;U5&F z&;SWm2v$&e>&ZNd6un3G4H#FhQs^_B7@#fyCsyr8?JY~ARd zCt~(__AfhyrFixyzOnrJnl*P8@AD#N0e0PQ0;eKmlirZwV{Fjr_2-(`7x52?G> zj3mi?BzzY|y9=UAP@1hAcU%upn4F3W8Zm0}KC<}x|HeR2B@^R`8Y9s3YNaDfFX zISE)aHb`X=5PF~V$eolpbzV_$_a*F{);(|G5C7Y>Kg7P7Y@?DUg%$1EA4)N*E`>}C zsj{n}-ePaN^5G-l6JM|o{L8Pa|8wQ@YB%$6-12~Qo@95N5QZ&~XJ4l-qBUW1js2oZ zsM!D#Dg1deYKjpFz8af}!-uDZs9lhzLz)pIfdZpFs)4jI;y*~(57nQ)bzMp<_tsiF zxb*I-kSswwTI0<=bn;=r*|#>h#}O8M13rp&Tq{CzJGkAsU2j@$xFgoelIo+{94467 zfaFl8q;OFS9XV7{X7p+#tu*SRyu5LD(*E?BIUe(MJmw_%7)5yTU|HN_LccCt3B9|fTFcKXh9 zRS3PIRt4zY%bRtcaQAGpN$O^gZLQ0E~~Z1bF{}PyXGdgCI|=#A-f<9 z09a&nQG*MmMm#)$%rR`q;KUBQ>OZNNiUjo8;r`6V##E|X^M4~(^{d1M@ zE|L#M+DM~y{1XE`LJ=0CU5E0IkRv7LCt%X`1Ogz@+ z)mdU*TGc(vx{viLV~x3- zJ?r)+#tMzQbM_=qzHclG6UZlBU$^X?h%-?u8O|w9$SJi)K>IPvwqU&H>ES++#Q*c{Dh|yG4pQ-}n z=B*}s0`*GFM-cp!8bMGh+R*I^1d}OY_dudh)(mPrq~9Y_B;RGkEh%I{&m&%8)tIJb z9BD*Fa63(}oL-L3-NJv-q~t+5-i=jd9mBf2ZBtr9EzSx;nm{!HlFdS&sWTE(Z3mpT z!+>b$12{AhS?=+hd3(+kjQScs%-fZEZ!Q*y3-=GN`iGqFa8VJ~&Tq40GT>28-CiV#o9}@rC1`|w6P}5@ShJjM7#0A#-?3?sy z`3%O?PmV0Zvm4hU?fH5qq9Iq%wkwDLq^{S}ZFM@rWg}HAKw5aZ0b8I0Jl?E;2-pnBv96^SO3vIX+IZjUogY%hPXov)v;h0+<-6RV_ZHd%fp=7 z>0TaiOJcR8p05Hl63b=Ne&3bzJ^oy-zrR194OAB<76#_`?maf(F3(I4+_JRr!Bi=i z>5G_d%MAT z<2iHQdFPQ++`sSr>)-0Hzv|YlM^X1A4=Fo(!6Y>|b zj5)!$irVuvI-{BGH`HFkoGzbluLn^Re$^1J+L4S2?CH!hPEbou6|t6Fc@y)NqLw$P zCKY0ZXd9{s+M}e@(hD}=U~#{*dS2}j#|}N0Mvp4dE5sSwQ`)O7csem#j&tXk?>(|B z6AC^-zvwG$C zZJQA+?&b0%XJqAc?wsvWK9Z7OI8+WvH*d?6J@ZRPk1oy5?UtPB&Fgd76C^bsK6hk9Ev6H~pf+sv9Qwc@>VW5oLQCUPva} zX6MCdqq7?dy_M)bXmnUMMreUm!Kh7XCKFuSQnJhw5LfFXSQ85Xu7)3 z_p=PVCBr*FpDsTBWm@iF)IdX*wUd) zPngJv8&xs+Dl#%`(=FrKi!bWKr#M`XMWxTN=sv%Am_4c1ob8nd)Pbp`eDYsLA32-u zkZ!Y73q{w#38VCk7<6Yug@&jtTfZGJme{IRTwv&#z2tDhh@$ZwGzO>@F-+dl%azpR z9flR`XiW9!@mF>UkACJ?H6(}jr;P;_Xb*i>Wkq-8CQ7HNulINjL6;W;y*yU$&COe! zY6$FE(Veq%S>A3w-%Ey7^ww1}!=5$dW)xRLYI%wM`r0kp_fgw3ageb)x^TnH?JXx= zEjc>2Lk^U~^%xEtM*jdgdr*X#{c68#21Qt>|33)xmP|iF83@un%+R+^fVs#|z9`%_JyJJMTbMN|`!;CeA`U{T)S zUZKFend?gZtK&UGg40T`AKE8Qu1f7KQ!`wyeqGah^+-=YcdEXK_sE_NfEU znYZT4i;AVlvqs6g^#`9kmWt~&KDu+$mcaX>8aJ{H|Y%P|YsyLw6zQZ{ws3I&hb;Yqc7l%Pi%?YM&u4zP`4yuL5tD znB6&viNoySB-CJ6pNuvpC#nk7BlDR&ud_*uKHWRP{GyLsQ={}I*vkHhF@VT$oxM>s z?~jZD4n&Neh|$`Y_e*NWK-B?OV{L1;mTSI)g2ra3ST!!(V)!6ebf0han*x;2NxZuR)OdIzyrUFX@WRlCA8 z+EG%=ZJx=>wzn-#M&FI}lysK_>w5di#WX7UOm9CbUt#T45BfyooY6K`s6@9L?xizv&*eiY!{GblovvDtb;Ay|;!vXR8|xSnEZ69;KVfRO_CuBDDxjdt+y2mQV-X z`JIar5~b^-`~mr){K$a(ipy3F%O6rOC=?2HKDXL6-*uzw_3l2ezej#<*Fkxq-oetl zhx+@S+gAEx_3YgJ_@EF~#@!g&{#U}1F&kz?luyVuEb-304(t{o*N+_75ItP)IWWgV zb(ejdAMqkf&UavsaLZ*5+(`_SdmK1Ll)E2r;8amy40PZuCILT*pSq|FQsic_!>@)7 z;m_*jz^S4l>uLwi5;tW1R>2Wwhe**qbD@3^$9K^onJXNa44IoW91l)*#$E?DME{Ia z4yvXO88eD3 z8c2$0BD$ut{K1BmXTIgYZm~#w?Z5`6UhTkfqS)2p!11E59O=Lw5ifsY!x2j98oAPW zkRtAMCp$1gxNVISInisnFHD1_8cM#-fx$_> zSHn5rJ+~l=L=mgvq;P=$>es^dd40 zNqkx(ajb@@NNm?|PjIs1svQ^yjEguhIB`#CI1ikz#)l4UP$O(>DwU&!2BD3`i}qR_1N zvr$5@&|Kx0A0&ne!_A^mgw1g!GOu4FKX0TKRjIwFQrneG_2OpoGypX@xoeQ|HgPL= z=JNDLnn^9rP0iJF7J6ql)ZbEvIE%dtnrjy|dh2fvHy~ozTT_*A+pXTY^*0VNZyzPc zn*&0!uerZe<{Qj%2%C3R$ie2>Q8NAf1G8g@_O{S zjo(L*RY|F2Rhr*|4%O(j5cvo3TUp{OuC?GPy_5~A(WzNmrAgljV-uBYHWV6_wk!_| z3v<(GIr#$V;>%?Iq%tj1J)~5j)#>aCQYF2JXR3H->$^8|Pl=(J&gH2WalQOf#iDY~ zaf;d{%!@;^pSILA*DRhjfHM!=*;=jJ9BNf?RBATDC#;=iAynt{w1&IN1gPjrQL?yx zhJwn?6sI9(-!gf{c^>AvG8O^fUnWE6b&D98!fT8*e8xD^7~m_6BE!cuV1$fI#9*V) zn84M`(t?mN${1;kHcBxRf8K1P7)(rUTxML(|7B3P#F%JQfaxb!3HK%$!;PRZ%(&DT z!LuvLKb|@NwwYCxFuRSB6VHodrjNldUKk^1U2t!Fxy&Wl^InN zNo|L+tIN0AVbne4dJ0qNQZGJreoe&%YshC~mvL2e=$Z^Mw^zvDoEOOa-8dZJ-^a<} z7uZjidmGrwfeMUUv{#ZOGHi_5WJHgMVEjnjZOjtCG^*In|6XIZ zc)^%s%r(NsJmW@VzEN!~Fcum$My*k2)EkS8n~VlJvacA8n+{EvAA2_axr)K9h-Xnl zb#1t|er`f@UA50YYE)9yqWZ?BhWbVG!-)j=o5OSJYiB1`&1r7ZkVY%=`4gL}Yvx{f zr`UNCaIV3Wxz$zShHztbqoR<|P+fQ99IlE@k#Cf9?K|25%I#~R&$$*RldHChrlqdF zanYtF3*~R+ri<(3X16(}K@PmwW>Z`e)cD0ErOwqRTwLn6f0q`SfkrtmX_WJP)F`t@ zlgu?AX_8aSZ<}Oqv!Yq9O)3xB=;bBm^qXb>NMhBz>gr*^U`bI7Dvm+JVo)ds1sy2l z3&ie4p^z{3w5Y^+8YqrZ2^AMc^A`IZC=&8T*@b*j5dy<(A%~5QJ_`iSLs4>pK$LAD z5M>((Le@N@wi?YKM;yB3B{O%VoX9YCM8iO!NO>cU|}>zu+Xtud66#SVdce}URo@R zUFHk7%irgu+|*p(gqPBBXbkH*;P(}ln|CjfKN_c9$nPuC8M$f?=Q>Og;;LPct9C)I zbL{)YPQGFXuQ*`-YAGAsY1jArio-VAutMkRH?LYI`%kie1*)8@gB@^)1{~P}PVT_G zHfCX=-(1{6 z8@8rJ`potgd6{eWrU@(La92(ux+!B+)pQCku5N4!*ELmF)tFDMl>Pd68k^_LZ<=4# zq}lm>qZ4bZ>zW%E)igIIHr7-%&abU%nr{YI$t?rRNBMM3E-x=Hv*WMiJzDY=kxnr; zl8Ea=ge)tcIL+L1x4cMw_2ZxY$VYEWKN6`mRZVrwLon1sGOOq3VPg5ha6_F))&Fy@ z8qXDmN|Lb!^{%CUsrMYaPlacSr_%F?XPsw@=OfR_M3ESu_;TX5 zBu`Rm(&D6dlK$RlN~fQbrgS=*JU4k~@}A^Fq&+D{N^VL)$^cSD$^z$aaY_q+_we^f z3TN~bh%{@vNVmQc8P-dpFDEPyunr2p^@S+5z7#>LonhopMTzx_7;YU9ms-1-h2>#} zS3glst2fsAR#aGL`5=3i@x2pbnsriKOTOuB5I4j6P|UQBh)S-t)?dUbYad6#e<6MY zy$4ATS)WG4!vIfMN7%saPWKk;G53ccW{3jo93mWr?cZQ~61MN~k>Z?KMp{m4A*~>- zw7wJffOjwHKGJH^1J-d@HY0jTsK$p31Q}u-gWA{3J(8k@w1Tvfbgvcpnk--Q_EunV z)TOl(eRsk1BbXi*mvFt*dQB|h*;3Ln(sEJ@X$7e#mYaslMat3NUptb{QJH+w`|Fw`-kXDm%jrG1*OXkN&k6Zi2QxJKU z%+HfHTW`5KQ#1xb?&D2No$nWifa*>GW^N&^Ag!bbvk~hZ3X>xu!S!2v*)ybrdByC0JrOesrnzCrBTI@-9rCh{+Q%c_JoH#0S2nzz)OlFa>rvB20kQq=zA} z#X5=~+>0Ol2bC|)Vr^Sy3BO+S>a1=Z{h~y<`GaQe;#QF>^-iGu6NFRXo z0Z1QY!g`ujiD^GZuyN$tN{Mekplt~B0RpL#-AazFqij?2wJ@|ieTB@)+K>!~K~h|x|pX{XY) zBThTwv?ESC4zwSw_v1kO@t^%@zn@zF6$b9WsJn#5Rd_)dm(2V#E3l%-U075*@l zcyYCIOYSWrMV9kl3uy&uC1g}IT!5zUll59OZAR1EA#of{ccbZUwB%S(gb324l;P>B zo{y)pO|)J{t2ZJ4HVPfk#ZyZ>SVG>Vq-CV#q!!W&(n@gdi9qaL(tRY8q+-AWq{s1x z&DPs!^0XG|NksY%kxWFoACaC!q$7xQ3X#4+q|=C`T-b7I#~B@vClbI^P`(<&PbYsR z9$!n4TSDHYq-9p*2r^w5I*wx8(};8$kxnDhX+%1WNZ;X3X{yQ~(oS3_oq*Jr(5*sC zF~XLCRe|SBA-+$?z?JxciYUsS%fWsE;TsWt4#GDh{2p>|69Xdr=coAzKrX1= zg7mLq&{rV$B4xH4lJC-->_qy9kp7>CW7{*fBm8!R-;VIx5n(&Rzk@w@A^e*N{}6G1 z1}?9WKM4)3-&i5kJ&bO(Z?;_o9 zVnGMw+AyzeP74w{DZR5~J59FJ6hddRS>!rHt}_T%Y5k2nF8~D*WRg`+>zPJFo=zpp z(81{}f^}fg!w9n!y z7{X#4>n>z{7g?9!9uMLkkE8v5g2q>LE{-Al35-n+?$9|Ct;N#MOsJN2+?Or&yk)dZMF^*I@#iu_@H!A&DE%pt%cryWE>27N1}s@`i5jnz6)ZSfUDoPeSlH?FZ#(Q-O)c6H>3l zJyngq2FH9vm*Qy@I4%A_I`1QCC~*cxXHen{N}Pb<2^gM0fs?usTLUKxPLaDVV08wg zf1~=quz4Fc-)d)h1QKf?|0vf#kk*nOBR!5$H-hsl>3LE-!m_giR*E*x(4P=?~>o+82MjxxBrE%wq_UYO{;F| z4=EY>KkeavkFAR+f0h^-?N_P(6#YkPLG%tit%&Ys#sA~&SO-iIIYzKhZFmBD{BVoz z`QFnp1hju_^Ho@n1$qRVK_4hGlkibVWK$3AxK2#hzwGEm;XS>ats zaOCs=YWHA1t;aKyq=>%mFg9dLR$H)9w zwo`qC{@Z2r-yUarz*9mUkGPScy)yAUe`AG97Q;ZGnO}@#jIs$r8yV<(mzB8(#Ti$B zSHM-~THw0N^^WVf?CvTKvtT?498M6i zHp8@yrzT9Ffa$|v{Sl_EgqIs)lwRSk`c#>1Z3OpE{CZJa;jg&hdaSTPM26FoyOfBu zls;+;X$5H|EtoRaTF|zG_CCf^Z-UQ(wHBL*)e$voXnw*3 zv3dB*3cTtUw1U5;&09(CS>&EY?pfrXt$0MNEim~ECI_7kxO&gs0@@bPwt)7s7G*tH z?}OD2);>h}Pq5a5wH~bXV720O>OCoFJqp%6V7&*{2A-V2MVW|&n+m!qJ+Q`4`Ac!X r;NC1!-Thv2Zx!k8kK7;e&>q1MuV4Oehk(UvyJvK$>+4^=v+%zGc(>TT diff --git a/reactos/media/fonts/FreeMonoOblique.ttf b/reactos/media/fonts/FreeMonoOblique.ttf index 8aed4a5ffbb5881c1acce18ed16ab17f9f94c760..8992c2cf9471bd776e94ba298df4f777da1de7f4 100644 GIT binary patch delta 86231 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 J{_EX8_`iTM@sR)k diff --git a/reactos/media/fonts/doc/DejaVu_AUTHORS.txt b/reactos/media/fonts/doc/DejaVu_AUTHORS.txt index db4f0fb2a7c..48073dad73f 100644 --- a/reactos/media/fonts/doc/DejaVu_AUTHORS.txt +++ b/reactos/media/fonts/doc/DejaVu_AUTHORS.txt @@ -1,5 +1,6 @@ abysta at yandex.ru Adrian Schroeter +Aleksey Chalabyan Andrey Valentinovich Panov Ben Laenen Besarion Gugushvili @@ -20,6 +21,8 @@ James Crippen John Karp Keenan Pepper Lars Naesbye Christensen +Lior Halphon +MaEr Mashrab Kuvatov Max Berger Mederic Boquien @@ -28,20 +31,23 @@ MihailJP Misu Moldovan Nguyen Thai Ngoc Duy Nicolas Mailhot +Norayr Chilingarian Ognyan Kulev Ondrej Koala Vacha Peter Cernak Remy Oudompheng Roozbeh Pournader +Rouben Hakobian Sahak Petrosyan Sander Vesik Stepan Roh Stephen Hartke Steve Tinney Tavmjong Bah +Thomas Henlich Tim May Valentin Stoykov Vasek Stodulka Wesley Transue -$Id: AUTHORS 2379 2010-05-27 08:14:08Z ben_laenen $ +$Id: AUTHORS 2461 2011-02-18 16:38:20Z ben_laenen $ diff --git a/reactos/media/fonts/doc/DejaVu_NEWS.txt b/reactos/media/fonts/doc/DejaVu_NEWS.txt index a84852e73ac..87e3d5e53a0 100644 --- a/reactos/media/fonts/doc/DejaVu_NEWS.txt +++ b/reactos/media/fonts/doc/DejaVu_NEWS.txt @@ -1,3 +1,85 @@ +Changes from 2.32 to 2.33 + +* added Old Italic block to Sans (by MaEr) +* added U+051E, U+051F to Sans (by MaEr) +* added U+01BA, U+0372-U+0373, U+0376-U+0377, U+03CF, U+1D00-U+1D01, + U+1D03-U+1D07, U+1D0A-U+1D13, U+1D15, U+1D18-U+1D1C, U+1D20-U+1D2B, + U+1D2F, U+1D3D, U+1D5C-U+1D61, U+1D66-U+1D6B, U+1DB8, U+1E9C-U+1E9D, + U+1EFA-U+1EFB, U+2C60-U+2C61, U+2C63, U+A726-U+A73C, U+A73E-U+A73F, + U+A746-U+A747, U+A74A-U+A74B, U+A74E+U+A74F, U+A768-U+A769, U+A77B-U+A77C, + U+A780-U+A787, U+A790-U+A791, U+A7FA-U+A7FF to Serif (by Gee Fung Sit 薛至峰) +* added alternate forms to U+014A and U+01B7 in Serif (by Gee Fung Sit 薛至峰) +* typographical improvements to U+0166-U+0167, U+0197, U+01B5-U+01B6, U+01BB, + U+0222-U+0223, U+023D, U+0250-U+0252, U+026E, U+0274, U+028F, U+029F, + U+02A3-U+02A5, U+02AB, U+03FE-U+03FF, U+1D02, U+1D14, U+1D1D-U+1D1F, U+1D3B, + U+1D43-U+1D46, U+1D59, U+1D9B, U+2C71, U+2C73 in Serif (by Gee Fung Sit 薛至峰) +* fixed bugs #31762 and #34700 plus other small fixes (wrong direction, + duplicate points, etc.) for Sans and Serif (by Gee Fung Sit 薛至峰) +* added U+204B to Mono (by Gee Fung Sit 薛至峰) +* added U+26E2 to Sans (by Gee Fung Sit 薛至峰) +* added Playing Cards block (U+1F0A0-U+1F0DF) to Sans (by Gee Fung Sit 薛至峰) +* emoticons in Sans: replace U+2639-U+263B with better versions, add + U+1F601-U+1F610, U+1F612-U+1F614, U+1F616, U+1F618, U+1F61A, U+1F61C-U+1F61E, + U+1F620-U+1F624, U+1F625, U+1F628-U+1F62B, U+1F62D, U+1F630-U+1F633, + U+1F635-U+1F640 (by Ben Laenen and Denis Jacquerye) +* added U+A78E, U+A790-U+A791 to Sans and Mono (by Denis Jacquerye) +* added U+A7FA to Sans (by Denis Jacquerye) +* subscripts: added U+2095-U+209C to Sans, Serif and Mono, adjusted + U+1D49-U+1D4A in Sans and Mono (by Denis Jacquerye) +* added U+0243 to Mono (by Denis Jacquerye) +* adjusted U+0307 to match dot of i, replaced dotaccent U+02D9 with U+0307 in +most dependencies in Sans (by Denis Jacquerye) +* adjusted anchors of f and added them to long s in Sans (by Denis Jacquerye) +* added anchors to precomposed dependencies of D and d (by Denis Jacquerye) +* added debug glyphs U+F002 and U+F003 which will show current point size (by + Ben Laenen) +* use correct version for Serbian italic be (by Eugeniy Meshcheryakov) +* added pictograms U+1F42D-U+1F42E, U+1F431, U+1F435 (by Denis Jacquerye) +* improved Hebrew in Sans (by Lior Halphon) +* improved Armenian in Sans, and added Armenian in Serif and Mono (by Rouben + Hakobian (Tarumian), Aleksey Chalabyan and Norayr Chilingarian) +* remove "locl" feature for Romanian for S/T/s/t with cedilla/comma accent (by + Ben Laenen) +* replace wrong "dflt" script tag in Mono with "DFLT" (by Ben Laenen) + +Changes from 2.31 to 2.32 + +* added to Sans: Latin small letter p with stroke (U+1D7D), Latin capital + letter p with stroke through descender (U+A750), Latin small letter p with + stroke through descender (U+A751), Latin capital letter thorn with stroke + (U+A764), Latin small letter thorn with stroke (U+A765), Latin capital letter + thorn with stroke through descender (U+A766), Latin small letter thorn with + stroke through descender (U+A767), Latin capital letter q with stroke through + descender (U+A756), Latin small letter q with stroke through descender + (U+A757), Latin capital letter p with flourish (U+A752), Latin small letter p + with flourish (U+A753) (by Ben Laenen) +* add new Indian rupee symbol (U+20B9) to Sans, Serif and Mono (although + standardization in Unicode not complete yet, UTC did assign this code point) + (by Ben Laenen) +* Sans: adjusted U+0E3F, U+20AB, U+20AD-U+20AE, U+20B1, U+20B5, U+20B8 to have + them take up the same width as digits (by Gee Fung Sit 薛至峰) +* added U+23E8 to Sans (by Thomas Henlich) +* fixed numerous bugs (#22579, #28189, #28977, N'Ko in Windows, fixed U+FB4F, + anchors for U+0332-U+0333, made extensions in Misc. Technical connect, and + other small fixes) (by Gee Fung Sit 薛至峰) +* added looptail g as stylistic variant to Serif (by Gee Fung Sit 薛至峰) +* added the remaining precomposed characters in Latin Extended Additional in + Serif (by Gee Fung Sit 薛至峰) +* added Georgian Mkhedruli (U+10D0-U+10FC) to Sans ExtraLight (by Besarion + Gugushvili) +* fix spacing in hinting of U+042E (Ю) in Mono (by Ben Laenen) +* replaced U+2650 and minor changes to U+2640-U+2642, U+2699, U+26A2-U+26A5, + U+26B2-U+26B5, U+26B8 in Sans (by Gee Fung Sit 薛至峰) +* added U+1E9C-U+1E9D, U+1EFA-U+1EFB, U+2028-U+2029, U+20B8, U+2150-U+2152, + U+2189, U+26C0-U+26C3, U+A722-U+A725, U+1F030-U+1F093 to Sans (by Gee Fung + Sit 薛至峰) +* added U+1E9C-U+1E9E, U+1EFA-U+1EFB, U+2028-U+2029, U+20B8, U+2181-U+2182, + U+2185 U+A722-U+A725, to Sans ExtraLight (by Gee Fung Sit 薛至峰) +* added U+20B8, U+22A2-U+22A5, U+A722-U+A725 to Mono (by Gee Fung Sit 薛至峰) +* added U+02CD, U+01BF, U+01F7, U+0222-U+0223, U+0243-U+0244, U+0246-U+024F, + U+2150-U+2152, U+2189, U+239B-U+23AD and U+A73D to Serif (by Gee Fung Sit + 薛至峰) + Changes from 2.30 to 2.31 * fixed bug where Serif Condensed Italic wouldn't get proper subfamily tags (by @@ -1230,4 +1312,4 @@ Changes from 0.9 to 0.9.1: - proper caron shape for dcaron and tcaron - minor visual changes -$Id: NEWS 2378 2010-05-27 08:11:33Z ben_laenen $ +$Id: NEWS 2471 2011-02-27 14:25:15Z ben_laenen $ diff --git a/reactos/media/fonts/doc/DejaVu_README.txt b/reactos/media/fonts/doc/DejaVu_README.txt index 64c9cac20e4..0f2079a9f38 100644 --- a/reactos/media/fonts/doc/DejaVu_README.txt +++ b/reactos/media/fonts/doc/DejaVu_README.txt @@ -1,4 +1,4 @@ -DejaVu fonts 2.31 (c)2004-2010 DejaVu fonts team +DejaVu fonts 2.33 (c)2004-2011 DejaVu fonts team ------------------------------------------------ The DejaVu fonts are a font family based on the Bitstream Vera Fonts @@ -56,4 +56,4 @@ U+213C-U+2140, U+2295-U+2298, U+2308-U+230B, U+26A2-U+26B1, U+2701-U+2704, U+2706-U+2709, U+270C-U+274B, U+2758-U+275A, U+2761-U+2775, U+2780-U+2794, U+2798-U+27AF, U+27B1-U+27BE, U+FB05-U+FB06 -$Id: README 2377 2010-05-27 08:02:08Z ben_laenen $ +$Id: README 2471 2011-02-27 14:25:15Z ben_laenen $ diff --git a/reactos/media/fonts/doc/DejaVu_langcover.txt b/reactos/media/fonts/doc/DejaVu_langcover.txt index 1673d9fef09..f503448771f 100644 --- a/reactos/media/fonts/doc/DejaVu_langcover.txt +++ b/reactos/media/fonts/doc/DejaVu_langcover.txt @@ -1,5 +1,5 @@ This is the language coverage file for DejaVu fonts -($Id: langcover.txt 2383 2010-05-27 09:23:21Z ben_laenen $) +($Id$) Sans Serif Sans Mono aa Afar 100% (62/62) 100% (62/62) 100% (62/62) @@ -8,13 +8,13 @@ af Afrikaans 100% (69/69) 100% (69/69) ak Akan 100% (73/73) 100% (73/73) 100% (73/73) am Amharic (0/264) (0/264) (0/264) an Aragonese 100% (66/66) 100% (66/66) 100% (66/66) -ar Arabic 100% (36/36) (0/36) 100% (36/36) +ar Arabic 100% (125/125) (0/125) 100% (125/125) as Assamese (0/64) (0/64) (0/64) ast Asturian/Bable/Leonese/Asturleonese 100% (66/66) 100% (66/66) 100% (66/66) av Avaric 100% (67/67) 100% (67/67) 100% (67/67) ay Aymara 100% (60/60) 100% (60/60) 100% (60/60) az-az Azerbaijani in Azerbaijan 100% (66/66) 100% (66/66) 100% (66/66) -az-ir Azerbaijani in Iran 100% (40/40) (0/40) 100% (40/40) +az-ir Azerbaijani in Iran 100% (130/130) (0/130) 100% (130/130) ba Bashkir 100% (82/82) 100% (82/82) 97% (80/82) be Byelorussian 100% (68/68) 100% (68/68) 100% (68/68) ber-dz Berber in Algeria 100% (70/70) 100% (70/70) 100% (70/70) @@ -54,7 +54,7 @@ eo Esperanto 100% (64/64) 100% (64/64) es Spanish 100% (66/66) 100% (66/66) 100% (66/66) et Estonian 100% (64/64) 100% (64/64) 100% (64/64) eu Basque 100% (56/56) 100% (56/56) 100% (56/56) -fa Persian 100% (40/40) (0/40) 100% (40/40) +fa Persian 100% (129/129) (0/129) 100% (129/129) fat Fanti 100% (73/73) 100% (73/73) 100% (73/73) ff Fulah (Fula) 100% (62/62) 100% (62/62) 100% (62/62) fi Finnish 100% (62/62) 100% (62/62) 100% (62/62) @@ -81,7 +81,7 @@ hr Croatian 100% (62/62) 100% (62/62) hsb Upper Sorbian 100% (72/72) 100% (72/72) 100% (72/72) ht Haitian/Haitian Creole 100% (56/56) 100% (56/56) 100% (56/56) hu Hungarian 100% (70/70) 100% (70/70) 100% (70/70) -hy Armenian 100% (77/77) (0/77) (0/77) +hy Armenian 100% (77/77) 100% (77/77) 100% (77/77) hz Herero 100% (57/57) 100% (57/57) 100% (57/57) ia Interlingua 100% (52/52) 100% (52/52) 100% (52/52) id Indonesian 100% (54/54) 100% (54/54) 100% (54/54) @@ -106,8 +106,8 @@ km Central Khmer (0/63) (0/63) kn Kannada (0/70) (0/70) (0/70) ko Korean (0/2443) (0/2443) (0/2443) kok Kokani (Devanagari script) (0/68) (0/68) (0/68) -kr Kanuri 100% (56/56) 96% (54/56) 100% (56/56) -ks Kashmiri 97% (43/44) (0/44) 93% (41/44) +kr Kanuri 100% (56/56) 100% (56/56) 100% (56/56) +ks Kashmiri 98% (143/145) (0/145) 97% (141/145) ku-am Kurdish in Armenia 100% (64/64) 100% (64/64) 100% (64/64) ku-iq Kurdish in Iraq 100% (32/32) (0/32) 87% (28/32) ku-ir Kurdish in Iran 100% (32/32) (0/32) 87% (28/32) @@ -118,7 +118,7 @@ kw Cornish 100% (64/64) 100% (64/64) kwm Kwambi 100% (52/52) 100% (52/52) 100% (52/52) ky Kirgiz 100% (70/70) 100% (70/70) 100% (70/70) la Latin 100% (68/68) 100% (68/68) 100% (68/68) -lah Lahnda 97% (43/44) (0/44) 93% (41/44) +lah Lahnda 98% (143/145) (0/145) 97% (141/145) lb Luxembourgish (Letzeburgesch) 100% (75/75) 100% (75/75) 100% (75/75) lez Lezghian (Lezgian) 100% (67/67) 100% (67/67) 100% (67/67) lg Ganda 100% (54/54) 100% (54/54) 100% (54/54) @@ -158,12 +158,10 @@ or Oriya (0/68) (0/68) os Ossetic 100% (66/66) 100% (66/66) 100% (66/66) ota Ottoman Turkish 100% (37/37) (0/37) 97% (36/37) pa Panjabi/Punjabi (0/63) (0/63) (0/63) -pa-pk Panjabi/Punjabi in Pakistan 97% (43/44) (0/44) 93% (41/44) +pa-pk Panjabi/Punjabi in Pakistan 98% (143/145) (0/145) 97% (141/145) pap-an Papiamento in Netherlands Antilles 100% (72/72) 100% (72/72) 100% (72/72) pap-aw Papiamento in Aruba 100% (54/54) 100% (54/54) 100% (54/54) -pes Western Farsi 100% (40/40) (0/40) 100% (40/40) pl Polish 100% (70/70) 100% (70/70) 100% (70/70) -prs Dari/Eastern Farsi 100% (40/40) (0/40) 100% (40/40) ps-af Pashto in Afghanistan 95% (47/49) (0/49) 77% (38/49) ps-pk Pashto in Pakistan 93% (46/49) (0/49) 75% (37/49) pt Portuguese 100% (82/82) 100% (82/82) 100% (82/82) @@ -219,12 +217,12 @@ tt Tatar 100% (76/76) 100% (76/76) tw Twi 100% (73/73) 100% (73/73) 100% (73/73) ty Tahitian 100% (65/65) 100% (65/65) 100% (65/65) tyv Tuvinian 100% (70/70) 100% (70/70) 100% (70/70) -ug Uighur 100% (36/36) (0/36) 100% (36/36) +ug Uighur 100% (125/125) (0/125) 100% (125/125) uk Ukrainian 100% (72/72) 100% (72/72) 100% (72/72) -ur Urdu 97% (43/44) (0/44) 93% (41/44) +ur Urdu 98% (143/145) (0/145) 97% (141/145) uz Uzbek 100% (52/52) 100% (52/52) 100% (52/52) ve Venda 100% (62/62) 100% (62/62) 100% (62/62) -vi Vietnamese 100% (194/194) 77% (150/194) 76% (148/194) +vi Vietnamese 100% (194/194) 100% (194/194) 76% (148/194) vo Volapuk 100% (54/54) 100% (54/54) 100% (54/54) vot Votic 100% (62/62) 100% (62/62) 100% (62/62) wa Walloon 100% (70/70) 100% (70/70) 100% (70/70) diff --git a/reactos/media/fonts/doc/DejaVu_status.txt b/reactos/media/fonts/doc/DejaVu_status.txt index 084667c173b..e860ef48db6 100644 --- a/reactos/media/fonts/doc/DejaVu_status.txt +++ b/reactos/media/fonts/doc/DejaVu_status.txt @@ -1,5 +1,5 @@ This is the status file for DejaVu fonts -($Id: status.txt 2383 2010-05-27 09:23:21Z ben_laenen $) +($Id: status.txt 2425 2010-08-22 16:07:31Z moyogo $) original = present in original Bitstream Vera 1.10 = added in DejaVu fonts @@ -381,12 +381,12 @@ U+01b6 uni01B6 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Conden U+01b7 uni01B7 2.3 U+01b8 uni01B8 2.3 U+01b9 uni01B9 2.3 -U+01ba uni01BA 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+01ba uni01BA 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) U+01bb uni01BB 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) U+01bc uni01BC 2.3 U+01bd uni01BD 2.3 U+01be uni01BE 2.3 -U+01bf uni01BF 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+01bf uni01BF 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) U+01c0 uni01C0 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) U+01c1 uni01C1 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) U+01c2 uni01C2 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) @@ -442,7 +442,7 @@ U+01f3 uni01F3 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Conden U+01f4 uni01F4 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) U+01f5 uni01F5 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) U+01f6 uni01F6 2.3 -U+01f7 uni01F7 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+01f7 uni01F7 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) U+01f8 uni01F8 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) U+01f9 uni01F9 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) U+01fa Aringacute 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) @@ -485,8 +485,8 @@ U+021e uni021E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Conden U+021f uni021F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) U+0220 uni0220 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.16 (Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.17 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.18 (Sans Mono, Sans Mono Bold) 2.23 (Serif Italic Condensed) U+0221 uni0221 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+0222 uni0222 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0223 uni0223 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0222 uni0222 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+0223 uni0223 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) U+0224 uni0224 2.3 U+0225 uni0225 2.3 U+0226 uni0226 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) @@ -518,19 +518,19 @@ U+023f uni023F 2.3 U+0240 uni0240 2.3 U+0241 uni0241 2.3 U+0242 uni0242 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+0243 uni0243 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0244 uni0244 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.27 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0243 uni0243 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0244 uni0244 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.27 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) U+0245 uni0245 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+0246 uni0246 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0247 uni0247 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0248 uni0248 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) -U+0249 uni0249 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) -U+024a uni024A 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+024b uni024B 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.26 (Sans ExtraLight) -U+024c uni024C 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) 2.27 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+024d uni024D 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) 2.27 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+024e uni024E 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+024f uni024F 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+0246 uni0246 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+0247 uni0247 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+0248 uni0248 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+0249 uni0249 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+024a uni024A 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+024b uni024B 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.26 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+024c uni024C 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) 2.27 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+024d uni024D 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) 2.27 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+024e uni024E 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+024f uni024F 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) U+0250 uni0250 1.14 U+0251 uni0251 1.14 U+0252 uni0252 1.14 @@ -656,7 +656,7 @@ U+02c9 uni02C9 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Conden U+02ca uni02CA 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) U+02cb uni02CB 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) U+02cc uni02CC 2.0 -U+02cd uni02CD 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+02cd uni02CD 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) U+02ce uni02CE 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) U+02cf uni02CF 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) U+02d0 uni02D0 1.14 @@ -785,12 +785,12 @@ U+0361 uni0361 2.0 U+0362 uni0362 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+0370 uni0370 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) U+0371 uni0371 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) -U+0372 uni0372 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+0373 uni0373 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+0372 uni0372 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+0373 uni0373 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) U+0374 uni0374 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) U+0375 uni0375 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0376 uni0376 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+0377 uni0377 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+0376 uni0376 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+0377 uni0377 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) U+037a uni037A 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) U+037b uni037B 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) U+037c uni037C 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans ExtraLight, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) @@ -868,7 +868,7 @@ U+03cb upsilondieresis 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Conde U+03cc omicrontonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) U+03cd upsilontonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) U+03ce omegatonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03cf uni03CF 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+03cf uni03CF 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) U+03d0 uni03D0 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) U+03d1 theta1 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) U+03d2 Upsilon1 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) @@ -1203,98 +1203,100 @@ U+051a uni051A 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Conde U+051b uni051B 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) U+051c uni051C 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) U+051d uni051D 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+051e uni051E 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+051f uni051F 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+0520 uni0520 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+0521 uni0521 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+0522 uni0522 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+0523 uni0523 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+0524 uni0524 2.29 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+0525 uni0525 2.29 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0531 uni0531 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0532 uni0532 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0533 uni0533 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0534 uni0534 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0535 uni0535 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0536 uni0536 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0537 uni0537 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0538 uni0538 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0539 uni0539 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+053a uni053A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+053b uni053B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+053c uni053C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+053d uni053D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+053e uni053E 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+053f uni053F 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0540 uni0540 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0541 uni0541 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0542 uni0542 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0543 uni0543 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0544 uni0544 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0545 uni0545 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0546 uni0546 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0547 uni0547 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0548 uni0548 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+0549 uni0549 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+054a uni054A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+054b uni054B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+054c uni054C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+054d uni054D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) -U+054e uni054E 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+054f uni054F 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) -U+0550 uni0550 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) -U+0551 uni0551 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0552 uni0552 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0553 uni0553 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+0554 uni0554 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0555 uni0555 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) -U+0556 uni0556 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0559 uni0559 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+055a uni055A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) -U+055b uni055B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+055c uni055C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+055d uni055D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) -U+055e uni055E 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+055f uni055F 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0561 uni0561 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+0562 uni0562 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) -U+0563 uni0563 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) -U+0564 uni0564 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) -U+0565 uni0565 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) -U+0566 uni0566 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) -U+0567 uni0567 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0568 uni0568 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) -U+0569 uni0569 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+056a uni056A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+056b uni056B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+056c uni056C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) -U+056d uni056D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) -U+056e uni056E 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+056f uni056F 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) -U+0570 uni0570 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) -U+0571 uni0571 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0572 uni0572 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) -U+0573 uni0573 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0574 uni0574 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0575 uni0575 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) -U+0576 uni0576 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0577 uni0577 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0578 uni0578 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) -U+0579 uni0579 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+057a uni057A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+057b uni057B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+057c uni057C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) -U+057d uni057D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) -U+057e uni057E 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) -U+057f uni057F 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) -U+0580 uni0580 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) -U+0581 uni0581 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) -U+0582 uni0582 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) -U+0583 uni0583 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) -U+0584 uni0584 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0585 uni0585 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) -U+0586 uni0586 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0587 uni0587 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) -U+0589 uni0589 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) -U+058a uni058A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0531 uni0531 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+0532 uni0532 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+0533 uni0533 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+0534 uni0534 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+0535 uni0535 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+0536 uni0536 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+0537 uni0537 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+0538 uni0538 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+0539 uni0539 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+053a uni053A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+053b uni053B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+053c uni053C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+053d uni053D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+053e uni053E 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+053f uni053F 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+0540 uni0540 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+0541 uni0541 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+0542 uni0542 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+0543 uni0543 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+0544 uni0544 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+0545 uni0545 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+0546 uni0546 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+0547 uni0547 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+0548 uni0548 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+0549 uni0549 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+054a uni054A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+054b uni054B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+054c uni054C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+054d uni054D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+054e uni054E 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+054f uni054F 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+0550 uni0550 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+0551 uni0551 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+0552 uni0552 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+0553 uni0553 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+0554 uni0554 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+0555 uni0555 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+0556 uni0556 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+0559 uni0559 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+055a uni055A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+055b uni055B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+055c uni055C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+055d uni055D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+055e uni055E 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+055f uni055F 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+0561 uni0561 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+0562 uni0562 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+0563 uni0563 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+0564 uni0564 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+0565 uni0565 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+0566 uni0566 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+0567 uni0567 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+0568 uni0568 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+0569 uni0569 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+056a uni056A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+056b uni056B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+056c uni056C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+056d uni056D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+056e uni056E 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+056f uni056F 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+0570 uni0570 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+0571 uni0571 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+0572 uni0572 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+0573 uni0573 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+0574 uni0574 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+0575 uni0575 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+0576 uni0576 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+0577 uni0577 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+0578 uni0578 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+0579 uni0579 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+057a uni057A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+057b uni057B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+057c uni057C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+057d uni057D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+057e uni057E 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+057f uni057F 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+0580 uni0580 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+0581 uni0581 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+0582 uni0582 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+0583 uni0583 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+0584 uni0584 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+0585 uni0585 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+0586 uni0586 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+0587 uni0587 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+0589 uni0589 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+058a uni058A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) U+05b0 uni05B0 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+05b1 uni05B1 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+05b2 uni05B2 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) @@ -1668,51 +1670,51 @@ U+10c2 uni10C2 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condense U+10c3 uni10C3 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) U+10c4 uni10C4 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) U+10c5 uni10C5 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10d0 uni10D0 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10d1 uni10D1 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10d2 uni10D2 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10d3 uni10D3 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10d4 uni10D4 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10d5 uni10D5 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10d6 uni10D6 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10d7 uni10D7 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10d8 uni10D8 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10d9 uni10D9 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10da uni10DA 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10db uni10DB 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10dc uni10DC 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10dd uni10DD 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10de uni10DE 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10df uni10DF 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10e0 uni10E0 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10e1 uni10E1 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10e2 uni10E2 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10e3 uni10E3 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10e4 uni10E4 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10e5 uni10E5 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10e6 uni10E6 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10e7 uni10E7 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10e8 uni10E8 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10e9 uni10E9 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10ea uni10EA 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10eb uni10EB 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10ec uni10EC 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10ed uni10ED 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10ee uni10EE 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10ef uni10EF 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10f0 uni10F0 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10f1 uni10F1 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10f2 uni10F2 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10f3 uni10F3 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10f4 uni10F4 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10f5 uni10F5 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10f6 uni10F6 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10f7 uni10F7 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10f8 uni10F8 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10f9 uni10F9 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10fa uni10FA 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10fb uni10FB 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10fc uni10FC 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10d0 uni10D0 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight) +U+10d1 uni10D1 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight) +U+10d2 uni10D2 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight) +U+10d3 uni10D3 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight) +U+10d4 uni10D4 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight) +U+10d5 uni10D5 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight) +U+10d6 uni10D6 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight) +U+10d7 uni10D7 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight) +U+10d8 uni10D8 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight) +U+10d9 uni10D9 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight) +U+10da uni10DA 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight) +U+10db uni10DB 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight) +U+10dc uni10DC 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight) +U+10dd uni10DD 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight) +U+10de uni10DE 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight) +U+10df uni10DF 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight) +U+10e0 uni10E0 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight) +U+10e1 uni10E1 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight) +U+10e2 uni10E2 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight) +U+10e3 uni10E3 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight) +U+10e4 uni10E4 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight) +U+10e5 uni10E5 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight) +U+10e6 uni10E6 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight) +U+10e7 uni10E7 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight) +U+10e8 uni10E8 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight) +U+10e9 uni10E9 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight) +U+10ea uni10EA 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight) +U+10eb uni10EB 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight) +U+10ec uni10EC 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight) +U+10ed uni10ED 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight) +U+10ee uni10EE 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight) +U+10ef uni10EF 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight) +U+10f0 uni10F0 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight) +U+10f1 uni10F1 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight) +U+10f2 uni10F2 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight) +U+10f3 uni10F3 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight) +U+10f4 uni10F4 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight) +U+10f5 uni10F5 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight) +U+10f6 uni10F6 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight) +U+10f7 uni10F7 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight) +U+10f8 uni10F8 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight) +U+10f9 uni10F9 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight) +U+10fa uni10FA 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight) +U+10fb uni10FB 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight) +U+10fc uni10FC 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight) U+1401 uni1401 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+1402 uni1402 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+1403 uni1403 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) @@ -2146,50 +2148,54 @@ U+1699 uni1699 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condense U+169a uni169A 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight) U+169b uni169B 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight) U+169c uni169C 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight) -U+1d00 uni1D00 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d01 uni1D01 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d00 uni1D00 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+1d01 uni1D01 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) U+1d02 uni1D02 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1d03 uni1D03 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d04 uni1D04 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) -U+1d05 uni1D05 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d06 uni1D06 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d07 uni1D07 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d03 uni1D03 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+1d04 uni1D04 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+1d05 uni1D05 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+1d06 uni1D06 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+1d07 uni1D07 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) U+1d08 uni1D08 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) U+1d09 uni1D09 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1d0a uni1D0A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d0b uni1D0B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) -U+1d0c uni1D0C 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d0d uni1D0D 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) -U+1d0e uni1D0E 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) -U+1d0f uni1D0F 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) -U+1d10 uni1D10 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) -U+1d11 uni1D11 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) -U+1d12 uni1D12 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) -U+1d13 uni1D13 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) +U+1d0a uni1D0A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+1d0b uni1D0B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+1d0c uni1D0C 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+1d0d uni1D0D 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+1d0e uni1D0E 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+1d0f uni1D0F 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+1d10 uni1D10 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+1d11 uni1D11 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+1d12 uni1D12 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+1d13 uni1D13 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) U+1d14 uni1D14 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1d15 uni1D15 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) U+1d16 uni1D16 2.3 U+1d17 uni1D17 2.3 -U+1d18 uni1D18 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d19 uni1D19 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) -U+1d1a uni1D1A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) -U+1d1b uni1D1B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d1c uni1D1C 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d18 uni1D18 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+1d19 uni1D19 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+1d1a uni1D1A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+1d1b uni1D1B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+1d1c uni1D1C 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) U+1d1d uni1D1D 2.3 U+1d1e uni1D1E 2.3 U+1d1f uni1D1F 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+1d20 uni1D20 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) -U+1d21 uni1D21 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) -U+1d22 uni1D22 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) -U+1d23 uni1D23 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d26 uni1D26 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) -U+1d27 uni1D27 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) -U+1d28 uni1D28 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) -U+1d29 uni1D29 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d2a uni1D2A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d2b uni1D2B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) +U+1d20 uni1D20 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+1d21 uni1D21 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+1d22 uni1D22 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+1d23 uni1D23 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+1d24 uni1D24 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+1d25 uni1D25 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+1d26 uni1D26 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+1d27 uni1D27 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+1d28 uni1D28 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+1d29 uni1D29 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+1d2a uni1D2A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+1d2b uni1D2B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) U+1d2c uni1D2C 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) U+1d2d uni1D2D 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) U+1d2e uni1D2E 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+1d2f uni1D2F 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) U+1d30 uni1D30 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) U+1d31 uni1D31 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) U+1d32 uni1D32 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) @@ -2203,7 +2209,7 @@ U+1d39 uni1D39 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Obliq U+1d3a uni1D3A 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) U+1d3b uni1D3B 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) U+1d3c uni1D3C 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+1d3d uni1D3D 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono Oblique) +U+1d3d uni1D3D 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) U+1d3e uni1D3E 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) U+1d3f uni1D3F 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) U+1d40 uni1D40 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) @@ -2234,23 +2240,26 @@ U+1d58 uni1D58 2.3 U+1d59 uni1D59 2.3 U+1d5a uni1D5A 2.3 U+1d5b uni1D5B 2.3 -U+1d5d uni1D5D 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+1d5e uni1D5E 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+1d5f uni1D5F 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+1d60 uni1D60 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+1d61 uni1D61 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+1d5c uni1D5C 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+1d5d uni1D5D 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+1d5e uni1D5E 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+1d5f uni1D5F 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+1d60 uni1D60 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+1d61 uni1D61 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) U+1d62 uni1D62 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) U+1d63 uni1D63 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) U+1d64 uni1D64 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) U+1d65 uni1D65 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+1d66 uni1D66 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+1d67 uni1D67 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+1d68 uni1D68 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+1d69 uni1D69 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+1d6a uni1D6A 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+1d66 uni1D66 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+1d67 uni1D67 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+1d68 uni1D68 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+1d69 uni1D69 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+1d6a uni1D6A 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+1d6b uni1D6B 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) U+1d77 uni1D77 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) U+1d78 uni1D78 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) U+1d7b uni1D7B 2.3 +U+1d7d uni1D7D 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+1d85 uni1D85 2.3 U+1d9b uni1D9B 2.3 U+1d9c uni1D9C 2.3 @@ -2281,7 +2290,7 @@ U+1db4 uni1DB4 2.3 U+1db5 uni1DB5 2.3 U+1db6 uni1DB6 2.3 U+1db7 uni1DB7 2.3 -U+1db8 uni1DB8 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+1db8 uni1DB8 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) U+1db9 uni1DB9 2.3 U+1dba uni1DBA 2.3 U+1dbb uni1DBB 2.3 @@ -2341,8 +2350,8 @@ U+1e2a uni1E2A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Conden U+1e2b uni1E2B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) U+1e2c uni1E2C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) U+1e2d uni1E2D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e2e uni1E2E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1e2f uni1E2F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+1e2e uni1E2E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+1e2f uni1E2F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) U+1e30 uni1E30 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) U+1e31 uni1E31 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) U+1e32 uni1E32 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) @@ -2373,8 +2382,8 @@ U+1e4a uni1E4A 1.13 U+1e4b uni1E4B 1.13 U+1e4c uni1E4C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.30 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) U+1e4d uni1E4D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.30 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) -U+1e4e uni1E4E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1e4f uni1E4F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+1e4e uni1E4E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+1e4f uni1E4F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) U+1e50 uni1E50 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) U+1e51 uni1E51 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) U+1e52 uni1E52 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) @@ -2395,10 +2404,10 @@ U+1e60 uni1E60 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Conden U+1e61 uni1E61 2.1 U+1e62 uni1E62 2.1 U+1e63 uni1E63 2.1 -U+1e64 uni1E64 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+1e65 uni1E65 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+1e66 uni1E66 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1e67 uni1E67 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+1e64 uni1E64 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+1e65 uni1E65 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+1e66 uni1E66 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+1e67 uni1E67 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) U+1e68 uni1E68 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) U+1e69 uni1E69 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) U+1e6a uni1E6A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) @@ -2451,20 +2460,22 @@ U+1e98 uni1E98 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Conden U+1e99 uni1E99 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) U+1e9a uni1E9A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans ExtraLight) 2.23 (Serif Italic Condensed) U+1e9b uni1E9B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e9e uni1E9E 2.28 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1e9c uni1E9C 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+1e9d uni1E9D 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+1e9e uni1E9E 2.28 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) 2.32 (Sans ExtraLight) U+1e9f uni1E9F 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) U+1ea0 uni1EA0 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) U+1ea1 uni1EA1 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) U+1ea2 uni1EA2 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) U+1ea3 uni1EA3 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1ea4 uni1EA4 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1ea5 uni1EA5 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1ea6 uni1EA6 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1ea7 uni1EA7 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1ea8 uni1EA8 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1ea9 uni1EA9 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1eaa uni1EAA 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1eab uni1EAB 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+1ea4 uni1EA4 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+1ea5 uni1EA5 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+1ea6 uni1EA6 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+1ea7 uni1EA7 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+1ea8 uni1EA8 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+1ea9 uni1EA9 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+1eaa uni1EAA 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+1eab uni1EAB 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) U+1eac uni1EAC 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) U+1ead uni1EAD 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) U+1eae uni1EAE 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) @@ -2483,14 +2494,14 @@ U+1eba uni1EBA 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Conden U+1ebb uni1EBB 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) U+1ebc uni1EBC 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) U+1ebd uni1EBD 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1ebe uni1EBE 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1ebf uni1EBF 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1ec0 uni1EC0 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1ec1 uni1EC1 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1ec2 uni1EC2 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1ec3 uni1EC3 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1ec4 uni1EC4 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1ec5 uni1EC5 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+1ebe uni1ebe 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+1ebf uni1ebF 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+1ec0 uni1EC0 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+1ec1 uni1EC1 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+1ec2 uni1EC2 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+1ec3 uni1EC3 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+1ec4 uni1EC4 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+1ec5 uni1EC5 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) U+1ec6 uni1EC6 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) U+1ec7 uni1EC7 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) U+1ec8 uni1EC8 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) @@ -2501,40 +2512,40 @@ U+1ecc uni1ECC 2.2 U+1ecd uni1ECD 2.2 U+1ece uni1ECE 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) U+1ecf uni1ECF 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1ed0 uni1ED0 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1ed1 uni1ED1 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1ed2 uni1ED2 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1ed3 uni1ED3 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1ed4 uni1ED4 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1ed5 uni1ED5 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1ed6 uni1ED6 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1ed7 uni1ED7 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+1ed0 uni1ED0 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+1ed1 uni1ED1 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+1ed2 uni1ED2 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+1ed3 uni1ED3 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+1ed4 uni1ED4 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+1ed5 uni1ED5 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+1ed6 uni1ED6 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+1ed7 uni1ED7 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) U+1ed8 uni1ED8 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) U+1ed9 uni1ED9 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1eda uni1EDA 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1edb uni1EDB 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1edc uni1EDC 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1edd uni1EDD 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1ede uni1EDE 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1edf uni1EDF 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1ee0 uni1EE0 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1ee1 uni1EE1 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1ee2 uni1EE2 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1ee3 uni1EE3 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1eda uni1EDA 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+1edb uni1EDB 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+1edc uni1EDC 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+1edd uni1EDD 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+1ede uni1EDE 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+1edf uni1EDF 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+1ee0 uni1EE0 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+1ee1 uni1EE1 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+1ee2 uni1EE2 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+1ee3 uni1EE3 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) U+1ee4 uni1EE4 2.2 U+1ee5 uni1EE5 2.2 U+1ee6 uni1EE6 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) U+1ee7 uni1EE7 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1ee8 uni1EE8 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1ee9 uni1EE9 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1eea uni1EEA 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1eeb uni1EEB 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1eec uni1EEC 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1eed uni1EED 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1eee uni1EEE 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1eef uni1EEF 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1ef0 uni1EF0 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1ef1 uni1EF1 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1ee8 uni1EE8 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+1ee9 uni1EE9 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+1eea uni1EEA 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+1eeb uni1EEB 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+1eec uni1EEC 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+1eed uni1EED 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+1eee uni1EEE 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+1eef uni1EEF 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+1ef0 uni1EF0 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+1ef1 uni1EF1 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) U+1ef2 Ygrave 1.2 U+1ef3 ygrave 1.2 U+1ef4 uni1EF4 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) @@ -2543,6 +2554,8 @@ U+1ef6 uni1EF6 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Conden U+1ef7 uni1EF7 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) U+1ef8 uni1EF8 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) U+1ef9 uni1EF9 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1efa uni1EFA 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+1efb uni1EFB 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) U+1f00 uni1F00 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) U+1f01 uni1F01 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) U+1f02 uni1F02 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) @@ -2816,6 +2829,8 @@ U+2024 onedotenleader 2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Conden U+2025 twodotenleader 2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.9 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) U+2026 ellipsis original U+2027 uni2027 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2028 uni2028 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+2029 uni2029 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) U+202a uni202A 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) U+202b uni202B 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) U+202c uni202C 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) @@ -2849,7 +2864,7 @@ U+2047 uni2047 2.0 U+2048 uni2048 2.0 U+2049 uni2049 2.0 U+204a uni204A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+204b uni204B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+204b uni204B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) U+204c uni204C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) U+204d uni204D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) U+204e uni204E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) @@ -2915,6 +2930,14 @@ U+2091 uni2091 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Obliq U+2092 uni2092 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) U+2093 uni2093 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) U+2094 uni2094 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+2095 uni2095 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+2096 uni2096 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+2097 uni2097 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+2098 uni2098 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+2099 uni2099 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+209a uni209A 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+209b uni209B 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+209c uni209C 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) U+20a0 uni20A0 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) U+20a1 colonmonetary 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) U+20a2 uni20A2 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) @@ -2937,6 +2960,8 @@ U+20b2 uni20B2 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Obliq U+20b3 uni20B3 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) U+20b4 uni20B4 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) U+20b5 uni20B5 2.2 +U+20b8 uni20B8 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+20b9 uni20B9 2.32 U+20d0 uni20D0 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) U+20d1 uni20D1 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) U+20d6 uni20D6 2.8 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) @@ -3019,6 +3044,9 @@ U+2148 uni2148 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Obliq U+2149 uni2149 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed) U+214b uni214B 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) U+214e uni214E 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2150 uni2150 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+2151 uni2151 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+2152 uni2152 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) U+2153 onethird 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) U+2154 twothirds 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) U+2155 uni2155 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) @@ -3065,10 +3093,12 @@ U+217d uni217D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Conden U+217e uni217E 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) U+217f uni217F 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) U+2180 uni2180 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2181 uni2181 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2182 uni2182 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2181 uni2181 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight) +U+2182 uni2182 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight) U+2183 uni2183 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) U+2184 uni2184 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2185 uni2185 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+2189 uni2189 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) U+2190 arrowleft 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) U+2191 arrowup 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) U+2192 arrowright 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) @@ -3343,10 +3373,10 @@ U+229e uni229E 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Conden U+229f uni229F 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) U+22a0 uni22A0 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) U+22a1 uni22A1 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+22a2 uni22A2 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+22a3 uni22A3 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+22a4 uni22A4 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+22a5 perpendicular 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+22a2 uni22A2 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+22a3 uni22A3 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+22a4 uni22A4 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+22a5 perpendicular 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) U+22a6 uni22A6 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) U+22a7 uni22A7 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) U+22a8 uni22A8 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) @@ -3539,30 +3569,31 @@ U+238a uni238A 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Obli U+238b uni238B 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) U+2394 uni2394 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) U+2395 uni2395 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+239b uni239B 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+239c uni239C 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+239d uni239D 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+239e uni239E 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+239f uni239F 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+23a0 uni23A0 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+23a1 uni23A1 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+23a2 uni23A2 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+23a3 uni23A3 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+23a4 uni23A4 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+23a5 uni23A5 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+23a6 uni23A6 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+23a7 uni23A7 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+23a8 uni23A8 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+23a9 uni23A9 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+23aa uni23AA 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+23ab uni23AB 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+23ac uni23AC 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+23ad uni23AD 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+239b uni239B 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+239c uni239C 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+239d uni239D 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+239e uni239E 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+239f uni239F 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+23a0 uni23A0 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+23a1 uni23A1 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+23a2 uni23A2 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+23a3 uni23A3 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+23a4 uni23A4 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+23a5 uni23A5 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+23a6 uni23A6 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+23a7 uni23A7 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+23a8 uni23A8 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+23a9 uni23A9 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+23aa uni23AA 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+23ab uni23AB 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+23ac uni23AC 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+23ad uni23AD 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) U+23ae uni23AE 2.3 U+23ce uni23CE 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) U+23cf uni23CF 2.3 U+23e3 uni23E3 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) U+23e5 uni23E5 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+23e8 uni23E8 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+2422 uni2422 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+2423 uni2423 1.6 U+2460 uni2460 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) @@ -4013,6 +4044,11 @@ U+26b5 uni26B5 2.29 (Sans, Sans Bold, Sans Bold Oblique, Sans Conde U+26b6 uni26B6 2.29 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+26b7 uni26B7 2.29 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+26b8 uni26B8 2.29 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+26c0 uni26C0 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+26c1 uni26C1 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+26c2 uni26C2 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+26c3 uni26C3 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+26e2 uni26E2 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+2701 uni2701 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) U+2702 uni2702 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) U+2703 uni2703 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) @@ -4717,10 +4753,10 @@ U+2b23 uni2B23 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Conde U+2b24 uni2B24 2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Sans Bold) U+2b53 uni2B53 2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Sans Bold) U+2b54 uni2B54 2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Sans Bold) -U+2c60 uni2C60 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+2c61 uni2C61 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+2c60 uni2C60 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+2c61 uni2C61 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) U+2c62 uni2C62 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+2c63 uni2C63 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+2c63 uni2C63 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) U+2c64 uni2C64 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.27 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) U+2c65 uni2C65 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) U+2c66 uni2C66 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) @@ -4962,50 +4998,80 @@ U+a71c uniA71C 2.27 U+a71d uniA71D 2.27 U+a71e uniA71E 2.27 U+a71f uniA71F 2.27 -U+a726 uniA726 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.30 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+a727 uniA727 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.30 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+a728 uniA728 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+a729 uniA729 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+a72a uniA72A 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+a72b uniA72B 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+a730 uniA730 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+a731 uniA731 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+a732 uniA732 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+a733 uniA733 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+a734 uniA734 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+a735 uniA735 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+a736 uniA736 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+a737 uniA737 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+a738 uniA738 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+a739 uniA739 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+a73a uniA73A 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+a73b uniA73B 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+a73c uniA73C 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+a73d uniA73D 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+a73e uniA73E 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+a73f uniA73F 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+a746 uniA746 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+a747 uniA747 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a722 uniA722 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+a723 uniA723 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+a724 uniA724 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+a725 uniA725 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+a726 uniA726 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.30 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+a727 uniA727 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.30 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+a728 uniA728 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+a729 uniA729 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+a72a uniA72A 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+a72b uniA72B 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+a72c uniA72C 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+a72d uniA72D 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+a72e uniA72E 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+a72f uniA72F 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+a730 uniA730 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+a731 uniA731 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+a732 uniA732 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+a733 uniA733 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+a734 uniA734 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+a735 uniA735 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+a736 uniA736 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+a737 uniA737 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+a738 uniA738 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+a739 uniA739 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+a73a uniA73A 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+a73b uniA73B 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+a73c uniA73C 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+a73d uniA73D 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+a73e uniA73E 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+a73f uniA73F 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+a746 uniA746 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+a747 uniA747 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) U+a748 uniA748 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+a749 uniA749 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+a74a uniA74A 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+a74b uniA74B 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+a74e uniA74E 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+a74f uniA74F 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+a780 uniA780 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+a781 uniA781 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+a782 uniA782 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+a783 uniA783 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+a74a uniA74A 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+a74b uniA74B 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+a74e uniA74E 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+a74f uniA74F 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+a750 uniA750 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+a751 uniA751 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+a752 uniA752 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+a753 uniA753 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+a756 uniA756 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+a757 uniA757 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+a764 uniA764 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+a765 uniA765 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+a766 uniA766 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+a767 uniA767 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+a768 uniA768 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+a769 uniA769 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+a77b uniA77B 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+a77c uniA77C 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+a780 uniA780 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+a781 uniA781 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+a782 uniA782 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+a783 uniA783 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+a784 uniA784 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+a785 uniA785 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+a786 uniA786 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+a787 uniA787 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) U+a789 uniA789 2.28 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) U+a78a uniA78A 2.28 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) U+a78b uniA78B 2.26 U+a78c uniA78C 2.26 U+a78d uniA78D 2.31 -U+a7fb uniA7FB 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+a7fc uniA7FC 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+a7fd uniA7FD 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+a7fe uniA7FE 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+a7ff uniA7FF 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a78e uniA78E 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+a790 uniA790 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+a791 uniA791 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+a7fa uniA7FA 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+a7fb uniA7FB 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+a7fc uniA7FC 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+a7fd uniA7FD 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+a7fe uniA7FE 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+a7ff uniA7FF 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) U+e000 uniE000 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) U+e001 uniE001 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) U+e002 uniE002 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) @@ -5036,8 +5102,36 @@ U+e01a uniE01A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Conden U+e01b uniE01B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+e01c uniE01C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+e01d uniE01D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+ef00 uni02E5.5 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+ef01 uni02E6.5 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+ef02 uni02E7.5 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+ef03 uni02E8.5 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+ef04 uni02E9.5 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+ef05 uni02E5.4 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+ef06 uni02E6.4 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+ef07 uni02E7.4 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+ef08 uni02E8.4 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+ef09 uni02E9.4 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+ef0a uni02E5.3 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+ef0b uni02E6.3 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+ef0c uni02E7.3 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+ef0d uni02E8.3 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+ef0e uni02E9.3 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+ef0f uni02E5.2 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+ef10 uni02E6.2 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+ef11 uni02E7.2 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+ef12 uni02E8.2 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+ef13 uni02E9.2 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+ef14 uni02E5.1 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+ef15 uni02E6.1 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+ef16 uni02E7.1 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+ef17 uni02E8.1 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+ef18 uni02E9.1 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+ef19 stem 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+f000 uniF000 2.10 (Sans) 2.11 (Sans Condensed) U+f001 uniF001 2.10 (Sans) 2.11 (Sans Condensed) +U+f002 uniF002 2.33 (Sans, Sans Condensed) +U+f003 uniF003 2.33 (Sans, Sans Condensed) U+f208 uniF208 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+f20a uniF20A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+f215 uniF215 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) @@ -5132,17 +5226,21 @@ U+fb33 uniFB33 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Conden U+fb34 uniFB34 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+fb35 uniFB35 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+fb36 uniFB36 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+fb37 uniFB37 2.11 (Sans Condensed Oblique, Sans Oblique) +U+fb37 uniFB37 2.11 (Sans Condensed Oblique, Sans Oblique) 2.33 (Sans Bold Oblique, Sans Condensed Bold Oblique) U+fb38 uniFB38 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+fb39 uniFB39 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+fb3a uniFB3A 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+fb3b uniFB3B 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+fb3c uniFB3C 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb3d uniFB3D 2.33 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+fb3e uniFB3E 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb3f uniFB3F 2.33 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+fb40 uniFB40 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+fb41 uniFB41 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb42 uniFB42 2.33 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+fb43 uniFB43 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+fb44 uniFB44 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb45 uniFB45 2.33 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+fb46 uniFB46 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+fb47 uniFB47 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+fb48 uniFB48 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) @@ -5417,6 +5515,41 @@ U+fffa uniFFFA 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Conde U+fffb uniFFFB 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) U+fffc uniFFFC 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) U+fffd uniFFFD 1.12 +U+10300 u10300 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+10301 u10301 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+10302 u10302 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+10303 u10303 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+10304 u10304 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+10305 u10305 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+10306 u10306 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+10307 u10307 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+10308 u10308 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+10309 u10309 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1030a u1030A 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1030b u1030B 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1030c u1030C 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1030d u1030D 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1030e u1030E 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1030f u1030F 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+10310 u10310 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+10311 u10311 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+10312 u10312 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+10313 u10313 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+10314 u10314 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+10315 u10315 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+10316 u10316 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+10317 u10317 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+10318 u10318 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+10319 u10319 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1031a u1031A 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1031b u1031B 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1031c u1031C 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1031d u1031D 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1031e u1031E 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+10320 u10320 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+10321 u10321 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+10322 u10322 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+10323 u10323 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+1d300 u1D300 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+1d301 u1D301 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+1d302 u1D302 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) @@ -6308,3 +6441,217 @@ U+1d7fc u1D7FC 2.23 (Sans Mono) U+1d7fd u1D7FD 2.23 (Sans Mono) U+1d7fe u1D7FE 2.23 (Sans Mono) U+1d7ff u1D7FF 2.23 (Sans Mono) +U+1f030 u1F030 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f031 u1F031 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f032 u1F032 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f033 u1F033 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f034 u1F034 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f035 u1F035 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f036 u1F036 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f037 u1F037 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f038 u1F038 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f039 u1F039 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f03a u1F03A 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f03b u1F03B 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f03c u1F03C 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f03d u1F03D 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f03e u1F03E 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f03f u1F03F 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f040 u1F040 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f041 u1F041 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f042 u1F042 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f043 u1F043 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f044 u1F044 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f045 u1F045 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f046 u1F046 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f047 u1F047 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f048 u1F048 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f049 u1F049 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f04a u1F04A 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f04b u1F04B 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f04c u1F04C 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f04d u1F04D 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f04e u1F04E 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f04f u1F04F 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f050 u1F050 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f051 u1F051 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f052 u1F052 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f053 u1F053 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f054 u1F054 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f055 u1F055 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f056 u1F056 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f057 u1F057 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f058 u1F058 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f059 u1F059 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f05a u1F05A 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f05b u1F05B 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f05c u1F05C 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f05d u1F05D 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f05e u1F05E 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f05f u1F05F 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f060 u1F060 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f061 u1F061 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f062 u1F062 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f063 u1F063 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f064 u1F064 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f065 u1F065 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f066 u1F066 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f067 u1F067 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f068 u1F068 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f069 u1F069 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f06a u1F06A 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f06b u1F06B 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f06c u1F06C 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f06d u1F06D 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f06e u1F06E 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f06f u1F06F 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f070 u1F070 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f071 u1F071 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f072 u1F072 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f073 u1F073 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f074 u1F074 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f075 u1F075 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f076 u1F076 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f077 u1F077 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f078 u1F078 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f079 u1F079 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f07a u1F07A 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f07b u1F07B 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f07c u1F07C 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f07d u1F07D 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f07e u1F07E 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f07f u1F07F 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f080 u1F080 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f081 u1F081 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f082 u1F082 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f083 u1F083 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f084 u1F084 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f085 u1F085 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f086 u1F086 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f087 u1F087 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f088 u1F088 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f089 u1F089 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f08a u1F08A 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f08b u1F08B 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f08c u1F08C 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f08d u1F08D 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f08e u1F08E 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f08f u1F08F 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f090 u1F090 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f091 u1F091 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f092 u1F092 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f093 u1F093 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f0a0 u1F0A0 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f0a1 u1F0A1 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f0a2 u1F0A2 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f0a3 u1F0A3 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f0a4 u1F0A4 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f0a5 u1F0A5 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f0a6 u1F0A6 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f0a7 u1F0A7 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f0a8 u1F0A8 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f0a9 u1F0A9 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f0aa u1F0AA 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f0ab u1F0AB 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f0ac u1F0AC 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f0ad u1F0AD 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f0ae u1F0AE 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f0b1 u1F0B1 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f0b2 u1F0B2 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f0b3 u1F0B3 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f0b4 u1F0B4 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f0b5 u1F0B5 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f0b6 u1F0B6 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f0b7 u1F0B7 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f0b8 u1F0B8 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f0b9 u1F0B9 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f0ba u1F0BA 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f0bb u1F0BB 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f0bc u1F0BC 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f0bd u1F0BD 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f0be u1F0BE 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f0c1 u1F0C1 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f0c2 u1F0C2 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f0c3 u1F0C3 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f0c4 u1F0C4 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f0c5 u1F0C5 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f0c6 u1F0C6 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f0c7 u1F0C7 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f0c8 u1F0C8 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f0c9 u1F0C9 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f0ca u1F0CA 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f0cb u1F0CB 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f0cc u1F0CC 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f0cd u1F0CD 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f0ce u1F0CE 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f0cf u1F0CF 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f0d1 u1F0D1 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f0d2 u1F0D2 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f0d3 u1F0D3 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f0d4 u1F0D4 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f0d5 u1F0D5 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f0d6 u1F0D6 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f0d7 u1F0D7 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f0d8 u1F0D8 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f0d9 u1F0D9 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f0da u1F0DA 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f0db u1F0DB 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f0dc u1F0DC 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f0dd u1F0DD 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f0de u1F0DE 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f0df u1F0DF 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f42d u1F42D 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f42e u1F42E 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f431 u1F431 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f435 u1F435 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f601 u1F601 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f602 u1F602 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f603 u1F603 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f604 u1F604 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f605 u1F605 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f606 u1F606 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f607 u1F607 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f608 u1F608 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f609 u1F609 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f60a u1F60A 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f60b u1F60B 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f60c u1F60C 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f60d u1F60D 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f60e u1F60E 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f60f u1F60F 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f610 u1F610 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f612 u1F612 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f613 u1F613 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f614 u1F614 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f616 u1F616 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f618 u1F618 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f61a u1F61A 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f61c u1F61C 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f61d u1F61D 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f61e u1F61E 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f620 u1F620 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f621 u1F621 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f622 u1F622 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f623 u1F623 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f625 u1F625 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f628 u1F628 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f629 u1F629 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f62a u1F62A 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f62b u1F62B 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f62d u1F62D 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f630 u1F630 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f631 u1F631 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f632 u1F632 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f633 u1F633 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f635 u1F635 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f636 u1F636 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f637 u1F637 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f638 u1F638 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f639 u1F639 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f63a u1F63A 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f63b u1F63B 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f63c u1F63C 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f63d u1F63D 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f63e u1F63E 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f63f u1F63F 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1f640 u1F640 2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) diff --git a/reactos/media/fonts/doc/DejaVu_unicover.txt b/reactos/media/fonts/doc/DejaVu_unicover.txt index 81ce70338e9..42c212253f8 100644 --- a/reactos/media/fonts/doc/DejaVu_unicover.txt +++ b/reactos/media/fonts/doc/DejaVu_unicover.txt @@ -1,5 +1,5 @@ This is the Unicode coverage file for DejaVu fonts -($Id: unicover.txt 2383 2010-05-27 09:23:21Z ben_laenen $) +($Id$) Control and similar characters are discounted from totals. @@ -7,38 +7,39 @@ Control and similar characters are discounted from totals. U+0000 Basic Latin 100% (95/95) 100% (95/95) 100% (95/95) U+0080 Latin-1 Supplement 100% (96/96) 100% (96/96) 100% (96/96) U+0100 Latin Extended-A 100% (128/128) 100% (128/128) 100% (128/128) -U+0180 Latin Extended-B 100% (208/208) 91% (191/208) 86% (179/208) +U+0180 Latin Extended-B 100% (208/208) 100% (208/208) 86% (180/208) U+0250 IPA Extensions 100% (96/96) 100% (96/96) 100% (96/96) -U+02b0 Spacing Modifier Letters 78% (63/80) 56% (45/80) 60% (48/80) +U+02b0 Spacing Modifier Letters 78% (63/80) 57% (46/80) 60% (48/80) U+0300 Combining Diacritical Marks 83% (93/112) 60% (68/112) 59% (67/112) -U+0370 Greek and Coptic 100% (134/134) 85% (115/134) 82% (110/134) +U+0370 Greek and Coptic 100% (134/134) 89% (120/134) 82% (110/134) U+0400 Cyrillic 100% (256/256) 78% (200/256) 70% (180/256) -U+0500 Cyrillic Supplement 94% (36/38) 26% (10/38) 15% (6/38) -U+0530 Armenian 100% (86/86) (0/86) (0/86) +U+0500 Cyrillic Supplement 95% (38/40) 25% (10/40) 15% (6/40) +U+0530 Armenian 100% (86/86) 100% (86/86) 100% (86/86) U+0590 Hebrew 62% (54/87) (0/87) (0/87) -U+0600 Arabic 64% (161/250) (0/250) 39% (99/250) +U+0600 Arabic 63% (161/252) (0/252) 39% (99/252) U+0700 Syriac (0/77) (0/77) (0/77) U+0750 Arabic Supplement (0/48) (0/48) (0/48) U+0780 Thaana (0/50) (0/50) (0/50) U+07c0 NKo 91% (54/59) (0/59) (0/59) U+0800 Samaritan (0/61) (0/61) (0/61) -U+0900 Devanagari (0/117) (0/117) (0/117) +U+0840 Mandaic (0/29) (0/29) (0/29) +U+0900 Devanagari (0/127) (0/127) (0/127) U+0980 Bengali (0/92) (0/92) (0/92) U+0a00 Gurmukhi (0/79) (0/79) (0/79) U+0a80 Gujarati (0/83) (0/83) (0/83) -U+0b00 Oriya (0/84) (0/84) (0/84) +U+0b00 Oriya (0/90) (0/90) (0/90) U+0b80 Tamil (0/72) (0/72) (0/72) U+0c00 Telugu (0/93) (0/93) (0/93) U+0c80 Kannada (0/86) (0/86) (0/86) -U+0d00 Malayalam (0/95) (0/95) (0/95) +U+0d00 Malayalam (0/98) (0/98) (0/98) U+0d80 Sinhala (0/80) (0/80) (0/80) U+0e00 Thai 1% (1/87) (0/87) (0/87) U+0e80 Lao 100% (65/65) (0/65) 70% (46/65) -U+0f00 Tibetan (0/205) (0/205) (0/205) +U+0f00 Tibetan (0/211) (0/211) (0/211) U+1000 Myanmar (0/160) (0/160) (0/160) U+10a0 Georgian 100% (83/83) 100% (83/83) 54% (45/83) U+1100 Hangul Jamo (0/256) (0/256) (0/256) -U+1200 Ethiopic (0/356) (0/356) (0/356) +U+1200 Ethiopic (0/358) (0/358) (0/358) U+1380 Ethiopic Supplement (0/26) (0/26) (0/26) U+13a0 Cherokee (0/85) (0/85) (0/85) U+1400 Unified Canadian Aboriginal Syllabics 63% (404/640) (0/640) (0/640) @@ -59,32 +60,33 @@ U+1a00 Buginese (0/30) (0/30) U+1a20 Tai Tham (0/127) (0/127) (0/127) U+1b00 Balinese (0/121) (0/121) (0/121) U+1b80 Sundanese (0/55) (0/55) (0/55) +U+1bc0 Batak (0/56) (0/56) (0/56) U+1c00 Lepcha (0/74) (0/74) (0/74) U+1c50 Ol Chiki (0/48) (0/48) (0/48) U+1cd0 Vedic Extensions (0/35) (0/35) (0/35) -U+1d00 Phonetic Extensions 82% (105/128) 48% (62/128) 48% (62/128) -U+1d80 Phonetic Extensions Supplement 59% (38/64) 57% (37/64) 57% (37/64) -U+1dc0 Combining Diacritical Marks Supplement 14% (6/42) 14% (6/42) (0/42) -U+1e00 Latin Extended Additional 96% (248/256) 76% (196/256) 71% (182/256) +U+1d00 Phonetic Extensions 82% (106/128) 86% (111/128) 48% (62/128) +U+1d80 Phonetic Extensions Supplement 59% (38/64) 59% (38/64) 57% (37/64) +U+1dc0 Combining Diacritical Marks Supplement 13% (6/43) 13% (6/43) (0/43) +U+1e00 Latin Extended Additional 98% (252/256) 98% (252/256) 71% (182/256) U+1f00 Greek Extended 100% (233/233) 100% (233/233) 100% (233/233) -U+2000 General Punctuation 98% (105/107) 81% (87/107) 47% (51/107) -U+2070 Superscripts and Subscripts 100% (34/34) 100% (34/34) 100% (34/34) -U+20a0 Currency Symbols 88% (22/25) 24% (6/25) 88% (22/25) +U+2000 General Punctuation 100% (107/107) 81% (87/107) 48% (52/107) +U+2070 Superscripts and Subscripts 100% (42/42) 100% (42/42) 100% (42/42) +U+20a0 Currency Symbols 92% (24/26) 26% (7/26) 92% (24/26) U+20d0 Combining Diacritical Marks for Symbols 21% (7/33) (0/33) (0/33) U+2100 Letterlike Symbols 93% (75/80) 40% (32/80) 21% (17/80) -U+2150 Number Forms 86% (50/58) 86% (50/58) 22% (13/58) +U+2150 Number Forms 94% (55/58) 94% (55/58) 22% (13/58) U+2190 Arrows 100% (112/112) 100% (112/112) 100% (112/112) -U+2200 Mathematical Operators 100% (256/256) 39% (100/256) 60% (155/256) -U+2300 Miscellaneous Technical 27% (64/233) 6% (16/233) 50% (117/233) +U+2200 Mathematical Operators 100% (256/256) 39% (100/256) 62% (159/256) +U+2300 Miscellaneous Technical 26% (65/244) 14% (35/244) 47% (117/244) U+2400 Control Pictures 5% (2/39) 2% (1/39) 2% (1/39) U+2440 Optical Character Recognition (0/11) (0/11) (0/11) U+2460 Enclosed Alphanumerics 6% (10/160) (0/160) (0/160) U+2500 Box Drawing 100% (128/128) 100% (128/128) 100% (128/128) U+2580 Block Elements 100% (32/32) 100% (32/32) 100% (32/32) U+25a0 Geometric Shapes 100% (96/96) 100% (96/96) 100% (96/96) -U+2600 Miscellaneous Symbols 72% (182/250) 12% (30/250) 59% (149/250) -U+2700 Dingbats 99% (174/175) 0% (1/175) 82% (144/175) -U+27c0 Miscellaneous Mathematical Symbols-A 20% (9/44) 11% (5/44) 11% (5/44) +U+2600 Miscellaneous Symbols 73% (187/256) 11% (30/256) 58% (149/256) +U+2700 Dingbats 91% (174/191) 0% (1/191) 75% (144/191) +U+27c0 Miscellaneous Mathematical Symbols-A 19% (9/46) 10% (5/46) 10% (5/46) U+27f0 Supplemental Arrows-A 100% (16/16) 100% (16/16) (0/16) U+2800 Braille Patterns 100% (256/256) 100% (256/256) (0/256) U+2900 Supplemental Arrows-B 4% (6/128) 100% (128/128) (0/128) @@ -92,10 +94,10 @@ U+2980 Miscellaneous Mathematical Symbols-B 10% (13/128) 0% (1/128) U+2a00 Supplemental Mathematical Operators 28% (72/256) 1% (4/256) 0% (1/256) U+2b00 Miscellaneous Symbols and Arrows 40% (35/87) 31% (27/87) 10% (9/87) U+2c00 Glagolitic (0/94) (0/94) (0/94) -U+2c60 Latin Extended-C 96% (31/32) 71% (23/32) 43% (14/32) +U+2c60 Latin Extended-C 96% (31/32) 81% (26/32) 43% (14/32) U+2c80 Coptic (0/121) (0/121) (0/121) U+2d00 Georgian Supplement (0/38) 100% (38/38) (0/38) -U+2d30 Tifinagh 100% (55/55) (0/55) (0/55) +U+2d30 Tifinagh 96% (55/57) (0/57) (0/57) U+2d80 Ethiopic Extended (0/79) (0/79) (0/79) U+2de0 Cyrillic Extended-A (0/32) (0/32) (0/32) U+2e00 Supplemental Punctuation 12% (6/50) 12% (6/50) 12% (6/50) @@ -108,7 +110,7 @@ U+30a0 Katakana (0/96) (0/96) U+3100 Bopomofo (0/41) (0/41) (0/41) U+3130 Hangul Compatibility Jamo (0/94) (0/94) (0/94) U+3190 Kanbun (0/16) (0/16) (0/16) -U+31a0 Bopomofo Extended (0/24) (0/24) (0/24) +U+31a0 Bopomofo Extended (0/27) (0/27) (0/27) U+31c0 CJK Strokes (0/36) (0/36) (0/36) U+31f0 Katakana Phonetic Extensions (0/16) (0/16) (0/16) U+3200 Enclosed CJK Letters and Months (0/254) (0/254) (0/254) @@ -120,10 +122,10 @@ U+a000 Yi Syllables (0/1165) (0/1165) U+a490 Yi Radicals (0/55) (0/55) (0/55) U+a4d0 Lisu (0/48) (0/48) (0/48) U+a500 Vai (0/300) (0/300) (0/300) -U+a640 Cyrillic Extended-B 39% (31/78) 12% (10/78) (0/78) +U+a640 Cyrillic Extended-B 38% (31/80) 12% (10/80) (0/80) U+a6a0 Bamum (0/88) (0/88) (0/88) U+a700 Modifier Tone Letters 62% (20/32) 62% (20/32) 62% (20/32) -U+a720 Latin Extended-D 37% (43/114) 1% (2/114) 5% (6/114) +U+a720 Latin Extended-D 48% (62/129) 42% (55/129) 10% (14/129) U+a800 Syloti Nagri (0/44) (0/44) (0/44) U+a830 Common Indic Number Forms (0/10) (0/10) (0/10) U+a840 Phags-pa (0/56) (0/56) (0/56) @@ -136,6 +138,7 @@ U+a980 Javanese (0/91) (0/91) U+aa00 Cham (0/83) (0/83) (0/83) U+aa60 Myanmar Extended-A (0/28) (0/28) (0/28) U+aa80 Tai Viet (0/72) (0/72) (0/72) +U+ab00 Ethiopic Extended-A (0/33) (0/33) (0/33) U+abc0 Meetei Mayek (0/56) (0/56) (0/56) U+ac00 Hangul Syllables (0/0) (0/0) (0/0) U+d7b0 Hangul Jamo Extended-B (0/72) (0/72) (0/72) @@ -145,7 +148,7 @@ U+dc00 Low Surrogates (0/0) (0/0) U+e000 Private Use Area (0/0) (0/0) (0/0) U+f900 CJK Compatibility Ideographs (0/470) (0/470) (0/470) U+fb00 Alphabetic Presentation Forms 100% (58/58) 12% (7/58) 3% (2/58) -U+fb50 Arabic Presentation Forms-A 16% (98/595) (0/595) 12% (72/595) +U+fb50 Arabic Presentation Forms-A 16% (98/611) (0/611) 11% (72/611) U+fe00 Variation Selectors 100% (16/16) 100% (16/16) (0/16) U+fe10 Vertical Forms (0/10) (0/10) (0/10) U+fe20 Combining Half Marks 57% (4/7) (0/7) (0/7) @@ -162,7 +165,7 @@ U+10190 Ancient Symbols (0/12) (0/12) U+101d0 Phaistos Disc (0/46) (0/46) (0/46) U+10280 Lycian (0/29) (0/29) (0/29) U+102a0 Carian (0/49) (0/49) (0/49) -U+10300 Old Italic (0/35) (0/35) (0/35) +U+10300 Old Italic 100% (35/35) (0/35) (0/35) U+10330 Gothic (0/27) (0/27) (0/27) U+10380 Ugaritic (0/31) (0/31) (0/31) U+103a0 Old Persian (0/50) (0/50) (0/50) @@ -180,10 +183,13 @@ U+10b40 Inscriptional Parthian (0/30) (0/30) U+10b60 Inscriptional Pahlavi (0/27) (0/27) (0/27) U+10c00 Old Turkic (0/73) (0/73) (0/73) U+10e60 Rumi Numeral Symbols (0/31) (0/31) (0/31) +U+11000 Brahmi (0/108) (0/108) (0/108) U+11080 Kaithi (0/66) (0/66) (0/66) U+12000 Cuneiform (0/879) (0/879) (0/879) U+12400 Cuneiform Numbers and Punctuation (0/103) (0/103) (0/103) U+13000 Egyptian Hieroglyphs (0/1071) (0/1071) (0/1071) +U+16800 Bamum Supplement (0/569) (0/569) (0/569) +U+1b000 Kana Supplement (0/2) (0/2) (0/2) U+1d000 Byzantine Musical Symbols (0/246) (0/246) (0/246) U+1d100 Musical Symbols (0/220) (0/220) (0/220) U+1d200 Ancient Greek Musical Notation (0/70) (0/70) (0/70) @@ -191,11 +197,17 @@ U+1d300 Tai Xuan Jing Symbols 100% (87/87) (0/87) U+1d360 Counting Rod Numerals (0/18) (0/18) (0/18) U+1d400 Mathematical Alphanumeric Symbols 11% (117/996) 5% (55/996) 6% (62/996) U+1f000 Mahjong Tiles (0/44) (0/44) (0/44) -U+1f030 Domino Tiles (0/100) (0/100) (0/100) -U+1f100 Enclosed Alphanumeric Supplement (0/63) (0/63) (0/63) -U+1f200 Enclosed Ideographic Supplement (0/44) (0/44) (0/44) +U+1f030 Domino Tiles 100% (100/100) (0/100) (0/100) +U+1f0a0 Playing Cards 100% (59/59) (0/59) (0/59) +U+1f100 Enclosed Alphanumeric Supplement (0/169) (0/169) (0/169) +U+1f200 Enclosed Ideographic Supplement (0/57) (0/57) (0/57) +U+1f300 Miscellaneous Symbols And Pictographs 0% (4/529) (0/529) (0/529) +U+1f600 Emoticons 80% (51/63) (0/63) (0/63) +U+1f680 Transport And Map Symbols (0/70) (0/70) (0/70) +U+1f700 Alchemical Symbols (0/116) (0/116) (0/116) U+20000 CJK Unified Ideographs Extension B (0/0) (0/0) (0/0) U+2a700 CJK Unified Ideographs Extension C (0/0) (0/0) (0/0) +U+2b740 CJK Unified Ideographs Extension D (0/0) (0/0) (0/0) U+2f800 CJK Compatibility Ideographs Supplement (0/542) (0/542) (0/542) U+e0000 Tags (0/98) (0/98) (0/98) U+e0100 Variation Selectors Supplement (0/240) (0/240) (0/240) diff --git a/reactos/media/fonts/doc/FreeFont_AUTHORS.txt b/reactos/media/fonts/doc/FreeFont_AUTHORS.txt new file mode 100644 index 00000000000..b4819582821 --- /dev/null +++ b/reactos/media/fonts/doc/FreeFont_AUTHORS.txt @@ -0,0 +1,235 @@ +-*- mode:text; coding:utf-8; -*- + GNU FreeFont Authors + ==================== + +The FreeFont collection is being maintained by + Steve White +The folowing list cites the other contributors that contributed to +particular ISO 10646 blocks. + +* URW++ Design & Development GmbH + + Basic Latin (U+0041-U+007A) + Latin-1 Supplement (U+00C0-U+00FF) (most) + Latin Extended-A (U+0100-U+017F) + Spacing Modifier Letters (U+02B0-U+02FF) + Mathematical Operators (U+2200-U+22FF) (parts) + Block Elements (U+2580-U+259F) + Dingbats (U+2700-U+27BF) + +* Yannis Haralambous and John + Plaice + + Latin Extended-B (U+0180-U+024F) + IPA Extensions (U+0250-U+02AF) + Greek (U+0370-U+03FF) + Armenian (U+0530-U+058F) + Hebrew (U+0590-U+05FF) + Arabic (U+0600-U+06FF) + Currency Symbols (U+20A0-U+20CF) + Arabic Presentation Forms-A (U+FB50-U+FDFF) + Arabic Presentation Forms-B (U+FE70-U+FEFF) + +* Yannis Haralambous and Wellcome Institute + + Sinhala (U+0D80-U+0DFF) + +* Young U. Ryu + + Arrows (U+2190-U+21FF) + Mathematical Symbols (U+2200-U+22FF) + Mathematical Alphanumeric Symbols (U+1D400-U+1D7FF) + +* Valek Filippov + + Cyrillic (U+0400-U+04FF) + +* Wadalab Kanji Comittee + + Hiragana (U+3040-U+309F) + Katakana (U+30A0-U+30FF) + +* Angelo Haritsis + + Greek (U+0370-U+03FF) + +* Yannis Haralambous and Virach Sornlertlamvanich + + Thai (U+0E00-U+0E7F) + +* Shaheed R. Haque + + Bengali (U+0980-U+09FF) + +* Sam Stepanyan + + Armenian (U+0530-U+058F) + +* Mohamed Ishan + + Thaana (U+0780-U+07BF) + +* Sushant Kumar Dash + + Oriya (U+0B00-U+0B7F) + +* Harsh Kumar + + Devanagari (U+0900-U+097F) + Bengali (U+0980-U+09FF) + Gurmukhi (U+0A00-U+0A7F) + Gujarati (U+0A80-U+0AFF) + +* Prasad A. Chodavarapu + + Telugu (U+0C00-U+0C7F) + +* Frans Velthuis and Anshuman Pandey + + + Devanagari (U+0900-U+097F) + +* Hardip Singh Pannu + + Gurmukhi (U+0A00-U+0A7F) + +* Jeroen Hellingman + + Oriya (U+0B00-U+0B7F) + Malayalam (U+0D00-U+0D7F) + +* Thomas Ridgeway + + Tamil (U+0B80-U+0BFF) + +* Berhanu Beyene <1beyene AT informatik.uni-hamburg.de>, + Prof. Dr. Manfred Kudlek , Olaf + Kummer , and Jochen Metzinger + + Ethiopic (U+1200-U+137F) + +* Maxim Iorsh + + Hebrew (U+0590-U+05FF) + +* Vyacheslav Dikonov + + Syriac (U+0700-U+074A) + Braille (U+2800-U+28FF) + +* Panayotis Katsaloulis + + Greek Extended (U+1F00-U+1FFF) + +* M.S. Sridhar + + Devanagari (U+0900-U+097F) + Bengali (U+0980-U+09FF) + Gurmukhi (U+0A00-U+0A7F) + Gujarati (U+0A80-U+0AFF) + Oriya (U+0B00-U+0B7F) + Tamil (U+0B80-U+0BFF) + Telugu (U+0C00-U+0C7F) + Kannada (U+0C80-U+0CFF) + Malayalam (U+0D00-U+0D7F) + +* DMS Electronics, The Sri Lanka Tipitaka Project, and Noah Levitt + + + Sinhala (U+0D80-U+0DFF) + +* Dan Shurovich Chirkov + + Cyrillic (U+0400-U+04FF) + +* Abbas Izad + + Arabic (U+0600-U+06FF) + Arabic Presentation Forms-A (U+FB50-U+FDFF) + Arabic Presentation Forms-B (U+FE70-U+FEFF) + +* Denis Jacquerye + + Latin Extended-B (U+0180-U+024F) + IPA Extensions (U+0250-U+02AF) + +* K.H. Hussain and R. Chitrajan + + Malayalam (U+0D00-U+0D7F) + +* Solaiman Karim and Omi Azad + + Bengali (U+0980-U+09FF) + +* Sonali Sonania and Monika Shah + + + Devanagari (U+0900-U+097F) + Gujarati (U+0A80-U+0AFF) + +* Pravin Satpute , Bageshri Salvi + , Rahul Bhalerao and Sandeep Shedmake + + Devanagari (U+0900-U+097F) + Gujarati (U+0A80-U+0AFF) + Oriya (U+0B00-U+0B7F) + Malayalam (U+0D00-U+0D7F) + Tamil (U+0B80-U+0BFF) + +* Kulbir Singh Thind + + Gurmukhi (U+0A00-U+0A7F) + +* Gia Shervashidze + + Georgian (U+10A0-U+10FF) + +* Daniel Johnson + + Armenian (serif) (U+0530-U+058F) + Cherokee (U+13A0-U+13FF) + Unified Canadian Aboriginal Syllabics (U+1400-U+167F) + UCAS Extended (U+18B0-U+18F5) + Tifinagh (U+2D30-U+2D7F) + Vai (U+A500-U+A62B) + Latin Extended-D (Mayanist letters) (U+A720-U+A7FF) + Kayah Li (U+A900-U+A92F) + Osmanya (U+10480-U+104a7) + +* George Douros + + Gothic (U+10330-U+1034F) + Phoenecian (U+10900-U+1091F) + Byzantine Musical Symbols (U+1D000-U+1D0FF) + Western Musical Symbols (U+1D100-U+1D1DF) + Mathematical Alphanumeric Symbols (U+1D400-U+1D7FF) + Mah Jong Tiles (U+1F000-U+1F02B) + Dominoes (U+1F030-U+1F093) + +* Steve White + Glagolitic (U+2C00-U+2C5F) + Coptic (U+2C80-U+2CFF) + +* Pavel Skrylev is responsible for + Cyrillic Extended-A (U+2DEO-U+2DFF) + as well as many of the additions to + Cyrillic Extended-B (U+A640-U+A65F) + +* Mark Williamson + Made the MPH 2 Damase font, from which + Hanuno (U+1720-U+173F) + Buginese (U+1A00-U+1A1F) + Tai Le (U+1950-U+197F) + Ugaritic (U+10380-U+1039F) + Old Persian (U+103A0-U+103DF) + + +* Primo Peterlin + maintained FreeFont for several years, and is thanked for all his work. + +Please see the CREDITS file for details on who contributed particular +subsets of the glyphs in font files. + +-------------------------------------------------------------------------- +$Id: AUTHORS,v 1.23 2010/09/11 13:24:11 Stevan_White Exp $ diff --git a/reactos/media/fonts/doc/FreeFont_COPYING.txt b/reactos/media/fonts/doc/FreeFont_COPYING.txt new file mode 100644 index 00000000000..94a9ed024d3 --- /dev/null +++ b/reactos/media/fonts/doc/FreeFont_COPYING.txt @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/reactos/media/fonts/doc/FreeFont_CREDITS.txt b/reactos/media/fonts/doc/FreeFont_CREDITS.txt new file mode 100644 index 00000000000..edc0b31f30f --- /dev/null +++ b/reactos/media/fonts/doc/FreeFont_CREDITS.txt @@ -0,0 +1,582 @@ +-*- mode:text; coding:utf-8; -*- + GNU FreeFont Credits + ==================== + +This file lists contributors and contributions to the GNU FreeFont project. + + +* URW++ Design & Development GmbH + +URW++ donated a set of 35 core PostScript Type 1 fonts to the +Ghostscript project , to be available +under the terms of GNU General Public License (GPL). + + Basic Latin (U+0041-U+007A) + Latin-1 Supplement (U+00C0-U+00FF) + Latin Extended-A (U+0100-U+017F) + Spacing Modifier Letters (U+02B0-U+02FF) + Mathematical Operators (U+2200-U+22FF) + Block Elements (U+2580-U+259F) + Dingbats (U+2700-U+27BF) + + +* Yannis Haralambous and John + Plaice + +Yannis Haralambous and John Plaice are the authors of Omega typesetting +system, . Omega is an extension of TeX. +Its first release, aims primarily at improving TeX's multilingual abilities. +In Omega all characters and pointers into data-structures are 16-bit wide, +instead of 8-bit, thereby eliminating many of the trivial limitations of TeX. +Omega also allows multiple input and output character sets, and uses +programmable filters to translate from one encoding to another, to perform +contextual analysis, etc. Internally, Omega uses the universal 16-bit Unicode +standard character set, based on ISO-10646. These improvements not only make +it a lot easier for TeX users to cope with multiple or complex languages, +like Arabic, Indic, Khmer, Chinese, Japanese or Korean, in one document, but +will also form the basis for future developments in other areas, such as +native color support and hypertext features. ... Fonts for UT1 (omlgc family) +and UT2 (omah family) are under development: these fonts are in PostScript +format and visually close to Times and Helvetica font families. +Omega fonts are available subject to GPL + + Latin Extended-B (U+0180-U+024F) + IPA Extensions (U+0250-U+02AF) + Greek (U+0370-U+03FF) + Armenian (U+0530-U+058F) + Hebrew (U+0590-U+05FF) + Arabic (U+0600-U+06FF) + Currency Symbols (U+20A0-U+20CF) + Arabic Presentation Forms-A (U+FB50-U+FDFF) + Arabic Presentation Forms-B (U+FE70-U+FEFF) + +Current info: + +* Valek Filippov + +Valek Filippov added Cyrillic glyphs and composite Latin Extended A to +the whole set of the abovementioned URW set of 35 PostScript core fonts, +. The fonts are available under GPL. + + Latin Extended-A (U+0100-U+017F) + Cyrillic (U+0400-U+04FF) + + +* Wadalab Kanji Comittee + +Between April 1990 and March 1992, Wadalab Kanji Comittee put together +a series of scalable font files with Japanese scripts, in four forms: +Sai Micho, Chu Mincho, Cho Kaku and Saimaru. The font files are +written in custom file format, while tools for conversion into +Metafont and PostScript Type 1 are also supplied. The Wadalab Kanji +Comittee has later been dismissed, and the resulting files can be now +found on the FTP server of the Depertment of Mathematical Engineering +and Information Physics, Faculty of Engineering, University of Tokyo +. + + Hiragana (U+3040-U+309F) + Katakana (U+30A0-U+30FF) + + +* Young U. Ryu + +Young Ryu is the author of Txfonts, a set of mathematical symbols +designed to accompany text typeset in Times or its variants. In the +documentation, Young adresses the design of mathematical symbols: "The +Adobe Times fonts are thicker than the CM fonts. Designing math fonts +for Times based on the rule thickness of Times = , , + , / , < , +etc. would result in too thick math symbols, in my opinion. In the TX +fonts, these glyphs are thinner than those of original Times +fonts. That is, the rule thickness of these glyphs is around 85% of +that of the Times fonts, but still thicker than that of the CM fonts." +TX fonts are are distributed under the GNU public license (GPL). +. + + Arrows (U+2190-U+21FF) + Mathematical Symbols (U+2200-U+22FF) + + +* Angelo Haritsis + +Angelo Haritsis has compiled a set of Greek Type 1 fonts, available on +. +The glyphs from this source has been used to compose Greek glyphs in +FreeSans and FreeMono. + +Angelo's licence says: "You can enjoy free use of these fonts for +educational or commercial purposes. All derived works should include +this paragraph. If you want to change something please let me have +your changes (via email) so that they can go into the next +version. You can also send comments etc to the above address." + + Greek (U+0370-U+03FF) + + +* Yannis Haralambous and Virach Sornlertlamvanich + +In 1999, Yannis Haralambous and Virach Sornlertlamvanich made a set of +glyphs covering the Thai national standard Nf3, in both upright and +slanted shape. The collection of glyphs have been made part of GNU +intlfonts 1.2 package and is available under the GPL at +. + + Thai (U+0E00-U+0E7F) + +* Shaheed R. Haque + +Shaheed Haque has developed a basic set of basic Bengali glyphs +(without ligatures), using ISO10646 encoding. They are available under +the XFree86 license at . + +Copyright (C) 2001 S.R.Haque . All Rights Reserved. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL S.R.HAQUE BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of S.R.Haque shall not be +used in advertising or otherwise to promote the sale, use or other +dealings in this Software without prior written authorization from +S.R.Haque. + + Bengali (U+0980-U+09FF) + + +* Sam Stepanyan + +Sam Stepanyan created a set of Armenian sans serif glyphs visually +compatible with Helvetica or Arial. Available on +. On +2002-01-24, Sam writes: "Arial Armenian font is free for +non-commercial use, so it is OK to use under GPL license." + + Armenian (U+0530-U+058F) + + +* Mohamed Ishan + +Mohamed Ishan has started a Thaana Unicode Project + and among other things created a +couple of Thaana fonts, available under FDL or BDF license. + + Thaana (U+0780-U+07BF) + + +* Sushant Kumar Dash (*) + +Sushant Dash has created a font in his mother tongue, Oriya. As he +states on his web page : +"Please feel free to foreword this mail to your Oriya friends. No +copyright law is applied for this font. It is totally free!!! Feel +free to modify this using any font editing tools. This is designed for +people like me, who are away from Orissa and want to write letters +home using Computers, but suffer due to unavailability of Oriya +fonts.(Or the cost of the available packages are too much)." + + Oriya (U+0B00-U+0B7F) + + +* Harsh Kumar + +Harsh Kumar has started BharatBhasha - +an effort to provide "FREE software, Tutorial, Source Codes +etc. available for working in Hindi, Marathi, Gujarati, Gurmukhi and +Bangla. You can type text, write Web pages or develop Indian Languages +Applications on Windows and on Linux. We also offer FREE help to +users, enthusiasts and software developers for their work in Indian +languages." + + Devanagari (U+0900-U+097F) + Bengali (U+0980-U+09FF) + Gurmukhi (U+0A00-U+0A7F) + Gujarati (U+0A80-U+0AFF) + + +* Prasad A. Chodavarapu + +Prasad A. Chodavarapu created Tikkana, a Telugu font available in Type +1 and TrueType format on . +Tikkana exceeds the Unicode Telugu range with some composite glyphs. +Available under the GNU General Public License. + + Telugu (U+0C00-U+0C7F) + + +* Frans Velthuis and Anshuman Pandey + + +In 1991, Frans Velthuis from the Groningen University, The +Netherlands, released a Devanagari font as Metafont source, available +under the terms of GNU GPL. Later, Anshuman Pandey from the Washington +University, Seattle, USA, took over the maintenance of font. Fonts can +be found on CTAN, . I +converted the font to Type 1 format using Pter Szab's TeXtrace +program and removed some +redundant control points with PfaEdit. + + Devanagari (U+0900-U+097F) + + +* Hardip Singh Pannu + +In 1991, Hardip Singh Pannu has created a free Gurmukhi TrueType font, +available as regular, bold, oblique and bold oblique form. Its license +says "Please remember that these fonts are copyrighted (by me) and are +for non-profit use only." + + Gurmukhi (U+0A00-U+0A7F) + + +* Jeroen Hellingman + +Jeroen Hellingman created a set of Malayalam metafonts in 1994, and a +set of Oriya metafonts in 1996. Malayalam fonts were created as +uniform stroke only, while Oriya metafonts exist in both uniform and +modulated stroke. From private communication: "It is my intention to +release the fonts under GPL, but not all copies around have this +notice on them." Metafonts can be found on CTAN, + and +. + + Oriya (U+0B00-U+0B7F) + Malayalam (U+0D00-U+0D7F) + + +* Thomas Ridgeway <> (*) + +Thomas Ridgeway, then at the Humanities And Arts Computing Center, +Washington University, Seattle, USA, (now defunct), created a Tamil +metafont in 1990. Anshuman Pandey from the same university took over +the maintenance of font. Fonts can be found at CTAN, +. + + Tamil (U+0B80-U+0BFF) + + +* Berhanu Beyene <1beyene AT informatik.uni-hamburg.de>, + Prof. Dr. Manfred Kudlek , Olaf + Kummer , and Jochen Metzinger + +Beyene, Kudlek, Kummer and Metzinger from the Theoretical Foundations +of Computer Science, University of Hamburg, prepared a set of Ethiopic +metafonts, found on +. They also +maintain home page on the Ethiopic font project, +, +and can be reached at . The current +version of fonts is 0.7 (1998), and they are released under GNU GPL. I +converted the fonts to Type 1 format using Pter Szab's TeXtrace-A +program and removed some +redundant control points with PfaEdit. + + Ethiopic (U+1200-U+137F) + + +* Maxim Iorsh + +In 2002, Maxim Iorsh started the Culmus project, aiming at providing +Hebrew-speaking Linux and Unix community with a basic collection of +Hebrew fonts for X Windows. The fonts are visually compatible with +URW++ Century Schoolbook L, URW++ Nimbus Sans L and URW++ Nimbus Mono +L families, respectively, and are released under GNU GPL license. See +also . + + Hebrew (U+0590-U+05FF) + + +* Panayotis Katsaloulis + +Panayotis Katsaloulis helped fixing Greek accents in the Greek +Extended area. + + Greek Extended (U+1F00-U+1FFF) + + +* Vyacheslav Dikonov + +Vyacheslav Dikonov made a Braille unicode font that could be merged +with the UCS fonts to fill the 2800-28FF range completely. (uniform +scaling is possible to adapt it to any cell size). He also contributed +a free syriac font, whose glyphs (about half of them) are borrowed +from the "Carlo Ator" font freely downloadable from +. Vyacheslav also filled in a few missing +spots in the U+2000-U+27FF area, e.g. the box drawing section, sets of +subscript and superscript digits and capital Roman numbers. + + Syriac (U+0700-U+074A) + Box Drawing (U+2500-U+257F) + Braille (U+2800-U+28FF) + + +* M.S. Sridhar + +M/S Cyberscape Multimedia Limited, Mumbai, developers of Akruti +Software for Indian Languages (http://www.akruti.com/), have released +a set of TTF fonts for nine Indian scripts (Devanagari, Gujarati, +Telugu, Tamil, Malayalam, Kannada, Bengali, Oriya, and Gurumukhi) +under the GNU General Public License (GPL). You can download the fonts +from the Free Software Foundation of India WWW site +(http://www.gnu.org.in/akruti-fonts/) or from the Akruti website. + +For any further information or assistance regarding these fonts, +please contact mssridhar AT vsnl.com. + + Devanagari (U+0900-U+097F) + Bengali (U+0980-U+09FF) + Gurmukhi (U+0A00-U+0A7F) + Gujarati (U+0A80-U+0AFF) + Oriya (U+0B00-U+0B7F) + Tamil (U+0B80-U+0BFF) + Telugu (U+0C00-U+0C7F) + Kannada (U+0C80-U+0CFF) + Malayalam (U+0D00-U+0D7F) + + +* DMS Electronics, The Sri Lanka Tipitaka Project, and Noah Levitt + + +Noah Levitt found out that the Sinhalese fonts available on the site + are released under GNU GPL, or, +precisely, "Public Domain under GNU Licence + Produced by DMS +Electronics for The Sri Lanka Tipitaka Project" (taken from the font +comment), and took the effort of recoding the font to Unicode. + +These glyphs were later replaced by those from the LKLUG font + + +Finally the range was completely replaced by glyphs from the sinh TeX +font, with much help and advice from Harshula Jayasuriya. + + Sinhala (U+0D80-U+0DFF) + + +* Daniel Shurovich Chirkov + +Dan Chirkov updated the FreeSerif font with the missing Cyrillic +glyphs needed for conformance to Unicode 3.2. The effort is part of +the Slavjanskij package for Mac OS X, +. + + Cyrillic (U+0400-U+04FF) + + +* Denis Jacquerye + +Denis Jacquerye added new glyphs and corrected existing ones in the +Latin Extended-B and IPA Extensions ranges. + + Latin Extended-B (U+0180-U+024F) + IPA Extensions (U+0250-U+02AF) + + +* K.H. Hussain and R. Chitrajan + +`Rachana' in Malayalam means `to write', `to create'. Rachana Akshara Vedi, +a team of socially committed information technology professionals and +philologists, has applied developments in computer technology and desktop +publishing to resurrect the Malayalam language from the disorder, +fragmentation and degeneration it had suffered since the attempt to adapt +the Malayalam script for using with a regular mechanical typewriter, which +took place in 1967-69. K.H. Hussein at the Kerala Forest Research Institute +has released "Rachana Normal" fonts with approximately 900 glyphs required +to typeset traditional Malayalam. R. Chitrajan apparently encoded the +glyphs in the OpenType table. + +In 2008, the Malayalam ranges in FreeSerif were updated under the advise +and supervision of Hiran Venugopalan of Swathanthra Malayalam Computing, +to reflect the revised edition Rachana_04. + + Malayalam (U+0D00-U+0D7F) + + +* Solaiman Karim + + Bengali (U+0980-U+09FF) + +Solaiman Karim has developed several OpenType Bangla fonts and +released them under GNU GPL on . + + +* Sonali Sonania and Monika Shah + + + Devanagari (U+0900-U+097F) + Gujarati (U+0A80-U+0AFF) + +Glyphs were drawn by Cyberscape Multimedia Ltd., #101,Mahalakshmi +Mansion 21st Main 22nd "A" Cross Banashankari 2nd stage Banglore +560070, India. Converted to OTF by IndicTrans Team, Powai, Mumbai, +lead by Prof. Jitendra Shah. Maintained by Monika Shah and Sonali +Sonania of janabhaaratii Team, C-DAC, Mumbai. This font is released +under GPL by Dr. Alka Irani and Prof Jitendra Shah, janabhaaratii +Team, C-DAC, Mumabi. janabhaaratii is localisation project at C-DAC +Mumbai (formerly National Centre for Software Technology); funded by +TDIL, Govt. of India. Contact:monika_shah AT lycos.com, +sonalisonania AT yahoo.com, jitendras AT vsnl.com, alka AT ncst.ernet.in. +website: www.janabhaaratii.org.in. + + +* Pravin Satpute , Bageshri Salvi + , Rahul Bhalerao and Sandeep Shedmake + + Devanagari (U+0900-U+097F) + Gujarati (U+0A80-U+0AFF) + Oriya (U+0B00-U+0B7F) + Malayalam (U+0D00-U+0D7F) + Tamil (U+0B80-U+0BFF) + +In December 2005 the team at www.gnowledge.org released a set of two +Unicode pan-Indic fonts: "Samyak" and "Samyak Sans". "Samyak" font +belongs to serif style and is an original work of the team; "Samyak +Sans" font belongs to sans serif style and is actually a compilation +of already released Indic fonts (Gargi, Padma, Mukti, Utkal, Akruti +and ThendralUni). Both fonts are based on Unicode standard. You can +download the font files (released under GNU/GPL License) from +http://www.gnowledge.org/Gnoware/localization/font.htm + + +* Kulbir Singh Thind + + Gurmukhi (U+0A00-U+0A7F) + +Dr. Kulbir Singh Thind designed a set of Gurmukhi Unicode fonts, +AnmolUni and AnmolUni-Bold, which are available under the terms of GNU +Generel Public Licens from the Punjabu Computing Resource Center, +http://guca.sourceforge.net/typography/fonts/anmoluni/. + + +* Gia Shervashidze + + Georgian (U+10A0-U+10FF) + +Starting in mid-1990s, Gia Shervashidze designed many +Unicode-compliant Georgian fonts: Times New Roman Georgian, Arial +Georgian, Courier New Georgian. His work on Georgian localization can +be reached at http://www.gia.ge/. + + +* Primo Peterlin + +Primo Peterlin filled in missing glyphs here and there (e.g. Latin +Extended-B and IPA Extensions ranges in the FreeMono familiy), and +created the following UCS blocks: + + Latin Extended-B (U+0180-U+024F) + IPA Extensions (U+0250-U+02AF) + Arrows (U+2190-U+21FF) + Box Drawing (U+2500-U+257F) + Block Elements (U+2580-U+259F) + Geometrical Shapes (U+25A0-U+25FF) + +* Mark Williamson + +Made the MPH 2 Damase font, from which + Hanuno (U+1720-U+173F) + Buginese (U+1A00-U+1A1F) + Tai Le (U+1950-U+197F) + Ugaritic (U+10380-U+1039F) + Old Persian (U+103A0-U+103DF) + +* Jacob Poon + +Submitted a very thorough survey of glyph problems and other suggestions. + +* Alexey Kryukov + +Made the TemporaLCGUni fonts, based on the URW++ fonts, from which at one +point FreeSerif Cyrillic, and some of the Greek, was drawn. He also provided +valuable direction about Cyrillic and Greek typesetting. + +* George Douros + +The creator of several fonts focusing on ancient scripts and symbols. +Many of the glyphs are created by making outlines from scanned images +of ancient sources. + + Aegean: Phoenecian + Analecta: Gothic (U+10330-U+1034F) + Musical: Byzantine & Western + Unicode: many Miscellaneous Symbols, Miscellaneous Technical, + supplemental Symbols, and Mathematical Alphanumeric symbols, + Mah Jong, and the outline of the Domino. + +* Daniel Johnson + +Created by hand a Cherokee range specially for FreeFont to be "in line with +the classic Cherokee typefaces used in 19th century printing", but also to +fit well with ranges previously in FreeFont. Then he made Unified Canadian +Syllabics in Sans, and a Cherokee and Kayah Li in Mono! And never to be +outdone by himself, then did UCAS Extended and Osmanya.... What next? + + Armenian (serif) (U+0530-U+058F) + Cherokee (U+13A0-U+13FF) + Unified Canadian Aboriginal Syllabics (U+1400-U+167F) + UCAS Extended (U+18B0-U+18F5) + Kayah Li (U+A900-U+A92F) + Tifinagh (U+2D30-U+2D7F) + Vai (U+A500-U+A62B) + Latin Extended-D (Mayanist letters) (U+A720-U+A7FF) + Osmanya (U+10480-U+104a7) + +* Yannis Haralambous and Wellcome Institute + +In 1994, The Wellcome Library + The Wellcome Institute for the History of Medicine + 183 Euston Road, London NW1 2BE, England. +commissioned Mr. Haralambous to produce a Sinhalese font for them. + +We have received 03/09 official notice from Robert Kiley, Head of e-Strategy +for the Wellcome Library, that Yannis' font could be included in GNU +FreeFont under its GNU license. + +Thanks to Dominik Wujastyk, for providing us with feedback and contacts +to repsonsible people at the Trust. + + Sinhala (U+0D80-U+0DFF) + +* The Sinhala font project http://sinhala.sourceforge.net/ + +The Sinhala font project has taken the glyphs from Yannis Haralambous' +Sinhala font, to produce a Unicode TrueType font, LKLUG. These glyphs +were for a while included in FreeFont. + + Sinhala (U+0D80-U+0DFF) + +* Steve White + +Filled in a lot of missing characters, got some font features working, +left fingerprints almost everywhere, and is responsible for these blocks: + + Glagolitic (U+2C00-U+2C5F) + Coptic (U+2C80-U+2CFF) + +* Pavel Skrylev is responsible for + Cyrillic Extended-A (U+2DEO-U+2DFF) + as well as many of the additions to + Cyrillic Extended-B (U+A640-U+A65F) + +Notes: + +*: The glyph collection looks license-compatible, but its author has + not yet replied and agreed on their work being used in part of + this glyph collection. + +-------------------------------------------------------------------------- +$Id: CREDITS,v 1.28 2010/09/11 13:24:11 Stevan_White Exp $ diff --git a/reactos/media/fonts/doc/FreeFont_ChangeLog.txt b/reactos/media/fonts/doc/FreeFont_ChangeLog.txt new file mode 100644 index 00000000000..6de5342798e --- /dev/null +++ b/reactos/media/fonts/doc/FreeFont_ChangeLog.txt @@ -0,0 +1,6325 @@ +$Id: ChangeLog,v 1.257 2010/09/19 13:15:07 Stevan_White Exp $ +2010-09-19 Stevan_White + * FreeSerif.sfd: + + Sinhala: Fixed one lookup table mistake, and a couple of glpyh + omissions, that Harshula pointed out. + + * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd: + + Sans: Applied Daniel Johnsons improvement to capital Eng to Sans, as + described in previous commits. + + * FreeSerif.sfd, FreeSerifBold.sfd: + + Coptic: added alphabet to bold. Accent marks not working -- a mystery. + Some tweeks in medium face as well. + + glyph cleanup -- points too close, some glyphs outside bounding boxes. + +2010-09-17 Stevan_White + * FreeSerif.sfd: + + Sinhala: tightened up left side of na and derivatives. + tighened up left sides of u, lla, na, dha, ndha, nya, jnya + tightened up some of the vowel conjuncts, and left side of nna. + +2010-09-16 Stevan_White + * FreeSerif.sfd: + + Coptic: fiddled about with letter forms, striving for a kind of + consistency. + + Sinhala: Harshula noticed four incorrect combined forms. Fixed these. + + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd: + + Latin Extended-A: Applied Daniel Johnson's patch that made two versions + of capital Eng. His explanation: + ' + http://en.wikipedia.org/wiki/%C5%8A + + The form of capital Eng currently in all three FreeFont faces + is that used by the Sami people, resembling a capital N with a + hooked right descender. + However, the form preferred for African and Amerindian + languages resembles a tall lowercase n with a hook that almost + meets the left vertical. (See wikipedia link above for a + visual.) + + Recommend moving the existing Sami-style Eng to a PUA or + non-Unicode slot, creating African-style Eng at U+014A, and + adding a LOCL table with substitution rules for + Inari Sami (ISM), Lule Sami (LSM), + Northern Sami (NSM) and Skolt Sami (SKS). + ' + Latin Extended-B: Also in his patch: + added U+0220 (Latin Capital Letter N with long leg) + +2010-09-15 Stevan_White + * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Latin for Sami: Daniel Johnson's patch added alternative form of Eng for + African languages and a 'local' table for the Sami form. + + * FreeSerif.sfd: + + Sinhala: regularized kundaliya a bit. + re-named a few more ligature glyphs, for consistency + + * FreeSans.sfd: + + Put stray lookup into its proper subtable. + + Gurmukhi: improved some names of ligature glyphs, and found one + apparently doubled table entry (kagurmukhi_nuktagurmukhi.nukt now + gur_ka.nukt) + + * FreeSans.sfd, FreeSerif.sfd, FreeSerifItalic.sfd: + + Various measures to fix problems FontForge Find Problems reports under + ATT, including a mass glyph rename of Sinhala ligatures. + +2010-09-15 Stevan_White + * to0ls/GenerateTrueType: + + prev. commit had one space too many + +2010-09-14 Stevan_White + * tools-- GenerateMacTT, GenerateOpenType, GenerateTrueType, checkGlyphNumbers.py, findBackLayers.py, hex_range.py, isMonoMono.py, ligatureLookups.py, nameBySlot.py, range_report.py, ranges.py, validate.py, OpenType.py: + + Added license and other tags to python files. + +2010-09-13 Stevan_White + * tools/OpenType.py: + + updated some Web links. + + * FreeMono.sfd, FreeMonoOblique.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd: + + Cyrillic: A few more old letters. + + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd: + + Supplemental Punctuation: One character for consistency with other faces. + +2010-09-12 Stevan_White + * FreeMono.sfd, FreeSans.sfd: + + Control Pictures: Added because it was easy. + + * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd: + + Alphabetic Presentation Forms: filled out range in sans faces. + + * FreeMono.sfd, FreeMonoBoldOblique.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerifBoldItalic.sfd: + + Cleared hints. + + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSans.sfd, FreeSansBoldOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Dozens of measures to pass general validation tests, including + . cleanup of many glyphs for extrema and self-intersection problmes + . re-naming glyphs whose PS names are too long. + . removing blank glyphs + . giving Unicode points to glyphs missing them. + + There are still a few lookup table issues in FreeSerif and FreeSans though. + + * FreeSerif.sfd: + + Re-named some of the Sinhala lookups in somewhat better way. + Control Pictures: added a bunch (but... is it worth it?) + + * tools/nameBySlot.py: + + Corrected output for high Unicode. + + * tools/checkGlyphNumbers.py: + + Made aware of special TrueType slots. + + * tools/range_report.py: + + Added a Private Use total and better explanation of totals generally. + Some code clean-up. + +2010-09-11 Stevan_White + * tools/OpenType.py: + + made not to complain about extra TrueType characters. + + * FreeSerif.sfd: + + Coptic: Widened bowl of Khei. + Deepened descenders of small letters to same depth as in Latin + Expanded bowl of Fei and fei to resemble other samples. + +2010-09-10 Stevan_White + * FreeSerif.sfd: + + Cyrillic: mostly positioning of marks for old Cyrillic alphabets + + Coptic: Replaced acoptic with something more dramatic, fiddled with + kerning, tidied some other letters + +2010-09-09 Stevan_White + * FreeSerifBold.sfd, FreeSans.sfd, FreeSerif.sfd: + + Block Elements: replaced long-missing shade blocks + +2010-09-08 Stevan_White + * tools/range_report.py: + + More explanation in output. + + * tools/range_report.py, OpenType.py: + + another consistency check + added UCAS Extended range + +2010-09-07 Stevan_White + * FreeSerif.sfd: + + Buginese: lookup tables and glyphs to re-order vowels, courtesy of + Mohammad Anwari. + + Sinhala: complete replacement of range with glyphs extracted more + directly from Yannis Haralambous' sinha TeX font (last version was + also derived from this font, but had undergone detrimental processing). + Implements "rak" glyphs using three GSUB lookup steps. + + * FreeSans.sfd: + + Osmanya: courtesy of Daniel Johnson. + + Note this script is slanted in every sample I've seen. That is + justification enough that the glyphs in this range look slated, + although the face isn't oblique. + + UCAS Extended: by Daniel Johnson + +2010-09-05 Stevan_White + * FreeSerif.sfd: + + Fix for FontForge warning (v 20090923) + + "On Windows many apps will have problems with this font's kerning, + because because 58 of its glyph kern pairs cannot be mapped to + unicode-BMP kern pairs" + + This was due to kern tables for the Musical Symbols range, which isn't + in the Unicode Basic Multilingual Plane. + + Removed this lookup. Might consider another way to position these + symbols. + +2010-08-30 Stevan_White + * FreeSerif.sfd: + + Sinhala: patch by Harshula Jayasuriya to correct the writing system + direction in some lookups. + + * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Currency Symbols: additions and tweeking + +2010-08-24 Stevan_White + * FreeSerif.sfd: + + Sinhala: added one ligature glyph, from Harshula Jayasuriya + +2010-08-20 Stevan_White + * FreeSerif.sfd: + + Resolves class of validation problems in Sinhala: Bad Glyph Name. + + This is a FontForge bug, that appears when certain types of problems + occur in the glyph contours. Probably an arithmetic error causes some + corruption. + + Corrected missing extrema in recent Latin Extended-D range + + Sinhala: re-did previous patch using a more recent one. + Un-did some other glyph changes that didn't help much anyway. + + * FreeMono.sfd: + + Named letters in several ranges... should write a script for this... + + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Added full GNU copyright announcement to TT Names. + Updated Copyright date. + + * FreeSerif.sfd: + + Sinhala: Applied a patch from Harshula Jayasuriya, improving glyph + names. + I tried to tidy up some of the glyphs, but it's a big job... + + Latin Extended B: fixed one case of missing extrema + +2010-08-18 Stevan_White + * FreeSerif.sfd: + + Latin Extended-D: yet a few more easily made letters + + Latin Extended-D: made a few more letters + +2010-08-09 Stevan_White + * FreeSerif.sfd: + + Supplemental Arrows-A: completed + + Arrows: completed + +2010-08-04 Stevan_White + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd: + + Combining Diacritics: some additions in BoldOblique, corrections in + other faces. + Several improvements to Greek letter forms in BoldOblique + +2010-08-03 Stevan_White + * FreeMonoBold.sfd: + + Arrows, a few math operators, and one more combining diacritical + + * FreeMono.sfd, FreeMonoBold.sfd: + + Added some combining diacriticals to bold, touched up some spacing + modifiers. + Minor corrections to roman. + + * FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd: + + Marks, spacing modifier letters: corrected placement of marks, + added some spacing modifier letters and combining marks. + + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd: + + Better Vietnamese support, using 'ccmp' and 'mark' lookup tables. + MonoBoldOblique: added Extended Latin ranges + + * FreeSerifBold.sfd, FreeSerifBoldItalic.sfd: + + Vietnamese: Much adjustment of horn letters, + also general adjustement of marks + +2010-08-02 Stevan_White + * FreeSerif.sfd: + + Vietnamese: inadvertently broke the main face. This fixes it. + + * FreeMono.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Vietamese: In roman and sans, lookups are basically functional now. + Used 'ccmp' Ligature Substitution to form stacked marks (inasmuch as + glyphs for the stacked Unicode codepoints are available) + Adjusted positioning of some marks. + Named many letters and combining marks. + + roman italic. Re-designed horn of O and U. Other roman faces could also + benefit from a horn job. + + * FreeMono.sfd, FreeSerif.sfd: + + roman: correction to one math operator + mono: Mathematical Operators complete (up to some pre-5.2 Unicode version) + + * FreeMono.sfd: + + Mathematical Symbols: range nearly finished + + * tools/OpenType.py: + + Correction regarding NKo range. + + * tools/range_report.py: + + made not to complain about special TrueType slots 0x00, 0x01, 0x0D + +2010-08-01 Stevan_White + * FreeMono.sfd, FreeSerif.sfd: + + roman: corrected direction of 2 math operators + mono: added several math operators + + Worked on mark positioning for Vietnamese, Cyrillic + +2010-07-30 Stevan_White + * FreeMono.sfd: + + Reduced height of two-part Summation symbols + https://savannah.gnu.org/bugs/?23064 + + Corrected U+2626 Orthodox Cross + https://savannah.gnu.org/bugs/?27579#discussion + + * FreeSerif.sfd: + + Added some Miscellaneous Technical Symbols + +2010-07-29 Stevan_White + * FreeSerif.sfd: + + Put in some scan lines 23BA-23BD, based on 2500, as discussed in + https://savannah.gnu.org/bugs/?23064 + I still have no idea what the application for these glyphs would be... + +2010-07-17 Stevan_White + * FreeSerif.sfd: + + added mark anchors for acute, grave in cyrillic (other faces already + had them) + +2010-07-13 Stevan_White + * FreeMono.sfd: + + Made germandbls (ess-zet) a bit wider, moved a bit to left + +2010-07-10 Stevan_White + * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifItalic.sfd: + + Resolves bug 30344: "Greek Final Sigma could be shortened" + https://savannah.gnu.org/bugs/index.php?30344 + Problem only affected roman, but touched up other faces anyway. + +2010-05-30 Stevan_White + * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Latin-extended-B: fiddled with some of the horizontal strokes + +2010-05-29 Stevan_White + * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Latin: accents on ogonek letters (for Navaho) + a little adjustment of apostrophe (Navaho, Hawaiian) + + * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Latin mark problems + * low dots in bold uneven + * ring in bold smaller than in roman, and not heavier + * apostrophe in italic too far to right (Navaho, Hawaiian) + + * FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Latin: fixed problems with various marks: ogonek, hook, comma below, + some kerning, esp. of non-ascii characters + + * FreeSans.sfd, FreeSerif.sfd: + + Sans: made dot accents same height as i-dot, kerned y with comma + Both: made low comma accent lower, smaller (esp. for Romanian) + +2010-05-27 Stevan_White + * FreeSans.sfd: + + Latin: make caron of more uniform height + + Latin: i was somehow displaced, dotlessi was much too wide for Turkish + + * FreeSans.sfd, FreeSansOblique.sfd: + + Latin: made ring accent heavier, esp. for Swedish + + +2010-05-10 Stevan_White + * FreeSans.sfd, FreeSerif.sfd: + + Latin: kerning tweeks + +2010-05-09 Stevan_White + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + As discussed in freefont-bugs mailing list, Thu, May 6, 2010 + "FreeMono affected by OS X 10.6 nested character references bug" + reduced reference nesting in multiple quote characters, as a courtesy + to Mac OS 10.6 users, who suffer from a bug. + +2010-05-04 Stevan_White + * FreeSerif.sfd: + + Latin: kerning tweeks + +2010-05-03 Stevan_White + * FreeSerifBold.sfd: + + Latin: spacing of round small letters, kerning tweeks, fiddled with + ligatures + +2010-04-17 Stevan_White + * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Daniel Johnson improved Cherokee Da + +2010-04-10 Stevan_White + * FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd: + + Emboldened underscore and related glyphs. Resolves issue 22999 + https://savannah.gnu.org/bugs/index.php?22999 + Low line (005F) in bold fonts do not have heavier weight + +2010-04-09 Stevan_White + * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Serif: Added Thai TTF names + +2010-04-08 Stevan_White + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSerif.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Corrected some language names + A bit o kerning + + * FreeSerifBold.sfd: + + Fixed problem with name. This should be the same as before the revision + except for the fix. + The KDE font installer was saying this face was incorrectly named + Free Serif Bold Italic, but this wasn't quite correct. One of the other + language names said it was named Free Serif Halvfett Kursiv, which + conflicted with that language name for the real Free Serif Bold Italic. + + Regression: for some unknown reason, previous release gets built so + that my system thinks it is Free Serif Bold Italic. + This is a mystery. There is nothing about Italic in the file. + +2010-04-06 Stevan_White + * Makefile: + + Made graceful in absence of Fontforge + +2010-03-29 Stevan_White + * FreeSerifBold.sfd: + + Adjusted some accent marks, named a few characters + +2010-03-25 Stevan_White + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + added Ukrainian TTF names + + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + added bahasa indonesian TTF names + +2010-03-21 Stevan_White + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Added several TTF Names. (Need to check with native speakers.) + +2010-03-20 Stevan_White + * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Fill out TTF Names tables regarding font names + +2010-03-19 Stevan_White + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Removed TTF Names for 'sample text' and all 'license URL' except English, + 1) in response to FontForge complain that large names tables conflict + with recent Windows patches + 2) because they are redundant and inappropriate + (Hope to post the list of sample texts elsewhere, because I like the idea.) + +2010-03-02 Stevan_White + * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd: + + Latin standard ligatures: in non-bold, promoted dlig to liga. + Put standard Dutch IJ in all; Adjusted spacing a bit + +2010-02-28 Stevan_White + * FreeSerifBold.sfd, FreeSerifItalic.sfd: + + Cyrillic: further revision of spacing, in direction of loosening. + bold ze was strangely thin; made bolder. + +2010-02-27 Stevan_White + * FreeSerif.sfd: + + Cyrillic: reviewed spacing of whole range, generally loosened slightly + tidied a couple of ugly glyphs + +2010-02-09 Stevan_White + * FreeSerifBoldItalic.sfd: + + tweeks to kerning in Latin + + * FreeSerifBold.sfd: + + Tweeks to kerning in Latin + +2010-01-28 Stevan_White + * tools/isMonoMono.py: + + Implement FontForge handling of magic characters + .notdef, .null, nonmarkingreturn + at + 0x0000 0x0001 0x000D + +2010-01-27 Stevan_White + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Improved magic characters for FreeMono, inserted them for other faces + https://savannah.gnu.org/bugs/index.php?28742 + + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd: + + Added at 0x0000 0x0001 0x000D characters + .notdef .null nonmarkingreturn + These are NOT UNICODE they are to satisfy an essentially undocumented + "feature" of FontForge, ( in source tottf.c, AssignNotdefNull() ) + And a funny strong suggestion of TrueType fonts, that they begin with + three special characters (evidently different from encoding slots) + http://www.microsoft.com/typography/otspec/recom.htm + + FontForge looks for these glyphs in certain places and copies them. + Otherwise, apparently, it will find a glyph elsewhere (unclear how) and + copy it there, possibly resulting in something quite wrong + (such as a non-monospace font). + + The three are copied to the end of TTF fonts (only one to the end of OTF + fonts) + +2009-12-31 Stevan_White + * FreeSans.sfd: + + Tamil: deletd Unicode range due to absence of necessary ligatures + + * FreeSerifBold.sfd: + + Cyrillic tweek to spacing + +2009-12-29 Stevan_White + * FreeSans.sfd, FreeSansBold.sfd: + + Gurmukhi: added 2 characters to complete range + + * FreeSans.sfd, FreeSerif.sfd: + + Devanagari: filled out sans, some corrections in serif + + * FreeSerif.sfd: + + Devanagari: Drew and constructed glyphs to complete range. + +2009-12-28 Stevan_White + * OpenType.py: + + Added/corrected some ranges + +2009-12-27 Stevan_White + * tools -- CheckConformance.pl, GenerateTrueType, MES-1.lst, MES-1.txt, MES-2.lst, MES-2.txt, MES-3B.lst, MES-3B.txt, WGL4.lst, mes-list-expand.pl: + + disabled build of Mac TT + + * tools/ligatureLookups.py: + + better sanity check + + * tools/range_report.py: + + more generic title + + * tools/OpenType.py: + + correction to Tamil + + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Resolves bug #23049 + Replacement character (U+FFFD) not properly styled + https://savannah.gnu.org/bugs/index.php?23049 + + * FreeSerif.sfd: + + Devanagari: added letters, completing Unicode range + + * FreeSerif.sfd: + + Tamil: added 2 monster glyphs, completing range + (0bc1-2 still questionable) + +2009-12-26 Stevan_White + * FreeSerif.sfd: + + Indic ranges: named lots of characters + Tamil: corrected and added a few letters + + Tamil: added digits + + Tamil: a few more symbols. Only a couple of monster signs still + missing, and a couple of marks seem just wrong... + + Malayalam: completed Unicode range, also moving some Chillu letters from + Private Use area to Unicode, and re-establishing ligatures + + * FreeSans.sfd: + + Tamil: completed digits, added some other chars + +2009-12-25 Stevan_White + * FreeSans.sfd: + + Indic ranges, esp. + Devanagari: added several new Unicode (not yet complete) + tidied letters + Bengali: tidying, made some refs + +2009-12-24 Stevan_White + * FreeSans.sfd: + + Indic ranges: named most of the Unicode characters + Tried to improve a few bad names for ligatures + in Private Use Area + Made a few references: not clearly an improvement. + This stuff is still a mess... + + Devanagari: added an obviously missing nukta ligature + + Gujarati: added some subvocalic letters for Sanskrit. Quality is low. + + Filled out Geometric Shapes. + + * tools/ligatureLookups.py: + + fixed syntax error + + * tools/LigatureList.pl: + + no longer relevant. + +2009-12-23 Stevan_White + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd: + + cosmetic re-name and re-order of lookups + + * tools/OpenType.py: + + removed links to disappeared web pages + +2009-12-22 Stevan_White + * FreeMonoOblique.sfd: + + Diagonal Fractions lookup didn't make much sense in mono anyway, + much less in just one style. + +2009-12-20 Stevan_White + * FreeSerif.sfd: + + split Diagonal Fractions lookup into two tables + + re-encoded some characters + adjusted some marks + corrected two wrongly-placed glyphs in Phonetic Extensions Supplement + + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd: + + General Punctuation: Got rid of deprecated subrange 0x206A-0x206F + + * tools/range_report.py: + + corrected script name + + * tools/OpenType.py: + + numerous changes, some reflecting changes to Unicode standard + +2009-12-14 Stevan_White + * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd: + + Unicode 5.2 corrections of Abkhasian letters from Daniel Johnson. + Got rid of some old glyph names. + +2009-12-06 Stevan_White + * FreeSans.sfd, FreeSansOblique.sfd: + + Cherokee: fixed previous commit of a partial, and old range in + medium weight + + * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd: + + Cherokee, courtesy of Daniel Johnson. + +2009-11-20 Stevan_White + * FreeSans.sfd: + + New glyphs for Unified Canadian Aboriginal Syllabics as defined in Unicode 5.2 + by Daniel Johnson + +2009-11-14 Stevan_White + * FreeSerif.sfd: + + Resolves bug #27842: FreeSerif U+1F016 (Mahjong Tile Seven of Bamboos) Wrong + https://savannah.gnu.org/bugs/?27842 + has one extra bamboo in it for a total of eight. + The bamboo on the top left needs to be removed + + Resolves bug #27579: Orthodox cross has wrong glyph + http://savannah.gnu.org/bugs/?27579 + U+2626 Orthodox Cross should slope downwards from left to right. + +2009-11-13 Stevan_White + * FreeSerifBold.sfd, FreeSerifItalic.sfd: + + Cyrillic: corrections to Abkhazian letters by Daniel Johnson + +2009-11-05 Stevan_White + * FreeSerif.sfd: + + Cyrillic: corrections to Abkhazian letters by Daniel Johnson + +2009-10-16 Stevan_White + * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Cyrillic: tweeks to brev, based on Unicode 5.2 samples + +2009-10-08 Stevan_White + * FreeSerif.sfd: + + Currency Symbols: tidied + + Number Forms: three new vulgar fractions + + Currency Symbols: added "Tenga" of Kazakhstan + + Latin Extended: corrected a couple of wrong bearings + some fiddling with Vienamese letters with hook + +2009-10-01 Stevan_White + * FreeSerif.sfd: + + added missing accent + +2009-09-17 Stevan_White + * FreeSerif.sfd: + + Latin kerning: gave qj positive kerning (it must happen sometimes) + + Latin kerning: differentiated grave and dieresis vowels in some combos. + (also, adieresis hadn't been kerned at all...) + + Made ref of one Sinhala letter + +2009-07-30 Stevan_White + * FreeSans.sfd, FreeSansBold.sfd, FreeSerif.sfd: + + kerning + +2009-07-26 Stevan_White + * FreeSansBold.sfd: + + kerning + + * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd: + + added some space in diaeresis + did some kerning + + * FreeSansBold.sfd: + + Revert serious mistake with previous commit: had somehow set splines + quadratic. + Here, the GaspTable from that commit is preserved, + However there were evidently numerous other changes that weren't + documented, and these are lost. + +2009-07-12 Stevan_White + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Added GASP tables for control of hinting/smoothing (anti-alising) of + TrueType. + Now the values are better suited to the EM size of the fonts. + Further adjustment (based say on stem width) might still be profitable. + + * FreeSans.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd: + + More tweeks on accents, especially Maltese letters. + +2009-07-11 Stevan_White + * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Maltese Hbar, hbar, Improved, made more consistent. + + * FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Latin: various corrections and tweeks for consistency in accented letters. + + * FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + more space to accent on lcaron + tightened DZ etc ligatures + in SerifItalic faces made references etc in Spacing Modifiers and Combining + further kerning + + * FreeSans.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + kerning + Sans: decided dots and some other marks needed more room. + +2009-07-10 Stevan_White + * FreeSerif.sfd, FreeSerifItalic.sfd: + + IPA. Phonetics: tweeks + + * FreeSerif.sfd: + + Tweeked some math symbols + + * FreeSans.sfd, FreeSansOblique.sfd: + + Letterlike: additions + + * FreeMonoOblique.sfd: + + IPA + + * FreeSerifBoldItalic.sfd: + + Another IPA symbol + + * FreeSerifBoldItalic.sfd: + + IPA and Spacing Modifier Letters: added a few + +2009-07-09 Stevan_White + * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifItalic.sfd: + + Latin: various horizontal spacing and positioning issues + Replaced Tz and tz ligatures with the originals of Danial Johnson. + (range is "Mayanist" and despite Unicode samples, current usage + uses normal z in glyph) + Put stylized Tz tz in a discretionary ligature lookup. + +2009-07-08 Stevan_White + * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd: + + Cyrillic yi_yi Ukrainian ligature + Latin various pointwise cleanup, made some references, horizontal adjustments + + * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Cyrillic: Special ligature for Ukrainian yi_yi, also some kerning + +2009-07-07 Stevan_White + * FreeSerif.sfd: + + Latin: kerning; made accents on i tighter to avoid collisions + +2009-07-05 Stevan_White + * FreeSansBold.sfd, FreeSansBoldOblique.sfd: + + Made lookup tables for Dutch IJ + + Re-did Dutch digraph IJ in bold faces as "broken-U", because I + thought it was cool and nobody was there to stop me. + + * FreeSerif.sfd: + + Corrected ligatures Tz tz; put them in special lookup + Latin Extended Additional: added medevalist letters, completing range + + * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Cyrillic: added yi_yi ligature for Ukrainian in roman. Not sure + if it's right. + Latin: kerning. Added longs_t ligature, and historic ligature tables + IPA: in bolditalic, added a letter or two + + * FreeSerif.sfd: + + Kerning for hbar + + * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd: + + Kerning for Western Slavic languages + Added a couple of IPA to BI + +2009-07-04 Stevan_White + * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Combined letters ae, oe, ij had incorrect horizontal spacing + + * FreeMono.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Combining Diacritical Marks for Symbols: additions and fiddling. + Also related circles, arrows. + + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Letterlike Symbols: various additions and adjustments + Number Forms: Completed range in serif roman. Adjusted spacing + of Latin numerals in serif faces. + Diacritics for Symbols: various additions + Geometric shapes: thought it best for circle to be round even in + oblique faces. It's a choice of course. + Added to several faces. + Made all to pass tests (except Sinhala) + +2009-07-02 Stevan_White + * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Letterlike Symbols: more additions, adjustments + Also fiddled with some math symbols in Sans faces + + * FreeSans.sfd, FreeSansOblique.sfd: + + Letterlike Symbols; additions and adjustments + Note: Pango is rendering very strangely: many glyphs in the font are + being stolen from some other fonts instead: All the script in + blackletter, and some others as well. Is there a cache in the system + somewhere? Or what? + +2009-06-28 Stevan_White + * FreeSerif.sfd: + + Modified glyph. From patch by Pavel Skrylev. + + * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Superscritps and Subscripts: made glyphs to complete range in all faces + + * FreeSans.sfd, FreeSansOblique.sfd: + + Added some combining marks for symbols and Blackboard Bold letters to + letterlike symbols + + * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Various adjustments regarding superscript and subscript characters in + several ranges. + +2009-06-27 Stevan_White + * FreeSerif.sfd, FreeSerifItalic.sfd: + + More fiddling with super/subscripts + Tidied points in Serif to make fontforge "wrong direction" complaint + in scaled reference go away. + Made some other references in basic latin ranges. + + * FreeSerif.sfd: + + Superscripts and subscripts (in various ranges): tried to systematize + sizing and vertical placement. Note: most letters are still simply + scaled. + This is practical maintenance-wise, but isn't typographically optimal. + + * FreeSerif.sfd: + + Cyrillic Extended A: altered mark positions + + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Phonetic Extensions: various corrections and fiddling + Changed Blues values in FreeSerifBoldItalic + +2009-06-25 Stevan_White + * FreeSansBold.sfd, FreeSansBoldOblique.sfd: + + Combining Diacritical Marks for Symbols: added to bold oblique + added placement mark to many + + * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd: + + IPA Extensions: completed in bold and boldoblique, completing range for face. + + All faces: deleted 'cvt', 'prep', 'fpgm' TrueType tables, because + FontForge was complaining about them (legacy hinting that could + interfere, possibly lower quality code, etc) + + * FreeSansBold.sfd, FreeSansBoldOblique.sfd: + + IPA Extensions: made several characters + + * FreeSerif.sfd, FreeSerifBold.sfd: + + IPA Extensions: completed range in bold + +2009-06-23 Stevan_White + * FreeSerifBold.sfd, FreeSerifBoldItalic.sfd: + + Spacing Modifiers: added a couple + Combining Diacriticals: brought range to par with FreeSans + + * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd: + + Same correction as for FreeSerif + + * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Corrected descender of 027f + + * FreeSerifBold.sfd, FreeSerifBoldItalic.sfd: + + IPA and related: made lots of additional glyphs + +2009-06-22 Stevan_White + * FreeSerif.sfd: + + Latin: further clean-up + +2009-06-21 Stevan_White + * FreeSerif.sfd: + + General pointwise clean-up of Latin and Latin Extended. + No visible changes were intended besides changed policy on + horizontal placement of some horned letters + + * FreeSerif.sfd: + + Latin Extended-C: constructed glyphs to complete range. + Latin Extended-D: constructed a bunch of glyphs; some related changes elsewhere. + +2009-06-20 Stevan_White + * FreeSerif.sfd: + + Latin Extended-C: added most of range + + Modifier Tone Letters: added glyphs to complete range. + This should also complete all the IPA/Phonetic extenseions ranges. + + Phonetic Extensions Supplement: added letters completing range + Note the superscript ones are simply scaled, so stem width is + not quite right... + +2009-06-19 Stevan_White + * FreeSerif.sfd: + + Phonetic Extensions: made letters to complete range + +2009-06-18 Stevan_White + * FreeSans.sfd: + + IPA Extensions: clean-up, fix some horizontal spacing issues + + * FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd: + + Some glyph problems clean-up, made to pass validate (BlueValues) + +2009-06-17 Stevan_White + * FreeSansBoldOblique.sfd, FreeSansOblique.sfd: + + IPA Extensions: Improved spacing and horizontal positioning + + * FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd: + + Georgian: added missing letter + + * FreeSansBold.sfd, FreeSansBoldOblique.sfd: + + IPA: made curls on some glyphs more distinct. + note horizontal placement in BO is chaotic--needs work + +2009-06-14 Stevan_White + * FreeSerif.sfd: + + Musical Symbols: various experiments with lookups. + calt: should have allowed isolatef forms of combining marks, + (but can't see application support...) + aalt, hist: for alterntative characters + Added some historical glyphs + Math Alphanumeric: some clean-up. + +2009-06-11 Stevan_White + * FreeSerif.sfd: + + Musical Symbols: various tweeks. Failed attempt to use 'isol' + lookup to put isolated combining marks above the baseline. + + More fiddling with mark placement, strengthened ornamental endings + + mkmk positioning of augmentation dot + +2009-06-10 Stevan_White + * FreeSerif.sfd: + + Musical Symbols: combining marks above and below notes now working + somewhat + +2009-06-08 Stevan_White + * FreeSerif.sfd: + + Musical Symbols: more adjustments of size and placement + +2009-06-07 Stevan_White + * FreeSerif.sfd: + + Musical Symbols: mostly work on lookups. Made tablature symbols + thinner. + +2009-06-06 Stevan_White + * FreeSerif.sfd: + + Musical Symbols: more fiddling with sizes and positions + + Byzantine Musical Symbols: minor clean-ups + + Fixed some ATT problems with 'kern' lookups for Cyrillic + +2009-06-05 Stevan_White + * FreeSerif.sfd: + + Musical Symbols: many changes to glyph positions and shapes + +2009-05-28 Stevan_White + * FreeSerif.sfd: + + Cyrillic: additions and re-naming by Pavel Skrylev. + * Added Cyrillic-B Ext glyphs, and Cyrillic-A Ext glyphs. + * Added cyr_above anchor to all cyrillic glyphs, some glyphs + was changed + * To all Cyrillic letters I've given proper names based on old + Slavic language which is source of all modern slavic languages. + + (the naming is contentious, and there are a couple of technical + problems...under consideration) + +2009-05-27 Stevan_White + * FreeSerif.sfd: + + Musical Symbols: + Scaled up accidentals a bit. + Reduced width of repeated figure marks + Reduced width of caesura even more + Tried to implement mark positioning...not working everywhere + made references + +2009-05-26 Stevan_White + * FreeSerif.sfd: + + Made all letterlike glyph parts more like those from Serif and + Serif Italic. + (Except for Ped. U+1d1ae) + +2009-05-20 Stevan_White + * FreeSerif.sfd: + + Corrected DPOS lookup for Music range to be in script 'musi' + + Western Musical Symbols: fiddling + Miscellaneous Symbols: re-design of musical flat symbol. + +2009-05-19 Stevan_White + * FreeSerif.sfd: + + Western Musical Symbols: Revised horizontal placement of notes. + Altered many combining symbols to be more like Unicode sample. + Corrected many symbols that should be spacing but had 0 width. + Raised many symbols that were far lower than in Unicode + samples. + +2009-05-18 Stevan_White + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + U+0354 and U+0355 (combining left/right arrowhead below) were switched + +2009-05-11 Stevan_White + * FreeSans.sfd, FreeSerif.sfd: + + Hebrew: Moved vowel below mark for esh (05e8) and dalet (05d3) as + recommended in bug report #25887 + "FreeSans Hebrew most nonspacing marks are spacing" + https://savannah.gnu.org/bugs/?25887 + + * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd: + + Put PS Private BlueScale back to default. (Was really experiment to + alleviate excessive overshoot. Didn't work and FontForge complained.) + + * FreeSerif.sfd: + + Geometric Shapes: made two 'bullet' shapes to be consistent with 'bullet' + Blues values: put Std VH W into Stem Snap values + + * FreeSans.sfd: + + More Geometric Shapes. also worked on character widths. + +2009-05-09 Stevan_White + * FreeSans.sfd: + + More Geometric Shapes + +2009-05-02 Stevan_White + * FreeSansOblique.sfd: + + Had misplaced Tifinagh range. + + * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd: + + The rest of Tifinagh, courtesy of Daniel Johnson. + + a few adjustments. + +2009-05-01 Stevan_White + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Explicitly disabled PS Private dictionary entry BlueFuzz + as recommended in Adobe Type 1 Font Format, sect. 5.8. + + * FreeSans.sfd: + + Tifinagh range, courtesy of Daniel Johnson. + + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Adjusted PS Private values according to understanding of + Adobe Type 1 Font Format (Ch. 5, Private Dictionary) + + Not completely clear on BlueScale, and StemSnap values are still a + mystery. (FontForge 'guess' seems to do little or nothing, and I + don't know where these values came from) + + Original hope was to improve appearance of overshoot in Sans, but it + seems that my renderers ignore this information. + + * tools/ranges.py: + + Corrections for Georgian and Tifinagh ranges + +2009-04-28 Stevan_White + * FreeSans.sfd: + + More Geometric Shapes + +2009-04-27 Stevan_White + * FreeSans.sfd: + + Added U+25D0-3 (half-black circles) + Note the Geometric Shapes range is still in poor shape in Sans. + +2009-04-25 Stevan_White + * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Serif: fiddled with mark positioning in Cyrillic and Glagolitic + Non-roman faces: Added 'mark' positioning for Cyrillic + +2009-04-14 Stevan_White + * FreeSerif.sfd: + + Cyrillic Extended-B more additions. Now has all except payerok + punctuation and Old Abkhasian letters. + +2009-04-13 Stevan_White + * FreeSerif.sfd: + + Cyrillic Extended-B a few more letters + + * FreeSans.sfd, FreeSerif.sfd: + + kerning: tweeks + +2009-04-11 Stevan_White + * FreeMono.sfd, FreeSans.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Georgian: additions and improvements. + Serif now has full compliment. + Note uppercase is questionable, being a simple scaling... + + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd: + + Latin Extended-D added u+a788-c + + * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Latin Extended-D + corrected slots for Mayanist letters in roman + added modifier letters u+a788-c + + * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Latin Extended-D Mayanist letters by Daniel Johnson + + * tools/ranges.py: + + Corrected Vai range + +2009-04-10 Stevan_White + * FreeSerif.sfd, FreeSerifItalic.sfd: + + Letterlike Symbols: additions and improvements + + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd: + + Letterlike Symbols: additions, improvements + + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd: + + Reconsidered numeral 1. Made angle more like other angles in font. + +2009-04-09 Stevan_White + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd: + + Increased angle of hook on numeral 'one', to improve distinction from + letter 'l' at small point sizes. (Noticed that on some systems, even + at 12 point the distinction had not been obvious.) + +2009-03-29 Stevan_White + * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd: + + General Punctuation: Adjust position, shape of quotes, fiddle with + others. + + * FreeSans.sfd: + + Kerning: Had grouped letters with round bowls on left (e,c,0,d,q) + together, but now see the original Nimbus fonts had left bounds that + vary by 10 EM or more, which is quite visible. I am correcting a + flaw in the original font in a very difficult and complex way. + It would be much better to make the bounds of these similar letters + to be equal. + To do: same for punctuation, copy to other styles of Sans. + + * FreeSerif.sfd: + + Kerning tweeks. + +2009-03-22 Stevan_White + * FreeMono.sfd: + + clean-up of some of the basic Nimbus glyphs + + * FreeSans.sfd, FreeSerif.sfd: + + Hebrew: more work on lookups regarding vowel marks + + * FreeSans.sfd: + + Hebrew: vowel mark positioning + +2009-03-16 Stevan_White + * FreeSerif.sfd, FreeSerifItalic.sfd: + + re-named some lookup tables (Sinhala, Hebrew) + +2009-03-15 Stevan_White + * FreeSerif.sfd: + + Georgian: point-wise cleanup + note: doubts about spacing and glyph bounds in capitals + + * FreeSerif.sfd: + + Greek Extended: corrected u+1fd3 + +2009-03-13 Stevan_White + * FreeSerif.sfd: + + Cyrillic (and extensions) various tweeks to old Cyrillic letters, + spacing. + +2009-03-07 Stevan_White + * FreeMonoBoldOblique.sfd: + + correct direction braceleft + + * FreeSerif.sfd: + + Glagolitic: tweeks + + * FreeMonoBold.sfd: + + correct direction of braceleft + +2009-03-05 Stevan_White + * FreeSerif.sfd: + + Glagolitic: more fiddling. Raised small letters so their tops are + even with the tops of the big letters, which is more in line with + their "hanging" nature, and with most manuscripts. + +2009-03-04 Stevan_White + * tools/ranges.py: + + ranges for Sinhala + +2009-03-03 Stevan_White + * FreeSerif.sfd: + + Glagolitic: More tweeks. Added Djervi (I think) + +2009-03-02 Stevan_White + * FreeSerif.sfd: + + Glagolitic: tweeks + +2009-02-28 Stevan_White + * FreeSerif.sfd: + + Sinhala: replaced U+0DD0-1 with ones from sinha font + + Glagolitic: Additions, improvements (Note: the characters still missing + I simply haven't yet recognized in a manuscript or found in an on-line + HTML encoded text. I would like to see real ones rather than copying + out of the Unicode samples.) + + Cyrillic Extended-B: Assembled Monograph Uk, uk. See discussion + http://en.wikipedia.org/wiki/Uk_(Cyrillic) + +2009-02-27 Stevan_White + * FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd: + + Made braces more distinctive. + +2009-02-26 Stevan_White + * FreeMono.sfd: + + ASCII: Accentuated braces (for better readability in terminals) + +2009-02-24 Stevan_White + * FreeSerif.sfd: + + Cherokee: Daniel improved U+13d2 + + Sinhala: Copied most Unicode glyphs directly from Yannis Haralambous + sinhala MetaFont files. These are: all but 0dd0 0dd1 0df4. + Gave Unicode characters names, based on a transliteration scheme from + Harshula. + The auxiliary Sinhala are all from the LKLUG font. + +2009-02-23 Stevan_White + * FreeSerif.sfd: + + Copied glyphs from LKLUG font, as discussed with Harshula Jayasuriya. + http://sinhala.cvs.sourceforge.net/viewvc/sinhala/sinhala/fonts/ + + This font is derived from a Metafont font: This package was + originally developed by Yannis Haralambous (Yannis.Haralambous at + univ-lille1 fr), with funding from the Wellcome Institute for the + History of Medicine, 183 Euston Road, London NW1 2BE, England (Contact + person: Dominik Wujastyk (D.Wujastyk at ucl ac uk)), which is using + the font in its Catalogue of Sinhala Manuscript. The original package + was available by ftp at ftp.bcc.ac.uk in: + /pub/users/ucgadkw/indology/software/sinhala1-TeX.zip + + The hope is to eventually pull glyphs directly from the original MF + files. + +2009-02-21 Stevan_White + * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd: + + tidying previous commits + + * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Serif: Revised letter spacing in Armenian. + Serif roman: Added initial version of Glagolitic (by me) + +2009-02-18 Stevan_White + * FreeSerif.sfd: + + Armenian: spacing changes + Sinhala: deleted range, for usual reasons: + It doesn't even contain the full set of Unicode letters, and Sinhala + requires auxiliary characters and lookup tables for proper + representation. + (Found what I think are the originals at + http://www.mettanet.org/fonts/ ) + +2009-02-12 Stevan_White + * FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + SerifBoldItalic - Armenian oblique from Daniel Johnson's bold version + Added ligatures (by Daniel) and lookup tables. + + * FreeSerifItalic.sfd: + + Armenian: Made oblique version of Daniel Johnson's range + + * FreeSerifBold.sfd: + + Armenian by Daniel Johnson + + * FreeSerif.sfd: + + Improvements of a couple of Armenian characters, from Daniel Johnson. + + * tools-- GenerateOpenType, GenerateTrueType, checkGlyphNumbers.py, findBackLayers.py, isMonoMono.py, range_report.py, ranges.py, validate.py: + + Changed /usr/local/bin/fontforge to /usr/bin/fontforge + (to work with the update-alternatives mechanism, whereby a link is made + /usr/bin/fontforge -> /etc/alternatives/fontforge -> preferred binary ) + +2009-02-07 Stevan_White + * FreeSerifItalic.sfd: + + Latin: Kerning. Fixed some missing extrema + Made some more delicate italic IPA letters + +2009-02-06 Stevan_White + * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd: + + Latin: kerning + + * FreeSerifBold.sfd, FreeSerifBoldItalic.sfd: + + Adjusted ff etc ligatures in Italic + +2009-02-05 Stevan_White + * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Thai sample text (means something like + Mr Sangkapan who sells bottles was picked up by the police because he + stole the wash of ms. .....) + +2009-02-04 Stevan_White + * FreeSans.sfd: + + Vai range, by Daniel Johnson + + * FreeSerifBoldItalic.sfd: + + Latin: kerning + +2009-02-03 Stevan_White + * FreeSerifBold.sfd, FreeSerifBoldItalic.sfd: + + Latin: kerning + +2009-01-26 Stevan_White + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd: + + Made nu distinct from v. + Remedies bug #25376: https://savannah.gnu.org/bugs/?25376 + greek letter 'nu' [U+03bd] same as latin 'v' [U+0076] in FreeMono + +2009-01-22 Stevan_White + * FreeSans.sfd: + + Kerning. Need to copy to other faces + + Arabic ligatures: turned on "ignore combining marks" on advice of + Khaled Hosny. + +2009-01-20 Stevan_White + * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Drew U+1e9C-F in Latin Extended Additional (including capital ess-zet) + +2009-01-19 Stevan_White + * FreeMono.sfd: + + Update of Kayah Li from Daniel Johnson + +2009-01-18 Stevan_White + * FreeSerif.sfd: + + Latin: kerning + + Coptic: Laula to be same height as Phi Psi (higher than other letters). + Dei and dei also to be higher letters, adjusted widths too. + + Unified Canadian Aboriginal Syllabics: moved the non-Unicode letter + part glyphs ucas.ring ucas.horizline ucas.shortvert ucas.righttack + ucas.lefttack to the Private Use area + 59664-59668 + Technique was to edit the SFD file directly: It seems the encoding + slot for the glyph is the first field of the "Encoding:" line for + the character. + + * FreeMono.sfd: + + Cherokee: improvements from D. Johnson. + +2009-01-17 Stevan_White + * FreeSerif.sfd: + + Cyrillic: Kerning. + + Re-linked Ezh/Yogh and re-made reversed Ezh. + +2009-01-16 Stevan_White + * FreeSerif.sfd: + + Fiddled with Coptic glyphs: Longer tail on Shei, less droopy Alfa. + Made Armenian Aiw to be a link to Phi (on Daniel Johnson's advice ) + + * FreeMono.sfd: + + Kayah Li by Daniel Johnson + + Cherokee, by Daniel Johnson + + Made references of some Armenian punctuation, + Made primereversed to be really the reverse of prime. + + Removed hints + + * tools/ranges.py: + + corrected Unified Canadian Aboriginal Syllabics + +2009-01-13 Stevan_White + * FreeSans.sfd: + + named some Armenian letters + + * FreeSerif.sfd: + + Armenian range by Daniel Johnson, with ligatures. + +2009-01-12 Stevan_White + * FreeSerif.sfd: + + Coptic: Raised top of laula above common top, as it appears in most + other fonts. Makes it easier to distinguish from alfa. + A little more space around Iauda and iauda. + Kerned Dei. + +2009-01-11 Stevan_White + * FreeSerif.sfd: + + Coptic: Made capital Alpha is distinct in printed form. + Made more angular vida with flattened top and bottom. + Made small hori more curvy. + More fiddling with Hori, made Kapa much wider. + + Reduced width of small letter straight stems to match small letters + in Latin. + Kerning for capitals. + + Revised: + Added a few dialectic letters and kai symbol + Removed many "ear" serifs, preferring a slashing continuation of + long decenders and diagonals as in some manuscripts + Made Kai and kai not to go below baseline + Made Psi a little broader + Made small khei distinct from cap, + Revised Hori and hori. + Some of this toward https://savannah.gnu.org/bugs/?25289 + + Greek: Made archaic letters u+0370-3 (understand are used for + old numbering) + +2009-01-08 Stevan_White + * FreeSerif.sfd: + + Various alterations to Coptic: Re-worked K and M, added kern table. + +2009-01-07 Stevan_White + * FreeSans.sfd: + + Daniel Johnson's fix of TT reference transformation bug in + Unified Canadian Aboriginal Syllabics, + +2009-01-06 Stevan_White + * FreeSans.sfd: + + Unified Canadian Aboriginal Syllabics range, courtesy of Daniel Johnson. + +2009-01-04 Stevan_White + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Added 2009 to copyright dates + + * FreeSans.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Added some TrueType names + +2009-01-04 Stevan_White + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Added 2009 to copyright dates + + * AUTHORS, CREDITS: + + Removed Glagolitic range author + + * FreeSans.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Added some TrueType names + +2009-01-01 Stevan_White + * FreeSerif.sfd: + + Removed Glagolitic range, since have not (yet) received OK from author. + + Added some TrueType Names + +2008-12-31 Stevan_White + * COPYING: + + Updated license to GPL v3 + +2008-12-30 Stevan_White + * FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Oblique versions of Daniel Johnson's Cherokee. + + * FreeSerifBold.sfd: + + Cherokee Bold range from Daniel Johnson. + +2008-12-27 Stevan_White + * isMonoMono.py: + + 900 EM -> 800 + + * FreeMonoBold.sfd, FreeMonoBoldOblique.sfd: + + Made glyphs to lie between -200 and 800 EM + + * isMonoMono.py: + + check that glyphs lie in vertical bounding boxes + + * FreeMono.sfd, FreeSerif.sfd: + + Extensible bracket characters didn't exactly line up. Fixed. + Mono: a couple of glyphs had gotten out of their bounding boxes again. + + * tools/isMonoMono.py: + + 900 EM -> 800 + + check that glyphs lie in vertical bounding boxes + +2008-12-26 Stevan_White + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Final pre-release cleanup + + * FreeSerif.sfd: + + Buginese vowel u was misnamed + + * FreeMono.sfd: + + Yatcyrillic somehow was a mark character ... fixed + + * FreeSans.sfd, FreeSansOblique.sfd: + + Had to un-link references in + Sans: uni02B2, uni02B5 + SansOblique: uni0363 + because validation of the TTF file said the glyph + "is drawn in wrong direction" + I would have preferred to have understand this... + + * Makefile: + + Added quick test for FontForge version. + + * FreeMonoBold.sfd, FreeMonoBoldOblique.sfd: + + Removed kerning tables (?? what were they doing here anyway??) + + * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Kerning tables for Thai. + Handles one common case: short letter followed by a tall one with + an overhang to the left. + + * tools/ranges.py: + + some changes to explanatory text + +2008-12-25 Stevan_White + * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifItalic.sfd: + + More putzing with kerning tables + + * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Copied kerning classes + Serif -> SerifBold + SerifItalic -> SerifBoldItalic + Sans -> SansOblique SansBold SansBoldOblique + Some associated naming of characters, etc + + * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Additions and correction in Spacing Modifier letters and IPA Extensions + +2008-12-23 Stevan_White + * FreeSerif.sfd: + + Applied patch to Cherokee range + +2008-12-20 Stevan_White + * FreeSerif.sfd, FreeSerifItalic.sfd: + + Fixed kern classes that end in space (crashes FontForge) + + * FreeSerifItalic.sfd, FreeSerif.sfd: + + kerning + +2008-12-19 Stevan_White + * FreeSerifItalic.sfd: + + kerning + + * FreeSerif.sfd: + + kerning + Some adjustments to Glagolitc spacing, mark positioning + +2008-12-18 Stevan_White + * FreeSerif.sfd, FreeSerifItalic.sfd: + + kerning + +2008-12-17 Stevan_White + * FreeSerif.sfd, FreeSerifItalic.sfd: + + kerning + +2008-12-11 Stevan_White + * FreeSans.sfd, FreeSerif.sfd: + + kerning + +2008-12-10 Stevan_White + * FreeSans.sfd, FreeSansBold.sfd: + + kerning + + * FreeSans.sfd, FreeSansBold.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd: + + kerning + +2008-12-09 Stevan_White + * FreeSerif.sfd, FreeSerifItalic.sfd: + + kerning + +2008-12-08 Stevan_White + * FreeSansOblique.sfd: + + Slanted small final sigma. Remedies + bug #24993: U+03C2 "Greek small letter final sigma" not slanted in + Free Sans Oblique + https://savannah.gnu.org/bugs/index.php?24993 + +2008-12-07 Stevan_White + * FreeSans.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + kerning, etc + +2008-12-06 Stevan_White + * FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifItalic.sfd: + + kerning + Tweek in Sans having to do with addition of Latin Extended + +2008-12-05 Stevan_White + * FreeSansBold.sfd, FreeSansBoldOblique.sfd: + + Tweeks to Latin Extended Additional + + * FreeSansBoldOblique.sfd: + + Added Latin Extended Additional range + + * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd: + + Extra space at end of kern class names has bad effect on FornForge + script that try to run through kern classes. Some FontForge call + corrupts memory. + Got rid of extra space. + +2008-12-02 Stevan_White + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd: + + Replaced U+0387 GREEK ANO TELEIA with top dot of colon. + See bug #24987: U+0387 GREEK ANO TELEIA too low + https://savannah.gnu.org/bugs/index.php?24987 + + * FreeSerif.sfd: + + more kerning in Cyrillic (broke into two tables of classes) + +2008-12-01 Stevan_White + * FreeSerif.sfd: + + tweeks to kernin + + * FreeSerifBoldItalic.sfd: + + kerning + +2008-11-30 Stevan_White + * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Kerning for Latin and Cyrillic fairly complete in Serif faces. + Complete in sense that it looks pretty good under Pango for + English French German Spanish Polish Czech Latvian + But have not done Vietnamese (will require many more entries). + I adjust roman and italic, then copy tables by hand to bold and + bolditalic. + Misgiving: bolditalic is much too crammed + Overall, I may have over-kerned. (A difficult temptation to master.) + + * FreeSerif.sfd, FreeSerifItalic.sfd: + + kerning + + * FreeSans.sfd, FreeSerif.sfd, FreeSerifItalic.sfd: + + kerning + In Serif, modified widths of some extended latin glyphs + +2008-11-29 Stevan_White + * FreeSerif.sfd: + + Broke Latin kerning subtable into four, hoping it will be easier to + understand and maintain. + + * FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSerif.sfd, + FreeSerifItalic.sfd, FreeSerifBold.sfd, FreeSansOblique.sfd, + FreeSans.sfd: + + kerninig + +2008-11-28 Stevan_White + * FreeSans.sfd, FreeSerif.sfd: + + more kerning; + made guillemot narrower + + * FreeSansOblique.sfd, FreeSerif.sfd: + + previous commit was incomplete + + * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Adjusted width of single quotes (and apostrophe) to be "punctuation width" + More fiddling with kerning. + +2008-11-27 Stevan_White + * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifItalic.sfd: + + much fiddling with kerning + +2008-11-26 Stevan_White + * FreeSerifBold.sfd: + + Basic kerning, named main Cyrillic letters + + * FreeSerifItalic.sfd: + + Basic Cyrillic kerning + + * FreeSerif.sfd: + + Tweeks to Cyrillic kerning + + * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifItalic.sfd, Makefile: + + Much fiddling with kerning, tables, and generating fonts whose kerning + tables work with OpenOffice. + + * tools/GenerateTrueType: + + Made to include old-style kerning + Converted to Python + +2008-11-24 Stevan_White + * FreeSerif.sfd: + + regularized padding in Miscellaneous symbols. + At least within related ranges tried to make similar. + Made to validate + +2008-11-23 Stevan_White + * FreeSerif.sfd: + + Filled out Miscellaneous Symbols. Used George Douros' Unicode font. + Completed Miscellaneous Symbols, with some drawings from George Douros' + Unicode Symbols, and some of mine. + + * FreeMono.sfd, FreeMonoOblique.sfd: + + Replaced Greek Exteded psili and dasia with scaled versions of the + "bent quote" mark. I think it's distinctive enough, but not so silly. + + Remedies bug #22997: Mono: Greek Extended psili is ugly + https://savannah.gnu.org/bugs/?22997 + + * FreeSerif.sfd: + + Made some recycling symbols + + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd: + + Finished with Hebrew Pointed letters in all faces. + + * tools/range_report: + + preferred to keep the file ending + +2008-11-22 Stevan_White + * FreeSans.sfd: + + Fiddled with Hebrew Pointed letters + + * FreeSerifItalic.sfd: + + Marks for Vietnamese + + * FreeSerif.sfd, FreeSerifItalic.sfd: + + Letter pe had strange thick middle ear that looked awful. lamed had ben + bumped at some point. Fixed. Adjusted some of the points. + +2008-11-21 Stevan_White + * FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + repairs to Pointed Hebrew + + * FreeSerif.sfd: + + Numeral line positioning marks for Gothic + + * FreeSerifItalic.sfd: + + Added Combining Marks for Symbols (some question about obliqueness of + some symbols) + Cleaned up some empty glyphs in Pointed Hebrew. + +2008-11-20 Stevan_White + * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Provided Hebrew pointed letters, with lookups, for all Serif faces. + +2008-11-19 Stevan_White + * FreeSerifBoldItalic.sfd: + + renamed Hebrew lookups + + * FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Completed Hebrew in Bold faces. + + * FreeSans.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifItalic.sfd: + + More tweeks to Hebrew points + + * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSerif.sfd, FreeSerifItalic.sfd: + + Adjustments corrections and additions to Hebrew points + +2008-11-18 Stevan_White + * FreeSansBold.sfd: + + Cleaned out a lot of ridiculous kernings + +2008-11-17 Stevan_White + * FreeSansBoldOblique.sfd: + + fiddled with Armenian ligatures + + * FreeSansBoldOblique.sfd, FreeSansOblique.sfd: + + Added Armenian (with ligatures) to BoldOblique + Fiddled with character spacing + +2008-11-16 Stevan_White + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSans.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Added U+01f9 and paragraph end marker to Georgian + Fiddled with Armenian ligatures + +2008-11-15 Stevan_White + + * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd: + + Another pass at letter spacing in Cyrillic. + Also went through ancient letters. + + Added Georgian paragraph separator 10FB + Added Georgian turned gan 10F9 (because it was easy) + + Re-worked letter spacing through modern Cyrillic range. + + * FreeSans.sfd, FreeSansBold.sfd, FreeSerif.sfd: + + Letter spacing + +2008-11-14 Stevan_White + * FreeSerif.sfd: + + Added several characters to Cyrillic Extended-B + + * FreeSansBold.sfd, FreeSansBoldOblique.sfd: + + Made Cyrillic hooked e U+04BC-F to look less goofy. + + * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd: + + Based on assertion on Pechatnyj Dvor's web site, Cyrillic Fita + U+0472-3 and "Barred O" U+04E8-9 are different styles the same letter, + and the fact that the tilde in the O never looked good in Sans, I + made them all barred O's. + + * FreeSerif.sfd: + + Added Cyrillic Yn, yn (U+a65e-f) + + * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd: + + Synced up Cyrillic and Combining Diacritics ranges, + Couple of tweeks in Gujarati to make TT validate + + * FreeSans.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Changes to older Cyrillic letters, in response to further information. + Made omegas, omegas with titlo, and OT to all be of the same size and + shape in Serif. + Un-linked Cyrillic Psi and psi from Greek, made squarer versions. + + Some more Cyrillic diacritical marks in Sans. Re-worked U+04bc-f . + Experimenting with mark positioning for Cyrillic + +2008-11-12 Stevan_White + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Strove to make Euro look more like the EC logo design, while making + glyph fit better with the design of its face. Bug #3576: Euro design + https://savannah.gnu.org/bugs/?23576 + + * FreeSans.sfd, FreeSerif.sfd: + + Adjustments mostly to GPOS tables having to do with Vietnamese marks. + The WAZU Vietnamese test page looks pretty good in Sans now. + Still not thrilled with below-dot when it appears with a mark over + e.g. U+0102. Pango positions one or the other but not both. + + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Extensive modification of GPOS lookup tables for mark positioning. + I think they're now all functional (except styled Mono faces have none). + Also added lots of marks to faces that didn't have them, and also + fiddled with Combining Diacritical Marks. + +2008-11-10 Stevan_White + * FreeSerif.sfd: + + Made one combining mark really combining + + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd: + + Made a few combining characters to be zero-width in Mono, + Added them to other styles. + + * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Figured out why below marks in Thai weren't working in the lowest + letters. I think Pango and other font renderers ignore 'blwm'. + However, 'mark' works. + + * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Tweeks to Thai marks + +2008-11-09 Stevan_White + * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Several bugfixes in Thai, mostly having to do with mark placement and + ligatures. Implemented ru-saraaa and lu-saraaa with ligatures. + + * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + added and named dottedcircle (used by Pango to render + combining mark base) + + * FreeSerif.sfd: + + Tweeks to Coptic, after viewing more papyrus samples and web pages. + + * FreeSerif.sfd: + + Weight of Coptic small letters made to match that of Latin and Greek ones. + +2008-11-08 Stevan_White + * FreeSerif.sfd: + + Made Coptic to comply better with + http://www.wazu.jp/gallery/Test_Coptic.html + Made a flourish at foot of letters with long diagonal. + + More tweeks to Coptic; put in a mark lookup table. + + Note: for small letters I made scaled references to captials. + Results in those letters looking quite light next to the capitals and + next to small Latin letters. Also, there are a few variant forms for + capitals (Unicode samples don't show this). It would be good to + re-work + + Added Coptic alphabet in u+2C80-2CB1 and u+03E2-u+03EF, drawn/built by + me, based on Unicode samples, TeX font copte, and scans at WikiPedia. + +2008-11-07 Stevan_White + * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Further tweeks to dieresis in Greek and Cyrillic + + * FreeSerif.sfd: + + replaced Greek I dieresis with references, tweeked height of dieresis. + +2008-11-04 Stevan_White + * FreeSerif.sfd: + + Added a few Cyrillic Extended-B letters seen in web pages while looking + for Glagolitic text. + + * FreeMono.sfd, FreeMonoOblique.sfd: + + Added a few old Cyrillic characters. + + * FreeSerif.sfd: + + Several corrections and tweeks to Glagolitic. + Still missing six slots from Unicode, but don't see them in the TeX + fonts. + On the other hand, several on-line Glagolitic pages (bibles etc) don't + seem to use these. Maybe it's OK as-is. + +2008-11-03 Stevan_White + * FreeSerif.sfd: + + Added lowercase range to Glagolitic, as a facile scaling of the + uppercase. + + Added letter to Glagolitic, scaled range. + +2008-11-02 Stevan_White + * FreeSerif.sfd: + + Replaced fraktur bold from Mathematical Alphanumeric Symbols with that + from TX Fonts by Young Ryu. + One concern: letter k is damaged (in both medium and bold). I just + hacked something up. + + Added Glagolitic "round type" font (Croation capitols only) from the + collection of Croatian fonts for LaTeX by Darko Zubrinic + ftp://ftp.dante.de/tex-archive/languages/croatian/ + http://www.tug.org/TUGboat/Articles/tb17-1/tb50zubr.pdf + + Several letters are missing besides the small letters. + + * FreeSerifBoldItalic.sfd: + + A couple of Thai references got obliqued twice. + + * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + By popular demand, removed 'ears' from Greek Upsilon and Psi. + Copied resulting glyphs to Serif Mathematical Alphanumeric Symbols. + + * FreeSerif.sfd: + + Some pointwise cleanup of main Tamil range + + Tried some things with lookups. Didn't make much headway. + +2008-11-01 Stevan_White + * FreeMono.sfd: + + somehow made a letter with wrong width + + * FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Added similar lookups and ligatures to Thai ranges. + + * FreeSerif.sfd: + + Lookups now work no worse than those for other Thai fonts, at least + in Pango. Still perplexed by behaviour of "Required" lookups. + + For Thai, made ligatures and lookups for yoying and thothan combined + with a lower vowel. These work well. + Attempted looksups for saraaa with ru and lu, and for saraam. + Not working. + + Cleaned up a few of the Bengali ligatures + + * FreeSerifBold.sfd: + + Tweek Thai + +2008-10-31 Stevan_White + * FreeSerif.sfd: + + Fixed ligatures and mark positioning for Hanuno. + Problem with ligatures: Gnome pango doesn't do 'rlig', only 'liga' + + * FreeSerifItalic.sfd: + + Changed lookup table scripts for Devanagari and Bengali. + Find Problems -> ATT found several problems showing lookups acting on + glyphs that weren't listed in the script ranges, including dev2, bng2 + (why not deva and beng, I don't know). + + danda and doubledanda of Devanagari I understand are to be shared among + Indic scripts. So included bng2 and dev2 in the 'aalt' table for those. + + The 'init' and 'half' tables for Bengali made active for bng2. + + The 'locl' table for Bengali didn't do anything I could see: It mapped + the Devanagari danda to itself, and the doubledanda to itself. Deleted. + + Cleaned up some kern tables. + adjustments of under 5 EM are invisible. Some others I just didn't like. + Some were putting a letter beneath another, with is wrong. + + * FreeSerifBoldItalic.sfd: + + Added Thai + + * FreeSerifBold.sfd, FreeSerifItalic.sfd: + + Changes to mark positioning lookups, esp. in Italic. + Widened numerals in Bold + +2008-10-27 Stevan_White + * FreeSansBoldOblique.sfd, FreeSansOblique.sfd: + + Tweeks regarding Armenian and lookups + + * FreeSansBold.sfd: + + Added Armenian ligatures FB13-FB17 with lookups + Also made a historical ligature ('hlig') table for u+0587. + + Toward bug #15183: missing characters from Armenian range + https://savannah.gnu.org/bugs/index.php?15183 + + * FreeSansOblique.sfd: + + Added Armenian ligatures, lookups. Cleaned up contours. + + * FreeSans.sfd: + + Added 5 Armenian ligatures to U+FB13 FB17, and made corresponding + 'liga' lookup. Found there one ligature u+0587 that according to + http://en.wikipedia.org/wiki/Armenian_alphabet + + "in new orthography the ? character is not a typographical ligature anymore, and must never be treated as such. It is a distinct letter and has its place in the new alphabetic sequence." + So moved this out of the 'liga' lookup and into a new 'hlig' lookup. + +2008-10-26 Stevan_White + * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifItalic.sfd: + + Lots of improvements to Thai. + Completely revised letter spacing in Italic, and fiddled with combining + marks in all. + Still aren't working quite right, especially in Italic. + Still need to work over digits (in Bold they aren't even bold yet) + + * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifItalic.sfd: + + Bold Thai : added (painstakingly) constructed glyphs, lookups + roman Thai: tweeks + Italic Thai: tweeks (Note this still has multiple problems) + +2008-10-25 Stevan_White + * FreeSerif.sfd: + + WAZU says + http://www.wazu.jp/gallery/Fonts_Hanunoo.html + + MPH 2B Damase doesn't support the consonant-vowel ligatures necessary + to render Buhid writing. + + OK, so I made 'mark' lookups for combining marks and a bunch of + ligatures in an 'rlig' lookup. The latter still not working: + don't know why. + + Made page to match the example of the combining forms at + http://www.omniglot.com/writing/hanunoo.htm + +2008-10-24 Stevan_White + * FreeSerif.sfd: + + Removed some marks from Mathematical Alphanumeric Symbols + + * FreeSerif.sfd: + + Tweeked combining marks for Vietnamese. Made to satisfy + WAZU JAPAN Comprehensive Unicode Test Page for Vietnamese + http://www.wazu.jp/gallery/Test_Vietnamese.html + Could still use some tweeking... + + * FreeSerif.sfd: + + Added marks for composition of Vietnamese + + * FreeMono.sfd, FreeSerif.sfd: + + Put "below" combining mark on lots of vowels and derivatives, + for Vietnamese. + Named a bunch of composit Latin, expecting to make substitutions. + +2008-10-23 Stevan_White + * FreeSerif.sfd: + + Thai spacing alterations based on advice of a native speaker. + +2008-10-22 Stevan_White + * FreeSerif.sfd: + + re-named Thai lookups according to order + +2008-10-21 Stevan_White + * FreeSans.sfd: + + Cleanup of glyphs in Gujarati, Devanagari. + + Note: Serious problem with Sans GPOS abvm in Devanagari + "'abvm' Above Base Mark in Devanagari subtable" "gujr-0" + But all the characters that list gujr-0 are in Gujarati. + Not sure how this got broken or how to fix it. + + * FreeSerif.sfd: + + Fiddled with Thai mark positioning: passes my tests now OK. + Made a few more references in Math Symbols; more regularization of + stroke. + + * FreeSerif.sfd: + + Added mark class for Vietnamese "horn" + Several references made in General Punctuation, Arrows + + * FreeMono.sfd: + + added some Combining Diacritical Marks + +2008-10-20 Stevan_White + * FreeSerif.sfd: + + Made some references from serifed Latin capitals to Greek counterparts. + + * FreeSerif.sfd: + + Made a few repeated glyphs into references in Musical Symbols + + * tools/ranges.py, tools/validate.py: + + tweeked some ranges, format of output + +2008-10-19 Stevan_White + * FreeSerif.sfd: + + Moved several glypns from Mathematical Alphanumeric Symbols to + Letterlike Symbols. + Couple tweeks in Mathematical Symbols. + + * FreeMono.sfd, FreeSerif.sfd: + + Fiddling with Mathematical Symbols. + In Serif, trying to make stroke width more consistent. + + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerif.sfd: + + Added some Greek symbols in Mono and Sans to make a little more regular + and correspond better with TeX. + Tweek of serif. + + * FreeSansBold.sfd: + + a few more improvements. + + One problem with the Mathematical Alphanumeric area is, one must + remember to change it any time another face is altered... + + * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSerifBold.sfd: + + Several improvements and additions to Sans faces (mostly in Greek) from + experience of pasting into FreeSerif Mathematical Alphanumeric Symbols. + + * FreeSerif.sfd: + + Replaced most of Mathematical Alphanumeric Symbols + roman italic bold (latin and greek) + gothic italic bold (latin and greek) + typewriter + and numerals + with glyphs from FreeFont. These were scaled to uniform height. + + Remains: Blackboard Bold, Fraktur, Calligraphic, Script + + * FreeSerif.sfd: + + Tidied lookup table names for Malayalam + + * FreeSerif.sfd: + + Applied Malayalam patch from Hiran Venugopalan + + * FreeMono.sfd: + + Added/corrected many Mathematical Symbols + + * FreeSansOblique.sfd: + + more IPA + +2008-10-18 Stevan_White + * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd: + + Made lots more IPA and Phonetic Extensions + Note: fontforge is reporting an error in a few glyphs made by scaling + another, that the glyphs are drawn in the wrong direction--only in + TrueType though. Suspect a FontForge bug. + + Added several Combining Diacritical Marks + +2008-10-17 Stevan_White + * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd: + + Made several Spacing Modifier Letters, Combining Diacritical Marks, + and IPA and Phonetic Extensions + +2008-10-16 Stevan_White + * tools/ranges.py: + + un-grayed totals rows + + Fiddled Cyrillic + made output prettier + + * FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Added some Superscripts and Subscripts + + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd: + + Finished off Superscripts and subscripts + + Completed General Punctuation for Mono faces + + Added some General Punctuation + +2008-10-15 Stevan_White + * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd: + + more Letterlike Symbols, Currency Symbols + + * FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd: + + Made some Combining Diacritical Marks for Symbols, Letterlike Symbols + + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd: + + Added some General Punctuation + +2008-10-14 Stevan_White + * FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd: + + Added double slanted hyphen, made General Punctuaton Supplement like + Serif's + + * FreeSansBoldOblique.sfd: + + Filled out Greek Extended + + * FreeMono.sfd, FreeSerifItalic.sfd: + + fixes to last 2 commits + + * FreeSerifItalic.sfd: + + Last character to General Punctuation + + * FreeMono.sfd: + + Built some Enclosed Alphanumerics (1-10) + + * FreeSerif.sfd: + + Copied in Daniel Johnson's changes to Cherokee. + +2008-10-12 Stevan_White + * FreeSerif.sfd: + + Included Daniel Johnson's Cherokee glyphs. + +2008-10-05 Stevan_White + * FreeMono.sfd: + + Further corrections to diaresis in Cyrillic -- legibility in small sizes + + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoOblique.sfd, FreeSerif.sfd: + + Regularized placement of diaresis in Cyrillic + + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Added same set of glyphs to Cyrillic Supplement + + * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd: + + Added some of the easier letters from Cyrillic Supplement + +2008-10-04 Stevan_White + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeSerifItalic.sfd: + + Finished high Cyrillic range for MonoBold and MonoBoldOblique. + (Remaining: historic ranges, Cyrillic extensions) + Tweeked others. + + * FreeMonoBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Serif*Italic: Added last Abkhazian letters to Cyrillic + MonoBold: tweek + +2008-10-03 Stevan_White + * FreeMono.sfd, FreeMonoOblique.sfd, FreeSerif.sfd, FreeSerifBoldItalic.sfd: + + Mono: Some additions to historic letters + + * FreeSerif.sfd: + + Added some punctuation and combining numeric marks from + Cyrillic Extended B + + * FreeMono.sfd, FreeMonoBold.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Various technical tweeks, mostly concerning recent additions. + Also did a bit more "Points too close" and "irrelevant control points". + Cyrillic millions redesign meant could not maintain use of refrences + for it. + + * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + More high Cyrillic + Included old Cyrillic millions combining mark in Sans, changed design + in Serif + +2008-10-02 Stevan_White + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd: + + More high Cyrillic + + * FreeMonoOblique.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerifBoldItalic.sfd: + + More high Cyrillic glyphs + + * FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + More glyphs in high Cyrillic. Remains only some whose form I'm unsure + of in italic. + + * FreeSerifBoldItalic.sfd: + + More glyphs in higher Cyrillic range + + * FreeSerifItalic.sfd: + + Same process of tightening el, em, ge (but a P.S. to previous commit: + also did ya, ze for SerifBold.) + + * FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + BoldItalic: Tightened up spacing on left of el, em, ge (could go + farther, but it is partly a problem with glyph design... + + * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + More additions to Cyrillic. Finished SerifBold except for Nivkh + additions. + Used references on number combining forms. + +2008-09-30 Stevan_White + * FreeSerif.sfd: + + Added four (obsolete) Chuvash letters to Cyrillic Supplement + - completing it. + +2008-09-29 Stevan_White + * FreeSerif.sfd: + + Greek adjustments + Adjusted spacing of kappa slightly + Got rid of ears on Psi, following similar request for Upsilon. + +2008-09-28 Stevan_White + * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd: + + Adding and fiddling with Spacing Modifiers and Combining Diacriticals + + * FreeSans.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Revisions of several Combining Diacritical marks + + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd: + + A few Combining Diacriticals and Spacing Modifiers + + MonoBoldOblique: Primarily filling out Spacing Modifier Letters + others: little fixes found along the way + +2008-09-27 Stevan_White + * FreeSerif.sfd: + + Replaced Malayalam range with that from Rachana_04 found on + Swathanthra Malayalam Computing project page + http://savannah.nongnu.org/projects/smc/ + Besides scaling and converting to cubic, performed much clean-up of + glyphs, added an r2 character, and re-named a bunch of characters. + +2008-09-23 Stevan_White + * tools/ranges.py: + + Corrections and additions to several ranges, + put extra row in table with character totals + +2008-09-22 Stevan_White + * FreeSerif.sfd: + + Filled in as much of Phonetic Extensions as I could without artistic + abilities. + Note 1D48-9 are not references due to apparent FontForge bug, that says + scaled references go in wrong direction. + + * FreeSerif.sfd: + + Cleaup of some Bengali glyphs. + Note many of the ligatures remain very very messy. + + * Makefile: + + added more validations + made to work with GenerateOpenType + + * FreeSerif.sfd: + + Built two more easy Phonetic Extensions + + * FreeSerif.sfd: + + Built some Phonetic Extensions letters, those with middle tilde + + * tools/GenerateOpenType: + + Replaced bash version with Python + +2008-09-21 Stevan_White + * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd: + + Added lots of Spacing Modifier Letters and Combining Diacritical Marks. + + * FreeMono.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSans.sfd, FreeSerif.sfd: + + Wrote script to check if glyph encodings were in stated ranges, fixed + most discrepancies. + + There were a bunch of incompletely deleted characters in several faces. + + Sans: found several other problems in the process + # Tamil + Four slots labelled 0BDA-D have glyphs, not in Unicode. also 0BE1 + I think they are misplaced; added 0010 to each of them + + # Devanagari + Slot labelled U+093B is not in Unicode--can't find glyph: deleted + likewise 094F (may have been meant to be 0954) + 0955, 0973-0976 + + 0954 should be a combining mark, but it appears on the wrong side of 0. + 0971 was just wrong--made into simple dot. + 0972 is also wrong--made my own Candra A. + + # Gujarati + Slots labelled 0AE4-5 are not in Unicode; seem not to belong at all. + Deleted. 2800 is a dup of 2790. Deleted + + Serif: phillipine_double u1736 was misplaced + + A bunch of the Math Alphanumeric symbols are empty in the standard, + because they're represented elsewhere. These should be deleted + First need to make style consistent with existing symbols. + + * FreeSerif.sfd: + + Applied patch from Daniel J + Remedies bug + FreeSerif: Missing glyphs with palatal hook + https://savannah.gnu.org/bugs/index.php?24298 + Adding several letters to Phoenetic Extensions range U+1D80-BF + + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd: + + Made four characters U+200C-F to be zero-width + Remedy to bug #23593: Mono 0-width chars: zero-width or space? + https://savannah.gnu.org/bugs/index.php?23593 + + * FreeSerif.sfd: + + Made Mahjong tiles to take up less space using references + Cleaned up several validation problems + +2008-09-20 Stevan_White + * tools/checkGlyphNumbers.py: + + included other Private Use Ranges + +2008-09-19 Stevan_White + * FreeSerif.sfd: + + Added several Hebrew Alphabetic Presentation Forms (some easy ones), to + make its coverage the same as Serif Bold. + + * FreeSerifBold.sfd: + + Re-encoded. + Deleted several glyphs in Hebrew Alphabetic Presentation Forms that + didn't correspond valid Unicode + + * FreeMonoBold.sfd, FreeSans.sfd, FreeSerifItalic.sfd: + + Ran script to find mis-numbered glyphs. Several were simply typos, + some offset by one. + + * FreeSansOblique.sfd: + + Numerous cases of glyphs in Private Use area incorrectly assigned + Unicode numbers and names. Gave all -1 for Unicode and named like + "slot.XXXX". + + * FreeSerif.sfd: + + Adapted Mahjong Tiles from George Douros' Unicode Symbols font. + + * FreeSerif.sfd: + + Added Domino Tiles. Domino outline is copied from George Douros' + Unicode Symbols, but the rest I preferred to do with references. + +2008-09-19 Stevan_White + * tools/ranges.py: + + corrected and simplified calculation of whether OS/2 bit is set. + Now works mostly perfectly, except for some high Unicode ranges... + + * tools/GenerateOpenType: + + Made to output old-style kerning tables for Windows + (FontForge complains though) + + * tools/GenerateTrueType: + + Made to hint before instructing: FontForge bases TT instructions on hints + although hints are not put into TrueType fonts. + + * tools/hex_range.py: + + cosmetic tweek + + * tools/isMonoMono.py: + + re-worked to take a list of files as input + + * tools/ranges.py: + + re-structured code and corrected a few ranges + +2008-09-18 Stevan_White + * FreeSerif.sfd: + + Adapted Mathematical Alphanumeric Symbols from George Douros' Unicode + Symbols font. + + * FreeMonoBoldOblique.sfd: + + This one got away from me--I don't know what I did. + Looks like some small contour edits. + + * FreeSansBoldOblique.sfd: + + Fixed one mis-numberd character in Latin Extended-B + + * FreeSerifBold.sfd, FreeSerifItalic.sfd: + + Fixed several mis-numbered characters. + + * FreeSansBold.sfd: + + SansBold: one Georgian letter with no name, one Zapf Dingbat was + unnumbered + ATT test shows a bunch of problems with Gurmukhi and 'blwf' table + indeed shows those letters at 0x10000+ + Sans names them like uni0A30_uni0A4D.blwf: they are in range + ECC6 to ED06 + + I meant to move this range into Private Use in last release, and + missed it. So now it is moved, into same range as Sans. + + Both Sans and SansBold in nukt table for Gurmukhi have duplicate + entries for uni0A15 uni0A3C. Deleted dups. + + * FreeMonoOblique.sfd: + + fixed a number of Unassigned Code Points in Greek Extended + + * FreeSansOblique.sfd: + + mis-numbered Combining Diacritics + + * FreeSansOblique.sfd: + + Several chars in Latin Extended hadn't been named. + One spurious letter in Letterlike Symbols + +2008-09-16 Stevan_White + * FreeMono.sfd, FreeSans.sfd, FreeSerif.sfd: + + Lots of additions: unless otherwise noted, they are from George Duros' + fonts Analecta, Music, and Unicode (haven't got final confirmation of + the eligibility of these glyphs, so this is just for testing.) + + Added some combining marks, fiddled a bit. In both Serif & Mono, tried + to get a key symbol characters to fit inside the key combining mark + + Serif + Got rid of ears on Upsilon + Added: + # Gothic + # Western & Byzantine Musical Symbols + + # Misc Symbols, Misc Technical Symbols (drew many myself) + # Supplemental Symbols and Arrows + + Mono + Added: + # lotsa Misc Technical Symbols + # OCR Symbols + # drew many Supplemental Symbols and Arrows, Misc Technical + + Sans + Added # Phoenecian + Made a few Letterlike Symbols; Made Re and Im to be sans-serif. + +2008-09-11 Stevan_White + * FreeSerif.sfd: + + Removed pointless entries from Latin kern table + + Tidied points in Sinhala + +2008-09-07 Stevan_White + * FreeSerif.sfd: + + Tidied up Tamil ligatures EEA8-EEAB to fix TT build warning + "MonotonicFindAlong: Never found our spline." + + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeSans.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, Makefile: + + + Added APL characters to FreeMono (why?...) + + Fixed several last-minute problems, including + + Serif: Tweeked GPOS mark table for Cyrillic + Sans: Added a GPOS table for Cyrillic (but several diacritics missing) + + Serif, Mono: tweeked some bugs in extensible brackets & integrals + + Serif: Vietnamese o circumflex: accent was a bit high. fixed. + + MonoBoldOblique OTF build + uni213b intersects self + + Generation of TT fonts complains about several things to stderr, + including: + + SerifBold: "There exists a 'fpgm' code that seems incompatible with FontForge's. Instructions generated will be of lower quality. If legacy hinting is to be scrapped, it is suggested to clear the `fpgm` and repeat autoinstructing. It will be then possible to append user's code to FontForge's 'fpgm', but due to possible future updates, it is extremely advised to use high numbers for user's functions." + Probably has been there since I first copied the TT instructions in. + Just repeated the copying process carefully, and the warning went away. + + Serif: "FindMatchingHVEdge fell into an impossible position" + fixed a bunch of point too close + + REMAINING PROBLEM in Serif TT build + "MonotonicFindAlong: Never found our spline." + fixed several bad TT matrices-- there are several more + fixed many "control points too close" no luck + +2008-09-03 Stevan_White + * FreeSans.sfd, FreeSansOblique.sfd: + + Added/corrected some Misc. Symbols by copying from Serif. + Note this is only a stopgap solution. Want real sans-serif symbols. + + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Added minimal Miscellaneous Symbols: card suites and some musical notes. + Note not happy with shapes...some I just drew. Sans isn't really sans. + + Fixed one APL symbol in Mono so it verified in OTF version + +2008-08-31 Stevan_White + * FreeMono.sfd: + + Built set of APL symbols. + +2008-08-30 Stevan_White + * FreeSans.sfd: + + Un-linked references in uni02B2 and uni02B5, because when validating the + TrueType version, FontForge gave an error "is drawn in wrong direction". + I suspect a bug in FontForge. Other similar glyphs make no errors. + + Fixed missing extrema in TrueType. + These were the last cases being reported by validate in all the faces. + + * FreeSerifItalic.sfd: + + fixed last missing extrema in TrueType + + * Makefile: + + restructured validation to look in a directory + + * FreeSans.sfd, FreeSansOblique.sfd, FreeSerif.sfd: + + Fixed missing extrema in TrueType versions + + * isMonoMono.py, validate.py: + + restructured validation to look in a directory + +2008-08-15 Stevan_White + * FreeSans.sfd: + + Same problem with uni0A83 as with bn_llikaar. Just made zero-width. + +2008-08-14 Stevan_White + * FreeSans.sfd, FreeSansOblique.sfd: + + Glyph bn_llikaar, U+09E3 BENGALI VOWEL SIGN VOCALIC LL, + has right bound positioned far into the negative. Causes a warning in + FontForge when opening OTF version. + Comparing with other fonts supporting Bengali, found no others that + do this. + Serif makes glyph width 0 (which sounds right according to Unicode) + and puts glyph wholly to left of 0. But, I haven't found this letter + in text anywhere. I wonder if it is really used in writing. + + * FreeSans.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifItalic.sfd: + + Further TrueType validation fixes. + Sans still has two glyps in wrong direction. + + * FreeSans.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Fixed more TrueType problems...all missing extrema in TTF validation + +2008-08-13 Stevan_White + * FreeSans.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + fixed all the TrueType validation problems of type "intersects itself" + and all but two of the "wrong directions", as well as a lot of + "missing extrema". But there remain hundreds of missing extrema in the + TrueType version. + Also, bn_llikaar in Sans and Oblique still has a problem in OTF version. + + * FreeMono.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd: + + Made .ttf files to validate. Other faces have many more problems still. + +2008-08-12 Stevan_White + * FreeMonoOblique.sfd, FreeSerif.sfd, FreeSerifItalic.sfd: + + Continuing to make OTF versions validate. + + * FreeMonoOblique.sfd: + lots of missing points at extrema + * FreeSerif.sfd: + 12 wrong directions, 1 missing extrema + * FreeSerifItalic.sfd: + many missing points at extrema, 1 self-intersecting + + What was wrong: in several oblique cases, an already-italic glyph was + made more italic, thereby fouling up extrema (although why it passed + validation in the SFD I don't know). Some glyphs were + overly-complicated with many near points. Cleaned up, rounded to int. + + Remaining problem: OTF FreeSansOblique FreeSans. one Bengali glyph in + each whose advance width and htmx don't match. + + Moral of story: validate the OTF and TTF versions too before a release. + + * FreeSansOblique.sfd: + + Reverse a mistake from last commit: somehow this file was converted to + quadratic, or something. + + * tools/GenerateTrueType: + + For TrueType, one puts in Instructions, not Hints. + This vastly improves look of TrueType fonts in Windows. + +2008-08-11 Stevan_White + * FreeMonoBoldOblique.sfd, FreeSans.sfd, FreeSansOblique.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd: + + Found that SFD files that validated produced OpenType files that don't. + These represent the easy fixes. Some were result of conversion to + quadratic; some shouldn't have validated in the SFD... + + * MonoBoldOblique: uni0250 missing pts at extrema [reference glyph rotated...] + * Sans: uni0AC4 wrong direction [simplified, rounded to int] + * SansOblique: uni01EA wrong direction [rounded to int] + * SerifBold: uni023f wrong direction [round to int] + * SerifBoldItalic: uni0245 missing pts at extrema [ungrouped ref, added extrema] + +2008-08-06 Stevan_White + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoOblique.sfd: + + Re-set font metrics, which were somehow making uneven vertical spacing. + +2008-06-22 Steve White + * FreeSerifBold.sfd, FreeSerifBoldItalic.sfd: + + Made to validate + + * ranges.py: + + Brought more into line with OpenType + Added some ranges + Fixed bug with ranges outside of font + + * CREDITS: + + 3 new ranges + + * FreeSerif.sfd, FreeSerifItalic.sfd: + + Cyrillic: tweeked accents for consistency, and for readability in small + sizes. + + * FreeSerif.sfd: + + Thanna range: tweeking + + Thaana range: Scaled up by about 15%, raised by 100EM, tightened + some of the diacritics to get inside 900 to -300 EM limits. + + * FreeSans.sfd: + + Added Old Persian and Ugaritic from MPH2BDamase font. + +2008-06-21 Steve White + * FreeSerif.sfd: + + Added Tai Le range adapted from MPH2BDamase font. + + * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd: + + Added some ancient Greek numerals from Tempora to high Unicode area, + (partly just to show it can now be done.) + + * FreeSerifItalic.sfd: + + Couple of tweeks putting glyphs above -300EM. + + * FreeSerif.sfd, FreeSerifItalic.sfd: + + Surgery to Thai letter 'tho than', u+0e10, to push it above -300 EM. + This makes Thai range completely between 900 and -300 EM. + + * FreeSans.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifItalic.sfd: + + Many auxilary characters (esp. for Malayalam, Bengla, and Tamil) + representing ligatures and alternative forms without their own Unicode, + were moved from + ranges above 0xFFFF (which ought to have been slots for other defined + Unicode ranges) into the Private Use area. + + In Serif, I segregated the scripts, in Sans it was hard to see where one + began and another ended, so I moved them en masse. + + Note several problems with wrongly-named characters: + I already re-named glyph570 and glyph582. + But there are others with names starting with A... + + * FreeSansBold.sfd, FreeSansOblique.sfd: + + Fixed (I hope the last) problem with scripts in lookups + Find Problems -> ATT (all selected) finds multiple issues, + + * FreeSansBold.sfd: + In addition to script 'guru', added 'gur2' to the scripts for these + lookups + 'nukt' Nukta forms in Gurmukhi + 'blwf' Below Base Forms in Gurmukhi + 'pstf' Post Base Forms in Gurmukhi + 'blws' Below Base Substitutions in Gurmukhi + 'abvs' Above Base Substitutions in Gurmukhi + 'psts' Post Base Substitutions in Gurmukhi + + * FreeSansOblique.sfd: + In addition to script 'beng', added 'bng2' to the scripts for the lookup + 'half' Half Forms in Bengali + + Moreover, the lookup + 'aalt' Access All Alternates in Latin + contains only Bengali letters. + Re-named as Bengali, made to work on beng, bng2 scripts + +2008-06-20 Steve White + * FreeSerif.sfd: + + Scaled Sinhala range. + Remedies bug #23656: Sinhala letters over-sized + + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Mostly messing with Greek Extended accents again. + re-positioned ypogegrammani on advice of Alexey Kryukov + Put prosgegrammani beneath main letters in Mono, to make narrower glyphs + Implemented more distinction between tonos and acute. + +2008-06-19 Steve White + * FreeMonoBoldOblique.sfd: + + Completed fit of Mono to 800 to -200 EM. + + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoOblique.sfd: + + Set Metrics to recommended values + + * FreeMonoOblique.sfd: + + Now Mono Oblique, as well as roman and Bold, are within 800 to -200 EM. + Just BoldOblique to go. + + * FreeMono.sfd, FreeMonoBold.sfd: + + More toward fitting to 800 to -200 EM. + Basically, reduced Georgian by 92%. + Also made an over-all offset, so Georgian is somehow centered (Bold...I + guess I already did this in roman). + Want to also do an emboldening to make stroke like rest of font, but + current FontForge has a nasty crash that loses data on this function. + + * FreeMono.sfd: + + In effort to make fit in 800 to -200 EM, + Scaled Georgian by 92%, centered on 600 wide box. + Next: Embolden a bit. + +2008-06-18 Steve White + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd: + + Toward making all glyphs lie between -200 and 800 EM. + Numerous small changes, especially raising descenders of some Hebrew + letters. + Georgian remains a problem + +2008-06-13 Steve White + * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Moved prosgegrammeni up to baseline, + (and then moved all references down to baseline) + + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Added Control Picture "blank" to all faces. + Switched U+0222-3 from TemporaLGCUni + +2008-06-11 Steve White + * FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + More fiddling with Greek Extended accents + + * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Tweeks to accents etc in Greek Extended and Cyrillic + +2008-06-10 Steve White + * FreeSerifBold.sfd, FreeSerifItalic.sfd: + + Fixed a few big horizontal spacing problems + + * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Implemented TemporaLCGUni glyphs in Cyrillic ranges. + Added a breve_cyrillic for the moustache breve mark. + +2008-06-08 Steve White + * FreeSerif.sfd: + + Replaced most of Cyrillic range with TemporaLGCUni. + Remodelled many of the derived Cyrillic characters after these. + Fiddled globally with spacing of small letters. + Unclear on diacritics 485-6, unhappy with breve. + + * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Started implementing TemporaLCGUni in Greek ranges. + + Replaced 3DC-3E1 from Tempora, because I thought they looked nicer and + more like the other existing FreeFont glyphs. + Replaced 3DA-B from Tempora, because they look more like Unicode + samples, and nicer. + Added 03f3-4, 03F7-F. + Prefer my own lunate epsilon. + Replaced Phi and Omega from Tempora. + These plainly fit the other FreeFont glyphs better than the origninals. + (How did this happen?) + + In bold, replaced U+03D7 + + Copied lbbar u+2114 + + Small italic greek--replaced most except phi, psi, omega + + Based on new information, broke the identification of oxia with Latin + acute. + +2008-06-07 Steve White + * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd: + + Efforts to control heights of characters + +2008-06-06 Steve White + * FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd: + + Made to validate + +2008-06-05 Steve White + * FreeSans.sfd: + + Fixed undefined character in kerning classes + +2008-06-04 Steve White + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd: + + tweeks and additions to General Punctuation + +2008-06-03 Steve White + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSansOblique.sfd: + + Completed/tweeked Number Forms + + * FreeMono.sfd, FreeSerif.sfd: + + Added some Miscellaneous Technical symbols + +2008-06-02 Steve White + * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd: + + Tweeks...mostly Letterlike + +2008-06-01 Steve White + * FreeMono.sfd, FreeSerif.sfd: + + Added Box Drawing characters to Serif. + Tweeked a glyph in Mono + + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Added several glyphs to Letterlike Characters + +2008-05-31 Steve White + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Validation pass + + SansOblique and SansBoldOblique had validation problem with BlueValues + Private Dictionary + Elements in BlueValues/OtherBlues array are disordered + Elements in BlueValues/OtherBlues array are too close + (Change BlueFuzz) + StemSnapV does not contain StdVW value. + So I ordered the array, and based on other slanted fonts, + removed StemSnapV. + + Note however, I still think the two top Blues lines are too close + But I don't even know what the second-to-top line is meant to do. + + * FreeSerif.sfd: + + Added to Block Elements, Geometric Shapes + Made to validate + +2008-05-29 Steve White + * FreeMono.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Looking at special symbols. + Drew several Miscellaneous Symbols in Mono and Serif + > Completed/corrected planetary symbols, added Dice, + some other easy ones + > Completed Dingbats in Serif (using URW Dingbats) + Added some Block Elements to Serif + +2008-05-26 Steve White + * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + More changes stemming from J. Poon's report. + +2008-05-25 Steve White + * FreeSerif.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Height surgery on SerifBoldItalic. + More fiddling with accents in others. + + * FreeSerifItalic.sfd: + + More height surgery. Only a few left in Benglai and Thai + + * FreeSerifBold.sfd: + + Re-applied surgery to make glyphs between 900 and -300EM + + *** Regression + Inadvertently un-linked all references in SerifBold in r1.83. + This reverses that error (but also un-does the surgery mentioned there) + + * FreeSerifBold.sfd, FreeSerifItalic.sfd: + + Applied surgery to make Latin letters go under 900EM. + One exception yet... + +2008-05-24 Steve White + * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Serif: much fiddling with accents in Latin ranges. + Re-thought some glyphs (there are still a few messy ones, especially + in bold) + Checked horizontal spacing...fixed a number of problems. + +2008-05-23 Steve White + * FreeSansBold.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd: + + Made Latin Extended-B coverage consistent across Serif; cleaned up some + glyphs + + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoOblique.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd: + + Filled more of General Punctuation in Sans and Serif + Made all agree on coverage of Latin Extended Additional + +2008-05-22 Steve White + * FreeSans.sfd, FreeSansBold.sfd, FreeSansOblique.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd: + + Added Latin Extended Additional to SansOblique. + Made Latin Extended Additional coverage consistent across Sans, B, I + Made Latin Extended-B coverage same in SerifBold. + + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeSansBold.sfd: + + Mono* made Latin-B coverage consistent across faces + + * FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd: + + Made set of Latin Extended-B consistent across Sans faces + + * FreeSans.sfd, FreeSansBold.sfd: + + More filling in General Punctuation + + * FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Another bunch of J. Poon's reports + also, filling in some Combining Diacriticals, Spacing Modifiers, and + General Punctuation in bold faces + +2008-05-21 Steve White + * FreeMono.sfd, FreeMonoBold.sfd, FreeSans.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Mucking about with mark tables in Thai (Serif) + Other faces: Making changes from J. Poon's report + +2008-05-20 Steve White + * CREDITS: + + Mark Williamson + Jacob Poon + + * Makefile: + + added tests target + +2008-05-18 Steve White + * ranges.py: + + Put table explanation back in + + Improved behaviour for high Unicode + + * FreeSans.sfd: + + Revision of kerning + + * FreeSerif.sfd: + + Made Latin kerning a little more reasonable: + reduced many excessive kerns (some had letters apparently + overlapping, which shouldn't happen) + made kerns increment by 5EM for ease of reading + got rid of kerns too small to be seen + + * FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSerifBold.sfd: + + Made to verify + +2008-05-13 Steve White + * FreeSerif.sfd: + + Made to validate + + * FreeSerif.sfd: + + Gurmukhi: filled range in Serif, taking glyphs from the original + Punjabi font by Hardip Singh Pannu + http://members.aol.com/hspannu/punjabi.html (file pb_win95.exe) + +2008-05-12 Steve White + * FreeSans.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd: + + Hebrew, basic. Some faces missing punctuation marks, added. + + * FreeMono.sfd, FreeSans.sfd: + + Armenian: Sans tried to make verticals and horizontals of more uniform + width both, finddled with punctuation + + * FreeMonoOblique.sfd: + + made to validate + + * FreeMonoBold.sfd: + + made to validate + + * FreeSans.sfd, FreeSansBold.sfd: + + Armenian in Sans: regularized letter spacing + + * FreeMonoOblique.sfd, FreeSans.sfd, FreeSansBold.sfd: + + Armenian: fill out ranges and clean up + SansBold especially had a lot of incorrect references. + Now all the ranges with Armenian at least share the same set of + characters. + + * FreeMono.sfd: + + Fixed glyph with wrong width. + +2008-05-11 Steve White + * FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerifItalic.sfd: + + 1) made to validate + 2) Mono: copied in Spacing Modifier Letters (glyphs not yet named) + 3) SerifItalic: Filled in General Punctuation + + * FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd: + + Made to validate, and pass all other FontForge tests. + Expedient: rounded everything to int + + * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Made to have the same Greek Symbols, + Made to validate + + * FreeSans.sfd, FreeSansBold.sfd: + + Made Greek Symbols as full as rest of Sans. Changed a name in Sans. + + * FreeMonoOblique.sfd: + + Made Greek as full as other faces + Made to validate + + * FreeSansBold.sfd: + + Deleted seven orphaned Arabic characters; looks like somebody started, + didn't get very far, putting Arabic in bold. + + Deleted orphaned Arabic glyph from Arabic Presentation forms-B + + * FreeSerifBold.sfd: + + Deleted the single Arabic character: it was clearly there by mistake. + + * FreeSansOblique.sfd: + + Made Greek Symbols as full as rest of Sans + + Tweeks to Armenian + + Comment from previous commit of FreeSans was meant for FreeSansOblique. + In FreeSans, only tweeked a few letters during putting more characters + in this face. + + Filled in Spacing Modifier Letters, increased General Punctuation. + + * FreeSans.sfd: + + Filled in Spacing Modifier Letters, increased General Punctuation + + * FreeMono.sfd: + + Made Armenian as full as other roman faces. + + Completed Spacing Modifier Letters + Added a couple of Greek Punctuation + + added more Spacing Modifier Letters + +2008-05-10 Steve White + * FreeSerif.sfd, FreeSerifItalic.sfd: + + Did same process of scaling and sizing for Thai in Sans as in Serif. + Added mark tables to Sans. Improvement, but there are questions... + + * FreeSans.sfd: + + Tidied some Gurmukhi glyphs, validated. + + Deleted ranges for Oriya, Kannada, on account of + 1) they only contained a subset of the consonant glyphs of the scripts, + few if any vowels, and had no ligature lookups as required + 2) Kannada was based on the Akurti fonts, which have copyright issues. + + See + bug #23225: Oriya range only partial + bug #23224: Kannada range only partial + + * FreeMonoBoldOblique.sfd: + + Made metrics like rest of Mono + +2008-05-09 Steve White + * ranges.py: + + More info on range intervals + + * FreeSerif.sfd: + + Deleted Telugu range. + It didn't represent a complete writing system for the language. + + See notes at https://savannah.gnu.org/bugs/index.php?23202 + Serif: Telugu range missing many characters; many wrong + + Got a copy of the original Tikkana font, + Copied in remaining consonants and vowels that I could find there. + I think one vowel 0C55 is missing according to unicode). + Strangely, the Telugu digits are alo missing. + In Tikkana, the default "checkmark" structural mark is missing from many + consonants, according to Unicode, but is a separate glyph. I put + the checkmark on. + This, and scaled up by 150% and cleaned up intersecting glyphs and + many unnecessary points. + +2008-05-08 Steve White + * FreeSerif.sfd: + + Filled out Telugu consonants. + Vowels still need to be done + +2008-05-07 Steve White + * FreeSerif.sfd: + + Operated on Latin glyphs with stacked accents to make them fit under + 900EM. + Scaled Telugu bu 150%. + +2008-05-06 Steve White + * FreeMono.sfd, FreeMonoBold.sfd, FreeSansBold.sfd, FreeSerif.sfd: + + Corrected further fontforge "find problems" + Added some math characters to FreeSerif + +2008-05-05 Steve White + * FreeSansBold.sfd: + + Made to validate, and fixed bad TT transformations + +2008-05-04 Steve White + * FreeMono.sfd, FreeSerif.sfd: + + Mainly TeX additions trying to satisfy Markus Kuhn's TeX-as-Unicode page + + * FreeMono.sfd: + + Adjusted heights of extensible brackets + + Fixed problems with extensible brackets, thanks to Markus Kuhn's page + http://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-demo.txt + + * ranges.py: + + fiddled with ranges, doc + + made some ranges more correct? + + fixed some bugs in ranges + better error reporting + + Got rid of Unicode 1.1 references + + made to use OpenType table + + * FreeMono.sfd, FreeSans.sfd, FreeSerif.sfd: + + made to validate + +2008-05-03 Steve White + * FreeMono.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Removed digits from Private Use Area. + See bug 23050. + + * FreeMono.sfd, FreeSans.sfd: + + Completed General Punctuation + + * FreeSans.sfd: + + Completed IPA Extensions + + * FreeMono.sfd, FreeSans.sfd, FreeSerif.sfd: + + More work on Superscripts and Subscripts, Spacing Modifiers. + Sans is now complete in both. + Added Pfennig to Sans and Mono. + + * ranges.py: + + Restructure text output + Rearrangement and cosmetic ...except I had broken it. now fixed + Seems to be in a useful form at this point. + More docs, date + + * FreeSerif.sfd: + + Added a hand-drawn old German Pfennig to Currency Symbols + + * FreeMono.sfd, FreeSans.sfd, FreeSerif.sfd, FreeSerifItalic.sfd: + + Further additions to General Punctuation, Super and Sub Scripts, + Spacing Modifiers, etc. + +2008-05-02 Steve White + * FreeSans.sfd: + + additions to Spacing Modifiers, IPA + + * FreeSerifItalic.sfd: + + Shortening stacked accents to maintain readability when clipped + +2008-05-01 Steve White + * FreeSans.sfd: + + Additions to Spacing Modifiers and changes to Combining Diacritics + + * FreeSerif.sfd: + + Made sure all the half rings in Combining Diacriticals and Spacing + Modifiers were really half rings (J. Poon had complained about this) + + Filled out General Punctuation + Some work on Spacing Modifiers + + Filled out Mathematical Operators + still needs lots of work + Made to validate + + Filled out Latin Extended B + Added some letters with curls to Latin Extended B + More fiddling with Latin Extended B accents + +2008-04-30 Steve White + * FreeSerif.sfd: + + Added Hanuno script, with characters based on those in + font MPH2BDamase, on request from the maintainer of that font, + http://packages.debian.org/sid/ttf-mph-2b-damase + + Glyphs are simple vector strokes. Could be a little more uniform. + + Added Buginese script "Lontara", with characters based on those in + font MPH2BDamase, on request from the maintainer of that font, + http://packages.debian.org/sid/ttf-mph-2b-damase + + Note the glyphs are pretty rough, clearly a digitization of handwriting. + I just cleaned them up, and corrected discrepancies with Unicode, + and compared with some pictorial samples of the script I could find. + +2008-04-29 Steve White + * ranges.py: + + Improved look a lot--still unhappy with some ranges + OS/2 seems sometimes bang-on, sometimes unrelated to anything (including + fontforge's OS/2 listing) + + * FreeSerif.sfd: + + Much fiddling with Tamil range. + First scaled to 78% (avoiding the references) + This gets it in the ballpark height-wise. [A bit taller than the Latin + letters, but the stroke is narrower, but then the glyphs are busier.] + Then had to re-align combined references, the trickiest being the + halants. + Checked with other fonts with Tamil text. + +2008-04-28 Steve White + * FreeSans.sfd, FreeSerif.sfd: + + Cleanup of control points in Arabic and Thaana + + * FreeSerif.sfd: + + Cleanup of missing extrema in Arabic and Thaana + + Many changes to Thai, trying to make the script fit between some lines, + so accents won't get clipped, etc. + Also, stroke weight was heavier than that of Latin. + + Scaled whole thing by 93%. + Shrank the tallest letters 0E42-4 to get them under 900EM. + Shaved off top of maiek. + Fiddled with positioning of all accents. + Made positioning tables for accents. + Note: unclear these are working correctly + + Fixed a bug having to do with character replacements for characters + named 'ng' and 'nj'; these names had been taken on by other characters. + + Made to validate + + Unicode positions of two Cyrillic Extended characters were switched. + Fiddled with a couple of Cyrillic combining diacritics + +2008-04-27 Steve White + * FreeSans.sfd: + + bugfix: a left harpoon mysteriously appeared to the left of letter p! + +2008-04-26 Steve White + * FreeMono.sfd: + + Made to validate + + * FreeSans.sfd: + + Made to validate + + Toward J. Poons report + Made 032B more like proper double-arches (and distinct fro 033C seagull) + Made 032b more like a seagull + + * FreeSans.sfd, FreeSansBold.sfd: + + Sans: fiddling with widths and terminators of math symbols, + toward J. Poon's report + R & B: removed u+2741 because it didn't match the Unicode description + + * FreeMono.sfd: + + Extensible parenthesis symbols weight/terminators + Toward bug # 23064: https://savannah.gnu.org/bugs/index.php?23064 + Rounded a bunch of terminators + +2008-04-22 Steve White + * FreeSerif.sfd: + + Small alignment problem in Greek Extended + + One more tweek to spacing in Cyrillic Extended + + Corrected spacing in Cyrillic Supplement + + Added Cyrillic Supplement letters for + Enets, Khanty, Chukchi, Itelmen, Mordvin, Kurdish, Aleut + + Added Cyrillic letters for Nivkh (completing Cyrillic range) + More tightening of accents in Latin Extended. + + * FreeSans.sfd: + + Fiddled with math--consequences of changing the "similar" operator + + More tightening of accents + + * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Adjustments to h and k with caron and cedilla in Latin A and B + + * FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd: + + FreeSerifBold: deleted 3 dotted Hebrew letters in Private/Corporate use + (E801-3). They weren't ligatures or in any other lookup, and they + weren't present in FreeSerif. + + * FreeSansBold: + Unlinked and deleted F6C3, which called itself commaaccent. + Made some new spacing and non-spacing accents to make up for it. + + * FreeSansBoldOblique: + Made references of many Latin Extended. + Also corrected several wrong ones. + + * Freeserif: + Re-named commaaccent + +2008-04-21 Steve White + * FreeMono.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSerif.sfd, FreeSerifBold.sfd: + + Deleted Hiragana and Katakana ranges, as discussed on bugs list. + Cleaned up some encoding issues, unnamed glyphs + + * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Roman: added 'sine' -- not beautiful, but I liked drawing it + All: Made special lookup for Dutch ligatures 'IJ' and 'ij' + + * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd: + + Roman: ffi etc Latin ligatures from 'liga' to 'dlig' (these weren't + really ligatures anyway, and only looked very bad when used. + Retain for condensed type. + Others: deleted Latin 'liga' table altogether + BoldOblique : added j to ij ligature + + Toward J. Poon's Report: + Except for issues of terminators not always vertical or horizontal, + and a few things that were too hard or I was unsure of. + +2008-04-20 Steve White + * FreeSerif.sfd: + + Futzing with accents in Latin Extended Additional and Latin Extended-B + + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd: + + Added primemod character, referenced by Greek number sign + + * FreeMono.sfd, FreeMonoOblique.sfd: + + Following J. Poon's report, disconnected NJ (01CA) + +2008-04-19 Steve White + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd: + + First pass throught J. Poon's bug list. + See bug reports for details. + + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd: + + Made underscore slanted in Oblique faces, made all to be width of + space character. + Towards J. Poon's report. + Disturbed that xterm and some other apps put small space between + characters when none was called for. + + * FreeMono.sfd, FreeMonoBold.sfd, FreeSans.sfd, FreeSansOblique.sfd: + + Corrections on Currency Symbols + + * FreeMono.sfd, FreeSans.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + More corrections, additions to Currency Symbols + + * FreeSans.sfd, FreeSerif.sfd: + + Filled out and corrected Currency Symbols + +2008-04-18 Steve White + * FreeSans.sfd, FreeSerif.sfd: + + Adjustments to Combining Marks for Symbols + Additions to range in Sans, and re-structured its marks table so that + "middle" can apply to any range + + * FreeSerif.sfd, FreeSerifItalic.sfd: + + Made reference between combining koronis and lenis of Greek Extended. + In Serif, re-worked combining marks lookup tables, added anchors in + Latin, moved so without marks they work in kedit (but now I'm doubting + kedit does a reasonable thing...what is a better application for + testing this?) + +2008-04-16 Steve White + * FreeSerifItalic.sfd: + + Adjusting of spacing and accents in Greek + + * FreeMono.sfd, FreeMonoOblique.sfd, FreeSans.sfd, FreeSansOblique.sfd, FreeSerif.sfd: + + Much futzing with Greek letter spacing and accents. + Added lenis to FreeMono. + + * FreeMono.sfd, FreeSerif.sfd: + + Adjusted spacing of dots of Greek dieresistonons in Serif + Whipped up something for Greek kappascript in Mono (could use revision) + + * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Raised dots on double-dotted Cyrillic i, to match that of i and j. + +2008-04-14 Steve White + * FreeMono.sfd: + + Corrected 27e6-7 "white bracket" + Note it is probably a FontForge bug these symbols aren't showing up. + FontForge thinks they are in Supplemental Arrows, but they should be + in Supplemental Math-A + + Named some Greek characters + + * FreeSans.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd: + + Spacing of some Cyrillic characters + +2008-04-13 Steve White + * FreeSerif.sfd: + + Some fiddling with accents + 'yogh' was too wide + + * FreeSansBold.sfd, FreeSansOblique.sfd: + + Character spacing was chaos--tried to improve. BoldOblique also needs + it. + + * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd: + + Completed the fix of bug #12798, Greek glyphs with accents to side + Much mucking with accents here, and fixed a few things that were just + wrong. + +2008-04-12 Steve White + * FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd: + + Made Mono curly quotes "bent" + + * FreeMono.sfd: + + More fiddling with Greek accents + Made quotes "bent" + + * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Adjustments on Greek diaresistonos etc. + Adjustments in Serif on combining marks for symbols + + * FreeSerif.sfd: + + More additions to Combining marks for Symbols + + Additions to Combining marks for Symbols -- now mostly full. + Lots of adjustments to middle anchor point in Latin to make big circle + (nearly) encircle preceding latter + +2008-04-11 Steve White + * FreeMono.sfd: + + Bugfix: + Had indroduce a glyph of width other than 600, making kterminal not + recognize it as a monospace font. + +2008-04-10 Steve White + * FreeSans.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + More messing with accents. + Further to bug #12798, Greek glyphs with accents to side + Much messing with glyphs in Greek Extended range + +2008-04-09 Steve White + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSerif.sfd: + + Revisited Latin-1 and Latin-A accents. + Glyph B7 was called "periodcentered", but Unicode callse it Mid Dot, + and the description doesn't refer to the period. I made it like the + dot accent. throughout, and referred L-dot to it. + + Also double-checked "commaaccent" characters (some in Unicode called + cedilla, but the Unicode example shows a comma...mystery) + + Also the funny IPA upside-down f often had two bars, incorrectly. + + To do: go through rest of Serif, and Sans + + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd: + + Completed re-structuring of stacked Latin accents in Mono. + Also: lots of associated adjustments of Greek Extended accents. + (Trying to at least center extremely wide characters on their box) + Repaired some victems of "find overlaps" sweeps + Worked on glyphs with apostrope/comma parts + Corrected a few wrong glyphs. + + Trying out a "bent quotes" solution to making primes distinct from + quotes. + +2008-04-08 Steve White + * FreeMonoOblique.sfd: + + Toward reducing overall height + Did similar process as for Mono, fixing a few errors along the way. + Also the Greek Extended range was very messed up vertical and + horizontally. + Horizonal spacing of the heavily accented Greek is a real problem in + Mono... + To do: + revisit "commaaccent" characters in all faces: do some have + edillas? + some Hebrew glyphs are a little low + Georgian generally is way out of bounds + +2008-04-07 Steve White + * INSTALL: + + Various updates and corrections, tweeked formatting + + * FreeMonoBold.sfd: + + Tweeking of accents + +2008-04-06 Steve White + * FreeMono.sfd, FreeMonoBold.sfd: + + Re-worked accents in FreeMonoBold.sfd to make Latin ranges lie between + 800 and -200 EM, as with FreeMono. + + * FreeMono.sfd: + + Latin Extended ranges: Implemented new policy of shortening the letters + of the characters with the highest-stacked accents. + + At this point all the Latin glyphs lie betweeen 800 and -200 EM. + + Also checked for readability of all the Latin extended letters in xterm. + (Issue: it chops letters outside their bounding boxes; many accents had + been a bit outside. Made sure that if they were chopped, they were at + least still recognizable.) + +2008-04-05 Steve White + * FreeMono.sfd: + + Following exchange about Mono on freefont-bugs with Joe Wells, who + > doesn't like the curly quote marks + > wants combining diacritics to work + > wants tight line spacing + + Trying to reduce font height: + > exclamdown was below -200 + > Throughout Extended Greek, ypogegrammeni were too low. Shortened + glyph, and raised all references. + > Lots of messing with Latin Extended ranges to make glyphs mostly + fit into 800 height. Mostly succeeded. A couple will get chopped. + > Messed with "commaaccent" glyphs, which were very low + > Cyrillic 04B1 had a tail that was incorrectly low + > Much mucking with Georgian range. Moved up by 95 (read that Georgian + is written as though centered between two horizontal lines, rather than + as sitting on a baseline) There are still a few very high glyphs. + + FontForge U+0122 called Gcommaaccent, glyph looks like that, but + Unicode says it's Gcedilla. Made the ones called cedilla by Unicode + to be cedillas + + Note bug in Unicode: standard for 0122, 0123, 0136, 0137, 013B, 013C, + 0145, 0146, 0156, 0157 all talk about cedilla, say to make it with + cedilla, but example shows comma. + + By the way: + > Got rid of commaaccent and dotlessj in Corporate Use + > Replaced shadedark, with little squares now not overlapping. + > Corrected IPA symbol 'ts' 02A6, added 02a8, 02a9, 02aa, 02ab, 02ac, + 02ad, 02ae, 02af + + (so many changes...the CVS server was down...) + + * FreeSerif.sfd: + + Re-named arabic and hebrew characters + Big adjustment to comma-accents. Mostly effects Greek Extended. + Made such accents to be like comma, rather than like Russian apostrophe + (and de-referenced that symbol) + +2008-04-04 Steve White + * FreeMono.sfd, FreeSerif.sfd: + + Raised dot on superscript i (2071) -- more distinct at small sizes + + * FreeMono.sfd: + + added two IPA symbols + +2008-04-02 Steve White + * FreeSerif.sfd: + + fixed a few more control points too close + + Fixed names of languages in ligature table for latn "w/i". + This fixes a crash when FontForge opened the ttf table + + Motivated by bug crashing FontForge when opening ttf file, + started cleanup of useless control points. Not finished. + Got partway through Sinhala + +2008-03-31 Steve White + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoOblique.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Fixed various "Find Problems", including glyphs with mixed-up names, + and bad TT matrices. (lots more bad TT matrices remain) + + * FreeSerif.sfd: + + Re-named a bunch of Cyrillic letters + + * FreeSerif.sfd: + + Put above mark on Cyrillic i and double-dot i for Slavonic number forms + +2008-03-30 Steve White + * FreeSans.sfd: + + Tightened spacing on glyphs of last commit + + * FreeSans.sfd, FreeSerif.sfd: + + Concerning bug #16120, Include upper case Wynn and upper case Yogh + Adapted Herman Miller's Thyromanes letters 01F7 021C 021D for Serif + Drew my own versions for Sans. + + * FreeSerif.sfd: + + Added 04F6,7 + + * FreeSerif.sfd, FreeSerifItalic.sfd: + + Made more Cyrillic diacritics really combine. + Made a mark lookup just for Cyrillic diacritics, + Marked most of the unadorned Cyrillic alphabet. + + Still not clear on correct shapes for some of the marks. + + * FreeMono.sfd, FreeMonoOblique.sfd: + + Tweeks to accents + +2008-03-29 Steve White + * FreeSans.sfd, FreeSerifItalic.sfd: + + Small adjustments in Cyrillic + + * FreeSerif.sfd: + + Corrected small palochka + Made Cyrillic combining hundred-thousands and millions really combine + Named some combining diacriticals + + * FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd: + + Mostly adjusted horizontal spacing of mono oblique faces + + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + More cleanup of Cyrillic ranges + + Completely re-did horizontal spacing of SerifItalic and SerifBoldItalic. + See bug #17912, poor kerning in Cyrillic oblique... + https://savannah.gnu.org/bugs/index.php?17912 + It looked like chaos to me. + Only so much can be done: the font is flawed. + But I think the changes make text readable in these faces. + + There were dozens of incorrect glyphs in higher-numbered characters. + I deleted all those I found. No glyph is better than a wrong glyph. + + Futzt with accents, shooting for consistency and readability. + + A maintenance thing: making correct references (acyrillic vs a, + although they may be the same glyph) I made a lot of headway, but + it isn't finished. + + Likewise, a large fraction of these are compound characters, which can + be made with references, resulting in easier maintenance, reduced + likelihood of errors, and smaller files. I replaced many. + + * FreeSerif.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Cyrillic italic + Added italic, bolditalic + 0493, 04a7, 04AD + because their form clearly varies in italic. But was just guessing... + + * FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Cyrillic italic + + Added italic, bolditalic + 0493, 04AD + because their form clearly varies in italic. + But was just guessing as to exact form. + + * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Overhaul of Cyrillic + + Italic, BoldItalic + added small yat for bug #22588 (note Times New Roman doesn't use + alternate form in Italic) + + All forms of Serif have big problems in Cyrillic. + + The ugliest is in roman. The letters, even of the Russian alphabet, are + of inconsistent height (awfully, small 0438 (ii) 0446 (tse)) + and they vary from the height of Latin + and they vary from the height of italic and bold. + They are a mish-mash of letters from several fonts, of similar (but not + quite identical) weight, and similar, (but not quite identical) size. + + I think the best solution would be to identify the face that best + matches Latin, and fill the range with that. I think this is possible + because the rarer letters seem to be better: the common letters are the + ones that are wrong. + + For now, I just increased the sized of 0438 and 0446, and 048a, 048b, + also 0459 (lje) 045A (nje) 0464 (dje) + + Other issues + +2008-03-27 Steve White + * FreeSerifBoldItalic.sfd: + + Moving all Greek capitals with accent so they don't cover previous + letter. Remedies bug #12798 + + * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Various tweeks to accented Latin letters. + Connected O-ogonek correctly + + * FreeSerifItalic.sfd: + + Accents of numerous accented Latin letters got shifted in a previous + commit. This fixes it. + + * FreeSerif.sfd: + + Adjusted combining tack left and right (0318-0319) to be above -300 EM. + + * FreeSans.sfd, FreeSerif.sfd: + + Added some "middle" marks for positioning of diacritics + + * FreeSans.sfd: + + Copied 4 enclosing combining diacriticals from Serif 20DD - 20E0 + + * FreeSerif.sfd: + + Adjusted and added some enclosing diacritics 20DD - 20E0 + In response to Debian bug #472566 + ttf-freefont: U+20DD COMBINING ENCOLSING CIRCLE doesn't combine + http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=472566 + +2008-03-26 Steve White + * FreeSerif.sfd: + + Lowered a few over-high Latin accents + + * FreeSansBold: + + Devangari--only digits 1 and 2, and nothing else. Deleted + + * FreeMonoBold, FreeMonoOblique, + FreeSerifBold, FreeSeriftalic, FreeSerifBoldItalic, + FreeSansOblique, FreeSansBold, FreeSansBoldOblique: + + Got rid of dotlessj, comma in Corporate Use + Single Substitution lookup, ccmp table + Made proper dotlessj, re-linked j-circumflex + + Note: + FreeSansBold has a commaaccent in Corporate Use, used by several other + characers. Haven't done anything about this. + +2008-03-25 Steve White + * FreeSerif.sfd: + + Added/corrected glyphs for yeh hamza in Arabic, + Added init and medi lookups for yeh hamza. + +2008-03-24 Steve White + * FreeSerif.sfd: + + Added isolated and final forms for + 0629 teh marbuta + 0624 waw hamza + 0626 yeh hamza + 0649 alef maksura + A previous commit had added lookups that referred to these, + + More fiddling with super/subscripts + + * Makefile, Makefile, GenerateTrueType: + + Scripts and Make targets to generate OpenType fonts and zip file + + * maintenance.txt: + + Added gnupload and info about tagging + +2008-03-23 Steve White + * FreeSerif.sfd: + + Last of Find Problems -> ATT + 'mark' Latin lookup: afii10026 is in 'cyrl', also afii10074 + Upper and lower Cyrillic i. Just removed mark from both letters. + + 'half' Bengali lookup Khanda_Ta is in 'bng2'. Added bng2 to lookup + Added TtTable etc + + Clean-up of Points too Close through to end of font. + This episode completes the paths/points clean-up of Serif. + But note: many ranges, esp. Ethiopic, Japanese, and Indic, have way + too many points, resulting in lumpiness. + + At this point, FontForge can convert splines to quadratic, auto-hint, + and auto-instrument without segfault. + + * Makefile, sfd/Makefile, tools/GenerateTrueType: + + Alterations to build process: added a Makefile, and made to work + on my system. Now auto-hints before generating TrueType. + +2008-03-22 Steve White + * sfd/FreeSans.sfd: + Lots of additions of math characters. Should complete for + LaTeX 2e, except for extensible brackets. + +2008-03-21 Steve White + * *.sfd: + + Regularized stacking of accents in Latin Extended Additional + Changed name of 00B5 from 'mu' to 'micro', + 2206 from 'Delta' to 'Delta.math', + 0308 from 'diaerisis' to 'diaerisiscomb' + + * FreeMono.sfd: + + additions to IPA + + * FreeMonoBoldOblique.sfd: + + Moved dotlessj from Corporate Use, + Deleted commaaccent there + Fixed mis-named glyphs tcommaaccent, Tcommaaccent + Changed name of 030A from 'dieresis' to 'ringcomb' + + * FreeSans.sfd: + + Added some arrows, and a couple of blackboard bold characters + + Several characters in U+F600 Corporate Use range + dotlessj, onefitted, commaaccent + + dotlessj referred to by: jcircumflex, uni01F0: + renamed it to uFFFF, re-linked others by hand + + commaaccent + http://diacritics.typo.cz/index.php?id=9 + should be u+0326 but wasn't linked to anything + + * FreeSansBold.sfd: + + U+0617 etc: read glyphs "4GWglm". It should be Arabic. Deleted + + * FreeSansBold.sfd, FreeSansOblique.sfd, FreeSansBoldOblique.sfd: + + Removed bogus glyphs for 200C 200D, ZWJ and ZWNJ + + * FreeSerif.sfd: + + Split lookup for ligatures in latin into two classes; + ff, ffl, fl which are appropriate for all languages, + and fi, ffi, which are not appropriate in Turkish (due to distinction + between short and long i) + Needs to be done for other faces. + + Filled set of extensible brackets in Miscellaneous Technical + + Think IPA is now complete. + +2008-03-18 Steve White + * FreeSans.sfd: + + clean-up of all path issues and points too close + +2008-03-18 Steve White + * FreeSans.sfd: + + Something was causing crashing effects in Windows. Cleanup of + problems eventually made it go away. Now works well. + + Cleaned up many "points too close" + + Cleaned up all ATT problems, of which there were many and various. + + # Incorrectly labelled zero-width joiner used in a ligature + + # Incorrect substitution of dotlessi and dotlessj with i and j was + somehow connected with FontForge crash. Attemts to remove the + substitution would damage a 'ccmp' table; subsequent changes would + result in FontForge crashing on save, and truncating the sfd file. + Surgically removed with vi. + + # A couple of Indic lookups had incorrect script DFLT; one had 'latn'. + + # Don't understand why there are scripts named + dev2 bng2 grj2 gur2 when there are already deva beng gurj guru + But anyway, lots of 'vatu' 'pres' 'haln' and 'liga' lookups contained + characters in the '2' scripts but were lablled only for the 'non-2' + ones. Added the '2' scripts to all these lookups. Suspect a mistake. + + Note: several of these problems are repeated in other Sans faces. + +2008-03-16 Steve White + * FreeMono.sfd: + + Cleanup of many path problems "points too close" + + Strove to make accents Latin Extended range legible at small sizes + + Named some unnamed characters; removed a duplicate + + At this point, all fonts are passing FontForge Validate. + +2008-03-15 Steve White + * FreeSerif.sfd: + + CJK punctuation: made some of the very high glyphs smaller (under 900EM) + The brackets in Sans were very ugly, and not even Sans-serif. + Serif: added extensible square brackets, diddled with integral + corrected direction of some added glyphs + + Several bugs having to do with missing glyphs in Tamil range. + Also a buggy ligature in Devangari. + + Shortened names of many lookup tables + + Futzt with some combining diacriticals + + Added extensible square brackets. + + * FreeSans.sfd: + + Changed names of a bunch of glyphs with invalid + TrueType names, in range 0x1025f+ (not real Unicode). + Took pains to retain information contained in the names. + Wonder if these glyphs have ever been of any use. + + CJK Punctuation: brackets were hand-drawn and very ugly. Improved. + + * *.sfd: + + Set OS/2 Metrics back to absolute 900/300. Offsets are not + interpreted uniformly. + + Cleanup of many path problems up to extrema and self-intersecting + + Ordered PS Blue values. + +2008-03-14 Steve White + * FreeSerif.sfd: + + Got rid of mixed references and contours + Cleanup of many path problems "points too close" + + Started clean-up to satisfy FontForge Validate + + Changed names of three glyphs in the + Tamil ligatures range...all clearly bugs. + + * FreeSans.sfd: + + Added slanted-hyphen + + * *.sfd: + + Unified OS/2 Metrics + Added Grid Fit + +2008-03-13 Steve White + * FreeSans.sfd: + + Rearranged PS BluesValues so they were in increasing order, + Made all 20 in width. + +2008-03-12 Steve White + * FreeSans.sfd, FreeMono.sfd: + + Added TrueType hinting tables. + Fixed glyphs that didn't convert well to quadratics + Got rid of mixed contours and refs + + * FreeSerifBold.sfd: + + Cleanup of path problems + +2008-03-11 Steve White + * FreeMonoOblique.sfd: + + Cleanup of path problems + +2008-03-09 Steve White + * FreeSerif.sfd: + + Corrected L-dot + Further cleanup of path/ref problems + + Found several ligatures that referred to a missing glyph "ZWJ". + Took this to mean the "zero width joiner" u+200D + + * *.sfd: + + Changed OS/2 metrics to be absolute 900/300 + + * FreeSerifItalic.sfd: + + Added Greek lunate epsilon + + * FreeMono.sfd: + + Many additions in math range + Reduced size of binary union, intersection, vee, wedge + Corrected empty set + Corrected logical 'assert' relations, etc. 22a2-22af + Efforts to make Math glyphs legible at small point sizes + + * FreeSans.sfd: + + Added Greek lunate epsilon and rho symbol + Unstacked more stacked diacriticals + + Further cleanup of path/reference problems + +2008-03-08 Steve White + * FreeSans.sfd, FreeSerif.sfd: + + Added some "n-ary" Math operators + + * FreeSerif.sfd: + + Further clean-up of path problems...up to Ethiopic + > Started adding and correcting Math operators for LaTeX 2e + > Corrected n-ary union, intersection, and spikes to be larger + than the binary operators + > Made (many of) the operators based on + - = to use those + symbols directly (by reference or copying). + > Added lunate epsilon + > Corrected empty set + > Tightened up spacing of some other technical characters + > Worked on some more math operators involving = + > triangle + > Several arrows + > Supplemental Arrows-A + + * FreeSans.sfd: + + Clean-up of font paths + Open self-intersecting outermost-clockwise missing-extrema + also flipped references (unlinked) + + Added Greek lunate epsilon and rho symbol + +2008-03-06 Steve White + * sfd/FreeSerif.sfd: Shortened and thickened the combining hook mark, + U+0309, to make more like Unicode samples. + Also see (bug #22499) un-stacked incorrectly stacked accents + +2008-03-05 Steve White + * sfd/FreeSerif.sfd: vertical lines: combining diacritical marks + corrected 0300 030D 0329 0348 (were rendered as straight apostrophes) + Spacing Modifier letters added 02C8 02CC + 02B9 02Ba prime and double-prime + Fixed positioning U+1EC8, 9, I with hook above + +2008-03-03 Steve White + * sfd/FreeSerif.sfd: TT strings updates. + updated Copyright to 2008 + Added Vendor URL as the Savannah freefont site + * sfd/FreeMono.sfd: A standard pangram as the Sample Text for Russian + It reads: In the thickets of the South once there was a citrus + ...--yes, but a fake specimen! + * sfd/*.sfd: Set the OS/2 Sup/Sub settings, which by default looked + like random trash. + +2008-03-02 Steve White + * sfd/FreeSerif.sfd: began cleanup of problems given by FontForge + "Find Problems" feature. (bug #22454) + +2008-03-01 Steve White + * sfd/FreeSerif.sfd: made Arabic work for text display (bug #22329) + Added required contextual replacement tables, + Made a few missing characters, + * sfd/*.sfd: Removde all back layers from glyphs that had them. + +2008-02-27 Steve White + * sfd/FreeSans.sfd: filled in Combining Diacriticals + * sfd/FreeSerif.sfd: shifted whole Arabic range down by 200EM. + +2008-02-26 Steve White + * sfd/FreeSerif.sfd: enabled DPOS table. + +2008-02-24 Steve White + * sfd/*.sfd: Much fiddling with the "combining diacriticals" + range 0300-036F. Made to align with medium-size lowercase + preceding character if not using DPOS table. + +2008-02-23 Steve White + * sfd/FreeSerif.sfd, FreeSans.sfd, FreeMono.sfd: (bug #21784) Filled + in set of HTML 4 Character Entities. + + * sfd/FreeSerif.sfd, FreeSans.sfd, FreeMono.sfd: (bug #18413) + undertie too low -- went on to tidy other similar characters in + Combining Diacriticals range. + +2008-02-21 Steve White + * sfd/*.sfd: Moved capital Greek letters with tonos so tonos doesn't + cover preceding letter (bug #12798) + + * sfd/FreeSerif.sfd, FreeSans.sfd: (bug #13370) made extended + integrals to line up. + +2008-02-20 Steve White + * sfd/*.sfd: started removing glyphs with back layers (printing bug) + * sfd/*.sfd: adjusted vulgar fractions (bug #17756) + * sfd/*.sfd: adjusted numerical superscripts (bug #20278) + +2008-02-18 Steve White + * sfd/FreeSerif.sfd: Offset Hiragana and Katakana ranges (bug #22326) + * sfd/FreeSerif.sfd: U+30FB, KATAKANA MIDDLE DOT to be full width + (bug #18326) + + * sfd/FreeSerif.sfd: Re-promoted + ff ffi ffl fi fl + as standard ligatures in Latin. + +2008-02-17 Steve White + * sfd/*.sfd: committed to FontForge Spline Font Database (SFD) 2 + format. + +2008-02-10 Steve White + * sfd/*.sfd: brought into line with Debian ttf-freefont + Deleted a couple of patches, and applied those applied to Debian. + +2006-09-20 Primoz Peterlin + + * INSTALL: added installation procedure for MacOS X, courtesy + Philipp Kempgen. + +2006-05-04 Primoz Peterlin + + * sfd/FreeMono.sfd: deleted Russian sample text, which did not + conform to UTF-7. + +2006-04-15 Primoz Peterlin + + * sfd/FreeSerif.sfd: corrected U+10D3. + + * sfd/FreeSans.sfd: ligature U+FB06 (LATIN SMALL LIGATURE S T) + changed from mandatory ("liga") to discretionary ("dlig") (bug + #16253). + + * sfd/FreeMono.sfd: deleted incomplete glyph U+FB06 (LATIN SMALL + LIGATURE S T); deleted U+FB00, U+FB01, U+FB02, U+FB05 as + ligatures (bug #16253). + + * sfd/FreeMonoOblique.sfd, sfd/FreeMonoBoldOblique.sfd: added + U+FB00; deleted U+FB01, U+FB02 as ligatures (bug #16253). + + * sfd/FreeMonoBold.sfd: deleted U+FB00, U+FB01, U+FB02 as + ligatures (bug #16253). + + * sfd/FreeMono.sfd, sfd/FreeMonoOblique.sfd, sfd/FreeMonoBold.sfd, + sfd/FreeMonoBoldOblique.sfd, sfd/FreeSans.sfd, + sfd/FreeSansOblique.sfd, sfd/FreeSansBold.sfd, + sfd/FreeSansBoldOblique.sfd, sfd/FreeSerif.sfd, + sfd/FreeSerifItalic.sfd, sfd/FreeSerifBold.sfd, + sfd/FreeSerifBoldItalic.sfd: added Georgian letters, donated by + Gia Shervashidze + +2006-02-22 Primoz Peterlin + + * sfd/FreeMono.sfd, sfd/FreeMonoOblique.sfd: ligature U+FB4F + changed from mandatory ("liga") to discretionary ("dlig"). This is + respons to Bug#349657: [bug #15792] Freefont Alef and Lamed + combine + +2006-02-21 Primoz Peterlin + + * sfd/FreeSerifBold.sfd, sfd/FreeSans.sfd, + sfd/FreeSansOblique.sfd, sfd/FreeSansBoldOblique.sfd, + sfd/FreeSansBold.sfd: ligature U+FB4F changed from mandatory + ("liga") to discretionary ("dlig"). This is respons to Bug#349657: + [bug #15792] Freefont Alef and Lamed combine + + * sfd/FreeSerif.sfd: corrected bug#275759: [bug #15790] FreeSerif + glyphs for U+2198/U+2199 were reversed. + +2006-02-15 Denis Jacquerye + * sfd/FreeMono.sfd, sfd/FreeMonoOblique.sfd, + sfd/FreeMonoBoldOblique.sfd, sfd/FreeMonoBold.sfd: removed ij + and IJ ligatures. + +2006-02-10 Primoz Peterlin + + * sfd/FreeSerif.sfd: added small Georgian letters (mkhedruli), + donated by Gia Shervashidze + + * AUTHORS: Added Gia Shervashidze + + * CREDITS: Added Gia Shervashidze + +2006-01-26 Primoz Peterlin + + * notes/maintenance.txt: Added information on the Makefile now + used; username for FTP login is anonymous. + + * sfd/FreeSansBold.sfd: added U+0569, U+0571, U+0579, U+057B, + U+0586. Armenian small letters completed. + + * sfd/FreeSerif.sfd: added U+0297, U+02AD-02AF. IPA Extensions + section is now complete. Copied a dozen of glyphs from Omega IPA + to Phonetic Extension section. + +2006-01-25 Primoz Peterlin + + * sfd/FreeSans.sfd: added U+01A, U+01A3, U+01A6, U+01B2, U+01BA, + U+01BB, U+01BE, U+01BF. + + * sfd/FreeSans.sfd: aligned small Armenian letters to x-height in + response to bug #15480. Armenian in Free Sans needs a major + cleanup. + +2006-01-24 Primoz Peterlin + + * sfd/FreeSerif.sfd: changed U+0452, U+045B. Cleanup: U+0460, + U+0461, U+04Bc, U+04BD, U+0508. + + * sfd/FreeSansOblique.sfd: replaced accented chars in Latin-1 and + Latin Extended-B sections with references, where possible. + + * sfd/FreeSerif.sfd: changed U+0285. + +2006-01-23 Primoz Peterlin + + * sfd/FreeSans.sfd: added U+0195, U+01AA, U+0297, U+03D7, + U+03F0. Several flipped references replaced by outlines. + + * sfd/FreeSansOblique.sfd: Latin Extended-B section more or less + brought in sync with FreeSans. + + * sfd/FreeMonoBoldOblique.sfd: added glyphs from FreeMonoBold in + the Latin Extended-B and IPA Extensions sections. + + * sfd/FreeSerifBold.sfd: Added U+0224, U+0225. Changed U+01B7, + U+01B8, U+04E0, U+0452, U+045B. Replaced accented characters in + the Cyrillic region with references. + +2006-01-21 Primoz Peterlin + + * sfd/FreeSans.sfd: added U+0255, U+0264, U+0277, U+0286, + U+029D. Changed U+0261. Deleted spurious glyphs in the control + code area. + +2006-01-19 Primoz Peterlin + + * sfd/FreeSans.sfd: replaced Hardip Pannu Singh's Gurmukhi with + AnmolUni by Kulbir Singh Thind. + +2006-01-17 Primoz Peterlin + + * sfd/FreeSansBold.sfd: Added U+018D, U+0194, U+01B5, U+01B6, + U+01BE, U+0262, U+02A2. + + * sfd/FreeSansBold.sfd: Changed U+0261 in order to distinguish it + from U+0067. Changed U+0251, U+0252. + + * sfd/FreeSerifBold.sfd: Small changes in the Cyrillic + section. Added U+0183, U+018C. + + * sfd/FreeSans.sfd: Added U+2045, U+2046. + + * sfd/FreeSansBold.sfd: Filled in the Gurkmukhi part with the + AnmolUni-Bold by Kulbir Singh Thind. Also some minor corrections + in the Cyrillic part. + + * CREDITS: Added Kulbir Singh Thind. + + * AUTHORS: Added Kulbir Singh Thind. + +2006-01-14 Primoz Peterlin + + * sfd/FreeSerif.sfd: Thomas Ridgeway's Tamil characters replaced + by the ones released by the Samyak font project. + + * CREDITS: Added Pravin Satpute, Bageshri Salvi, Rahul Bhalerao + and Sandeep Shedmake + + * AUTHORS: Added Pravin Satpute, Bageshri Salvi, Rahul Bhalerao + and Sandeep Shedmake + +2006-01-08 Primoz Peterlin + + * sfd/FreeSansBold.sfd, sfd/FreeMonoBoldOblique.sfd: minor changes. + +2006-01-05 Denis Jacquerye + + * sfd/FreeMono.sfd, sfd/FreeMonoOblique.sfd, sfd/FreeMonoBold.sfd, + sfd/FreeMonoBoldOblique.sfd, sfd/FreeSans.sfd, + sfd/FreeSansOblique.sfd, sfd/FreeSansBold.sfd, + sfd/FreeSansBoldOblique.sfd, sfd/FreeSerif.sfd, + sfd/FreeSerifItalic.sfd, sfd/FreeSerifBold.sfd, + sfd/FreeSerifBoldItalic.sfd: added cedi sign U+20B5, Ghanaian + currency + +2005-12-29 Primoz Peterlin + + * sfd/FreeSans.sfd: minor cleanup in the Gujarati part. + +2005-12-22 Primoz Peterlin + + * sfd/FreeSans.sfd: Devanagari and Gujarati parts cleared; once + again merged with Gargi 1.9 and Padmaa 0.6, this time correctly so + that the anchor points survived the merger. + +2005-12-16 Primoz Peterlin + + * sfd/FreeSans.sfd: added U+0577. + +2005-12-15 Primoz Peterlin + + * sfd/FreeSans.sfd: added U+0559, U+055F, U+2024. + + * sfd/FreeSansBold.sfd: added U+056E, U+0573. + +2005-12-14 Primoz Peterlin + + * sfd/FreeSans.sfd: Merged with Gargi 1.9 and Padmaa 0.6, + courtesy Monika Shah and Sonali Sonania from C-DAC, Mumbai. + + * CREDITS: Added Monika Shah and Sonali Sonania. + + * AUTHORS: Added Monika Shah and Sonali Sonania. + +2005-12-13 Primoz Peterlin + + * sfd/FreeSans.sfd - Removed Sinhala glyphs. + + * sfd/FreeSerif.sfd - Added Sinhala glyphs, formerly in FreeSans. + +2005-12-09 Primoz Peterlin + + * sfd/FreeSerif.sfd: added U+20AF, U+211E. Changed U+20AC (EURO + SIGN). + + * tools/freefont-ttf.spec: Added specification file for building + RPM package, courtesy Rok Papez. + + * sfd/FreeSerifBold.sfd: added more glyphs from Txfonts to the + Arrows and Mathematical Symbols ranges. + + * sfd/FreeSerifBoldItalic.sfd: added U+03F5 from Txfonts. + +2005-12-08 Primoz Peterlin + + * sfd/FreeSans.sfd: added U+0567, U+056A, U+056C, U+0582. + + * sfd/FreeSerifBold.sfd: copied Box Drawing range from FreeSans. + + * sfd/FreeSerifBold.sfd: added glyphs from Txfonts to the Arrows + and Mathematical Symbols ranges. + + * sfd/FreeSerif.sfd: added U+2259-225A, U+22BA, U+2308-230B, + U+2322-2323. Cyrillic composite characters replaced with + references. + +2005-12-07 Primoz Peterlin + + * sfd/FreeSerifBold.sfd: added U+025A, U+025D, U+026B, U+029B, + U+02AE, U+02AF, U+02DE. + + * sfd/FreeSerifBold.sfd: updated Hebrew part with Drugulin font + from the Culmus project. + + * sfd/FreeSerif.sfd: added U+207A-207C, U+208A-208C, U+2215-2216. + + * sfd/FreeSans.sfd: added U+2320 TOP HALF INTEGRAL, U+23AE + INTEGRAL EXTENSION, U+2321 BOTTOM HALF INTEGRAL (bug #13370). + +2005-12-07 Primoz Peterlin + + * sfd/FreeSerifBold.sfd: added U+0294-0296, U+02A1-02A2. Started + adding "below" anchors. Performed hinting on characters that were + not hinted "en masse". + +2005-12-06 Primoz Peterlin + + * sfd/FreeSans.sfd: fixed some more metrics problems in the + Extended Greek area; performed hinting on characters that were not + hinted "en masse". + + * Makefile: clean also signature files. + + * sfd/FreeMonoBoldOblique.sfd, sfd/FreeMonoBold.sfd: cosmetic + changes; cleaning background of referenced composed characters. + +2005-12-05 Panayotis Katsaloulis + + * sfd/FreeMono.sfd, sfd/FreeMonoOblique.sfd, sfd/FreeMonoBold.sfd, + sfd/FreeMonoBoldOblique.sfd, sfd/FreeSans.sfd, + sfd/FreeSansOblique.sfd, sfd/FreeSansBold.sfd, + sfd/FreeSansBoldOblique.sfd, sfd/FreeSerif.sfd, + sfd/FreeSerifItalic.sfd, sfd/FreeSerifBold.sfd, + sfd/FreeSerifBoldItalic.sfd: Some changes to the greek glyphs, + mostly having to do with "tonos" (accent) + +2005-12-05 Primoz Peterlin + + * sfd/FreeSans.sfd: minor cosmetic changes. + + * sfd/FreeSans.sfd: adjusted widths of characters in the Extended + Greek range; accents are not any more considerably overhanging on + the left side. Added U+1EDA-1EE3, U+1EE8-1EF1. + + * sfd/FreeSans.sfd: continued working on Extended Greek range; + metrics still not finished. + +2005-12-03 Primoz Peterlin + + * sfd/FreeSans.sfd: fixed combined Greek accents (bug + #12800). Width of characters still need to be adjusted as in + FreeSerif. + + * sfd/FreeSerif.sfd: fixed positions of Greek accents (bug #12798). + + * CREDITS: Added Panayotis Katsaloulis. + + * AUTHORS: Added Panayotis Katsaloulis. + + * Makefile: minor changes; now creating also a tarfile with sfds. + +2005-12-01 Primoz Peterlin + + * sfd/FreeSerifItalic.sfd: added U+0183, U+018C, U+01C0, U+01C1, + U+01C3, U+01E0, U+01E1, U+01F8, U+01F9. + + * Makefile: created a Makefile to assist building. + + * README: an update. + + * COPYING: added GNU General Public License, version 2. + + * tools/GenerateTrueType: wrote a FontForge script for conversion + to TrueType. + + * sfd/FreeSerif.sfd: merged with SolaimanLipi Bangla OpenType font + from www.ekushey.org, courtesy Solaiman Karim. + + * sfd/FreeSerifItalic.sfd: merged with SolaimanLipi Bangla + OpenType font from www.ekushey.org, slanted by 15.5 degrees. + + * sfd/FreeSans.sfd: merged with Rupali Bangla OpenType font from + www.ekushey.org + + * sfd/FreeSansOblique.sfd: merged with Rupali Bangla OpenType font from + www.ekushey.org, slanted by 12 degrees. + + * CREDITS: added Solaiman Karim + + * AUTHORS: added Solaiman Karim + +2005-11-30 Primoz Peterlin + + * sfd/FreeSerif.sfd: merged with the Rachana Normal. + + * AUTHORS: added K.H. Hussain and R. Chitrajan + + * CREDITS: added K.H. Hussain and R. Chitrajan + +2005-11-23 Primoz Peterlin + + * sfd/FreeSans.sfd - cleaned some background images. + + * sfd/FreeSans.sfd - added U+01A0-01A1, U+01AF-01B0, U+026E, + U+028F, U+0291, U+02A3-02A5, U+031B. Modified U+0198. + +2005-11-22 Primoz Peterlin + + * sfd/FreeSans.sfd - added U+2504-250B. + + * sfd/FreeSans.sfd - added U+2591-25A1, U+25A3-25A5, U+25AA, U+25AC. + + * sfd/FreeSans.sfd, sfd/FreeSansBold.sfd - added U+0263. + +2005-11-21 Primoz Peterlin + + * sfd/FreeMono.sfd - corrected positions of some Greek diacritics + on page 0x1F. + + * sfd/FreeMonoOblique.sfd - working on bringing it in sync with + FreeMono.sfd. + + * sfd/FreeSerifBoldItalic.sfd - applied the sequence suggested by + Werner Lemberg for reducing redundant points. Added a couple of + glyphs in the IPA Extensions region. + + * sfd/FreeSansBold.sfd - added U+0574, U+0576. Removed overlaps. + +2005-11-20 Primoz Peterlin + + * sfd/FreeSerif.sfd - added U+02AA-02AC, U+02B0-02B2. + +2005-11-19 Primoz Peterlin + + * sfd/FreeSans.sfd - added U+01B7-01B9, U+0196, U+019A, U+01C3, + U+0224-0225, U+025E, U+029A, U+2422. Changed U+0184-0185, U+0192, + U+01B4, U+0282, U+0284. + +2005-11-18 Primoz Peterlin + + * sfd/FreeSerif.sfd - added U+02EE, U+207F. + + * sfd/FreeSans.sfd - started Box Drawing area. + +2005-11-17 Primoz Peterlin + + * sfd/FreeSerifBold.sfd - added glyphs from the Omega project to + Latin Extended-B, IPA Extensions and Greek ranges. + + * sfd/FreeSerifBoldItalic.sfd - added glyphs from the Omega + project to Latin Extended-B, IPA Extensions and Greek ranges. + + * sfd/FreeSerifItalic.sfd - added glyphs from the Omega + project to Latin Extended-B, IPA Extensions and Greek ranges. + + * sfd/FreeSerifItalic.sfd - added U+018B, U+025C, U+0265, U+026F, + U+0279, U+0287, U+028C-028E, U+029E. + + * sfd/FreeSerifBoldItalic.sfd - added U+1EDA-1EE3, U+1EE8-1EF1, + U+2190-219B, U+219E-21A8, U+21B9-21BA, U+21C4-21CA, U+21E4-21E5, + U+2669-266F. MES-1 compliant. + + * sfd/FreeMonoOblique.sfd, sfd/FreeMonoBold.sfd, + sfd/FreeMonoBoldOblique.sfd, sfd/FreeSansOblique.sfd, + sfd/FreeSansBold.sfd, sfd/FreeSansBoldOblique.sfd, + sfd/FreeSerifItalic.sfd, sfd/FreeSerifBold.sfd, + sfd/FreeSerifBoldItalic.sfd - added U+FFFD. + + * sfd/FreeSerif.sfd - removed overlaps in Latin Extended-B and IPA + Extensions ranges. + +2005-11-16 Primoz Peterlin + + * sfd/FreeSerifItalic.sfd - applied the sequence suggested by + Werner Lemberg for reducing redundant points. + + * sfd/papers/eurotex2003/freefont.tex, + sfd/papers/eurotex2003/freefont.bib - Revised version, sent back + by Karl Berry on 20050110, that should match the one published in + TUGboat. + + * sfd/FreeSerifItalic.sfd - started added accent anchors. Added a + handful of Greek letters from Omega font collection. + + * sfd/FreeSerif.sfd - added a handful of letters in the Latin + Extended-B and IPA Extension ranges from the Omega font collection. + +2005-11-16 Denis Jacquerye + + * sfd/FreeSerif.sfd - moved U+0263 to U+0264; added U+0263 + + * sfd/FreeSerifItalic.sfd - fixe U+01EE; added U+01B7-U+01B9 + +2005-11-16 Primoz Peterlin + + * sfd/FreeSans.sfd - Made small Greek letters the same height as + Latin and Cyrillic ones and replaced them with references, where + applicable. + + * sfd/FreeSerif.sfd - replaced Greek letters with references, + where applicable. Added U+03D7, U+03F0-03F2. + + * sfd/FreeSerif.sfd - added U+0255, U+025A, U+025D, U+025F, + U+0262-0263, U+026B-026C, U+0274, U+0276-0277, U+028F, U+0291, + U+029D. + + * sfd/FreeMonoOblique.sfd - applied the sequence suggested by + Werner Lemberg for reducing redundant points. Added U+F6BE. + + * sfd/FreeSansOblique.sfd - applied the sequence suggested by + Werner Lemberg for reducing redundant points. + + * sfd/FreeSans.sfd - changed U+01A5. + +2005-11-16 Primoz Peterlin + + * sfd/FreeSans.sfd - applied the sequence suggested by Werner + Lemberg for reducing redundant points. Replaced accented glyphs in + the Latin-1 and Latin Extended-A areas with references. Made + capital Greek letters the same height as Latin and Cyrillic ones + and replaced them with references, where applicable. + +2005-11-15 Denis Jacquerye + + * sfd/FreeSans.sfd, sfd/FreeSansBold.sfd, + sfd/FreeSansBoldOblique.sfd, sfd/FreeSansOblique.sfd - fixed + U+026A, it was a dotlessi and therefore like U+0069 when + accented. + +2005-11-15 Primoz Peterlin + + * sfd/FreeMonoBold.sfd - corrected Greek tonos (slanted instead of + a vertical line). + + * sfd/FreeMonoBoldOblique.sfd - applied the sequence suggested by + Werner Lemberg for reducing redundant points. Replaced accented + glyphs in the Latin-1 and Latin Extended-A areas with references. + +2005-11-14 Primoz Peterlin + + * sfd/FreeMono.sfd, sfd/FreeMonoOblique.sfd, sfd/FreeMonoBold.sfd, + sfd/FreeMonoBoldOblique.sfd, sfd/FreeSans.sfd, + sfd/FreeSansOblique.sfd, sfd/FreeSansBold.sfd, + sfd/FreeSansBoldOblique.sfd, sfd/FreeSerif.sfd, + sfd/FreeSerifItalic.sfd, sfd/FreeSerifBold.sfd, + sfd/FreeSerifBoldItalic.sfd - Added 2005 in copyright info. + + * sfd/FreeSansBoldOblique.sfd - applied the sequence suggested by + Werner Lemberg for reducing redundant points. Replaced accented + glyphs in the Latin-1 area with references. + + * sfd/FreeSansBoldOblique.sfd - added U+0180, U+0184, U+0185, + U+0195, U+01A0-01A2, U+01AF-01B0, U+025E, U+026E, U+0292, + U+0294-0296, U+029A, U+02A1, U+2126-2127, U+2190-219B, + U+219E-21A8, U+21C4-21CA, U+2669-266F. MES-1 compliant. + + * sfd/FreeMono.sfd - Replaced accented glyphs in the Greek and + Cyrillic areas with references. + + * sfd/FreeMonoBold.sfd - applied the sequence suggested by Werner + Lemberg for reducing redundant points. Replaced accented glyphs in + the Latin-1 and Latin Extended-A areas with references. + +2005-11-14 Primoz Peterlin + + * sfd/FreeSerif.sfd - applied the sequence suggested by Werner + Lemberg for reducing redundant points. + + * sfd/FreeSansBold.sfd - added U+219A, U+219B, U+2669-266F. + + * sfd/FreeSerifBold.sfd - added U+2669-266F. + +2005-11-12 Primoz Peterlin + + * sfd/FreeSansBold.sfd - added U+0180, U+0181, U+0183, U+0187, + U+0188, U+018A, U+018C, U+018D, U+0193, U+019C, U+01A0, U+01A1, + U+01AC, U+01AF, U+01B0, U+025C, U+0260, U+026E, U+0277, U+0281, + U+0284. + +2005-11-11 Primoz Peterlin + + * sfd/FreeSansBold.sfd - added U+195, U+1A6, U+025E, U+026E, + U+029A, U+0313, U+0314, U+0342, U+0344, U+0345. Started adding + accent anchors. + + * sfd/FreeMono.sfd - applied the sequence for reducing redundant + points, suggested by Werner Lemberg. + + * sfd/FreeMono.sfd - corrected Greek letters (using tonos instead + of a vertical line). Added U+026E, U+F6BE. Accented characters in + Latin 1, Latin Extended A and partly Latin Extended B replaced by + references. + + * sfd/FreeSerifBold.sfd - applied the sequence for reducing + redundant points, suggested by Werner Lemberg. Added U+01A5, + U+02A0, U+2190-219B, U+219E-21A8, U+21B8, U+21B9, U+21C4-21CA, + U+21E4, U+21E5. + +2005-11-10 Primoz Peterlin + + * sfd/FreeSansOblique - changed U+0192, U+01A5; added U+01C0-01C3. + + * sfd/FreeSansBold.sfd - replaced glyphs with references in the + Cyrillic area. Removed U+04A8, U+04A9. Added U+04C5, U+04C6, + U+04C9, U+04CA, U+04CD, U+04CE, U+0535, U+053F, U+0546, U+0565, + U+0584, U+0587, U+0589. + +2005-11-10 Denis Jacquerye + + * sfd/FreeSans.sfd - added U+028A-U+028B + + * sfd/FreeSansOblique - added U+028A-U+028B, U+0276, + U+0292, U+0294-U+0296, U+0298-U+0299 and U+029B; fixed some + other glyphs + +2005-11-10 Primoz Peterlin + + * sfd/FreeSerif.sfd - added U+01A6. Simplified outlines in the + ASCII range. + + * sfd/FreeSansBold.sfd - added U+00A0, U+00AD, U+0531, U+2126, + U+2190-2199, U+219E-21A8, U+21C4-21CA. + + * sfd/FreeSansBold.sfd - applied the sequence for reducing + redundant points, suggested by Werner Lemberg. Added automatically + constructed accented characters in page 0x1E. + +2005-11-09 Primoz Peterlin + + * sfd/FreeSerif.sfd - added U+0183, U+018C. + + * sfd/FreeSans.sfd - added U+1EA2, U+1EA3, U+1EA8, U+1EA9, U+1EB2, + U+1EB3, U+1EBA, U+1EBB, U+1EC2, U+1EC3, U+1EC8, U+1EC9, U+1ECE, + U+1ECF, U+1ED4, U+1ED5, U+1EE6, U+1EE7, U+1EF6, U+1EF7, U+220A, + U+220B, U+220D, U+2272, U+2273, U+2282, U+2283. + + * sfd/FreeSerifItalic.sfd - changed U+03D5. + + * sfd/FreeSerifBoldItalic.sfd - changed U+03C6; added U+2070, + U+2075-2079, U+207F, U+2080, U+2085-2089, U+2155-217F. + + * sfd/FreeSerif.sfd - added U+0184, U+0185, U+018D, U+0195, + U+0197, U+019A, U+019B, U+01A0, U+01A1, U+01AC, U+01B5, U+01B6, + U+01C0, U+01C1, U+01C3, U+01F6, U+0294-0296, U+1E9A, U+1EDA-1EE3, + U+1EE8-1EF1. + +2005-11-07 Primoz Peterlin + + * sfd/FreeSansBold.sfd - added U+0562, U+056D. U+0575. + + * sfd/FreeMono.sfd - added U+0589. + +2005-11-06 Primoz Peterlin + + * sfd/FreeSans.sfd - added U+0278, U+03D5, U+2248. Corrected + U+2071, U+222E, U+2242, U+2243 in response to bug reports + http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=276118 + http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=276120 + + * sfd/FreeMono.sfd - added U+2227, U+2228, U+2262. Corrected + U+2299-229D in response to bug report + http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=276121 + + * sfd/FreeMonoBold.sfd - added U+2010, U+2012 in response to bug + report http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=289032 + Swapped U+03C6 (Greek small letter phi) and U+03D5 (Greek phi + symbol) in order to conform to Unicode standard. Simplified glyph + shapes in ASCII range. Started adding "above" and "below" anchors. + +2005-11-05 Primoz Peterlin + + * sfd/FreeSerif.sfd - accented letters in Latin Extended-A + replaced by references wherever possible. + + * sfd/FreeSerif.sfd - added U+0180, U+0181, U+0187, U+0188, + U+018A, U+0193, U+019C, U+01A4, U+01A5, U+01A7, U+01A8, U+01AF, + U+01B0, U+026E, U+0270, U+0278, U+0280, U+0281, U+028B, U+0299, + U+029C, U+029F. + +2005-11-03 Primoz Peterlin + + * sfd/FreeSansBold.sfd - added U+0180, U+0184, U+0185, U+0192, + U+019B, U+01A0-01A2, U+01AF, U+01B0, U+01EE, U+01EF, U+0292, + U+0294-0296, U+02A1, U+0532, U+054C, U+057C, U+222B. Changed + U+014B, U+01A5, U+01B4, U+03BB. + + * sfd/FreeSans.sfd - added U+04C5, U+04C6, U+04C9, U+04CA, U+04D, + U+04CE. + + * sfd/FreeSansBold.sfd - cleaner Arabic outlines. Added U+01E4, + U+01E5. + +2005-11-02 Primoz Peterlin + + * sfd/FreeSansBold.sfd - started Armenian; added U+0538, U+0542, + U+0544, U+0548, U+054D, U+054F, U+0550, U+0553, U+0555, U+0561, + U+0563, U+0564, U+0566, U+0568 U+056B, U+056F, U+0570, U+0572, + U+0578, U+057A, U+057D-057F, U+0580, U+0581, U+0583, U+0585. + + * sfd/FreeMono.sfd - swapped U+03C6 (Greek small letter phi) and + U+03D5 (Greek phi symbol) in order to conform to Unicode standard. + Added U+04C5, U+04C6, U+04C9, U+04CA, U+04D, U+04CE. + +2005-11-01 Primoz Peterlin + + * sfd/FreeSansBold.sfd - modified U+019C. + + * sfd/FreeSansBoldOblique.sfd - added U+00A0, U+00AD, U+019C, + U+01B7, U+01B8, U+0275, U+0278, U+0298, U+2012, U+2015, + U+2070-207F, U+2080-208E, U+2153-217F, U+2213, U+2215. + +2005-10-31 Primoz Peterlin + + * sfd/FreeSerif.sfd - added U+0199, U+01AB, U+0265, U+0282, + U+0288, U+028C-028E, U+0290, U+029E, U+02A0. + +2005-10-28 Primoz Peterlin + + * sfd/FreeSerifBold.sfd - added U+019E, U+01AB, U+01AD, U+01B1, + U+0256, U+025F, U+0265, U+0269, U+026F, U+0270, U+0279-027F, + U+0282, U+0287, U+0288, U+028C-028E, U+0290. + + * sfd/FreeSerifBold.sfd - added U+2070, U+2075-2079, U+2080, + U+2085-2089, U+2153-215E, U+2113-2115, U+2119. + + * sfd/FreeSerifBold.sfd - added U+0199, U+019B, U+01B8, U+01B9, + U+01BE, U+01C0, U+0262, U+0274, U+0278, U+0280, U+028F, U+0298, + U+0299, U+029C, U+029E, U+029F, U+2012, U+2015, U+2016, U+2129, + U+2217. + +2005-10-27 Primoz Peterlin + + * sfd/FreeSans.sfd - added U+018D, U+0194, U+019B, U+019C, U+01B5, + U+01B6, U+0295, U+0296, U+029B, U+02A2, U+0472, U+0473, U+2114, + U+2119. + + * sfd/FreeSerifItalic.sfd - minor cleanup in the superscript range + (U+2070-2079). + + * sfd/FreeSansBold.sfd - added subscripts and superscripts + (U+2070-208F), completed fractions (U+2152-215F) and Roman + numerals (U+2160-217F). + + * sfd/FreeSerifBold.sfd - added U+018B, U+018E, U+018F, U+0191, + U+019D, U+01A7, U+01A8, U+01AE, U+0253, U+0266, U+0267, U+026A, + U+0271-0273, U+0283, U+0285. + +2005-10-26 Primoz Peterlin + + * sfd/FreeSans.sfd - added "above" anchors to selected Cyrillic + characters. Added U+0294, U+02A1. + + * sfd/FreeMono.sfd - added U+2011, U+2012, U+203B, U+204A, U+2071, + U+2129, U+2232, U+2233. Changed and/or corrected U+2106, U+211E, + U+2126, U+2127, U+2153-215F, U+2202. + + * sfd/FreeMono.sfd - a try to imitate Denis' work on adding + anchors by adding "above" anchor to a couple of basic Latin + characters. + + * sfd/FreeSansBold.sfd - added U+0278, U+0298. Cleaned up outlines + of most Greek letters. + + * sfd/FreeSansBold.sfd - Added U+2010-2012, U+2015, U+2032, + U+203C, U+2047-2049. + + * sfd/FreeSans.sfd - Added U+01C0-01C2, U+0276, U+0292, + U+0298. Changed U+0251, U+0294, U+02A1. + +2005-10-25 Primoz Peterlin + + * sfd/FreeSerifItalic.sfd - added U+00A0, U+00AD, U+2010-2012, + U+2015, U+2126, U+2127, U+2153-215E, U+2160-217F, U+2190-2193, + U+2669-266F. FreeSerifItalic is now MES-1 compliant. + + * sfd/FreeSerif.sfd - added U+0191, U+019D, U+01AE, U+027E, + U+027F, U+0283, U+0285. + + * sfd/FreeSerif.sfd - added U+019E, U+01AD, U+01B8, U+01B9, + U+0253, U+0256, U+0257, U+025C, U+0260, U+0266, U+0267, U+0269, + U+026D, U+0271-0273, U+0279-027D. + + * sfd/FreeSerifBoldItalic.sfd - added U+00A0, U+00AD, U+2010-2012, + U+2015, U+2032-2034, U+203C, U+2047-204A, U+2074, U+2081-2084, + U+2126, U+2153, U+2154, U+215F, U+2215. Corrected positions of + diacritics on U+0200-0217. + + * sfd/FreeSansOblique.sfd, sfd/FreeSans.sfd, sfd/FreeSansBold.sfd, + sfd/FreeSansBoldOblique.sfd, sfd/FreeMonoBoldOblique.sfd, + sfd/FreeMonoBold.sfd, sfd/FreeSerifItalic.sfd, + sfd/FreeSerifBold.sfd sfd/FreeSerifBoldItalic.sfd - brought in + sync with Valek Filipov's urw-fonts-1.0.7pre41. + + * sfd/FreeSansOblique.sfd - added U+00A0, U+2011-2012, U+2015, + U+2070, U+2071, U+2074-2079, U+2080-2089, U+2126, U+2153-215F, + U+2190-2195, U+2215, U+266A. FreeSansOblique is now MES-1 + compliant. + +2005-10-24 Denis Jacquerye + + * sfd/FreeSans.sfd, sfd/FreeSansBold.sfd, + sfd/FreeSansOblique.sfd, sfd/FreeSansBoldOblique.sfd - added + ccmp for i and j to be substituted with dotless i or j when + followed by above diacritic + +2005-10-24 Primoz Peterlin + + * sfd/FreeSans.sfd - added U+2011, U+2012, U+2015. FreeSans is now + MES-1 conformant. + +2005-10-23 Denis Jacquerye + + * sfd/FreeSans.sfd - added above, below, abovemk and belowmk + anchors for diacritics placement to many Basic Latin characters, + some Latin Extented A and B, and some IPA characters; fixed a + couple of precomposed characters to have diacritics at the same + height as similar characters. + +2005-10-21 Primoz Peterlin + + * sfd/FreeSerif.sfd - added U+02B9, U+02BA, U+02CD, U+2017, + U+2036, U+2037, U+203C, U+203E, U+2047-204A. + +2005-10-20 Primoz Peterlin + + * sfd/FreeSerifBold.sfd - added U+0182, U+0189, U+0192, U+019F, + U+01A9, U+01B7, U+01C4-01CC, U+01E0-1E2, U+01F0-01F3, U+F6BE. + Corrected position of diacritics on U+0200-0217. + + * sfd/FreeSerif.sfd - added U+00A0, U+00AD, U+0182, U+0189, + U+018B, U+018E, U+018F, U+0192, U+019F, U+01A9, U+01B1, U+01B7, + U+01DD, U+2010-2013, U+2015. FreeSerif is now MES-1 conformant. + +2005-10-19 Denis Jacquerye + + * sfd/FreeSerif.sfd - added U+0268, U+026A, U+0289, U+0292; and + anchor "above" to more base glyphs. + + * sfd/FreeSerifBold.sfd, sfd/FreeSerifItalic.sfd, + sfd/FreeSerifBoldItalic.sfd - added U+0250-0252, U+0258-0259, + U+0261, U+0268, U+026A, U+0279, U+0289 + + * sfd/FreeSerifBold.sfd - added anchor "above" to marks + U+0300-0314, and to base glyphs (vowels). + +2005-10-18 Denis Jacquerye + + * sfd/FreeSerif.sfd - added anchor "above" to marks U+0300-0314, + and bases vowel of the U+0041-007A range, U+00E6, U+0186, U+0190, + U+0254 and U+025B; fixed Latin-1 Supplement block accented glyphs + to use references. + +2005-10-17 Primoz Peterlin + + * sfd/FreeSansBold.sfd - added U+01B7, U+01B8, U+0275. + +2005-10-16 Denis Jacquerye + * sfd/FreeSans.sfd, sfd/FreeSansOblique.sfd - added some Latin + Extended-B African letters: U+0181, U+018A, U+0197-0198, U+01A4, + U+01AC, U+01B1, U+01B3-01B4; + + * sfd/FreeSansBold.sfd, sfd/FreeSansBoldOblique.sfd - added Latin + Extended-B U+0187, 018E-018F, U+0191, U+0193, U+0197-0199, + U+019D-019F, U+01AB-01AE; correcting width of non-space + Combining Diacrtical Marks; added more glyphs to IPA Extensions + to match non Bold + + * sfd/FreeSansBoldOblique.sfd - added many accented glyphs to + Latin Extended-B + +2005-10-15 Denis Jacquerye + * sfd/FreeSans.sfd, sfd/FreeSansOblique.sfd - added IPA Extensions + U+0262,U+0274,U+0280-0281, U+0299, U+029F, and Spacing Modifier + Letters U+02C9-02CB; fixed U+0287,029E height to baseline; added + stroke to U+0268 + + * sfd/FreeSansOblique.sfd - fixed skew on U+027F + + * sfd/FreeSansBold.sfd, sfd/FreeSansBoldOblique.sfd - added to Latin + Extended-B U+01A7-01A8, IPA Extensions U+0251-0253, U+0256-0257, + U+0261, U+0265-026A, U+026F-0273, U+0289, U+028C-028E + + * sfd/FreeSansBoldOblique.sfd - added to Latin extended-B U+0189, + U+01A8, U+01B1, U+0283, U+02C9 and Spacing Modifiers U+02C9-02CB + +2005-10-14 Primoz Peterlin + + * sfd/FreeSansBold.sfd - Added a couple of composite glyphs, + mostly in the IPA and Latin Extended B ranges. + +2005-10-13 Denis Jacquerye + + * FreeSans.sfd - removed overlap and simplified U+0187, 0191, + 0193, 01A5, 01AE, 0260, 0271, 0272, 0273, 027B; fixed diacritics + placement on U+0200-0217; fixed glyph for U+0283 to correct esh + without stroke; added U+025F and fixed U+025F from it; fixed + height of glyph at U+0285; arranged U+027E,027F to make more + distinguishable from U+0072. + + * FreeSansOblique.sfd - added the corrected or new glyphs from + FreeSans; diacritics on U+200-0217 will need height readjustements. + + * FreeSansBold.sfd, FreeSansBoldOblique.sfd - added U+0186, 0190, + 0250, 0254, 0258, 0259, 025B, 025C + +2005-10-13 Primoz Peterlin + + * sfd/FreeSerif.sfd - Minor changes: U+22A2, U+22A3, U+22A6, U+23AE. + Added U+0250, U+0251, U+0258, U+0259, U+0275. + + * sfd/FreeSerifItalic.sfd - Added glyphs U+222B-U+222F, U+2320, + U+2321. Fixed diacritics on U+0200-U+0217. + +2005-10-12 Denis Jacquerye + + * sfd/FreeSerif.sfd - Corrected diacritics position on + U+01D5-01D9,01DB,01EA-01ED,0200-0217 and U+022A. + + * sfd/FreeSerif.sfd, sfd/FreeSerifBold.sfd, sfd/FreeSerifItalic.sfd, + sfd/FreeSerifBoldItalic.sfd - added U+0186,0190,0254 and U+025B. + +2005-10-11 Primoz Peterlin + + * sfd/FreeSerif.sfd - Fixed bug #13399 (glyphs for U+0360 and + U+0361 were swapped). + + * sfd/FreeSerif.sfd - Attempt to correct bug #13370: INTEGRAL + EXTENSION does not align with TOP/BOTTOM HALF INTEGRAL; added + glyph U+23AE. + +2005-05-16 Primoz Peterlin + + * sfd/FreeMono.sfd - Corrected shapes for Cross of Lorraine and + Cross of Jerusalem. + +2005-04-07 Primoz Peterlin + + * sfd/FreeSansBold.sfd - Added some combining accents, just to + test the a version of FontForge. + +2003-12-05 Primoz Peterlin + + * sfd/FreeMono.sfd - Some composite Latin characters rebuilt, as + they had accents 600 points to the left due to changes on October + 2. Some other minor changes in the mathematics area. + +2003-10-08 Primoz Peterlin + + * sfd/FreeMonoOblique.sfd, sfd/FreeSerifBoldItalic.sfd, + FreeSerifItalic.sfd - applied Josef Segur's corrections from + Oct. 5. + +2003-10-02 Primoz Peterlin + + * sfd/FreeSerif.sfd - Abbas Izad's contributed Arabic/Farsi + characters added. + + * sfd/FreeMono.sfd, sfd/FreeMonoOblique.sfd, sfd/FreeMonoBold.sfd, + sfd/FreeMonoBoldOblique.sfd, sfd/FreeSans.sfd, + sfd/FreeSansOblique.sfd, sfd/FreeSansBold.sfd, + sfd/FreeSansBoldOblique.sfd, sfd/FreeSerif.sfd, + sfd/FreeSerifItalic.sfd, sfd/FreeSerifBold.sfd, + sfd/FreeSerifBoldItalic.sfd - Combining characters (U+0300 - + U+036F) moved left, so that they have negative horizontal values + and zero advance width. + +2003-09-15 Primoz Peterlin + + * sfd/FreeSerifBold.sfd, sfd/FreeSerifItalic.sfd - Started working + on super- and subscripts. + +2003-09-12 Primoz Peterlin + + * sfd/FreeSans.sfd, sfd/FreeSerif.sfd - Added some missing + Hiragana and Katakana characters. + + * sfd/FreeSansBold.sfd - Cleared background characters in Latin + Extended-A. Added some automatically constructed characters in + Latin Extended-B. Started with superscripts and subscripts. + + * sfd/FreeSans.sfd - Subscript numerals (U+2080-U+2089) completed. + +2003-05-19 Primoz Peterlin + + * sfd/FreeSerif.sfd - Thai characters po pla and bo baimai + swapped; Thai character fongman corrected; all courtesy Theppitak + Karoonboonyanan. + +2003-05-17 Panayotis Katsaloulis + + * sfd/FreeSerif.sfd, sfd/FreeSerifItalic.sfd, + sfd/FreeSerifBold.sfd, sfd/FreeSerifBoldItalic.sfd - Full support + of all ancient greek glyphs + +2003-05-15 Primoz Peterlin + + * tools/KerningNumerals.pl - A Perl script for moving kerning + information from ASCII numerals (U+0030...) to characters in the + Adobe corporate use area (U+F6xx). + + * sfd/FreeSansBold.sfd, sfd/FreeSansOblique.sfd, + sfd/FreeSansBoldOblique.sfd - Created kerned numerals in the Adobe + corporate use area (U+F6xx) and moved kerning information from + ASCII numerals to the kerned numerals. + +2003-05-14 Primoz Peterlin + + * sfd/FreeSans.sfd - First approximation of super- and subscript + numerals and vulgar fractions. + + * sfd/FreeSerif.sfd - Super- and subscript numerals complete, + vulgar fractions completed and redone as references rather than + outlines. + +2003-05-12 Primoz Peterlin + + * sfd/FreeSerif.sfd - Clean-up of the Cyrillic letters added on + March 27; super- and subscripts, vulgar fractions. + +2003-05-09 Primoz Peterlin + + * sfd/FreeMonoBold.sfd - Added a couple of characters to + the Latin Extended-B area and the IPA extensions area. + +2003-05-08 Primoz Peterlin + + * sfd/FreeSerifBoldItalic.sfd - Added a couple of characters to + the Latin Extended-B area. + + * sfd/FreeSerif.sfd, sfd/FreeSerifItalic.sfd, + sfd/FreeSerifBold.sfd, sfd/FreeSerifBoldItalic.sfd - ASCII + numerals now monospaced; kerned numerals moved to Adobe corporate + use area + (U+F6xx). + +2003-05-07 Primoz Peterlin + + * sfd/FreeSerif.sfd - Roman numerals now more complete. + + * sfd/FreeSansOblique.sfd, sfd/FreeSansBoldOblique.sfd - Accented + characters added in the Latin Extended-B area. + + * sfd/FreeSans.sfd - Greek accents added in the Greek Extended + area, characters added in the Latin Extended-B area, Roman + numerals added. + + * sfd/FreeMonoOblique.sfd - Kerning pairs removed (what were they + doing in a monospaced font, anyway?). + + * sfd/FreeMonoBoldOblique.sfd - Additions in Latin Extended-B and + Basic Greek. + + * sfd/FreeMono.sfd, sfd/FreeMonoBold.sfd, sfd/FreeMonoOblique.sfd, + sfd/FreeMonoBoldOblique.sfd, sfd/FreeSans.sfd, + sfd/FreeSansBold.sfd, sfd/FreeSansOblique.sfd, + sfd/FreeSansBoldOblique.sfd - Major cleanup (fixed widths, open + paths, path directions (clockwise/counter-clockwise), points + rounded to integer values; outlines simplified etc.) + +2003-05-06 Primoz Peterlin + + * tools/OS2UnicodeRange - A simple script to display OS/2 Unicode + range table in TrueType fonts. + + * sfd/FreeSans.sfd, sfd/FreeSansBold.sfd - ASCII numerals now + monospaced; kerned numerals moved to Adobe corporate use area + (U+F6xx). FreeSans is done, FreeSansBold half-way. + + * sfd/FreeMono.sfd, sfd/FreeMonoOblique.sfd, sfd/FreeMonoBold.sfd, + sfd/FreeMonoBoldOblique.sfd, sfd/FreeSans.sfd, + sfd/FreeSansOblique.sfd, sfd/FreeSansBold.sfd, + sfd/FreeSansBoldOblique.sfd, sfd/FreeSerif.sfd, + sfd/FreeSerifItalic.sfd, sfd/FreeSerifBold.sfd, + sfd/FreeSerifBoldItalic.sfd - Added 2003 in copyright info. + +2003-03-27 Primoz Peterlin + + * sfd/FreeSerif.sfd - Cyrillic and Cyrillic Supplement blocks + brought to conformance with Unicode 3.2, courtesy Daniel Shurovich + Chirkov. + +2003-03-19 Primoz Peterlin + + * sfd/FreeSans.sfd, sfd/FreeSansOblique.sfd - somewhat wider + germandbls (U+00DF), due to complaints by Walter Schmidt. + +2003-03-18 Primoz Peterlin + + * sfd/FreeSans.sfd - Added Sinhala glyphs from the Tipitaka + project , recoded to Unicode by Noah Levitt. + +2003-02-19 Primoz Peterlin + + * sfd/FreeSans.sfd - Minor changes on mathematical operators. + +2003-02-18 Primoz Peterlin + + * sfd/FreeMono.sfd - minor cleanup of glyph backgrounds; changed + integral signs (U+222B - U+2230) + +2003-02-05 Primoz Peterlin + + * sfd/FreeSans.sfd - added a couple of glyphs in the IPA and + African Latin ranges. + +2003-01-30 Primoz Peterlin + + * sfd/FreeSans.sfd, sfd/FreeSansOblique.sfd, sfd/FreeSansBold.sfd, + sfd/FreeSansBoldOblique.sfd, sfd/FreeMonoBold.sfd, + sfd/FreeMonoBoldOblique.sfd - Corrected Maltese Hbar (U+0126) + and/or hbar (U+0127). + +2003-01-28 Primoz Peterlin + + * sfd/FreeSerifItalic.sfd - Corrected Maltese hbar (U+0127). + +2002-12-18 Primoz Peterlin + + * tools/ConvertFont - PfaEdit script for converting SFD files to + TrueType fonts. + + * sfd/FreeSans.sfd - Added Tamil and Kannada glyphs from the + Akruti Indic fonts. + +2002-12-17 Primoz Peterlin + + * sfd/FreeSans.sfd - Added Devanagari and Gujarati glyphs from the + Akruti Indic fonts. + + * www/index.html - Added information on Rogier van Dalen's tools. + + * AUTHORS - Added M.S. Sridhar. + + * CREDITS - Correct spelling of Culmus project. Added M.S. Sridhar. + +2002-12-06 Primoz Peterlin + + * sfd/FreeMono.sfd - Added Braille glyphs, courtesy Vyacheslav + Dikonov. + + * sfd/FreeSans.sfd - Added Unicode Syriac glyphs, courtesy + Vyacheslav Dikonov. + +2002-10-11 Primoz Peterlin + + * www/index.html - Added information on the availability of the + Debian GNU/Linux package. + + * sfd/FreeSerif.sfd, sfd/FreeSans.sfd - added some kern pairs + beyond Latin-1 area. + + * sfd/FreeSerif.sfd, sfd/FreeSerifItalic.sfd, + sfd/FreeSerifBold.sfd, sfd/FreeSerifBoldItalic.sfd - re-introduced + all the emtpy glyph slots (changes from Sep 23 made PfaEdit + crash). + +2002-09-23 Primoz Peterlin + + * sfd/FreeSerif.sfd, sfd/FreeSerifItalic.sfd, + sfd/FreeSerifBold.sfd, sfd/FreeSerifBoldItalic.sfd - imported + kerning information from the URW++ AFM files + +2002-09-11 Primoz Peterlin + + * sfd/FreeMono.sfd, sfd/FreeMonoOblique.sfd, sfd/FreeMonoBold.sfd, + sfd/FreeMonoOblique.sfd - updated Hebrew parts to comply with + Culmus v0.6. + + * sfd/FreeSans.sfd, sfd/FreeSansOblique.sfd, sfd/FreeSansBold.sfd, + sfd/FreeSansOblique.sfd - Added Danilo Segan's Serbian Cyrillic + glyphs; updated Hebrew parts to comply with Culmus v0.6. + +2002-09-09 Primoz Peterlin + + * sfd/FreeMono.sfd, sfd/FreeMonoOblique.sfd, sfd/FreeMonoBold.sfd, + sfd/FreeMonoOblique.sfd, sfd/FreeSans.sfd, + sfd/FreeSansOblique.sfd, sfd/FreeSansBold.sfd, + sfd/FreeSansOblique.sfd - Updated Cyrillic part to match + Filippov's 1.0.7pre14 + + * sfd/FreeSansOblique.sfd - added Sam Stepanyan's Armenian glyphs + from FreeSans (skewed for 12 degrees). + +2002-09-06 Primoz Peterlin + + * sfd/FreeSans.sfd, sfd/FreeSansOblique.sfd, + sfd/FreeSansBold.sfd, sfd/FreeSansOblique.sfd - Added Maxim + Iorsh's Hebrew characters. + +2002-08-29 Primoz Peterlin + + * sfd/FreeMono.sfd, sfd/FreeMonoOblique.sfd, + sfd/FreeMonoBold.sfd, sfd/FreeMonoOblique.sfd - Added Maxim + Iorsh's Hebrew characters. + + * AUTHORS, CREDITS - Added Maxim Iorsh as author. + +2002-08-28 Primoz Peterlin + + * www/index.html - Added information of Microsoft's withdrawal of + freely available Unicode TrueType fonts + + * www/resources.html - Added link to Maxim Iorsh's Culmus project. + +2002-07-26 Primoz Peterlin + + * sfd/FreeMono.sfd - Added a couple of characters (Arrows area). + +2002-06-11 Primoz Peterlin + + * sfd/FreeMono.sfd - Applied Michalis Kabrianis's patch concerning + perispomeni in Greek politoniko. + +2002-05-23 Primoz Peterlin + + * sfd/FreeMono.sfd - Applied Michalis Kabrianis's patch concerning + psili in Greek politoniko. Also added two working variants of + chars in the IPA range. + +2002-05-15 Primoz Peterlin + + * sfd/FreeSans.sfd, sfd/FreeSansBold.sfd, sfd/FreeSerif.sfd, + sfd/FreeSerifBold.sfd - Deleted explicit ".notdef" character with + no contours. + +2002-05-14 Primoz Peterlin + + * sfd/FreeMono.sfd, sfd/FreeMonoOblique.sfd, sfd/FreeMonoBold.sfd, + sfd/FreeMonoBoldOblique.sfd, sfd/FreeSans.sfd, + sfd/FreeSansOblique.sfd, sfd/FreeSansBold.sfd, + sfd/FreeSansBoldOblique.sfd, sfd/FreeSerif.sfd, + sfd/FreeSerifItalic.sfd, sfd/FreeSerifBold.sfd, + sfd/FreeSerifBoldItalic.sfd - The new version of PfaEdit saves + correctly formed Panose and LineGap lines. + + * sfd/FreeSansBoldOblique.sfd - Filled-in the missing TTFWidth and + TTFWeight values. + +2002-05-09 Primoz Peterlin + + * sfd/FreeSans.sfd - Added diacritics to the Spacing Modifier + Letters and Combining Diacritical Marks areas. Added composed + glyphs to the Latin Extended-B area. + +2002-05-07 Primoz Peterlin + + * sfd/FreeMono.sfd, sfd/FreeMonoOblique.sfd, sfd/FreeMonoBold.sfd, + sfd/FreeMonoBoldOblique.sfd, sfd/FreeSans.sfd, + sfd/FreeSansOblique.sfd, sfd/FreeSansBold.sfd, + sfd/FreeSansBoldOblique.sfd, sfd/FreeSerif.sfd, + sfd/FreeSerifItalic.sfd, sfd/FreeSerifBold.sfd, + sfd/FreeSerifBoldItalic.sfd - Updated Panose information with data + provided by Josef W. Segur. Updated TTF headers with English and + Slovenian text. + +2002-04-30 Primoz Peterlin + + * sfd/FreeMonoBold.sfd - Working on Greek small letters. Several + minor changes (lower carons etc.) + +2002-04-29 Primoz Peterlin + + * FreeMonoBoldOblique.sfd - Started adding Greek. + + * sfd/FreeMonoBold.sfd - Added glyphs in the Geometrical Shapes + and Miscellaneous Symbols area. Harmonizing Greek with Latin. Done + with capitals. + + * sfd/FreeMono.sfd - Deleted the explicit .notdef character. Added + one glyph to the Geometrical Shapes area, which is now completed; + added three glyphs to the Miscellaneous Symbols area. Harmonizing + Greek with Latin. Done with the capitals. + +2002-04-26 Primoz Peterlin + + * sfd/FreeSans.sfd - Adjusted accent positions on several glyphs + in the Latin Extended-A area. + +2002-04-25 Primoz Peterlin + + * sfd/FreeMonoBold.sfd - Box Drawing area completed. Added a + couple of glyphs in the Geometrical Shapes area. + + * sfd/FreeMono.sfd - Small corrections in the Box Drawing area. + +2002-04-24 Primoz Peterlin + + * sfd/FreeMono.sfd - Box Drawing area completed. + +2002-04-23 Primoz Peterlin + + * tools/WGL4.lst - corrected. + + * sfd/FreeMono.sfd, sfd/FreeMonoBold.sfd - Working on Box Drawing + area. + +2002-04-22 Primoz Peterlin + + * sfd/FreeMono.sfd, sfd/FreeMonoBold.sfd - Working on Latin + Extended-B and Greek. + +2002-04-19 Primoz Peterlin + + * sfd/FreeSerif.sfd - Somewhat cleaner chess figures. + + * tools/MES-2.txt, tools/MES-2.lst - Corrected list (it is not + 203C-203E, it is 203C and 203E). + + * sfd/FreeMono.sfd, sfd/FreeMonoOblique.sfd, sfd/FreeMonoBold.sfd, + sfd/FreeMonoBoldOblique.sfd, sfd/FreeSans.sfd, + sfd/FreeSansOblique.sfd, sfd/FreeSansBold.sfd, + sfd/FreeSansBoldOblique.sfd, sfd/FreeSerif.sfd, + sfd/FreeSerifItalic.sfd, sfd/FreeSerifBold.sfd, + sfd/FreeSerifBoldItalic.sfd - Changed "Family Name" from Free to + FreeSerif, FreeSans and FreeMono, as appropriate. Changed Font + Modifiers from MonoBold etc. to Bold, Italic, Oblique, BoldOblique + and BoldItalic. + +2002-04-18 Primoz Peterlin + + * sfd/FreeMono.sfd, sfd/FreeMonoOblique.sfd, sfd/FreeMonoBold.sfd, + sfd/FreeMonoBoldOblique.sfd - Corrected metrics; now all character + widths are set to 600. + +2002-04-17 Primoz Peterlin + + * sfd/FreeSerif.sfd - Corrected glyphs in the Box Drawing area and + Block Elements area, which should extend through the ascender *and + descender* height. + + * sfd/FreeMonoBold.sfd - Continued working on harmonizing Greek + letters with Latin and Cyrillic. + + * sfd/FreeMonoBold.sfd - Added some box drawing characters. + +2002-04-16 Primoz Peterlin + + * www/design-notes.html - Updated notes on stroke width for + symbols in Free Mono Bold. + + * sfd/FreeMono.sfd - Added a handful of characters in the + Miscellaneous Symbols area. + + * sfd/FreeMonoBoldOblique.sfd - Added subscripts, superscripts and + vulgar fractions. + + * sfd/FreeMonoBold.sfd - Started harmonizing Greek letters with + Latin and Cyrillic. + + * sfd/FreeMonoBold.sfd - Added subscripts, superscripts and vulgar + fractions. + +2002-04-15 Primoz Peterlin + + * www/design-notes.html - Updated notes on super-/subscripts in + Free Mono Bold. Separate subsections for Free Mono regular and + Free Mono Bold. + +2002-04-12 Primoz Peterlin + + * sfd/FreeSerif.sfd - Added Ethiopian glyphs, converted from the + Metafont sources from TGI, Universitt Hamburg (authors Berhanu + Beyene, Prof. Dr. Manfred Kudlek, Olaf Kummer, and Jochen + Metzinger) using Szabo's TeXtrace and retouched using + PfaEdit. Ethiopian metafonts are released under GNU GPL, + . + + * sfd/FreeMonoBold.sfd - Added 40 characters, mostly in the Latin + Extended-B and IPA Extensions areas. + +2002-04-11 Primoz Peterlin + + * sfd/FreeMono.sfd - Added a handful of characters in the Latin + Extended-B, IPA Extensions, Currency Symbols and Miscellaneous + Symbols areas. + +2002-04-09 Primoz Peterlin + + * sfd/FreeMono.sfd - Correcting accent positioning in the Extended + Greek area; adding a couple of characters here and there. Still 20 + characters short of MES-2 conformance. + +2002-04-08 Primoz Peterlin + + * sfd/FreeMono.sfd - Added some characters in the Arrows area; + more or less completed Extended Greek area (accents still need to + be fine-tuned). + +2002-04-05 Primoz Peterlin + + * sfd/FreeMono.sfd - Modern non-Russian Cyrilic mostly completed. + + * sfd/FreeMonoOblique.sfd - Synchronized with FreeMono. + + * sfd/FreeSerif.sfd - Added Thomas Ridgeway's Tamil characters + (converted from Metafont and edited somehwat). + +2002-04-04 Primoz Peterlin + + * sfd/FreeMonoOblique.sfd - Armenian letters added. + + * sfd/FreeMonoBold.sfd - Serbian Cyrillic letters dje, tshe, lje + and nje corrected. + + * sfd/FreeMono.sfd - Serbian Cyrillic letters dje and tshe + corrected. Some other non-Russian Cyrillic letters modified and + "welded together". + +2002-04-03 Primoz Peterlin + + * sfd/FreeMono.sfd - Added more or less complete Armenian + area. The glyphs are a tidied-up version based on the Armenian + Courier on the . Now we have + 1673 characters. + +2002-03-28 Primoz Peterlin + + * sfd/FreeMono.sfd - Added some mathematical symbols. + +2002-03-26 Primoz Peterlin + + * sfd/FreeSans.sfd - took H.S. Pannu's Gurmukhi from FreeSerif. It + actually fits to FreeSans much better. It seems I'll have to look + for another Gurmukhi font with modulated stroke for FreeSerif. + + * sfd/FreeSerifItalic.sfd - replaced existing Hebrew glyphs by + those from FreeSerif (slanted for 15.5 degrees). + + * sfd/FreeSerif.sfd - Added dotted Hebrew letters. Changed barred H. + + * sfd/FreeMono.sfd - Completed vulgar fractions; minor changes in + Greek; added some mathematical operators. + + * sfd/FreeMonoBold.sfd - added 12 characters to Latin Extended-B + and IPA Extensions areas (total 984). + +2002-03-25 Primoz Peterlin + + * sfd/FreeMonoBold.sfd - started adding Latin Extended-B and IPA + Extensions. + + * sfd/FreeMono.sfd - Minor cosmetic changes; cleaning up Greek + (removing redundant control points), added some non-European + Cyrillic glyphs as a test. + +2002-03-22 Primoz Peterlin + + * sfd/FreeMono.sfd - Some minor modifications; letters in Latin + Extended-B area "welded" together. + +2002-03-20 Primoz Peterlin + + * www/index.html - finally linked the resources and design notes + pages. + + * www/design-notes.html - added scaling information for super- and + subscript numerals in FreeMono. + +2002-03-19 Primoz Peterlin + + * sfd/FreeMono.sfd - the Latin Extended-B and IPA Extension area + characters moved from FreeMono and skewed for 12 degrees. + +2002-03-18 Primoz Peterlin + + * sfd/FreeMono.sfd - added a dozen or two of new characters, in + particular in the Latin Extended-B and IPA Extension area. + +2002-03-15 Primoz Peterlin + + * sfd/FreeMono.sfd - added a dozen of two of new characters, in + particular in the IPA Extension area. + + * www/design-notes.html - Corrected data for x-height in FreeMono; + information on constructing small caps. + +2002-03-14 Primoz Peterlin + + * sfd/FreeMono.sfd - added three smiley characters to the + Miscallaneous Symbols area. + +2002-03-10 Primoz Peterlin + + * sfd/FreeSerif.sfd - Anshuman Pandey has only converted Gurmukhi + from TrueType to Metafont; the original author of Gurkmukhi font + is Hardip Singh Pannu . + Got the permission from him to include the Gurmukhi glyph set. + +2002-03-08 Primoz Peterlin + + * sfd/FreeSerif.sfd - Added some more glyphs in the Mathematical + Symbols area to a total number of 3374. + +2002-03-06 Primoz Peterlin + + * sfd/FreeSerif.sfd - Added a basic Gurmukhi set. + + * www/design-notes.html - started a page on design notes + + * sfd/FreeMono.sfd - realized that glyphs in the Box Drawing area + and Block Elements area should extend through the ascender *and + descender* height, and corrected it. + + * sfd/FreeMono.sfd, sfd/FreeMonoOblique.sfd - added some musical + glyphs, linking "no-break space" to space, "soft hyphen" to + hyphen-minus etc. + +2002-03-05 Primoz Peterlin + + * tools/WGL4.lst - Added Windows Glyph List 4.0 + + * tools/LigatureList.pl - Wrote a Perl script, which lists the + GSUB list (ligature list) of a OpenType font. + + * sfd/FreeSerifBold.sfd, sfd/FreeSerifBoldItalic.sfd, + sfd/FreeSerifItalic.sfd - auxilliary Hebrew glyphs added. They are + too light compared with Latin and will be substituted with better + ones. + +2002-03-04 Primoz Peterlin + + * sfd/FreeSerif.sfd - Added some more glyphs to the Mathematical + Operators area (page 0x22). + + * sfd/FreeSerif.sfd - Incomplete and fragmentary support for + Devanagari, originating from Harsh Kumar's Shusha fonts was + replaced by Frans Velthuis' Devanagari metafont, now maintained by + Anshuman Pandey and available under + GPL. Until I figure out how to provide glyph substitution table in + OpenType, only the Unicode part is there. + +2002-02-28 Primoz Peterlin + + * ChangeLog file created + + * sfd/FreeSerif.sfd - Added some Telugu glyphs to page 0x0C, + courtesy Prasad A. Chodavarapu + + * sfd/FreeSerif.sfd - Added some glyphs to the Miscellaneous + Symbols page (0x26). + +2002-02-26 Primoz Peterlin + + * mailing lists freefont-announce and freefont-bugs created + +2002-02-25 Primoz Peterlin + + * sfd/FreeSerif.sfd - Added a couple of glyphs in Mathematics + Operators area. + + * sfd/FreeMono.sfd + - Added some more glyphs, in particular in the Mathematical + Operators section. + - Changed FamilyName to Free, FontName to FreeMono, and Full name + to "Free Monospaced". + +2002-02-20 Primoz Peterlin + + * sfd/ directory added containing FreeSerif, FreeSans and FreeMono + families. + + * tools/ directory added containing lists with characters required + for MES (Multilinguag European Subset) compliance. + + * tools/mes-list-expand.pl created - a Perl script for expanding MES + ranges into simple one-char-per-line format + + * tools/CheckConformance.pl created - a Perl script for checking + conformance of a font file with a given coded character set + + * homepage created + +2002-02-19 Primoz Peterlin + + * freefont (Free UCS Scalable Fonts) project approved on + savannah.gnu.org: diff --git a/reactos/media/fonts/doc/FreeFont_readme.txt b/reactos/media/fonts/doc/FreeFont_readme.txt index 96e4a4db86d..8c970cbcf4c 100644 --- a/reactos/media/fonts/doc/FreeFont_readme.txt +++ b/reactos/media/fonts/doc/FreeFont_readme.txt @@ -63,7 +63,7 @@ Licensing Free UCS scalable fonts is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published -by the Free Software Foundation; either version 2 of the License, or +by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. The fonts are distributed in the hope that they will be useful, but @@ -105,4 +105,4 @@ Primoz Peterlin, Steve White Free UCS scalable fonts: http://savannah.gnu.org/projects/freefont/ -$Id: README,v 1.5 2008/08/30 09:30:09 Stevan_White Exp $ +$Id: README,v 1.7 2009/01/13 08:43:23 Stevan_White Exp $ From c2fdf7156e0fe7fe436afadb916859e082ed3cc7 Mon Sep 17 00:00:00 2001 From: Gregor Schneider Date: Thu, 5 May 2011 19:43:44 +0000 Subject: [PATCH 302/317] [libpng] Vincenzo Cotugno: update libpng to 1.52 See issue #6034 for more details. svn path=/trunk/; revision=51595 --- reactos/dll/3rdparty/libpng/docs/ANNOUNCE | 61 +- reactos/dll/3rdparty/libpng/docs/CHANGES | 1902 +++++--- reactos/dll/3rdparty/libpng/docs/INSTALL | 42 +- reactos/dll/3rdparty/libpng/docs/LICENSE | 6 +- reactos/dll/3rdparty/libpng/docs/README | 84 +- reactos/dll/3rdparty/libpng/docs/TODO | 10 +- reactos/dll/3rdparty/libpng/docs/example.c | 27 +- .../3rdparty/libpng/docs/libpng-manual.txt | 4214 +++++++++++++++++ reactos/dll/3rdparty/libpng/png.c | 1716 ++++++- reactos/dll/3rdparty/libpng/pngerror.c | 301 +- reactos/dll/3rdparty/libpng/pngget.c | 693 +-- reactos/dll/3rdparty/libpng/pngmem.c | 245 +- reactos/dll/3rdparty/libpng/pngpread.c | 393 +- reactos/dll/3rdparty/libpng/pngread.c | 372 +- reactos/dll/3rdparty/libpng/pngrio.c | 41 +- reactos/dll/3rdparty/libpng/pngrtran.c | 1500 +++--- reactos/dll/3rdparty/libpng/pngrutil.c | 1373 +++--- reactos/dll/3rdparty/libpng/pngset.c | 684 +-- reactos/dll/3rdparty/libpng/pngtest.c | 331 +- reactos/dll/3rdparty/libpng/pngtrans.c | 359 +- reactos/dll/3rdparty/libpng/pngwio.c | 59 +- reactos/dll/3rdparty/libpng/pngwrite.c | 634 ++- reactos/dll/3rdparty/libpng/pngwtran.c | 153 +- reactos/dll/3rdparty/libpng/pngwutil.c | 978 ++-- reactos/include/reactos/libs/libpng/png.h | 2256 ++++----- reactos/include/reactos/libs/libpng/pngconf.h | 1758 ++----- .../include/reactos/libs/libpng/pngdebug.h | 471 ++ reactos/include/reactos/libs/libpng/pnginfo.h | 810 ++++ .../include/reactos/libs/libpng/pnglibconf.h | 543 +++ reactos/include/reactos/libs/libpng/pngpriv.h | 914 ++-- .../include/reactos/libs/libpng/pngstruct.h | 924 ++++ 31 files changed, 16644 insertions(+), 7210 deletions(-) create mode 100644 reactos/dll/3rdparty/libpng/docs/libpng-manual.txt create mode 100644 reactos/include/reactos/libs/libpng/pngdebug.h create mode 100644 reactos/include/reactos/libs/libpng/pnginfo.h create mode 100644 reactos/include/reactos/libs/libpng/pnglibconf.h create mode 100644 reactos/include/reactos/libs/libpng/pngstruct.h diff --git a/reactos/dll/3rdparty/libpng/docs/ANNOUNCE b/reactos/dll/3rdparty/libpng/docs/ANNOUNCE index 5f6c7c2c871..0659ae39d24 100644 --- a/reactos/dll/3rdparty/libpng/docs/ANNOUNCE +++ b/reactos/dll/3rdparty/libpng/docs/ANNOUNCE @@ -1,5 +1,5 @@ -Libpng 1.4.3 - June 26, 2010 +Libpng 1.5.2 - March 31, 2011 This is a public release of libpng, intended for use in production codes. @@ -8,32 +8,55 @@ Files available for download: Source files with LF line endings (for Unix/Linux) and with a "configure" script - libpng-1.4.3.tar.xz (LZMA-compressed, recommended) - libpng-1.4.3.tar.gz - libpng-1.4.3.tar.bz2 + libpng-1.5.2.tar.xz (LZMA-compressed, recommended) + libpng-1.5.2.tar.gz + libpng-1.5.2.tar.bz2 Source files with CRLF line endings (for Windows), without the "configure" script - lpng143.zip - lpng143.7z + lpng152.7z (LZMA-compressed, recommended) + lpng152.zip Other information: - libpng-1.4.3-README.txt - libpng-1.4.3-LICENSE.txt + libpng-1.5.2-README.txt + libpng-1.5.2-LICENSE.txt -Changes since the last public release (1.4.2): - Added missing quotation marks in the aix block of configure.ac - The new "vstudio" project was missing from the zip and 7z distributions. - Rewrote png_process_IDAT_data to consistently treat extra data as warnings - and handle end conditions more cleanly. - Removed the now-redundant check for out-of-bounds new_row from example.c - Changed char *msg to PNG_CONST char *msg in pngrutil.c - Stop memory leak when reading a malformed sCAL chunk. +Changes since the last public release (1.5.2): -Send comments/corrections/commendations to glennrp at users.sourceforge.net -or to png-mng-implement at lists.sf.net (subscription required; visit -https://lists.sourceforge.net/lists/listinfo/png-mng-implement). + More -Wshadow fixes for older gcc compilers. Older gcc versions apparently + check formal parameters names in function declarations (as well as + definitions) to see if they match a name in the global namespace. + Revised PNG_EXPORTA macro to not use an empty parameter, to accommodate the + old VisualC++ preprocessor. + Turned on interlace handling in png_read_png(). + Fixed gcc pendantic warnings. + Handle longjmp in Cygwin. + Fixed png_get_current_row_number() in the interlaced case. + Cleaned up ALPHA flags and transformations. + Implemented expansion to 16 bits. + Fixed mistake in the descriptions of user read_transform and write_transform + function prototypes in the manual. The row_info struct is png_row_infop. + Corrected png_get_current_row_number documentation + Fixed the read/write row callback documentation. + This documents the current behavior, where the callback is called after + every row with information pertaining to the next row. + Fixed scripts/makefile.vcwin32 + Updated contrib/pngsuite/README to add the word "modify". + Define PNG_ALLOCATED and other attributes to blank when _MSC_VER<1300. + ifdef out mask arrays in pngread.c when interlacing is not supported. + Added a hint to try CPP=/bin/cpp if "cpp -E" fails in scripts/pnglibconf.mak + and in contrib/pngminim/*/makefile, eg., on SunOS 5.10, and removed "strip" + from the makefiles. + Fixed a bug (present since libpng-1.0.7) that makes png_handle_sPLT() fail + to compile when PNG_NO_POINTER_INDEXING is defined (Chubanov Kirill) + Don't include standard header files in png.h while building the symbol table, + to avoid cpp failure on SunOS (introduced PNG_BUILDING_SYMBOL_TABLE macro). + +Send comments/corrections/commendations to png-mng-implement at lists.sf.net +(subscription required; visit +https://lists.sourceforge.net/lists/listinfo/png-mng-implement +to subscribe) or to glennrp at users.sourceforge.net Glenn R-P diff --git a/reactos/dll/3rdparty/libpng/docs/CHANGES b/reactos/dll/3rdparty/libpng/docs/CHANGES index 0dff4892299..fb069121a45 100644 --- a/reactos/dll/3rdparty/libpng/docs/CHANGES +++ b/reactos/dll/3rdparty/libpng/docs/CHANGES @@ -2,11 +2,11 @@ libpng_changes(){ /* CHANGES - changes for libpng -version 0.2 +Version 0.2 added reader into png.h fixed small problems in stub file -version 0.3 +Version 0.3 added pull reader split up pngwrite.c to several files added pnglib.txt @@ -17,7 +17,7 @@ version 0.3 added K&R support added check for 64 KB blocks for 16 bit machines -version 0.4 +Version 0.4 cleaned up code and commented code simplified time handling into png_time created png_color_16 and png_color_8 to handle color needs @@ -28,28 +28,28 @@ version 0.4 cleaned up zTXt reader and writer (using zlib's Reset functions) split transformations into pngrtran.c and pngwtran.c -version 0.5 +Version 0.5 interfaced with zlib 0.8 fixed many reading and writing bugs saved using 3 spaces instead of tabs -version 0.6 +Version 0.6 added png_large_malloc() and png_large_free() added png_size_t cleaned up some compiler warnings added png_start_read_image() -version 0.7 +Version 0.7 cleaned up lots of bugs finished dithering and other stuff added test program changed name from pnglib to libpng -version 0.71 [June, 1995] +Version 0.71 [June, 1995] changed pngtest.png for zlib 0.93 fixed error in libpng.txt and example.c -version 0.8 +Version 0.8 cleaned up some bugs added png_set_filler() split up pngstub.c into pngmem.c, pngio.c, and pngerror.c @@ -63,191 +63,194 @@ version 0.8 changed external functions passing floats to doubles (k&r problems?) put all the configurable stuff in pngconf.h enabled png_set_shift to work with paletted images on read - added png_read_update_info() - updates info structure with - transformations + added png_read_update_info() - updates info structure with transformations -version 0.81 [August, 1995] +Version 0.81 [August, 1995] incorporated Tim Wegner's medium model code (thanks, Tim) -version 0.82 [September, 1995] +Version 0.82 [September, 1995] [unspecified changes] -version 0.85 [December, 1995] +Version 0.85 [December, 1995] added more medium model code (almost everything's a far) added i/o, error, and memory callback functions fixed some bugs (16 bit, 4 bit interlaced, etc.) added first run progressive reader (barely tested) -version 0.86 [January, 1996] +Version 0.86 [January, 1996] fixed bugs improved documentation -version 0.87 [January, 1996] +Version 0.87 [January, 1996] fixed medium model bugs fixed other bugs introduced in 0.85 and 0.86 added some minor documentation -version 0.88 [January, 1996] +Version 0.88 [January, 1996] fixed progressive bugs replaced tabs with spaces cleaned up documentation added callbacks for read/write and warning/error functions -version 0.89 [July, 1996] - added new initialization API to make libpng work better with shared libs - we now have png_create_read_struct(), png_create_write_struct(), - png_create_info_struct(), png_destroy_read_struct(), and - png_destroy_write_struct() instead of the separate calls to - malloc and png_read_init(), png_info_init(), and png_write_init() - changed warning/error callback functions to fix bug - this means you - should use the new initialization API if you were using the old - png_set_message_fn() calls, and that the old API no longer exists - so that people are aware that they need to change their code - changed filter selection API to allow selection of multiple filters - since it didn't work in previous versions of libpng anyways - optimized filter selection code - fixed png_set_background() to allow using an arbitrary RGB color for - paletted images - fixed gamma and background correction for paletted images, so - png_correct_palette is not needed unless you are correcting an - external palette (you will need to #define PNG_CORRECT_PALETTE_SUPPORTED - in pngconf.h) - if nobody uses this, it may disappear in the future. - fixed bug with Borland 64K memory allocation (Alexander Lehmann) - fixed bug in interlace handling (Smarasderagd, I think) - added more error checking for writing and image to reduce invalid files - separated read and write functions so that they won't both be linked - into a binary when only reading or writing functionality is used - new pngtest image also has interlacing and zTXt - updated documentation to reflect new API +Version 0.89 [July, 1996] + Added new initialization API to make libpng work better with shared libs + we now have png_create_read_struct(), png_create_write_struct(), + png_create_info_struct(), png_destroy_read_struct(), and + png_destroy_write_struct() instead of the separate calls to + malloc and png_read_init(), png_info_init(), and png_write_init() + Changed warning/error callback functions to fix bug - this means you + should use the new initialization API if you were using the old + png_set_message_fn() calls, and that the old API no longer exists + so that people are aware that they need to change their code + Changed filter selection API to allow selection of multiple filters + since it didn't work in previous versions of libpng anyways + Optimized filter selection code + Fixed png_set_background() to allow using an arbitrary RGB color for + paletted images + Fixed gamma and background correction for paletted images, so + png_correct_palette is not needed unless you are correcting an + external palette (you will need to #define PNG_CORRECT_PALETTE_SUPPORTED + in pngconf.h) - if nobody uses this, it may disappear in the future. + Fixed bug with Borland 64K memory allocation (Alexander Lehmann) + Fixed bug in interlace handling (Smarasderagd, I think) + Added more error checking for writing and image to reduce invalid files + Separated read and write functions so that they won't both be linked + into a binary when only reading or writing functionality is used + New pngtest image also has interlacing and zTXt + Updated documentation to reflect new API -version 0.90 [January, 1997] - made CRC errors/warnings on critical and ancillary chunks configurable +Version 0.90 [January, 1997] + Made CRC errors/warnings on critical and ancillary chunks configurable libpng will use the zlib CRC routines by (compile-time) default - changed DOS small/medium model memory support - needs zlib 1.04 (Tim Wegner) - added external C++ wrapper statements to png.h (Gilles Dauphin) - allow PNG file to be read when some or all of file signature has already - been read from the beginning of the stream. ****This affects the size - of info_struct and invalidates all programs that use a shared libpng**** - fixed png_filler() declarations - fixed? background color conversions - fixed order of error function pointers to match documentation - current chunk name is now available in png_struct to reduce the number - of nearly identical error messages (will simplify multi-lingual - support when available) - try to get ready for unknown-chunk callback functions: - - previously read critical chunks are flagged, so the chunk handling - routines can determine if the chunk is in the right place - - all chunk handling routines have the same prototypes, so we will - be able to handle all chunks via a callback mechanism - try to fix Linux "setjmp" buffer size problems - removed png_large_malloc, png_large_free, and png_realloc functions. + Changed DOS small/medium model memory support - needs zlib 1.04 (Tim Wegner) + Added external C++ wrapper statements to png.h (Gilles Dauphin) + Allow PNG file to be read when some or all of file signature has already + been read from the beginning of the stream. ****This affects the size + of info_struct and invalidates all programs that use a shared libpng**** + Fixed png_filler() declarations + Fixed? background color conversions + Fixed order of error function pointers to match documentation + Current chunk name is now available in png_struct to reduce the number + of nearly identical error messages (will simplify multi-lingual + support when available) + Try to get ready for unknown-chunk callback functions: + - previously read critical chunks are flagged, so the chunk handling + routines can determine if the chunk is in the right place + - all chunk handling routines have the same prototypes, so we will + be able to handle all chunks via a callback mechanism + Try to fix Linux "setjmp" buffer size problems + Removed png_large_malloc, png_large_free, and png_realloc functions. -version 0.95 [March, 1997] - fixed bug in pngwutil.c allocating "up_row" twice and "avg_row" never - fixed bug in PNG file signature compares when start != 0 - changed parameter type of png_set_filler(...filler...) from png_byte - to png_uint_32 - added test for MACOS to ensure that both math.h and fp.h are not #included - added macros for libpng to be compiled as a Windows DLL (Andreas Kupries) - added "packswap" transformation, which changes the endianness of - packed-pixel bytes (Kevin Bracey) - added "strip_alpha" transformation, which removes the alpha channel of - input images without using it (not necessarily a good idea) - added "swap_alpha" transformation, which puts the alpha channel in front - of the color bytes instead of after - removed all implicit variable tests which assume NULL == 0 (I think) - changed several variables to "png_size_t" to show 16/32-bit limitations - added new pCAL chunk read/write support - added experimental filter selection weighting (Greg Roelofs) - removed old png_set_rgbx() and png_set_xrgb() functions that have been +Version 0.95 [March, 1997] + Fixed bug in pngwutil.c allocating "up_row" twice and "avg_row" never + Fixed bug in PNG file signature compares when start != 0 + Changed parameter type of png_set_filler(...filler...) from png_byte + to png_uint_32 + Added test for MACOS to ensure that both math.h and fp.h are not #included + Added macros for libpng to be compiled as a Windows DLL (Andreas Kupries) + Added "packswap" transformation, which changes the endianness of + packed-pixel bytes (Kevin Bracey) + Added "strip_alpha" transformation, which removes the alpha channel of + input images without using it (not necessarily a good idea) + Added "swap_alpha" transformation, which puts the alpha channel in front + of the color bytes instead of after + Removed all implicit variable tests which assume NULL == 0 (I think) + Changed several variables to "png_size_t" to show 16/32-bit limitations + Added new pCAL chunk read/write support + Added experimental filter selection weighting (Greg Roelofs) + Removed old png_set_rgbx() and png_set_xrgb() functions that have been obsolete for about 2 years now (use png_set_filler() instead) - added macros to read 16- and 32-bit ints directly from buffer, to be - used only on those systems that support it (namely PowerPC and 680x0) - With some testing, this may become the default for MACOS/PPC systems. - only calculate CRC on data if we are going to use it - added macros for zTXt compression type PNG_zTXt_COMPRESSION_??? - added macros for simple libpng debugging output selectable at compile time - removed PNG_READ_END_MODE in progressive reader (Smarasderagd) - more description of info_struct in libpng.txt and png.h - more instructions in example.c - more chunk types tested in pngtest.c - renamed pngrcb.c to pngset.c, and all png_read_ functions to be - png_set_. We now have corresponding png_get_ - functions in pngget.c to get information in info_ptr. This isolates - the application from the internal organization of png_info_struct - (good for shared library implementations). + Added macros to read 16- and 32-bit ints directly from buffer, to be + used only on those systems that support it (namely PowerPC and 680x0) + With some testing, this may become the default for MACOS/PPC systems. + Only calculate CRC on data if we are going to use it + Added macros for zTXt compression type PNG_zTXt_COMPRESSION_??? + Added macros for simple libpng debugging output selectable at compile time + Removed PNG_READ_END_MODE in progressive reader (Smarasderagd) + More description of info_struct in libpng.txt and png.h + More instructions in example.c + More chunk types tested in pngtest.c + Renamed pngrcb.c to pngset.c, and all png_read_ functions to be + png_set_. We now have corresponding png_get_ + functions in pngget.c to get information in info_ptr. This isolates + the application from the internal organization of png_info_struct + (good for shared library implementations). -version 0.96 [May, 1997] - fixed serious bug with < 8bpp images introduced in 0.95 - fixed 256-color transparency bug (Greg Roelofs) - fixed up documentation (Greg Roelofs, Laszlo Nyul) - fixed "error" in pngconf.h for Linux setjmp() behaviour - fixed DOS medium model support (Tim Wegner) - fixed png_check_keyword() for case with error in static string text - added read of CRC after IEND chunk for embedded PNGs (Laszlo Nyul) - added typecasts to quiet compiler errors - added more debugging info +Version 0.96 [May, 1997] + Fixed serious bug with < 8bpp images introduced in 0.95 + Fixed 256-color transparency bug (Greg Roelofs) + Fixed up documentation (Greg Roelofs, Laszlo Nyul) + Fixed "error" in pngconf.h for Linux setjmp() behaviour + Fixed DOS medium model support (Tim Wegner) + Fixed png_check_keyword() for case with error in static string text + Added read of CRC after IEND chunk for embedded PNGs (Laszlo Nyul) + Added typecasts to quiet compiler errors + Added more debugging info -version 0.97 [January, 1998] - removed PNG_USE_OWN_CRC capability - relocated png_set_crc_action from pngrutil.c to pngrtran.c - fixed typecasts of "new_key", etc. (Andreas Dilger) - added RFC 1152 [sic] date support - fixed bug in gamma handling of 4-bit grayscale - added 2-bit grayscale gamma handling (Glenn R-P) - added more typecasts. 65536L becomes (png_uint_32)65536L, etc. (Glenn R-P) - minor corrections in libpng.txt - added simple sRGB support (Glenn R-P) - easier conditional compiling, e.g. define PNG_READ/WRITE_NOT_FULLY_SUPPORTED; - all configurable options can be selected from command-line instead - of having to edit pngconf.h (Glenn R-P) - fixed memory leak in pngwrite.c (free info_ptr->text) (Glenn R-P) - added more conditions for png_do_background, to avoid changing - black pixels to background when a background is supplied and - no pixels are transparent - repaired PNG_NO_STDIO behaviour - tested NODIV support and made it default behaviour (Greg Roelofs) - added "-m" option and PNGTEST_DEBUG_MEMORY to pngtest (John Bowler) - regularized version numbering scheme and bumped shared-library major +Version 0.97 [January, 1998] + Removed PNG_USE_OWN_CRC capability + Relocated png_set_crc_action from pngrutil.c to pngrtran.c + Fixed typecasts of "new_key", etc. (Andreas Dilger) + Added RFC 1152 [sic] date support + Fixed bug in gamma handling of 4-bit grayscale + Added 2-bit grayscale gamma handling (Glenn R-P) + Added more typecasts. 65536L becomes (png_uint_32)65536L, etc. (Glenn R-P) + Minor corrections in libpng.txt + Added simple sRGB support (Glenn R-P) + Easier conditional compiling, e.g. define PNG_READ/WRITE_NOT_FULLY_SUPPORTED; + all configurable options can be selected from command-line instead + of having to edit pngconf.h (Glenn R-P) + Fixed memory leak in pngwrite.c (free info_ptr->text) (Glenn R-P) + Added more conditions for png_do_background, to avoid changing + black pixels to background when a background is supplied and + no pixels are transparent + Repaired PNG_NO_STDIO behaviour + Tested NODIV support and made it default behaviour (Greg Roelofs) + Added "-m" option and PNGTEST_DEBUG_MEMORY to pngtest (John Bowler) + Regularized version numbering scheme and bumped shared-library major version number to 2 to avoid problems with libpng 0.89 apps (Greg Roelofs) -version 0.98 [January, 1998] - cleaned up some typos in libpng.txt and in code documentation - fixed memory leaks in pCAL chunk processing (Glenn R-P and John Bowler) - cosmetic change "display_gamma" to "screen_gamma" in pngrtran.c - changed recommendation about file_gamma for PC images to .51 from .45, - in example.c and libpng.txt, added comments to distinguish between - screen_gamma, viewing_gamma, and display_gamma. - changed all references to RFC1152 to read RFC1123 and changed the - PNG_TIME_RFC1152_SUPPORTED macro to PNG_TIME_RFC1123_SUPPORTED - added png_invert_alpha capability (Glenn R-P -- suggestion by Jon Vincent) - changed srgb_intent from png_byte to int to avoid compiler bugs +Version 0.98 [January, 1998] + Cleaned up some typos in libpng.txt and in code documentation + Fixed memory leaks in pCAL chunk processing (Glenn R-P and John Bowler) + Cosmetic change "display_gamma" to "screen_gamma" in pngrtran.c + Changed recommendation about file_gamma for PC images to .51 from .45, + in example.c and libpng.txt, added comments to distinguish between + screen_gamma, viewing_gamma, and display_gamma. + Changed all references to RFC1152 to read RFC1123 and changed the + PNG_TIME_RFC1152_SUPPORTED macro to PNG_TIME_RFC1123_SUPPORTED + Added png_invert_alpha capability (Glenn R-P -- suggestion by Jon Vincent) + Changed srgb_intent from png_byte to int to avoid compiler bugs -version 0.99 [January 30, 1998] - free info_ptr->text instead of end_info_ptr->text in pngread.c (John Bowler) - fixed a longstanding "packswap" bug in pngtrans.c - fixed some inconsistencies in pngconf.h that prevented compiling with - PNG_READ_GAMMA_SUPPORTED and PNG_READ_hIST_SUPPORTED undefined - fixed some typos and made other minor rearrangement of libpng.txt (Andreas) - changed recommendation about file_gamma for PC images to .50 from .51 in - example.c and libpng.txt, and changed file_gamma for sRGB images to .45 - added a number of functions to access information from the png structure - png_get_image_height(), etc. (Glenn R-P, suggestion by Brad Pettit) - added TARGET_MACOS similar to zlib-1.0.8 - define PNG_ALWAYS_EXTERN when __MWERKS__ && WIN32 are defined - added type casting to all png_malloc() function calls -version 0.99a [January 31, 1998] +Version 0.99 [January 30, 1998] + Free info_ptr->text instead of end_info_ptr->text in pngread.c (John Bowler) + Fixed a longstanding "packswap" bug in pngtrans.c + Fixed some inconsistencies in pngconf.h that prevented compiling with + PNG_READ_GAMMA_SUPPORTED and PNG_READ_hIST_SUPPORTED undefined + Fixed some typos and made other minor rearrangement of libpng.txt (Andreas) + Changed recommendation about file_gamma for PC images to .50 from .51 in + example.c and libpng.txt, and changed file_gamma for sRGB images to .45 + Added a number of functions to access information from the png structure + png_get_image_height(), etc. (Glenn R-P, suggestion by Brad Pettit) + Added TARGET_MACOS similar to zlib-1.0.8 + Define PNG_ALWAYS_EXTERN when __MWERKS__ && WIN32 are defined + Added type casting to all png_malloc() function calls + +Version 0.99a [January 31, 1998] Added type casts and parentheses to all returns that return a value.(Tim W.) -version 0.99b [February 4, 1998] + +Version 0.99b [February 4, 1998] Added type cast png_uint_32 on malloc function calls where needed. Changed type of num_hist from png_uint_32 to int (same as num_palette). Added checks for rowbytes overflow, in case png_size_t is less than 32 bits. Renamed makefile.elf to makefile.lnx. -version 0.99c [February 7, 1998] + +Version 0.99c [February 7, 1998] More type casting. Removed erroneous overflow test in pngmem.c. Added png_buffered_memcpy() and png_buffered_memset(), apply them to rowbytes. Added UNIX manual pages libpng.3 (incorporating libpng.txt) and png.5. -version 0.99d [February 11, 1998] + +Version 0.99d [February 11, 1998] Renamed "far_to_near()" "png_far_to_near()" Revised libpng.3 Version 99c "buffered" operations didn't work as intended. Replaced them @@ -257,7 +260,8 @@ version 0.99d [February 11, 1998] Check for overlength tRNS chunk present when indexed-color PLTE is read. Cleaned up spelling errors in libpng.3/libpng.txt Corrected a problem with png_get_tRNS() which returned undefined trans array -version 0.99e [February 28, 1998] + +Version 0.99e [February 28, 1998] Corrected png_get_tRNS() again. Add parentheses for easier reading of pngget.c, fixed "||" should be "&&". Touched up example.c to make more of it compileable, although the entire @@ -267,53 +271,59 @@ version 0.99e [February 28, 1998] Replaced pngtest.png with one created with zlib 1.1.1 Changed pngtest to report PASS even when file size is different (Jean-loup G.) Corrected some logic errors in png_do_invert_alpha() (Chris Patterson) -version 0.99f [March 5, 1998] + +Version 0.99f [March 5, 1998] Corrected a bug in pngpread() introduced in version 99c (Kevin Bracey) Moved makefiles into a "scripts" directory, and added INSTALL instruction file Added makefile.os2 and pngos2.def (A. Zabolotny) and makefile.s2x (W. Sebok) Added pointers to "note on libpng versions" in makefile.lnx and README Added row callback feature when reading and writing nonprogressive rows - and added a test of this feature in pngtest.c + and added a test of this feature in pngtest.c Added user transform callbacks, with test of the feature in pngtest.c -version 0.99g [March 6, 1998, morning] + +Version 0.99g [March 6, 1998, morning] Minor changes to pngtest.c to suppress compiler warnings. Removed "beta" language from documentation. -version 0.99h [March 6, 1998, evening] + +Version 0.99h [March 6, 1998, evening] Minor changes to previous minor changes to pngtest.c Changed PNG_READ_NOT_FULLY_SUPPORTED to PNG_READ_TRANSFORMS_NOT_SUPPORTED - and added PNG_PROGRESSIVE_READ_NOT_SUPPORTED macro + and added PNG_PROGRESSIVE_READ_NOT_SUPPORTED macro Added user transform capability -version 1.00 [March 7, 1998] +Version 1.00 [March 7, 1998] Changed several typedefs in pngrutil.c Added makefile.wat (Pawel Mrochen), updated makefile.tc3 (Willem van Schaik) - replaced "while(1)" with "for(;;)" - added PNGARG() to prototypes in pngtest.c and removed some prototypes - updated some of the makefiles (Tom Lane) - changed some typedefs (s_start, etc.) in pngrutil.c - fixed dimensions of "short_months" array in pngwrite.c + Replaced "while(1)" with "for(;;)" + Added PNGARG() to prototypes in pngtest.c and removed some prototypes + Updated some of the makefiles (Tom Lane) + Changed some typedefs (s_start, etc.) in pngrutil.c + Fixed dimensions of "short_months" array in pngwrite.c Replaced ansi2knr.c with the one from jpeg-v6 -version 1.0.0 [March 8, 1998] +Version 1.0.0 [March 8, 1998] Changed name from 1.00 to 1.0.0 (Adam Costello) Added smakefile.ppc (with SCOPTIONS.ppc) for Amiga PPC (Andreas Kleinert) -version 1.0.0a [March 9, 1998] + +Version 1.0.0a [March 9, 1998] Fixed three bugs in pngrtran.c to make gamma+background handling consistent - (Greg Roelofs) + (Greg Roelofs) Changed format of the PNG_LIBPNG_VER integer to xyyzz instead of xyz - for major, minor, and bugfix releases. This is 10001. (Adam Costello, - Tom Lane) + for major, minor, and bugfix releases. This is 10001. (Adam Costello, + Tom Lane) Make months range from 1-12 in png_convert_to_rfc1123 -version 1.0.0b [March 13, 1998] + +Version 1.0.0b [March 13, 1998] Quieted compiler complaints about two empty "for" loops in pngrutil.c Minor changes to makefile.s2x Removed #ifdef/#endif around a png_free() in pngread.c -version 1.0.1 [March 14, 1998] +Version 1.0.1 [March 14, 1998] Changed makefile.s2x to reduce security risk of using a relative pathname Fixed some typos in the documentation (Greg). Fixed a problem with value of "channels" returned by png_read_update_info() -version 1.0.1a [April 21, 1998] + +Version 1.0.1a [April 21, 1998] Optimized Paeth calculations by replacing abs() function calls with intrinsics plus other loop optimizations. Improves avg decoding speed by about 20%. Commented out i386istic "align" compiler flags in makefile.lnx. @@ -327,19 +337,24 @@ version 1.0.1a [April 21, 1998] Moved a misplaced pngrutil code block that truncates tRNS if it has more than num_palette entries -- test was done before num_palette was defined. Fixed a png_convert_to_rfc1123() bug that converts day 31 to 0 (Steve Eddins). - Changed compiler flags in makefile.wat for better optimization (Pawel Mrochen). -version 1.0.1b [May 2, 1998] + Changed compiler flags in makefile.wat for better optimization + (Pawel Mrochen). + +Version 1.0.1b [May 2, 1998] Relocated png_do_gray_to_rgb() within png_do_read_transformations() (Greg). Relocated the png_composite macros from pngrtran.c to png.h (Greg). Added makefile.sco (contributed by Mike Hopkirk). Fixed two bugs (missing definitions of "istop") introduced in libpng-1.0.1a. Fixed a bug in pngrtran.c that would set channels=5 under some circumstances. - More work on the Paeth-filtering, achieving imperceptible speedup (A Kleinert). - More work on loop optimization which may help when compiled with C++ compilers. + More work on the Paeth-filtering, achieving imperceptible speedup + (A Kleinert). + More work on loop optimization which may help when compiled with C++ + compilers. Added warnings when people try to use transforms they've defined out. Collapsed 4 "i" and "c" loops into single "i" loops in pngrtran and pngwtran. Revised paragraph about png_set_expand() in libpng.txt and libpng.3 (Greg) -version 1.0.1c [May 11, 1998] + +Version 1.0.1c [May 11, 1998] Fixed a bug in pngrtran.c (introduced in libpng-1.0.1a) where the masks for filler bytes should have been 0xff instead of 0xf. Added max_pixel_depth=32 in pngrutil.c when using FILLER with palette images. @@ -351,7 +366,8 @@ version 1.0.1c [May 11, 1998] to remove unwanted capabilities via the compile line Made some corrections to grammar (which, it's) in documentation (Greg). Corrected example.c, use of row_pointers in png_write_image(). -version 1.0.1d [May 24, 1998] + +Version 1.0.1d [May 24, 1998] Corrected several statements that used side effects illegally in pngrutil.c and pngtrans.c, that were introduced in version 1.0.1b Revised png_read_rows() to avoid repeated if-testing for NULL (A Kleinert) @@ -361,7 +377,8 @@ version 1.0.1d [May 24, 1998] Bob Dellaca, to make a png32bd.dll with Borland C++ 4.5 Fixed error in example.c with png_set_text: num_text is 3, not 2 (Guido V.) Changed several loops from count-down to count-up, for consistency. -version 1.0.1e [June 6, 1998] + +Version 1.0.1e [June 6, 1998] Revised libpng.txt and libpng.3 description of png_set_read|write_fn(), and added warnings when people try to set png_read_fn and png_write_fn in the same structure. @@ -378,9 +395,10 @@ version 1.0.1e [June 6, 1998] PNGTEST_DEBUG_MEM feature. Added makefile.w32, for Microsoft C++ 4.0 and later (Tim Wegner). -version 1.0.2 [June 14, 1998] +Version 1.0.2 [June 14, 1998] Fixed two bugs in makefile.bor . -version 1.0.2a [December 30, 1998] + +Version 1.0.2a [December 30, 1998] Replaced and extended code that was removed from png_set_filler() in 1.0.1a. Fixed a bug in png_do_filler() that made it fail to write filler bytes in the left-most pixel of each row (Kevin Bracey). @@ -402,21 +420,24 @@ version 1.0.2a [December 30, 1998] Added png_get_copyright() and png_get_header_version() functions. Revised comments on png_set_progressive_read_fn() in libpng.txt and example.c Added information about debugging in libpng.txt and libpng.3 . - Changed "ln -sf" to "ln -s -f" in makefile.s2x, makefile.lnx, and makefile.sco. + Changed "ln -sf" to "ln -s -f" in makefile.s2x, makefile.lnx, and + makefile.sco. Removed lines after Dynamic Dependencies" in makefile.aco . Revised makefile.dec to make a shared library (Jeremie Petit). Removed trailing blanks from all files. -version 1.0.2a [January 6, 1999] + +Version 1.0.2a [January 6, 1999] Removed misplaced #endif and #ifdef PNG_NO_EXTERN near the end of png.h Added "if" tests to silence complaints about unused png_ptr in png.h and png.c Changed "check_if_png" function in example.c to return true (nonzero) if PNG. Changed libpng.txt to demonstrate png_sig_cmp() instead of png_check_sig() which is obsolete. -version 1.0.3 [January 14, 1999] +Version 1.0.3 [January 14, 1999] Added makefile.hux, for Hewlett Packard HPUX 10.20 and 11.00 (Jim Rice) Added a statement of Y2K compliance in png.h, libpng.3, and Y2KINFO. -version 1.0.3a [August 12, 1999] + +Version 1.0.3a [August 12, 1999] Added check for PNG_READ_INTERLACE_SUPPORTED in pngread.c; issue a warning if an attempt is made to read an interlaced image when it's not supported. Added check if png_ptr->trans is defined before freeing it in pngread.c @@ -443,13 +464,15 @@ version 1.0.3a [August 12, 1999] Correct gamma with srgb is 45455 instead of 45000 in pngrutil.c, to be consistent with PNG-1.2, and allow variance of 500 before complaining. Added assembler code contributed by Intel in file pngvcrd.c and modified - makefile.w32 to use it (Nirav Chhatrapati, INTEL Corporation, Gilles Vollant) + makefile.w32 to use it (Nirav Chhatrapati, INTEL Corporation, + Gilles Vollant) Changed "ln -s -f" to "ln -f -s" in the makefiles to make Solaris happy. Added some aliases for png_set_expand() in pngrtran.c, namely png_set_expand_PLTE(), png_set_expand_depth(), and png_set_expand_tRNS() (Greg Roelofs, in "PNG: The Definitive Guide"). Added makefile.beo for BEOS on X86, contributed by Sander Stok. -version 1.0.3b [August 26, 1999] + +Version 1.0.3b [August 26, 1999] Replaced 2147483647L several places with PNG_MAX_UINT macro, defined in png.h Changed leading blanks to tabs in all makefiles. Define PNG_USE_PNGVCRD in makefile.w32, to get MMX assembler code. @@ -461,12 +484,13 @@ version 1.0.3b [August 26, 1999] negative shift distance, whose results are undefined in the C language. Added a check in pngset.c to prevent writing multiple tIME chunks. Added a check in pngwrite.c to detect invalid small window_bits sizes. -version 1.0.3d [September 4, 1999] + +Version 1.0.3d [September 4, 1999] Fixed type casting of igamma in pngrutil.c Added new png_expand functions to scripts/pngdef.pas and pngos2.def Added a demo read_user_transform_fn that examines the row filters in pngtest.c -version 1.0.4 [September 24, 1999] +Version 1.0.4 [September 24, 1999] Define PNG_ALWAYS_EXTERN in pngconf.h if __STDC__ is defined Delete #define PNG_INTERNAL and include "png.h" from pngasmrd.h Made several minor corrections to pngtest.c @@ -480,24 +504,30 @@ version 1.0.4 [September 24, 1999] assembler code) and makefile.vcwin32 (doesn't). Added a CPU timing report to pngtest.c (enabled by defining PNGTEST_TIMING) Added a copy of pngnow.png to the distribution. -version 1.0.4a [September 25, 1999] + +Version 1.0.4a [September 25, 1999] Increase max_pixel_depth in pngrutil.c if a user transform needs it. Changed several division operations to right-shifts in pngvcrd.c -version 1.0.4b [September 30, 1999] + +Version 1.0.4b [September 30, 1999] Added parentheses in line 3732 of pngvcrd.c Added a comment in makefile.linux warning about buggy -O3 in pgcc 2.95.1 -version 1.0.4c [October 1, 1999] + +Version 1.0.4c [October 1, 1999] Added a "png_check_version" function in png.c and pngtest.c that will generate a helpful compiler error if an old png.h is found in the search path. Changed type of png_user_transform_depth|channels from int to png_byte. -version 1.0.4d [October 6, 1999] + +Version 1.0.4d [October 6, 1999] Changed 0.45 to 0.45455 in png_set_sRGB() Removed unused PLTE entries from pngnow.png Re-enabled some parts of pngvcrd.c (png_combine_row) that work properly. -version 1.0.4e [October 10, 1999] + +Version 1.0.4e [October 10, 1999] Fixed sign error in pngvcrd.c (Greg Roelofs) Replaced some instances of memcpy with simple assignments in pngvcrd (GR-P) -version 1.0.4f [October 15, 1999] + +Version 1.0.4f [October 15, 1999] Surrounded example.c code with #if 0 .. #endif to prevent people from inadvertently trying to compile it. Changed png_get_header_version() from a function to a macro in png.h @@ -505,9 +535,10 @@ version 1.0.4f [October 15, 1999] Removed some pointless "ptr = NULL" in pngmem.c Added a "contrib" directory containing the source code from Greg's book. -version 1.0.5 [October 15, 1999] +Version 1.0.5 [October 15, 1999] Minor editing of the INSTALL and README files. -version 1.0.5a [October 23, 1999] + +Version 1.0.5a [October 23, 1999] Added contrib/pngsuite and contrib/pngminus (Willem van Schaik) Fixed a typo in the png_set_sRGB() function call in example.c (Jan Nijtmans) Further optimization and bugfix of pngvcrd.c @@ -515,14 +546,16 @@ version 1.0.5a [October 23, 1999] text_ptr structure. Instead, it makes its own copy. Created separate write_end_info_struct in pngtest.c for a more severe test. Added code in pngwrite.c to free info_ptr->text[i].key to stop a memory leak. -version 1.0.5b [November 23, 1999] + +Version 1.0.5b [November 23, 1999] Moved PNG_FLAG_HAVE_CHUNK_HEADER, PNG_FLAG_BACKGROUND_IS_GRAY and PNG_FLAG_WROTE_tIME from flags to mode. Added png_write_info_before_PLTE() function. Fixed some typecasting in contrib/gregbook/*.c Updated scripts/makevms.com and added makevms.com to contrib/gregbook and contrib/pngminus (Martin Zinser) -version 1.0.5c [November 26, 1999] + +Version 1.0.5c [November 26, 1999] Moved png_get_header_version from png.h to png.c, to accommodate ansi2knr. Removed all global arrays (according to PNG_NO_GLOBAL_ARRAYS macro), to accommodate making DLL's: Moved usr_png_ver from global variable to function @@ -535,7 +568,8 @@ version 1.0.5c [November 26, 1999] Removed some extraneous "-I" from contrib/pngminus/makefile.std Changed the PNG_sRGB_INTENT macros in png.h to be consistent with PNG-1.2. Change PNG_SRGB_INTENT to PNG_sRGB_INTENT in libpng.txt and libpng.3 -version 1.0.5d [November 29, 1999] + +Version 1.0.5d [November 29, 1999] Add type cast (png_const_charp) two places in png.c Eliminated pngtypes.h; use macros instead to declare PNG_CHNK arrays. Renamed "PNG_GLOBAL_ARRAYS" to "PNG_USE_GLOBAL_ARRAYS" and made available @@ -543,7 +577,8 @@ version 1.0.5d [November 29, 1999] comment out (with #ifdef) all the new declarations when PNG_USE_GLOBAL_ARRAYS is defined. Added PNG_EXPORT_VAR macro to accommodate making DLL's. -version 1.0.5e [November 30, 1999] + +Version 1.0.5e [November 30, 1999] Added iCCP, iTXt, and sPLT support; added "lang" member to the png_text structure; refactored the inflate/deflate support to make adding new chunks with trailing compressed parts easier in the future, and added new functions @@ -564,18 +599,21 @@ version 1.0.5e [November 30, 1999] PNG_cHNK_SUPPORTED and combined the three types of PNG_text_SUPPORTED macros, leaving the separate macros also available. Removed comments on #endifs at the end of many short, non-nested #if-blocks. -version 1.0.5f [December 6, 1999] + +Version 1.0.5f [December 6, 1999] Changed makefile.solaris to issue a warning about potential problems when the ucb "ld" is in the path ahead of the ccs "ld". Removed "- [date]" from the "synopsis" line in libpng.3 and libpngpf.3. Added sCAL chunk support (Eric S. Raymond). -version 1.0.5g [December 7, 1999] + +Version 1.0.5g [December 7, 1999] Fixed "png_free_spallettes" typo in png.h Added code to handle new chunks in pngpread.c Moved PNG_CHNK string macro definitions outside of PNG_NO_EXTERN block Added "translated_key" to png_text structure and png_write_iTXt(). Added code in pngwrite.c to work around a newly discovered zlib bug. -version 1.0.5h [December 10, 1999] + +Version 1.0.5h [December 10, 1999] NOTE: regarding the note for version 1.0.5e, the following must also be included in your code: png_text[i].translated_key = NULL; @@ -583,7 +621,8 @@ version 1.0.5h [December 10, 1999] Option to eliminate all floating point support was added. Some new fixed-point functions such as png_set_gAMA_fixed() were added. Expanded tabs and removed trailing blanks in source files. -version 1.0.5i [December 13, 1999] + +Version 1.0.5i [December 13, 1999] Added some type casts to silence compiler warnings. Renamed "png_free_spalette" to "png_free_spalettes" for consistency. Removed leading blanks from a #define in pngvcrd.c @@ -595,7 +634,8 @@ version 1.0.5i [December 13, 1999] Added png_free_hIST() function. Various patches to fix bugs in the sCAL and integer cHRM processing, and to add some convenience macros for use with sCAL. -version 1.0.5j [December 21, 1999] + +Version 1.0.5j [December 21, 1999] Changed "unit" parameter of png_write_sCAL from png_byte to int, to work around buggy compilers. Added new type "png_fixed_point" for integers that hold float*100000 values @@ -611,7 +651,8 @@ version 1.0.5j [December 21, 1999] and to write the iTXt chunk after IDAT if it appears in the end_ptr. Added pnggccrd.c, version of pngvcrd.c Intel assembler for gcc (Greg Roelofs) Reversed the order of trying to write floating-point and fixed-point gAMA. -version 1.0.5k [December 27, 1999] + +Version 1.0.5k [December 27, 1999] Added many parentheses, e.g., "if (a && b & c)" becomes "if (a && (b & c))" Added png_handle_as_unknown() function (Glenn) Added png_free_chunk_list() function and chunk_list and num_chunk_list members @@ -622,33 +663,41 @@ version 1.0.5k [December 27, 1999] Added png_free_tRNS(); png_set_tRNS() now malloc's its own trans array (ESR). Define png_get_int_32 when oFFs chunk is supported as well as when pCAL is. Changed type of proflen from png_int_32 to png_uint_32 in png_get_iCCP(). -version 1.0.5l [January 1, 2000] + +Version 1.0.5l [January 1, 2000] Added functions png_set_read_user_chunk_fn() and png_get_user_chunk_ptr() for setting a callback function to handle unknown chunks and for retrieving the associated user pointer (Glenn). -version 1.0.5m [January 7, 2000] + +Version 1.0.5m [January 7, 2000] Added high-level functions png_read_png(), png_write_png(), png_free_pixels(). -version 1.0.5n [January 9, 2000] + +Version 1.0.5n [January 9, 2000] Added png_free_PLTE() function, and modified png_set_PLTE() to malloc its own memory for info_ptr->palette. This makes it safe for the calling application to free its copy of the palette any time after it calls png_set_PLTE(). -version 1.0.5o [January 20, 2000] + +Version 1.0.5o [January 20, 2000] Cosmetic changes only (removed some trailing blanks and TABs) -version 1.0.5p [January 31, 2000] + +Version 1.0.5p [January 31, 2000] Renamed pngdll.mak to makefile.bd32 Cosmetic changes in pngtest.c -version 1.0.5q [February 5, 2000] + +Version 1.0.5q [February 5, 2000] Relocated the makefile.solaris warning about PATH problems. Fixed pngvcrd.c bug by pushing/popping registers in mmxsupport (Bruce Oberg) Revised makefile.gcmmx Added PNG_SETJMP_SUPPORTED, PNG_SETJMP_NOT_SUPPORTED, and PNG_ABORT() macros -version 1.0.5r [February 7, 2000] + +Version 1.0.5r [February 7, 2000] Removed superfluous prototype for png_get_itxt from png.h Fixed a bug in pngrtran.c that improperly expanded the background color. Return *num_text=0 from png_get_text() when appropriate, and fix documentation of png_get_text() in libpng.txt/libpng.3. -version 1.0.5s [February 18, 2000] + +Version 1.0.5s [February 18, 2000] Added "png_jmp_env()" macro to pngconf.h, to help people migrate to the new error handler that's planned for the next libpng release, and changed example.c, pngtest.c, and contrib programs to use this macro. @@ -667,7 +716,8 @@ version 1.0.5s [February 18, 2000] Added png_set_rows() and png_get_rows(), for use with png_read|write_png(). Modified png_read_png() to allocate info_ptr->row_pointers only if it hasn't already been allocated. -version 1.0.5t [March 4, 2000] + +Version 1.0.5t [March 4, 2000] Changed png_jmp_env() migration aiding macro to png_jmpbuf(). Fixed "interlace" typo (should be "interlaced") in contrib/gregbook/read2-x.c Fixed bug with use of PNG_BEFORE_IHDR bit in png_ptr->mode, introduced when @@ -676,13 +726,15 @@ version 1.0.5t [March 4, 2000] a 24-bit visual if one is available, and to allow abbreviated options. Files in contrib/pngminus were revised to use the png_jmpbuf() macro. Removed spaces in makefile.linux and makefile.gcmmx, introduced in 1.0.5s -version 1.0.5u [March 5, 2000] + +Version 1.0.5u [March 5, 2000] Simplified the code that detects old png.h in png.c and pngtest.c Renamed png_spalette (_p, _pp) to png_sPLT_t (_tp, _tpp) Increased precision of rgb_to_gray calculations from 8 to 15 bits and added png_set_rgb_to_gray_fixed() function. Added makefile.bc32 (32-bit Borland C++, C mode) -version 1.0.5v [March 11, 2000] + +Version 1.0.5v [March 11, 2000] Added some parentheses to the png_jmpbuf macro definition. Updated references to the zlib home page, which has moved to freesoftware.com. Corrected bugs in documentation regarding png_read_row() and png_write_row(). @@ -690,10 +742,11 @@ version 1.0.5v [March 11, 2000] Renamed makefile.borland,turboc3 back to makefile.bor,tc3 as in version 1.0.3, revised borland makefiles; added makefile.ibmvac3 and makefile.gcc (Cosmin) -version 1.0.6 [March 20, 2000] +Version 1.0.6 [March 20, 2000] Minor revisions of makefile.bor, libpng.txt, and gregbook/rpng2-win.c Added makefile.sggcc (SGI IRIX with gcc) -version 1.0.6d [April 7, 2000] + +Version 1.0.6d [April 7, 2000] Changed sprintf() to strcpy() in png_write_sCAL_s() to work without STDIO Added data_length parameter to png_decompress_chunk() function Revised documentation to remove reference to abandoned png_free_chnk functions @@ -702,7 +755,8 @@ version 1.0.6d [April 7, 2000] Renamed makefile.ibmvac3 to makefile.ibmc, added libpng.icc IBM project file Added a check for info_ptr->free_me&PNG_FREE_TEXT when freeing text in png.c Simplify png_sig_bytes() function to remove use of non-ISO-C strdup(). -version 1.0.6e [April 9, 2000] + +Version 1.0.6e [April 9, 2000] Added png_data_freer() function. In the code that checks for over-length tRNS chunks, added check of info_ptr->num_trans as well as png_ptr->num_trans (Matthias Benckmann) @@ -713,25 +767,29 @@ version 1.0.6e [April 9, 2000] is defined. Changed several instances of PNG_NO_CONSOLE_ID to PNG_NO_STDIO in pngrutil.c and mentioned the purposes of the two macros in libpng.txt/libpng.3. -version 1.0.6f [April 14, 2000] + +Version 1.0.6f [April 14, 2000] Revised png_set_iCCP() and png_set_rows() to avoid prematurely freeing data. Add checks in png_set_text() for NULL members of the input text structure. Revised libpng.txt/libpng.3. - Removed superfluous prototype for png_set_itxt from png.h + Removed superfluous prototype for png_set_iTXt from png.h Removed "else" from pngread.c, after png_error(), and changed "0" to "length". Changed several png_errors about malformed ancillary chunks to png_warnings. -version 1.0.6g [April 24, 2000] + +Version 1.0.6g [April 24, 2000] Added png_pass-* arrays to pnggccrd.c when PNG_USE_LOCAL_ARRAYS is defined. Relocated paragraph about png_set_background() in libpng.3/libpng.txt and other revisions (Matthias Benckmann) Relocated info_ptr->free_me, png_ptr->free_me, and other info_ptr and png_ptr members to restore binary compatibility with libpng-1.0.5 (breaks compatibility with libpng-1.0.6). -version 1.0.6h [April 24, 2000] + +Version 1.0.6h [April 24, 2000] Changed shared library so-number pattern from 2.x.y.z to xy.z (this builds libpng.so.10 & libpng.so.10.6h instead of libpng.so.2 & libpng.so.2.1.0.6h) This is a temporary change for test purposes. -version 1.0.6i [May 2, 2000] + +Version 1.0.6i [May 2, 2000] Rearranged some members at the end of png_info and png_struct, to put unknown_chunks_num and free_me within the original size of the png_structs and free_me, png_read_user_fn, and png_free_fn within the original png_info, @@ -756,11 +814,13 @@ version 1.0.6i [May 2, 2000] generate a libpng error if the modes aren't set and PNG_LEGACY_SUPPORTED was not defined. Added makefile.intel and updated makefile.watcom (Pawel Mrochen) -version 1.0.6j [May 3, 2000] + +Version 1.0.6j [May 3, 2000] Overloaded png_read_init() and png_write_init() with macros that convert calls to png_read_init_2() or png_write_init_2() that check the version and structure sizes. -version 1.0.7beta11 [May 7, 2000] + +Version 1.0.7beta11 [May 7, 2000] Removed the new PNG_CREATED_READ_STRUCT and PNG_CREATED_WRITE_STRUCT modes which are no longer used. Eliminated the three new members of png_text when PNG_LEGACY_SUPPORTED is @@ -771,7 +831,8 @@ version 1.0.7beta11 [May 7, 2000] Added PNGAPI macro, and added it to the definitions of all exported functions. Relocated version macro definitions ahead of the includes of zlib.h and pngconf.h in png.h. -version 1.0.7beta12 [May 12, 2000] + +Version 1.0.7beta12 [May 12, 2000] Revised pngset.c to avoid a problem with expanding the png_debug macro. Deleted some extraneous defines from pngconf.h Made PNG_NO_CONSOLE_IO the default condition when PNG_BUILD_DLL is defined. @@ -779,7 +840,8 @@ version 1.0.7beta12 [May 12, 2000] Added png_access_version_number() function. Check for mask&PNG_FREE_CHNK (for TEXT, SCAL, PCAL) in png_free_data(). Expanded libpng.3/libpng.txt information about png_data_freer(). -version 1.0.7beta14 [May 17, 2000] (beta13 was not published) + +Version 1.0.7beta14 [May 17, 2000] (beta13 was not published) Changed pnggccrd.c and pngvcrd.c to handle bad adaptive filter types as warnings instead of errors, as pngrutil.c does. Set the PNG_INFO_IDAT valid flag in png_set_rows() so png_write_png() @@ -791,7 +853,8 @@ version 1.0.7beta14 [May 17, 2000] (beta13 was not published) Removed info_ptr->valid tests from png_free_data(), as in version 1.0.5. Added png_set_invalid() function. Fixed incorrect illustrations of png_destroy_write_struct() in example.c. -version 1.0.7beta15 [May 30, 2000] + +Version 1.0.7beta15 [May 30, 2000] Revised the deliberately erroneous Linux setjmp code in pngconf.h to produce fewer error messages. Rearranged checks for Z_OK to check the most likely path first in pngpread.c @@ -803,9 +866,11 @@ version 1.0.7beta15 [May 30, 2000] Fixed some bugs in the unused PNG_INCH_CONVERSIONS functions in pngget.c Set each pointer to NULL after freeing it in png_free_data(). Worked around a problem in pngconf.h; AIX's strings.h defines an "index" - macro that conflicts with libpng's png_color_16.index. (Dimitri Papadapoulos) + macro that conflicts with libpng's png_color_16.index. (Dimitri + Papadapoulos) Added "msvc" directory with MSVC++ project files (Simon-Pierre Cadieux). -version 1.0.7beta16 [June 4, 2000] + +Version 1.0.7beta16 [June 4, 2000] Revised the workaround of AIX string.h "index" bug. Added a check for overlength PLTE chunk in pngrutil.c. Added PNG_NO_POINTER_INDEXING macro to use array-indexing instead of pointer @@ -815,23 +880,27 @@ version 1.0.7beta16 [June 4, 2000] Added PNG_USE_DLL macro. Revised the copyright/disclaimer/license notice. Added contrib/msvctest directory -version 1.0.7rc1 [June 9, 2000] + +Version 1.0.7rc1 [June 9, 2000] Corrected the definition of PNG_TRANSFORM_INVERT_ALPHA (0x0400 not 0x0200) Added contrib/visupng directory (Willem van Schaik) -version 1.0.7beta18 [June 23, 2000] + +Version 1.0.7beta18 [June 23, 2000] Revised PNGAPI definition, and pngvcrd.c to work with __GCC__ and do not redefine PNGAPI if it is passed in via a compiler directive. Revised visupng/PngFile.c to remove returns from within the Try block. Removed leading underscores from "_PNG_H" and "_PNG_SAVE_BSD_SOURCE" macros. Updated contrib/visupng/cexcept.h to version 1.0.0. Fixed bugs in pngwrite.c and pngwutil.c that prevented writing iCCP chunks. -version 1.0.7rc2 [June 28, 2000] + +Version 1.0.7rc2 [June 28, 2000] Updated license to include disclaimers required by UCITA. Fixed "DJBPP" typo in pnggccrd.c introduced in beta18. -version 1.0.7 [July 1, 2000] +Version 1.0.7 [July 1, 2000] Revised the definition of "trans_values" in libpng.3/libpng.txt -version 1.0.8beta1 [July 8, 2000] + +Version 1.0.8beta1 [July 8, 2000] Added png_free(png_ptr, key) two places in pngpread.c to stop memory leaks. Changed PNG_NO_STDIO to PNG_NO_CONSOLE_IO, several places in pngrutil.c and pngwutil.c. @@ -839,25 +908,30 @@ version 1.0.8beta1 [July 8, 2000] Removed unused "#include " from png.c Added WindowsCE support. Revised pnggccrd.c to work with gcc-2.95.2 and in the Cygwin environment. -version 1.0.8beta2 [July 10, 2000] + +Version 1.0.8beta2 [July 10, 2000] Added project files to the wince directory and made further revisions of pngtest.c, pngrio.c, and pngwio.c in support of WindowsCE. -version 1.0.8beta3 [July 11, 2000] + +Version 1.0.8beta3 [July 11, 2000] Only set the PNG_FLAG_FREE_TRNS or PNG_FREE_TRNS flag in png_handle_tRNS() for indexed-color input files to avoid potential double-freeing trans array under some unusual conditions; problem was introduced in version 1.0.6f. Further revisions to pngtest.c and files in the wince subdirectory. -version 1.0.8beta4 [July 14, 2000] + +Version 1.0.8beta4 [July 14, 2000] Added the files pngbar.png and pngbar.jpg to the distribution. Added makefile.cygwin, and cygwin support in pngconf.h Added PNG_NO_ZALLOC_ZERO macro (makes png_zalloc skip zeroing memory) -version 1.0.8rc1 [July 16, 2000] + +Version 1.0.8rc1 [July 16, 2000] Revised png_debug() macros and statements to eliminate compiler warnings. -version 1.0.8 [July 24, 2000] +Version 1.0.8 [July 24, 2000] Added png_flush() in pngwrite.c, after png_write_IEND(). Updated makefile.hpux to build a shared library. -version 1.0.9beta1 [November 10, 2000] + +Version 1.0.9beta1 [November 10, 2000] Fixed typo in scripts/makefile.hpux Updated makevms.com in scripts and contrib/* and contrib/* (Martin Zinser) Fixed seqence-point bug in contrib/pngminus/png2pnm (Martin Zinser) @@ -876,59 +950,72 @@ version 1.0.9beta1 [November 10, 2000] Revised makefile.cygwin Fixed bugs in iCCP support in pngrutil.c and pngwutil.c. Replaced png_set_empty_plte_permitted() with png_permit_mng_features(). -version 1.0.9beta2 [November 19, 2000] + +Version 1.0.9beta2 [November 19, 2000] Renamed the "dll" subdirectory "projects". Added borland project files to "projects" subdirectory. Set VS_FF_PRERELEASE and VS_FF_PATCHED flags in msvc/png.rc when appropriate. Add error message in png_set_compression_buffer_size() when malloc fails. -version 1.0.9beta3 [November 23, 2000] + +Version 1.0.9beta3 [November 23, 2000] Revised PNG_LIBPNG_BUILD_TYPE macro in png.h, used in the msvc project. Removed the png_flush() in pngwrite.c that crashes some applications that don't set png_output_flush_fn. Added makefile.macosx and makefile.aix to scripts directory. -version 1.0.9beta4 [December 1, 2000] + +Version 1.0.9beta4 [December 1, 2000] Change png_chunk_warning to png_warning in png_check_keyword(). Increased the first part of msg buffer from 16 to 18 in png_chunk_error(). -version 1.0.9beta5 [December 15, 2000] + +Version 1.0.9beta5 [December 15, 2000] Added support for filter method 64 (for PNG datastreams embedded in MNG). -version 1.0.9beta6 [December 18, 2000] + +Version 1.0.9beta6 [December 18, 2000] Revised png_set_filter() to accept filter method 64 when appropriate. Added new PNG_HAVE_PNG_SIGNATURE bit to png_ptr->mode and use it to help prevent applications from using MNG features in PNG datastreams. Added png_permit_mng_features() function. Revised libpng.3/libpng.txt. Changed "filter type" to "filter method". -version 1.0.9rc1 [December 23, 2000] + +Version 1.0.9rc1 [December 23, 2000] Revised test for PNG_HAVE_PNG_SIGNATURE in pngrutil.c Fixed error handling of unknown compression type in png_decompress_chunk(). In pngconf.h, define __cdecl when _MSC_VER is defined. -version 1.0.9beta7 [December 28, 2000] + +Version 1.0.9beta7 [December 28, 2000] Changed PNG_TEXT_COMPRESSION_zTXt to PNG_COMPRESSION_TYPE_BASE several places. Revised memory management in png_set_hIST and png_handle_hIST in a backward compatible manner. PLTE and tRNS were revised similarly. Revised the iCCP chunk reader to ignore trailing garbage. -version 1.0.9beta8 [January 12, 2001] + +Version 1.0.9beta8 [January 12, 2001] Moved pngasmrd.h into pngconf.h. Improved handling of out-of-spec garbage iCCP chunks generated by PhotoShop. -version 1.0.9beta9 [January 15, 2001] + +Version 1.0.9beta9 [January 15, 2001] Added png_set_invalid, png_permit_mng_features, and png_mmx_supported to wince and msvc project module definition files. Minor revision of makefile.cygwin. Fixed bug with progressive reading of narrow interlaced images in pngpread.c -version 1.0.9beta10 [January 16, 2001] + +Version 1.0.9beta10 [January 16, 2001] Do not typedef png_FILE_p in pngconf.h when PNG_NO_STDIO is defined. Fixed "png_mmx_supported" typo in project definition files. -version 1.0.9beta11 [January 19, 2001] + +Version 1.0.9beta11 [January 19, 2001] Updated makefile.sgi to make shared library. Removed png_mmx_support() function and disabled PNG_MNG_FEATURES_SUPPORTED by default, for the benefit of DLL forward compatibility. These will be re-enabled in version 1.2.0. -version 1.0.9rc2 [January 22, 2001] + +Version 1.0.9rc2 [January 22, 2001] Revised cygwin support. -version 1.0.9 [January 31, 2001] +Version 1.0.9 [January 31, 2001] Added check of cygwin's ALL_STATIC in pngconf.h Added "-nommx" parameter to contrib/gregbook/rpng2-win and rpng2-x demos. -version 1.0.10beta1 [March 14, 2001] + +Version 1.0.10beta1 [March 14, 2001] Revised makefile.dec, makefile.sgi, and makefile.sggcc; added makefile.hpgcc. Reformatted libpng.3 to eliminate bad line breaks. Added checks for _mmx_supported in the read_filter_row function of pnggccrd.c @@ -941,33 +1028,39 @@ version 1.0.10beta1 [March 14, 2001] Fixed bugs in png_combine_row() in pnggccrd.c and pngvcrd.c (C version) Added warnings when retrieving or setting gamma=0. Increased the first part of msg buffer from 16 to 18 in png_chunk_warning(). -version 1.0.10rc1 [March 23, 2001] + +Version 1.0.10rc1 [March 23, 2001] Changed all instances of memcpy, strcpy, and strlen to png_memcpy, png_strcpy, and png_strlen. Revised png_mmx_supported() function in pnggccrd.c to return proper value. Fixed bug in progressive reading (pngpread.c) with small images (height < 8). -version 1.0.10 [March 30, 2001] +Version 1.0.10 [March 30, 2001] Deleted extraneous space (introduced in 1.0.9) from line 42 of makefile.cygwin Added beos project files (Chris Herborth) -version 1.0.11beta1 [April 3, 2001] + +Version 1.0.11beta1 [April 3, 2001] Added type casts on several png_malloc() calls (Dimitri Papadapoulos). Removed a no-longer needed AIX work-around from pngconf.h Changed several "//" single-line comments to C-style in pnggccrd.c -version 1.0.11beta2 [April 11, 2001] + +Version 1.0.11beta2 [April 11, 2001] Removed PNGAPI from several functions whose prototypes did not have PNGAPI. Updated scripts/pngos2.def -version 1.0.11beta3 [April 14, 2001] + +Version 1.0.11beta3 [April 14, 2001] Added checking the results of many instances of png_malloc() for NULL -version 1.0.11beta4 [April 20, 2001] + +Version 1.0.11beta4 [April 20, 2001] Undid the changes from version 1.0.11beta3. Added a check for NULL return from user's malloc_fn(). Removed some useless type casts of the NULL pointer. Added makefile.netbsd -version 1.0.11 [April 27, 2001] +Version 1.0.11 [April 27, 2001] Revised makefile.netbsd -version 1.0.12beta1 [May 14, 2001] + +Version 1.0.12beta1 [May 14, 2001] Test for Windows platform in pngconf.h when including malloc.h (Emmanuel Blot) Updated makefile.cygwin and handling of Cygwin's ALL_STATIC in pngconf.h Added some never-to-be-executed code in pnggccrd.c to quiet compiler warnings. @@ -975,21 +1068,25 @@ version 1.0.12beta1 [May 14, 2001] libpng will reallocate the png_struct and info_struct if they are too small. This retains future binary compatibility for old applications written for libpng-0.88 and earlier. -version 1.2.0beta1 [May 6, 2001] + +Version 1.2.0beta1 [May 6, 2001] Bumped DLLNUM to 2. Re-enabled PNG_MNG_FEATURES_SUPPORTED and enabled PNG_ASSEMBLER_CODE_SUPPORTED by default. Added runtime selection of MMX features. Added png_set_strip_error_numbers function and related macros. -version 1.2.0beta2 [May 7, 2001] + +Version 1.2.0beta2 [May 7, 2001] Finished merging 1.2.0beta1 with version 1.0.11 Added a check for attempts to read or write PLTE in grayscale PNG datastreams. -version 1.2.0beta3 [May 17, 2001] + +Version 1.2.0beta3 [May 17, 2001] Enabled user memory function by default. Modified png_create_struct so it passes user mem_ptr to user memory allocator. Increased png_mng_features flag from png_byte to png_uint_32. Bumped shared-library (so-number) and dll-number to 3. -version 1.2.0beta4 [June 23, 2001] + +Version 1.2.0beta4 [June 23, 2001] Check for missing profile length field in iCCP chunk and free chunk_data in case of truncated iCCP chunk. Bumped shared-library number to 3 in makefile.sgi and makefile.sggcc @@ -1003,7 +1100,8 @@ version 1.2.0beta4 [June 23, 2001] of png_write_oFFS width and height from png_uint_32 to png_int_32. Updated example.c Revised prototypes for png_debug_malloc and png_debug_free in pngtest.c -version 1.2.0beta5 [August 8, 2001] + +Version 1.2.0beta5 [August 8, 2001] Revised contrib/gregbook Revised makefile.gcmmx Revised pnggccrd.c to conditionally compile some thread-unsafe code only @@ -1014,27 +1112,32 @@ version 1.2.0beta5 [August 8, 2001] Replaced calls to fprintf(stderr,...) with png_warning() in pnggccrd.c Removed restriction that do_invert_mono only operate on 1-bit opaque files -version 1.2.0 [September 1, 2001] +Version 1.2.0 [September 1, 2001] Changed a png_warning() to png_debug() in pnggccrd.c Fixed contrib/gregbook/rpng-x.c, rpng2-x.c to avoid crash with XFreeGC(). -version 1.2.1beta1 [October 19, 2001] + +Version 1.2.1beta1 [October 19, 2001] Revised makefile.std in contrib/pngminus Include background_1 in png_struct regardless of gamma support. Revised makefile.netbsd and makefile.macosx, added makefile.darwin. Revised example.c to provide more details about using row_callback(). -version 1.2.1beta2 [October 25, 2001] + +Version 1.2.1beta2 [October 25, 2001] Added type cast to each NULL appearing in a function call, except for WINCE functions. Added makefile.so9. -version 1.2.1beta3 [October 27, 2001] + +Version 1.2.1beta3 [October 27, 2001] Removed type casts from all NULLs. Simplified png_create_struct_2(). -version 1.2.1beta4 [November 7, 2001] + +Version 1.2.1beta4 [November 7, 2001] Revised png_create_info_struct() and png_creat_struct_2(). Added error message if png_write_info() was omitted. Type cast NULLs appearing in function calls when _NO_PROTO or PNG_TYPECAST_NULL is defined. -version 1.2.1rc1 [November 24, 2001] + +Version 1.2.1rc1 [November 24, 2001] Type cast NULLs appearing in function calls except when PNG_NO_TYPECAST_NULL is defined. Changed typecast of "size" argument to png_size_t in pngmem.c calls to @@ -1043,14 +1146,16 @@ version 1.2.1rc1 [November 24, 2001] Updated makefile.sgi to recognize LIBPATH and INCPATH. Updated various makefiles so "make clean" does not remove previous major version of the shared library. -version 1.2.1rc2 [December 4, 2001] + +Version 1.2.1rc2 [December 4, 2001] Always allocate 256-entry internal palette, hist, and trans arrays, to avoid out-of-bounds memory reference caused by invalid PNG datastreams. Added a check for prefix_length > data_length in iCCP chunk handler. -version 1.2.1 [December 7, 2001] +Version 1.2.1 [December 7, 2001] None. -version 1.2.2beta1 [February 22, 2002] + +Version 1.2.2beta1 [February 22, 2002] Fixed a bug with reading the length of iCCP profiles (Larry Reeves). Revised makefile.linux, makefile.gcmmx, and makefile.sgi to generate libpng.a, libpng12.so (not libpng.so.3), and libpng12/png.h @@ -1060,13 +1165,15 @@ version 1.2.2beta1 [February 22, 2002] Revised calls to png_create_read_struct() and png_create_write_struct() for simpler debugging. Revised png_zalloc() so zlib handles errors (uses PNG_FLAG_MALLOC_NULL_MEM_OK) -version 1.2.2beta2 [February 23, 2002] + +Version 1.2.2beta2 [February 23, 2002] Check chunk_length and idat_size for invalid (over PNG_MAX_UINT) lengths. Check for invalid image dimensions in png_get_IHDR. Added missing "fi;" in the install target of the SGI makefiles. Added install-static to all makefiles that make shared libraries. Always do gamma compensation when image is partially transparent. -version 1.2.2beta3 [March 7, 2002] + +Version 1.2.2beta3 [March 7, 2002] Compute background.gray and background_1.gray even when color_type is RGB in case image gets reduced to gray later. Modified shared-library makefiles to install pkgconfig/libpngNN.pc. @@ -1076,12 +1183,14 @@ version 1.2.2beta3 [March 7, 2002] Added install-shared target to all makefiles that make shared libraries. Stopped a double free of palette, hist, and trans when not using free_me. Added makefile.32sunu for Sun Ultra 32 and makefile.64sunu for Sun Ultra 64. -version 1.2.2beta4 [March 8, 2002] + +Version 1.2.2beta4 [March 8, 2002] Compute background.gray and background_1.gray even when color_type is RGB in case image gets reduced to gray later (Jason Summers). Relocated a misplaced /bin/rm in the "install-shared" makefile targets Added PNG_1_0_X macro which can be used to build a 1.0.x-compatible library. -version 1.2.2beta5 [March 26, 2002] + +Version 1.2.2beta5 [March 26, 2002] Added missing PNGAPI to several function definitions. Check for invalid bit_depth or color_type in png_get_IHDR(), and check for missing PLTE or IHDR in png_push_read_chunk() (Matthias Clasen). @@ -1090,33 +1199,45 @@ version 1.2.2beta5 [March 26, 2002] Changed "()" to "{}" in scripts/libpng.pc.in. Revised makefiles to put png.h and pngconf.h only in $prefix/include/libpngNN Revised makefiles to make symlink to libpng.so.NN in addition to libpngNN.so -version 1.2.2beta6 [March 31, 2002] -version 1.0.13beta1 [March 31, 2002] + +Version 1.2.2beta6 [March 31, 2002] + +Version 1.0.13beta1 [March 31, 2002] Prevent png_zalloc() from trying to memset memory that it failed to acquire. Add typecasts of PNG_MAX_UINT in pngset_cHRM_fixed() (Matt Holgate). Ensure that the right function (user or default) is used to free the png_struct after an error in png_create_read_struct_2(). -version 1.2.2rc1 [April 7, 2002] -version 1.0.13rc1 [April 7, 2002] + +Version 1.2.2rc1 [April 7, 2002] + +Version 1.0.13rc1 [April 7, 2002] Save the ebx register in pnggccrd.c (Sami Farin) Add "mem_ptr = png_ptr->mem_ptr" in png_destroy_write_struct() (Paul Gardner). Updated makefiles to put headers in include/libpng and remove old include/*.h. -version 1.2.2 [April 15, 2002] -version 1.0.13 [April 15, 2002] +Version 1.2.2 [April 15, 2002] + +Version 1.0.13 [April 15, 2002] Revised description of png_set_filter() in libpng.3/libpng.txt. Revised makefile.netbsd and added makefile.neNNbsd and makefile.freebsd -version 1.0.13patch01 [April 17, 2002] -version 1.2.2patch01 [April 17, 2002] - Changed ${PNGMAJ}.${PNGVER} bug to ${PNGVER} in makefile.sgi and makefile.sggcc - Fixed VER -> PNGVER typo in makefile.macosx and added install-static to install + +Version 1.0.13patch01 [April 17, 2002] + +Version 1.2.2patch01 [April 17, 2002] + Changed ${PNGMAJ}.${PNGVER} bug to ${PNGVER} in makefile.sgi and + makefile.sggcc + Fixed VER -> PNGVER typo in makefile.macosx and added install-static to + install Added install: target to makefile.32sunu and makefile.64sunu -version 1.0.13patch03 [April 18, 2002] -version 1.2.2patch03 [April 18, 2002] + +Version 1.0.13patch03 [April 18, 2002] + +Version 1.2.2patch03 [April 18, 2002] Revised 15 makefiles to link libpng.a to libpngNN.a and the include libpng subdirectory to libpngNN subdirectory without the full pathname. Moved generation of libpng.pc from "install" to "all" in 15 makefiles. -version 1.2.3rc1 [April 28, 2002] + +Version 1.2.3rc1 [April 28, 2002] Added install-man target to 15 makefiles (Dimitri Papadopolous-Orfanos). Added $(DESTDIR) feature to 24 makefiles (Tim Mooney) Fixed bug with $prefix, should be $(prefix) in makefile.hpux. @@ -1128,70 +1249,83 @@ version 1.2.3rc1 [April 28, 2002] to put one in their application. Restored png_zalloc() and png_zfree() prototypes to version 1.2.1 and removed them from module definition files. -version 1.2.3rc2 [May 1, 2002] + +Version 1.2.3rc2 [May 1, 2002] Fixed bug in reporting number of channels in pngget.c and pngset.c, that was introduced in version 1.2.2beta5. Exported png_zalloc(), png_zfree(), png_default_read(), png_default_write(), png_default_flush(), and png_push_fill_buffer() and included them in module definition files. Added "libpng.pc" dependency to the "install-shared" target in 15 makefiles. -version 1.2.3rc3 [May 1, 2002] + +Version 1.2.3rc3 [May 1, 2002] Revised prototype for png_default_flush() Remove old libpng.pc and libpngNN.pc before installing new ones. -version 1.2.3rc4 [May 2, 2002] + +Version 1.2.3rc4 [May 2, 2002] Typos in *.def files (png_default_read|write -> png_default_read|write_data) In makefiles, changed rm libpng.NN.pc to rm libpngNN.pc - Added libpng-config and libpngNN-config and modified makefiles to install them. + Added libpng-config and libpngNN-config and modified makefiles to install + them. Changed $(MANPATH) to $(DESTDIR)$(MANPATH) in makefiles Added "Win32 DLL VB" configuration to projects/msvc/libpng.dsp -version 1.2.3rc5 [May 11, 2002] + +Version 1.2.3rc5 [May 11, 2002] Changed "error" and "message" in prototypes to "error_message" and "warning_message" to avoid namespace conflict. Revised 15 makefiles to build libpng-config from libpng-config-*.in Once more restored png_zalloc and png_zfree to regular nonexported form. Restored png_default_read|write_data, png_default_flush, png_read_fill_buffer - to nonexported form, but with PNGAPI, and removed them from module def files. -version 1.2.3rc6 [May 14, 2002] + to nonexported form, but with PNGAPI, and removed them from module def + files. + +Version 1.2.3rc6 [May 14, 2002] Removed "PNGAPI" from png_zalloc() and png_zfree() in png.c Changed "Gz" to "Gd" in projects/msvc/libpng.dsp and zlib.dsp. Removed leftover libpng-config "sed" script from four makefiles. Revised libpng-config creating script in 16 makefiles. -version 1.2.3 [May 22, 2002] +Version 1.2.3 [May 22, 2002] Revised libpng-config target in makefile.cygwin. Removed description of png_set_mem_fn() from documentation. Revised makefile.freebsd. Minor cosmetic changes to 15 makefiles, e.g., $(DI) = $(DESTDIR)/$(INCDIR). Revised projects/msvc/README.txt Changed -lpng to -lpngNN in LDFLAGS in several makefiles. -version 1.2.4beta1 [May 24, 2002] + +Version 1.2.4beta1 [May 24, 2002] Added libpng.pc and libpng-config to "all:" target in 16 makefiles. Fixed bug in 16 makefiles: $(DESTDIR)/$(LIBPATH) to $(DESTDIR)$(LIBPATH) Added missing "\" before closing double quote in makefile.gcmmx. Plugged various memory leaks; added png_malloc_warn() and png_set_text_2() functions. -version 1.2.4beta2 [June 25, 2002] + +Version 1.2.4beta2 [June 25, 2002] Plugged memory leak of png_ptr->current_text (Matt Holgate). Check for buffer overflow before reading CRC in pngpread.c (Warwick Allison) Added -soname to the loader flags in makefile.dec, makefile.sgi, and makefile.sggcc. Added "test-installed" target to makefile.linux, makefile.gcmmx, makefile.sgi, and makefile.sggcc. -version 1.2.4beta3 [June 28, 2002] + +Version 1.2.4beta3 [June 28, 2002] Plugged memory leak of row_buf in pngtest.c when there is a png_error(). Detect buffer overflow in pngpread.c when IDAT is corrupted with extra data. Added "test-installed" target to makefile.32sunu, makefile.64sunu, makefile.beos, makefile.darwin, makefile.dec, makefile.macosx, makefile.solaris, makefile.hpux, makefile.hpgcc, and makefile.so9. -version 1.2.4rc1 and 1.0.14rc1 [July 2, 2002] + +Version 1.2.4rc1 and 1.0.14rc1 [July 2, 2002] Added "test-installed" target to makefile.cygwin and makefile.sco. Revised pnggccrd.c to be able to back out version 1.0.x via PNG_1_0_X macro. -version 1.2.4 and 1.0.14 [July 8, 2002] +Version 1.2.4 and 1.0.14 [July 8, 2002] Changed png_warning() to png_error() when width is too large to process. -version 1.2.4patch01 [July 20, 2002] + +Version 1.2.4patch01 [July 20, 2002] Revised makefile.cygwin to use DLL number 12 instead of 13. -version 1.2.5beta1 [August 6, 2002] + +Version 1.2.5beta1 [August 6, 2002] Added code to contrib/gregbook/readpng2.c to ignore unused chunks. Replaced toucan.png in contrib/gregbook (it has been corrupt since 1.0.11) Removed some stray *.o files from contrib/gregbook. @@ -1200,36 +1334,43 @@ version 1.2.5beta1 [August 6, 2002] Prevent png_ptr->pass from exceeding 7 in png_push_finish_row(). Updated makefile.hpgcc Updated png.c and pnggccrd.c handling of return from png_mmx_support() -version 1.2.5beta2 [August 15, 2002] + +Version 1.2.5beta2 [August 15, 2002] Only issue png_warning() about "Too much data" in pngpread.c when avail_in is nonzero. Updated makefiles to install a separate libpng.so.3 with its own rpath. -version 1.2.5rc1 and 1.0.15rc1 [August 24, 2002] + +Version 1.2.5rc1 and 1.0.15rc1 [August 24, 2002] Revised makefiles to not remove previous minor versions of shared libraries. -version 1.2.5rc2 and 1.0.15rc2 [September 16, 2002] + +Version 1.2.5rc2 and 1.0.15rc2 [September 16, 2002] Revised 13 makefiles to remove "-lz" and "-L$(ZLIBLIB)", etc., from shared library loader directive. Added missing "$OBJSDLL" line to makefile.gcmmx. Added missing "; fi" to makefile.32sunu. -version 1.2.5rc3 and 1.0.15rc3 [September 18, 2002] + +Version 1.2.5rc3 and 1.0.15rc3 [September 18, 2002] Revised libpng-config script. -version 1.2.5 and 1.0.15 [October 3, 2002] +Version 1.2.5 and 1.0.15 [October 3, 2002] Revised makefile.macosx, makefile.darwin, makefile.hpgcc, and makefile.hpux, and makefile.aix. Relocated two misplaced PNGAPI lines in pngtest.c -version 1.2.6beta1 [October 22, 2002] + +Version 1.2.6beta1 [October 22, 2002] Commented out warning about uninitialized mmx_support in pnggccrd.c. Changed "IBMCPP__" flag to "__IBMCPP__" in pngconf.h. Relocated two more misplaced PNGAPI lines in pngtest.c Fixed memory overrun bug in png_do_read_filler() with 16-bit datastreams, introduced in version 1.0.2. Revised makefile.macosx, makefile.dec, makefile.aix, and makefile.32sunu. -version 1.2.6beta2 [November 1, 2002] + +Version 1.2.6beta2 [November 1, 2002] Added libpng-config "--ldopts" output. Added "AR=ar" and "ARFLAGS=rc" and changed "ar rc" to "$(AR) $(ARFLAGS)" in makefiles. -version 1.2.6beta3 [July 18, 2004] + +Version 1.2.6beta3 [July 18, 2004] Reverted makefile changes from version 1.2.6beta2 and some of the changes from version 1.2.6beta1; these will be postponed until version 1.2.7. Version 1.2.6 is going to be a simple bugfix release. @@ -1282,7 +1423,8 @@ version 1.2.6beta3 [July 18, 2004] Updated contrib/visupng/VisualPng.dsp (Cosmin). Updated contrib/visupng/cexcept.h to version 2.0.0 (Cosmin). Added a separate distribution with "configure" and supporting files (Junichi). -version 1.2.6beta4 [July 28, 2004] + +Version 1.2.6beta4 [July 28, 2004] Added user ability to change png_size_t via a PNG_SIZE_T macro. Added png_sizeof() and png_convert_size() functions. Added PNG_SIZE_MAX (maximum value of a png_size_t variable. @@ -1304,7 +1446,8 @@ version 1.2.6beta4 [July 28, 2004] Added some "#if PNG_WRITE_SUPPORTED" blocks. Added #ifdef to remove some redundancy in png_malloc_default(). Use png_malloc instead of png_zalloc to allocate the pallete. -version 1.0.16rc1 and 1.2.6rc1 [August 4, 2004] + +Version 1.0.16rc1 and 1.2.6rc1 [August 4, 2004] Fixed buffer overflow vulnerability in png_handle_tRNS() Fixed integer arithmetic overflow vulnerability in png_read_png(). Fixed some harmless bugs in png_handle_sBIT, etc, that would cause @@ -1319,7 +1462,8 @@ version 1.0.16rc1 and 1.2.6rc1 [August 4, 2004] Fixed wrong cast of returns from png_get_user_width|height_max(). Changed some "keep the compiler happy" from empty statements to returns, Revised libpng.txt to remove 1.2.x stuff from the 1.0.x distribution -version 1.0.16rc2 and 1.2.6rc2 [August 7, 2004] + +Version 1.0.16rc2 and 1.2.6rc2 [August 7, 2004] Revised makefile.darwin and makefile.solaris. Removed makefile.macosx. Revised pngtest's png_debug_malloc() to use png_malloc() instead of png_malloc_default() which is not supposed to be exported. @@ -1333,91 +1477,106 @@ version 1.0.16rc2 and 1.2.6rc2 [August 7, 2004] Changed "HANDLE_CHUNK_*" to "PNG_HANDLE_CHUNK_*" (Cosmin) Added "-@/bin/rm -f $(DL)/$(LIBNAME).so.$(PNGMAJ)" to 15 *NIX makefiles. Added code to update the row_info->colortype in png_do_read_filler() (MSB). -version 1.0.16rc3 and 1.2.6rc3 [August 9, 2004] + +Version 1.0.16rc3 and 1.2.6rc3 [August 9, 2004] Eliminated use of "abs()" in testing cHRM and gAMA values, to avoid trouble with some 64-bit compilers. Created PNG_OUT_OF_RANGE() macro. Revised documentation of png_set_keep_unknown_chunks(). Check handle_as_unknown status in pngpread.c, as in pngread.c previously. Moved "PNG_HANDLE_CHUNK_*" macros out of PNG_INTERNAL section of png.h Added "rim" definitions for CONST4 and CONST6 in pnggccrd.c -version 1.0.16rc4 and 1.2.6rc4 [August 10, 2004] + +Version 1.0.16rc4 and 1.2.6rc4 [August 10, 2004] Fixed mistake in pngtest.c introduced in 1.2.6rc2 (declaration of "pinfo" was out of place). -version 1.0.16rc5 and 1.2.6rc5 [August 10, 2004] + +Version 1.0.16rc5 and 1.2.6rc5 [August 10, 2004] Moved "PNG_HANDLE_CHUNK_*" macros out of PNG_ASSEMBLER_CODE_SUPPORTED section of png.h where they were inadvertently placed in version rc3. -version 1.2.6 and 1.0.16 [August 15, 2004] +Version 1.2.6 and 1.0.16 [August 15, 2004] Revised pngtest so memory allocation testing is only done when PNG_DEBUG==1. -version 1.2.7beta1 [August 26, 2004] + +Version 1.2.7beta1 [August 26, 2004] Removed unused pngasmrd.h file. Removed references to uu.net for archived files. Added references to PNG Spec (second edition) and the PNG ISO/IEC Standard. Added "test-dd" target in 15 makefiles, to run pngtest in DESTDIR. Fixed bug with "optimized window size" in the IDAT datastream, that causes libpng to write PNG files with incorrect zlib header bytes. -version 1.2.7beta2 [August 28, 2004] + +Version 1.2.7beta2 [August 28, 2004] Fixed bug with sCAL chunk and big-endian machines (David Munro). Undid new code added in 1.2.6rc2 to update the color_type in png_set_filler(). Added png_set_add_alpha() that updates color type. -version 1.0.17rc1 and 1.2.7rc1 [September 4, 2004] + +Version 1.0.17rc1 and 1.2.7rc1 [September 4, 2004] Revised png_set_strip_filler() to not remove alpha if color_type has alpha. -version 1.2.7 and 1.0.17 [September 12, 2004] +Version 1.2.7 and 1.0.17 [September 12, 2004] Added makefile.hp64 Changed projects/msvc/png32ms.def to scripts/png32ms.def in makefile.cygwin -version 1.2.8beta1 [November 1, 2004] + +Version 1.2.8beta1 [November 1, 2004] Fixed bug in png_text_compress() that would fail to complete a large block. Fixed bug, introduced in libpng-1.2.7, that overruns a buffer during strip alpha operation in png_do_strip_filler(). Added PNG_1_2_X definition in pngconf.h Use #ifdef to comment out png_info_init in png.c and png_read_init in pngread.c (as of 1.3.0) -version 1.2.8beta2 [November 2, 2004] + +Version 1.2.8beta2 [November 2, 2004] Reduce color_type to a nonalpha type after strip alpha operation in png_do_strip_filler(). -version 1.2.8beta3 [November 3, 2004] + +Version 1.2.8beta3 [November 3, 2004] Revised definitions of PNG_MAX_UINT_32, PNG_MAX_SIZE, and PNG_MAXSUM -version 1.2.8beta4 [November 12, 2004] + +Version 1.2.8beta4 [November 12, 2004] Fixed (again) definition of PNG_LIBPNG_VER_DLLNUM in png.h (Cosmin). Added PNG_LIBPNG_BUILD_PRIVATE in png.h (Cosmin). Set png_ptr->zstream.data_type to Z_BINARY, to avoid unnecessary detection of data type in deflate (Cosmin). Deprecated but continue to support SPECIALBUILD and PRIVATEBUILD in favor of PNG_LIBPNG_BUILD_SPECIAL_STRING and PNG_LIBPNG_BUILD_PRIVATE_STRING. -version 1.2.8beta5 [November 20, 2004] + +Version 1.2.8beta5 [November 20, 2004] Use png_ptr->flags instead of png_ptr->transformations to pass PNG_STRIP_ALPHA info to png_do_strip_filler(), to preserve ABI compatibility. Revised handling of SPECIALBUILD, PRIVATEBUILD, PNG_LIBPNG_BUILD_SPECIAL_STRING and PNG_LIBPNG_BUILD_PRIVATE_STRING. -version 1.2.8rc1 [November 24, 2004] + +Version 1.2.8rc1 [November 24, 2004] Moved handling of BUILD macros from pngconf.h to png.h Added definition of PNG_LIBPNG_BASE_TYPE in png.h, inadvertently omitted from beta5. Revised scripts/pngw32.rc Despammed mailing addresses by masking "@" with "at". Inadvertently installed a supposedly faster test version of pngrutil.c -version 1.2.8rc2 [November 26, 2004] + +Version 1.2.8rc2 [November 26, 2004] Added two missing "\" in png.h Change tests in pngread.c and pngpread.c to if (png_ptr->transformations || (png_ptr->flags&PNG_FLAG_STRIP_ALPHA)) png_do_read_transformations(png_ptr); -version 1.2.8rc3 [November 28, 2004] + +Version 1.2.8rc3 [November 28, 2004] Reverted pngrutil.c to version libpng-1.2.8beta5. Added scripts/makefile.elf with supporting code in pngconf.h for symbol versioning (John Bowler). -version 1.2.8rc4 [November 29, 2004] + +Version 1.2.8rc4 [November 29, 2004] Added projects/visualc7 (Simon-pierre). -version 1.2.8rc5 [November 29, 2004] + +Version 1.2.8rc5 [November 29, 2004] Fixed new typo in scripts/pngw32.rc -version 1.2.8 [December 3, 2004] +Version 1.2.8 [December 3, 2004] Removed projects/visualc7, added projects/visualc71. -version 1.2.9beta1 [February 21, 2006] - +Version 1.2.9beta1 [February 21, 2006] Initialized some structure members in pngwutil.c to avoid gcc-4.0.0 complaints Revised man page and libpng.txt to make it clear that one should not call png_read_end or png_write_end after png_read_png or png_write_png. @@ -1439,8 +1598,7 @@ version 1.2.9beta1 [February 21, 2006] Fixed scripts/makefile.cygwin (Christian Biesinger, Cosmin). Default iTXt support was inadvertently enabled. -version 1.2.9beta2 [February 21, 2006] - +Version 1.2.9beta2 [February 21, 2006] Check for png_rgb_to_gray and png_gray_to_rgb read transformations before checking for png_read_dither in pngrtran.c Revised checking of chromaticity limits to accommodate extended RGB @@ -1453,8 +1611,7 @@ version 1.2.9beta2 [February 21, 2006] Eliminated distributions without the "configure" script. Updated INSTALL instructions. -version 1.2.9beta3 [February 24, 2006] - +Version 1.2.9beta3 [February 24, 2006] Fixed CRCRLF line endings in contrib/visupng/VisualPng.dsp Made libpng.pc respect EXEC_PREFIX (D. P. Kreil, J. Bowler) Removed reference to pngasmrd.h from Makefile.am @@ -1463,8 +1620,7 @@ version 1.2.9beta3 [February 24, 2006] Renamed ANNOUNCE to NEWS. Created AUTHORS file. -version 1.2.9beta4 [March 3, 2006] - +Version 1.2.9beta4 [March 3, 2006] Changed definition of PKGCONFIG from $prefix/lib to $libdir in configure.ac Reverted to filenames LICENSE and ANNOUNCE; removed AUTHORS and COPYING. Removed newline from the end of some error and warning messages. @@ -1475,17 +1631,17 @@ version 1.2.9beta4 [March 3, 2006] Added "OS2" to list of systems that don't need underscores, in pnggccrd.c Removed libpng version and date from *.c files. -version 1.2.9beta5 [March 4, 2006] +Version 1.2.9beta5 [March 4, 2006] Removed trailing blanks from source files. Put version and date of latest change in each source file, and changed copyright year accordingly. - More cleanup of configure.ac, Makefile.ac, and associated scripts. + More cleanup of configure.ac, Makefile.am, and associated scripts. Restored scripts/makefile.elf which was inadvertently deleted. -version 1.2.9beta6 [March 6, 2006] +Version 1.2.9beta6 [March 6, 2006] Fixed typo (RELEASE) in configuration files. -version 1.2.9beta7 [March 7, 2006] +Version 1.2.9beta7 [March 7, 2006] Removed libpng.vers and libpng.sym from libpng12_la_SOURCES in Makefile.am Fixed inconsistent #ifdef's around png_sig_bytes() and png_set_sCAL_s() in png.h. @@ -1493,7 +1649,7 @@ version 1.2.9beta7 [March 7, 2006] Made cosmetic changes to some makefiles, adding LN_SF and other macros. Made some makefiles accept "exec_prefix". -version 1.2.9beta8 [March 9, 2006] +Version 1.2.9beta8 [March 9, 2006] Fixed some "#if defined (..." which should be "#if defined(..." Bug introduced in libpng-1.2.8. Fixed inconsistency in definition of png_default_read_data() @@ -1504,82 +1660,82 @@ version 1.2.9beta8 [March 9, 2006] Added png_set_expand_gray_1_2_4_to_8() and deprecated png_set_gray_1_2_4_to_8() which also expands tRNS to alpha. -version 1.2.9beta9 [March 10, 2006] +Version 1.2.9beta9 [March 10, 2006] Include "config.h" in pngconf.h when available. Added some checks for NULL png_ptr or NULL info_ptr (timeless) -version 1.2.9beta10 [March 20, 2006] +Version 1.2.9beta10 [March 20, 2006] Removed extra CR from contrib/visualpng/VisualPng.dsw (Cosmin) Made pnggccrd.c PIC-compliant (Christian Aichinger). Added makefile.mingw (Wolfgang Glas). Revised pngconf.h MMX checking. -version 1.2.9beta11 [March 22, 2006] +Version 1.2.9beta11 [March 22, 2006] Fixed out-of-order declaration in pngwrite.c that was introduced in beta9 Simplified some makefiles by using LIBSO, LIBSOMAJ, and LIBSOVER macros. -version 1.2.9rc1 [March 31, 2006] +Version 1.2.9rc1 [March 31, 2006] Defined PNG_USER_PRIVATEBUILD when including "pngusr.h" (Cosmin). Removed nonsensical assertion check from pngtest.c (Cosmin). -version 1.2.9 [April 14, 2006] +Version 1.2.9 [April 14, 2006] Revised makefile.beos and added "none" selector in ltmain.sh -version 1.2.10beta1 [April 15, 2006] +Version 1.2.10beta1 [April 15, 2006] Renamed "config.h" to "png_conf.h" and revised Makefile.am to add -DPNG_BUILDING_LIBPNG to compile directive, and modified pngconf.h to include png_conf.h only when PNG_BUILDING_LIBPNG is defined. -version 1.2.10beta2 [April 15, 2006] +Version 1.2.10beta2 [April 15, 2006] Manually updated Makefile.in and configure. Changed png_conf.h.in back to config.h. -version 1.2.10beta3 [April 15, 2006] +Version 1.2.10beta3 [April 15, 2006] Change png_conf.h back to config.h in pngconf.h. -version 1.2.10beta4 [April 16, 2006] +Version 1.2.10beta4 [April 16, 2006] Change PNG_BUILDING_LIBPNG to PNG_CONFIGURE_LIBPNG in config/Makefile*. -version 1.2.10beta5 [April 16, 2006] +Version 1.2.10beta5 [April 16, 2006] Added a configure check for compiling assembler code in pnggccrd.c -version 1.2.10beta6 [April 17, 2006] +Version 1.2.10beta6 [April 17, 2006] Revised the configure check for pnggccrd.c Moved -DPNG_CONFIGURE_LIBPNG into @LIBPNG_DEFINES@ Added @LIBPNG_DEFINES@ to arguments when building libpng.sym -version 1.2.10beta7 [April 18, 2006] +Version 1.2.10beta7 [April 18, 2006] Change "exec_prefix=$prefix" to "exec_prefix=$(prefix)" in makefiles. -version 1.2.10rc1 [April 19, 2006] +Version 1.2.10rc1 [April 19, 2006] Ensure pngconf.h doesn't define both PNG_USE_PNGGCCRD and PNG_USE_PNGVCRD Fixed "LN_FS" typo in makefile.sco and makefile.solaris. -version 1.2.10rc2 [April 20, 2006] +Version 1.2.10rc2 [April 20, 2006] Added a backslash between -DPNG_CONFIGURE_LIBPNG and -DPNG_NO_ASSEMBLER_CODE in configure.ac and configure Made the configure warning about versioned symbols less arrogant. -version 1.2.10rc3 [April 21, 2006] +Version 1.2.10rc3 [April 21, 2006] Added a note in libpng.txt that png_set_sig_bytes(8) can be used when writing an embedded PNG without the 8-byte signature. Revised makefiles and configure to avoid making links to libpng.so.* -version 1.2.10 [April 23, 2006] +Version 1.2.10 [April 23, 2006] Reverted configure to "rc2" state. -version 1.2.11beta1 [May 31, 2006] +Version 1.2.11beta1 [May 31, 2006] scripts/libpng.pc.in contained "configure" style version info and would not work with makefiles. The shared-library makefiles were linking to libpng.so.0 instead of libpng.so.3 compatibility as the library. -version 1.2.11beta2 [June 2, 2006] +Version 1.2.11beta2 [June 2, 2006] Increased sprintf buffer from 50 to 52 chars in pngrutil.c to avoid buffer overflow. Fixed bug in example.c (png_set_palette_rgb -> png_set_palette_to_rgb) -version 1.2.11beta3 [June 5, 2006] +Version 1.2.11beta3 [June 5, 2006] Prepended "#! /bin/sh" to ltmail.sh and contrib/pngminus/*.sh (Cosmin). Removed the accidental leftover Makefile.in~ (Cosmin). Avoided potential buffer overflow and optimized buffer in @@ -1587,116 +1743,116 @@ version 1.2.11beta3 [June 5, 2006] Removed the include directories and libraries from CFLAGS and LDFLAGS in scripts/makefile.gcc (Nelson A. de Oliveira, Cosmin). -version 1.2.11beta4 [June 6, 2006] +Version 1.2.11beta4 [June 6, 2006] Allow zero-length IDAT chunks after the entire zlib datastream, but not after another intervening chunk type. -version 1.0.19rc1, 1.2.11rc1 [June 13, 2006] +Version 1.0.19rc1, 1.2.11rc1 [June 13, 2006] Deleted extraneous square brackets from [config.h] in configure.ac -version 1.0.19rc2, 1.2.11rc2 [June 14, 2006] +Version 1.0.19rc2, 1.2.11rc2 [June 14, 2006] Added prototypes for PNG_INCH_CONVERSIONS functions to png.h Revised INSTALL and autogen.sh Fixed typo in several makefiles (-W1 should be -Wl) Added typedef for png_int_32 and png_uint_32 on 64-bit systems. -version 1.0.19rc3, 1.2.11rc3 [June 15, 2006] +Version 1.0.19rc3, 1.2.11rc3 [June 15, 2006] Removed the new typedefs for 64-bit systems (delay until version 1.4.0) Added one zero element to png_gamma_shift[] array in pngrtran.c to avoid reading out of bounds. -version 1.0.19rc4, 1.2.11rc4 [June 15, 2006] +Version 1.0.19rc4, 1.2.11rc4 [June 15, 2006] Really removed the new typedefs for 64-bit systems. -version 1.0.19rc5, 1.2.11rc5 [June 22, 2006] +Version 1.0.19rc5, 1.2.11rc5 [June 22, 2006] Removed png_sig_bytes entry from scripts/pngw32.def -version 1.0.19, 1.2.11 [June 26, 2006] +Version 1.0.19, 1.2.11 [June 26, 2006] None. -version 1.0.20, 1.2.12 [June 27, 2006] +Version 1.0.20, 1.2.12 [June 27, 2006] Really increased sprintf buffer from 50 to 52 chars in pngrutil.c to avoid buffer overflow. -version 1.2.13beta1 [October 2, 2006] +Version 1.2.13beta1 [October 2, 2006] Removed AC_FUNC_MALLOC from configure.ac Work around Intel-Mac compiler bug by setting PNG_NO_MMX_CODE in pngconf.h Change "logical" to "bitwise" throughout documentation. Detect and fix attempt to write wrong iCCP profile length. -version 1.0.21, 1.2.13 [November 14, 2006] +Version 1.0.21, 1.2.13 [November 14, 2006] Fix potential buffer overflow in sPLT chunk handler. Fix Makefile.am to not try to link to noexistent files. Check all exported functions for NULL png_ptr. -version 1.2.14beta1 [November 17, 2006] +Version 1.2.14beta1 [November 17, 2006] Relocated three misplaced tests for NULL png_ptr. Built Makefile.in with automake-1.9.6 instead of 1.9.2. Build configure with autoconf-2.60 instead of 2.59 -version 1.2.14beta2 [November 17, 2006] +Version 1.2.14beta2 [November 17, 2006] Added some typecasts in png_zalloc(). -version 1.2.14rc1 [November 20, 2006] +Version 1.2.14rc1 [November 20, 2006] Changed "strtod" to "png_strtod" in pngrutil.c -version 1.0.22, 1.2.14 [November 27, 2006] +Version 1.0.22, 1.2.14 [November 27, 2006] Added missing "$(srcdir)" in Makefile.am and Makefile.in -version 1.2.15beta1 [December 3, 2006] +Version 1.2.15beta1 [December 3, 2006] Generated configure with autoconf-2.61 instead of 2.60 Revised configure.ac to update libpng.pc and libpng-config. -version 1.2.15beta2 [December 3, 2006] +Version 1.2.15beta2 [December 3, 2006] Always export MMX asm functions, just stubs if not building pnggccrd.c -version 1.2.15beta3 [December 4, 2006] +Version 1.2.15beta3 [December 4, 2006] Add "png_bytep" typecast to profile while calculating length in pngwutil.c -version 1.2.15beta4 [December 7, 2006] +Version 1.2.15beta4 [December 7, 2006] Added scripts/CMakeLists.txt Changed PNG_NO_ASSEMBLER_CODE to PNG_NO_MMX_CODE in scripts, like 1.4.0beta -version 1.2.15beta5 [December 7, 2006] +Version 1.2.15beta5 [December 7, 2006] Changed some instances of PNG_ASSEMBLER_* to PNG_MMX_* in pnggccrd.c Revised scripts/CMakeLists.txt -version 1.2.15beta6 [December 13, 2006] +Version 1.2.15beta6 [December 13, 2006] Revised scripts/CMakeLists.txt and configure.ac -version 1.2.15rc1 [December 18, 2006] +Version 1.2.15rc1 [December 18, 2006] Revised scripts/CMakeLists.txt -version 1.2.15rc2 [December 21, 2006] +Version 1.2.15rc2 [December 21, 2006] Added conditional #undef jmpbuf in pngtest.c to undo #define in AIX headers. Added scripts/makefile.nommx -version 1.2.15rc3 [December 25, 2006] +Version 1.2.15rc3 [December 25, 2006] Fixed shared library numbering error that was introduced in 1.2.15beta6. -version 1.2.15rc4 [December 27, 2006] +Version 1.2.15rc4 [December 27, 2006] Fixed handling of rgb_to_gray when png_ptr->color.gray isn't set. -version 1.2.15rc5 [December 31, 2006] +Version 1.2.15rc5 [December 31, 2006] Revised handling of rgb_to_gray. -version 1.2.15 [January 5, 2007] +Version 1.2.15 [January 5, 2007] Added some (unsigned long) typecasts in pngtest.c to avoid printing errors. -version 1.2.16beta1 [January 6, 2007] +Version 1.2.16beta1 [January 6, 2007] Fix bugs in makefile.nommx -version 1.2.16beta2 [January 16, 2007] +Version 1.2.16beta2 [January 16, 2007] Revised scripts/CMakeLists.txt -version 1.2.16 [January 31, 2007] +Version 1.2.16 [January 31, 2007] No changes. -version 1.2.17beta1 [March 6, 2007] +Version 1.2.17beta1 [March 6, 2007] Revised scripts/CMakeLists.txt to install both shared and static libraries. Deleted a redundant line from pngset.c. -version 1.2.17beta2 [April 26, 2007] +Version 1.2.17beta2 [April 26, 2007] Relocated misplaced test for png_ptr == NULL in pngpread.c Change "==" to "&" for testing PNG_RGB_TO_GRAY_ERR & PNG_RGB_TO_GRAY_WARN flags. @@ -1705,10 +1861,10 @@ version 1.2.17beta2 [April 26, 2007] Added "const" to some array declarations. Mention examples of libpng usage in the libpng*.txt and libpng.3 documents. -version 1.2.17rc1 [May 4, 2007] +Version 1.2.17rc1 [May 4, 2007] No changes. -version 1.2.17rc2 [May 8, 2007] +Version 1.2.17rc2 [May 8, 2007] Moved several PNG_HAVE_* macros out of PNG_INTERNAL because applications calling set_unknown_chunk_location() need them. Changed transformation flag from PNG_EXPAND_tRNS to PNG_EXPAND in @@ -1717,64 +1873,64 @@ version 1.2.17rc2 [May 8, 2007] can be free'ed in case of error. Revised unknown chunk handling in pngrutil.c and pngpread.c to use this structure. -version 1.2.17rc3 [May 8, 2007] +Version 1.2.17rc3 [May 8, 2007] Revised symbol-handling in configure script. -version 1.2.17rc4 [May 10, 2007] +Version 1.2.17rc4 [May 10, 2007] Revised unknown chunk handling to avoid storing unknown critical chunks. -version 1.0.25 [May 15, 2007] -version 1.2.17 [May 15, 2007] +Version 1.0.25 [May 15, 2007] +Version 1.2.17 [May 15, 2007] Added "png_ptr->num_trans=0" before error return in png_handle_tRNS, to eliminate a vulnerability (CVE-2007-2445, CERT VU#684664) -version 1.0.26 [May 15, 2007] -version 1.2.18 [May 15, 2007] +Version 1.0.26 [May 15, 2007] +Version 1.2.18 [May 15, 2007] Reverted the libpng-1.2.17rc3 change to symbol-handling in configure script -version 1.2.19beta1 [May 18, 2007] +Version 1.2.19beta1 [May 18, 2007] Changed "const static" to "static PNG_CONST" everywhere, mostly undoing change of libpng-1.2.17beta2. Changed other "const" to "PNG_CONST" Changed some handling of unused parameters, to avoid compiler warnings. "if (unused == NULL) return;" becomes "unused = unused". -version 1.2.19beta2 [May 18, 2007] +Version 1.2.19beta2 [May 18, 2007] Only use the valid bits of tRNS value in png_do_expand() (Brian Cartier) -version 1.2.19beta3 [May 19, 2007] +Version 1.2.19beta3 [May 19, 2007] Add some "png_byte" typecasts in png_check_keyword() and write new_key instead of key in zTXt chunk (Kevin Ryde). -version 1.2.19beta4 [May 21, 2007] +Version 1.2.19beta4 [May 21, 2007] Add png_snprintf() function and use it in place of sprint() for improved defense against buffer overflows. -version 1.2.19beta5 [May 21, 2007] +Version 1.2.19beta5 [May 21, 2007] Fixed png_handle_tRNS() to only use the valid bits of tRNS value. Changed handling of more unused parameters, to avoid compiler warnings. Removed some PNG_CONST in pngwutil.c to avoid compiler warnings. -version 1.2.19beta6 [May 22, 2007] +Version 1.2.19beta6 [May 22, 2007] Added some #ifdef PNG_MMX_CODE_SUPPORTED where needed in pngvcrd.c Added a special "_MSC_VER" case that defines png_snprintf to _snprintf -version 1.2.19beta7 [May 22, 2007] +Version 1.2.19beta7 [May 22, 2007] Squelched png_squelch_warnings() in pnggccrd.c and added an #ifdef PNG_MMX_CODE_SUPPORTED block around the declarations that caused the warnings that png_squelch_warnings was squelching. -version 1.2.19beta8 [May 22, 2007] +Version 1.2.19beta8 [May 22, 2007] Removed __MMX__ from test in pngconf.h. -version 1.2.19beta9 [May 23, 2007] +Version 1.2.19beta9 [May 23, 2007] Made png_squelch_warnings() available via PNG_SQUELCH_WARNINGS macro. Revised png_squelch_warnings() so it might work. Updated makefile.sgcc and makefile.solaris; added makefile.solaris-x86. -version 1.2.19beta10 [May 24, 2007] +Version 1.2.19beta10 [May 24, 2007] Resquelched png_squelch_warnings(), use "__attribute__((used))" instead. -version 1.4.0beta1 [April 20, 2006] +Version 1.4.0beta1 [April 20, 2006] Enabled iTXt support (changes png_struct, thus requires so-number change). Cleaned up PNG_ASSEMBLER_CODE_SUPPORTED vs PNG_MMX_CODE_SUPPORTED Eliminated PNG_1_0_X and PNG_1_2_X macros. @@ -1786,12 +1942,12 @@ version 1.4.0beta1 [April 20, 2006] Reduced dependency on C-runtime library when on Windows (Simon-Pierre) Replaced sprintf() with png_sprintf() (Simon-Pierre) -version 1.4.0beta2 [April 20, 2006] +Version 1.4.0beta2 [April 20, 2006] Revised makefiles and configure to avoid making links to libpng.so.* Moved some leftover MMX-related defines from pngconf.h to pngintrn.h Updated scripts/pngos2.def, pngw32.def, and projects/wince/png32ce.def -version 1.4.0beta3 [May 10, 2006] +Version 1.4.0beta3 [May 10, 2006] Updated scripts/pngw32.def to comment out MMX functions. Added PNG_NO_GET_INT_32 and PNG_NO_SAVE_INT_32 macros. Scripts/libpng.pc.in contained "configure" style version info and would @@ -1799,21 +1955,21 @@ version 1.4.0beta3 [May 10, 2006] Revised pngconf.h and added pngconf.h.in, so makefiles and configure can pass defines to libpng and applications. -version 1.4.0beta4 [May 11, 2006] +Version 1.4.0beta4 [May 11, 2006] Revised configure.ac, Makefile.am, and many of the makefiles to write their defines in pngconf.h. -version 1.4.0beta5 [May 15, 2006] +Version 1.4.0beta5 [May 15, 2006] Added a missing semicolon in Makefile.am and Makefile.in Deleted extraneous square brackets from configure.ac -version 1.4.0beta6 [June 2, 2006] +Version 1.4.0beta6 [June 2, 2006] Increased sprintf buffer from 50 to 52 chars in pngrutil.c to avoid buffer overflow. Changed sonum from 0 to 1. Removed unused prototype for png_check_sig() from png.h -version 1.4.0beta7 [June 16, 2006] +Version 1.4.0beta7 [June 16, 2006] Exported png_write_sig (Cosmin). Optimized buffer in png_handle_cHRM() (Cosmin). Set pHYs = 2835 x 2835 pixels per meter, and added @@ -1822,11 +1978,11 @@ version 1.4.0beta7 [June 16, 2006] Added typedef for png_int_32 and png_uint_32 on 64-bit systems. Added "(unsigned long)" typecast on png_uint_32 variables in printf lists. -version 1.4.0beta8 [June 22, 2006] +Version 1.4.0beta8 [June 22, 2006] Added demonstration of user chunk support in pngtest.c, to support the public sTER chunk and a private vpAg chunk. -version 1.4.0beta9 [July 3, 2006] +Version 1.4.0beta9 [July 3, 2006] Removed ordinals from scripts/pngw32.def and removed png_info_int and png_set_gray_1_2_4_to_8 entries. Inline call of png_get_uint_32() in png_get_uint_31(). @@ -1834,14 +1990,14 @@ version 1.4.0beta9 [July 3, 2006] Removed WINCE and Netware projects. Removed standalone Y2KINFO file. -version 1.4.0beta10 [July 12, 2006] +Version 1.4.0beta10 [July 12, 2006] Eliminated automatic copy of pngconf.h to pngconf.h.in from configure and some makefiles, because it was not working reliably. Instead, distribute pngconf.h.in along with pngconf.h and cause configure and some of the makefiles to update pngconf.h from pngconf.h.in. Added pngconf.h to DEPENDENCIES in Makefile.am -version 1.4.0beta11 [August 19, 2006] +Version 1.4.0beta11 [August 19, 2006] Removed AC_FUNC_MALLOC from configure.ac. Added a warning when writing iCCP profile with mismatched profile length. Patched pnggccrd.c to assemble on x86_64 platforms. @@ -1886,41 +2042,41 @@ version 1.4.0beta11 [August 19, 2006] pngconf.h.in (Glenn). Detect and fix attempt to write wrong iCCP profile length. -version 1.4.0beta12 [October 19, 2006] +Version 1.4.0beta12 [October 19, 2006] Changed "logical" to "bitwise" in the documentation. Work around Intel-Mac compiler bug by setting PNG_NO_MMX_CODE in pngconf.h Add a typecast to stifle compiler warning in pngrutil.c -version 1.4.0beta13 [November 10, 2006] +Version 1.4.0beta13 [November 10, 2006] Fix potential buffer overflow in sPLT chunk handler. Fix Makefile.am to not try to link to noexistent files. -version 1.4.0beta14 [November 15, 2006] +Version 1.4.0beta14 [November 15, 2006] Check all exported functions for NULL png_ptr. -version 1.4.0beta15 [November 17, 2006] +Version 1.4.0beta15 [November 17, 2006] Relocated two misplaced tests for NULL png_ptr. Built Makefile.in with automake-1.9.6 instead of 1.9.2. Build configure with autoconf-2.60 instead of 2.59 Add "install: all" in Makefile.am so "configure; make install" will work. -version 1.4.0beta16 [November 17, 2006] +Version 1.4.0beta16 [November 17, 2006] Added a typecast in png_zalloc(). -version 1.4.0beta17 [December 4, 2006] +Version 1.4.0beta17 [December 4, 2006] Changed "new_key[79] = '\0';" to "(*new_key)[79] = '\0';" in pngwutil.c Add "png_bytep" typecast to profile while calculating length in pngwutil.c -version 1.4.0beta18 [December 7, 2006] +Version 1.4.0beta18 [December 7, 2006] Added scripts/CMakeLists.txt -version 1.4.0beta19 [May 16, 2007] +Version 1.4.0beta19 [May 16, 2007] Revised scripts/CMakeLists.txt Rebuilt configure and Makefile.in with newer tools. Added conditional #undef jmpbuf in pngtest.c to undo #define in AIX headers. Added scripts/makefile.nommx -version 1.4.0beta20 [July 9, 2008] +Version 1.4.0beta20 [July 9, 2008] Moved several PNG_HAVE_* macros from pngpriv.h to png.h because applications calling set_unknown_chunk_location() need them. Moved several macro definitions from pngpriv.h to pngconf.h @@ -1928,19 +2084,19 @@ version 1.4.0beta20 [July 9, 2008] Deleted all use of the MMX assembler code and Intel-licensed optimizations. Revised makefile.mingw -version 1.4.0beta21 [July 21, 2008] +Version 1.4.0beta21 [July 21, 2008] Moved local array "chunkdata" from pngrutil.c to the png_struct, so it will be freed by png_read_destroy() in case of a read error (Kurt Christensen). -version 1.4.0beta22 [July 21, 2008] +Version 1.4.0beta22 [July 21, 2008] Change "purpose" and "buffer" to png_ptr->chunkdata to avoid memory leaking. -version 1.4.0beta23 [July 22, 2008] +Version 1.4.0beta23 [July 22, 2008] Change "chunkdata = NULL" to "png_ptr->chunkdata = NULL" several places in png_decompress_chunk(). -version 1.4.0beta24 [July 25, 2008] +Version 1.4.0beta24 [July 25, 2008] Change all remaining "chunkdata" to "png_ptr->chunkdata" in png_decompress_chunk(), and remove "chunkdata" from parameter list. Put a call to png_check_chunk_name() in png_read_chunk_header(). @@ -1948,7 +2104,7 @@ version 1.4.0beta24 [July 25, 2008] Removed two calls to png_check_chunk_name() occuring later in the process. Define PNG_NO_ERROR_NUMBERS by default in pngconf.h -version 1.4.0beta25 [July 30, 2008] +Version 1.4.0beta25 [July 30, 2008] Added a call to png_check_chunk_name() in pngpread.c Reverted png_check_chunk_name() to accept a name with a lowercase 3rd byte. Added png_push_have_buffer() function to pngpread.c @@ -1959,7 +2115,7 @@ version 1.4.0beta25 [July 30, 2008] Eliminated no-longer-used pngdefs.h (but it's still built in the makefiles) Relocated a misplaced "#endif /* PNG_NO_WRITE_FILTER */" in pngwutil.c -version 1.4.0beta26 [August 4, 2008] +Version 1.4.0beta26 [August 4, 2008] Removed png_push_have_buffer() function in pngpread.c. It increased the compiled library size slightly. Changed "-Wall" to "-W -Wall" in the CFLAGS in all makefiles (Cosmin Truta) @@ -1967,105 +2123,105 @@ version 1.4.0beta26 [August 4, 2008] Updated contrib/visupng/cexcept.h to version 2.0.1 Added PNG_LITERAL_CHARACTER macros for #, [, and ]. -version 1.4.0beta27 [August 5, 2008] +Version 1.4.0beta27 [August 5, 2008] Revised usage of PNG_LITERAL_SHARP in pngerror.c. Moved newline character from individual png_debug messages into the png_debug macros. Allow user to #define their own png_debug, png_debug1, and png_debug2. -version 1.4.0beta28 [August 5, 2008] +Version 1.4.0beta28 [August 5, 2008] Revised usage of PNG_LITERAL_SHARP in pngerror.c. Added PNG_STRING_NEWLINE macro -version 1.4.0beta29 [August 9, 2008] +Version 1.4.0beta29 [August 9, 2008] Revised usage of PNG_STRING_NEWLINE to work on non-ISO compilers. Added PNG_STRING_COPYRIGHT macro. Added non-ISO versions of png_debug macros. -version 1.4.0beta30 [August 14, 2008] +Version 1.4.0beta30 [August 14, 2008] Added premultiplied alpha feature (Volker Wiendl). -version 1.4.0beta31 [August 18, 2008] +Version 1.4.0beta31 [August 18, 2008] Moved png_set_premultiply_alpha from pngtrans.c to pngrtran.c Removed extra crc check at the end of png_handle_cHRM(). Bug introduced in libpng-1.4.0beta20. -version 1.4.0beta32 [August 19, 2008] +Version 1.4.0beta32 [August 19, 2008] Added PNG_WRITE_FLUSH_SUPPORTED block around new png_flush() call. Revised PNG_NO_STDIO version of png_write_flush() -version 1.4.0beta33 [August 20, 2008] +Version 1.4.0beta33 [August 20, 2008] Added png_get|set_chunk_cache_max() to limit the total number of sPLT, text, and unknown chunks that can be stored. -version 1.4.0beta34 [September 6, 2008] +Version 1.4.0beta34 [September 6, 2008] Shortened tIME_string to 29 bytes in pngtest.c Fixed off-by-one error introduced in png_push_read_zTXt() function in libpng-1.2.30beta04/pngpread.c (Harald van Dijk) -version 1.4.0beta35 [October 6, 2008] +Version 1.4.0beta35 [October 6, 2008] Changed "trans_values" to "trans_color". Changed so-number from 0 to 14. Some OS do not like 0. Revised makefile.darwin to fix shared library numbering. Change png_set_gray_1_2_4_to_8() to png_set_expand_gray_1_2_4_to_8() in example.c (debian bug report) -version 1.4.0beta36 [October 25, 2008] +Version 1.4.0beta36 [October 25, 2008] Sync with tEXt vulnerability fix in libpng-1.2.33rc02. -version 1.4.0beta37 [November 13, 2008] +Version 1.4.0beta37 [November 13, 2008] Added png_check_cHRM in png.c and moved checking from pngget.c, pngrutil.c, and pngwrite.c -version 1.4.0beta38 [November 22, 2008] +Version 1.4.0beta38 [November 22, 2008] Added check for zero-area RGB cHRM triangle in png_check_cHRM() and png_check_cHRM_fixed(). -version 1.4.0beta39 [November 23, 2008] +Version 1.4.0beta39 [November 23, 2008] Revised png_warning() to write its message on standard output by default when warning_fn is NULL. -version 1.4.0beta40 [November 24, 2008] +Version 1.4.0beta40 [November 24, 2008] Eliminated png_check_cHRM(). Instead, always use png_check_cHRM_fixed(). In png_check_cHRM_fixed(), ensure white_y is > 0, and removed redundant check for all-zero coordinates that is detected by the triangle check. -version 1.4.0beta41 [November 26, 2008] +Version 1.4.0beta41 [November 26, 2008] Fixed string vs pointer-to-string error in png_check_keyword(). Rearranged test expressions in png_check_cHRM_fixed() to avoid internal overflows. Added PNG_NO_CHECK_cHRM conditional. -version 1.4.0beta42, 43 [December 1, 2008] +Version 1.4.0beta42, 43 [December 1, 2008] Merge png_debug with version 1.2.34beta04. -version 1.4.0beta44 [December 6, 2008] +Version 1.4.0beta44 [December 6, 2008] Removed redundant check for key==NULL before calling png_check_keyword() to ensure that new_key gets initialized and removed extra warning (Merge with version 1.2.34beta05 -- Arvan Pritchard). -version 1.4.0beta45 [December 9, 2008] +Version 1.4.0beta45 [December 9, 2008] In png_write_png(), respect the placement of the filler bytes in an earlier call to png_set_filler() (Jim Barry). -version 1.4.0beta46 [December 10, 2008] +Version 1.4.0beta46 [December 10, 2008] Undid previous change and added PNG_TRANSFORM_STRIP_FILLER_BEFORE and PNG_TRANSFORM_STRIP_FILLER_AFTER conditionals and deprecated PNG_TRANSFORM_STRIP_FILLER (Jim Barry). -version 1.4.0beta47 [December 15, 2008] +Version 1.4.0beta47 [December 15, 2008] Support for dithering was disabled by default, because it has never been well tested and doesn't work very well. The code has not been removed, however, and can be enabled by building libpng with PNG_READ_DITHER_SUPPORTED defined. -version 1.4.0beta48 [February 14, 2009] +Version 1.4.0beta48 [February 14, 2009] Added new exported function png_calloc(). Combined several instances of png_malloc(); png_memset() into png_calloc(). Removed prototype for png_freeptr() that was added in libpng-1.4.0beta24 but was never defined. -version 1.4.0beta49 [February 28, 2009] +Version 1.4.0beta49 [February 28, 2009] Added png_fileno() macro to pngconf.h, used in pngwio.c Corrected order of #ifdef's in png_debug definition in png.h Fixed bug introduced in libpng-1.4.0beta48 with the memset arguments @@ -2074,7 +2230,7 @@ version 1.4.0beta49 [February 28, 2009] (bug introduced in libpng-1.2.34/1.4.0beta29). Revised comments in png_set_read_fn() and png_set_write_fn(). -version 1.4.0beta50 [March 18, 2009] +Version 1.4.0beta50 [March 18, 2009] Use png_calloc() instead of png_malloc() to allocate big_row_buf when reading an interlaced file, to avoid a possible UMR. Undid revision of PNG_NO_STDIO version of png_write_flush(). Users @@ -2085,21 +2241,21 @@ version 1.4.0beta50 [March 18, 2009] Removed fflush() from pngtest.c. Added "#define PNG_NO_WRITE_FLUSH" to contrib/pngminim/encoder/pngusr.h -version 1.4.0beta51 [March 21, 2009] +Version 1.4.0beta51 [March 21, 2009] Removed new png_fileno() macro from pngconf.h . -version 1.4.0beta52 [March 27, 2009] +Version 1.4.0beta52 [March 27, 2009] Relocated png_do_chop() ahead of building gamma tables in pngrtran.c This avoids building 16-bit gamma tables unnecessarily. Removed fflush() from pngtest.c. Added "#define PNG_NO_WRITE_FLUSH" to contrib/pngminim/encoder/pngusr.h Added a section on differences between 1.0.x and 1.2.x to libpng.3/libpng.txt -version 1.4.0beta53 [April 1, 2009] +Version 1.4.0beta53 [April 1, 2009] Removed some remaining MMX macros from pngpriv.h Fixed potential memory leak of "new_name" in png_write_iCCP() (Ralph Giles) -version 1.4.0beta54 [April 13, 2009] +Version 1.4.0beta54 [April 13, 2009] Added "ifndef PNG_SKIP_SETJMP_CHECK" block in pngconf.h to allow application code writers to bypass the check for multiple inclusion of setjmp.h when they know that it is safe to ignore the situation. @@ -2108,54 +2264,54 @@ version 1.4.0beta54 [April 13, 2009] pngtest now produces, and made some cosmetic changes to pngtest output. Eliminated deprecated png_read_init_3() and png_write_init_3() functions. -version 1.4.0beta55 [April 15, 2009] +Version 1.4.0beta55 [April 15, 2009] Simplified error handling in pngread.c and pngwrite.c by putting the new png_read_cleanup() and png_write_cleanup() functions inline. -version 1.4.0beta56 [April 25, 2009] +Version 1.4.0beta56 [April 25, 2009] Renamed "user_chunk_data" to "my_user_chunk_data" in pngtest.c to suppress "shadowed declaration" warning from gcc-4.3.3. Renamed "gamma" to "png_gamma" in pngset.c to avoid "shadowed declaration" warning about a global "gamma" variable in math.h on some platforms. -version 1.4.0beta57 [May 2, 2009] +Version 1.4.0beta57 [May 2, 2009] Removed prototype for png_freeptr() that was added in libpng-1.4.0beta24 but was never defined (again). Rebuilt configure scripts with autoconf-2.63 instead of 2.62 Removed pngprefs.h and MMX from makefiles -version 1.4.0beta58 [May 14, 2009] +Version 1.4.0beta58 [May 14, 2009] Changed pngw32.def to pngwin.def in makefile.mingw (typo was introduced in beta57). Clarified usage of sig_bit versus sig_bit_p in example.c (Vincent Torri) -version 1.4.0beta59 [May 15, 2009] +Version 1.4.0beta59 [May 15, 2009] Reformated sources in libpng style (3-space intentation, comment format) Fixed typo in libpng docs (PNG_FILTER_AVE should be PNG_FILTER_AVG) Added sections about the git repository and our coding style to the documentation Relocated misplaced #endif in pngwrite.c, sCAL chunk handler. -version 1.4.0beta60 [May 19, 2009] +Version 1.4.0beta60 [May 19, 2009] Conditionally compile png_read_finish_row() which is not used by progressive readers. Added contrib/pngminim/preader to demonstrate building minimal progressive decoder, based on contrib/gregbook with embedded libpng and zlib. -version 1.4.0beta61 [May 20, 2009] +Version 1.4.0beta61 [May 20, 2009] In contrib/pngminim/*, renamed "makefile.std" to "makefile", since there is only one makefile in those directories, and revised the README files accordingly. More reformatting of comments, mostly to capitalize sentences. -version 1.4.0beta62 [June 2, 2009] +Version 1.4.0beta62 [June 2, 2009] Added "#define PNG_NO_WRITE_SWAP" to contrib/pngminim/encoder/pngusr.h and "define PNG_NO_READ_SWAP" to decoder/pngusr.h and preader/pngusr.h Reformatted several remaining "else statement" into two lines. Added a section to the libpng documentation about using png_get_io_ptr() in configure scripts to detect the presence of libpng. -version 1.4.0beta63 [June 15, 2009] +Version 1.4.0beta63 [June 15, 2009] Revised libpng*.txt and libpng.3 to mention calling png_set_IHDR() multiple times and to specify the sample order in the tRNS chunk, because the ISO PNG specification has a typo in the tRNS table. @@ -2165,26 +2321,26 @@ version 1.4.0beta63 [June 15, 2009] Adopted preference for consistent use of "#ifdef" and "#ifndef" versus "#if defined()" and "if !defined()" where possible. -version 1.4.0beta64 [June 24, 2009] +Version 1.4.0beta64 [June 24, 2009] Eliminated PNG_LEGACY_SUPPORTED code. Moved the various unknown chunk macro definitions outside of the PNG_READ|WRITE_ANCILLARY_CHUNK_SUPPORTED blocks. -version 1.4.0beta65 [June 26, 2009] +Version 1.4.0beta65 [June 26, 2009] Added a reference to the libpng license in each file. -version 1.4.0beta66 [June 27, 2009] +Version 1.4.0beta66 [June 27, 2009] Refer to the libpng license instead of the libpng license in each file. -version 1.4.0beta67 [July 6, 2009] +Version 1.4.0beta67 [July 6, 2009] Relocated INVERT_ALPHA within png_read_png() and png_write_png(). Added high-level API transform PNG_TRANSFORM_GRAY_TO_RGB. Added an "xcode" project to the projects directory (Alam Arias). -version 1.4.0beta68 [July 19, 2009] +Version 1.4.0beta68 [July 19, 2009] Avoid some tests in filter selection in pngwutil.c -version 1.4.0beta69 [July 25, 2009] +Version 1.4.0beta69 [July 25, 2009] Simplified the new filter-selection test. This runs faster in the common "PNG_ALL_FILTERS" and PNG_FILTER_NONE cases. Removed extraneous declaration from the new call to png_read_gray_to_rgb() @@ -2192,54 +2348,54 @@ version 1.4.0beta69 [July 25, 2009] Fixed up xcode project (Alam Arias) Added a prototype for png_64bit_product() in png.c -version 1.4.0beta70 [July 27, 2009] +Version 1.4.0beta70 [July 27, 2009] Avoid a possible NULL dereference in debug build, in png_set_text_2(). (bug introduced in libpng-0.95, discovered by Evan Rouault) -version 1.4.0beta71 [July 29, 2009] +Version 1.4.0beta71 [July 29, 2009] Rebuilt configure scripts with autoconf-2.64. -version 1.4.0beta72 [August 1, 2009] +Version 1.4.0beta72 [August 1, 2009] Replaced *.tar.lzma with *.tar.xz in distribution. Get the xz codec from . -version 1.4.0beta73 [August 1, 2009] +Version 1.4.0beta73 [August 1, 2009] Reject attempt to write iCCP chunk with negative embedded profile length (JD Chen) -version 1.4.0beta74 [August 8, 2009] +Version 1.4.0beta74 [August 8, 2009] Changed png_ptr and info_ptr member "trans" to "trans_alpha". -version 1.4.0beta75 [August 21, 2009] +Version 1.4.0beta75 [August 21, 2009] Removed an extra png_debug() recently added to png_write_find_filter(). Fixed incorrect #ifdef in pngset.c regarding unknown chunk support. -version 1.4.0beta76 [August 22, 2009] +Version 1.4.0beta76 [August 22, 2009] Moved an incorrectly located test in png_read_row() in pngread.c -version 1.4.0beta77 [August 27, 2009] +Version 1.4.0beta77 [August 27, 2009] Removed lpXYZ.tar.bz2 (with CRLF), KNOWNBUG, libpng-x.y.z-KNOWNBUG.txt, and the "noconfig" files from the distribution. Moved CMakeLists.txt from scripts into the main libpng directory. Various bugfixes and improvements to CMakeLists.txt (Philip Lowman) -version 1.4.0beta78 [August 31, 2009] +Version 1.4.0beta78 [August 31, 2009] Converted all PNG_NO_* tests to PNG_*_SUPPORTED everywhere except pngconf.h Eliminated PNG_NO_FREE_ME and PNG_FREE_ME_SUPPORTED macros. Use png_malloc plus a loop instead of png_calloc() to initialize row_pointers in png_read_png(). -version 1.4.0beta79 [September 1, 2009] +Version 1.4.0beta79 [September 1, 2009] Eliminated PNG_GLOBAL_ARRAYS and PNG_LOCAL_ARRAYS; always use local arrays. Eliminated PNG_CALLOC_SUPPORTED macro and always provide png_calloc(). -version 1.4.0beta80 [September 17, 2009] +Version 1.4.0beta80 [September 17, 2009] Removed scripts/libpng.icc Changed typecast of filler from png_byte to png_uint_16 in png_set_filler(). (Dennis Gustafsson) Fixed typo introduced in beta78 in pngtest.c ("#if def " should be "#ifdef ") -version 1.4.0beta81 [September 23, 2009] +Version 1.4.0beta81 [September 23, 2009] Eliminated unused PNG_FLAG_FREE_* defines from pngpriv.h Expanded TAB characters in pngrtran.c Removed PNG_CONST from all "PNG_CONST PNG_CHNK" declarations to avoid @@ -2247,60 +2403,60 @@ version 1.4.0beta81 [September 23, 2009] Changed all "#if [!]defined(X)" to "if[n]def X" where possible. Eliminated unused png_ptr->row_buf_size -version 1.4.0beta82 [September 25, 2009] +Version 1.4.0beta82 [September 25, 2009] Moved redundant IHDR checking into new png_check_IHDR() in png.c and report all errors found in the IHDR data. Eliminated useless call to png_check_cHRM() from pngset.c -version 1.4.0beta83 [September 25, 2009] +Version 1.4.0beta83 [September 25, 2009] Revised png_check_IHDR() to eliminate bogus complaint about filter_type. -version 1.4.0beta84 [September 30, 2009] +Version 1.4.0beta84 [September 30, 2009] Fixed some inconsistent indentation in pngconf.h Revised png_check_IHDR() to add a test for width variable less than 32-bit. -version 1.4.0beta85 [October 1, 2009] +Version 1.4.0beta85 [October 1, 2009] Revised png_check_IHDR() again, to check info_ptr members instead of the contents of the returned parameters. -version 1.4.0beta86 [October 9, 2009] +Version 1.4.0beta86 [October 9, 2009] Updated the "xcode" project (Alam Arias). Eliminated a shadowed declaration of "pp" in png_handle_sPLT(). -version 1.4.0rc01 [October 19, 2009] +Version 1.4.0rc01 [October 19, 2009] Trivial cosmetic changes. -version 1.4.0beta87 [October 30, 2009] +Version 1.4.0beta87 [October 30, 2009] Moved version 1.4.0 back into beta. -version 1.4.0beta88 [October 30, 2009] +Version 1.4.0beta88 [October 30, 2009] Revised libpng*.txt section about differences between 1.2.x and 1.4.0 because most of the new features have now been ported back to 1.2.41 -version 1.4.0beta89 [November 1, 2009] +Version 1.4.0beta89 [November 1, 2009] More bugfixes and improvements to CMakeLists.txt (Philip Lowman) Removed a harmless extra png_set_invert_alpha() from pngwrite.c Apply png_user_chunk_cache_max within png_decompress_chunk(). Merged libpng-1.2.41.txt with libpng-1.4.0.txt where appropriate. -version 1.4.0beta90 [November 2, 2009] +Version 1.4.0beta90 [November 2, 2009] Removed all remaining WIN32_WCE #ifdefs except those involving the time.h "tm" structure -version 1.4.0beta91 [November 3, 2009] +Version 1.4.0beta91 [November 3, 2009] Updated scripts/pngw32.def and projects/wince/png32ce.def Copied projects/wince/png32ce.def to the scripts directory. Added scripts/makefile.wce Patched ltmain.sh for wince support. Added PNG_CONVERT_tIME_SUPPORTED macro. -version 1.4.0beta92 [November 4, 2009] +Version 1.4.0beta92 [November 4, 2009] Make inclusion of time.h in pngconf.h depend on PNG_CONVERT_tIME_SUPPORTED Make #define PNG_CONVERT_tIME_SUPPORTED depend on PNG_WRITE_tIME_SUPPORTED Revised libpng*.txt to describe differences from 1.2.40 to 1.4.0 (instead of differences from 1.2.41 to 1.4.0) -version 1.4.0beta93 [November 7, 2009] +Version 1.4.0beta93 [November 7, 2009] Added PNG_DEPSTRUCT, PNG_DEPRECATED, PNG_USE_RESULT, PNG_NORETURN, and PNG_ALLOCATED macros to detect deprecated direct access to the png_struct or info_struct members and other deprecated usage in @@ -2323,13 +2479,13 @@ version 1.4.0beta93 [November 7, 2009] Moved the synopsis lines for png_read_destroy(), png_write_destroy() png_debug(), png_debug1(), and png_debug2() from libpng.3 to libpngpf.3. -version 1.4.0beta94 [November 9, 2009] +Version 1.4.0beta94 [November 9, 2009] Removed the obsolete, unused pnggccrd.c and pngvcrd.c files. Updated CMakeLists.txt to add "-DPNG_CONFIGURE_LIBPNG" to the definitions. Removed dependency of pngtest.o on pngpriv.h in the makefiles. Only #define PNG_DEPSTRUCT, etc. in pngconf.h if not already defined. -version 1.4.0beta95 [November 10, 2009] +Version 1.4.0beta95 [November 10, 2009] Changed png_check_sig() to !png_sig_cmp() in contrib programs. Added -DPNG_CONFIGURE_LIBPNG to contrib/pngminm/*/makefile Changed png_check_sig() to !png_sig_cmp() in contrib programs. @@ -2337,7 +2493,7 @@ version 1.4.0beta95 [November 10, 2009] Changed pngminim/*/gather.sh to stop trying to remove pnggccrd.c and pngvcrd.c Added dependency on pngpriv.h in contrib/pngminim/*/makefile -version 1.4.0beta96 [November 12, 2009] +Version 1.4.0beta96 [November 12, 2009] Renamed scripts/makefile.wce to scripts/makefile.cegcc Revised Makefile.am to use libpng.sys while building libpng.so so that only PNG_EXPORT functions are exported. @@ -2347,42 +2503,42 @@ version 1.4.0beta96 [November 12, 2009] (evidently the same change made in libpng-1.0beta54 was lost). Added PNG_PRIVATE macro definition in pngconf.h for possible future use. -version 1.4.0beta97 [November 13, 2009] +Version 1.4.0beta97 [November 13, 2009] Restored pngtest.png to the libpng-1.4.0beta7 version. Removed projects/beos and netware.txt; no one seems to be supporting them. Revised Makefile.in -version 1.4.0beta98 [November 13, 2009] +Version 1.4.0beta98 [November 13, 2009] Added the "xcode" project to zip distributions, Fixed a typo in scripts/pngwin.def introduced in beta97. -version 1.4.0beta99 [November 14, 2009] +Version 1.4.0beta99 [November 14, 2009] Moved libpng-config.in and libpng.pc-configure.in out of the scripts directory, to libpng-config.in and libpng-pc.in, respectively, and modified Makefile.am and configure.ac accordingly. Now "configure" needs nothing from the "scripts" directory. Avoid redefining PNG_CONST in pngconf.h -version 1.4.0beta100 [November 14, 2009] +Version 1.4.0beta100 [November 14, 2009] Removed ASM builds from projects/visualc6 and projects/visualc71 Removed scripts/makefile.nommx and makefile.vcawin32 Revised CMakeLists.txt to account for new location of libpng-config.in and libpng-pc.in Updated INSTALL to reflect removal and relocation of files. -version 1.4.0beta101 [November 14, 2009] +Version 1.4.0beta101 [November 14, 2009] Restored the binary files (*.jpg, *.png, some project files) that were accidentally deleted from the zip and 7z distributions when the xcode project was added. -version 1.4.0beta102 [November 18, 2009] +Version 1.4.0beta102 [November 18, 2009] Added libpng-config.in and libpng-pc.in to the zip and 7z distributions. Fixed a typo in projects/visualc6/pngtest.dsp, introduced in beta100. Moved descriptions of makefiles and other scripts out of INSTALL into scripts/README.txt Updated the copyright year in scripts/pngwin.rc from 2006 to 2009. -version 1.4.0beta103 [November 21, 2009] +Version 1.4.0beta103 [November 21, 2009] Removed obsolete comments about ASM from projects/visualc71/README_zlib.txt Align row_buf on 16-byte boundary in memory. Restored the PNG_WRITE_FLUSH_AFTER_IEND_SUPPORTED guard around the call @@ -2394,74 +2550,74 @@ version 1.4.0beta103 [November 21, 2009] jmp_buf buffer, and marked direct access to jmpbuf 'deprecated'. (John Bowler) -version 1.4.0beta104 [November 22, 2009] +Version 1.4.0beta104 [November 22, 2009] Removed png_longjmp_ptr from scripts/*.def and libpng.3 Rebuilt configure scripts with autoconf-2.65 -version 1.4.0beta105 [November 25, 2009] +Version 1.4.0beta105 [November 25, 2009] Use fast integer PNG_DIVIDE_BY_255() or PNG_DIVIDE_BY_65535() to accomplish alpha premultiplication when PNG_READ_COMPOSITE_NODIV_SUPPORTED is defined. Changed "/255" to "/255.0" in background calculations to make it clear that the 255 is used as a double. -version 1.4.0beta106 [November 27, 2009] +Version 1.4.0beta106 [November 27, 2009] Removed premultiplied alpha feature. -version 1.4.0beta107 [December 4, 2009] +Version 1.4.0beta107 [December 4, 2009] Updated README Added "#define PNG_NO_PEDANTIC_WARNINGS" in the libpng source files. Removed "-DPNG_CONFIGURE_LIBPNG" from the makefiles and projects. Revised scripts/makefile.netbsd, makefile.openbsd, and makefile.sco to put png.h and pngconf.h in $prefix/include, like the other scripts, instead of in $prefix/include/libpng. Also revised makefile.sco - to put them in $prefix/include/libpng14 instead of in - $prefix/include/libpng/libpng14. + to put them in $prefix/include/libpng15 instead of in + $prefix/include/libpng/libpng15. -version 1.4.0beta108 [December 11, 2009] +Version 1.4.0beta108 [December 11, 2009] Removed leftover "-DPNG_CONFIGURE_LIBPNG" from contrib/pngminim/*/makefile Relocated png_do_chop() to its original position in pngrtran.c; the change in version 1.2.41beta08 caused transparency to be handled wrong in some 16-bit datastreams (Yusaku Sugai). -version 1.4.0beta109 [December 13, 2009] +Version 1.4.0beta109 [December 13, 2009] Added "bit_depth" parameter to the private png_build_gamma_table() function. Pass bit_depth=8 to png_build_gamma_table() when bit_depth is 16 but the PNG_16_TO_8 transform has been set, to avoid unnecessary build of 16-bit tables. -version 1.4.0rc02 [December 20, 2009] +Version 1.4.0rc02 [December 20, 2009] Declared png_cleanup_needed "volatile" in pngread.c and pngwrite.c -version 1.4.0rc03 [December 22, 2009] +Version 1.4.0rc03 [December 22, 2009] Renamed libpng-pc.in back to libpng.pc.in and revised CMakeLists.txt (revising the change in 1.4.0beta99) -version 1.4.0rc04 [December 25, 2009] +Version 1.4.0rc04 [December 25, 2009] Swapped PNG_UNKNOWN_CHUNKS_SUPPORTED and PNG_HANDLE_AS_UNKNOWN_SUPPORTED in pngset.c to be consistent with other changes in version 1.2.38. -version 1.4.0rc05 [December 25, 2009] +Version 1.4.0rc05 [December 25, 2009] Changed "libpng-pc.in" to "libpng.pc.in" in configure.ac, configure, and Makefile.in to be consistent with changes in libpng-1.4.0rc03 -version 1.4.0rc06 [December 29, 2009] +Version 1.4.0rc06 [December 29, 2009] Reverted the gamma_table changes from libpng-1.4.0beta109. Fixed some indentation errors. -version 1.4.0rc07 [January 1, 2010] +Version 1.4.0rc07 [January 1, 2010] Revised libpng*.txt and libpng.3 about 1.2.x->1.4.x differences. Use png_calloc() instead of png_malloc(); png_memset() in pngrutil.c Update copyright year to 2010. -version 1.4.0rc08 [January 2, 2010] +Version 1.4.0rc08 [January 2, 2010] Avoid deprecated references to png_ptr-io_ptr and png_ptr->error_ptr in pngtest.c -version 1.4.0 [January 3, 2010] +Version 1.4.0 [January 3, 2010] No changes. -version 1.4.1beta01 [January 8, 2010] +Version 1.4.1beta01 [January 8, 2010] Updated CMakeLists.txt for consistent indentation and to avoid an unclosed if-statement warning (Philip Lowman). Revised Makefile.am and Makefile.in to remove references to Y2KINFO, @@ -2473,28 +2629,28 @@ version 1.4.1beta01 [January 8, 2010] Revised Makefile.am and Makefile.in to simplify their maintenance. Revised scripts/makefile.linux to install a link to libpng14.so.14.1 -version 1.4.1beta02 [January 9, 2010] +Version 1.4.1beta02 [January 9, 2010] Revised the rest of the makefiles to install a link to libpng14.so.14.1 -version 1.4.1beta03 [January 10, 2010] +Version 1.4.1beta03 [January 10, 2010] Removed png_set_premultiply_alpha() from scripts/*.def -version 1.4.1rc01 [January 16, 2010] +Version 1.4.1rc01 [January 16, 2010] No changes. -version 1.4.1beta04 [January 23, 2010] +Version 1.4.1beta04 [January 23, 2010] Revised png_decompress_chunk() to improve speed and memory usage when decoding large chunks. Added png_set|get_chunk_malloc_max() functions. -version 1.4.1beta05 [January 26, 2010] +Version 1.4.1beta05 [January 26, 2010] Relocated "int k" declaration in pngtest.c to minimize its scope. -version 1.4.1beta06 [January 28, 2010] +Version 1.4.1beta06 [January 28, 2010] Revised png_decompress_chunk() to use a two-pass method suggested by John Bowler. -version 1.4.1beta07 [February 6, 2010] +Version 1.4.1beta07 [February 6, 2010] Folded some long lines in the source files. Added defineable PNG_USER_CHUNK_CACHE_MAX, PNG_USER_CHUNK_MALLOC_MAX, and a PNG_USER_LIMITS_SUPPORTED flag. @@ -2502,117 +2658,639 @@ version 1.4.1beta07 [February 6, 2010] png_ptr->png_user_chunk_malloc_max. Revised png_push_save_buffer() to do fewer but larger png_malloc() calls. -version 1.4.1beta08 [February 6, 2010] +Version 1.4.1beta08 [February 6, 2010] Minor cleanup and updating of dates and copyright year. -version 1.4.1beta09 [February 7, 2010] +Version 1.5.0beta01 [February 7, 2010] + Moved declaration of png_struct into private pngstruct.h and png_info + into pnginfo.h + +Version 1.4.1beta09 and 1.5.0beta02 [February 7, 2010] Reverted to original png_push_save_buffer() code. -version 1.4.1beta10 [February 9, 2010] - Return allocated "old_buffer" in png_push_save_buffer() before calling - png_error(), to avoid a potential memory leak. +Version 1.4.1beta10 and 1.5.0beta03 [February 8, 2010] + Return allocated "old_buffer" in png_push_save_buffer() before + calling png_error(), to avoid a potential memory leak. + Updated configure script to use SO number 15. -version 1.4.1beta11 [February 12, 2010] - Relocated misplaced closing curley bracket in png_decompress_chunk(). - Removed unused "buffer_size" variable from png_decompress_chunk(). +Version 1.5.0beta04 [February 9, 2010] + Removed malformed "incomplete struct declaration" of png_info from png.h + +Version 1.5.0beta05 [February 12, 2010] + Removed PNG_DEPSTRUCT markup in pngstruct.h and pnginfo.h, and undid the + linewrapping that it entailed. + Revised comments in pngstruct.h and pnginfo.h and added pointers to + the libpng license. + Changed PNG_INTERNAL to PNG_EXPOSE_INTERNAL_STRUCTURES Removed the cbuilder5 project, which has not been updated to 1.4.0. - Complete rewrite of two-pass png_decompress_chunk() by John Bowler. -version 1.4.1beta12 [February 14, 2010] - Fixed type declaration of png_get_user_malloc_max() in pngget.c (Daisuke +Version 1.4.1beta12 and 1.5.0beta06 [February 14, 2010] + Fixed type declaration of png_get_chunk_malloc_max() in pngget.c (Daisuke Nishikawa) -version 1.4.1rc02 [January 18, 2010] - No changes. +Version 1.5.0beta07 [omitted] -version 1.4.1rc03 [February 19, 2010] +Version 1.5.0beta08 [February 19, 2010] + Changed #ifdef PNG_NO_STDIO_SUPPORTED to #ifdef PNG_NO_CONSOLE_IO_SUPPORTED + wherever png_snprintf() is used to construct error and warning messages. Noted in scripts/makefile.mingw that it expects to be run under MSYS. Removed obsolete unused MMX-querying support from contrib/gregbook + Added exported png_longjmp() function. Removed the AIX redefinition of jmpbuf in png.h - Define _ALL_SOURCE in configure.ac, makefile.aix, and CMakeLists.txt - when using AIX compiler. + Added -D_ALLSOURCE in configure.ac, makefile.aix, and CMakeLists.txt + when building on AIX. -version 1.4.1rc04 [February 19, 2010] +Version 1.5.0beta09 [February 19, 2010] + Removed -D_ALLSOURCE from configure.ac, makefile.aix, and CMakeLists.txt. + Changed the name of png_ptr->jmpbuf to png_ptr->png_jmpbuf in pngstruct.h + +Version 1.5.0beta10 [February 25, 2010] Removed unused gzio.c from contrib/pngminim gather and makefile scripts + Removed replacement error handlers from contrib/gregbook. Because of + the new png_longjmp() function they are no longer needed. -version 1.4.1 [February 25, 2010] +Version 1.5.0beta11 [March 6, 2010] + Removed checking for already-included setjmp.h from pngconf.h + Fixed inconsistent indentations and made numerous cosmetic changes. + Revised the "SEE ALSO" style of libpng.3, libpngpf.3, and png.5 -version 1.4.2beta01 [April 1, 2010] - Conditionally compile an "else" statement in png_decompress_chunk(). +Version 1.5.0beta12 [March 9, 2010] + Moved "#include png.h" inside pngpriv.h and removed "#include png.h" from + the source files, along with "#define PNG_EXPOSE_INTERNAL_STRUCTURES" + and "#define PNG_NO_PEDANTIC_WARNINGS" (John Bowler). + Created new pngdebug.h and moved debug definitions there. + +Version 1.5.0beta13 [March 10, 2010] + Protect pngstruct.h, pnginfo.h, and pngdebug.h from being included twice. + Revise the "#ifdef" blocks in png_inflate() so it will compile when neither + PNG_USER_CHUNK_MALLOC_MAX nor PNG_SET_CHUNK_MALLOC_LIMIT_SUPPORTED + is defined. + Removed unused png_measure_compressed_chunk() from pngpriv.h and libpngpf.3 + Moved the 'config.h' support from pngconf.h to pngpriv.h + Removed PNGAPI from the png_longjmp_ptr typedef. + Eliminated dependence of pngtest.c on the private pngdebug.h file. + Make all png_debug macros into *unterminated* statements or + expressions (i.e. a trailing ';' must always be added) and correct + the format statements in various png_debug messages. + +Version 1.5.0beta14 [March 14, 2010] + Removed direct access to png_ptr->io_ptr from the Windows code in pngtest.c + Revised Makefile.am to account for recent additions and replacements. + Corrected CE and OS/2 DEF files (scripts/png*def) for symbols removed and + added ordinal numbers to the Windows DEF file and corrected the duplicated + ordinal numbers on CE symbols that are commented out. + Added back in export symbols that can be present in the Windows build but + are disabled by default. + PNG_EXPORT changed to include an 'ordinal' field for DEF file generation. + PNG_CALLBACK added to make callback definitions uniform. PNGAPI split + into PNGCAPI (base C form), PNGAPI (exports) and PNGCBAPI (callbacks), + and appropriate changes made to all files. Cygwin builds re-hinged to + allow procedure call standard changes and to remove the need for the DEF + file (fixes build on Cygwin). + Enabled 'attribute' warnings that are relevant to library APIs and callbacks. + Changed rules for generation of the various symbol files and added a new + rule for a DEF file (which is also added to the distribution). + Updated the symbol file generation to stop it adding spurious spaces + to EOL (coming from preprocessor macro expansion). Added a facility + to join tokens in the output and rewrite *.dfn to use this. + Eliminated scripts/*.def in favor of libpng.def; updated projects/visualc71 + and removed scripts/makefile.cygwin. + Made PNG_BUILD_DLL safe: it can be set whenever a DLL is being built. + Removed the include of sys/types.h - apparently unnecessary now on the + platforms on which it happened (all but Mac OS and RISC OS). + Moved the Mac OS test into pngpriv.h (the only place it is used.) + +Version 1.5.0beta15 [March 17, 2010] + Added symbols.chk target to Makefile.am to validate the symbols in png.h + against the new DEF file scripts/symbols.def. + Changed the default DEF file back to pngwin.def. + Removed makefile.mingw. + Eliminated PNG_NO_EXTERN and PNG_ALL_EXTERN + +Version 1.5.0beta16 [April 1, 2010] + Make png_text_struct independent of PNG_iTXt_SUPPORTED, so that + fields are initialized in all configurations. The READ/WRITE + macros (PNG_(READ|WRITE)_iTXt_SUPPORTED) still function as + before to disable code to actually read or write iTXt chunks + and iTXt_SUPPORTED can be used to detect presence of either + read or write support (but it is probably better to check for + the one actually required - read or write.) + Combined multiple png_warning() calls for a single error. Restored the macro definition of png_check_sig(). -version 1.4.2rc01 [April 10, 2010] - No changes. - -version 1.4.2rc02 [April 16, 2010] +Version 1.5.0beta17 [April 17, 2010] + Added some "(long)" typecasts to printf calls in png_handle_cHRM(). Documented the fact that png_set_dither() was disabled since libpng-1.4.0. Reenabled png_set_dither() but renamed it to png_set_quantize() to reflect more accurately what it actually does. At the same time, renamed the PNG_DITHER_[RED,GREEN_BLUE]_BITS macros to PNG_QUANTIZE_[RED,GREEN,BLUE]_BITS. - -version 1.4.2rc03 [April 24, 2010] Added some "(long)" typecasts to printf calls in png_handle_cHRM(). + Freeze build-time only configuration in the build. + In all prior versions of libpng most configuration options + controlled by compiler #defines had to be repeated by the + application code that used libpng. This patch changes this + so that compilation options that can only be changed at build + time are frozen in the build. Options that are compiler + dependent (and those that are system dependent) are evaluated + each time - pngconf.h holds these. Options that can be changed + per-file in the application are in png.h. Frozen options are + in the new installed header file pnglibconf.h (John Bowler) + Removed the xcode project because it has not been updated to work + with libpng-1.5.0. + Removed the ability to include optional pngusr.h + +Version 1.5.0beta18 [April 17, 2010] + Restored the ability to include optional pngusr.h + Moved replacements for png_error() and png_warning() from the + contrib/pngminim project to pngerror.c, for use when warnings or + errors are disabled via PNG_NO_WARN or PNG_NO_ERROR_TEXT, to avoid + storing unneeded error/warning text. + Updated contrib/pngminim project to work with the new pnglibconf.h + Added some PNG_NO_* defines to contrib/pngminim/*/pngusr.h to save space. + +Version 1.5.0beta19 [April 24, 2010] + Added PNG_{READ,WRITE}_INT_FUNCTIONS_SUPPORTED. This allows the functions + to read and write ints to be disabled independently of PNG_USE_READ_MACROS, + which allows libpng to be built with the functions even though the default + is to use the macros - this allows applications to choose at app build + time whether or not to use macros (previously impossible because the + functions weren't in the default build.) + Changed Windows calling convention back to __cdecl for API functions. + For Windows/x86 platforms only: + __stdcall is no longer needed for Visual Basic, so libpng-1.5.0 uses + __cdecl throughout (both API functions and callbacks) on Windows/x86 + platforms. + Replaced visualc6 and visualc71 projects with new vstudio project Relaxed the overly-restrictive permissions of some files. -version 1.4.2rc04 [April 28, 2010] - Added the "vstudio" project to replace "visualc6" and "visualc71" which - will be removed from libpng-1.5.0. - Demonstrate in example.c that lang_key should be initialized. +Version 1.5.0beta20 [April 24, 2010] + Relaxed more overly-restrictive permissions of some files. + +Version 1.5.0beta21 [April 27, 2010] + Removed some unwanted binary bytes and changed CRLF to NEWLINE in the new + vstudio project files, and some trivial editing of some files in the + scripts directory. Set PNG_NO_READ_BGR, PNG_NO_IO_STATE, and PNG_NO_TIME_RFC1123 in contrib/pngminim/decoder/pngusr.h to make a smaller decoder application. -version 1.4.2rc05 [April 29, 2010] - Include png_reset_zstream() in png.c only when PNG_READ_SUPPORTED is defined. - Removed dummy_inflate.c and uncompr.c from contrib/pngminim/encoder +Version 1.5.0beta22 [April 28, 2010] + Fixed dependencies of GET_INT_32 - it does not require READ_INT_FUNCTIONS + because it has a macro equivalent. + Improved the options.awk script; added an "everything off" option. + Revised contrib/pngminim to use the "everything off" option in pngusr.dfa. + +Version 1.5.0beta23 [April 29, 2010] + Corrected PNG_REMOVED macro to take five arguments. + The macro was documented with two arguments (name,ordinal), however + the symbol checking .dfn files assumed five arguments. The five + argument form seems more useful so it is changed to that. Corrected PNG_UNKNOWN_CHUNKS_SUPPORTED to PNG_HANDLE_AS_UNKNOWN_SUPPORTED in gregbook/readpng2.c Corrected protection of png_get_user_transform_ptr. The API declaration in png.h is removed if both READ and WRITE USER_TRANSFORM are turned off but was left defined in pngtrans.c + Added logunsupported=1 to cause pnglibconf.h to document disabled options. + This makes the installed pnglibconf.h more readable but causes no + other change. The intention is that users of libpng will find it + easier to understand if an API they need is missing. + Include png_reset_zstream() in png.c only when PNG_READ_SUPPORTED is defined. + Removed dummy_inflate.c from contrib/pngminim/encoder + Removed contrib/pngminim/*/gather.sh; gathering is now done in the makefile. -version 1.4.2rc06 [May 3, 2010] - Moved declarations of umsg[] inside the proper #ifdef blocks in pngrutil.c +Version 1.5.0beta24 [May 7, 2010] + Use bitwise "&" instead of arithmetic mod in pngrutil.c calculation of the + offset of the png_ptr->rowbuf pointer into png_ptr->big_row_buf. + Added more blank lines for readability. -version 1.4.2 [May 6, 2010] - -version 1.4.3beta01 [June 18, 2010] - Added missing quotation marks in the aix block of configure.ac - The new "vstudio" project was missing from the zip and 7z distributions. +Version 1.5.0beta25 [June 18, 2010] In pngpread.c: png_push_have_row() add check for new_row > height - -version 1.4.3beta02 [June 18, 2010] Removed the now-redundant check for out-of-bounds new_row from example.c -version 1.4.3beta03 [June 18, 2010] - In pngpread.c: png_push_finish_row() add check for too many rows. - -version 1.4.3beta04 [June 19, 2010] +Version 1.5.0beta26 [June 18, 2010] In pngpread.c: png_push_process_row() add check for too many rows. - Removed the checks added in beta01 and beta03, as they are now redundant. -version 1.4.3beta05 [June 20, 2010] +Version 1.5.0beta27 [June 18, 2010] + Removed the check added in beta25 as it is now redundant. + +Version 1.5.0beta28 [June 20, 2010] Rewrote png_process_IDAT_data to consistently treat extra data as warnings and handle end conditions more cleanly. - Removed the new (beta04) check in png_push_process_row(). + Removed the new (beta26) check in png_push_process_row(). -version 1.4.3rc01 [June 21, 2010] - Revised some comments in png_process_IDAT_data(). +Version 1.5.0beta29 [June 21, 2010] + Revised scripts/options.awk to work on Sunos (but still doesn't work) + Added comment to options.awk and contrib/pngminim/*/makefile to try nawk. -version 1.4.3rc02 [June 22, 2010] - Changed char *msg to PNG_CONST char *msg in pngrutil.c +Version 1.5.0beta30 [June 22, 2010] Stop memory leak when reading a malformed sCAL chunk. + +Version 1.5.0beta31 [June 26, 2010] + Revised pngpread.c patch of beta28 to avoid an endless loop. Removed some trailing blanks. -version 1.4.3rc03 [June 23, 2010] - Revised pngpread.c patch of beta05 to avoid an endless loop. +Version 1.5.0beta32 [June 26, 2010] + Removed leftover scripts/options.patch and scripts/options.rej -version 1.4.3 [June 26, 2010] - Updated some of the "last changed" dates. +Version 1.5.0beta33 [July 6, 3010] + Made FIXED and FLOATING options consistent in the APIs they enable and + disable. Corrected scripts/options.awk to handle both command line + options and options specified in the .dfa files. + Changed char *msg to PNG_CONST char *msg in pngrutil.c + Make png_set_sRGB_gAMA_and_cHRM set values using either the fixed or + floating point APIs, but not both. + Reversed patch to remove error handler when the jmp_buf is stored in the + main program structure, not the png_struct. + The error handler is needed because the default handler in libpng will + always use the jmp_buf in the library control structure; this is never + set. The gregbook code is a useful example because, even though it + uses setjmp/longjmp, it shows how error handling can be implemented + using control mechanisms not directly supported by libpng. The + technique will work correctly with mechanisms such as Microsoft + Structure Exceptions or C++ exceptions (compiler willing - note that gcc + does not by default support interworking of C and C++ error handling.) + Reverted changes to call png_longjmp in contrib/gregbook where it is not + appropriate. If mainprog->jmpbuf is used by setjmp, then png_longjmp + cannot be used. + Changed "extern PNG_EXPORT" to "PNG_EXPORT" in png.h (Jan Nijtmans) + Changed "extern" to "PNG_EXTERN" in pngpriv.h (except for the 'extern "C" {') -Send comments/corrections/commendations to glennrp at users.sourceforge.net -or to png-mng-implement at lists.sf.net (subscription required; visit -https://lists.sourceforge.net/lists/listinfo/png-mng-implement). +Version 1.5.0beta34 [July 12, 2010] + Put #ifndef PNG_EXTERN, #endif around the define PNG_EXTERN in pngpriv.h + +Version 1.5.0beta35 [July 24, 2010] + Removed some newly-added TAB characters. + Added -DNO_PNG_SNPRINTF to CFLAGS in scripts/makefile.dj2 + Moved the definition of png_snprintf() outside of the enclosing + #ifdef blocks in pngconf.h + +Version 1.5.0beta36 [July 29, 2010] + Patches by John Bowler: + Fixed point APIs are now supported throughout (no missing APIs). + Internal fixed point arithmetic support exists for all internal floating + point operations. + sCAL validates the floating point strings it is passed. + Safe, albeit rudimentary, Watcom support is provided by PNG_API_RULE==2 + Two new APIs exist to get the number of passes without turning on the + PNG_INTERLACE transform and to get the number of rows in the current + pass. + A new test program, pngvalid.c, validates the gamma code. + Errors in the 16 bit gamma correction (overflows) have been corrected. + cHRM chunk testing is done consistently (previously the floating point + API bypassed it, because the test really didn't work on FP, now the test + is performed on the actual values to be stored in the PNG file so it + works in the FP case too.) + Most floating point APIs now simply call the fixed point APIs after + converting the values to the fixed point form used in the PNG file. + The standard headers no longer include zlib.h, which is currently only + required for pngstruct.h and can therefore be internal. + Revised png_get_int_32 to undo the PNG two's complement representation of + negative numbers. + +Version 1.5.0beta37 [July 30, 2010] + Added a typecast in png_get_int_32() in png.h and pngrutil.h to avoid + a compiler warning. + Replaced oFFs 0,0 with oFFs -10,20 in pngtest.png + +Version 1.5.0beta38 [July 31, 2010] + Implemented remaining "_fixed" functions. + Corrected a number of recently introduced warnings mostly resulting from + safe but uncast assignments to shorter integers. Also added a zlib + VStudio release library project because the latest zlib Official Windows + build does not include such a thing. + Revised png_get_int_16() to be similar to png_get_int_32(). + Restored projects/visualc71. + +Version 1.5.0beta39 [August 2, 2010] + VisualC/GCC warning fixes, VisualC build fixes + The changes include support for function attributes in VC in addition to + those already present in GCC - necessary because without these some + warnings are unavoidable. Fixes include signed/unsigned fixes in + pngvalid and checks with gcc -Wall -Wextra -Wunused. + VC requires function attributes on function definitions as well as + declarations, PNG_FUNCTION has been added to enable this and the + relevant function definitions changed. + +Version 1.5.0beta40 [August 6, 2010] + Correct use of _WINDOWS_ in pngconf.h + Removed png_mem_ #defines; they are no longer used. + Added the sRGB chunk to pngtest.png + +Version 1.5.0beta41 [August 11, 2010] + Added the cHRM chunk to pngtest.png + Don't try to use version-script with cygwin/mingw. + Revised contrib/gregbook to work under cygwin/mingw. + +Version 1.5.0beta42 [August 18, 2010] + Add .dll.a to the list of extensions to be symlinked by Makefile.am (Yaakov) + Made all API functions that have const arguments and constant string + literal pointers declare them (John Bowler). + +Version 1.5.0beta43 [August 20, 2010] + Removed spurious tabs, shorten long lines (no source change) + Also added scripts/chkfmt to validate the format of all the files that can + reasonably be validated (it is suggested to run "make distclean" before + checking, because some machine generated files have long lines.) + Reformatted the CHANGES file to be more consistent throughout. + Made changes to address various issues identified by GCC, mostly + signed/unsigned and shortening problems on assignment but also a few + difficult to optimize (for GCC) loops. + Fixed non-GCC fixed point builds. In png.c a declaration was misplaced + in an earlier update. Fixed to declare the auto variables at the head. + Use cexcept.h in pngvalid.c. + +Version 1.5.0beta44 [August 24, 2010] + Updated CMakeLists.txt to use CMAKE_INSTALL_LIBDIR variable; useful for + installing libpng in /usr/lib64 (Funda Wang). + Revised CMakeLists.txt to put the man pages in share/man/man* not man/man* + Revised CMakeLists.txt to make symlinks instead of copies when installing. + Changed PNG_LIB_NAME from pngNN to libpngNN in CMakeLists.txt (Philip Lowman) + Implemented memory checks within pngvalid + Reformatted/rearranged pngvalid.c to assist use of progressive reader. + Check interlaced images in pngvalid + Clarified pngusr.h comments in pnglibconf.dfa + Simplified the pngvalid error-handling code now that cexcept.h is in place. + Implemented progressive reader in pngvalid.c for standard tests + Implemented progressive read in pngvalid.c gamma tests + Turn on progressive reader in pngvalid.c by default and tidy code. + +Version 1.5.0beta45 [August 26, 2010] + Added an explicit make step to projects/vstudio for pnglibconf.h + Also corrected zlib.vcxproj into which Visual Studio had introduced + what it calls an "authoring error". The change to make pnglibconf.h + simply copies the file; in the future it may actually generate the + file from scripts/pnglibconf.dfa as the other build systems do. + Changed pngvalid to work when floating point APIs are disabled + Renamed the prebuilt scripts/pnglibconf.h to scripts/pnglibconf.h.prebuilt + Supply default values for PNG_USER_PRIVATEBUILD and PNG_USER_DLLFNAME_POSTFIX + in pngpriv.h in case the user neglected to define them in their pngusr.h + +Version 1.5.0beta46 [August 28, 2010] + Added new private header files to libpng_sources in CMakeLists.txt + Added PNG_READ_16BIT, PNG_WRITE_16BIT, and PNG_16BIT options. + Added reference to scripts/pnglibconf.h.prebuilt in the visualc71 project. + +Version 1.5.0beta47 [September 11, 2010] + Fixed a number of problems with 64-bit compilation reported by Visual + Studio 2010 (John Bowler). + +Version 1.5.0beta48 [October 4, 2010] + Updated CMakeLists.txt (Philip Lowman). + Revised autogen.sh to recognize and use $AUTOCONF, $AUTOMAKE, $AUTOHEADER, + $AUTOPOINT, $ACLOCAL and $LIBTOOLIZE + Fixed problem with symbols creation in Makefile.am which was assuming that + all versions of ccp write to standard output by default (Martin Banky). The + bug was introduced in libpng-1.2.9beta5. + Removed unused mkinstalldirs. + +Version 1.5.0beta49 [October 8, 2010] + Undid Makefile.am revision of 1.5.0beta48. + +Version 1.5.0beta50 [October 14, 2010] + Revised Makefile.in to account for mkinstalldirs being removed. + Added some "(unsigned long)" typecasts in printf statements in pngvalid.c. + Suppressed a compiler warning in png_handle_sPLT(). + Check for out-of-range text compression mode in png_set_text(). + +Version 1.5.0beta51 [October 15, 2010] + Changed embedded dates to "(PENDING RELEASE) in beta releases (and future + rc releases) to minimize the difference between releases. + +Version 1.5.0beta52 [October 16, 2010] + Restored some of the embedded dates (in png.h, png.c, documentation, etc.) + +Version 1.5.0beta53 [October 18, 2010] + Updated INSTALL to mention using "make maintainer-clean" and to remove + obsolete statement about a custom ltmain.sh + Disabled "color-tests" by default in Makefile.am so it will work with + automake versions earlier than 1.11.1 + Use document name "libpng-manual.txt" instead of "libpng-.txt" + to simplify version differences. + Removed obsolete remarks about setjmp handling from INSTALL. + Revised and renamed the typedef in png.h and png.c that was designed + to catch library and header mismatch. + +Version 1.5.0beta54 [November 10, 2010] + Require 48 bytes, not 64 bytes, for big_row_buf in overflow checks. + Used a consistent structure for the pngget.c functions. + +Version 1.5.0beta55 [November 21, 2010] + Revised png_get_uint_32, png_get_int_32, png_get_uint_16 (Cosmin) + Moved reading of file signature into png_read_sig (Cosmin) + Fixed atomicity of chunk header serialization (Cosmin) + Added test for io_state in pngtest.c (Cosmin) + Added "#!/bin/sh" at the top of contrib/pngminim/*/gather.sh scripts. + Changes to remove gcc warnings (John Bowler) + Certain optional gcc warning flags resulted in warnings in libpng code. + With these changes only -Wconversion and -Wcast-qual cannot be turned on. + Changes are trivial rearrangements of code. -Wconversion is not possible + for pngrutil.c (because of the widespread use of += et al on variables + smaller than (int) or (unsigned int)) and -Wcast-qual is not possible + with pngwio.c and pngwutil.c because the 'write' callback and zlib + compression both fail to declare their input buffers with 'const'. + +Version 1.5.0beta56 [December 7, 2010] + Added the private PNG_UNUSED() macro definition in pngpriv.h. + Added some commentary about PNG_EXPORT in png.h and pngconf.h + Revised PNG_EXPORT() macro and added PNG_EXPORTA() macro, with the + objective of simplifying and improving the cosmetic appearance of png.h. + Fixed some incorrect "=" macro names in pnglibconf.dfa + Included documentation of changes in 1.5.0 from 1.4.x in libpng-manual.txt + +Version 1.5.0beta57 [December 9, 2010] + Documented the pngvalid gamma error summary with additional comments and + print statements. + Improved missing symbol handling in checksym.awk; symbols missing in both + the old and new files can now be optionally ignored, treated as errors + or warnings. + Removed references to pngvcrd.c and pnggccrd.c from the vstudio project. + Updated "libpng14" to "libpng15" in the visualc71 project. + Enabled the strip16 tests in pngvalid.` + Don't display test results (except PASS/FAIL) when running "make test". + Instead put them in pngtest-log.txt + Added "--with-zprefix=" to configure.ac + Updated the prebuilt configuration files to autoconf version 2.68 + +Version 1.5.0beta58 [December 19, 2010] + Fixed interlace image handling and add test cases (John Bowler) + Fixed the clean rule in Makefile.am to remove pngtest-log.txt + Made minor changes to work around warnings in gcc 3.4 + +Version 1.5.0rc01 [December 27, 2010] + No changes. + +Version 1.5.0rc02 [December 27, 2010] + Eliminated references to the scripts/*.def files in project/visualc71. + +Version 1.5.0rc03 [December 28, 2010] + Eliminated scripts/*.def and revised Makefile.am accordingly + +Version 1.5.0rc04 [December 29, 2010] + Fixed bug in background transformation handling in pngrtran.c (it was + looking for the flag in png_ptr->transformations instead of in + png_ptr->flags) (David Raymond). + +Version 1.5.0rc05 [December 31, 2010] + Fixed typo in a comment in CMakeLists.txt (libpng14 => libpng15) (Cosmin) + +Version 1.5.0rc06 [January 4, 2011] + Changed the new configure option "zprefix=string" to "zlib-prefix=string" + +Version 1.5.0rc07 [January 4, 2011] + Updated copyright year. + +Version 1.5.0 [January 6, 2011] + No changes. + +version 1.5.1beta01 [January 8, 2011] + Added description of png_set_crc_action() to the manual. + Added a note in the manual that the type of the iCCP profile was changed + from png_charpp to png_bytepp in png_get_iCCP(). This change happened + in version 1.5.0beta36 but is not noted in the CHANGES. Similarly, + it was changed from png_charpp to png_const_bytepp in png_set_iCCP(). + Ensure that png_rgb_to_gray ignores palette mapped images, if libpng + internally happens to call it with one. + Fixed a failure to handle palette mapped images correctly. + +Version 1.5.1beta02 [January 14, 2011] + Fixed a bug in handling of interlaced images (bero at arklinux.org). + Updated CMakeLists.txt (Clifford Yapp) + +Version 1.5.1beta03 [January 14, 2011] + Fixed typecasting of some png_debug() statements (Cosmin) + +Version 1.5.1beta04 [January 16, 2011] + Updated documentation of png_set|get_tRNS() (Thomas Klausner). + Mentioned in the documentation that applications must #include "zlib.h" + if they need access to anything in zlib.h, and that a number of + macros such as png_memset() are no longer accessible by applications. + Corrected pngvalid gamma test "sample" function to access all of the color + samples of each pixel, instead of sampling the red channel three times. + Prefixed variable names index, div, exp, gamma with "png_" to avoid "shadow" + warnings, and (mistakenly) changed png_exp() to exp(). + +Version 1.5.1beta05 [January 16, 2011] + Changed variable names png_index, png_div, png_exp, and png_gamma to + char_index, divisor, exp_b10, and gamma_val, respectively, and + changed exp() back to png_exp(). + +Version 1.5.1beta06 [January 20, 2011] + Prevent png_push_crc_skip() from hanging while reading an unknown chunk + or an over-large compressed zTXt chunk with the progressive reader. + Eliminated more GCC "shadow" warnings. + Revised png_fixed() in png.c to avoid compiler warning about reaching the + end without returning anything. + +Version 1.5.1beta07 [January 22, 2011] + In the manual, describe the png_get_IHDR() arguments in the correct order. + Added const_png_structp and const_png_infop types, and used them in + prototypes for most png_get_*() functions. + +Version 1.5.1beta08 [January 23, 2011] + Added png_get_io_chunk_type() and deprecated png_get_io_chunk_name() + Added synopses for the IO_STATE functions and other missing synopses + to the manual. Removed the synopses from libpngpf.3 because they + were out of date and no longer useful. Better information can be + obtained by reading the prototypes and comments in pngpriv.h + Attempted to fix cpp on Solaris with S. Studio 12 cc, fix build + Added a make macro DFNCPP that is a CPP that will accept the tokens in + a .dfn file and adds configure stuff to test for such a CPP. ./configure + should fail if one is not available. + Corrected const_png_ in png.h to png_const_ to avoid polluting the namespace. + Added png_get_current_row_number and png_get_current_pass_number for the + benefit of the user transform callback. + Added png_process_data_pause and png_process_data_skip for the benefit of + progressive readers that need to stop data processing or want to optimize + skipping of unread data (e.g., if the reader marks a chunk to be skipped.) + +Version 1.5.1beta09 [January 24, 2011] + Enhanced pngvalid, corrected an error in gray_to_rgb, corrected doc error. + pngvalid contains tests of transforms, which tests are currently disabled + because they are incompletely tested. gray_to_rgb was failing to expand + the bit depth for smaller bit depth images; this seems to be a long + standing error and resulted, apparently, in invalid output. The + documentation did not accurately describe what libpng really does when + converting RGB to gray. + +Version 1.5.1beta10 [January 27, 2010] + Fixed incorrect examples of callback prototypes in the manual, that were + introduced in libpng-1.0.0. + In addition the order of the png_get_uint macros with respect to the + relevant function definitions has been reversed. This helps the + preprocessing of the symbol files be more robust. Furthermore, the + symbol file preprocessing now uses -DPNG_NO_USE_READ_MACROS even when + the library may actually be built with PNG_USE_READ_MACROS; this stops + the read macros interfering with the symbol file format. + Made the manual, synopses, and function prototypes use the function + argument names file_gamma, int_file_gamma, and srgb_intent consistently. + +Version 1.5.1beta11 [January 28, 2011] + Changed PNG_UNUSED from "param=param;" to "{if(param){}}". + Corrected local variable type in new API png_process_data_skip() + The type was self-evidently incorrect but only causes problems on 64 bit + architectures. + Added transform tests to pngvalid and simplified the arguments. + +Version 1.5.1rc01 [January 29, 2011] + No changes. + +Version 1.5.1rc02 [January 31, 2011] + Added a request in the manual that applications do not use "png_" or + "PNG_" to begin any of their own symbols. + Changed PNG_UNUSED to "(void)param;" and updated the commentary in pngpriv.h + +Version 1.5.1 [February 3, 2011] + No changes. + +Version 1.5.2beta01 [February 13, 2011] + More -Wshadow fixes for older gcc compilers. Older gcc versions apparently + check formal parameters names in function declarations (as well as + definitions) to see if they match a name in the global namespace. + Revised PNG_EXPORTA macro to not use an empty parameter, to accommodate the + old VisualC++ preprocessor. + Turned on interlace handling in png_read_png(). + Fixed gcc pendantic warnings. + Handle longjmp in Cygwin. + Fixed png_get_current_row_number() in the interlaced case. + Cleaned up ALPHA flags and transformations. + Implemented expansion to 16 bits. + +Version 1.5.2beta02 [February 19, 2011] + Fixed mistake in the descriptions of user read_transform and write_transform + function prototypes in the manual. The row_info struct is png_row_infop. + Reverted png_get_current_row_number() to previous (1.5.2beta01) behavior. + Corrected png_get_current_row_number documentation + Fixed the read/write row callback documentation. + This documents the current behavior, where the callback is called after + every row with information pertaining to the next row. + +Version 1.5.2beta03 [March 3, 2011] + Fixed scripts/makefile.vcwin32 + Updated contrib/pngsuite/README to add the word "modify". + Define PNG_ALLOCATED to blank when _MSC_VER<1300. + +Version 1.5.2rc01 [March 19, 2011] + Define remaining attributes to blank when MSC_VER<1300. + ifdef out mask arrays in pngread.c when interlacing is not supported. + +Version 1.5.2rc02 [March 22, 2011] + Added a hint to try CPP=/bin/cpp if "cpp -E" fails in scripts/pnglibconf.mak + and in contrib/pngminim/*/makefile, eg., on SunOS 5.10, and removed "strip" + from the makefiles. + Fixed a bug (present since libpng-1.0.7) that makes png_handle_sPLT() fail + to compile when PNG_NO_POINTER_INDEXING is defined (Chubanov Kirill) + +Version 1.5.2rc03 [March 24, 2011] + Don't include standard header files in png.h while building the symbol table, + to avoid cpp failure on SunOS (introduced PNG_BUILDING_SYMBOL_TABLE macro). + +Version 1.5.2 [March 31, 2011] + +Send comments/corrections/commendations to png-mng-implement at lists.sf.net +(subscription required; visit +https://lists.sourceforge.net/lists/listinfo/png-mng-implement +to subscribe) +or to glennrp at users.sourceforge.net Glenn R-P */ } diff --git a/reactos/dll/3rdparty/libpng/docs/INSTALL b/reactos/dll/3rdparty/libpng/docs/INSTALL index 584ac048eac..353bfff3268 100644 --- a/reactos/dll/3rdparty/libpng/docs/INSTALL +++ b/reactos/dll/3rdparty/libpng/docs/INSTALL @@ -1,5 +1,5 @@ -Installing libpng version 1.4.3 - June 26, 2010 +Installing libpng On Unix/Linux and similar systems, you can simply type @@ -13,10 +13,16 @@ If configure does not work on your system and you have a reasonably up-to-date set of tools, running ./autogen.sh before running ./configure may fix the problem. You can also run the individual commands in autogen.sh with the --force option, if supported by your version of -the tools. If you run 'libtoolize --force', though, this will replace -the distributed, patched, version of ltmain.sh with an unpatched version -and your shared library builds may fail to produce libraries with the -correct version numbers. +the tools. To be really sure that you aren't using any of the included +pre-built scripts, you can do this: + + ./configure --enable-maintainer-mode + make maintainer-clean + ./autogen.sh + ./configure [--prefix=/path] [other options] + make + make install + make check Instead, you can use one of the custom-built makefiles in the "scripts" directory @@ -46,8 +52,8 @@ to have access to the zlib.h and zconf.h include files that correspond to the version of zlib that's installed. You can rename the directories that you downloaded (they -might be called "libpng-1.4.3" or "libpng14" and "zlib-1.2.3" -or "zlib123") so that you have directories called "zlib" and "libpng". +might be called "libpng-x.y.z" or "libpngNN" and "zlib-1.2.5" +or "zlib125") so that you have directories called "zlib" and "libpng". Your directory structure should look like this: @@ -70,13 +76,12 @@ Your directory structure should look like this: pngsuite visupng projects - cbuilder5 (Borland) - visualc6 (msvc) visualc71 - xcode + vstudio scripts makefile.* *.def (module definition files) + etc. pngtest.png etc. zlib @@ -107,7 +112,7 @@ scripts directory into this directory, for example Read the makefile to see if you need to change any source or target directories to match your preferences. -Then read pngconf.h to see if you want to make any configuration +Then read pnglibconf.dfa to see if you want to make any configuration changes. Then just run "make" which will create the libpng library in @@ -125,19 +130,6 @@ do that, run "make install" in the zlib directory first if necessary). Some also allow you to run "make test-installed" after you have run "make install". -If you encounter a compiler error message complaining about the -lines - - __png.h__ already includes setjmp.h; - __dont__ include it again.; - -this means you have compiled another module that includes setjmp.h, -which is hazardous because the two modules might not include exactly -the same setjmp.h. If you are sure that you know what you are doing -and that they are exactly the same, then you can comment out or -delete the two lines. Better yet, use the cexcept interface -instead, as demonstrated in contrib/visupng of the libpng distribution. - -Further information can be found in the README and libpng.txt +Further information can be found in the README and libpng-manual.txt files, in the individual makefiles, in png.h, and the manual pages libpng.3 and png.5. diff --git a/reactos/dll/3rdparty/libpng/docs/LICENSE b/reactos/dll/3rdparty/libpng/docs/LICENSE index dd89a668478..6e4808cc0bc 100644 --- a/reactos/dll/3rdparty/libpng/docs/LICENSE +++ b/reactos/dll/3rdparty/libpng/docs/LICENSE @@ -10,8 +10,8 @@ this sentence. This code is released under the libpng license. -libpng versions 1.2.6, August 15, 2004, through 1.4.3, June 26, 2010, are -Copyright (c) 2004, 2006-2007 Glenn Randers-Pehrson, and are +libpng versions 1.2.6, August 15, 2004, through 1.5.2, March 31, 2011, are +Copyright (c) 2004, 2006-2011 Glenn Randers-Pehrson, and are distributed according to the same disclaimer and license as libpng-1.2.5 with the following individual added to the list of Contributing Authors @@ -108,4 +108,4 @@ certification mark of the Open Source Initiative. Glenn Randers-Pehrson glennrp at users.sourceforge.net -June 26, 2010 +March 31, 2011 diff --git a/reactos/dll/3rdparty/libpng/docs/README b/reactos/dll/3rdparty/libpng/docs/README index 799f3ebe022..6a7cb33b212 100644 --- a/reactos/dll/3rdparty/libpng/docs/README +++ b/reactos/dll/3rdparty/libpng/docs/README @@ -1,4 +1,4 @@ -README for libpng version 1.4.3 - June 26, 2010 (shared library 14.0) +README for libpng version 1.5.2 - March 31, 2011 (shared library 15.0) See the note about version numbers near the top of png.h See INSTALL for instructions on how to install libpng. @@ -58,7 +58,7 @@ on the PNG-implement mailing list and not on material submitted privately to Guy, Andreas, or Glenn. They will forward any good suggestions to the list. -For a detailed description on using libpng, read libpng.txt. For +For a detailed description on using libpng, read libpng-manual.txt. For examples of libpng in a program, see example.c and pngtest.c. For usage information and restrictions (what little they are) on libpng, see png.h. For a description on using zlib (the compression library used by @@ -141,13 +141,17 @@ Files in this distribution: TODO => Things not implemented in the current library Y2KINFO => Statement of Y2K compliance example.c => Example code for using libpng functions - libpng.3 => manual page for libpng (includes libpng.txt) - libpng.txt => Description of libpng and its functions + libpng.3 => manual page for libpng (includes libpng-manual.txt) + libpng-manual.txt => Description of libpng and its functions libpngpf.3 => manual page for libpng's private functions png.5 => manual page for the PNG format png.c => Basic interface functions common to library - png.h => Library function and interface declarations - pngconf.h => System specific library configuration + png.h => Library function and interface declarations (public) + pngpriv.h => Library function and interface declarations (private) + pngconf.h => System specific library configuration (public) + pngstruct.h => png_struct declaration (private) + pnginfo.h => png_info struct declaration (private) + pngdebug.h => debugging macros (private) pngerror.c => Error/warning message I/O functions pngget.c => Functions for retrieving info from struct pngmem.c => Memory handling functions @@ -176,72 +180,16 @@ Files in this distribution: visupng => Contains a MSVC workspace for VisualPng projects => Contains project files and workspaces for building a DLL - c5builder => Contains a Borland workspace for building + cbuilder5 => Contains a Borland workspace for building libpng and zlib visualc6 => Contains a Microsoft Visual C++ (MSVC) workspace for building libpng and zlib + visualc71 => Contains a Microsoft Visual C++ (MSVC) + workspace for building libpng and zlib + xcode => Contains an Apple xcode + workspace for building libpng and zlib scripts => Directory containing scripts for building libpng: - descrip.mms => VMS makefile for MMS or MMK - makefile.std => Generic UNIX makefile (cc, creates static - libpng.a) - makefile.elf => Linux/ELF makefile symbol versioning, - gcc, creates libpng14.so.14.1.4.3) - makefile.linux => Linux/ELF makefile - (gcc, creates libpng14.so.14.1.4.3) - makefile.gcc => Generic makefile (gcc, creates static libpng.a) - makefile.knr => Archaic UNIX Makefile that converts files with - ansi2knr (Requires ansi2knr.c from - ftp://ftp.cs.wisc.edu/ghost) - makefile.aix => AIX makefile - makefile.cygwin => Cygwin/gcc makefile - makefile.darwin => Darwin makefile - makefile.dec => DEC Alpha UNIX makefile - makefile.freebsd => FreeBSD makefile - makefile.hpgcc => HPUX makefile using gcc - makefile.hpux => HPUX (10.20 and 11.00) makefile - makefile.hp64 => HPUX (10.20 and 11.00) makefile, 64 bit - makefile.ibmc => IBM C/C++ version 3.x for Win32 and OS/2 (static) - makefile.intel => Intel C/C++ version 4.0 and later - makefile.mingw => Mingw/gcc makefile - makefile.netbsd => NetBSD/cc makefile, makes libpng.so. - makefile.ne14bsd => NetBSD/cc makefile, makes - libpng14.so - makefile.openbsd => OpenBSD makefile - makefile.sgi => Silicon Graphics IRIX (cc, creates static lib) - makefile.sggcc => Silicon Graphics - (gcc, creates libpng14.so.14.1.4.3) - makefile.sunos => Sun makefile - makefile.solaris => Solaris 2.X makefile - (gcc, creates libpng14.so.14.1.4.3) - makefile.so9 => Solaris 9 makefile - (gcc, creates libpng14.so.14.1.4.3) - makefile.32sunu => Sun Ultra 32-bit makefile - makefile.64sunu => Sun Ultra 64-bit makefile - makefile.sco => For SCO OSr5 ELF and Unixware 7 with Native cc - makefile.mips => MIPS makefile - makefile.acorn => Acorn makefile - makefile.amiga => Amiga makefile - smakefile.ppc => AMIGA smakefile for SAS C V6.58/7.00 PPC - compiler (Requires SCOPTIONS, copied from - scripts/SCOPTIONS.ppc) - makefile.atari => Atari makefile - makefile.beos => BEOS makefile for X86 - makefile.bor => Borland makefile (uses bcc) - makefile.bc32 => 32-bit Borland C++ (all modules compiled in C mode) - makefile.tc3 => Turbo C 3.0 makefile - makefile.dj2 => DJGPP 2 makefile - makefile.msc => Microsoft C makefile - makefile.vcwin32 => makefile for Microsoft Visual C++ 4.0 and - later (does not use assembler code) - makefile.os2 => OS/2 Makefile (gcc and emx, requires pngos2.def) - png32ce.def => module definition for makefile.cegccg - pngos2.def => OS/2 module definition file used by - makefile.os2 - pngwin.def => module definition file used by - makefile.cygwin and makefile.mingw - makefile.watcom => Watcom 10a+ Makefile, 32-bit flat memory model - makevms.com => VMS build script - SCOPTIONS.ppc => Used with smakefile.ppc + (see scripts/README.txt for the list of scripts) Good luck, and happy coding. diff --git a/reactos/dll/3rdparty/libpng/docs/TODO b/reactos/dll/3rdparty/libpng/docs/TODO index 0af8d827a46..6e1f028bd75 100644 --- a/reactos/dll/3rdparty/libpng/docs/TODO +++ b/reactos/dll/3rdparty/libpng/docs/TODO @@ -2,14 +2,12 @@ TODO - list of things to do for libpng: Final bug fixes. -Improve API by hiding the png_struct and png_info structs. -Finish work on the no-floating-point version (including gamma compensation) Better C++ wrapper/full C++ implementation? Fix problem with C++ and EXTERN "C". cHRM transformation. -Improve setjmp/longjmp usage or remove it in favor of returning error codes. +Remove setjmp/longjmp usage in favor of returning error codes. Add "grayscale->palette" transformation and "palette->grayscale" detection. -Improved quantizing and dithering. +Improved dithering. Multi-lingual error and warning message support. Complete sRGB transformation (presently it simply uses gamma=0.45455). Man pages for function calls. @@ -18,14 +16,12 @@ Better filter selection (counting huffman bits/precompression? filter inertia? filter costs?). Histogram creation. Text conversion between different code pages (Latin-1 -> Mac and DOS). -Build gamma tables using fixed point (and do away with floating point entirely). Avoid building gamma tables whenever possible. Use greater precision when changing to linear gamma for compositing against background and doing rgb-to-gray transformation. Investigate pre-incremented loop counters and other loop constructions. Add interpolated method of handling interlacing. -Provide for conditional compilation of 16-bit support (except for the - initial stripping down to 8-bits when reading a 16-bit PNG datastream). Switch to the simpler zlib (zlib/libpng) license if legally possible. +Extend pngvalid.c to validate more of the libpng transformations. */ diff --git a/reactos/dll/3rdparty/libpng/docs/example.c b/reactos/dll/3rdparty/libpng/docs/example.c index d7391734de1..782c555b7a6 100644 --- a/reactos/dll/3rdparty/libpng/docs/example.c +++ b/reactos/dll/3rdparty/libpng/docs/example.c @@ -2,15 +2,15 @@ #if 0 /* in case someone actually tries to compile this */ /* example.c - an example of using libpng - * Last changed in libpng 1.4.2 [May 6, 2010] + * Last changed in libpng 1.5.2 [March 31, 2011] * This file has been placed in the public domain by the authors. - * Maintained 1998-2010 Glenn Randers-Pehrson + * Maintained 1998-2011 Glenn Randers-Pehrson * Maintained 1996, 1997 Andreas Dilger) * Written 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) */ /* This is an example of how to use libpng to read and write PNG files. - * The file libpng.txt is much more verbose then this. If you have not + * The file libpng-manual.txt is much more verbose then this. If you have not * read it, do so first. This was designed to be a starting point of an * implementation. This is not officially part of libpng, is hereby placed * in the public domain, and therefore does not require a copyright notice. @@ -31,7 +31,7 @@ */ #ifndef png_jmpbuf -# define png_jmpbuf(png_ptr) ((png_ptr)->jmpbuf) +# define png_jmpbuf(png_ptr) ((png_ptr)->png_jmpbuf) #endif /* Check to see if a file is a PNG file using png_sig_cmp(). png_sig_cmp() @@ -286,7 +286,6 @@ void read_png(FILE *fp, unsigned int sig_read) /* File is already open */ /* An array of colors to which the image should be quantized */ png_color std_color_cube[MAX_SCREEN_COLORS]; - /* Prior to libpng-1.4.2, this was png_set_dither(). */ png_set_quantize(png_ptr, std_color_cube, MAX_SCREEN_COLORS, MAX_SCREEN_COLORS, NULL, 0); } @@ -656,14 +655,18 @@ void write_png(char *file_name /* , ... other image information ... */) /* Optional significant bit (sBIT) chunk */ png_color_8 sig_bit; + /* If we are dealing with a grayscale image then */ sig_bit.gray = true_bit_depth; + /* Otherwise, if we are dealing with a color image then */ sig_bit.red = true_red_bit_depth; sig_bit.green = true_green_bit_depth; sig_bit.blue = true_blue_bit_depth; + /* If the image has an alpha channel then */ sig_bit.alpha = true_alpha_bit_depth; + png_set_sBIT(png_ptr, info_ptr, &sig_bit); @@ -676,20 +679,21 @@ void write_png(char *file_name /* , ... other image information ... */) text_ptr[0].key = "Title"; text_ptr[0].text = "Mona Lisa"; text_ptr[0].compression = PNG_TEXT_COMPRESSION_NONE; + text_ptr[0].itxt_length = 0; + text_ptr[0].lang = NULL; + text_ptr[0].lang_key = NULL; text_ptr[1].key = "Author"; text_ptr[1].text = "Leonardo DaVinci"; text_ptr[1].compression = PNG_TEXT_COMPRESSION_NONE; + text_ptr[1].itxt_length = 0; + text_ptr[1].lang = NULL; + text_ptr[1].lang_key = NULL; text_ptr[2].key = "Description"; text_ptr[2].text = ""; text_ptr[2].compression = PNG_TEXT_COMPRESSION_zTXt; -#ifdef PNG_iTXt_SUPPORTED - text_ptr[0].lang = NULL; - text_ptr[0].lang_key = NULL; - text_ptr[1].lang = NULL; - text_ptr[1].lang_key = NULL; + text_ptr[2].itxt_length = 0; text_ptr[2].lang = NULL; text_ptr[2].lang_key = NULL; -#endif png_set_text(png_ptr, info_ptr, text_ptr, 3); /* Other optional chunks like cHRM, bKGD, tRNS, tIME, oFFs, pHYs */ @@ -754,6 +758,7 @@ void write_png(char *file_name /* , ... other image information ... */) /* Turn on interlace handling if you are not using png_write_image() */ if (interlacing) number_passes = png_set_interlace_handling(png_ptr); + else number_passes = 1; diff --git a/reactos/dll/3rdparty/libpng/docs/libpng-manual.txt b/reactos/dll/3rdparty/libpng/docs/libpng-manual.txt new file mode 100644 index 00000000000..46934084601 --- /dev/null +++ b/reactos/dll/3rdparty/libpng/docs/libpng-manual.txt @@ -0,0 +1,4214 @@ +libpng-manual.txt - A description on how to use and modify libpng + + libpng version 1.5.2 - March 31, 2011 + Updated and distributed by Glenn Randers-Pehrson + + Copyright (c) 1998-2011 Glenn Randers-Pehrson + + This document is released under the libpng license. + For conditions of distribution and use, see the disclaimer + and license in png.h + + Based on: + + libpng versions 0.97, January 1998, through 1.5.2 - March 31, 2011 + Updated and distributed by Glenn Randers-Pehrson + Copyright (c) 1998-2011 Glenn Randers-Pehrson + + libpng 1.0 beta 6 version 0.96 May 28, 1997 + Updated and distributed by Andreas Dilger + Copyright (c) 1996, 1997 Andreas Dilger + + libpng 1.0 beta 2 - version 0.88 January 26, 1996 + For conditions of distribution and use, see copyright + notice in png.h. Copyright (c) 1995, 1996 Guy Eric + Schalnat, Group 42, Inc. + + Updated/rewritten per request in the libpng FAQ + Copyright (c) 1995, 1996 Frank J. T. Wojcik + December 18, 1995 & January 20, 1996 + +I. Introduction + +This file describes how to use and modify the PNG reference library +(known as libpng) for your own use. There are five sections to this +file: introduction, structures, reading, writing, and modification and +configuration notes for various special platforms. In addition to this +file, example.c is a good starting point for using the library, as +it is heavily commented and should include everything most people +will need. We assume that libpng is already installed; see the +INSTALL file for instructions on how to install libpng. + +For examples of libpng usage, see the files "example.c", "pngtest.c", +and the files in the "contrib" directory, all of which are included in +the libpng distribution. + +Libpng was written as a companion to the PNG specification, as a way +of reducing the amount of time and effort it takes to support the PNG +file format in application programs. + +The PNG specification (second edition), November 2003, is available as +a W3C Recommendation and as an ISO Standard (ISO/IEC 15948:2003 (E)) at +. It is technically equivalent +to the PNG specification (second edition) but has some additional material. + +The PNG-1.0 specification is available +as RFC 2083 and as a +W3C Recommendation . + +Some additional chunks are described in the special-purpose public chunks +documents at . + +Other information +about PNG, and the latest version of libpng, can be found at the PNG home +page, . + +Most users will not have to modify the library significantly; advanced +users may want to modify it more. All attempts were made to make it as +complete as possible, while keeping the code easy to understand. +Currently, this library only supports C. Support for other languages +is being considered. + +Libpng has been designed to handle multiple sessions at one time, +to be easily modifiable, to be portable to the vast majority of +machines (ANSI, K&R, 16-, 32-, and 64-bit) available, and to be easy +to use. The ultimate goal of libpng is to promote the acceptance of +the PNG file format in whatever way possible. While there is still +work to be done (see the TODO file), libpng should cover the +majority of the needs of its users. + +Libpng uses zlib for its compression and decompression of PNG files. +Further information about zlib, and the latest version of zlib, can +be found at the zlib home page, . +The zlib compression utility is a general purpose utility that is +useful for more than PNG files, and can be used without libpng. +See the documentation delivered with zlib for more details. +You can usually find the source files for the zlib utility wherever you +find the libpng source files. + +Libpng is thread safe, provided the threads are using different +instances of the structures. Each thread should have its own +png_struct and png_info instances, and thus its own image. +Libpng does not protect itself against two threads using the +same instance of a structure. + +II. Structures + +There are two main structures that are important to libpng, png_struct +and png_info. Both are internal structures that are no longer exposed +in the libpng interface (as of libpng 1.5.0). + +The png_info structure is designed to provide information about the +PNG file. At one time, the fields of png_info were intended to be +directly accessible to the user. However, this tended to cause problems +with applications using dynamically loaded libraries, and as a result +a set of interface functions for png_info (the png_get_*() and png_set_*() +functions) was developed. + +The png_struct structure is the object used by the library to decode a +single image. As of 1.5.0 this structure is also not exposed. + +Almost all libpng APIs require a pointer to a png_struct as the first argument. +Many (in particular the png_set and png_get APIs) also require a pointer +to png_info as the second argument. Some application visible macros +defined in png.h designed for basic data access (reading and writing +integers in the PNG format) break this rule, but it's almost always safe +to assume that a (png_struct*) has to be passed to call an API function. + +The png.h header file is an invaluable reference for programming with libpng. +And while I'm on the topic, make sure you include the libpng header file: + +#include + +Types + +The png.h header file defines a number of integral types used by the +APIs. Most of these are fairly obvious; for example types corresponding +to integers of particular sizes and types for passing color values. + +One exception is how non-integral numbers are handled. For application +convenience most APIs that take such numbers have C (double) arguments, +however internally PNG, and libpng, use 32 bit signed integers and encode +the value by multiplying by 100,000. As of libpng 1.5.0 a convenience +macro PNG_FP_1 is defined in png.h along with a type (png_fixed_point) +which is simply (png_int_32). + +All APIs that take (double) arguments also have an matching API that +takes the corresponding fixed point integer arguments. The fixed point +API has the same name as the floating point one with _fixed appended. +The actual range of values permitted in the APIs is frequently less than +the full range of (png_fixed_point) (-21474 to +21474). When APIs require +a non-negative argument the type is recorded as png_uint_32 above. Consult +the header file and the text below for more information. + +Special care must be take with sCAL chunk handling because the chunk itself +uses non-integral values encoded as strings containing decimal floating point +numbers. See the comments in the header file. + +Configuration + +The main header file function declarations are frequently protected by C +preprocessing directives of the form: + + #ifdef PNG_feature_SUPPORTED + declare-function + #endif + +The library can be built without support for these APIs, although a +standard build will have all implemented APIs. Application programs +should check the feature macros before using an API for maximum +portability. From libpng 1.5.0 the feature macros set during the build +of libpng are recorded in the header file "pnglibconf.h" and this file +is always included by png.h. + +If you don't need to change the library configuration from the default skip to +the next section ("Reading"). + +Notice that some of the makefiles in the 'scripts' directory and (in 1.5.0) all +of the build project files in the 'projects' directory simply copy +scripts/pnglibconf.h.prebuilt to pnglibconf.h. This means that these build +systems do not permit easy auto-configuration of the library - they only +support the default configuration. + +The easiest way to make minor changes to the libpng configuration when +auto-configuration is supported is to add definitions to the command line +using (typically) CPPFLAGS. For example: + +CPPFLAGS=-DPNG_NO_FLOATING_ARITHMETIC + +will change the internal libpng math implementation for gamma correction and +other arithmetic calculations to fixed point, avoiding the need for fast +floating point support. The result can be seen in the generated pnglibconf.h - +make sure it contains the changed feature macro setting. + +If you need to make more extensive configuration changes - more than one or two +feature macro settings - you can either add -DPNG_USER_CONFIG to the build +command line and put a list of feature macro settings in pngusr.h or you can set +DFA_XTRA (a makefile variable) to a file containing the same information in the +form of 'option' settings. + +A. Changing pnglibconf.h + +A variety of methods exist to build libpng. Not all of these support +reconfiguration of pnglibconf.h. To reconfigure pnglibconf.h it must either be +rebuilt from scripts/pnglibconf.dfa using awk or it must be edited by hand. + +Hand editing is achieved by copying scripts/pnglibconf.h.prebuilt and changing +the lines defining the supported features, paying very close attention to the +'option' information in scripts/pnglibconf.dfa that describes those features and +their requirements. This is easy to get wrong. + +B. Configuration using DFA_XTRA + +Rebuilding from pnglibconf.dfa is easy if a functioning 'awk', or a later +variant such as 'nawk' or 'gawk', is available. The configure build will +automatically find an appropriate awk and build pnglibconf.h. +scripts/pnglibconf.mak contains a set of make rules for doing the same thing if +configure is not used, and many of the makefiles in the scripts directory use +this approach. + +When rebuilding simply write new file containing changed options and set +DFA_XTRA to the name of this file. This causes the build to append the new file +to the end of scripts/pnglibconf.dfa. pngusr.dfa should contain lines of the +following forms: + +everything = off + +This turns all optional features off. Include it at the start of pngusr.dfa to +make it easier to build a minimal configuration. You will need to turn at least +some features on afterward to enable either reading or writing code, or both. + +option feature on +option feature off + +Enable or disable a single feature. This will automatically enable other +features required by a feature that is turned on or disable other features that +require a feature which is turned off. Conflicting settings will cause an error +message to be emitted by awk. + +setting feature default value + +Changes the default value of setting 'feature' to 'value'. There are a small +number of settings listed at the top of pnglibconf.h, they are documented in the +source code. Most of these values have performance implications for the library +but most of them have no visible effect on the API. Some can also be overridden +from the API. + +C. Configuration using PNG_USR_CONFIG + +If -DPNG_USR_CONFIG is added to the CFLAGS when pnglibconf.h is built the file +pngusr.h will automatically be included before the options in +scripts/pnglibconf.dfa are processed. pngusr.h should contain only macro +definitions turning features on or off or setting settings. + +Apart from the global setting "everything = off" all the options listed above +can be set using macros in pngusr.h: + +#define PNG_feature_SUPPORTED + +is equivalent to: + +option feature on + +#define PNG_NO_feature + +is equivalent to: + +option feature off + +#define PNG_feature value + +is equivalent to: + +setting feature default value + +Notice that in both cases, pngusr.dfa and pngusr.h, the contents of the +pngusr file you supply override the contents of scripts/pnglibconf.dfa + +If confusing or incomprehensible behavior results it is possible to +examine the intermediate file pnglibconf.dfn to find the full set of +dependency information for each setting and option. Simply locate the +feature in the file and read the C comments that precede it. + +III. Reading + +We'll now walk you through the possible functions to call when reading +in a PNG file sequentially, briefly explaining the syntax and purpose +of each one. See example.c and png.h for more detail. While +progressive reading is covered in the next section, you will still +need some of the functions discussed in this section to read a PNG +file. + +Setup + +You will want to do the I/O initialization(*) before you get into libpng, +so if it doesn't work, you don't have much to undo. Of course, you +will also want to insure that you are, in fact, dealing with a PNG +file. Libpng provides a simple check to see if a file is a PNG file. +To use it, pass in the first 1 to 8 bytes of the file to the function +png_sig_cmp(), and it will return 0 (false) if the bytes match the +corresponding bytes of the PNG signature, or nonzero (true) otherwise. +Of course, the more bytes you pass in, the greater the accuracy of the +prediction. + +If you are intending to keep the file pointer open for use in libpng, +you must ensure you don't read more than 8 bytes from the beginning +of the file, and you also have to make a call to png_set_sig_bytes_read() +with the number of bytes you read from the beginning. Libpng will +then only check the bytes (if any) that your program didn't read. + +(*): If you are not using the standard I/O functions, you will need +to replace them with custom functions. See the discussion under +Customizing libpng. + + + FILE *fp = fopen(file_name, "rb"); + if (!fp) + { + return (ERROR); + } + + fread(header, 1, number, fp); + is_png = !png_sig_cmp(header, 0, number); + + if (!is_png) + { + return (NOT_PNG); + } + + +Next, png_struct and png_info need to be allocated and initialized. In +order to ensure that the size of these structures is correct even with a +dynamically linked libpng, there are functions to initialize and +allocate the structures. We also pass the library version, optional +pointers to error handling functions, and a pointer to a data struct for +use by the error functions, if necessary (the pointer and functions can +be NULL if the default error handlers are to be used). See the section +on Changes to Libpng below regarding the old initialization functions. +The structure allocation functions quietly return NULL if they fail to +create the structure, so your application should check for that. + + png_structp png_ptr = png_create_read_struct + (PNG_LIBPNG_VER_STRING, (png_voidp)user_error_ptr, + user_error_fn, user_warning_fn); + + if (!png_ptr) + return (ERROR); + + png_infop info_ptr = png_create_info_struct(png_ptr); + + if (!info_ptr) + { + png_destroy_read_struct(&png_ptr, + (png_infopp)NULL, (png_infopp)NULL); + return (ERROR); + } + + png_infop end_info = png_create_info_struct(png_ptr); + + if (!end_info) + { + png_destroy_read_struct(&png_ptr, &info_ptr, + (png_infopp)NULL); + return (ERROR); + } + +If you want to use your own memory allocation routines, +use a libpng that was built with PNG_USER_MEM_SUPPORTED defined, and use +png_create_read_struct_2() instead of png_create_read_struct(): + + png_structp png_ptr = png_create_read_struct_2 + (PNG_LIBPNG_VER_STRING, (png_voidp)user_error_ptr, + user_error_fn, user_warning_fn, (png_voidp) + user_mem_ptr, user_malloc_fn, user_free_fn); + +The error handling routines passed to png_create_read_struct() +and the memory alloc/free routines passed to png_create_struct_2() +are only necessary if you are not using the libpng supplied error +handling and memory alloc/free functions. + +When libpng encounters an error, it expects to longjmp back +to your routine. Therefore, you will need to call setjmp and pass +your png_jmpbuf(png_ptr). If you read the file from different +routines, you will need to update the jmpbuf field every time you enter +a new routine that will call a png_*() function. + +See your documentation of setjmp/longjmp for your compiler for more +information on setjmp/longjmp. See the discussion on libpng error +handling in the Customizing Libpng section below for more information +on the libpng error handling. If an error occurs, and libpng longjmp's +back to your setjmp, you will want to call png_destroy_read_struct() to +free any memory. + + if (setjmp(png_jmpbuf(png_ptr))) + { + png_destroy_read_struct(&png_ptr, &info_ptr, + &end_info); + fclose(fp); + return (ERROR); + } + +If you would rather avoid the complexity of setjmp/longjmp issues, +you can compile libpng with PNG_NO_SETJMP, in which case +errors will result in a call to PNG_ABORT() which defaults to abort(). + +You can #define PNG_ABORT() to a function that does something +more useful than abort(), as long as your function does not +return. + +Now you need to set up the input code. The default for libpng is to +use the C function fread(). If you use this, you will need to pass a +valid FILE * in the function png_init_io(). Be sure that the file is +opened in binary mode. If you wish to handle reading data in another +way, you need not call the png_init_io() function, but you must then +implement the libpng I/O methods discussed in the Customizing Libpng +section below. + + png_init_io(png_ptr, fp); + +If you had previously opened the file and read any of the signature from +the beginning in order to see if this was a PNG file, you need to let +libpng know that there are some bytes missing from the start of the file. + + png_set_sig_bytes(png_ptr, number); + +You can change the zlib compression buffer size to be used while +reading compressed data with + + png_set_compression_buffer_size(png_ptr, buffer_size); + +where the default size is 8192 bytes. Note that the buffer size +is changed immediately and the buffer is reallocated immediately, +instead of setting a flag to be acted upon later. + +If you want CRC errors to be handled in a different manner than +the default, use + + png_set_crc_action(png_ptr, crit_action, ancil_action); + +The values for png_set_crc_action() say how libpng is to handle CRC errors in +ancillary and critical chunks, and whether to use the data contained +therein. Note that it is impossible to "discard" data in a critical +chunk. + +Choices for (int) crit_action are + PNG_CRC_DEFAULT 0 error/quit + PNG_CRC_ERROR_QUIT 1 error/quit + PNG_CRC_WARN_USE 3 warn/use data + PNG_CRC_QUIET_USE 4 quiet/use data + PNG_CRC_NO_CHANGE 5 use the current value + +Choices for (int) ancil_action are + PNG_CRC_DEFAULT 0 error/quit + PNG_CRC_ERROR_QUIT 1 error/quit + PNG_CRC_WARN_DISCARD 2 warn/discard data + PNG_CRC_WARN_USE 3 warn/use data + PNG_CRC_QUIET_USE 4 quiet/use data + PNG_CRC_NO_CHANGE 5 use the current value + +Setting up callback code + +You can set up a callback function to handle any unknown chunks in the +input stream. You must supply the function + + read_chunk_callback(png_structp png_ptr, + png_unknown_chunkp chunk); + { + /* The unknown chunk structure contains your + chunk data, along with similar data for any other + unknown chunks: */ + + png_byte name[5]; + png_byte *data; + png_size_t size; + + /* Note that libpng has already taken care of + the CRC handling */ + + /* put your code here. Search for your chunk in the + unknown chunk structure, process it, and return one + of the following: */ + + return (-n); /* chunk had an error */ + return (0); /* did not recognize */ + return (n); /* success */ + } + +(You can give your function another name that you like instead of +"read_chunk_callback") + +To inform libpng about your function, use + + png_set_read_user_chunk_fn(png_ptr, user_chunk_ptr, + read_chunk_callback); + +This names not only the callback function, but also a user pointer that +you can retrieve with + + png_get_user_chunk_ptr(png_ptr); + +If you call the png_set_read_user_chunk_fn() function, then all unknown +chunks will be saved when read, in case your callback function will need +one or more of them. This behavior can be changed with the +png_set_keep_unknown_chunks() function, described below. + +At this point, you can set up a callback function that will be +called after each row has been read, which you can use to control +a progress meter or the like. It's demonstrated in pngtest.c. +You must supply a function + + void read_row_callback(png_structp png_ptr, + png_uint_32 row, int pass); + { + /* put your code here */ + } + +(You can give it another name that you like instead of "read_row_callback") + +To inform libpng about your function, use + + png_set_read_status_fn(png_ptr, read_row_callback); + +When this function is called the row has already been completely processed and +the 'row' and 'pass' refer to the next row to be handled. For the +non-interlaced case the row that was just handled is simply one less than the +passed in row number, and pass will always be 0. For the interlaced case the +same applies unless the row value is 0, in which case the row just handled was +the last one from one of the preceding passes. Because interlacing may skip a +pass you cannot be sure that the preceding pass is just 'pass-1', if you really +need to know what the last pass is record (row,pass) from the callback and use +the last recorded value each time. + +As with the user transform you can find the output row using the +PNG_ROW_FROM_PASS_ROW macro. + +Unknown-chunk handling + +Now you get to set the way the library processes unknown chunks in the +input PNG stream. Both known and unknown chunks will be read. Normal +behavior is that known chunks will be parsed into information in +various info_ptr members while unknown chunks will be discarded. This +behavior can be wasteful if your application will never use some known +chunk types. To change this, you can call: + + png_set_keep_unknown_chunks(png_ptr, keep, + chunk_list, num_chunks); + keep - 0: default unknown chunk handling + 1: ignore; do not keep + 2: keep only if safe-to-copy + 3: keep even if unsafe-to-copy + + You can use these definitions: + PNG_HANDLE_CHUNK_AS_DEFAULT 0 + PNG_HANDLE_CHUNK_NEVER 1 + PNG_HANDLE_CHUNK_IF_SAFE 2 + PNG_HANDLE_CHUNK_ALWAYS 3 + + chunk_list - list of chunks affected (a byte string, + five bytes per chunk, NULL or '\0' if + num_chunks is 0) + + num_chunks - number of chunks affected; if 0, all + unknown chunks are affected. If nonzero, + only the chunks in the list are affected + +Unknown chunks declared in this way will be saved as raw data onto a +list of png_unknown_chunk structures. If a chunk that is normally +known to libpng is named in the list, it will be handled as unknown, +according to the "keep" directive. If a chunk is named in successive +instances of png_set_keep_unknown_chunks(), the final instance will +take precedence. The IHDR and IEND chunks should not be named in +chunk_list; if they are, libpng will process them normally anyway. + +Here is an example of the usage of png_set_keep_unknown_chunks(), +where the private "vpAg" chunk will later be processed by a user chunk +callback function: + + png_byte vpAg[5]={118, 112, 65, 103, (png_byte) '\0'}; + + #if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) + png_byte unused_chunks[]= + { + 104, 73, 83, 84, (png_byte) '\0', /* hIST */ + 105, 84, 88, 116, (png_byte) '\0', /* iTXt */ + 112, 67, 65, 76, (png_byte) '\0', /* pCAL */ + 115, 67, 65, 76, (png_byte) '\0', /* sCAL */ + 115, 80, 76, 84, (png_byte) '\0', /* sPLT */ + 116, 73, 77, 69, (png_byte) '\0', /* tIME */ + }; + #endif + + ... + + #if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) + /* ignore all unknown chunks: */ + png_set_keep_unknown_chunks(read_ptr, 1, NULL, 0); + + /* except for vpAg: */ + png_set_keep_unknown_chunks(read_ptr, 2, vpAg, 1); + + /* also ignore unused known chunks: */ + png_set_keep_unknown_chunks(read_ptr, 1, unused_chunks, + (int)sizeof(unused_chunks)/5); + #endif + +User limits + +The PNG specification allows the width and height of an image to be as +large as 2^31-1 (0x7fffffff), or about 2.147 billion rows and columns. +Since very few applications really need to process such large images, +we have imposed an arbitrary 1-million limit on rows and columns. +Larger images will be rejected immediately with a png_error() call. If +you wish to override this limit, you can use + + png_set_user_limits(png_ptr, width_max, height_max); + +to set your own limits, or use width_max = height_max = 0x7fffffffL +to allow all valid dimensions (libpng may reject some very large images +anyway because of potential buffer overflow conditions). + +You should put this statement after you create the PNG structure and +before calling png_read_info(), png_read_png(), or png_process_data(). +If you need to retrieve the limits that are being applied, use + + width_max = png_get_user_width_max(png_ptr); + height_max = png_get_user_height_max(png_ptr); + +The PNG specification sets no limit on the number of ancillary chunks +allowed in a PNG datastream. You can impose a limit on the total number +of sPLT, tEXt, iTXt, zTXt, and unknown chunks that will be stored, with + + png_set_chunk_cache_max(png_ptr, user_chunk_cache_max); + +where 0x7fffffffL means unlimited. You can retrieve this limit with + + chunk_cache_max = png_get_chunk_cache_max(png_ptr); + +This limit also applies to the number of buffers that can be allocated +by png_decompress_chunk() while decompressing iTXt, zTXt, and iCCP chunks. + +You can also set a limit on the amount of memory that a compressed chunk +other than IDAT can occupy, with + + png_set_chunk_malloc_max(png_ptr, user_chunk_malloc_max); + +and you can retrieve the limit with + + chunk_malloc_max = png_get_chunk_malloc_max(png_ptr); + +Any chunks that would cause either of these limits to be exceeded will +be ignored. + +The high-level read interface + +At this point there are two ways to proceed; through the high-level +read interface, or through a sequence of low-level read operations. +You can use the high-level interface if (a) you are willing to read +the entire image into memory, and (b) the input transformations +you want to do are limited to the following set: + + PNG_TRANSFORM_IDENTITY No transformation + PNG_TRANSFORM_STRIP_16 Strip 16-bit samples to + 8 bits + PNG_TRANSFORM_STRIP_ALPHA Discard the alpha channel + PNG_TRANSFORM_PACKING Expand 1, 2 and 4-bit + samples to bytes + PNG_TRANSFORM_PACKSWAP Change order of packed + pixels to LSB first + PNG_TRANSFORM_EXPAND Perform set_expand() + PNG_TRANSFORM_INVERT_MONO Invert monochrome images + PNG_TRANSFORM_SHIFT Normalize pixels to the + sBIT depth + PNG_TRANSFORM_BGR Flip RGB to BGR, RGBA + to BGRA + PNG_TRANSFORM_SWAP_ALPHA Flip RGBA to ARGB or GA + to AG + PNG_TRANSFORM_INVERT_ALPHA Change alpha from opacity + to transparency + PNG_TRANSFORM_SWAP_ENDIAN Byte-swap 16-bit samples + PNG_TRANSFORM_GRAY_TO_RGB Expand grayscale samples + to RGB (or GA to RGBA) + +(This excludes setting a background color, doing gamma transformation, +quantizing, and setting filler.) If this is the case, simply do this: + + png_read_png(png_ptr, info_ptr, png_transforms, NULL) + +where png_transforms is an integer containing the bitwise OR of some +set of transformation flags. This call is equivalent to png_read_info(), +followed the set of transformations indicated by the transform mask, +then png_read_image(), and finally png_read_end(). + +(The final parameter of this call is not yet used. Someday it might point +to transformation parameters required by some future input transform.) + +You must use png_transforms and not call any png_set_transform() functions +when you use png_read_png(). + +After you have called png_read_png(), you can retrieve the image data +with + + row_pointers = png_get_rows(png_ptr, info_ptr); + +where row_pointers is an array of pointers to the pixel data for each row: + + png_bytep row_pointers[height]; + +If you know your image size and pixel size ahead of time, you can allocate +row_pointers prior to calling png_read_png() with + + if (height > PNG_UINT_32_MAX/png_sizeof(png_byte)) + png_error (png_ptr, + "Image is too tall to process in memory"); + + if (width > PNG_UINT_32_MAX/pixel_size) + png_error (png_ptr, + "Image is too wide to process in memory"); + + row_pointers = png_malloc(png_ptr, + height*png_sizeof(png_bytep)); + + for (int i=0; i) and +png_get_(png_ptr, info_ptr, ...) functions return non-zero if the +data has been read, or zero if it is missing. The parameters to the +png_get_ are set directly if they are simple data types, or a +pointer into the info_ptr is returned for any complex types. + + png_get_PLTE(png_ptr, info_ptr, &palette, + &num_palette); + + palette - the palette for the file + (array of png_color) + + num_palette - number of entries in the palette + + png_get_gAMA(png_ptr, info_ptr, &file_gamma); + png_get_gAMA_fixed(png_ptr, info_ptr, &int_file_gamma); + + file_gamma - the gamma at which the file is + written (PNG_INFO_gAMA) + + int_file_gamma - 100,000 times the gamma at which the + file is written + + png_get_sRGB(png_ptr, info_ptr, &srgb_intent); + + file_srgb_intent - the rendering intent (PNG_INFO_sRGB) + The presence of the sRGB chunk + means that the pixel data is in the + sRGB color space. This chunk also + implies specific values of gAMA and + cHRM. + + png_get_iCCP(png_ptr, info_ptr, &name, + &compression_type, &profile, &proflen); + + name - The profile name. + + compression_type - The compression type; always + PNG_COMPRESSION_TYPE_BASE for PNG 1.0. + You may give NULL to this argument to + ignore it. + + profile - International Color Consortium color + profile data. May contain NULs. + + proflen - length of profile data in bytes. + + png_get_sBIT(png_ptr, info_ptr, &sig_bit); + + sig_bit - the number of significant bits for + (PNG_INFO_sBIT) each of the gray, + red, green, and blue channels, + whichever are appropriate for the + given color type (png_color_16) + + png_get_tRNS(png_ptr, info_ptr, &trans_alpha, + &num_trans, &trans_color); + + trans_alpha - array of alpha (transparency) + entries for palette (PNG_INFO_tRNS) + + num_trans - number of transparent entries + (PNG_INFO_tRNS) + + trans_color - graylevel or color sample values of + the single transparent color for + non-paletted images (PNG_INFO_tRNS) + + png_get_hIST(png_ptr, info_ptr, &hist); + (PNG_INFO_hIST) + + hist - histogram of palette (array of + png_uint_16) + + png_get_tIME(png_ptr, info_ptr, &mod_time); + + mod_time - time image was last modified + (PNG_VALID_tIME) + + png_get_bKGD(png_ptr, info_ptr, &background); + + background - background color (PNG_VALID_bKGD) + valid 16-bit red, green and blue + values, regardless of color_type + + num_comments = png_get_text(png_ptr, info_ptr, + &text_ptr, &num_text); + + num_comments - number of comments + + text_ptr - array of png_text holding image + comments + + text_ptr[i].compression - type of compression used + on "text" PNG_TEXT_COMPRESSION_NONE + PNG_TEXT_COMPRESSION_zTXt + PNG_ITXT_COMPRESSION_NONE + PNG_ITXT_COMPRESSION_zTXt + + text_ptr[i].key - keyword for comment. Must contain + 1-79 characters. + + text_ptr[i].text - text comments for current + keyword. Can be empty. + + text_ptr[i].text_length - length of text string, + after decompression, 0 for iTXt + + text_ptr[i].itxt_length - length of itxt string, + after decompression, 0 for tEXt/zTXt + + text_ptr[i].lang - language of comment (empty + string for unknown). + + text_ptr[i].lang_key - keyword in UTF-8 + (empty string for unknown). + + Note that the itxt_length, lang, and lang_key + members of the text_ptr structure only exist + when the library is built with iTXt chunk support. + + num_text - number of comments (same as + num_comments; you can put NULL here + to avoid the duplication) + + Note while png_set_text() will accept text, language, + and translated keywords that can be NULL pointers, the + structure returned by png_get_text will always contain + regular zero-terminated C strings. They might be + empty strings but they will never be NULL pointers. + + num_spalettes = png_get_sPLT(png_ptr, info_ptr, + &palette_ptr); + + num_spalettes - number of sPLT chunks read. + + palette_ptr - array of palette structures holding + contents of one or more sPLT chunks + read. + + png_get_oFFs(png_ptr, info_ptr, &offset_x, &offset_y, + &unit_type); + + offset_x - positive offset from the left edge + of the screen + + offset_y - positive offset from the top edge + of the screen + + unit_type - PNG_OFFSET_PIXEL, PNG_OFFSET_MICROMETER + + png_get_pHYs(png_ptr, info_ptr, &res_x, &res_y, + &unit_type); + + res_x - pixels/unit physical resolution in + x direction + + res_y - pixels/unit physical resolution in + x direction + + unit_type - PNG_RESOLUTION_UNKNOWN, + PNG_RESOLUTION_METER + + png_get_sCAL(png_ptr, info_ptr, &unit, &width, + &height) + + unit - physical scale units (an integer) + + width - width of a pixel in physical scale units + + height - height of a pixel in physical scale units + (width and height are doubles) + + png_get_sCAL_s(png_ptr, info_ptr, &unit, &width, + &height) + + unit - physical scale units (an integer) + + width - width of a pixel in physical scale units + + height - height of a pixel in physical scale units + (width and height are strings like "2.54") + + num_unknown_chunks = png_get_unknown_chunks(png_ptr, + info_ptr, &unknowns) + + unknowns - array of png_unknown_chunk + structures holding unknown chunks + + unknowns[i].name - name of unknown chunk + + unknowns[i].data - data of unknown chunk + + unknowns[i].size - size of unknown chunk's data + + unknowns[i].location - position of chunk in file + + The value of "i" corresponds to the order in which the + chunks were read from the PNG file or inserted with the + png_set_unknown_chunks() function. + +The data from the pHYs chunk can be retrieved in several convenient +forms: + + res_x = png_get_x_pixels_per_meter(png_ptr, + info_ptr) + + res_y = png_get_y_pixels_per_meter(png_ptr, + info_ptr) + + res_x_and_y = png_get_pixels_per_meter(png_ptr, + info_ptr) + + res_x = png_get_x_pixels_per_inch(png_ptr, + info_ptr) + + res_y = png_get_y_pixels_per_inch(png_ptr, + info_ptr) + + res_x_and_y = png_get_pixels_per_inch(png_ptr, + info_ptr) + + aspect_ratio = png_get_pixel_aspect_ratio(png_ptr, + info_ptr) + + Each of these returns 0 [signifying "unknown"] if + the data is not present or if res_x is 0; + res_x_and_y is 0 if res_x != res_y + + Note that because of the way the resolutions are + stored internally, the inch conversions won't + come out to exactly even number. For example, + 72 dpi is stored as 0.28346 pixels/meter, and + when this is retrieved it is 71.9988 dpi, so + be sure to round the returned value appropriately + if you want to display a reasonable-looking result. + +The data from the oFFs chunk can be retrieved in several convenient +forms: + + x_offset = png_get_x_offset_microns(png_ptr, info_ptr); + + y_offset = png_get_y_offset_microns(png_ptr, info_ptr); + + x_offset = png_get_x_offset_inches(png_ptr, info_ptr); + + y_offset = png_get_y_offset_inches(png_ptr, info_ptr); + + Each of these returns 0 [signifying "unknown" if both + x and y are 0] if the data is not present or if the + chunk is present but the unit is the pixel. The + remark about inexact inch conversions applies here + as well, because a value in inches can't always be + converted to microns and back without some loss + of precision. + +For more information, see the png_info definition in png.h and the +PNG specification for chunk contents. Be careful with trusting +rowbytes, as some of the transformations could increase the space +needed to hold a row (expand, filler, gray_to_rgb, etc.). +See png_read_update_info(), below. + +A quick word about text_ptr and num_text. PNG stores comments in +keyword/text pairs, one pair per chunk, with no limit on the number +of text chunks, and a 2^31 byte limit on their size. While there are +suggested keywords, there is no requirement to restrict the use to these +strings. It is strongly suggested that keywords and text be sensible +to humans (that's the point), so don't use abbreviations. Non-printing +symbols are not allowed. See the PNG specification for more details. +There is also no requirement to have text after the keyword. + +Keywords should be limited to 79 Latin-1 characters without leading or +trailing spaces, but non-consecutive spaces are allowed within the +keyword. It is possible to have the same keyword any number of times. +The text_ptr is an array of png_text structures, each holding a +pointer to a language string, a pointer to a keyword and a pointer to +a text string. The text string, language code, and translated +keyword may be empty or NULL pointers. The keyword/text +pairs are put into the array in the order that they are received. +However, some or all of the text chunks may be after the image, so, to +make sure you have read all the text chunks, don't mess with these +until after you read the stuff after the image. This will be +mentioned again below in the discussion that goes with png_read_end(). + +Input transformations + +After you've read the header information, you can set up the library +to handle any special transformations of the image data. The various +ways to transform the data will be described in the order that they +should occur. This is important, as some of these change the color +type and/or bit depth of the data, and some others only work on +certain color types and bit depths. Even though each transformation +checks to see if it has data that it can do something with, you should +make sure to only enable a transformation if it will be valid for the +data. For example, don't swap red and blue on grayscale data. + +The colors used for the background and transparency values should be +supplied in the same format/depth as the current image data. They +are stored in the same format/depth as the image data in a bKGD or tRNS +chunk, so this is what libpng expects for this data. The colors are +transformed to keep in sync with the image data when an application +calls the png_read_update_info() routine (see below). + +Data will be decoded into the supplied row buffers packed into bytes +unless the library has been told to transform it into another format. +For example, 4 bit/pixel paletted or grayscale data will be returned +2 pixels/byte with the leftmost pixel in the high-order bits of the +byte, unless png_set_packing() is called. 8-bit RGB data will be stored +in RGB RGB RGB format unless png_set_filler() or png_set_add_alpha() +is called to insert filler bytes, either before or after each RGB triplet. +16-bit RGB data will be returned RRGGBB RRGGBB, with the most significant +byte of the color value first, unless png_set_strip_16() is called to +transform it to regular RGB RGB triplets, or png_set_filler() or +png_set_add alpha() is called to insert filler bytes, either before or +after each RRGGBB triplet. Similarly, 8-bit or 16-bit grayscale data can +be modified with +png_set_filler(), png_set_add_alpha(), or png_set_strip_16(). + +The following code transforms grayscale images of less than 8 to 8 bits, +changes paletted images to RGB, and adds a full alpha channel if there is +transparency information in a tRNS chunk. This is most useful on +grayscale images with bit depths of 2 or 4 or if there is a multiple-image +viewing application that wishes to treat all images in the same way. + + if (color_type == PNG_COLOR_TYPE_PALETTE) + png_set_palette_to_rgb(png_ptr); + + if (png_get_valid(png_ptr, info_ptr, + PNG_INFO_tRNS)) png_set_tRNS_to_alpha(png_ptr); + + if (color_type == PNG_COLOR_TYPE_GRAY && + bit_depth < 8) png_set_expand_gray_1_2_4_to_8(png_ptr); + +The first two functions are actually aliases for png_set_expand(), added +in libpng version 1.0.4, with the function names expanded to improve code +readability. In some future version they may actually do different +things. + +As of libpng version 1.2.9, png_set_expand_gray_1_2_4_to_8() was +added. It expands the sample depth without changing tRNS to alpha. + +As of libpng version 1.5.2, png_set_expand_16() was added. It behaves as +png_set_expand(), however, the resultant channels have 16 bits rather than 8. +Use this when the output color or gray channels are made linear to avoid fairly +severe accuracy loss. + + if (bit_depth < 16) + png_set_expand_16(png_ptr); + +PNG can have files with 16 bits per channel. If you only can handle +8 bits per channel, this will strip the pixels down to 8 bit. + + if (bit_depth == 16) + png_set_strip_16(png_ptr); + +If, for some reason, you don't need the alpha channel on an image, +and you want to remove it rather than combining it with the background +(but the image author certainly had in mind that you *would* combine +it with the background, so that's what you should probably do): + + if (color_type & PNG_COLOR_MASK_ALPHA) + png_set_strip_alpha(png_ptr); + +See below for png_set_background(), which does the correct composition on a +single opaque color. This is probably what you should do in all cases rather +than use png_set_strip_alpha() - unless you know for sure that it is the wrong +thing to do. + +As of libpng version 1.5.2, almost all useful expansions are supported, the +major ommissions are convertion of grayscale to indexed images (which can be +done trivially in the application) and convertion of indexed to grayscale (which +can be done by a trivial manipulation of the palette.) + +In the following table, the 01 means grayscale with depth<8, 31 means +indexed with depth<8, other numerals represent the color type, "T" means +the tRNS chunk is present, A means an alpha channel is present, and O +means tRNS or alpha is present but all pixels in the image are opaque. + + FROM 01 31 0 0T 0O 2 2T 2O 3 3T 3O 4A 4O 6A 6O + TO + 01 - [G] - - - - - - - - - - - - - + 31 [Q] Q [Q] [Q] [Q] Q Q Q Q Q Q [Q] [Q] Q Q + 0 1 G + . . G G G G G G B B GB GB + 0T lt Gt t + . Gt G G Gt G G Bt Bt GBt GBt + 0O lt Gt t . + Gt Gt G Gt Gt G Bt Bt GBt GBt + 2 C P C C C + . . C - - CB CB B B + 2T Ct - Ct C C t + t - - - CBt CBt Bt Bt + 2O Ct - Ct C C t t + - - - CBt CBt Bt Bt + 3 [Q] p [Q] [Q] [Q] Q Q Q + . . [Q] [Q] Q Q + 3T [Qt] p [Qt][Q] [Q] Qt Qt Qt t + t [Qt][Qt] Qt Qt + 3O [Qt] p [Qt][Q] [Q] Qt Qt Qt t t + [Qt][Qt] Qt Qt + 4A lA G A T T GA GT GT GA GT GT + BA G GBA + 4O lA GBA A T T GA GT GT GA GT GT BA + GBA G + 6A CA PA CA C C A T tT PA P P C CBA + BA + 6O CA PBA CA C C A tT T PA P P CBA C BA + + +Within the matrix, + "+" identifies entries where 'from' and 'to' are the same. + "-" means the transformation is not supported. + "." means nothing is necessary (a tRNS chunk can just be ignored). + "t" means the transformation is obtained by png_set_tRNS. + "A" means the transformation is obtained by png_set_add_alpha(). + "X" means the transformation is obtained by png_set_expand(). + "1" means the transformation is obtained by + png_set_expand_gray_1_2_4_to_8() (and by png_set_expand() if there + is no transparency in the original or the final format). + "C" means the transformation is obtained by png_set_gray_to_rgb(). + "G" means the transformation is obtained by png_set_rgb_to_gray() or + png_set_rgb_to_Y(). + "P" means the transformation is obtained by + png_set_expand_palette_to_rgb(). + "p" means the transformation is obtained by png_set_packing(). + "Q" means the transformation is obtained by png_set_quantize(). + "T" means the transformation is obtained by png_set_tRNS_to_alpha(). + "B" means the transformation is obtained by png_set_background(), or + png_strip_alpha(). + +When an entry has multiple transforms listed all are required to cause the +right overall transformation. When two transforms are separated by a comma +either will do the job. When transforms are enclosed in [] the transform should +do the job but this is currently unimplemented - a different format will result +if the suggested transformations are used. + +In PNG files, the alpha channel in an image +is the level of opacity. If you need the alpha channel in an image to +be the level of transparency instead of opacity, you can invert the +alpha channel (or the tRNS chunk data) after it's read, so that 0 is +fully opaque and 255 (in 8-bit or paletted images) or 65535 (in 16-bit +images) is fully transparent, with + + png_set_invert_alpha(png_ptr); + +PNG files pack pixels of bit depths 1, 2, and 4 into bytes as small as +they can, resulting in, for example, 8 pixels per byte for 1 bit +files. This code expands to 1 pixel per byte without changing the +values of the pixels: + + if (bit_depth < 8) + png_set_packing(png_ptr); + +PNG files have possible bit depths of 1, 2, 4, 8, and 16. All pixels +stored in a PNG image have been "scaled" or "shifted" up to the next +higher possible bit depth (e.g. from 5 bits/sample in the range [0,31] +to 8 bits/sample in the range [0, 255]). However, it is also possible +to convert the PNG pixel data back to the original bit depth of the +image. This call reduces the pixels back down to the original bit depth: + + png_color_8p sig_bit; + + if (png_get_sBIT(png_ptr, info_ptr, &sig_bit)) + png_set_shift(png_ptr, sig_bit); + +PNG files store 3-color pixels in red, green, blue order. This code +changes the storage of the pixels to blue, green, red: + + if (color_type == PNG_COLOR_TYPE_RGB || + color_type == PNG_COLOR_TYPE_RGB_ALPHA) + png_set_bgr(png_ptr); + +PNG files store RGB pixels packed into 3 or 6 bytes. This code expands them +into 4 or 8 bytes for windowing systems that need them in this format: + + if (color_type == PNG_COLOR_TYPE_RGB) + png_set_filler(png_ptr, filler, PNG_FILLER_BEFORE); + +where "filler" is the 8 or 16-bit number to fill with, and the location is +either PNG_FILLER_BEFORE or PNG_FILLER_AFTER, depending upon whether +you want the filler before the RGB or after. This transformation +does not affect images that already have full alpha channels. To add an +opaque alpha channel, use filler=0xff or 0xffff and PNG_FILLER_AFTER which +will generate RGBA pixels. + +Note that png_set_filler() does not change the color type. If you want +to do that, you can add a true alpha channel with + + if (color_type == PNG_COLOR_TYPE_RGB || + color_type == PNG_COLOR_TYPE_GRAY) + png_set_add_alpha(png_ptr, filler, PNG_FILLER_AFTER); + +where "filler" contains the alpha value to assign to each pixel. +This function was added in libpng-1.2.7. + +If you are reading an image with an alpha channel, and you need the +data as ARGB instead of the normal PNG format RGBA: + + if (color_type == PNG_COLOR_TYPE_RGB_ALPHA) + png_set_swap_alpha(png_ptr); + +For some uses, you may want a grayscale image to be represented as +RGB. This code will do that conversion: + + if (color_type == PNG_COLOR_TYPE_GRAY || + color_type == PNG_COLOR_TYPE_GRAY_ALPHA) + png_set_gray_to_rgb(png_ptr); + +Conversely, you can convert an RGB or RGBA image to grayscale or grayscale +with alpha. + + if (color_type == PNG_COLOR_TYPE_RGB || + color_type == PNG_COLOR_TYPE_RGB_ALPHA) + png_set_rgb_to_gray_fixed(png_ptr, error_action, + int red_weight, int green_weight); + + error_action = 1: silently do the conversion + + error_action = 2: issue a warning if the original + image has any pixel where + red != green or red != blue + + error_action = 3: issue an error and abort the + conversion if the original + image has any pixel where + red != green or red != blue + + red_weight: weight of red component times 100000 + + green_weight: weight of green component times 100000 + If either weight is negative, default + weights (21268, 71514) are used. + +If you have set error_action = 1 or 2, you can +later check whether the image really was gray, after processing +the image rows, with the png_get_rgb_to_gray_status(png_ptr) function. +It will return a png_byte that is zero if the image was gray or +1 if there were any non-gray pixels. bKGD and sBIT data +will be silently converted to grayscale, using the green channel +data, regardless of the error_action setting. + +With red_weight+green_weight<=100000, +the normalized graylevel is computed: + + int rw = red_weight * 65536; + int gw = green_weight * 65536; + int bw = 65536 - (rw + gw); + gray = (rw*red + gw*green + bw*blue)/65536; + +The default values approximate those recommended in the Charles +Poynton's Color FAQ, +Copyright (c) 1998-01-04 Charles Poynton + + Y = 0.212671 * R + 0.715160 * G + 0.072169 * B + +Libpng approximates this with integers scaled by 32768: + + Y = (6968 * R + 23434 * G + 2366 * B)/32768 + +The calculation is done in a linear colorspace, if the image gamma +can be determined. + +If you have a grayscale and you are using png_set_expand_gray_1_2_4_to_8(), +png_set_expand(), or png_set_gray_to_rgb to change to truecolor or to +a higher bit-depth, you must either supply the background color as a gray +value at the original file bit-depth (need_expand = 1) or else supply the +background color as an RGB triplet at the final, expanded bit depth +(need_expand = 0). Similarly, if you are reading a paletted image, you +must either supply the background color as a palette index (need_expand = 1) +or as an RGB triplet that may or may not be in the palette (need_expand = 0). + + png_color_16 my_background; + png_color_16p image_background; + + if (png_get_bKGD(png_ptr, info_ptr, &image_background)) + png_set_background(png_ptr, image_background, + PNG_BACKGROUND_GAMMA_FILE, 1, 1.0); + else + png_set_background(png_ptr, &my_background, + PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0); + +The png_set_background() function tells libpng to composite images +with alpha or simple transparency against the supplied background +color. If the PNG file contains a bKGD chunk (PNG_INFO_bKGD valid), +you may use this color, or supply another color more suitable for +the current display (e.g., the background color from a web page). You +need to tell libpng whether the color is in the gamma space of the +display (PNG_BACKGROUND_GAMMA_SCREEN for colors you supply), the file +(PNG_BACKGROUND_GAMMA_FILE for colors from the bKGD chunk), or one +that is neither of these gammas (PNG_BACKGROUND_GAMMA_UNIQUE - I don't +know why anyone would use this, but it's here). + +To properly display PNG images on any kind of system, the application needs +to know what the display gamma is. Ideally, the user will know this, and +the application will allow them to set it. One method of allowing the user +to set the display gamma separately for each system is to check for a +SCREEN_GAMMA or DISPLAY_GAMMA environment variable, which will hopefully be +correctly set. + +Note that display_gamma is the overall gamma correction required to produce +pleasing results, which depends on the lighting conditions in the surrounding +environment. In a dim or brightly lit room, no compensation other than +the physical gamma exponent of the monitor is needed, while in a dark room +a slightly smaller exponent is better. + + double gamma, screen_gamma; + + if (/* We have a user-defined screen + gamma value */) + { + screen_gamma = user_defined_screen_gamma; + } + + /* One way that applications can share the same + screen gamma value */ + else if ((gamma_str = getenv("SCREEN_GAMMA")) + != NULL) + { + screen_gamma = (double)atof(gamma_str); + } + + /* If we don't have another value */ + else + { + screen_gamma = 2.2; /* A good guess for a + PC monitor in a bright office or a dim room */ + + screen_gamma = 2.0; /* A good guess for a + PC monitor in a dark room */ + + screen_gamma = 1.7 or 1.0; /* A good + guess for Mac systems */ + } + +The functions png_set_gamma() and its fixed point equivalent +png_set_gamma_fixed() handle gamma transformations of the data. +Pass both the file gamma and the current screen_gamma. If the file does +not have a gamma value, you can pass one anyway if you have an idea what +it is (usually 0.45455 is a good guess for GIF images on PCs). Note +that file gammas are inverted from screen gammas. See the discussions +on gamma in the PNG specification for an excellent description of what +gamma is, and why all applications should support it. It is strongly +recommended that PNG viewers support gamma correction. + + if (png_get_gAMA(png_ptr, info_ptr, &file_gamma)) + png_set_gamma(png_ptr, screen_gamma, file_gamma); + + else + png_set_gamma(png_ptr, screen_gamma, 0.45455); + +If you need to reduce an RGB file to a paletted file, or if a paletted +file has more entries then will fit on your screen, png_set_quantize() +will do that. Note that this is a simple match quantization that merely +finds the closest color available. This should work fairly well with +optimized palettes, but fairly badly with linear color cubes. If you +pass a palette that is larger then maximum_colors, the file will +reduce the number of colors in the palette so it will fit into +maximum_colors. If there is a histogram, it will use it to make +more intelligent choices when reducing the palette. If there is no +histogram, it may not do as good a job. + + if (color_type & PNG_COLOR_MASK_COLOR) + { + if (png_get_valid(png_ptr, info_ptr, + PNG_INFO_PLTE)) + { + png_uint_16p histogram = NULL; + + png_get_hIST(png_ptr, info_ptr, + &histogram); + png_set_quantize(png_ptr, palette, num_palette, + max_screen_colors, histogram, 1); + } + + else + { + png_color std_color_cube[MAX_SCREEN_COLORS] = + { ... colors ... }; + + png_set_quantize(png_ptr, std_color_cube, + MAX_SCREEN_COLORS, MAX_SCREEN_COLORS, + NULL,0); + } + } + +PNG files describe monochrome as black being zero and white being one. +The following code will reverse this (make black be one and white be +zero): + + if (bit_depth == 1 && color_type == PNG_COLOR_TYPE_GRAY) + png_set_invert_mono(png_ptr); + +This function can also be used to invert grayscale and gray-alpha images: + + if (color_type == PNG_COLOR_TYPE_GRAY || + color_type == PNG_COLOR_TYPE_GRAY_ALPHA) + png_set_invert_mono(png_ptr); + +PNG files store 16 bit pixels in network byte order (big-endian, +ie. most significant bits first). This code changes the storage to the +other way (little-endian, i.e. least significant bits first, the +way PCs store them): + + if (bit_depth == 16) + png_set_swap(png_ptr); + +If you are using packed-pixel images (1, 2, or 4 bits/pixel), and you +need to change the order the pixels are packed into bytes, you can use: + + if (bit_depth < 8) + png_set_packswap(png_ptr); + +Finally, you can write your own transformation function if none of +the existing ones meets your needs. This is done by setting a callback +with + + png_set_read_user_transform_fn(png_ptr, + read_transform_fn); + +You must supply the function + + void read_transform_fn(png_structp png_ptr, png_row_infop + row_info, png_bytep data) + +See pngtest.c for a working example. Your function will be called +after all of the other transformations have been processed. Take care with +interlaced images if you do the interlace yourself - the width of the row is the +width in 'row_info', not the overall image width. + +If supported libpng provides two information routines that you can use to find +where you are in processing the image: + + png_get_current_pass_number(png_structp png_ptr); + png_get_current_row_number(png_structp png_ptr); + +Don't try using these outside a transform callback - firstly they are only +supported if user transforms are supported, secondly they may well return +unexpected results unless the row is actually being processed at the moment they +are called. + +With interlaced +images the value returned is the row in the input sub-image image. Use +PNG_ROW_FROM_PASS_ROW(row, pass) and PNG_COL_FROM_PASS_COL(col, pass) to +find the output pixel (x,y) given an interlaced sub-image pixel (row,col,pass). + +The discussion of interlace handling above contains more information on how to +use these values. + +You can also set up a pointer to a user structure for use by your +callback function, and you can inform libpng that your transform +function will change the number of channels or bit depth with the +function + + png_set_user_transform_info(png_ptr, user_ptr, + user_depth, user_channels); + +The user's application, not libpng, is responsible for allocating and +freeing any memory required for the user structure. + +You can retrieve the pointer via the function +png_get_user_transform_ptr(). For example: + + voidp read_user_transform_ptr = + png_get_user_transform_ptr(png_ptr); + +The last thing to handle is interlacing; this is covered in detail below, +but you must call the function here if you want libpng to handle expansion +of the interlaced image. + + number_of_passes = png_set_interlace_handling(png_ptr); + +After setting the transformations, libpng can update your png_info +structure to reflect any transformations you've requested with this +call. This is most useful to update the info structure's rowbytes +field so you can use it to allocate your image memory. This function +will also update your palette with the correct screen_gamma and +background if these have been given with the calls above. + + png_read_update_info(png_ptr, info_ptr); + +After you call png_read_update_info(), you can allocate any +memory you need to hold the image. The row data is simply +raw byte data for all forms of images. As the actual allocation +varies among applications, no example will be given. If you +are allocating one large chunk, you will need to build an +array of pointers to each row, as it will be needed for some +of the functions below. + +Remember: Before you call png_read_update_info(), the png_get_ +functions return the values corresponding to the original PNG image. +After you call png_read_update_info the values refer to the image +that libpng will output. Consequently you must call all the png_set_ +functions before you call png_read_update_info(). This is particularly +important for png_set_interlace_handling() - if you are going to call +png_read_update_info() you must call png_set_interlace_handling() before +it unless you want to receive interlaced output. + +Reading image data + +After you've allocated memory, you can read the image data. +The simplest way to do this is in one function call. If you are +allocating enough memory to hold the whole image, you can just +call png_read_image() and libpng will read in all the image data +and put it in the memory area supplied. You will need to pass in +an array of pointers to each row. + +This function automatically handles interlacing, so you don't +need to call png_set_interlace_handling() (unless you call +png_read_update_info()) or call this function multiple times, or any +of that other stuff necessary with png_read_rows(). + + png_read_image(png_ptr, row_pointers); + +where row_pointers is: + + png_bytep row_pointers[height]; + +You can point to void or char or whatever you use for pixels. + +If you don't want to read in the whole image at once, you can +use png_read_rows() instead. If there is no interlacing (check +interlace_type == PNG_INTERLACE_NONE), this is simple: + + png_read_rows(png_ptr, row_pointers, NULL, + number_of_rows); + +where row_pointers is the same as in the png_read_image() call. + +If you are doing this just one row at a time, you can do this with +a single row_pointer instead of an array of row_pointers: + + png_bytep row_pointer = row; + png_read_row(png_ptr, row_pointer, NULL); + +If the file is interlaced (interlace_type != 0 in the IHDR chunk), things +get somewhat harder. The only current (PNG Specification version 1.2) +interlacing type for PNG is (interlace_type == PNG_INTERLACE_ADAM7); +a somewhat complicated 2D interlace scheme, known as Adam7, that +breaks down an image into seven smaller images of varying size, based +on an 8x8 grid. This number is defined (from libpng 1.5) as +PNG_INTERLACE_ADAM7_PASSES in png.h + +libpng can fill out those images or it can give them to you "as is". +It is almost always better to have libpng handle the interlacing for you. +If you want the images filled out, there are two ways to do that. The one +mentioned in the PNG specification is to expand each pixel to cover +those pixels that have not been read yet (the "rectangle" method). +This results in a blocky image for the first pass, which gradually +smooths out as more pixels are read. The other method is the "sparkle" +method, where pixels are drawn only in their final locations, with the +rest of the image remaining whatever colors they were initialized to +before the start of the read. The first method usually looks better, +but tends to be slower, as there are more pixels to put in the rows. + +If, as is likely, you want libpng to expand the images, call this before +calling png_start_read_image() or png_read_update_info(): + + if (interlace_type == PNG_INTERLACE_ADAM7) + number_of_passes + = png_set_interlace_handling(png_ptr); + +This will return the number of passes needed. Currently, this is seven, +but may change if another interlace type is added. This function can be +called even if the file is not interlaced, where it will return one pass. +You then need to read the whole image 'number_of_passes' times. Each time +will distribute the pixels from the current pass to the correct place in +the output image, so you need to supply the same rows to png_read_rows in +each pass. + +If you are not going to display the image after each pass, but are +going to wait until the entire image is read in, use the sparkle +effect. This effect is faster and the end result of either method +is exactly the same. If you are planning on displaying the image +after each pass, the "rectangle" effect is generally considered the +better looking one. + +If you only want the "sparkle" effect, just call png_read_rows() as +normal, with the third parameter NULL. Make sure you make pass over +the image number_of_passes times, and you don't change the data in the +rows between calls. You can change the locations of the data, just +not the data. Each pass only writes the pixels appropriate for that +pass, and assumes the data from previous passes is still valid. + + png_read_rows(png_ptr, row_pointers, NULL, + number_of_rows); + +If you only want the first effect (the rectangles), do the same as +before except pass the row buffer in the third parameter, and leave +the second parameter NULL. + + png_read_rows(png_ptr, NULL, row_pointers, + number_of_rows); + +If you don't want libpng to handle the interlacing details, just call +png_read_rows() PNG_INTERLACE_ADAM7_PASSES times to read in all the images. +Each of the images is a valid image by itself, however you will almost +certainly need to distribute the pixels from each sub-image to the +correct place. This is where everything gets very tricky. + +If you want to retrieve the separate images you must pass the correct +number of rows to each successive call of png_read_rows(). The calculation +gets pretty complicated for small images, where some sub-images may +not even exist because either their width or height ends up zero. +libpng provides two macros to help you in 1.5 and later versions: + + png_uint_32 width = PNG_PASS_COLS(image_width, pass_number); + png_uint_32 height = PNG_PASS_ROWS(image_height, pass_number); + +Respectively these tell you the width and height of the sub-image +corresponding to the numbered pass. 'pass' is in in the range 0 to 6 - +this can be confusing because the specification refers to the same passes +as 1 to 7! Be careful, you must check both the width and height before +calling png_read_rows() and not call it for that pass if either is zero. + +You can, of course, read each sub-image row by row. If you want to +produce optimal code to make a pixel-by-pixel transformation of an +interlaced image this is the best approach; read each row of each pass, +transform it, and write it out to a new interlaced image. + +If you want to de-interlace the image yourself libpng provides further +macros to help that tell you where to place the pixels in the output image. +Because the interlacing scheme is rectangular - sub-image pixels are always +arranged on a rectangular grid - all you need to know for each pass is the +starting column and row in the output image of the first pixel plus the +spacing between each pixel. As of libpng 1.5 there are four macros to +retrieve this information: + + png_uint_32 x = PNG_PASS_START_COL(pass); + png_uint_32 y = PNG_PASS_START_ROW(pass); + png_uint_32 xStep = 1U << PNG_PASS_COL_SHIFT(pass); + png_uint_32 yStep = 1U << PNG_PASS_ROW_SHIFT(pass); + +These allow you to write the obvious loop: + + png_uint_32 input_y = 0; + png_uint_32 output_y = PNG_PASS_START_ROW(pass); + + while (output_y < output_image_height) + { + png_uint_32 input_x = 0; + png_uint_32 output_x = PNG_PASS_START_COL(pass); + + while (output_x < output_image_width) + { + image[output_y][output_x] = + subimage[pass][input_y][input_x++]; + + output_x += xStep; + } + + ++input_y; + output_y += yStep; + } + +Notice that the steps between successive output rows and columns are +returned as shifts. This is possible because the pixels in the subimages +are always a power of 2 apart - 1, 2, 4 or 8 pixels - in the original +image. In practice you may need to directly calculate the output coordinate +given an input coordinate. libpng provides two further macros for this +purpose: + + png_uint_32 output_x = PNG_COL_FROM_PASS_COL(input_x, pass); + png_uint_32 output_y = PNG_ROW_FROM_PASS_ROW(input_y, pass); + +Finally a pair of macros are provided to tell you if a particular image +row or column appears in a given pass: + + int col_in_pass = PNG_COL_IN_INTERLACE_PASS(output_x, pass); + int row_in_pass = PNG_ROW_IN_INTERLACE_PASS(output_y, pass); + +Bear in mind that you will probably also need to check the width and height +of the pass in addition to the above to be sure the pass even exists! + +With any luck you are convinced by now that you don't want to do your own +interlace handling. In reality normally the only good reason for doing this +is if you are processing PNG files on a pixel-by-pixel basis and don't want +to load the whole file into memory when it is interlaced. + +libpng includes a test program, pngvalid, that illustrates reading and +writing of interlaced images. If you can't get interlacing to work in your +code and don't want to leave it to libpng (the recommended approach) see +how pngvalid.c does it. + +Finishing a sequential read + +After you are finished reading the image through the +low-level interface, you can finish reading the file. If you are +interested in comments or time, which may be stored either before or +after the image data, you should pass the separate png_info struct if +you want to keep the comments from before and after the image +separate. If you are not interested, you can pass NULL. + + png_read_end(png_ptr, end_info); + +When you are done, you can free all memory allocated by libpng like this: + + png_destroy_read_struct(&png_ptr, &info_ptr, + &end_info); + +It is also possible to individually free the info_ptr members that +point to libpng-allocated storage with the following function: + + png_free_data(png_ptr, info_ptr, mask, seq) + + mask - identifies data to be freed, a mask + containing the bitwise OR of one or + more of + PNG_FREE_PLTE, PNG_FREE_TRNS, + PNG_FREE_HIST, PNG_FREE_ICCP, + PNG_FREE_PCAL, PNG_FREE_ROWS, + PNG_FREE_SCAL, PNG_FREE_SPLT, + PNG_FREE_TEXT, PNG_FREE_UNKN, + or simply PNG_FREE_ALL + + seq - sequence number of item to be freed + (-1 for all items) + +This function may be safely called when the relevant storage has +already been freed, or has not yet been allocated, or was allocated +by the user and not by libpng, and will in those cases do nothing. +The "seq" parameter is ignored if only one item of the selected data +type, such as PLTE, is allowed. If "seq" is not -1, and multiple items +are allowed for the data type identified in the mask, such as text or +sPLT, only the n'th item in the structure is freed, where n is "seq". + +The default behavior is only to free data that was allocated internally +by libpng. This can be changed, so that libpng will not free the data, +or so that it will free data that was allocated by the user with png_malloc() +or png_zalloc() and passed in via a png_set_*() function, with + + png_data_freer(png_ptr, info_ptr, freer, mask) + + freer - one of + PNG_DESTROY_WILL_FREE_DATA + PNG_SET_WILL_FREE_DATA + PNG_USER_WILL_FREE_DATA + + mask - which data elements are affected + same choices as in png_free_data() + +This function only affects data that has already been allocated. +You can call this function after reading the PNG data but before calling +any png_set_*() functions, to control whether the user or the png_set_*() +function is responsible for freeing any existing data that might be present, +and again after the png_set_*() functions to control whether the user +or png_destroy_*() is supposed to free the data. When the user assumes +responsibility for libpng-allocated data, the application must use +png_free() to free it, and when the user transfers responsibility to libpng +for data that the user has allocated, the user must have used png_malloc() +or png_zalloc() to allocate it. + +If you allocated your row_pointers in a single block, as suggested above in +the description of the high level read interface, you must not transfer +responsibility for freeing it to the png_set_rows or png_read_destroy function, +because they would also try to free the individual row_pointers[i]. + +If you allocated text_ptr.text, text_ptr.lang, and text_ptr.translated_keyword +separately, do not transfer responsibility for freeing text_ptr to libpng, +because when libpng fills a png_text structure it combines these members with +the key member, and png_free_data() will free only text_ptr.key. Similarly, +if you transfer responsibility for free'ing text_ptr from libpng to your +application, your application must not separately free those members. + +The png_free_data() function will turn off the "valid" flag for anything +it frees. If you need to turn the flag off for a chunk that was freed by +your application instead of by libpng, you can use + + png_set_invalid(png_ptr, info_ptr, mask); + + mask - identifies the chunks to be made invalid, + containing the bitwise OR of one or + more of + PNG_INFO_gAMA, PNG_INFO_sBIT, + PNG_INFO_cHRM, PNG_INFO_PLTE, + PNG_INFO_tRNS, PNG_INFO_bKGD, + PNG_INFO_hIST, PNG_INFO_pHYs, + PNG_INFO_oFFs, PNG_INFO_tIME, + PNG_INFO_pCAL, PNG_INFO_sRGB, + PNG_INFO_iCCP, PNG_INFO_sPLT, + PNG_INFO_sCAL, PNG_INFO_IDAT + +For a more compact example of reading a PNG image, see the file example.c. + +Reading PNG files progressively + +The progressive reader is slightly different then the non-progressive +reader. Instead of calling png_read_info(), png_read_rows(), and +png_read_end(), you make one call to png_process_data(), which calls +callbacks when it has the info, a row, or the end of the image. You +set up these callbacks with png_set_progressive_read_fn(). You don't +have to worry about the input/output functions of libpng, as you are +giving the library the data directly in png_process_data(). I will +assume that you have read the section on reading PNG files above, +so I will only highlight the differences (although I will show +all of the code). + +png_structp png_ptr; +png_infop info_ptr; + + /* An example code fragment of how you would + initialize the progressive reader in your + application. */ + int + initialize_png_reader() + { + png_ptr = png_create_read_struct + (PNG_LIBPNG_VER_STRING, (png_voidp)user_error_ptr, + user_error_fn, user_warning_fn); + + if (!png_ptr) + return (ERROR); + + info_ptr = png_create_info_struct(png_ptr); + + if (!info_ptr) + { + png_destroy_read_struct(&png_ptr, + (png_infopp)NULL, (png_infopp)NULL); + return (ERROR); + } + + if (setjmp(png_jmpbuf(png_ptr))) + { + png_destroy_read_struct(&png_ptr, &info_ptr, + (png_infopp)NULL); + return (ERROR); + } + + /* This one's new. You can provide functions + to be called when the header info is valid, + when each row is completed, and when the image + is finished. If you aren't using all functions, + you can specify NULL parameters. Even when all + three functions are NULL, you need to call + png_set_progressive_read_fn(). You can use + any struct as the user_ptr (cast to a void pointer + for the function call), and retrieve the pointer + from inside the callbacks using the function + + png_get_progressive_ptr(png_ptr); + + which will return a void pointer, which you have + to cast appropriately. + */ + png_set_progressive_read_fn(png_ptr, (void *)user_ptr, + info_callback, row_callback, end_callback); + + return 0; + } + + /* A code fragment that you call as you receive blocks + of data */ + int + process_data(png_bytep buffer, png_uint_32 length) + { + if (setjmp(png_jmpbuf(png_ptr))) + { + png_destroy_read_struct(&png_ptr, &info_ptr, + (png_infopp)NULL); + return (ERROR); + } + + /* This one's new also. Simply give it a chunk + of data from the file stream (in order, of + course). On machines with segmented memory + models machines, don't give it any more than + 64K. The library seems to run fine with sizes + of 4K. Although you can give it much less if + necessary (I assume you can give it chunks of + 1 byte, I haven't tried less then 256 bytes + yet). When this function returns, you may + want to display any rows that were generated + in the row callback if you don't already do + so there. + */ + png_process_data(png_ptr, info_ptr, buffer, length); + + /* At this point you can call png_process_data_skip if + you want to handle data the library will skip yourself; + it simply returns the number of bytes to skip (and stops + libpng skipping that number of bytes on the next + png_process_data call). + return 0; + } + + /* This function is called (as set by + png_set_progressive_read_fn() above) when enough data + has been supplied so all of the header has been + read. + */ + void + info_callback(png_structp png_ptr, png_infop info) + { + /* Do any setup here, including setting any of + the transformations mentioned in the Reading + PNG files section. For now, you _must_ call + either png_start_read_image() or + png_read_update_info() after all the + transformations are set (even if you don't set + any). You may start getting rows before + png_process_data() returns, so this is your + last chance to prepare for that. + + This is where you turn on interlace handling, + assuming you don't want to do it yourself. + + If you need to you can stop the processing of + your original input data at this point by calling + png_process_data_pause. This returns the number + of unprocessed bytes from the last png_process_data + call - it is up to you to ensure that the next call + sees these bytes again. If you don't want to bother + with this you can get libpng to cache the unread + bytes by setting the 'save' parameter (see png.h) but + then libpng will have to copy the data internally. + */ + } + + /* This function is called when each row of image + data is complete */ + void + row_callback(png_structp png_ptr, png_bytep new_row, + png_uint_32 row_num, int pass) + { + /* If the image is interlaced, and you turned + on the interlace handler, this function will + be called for every row in every pass. Some + of these rows will not be changed from the + previous pass. When the row is not changed, + the new_row variable will be NULL. The rows + and passes are called in order, so you don't + really need the row_num and pass, but I'm + supplying them because it may make your life + easier. + + If you did not turn on interlace handling then + the callback is called for each row of each + sub-image when the image is interlaced. In this + case 'row_num' is the row in the sub-image, not + the row in the output image as it is in all other + cases. + + For the non-NULL rows of interlaced images when + you have switched on libpng interlace handling, + you must call png_progressive_combine_row() + passing in the row and the old row. You can + call this function for NULL rows (it will just + return) and for non-interlaced images (it just + does the memcpy for you) if it will make the + code easier. Thus, you can just do this for + all cases if you switch on interlace handling; + */ + + png_progressive_combine_row(png_ptr, old_row, + new_row); + + /* where old_row is what was displayed for + previously for the row. Note that the first + pass (pass == 0, really) will completely cover + the old row, so the rows do not have to be + initialized. After the first pass (and only + for interlaced images), you will have to pass + the current row, and the function will combine + the old row and the new row. + + You can also call png_process_data_pause in this + callback - see above. + */ + } + + void + end_callback(png_structp png_ptr, png_infop info) + { + /* This function is called after the whole image + has been read, including any chunks after the + image (up to and including the IEND). You + will usually have the same info chunk as you + had in the header, although some data may have + been added to the comments and time fields. + + Most people won't do much here, perhaps setting + a flag that marks the image as finished. + */ + } + + + +IV. Writing + +Much of this is very similar to reading. However, everything of +importance is repeated here, so you won't have to constantly look +back up in the reading section to understand writing. + +Setup + +You will want to do the I/O initialization before you get into libpng, +so if it doesn't work, you don't have anything to undo. If you are not +using the standard I/O functions, you will need to replace them with +custom writing functions. See the discussion under Customizing libpng. + + FILE *fp = fopen(file_name, "wb"); + + if (!fp) + return (ERROR); + +Next, png_struct and png_info need to be allocated and initialized. +As these can be both relatively large, you may not want to store these +on the stack, unless you have stack space to spare. Of course, you +will want to check if they return NULL. If you are also reading, +you won't want to name your read structure and your write structure +both "png_ptr"; you can call them anything you like, such as +"read_ptr" and "write_ptr". Look at pngtest.c, for example. + + png_structp png_ptr = png_create_write_struct + (PNG_LIBPNG_VER_STRING, (png_voidp)user_error_ptr, + user_error_fn, user_warning_fn); + + if (!png_ptr) + return (ERROR); + + png_infop info_ptr = png_create_info_struct(png_ptr); + if (!info_ptr) + { + png_destroy_write_struct(&png_ptr, + (png_infopp)NULL); + return (ERROR); + } + +If you want to use your own memory allocation routines, +define PNG_USER_MEM_SUPPORTED and use +png_create_write_struct_2() instead of png_create_write_struct(): + + png_structp png_ptr = png_create_write_struct_2 + (PNG_LIBPNG_VER_STRING, (png_voidp)user_error_ptr, + user_error_fn, user_warning_fn, (png_voidp) + user_mem_ptr, user_malloc_fn, user_free_fn); + +After you have these structures, you will need to set up the +error handling. When libpng encounters an error, it expects to +longjmp() back to your routine. Therefore, you will need to call +setjmp() and pass the png_jmpbuf(png_ptr). If you +write the file from different routines, you will need to update +the png_jmpbuf(png_ptr) every time you enter a new routine that will +call a png_*() function. See your documentation of setjmp/longjmp +for your compiler for more information on setjmp/longjmp. See +the discussion on libpng error handling in the Customizing Libpng +section below for more information on the libpng error handling. + + if (setjmp(png_jmpbuf(png_ptr))) + { + png_destroy_write_struct(&png_ptr, &info_ptr); + fclose(fp); + return (ERROR); + } + ... + return; + +If you would rather avoid the complexity of setjmp/longjmp issues, +you can compile libpng with PNG_NO_SETJMP, in which case +errors will result in a call to PNG_ABORT() which defaults to abort(). + +You can #define PNG_ABORT() to a function that does something +more useful than abort(), as long as your function does not +return. + +Now you need to set up the output code. The default for libpng is to +use the C function fwrite(). If you use this, you will need to pass a +valid FILE * in the function png_init_io(). Be sure that the file is +opened in binary mode. Again, if you wish to handle writing data in +another way, see the discussion on libpng I/O handling in the Customizing +Libpng section below. + + png_init_io(png_ptr, fp); + +If you are embedding your PNG into a datastream such as MNG, and don't +want libpng to write the 8-byte signature, or if you have already +written the signature in your application, use + + png_set_sig_bytes(png_ptr, 8); + +to inform libpng that it should not write a signature. + +Write callbacks + +At this point, you can set up a callback function that will be +called after each row has been written, which you can use to control +a progress meter or the like. It's demonstrated in pngtest.c. +You must supply a function + + void write_row_callback(png_structp png_ptr, png_uint_32 row, + int pass); + { + /* put your code here */ + } + +(You can give it another name that you like instead of "write_row_callback") + +To inform libpng about your function, use + + png_set_write_status_fn(png_ptr, write_row_callback); + +When this function is called the row has already been completely processed and +it has also been written out. The 'row' and 'pass' refer to the next row to be +handled. For the +non-interlaced case the row that was just handled is simply one less than the +passed in row number, and pass will always be 0. For the interlaced case the +same applies unless the row value is 0, in which case the row just handled was +the last one from one of the preceding passes. Because interlacing may skip a +pass you cannot be sure that the preceding pass is just 'pass-1', if you really +need to know what the last pass is record (row,pass) from the callback and use +the last recorded value each time. + +As with the user transform you can find the output row using the +PNG_ROW_FROM_PASS_ROW macro. + +You now have the option of modifying how the compression library will +run. The following functions are mainly for testing, but may be useful +in some cases, like if you need to write PNG files extremely fast and +are willing to give up some compression, or if you want to get the +maximum possible compression at the expense of slower writing. If you +have no special needs in this area, let the library do what it wants by +not calling this function at all, as it has been tuned to deliver a good +speed/compression ratio. The second parameter to png_set_filter() is +the filter method, for which the only valid values are 0 (as of the +July 1999 PNG specification, version 1.2) or 64 (if you are writing +a PNG datastream that is to be embedded in a MNG datastream). The third +parameter is a flag that indicates which filter type(s) are to be tested +for each scanline. See the PNG specification for details on the specific +filter types. + + + /* turn on or off filtering, and/or choose + specific filters. You can use either a single + PNG_FILTER_VALUE_NAME or the bitwise OR of one + or more PNG_FILTER_NAME masks. + */ + png_set_filter(png_ptr, 0, + PNG_FILTER_NONE | PNG_FILTER_VALUE_NONE | + PNG_FILTER_SUB | PNG_FILTER_VALUE_SUB | + PNG_FILTER_UP | PNG_FILTER_VALUE_UP | + PNG_FILTER_AVG | PNG_FILTER_VALUE_AVG | + PNG_FILTER_PAETH | PNG_FILTER_VALUE_PAETH| + PNG_ALL_FILTERS); + +If an application wants to start and stop using particular filters during +compression, it should start out with all of the filters (to ensure that +the previous row of pixels will be stored in case it's needed later), +and then add and remove them after the start of compression. + +If you are writing a PNG datastream that is to be embedded in a MNG +datastream, the second parameter can be either 0 or 64. + +The png_set_compression_*() functions interface to the zlib compression +library, and should mostly be ignored unless you really know what you are +doing. The only generally useful call is png_set_compression_level() +which changes how much time zlib spends on trying to compress the image +data. See the Compression Library (zlib.h and algorithm.txt, distributed +with zlib) for details on the compression levels. + + #include zlib.h + + /* set the zlib compression level */ + png_set_compression_level(png_ptr, + Z_BEST_COMPRESSION); + + /* set other zlib parameters */ + png_set_compression_mem_level(png_ptr, 8); + png_set_compression_strategy(png_ptr, + Z_DEFAULT_STRATEGY); + png_set_compression_window_bits(png_ptr, 15); + png_set_compression_method(png_ptr, 8); + png_set_compression_buffer_size(png_ptr, 8192) + +extern PNG_EXPORT(void,png_set_zbuf_size) + +Setting the contents of info for output + +You now need to fill in the png_info structure with all the data you +wish to write before the actual image. Note that the only thing you +are allowed to write after the image is the text chunks and the time +chunk (as of PNG Specification 1.2, anyway). See png_write_end() and +the latest PNG specification for more information on that. If you +wish to write them before the image, fill them in now, and flag that +data as being valid. If you want to wait until after the data, don't +fill them until png_write_end(). For all the fields in png_info and +their data types, see png.h. For explanations of what the fields +contain, see the PNG specification. + +Some of the more important parts of the png_info are: + + png_set_IHDR(png_ptr, info_ptr, width, height, + bit_depth, color_type, interlace_type, + compression_type, filter_method) + + width - holds the width of the image + in pixels (up to 2^31). + + height - holds the height of the image + in pixels (up to 2^31). + + bit_depth - holds the bit depth of one of the + image channels. + (valid values are 1, 2, 4, 8, 16 + and depend also on the + color_type. See also significant + bits (sBIT) below). + + color_type - describes which color/alpha + channels are present. + PNG_COLOR_TYPE_GRAY + (bit depths 1, 2, 4, 8, 16) + PNG_COLOR_TYPE_GRAY_ALPHA + (bit depths 8, 16) + PNG_COLOR_TYPE_PALETTE + (bit depths 1, 2, 4, 8) + PNG_COLOR_TYPE_RGB + (bit_depths 8, 16) + PNG_COLOR_TYPE_RGB_ALPHA + (bit_depths 8, 16) + + PNG_COLOR_MASK_PALETTE + PNG_COLOR_MASK_COLOR + PNG_COLOR_MASK_ALPHA + + interlace_type - PNG_INTERLACE_NONE or + PNG_INTERLACE_ADAM7 + + compression_type - (must be + PNG_COMPRESSION_TYPE_DEFAULT) + + filter_method - (must be PNG_FILTER_TYPE_DEFAULT + or, if you are writing a PNG to + be embedded in a MNG datastream, + can also be + PNG_INTRAPIXEL_DIFFERENCING) + +If you call png_set_IHDR(), the call must appear before any of the +other png_set_*() functions, because they might require access to some of +the IHDR settings. The remaining png_set_*() functions can be called +in any order. + +If you wish, you can reset the compression_type, interlace_type, or +filter_method later by calling png_set_IHDR() again; if you do this, the +width, height, bit_depth, and color_type must be the same in each call. + + png_set_PLTE(png_ptr, info_ptr, palette, + num_palette); + + palette - the palette for the file + (array of png_color) + num_palette - number of entries in the palette + + png_set_gAMA(png_ptr, info_ptr, file_gamma); + png_set_gAMA_fixed(png_ptr, info_ptr, int_file_gamma); + + file_gamma - the gamma at which the image was + created (PNG_INFO_gAMA) + + int_file_gamma - 100,000 times the gamma at which + the image was created + + png_set_sRGB(png_ptr, info_ptr, srgb_intent); + + srgb_intent - the rendering intent + (PNG_INFO_sRGB) The presence of + the sRGB chunk means that the pixel + data is in the sRGB color space. + This chunk also implies specific + values of gAMA and cHRM. Rendering + intent is the CSS-1 property that + has been defined by the International + Color Consortium + (http://www.color.org). + It can be one of + PNG_sRGB_INTENT_SATURATION, + PNG_sRGB_INTENT_PERCEPTUAL, + PNG_sRGB_INTENT_ABSOLUTE, or + PNG_sRGB_INTENT_RELATIVE. + + + png_set_sRGB_gAMA_and_cHRM(png_ptr, info_ptr, + srgb_intent); + + srgb_intent - the rendering intent + (PNG_INFO_sRGB) The presence of the + sRGB chunk means that the pixel + data is in the sRGB color space. + This function also causes gAMA and + cHRM chunks with the specific values + that are consistent with sRGB to be + written. + + png_set_iCCP(png_ptr, info_ptr, name, compression_type, + profile, proflen); + + name - The profile name. + + compression_type - The compression type; always + PNG_COMPRESSION_TYPE_BASE for PNG 1.0. + You may give NULL to this argument to + ignore it. + + profile - International Color Consortium color + profile data. May contain NULs. + + proflen - length of profile data in bytes. + + png_set_sBIT(png_ptr, info_ptr, sig_bit); + + sig_bit - the number of significant bits for + (PNG_INFO_sBIT) each of the gray, red, + green, and blue channels, whichever are + appropriate for the given color type + (png_color_16) + + png_set_tRNS(png_ptr, info_ptr, trans_alpha, + num_trans, trans_color); + + trans_alpha - array of alpha (transparency) + entries for palette (PNG_INFO_tRNS) + + trans_color - graylevel or color sample values + (in order red, green, blue) of the + single transparent color for + non-paletted images (PNG_INFO_tRNS) + + num_trans - number of transparent entries + (PNG_INFO_tRNS) + + png_set_hIST(png_ptr, info_ptr, hist); + + hist - histogram of palette (array of + png_uint_16) (PNG_INFO_hIST) + + png_set_tIME(png_ptr, info_ptr, mod_time); + + mod_time - time image was last modified + (PNG_VALID_tIME) + + png_set_bKGD(png_ptr, info_ptr, background); + + background - background color (PNG_VALID_bKGD) + + png_set_text(png_ptr, info_ptr, text_ptr, num_text); + + text_ptr - array of png_text holding image + comments + + text_ptr[i].compression - type of compression used + on "text" PNG_TEXT_COMPRESSION_NONE + PNG_TEXT_COMPRESSION_zTXt + PNG_ITXT_COMPRESSION_NONE + PNG_ITXT_COMPRESSION_zTXt + text_ptr[i].key - keyword for comment. Must contain + 1-79 characters. + text_ptr[i].text - text comments for current + keyword. Can be NULL or empty. + text_ptr[i].text_length - length of text string, + after decompression, 0 for iTXt + text_ptr[i].itxt_length - length of itxt string, + after decompression, 0 for tEXt/zTXt + text_ptr[i].lang - language of comment (NULL or + empty for unknown). + text_ptr[i].translated_keyword - keyword in UTF-8 (NULL + or empty for unknown). + Note that the itxt_length, lang, and lang_key + members of the text_ptr structure only exist + when the library is built with iTXt chunk support. + + num_text - number of comments + + png_set_sPLT(png_ptr, info_ptr, &palette_ptr, + num_spalettes); + + palette_ptr - array of png_sPLT_struct structures + to be added to the list of palettes + in the info structure. + num_spalettes - number of palette structures to be + added. + + png_set_oFFs(png_ptr, info_ptr, offset_x, offset_y, + unit_type); + + offset_x - positive offset from the left + edge of the screen + + offset_y - positive offset from the top + edge of the screen + + unit_type - PNG_OFFSET_PIXEL, PNG_OFFSET_MICROMETER + + png_set_pHYs(png_ptr, info_ptr, res_x, res_y, + unit_type); + + res_x - pixels/unit physical resolution + in x direction + + res_y - pixels/unit physical resolution + in y direction + + unit_type - PNG_RESOLUTION_UNKNOWN, + PNG_RESOLUTION_METER + + png_set_sCAL(png_ptr, info_ptr, unit, width, height) + + unit - physical scale units (an integer) + + width - width of a pixel in physical scale units + + height - height of a pixel in physical scale units + (width and height are doubles) + + png_set_sCAL_s(png_ptr, info_ptr, unit, width, height) + + unit - physical scale units (an integer) + + width - width of a pixel in physical scale units + + height - height of a pixel in physical scale units + (width and height are strings like "2.54") + + png_set_unknown_chunks(png_ptr, info_ptr, &unknowns, + num_unknowns) + + unknowns - array of png_unknown_chunk + structures holding unknown chunks + unknowns[i].name - name of unknown chunk + unknowns[i].data - data of unknown chunk + unknowns[i].size - size of unknown chunk's data + unknowns[i].location - position to write chunk in file + 0: do not write chunk + PNG_HAVE_IHDR: before PLTE + PNG_HAVE_PLTE: before IDAT + PNG_AFTER_IDAT: after IDAT + +The "location" member is set automatically according to +what part of the output file has already been written. +You can change its value after calling png_set_unknown_chunks() +as demonstrated in pngtest.c. Within each of the "locations", +the chunks are sequenced according to their position in the +structure (that is, the value of "i", which is the order in which +the chunk was either read from the input file or defined with +png_set_unknown_chunks). + +A quick word about text and num_text. text is an array of png_text +structures. num_text is the number of valid structures in the array. +Each png_text structure holds a language code, a keyword, a text value, +and a compression type. + +The compression types have the same valid numbers as the compression +types of the image data. Currently, the only valid number is zero. +However, you can store text either compressed or uncompressed, unlike +images, which always have to be compressed. So if you don't want the +text compressed, set the compression type to PNG_TEXT_COMPRESSION_NONE. +Because tEXt and zTXt chunks don't have a language field, if you +specify PNG_TEXT_COMPRESSION_NONE or PNG_TEXT_COMPRESSION_zTXt +any language code or translated keyword will not be written out. + +Until text gets around 1000 bytes, it is not worth compressing it. +After the text has been written out to the file, the compression type +is set to PNG_TEXT_COMPRESSION_NONE_WR or PNG_TEXT_COMPRESSION_zTXt_WR, +so that it isn't written out again at the end (in case you are calling +png_write_end() with the same struct). + +The keywords that are given in the PNG Specification are: + + Title Short (one line) title or + caption for image + + Author Name of image's creator + + Description Description of image (possibly long) + + Copyright Copyright notice + + Creation Time Time of original image creation + (usually RFC 1123 format, see below) + + Software Software used to create the image + + Disclaimer Legal disclaimer + + Warning Warning of nature of content + + Source Device used to create the image + + Comment Miscellaneous comment; conversion + from other image format + +The keyword-text pairs work like this. Keywords should be short +simple descriptions of what the comment is about. Some typical +keywords are found in the PNG specification, as is some recommendations +on keywords. You can repeat keywords in a file. You can even write +some text before the image and some after. For example, you may want +to put a description of the image before the image, but leave the +disclaimer until after, so viewers working over modem connections +don't have to wait for the disclaimer to go over the modem before +they start seeing the image. Finally, keywords should be full +words, not abbreviations. Keywords and text are in the ISO 8859-1 +(Latin-1) character set (a superset of regular ASCII) and can not +contain NUL characters, and should not contain control or other +unprintable characters. To make the comments widely readable, stick +with basic ASCII, and avoid machine specific character set extensions +like the IBM-PC character set. The keyword must be present, but +you can leave off the text string on non-compressed pairs. +Compressed pairs must have a text string, as only the text string +is compressed anyway, so the compression would be meaningless. + +PNG supports modification time via the png_time structure. Two +conversion routines are provided, png_convert_from_time_t() for +time_t and png_convert_from_struct_tm() for struct tm. The +time_t routine uses gmtime(). You don't have to use either of +these, but if you wish to fill in the png_time structure directly, +you should provide the time in universal time (GMT) if possible +instead of your local time. Note that the year number is the full +year (e.g. 1998, rather than 98 - PNG is year 2000 compliant!), and +that months start with 1. + +If you want to store the time of the original image creation, you should +use a plain tEXt chunk with the "Creation Time" keyword. This is +necessary because the "creation time" of a PNG image is somewhat vague, +depending on whether you mean the PNG file, the time the image was +created in a non-PNG format, a still photo from which the image was +scanned, or possibly the subject matter itself. In order to facilitate +machine-readable dates, it is recommended that the "Creation Time" +tEXt chunk use RFC 1123 format dates (e.g. "22 May 1997 18:07:10 GMT"), +although this isn't a requirement. Unlike the tIME chunk, the +"Creation Time" tEXt chunk is not expected to be automatically changed +by the software. To facilitate the use of RFC 1123 dates, a function +png_convert_to_rfc1123(png_timep) is provided to convert from PNG +time to an RFC 1123 format string. + +Writing unknown chunks + +You can use the png_set_unknown_chunks function to queue up chunks +for writing. You give it a chunk name, raw data, and a size; that's +all there is to it. The chunks will be written by the next following +png_write_info_before_PLTE, png_write_info, or png_write_end function. +Any chunks previously read into the info structure's unknown-chunk +list will also be written out in a sequence that satisfies the PNG +specification's ordering rules. + +The high-level write interface + +At this point there are two ways to proceed; through the high-level +write interface, or through a sequence of low-level write operations. +You can use the high-level interface if your image data is present +in the info structure. All defined output +transformations are permitted, enabled by the following masks. + + PNG_TRANSFORM_IDENTITY No transformation + PNG_TRANSFORM_PACKING Pack 1, 2 and 4-bit samples + PNG_TRANSFORM_PACKSWAP Change order of packed + pixels to LSB first + PNG_TRANSFORM_INVERT_MONO Invert monochrome images + PNG_TRANSFORM_SHIFT Normalize pixels to the + sBIT depth + PNG_TRANSFORM_BGR Flip RGB to BGR, RGBA + to BGRA + PNG_TRANSFORM_SWAP_ALPHA Flip RGBA to ARGB or GA + to AG + PNG_TRANSFORM_INVERT_ALPHA Change alpha from opacity + to transparency + PNG_TRANSFORM_SWAP_ENDIAN Byte-swap 16-bit samples + PNG_TRANSFORM_STRIP_FILLER Strip out filler + bytes (deprecated). + PNG_TRANSFORM_STRIP_FILLER_BEFORE Strip out leading + filler bytes + PNG_TRANSFORM_STRIP_FILLER_AFTER Strip out trailing + filler bytes + +If you have valid image data in the info structure (you can use +png_set_rows() to put image data in the info structure), simply do this: + + png_write_png(png_ptr, info_ptr, png_transforms, NULL) + +where png_transforms is an integer containing the bitwise OR of some set of +transformation flags. This call is equivalent to png_write_info(), +followed the set of transformations indicated by the transform mask, +then png_write_image(), and finally png_write_end(). + +(The final parameter of this call is not yet used. Someday it might point +to transformation parameters required by some future output transform.) + +You must use png_transforms and not call any png_set_transform() functions +when you use png_write_png(). + +The low-level write interface + +If you are going the low-level route instead, you are now ready to +write all the file information up to the actual image data. You do +this with a call to png_write_info(). + + png_write_info(png_ptr, info_ptr); + +Note that there is one transformation you may need to do before +png_write_info(). In PNG files, the alpha channel in an image is the +level of opacity. If your data is supplied as a level of transparency, +you can invert the alpha channel before you write it, so that 0 is +fully transparent and 255 (in 8-bit or paletted images) or 65535 +(in 16-bit images) is fully opaque, with + + png_set_invert_alpha(png_ptr); + +This must appear before png_write_info() instead of later with the +other transformations because in the case of paletted images the tRNS +chunk data has to be inverted before the tRNS chunk is written. If +your image is not a paletted image, the tRNS data (which in such cases +represents a single color to be rendered as transparent) won't need to +be changed, and you can safely do this transformation after your +png_write_info() call. + +If you need to write a private chunk that you want to appear before +the PLTE chunk when PLTE is present, you can write the PNG info in +two steps, and insert code to write your own chunk between them: + + png_write_info_before_PLTE(png_ptr, info_ptr); + png_set_unknown_chunks(png_ptr, info_ptr, ...); + png_write_info(png_ptr, info_ptr); + +After you've written the file information, you can set up the library +to handle any special transformations of the image data. The various +ways to transform the data will be described in the order that they +should occur. This is important, as some of these change the color +type and/or bit depth of the data, and some others only work on +certain color types and bit depths. Even though each transformation +checks to see if it has data that it can do something with, you should +make sure to only enable a transformation if it will be valid for the +data. For example, don't swap red and blue on grayscale data. + +PNG files store RGB pixels packed into 3 or 6 bytes. This code tells +the library to strip input data that has 4 or 8 bytes per pixel down +to 3 or 6 bytes (or strip 2 or 4-byte grayscale+filler data to 1 or 2 +bytes per pixel). + + png_set_filler(png_ptr, 0, PNG_FILLER_BEFORE); + +where the 0 is unused, and the location is either PNG_FILLER_BEFORE or +PNG_FILLER_AFTER, depending upon whether the filler byte in the pixel +is stored XRGB or RGBX. + +PNG files pack pixels of bit depths 1, 2, and 4 into bytes as small as +they can, resulting in, for example, 8 pixels per byte for 1 bit files. +If the data is supplied at 1 pixel per byte, use this code, which will +correctly pack the pixels into a single byte: + + png_set_packing(png_ptr); + +PNG files reduce possible bit depths to 1, 2, 4, 8, and 16. If your +data is of another bit depth, you can write an sBIT chunk into the +file so that decoders can recover the original data if desired. + + /* Set the true bit depth of the image data */ + if (color_type & PNG_COLOR_MASK_COLOR) + { + sig_bit.red = true_bit_depth; + sig_bit.green = true_bit_depth; + sig_bit.blue = true_bit_depth; + } + + else + { + sig_bit.gray = true_bit_depth; + } + + if (color_type & PNG_COLOR_MASK_ALPHA) + { + sig_bit.alpha = true_bit_depth; + } + + png_set_sBIT(png_ptr, info_ptr, &sig_bit); + +If the data is stored in the row buffer in a bit depth other than +one supported by PNG (e.g. 3 bit data in the range 0-7 for a 4-bit PNG), +this will scale the values to appear to be the correct bit depth as +is required by PNG. + + png_set_shift(png_ptr, &sig_bit); + +PNG files store 16 bit pixels in network byte order (big-endian, +ie. most significant bits first). This code would be used if they are +supplied the other way (little-endian, i.e. least significant bits +first, the way PCs store them): + + if (bit_depth > 8) + png_set_swap(png_ptr); + +If you are using packed-pixel images (1, 2, or 4 bits/pixel), and you +need to change the order the pixels are packed into bytes, you can use: + + if (bit_depth < 8) + png_set_packswap(png_ptr); + +PNG files store 3 color pixels in red, green, blue order. This code +would be used if they are supplied as blue, green, red: + + png_set_bgr(png_ptr); + +PNG files describe monochrome as black being zero and white being +one. This code would be used if the pixels are supplied with this reversed +(black being one and white being zero): + + png_set_invert_mono(png_ptr); + +Finally, you can write your own transformation function if none of +the existing ones meets your needs. This is done by setting a callback +with + + png_set_write_user_transform_fn(png_ptr, + write_transform_fn); + +You must supply the function + + void write_transform_fn(png_structp png_ptr, png_row_infop + row_info, png_bytep data) + +See pngtest.c for a working example. Your function will be called +before any of the other transformations are processed. If supported +libpng also supplies an information routine that may be called from +your callback: + + png_get_current_row_number(png_ptr); + png_get_current_pass_number(png_ptr); + +This returns the current row passed to the transform. With interlaced +images the value returned is the row in the input sub-image image. Use +PNG_ROW_FROM_PASS_ROW(row, pass) and PNG_COL_FROM_PASS_COL(col, pass) to +find the output pixel (x,y) given an interlaced sub-image pixel (row,col,pass). + +The discussion of interlace handling above contains more information on how to +use these values. + +You can also set up a pointer to a user structure for use by your +callback function. + + png_set_user_transform_info(png_ptr, user_ptr, 0, 0); + +The user_channels and user_depth parameters of this function are ignored +when writing; you can set them to zero as shown. + +You can retrieve the pointer via the function png_get_user_transform_ptr(). +For example: + + voidp write_user_transform_ptr = + png_get_user_transform_ptr(png_ptr); + +It is possible to have libpng flush any pending output, either manually, +or automatically after a certain number of lines have been written. To +flush the output stream a single time call: + + png_write_flush(png_ptr); + +and to have libpng flush the output stream periodically after a certain +number of scanlines have been written, call: + + png_set_flush(png_ptr, nrows); + +Note that the distance between rows is from the last time png_write_flush() +was called, or the first row of the image if it has never been called. +So if you write 50 lines, and then png_set_flush 25, it will flush the +output on the next scanline, and every 25 lines thereafter, unless +png_write_flush() is called before 25 more lines have been written. +If nrows is too small (less than about 10 lines for a 640 pixel wide +RGB image) the image compression may decrease noticeably (although this +may be acceptable for real-time applications). Infrequent flushing will +only degrade the compression performance by a few percent over images +that do not use flushing. + +Writing the image data + +That's it for the transformations. Now you can write the image data. +The simplest way to do this is in one function call. If you have the +whole image in memory, you can just call png_write_image() and libpng +will write the image. You will need to pass in an array of pointers to +each row. This function automatically handles interlacing, so you don't +need to call png_set_interlace_handling() or call this function multiple +times, or any of that other stuff necessary with png_write_rows(). + + png_write_image(png_ptr, row_pointers); + +where row_pointers is: + + png_byte *row_pointers[height]; + +You can point to void or char or whatever you use for pixels. + +If you don't want to write the whole image at once, you can +use png_write_rows() instead. If the file is not interlaced, +this is simple: + + png_write_rows(png_ptr, row_pointers, + number_of_rows); + +row_pointers is the same as in the png_write_image() call. + +If you are just writing one row at a time, you can do this with +a single row_pointer instead of an array of row_pointers: + + png_bytep row_pointer = row; + + png_write_row(png_ptr, row_pointer); + +When the file is interlaced, things can get a good deal more complicated. +The only currently (as of the PNG Specification version 1.2, dated July +1999) defined interlacing scheme for PNG files is the "Adam7" interlace +scheme, that breaks down an image into seven smaller images of varying +size. libpng will build these images for you, or you can do them +yourself. If you want to build them yourself, see the PNG specification +for details of which pixels to write when. + +If you don't want libpng to handle the interlacing details, just +use png_set_interlace_handling() and call png_write_rows() the +correct number of times to write all the sub-images +(png_set_interlace_handling() returns the number of sub-images.) + +If you want libpng to build the sub-images, call this before you start +writing any rows: + + number_of_passes = png_set_interlace_handling(png_ptr); + +This will return the number of passes needed. Currently, this is seven, +but may change if another interlace type is added. + +Then write the complete image number_of_passes times. + + png_write_rows(png_ptr, row_pointers, number_of_rows); + +Think carefully before you write an interlaced image. Typically code that +reads such images reads all the image data into memory, uncompressed, before +doing any processing. Only code that can display an image on the fly can +take advantage of the interlacing and even then the image has to be exactly +the correct size for the output device, because scaling an image requires +adjacent pixels and these are not available until all the passes have been +read. + +If you do write an interlaced image you will hardly ever need to handle +the interlacing yourself. Call png_set_interlace_handling() and use the +approach described above. + +The only time it is conceivable that you will really need to write an +interlaced image pass-by-pass is when you have read one pass by pass and +made some pixel-by-pixel transformation to it, as described in the read +code above. In this case use the PNG_PASS_ROWS and PNG_PASS_COLS macros +to determine the size of each sub-image in turn and simply write the rows +you obtained from the read code. + +Finishing a sequential write + +After you are finished writing the image, you should finish writing +the file. If you are interested in writing comments or time, you should +pass an appropriately filled png_info pointer. If you are not interested, +you can pass NULL. + + png_write_end(png_ptr, info_ptr); + +When you are done, you can free all memory used by libpng like this: + + png_destroy_write_struct(&png_ptr, &info_ptr); + +It is also possible to individually free the info_ptr members that +point to libpng-allocated storage with the following function: + + png_free_data(png_ptr, info_ptr, mask, seq) + + mask - identifies data to be freed, a mask + containing the bitwise OR of one or + more of + PNG_FREE_PLTE, PNG_FREE_TRNS, + PNG_FREE_HIST, PNG_FREE_ICCP, + PNG_FREE_PCAL, PNG_FREE_ROWS, + PNG_FREE_SCAL, PNG_FREE_SPLT, + PNG_FREE_TEXT, PNG_FREE_UNKN, + or simply PNG_FREE_ALL + + seq - sequence number of item to be freed + (-1 for all items) + +This function may be safely called when the relevant storage has +already been freed, or has not yet been allocated, or was allocated +by the user and not by libpng, and will in those cases do nothing. +The "seq" parameter is ignored if only one item of the selected data +type, such as PLTE, is allowed. If "seq" is not -1, and multiple items +are allowed for the data type identified in the mask, such as text or +sPLT, only the n'th item in the structure is freed, where n is "seq". + +If you allocated data such as a palette that you passed in to libpng +with png_set_*, you must not free it until just before the call to +png_destroy_write_struct(). + +The default behavior is only to free data that was allocated internally +by libpng. This can be changed, so that libpng will not free the data, +or so that it will free data that was allocated by the user with png_malloc() +or png_zalloc() and passed in via a png_set_*() function, with + + png_data_freer(png_ptr, info_ptr, freer, mask) + + freer - one of + PNG_DESTROY_WILL_FREE_DATA + PNG_SET_WILL_FREE_DATA + PNG_USER_WILL_FREE_DATA + + mask - which data elements are affected + same choices as in png_free_data() + +For example, to transfer responsibility for some data from a read structure +to a write structure, you could use + + png_data_freer(read_ptr, read_info_ptr, + PNG_USER_WILL_FREE_DATA, + PNG_FREE_PLTE|PNG_FREE_tRNS|PNG_FREE_hIST) + + png_data_freer(write_ptr, write_info_ptr, + PNG_DESTROY_WILL_FREE_DATA, + PNG_FREE_PLTE|PNG_FREE_tRNS|PNG_FREE_hIST) + +thereby briefly reassigning responsibility for freeing to the user but +immediately afterwards reassigning it once more to the write_destroy +function. Having done this, it would then be safe to destroy the read +structure and continue to use the PLTE, tRNS, and hIST data in the write +structure. + +This function only affects data that has already been allocated. +You can call this function before calling after the png_set_*() functions +to control whether the user or png_destroy_*() is supposed to free the data. +When the user assumes responsibility for libpng-allocated data, the +application must use +png_free() to free it, and when the user transfers responsibility to libpng +for data that the user has allocated, the user must have used png_malloc() +or png_zalloc() to allocate it. + +If you allocated text_ptr.text, text_ptr.lang, and text_ptr.translated_keyword +separately, do not transfer responsibility for freeing text_ptr to libpng, +because when libpng fills a png_text structure it combines these members with +the key member, and png_free_data() will free only text_ptr.key. Similarly, +if you transfer responsibility for free'ing text_ptr from libpng to your +application, your application must not separately free those members. +For a more compact example of writing a PNG image, see the file example.c. + +V. Modifying/Customizing libpng: + +There are two issues here. The first is changing how libpng does +standard things like memory allocation, input/output, and error handling. +The second deals with more complicated things like adding new chunks, +adding new transformations, and generally changing how libpng works. +Both of those are compile-time issues; that is, they are generally +determined at the time the code is written, and there is rarely a need +to provide the user with a means of changing them. + +Memory allocation, input/output, and error handling + +All of the memory allocation, input/output, and error handling in libpng +goes through callbacks that are user-settable. The default routines are +in pngmem.c, pngrio.c, pngwio.c, and pngerror.c, respectively. To change +these functions, call the appropriate png_set_*_fn() function. + +Memory allocation is done through the functions png_malloc(), png_calloc(), +and png_free(). These currently just call the standard C functions. +png_calloc() calls png_malloc() and then clears the newly +allocated memory to zero. There is limited support for certain systems +with segmented memory architectures and the types of pointers declared by +png.h match this; you will have to use appropriate pointers in your +application. Since it is +unlikely that the method of handling memory allocation on a platform +will change between applications, these functions must be modified in +the library at compile time. If you prefer to use a different method +of allocating and freeing data, you can use png_create_read_struct_2() or +png_create_write_struct_2() to register your own functions as described +above. These functions also provide a void pointer that can be retrieved +via + + mem_ptr=png_get_mem_ptr(png_ptr); + +Your replacement memory functions must have prototypes as follows: + + png_voidp malloc_fn(png_structp png_ptr, + png_alloc_size_t size); + + void free_fn(png_structp png_ptr, png_voidp ptr); + +Your malloc_fn() must return NULL in case of failure. The png_malloc() +function will normally call png_error() if it receives a NULL from the +system memory allocator or from your replacement malloc_fn(). + +Your free_fn() will never be called with a NULL ptr, since libpng's +png_free() checks for NULL before calling free_fn(). + +Input/Output in libpng is done through png_read() and png_write(), +which currently just call fread() and fwrite(). The FILE * is stored in +png_struct and is initialized via png_init_io(). If you wish to change +the method of I/O, the library supplies callbacks that you can set +through the function png_set_read_fn() and png_set_write_fn() at run +time, instead of calling the png_init_io() function. These functions +also provide a void pointer that can be retrieved via the function +png_get_io_ptr(). For example: + + png_set_read_fn(png_structp read_ptr, + voidp read_io_ptr, png_rw_ptr read_data_fn) + + png_set_write_fn(png_structp write_ptr, + voidp write_io_ptr, png_rw_ptr write_data_fn, + png_flush_ptr output_flush_fn); + + voidp read_io_ptr = png_get_io_ptr(read_ptr); + voidp write_io_ptr = png_get_io_ptr(write_ptr); + +The replacement I/O functions must have prototypes as follows: + + void user_read_data(png_structp png_ptr, + png_bytep data, png_size_t length); + + void user_write_data(png_structp png_ptr, + png_bytep data, png_size_t length); + + void user_flush_data(png_structp png_ptr); + +The user_read_data() function is responsible for detecting and +handling end-of-data errors. + +Supplying NULL for the read, write, or flush functions sets them back +to using the default C stream functions, which expect the io_ptr to +point to a standard *FILE structure. It is probably a mistake +to use NULL for one of write_data_fn and output_flush_fn but not both +of them, unless you have built libpng with PNG_NO_WRITE_FLUSH defined. +It is an error to read from a write stream, and vice versa. + +Error handling in libpng is done through png_error() and png_warning(). +Errors handled through png_error() are fatal, meaning that png_error() +should never return to its caller. Currently, this is handled via +setjmp() and longjmp() (unless you have compiled libpng with +PNG_NO_SETJMP, in which case it is handled via PNG_ABORT()), +but you could change this to do things like exit() if you should wish, +as long as your function does not return. + +On non-fatal errors, png_warning() is called +to print a warning message, and then control returns to the calling code. +By default png_error() and png_warning() print a message on stderr via +fprintf() unless the library is compiled with PNG_NO_CONSOLE_IO defined +(because you don't want the messages) or PNG_NO_STDIO defined (because +fprintf() isn't available). If you wish to change the behavior of the error +functions, you will need to set up your own message callbacks. These +functions are normally supplied at the time that the png_struct is created. +It is also possible to redirect errors and warnings to your own replacement +functions after png_create_*_struct() has been called by calling: + + png_set_error_fn(png_structp png_ptr, + png_voidp error_ptr, png_error_ptr error_fn, + png_error_ptr warning_fn); + + png_voidp error_ptr = png_get_error_ptr(png_ptr); + +If NULL is supplied for either error_fn or warning_fn, then the libpng +default function will be used, calling fprintf() and/or longjmp() if a +problem is encountered. The replacement error functions should have +parameters as follows: + + void user_error_fn(png_structp png_ptr, + png_const_charp error_msg); + + void user_warning_fn(png_structp png_ptr, + png_const_charp warning_msg); + +The motivation behind using setjmp() and longjmp() is the C++ throw and +catch exception handling methods. This makes the code much easier to write, +as there is no need to check every return code of every function call. +However, there are some uncertainties about the status of local variables +after a longjmp, so the user may want to be careful about doing anything +after setjmp returns non-zero besides returning itself. Consult your +compiler documentation for more details. For an alternative approach, you +may wish to use the "cexcept" facility (see http://cexcept.sourceforge.net). + +Custom chunks + +If you need to read or write custom chunks, you may need to get deeper +into the libpng code. The library now has mechanisms for storing +and writing chunks of unknown type; you can even declare callbacks +for custom chunks. However, this may not be good enough if the +library code itself needs to know about interactions between your +chunk and existing `intrinsic' chunks. + +If you need to write a new intrinsic chunk, first read the PNG +specification. Acquire a first level of understanding of how it works. +Pay particular attention to the sections that describe chunk names, +and look at how other chunks were designed, so you can do things +similarly. Second, check out the sections of libpng that read and +write chunks. Try to find a chunk that is similar to yours and use +it as a template. More details can be found in the comments inside +the code. It is best to handle unknown chunks in a generic method, +via callback functions, instead of by modifying libpng functions. + +If you wish to write your own transformation for the data, look through +the part of the code that does the transformations, and check out some of +the simpler ones to get an idea of how they work. Try to find a similar +transformation to the one you want to add and copy off of it. More details +can be found in the comments inside the code itself. + +Configuring for 16 bit platforms + +You will want to look into zconf.h to tell zlib (and thus libpng) that +it cannot allocate more then 64K at a time. Even if you can, the memory +won't be accessible. So limit zlib and libpng to 64K by defining MAXSEG_64K. + +Configuring for DOS + +For DOS users who only have access to the lower 640K, you will +have to limit zlib's memory usage via a png_set_compression_mem_level() +call. See zlib.h or zconf.h in the zlib library for more information. + +Configuring for Medium Model + +Libpng's support for medium model has been tested on most of the popular +compilers. Make sure MAXSEG_64K gets defined, USE_FAR_KEYWORD gets +defined, and FAR gets defined to far in pngconf.h, and you should be +all set. Everything in the library (except for zlib's structure) is +expecting far data. You must use the typedefs with the p or pp on +the end for pointers (or at least look at them and be careful). Make +note that the rows of data are defined as png_bytepp, which is an +unsigned char far * far *. + +Configuring for gui/windowing platforms: + +You will need to write new error and warning functions that use the GUI +interface, as described previously, and set them to be the error and +warning functions at the time that png_create_*_struct() is called, +in order to have them available during the structure initialization. +They can be changed later via png_set_error_fn(). On some compilers, +you may also have to change the memory allocators (png_malloc, etc.). + +Configuring for compiler xxx: + +All includes for libpng are in pngconf.h. If you need to add, change +or delete an include, this is the place to do it. +The includes that are not needed outside libpng are placed in pngpriv.h, +which is only used by the routines inside libpng itself. +The files in libpng proper only include pngpriv.h and png.h, which +in turn includes pngconf.h. + +Configuring zlib: + +There are special functions to configure the compression. Perhaps the +most useful one changes the compression level, which currently uses +input compression values in the range 0 - 9. The library normally +uses the default compression level (Z_DEFAULT_COMPRESSION = 6). Tests +have shown that for a large majority of images, compression values in +the range 3-6 compress nearly as well as higher levels, and do so much +faster. For online applications it may be desirable to have maximum speed +(Z_BEST_SPEED = 1). With versions of zlib after v0.99, you can also +specify no compression (Z_NO_COMPRESSION = 0), but this would create +files larger than just storing the raw bitmap. You can specify the +compression level by calling: + + #include zlib.h + png_set_compression_level(png_ptr, level); + +Another useful one is to reduce the memory level used by the library. +The memory level defaults to 8, but it can be lowered if you are +short on memory (running DOS, for example, where you only have 640K). +Note that the memory level does have an effect on compression; among +other things, lower levels will result in sections of incompressible +data being emitted in smaller stored blocks, with a correspondingly +larger relative overhead of up to 15% in the worst case. + + #include zlib.h + png_set_compression_mem_level(png_ptr, level); + +The other functions are for configuring zlib. They are not recommended +for normal use and may result in writing an invalid PNG file. See +zlib.h for more information on what these mean. + + #include zlib.h + png_set_compression_strategy(png_ptr, + strategy); + + png_set_compression_window_bits(png_ptr, + window_bits); + + png_set_compression_method(png_ptr, method); + png_set_compression_buffer_size(png_ptr, size); + +Controlling row filtering + +If you want to control whether libpng uses filtering or not, which +filters are used, and how it goes about picking row filters, you +can call one of these functions. The selection and configuration +of row filters can have a significant impact on the size and +encoding speed and a somewhat lesser impact on the decoding speed +of an image. Filtering is enabled by default for RGB and grayscale +images (with and without alpha), but not for paletted images nor +for any images with bit depths less than 8 bits/pixel. + +The 'method' parameter sets the main filtering method, which is +currently only '0' in the PNG 1.2 specification. The 'filters' +parameter sets which filter(s), if any, should be used for each +scanline. Possible values are PNG_ALL_FILTERS and PNG_NO_FILTERS +to turn filtering on and off, respectively. + +Individual filter types are PNG_FILTER_NONE, PNG_FILTER_SUB, +PNG_FILTER_UP, PNG_FILTER_AVG, PNG_FILTER_PAETH, which can be bitwise +ORed together with '|' to specify one or more filters to use. +These filters are described in more detail in the PNG specification. +If you intend to change the filter type during the course of writing +the image, you should start with flags set for all of the filters +you intend to use so that libpng can initialize its internal +structures appropriately for all of the filter types. (Note that this +means the first row must always be adaptively filtered, because libpng +currently does not allocate the filter buffers until png_write_row() +is called for the first time.) + + filters = PNG_FILTER_NONE | PNG_FILTER_SUB + PNG_FILTER_UP | PNG_FILTER_AVG | + PNG_FILTER_PAETH | PNG_ALL_FILTERS; + + png_set_filter(png_ptr, PNG_FILTER_TYPE_BASE, + filters); + The second parameter can also be + PNG_INTRAPIXEL_DIFFERENCING if you are + writing a PNG to be embedded in a MNG + datastream. This parameter must be the + same as the value of filter_method used + in png_set_IHDR(). + +It is also possible to influence how libpng chooses from among the +available filters. This is done in one or both of two ways - by +telling it how important it is to keep the same filter for successive +rows, and by telling it the relative computational costs of the filters. + + double weights[3] = {1.5, 1.3, 1.1}, + costs[PNG_FILTER_VALUE_LAST] = + {1.0, 1.3, 1.3, 1.5, 1.7}; + + png_set_filter_heuristics(png_ptr, + PNG_FILTER_HEURISTIC_WEIGHTED, 3, + weights, costs); + +The weights are multiplying factors that indicate to libpng that the +row filter should be the same for successive rows unless another row filter +is that many times better than the previous filter. In the above example, +if the previous 3 filters were SUB, SUB, NONE, the SUB filter could have a +"sum of absolute differences" 1.5 x 1.3 times higher than other filters +and still be chosen, while the NONE filter could have a sum 1.1 times +higher than other filters and still be chosen. Unspecified weights are +taken to be 1.0, and the specified weights should probably be declining +like those above in order to emphasize recent filters over older filters. + +The filter costs specify for each filter type a relative decoding cost +to be considered when selecting row filters. This means that filters +with higher costs are less likely to be chosen over filters with lower +costs, unless their "sum of absolute differences" is that much smaller. +The costs do not necessarily reflect the exact computational speeds of +the various filters, since this would unduly influence the final image +size. + +Note that the numbers above were invented purely for this example and +are given only to help explain the function usage. Little testing has +been done to find optimum values for either the costs or the weights. + +Removing unwanted object code + +There are a bunch of #define's in pngconf.h that control what parts of +libpng are compiled. All the defines end in _SUPPORTED. If you are +never going to use a capability, you can change the #define to #undef +before recompiling libpng and save yourself code and data space, or +you can turn off individual capabilities with defines that begin with +PNG_NO_. + +In libpng-1.5.0 and later, the #define's are in pnglibconf.h instead. + +You can also turn all of the transforms and ancillary chunk capabilities +off en masse with compiler directives that define +PNG_NO_READ[or WRITE]_TRANSFORMS, or PNG_NO_READ[or WRITE]_ANCILLARY_CHUNKS, +or all four, +along with directives to turn on any of the capabilities that you do +want. The PNG_NO_READ[or WRITE]_TRANSFORMS directives disable the extra +transformations but still leave the library fully capable of reading +and writing PNG files with all known public chunks. Use of the +PNG_NO_READ[or WRITE]_ANCILLARY_CHUNKS directive produces a library +that is incapable of reading or writing ancillary chunks. If you are +not using the progressive reading capability, you can turn that off +with PNG_NO_PROGRESSIVE_READ (don't confuse this with the INTERLACING +capability, which you'll still have). + +All the reading and writing specific code are in separate files, so the +linker should only grab the files it needs. However, if you want to +make sure, or if you are building a stand alone library, all the +reading files start with pngr and all the writing files start with +pngw. The files that don't match either (like png.c, pngtrans.c, etc.) +are used for both reading and writing, and always need to be included. +The progressive reader is in pngpread.c + +If you are creating or distributing a dynamically linked library (a .so +or DLL file), you should not remove or disable any parts of the library, +as this will cause applications linked with different versions of the +library to fail if they call functions not available in your library. +The size of the library itself should not be an issue, because only +those sections that are actually used will be loaded into memory. + +Requesting debug printout + +The macro definition PNG_DEBUG can be used to request debugging +printout. Set it to an integer value in the range 0 to 3. Higher +numbers result in increasing amounts of debugging information. The +information is printed to the "stderr" file, unless another file +name is specified in the PNG_DEBUG_FILE macro definition. + +When PNG_DEBUG > 0, the following functions (macros) become available: + + png_debug(level, message) + png_debug1(level, message, p1) + png_debug2(level, message, p1, p2) + +in which "level" is compared to PNG_DEBUG to decide whether to print +the message, "message" is the formatted string to be printed, +and p1 and p2 are parameters that are to be embedded in the string +according to printf-style formatting directives. For example, + + png_debug1(2, "foo=%d\n", foo); + +is expanded to + + if (PNG_DEBUG > 2) + fprintf(PNG_DEBUG_FILE, "foo=%d\n", foo); + +When PNG_DEBUG is defined but is zero, the macros aren't defined, but you +can still use PNG_DEBUG to control your own debugging: + + #ifdef PNG_DEBUG + fprintf(stderr, ... + #endif + +When PNG_DEBUG = 1, the macros are defined, but only png_debug statements +having level = 0 will be printed. There aren't any such statements in +this version of libpng, but if you insert some they will be printed. + +VI. MNG support + +The MNG specification (available at http://www.libpng.org/pub/mng) allows +certain extensions to PNG for PNG images that are embedded in MNG datastreams. +Libpng can support some of these extensions. To enable them, use the +png_permit_mng_features() function: + + feature_set = png_permit_mng_features(png_ptr, mask) + + mask is a png_uint_32 containing the bitwise OR of the + features you want to enable. These include + PNG_FLAG_MNG_EMPTY_PLTE + PNG_FLAG_MNG_FILTER_64 + PNG_ALL_MNG_FEATURES + + feature_set is a png_uint_32 that is the bitwise AND of + your mask with the set of MNG features that is + supported by the version of libpng that you are using. + +It is an error to use this function when reading or writing a standalone +PNG file with the PNG 8-byte signature. The PNG datastream must be wrapped +in a MNG datastream. As a minimum, it must have the MNG 8-byte signature +and the MHDR and MEND chunks. Libpng does not provide support for these +or any other MNG chunks; your application must provide its own support for +them. You may wish to consider using libmng (available at +http://www.libmng.com) instead. + +VII. Changes to Libpng from version 0.88 + +It should be noted that versions of libpng later than 0.96 are not +distributed by the original libpng author, Guy Schalnat, nor by +Andreas Dilger, who had taken over from Guy during 1996 and 1997, and +distributed versions 0.89 through 0.96, but rather by another member +of the original PNG Group, Glenn Randers-Pehrson. Guy and Andreas are +still alive and well, but they have moved on to other things. + +The old libpng functions png_read_init(), png_write_init(), +png_info_init(), png_read_destroy(), and png_write_destroy() have been +moved to PNG_INTERNAL in version 0.95 to discourage their use. These +functions will be removed from libpng version 1.4.0. + +The preferred method of creating and initializing the libpng structures is +via the png_create_read_struct(), png_create_write_struct(), and +png_create_info_struct() because they isolate the size of the structures +from the application, allow version error checking, and also allow the +use of custom error handling routines during the initialization, which +the old functions do not. The functions png_read_destroy() and +png_write_destroy() do not actually free the memory that libpng +allocated for these structs, but just reset the data structures, so they +can be used instead of png_destroy_read_struct() and +png_destroy_write_struct() if you feel there is too much system overhead +allocating and freeing the png_struct for each image read. + +Setting the error callbacks via png_set_message_fn() before +png_read_init() as was suggested in libpng-0.88 is no longer supported +because this caused applications that do not use custom error functions +to fail if the png_ptr was not initialized to zero. It is still possible +to set the error callbacks AFTER png_read_init(), or to change them with +png_set_error_fn(), which is essentially the same function, but with a new +name to force compilation errors with applications that try to use the old +method. + +Starting with version 1.0.7, you can find out which version of the library +you are using at run-time: + + png_uint_32 libpng_vn = png_access_version_number(); + +The number libpng_vn is constructed from the major version, minor +version with leading zero, and release number with leading zero, +(e.g., libpng_vn for version 1.0.7 is 10007). + +You can also check which version of png.h you used when compiling your +application: + + png_uint_32 application_vn = PNG_LIBPNG_VER; + +VIII. Changes to Libpng from version 1.0.x to 1.2.x + +Support for user memory management was enabled by default. To +accomplish this, the functions png_create_read_struct_2(), +png_create_write_struct_2(), png_set_mem_fn(), png_get_mem_ptr(), +png_malloc_default(), and png_free_default() were added. + +Support for the iTXt chunk has been enabled by default as of +version 1.2.41. + +Support for certain MNG features was enabled. + +Support for numbered error messages was added. However, we never got +around to actually numbering the error messages. The function +png_set_strip_error_numbers() was added (Note: the prototype for this +function was inadvertently removed from png.h in PNG_NO_ASSEMBLER_CODE +builds of libpng-1.2.15. It was restored in libpng-1.2.36). + +The png_malloc_warn() function was added at libpng-1.2.3. This issues +a png_warning and returns NULL instead of aborting when it fails to +acquire the requested memory allocation. + +Support for setting user limits on image width and height was enabled +by default. The functions png_set_user_limits(), png_get_user_width_max(), +and png_get_user_height_max() were added at libpng-1.2.6. + +The png_set_add_alpha() function was added at libpng-1.2.7. + +The function png_set_expand_gray_1_2_4_to_8() was added at libpng-1.2.9. +Unlike png_set_gray_1_2_4_to_8(), the new function does not expand the +tRNS chunk to alpha. The png_set_gray_1_2_4_to_8() function is +deprecated. + +A number of macro definitions in support of runtime selection of +assembler code features (especially Intel MMX code support) were +added at libpng-1.2.0: + + PNG_ASM_FLAG_MMX_SUPPORT_COMPILED + PNG_ASM_FLAG_MMX_SUPPORT_IN_CPU + PNG_ASM_FLAG_MMX_READ_COMBINE_ROW + PNG_ASM_FLAG_MMX_READ_INTERLACE + PNG_ASM_FLAG_MMX_READ_FILTER_SUB + PNG_ASM_FLAG_MMX_READ_FILTER_UP + PNG_ASM_FLAG_MMX_READ_FILTER_AVG + PNG_ASM_FLAG_MMX_READ_FILTER_PAETH + PNG_ASM_FLAGS_INITIALIZED + PNG_MMX_READ_FLAGS + PNG_MMX_FLAGS + PNG_MMX_WRITE_FLAGS + PNG_MMX_FLAGS + +We added the following functions in support of runtime +selection of assembler code features: + + png_get_mmx_flagmask() + png_set_mmx_thresholds() + png_get_asm_flags() + png_get_mmx_bitdepth_threshold() + png_get_mmx_rowbytes_threshold() + png_set_asm_flags() + +We replaced all of these functions with simple stubs in libpng-1.2.20, +when the Intel assembler code was removed due to a licensing issue. + +These macros are deprecated: + + PNG_READ_TRANSFORMS_NOT_SUPPORTED + PNG_PROGRESSIVE_READ_NOT_SUPPORTED + PNG_NO_SEQUENTIAL_READ_SUPPORTED + PNG_WRITE_TRANSFORMS_NOT_SUPPORTED + PNG_READ_ANCILLARY_CHUNKS_NOT_SUPPORTED + PNG_WRITE_ANCILLARY_CHUNKS_NOT_SUPPORTED + +They have been replaced, respectively, by: + + PNG_NO_READ_TRANSFORMS + PNG_NO_PROGRESSIVE_READ + PNG_NO_SEQUENTIAL_READ + PNG_NO_WRITE_TRANSFORMS + PNG_NO_READ_ANCILLARY_CHUNKS + PNG_NO_WRITE_ANCILLARY_CHUNKS + +PNG_MAX_UINT was replaced with PNG_UINT_31_MAX. It has been +deprecated since libpng-1.0.16 and libpng-1.2.6. + +The function + png_check_sig(sig, num) +was replaced with + !png_sig_cmp(sig, 0, num) +It has been deprecated since libpng-0.90. + +The function + png_set_gray_1_2_4_to_8() +which also expands tRNS to alpha was replaced with + png_set_expand_gray_1_2_4_to_8() +which does not. It has been deprecated since libpng-1.0.18 and 1.2.9. + +IX. Changes to Libpng from version 1.0.x/1.2.x to 1.4.x + +Private libpng prototypes and macro definitions were moved from +png.h and pngconf.h into a new pngpriv.h header file. + +Functions png_set_benign_errors(), png_benign_error(), and +png_chunk_benign_error() were added. + +Support for setting the maximum amount of memory that the application +will allocate for reading chunks was added, as a security measure. +The functions png_set_chunk_cache_max() and png_get_chunk_cache_max() +were added to the library. + +We implemented support for I/O states by adding png_ptr member io_state +and functions png_get_io_chunk_name() and png_get_io_state() in pngget.c + +We added PNG_TRANSFORM_GRAY_TO_RGB to the available high-level +input transforms. + +Checking for and reporting of errors in the IHDR chunk is more thorough. + +Support for global arrays was removed, to improve thread safety. + +Some obsolete/deprecated macros and functions have been removed. + +Typecasted NULL definitions such as + #define png_voidp_NULL (png_voidp)NULL +were eliminated. If you used these in your application, just use +NULL instead. + +The png_struct and info_struct members "trans" and "trans_values" were +changed to "trans_alpha" and "trans_color", respectively. + +The obsolete, unused pnggccrd.c and pngvcrd.c files and related makefiles +were removed. + +The PNG_1_0_X and PNG_1_2_X macros were eliminated. + +The PNG_LEGACY_SUPPORTED macro was eliminated. + +Many WIN32_WCE #ifdefs were removed. + +The functions png_read_init(info_ptr), png_write_init(info_ptr), +png_info_init(info_ptr), png_read_destroy(), and png_write_destroy() +have been removed. They have been deprecated since libpng-0.95. + +The png_permit_empty_plte() was removed. It has been deprecated +since libpng-1.0.9. Use png_permit_mng_features() instead. + +We removed the obsolete stub functions png_get_mmx_flagmask(), +png_set_mmx_thresholds(), png_get_asm_flags(), +png_get_mmx_bitdepth_threshold(), png_get_mmx_rowbytes_threshold(), +png_set_asm_flags(), and png_mmx_supported() + +We removed the obsolete png_check_sig(), png_memcpy_check(), and +png_memset_check() functions. Instead use !png_sig_cmp(), memcpy(), +and memset(), respectively. + +The function png_set_gray_1_2_4_to_8() was removed. It has been +deprecated since libpng-1.0.18 and 1.2.9, when it was replaced with +png_set_expand_gray_1_2_4_to_8() because the former function also +expanded any tRNS chunk to an alpha channel. + +Macros for png_get_uint_16, png_get_uint_32, and png_get_int_32 +were added and are used by default instead of the corresponding +functions. Unfortunately, +from libpng-1.4.0 until 1.4.4, the png_get_uint_16 macro (but not the +function) incorrectly returned a value of type png_uint_32. + +We changed the prototype for png_malloc() from + png_malloc(png_structp png_ptr, png_uint_32 size) +to + png_malloc(png_structp png_ptr, png_alloc_size_t size) + +This also applies to the prototype for the user replacement malloc_fn(). + +The png_calloc() function was added and is used in place of +of "png_malloc(); memset();" except in the case in png_read_png() +where the array consists of pointers; in this case a "for" loop is used +after the png_malloc() to set the pointers to NULL, to give robust. +behavior in case the application runs out of memory part-way through +the process. + +We changed the prototypes of png_get_compression_buffer_size() and +png_set_compression_buffer_size() to work with png_size_t instead of +png_uint_32. + +Support for numbered error messages was removed by default, since we +never got around to actually numbering the error messages. The function +png_set_strip_error_numbers() was removed from the library by default. + +The png_zalloc() and png_zfree() functions are no longer exported. +The png_zalloc() function no longer zeroes out the memory that it +allocates. + +Support for dithering was disabled by default in libpng-1.4.0, because +been well tested and doesn't actually "dither". The code was not +removed, however, and could be enabled by building libpng with +PNG_READ_DITHER_SUPPORTED defined. In libpng-1.4.2, this support +was reenabled, but the function was renamed png_set_quantize() to +reflect more accurately what it actually does. At the same time, +the PNG_DITHER_[RED,GREEN_BLUE]_BITS macros were also renamed to +PNG_QUANTIZE_[RED,GREEN,BLUE]_BITS, and PNG_READ_DITHER_SUPPORTED +was renamed to PNG_READ_QUANTIZE_SUPPORTED. + +We removed the trailing '.' from the warning and error messages. + +X. Changes to Libpng from version 1.4.x to 1.5.x + +From libpng-1.4.0 until 1.4.4, the png_get_uint_16 macro (but not the +function) incorrectly returned a value of type png_uint_32. + +A. Changes that affect users of libpng + +There are no substantial API changes between the non-deprecated parts of +the 1.4.5 API and the 1.5.0 API, however the ability to directly access +the main libpng control structures, png_struct and png_info, deprecated +in earlier versions of libpng, has been completely removed from +libpng 1.5. + +We no longer include zlib.h in png.h. Applications that need access +to information in zlib.h will need to add the '#include "zlib.h"' +directive. It does not matter whether it is placed prior to or after +the '"#include png.h"' directive. + +We moved the png_strcpy(), png_strncpy(), png_strlen(), png_memcpy(), +png_memcmp(), png_sprintf, and png_memcpy() macros into a private +header file (pngpriv.h) that is not accessible to applications. + +In png_get_iCCP, the type of "profile" was changed from png_charpp +to png_bytepp, and in png_set_iCCP, from png_charp to png_const_bytep. + +There are changes of form in png.h, including new and changed macros to +declare +parts of the API. Some API functions with arguments that are pointers to +data not modified within the function have been corrected to declare +these arguments with PNG_CONST. + +Much of the internal use of C macros to control the library build has also +changed and some of this is visible in the exported header files, in +particular the use of macros to control data and API elements visible +during application compilation may require significant revision to +application code. (It is extremely rare for an application to do this.) + +Any program that compiled against libpng 1.4 and did not use deprecated +features or access internal library structures should compile and work +against libpng 1.5, except for the change in the prototype for +png_get_iCCP() and png_set_iCCP() API functions mentioned above. + +libpng 1.5.0 adds PNG_ PASS macros to help in the reading and writing of +interlaced images. The macros return the number of rows and columns in +each pass and information that can be used to de-interlace and (if +absolutely necessary) interlace an image. + +libpng 1.5.0 adds an API png_longjmp(png_ptr, value). This API calls +the application-provided png_longjmp_ptr on the internal, but application +initialized, jmpbuf. It is provided as a convenience to avoid the need +to use the png_jmpbuf macro, which had the unnecessary side effect of +resetting the internal png_longjmp_ptr value. + +libpng 1.5.0 includes a complete fixed point API. By default this is +present along with the corresponding floating point API. In general the +fixed point API is faster and smaller than the floating point one because +the PNG file format used fixed point, not floating point. This applies +even if the library uses floating point in internal calculations. A new +macro, PNG_FLOATING_ARITHMETIC_SUPPORTED, reveals whether the library +uses floating point arithmetic (the default) or fixed point arithmetic +internally for performance critical calculations such as gamma correction. +In some cases, the gamma calculations may produce slightly different +results. This has changed the results in png_rgb_to_gray and in alpha +composition (png_set_background for example). This applies even if the +original image was already linear (gamma == 1.0) and, therefore, it is +not necessary to linearize the image. This is because libpng has *not* +been changed to optimize that case correctly, yet. + +Fixed point support for the sCAL chunk comes with an important caveat; +the sCAL specification uses a decimal encoding of floating point values +and the accuracy of PNG fixed point values is insufficient for +representation of these values. Consequently a "string" API +(png_get_sCAL_s and png_set_sCAL_s) is the only reliable way of reading +arbitrary sCAL chunks in the absence of either the floating point API or +internal floating point calculations. + +Applications no longer need to include the optional distribution header +file pngusr.h or define the corresponding macros during application +build in order to see the correct variant of the libpng API. From 1.5.0 +application code can check for the corresponding _SUPPORTED macro: + +#ifdef PNG_INCH_CONVERSIONS_SUPPORTED + /* code that uses the inch conversion APIs. */ +#endif + +This macro will only be defined if the inch conversion functions have been +compiled into libpng. The full set of macros, and whether or not support +has been compiled in, are available in the header file pnglibconf.h. +This header file is specific to the libpng build. Notice that prior to +1.5.0 the _SUPPORTED macros would always have the default definition unless +reset by pngusr.h or by explicit settings on the compiler command line. +These settings may produce compiler warnings or errors in 1.5.0 because +of macro redefinition. + +From libpng-1.4.0 until 1.4.4, the png_get_uint_16 macro (but not the +function) incorrectly returned a value of type png_uint_32. libpng 1.5.0 +is consistent with the implementation in 1.4.5 and 1.2.x (where the macro +did not exist.) + +Applications can now choose whether to use these macros or to call the +corresponding function by defining PNG_USE_READ_MACROS or +PNG_NO_USE_READ_MACROS before including png.h. Notice that this is +only supported from 1.5.0 -defining PNG_NO_USE_READ_MACROS prior to 1.5.0 + will lead to a link failure. + +B. Changes to the build and configuration of libpng + +Details of internal changes to the library code can be found in the CHANGES +file. These will be of no concern to the vast majority of library users or +builders, however the few who configure libpng to a non-default feature +set may need to change how this is done. + +There should be no need for library builders to alter build scripts if +these use the distributed build support - configure or the makefiles - +however users of the makefiles may care to update their build scripts +to build pnglibconf.h where the corresponding makefile does not do so. + +Building libpng with a non-default configuration has changed completely. +The old method using pngusr.h should still work correctly even though the +way pngusr.h is used in the build has been changed, however library +builders will probably want to examine the changes to take advantage of +new capabilities and to simplify their build system. + +B.1 Specific changes to library configuration capabilities + +The library now supports a complete fixed point implementation and can +thus be used on systems which have no floating point support or very +limited or slow support. Previously gamma correction, an essential part +of complete PNG support, required reasonably fast floating point. + +As part of this the choice of internal implementation has been made +independent of the choice of fixed versus floating point APIs and all the +missing fixed point APIs have been implemented. + +The exact mechanism used to control attributes of API functions has +changed. A single set of operating system independent macro definitions +is used and operating system specific directives are defined in +pnglibconf.h + +As part of this the mechanism used to choose procedure call standards on +those systems that allow a choice has been changed. At present this only +affects certain Microsoft (DOS, Windows) and IBM (OS/2) operating systems +running on Intel processors. As before PNGAPI is defined where required +to control the exported API functions; however, two new macros, PNGCBAPI +and PNGCAPI, are used instead for callback functions (PNGCBAPI) and +(PNGCAPI) for functions that must match a C library prototype (currently +only png_longjmp_ptr, which must match the C longjmp function.) The new +approach is documented in pngconf.h + +Despite these changes libpng 1.5.0 only supports the native C function +calling standard on those platforms tested so far (__cdecl on Microsoft +Windows). This is because the support requirements for alternative +calling conventions seem to no longer exist. Developers who find it +necessary to set PNG_API_RULE to 1 should advise the mailing list +(png-mng-implement) of this and library builders who use Openwatcom and +therefore set PNG_API_RULE to 2 should also contact the mailing list. + +A new test program, pngvalid, is provided in addition to pngtest. +pngvalid validates the arithmetic accuracy of the gamma correction +calculations and includes a number of validations of the file format. +A subset of the full range of tests is run when "make check" is done +(in the 'configure' build.) pngvalid also allows total allocated memory +usage to be evaluated and performs additional memory overwrite validation. + +Many changes to individual feature macros have been made. The following +are the changes most likely to be noticed by library builders who +configure libpng: + +1) All feature macros now have consistent naming: + +#define PNG_NO_feature turns the feature off +#define PNG_feature_SUPPORTED turns the feature on + +pnglibconf.h contains one line for each feature macro which is either: + +#define PNG_feature_SUPPORTED + +if the feature is supported or: + +/*#undef PNG_feature_SUPPORTED*/ + +if it is not. Library code consistently checks for the 'SUPPORTED' macro. +It does not, and should not, check for the 'NO' macro which will not +normally be defined even if the feature is not supported. + +Compatibility with the old names is provided as follows: + +PNG_INCH_CONVERSIONS turns on PNG_INCH_CONVERSIONS_SUPPORTED + +And the following definitions disable the corresponding feature: + +PNG_SETJMP_NOT_SUPPORTED disables SETJMP +PNG_READ_TRANSFORMS_NOT_SUPPORTED disables READ_TRANSFORMS +PNG_NO_READ_COMPOSITED_NODIV disables READ_COMPOSITE_NODIV +PNG_WRITE_TRANSFORMS_NOT_SUPPORTED disables WRITE_TRANSFORMS +PNG_READ_ANCILLARY_CHUNKS_NOT_SUPPORTED disables READ_ANCILLARY_CHUNKS +PNG_WRITE_ANCILLARY_CHUNKS_NOT_SUPPORTED disables WRITE_ANCILLARY_CHUNKS + +Library builders should remove use of the above, inconsistent, names. + +2) Warning and error message formatting was previously conditional on +the STDIO feature. The library has been changed to use the +CONSOLE_IO feature instead. This means that if CONSOLE_IO is disabled +the library no longer uses the printf(3) functions, even though the +default read/write implementations use (FILE) style stdio.h functions. + +3) Three feature macros now control the fixed/floating point decisions: + +PNG_FLOATING_POINT_SUPPORTED enables the floating point APIs + +PNG_FIXED_POINT_SUPPORTED enables the fixed point APIs; however, in +practice these are normally required internally anyway (because the PNG +file format is fixed point), therefore in most cases PNG_NO_FIXED_POINT +merely stops the function from being exported. + +PNG_FLOATING_ARITHMETIC_SUPPORTED chooses between the internal floating +point implementation or the fixed point one. Typically the fixed point +implementation is larger and slower than the floating point implementation +on a system that supports floating point, however it may be faster on a +system which lacks floating point hardware and therefore uses a software +emulation. + +4) Added PNG_{READ,WRITE}_INT_FUNCTIONS_SUPPORTED. This allows the +functions to read and write ints to be disabled independently of +PNG_USE_READ_MACROS, which allows libpng to be built with the functions +even though the default is to use the macros - this allows applications +to choose at app buildtime whether or not to use macros (previously +impossible because the functions weren't in the default build.) + +B.2 Changes to the configuration mechanism + +Prior to libpng-1.5.0 library builders who needed to configure libpng +had either to modify the exported pngconf.h header file to add system +specific configuration or had to write feature selection macros into +pngusr.h and cause this to be included into pngconf.h by defining +PNG_USER_CONFIG. The latter mechanism had the disadvantage that an +application built without PNG_USER_CONFIG defined would see the +unmodified, default, libpng API and thus would probably fail to link. + +These mechanisms still work in the configure build and in any makefile +build that builds pnglibconf.h although the feature selection macros +have changed somewhat as described above. In 1.5.0, however, pngusr.h is +processed only once, when the exported header file pnglibconf.h is built. +pngconf.h no longer includes pngusr.h, therefore it is ignored after the +build of pnglibconf.h and it is never included in an application build. + +The rarely used alternative of adding a list of feature macros to the +CFLAGS setting in the build also still works, however the macros will be +copied to pnglibconf.h and this may produce macro redefinition warnings +when the individual C files are compiled. + +All configuration now only works if pnglibconf.h is built from +scripts/pnglibconf.dfa. This requires the program awk. Brian Kernighan +(the original author of awk) maintains C source code of that awk and this +and all known later implementations (often called by subtly different +names - nawk and gawk for example) are adequate to build pnglibconf.h. +The Sun Microsystems (now Oracle) program 'awk' is an earlier version +and does not work, this may also apply to other systems that have a +functioning awk called 'nawk'. + +Configuration options are now documented in scripts/pnglibconf.dfa. This +file also includes dependency information that ensures a configuration is +consistent; that is, if a feature is switched off dependent features are +also removed. As a recommended alternative to using feature macros in +pngusr.h a system builder may also define equivalent options in pngusr.dfa +(or, indeed, any file) and add that to the configuration by setting +DFA_XTRA to the file name. The makefiles in contrib/pngminim illustrate +how to do this, and a case where pngusr.h is still required. + +XI. Detecting libpng + +The png_get_io_ptr() function has been present since libpng-0.88, has never +changed, and is unaffected by conditional compilation macros. It is the +best choice for use in configure scripts for detecting the presence of any +libpng version since 0.88. In an autoconf "configure.in" you could use + + AC_CHECK_LIB(png, png_get_io_ptr, ... + +XII. Source code repository + +Since about February 2009, version 1.2.34, libpng has been under "git" source +control. The git repository was built from old libpng-x.y.z.tar.gz files +going back to version 0.70. You can access the git repository (read only) +at + + git://libpng.git.sourceforge.net/gitroot/libpng + +or you can browse it via "gitweb" at + + http://libpng.git.sourceforge.net/git/gitweb.cgi?p=libpng + +Patches can be sent to glennrp at users.sourceforge.net or to +png-mng-implement at lists.sourceforge.net or you can upload them to +the libpng bug tracker at + + http://libpng.sourceforge.net + +We also accept patches built from the tar or zip distributions, and +simple verbal discriptions of bug fixes, reported either to the +SourceForge bug tracker or to the png-mng-implement at lists.sf.net +mailing list. + +XIII. Coding style + +Our coding style is similar to the "Allman" style, with curly +braces on separate lines: + + if (condition) + { + action; + } + + else if (another condition) + { + another action; + } + +The braces can be omitted from simple one-line actions: + + if (condition) + return (0); + +We use 3-space indentation, except for continued statements which +are usually indented the same as the first line of the statement +plus four more spaces. + +For macro definitions we use 2-space indentation, always leaving the "#" +in the first column. + + #ifndef PNG_NO_FEATURE + # ifndef PNG_FEATURE_SUPPORTED + # define PNG_FEATURE_SUPPORTED + # endif + #endif + +Comments appear with the leading "/*" at the same indentation as +the statement that follows the comment: + + /* Single-line comment */ + statement; + + /* This is a multiple-line + * comment. + */ + statement; + +Very short comments can be placed after the end of the statement +to which they pertain: + + statement; /* comment */ + +We don't use C++ style ("//") comments. We have, however, +used them in the past in some now-abandoned MMX assembler +code. + +Functions and their curly braces are not indented, and +exported functions are marked with PNGAPI: + + /* This is a public function that is visible to + * application programmers. It does thus-and-so. + */ + void PNGAPI + png_exported_function(png_ptr, png_info, foo) + { + body; + } + +The prototypes for all exported functions appear in png.h, +above the comment that says + + /* Maintainer: Put new public prototypes here ... */ + +We mark all non-exported functions with "/* PRIVATE */"": + + void /* PRIVATE */ + png_non_exported_function(png_ptr, png_info, foo) + { + body; + } + +The prototypes for non-exported functions (except for those in +pngtest) appear in +pngpriv.h +above the comment that says + + /* Maintainer: Put new private prototypes here ^ and in libpngpf.3 */ + +To avoid polluting the global namespace, the names of all exported +functions and variables begin with "png_", and all publicly visible C +preprocessor macros begin with "PNG_". We request that applications that +use libpng *not* begin any of their own symbols with either of these strings. + +We put a space after each comma and after each semicolon +in "for" statements, and we put spaces before and after each +C binary operator and after "for" or "while", and before +"?". We don't put a space between a typecast and the expression +being cast, nor do we put one between a function name and the +left parenthesis that follows it: + + for (i = 2; i > 0; --i) + y[i] = a(x) + (int)b; + +We prefer #ifdef and #ifndef to #if defined() and if !defined() +when there is only one macro being tested. + +We do not use the TAB character for indentation in the C sources. + +Lines do not exceed 80 characters. + +Other rules can be inferred by inspecting the libpng source. + +XIV. Y2K Compliance in libpng + +March 31, 2011 + +Since the PNG Development group is an ad-hoc body, we can't make +an official declaration. + +This is your unofficial assurance that libpng from version 0.71 and +upward through 1.5.2 are Y2K compliant. It is my belief that earlier +versions were also Y2K compliant. + +Libpng only has three year fields. One is a 2-byte unsigned integer that +will hold years up to 65535. The other two hold the date in text +format, and will hold years up to 9999. + +The integer is + "png_uint_16 year" in png_time_struct. + +The strings are + "png_charp time_buffer" in png_struct and + "near_time_buffer", which is a local character string in png.c. + +There are seven time-related functions: + + png_convert_to_rfc_1123() in png.c + (formerly png_convert_to_rfc_1152() in error) + png_convert_from_struct_tm() in pngwrite.c, called + in pngwrite.c + png_convert_from_time_t() in pngwrite.c + png_get_tIME() in pngget.c + png_handle_tIME() in pngrutil.c, called in pngread.c + png_set_tIME() in pngset.c + png_write_tIME() in pngwutil.c, called in pngwrite.c + +All appear to handle dates properly in a Y2K environment. The +png_convert_from_time_t() function calls gmtime() to convert from system +clock time, which returns (year - 1900), which we properly convert to +the full 4-digit year. There is a possibility that applications using +libpng are not passing 4-digit years into the png_convert_to_rfc_1123() +function, or that they are incorrectly passing only a 2-digit year +instead of "year - 1900" into the png_convert_from_struct_tm() function, +but this is not under our control. The libpng documentation has always +stated that it works with 4-digit years, and the APIs have been +documented as such. + +The tIME chunk itself is also Y2K compliant. It uses a 2-byte unsigned +integer to hold the year, and can hold years as large as 65535. + +zlib, upon which libpng depends, is also Y2K compliant. It contains +no date-related code. + + + Glenn Randers-Pehrson + libpng maintainer + PNG Development Group diff --git a/reactos/dll/3rdparty/libpng/png.c b/reactos/dll/3rdparty/libpng/png.c index dab4f36459d..7d09b0dbd21 100644 --- a/reactos/dll/3rdparty/libpng/png.c +++ b/reactos/dll/3rdparty/libpng/png.c @@ -1,8 +1,8 @@ /* png.c - location for general purpose libpng functions * - * Last changed in libpng 1.4.2 [May 6, 2010] - * Copyright (c) 1998-2010 Glenn Randers-Pehrson + * Last changed in libpng 1.5.1 [February 3, 2011] + * Copyright (c) 1998-2011 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * @@ -11,17 +11,10 @@ * and license in png.h */ -#define PNG_NO_EXTERN -#define PNG_NO_PEDANTIC_WARNINGS -#include "png.h" #include "pngpriv.h" /* Generate a compiler error if there is an old png.h in the search path. */ -typedef version_1_4_3 Your_png_h_is_not_version_1_4_3; - -/* Version information for C files. This had better match the version - * string defined in png.h. - */ +typedef png_libpng_version_1_5_2 Your_png_h_is_not_version_1_5_2; /* Tells libpng that we have already handled the first "num_bytes" bytes * of the PNG file signature. If the PNG data is embedded into another @@ -53,11 +46,13 @@ png_set_sig_bytes(png_structp png_ptr, int num_bytes) * PNG signature (this is the same behaviour as strcmp, memcmp, etc). */ int PNGAPI -png_sig_cmp(png_bytep sig, png_size_t start, png_size_t num_to_check) +png_sig_cmp(png_const_bytep sig, png_size_t start, png_size_t num_to_check) { png_byte png_signature[8] = {137, 80, 78, 71, 13, 10, 26, 10}; + if (num_to_check > 8) num_to_check = 8; + else if (num_to_check < 1) return (-1); @@ -73,9 +68,9 @@ png_sig_cmp(png_bytep sig, png_size_t start, png_size_t num_to_check) #endif /* PNG_READ_SUPPORTED */ #if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) -/* Function to allocate memory for zlib and clear it to 0. */ -voidpf /* PRIVATE */ -png_zalloc(voidpf png_ptr, uInt items, uInt size) +/* Function to allocate memory for zlib */ +PNG_FUNCTION(voidpf /* PRIVATE */, +png_zalloc,(voidpf png_ptr, uInt items, uInt size),PNG_ALLOCATED) { png_voidp ptr; png_structp p=(png_structp)png_ptr; @@ -84,6 +79,7 @@ png_zalloc(voidpf png_ptr, uInt items, uInt size) if (png_ptr == NULL) return (NULL); + if (items > PNG_UINT_32_MAX/size) { png_warning (p, "Potential overflow in png_zalloc()"); @@ -120,7 +116,7 @@ png_reset_crc(png_structp png_ptr) * trouble of calculating it. */ void /* PRIVATE */ -png_calculate_crc(png_structp png_ptr, png_bytep ptr, png_size_t length) +png_calculate_crc(png_structp png_ptr, png_const_bytep ptr, png_size_t length) { int need_crc = 1; @@ -130,6 +126,7 @@ png_calculate_crc(png_structp png_ptr, png_bytep ptr, png_size_t length) (PNG_FLAG_CRC_ANCILLARY_USE | PNG_FLAG_CRC_ANCILLARY_NOWARN)) need_crc = 0; } + else /* critical */ { if (png_ptr->flags & PNG_FLAG_CRC_CRITICAL_IGNORE) @@ -146,8 +143,8 @@ png_calculate_crc(png_structp png_ptr, png_bytep ptr, png_size_t length) * and png_info_init() so that applications that want to use a shared * libpng don't have to be recompiled if png_info changes size. */ -png_infop PNGAPI -png_create_info_struct(png_structp png_ptr) +PNG_FUNCTION(png_infop,PNGAPI +png_create_info_struct,(png_structp png_ptr),PNG_ALLOCATED) { png_infop info_ptr; @@ -237,8 +234,10 @@ png_data_freer(png_structp png_ptr, png_infop info_ptr, if (freer == PNG_DESTROY_WILL_FREE_DATA) info_ptr->free_me |= mask; + else if (freer == PNG_USER_WILL_FREE_DATA) info_ptr->free_me &= ~mask; + else png_warning(png_ptr, "Unknown freer parameter in png_data_freer"); @@ -265,6 +264,7 @@ png_free_data(png_structp png_ptr, png_infop info_ptr, png_uint_32 mask, info_ptr->text[num].key = NULL; } } + else { int i; @@ -350,6 +350,7 @@ png_free_data(png_structp png_ptr, png_infop info_ptr, png_uint_32 mask, info_ptr->splt_palettes[num].entries = NULL; } } + else { if (info_ptr->splt_palettes_num) @@ -384,13 +385,14 @@ png_free_data(png_structp png_ptr, png_infop info_ptr, png_uint_32 mask, info_ptr->unknown_chunks[num].data = NULL; } } + else { int i; if (info_ptr->unknown_chunks_num) { - for (i = 0; i < (int)info_ptr->unknown_chunks_num; i++) + for (i = 0; i < info_ptr->unknown_chunks_num; i++) png_free_data(png_ptr, info_ptr, PNG_FREE_UNKN, i); png_free(png_ptr, info_ptr->unknown_chunks); @@ -439,10 +441,10 @@ png_free_data(png_structp png_ptr, png_infop info_ptr, png_uint_32 mask, } #endif - if (num == -1) - info_ptr->free_me &= ~mask; - else - info_ptr->free_me &= ~(mask & ~PNG_FREE_MUL); + if (num != -1) + mask &= ~PNG_FREE_MUL; + + info_ptr->free_me &= ~mask; } /* This is an internal routine to free any memory that the info struct is @@ -478,11 +480,12 @@ png_get_io_ptr(png_structp png_ptr) { if (png_ptr == NULL) return (NULL); + return (png_ptr->io_ptr); } #if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) -#ifdef PNG_STDIO_SUPPORTED +# ifdef PNG_STDIO_SUPPORTED /* Initialize the default input/output functions for the PNG file. If you * use your own read or write routines, you can call either png_set_read_fn() * or png_set_write_fn() instead of png_init_io(). If you have defined @@ -499,14 +502,14 @@ png_init_io(png_structp png_ptr, png_FILE_p fp) png_ptr->io_ptr = (png_voidp)fp; } -#endif +# endif -#ifdef PNG_TIME_RFC1123_SUPPORTED +# ifdef PNG_TIME_RFC1123_SUPPORTED /* Convert the supplied time into an RFC 1123 string suitable for use in * a "Creation Time" or other text-based time string. */ -png_charp PNGAPI -png_convert_to_rfc1123(png_structp png_ptr, png_timep ptime) +png_const_charp PNGAPI +png_convert_to_rfc1123(png_structp png_ptr, png_const_timep ptime) { static PNG_CONST char short_months[12][4] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", @@ -514,13 +517,14 @@ png_convert_to_rfc1123(png_structp png_ptr, png_timep ptime) if (png_ptr == NULL) return (NULL); + if (png_ptr->time_buffer == NULL) { png_ptr->time_buffer = (png_charp)png_malloc(png_ptr, (png_uint_32)(29* png_sizeof(char))); } -#ifdef USE_FAR_KEYWORD +# ifdef USE_FAR_KEYWORD { char near_time_buf[29]; png_snprintf6(near_time_buf, 29, "%d %s %d %02d:%02d:%02d +0000", @@ -530,38 +534,38 @@ png_convert_to_rfc1123(png_structp png_ptr, png_timep ptime) png_memcpy(png_ptr->time_buffer, near_time_buf, 29*png_sizeof(char)); } -#else +# else png_snprintf6(png_ptr->time_buffer, 29, "%d %s %d %02d:%02d:%02d +0000", ptime->day % 32, short_months[(ptime->month - 1) % 12], ptime->year, ptime->hour % 24, ptime->minute % 60, ptime->second % 61); -#endif - return ((png_charp)png_ptr->time_buffer); +# endif + return png_ptr->time_buffer; } -#endif /* PNG_TIME_RFC1123_SUPPORTED */ +# endif /* PNG_TIME_RFC1123_SUPPORTED */ #endif /* defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) */ -png_charp PNGAPI -png_get_copyright(png_structp png_ptr) +png_const_charp PNGAPI +png_get_copyright(png_const_structp png_ptr) { - png_ptr = png_ptr; /* Silence compiler warning about unused png_ptr */ + PNG_UNUSED(png_ptr) /* Silence compiler warning about unused png_ptr */ #ifdef PNG_STRING_COPYRIGHT - return PNG_STRING_COPYRIGHT + return PNG_STRING_COPYRIGHT #else -#ifdef __STDC__ - return ((png_charp) PNG_STRING_NEWLINE \ - "libpng version 1.4.3 - June 26, 2010" PNG_STRING_NEWLINE \ - "Copyright (c) 1998-2010 Glenn Randers-Pehrson" PNG_STRING_NEWLINE \ +# ifdef __STDC__ + return PNG_STRING_NEWLINE \ + "libpng version 1.5.2 - March 31, 2011" PNG_STRING_NEWLINE \ + "Copyright (c) 1998-2011 Glenn Randers-Pehrson" PNG_STRING_NEWLINE \ "Copyright (c) 1996-1997 Andreas Dilger" PNG_STRING_NEWLINE \ "Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc." \ - PNG_STRING_NEWLINE); -#else - return ((png_charp) "libpng version 1.4.3 - June 26, 2010\ - Copyright (c) 1998-2010 Glenn Randers-Pehrson\ + PNG_STRING_NEWLINE; +# else + return "libpng version 1.5.2 - March 31, 2011\ + Copyright (c) 1998-2011 Glenn Randers-Pehrson\ Copyright (c) 1996-1997 Andreas Dilger\ - Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc."); -#endif + Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc."; +# endif #endif } @@ -573,55 +577,55 @@ png_get_copyright(png_structp png_ptr) * png_get_header_ver(). Due to the version_nn_nn_nn typedef guard, * it is guaranteed that png.c uses the correct version of png.h. */ -png_charp PNGAPI -png_get_libpng_ver(png_structp png_ptr) +png_const_charp PNGAPI +png_get_libpng_ver(png_const_structp png_ptr) { /* Version of *.c files used when building libpng */ - png_ptr = png_ptr; /* Silence compiler warning about unused png_ptr */ - return ((png_charp) PNG_LIBPNG_VER_STRING); + return png_get_header_ver(png_ptr); } -png_charp PNGAPI -png_get_header_ver(png_structp png_ptr) +png_const_charp PNGAPI +png_get_header_ver(png_const_structp png_ptr) { /* Version of *.h files used when building libpng */ - png_ptr = png_ptr; /* Silence compiler warning about unused png_ptr */ - return ((png_charp) PNG_LIBPNG_VER_STRING); + PNG_UNUSED(png_ptr) /* Silence compiler warning about unused png_ptr */ + return PNG_LIBPNG_VER_STRING; } -png_charp PNGAPI -png_get_header_version(png_structp png_ptr) +png_const_charp PNGAPI +png_get_header_version(png_const_structp png_ptr) { /* Returns longer string containing both version and date */ - png_ptr = png_ptr; /* Silence compiler warning about unused png_ptr */ + PNG_UNUSED(png_ptr) /* Silence compiler warning about unused png_ptr */ #ifdef __STDC__ - return ((png_charp) PNG_HEADER_VERSION_STRING -#ifndef PNG_READ_SUPPORTED + return PNG_HEADER_VERSION_STRING +# ifndef PNG_READ_SUPPORTED " (NO READ SUPPORT)" -#endif - PNG_STRING_NEWLINE); +# endif + PNG_STRING_NEWLINE; #else - return ((png_charp) PNG_HEADER_VERSION_STRING); + return PNG_HEADER_VERSION_STRING; #endif } #if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) -#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED +# ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED int PNGAPI -png_handle_as_unknown(png_structp png_ptr, png_bytep chunk_name) +png_handle_as_unknown(png_structp png_ptr, png_const_bytep chunk_name) { /* Check chunk_name and return "keep" value if it's on the list, else 0 */ int i; png_bytep p; if (png_ptr == NULL || chunk_name == NULL || png_ptr->num_chunk_list<=0) return 0; + p = png_ptr->chunk_list + png_ptr->num_chunk_list*5 - 5; for (i = png_ptr->num_chunk_list; i; i--, p -= 5) if (!png_memcmp(chunk_name, p, 4)) return ((int)*(p + 4)); return 0; } -#endif +# endif #endif /* defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) */ #ifdef PNG_READ_SUPPORTED @@ -631,6 +635,7 @@ png_reset_zstream(png_structp png_ptr) { if (png_ptr == NULL) return Z_STREAM_ERROR; + return (inflateReset(&png_ptr->zstream)); } #endif /* PNG_READ_SUPPORTED */ @@ -640,13 +645,13 @@ png_uint_32 PNGAPI png_access_version_number(void) { /* Version of *.c files used when building libpng */ - return((png_uint_32) PNG_LIBPNG_VER); + return((png_uint_32)PNG_LIBPNG_VER); } #if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) -#ifdef PNG_SIZE_T +# ifdef PNG_SIZE_T /* Added at libpng version 1.2.6 */ PNG_EXTERN png_size_t PNGAPI png_convert_size PNGARG((size_t size)); png_size_t PNGAPI @@ -654,53 +659,13 @@ png_convert_size(size_t size) { if (size > (png_size_t)-1) PNG_ABORT(); /* We haven't got access to png_ptr, so no png_error() */ + return ((png_size_t)size); } -#endif /* PNG_SIZE_T */ +# endif /* PNG_SIZE_T */ /* Added at libpng version 1.2.34 and 1.4.0 (moved from pngset.c) */ -#ifdef PNG_cHRM_SUPPORTED -#ifdef PNG_CHECK_cHRM_SUPPORTED - -/* - * Multiply two 32-bit numbers, V1 and V2, using 32-bit - * arithmetic, to produce a 64 bit result in the HI/LO words. - * - * A B - * x C D - * ------ - * AD || BD - * AC || CB || 0 - * - * where A and B are the high and low 16-bit words of V1, - * C and D are the 16-bit words of V2, AD is the product of - * A and D, and X || Y is (X << 16) + Y. -*/ - -void /* PRIVATE */ -png_64bit_product (long v1, long v2, unsigned long *hi_product, - unsigned long *lo_product) -{ - int a, b, c, d; - long lo, hi, x, y; - - a = (v1 >> 16) & 0xffff; - b = v1 & 0xffff; - c = (v2 >> 16) & 0xffff; - d = v2 & 0xffff; - - lo = b * d; /* BD */ - x = a * d + c * b; /* AD + CB */ - y = ((lo >> 16) & 0xffff) + x; - - lo = (lo & 0xffff) | ((y & 0xffff) << 16); - hi = (y >> 16) & 0xffff; - - hi += a * c; /* AC */ - - *hi_product = (unsigned long)hi; - *lo_product = (unsigned long)lo; -} +# ifdef PNG_CHECK_cHRM_SUPPORTED int /* PRIVATE */ png_check_cHRM_fixed(png_structp png_ptr, @@ -725,14 +690,14 @@ png_check_cHRM_fixed(png_structp png_ptr, "Ignoring attempt to set negative chromaticity value"); ret = 0; } - if (white_x > (png_fixed_point) PNG_UINT_31_MAX || - white_y > (png_fixed_point) PNG_UINT_31_MAX || - red_x > (png_fixed_point) PNG_UINT_31_MAX || - red_y > (png_fixed_point) PNG_UINT_31_MAX || - green_x > (png_fixed_point) PNG_UINT_31_MAX || - green_y > (png_fixed_point) PNG_UINT_31_MAX || - blue_x > (png_fixed_point) PNG_UINT_31_MAX || - blue_y > (png_fixed_point) PNG_UINT_31_MAX ) + if (white_x > (png_fixed_point)PNG_UINT_31_MAX || + white_y > (png_fixed_point)PNG_UINT_31_MAX || + red_x > (png_fixed_point)PNG_UINT_31_MAX || + red_y > (png_fixed_point)PNG_UINT_31_MAX || + green_x > (png_fixed_point)PNG_UINT_31_MAX || + green_y > (png_fixed_point)PNG_UINT_31_MAX || + blue_x > (png_fixed_point)PNG_UINT_31_MAX || + blue_y > (png_fixed_point)PNG_UINT_31_MAX ) { png_warning(png_ptr, "Ignoring attempt to set chromaticity value exceeding 21474.83"); @@ -743,16 +708,19 @@ png_check_cHRM_fixed(png_structp png_ptr, png_warning(png_ptr, "Invalid cHRM white point"); ret = 0; } + if (red_x > 100000L - red_y) { png_warning(png_ptr, "Invalid cHRM red point"); ret = 0; } + if (green_x > 100000L - green_y) { png_warning(png_ptr, "Invalid cHRM green point"); ret = 0; } + if (blue_x > 100000L - blue_y) { png_warning(png_ptr, "Invalid cHRM blue point"); @@ -771,8 +739,7 @@ png_check_cHRM_fixed(png_structp png_ptr, return ret; } -#endif /* PNG_CHECK_cHRM_SUPPORTED */ -#endif /* PNG_cHRM_SUPPORTED */ +# endif /* PNG_CHECK_cHRM_SUPPORTED */ void /* PRIVATE */ png_check_IHDR(png_structp png_ptr, @@ -795,21 +762,22 @@ png_check_IHDR(png_structp png_ptr, error = 1; } -#ifdef PNG_SET_USER_LIMITS_SUPPORTED +# ifdef PNG_SET_USER_LIMITS_SUPPORTED if (width > png_ptr->user_width_max || width > PNG_USER_WIDTH_MAX) -#else + +# else if (width > PNG_USER_WIDTH_MAX) -#endif +# endif { png_warning(png_ptr, "Image width exceeds user limit in IHDR"); error = 1; } -#ifdef PNG_SET_USER_LIMITS_SUPPORTED +# ifdef PNG_SET_USER_LIMITS_SUPPORTED if (height > png_ptr->user_height_max || height > PNG_USER_HEIGHT_MAX) -#else +# else if (height > PNG_USER_HEIGHT_MAX) -#endif +# endif { png_warning(png_ptr, "Image height exceeds user limit in IHDR"); error = 1; @@ -821,15 +789,15 @@ png_check_IHDR(png_structp png_ptr, error = 1; } - if ( height > PNG_UINT_31_MAX) + if (height > PNG_UINT_31_MAX) { png_warning(png_ptr, "Invalid image height in IHDR"); error = 1; } - if ( width > (PNG_UINT_32_MAX + if (width > (PNG_UINT_32_MAX >> 3) /* 8-byte RGBA pixels */ - - 64 /* bigrowbuf hack */ + - 48 /* bigrowbuf hack */ - 1 /* filter byte */ - 7*8 /* rounding of width to multiple of 8 pixels */ - 8) /* extra max_pixel_depth pad */ @@ -871,7 +839,7 @@ png_check_IHDR(png_structp png_ptr, error = 1; } -#ifdef PNG_MNG_FEATURES_SUPPORTED +# ifdef PNG_MNG_FEATURES_SUPPORTED /* Accept filter_method 64 (intrapixel differencing) only if * 1. Libpng was compiled with PNG_MNG_FEATURES_SUPPORTED and * 2. Libpng did not read a PNG signature (this filter_method is only @@ -888,10 +856,10 @@ png_check_IHDR(png_structp png_ptr, if (filter_type != PNG_FILTER_TYPE_BASE) { if (!((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) && - (filter_type == PNG_INTRAPIXEL_DIFFERENCING) && - ((png_ptr->mode & PNG_HAVE_PNG_SIGNATURE) == 0) && - (color_type == PNG_COLOR_TYPE_RGB || - color_type == PNG_COLOR_TYPE_RGB_ALPHA))) + (filter_type == PNG_INTRAPIXEL_DIFFERENCING) && + ((png_ptr->mode & PNG_HAVE_PNG_SIGNATURE) == 0) && + (color_type == PNG_COLOR_TYPE_RGB || + color_type == PNG_COLOR_TYPE_RGB_ALPHA))) { png_warning(png_ptr, "Unknown filter method in IHDR"); error = 1; @@ -904,15 +872,1491 @@ png_check_IHDR(png_structp png_ptr, } } -#else +# else if (filter_type != PNG_FILTER_TYPE_BASE) { png_warning(png_ptr, "Unknown filter method in IHDR"); error = 1; } -#endif +# endif if (error == 1) png_error(png_ptr, "Invalid IHDR data"); } + +#if defined(PNG_sCAL_SUPPORTED) || defined(PNG_pCAL_SUPPORTED) +/* ASCII to fp functions */ +/* Check an ASCII formated floating point value, see the more detailed + * comments in pngpriv.h + */ +/* The following is used internally to preserve the 'valid' flag */ +#define png_fp_add(state, flags) ((state) |= (flags)) +#define png_fp_set(state, value)\ + ((state) = (value) | ((state) & PNG_FP_WAS_VALID)) + +/* Internal type codes: bits above the base state! */ +#define PNG_FP_SIGN 0 /* [+-] */ +#define PNG_FP_DOT 4 /* . */ +#define PNG_FP_DIGIT 8 /* [0123456789] */ +#define PNG_FP_E 12 /* [Ee] */ + +int /* PRIVATE */ +png_check_fp_number(png_const_charp string, png_size_t size, int *statep, + png_size_tp whereami) +{ + int state = *statep; + png_size_t i = *whereami; + + while (i < size) + { + int type; + /* First find the type of the next character */ + { + char ch = string[i]; + + if (ch >= 48 && ch <= 57) + type = PNG_FP_DIGIT; + + else switch (ch) + { + case 43: case 45: type = PNG_FP_SIGN; break; + case 46: type = PNG_FP_DOT; break; + case 69: case 101: type = PNG_FP_E; break; + default: goto PNG_FP_End; + } + } + + /* Now deal with this type according to the current + * state, the type is arranged to not overlap the + * bits of the PNG_FP_STATE. + */ + switch ((state & PNG_FP_STATE) + type) + { + case PNG_FP_INTEGER + PNG_FP_SIGN: + if (state & PNG_FP_SAW_ANY) + goto PNG_FP_End; /* not a part of the number */ + + png_fp_add(state, PNG_FP_SAW_SIGN); + break; + + case PNG_FP_INTEGER + PNG_FP_DOT: + /* Ok as trailer, ok as lead of fraction. */ + if (state & PNG_FP_SAW_DOT) /* two dots */ + goto PNG_FP_End; + + else if (state & PNG_FP_SAW_DIGIT) /* trailing dot? */ + png_fp_add(state, PNG_FP_SAW_DOT); + + else + png_fp_set(state, PNG_FP_FRACTION | PNG_FP_SAW_DOT); + + break; + + case PNG_FP_INTEGER + PNG_FP_DIGIT: + if (state & PNG_FP_SAW_DOT) /* delayed fraction */ + png_fp_set(state, PNG_FP_FRACTION | PNG_FP_SAW_DOT); + + png_fp_add(state, PNG_FP_SAW_DIGIT + PNG_FP_WAS_VALID); + + break; + case PNG_FP_INTEGER + PNG_FP_E: + if ((state & PNG_FP_SAW_DIGIT) == 0) + goto PNG_FP_End; + + png_fp_set(state, PNG_FP_EXPONENT); + + break; + + /* case PNG_FP_FRACTION + PNG_FP_SIGN: + goto PNG_FP_End; ** no sign in exponent */ + + /* case PNG_FP_FRACTION + PNG_FP_DOT: + goto PNG_FP_End; ** Because SAW_DOT is always set */ + + case PNG_FP_FRACTION + PNG_FP_DIGIT: + png_fp_add(state, PNG_FP_SAW_DIGIT + PNG_FP_WAS_VALID); + break; + + case PNG_FP_FRACTION + PNG_FP_E: + /* This is correct because the trailing '.' on an + * integer is handled above - so we can only get here + * with the sequence ".E" (with no preceding digits). + */ + if ((state & PNG_FP_SAW_DIGIT) == 0) + goto PNG_FP_End; + + png_fp_set(state, PNG_FP_EXPONENT); + + break; + + case PNG_FP_EXPONENT + PNG_FP_SIGN: + if (state & PNG_FP_SAW_ANY) + goto PNG_FP_End; /* not a part of the number */ + + png_fp_add(state, PNG_FP_SAW_SIGN); + + break; + + /* case PNG_FP_EXPONENT + PNG_FP_DOT: + goto PNG_FP_End; */ + + case PNG_FP_EXPONENT + PNG_FP_DIGIT: + png_fp_add(state, PNG_FP_SAW_DIGIT + PNG_FP_WAS_VALID); + + break; + + /* case PNG_FP_EXPONEXT + PNG_FP_E: + goto PNG_FP_End; */ + + default: goto PNG_FP_End; /* I.e. break 2 */ + } + + /* The character seems ok, continue. */ + ++i; + } + +PNG_FP_End: + /* Here at the end, update the state and return the correct + * return code. + */ + *statep = state; + *whereami = i; + + return (state & PNG_FP_SAW_DIGIT) != 0; +} + + +/* The same but for a complete string. */ +int +png_check_fp_string(png_const_charp string, png_size_t size) +{ + int state=0; + png_size_t char_index=0; + + return png_check_fp_number(string, size, &state, &char_index) && + (char_index == size || string[char_index] == 0); +} +#endif /* pCAL or sCAL */ + +#ifdef PNG_READ_sCAL_SUPPORTED +# ifdef PNG_FLOATING_POINT_SUPPORTED +/* Utility used below - a simple accurate power of ten from an integral + * exponent. + */ +static double +png_pow10(int power) +{ + int recip = 0; + double d = 1; + + /* Handle negative exponent with a reciprocal at the end because + * 10 is exact whereas .1 is inexact in base 2 + */ + if (power < 0) + { + if (power < DBL_MIN_10_EXP) return 0; + recip = 1, power = -power; + } + + if (power > 0) + { + /* Decompose power bitwise. */ + double mult = 10; + do + { + if (power & 1) d *= mult; + mult *= mult; + power >>= 1; + } + while (power > 0); + + if (recip) d = 1/d; + } + /* else power is 0 and d is 1 */ + + return d; +} + +/* Function to format a floating point value in ASCII with a given + * precision. + */ +void /* PRIVATE */ +png_ascii_from_fp(png_structp png_ptr, png_charp ascii, png_size_t size, + double fp, unsigned int precision) +{ + /* We use standard functions from math.h, but not printf because + * that would require stdio. The caller must supply a buffer of + * sufficient size or we will png_error. The tests on size and + * the space in ascii[] consumed are indicated below. + */ + if (precision < 1) + precision = DBL_DIG; + + /* Enforce the limit of the implementation precision too. */ + if (precision > DBL_DIG+1) + precision = DBL_DIG+1; + + /* Basic sanity checks */ + if (size >= precision+5) /* See the requirements below. */ + { + if (fp < 0) + { + fp = -fp; + *ascii++ = 45; /* '-' PLUS 1 TOTAL 1*/ + --size; + } + + if (fp >= DBL_MIN && fp <= DBL_MAX) + { + int exp_b10; /* A base 10 exponent */ + double base; /* 10^exp_b10 */ + + /* First extract a base 10 exponent of the number, + * the calculation below rounds down when converting + * from base 2 to base 10 (multiply by log10(2) - + * 0.3010, but 77/256 is 0.3008, so exp_b10 needs to + * be increased. Note that the arithmetic shift + * performs a floor() unlike C arithmetic - using a + * C multiply would break the following for negative + * exponents. + */ + (void)frexp(fp, &exp_b10); /* exponent to base 2 */ + + exp_b10 = (exp_b10 * 77) >> 8; /* <= exponent to base 10 */ + + /* Avoid underflow here. */ + base = png_pow10(exp_b10); /* May underflow */ + + while (base < DBL_MIN || base < fp) + { + /* And this may overflow. */ + double test = png_pow10(exp_b10+1); + + if (test <= DBL_MAX) + ++exp_b10, base = test; + + else + break; + } + + /* Normalize fp and correct exp_b10, after this fp is in the + * range [.1,1) and exp_b10 is both the exponent and the digit + * *before* which the decimal point should be inserted + * (starting with 0 for the first digit). Note that this + * works even if 10^exp_b10 is out of range because of the + * test on DBL_MAX above. + */ + fp /= base; + while (fp >= 1) fp /= 10, ++exp_b10; + + /* Because of the code above fp may, at this point, be + * less than .1, this is ok because the code below can + * handle the leading zeros this generates, so no attempt + * is made to correct that here. + */ + + { + int czero, clead, cdigits; + char exponent[10]; + + /* Allow up to two leading zeros - this will not lengthen + * the number compared to using E-n. + */ + if (exp_b10 < 0 && exp_b10 > -3) /* PLUS 3 TOTAL 4 */ + { + czero = -exp_b10; /* PLUS 2 digits: TOTAL 3 */ + exp_b10 = 0; /* Dot added below before first output. */ + } + else + czero = 0; /* No zeros to add */ + + /* Generate the digit list, stripping trailing zeros and + * inserting a '.' before a digit if the exponent is 0. + */ + clead = czero; /* Count of leading zeros */ + cdigits = 0; /* Count of digits in list. */ + + do + { + double d; + + fp *= 10; + /* Use modf here, not floor and subtract, so that + * the separation is done in one step. At the end + * of the loop don't break the number into parts so + * that the final digit is rounded. + */ + if (cdigits+czero-clead+1 < (int)precision) + fp = modf(fp, &d); + + else + { + d = floor(fp + .5); + + if (d > 9) + { + /* Rounding up to 10, handle that here. */ + if (czero > 0) + { + --czero, d = 1; + if (cdigits == 0) --clead; + } + else + { + while (cdigits > 0 && d > 9) + { + int ch = *--ascii; + + if (exp_b10 != (-1)) + ++exp_b10; + + else if (ch == 46) + { + ch = *--ascii, ++size; + /* Advance exp_b10 to '1', so that the + * decimal point happens after the + * previous digit. + */ + exp_b10 = 1; + } + + --cdigits; + d = ch - 47; /* I.e. 1+(ch-48) */ + } + + /* Did we reach the beginning? If so adjust the + * exponent but take into account the leading + * decimal point. + */ + if (d > 9) /* cdigits == 0 */ + { + if (exp_b10 == (-1)) + { + /* Leading decimal point (plus zeros?), if + * we lose the decimal point here it must + * be reentered below. + */ + int ch = *--ascii; + + if (ch == 46) + ++size, exp_b10 = 1; + + /* Else lost a leading zero, so 'exp_b10' is + * still ok at (-1) + */ + } + else + ++exp_b10; + + /* In all cases we output a '1' */ + d = 1; + } + } + } + fp = 0; /* Guarantees termination below. */ + } + + if (d == 0) + { + ++czero; + if (cdigits == 0) ++clead; + } + else + { + /* Included embedded zeros in the digit count. */ + cdigits += czero - clead; + clead = 0; + + while (czero > 0) + { + /* exp_b10 == (-1) means we just output the decimal + * place - after the DP don't adjust 'exp_b10' any + * more! + */ + if (exp_b10 != (-1)) + { + if (exp_b10 == 0) *ascii++ = 46, --size; + /* PLUS 1: TOTAL 4 */ + --exp_b10; + } + *ascii++ = 48, --czero; + } + + if (exp_b10 != (-1)) + { + if (exp_b10 == 0) *ascii++ = 46, --size; /* counted + above */ + --exp_b10; + } + *ascii++ = (char)(48 + (int)d), ++cdigits; + } + } + while (cdigits+czero-clead < (int)precision && fp > DBL_MIN); + + /* The total output count (max) is now 4+precision */ + + /* Check for an exponent, if we don't need one we are + * done and just need to terminate the string. At + * this point exp_b10==(-1) is effectively if flag - it got + * to '-1' because of the decrement after outputing + * the decimal point above (the exponent required is + * *not* -1!) + */ + if (exp_b10 >= (-1) && exp_b10 <= 2) + { + /* The following only happens if we didn't output the + * leading zeros above for negative exponent, so this + * doest add to the digit requirement. Note that the + * two zeros here can only be output if the two leading + * zeros were *not* output, so this doesn't increase + * the output count. + */ + while (--exp_b10 >= 0) *ascii++ = 48; + + *ascii = 0; + + /* Total buffer requirement (including the '\0') is + * 5+precision - see check at the start. + */ + return; + } + + /* Here if an exponent is required, adjust size for + * the digits we output but did not count. The total + * digit output here so far is at most 1+precision - no + * decimal point and no leading or trailing zeros have + * been output. + */ + size -= cdigits; + + *ascii++ = 69, --size; /* 'E': PLUS 1 TOTAL 2+precision*/ + if (exp_b10 < 0) + { + *ascii++ = 45, --size; /* '-': PLUS 1 TOTAL 3+precision */ + exp_b10 = -exp_b10; + } + + cdigits = 0; + + while (exp_b10 > 0) + { + exponent[cdigits++] = (char)(48 + exp_b10 % 10); + exp_b10 /= 10; + } + + /* Need another size check here for the exponent digits, so + * this need not be considered above. + */ + if ((int)size > cdigits) + { + while (cdigits > 0) *ascii++ = exponent[--cdigits]; + + *ascii = 0; + + return; + } + } + } + else if (!(fp >= DBL_MIN)) + { + *ascii++ = 48; /* '0' */ + *ascii = 0; + return; + } + else + { + *ascii++ = 105; /* 'i' */ + *ascii++ = 110; /* 'n' */ + *ascii++ = 102; /* 'f' */ + *ascii = 0; + return; + } + } + + /* Here on buffer too small. */ + png_error(png_ptr, "ASCII conversion buffer too small"); +} + +# endif /* FLOATING_POINT */ + +# ifdef PNG_FIXED_POINT_SUPPORTED +/* Function to format a fixed point value in ASCII. + */ +void /* PRIVATE */ +png_ascii_from_fixed(png_structp png_ptr, png_charp ascii, png_size_t size, + png_fixed_point fp) +{ + /* Require space for 10 decimal digits, a decimal point, a minus sign and a + * trailing \0, 13 characters: + */ + if (size > 12) + { + png_uint_32 num; + + /* Avoid overflow here on the minimum integer. */ + if (fp < 0) + *ascii++ = 45, --size, num = -fp; + else + num = fp; + + if (num <= 0x80000000U) /* else overflowed */ + { + unsigned int ndigits = 0, first = 16/*flag value*/; + char digits[10]; + + while (num) + { + /* Split the low digit off num: */ + unsigned int tmp = num/10; + num -= tmp*10; + digits[ndigits++] = (char)(48 + num); + /* Record the first non-zero digit, note that this is a number + * starting at 1, it's not actually the array index. + */ + if (first == 16 && num > 0) + first = ndigits; + num = tmp; + } + + if (ndigits > 0) + { + while (ndigits > 5) *ascii++ = digits[--ndigits]; + /* The remaining digits are fractional digits, ndigits is '5' or + * smaller at this point. It is certainly not zero. Check for a + * non-zero fractional digit: + */ + if (first <= 5) + { + unsigned int i; + *ascii++ = 46; /* decimal point */ + /* ndigits may be <5 for small numbers, output leading zeros + * then ndigits digits to first: + */ + i = 5; + while (ndigits < i) *ascii++ = 48, --i; + while (ndigits >= first) *ascii++ = digits[--ndigits]; + /* Don't output the trailing zeros! */ + } + } + else + *ascii++ = 48; + + /* And null terminate the string: */ + *ascii = 0; + return; + } + } + + /* Here on buffer too small. */ + png_error(png_ptr, "ASCII conversion buffer too small"); +} +# endif /* FIXED_POINT */ +#endif /* READ_SCAL */ + +#if defined(PNG_FLOATING_POINT_SUPPORTED) && \ + !defined(PNG_FIXED_POINT_MACRO_SUPPORTED) +png_fixed_point +png_fixed(png_structp png_ptr, double fp, png_const_charp text) +{ + double r = floor(100000 * fp + .5); + + if (r > 2147483647. || r < -2147483648.) + png_fixed_error(png_ptr, text); + + return (png_fixed_point)r; +} +#endif + +#if defined(PNG_READ_GAMMA_SUPPORTED) || \ + defined(PNG_INCH_CONVERSIONS_SUPPORTED) || defined(PNG__READ_pHYs_SUPPORTED) +/* muldiv functions */ +/* This API takes signed arguments and rounds the result to the nearest + * integer (or, for a fixed point number - the standard argument - to + * the nearest .00001). Overflow and divide by zero are signalled in + * the result, a boolean - true on success, false on overflow. + */ +int +png_muldiv(png_fixed_point_p res, png_fixed_point a, png_int_32 times, + png_int_32 divisor) +{ + /* Return a * times / divisor, rounded. */ + if (divisor != 0) + { + if (a == 0 || times == 0) + { + *res = 0; + return 1; + } + else + { +#ifdef PNG_FLOATING_ARITHMETIC_SUPPORTED + double r = a; + r *= times; + r /= divisor; + r = floor(r+.5); + + /* A png_fixed_point is a 32 bit integer. */ + if (r <= 2147483647. && r >= -2147483648.) + { + *res = (png_fixed_point)r; + return 1; + } +#else + int negative = 0; + png_uint_32 A, T, D; + png_uint_32 s16, s32, s00; + + if (a < 0) + negative = 1, A = -a; + else + A = a; + + if (times < 0) + negative = !negative, T = -times; + else + T = times; + + if (divisor < 0) + negative = !negative, D = -divisor; + else + D = divisor; + + /* Following can't overflow because the arguments only + * have 31 bits each, however the result may be 32 bits. + */ + s16 = (A >> 16) * (T & 0xffff) + + (A & 0xffff) * (T >> 16); + /* Can't overflow because the a*times bit is only 30 + * bits at most. + */ + s32 = (A >> 16) * (T >> 16) + (s16 >> 16); + s00 = (A & 0xffff) * (T & 0xffff); + + s16 = (s16 & 0xffff) << 16; + s00 += s16; + + if (s00 < s16) + ++s32; /* carry */ + + if (s32 < D) /* else overflow */ + { + /* s32.s00 is now the 64 bit product, do a standard + * division, we know that s32 < D, so the maximum + * required shift is 31. + */ + int bitshift = 32; + png_fixed_point result = 0; /* NOTE: signed */ + + while (--bitshift >= 0) + { + png_uint_32 d32, d00; + + if (bitshift > 0) + d32 = D >> (32-bitshift), d00 = D << bitshift; + + else + d32 = 0, d00 = D; + + if (s32 > d32) + { + if (s00 < d00) --s32; /* carry */ + s32 -= d32, s00 -= d00, result += 1<= d00) + s32 = 0, s00 -= d00, result += 1<= (D >> 1)) + ++result; + + if (negative) + result = -result; + + /* Check for overflow. */ + if ((negative && result <= 0) || (!negative && result >= 0)) + { + *res = result; + return 1; + } + } +#endif + } + } + + return 0; +} +#endif /* READ_GAMMA || INCH_CONVERSIONS */ + +#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_INCH_CONVERSIONS_SUPPORTED) +/* The following is for when the caller doesn't much care about the + * result. + */ +png_fixed_point +png_muldiv_warn(png_structp png_ptr, png_fixed_point a, png_int_32 times, + png_int_32 divisor) +{ + png_fixed_point result; + + if (png_muldiv(&result, a, times, divisor)) + return result; + + png_warning(png_ptr, "fixed point overflow ignored"); + return 0; +} +#endif + +#ifdef PNG_READ_GAMMA_SUPPORTED /* more fixed point functions for gammma */ +/* Calculate a reciprocal, return 0 on div-by-zero or overflow. */ +png_fixed_point +png_reciprocal(png_fixed_point a) +{ +#ifdef PNG_FLOATING_ARITHMETIC_SUPPORTED + double r = floor(1E10/a+.5); + + if (r <= 2147483647. && r >= -2147483648.) + return (png_fixed_point)r; +#else + png_fixed_point res; + + if (png_muldiv(&res, 100000, 100000, a)) + return res; +#endif + + return 0; /* error/overflow */ +} + +/* A local convenience routine. */ +static png_fixed_point +png_product2(png_fixed_point a, png_fixed_point b) +{ + /* The required result is 1/a * 1/b; the following preserves accuracy. */ +#ifdef PNG_FLOATING_ARITHMETIC_SUPPORTED + double r = a * 1E-5; + r *= b; + r = floor(r+.5); + + if (r <= 2147483647. && r >= -2147483648.) + return (png_fixed_point)r; +#else + png_fixed_point res; + + if (png_muldiv(&res, a, b, 100000)) + return res; +#endif + + return 0; /* overflow */ +} + +/* The inverse of the above. */ +png_fixed_point +png_reciprocal2(png_fixed_point a, png_fixed_point b) +{ + /* The required result is 1/a * 1/b; the following preserves accuracy. */ +#ifdef PNG_FLOATING_ARITHMETIC_SUPPORTED + double r = 1E15/a; + r /= b; + r = floor(r+.5); + + if (r <= 2147483647. && r >= -2147483648.) + return (png_fixed_point)r; +#else + /* This may overflow because the range of png_fixed_point isn't symmetric, + * but this API is only used for the product of file and screen gamma so it + * doesn't matter that the smallest number it can produce is 1/21474, not + * 1/100000 + */ + png_fixed_point res = png_product2(a, b); + + if (res != 0) + return png_reciprocal(res); +#endif + + return 0; /* overflow */ +} +#endif /* READ_GAMMA */ + +#ifdef PNG_CHECK_cHRM_SUPPORTED +/* Added at libpng version 1.2.34 (Dec 8, 2008) and 1.4.0 (Jan 2, + * 2010: moved from pngset.c) */ +/* + * Multiply two 32-bit numbers, V1 and V2, using 32-bit + * arithmetic, to produce a 64 bit result in the HI/LO words. + * + * A B + * x C D + * ------ + * AD || BD + * AC || CB || 0 + * + * where A and B are the high and low 16-bit words of V1, + * C and D are the 16-bit words of V2, AD is the product of + * A and D, and X || Y is (X << 16) + Y. +*/ + +void /* PRIVATE */ +png_64bit_product (long v1, long v2, unsigned long *hi_product, + unsigned long *lo_product) +{ + int a, b, c, d; + long lo, hi, x, y; + + a = (v1 >> 16) & 0xffff; + b = v1 & 0xffff; + c = (v2 >> 16) & 0xffff; + d = v2 & 0xffff; + + lo = b * d; /* BD */ + x = a * d + c * b; /* AD + CB */ + y = ((lo >> 16) & 0xffff) + x; + + lo = (lo & 0xffff) | ((y & 0xffff) << 16); + hi = (y >> 16) & 0xffff; + + hi += a * c; /* AC */ + + *hi_product = (unsigned long)hi; + *lo_product = (unsigned long)lo; +} +#endif /* CHECK_cHRM */ + +#ifdef PNG_READ_GAMMA_SUPPORTED /* gamma table code */ +#ifndef PNG_FLOATING_ARITHMETIC_SUPPORTED +/* Fixed point gamma. + * + * To calculate gamma this code implements fast log() and exp() calls using only + * fixed point arithmetic. This code has sufficient precision for either 8 or + * 16 bit sample values. + * + * The tables used here were calculated using simple 'bc' programs, but C double + * precision floating point arithmetic would work fine. The programs are given + * at the head of each table. + * + * 8 bit log table + * This is a table of -log(value/255)/log(2) for 'value' in the range 128 to + * 255, so it's the base 2 logarithm of a normalized 8 bit floating point + * mantissa. The numbers are 32 bit fractions. + */ +static png_uint_32 +png_8bit_l2[128] = +{ +# if PNG_DO_BC + for (i=128;i<256;++i) { .5 - l(i/255)/l(2)*65536*65536; } +# endif + 4270715492U, 4222494797U, 4174646467U, 4127164793U, 4080044201U, 4033279239U, + 3986864580U, 3940795015U, 3895065449U, 3849670902U, 3804606499U, 3759867474U, + 3715449162U, 3671346997U, 3627556511U, 3584073329U, 3540893168U, 3498011834U, + 3455425220U, 3413129301U, 3371120137U, 3329393864U, 3287946700U, 3246774933U, + 3205874930U, 3165243125U, 3124876025U, 3084770202U, 3044922296U, 3005329011U, + 2965987113U, 2926893432U, 2888044853U, 2849438323U, 2811070844U, 2772939474U, + 2735041326U, 2697373562U, 2659933400U, 2622718104U, 2585724991U, 2548951424U, + 2512394810U, 2476052606U, 2439922311U, 2404001468U, 2368287663U, 2332778523U, + 2297471715U, 2262364947U, 2227455964U, 2192742551U, 2158222529U, 2123893754U, + 2089754119U, 2055801552U, 2022034013U, 1988449497U, 1955046031U, 1921821672U, + 1888774511U, 1855902668U, 1823204291U, 1790677560U, 1758320682U, 1726131893U, + 1694109454U, 1662251657U, 1630556815U, 1599023271U, 1567649391U, 1536433567U, + 1505374214U, 1474469770U, 1443718700U, 1413119487U, 1382670639U, 1352370686U, + 1322218179U, 1292211689U, 1262349810U, 1232631153U, 1203054352U, 1173618059U, + 1144320946U, 1115161701U, 1086139034U, 1057251672U, 1028498358U, 999877854U, + 971388940U, 943030410U, 914801076U, 886699767U, 858725327U, 830876614U, + 803152505U, 775551890U, 748073672U, 720716771U, 693480120U, 666362667U, + 639363374U, 612481215U, 585715177U, 559064263U, 532527486U, 506103872U, + 479792461U, 453592303U, 427502463U, 401522014U, 375650043U, 349885648U, + 324227938U, 298676034U, 273229066U, 247886176U, 222646516U, 197509248U, + 172473545U, 147538590U, 122703574U, 97967701U, 73330182U, 48790236U, + 24347096U, 0U +#if 0 + /* The following are the values for 16 bit tables - these work fine for the 8 + * bit conversions but produce very slightly larger errors in the 16 bit log + * (about 1.2 as opposed to 0.7 absolute error in the final value). To use + * these all the shifts below must be adjusted appropriately. + */ + 65166, 64430, 63700, 62976, 62257, 61543, 60835, 60132, 59434, 58741, 58054, + 57371, 56693, 56020, 55352, 54689, 54030, 53375, 52726, 52080, 51439, 50803, + 50170, 49542, 48918, 48298, 47682, 47070, 46462, 45858, 45257, 44661, 44068, + 43479, 42894, 42312, 41733, 41159, 40587, 40020, 39455, 38894, 38336, 37782, + 37230, 36682, 36137, 35595, 35057, 34521, 33988, 33459, 32932, 32408, 31887, + 31369, 30854, 30341, 29832, 29325, 28820, 28319, 27820, 27324, 26830, 26339, + 25850, 25364, 24880, 24399, 23920, 23444, 22970, 22499, 22029, 21562, 21098, + 20636, 20175, 19718, 19262, 18808, 18357, 17908, 17461, 17016, 16573, 16132, + 15694, 15257, 14822, 14390, 13959, 13530, 13103, 12678, 12255, 11834, 11415, + 10997, 10582, 10168, 9756, 9346, 8937, 8531, 8126, 7723, 7321, 6921, 6523, + 6127, 5732, 5339, 4947, 4557, 4169, 3782, 3397, 3014, 2632, 2251, 1872, 1495, + 1119, 744, 372 +#endif +}; + +static png_int_32 +png_log8bit(unsigned int x) +{ + unsigned int lg2 = 0; + /* Each time 'x' is multiplied by 2, 1 must be subtracted off the final log, + * because the log is actually negate that means adding 1. The final + * returned value thus has the range 0 (for 255 input) to 7.994 (for 1 + * input), return 7.99998 for the overflow (log 0) case - so the result is + * always at most 19 bits. + */ + if ((x &= 0xff) == 0) + return 0xffffffff; + + if ((x & 0xf0) == 0) + lg2 = 4, x <<= 4; + + if ((x & 0xc0) == 0) + lg2 += 2, x <<= 2; + + if ((x & 0x80) == 0) + lg2 += 1, x <<= 1; + + /* result is at most 19 bits, so this cast is safe: */ + return (png_int_32)((lg2 << 16) + ((png_8bit_l2[x-128]+32768)>>16)); +} + +/* The above gives exact (to 16 binary places) log2 values for 8 bit images, + * for 16 bit images we use the most significant 8 bits of the 16 bit value to + * get an approximation then multiply the approximation by a correction factor + * determined by the remaining up to 8 bits. This requires an additional step + * in the 16 bit case. + * + * We want log2(value/65535), we have log2(v'/255), where: + * + * value = v' * 256 + v'' + * = v' * f + * + * So f is value/v', which is equal to (256+v''/v') since v' is in the range 128 + * to 255 and v'' is in the range 0 to 255 f will be in the range 256 to less + * than 258. The final factor also needs to correct for the fact that our 8 bit + * value is scaled by 255, whereas the 16 bit values must be scaled by 65535. + * + * This gives a final formula using a calculated value 'x' which is value/v' and + * scaling by 65536 to match the above table: + * + * log2(x/257) * 65536 + * + * Since these numbers are so close to '1' we can use simple linear + * interpolation between the two end values 256/257 (result -368.61) and 258/257 + * (result 367.179). The values used below are scaled by a further 64 to give + * 16 bit precision in the interpolation: + * + * Start (256): -23591 + * Zero (257): 0 + * End (258): 23499 + */ +static png_int_32 +png_log16bit(png_uint_32 x) +{ + unsigned int lg2 = 0; + + /* As above, but now the input has 16 bits. */ + if ((x &= 0xffff) == 0) + return 0xffffffff; + + if ((x & 0xff00) == 0) + lg2 = 8, x <<= 8; + + if ((x & 0xf000) == 0) + lg2 += 4, x <<= 4; + + if ((x & 0xc000) == 0) + lg2 += 2, x <<= 2; + + if ((x & 0x8000) == 0) + lg2 += 1, x <<= 1; + + /* Calculate the base logarithm from the top 8 bits as a 28 bit fractional + * value. + */ + lg2 <<= 28; + lg2 += (png_8bit_l2[(x>>8)-128]+8) >> 4; + + /* Now we need to interpolate the factor, this requires a division by the top + * 8 bits. Do this with maximum precision. + */ + x = ((x << 16) + (x >> 9)) / (x >> 8); + + /* Since we divided by the top 8 bits of 'x' there will be a '1' at 1<<24, + * the value at 1<<16 (ignoring this) will be 0 or 1; this gives us exactly + * 16 bits to interpolate to get the low bits of the result. Round the + * answer. Note that the end point values are scaled by 64 to retain overall + * precision and that 'lg2' is current scaled by an extra 12 bits, so adjust + * the overall scaling by 6-12. Round at every step. + */ + x -= 1U << 24; + + if (x <= 65536U) /* <= '257' */ + lg2 += ((23591U * (65536U-x)) + (1U << (16+6-12-1))) >> (16+6-12); + + else + lg2 -= ((23499U * (x-65536U)) + (1U << (16+6-12-1))) >> (16+6-12); + + /* Safe, because the result can't have more than 20 bits: */ + return (png_int_32)((lg2 + 2048) >> 12); +} + +/* The 'exp()' case must invert the above, taking a 20 bit fixed point + * logarithmic value and returning a 16 or 8 bit number as appropriate. In + * each case only the low 16 bits are relevant - the fraction - since the + * integer bits (the top 4) simply determine a shift. + * + * The worst case is the 16 bit distinction between 65535 and 65534, this + * requires perhaps spurious accuracty in the decoding of the logarithm to + * distinguish log2(65535/65534.5) - 10^-5 or 17 bits. There is little chance + * of getting this accuracy in practice. + * + * To deal with this the following exp() function works out the exponent of the + * frational part of the logarithm by using an accurate 32 bit value from the + * top four fractional bits then multiplying in the remaining bits. + */ +static png_uint_32 +png_32bit_exp[16] = +{ +# if PNG_DO_BC + for (i=0;i<16;++i) { .5 + e(-i/16*l(2))*2^32; } +# endif + /* NOTE: the first entry is deliberately set to the maximum 32 bit value. */ + 4294967295U, 4112874773U, 3938502376U, 3771522796U, 3611622603U, 3458501653U, + 3311872529U, 3171459999U, 3037000500U, 2908241642U, 2784941738U, 2666869345U, + 2553802834U, 2445529972U, 2341847524U, 2242560872U +}; + +/* Adjustment table; provided to explain the numbers in the code below. */ +#if PNG_DO_BC +for (i=11;i>=0;--i){ print i, " ", (1 - e(-(2^i)/65536*l(2))) * 2^(32-i), "\n"} + 11 44937.64284865548751208448 + 10 45180.98734845585101160448 + 9 45303.31936980687359311872 + 8 45364.65110595323018870784 + 7 45395.35850361789624614912 + 6 45410.72259715102037508096 + 5 45418.40724413220722311168 + 4 45422.25021786898173001728 + 3 45424.17186732298419044352 + 2 45425.13273269940811464704 + 1 45425.61317555035558641664 + 0 45425.85339951654943850496 +#endif + +static png_uint_32 +png_exp(png_fixed_point x) +{ + if (x > 0 && x <= 0xfffff) /* Else overflow or zero (underflow) */ + { + /* Obtain a 4 bit approximation */ + png_uint_32 e = png_32bit_exp[(x >> 12) & 0xf]; + + /* Incorporate the low 12 bits - these decrease the returned value by + * multiplying by a number less than 1 if the bit is set. The multiplier + * is determined by the above table and the shift. Notice that the values + * converge on 45426 and this is used to allow linear interpolation of the + * low bits. + */ + if (x & 0x800) + e -= (((e >> 16) * 44938U) + 16U) >> 5; + + if (x & 0x400) + e -= (((e >> 16) * 45181U) + 32U) >> 6; + + if (x & 0x200) + e -= (((e >> 16) * 45303U) + 64U) >> 7; + + if (x & 0x100) + e -= (((e >> 16) * 45365U) + 128U) >> 8; + + if (x & 0x080) + e -= (((e >> 16) * 45395U) + 256U) >> 9; + + if (x & 0x040) + e -= (((e >> 16) * 45410U) + 512U) >> 10; + + /* And handle the low 6 bits in a single block. */ + e -= (((e >> 16) * 355U * (x & 0x3fU)) + 256U) >> 9; + + /* Handle the upper bits of x. */ + e >>= x >> 16; + return e; + } + + /* Check for overflow */ + if (x <= 0) + return png_32bit_exp[0]; + + /* Else underflow */ + return 0; +} + +static png_byte +png_exp8bit(png_fixed_point lg2) +{ + /* Get a 32 bit value: */ + png_uint_32 x = png_exp(lg2); + + /* Convert the 32 bit value to 0..255 by multiplying by 256-1, note that the + * second, rounding, step can't overflow because of the first, subtraction, + * step. + */ + x -= x >> 8; + return (png_byte)((x + 0x7fffffU) >> 24); +} + +static png_uint_16 +png_exp16bit(png_fixed_point lg2) +{ + /* Get a 32 bit value: */ + png_uint_32 x = png_exp(lg2); + + /* Convert the 32 bit value to 0..65535 by multiplying by 65536-1: */ + x -= x >> 16; + return (png_uint_16)((x + 32767U) >> 16); +} +#endif /* FLOATING_ARITHMETIC */ + +png_byte +png_gamma_8bit_correct(unsigned int value, png_fixed_point gamma_val) +{ + if (value > 0 && value < 255) + { +# ifdef PNG_FLOATING_ARITHMETIC_SUPPORTED + double r = floor(255*pow(value/255.,gamma_val*.00001)+.5); + return (png_byte)r; +# else + png_int_32 lg2 = png_log8bit(value); + png_fixed_point res; + + if (png_muldiv(&res, gamma_val, lg2, PNG_FP_1)) + return png_exp8bit(res); + + /* Overflow. */ + value = 0; +# endif + } + + return (png_byte)value; +} + +png_uint_16 +png_gamma_16bit_correct(unsigned int value, png_fixed_point gamma_val) +{ + if (value > 0 && value < 65535) + { +# ifdef PNG_FLOATING_ARITHMETIC_SUPPORTED + double r = floor(65535*pow(value/65535.,gamma_val*.00001)+.5); + return (png_uint_16)r; +# else + png_int_32 lg2 = png_log16bit(value); + png_fixed_point res; + + if (png_muldiv(&res, gamma_val, lg2, PNG_FP_1)) + return png_exp16bit(res); + + /* Overflow. */ + value = 0; +# endif + } + + return (png_uint_16)value; +} + +/* This does the right thing based on the bit_depth field of the + * png_struct, interpreting values as 8 or 16 bit. While the result + * is nominally a 16 bit value if bit depth is 8 then the result is + * 8 bit (as are the arguments.) + */ +png_uint_16 /* PRIVATE */ +png_gamma_correct(png_structp png_ptr, unsigned int value, + png_fixed_point gamma_val) +{ + if (png_ptr->bit_depth == 8) + return png_gamma_8bit_correct(value, gamma_val); + + else + return png_gamma_16bit_correct(value, gamma_val); +} + +/* This is the shared test on whether a gamma value is 'significant' - whether + * it is worth doing gamma correction. + */ +int /* PRIVATE */ +png_gamma_significant(png_fixed_point gamma_val) +{ + return gamma_val < PNG_FP_1 - PNG_GAMMA_THRESHOLD_FIXED || + gamma_val > PNG_FP_1 + PNG_GAMMA_THRESHOLD_FIXED; +} + +/* Internal function to build a single 16 bit table - the table consists of + * 'num' 256 entry subtables, where 'num' is determined by 'shift' - the amount + * to shift the input values right (or 16-number_of_signifiant_bits). + * + * The caller is responsible for ensuring that the table gets cleaned up on + * png_error (i.e. if one of the mallocs below fails) - i.e. the *table argument + * should be somewhere that will be cleaned. + */ +static void +png_build_16bit_table(png_structp png_ptr, png_uint_16pp *ptable, + PNG_CONST unsigned int shift, PNG_CONST png_fixed_point gamma_val) +{ + /* Various values derived from 'shift': */ + PNG_CONST unsigned int num = 1U << (8U - shift); + PNG_CONST unsigned int max = (1U << (16U - shift))-1U; + PNG_CONST unsigned int max_by_2 = 1U << (15U-shift); + unsigned int i; + + png_uint_16pp table = *ptable = + (png_uint_16pp)png_calloc(png_ptr, num * png_sizeof(png_uint_16p)); + + for (i = 0; i < num; i++) + { + png_uint_16p sub_table = table[i] = + (png_uint_16p)png_malloc(png_ptr, 256 * png_sizeof(png_uint_16)); + + /* The 'threshold' test is repeated here because it can arise for one of + * the 16 bit tables even if the others don't hit it. + */ + if (png_gamma_significant(gamma_val)) + { + /* The old code would overflow at the end and this would cause the + * 'pow' function to return a result >1, resulting in an + * arithmetic error. This code follows the spec exactly; ig is + * the recovered input sample, it always has 8-16 bits. + * + * We want input * 65535/max, rounded, the arithmetic fits in 32 + * bits (unsigned) so long as max <= 32767. + */ + unsigned int j; + for (j = 0; j < 256; j++) + { + png_uint_32 ig = (j << (8-shift)) + i; +# ifdef PNG_FLOATING_ARITHMETIC_SUPPORTED + /* Inline the 'max' scaling operation: */ + double d = floor(65535*pow(ig/(double)max, gamma_val*.00001)+.5); + sub_table[j] = (png_uint_16)d; +# else + if (shift) + ig = (ig * 65535U + max_by_2)/max; + + sub_table[j] = png_gamma_16bit_correct(ig, gamma_val); +# endif + } + } + else + { + /* We must still build a table, but do it the fast way. */ + unsigned int j; + + for (j = 0; j < 256; j++) + { + png_uint_32 ig = (j << (8-shift)) + i; + + if (shift) + ig = (ig * 65535U + max_by_2)/max; + + sub_table[j] = (png_uint_16)ig; + } + } + } +} + +/* NOTE: this function expects the *inverse* of the overall gamma transformation + * required. + */ +static void +png_build_16to8_table(png_structp png_ptr, png_uint_16pp *ptable, + PNG_CONST unsigned int shift, PNG_CONST png_fixed_point gamma_val) +{ + PNG_CONST unsigned int num = 1U << (8U - shift); + PNG_CONST unsigned int max = (1U << (16U - shift))-1U; + unsigned int i; + png_uint_32 last; + + png_uint_16pp table = *ptable = + (png_uint_16pp)png_calloc(png_ptr, num * png_sizeof(png_uint_16p)); + + /* 'num' is the number of tables and also the number of low bits of low + * bits of the input 16 bit value used to select a table. Each table is + * itself index by the high 8 bits of the value. + */ + for (i = 0; i < num; i++) + table[i] = (png_uint_16p)png_malloc(png_ptr, + 256 * png_sizeof(png_uint_16)); + + /* 'gamma_val' is set to the reciprocal of the value calculated above, so + * pow(out,g) is an *input* value. 'last' is the last input value set. + * + * In the loop 'i' is used to find output values. Since the output is 8 + * bit there are only 256 possible values. The tables are set up to + * select the closest possible output value for each input by finding + * the input value at the boundary between each pair of output values + * and filling the table up to that boundary with the lower output + * value. + * + * The boundary values are 0.5,1.5..253.5,254.5. Since these are 9 bit + * values the code below uses a 16 bit value in i; the values start at + * 128.5 (for 0.5) and step by 257, for a total of 254 values (the last + * entries are filled with 255). Start i at 128 and fill all 'last' + * table entries <= 'max' + */ + last = 0; + for (i = 0; i < 255; ++i) /* 8 bit output value */ + { + /* Find the corresponding maximum input value */ + png_uint_16 out = (png_uint_16)(i * 257U); /* 16 bit output value */ + + /* Find the boundary value in 16 bits: */ + png_uint_32 bound = png_gamma_16bit_correct(out+128U, gamma_val); + + /* Adjust (round) to (16-shift) bits: */ + bound = (bound * max + 32768U)/65535U + 1U; + + while (last < bound) + { + table[last & (0xffU >> shift)][last >> (8U - shift)] = out; + last++; + } + } + + /* And fill in the final entries. */ + while (last < (num << 8)) + { + table[last & (0xff >> shift)][last >> (8U - shift)] = 65535U; + last++; + } +} + +/* Build a single 8 bit table: same as the 16 bit case but much simpler (and + * typically much faster). Note that libpng currently does no sBIT processing + * (apparently contrary to the spec) so a 256 entry table is always generated. + */ +static void +png_build_8bit_table(png_structp png_ptr, png_bytepp ptable, + PNG_CONST png_fixed_point gamma_val) +{ + unsigned int i; + png_bytep table = *ptable = (png_bytep)png_malloc(png_ptr, 256); + + if (png_gamma_significant(gamma_val)) for (i=0; i<256; i++) + table[i] = png_gamma_8bit_correct(i, gamma_val); + + else for (i=0; i<256; ++i) + table[i] = (png_byte)i; +} + +/* We build the 8- or 16-bit gamma tables here. Note that for 16-bit + * tables, we don't make a full table if we are reducing to 8-bit in + * the future. Note also how the gamma_16 tables are segmented so that + * we don't need to allocate > 64K chunks for a full 16-bit table. + */ +void /* PRIVATE */ +png_build_gamma_table(png_structp png_ptr, int bit_depth) +{ + png_debug(1, "in png_build_gamma_table"); + + if (bit_depth <= 8) + { + png_build_8bit_table(png_ptr, &png_ptr->gamma_table, + png_ptr->screen_gamma > 0 ? png_reciprocal2(png_ptr->gamma, + png_ptr->screen_gamma) : PNG_FP_1); + +#if defined(PNG_READ_BACKGROUND_SUPPORTED) || \ + defined(PNG_READ_RGB_TO_GRAY_SUPPORTED) + if (png_ptr->transformations & ((PNG_BACKGROUND) | PNG_RGB_TO_GRAY)) + { + png_build_8bit_table(png_ptr, &png_ptr->gamma_to_1, + png_reciprocal(png_ptr->gamma)); + + png_build_8bit_table(png_ptr, &png_ptr->gamma_from_1, + png_ptr->screen_gamma > 0 ? png_reciprocal(png_ptr->screen_gamma) : + png_ptr->gamma/* Probably doing rgb_to_gray */); + } +#endif /* PNG_READ_BACKGROUND_SUPPORTED || PNG_RGB_TO_GRAY_SUPPORTED */ + } + else + { + png_byte shift, sig_bit; + + if (png_ptr->color_type & PNG_COLOR_MASK_COLOR) + { + sig_bit = png_ptr->sig_bit.red; + + if (png_ptr->sig_bit.green > sig_bit) + sig_bit = png_ptr->sig_bit.green; + + if (png_ptr->sig_bit.blue > sig_bit) + sig_bit = png_ptr->sig_bit.blue; + } + else + sig_bit = png_ptr->sig_bit.gray; + + /* 16 bit gamma code uses this equation: + * + * ov = table[(iv & 0xff) >> gamma_shift][iv >> 8] + * + * Where 'iv' is the input color value and 'ov' is the output value - + * pow(iv, gamma). + * + * Thus the gamma table consists of up to 256 256 entry tables. The table + * is selected by the (8-gamma_shift) most significant of the low 8 bits of + * the color value then indexed by the upper 8 bits: + * + * table[low bits][high 8 bits] + * + * So the table 'n' corresponds to all those 'iv' of: + * + * ..<(n+1 << gamma_shift)-1> + * + */ + if (sig_bit > 0 && sig_bit < 16U) + shift = (png_byte)(16U - sig_bit); /* shift == insignificant bits */ + + else + shift = 0; /* keep all 16 bits */ + + if (png_ptr->transformations & PNG_16_TO_8) + { + /* PNG_MAX_GAMMA_8 is the number of bits to keep - effectively + * the significant bits in the *input* when the output will + * eventually be 8 bits. By default it is 11. + */ + if (shift < (16U - PNG_MAX_GAMMA_8)) + shift = (16U - PNG_MAX_GAMMA_8); + } + + if (shift > 8U) + shift = 8U; /* Guarantees at least one table! */ + + png_ptr->gamma_shift = shift; + +#ifdef PNG_16BIT_SUPPORTED + if (png_ptr->transformations & (PNG_16_TO_8 | PNG_BACKGROUND)) +#endif + png_build_16to8_table(png_ptr, &png_ptr->gamma_16_table, shift, + png_ptr->screen_gamma > 0 ? png_product2(png_ptr->gamma, + png_ptr->screen_gamma) : PNG_FP_1); + +#ifdef PNG_16BIT_SUPPORTED + else + png_build_16bit_table(png_ptr, &png_ptr->gamma_16_table, shift, + png_ptr->screen_gamma > 0 ? png_reciprocal2(png_ptr->gamma, + png_ptr->screen_gamma) : PNG_FP_1); +#endif + +#if defined(PNG_READ_BACKGROUND_SUPPORTED) || \ + defined(PNG_READ_RGB_TO_GRAY_SUPPORTED) + if (png_ptr->transformations & (PNG_BACKGROUND | PNG_RGB_TO_GRAY)) + { + png_build_16bit_table(png_ptr, &png_ptr->gamma_16_to_1, shift, + png_reciprocal(png_ptr->gamma)); + + /* Notice that the '16 from 1' table should be full precision, however + * the lookup on this table still uses gamma_shift, so it can't be. + * TODO: fix this. + */ + png_build_16bit_table(png_ptr, &png_ptr->gamma_16_from_1, shift, + png_ptr->screen_gamma > 0 ? png_reciprocal(png_ptr->screen_gamma) : + png_ptr->gamma/* Probably doing rgb_to_gray */); + } +#endif /* PNG_READ_BACKGROUND_SUPPORTED || PNG_RGB_TO_GRAY_SUPPORTED */ + } +} +#endif /* READ_GAMMA */ #endif /* defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) */ diff --git a/reactos/dll/3rdparty/libpng/pngerror.c b/reactos/dll/3rdparty/libpng/pngerror.c index 633eae29f9e..8290bb4106e 100644 --- a/reactos/dll/3rdparty/libpng/pngerror.c +++ b/reactos/dll/3rdparty/libpng/pngerror.c @@ -1,8 +1,8 @@ /* pngerror.c - stub functions for i/o and memory allocation * - * Last changed in libpng 1.4.0 [January 3, 2010] - * Copyright (c) 1998-2010 Glenn Randers-Pehrson + * Last changed in libpng 1.5.1 [February 3, 2011] + * Copyright (c) 1998-2011 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * @@ -16,18 +16,17 @@ * at each function. */ -#define PNG_NO_PEDANTIC_WARNINGS -#include "png.h" -#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) #include "pngpriv.h" -static void /* PRIVATE */ -png_default_error PNGARG((png_structp png_ptr, - png_const_charp error_message)) PNG_NORETURN; +#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) + +static PNG_FUNCTION(void, png_default_error,PNGARG((png_structp png_ptr, + png_const_charp error_message)),PNG_NORETURN); + #ifdef PNG_WARNINGS_SUPPORTED static void /* PRIVATE */ png_default_warning PNGARG((png_structp png_ptr, - png_const_charp warning_message)); + png_const_charp warning_message)); #endif /* PNG_WARNINGS_SUPPORTED */ /* This function is called whenever there is a fatal error. This function @@ -36,42 +35,45 @@ png_default_warning PNGARG((png_structp png_ptr, * to replace the error function at run-time. */ #ifdef PNG_ERROR_TEXT_SUPPORTED -void PNGAPI -png_error(png_structp png_ptr, png_const_charp error_message) +PNG_FUNCTION(void,PNGAPI +png_error,(png_structp png_ptr, png_const_charp error_message),PNG_NORETURN) { #ifdef PNG_ERROR_NUMBERS_SUPPORTED char msg[16]; if (png_ptr != NULL) { - if (png_ptr->flags& - (PNG_FLAG_STRIP_ERROR_NUMBERS|PNG_FLAG_STRIP_ERROR_TEXT)) - { - if (*error_message == PNG_LITERAL_SHARP) - { - /* Strip "#nnnn " from beginning of error message. */ - int offset; - for (offset = 1; offset<15; offset++) - if (error_message[offset] == ' ') + if (png_ptr->flags& + (PNG_FLAG_STRIP_ERROR_NUMBERS|PNG_FLAG_STRIP_ERROR_TEXT)) + { + if (*error_message == PNG_LITERAL_SHARP) + { + /* Strip "#nnnn " from beginning of error message. */ + int offset; + for (offset = 1; offset<15; offset++) + if (error_message[offset] == ' ') break; - if (png_ptr->flags&PNG_FLAG_STRIP_ERROR_TEXT) - { - int i; - for (i = 0; i < offset - 1; i++) - msg[i] = error_message[i + 1]; - msg[i - 1] = '\0'; - error_message = msg; - } - else - error_message += offset; - } - else - { - if (png_ptr->flags&PNG_FLAG_STRIP_ERROR_TEXT) - { - msg[0] = '0'; - msg[1] = '\0'; - error_message = msg; - } + + if (png_ptr->flags&PNG_FLAG_STRIP_ERROR_TEXT) + { + int i; + for (i = 0; i < offset - 1; i++) + msg[i] = error_message[i + 1]; + msg[i - 1] = '\0'; + error_message = msg; + } + + else + error_message += offset; + } + + else + { + if (png_ptr->flags&PNG_FLAG_STRIP_ERROR_TEXT) + { + msg[0] = '0'; + msg[1] = '\0'; + error_message = msg; + } } } } @@ -84,8 +86,8 @@ png_error(png_structp png_ptr, png_const_charp error_message) png_default_error(png_ptr, error_message); } #else -void PNGAPI -png_err(png_structp png_ptr) +PNG_FUNCTION(void,PNGAPI +png_err,(png_structp png_ptr),PNG_NORETURN) { if (png_ptr != NULL && png_ptr->error_fn != NULL) (*(png_ptr->error_fn))(png_ptr, '\0'); @@ -110,16 +112,16 @@ png_warning(png_structp png_ptr, png_const_charp warning_message) { #ifdef PNG_ERROR_NUMBERS_SUPPORTED if (png_ptr->flags& - (PNG_FLAG_STRIP_ERROR_NUMBERS|PNG_FLAG_STRIP_ERROR_TEXT)) + (PNG_FLAG_STRIP_ERROR_NUMBERS|PNG_FLAG_STRIP_ERROR_TEXT)) #endif - { - if (*warning_message == PNG_LITERAL_SHARP) - { - for (offset = 1; offset < 15; offset++) - if (warning_message[offset] == ' ') + { + if (*warning_message == PNG_LITERAL_SHARP) + { + for (offset = 1; offset < 15; offset++) + if (warning_message[offset] == ' ') break; - } - } + } + } } if (png_ptr != NULL && png_ptr->warning_fn != NULL) (*(png_ptr->warning_fn))(png_ptr, warning_message + offset); @@ -133,9 +135,9 @@ void PNGAPI png_benign_error(png_structp png_ptr, png_const_charp error_message) { if (png_ptr->flags & PNG_FLAG_BENIGN_ERRORS_WARN) - png_warning(png_ptr, error_message); + png_warning(png_ptr, error_message); else - png_error(png_ptr, error_message); + png_error(png_ptr, error_message); } #endif @@ -155,7 +157,7 @@ static PNG_CONST char png_digit[16] = { #if defined(PNG_WARNINGS_SUPPORTED) || defined(PNG_ERROR_TEXT_SUPPORTED) static void /* PRIVATE */ png_format_buffer(png_structp png_ptr, png_charp buffer, png_const_charp - error_message) + error_message) { int iout = 0, iin = 0; @@ -169,6 +171,7 @@ png_format_buffer(png_structp png_ptr, png_charp buffer, png_const_charp buffer[iout++] = png_digit[c & 0x0f]; buffer[iout++] = PNG_LITERAL_RIGHT_SQUARE_BRACKET; } + else { buffer[iout++] = (png_byte)c; @@ -177,6 +180,7 @@ png_format_buffer(png_structp png_ptr, png_charp buffer, png_const_charp if (error_message == NULL) buffer[iout] = '\0'; + else { buffer[iout++] = ':'; @@ -185,22 +189,24 @@ png_format_buffer(png_structp png_ptr, png_charp buffer, png_const_charp buffer[iout + PNG_MAX_ERROR_TEXT - 1] = '\0'; } } +#endif /* PNG_WARNINGS_SUPPORTED || PNG_ERROR_TEXT_SUPPORTED */ -#ifdef PNG_READ_SUPPORTED -void PNGAPI -png_chunk_error(png_structp png_ptr, png_const_charp error_message) +#if defined(PNG_READ_SUPPORTED) && defined(PNG_ERROR_TEXT_SUPPORTED) +PNG_FUNCTION(void,PNGAPI +png_chunk_error,(png_structp png_ptr, png_const_charp error_message), + PNG_NORETURN) { char msg[18+PNG_MAX_ERROR_TEXT]; if (png_ptr == NULL) - png_error(png_ptr, error_message); + png_error(png_ptr, error_message); + else { - png_format_buffer(png_ptr, msg, error_message); - png_error(png_ptr, msg); + png_format_buffer(png_ptr, msg, error_message); + png_error(png_ptr, msg); } } -#endif /* PNG_READ_SUPPORTED */ -#endif /* PNG_WARNINGS_SUPPORTED || PNG_ERROR_TEXT_SUPPORTED */ +#endif /* PNG_READ_SUPPORTED && PNG_ERROR_TEXT_SUPPORTED */ #ifdef PNG_WARNINGS_SUPPORTED void PNGAPI @@ -208,11 +214,12 @@ png_chunk_warning(png_structp png_ptr, png_const_charp warning_message) { char msg[18+PNG_MAX_ERROR_TEXT]; if (png_ptr == NULL) - png_warning(png_ptr, warning_message); + png_warning(png_ptr, warning_message); + else { - png_format_buffer(png_ptr, msg, warning_message); - png_warning(png_ptr, msg); + png_format_buffer(png_ptr, msg, warning_message); + png_warning(png_ptr, msg); } } #endif /* PNG_WARNINGS_SUPPORTED */ @@ -222,14 +229,37 @@ png_chunk_warning(png_structp png_ptr, png_const_charp warning_message) void PNGAPI png_chunk_benign_error(png_structp png_ptr, png_const_charp error_message) { - if (png_ptr->flags & PNG_FLAG_BENIGN_ERRORS_WARN) - png_chunk_warning(png_ptr, error_message); - else - png_chunk_error(png_ptr, error_message); + if (png_ptr->flags & PNG_FLAG_BENIGN_ERRORS_WARN) + png_chunk_warning(png_ptr, error_message); + + else + png_chunk_error(png_ptr, error_message); } #endif #endif /* PNG_READ_SUPPORTED */ +#ifdef PNG_ERROR_TEXT_SUPPORTED +#ifdef PNG_FLOATING_POINT_SUPPORTED +PNG_FUNCTION(void, +png_fixed_error,(png_structp png_ptr, png_const_charp name),PNG_NORETURN) +{ +# define fixed_message "fixed point overflow in " +# define fixed_message_ln ((sizeof fixed_message)-1) + int iin; + char msg[fixed_message_ln+PNG_MAX_ERROR_TEXT]; + png_memcpy(msg, fixed_message, fixed_message_ln); + iin = 0; + if (name != NULL) while (iin < (PNG_MAX_ERROR_TEXT-1) && name[iin] != 0) + { + msg[fixed_message_ln + iin] = name[iin]; + ++iin; + } + msg[fixed_message_ln + iin] = 0; + png_error(png_ptr, msg); +} +#endif +#endif + #ifdef PNG_SETJMP_SUPPORTED /* This API only exists if ANSI-C style error handling is used, * otherwise it is necessary for png_default_error to be overridden. @@ -242,7 +272,7 @@ png_set_longjmp_fn(png_structp png_ptr, png_longjmp_ptr longjmp_fn, return NULL; png_ptr->longjmp_fn = longjmp_fn; - return &png_ptr->jmpbuf; + return &png_ptr->png_jmpbuf; } #endif @@ -251,35 +281,38 @@ png_set_longjmp_fn(png_structp png_ptr, png_longjmp_ptr longjmp_fn, * function is used by default, or if the program supplies NULL for the * error function pointer in png_set_error_fn(). */ -static void /* PRIVATE */ -png_default_error(png_structp png_ptr, png_const_charp error_message) +static PNG_FUNCTION(void /* PRIVATE */, +png_default_error,(png_structp png_ptr, png_const_charp error_message), + PNG_NORETURN) { #ifdef PNG_CONSOLE_IO_SUPPORTED #ifdef PNG_ERROR_NUMBERS_SUPPORTED if (*error_message == PNG_LITERAL_SHARP) { - /* Strip "#nnnn " from beginning of error message. */ - int offset; - char error_number[16]; - for (offset = 0; offset<15; offset++) - { + /* Strip "#nnnn " from beginning of error message. */ + int offset; + char error_number[16]; + for (offset = 0; offset<15; offset++) + { error_number[offset] = error_message[offset + 1]; if (error_message[offset] == ' ') - break; - } - if ((offset > 1) && (offset < 15)) - { - error_number[offset - 1] = '\0'; - fprintf(stderr, "libpng error no. %s: %s", - error_number, error_message + offset + 1); - fprintf(stderr, PNG_STRING_NEWLINE); - } - else - { - fprintf(stderr, "libpng error: %s, offset=%d", - error_message, offset); - fprintf(stderr, PNG_STRING_NEWLINE); - } + break; + } + + if ((offset > 1) && (offset < 15)) + { + error_number[offset - 1] = '\0'; + fprintf(stderr, "libpng error no. %s: %s", + error_number, error_message + offset + 1); + fprintf(stderr, PNG_STRING_NEWLINE); + } + + else + { + fprintf(stderr, "libpng error: %s, offset=%d", + error_message, offset); + fprintf(stderr, PNG_STRING_NEWLINE); + } } else #endif @@ -288,26 +321,32 @@ png_default_error(png_structp png_ptr, png_const_charp error_message) fprintf(stderr, PNG_STRING_NEWLINE); } #endif +#ifndef PNG_CONSOLE_IO_SUPPORTED + PNG_UNUSED(error_message) /* Make compiler happy */ +#endif + png_longjmp(png_ptr, 1); +} +PNG_FUNCTION(void,PNGAPI +png_longjmp,(png_structp png_ptr, int val),PNG_NORETURN) +{ #ifdef PNG_SETJMP_SUPPORTED if (png_ptr && png_ptr->longjmp_fn) { # ifdef USE_FAR_KEYWORD - { - jmp_buf jmpbuf; - png_memcpy(jmpbuf, png_ptr->jmpbuf, png_sizeof(jmp_buf)); - png_ptr->longjmp_fn(jmpbuf, 1); - } + { + jmp_buf png_jmpbuf; + png_memcpy(png_jmpbuf, png_ptr->png_jmpbuf, png_sizeof(jmp_buf)); + png_ptr->longjmp_fn(png_jmpbuf, val); + } + # else - png_ptr->longjmp_fn(png_ptr->jmpbuf, 1); + png_ptr->longjmp_fn(png_ptr->png_jmpbuf, val); # endif } #endif /* Here if not setjmp support or if png_ptr is null. */ PNG_ABORT(); -#ifndef PNG_CONSOLE_IO_SUPPORTED - error_message = error_message; /* Make compiler happy */ -#endif } #ifdef PNG_WARNINGS_SUPPORTED @@ -323,52 +362,56 @@ png_default_warning(png_structp png_ptr, png_const_charp warning_message) # ifdef PNG_ERROR_NUMBERS_SUPPORTED if (*warning_message == PNG_LITERAL_SHARP) { - int offset; - char warning_number[16]; - for (offset = 0; offset < 15; offset++) - { - warning_number[offset] = warning_message[offset + 1]; - if (warning_message[offset] == ' ') + int offset; + char warning_number[16]; + for (offset = 0; offset < 15; offset++) + { + warning_number[offset] = warning_message[offset + 1]; + if (warning_message[offset] == ' ') break; - } - if ((offset > 1) && (offset < 15)) - { - warning_number[offset + 1] = '\0'; - fprintf(stderr, "libpng warning no. %s: %s", - warning_number, warning_message + offset); - fprintf(stderr, PNG_STRING_NEWLINE); - } - else - { - fprintf(stderr, "libpng warning: %s", - warning_message); - fprintf(stderr, PNG_STRING_NEWLINE); - } + } + + if ((offset > 1) && (offset < 15)) + { + warning_number[offset + 1] = '\0'; + fprintf(stderr, "libpng warning no. %s: %s", + warning_number, warning_message + offset); + fprintf(stderr, PNG_STRING_NEWLINE); + } + + else + { + fprintf(stderr, "libpng warning: %s", + warning_message); + fprintf(stderr, PNG_STRING_NEWLINE); + } } else # endif + { - fprintf(stderr, "libpng warning: %s", warning_message); - fprintf(stderr, PNG_STRING_NEWLINE); + fprintf(stderr, "libpng warning: %s", warning_message); + fprintf(stderr, PNG_STRING_NEWLINE); } #else - warning_message = warning_message; /* Make compiler happy */ + PNG_UNUSED(warning_message) /* Make compiler happy */ #endif - png_ptr = png_ptr; /* Make compiler happy */ + PNG_UNUSED(png_ptr) /* Make compiler happy */ } #endif /* PNG_WARNINGS_SUPPORTED */ /* This function is called when the application wants to use another method * of handling errors and warnings. Note that the error function MUST NOT * return to the calling routine or serious problems will occur. The return - * method used in the default routine calls longjmp(png_ptr->jmpbuf, 1) + * method used in the default routine calls longjmp(png_ptr->png_jmpbuf, 1) */ void PNGAPI png_set_error_fn(png_structp png_ptr, png_voidp error_ptr, - png_error_ptr error_fn, png_error_ptr warning_fn) + png_error_ptr error_fn, png_error_ptr warning_fn) { if (png_ptr == NULL) return; + png_ptr->error_ptr = error_ptr; png_ptr->error_fn = error_fn; png_ptr->warning_fn = warning_fn; @@ -380,10 +423,11 @@ png_set_error_fn(png_structp png_ptr, png_voidp error_ptr, * pointer before png_write_destroy and png_read_destroy are called. */ png_voidp PNGAPI -png_get_error_ptr(png_structp png_ptr) +png_get_error_ptr(png_const_structp png_ptr) { if (png_ptr == NULL) return NULL; + return ((png_voidp)png_ptr->error_ptr); } @@ -394,8 +438,9 @@ png_set_strip_error_numbers(png_structp png_ptr, png_uint_32 strip_mode) { if (png_ptr != NULL) { - png_ptr->flags &= - ((~(PNG_FLAG_STRIP_ERROR_NUMBERS|PNG_FLAG_STRIP_ERROR_TEXT))&strip_mode); + png_ptr->flags &= + ((~(PNG_FLAG_STRIP_ERROR_NUMBERS | + PNG_FLAG_STRIP_ERROR_TEXT))&strip_mode); } } #endif diff --git a/reactos/dll/3rdparty/libpng/pngget.c b/reactos/dll/3rdparty/libpng/pngget.c index abe721bd589..b5e5798c020 100644 --- a/reactos/dll/3rdparty/libpng/pngget.c +++ b/reactos/dll/3rdparty/libpng/pngget.c @@ -1,8 +1,8 @@ /* pngget.c - retrieval of values from info struct * - * Last changed in libpng 1.4.2 [May 6, 2010] - * Copyright (c) 1998-2010 Glenn Randers-Pehrson + * Last changed in libpng 1.5.1 [February 3, 2011] + * Copyright (c) 1998-2011 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * @@ -12,47 +12,44 @@ * */ -#define PNG_NO_PEDANTIC_WARNINGS -#include "png.h" -#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) #include "pngpriv.h" +#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) + png_uint_32 PNGAPI -png_get_valid(png_structp png_ptr, png_infop info_ptr, png_uint_32 flag) +png_get_valid(png_const_structp png_ptr, png_const_infop info_ptr, + png_uint_32 flag) { if (png_ptr != NULL && info_ptr != NULL) return(info_ptr->valid & flag); - else - return(0); + return(0); } png_size_t PNGAPI -png_get_rowbytes(png_structp png_ptr, png_infop info_ptr) +png_get_rowbytes(png_const_structp png_ptr, png_const_infop info_ptr) { if (png_ptr != NULL && info_ptr != NULL) return(info_ptr->rowbytes); - else - return(0); + return(0); } #ifdef PNG_INFO_IMAGE_SUPPORTED png_bytepp PNGAPI -png_get_rows(png_structp png_ptr, png_infop info_ptr) +png_get_rows(png_const_structp png_ptr, png_const_infop info_ptr) { if (png_ptr != NULL && info_ptr != NULL) return(info_ptr->row_pointers); - else - return(0); + return(0); } #endif #ifdef PNG_EASY_ACCESS_SUPPORTED /* Easy access to info, added in libpng-0.99 */ png_uint_32 PNGAPI -png_get_image_width(png_structp png_ptr, png_infop info_ptr) +png_get_image_width(png_const_structp png_ptr, png_const_infop info_ptr) { if (png_ptr != NULL && info_ptr != NULL) return info_ptr->width; @@ -61,7 +58,7 @@ png_get_image_width(png_structp png_ptr, png_infop info_ptr) } png_uint_32 PNGAPI -png_get_image_height(png_structp png_ptr, png_infop info_ptr) +png_get_image_height(png_const_structp png_ptr, png_const_infop info_ptr) { if (png_ptr != NULL && info_ptr != NULL) return info_ptr->height; @@ -70,7 +67,7 @@ png_get_image_height(png_structp png_ptr, png_infop info_ptr) } png_byte PNGAPI -png_get_bit_depth(png_structp png_ptr, png_infop info_ptr) +png_get_bit_depth(png_const_structp png_ptr, png_const_infop info_ptr) { if (png_ptr != NULL && info_ptr != NULL) return info_ptr->bit_depth; @@ -79,7 +76,7 @@ png_get_bit_depth(png_structp png_ptr, png_infop info_ptr) } png_byte PNGAPI -png_get_color_type(png_structp png_ptr, png_infop info_ptr) +png_get_color_type(png_const_structp png_ptr, png_const_infop info_ptr) { if (png_ptr != NULL && info_ptr != NULL) return info_ptr->color_type; @@ -88,7 +85,7 @@ png_get_color_type(png_structp png_ptr, png_infop info_ptr) } png_byte PNGAPI -png_get_filter_type(png_structp png_ptr, png_infop info_ptr) +png_get_filter_type(png_const_structp png_ptr, png_const_infop info_ptr) { if (png_ptr != NULL && info_ptr != NULL) return info_ptr->filter_type; @@ -97,7 +94,7 @@ png_get_filter_type(png_structp png_ptr, png_infop info_ptr) } png_byte PNGAPI -png_get_interlace_type(png_structp png_ptr, png_infop info_ptr) +png_get_interlace_type(png_const_structp png_ptr, png_const_infop info_ptr) { if (png_ptr != NULL && info_ptr != NULL) return info_ptr->interlace_type; @@ -106,7 +103,7 @@ png_get_interlace_type(png_structp png_ptr, png_infop info_ptr) } png_byte PNGAPI -png_get_compression_type(png_structp png_ptr, png_infop info_ptr) +png_get_compression_type(png_const_structp png_ptr, png_const_infop info_ptr) { if (png_ptr != NULL && info_ptr != NULL) return info_ptr->compression_type; @@ -115,222 +112,275 @@ png_get_compression_type(png_structp png_ptr, png_infop info_ptr) } png_uint_32 PNGAPI -png_get_x_pixels_per_meter(png_structp png_ptr, png_infop info_ptr) +png_get_x_pixels_per_meter(png_const_structp png_ptr, png_const_infop info_ptr) { - if (png_ptr != NULL && info_ptr != NULL) #ifdef PNG_pHYs_SUPPORTED - if (info_ptr->valid & PNG_INFO_pHYs) - { - png_debug1(1, "in %s retrieval function", "png_get_x_pixels_per_meter"); + if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_pHYs)) + { + png_debug1(1, "in %s retrieval function", + "png_get_x_pixels_per_meter"); - if (info_ptr->phys_unit_type != PNG_RESOLUTION_METER) - return (0); - - else - return (info_ptr->x_pixels_per_unit); - } -#else - return (0); + if (info_ptr->phys_unit_type == PNG_RESOLUTION_METER) + return (info_ptr->x_pixels_per_unit); + } #endif + return (0); } png_uint_32 PNGAPI -png_get_y_pixels_per_meter(png_structp png_ptr, png_infop info_ptr) +png_get_y_pixels_per_meter(png_const_structp png_ptr, png_const_infop info_ptr) { - if (png_ptr != NULL && info_ptr != NULL) #ifdef PNG_pHYs_SUPPORTED - if (info_ptr->valid & PNG_INFO_pHYs) + if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_pHYs)) { - png_debug1(1, "in %s retrieval function", "png_get_y_pixels_per_meter"); + png_debug1(1, "in %s retrieval function", + "png_get_y_pixels_per_meter"); - if (info_ptr->phys_unit_type != PNG_RESOLUTION_METER) - return (0); - - else - return (info_ptr->y_pixels_per_unit); + if (info_ptr->phys_unit_type == PNG_RESOLUTION_METER) + return (info_ptr->y_pixels_per_unit); } -#else - return (0); #endif + return (0); } png_uint_32 PNGAPI -png_get_pixels_per_meter(png_structp png_ptr, png_infop info_ptr) +png_get_pixels_per_meter(png_const_structp png_ptr, png_const_infop info_ptr) { - if (png_ptr != NULL && info_ptr != NULL) #ifdef PNG_pHYs_SUPPORTED - if (info_ptr->valid & PNG_INFO_pHYs) + if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_pHYs)) { png_debug1(1, "in %s retrieval function", "png_get_pixels_per_meter"); - if (info_ptr->phys_unit_type != PNG_RESOLUTION_METER || - info_ptr->x_pixels_per_unit != info_ptr->y_pixels_per_unit) - return (0); - - else - return (info_ptr->x_pixels_per_unit); + if (info_ptr->phys_unit_type == PNG_RESOLUTION_METER && + info_ptr->x_pixels_per_unit == info_ptr->y_pixels_per_unit) + return (info_ptr->x_pixels_per_unit); } -#else - return (0); #endif + return (0); } #ifdef PNG_FLOATING_POINT_SUPPORTED float PNGAPI -png_get_pixel_aspect_ratio(png_structp png_ptr, png_infop info_ptr) - { - if (png_ptr != NULL && info_ptr != NULL) -#ifdef PNG_pHYs_SUPPORTED - - if (info_ptr->valid & PNG_INFO_pHYs) +png_get_pixel_aspect_ratio(png_const_structp png_ptr, png_const_infop info_ptr) +{ +#ifdef PNG_READ_pHYs_SUPPORTED + if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_pHYs)) { png_debug1(1, "in %s retrieval function", "png_get_aspect_ratio"); - if (info_ptr->x_pixels_per_unit == 0) - return ((float)0.0); - - else + if (info_ptr->x_pixels_per_unit != 0) return ((float)((float)info_ptr->y_pixels_per_unit - /(float)info_ptr->x_pixels_per_unit)); + /(float)info_ptr->x_pixels_per_unit)); } -#else - return (0.0); #endif + return ((float)0.0); } #endif -png_int_32 PNGAPI -png_get_x_offset_microns(png_structp png_ptr, png_infop info_ptr) +#ifdef PNG_FIXED_POINT_SUPPORTED +png_fixed_point PNGAPI +png_get_pixel_aspect_ratio_fixed(png_const_structp png_ptr, + png_const_infop info_ptr) { - if (png_ptr != NULL && info_ptr != NULL) -#ifdef PNG_oFFs_SUPPORTED +#ifdef PNG_READ_pHYs_SUPPORTED + if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_pHYs) + && info_ptr->x_pixels_per_unit > 0 && info_ptr->y_pixels_per_unit > 0 + && info_ptr->x_pixels_per_unit <= PNG_UINT_31_MAX + && info_ptr->y_pixels_per_unit <= PNG_UINT_31_MAX) + { + png_fixed_point res; - if (info_ptr->valid & PNG_INFO_oFFs) + png_debug1(1, "in %s retrieval function", "png_get_aspect_ratio_fixed"); + + /* The following casts work because a PNG 4 byte integer only has a valid + * range of 0..2^31-1; otherwise the cast might overflow. + */ + if (png_muldiv(&res, (png_int_32)info_ptr->y_pixels_per_unit, PNG_FP_1, + (png_int_32)info_ptr->x_pixels_per_unit)) + return res; + } +#endif + + return 0; +} +#endif + +png_int_32 PNGAPI +png_get_x_offset_microns(png_const_structp png_ptr, png_const_infop info_ptr) +{ +#ifdef PNG_oFFs_SUPPORTED + if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_oFFs)) { png_debug1(1, "in %s retrieval function", "png_get_x_offset_microns"); - if (info_ptr->offset_unit_type != PNG_OFFSET_MICROMETER) - return (0); - - else - return (info_ptr->x_offset); + if (info_ptr->offset_unit_type == PNG_OFFSET_MICROMETER) + return (info_ptr->x_offset); } -#else - return (0); #endif + return (0); } png_int_32 PNGAPI -png_get_y_offset_microns(png_structp png_ptr, png_infop info_ptr) +png_get_y_offset_microns(png_const_structp png_ptr, png_const_infop info_ptr) { - if (png_ptr != NULL && info_ptr != NULL) - #ifdef PNG_oFFs_SUPPORTED - if (info_ptr->valid & PNG_INFO_oFFs) + if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_oFFs)) { png_debug1(1, "in %s retrieval function", "png_get_y_offset_microns"); - if (info_ptr->offset_unit_type != PNG_OFFSET_MICROMETER) - return (0); - - else - return (info_ptr->y_offset); + if (info_ptr->offset_unit_type == PNG_OFFSET_MICROMETER) + return (info_ptr->y_offset); } -#else - return (0); #endif + return (0); } png_int_32 PNGAPI -png_get_x_offset_pixels(png_structp png_ptr, png_infop info_ptr) +png_get_x_offset_pixels(png_const_structp png_ptr, png_const_infop info_ptr) { - if (png_ptr != NULL && info_ptr != NULL) - #ifdef PNG_oFFs_SUPPORTED - if (info_ptr->valid & PNG_INFO_oFFs) + if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_oFFs)) { - png_debug1(1, "in %s retrieval function", "png_get_x_offset_microns"); + png_debug1(1, "in %s retrieval function", "png_get_x_offset_pixels"); - if (info_ptr->offset_unit_type != PNG_OFFSET_PIXEL) - return (0); - - else - return (info_ptr->x_offset); + if (info_ptr->offset_unit_type == PNG_OFFSET_PIXEL) + return (info_ptr->x_offset); } -#else - return (0); #endif + return (0); } png_int_32 PNGAPI -png_get_y_offset_pixels(png_structp png_ptr, png_infop info_ptr) +png_get_y_offset_pixels(png_const_structp png_ptr, png_const_infop info_ptr) { - if (png_ptr != NULL && info_ptr != NULL) - #ifdef PNG_oFFs_SUPPORTED - if (info_ptr->valid & PNG_INFO_oFFs) + if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_oFFs)) { - png_debug1(1, "in %s retrieval function", "png_get_y_offset_microns"); + png_debug1(1, "in %s retrieval function", "png_get_y_offset_pixels"); - if (info_ptr->offset_unit_type != PNG_OFFSET_PIXEL) - return (0); - - else - return (info_ptr->y_offset); + if (info_ptr->offset_unit_type == PNG_OFFSET_PIXEL) + return (info_ptr->y_offset); } -#else - return (0); #endif + return (0); } -#if defined(PNG_INCH_CONVERSIONS) && defined(PNG_FLOATING_POINT_SUPPORTED) -png_uint_32 PNGAPI -png_get_pixels_per_inch(png_structp png_ptr, png_infop info_ptr) +#ifdef PNG_INCH_CONVERSIONS_SUPPORTED +static png_uint_32 +ppi_from_ppm(png_uint_32 ppm) { - return ((png_uint_32)((float)png_get_pixels_per_meter(png_ptr, info_ptr) - *.0254 +.5)); +#if 0 + /* The conversion is *(2.54/100), in binary (32 digits): + * .00000110100000001001110101001001 + */ + png_uint_32 t1001, t1101; + ppm >>= 1; /* .1 */ + t1001 = ppm + (ppm >> 3); /* .1001 */ + t1101 = t1001 + (ppm >> 1); /* .1101 */ + ppm >>= 20; /* .000000000000000000001 */ + t1101 += t1101 >> 15; /* .1101000000000001101 */ + t1001 >>= 11; /* .000000000001001 */ + t1001 += t1001 >> 12; /* .000000000001001000000001001 */ + ppm += t1001; /* .000000000001001000001001001 */ + ppm += t1101; /* .110100000001001110101001001 */ + return (ppm + 16) >> 5;/* .00000110100000001001110101001001 */ +#else + /* The argument is a PNG unsigned integer, so it is not permitted + * to be bigger than 2^31. + */ + png_fixed_point result; + if (ppm <= PNG_UINT_31_MAX && png_muldiv(&result, (png_int_32)ppm, 127, + 5000)) + return result; + + /* Overflow. */ + return 0; +#endif } png_uint_32 PNGAPI -png_get_x_pixels_per_inch(png_structp png_ptr, png_infop info_ptr) +png_get_pixels_per_inch(png_const_structp png_ptr, png_const_infop info_ptr) { - return ((png_uint_32)((float)png_get_x_pixels_per_meter(png_ptr, info_ptr) - *.0254 +.5)); + return ppi_from_ppm(png_get_pixels_per_meter(png_ptr, info_ptr)); } png_uint_32 PNGAPI -png_get_y_pixels_per_inch(png_structp png_ptr, png_infop info_ptr) +png_get_x_pixels_per_inch(png_const_structp png_ptr, png_const_infop info_ptr) { - return ((png_uint_32)((float)png_get_y_pixels_per_meter(png_ptr, info_ptr) - *.0254 +.5)); + return ppi_from_ppm(png_get_x_pixels_per_meter(png_ptr, info_ptr)); } +png_uint_32 PNGAPI +png_get_y_pixels_per_inch(png_const_structp png_ptr, png_const_infop info_ptr) +{ + return ppi_from_ppm(png_get_y_pixels_per_meter(png_ptr, info_ptr)); +} + +#ifdef PNG_FIXED_POINT_SUPPORTED +static png_fixed_point +png_fixed_inches_from_microns(png_structp png_ptr, png_int_32 microns) +{ + /* Convert from metres * 1,000,000 to inches * 100,000, meters to + * inches is simply *(100/2.54), so we want *(10/2.54) == 500/127. + * Notice that this can overflow - a warning is output and 0 is + * returned. + */ + return png_muldiv_warn(png_ptr, microns, 500, 127); +} + +png_fixed_point PNGAPI +png_get_x_offset_inches_fixed(png_structp png_ptr, + png_const_infop info_ptr) +{ + return png_fixed_inches_from_microns(png_ptr, + png_get_x_offset_microns(png_ptr, info_ptr)); +} +#endif + +#ifdef PNG_FIXED_POINT_SUPPORTED +png_fixed_point PNGAPI +png_get_y_offset_inches_fixed(png_structp png_ptr, + png_const_infop info_ptr) +{ + return png_fixed_inches_from_microns(png_ptr, + png_get_y_offset_microns(png_ptr, info_ptr)); +} +#endif + +#ifdef PNG_FLOATING_POINT_SUPPORTED float PNGAPI -png_get_x_offset_inches(png_structp png_ptr, png_infop info_ptr) +png_get_x_offset_inches(png_const_structp png_ptr, png_const_infop info_ptr) { - return ((float)png_get_x_offset_microns(png_ptr, info_ptr) - *.00003937); + /* To avoid the overflow do the conversion directly in floating + * point. + */ + return (float)(png_get_x_offset_microns(png_ptr, info_ptr) * .00003937); } +#endif +#ifdef PNG_FLOATING_POINT_SUPPORTED float PNGAPI -png_get_y_offset_inches(png_structp png_ptr, png_infop info_ptr) +png_get_y_offset_inches(png_const_structp png_ptr, png_const_infop info_ptr) { - return ((float)png_get_y_offset_microns(png_ptr, info_ptr) - *.00003937); + /* To avoid the overflow do the conversion directly in floating + * point. + */ + return (float)(png_get_y_offset_microns(png_ptr, info_ptr) * .00003937); } +#endif #ifdef PNG_pHYs_SUPPORTED png_uint_32 PNGAPI -png_get_pHYs_dpi(png_structp png_ptr, png_infop info_ptr, - png_uint_32 *res_x, png_uint_32 *res_y, int *unit_type) +png_get_pHYs_dpi(png_const_structp png_ptr, png_const_infop info_ptr, + png_uint_32 *res_x, png_uint_32 *res_y, int *unit_type) { png_uint_32 retval = 0; @@ -343,15 +393,18 @@ png_get_pHYs_dpi(png_structp png_ptr, png_infop info_ptr, *res_x = info_ptr->x_pixels_per_unit; retval |= PNG_INFO_pHYs; } + if (res_y != NULL) { *res_y = info_ptr->y_pixels_per_unit; retval |= PNG_INFO_pHYs; } + if (unit_type != NULL) { *unit_type = (int)info_ptr->phys_unit_type; retval |= PNG_INFO_pHYs; + if (*unit_type == 1) { if (res_x != NULL) *res_x = (png_uint_32)(*res_x * .0254 + .50); @@ -359,176 +412,182 @@ png_get_pHYs_dpi(png_structp png_ptr, png_infop info_ptr, } } } + return (retval); } #endif /* PNG_pHYs_SUPPORTED */ -#endif /* PNG_INCH_CONVERSIONS && PNG_FLOATING_POINT_SUPPORTED */ +#endif /* PNG_INCH_CONVERSIONS_SUPPORTED */ /* png_get_channels really belongs in here, too, but it's been around longer */ #endif /* PNG_EASY_ACCESS_SUPPORTED */ png_byte PNGAPI -png_get_channels(png_structp png_ptr, png_infop info_ptr) +png_get_channels(png_const_structp png_ptr, png_const_infop info_ptr) { if (png_ptr != NULL && info_ptr != NULL) return(info_ptr->channels); - else - return (0); + + return (0); } -png_bytep PNGAPI -png_get_signature(png_structp png_ptr, png_infop info_ptr) +png_const_bytep PNGAPI +png_get_signature(png_const_structp png_ptr, png_infop info_ptr) { if (png_ptr != NULL && info_ptr != NULL) return(info_ptr->signature); - else - return (NULL); + + return (NULL); } #ifdef PNG_bKGD_SUPPORTED png_uint_32 PNGAPI -png_get_bKGD(png_structp png_ptr, png_infop info_ptr, +png_get_bKGD(png_const_structp png_ptr, png_infop info_ptr, png_color_16p *background) { if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_bKGD) - && background != NULL) + && background != NULL) { png_debug1(1, "in %s retrieval function", "bKGD"); *background = &(info_ptr->background); return (PNG_INFO_bKGD); } + return (0); } #endif #ifdef PNG_cHRM_SUPPORTED -#ifdef PNG_FLOATING_POINT_SUPPORTED +# ifdef PNG_FLOATING_POINT_SUPPORTED png_uint_32 PNGAPI -png_get_cHRM(png_structp png_ptr, png_infop info_ptr, - double *white_x, double *white_y, double *red_x, double *red_y, - double *green_x, double *green_y, double *blue_x, double *blue_y) +png_get_cHRM(png_const_structp png_ptr, png_const_infop info_ptr, + double *white_x, double *white_y, double *red_x, double *red_y, + double *green_x, double *green_y, double *blue_x, double *blue_y) { if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_cHRM)) { png_debug1(1, "in %s retrieval function", "cHRM"); if (white_x != NULL) - *white_x = (double)info_ptr->x_white; + *white_x = png_float(png_ptr, info_ptr->x_white, "cHRM white X"); if (white_y != NULL) - *white_y = (double)info_ptr->y_white; + *white_y = png_float(png_ptr, info_ptr->y_white, "cHRM white Y"); if (red_x != NULL) - *red_x = (double)info_ptr->x_red; + *red_x = png_float(png_ptr, info_ptr->x_red, "cHRM red X"); if (red_y != NULL) - *red_y = (double)info_ptr->y_red; + *red_y = png_float(png_ptr, info_ptr->y_red, "cHRM red Y"); if (green_x != NULL) - *green_x = (double)info_ptr->x_green; + *green_x = png_float(png_ptr, info_ptr->x_green, "cHRM green X"); if (green_y != NULL) - *green_y = (double)info_ptr->y_green; + *green_y = png_float(png_ptr, info_ptr->y_green, "cHRM green Y"); if (blue_x != NULL) - *blue_x = (double)info_ptr->x_blue; + *blue_x = png_float(png_ptr, info_ptr->x_blue, "cHRM blue X"); if (blue_y != NULL) - *blue_y = (double)info_ptr->y_blue; + *blue_y = png_float(png_ptr, info_ptr->y_blue, "cHRM blue Y"); return (PNG_INFO_cHRM); } + return (0); } -#endif -#ifdef PNG_FIXED_POINT_SUPPORTED +# endif + +# ifdef PNG_FIXED_POINT_SUPPORTED png_uint_32 PNGAPI -png_get_cHRM_fixed(png_structp png_ptr, png_infop info_ptr, - png_fixed_point *white_x, png_fixed_point *white_y, png_fixed_point *red_x, - png_fixed_point *red_y, png_fixed_point *green_x, png_fixed_point *green_y, - png_fixed_point *blue_x, png_fixed_point *blue_y) +png_get_cHRM_fixed(png_const_structp png_ptr, png_const_infop info_ptr, + png_fixed_point *white_x, png_fixed_point *white_y, png_fixed_point *red_x, + png_fixed_point *red_y, png_fixed_point *green_x, png_fixed_point *green_y, + png_fixed_point *blue_x, png_fixed_point *blue_y) { png_debug1(1, "in %s retrieval function", "cHRM"); if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_cHRM)) { if (white_x != NULL) - *white_x = info_ptr->int_x_white; + *white_x = info_ptr->x_white; if (white_y != NULL) - *white_y = info_ptr->int_y_white; + *white_y = info_ptr->y_white; if (red_x != NULL) - *red_x = info_ptr->int_x_red; + *red_x = info_ptr->x_red; if (red_y != NULL) - *red_y = info_ptr->int_y_red; + *red_y = info_ptr->y_red; if (green_x != NULL) - *green_x = info_ptr->int_x_green; + *green_x = info_ptr->x_green; if (green_y != NULL) - *green_y = info_ptr->int_y_green; + *green_y = info_ptr->y_green; if (blue_x != NULL) - *blue_x = info_ptr->int_x_blue; + *blue_x = info_ptr->x_blue; if (blue_y != NULL) - *blue_y = info_ptr->int_y_blue; + *blue_y = info_ptr->y_blue; return (PNG_INFO_cHRM); } + return (0); } -#endif +# endif #endif #ifdef PNG_gAMA_SUPPORTED -#ifdef PNG_FLOATING_POINT_SUPPORTED -png_uint_32 PNGAPI -png_get_gAMA(png_structp png_ptr, png_infop info_ptr, double *file_gamma) +png_uint_32 PNGFAPI +png_get_gAMA_fixed(png_const_structp png_ptr, png_const_infop info_ptr, + png_fixed_point *file_gamma) { png_debug1(1, "in %s retrieval function", "gAMA"); if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_gAMA) - && file_gamma != NULL) + && file_gamma != NULL) { - *file_gamma = (double)info_ptr->gamma; + *file_gamma = info_ptr->gamma; return (PNG_INFO_gAMA); } - return (0); -} -#endif -#ifdef PNG_FIXED_POINT_SUPPORTED -png_uint_32 PNGAPI -png_get_gAMA_fixed(png_structp png_ptr, png_infop info_ptr, - png_fixed_point *int_file_gamma) -{ - png_debug1(1, "in %s retrieval function", "gAMA"); - if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_gAMA) - && int_file_gamma != NULL) - { - *int_file_gamma = info_ptr->int_gamma; - return (PNG_INFO_gAMA); - } return (0); } -#endif +# ifdef PNG_FLOATING_POINT_SUPPORTED +png_uint_32 PNGAPI +png_get_gAMA(png_const_structp png_ptr, png_const_infop info_ptr, + double *file_gamma) +{ + png_fixed_point igamma; + png_uint_32 ok = png_get_gAMA_fixed(png_ptr, info_ptr, &igamma); + + if (ok) + *file_gamma = png_float(png_ptr, igamma, "png_get_gAMA"); + + return ok; +} + +# endif #endif #ifdef PNG_sRGB_SUPPORTED png_uint_32 PNGAPI -png_get_sRGB(png_structp png_ptr, png_infop info_ptr, int *file_srgb_intent) +png_get_sRGB(png_const_structp png_ptr, png_const_infop info_ptr, + int *file_srgb_intent) { png_debug1(1, "in %s retrieval function", "sRGB"); if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_sRGB) - && file_srgb_intent != NULL) + && file_srgb_intent != NULL) { *file_srgb_intent = (int)info_ptr->srgb_intent; return (PNG_INFO_sRGB); } + return (0); } #endif #ifdef PNG_iCCP_SUPPORTED png_uint_32 PNGAPI -png_get_iCCP(png_structp png_ptr, png_infop info_ptr, - png_charpp name, int *compression_type, - png_charpp profile, png_uint_32 *proflen) +png_get_iCCP(png_const_structp png_ptr, png_const_infop info_ptr, + png_charpp name, int *compression_type, + png_bytepp profile, png_uint_32 *proflen) { png_debug1(1, "in %s retrieval function", "iCCP"); if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_iCCP) - && name != NULL && profile != NULL && proflen != NULL) + && name != NULL && profile != NULL && proflen != NULL) { *name = info_ptr->iccp_name; *profile = info_ptr->iccp_profile; @@ -539,45 +598,49 @@ png_get_iCCP(png_structp png_ptr, png_infop info_ptr, *compression_type = (int)info_ptr->iccp_compression; return (PNG_INFO_iCCP); } + return (0); } #endif #ifdef PNG_sPLT_SUPPORTED png_uint_32 PNGAPI -png_get_sPLT(png_structp png_ptr, png_infop info_ptr, - png_sPLT_tpp spalettes) +png_get_sPLT(png_const_structp png_ptr, png_const_infop info_ptr, + png_sPLT_tpp spalettes) { if (png_ptr != NULL && info_ptr != NULL && spalettes != NULL) { - *spalettes = info_ptr->splt_palettes; - return ((png_uint_32)info_ptr->splt_palettes_num); + *spalettes = info_ptr->splt_palettes; + return ((png_uint_32)info_ptr->splt_palettes_num); } + return (0); } #endif #ifdef PNG_hIST_SUPPORTED png_uint_32 PNGAPI -png_get_hIST(png_structp png_ptr, png_infop info_ptr, png_uint_16p *hist) +png_get_hIST(png_const_structp png_ptr, png_const_infop info_ptr, + png_uint_16p *hist) { png_debug1(1, "in %s retrieval function", "hIST"); if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_hIST) - && hist != NULL) + && hist != NULL) { *hist = info_ptr->hist; return (PNG_INFO_hIST); } + return (0); } #endif png_uint_32 PNGAPI png_get_IHDR(png_structp png_ptr, png_infop info_ptr, - png_uint_32 *width, png_uint_32 *height, int *bit_depth, - int *color_type, int *interlace_type, int *compression_type, - int *filter_type) + png_uint_32 *width, png_uint_32 *height, int *bit_depth, + int *color_type, int *interlace_type, int *compression_type, + int *filter_type) { png_debug1(1, "in %s retrieval function", "IHDR"); @@ -614,28 +677,29 @@ png_get_IHDR(png_structp png_ptr, png_infop info_ptr, #ifdef PNG_oFFs_SUPPORTED png_uint_32 PNGAPI -png_get_oFFs(png_structp png_ptr, png_infop info_ptr, - png_int_32 *offset_x, png_int_32 *offset_y, int *unit_type) +png_get_oFFs(png_const_structp png_ptr, png_const_infop info_ptr, + png_int_32 *offset_x, png_int_32 *offset_y, int *unit_type) { png_debug1(1, "in %s retrieval function", "oFFs"); if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_oFFs) - && offset_x != NULL && offset_y != NULL && unit_type != NULL) + && offset_x != NULL && offset_y != NULL && unit_type != NULL) { *offset_x = info_ptr->x_offset; *offset_y = info_ptr->y_offset; *unit_type = (int)info_ptr->offset_unit_type; return (PNG_INFO_oFFs); } + return (0); } #endif #ifdef PNG_pCAL_SUPPORTED png_uint_32 PNGAPI -png_get_pCAL(png_structp png_ptr, png_infop info_ptr, - png_charp *purpose, png_int_32 *X0, png_int_32 *X1, int *type, int *nparams, - png_charp *units, png_charpp *params) +png_get_pCAL(png_const_structp png_ptr, png_const_infop info_ptr, + png_charp *purpose, png_int_32 *X0, png_int_32 *X1, int *type, int *nparams, + png_charp *units, png_charpp *params) { png_debug1(1, "in %s retrieval function", "pCAL"); @@ -652,57 +716,78 @@ png_get_pCAL(png_structp png_ptr, png_infop info_ptr, *params = info_ptr->pcal_params; return (PNG_INFO_pCAL); } + return (0); } #endif #ifdef PNG_sCAL_SUPPORTED -#ifdef PNG_FLOATING_POINT_SUPPORTED +# ifdef PNG_FIXED_POINT_SUPPORTED +# ifdef PNG_FLOATING_ARITHMETIC_SUPPORTED png_uint_32 PNGAPI -png_get_sCAL(png_structp png_ptr, png_infop info_ptr, - int *unit, double *width, double *height) +png_get_sCAL_fixed(png_structp png_ptr, png_const_infop info_ptr, + int *unit, png_fixed_point *width, png_fixed_point *height) { - if (png_ptr != NULL && info_ptr != NULL && - (info_ptr->valid & PNG_INFO_sCAL)) - { - *unit = info_ptr->scal_unit; - *width = info_ptr->scal_pixel_width; - *height = info_ptr->scal_pixel_height; - return (PNG_INFO_sCAL); - } - return(0); + if (png_ptr != NULL && info_ptr != NULL && + (info_ptr->valid & PNG_INFO_sCAL)) + { + *unit = info_ptr->scal_unit; + /*TODO: make this work without FP support */ + *width = png_fixed(png_ptr, atof(info_ptr->scal_s_width), "sCAL width"); + *height = png_fixed(png_ptr, atof(info_ptr->scal_s_height), + "sCAL height"); + return (PNG_INFO_sCAL); + } + + return(0); } -#else -#ifdef PNG_FIXED_POINT_SUPPORTED +# endif /* FLOATING_ARITHMETIC */ +# endif /* FIXED_POINT */ +# ifdef PNG_FLOATING_POINT_SUPPORTED png_uint_32 PNGAPI -png_get_sCAL_s(png_structp png_ptr, png_infop info_ptr, - int *unit, png_charpp width, png_charpp height) +png_get_sCAL(png_const_structp png_ptr, png_const_infop info_ptr, + int *unit, double *width, double *height) { - if (png_ptr != NULL && info_ptr != NULL && - (info_ptr->valid & PNG_INFO_sCAL)) - { - *unit = info_ptr->scal_unit; - *width = info_ptr->scal_s_width; - *height = info_ptr->scal_s_height; - return (PNG_INFO_sCAL); - } - return(0); + if (png_ptr != NULL && info_ptr != NULL && + (info_ptr->valid & PNG_INFO_sCAL)) + { + *unit = info_ptr->scal_unit; + *width = atof(info_ptr->scal_s_width); + *height = atof(info_ptr->scal_s_height); + return (PNG_INFO_sCAL); + } + + return(0); } -#endif -#endif -#endif +# endif /* FLOATING POINT */ +png_uint_32 PNGAPI +png_get_sCAL_s(png_const_structp png_ptr, png_const_infop info_ptr, + int *unit, png_charpp width, png_charpp height) +{ + if (png_ptr != NULL && info_ptr != NULL && + (info_ptr->valid & PNG_INFO_sCAL)) + { + *unit = info_ptr->scal_unit; + *width = info_ptr->scal_s_width; + *height = info_ptr->scal_s_height; + return (PNG_INFO_sCAL); + } + + return(0); +} +#endif /* sCAL */ #ifdef PNG_pHYs_SUPPORTED png_uint_32 PNGAPI -png_get_pHYs(png_structp png_ptr, png_infop info_ptr, - png_uint_32 *res_x, png_uint_32 *res_y, int *unit_type) +png_get_pHYs(png_const_structp png_ptr, png_const_infop info_ptr, + png_uint_32 *res_x, png_uint_32 *res_y, int *unit_type) { png_uint_32 retval = 0; png_debug1(1, "in %s retrieval function", "pHYs"); if (png_ptr != NULL && info_ptr != NULL && - (info_ptr->valid & PNG_INFO_pHYs)) + (info_ptr->valid & PNG_INFO_pHYs)) { if (res_x != NULL) { @@ -722,13 +807,14 @@ png_get_pHYs(png_structp png_ptr, png_infop info_ptr, retval |= PNG_INFO_pHYs; } } + return (retval); } -#endif +#endif /* pHYs */ png_uint_32 PNGAPI -png_get_PLTE(png_structp png_ptr, png_infop info_ptr, png_colorp *palette, - int *num_palette) +png_get_PLTE(png_const_structp png_ptr, png_const_infop info_ptr, + png_colorp *palette, int *num_palette) { png_debug1(1, "in %s retrieval function", "PLTE"); @@ -740,35 +826,38 @@ png_get_PLTE(png_structp png_ptr, png_infop info_ptr, png_colorp *palette, png_debug1(3, "num_palette = %d", *num_palette); return (PNG_INFO_PLTE); } + return (0); } #ifdef PNG_sBIT_SUPPORTED png_uint_32 PNGAPI -png_get_sBIT(png_structp png_ptr, png_infop info_ptr, png_color_8p *sig_bit) +png_get_sBIT(png_const_structp png_ptr, png_infop info_ptr, + png_color_8p *sig_bit) { png_debug1(1, "in %s retrieval function", "sBIT"); if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_sBIT) - && sig_bit != NULL) + && sig_bit != NULL) { *sig_bit = &(info_ptr->sig_bit); return (PNG_INFO_sBIT); } + return (0); } #endif #ifdef PNG_TEXT_SUPPORTED png_uint_32 PNGAPI -png_get_text(png_structp png_ptr, png_infop info_ptr, png_textp *text_ptr, - int *num_text) +png_get_text(png_const_structp png_ptr, png_const_infop info_ptr, + png_textp *text_ptr, int *num_text) { if (png_ptr != NULL && info_ptr != NULL && info_ptr->num_text > 0) { png_debug1(1, "in %s retrieval function", - (png_ptr->chunk_name[0] == '\0' ? "text" - : (png_const_charp)png_ptr->chunk_name)); + (png_ptr->chunk_name[0] == '\0' ? "text" : + (png_const_charp)png_ptr->chunk_name)); if (text_ptr != NULL) *text_ptr = info_ptr->text; @@ -778,15 +867,17 @@ png_get_text(png_structp png_ptr, png_infop info_ptr, png_textp *text_ptr, return ((png_uint_32)info_ptr->num_text); } + if (num_text != NULL) - *num_text = 0; + *num_text = 0; + return(0); } #endif #ifdef PNG_tIME_SUPPORTED png_uint_32 PNGAPI -png_get_tIME(png_structp png_ptr, png_infop info_ptr, png_timep *mod_time) +png_get_tIME(png_const_structp png_ptr, png_infop info_ptr, png_timep *mod_time) { png_debug1(1, "in %s retrieval function", "tIME"); @@ -796,14 +887,15 @@ png_get_tIME(png_structp png_ptr, png_infop info_ptr, png_timep *mod_time) *mod_time = &(info_ptr->mod_time); return (PNG_INFO_tIME); } + return (0); } #endif #ifdef PNG_tRNS_SUPPORTED png_uint_32 PNGAPI -png_get_tRNS(png_structp png_ptr, png_infop info_ptr, - png_bytep *trans_alpha, int *num_trans, png_color_16p *trans_color) +png_get_tRNS(png_const_structp png_ptr, png_infop info_ptr, + png_bytep *trans_alpha, int *num_trans, png_color_16p *trans_color) { png_uint_32 retval = 0; if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_tRNS)) @@ -812,68 +904,72 @@ png_get_tRNS(png_structp png_ptr, png_infop info_ptr, if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) { - if (trans_alpha != NULL) - { - *trans_alpha = info_ptr->trans_alpha; - retval |= PNG_INFO_tRNS; - } + if (trans_alpha != NULL) + { + *trans_alpha = info_ptr->trans_alpha; + retval |= PNG_INFO_tRNS; + } - if (trans_color != NULL) - *trans_color = &(info_ptr->trans_color); + if (trans_color != NULL) + *trans_color = &(info_ptr->trans_color); } + else /* if (info_ptr->color_type != PNG_COLOR_TYPE_PALETTE) */ { - if (trans_color != NULL) - { - *trans_color = &(info_ptr->trans_color); - retval |= PNG_INFO_tRNS; - } + if (trans_color != NULL) + { + *trans_color = &(info_ptr->trans_color); + retval |= PNG_INFO_tRNS; + } - if (trans_alpha != NULL) - *trans_alpha = NULL; + if (trans_alpha != NULL) + *trans_alpha = NULL; } + if (num_trans != NULL) { *num_trans = info_ptr->num_trans; retval |= PNG_INFO_tRNS; } } + return (retval); } #endif #ifdef PNG_UNKNOWN_CHUNKS_SUPPORTED -png_uint_32 PNGAPI -png_get_unknown_chunks(png_structp png_ptr, png_infop info_ptr, - png_unknown_chunkpp unknowns) +int PNGAPI +png_get_unknown_chunks(png_const_structp png_ptr, png_const_infop info_ptr, + png_unknown_chunkpp unknowns) { if (png_ptr != NULL && info_ptr != NULL && unknowns != NULL) { - *unknowns = info_ptr->unknown_chunks; - return ((png_uint_32)info_ptr->unknown_chunks_num); + *unknowns = info_ptr->unknown_chunks; + return info_ptr->unknown_chunks_num; } + return (0); } #endif #ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED png_byte PNGAPI -png_get_rgb_to_gray_status (png_structp png_ptr) +png_get_rgb_to_gray_status (png_const_structp png_ptr) { - return (png_byte)(png_ptr? png_ptr->rgb_to_gray_status : 0); + return (png_byte)(png_ptr ? png_ptr->rgb_to_gray_status : 0); } #endif #ifdef PNG_USER_CHUNKS_SUPPORTED png_voidp PNGAPI -png_get_user_chunk_ptr(png_structp png_ptr) +png_get_user_chunk_ptr(png_const_structp png_ptr) { - return (png_ptr? png_ptr->user_chunk_ptr : NULL); + return (png_ptr ? png_ptr->user_chunk_ptr : NULL); } #endif png_size_t PNGAPI -png_get_compression_buffer_size(png_structp png_ptr) +png_get_compression_buffer_size(png_const_structp png_ptr) { return (png_ptr ? png_ptr->zbuf_size : 0L); } @@ -883,27 +979,29 @@ png_get_compression_buffer_size(png_structp png_ptr) /* These functions were added to libpng 1.2.6 and were enabled * by default in libpng-1.4.0 */ png_uint_32 PNGAPI -png_get_user_width_max (png_structp png_ptr) +png_get_user_width_max (png_const_structp png_ptr) { - return (png_ptr? png_ptr->user_width_max : 0); + return (png_ptr ? png_ptr->user_width_max : 0); } + png_uint_32 PNGAPI -png_get_user_height_max (png_structp png_ptr) +png_get_user_height_max (png_const_structp png_ptr) { - return (png_ptr? png_ptr->user_height_max : 0); + return (png_ptr ? png_ptr->user_height_max : 0); } + /* This function was added to libpng 1.4.0 */ png_uint_32 PNGAPI -png_get_chunk_cache_max (png_structp png_ptr) +png_get_chunk_cache_max (png_const_structp png_ptr) { - return (png_ptr? png_ptr->user_chunk_cache_max : 0); + return (png_ptr ? png_ptr->user_chunk_cache_max : 0); } + /* This function was added to libpng 1.4.1 */ png_alloc_size_t PNGAPI -png_get_chunk_malloc_max (png_structp png_ptr) +png_get_chunk_malloc_max (png_const_structp png_ptr) { - return (png_ptr? - png_ptr->user_chunk_malloc_max : 0); + return (png_ptr ? png_ptr->user_chunk_malloc_max : 0); } #endif /* ?PNG_SET_USER_LIMITS_SUPPORTED */ @@ -912,10 +1010,19 @@ png_get_chunk_malloc_max (png_structp png_ptr) png_uint_32 PNGAPI png_get_io_state (png_structp png_ptr) { - return png_ptr->io_state; + return png_ptr->io_state; } -png_bytep PNGAPI +png_uint_32 PNGAPI +png_get_io_chunk_type (png_const_structp png_ptr) +{ + return ((png_ptr->chunk_name[0] << 24) + + (png_ptr->chunk_name[1] << 16) + + (png_ptr->chunk_name[2] << 8) + + (png_ptr->chunk_name[3])); +} + +png_const_bytep PNGAPI png_get_io_chunk_name (png_structp png_ptr) { return png_ptr->chunk_name; diff --git a/reactos/dll/3rdparty/libpng/pngmem.c b/reactos/dll/3rdparty/libpng/pngmem.c index c8a3f6f59af..a15d8b08593 100644 --- a/reactos/dll/3rdparty/libpng/pngmem.c +++ b/reactos/dll/3rdparty/libpng/pngmem.c @@ -1,8 +1,8 @@ /* pngmem.c - stub functions for memory allocation * - * Last changed in libpng 1.4.2 [May 6, 2010] - * Copyright (c) 1998-2010 Glenn Randers-Pehrson + * Last changed in libpng 1.5.1 [February 3, 2011] + * Copyright (c) 1998-2011 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * @@ -17,40 +17,42 @@ * identify the replacement functions. */ -#define PNG_NO_PEDANTIC_WARNINGS -#include "png.h" -#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) #include "pngpriv.h" +#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) + /* Borland DOS special memory handler */ #if defined(__TURBOC__) && !defined(_Windows) && !defined(__FLAT__) /* If you change this, be sure to change the one in png.h also */ /* Allocate memory for a png_struct. The malloc and memset can be replaced by a single call to calloc() if this is thought to improve performance. */ -png_voidp /* PRIVATE */ -png_create_struct(int type) +PNG_FUNCTION(png_voidp /* PRIVATE */, +png_create_struct,(int type),PNG_ALLOCATED) { -#ifdef PNG_USER_MEM_SUPPORTED +# ifdef PNG_USER_MEM_SUPPORTED return (png_create_struct_2(type, NULL, NULL)); } /* Alternate version of png_create_struct, for use with user-defined malloc. */ -png_voidp /* PRIVATE */ -png_create_struct_2(int type, png_malloc_ptr malloc_fn, png_voidp mem_ptr) +PNG_FUNCTION(png_voidp /* PRIVATE */, +png_create_struct_2,(int type, png_malloc_ptr malloc_fn, png_voidp mem_ptr), + PNG_ALLOCATED) { -#endif /* PNG_USER_MEM_SUPPORTED */ +# endif /* PNG_USER_MEM_SUPPORTED */ png_size_t size; png_voidp struct_ptr; if (type == PNG_STRUCT_INFO) size = png_sizeof(png_info); + else if (type == PNG_STRUCT_PNG) size = png_sizeof(png_struct); + else return (png_get_copyright(NULL)); -#ifdef PNG_USER_MEM_SUPPORTED +# ifdef PNG_USER_MEM_SUPPORTED if (malloc_fn != NULL) { png_struct dummy_struct; @@ -58,11 +60,13 @@ png_create_struct_2(int type, png_malloc_ptr malloc_fn, png_voidp mem_ptr) png_ptr->mem_ptr=mem_ptr; struct_ptr = (*(malloc_fn))(png_ptr, (png_uint_32)size); } + else -#endif /* PNG_USER_MEM_SUPPORTED */ +# endif /* PNG_USER_MEM_SUPPORTED */ struct_ptr = (png_voidp)farmalloc(size); if (struct_ptr != NULL) png_memset(struct_ptr, 0, size); + return (struct_ptr); } @@ -70,7 +74,7 @@ png_create_struct_2(int type, png_malloc_ptr malloc_fn, png_voidp mem_ptr) void /* PRIVATE */ png_destroy_struct(png_voidp struct_ptr) { -#ifdef PNG_USER_MEM_SUPPORTED +# ifdef PNG_USER_MEM_SUPPORTED png_destroy_struct_2(struct_ptr, NULL, NULL); } @@ -79,10 +83,10 @@ void /* PRIVATE */ png_destroy_struct_2(png_voidp struct_ptr, png_free_ptr free_fn, png_voidp mem_ptr) { -#endif +# endif if (struct_ptr != NULL) { -#ifdef PNG_USER_MEM_SUPPORTED +# ifdef PNG_USER_MEM_SUPPORTED if (free_fn != NULL) { png_struct dummy_struct; @@ -91,7 +95,8 @@ png_destroy_struct_2(png_voidp struct_ptr, png_free_ptr free_fn, (*(free_fn))(png_ptr, struct_ptr); return; } -#endif /* PNG_USER_MEM_SUPPORTED */ + +# endif /* PNG_USER_MEM_SUPPORTED */ farfree (struct_ptr); } } @@ -115,55 +120,62 @@ png_destroy_struct_2(png_voidp struct_ptr, png_free_ptr free_fn, * result, we would be truncating potentially larger memory requests * (which should cause a fatal error) and introducing major problems. */ -png_voidp PNGAPI -png_calloc(png_structp png_ptr, png_alloc_size_t size) +PNG_FUNCTION(png_voidp,PNGAPI +png_calloc,(png_structp png_ptr, png_alloc_size_t size),PNG_ALLOCATED) { png_voidp ret; ret = (png_malloc(png_ptr, size)); + if (ret != NULL) png_memset(ret,0,(png_size_t)size); + return (ret); } -png_voidp PNGAPI -png_malloc(png_structp png_ptr, png_alloc_size_t size) +PNG_FUNCTION(png_voidp,PNGAPI +png_malloc,(png_structp png_ptr, png_alloc_size_t size),PNG_ALLOCATED) { png_voidp ret; if (png_ptr == NULL || size == 0) return (NULL); -#ifdef PNG_USER_MEM_SUPPORTED +# ifdef PNG_USER_MEM_SUPPORTED if (png_ptr->malloc_fn != NULL) ret = ((png_voidp)(*(png_ptr->malloc_fn))(png_ptr, (png_size_t)size)); + else ret = (png_malloc_default(png_ptr, size)); + if (ret == NULL && (png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) png_error(png_ptr, "Out of memory"); + return (ret); } -png_voidp PNGAPI -png_malloc_default(png_structp png_ptr, png_alloc_size_t size) +PNG_FUNCTION(png_voidp,PNGAPI +png_malloc_default,(png_structp png_ptr, png_alloc_size_t size),PNG_ALLOCATED) { png_voidp ret; -#endif /* PNG_USER_MEM_SUPPORTED */ +# endif /* PNG_USER_MEM_SUPPORTED */ if (png_ptr == NULL || size == 0) return (NULL); -#ifdef PNG_MAX_MALLOC_64K +# ifdef PNG_MAX_MALLOC_64K if (size > (png_uint_32)65536L) { png_warning(png_ptr, "Cannot Allocate > 64K"); ret = NULL; } + else -#endif +# endif if (size != (size_t)size) ret = NULL; + else if (size == (png_uint_32)65536L) { if (png_ptr->offset_table == NULL) @@ -186,10 +198,13 @@ png_malloc_default(png_structp png_ptr, png_alloc_size_t size) if (png_ptr->zlib_window_bits > 14) num_blocks = (int)(1 << (png_ptr->zlib_window_bits - 14)); + else num_blocks = 1; + if (png_ptr->zlib_mem_level >= 7) num_blocks += (int)(1 << (png_ptr->zlib_mem_level - 7)); + else num_blocks++; @@ -199,25 +214,27 @@ png_malloc_default(png_structp png_ptr, png_alloc_size_t size) if (table == NULL) { -#ifndef PNG_USER_MEM_SUPPORTED +# ifndef PNG_USER_MEM_SUPPORTED if ((png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) png_error(png_ptr, "Out Of Memory"); /* Note "O", "M" */ + else png_warning(png_ptr, "Out Of Memory"); -#endif +# endif return (NULL); } if ((png_size_t)table & 0xfff0) { -#ifndef PNG_USER_MEM_SUPPORTED +# ifndef PNG_USER_MEM_SUPPORTED if ((png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) png_error(png_ptr, "Farmalloc didn't return normalized pointer"); + else png_warning(png_ptr, "Farmalloc didn't return normalized pointer"); -#endif +# endif return (NULL); } @@ -227,12 +244,13 @@ png_malloc_default(png_structp png_ptr, png_alloc_size_t size) if (png_ptr->offset_table_ptr == NULL) { -#ifndef PNG_USER_MEM_SUPPORTED +# ifndef PNG_USER_MEM_SUPPORTED if ((png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) png_error(png_ptr, "Out Of memory"); /* Note "O", "m" */ + else png_warning(png_ptr, "Out Of memory"); -#endif +# endif return (NULL); } @@ -242,6 +260,7 @@ png_malloc_default(png_structp png_ptr, png_alloc_size_t size) hptr = (png_byte huge *)((long)(hptr) & 0xfffffff0L); hptr = hptr + 16L; /* "hptr += 16L" fails on Turbo C++ 3.0 */ } + for (i = 0; i < num_blocks; i++) { png_ptr->offset_table_ptr[i] = (png_bytep)hptr; @@ -256,29 +275,32 @@ png_malloc_default(png_structp png_ptr, png_alloc_size_t size) if (png_ptr->offset_table_count >= png_ptr->offset_table_number) { -#ifndef PNG_USER_MEM_SUPPORTED +# ifndef PNG_USER_MEM_SUPPORTED if ((png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) png_error(png_ptr, "Out of Memory"); /* Note "o" and "M" */ + else png_warning(png_ptr, "Out of Memory"); -#endif +# endif return (NULL); } ret = png_ptr->offset_table_ptr[png_ptr->offset_table_count++]; } + else ret = farmalloc(size); -#ifndef PNG_USER_MEM_SUPPORTED +# ifndef PNG_USER_MEM_SUPPORTED if (ret == NULL) { if ((png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) png_error(png_ptr, "Out of memory"); /* Note "o" and "m" */ + else png_warning(png_ptr, "Out of memory"); /* Note "o" and "m" */ } -#endif +# endif return (ret); } @@ -293,12 +315,13 @@ png_free(png_structp png_ptr, png_voidp ptr) if (png_ptr == NULL || ptr == NULL) return; -#ifdef PNG_USER_MEM_SUPPORTED +# ifdef PNG_USER_MEM_SUPPORTED if (png_ptr->free_fn != NULL) { (*(png_ptr->free_fn))(png_ptr, ptr); return; } + else png_free_default(png_ptr, ptr); } @@ -306,7 +329,7 @@ png_free(png_structp png_ptr, png_voidp ptr) void PNGAPI png_free_default(png_structp png_ptr, png_voidp ptr) { -#endif /* PNG_USER_MEM_SUPPORTED */ +# endif /* PNG_USER_MEM_SUPPORTED */ if (png_ptr == NULL || ptr == NULL) return; @@ -334,9 +357,7 @@ png_free_default(png_structp png_ptr, png_voidp ptr) } if (ptr != NULL) - { farfree(ptr); - } } #else /* Not the Borland DOS special memory handler */ @@ -344,52 +365,58 @@ png_free_default(png_structp png_ptr, png_voidp ptr) /* Allocate memory for a png_struct or a png_info. The malloc and memset can be replaced by a single call to calloc() if this is thought to improve performance noticably. */ -png_voidp /* PRIVATE */ -png_create_struct(int type) +PNG_FUNCTION(png_voidp /* PRIVATE */, +png_create_struct,(int type),PNG_ALLOCATED) { -#ifdef PNG_USER_MEM_SUPPORTED +# ifdef PNG_USER_MEM_SUPPORTED return (png_create_struct_2(type, NULL, NULL)); } /* Allocate memory for a png_struct or a png_info. The malloc and memset can be replaced by a single call to calloc() if this is thought to improve performance noticably. */ -png_voidp /* PRIVATE */ -png_create_struct_2(int type, png_malloc_ptr malloc_fn, png_voidp mem_ptr) +PNG_FUNCTION(png_voidp /* PRIVATE */, +png_create_struct_2,(int type, png_malloc_ptr malloc_fn, png_voidp mem_ptr), + PNG_ALLOCATED) { -#endif /* PNG_USER_MEM_SUPPORTED */ +# endif /* PNG_USER_MEM_SUPPORTED */ png_size_t size; png_voidp struct_ptr; if (type == PNG_STRUCT_INFO) size = png_sizeof(png_info); + else if (type == PNG_STRUCT_PNG) size = png_sizeof(png_struct); + else return (NULL); -#ifdef PNG_USER_MEM_SUPPORTED +# ifdef PNG_USER_MEM_SUPPORTED if (malloc_fn != NULL) { png_struct dummy_struct; png_structp png_ptr = &dummy_struct; png_ptr->mem_ptr=mem_ptr; struct_ptr = (*(malloc_fn))(png_ptr, size); + if (struct_ptr != NULL) png_memset(struct_ptr, 0, size); + return (struct_ptr); } -#endif /* PNG_USER_MEM_SUPPORTED */ +# endif /* PNG_USER_MEM_SUPPORTED */ -#if defined(__TURBOC__) && !defined(__FLAT__) +# if defined(__TURBOC__) && !defined(__FLAT__) struct_ptr = (png_voidp)farmalloc(size); -#else -# if defined(_MSC_VER) && defined(MAXSEG_64K) +# else +# if defined(_MSC_VER) && defined(MAXSEG_64K) struct_ptr = (png_voidp)halloc(size, 1); -# else +# else struct_ptr = (png_voidp)malloc(size); -# endif -#endif +# endif +# endif + if (struct_ptr != NULL) png_memset(struct_ptr, 0, size); @@ -401,7 +428,7 @@ png_create_struct_2(int type, png_malloc_ptr malloc_fn, png_voidp mem_ptr) void /* PRIVATE */ png_destroy_struct(png_voidp struct_ptr) { -#ifdef PNG_USER_MEM_SUPPORTED +# ifdef PNG_USER_MEM_SUPPORTED png_destroy_struct_2(struct_ptr, NULL, NULL); } @@ -410,10 +437,10 @@ void /* PRIVATE */ png_destroy_struct_2(png_voidp struct_ptr, png_free_ptr free_fn, png_voidp mem_ptr) { -#endif /* PNG_USER_MEM_SUPPORTED */ +# endif /* PNG_USER_MEM_SUPPORTED */ if (struct_ptr != NULL) { -#ifdef PNG_USER_MEM_SUPPORTED +# ifdef PNG_USER_MEM_SUPPORTED if (free_fn != NULL) { png_struct dummy_struct; @@ -422,16 +449,19 @@ png_destroy_struct_2(png_voidp struct_ptr, png_free_ptr free_fn, (*(free_fn))(png_ptr, struct_ptr); return; } -#endif /* PNG_USER_MEM_SUPPORTED */ -#if defined(__TURBOC__) && !defined(__FLAT__) +# endif /* PNG_USER_MEM_SUPPORTED */ +# if defined(__TURBOC__) && !defined(__FLAT__) farfree(struct_ptr); -#else -# if defined(_MSC_VER) && defined(MAXSEG_64K) + +# else +# if defined(_MSC_VER) && defined(MAXSEG_64K) hfree(struct_ptr); -# else + +# else free(struct_ptr); -# endif -#endif + +# endif +# endif } } @@ -442,80 +472,92 @@ png_destroy_struct_2(png_voidp struct_ptr, png_free_ptr free_fn, * have the ability to do that. */ -png_voidp PNGAPI -png_calloc(png_structp png_ptr, png_alloc_size_t size) +PNG_FUNCTION(png_voidp,PNGAPI +png_calloc,(png_structp png_ptr, png_alloc_size_t size),PNG_ALLOCATED) { png_voidp ret; ret = (png_malloc(png_ptr, size)); + if (ret != NULL) png_memset(ret,0,(png_size_t)size); + return (ret); } -png_voidp PNGAPI -png_malloc(png_structp png_ptr, png_alloc_size_t size) +PNG_FUNCTION(png_voidp,PNGAPI +png_malloc,(png_structp png_ptr, png_alloc_size_t size),PNG_ALLOCATED) { png_voidp ret; -#ifdef PNG_USER_MEM_SUPPORTED +# ifdef PNG_USER_MEM_SUPPORTED if (png_ptr == NULL || size == 0) return (NULL); if (png_ptr->malloc_fn != NULL) ret = ((png_voidp)(*(png_ptr->malloc_fn))(png_ptr, (png_size_t)size)); + else ret = (png_malloc_default(png_ptr, size)); + if (ret == NULL && (png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) png_error(png_ptr, "Out of Memory"); + return (ret); } -png_voidp PNGAPI -png_malloc_default(png_structp png_ptr, png_alloc_size_t size) +PNG_FUNCTION(png_voidp,PNGAPI +png_malloc_default,(png_structp png_ptr, png_alloc_size_t size),PNG_ALLOCATED) { png_voidp ret; -#endif /* PNG_USER_MEM_SUPPORTED */ +# endif /* PNG_USER_MEM_SUPPORTED */ if (png_ptr == NULL || size == 0) return (NULL); -#ifdef PNG_MAX_MALLOC_64K +# ifdef PNG_MAX_MALLOC_64K if (size > (png_uint_32)65536L) { -#ifndef PNG_USER_MEM_SUPPORTED +# ifndef PNG_USER_MEM_SUPPORTED if ((png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) png_error(png_ptr, "Cannot Allocate > 64K"); + else -#endif +# endif return NULL; } -#endif +# endif /* Check for overflow */ -#if defined(__TURBOC__) && !defined(__FLAT__) +# if defined(__TURBOC__) && !defined(__FLAT__) + if (size != (unsigned long)size) ret = NULL; + else ret = farmalloc(size); -#else -# if defined(_MSC_VER) && defined(MAXSEG_64K) + +# else +# if defined(_MSC_VER) && defined(MAXSEG_64K) if (size != (unsigned long)size) ret = NULL; + else ret = halloc(size, 1); -# else + +# else if (size != (size_t)size) ret = NULL; + else ret = malloc((size_t)size); -# endif -#endif +# endif +# endif -#ifndef PNG_USER_MEM_SUPPORTED +# ifndef PNG_USER_MEM_SUPPORTED if (ret == NULL && (png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) png_error(png_ptr, "Out of Memory"); -#endif +# endif return (ret); } @@ -529,34 +571,38 @@ png_free(png_structp png_ptr, png_voidp ptr) if (png_ptr == NULL || ptr == NULL) return; -#ifdef PNG_USER_MEM_SUPPORTED +# ifdef PNG_USER_MEM_SUPPORTED if (png_ptr->free_fn != NULL) { (*(png_ptr->free_fn))(png_ptr, ptr); return; } + else png_free_default(png_ptr, ptr); } + void PNGAPI png_free_default(png_structp png_ptr, png_voidp ptr) { if (png_ptr == NULL || ptr == NULL) return; -#endif /* PNG_USER_MEM_SUPPORTED */ +# endif /* PNG_USER_MEM_SUPPORTED */ -#if defined(__TURBOC__) && !defined(__FLAT__) +# if defined(__TURBOC__) && !defined(__FLAT__) farfree(ptr); -#else -# if defined(_MSC_VER) && defined(MAXSEG_64K) - hfree(ptr); -# else - free(ptr); -# endif -#endif -} +# else +# if defined(_MSC_VER) && defined(MAXSEG_64K) + hfree(ptr); + +# else + free(ptr); + +# endif +# endif +} #endif /* Not Borland DOS special memory handler */ /* This function was added at libpng version 1.2.3. The png_malloc_warn() @@ -564,8 +610,8 @@ png_free_default(png_structp png_ptr, png_voidp ptr) * instead of issuing a png_error, if it fails to allocate the requested * memory. */ -png_voidp PNGAPI -png_malloc_warn(png_structp png_ptr, png_alloc_size_t size) +PNG_FUNCTION(png_voidp,PNGAPI +png_malloc_warn,(png_structp png_ptr, png_alloc_size_t size),PNG_ALLOCATED) { png_voidp ptr; png_uint_32 save_flags; @@ -601,10 +647,11 @@ png_set_mem_fn(png_structp png_ptr, png_voidp mem_ptr, png_malloc_ptr * pointer before png_write_destroy and png_read_destroy are called. */ png_voidp PNGAPI -png_get_mem_ptr(png_structp png_ptr) +png_get_mem_ptr(png_const_structp png_ptr) { if (png_ptr == NULL) return (NULL); + return ((png_voidp)png_ptr->mem_ptr); } #endif /* PNG_USER_MEM_SUPPORTED */ diff --git a/reactos/dll/3rdparty/libpng/pngpread.c b/reactos/dll/3rdparty/libpng/pngpread.c index 3280d34b048..5ab9007a161 100644 --- a/reactos/dll/3rdparty/libpng/pngpread.c +++ b/reactos/dll/3rdparty/libpng/pngpread.c @@ -1,8 +1,8 @@ /* pngpread.c - read a png file in push mode * - * Last changed in libpng 1.4.3 [June 26, 2010] - * Copyright (c) 1998-2010 Glenn Randers-Pehrson + * Last changed in libpng 1.5.2 [March 31, 2011] + * Copyright (c) 1998-2011 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * @@ -11,11 +11,10 @@ * and license in png.h */ -#define PNG_NO_PEDANTIC_WARNINGS -#include "png.h" -#ifdef PNG_PROGRESSIVE_READ_SUPPORTED #include "pngpriv.h" +#ifdef PNG_PROGRESSIVE_READ_SUPPORTED + /* Push model modes */ #define PNG_READ_SIG_MODE 0 #define PNG_READ_CHUNK_MODE 1 @@ -29,7 +28,7 @@ void PNGAPI png_process_data(png_structp png_ptr, png_infop info_ptr, - png_bytep buffer, png_size_t buffer_size) + png_bytep buffer, png_size_t buffer_size) { if (png_ptr == NULL || info_ptr == NULL) return; @@ -42,6 +41,64 @@ png_process_data(png_structp png_ptr, png_infop info_ptr, } } +png_size_t PNGAPI +png_process_data_pause(png_structp png_ptr, int save) +{ + if (png_ptr != NULL) + { + /* It's easiest for the caller if we do the save, then the caller doesn't + * have to supply the same data again: + */ + if (save) + png_push_save_buffer(png_ptr); + else + { + /* This includes any pending saved bytes: */ + png_size_t remaining = png_ptr->buffer_size; + png_ptr->buffer_size = 0; + + /* So subtract the saved buffer size, unless all the data + * is actually 'saved', in which case we just return 0 + */ + if (png_ptr->save_buffer_size < remaining) + return remaining - png_ptr->save_buffer_size; + } + } + + return 0; +} + +png_uint_32 PNGAPI +png_process_data_skip(png_structp png_ptr) +{ + png_uint_32 remaining = 0; + + if (png_ptr != NULL && png_ptr->process_mode == PNG_SKIP_MODE && + png_ptr->skip_length > 0) + { + /* At the end of png_process_data the buffer size must be 0 (see the loop + * above) so we can detect a broken call here: + */ + if (png_ptr->buffer_size != 0) + png_error(png_ptr, + "png_process_data_skip called inside png_process_data"); + + /* If is impossible for there to be a saved buffer at this point - + * otherwise we could not be in SKIP mode. This will also happen if + * png_process_skip is called inside png_process_data (but only very + * rarely.) + */ + if (png_ptr->save_buffer_size != 0) + png_error(png_ptr, "png_process_data_skip called with saved data"); + + remaining = png_ptr->skip_length; + png_ptr->skip_length = 0; + png_ptr->process_mode = PNG_READ_CHUNK_MODE; + } + + return remaining; +} + /* What we do with the incoming data depends on what we were previously * doing before we ran out of data... */ @@ -127,7 +184,7 @@ png_push_read_sig(png_structp png_ptr, png_infop info_ptr) } png_push_fill_buffer(png_ptr, &(info_ptr->signature[num_checked]), - num_to_check); + num_to_check); png_ptr->sig_bytes = (png_byte)(png_ptr->sig_bytes + num_to_check); if (png_sig_cmp(info_ptr->signature, num_checked, num_to_check)) @@ -135,6 +192,7 @@ png_push_read_sig(png_structp png_ptr, png_infop info_ptr) if (num_checked < 4 && png_sig_cmp(info_ptr->signature, num_checked, num_to_check - 4)) png_error(png_ptr, "Not a PNG file"); + else png_error(png_ptr, "PNG file corrupted by ASCII conversion"); } @@ -231,8 +289,8 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr) } if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) - if (png_ptr->mode & PNG_AFTER_IDAT) - png_ptr->mode |= PNG_HAVE_CHUNK_AFTER_IDAT; + if (png_ptr->mode & PNG_AFTER_IDAT) + png_ptr->mode |= PNG_HAVE_CHUNK_AFTER_IDAT; if (!png_memcmp(png_ptr->chunk_name, png_IHDR, 4)) { @@ -285,7 +343,7 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr) png_error(png_ptr, "Missing IHDR before IDAT"); else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE && - !(png_ptr->mode & PNG_HAVE_PLTE)) + !(png_ptr->mode & PNG_HAVE_PLTE)) png_error(png_ptr, "Missing PLTE before IDAT"); } } @@ -582,32 +640,45 @@ png_push_crc_finish(png_structp png_ptr) { if (png_ptr->skip_length && png_ptr->save_buffer_size) { - png_size_t save_size; + png_size_t save_size = png_ptr->save_buffer_size; + png_uint_32 skip_length = png_ptr->skip_length; + + /* We want the smaller of 'skip_length' and 'save_buffer_size', but + * they are of different types and we don't know which variable has the + * fewest bits. Carefully select the smaller and cast it to the type of + * the larger - this cannot overflow. Do not cast in the following test + * - it will break on either 16 or 64 bit platforms. + */ + if (skip_length < save_size) + save_size = (png_size_t)skip_length; - if (png_ptr->skip_length < (png_uint_32)png_ptr->save_buffer_size) - save_size = (png_size_t)png_ptr->skip_length; else - save_size = png_ptr->save_buffer_size; + skip_length = (png_uint_32)save_size; png_calculate_crc(png_ptr, png_ptr->save_buffer_ptr, save_size); - png_ptr->skip_length -= save_size; + png_ptr->skip_length -= skip_length; png_ptr->buffer_size -= save_size; png_ptr->save_buffer_size -= save_size; png_ptr->save_buffer_ptr += save_size; } if (png_ptr->skip_length && png_ptr->current_buffer_size) { - png_size_t save_size; + png_size_t save_size = png_ptr->current_buffer_size; + png_uint_32 skip_length = png_ptr->skip_length; + + /* We want the smaller of 'skip_length' and 'current_buffer_size', here, + * the same problem exists as above and the same solution. + */ + if (skip_length < save_size) + save_size = (png_size_t)skip_length; - if (png_ptr->skip_length < (png_uint_32)png_ptr->current_buffer_size) - save_size = (png_size_t)png_ptr->skip_length; else - save_size = png_ptr->current_buffer_size; + skip_length = (png_uint_32)save_size; png_calculate_crc(png_ptr, png_ptr->current_buffer_ptr, save_size); - png_ptr->skip_length -= save_size; + png_ptr->skip_length -= skip_length; png_ptr->buffer_size -= save_size; png_ptr->current_buffer_size -= save_size; png_ptr->current_buffer_ptr += save_size; @@ -625,7 +696,7 @@ png_push_crc_finish(png_structp png_ptr) } } -void PNGAPI +void PNGCBAPI png_push_fill_buffer(png_structp png_ptr, png_bytep buffer, png_size_t length) { png_bytep ptr; @@ -640,6 +711,7 @@ png_push_fill_buffer(png_structp png_ptr, png_bytep buffer, png_size_t length) if (length < png_ptr->save_buffer_size) save_size = length; + else save_size = png_ptr->save_buffer_size; @@ -680,33 +752,35 @@ png_push_save_buffer(png_structp png_ptr) istop = png_ptr->save_buffer_size; for (i = 0, sp = png_ptr->save_buffer_ptr, dp = png_ptr->save_buffer; - i < istop; i++, sp++, dp++) + i < istop; i++, sp++, dp++) { *dp = *sp; } } } if (png_ptr->save_buffer_size + png_ptr->current_buffer_size > - png_ptr->save_buffer_max) + png_ptr->save_buffer_max) { png_size_t new_max; png_bytep old_buffer; if (png_ptr->save_buffer_size > PNG_SIZE_MAX - - (png_ptr->current_buffer_size + 256)) + (png_ptr->current_buffer_size + 256)) { - png_error(png_ptr, "Potential overflow of save_buffer"); + png_error(png_ptr, "Potential overflow of save_buffer"); } new_max = png_ptr->save_buffer_size + png_ptr->current_buffer_size + 256; old_buffer = png_ptr->save_buffer; png_ptr->save_buffer = (png_bytep)png_malloc_warn(png_ptr, - (png_size_t)new_max); + (png_size_t)new_max); + if (png_ptr->save_buffer == NULL) { - png_free(png_ptr, old_buffer); - png_error(png_ptr, "Insufficient memory for save_buffer"); + png_free(png_ptr, old_buffer); + png_error(png_ptr, "Insufficient memory for save_buffer"); } + png_memcpy(png_ptr->save_buffer, old_buffer, png_ptr->save_buffer_size); png_free(png_ptr, old_buffer); png_ptr->save_buffer_max = new_max; @@ -755,8 +829,10 @@ png_push_read_IDAT(png_structp png_ptr) if (png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) { png_ptr->process_mode = PNG_READ_CHUNK_MODE; + if (!(png_ptr->flags & PNG_FLAG_ZLIB_FINISHED)) png_error(png_ptr, "Not enough compressed data"); + return; } @@ -764,48 +840,52 @@ png_push_read_IDAT(png_structp png_ptr) } if (png_ptr->idat_size && png_ptr->save_buffer_size) { - png_size_t save_size; + png_size_t save_size = png_ptr->save_buffer_size; + png_uint_32 idat_size = png_ptr->idat_size; - if (png_ptr->idat_size < (png_uint_32)png_ptr->save_buffer_size) - { - save_size = (png_size_t)png_ptr->idat_size; + /* We want the smaller of 'idat_size' and 'current_buffer_size', but they + * are of different types and we don't know which variable has the fewest + * bits. Carefully select the smaller and cast it to the type of the + * larger - this cannot overflow. Do not cast in the following test - it + * will break on either 16 or 64 bit platforms. + */ + if (idat_size < save_size) + save_size = (png_size_t)idat_size; - /* Check for overflow */ - if ((png_uint_32)save_size != png_ptr->idat_size) - png_error(png_ptr, "save_size overflowed in pngpread"); - } else - save_size = png_ptr->save_buffer_size; + idat_size = (png_uint_32)save_size; png_calculate_crc(png_ptr, png_ptr->save_buffer_ptr, save_size); png_process_IDAT_data(png_ptr, png_ptr->save_buffer_ptr, save_size); - png_ptr->idat_size -= save_size; + png_ptr->idat_size -= idat_size; png_ptr->buffer_size -= save_size; png_ptr->save_buffer_size -= save_size; png_ptr->save_buffer_ptr += save_size; } + if (png_ptr->idat_size && png_ptr->current_buffer_size) { - png_size_t save_size; + png_size_t save_size = png_ptr->current_buffer_size; + png_uint_32 idat_size = png_ptr->idat_size; - if (png_ptr->idat_size < (png_uint_32)png_ptr->current_buffer_size) - { - save_size = (png_size_t)png_ptr->idat_size; + /* We want the smaller of 'idat_size' and 'current_buffer_size', but they + * are of different types and we don't know which variable has the fewest + * bits. Carefully select the smaller and cast it to the type of the + * larger - this cannot overflow. + */ + if (idat_size < save_size) + save_size = (png_size_t)idat_size; - /* Check for overflow */ - if ((png_uint_32)save_size != png_ptr->idat_size) - png_error(png_ptr, "save_size overflowed in pngpread"); - } else - save_size = png_ptr->current_buffer_size; + idat_size = (png_uint_32)save_size; png_calculate_crc(png_ptr, png_ptr->current_buffer_ptr, save_size); png_process_IDAT_data(png_ptr, png_ptr->current_buffer_ptr, save_size); - png_ptr->idat_size -= save_size; + png_ptr->idat_size -= idat_size; png_ptr->buffer_size -= save_size; png_ptr->current_buffer_size -= save_size; png_ptr->current_buffer_ptr += save_size; @@ -843,12 +923,12 @@ png_process_IDAT_data(png_structp png_ptr, png_bytep buffer, * or the stream marked as finished. */ while (png_ptr->zstream.avail_in > 0 && - !(png_ptr->flags & PNG_FLAG_ZLIB_FINISHED)) + !(png_ptr->flags & PNG_FLAG_ZLIB_FINISHED)) { int ret; /* We have data for zlib, but we must check that zlib - * has somewhere to put the results. It doesn't matter + * has someplace to put the results. It doesn't matter * if we don't expect any results -- it may be the input * data is just the LZ end code. */ @@ -857,64 +937,67 @@ png_process_IDAT_data(png_structp png_ptr, png_bytep buffer, png_ptr->zstream.avail_out = (uInt) PNG_ROWBYTES(png_ptr->pixel_depth, png_ptr->iwidth) + 1; + png_ptr->zstream.next_out = png_ptr->row_buf; } /* Using Z_SYNC_FLUSH here means that an unterminated - * LZ stream can still be handled (a stream with a missing - * end code), otherwise (Z_NO_FLUSH) a future zlib - * implementation might defer output and, therefore, - * change the current behavior. (See comments in inflate.c - * for why this doesn't happen at present with zlib 1.2.5.) + * LZ stream (a stream with a missing end code) can still + * be handled, otherwise (Z_NO_FLUSH) a future zlib + * implementation might defer output and therefore + * change the current behavior (see comments in inflate.c + * for why this doesn't happen at present with zlib 1.2.5). */ ret = inflate(&png_ptr->zstream, Z_SYNC_FLUSH); /* Check for any failure before proceeding. */ if (ret != Z_OK && ret != Z_STREAM_END) { - /* Terminate the decompression. */ - png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED; + /* Terminate the decompression. */ + png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED; /* This may be a truncated stream (missing or - * damaged end code). Treat that as a warning. - */ + * damaged end code). Treat that as a warning. + */ if (png_ptr->row_number >= png_ptr->num_rows || - png_ptr->pass > 6) - png_warning(png_ptr, "Truncated compressed data in IDAT"); - else - png_error(png_ptr, "Decompression error in IDAT"); + png_ptr->pass > 6) + png_warning(png_ptr, "Truncated compressed data in IDAT"); - /* Skip the check on unprocessed input */ + else + png_error(png_ptr, "Decompression error in IDAT"); + + /* Skip the check on unprocessed input */ return; } /* Did inflate output any data? */ if (png_ptr->zstream.next_out != png_ptr->row_buf) { - /* Is this unexpected data after the last row? - * If it is, artificially terminate the LZ output - * here. - */ + /* Is this unexpected data after the last row? + * If it is, artificially terminate the LZ output + * here. + */ if (png_ptr->row_number >= png_ptr->num_rows || - png_ptr->pass > 6) + png_ptr->pass > 6) { - /* Extra data. */ - png_warning(png_ptr, "Extra compressed data in IDAT"); + /* Extra data. */ + png_warning(png_ptr, "Extra compressed data in IDAT"); png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED; - /* Do no more processing; skip the unprocessed - * input check below. - */ - return; - } - /* Do we have a complete row? */ - if (png_ptr->zstream.avail_out == 0) - png_push_process_row(png_ptr); + /* Do no more processing; skip the unprocessed + * input check below. + */ + return; + } + + /* Do we have a complete row? */ + if (png_ptr->zstream.avail_out == 0) + png_push_process_row(png_ptr); } /* And check for the end of the stream. */ if (ret == Z_STREAM_END) - png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED; + png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED; } /* All the data should have been processed, if anything @@ -922,7 +1005,7 @@ png_process_IDAT_data(png_structp png_ptr, png_bytep buffer, * after the zlib end code. */ if (png_ptr->zstream.avail_in > 0) - png_warning(png_ptr, "Extra compression data"); + png_warning(png_ptr, "Extra compression data in IDAT"); } void /* PRIVATE */ @@ -943,7 +1026,7 @@ png_push_process_row(png_structp png_ptr) png_memcpy(png_ptr->prev_row, png_ptr->row_buf, png_ptr->rowbytes + 1); - if (png_ptr->transformations || (png_ptr->flags&PNG_FLAG_STRIP_ALPHA)) + if (png_ptr->transformations) png_do_read_transformations(png_ptr); #ifdef PNG_READ_INTERLACING_SUPPORTED @@ -988,7 +1071,7 @@ png_push_process_row(png_structp png_ptr) if (png_ptr->pass == 6 && png_ptr->height <= 4) { - png_push_have_row(png_ptr, NULL); + png_push_have_row(png_ptr, NULL); png_read_push_finish_row(png_ptr); } @@ -1028,7 +1111,7 @@ png_push_process_row(png_structp png_ptr) for (i = 0; i < 4 && png_ptr->pass == 2; i++) { - png_push_have_row(png_ptr, NULL); + png_push_have_row(png_ptr, NULL); png_read_push_finish_row(png_ptr); } @@ -1078,13 +1161,13 @@ png_push_process_row(png_structp png_ptr) for (i = 0; i < 2 && png_ptr->pass == 4; i++) { - png_push_have_row(png_ptr, NULL); + png_push_have_row(png_ptr, NULL); png_read_push_finish_row(png_ptr); } if (png_ptr->pass == 6) /* Pass 5 might be empty */ { - png_push_have_row(png_ptr, NULL); + png_push_have_row(png_ptr, NULL); png_read_push_finish_row(png_ptr); } @@ -1103,12 +1186,14 @@ png_push_process_row(png_structp png_ptr) if (png_ptr->pass == 6) /* Skip top generated row */ { - png_push_have_row(png_ptr, NULL); + png_push_have_row(png_ptr, NULL); png_read_push_finish_row(png_ptr); } break; } + + default: case 6: { png_push_have_row(png_ptr, png_ptr->row_buf + 1); @@ -1117,7 +1202,7 @@ png_push_process_row(png_structp png_ptr) if (png_ptr->pass != 6) break; - png_push_have_row(png_ptr, NULL); + png_push_have_row(png_ptr, NULL); png_read_push_finish_row(png_ptr); } } @@ -1160,15 +1245,15 @@ png_read_push_finish_row(png_structp png_ptr) if (png_ptr->interlaced) { png_ptr->row_number = 0; - png_memset(png_ptr->prev_row, 0, - png_ptr->rowbytes + 1); + png_memset(png_ptr->prev_row, 0, png_ptr->rowbytes + 1); + do { png_ptr->pass++; if ((png_ptr->pass == 1 && png_ptr->width < 5) || (png_ptr->pass == 3 && png_ptr->width < 3) || (png_ptr->pass == 5 && png_ptr->width < 2)) - png_ptr->pass++; + png_ptr->pass++; if (png_ptr->pass > 7) png_ptr->pass--; @@ -1177,17 +1262,17 @@ png_read_push_finish_row(png_structp png_ptr) break; png_ptr->iwidth = (png_ptr->width + - png_pass_inc[png_ptr->pass] - 1 - - png_pass_start[png_ptr->pass]) / - png_pass_inc[png_ptr->pass]; + png_pass_inc[png_ptr->pass] - 1 - + png_pass_start[png_ptr->pass]) / + png_pass_inc[png_ptr->pass]; if (png_ptr->transformations & PNG_INTERLACE) break; png_ptr->num_rows = (png_ptr->height + - png_pass_yinc[png_ptr->pass] - 1 - - png_pass_ystart[png_ptr->pass]) / - png_pass_yinc[png_ptr->pass]; + png_pass_yinc[png_ptr->pass] - 1 - + png_pass_ystart[png_ptr->pass]) / + png_pass_yinc[png_ptr->pass]; } while (png_ptr->iwidth == 0 || png_ptr->num_rows == 0); } @@ -1197,12 +1282,13 @@ png_read_push_finish_row(png_structp png_ptr) #ifdef PNG_READ_tEXt_SUPPORTED void /* PRIVATE */ png_push_handle_tEXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 - length) + length) { if (!(png_ptr->mode & PNG_HAVE_IHDR) || (png_ptr->mode & PNG_HAVE_IEND)) { + PNG_UNUSED(info_ptr) /* To quiet some compiler warnings */ png_error(png_ptr, "Out of place tEXt"); - info_ptr = info_ptr; /* To quiet some compiler warnings */ + /*NOT REACHED*/ } #ifdef PNG_MAX_MALLOC_64K @@ -1217,7 +1303,7 @@ png_push_handle_tEXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 #endif png_ptr->current_text = (png_charp)png_malloc(png_ptr, - (png_size_t)(length + 1)); + (png_size_t)(length + 1)); png_ptr->current_text[length] = '\0'; png_ptr->current_text_ptr = png_ptr->current_text; png_ptr->current_text_size = (png_size_t)length; @@ -1270,14 +1356,12 @@ png_push_read_tEXt(png_structp png_ptr, png_infop info_ptr) if (text < key + png_ptr->current_text_size) text++; - text_ptr = (png_textp)png_malloc(png_ptr, - png_sizeof(png_text)); + text_ptr = (png_textp)png_malloc(png_ptr, png_sizeof(png_text)); text_ptr->compression = PNG_TEXT_COMPRESSION_NONE; text_ptr->key = key; -#ifdef PNG_iTXt_SUPPORTED + text_ptr->itxt_length = 0; text_ptr->lang = NULL; text_ptr->lang_key = NULL; -#endif text_ptr->text = text; ret = png_set_text_2(png_ptr, info_ptr, text_ptr, 1); @@ -1287,7 +1371,7 @@ png_push_read_tEXt(png_structp png_ptr, png_infop info_ptr) png_ptr->current_text = NULL; if (ret) - png_warning(png_ptr, "Insufficient memory to store text chunk"); + png_warning(png_ptr, "Insufficient memory to store text chunk"); } } #endif @@ -1298,10 +1382,11 @@ png_push_handle_zTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) { if (!(png_ptr->mode & PNG_HAVE_IHDR) || (png_ptr->mode & PNG_HAVE_IEND)) - { - png_error(png_ptr, "Out of place zTXt"); - info_ptr = info_ptr; /* To quiet some compiler warnings */ - } + { + PNG_UNUSED(info_ptr) /* To quiet some compiler warnings */ + png_error(png_ptr, "Out of place zTXt"); + /*NOT REACHED*/ + } #ifdef PNG_MAX_MALLOC_64K /* We can't handle zTXt chunks > 64K, since we don't have enough space @@ -1317,7 +1402,7 @@ png_push_handle_zTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 #endif png_ptr->current_text = (png_charp)png_malloc(png_ptr, - (png_size_t)(length + 1)); + (png_size_t)(length + 1)); png_ptr->current_text[length] = '\0'; png_ptr->current_text_ptr = png_ptr->current_text; png_ptr->current_text_size = (png_size_t)length; @@ -1382,9 +1467,9 @@ png_push_read_zTXt(png_structp png_ptr, png_infop info_ptr) text++; - png_ptr->zstream.next_in = (png_bytep )text; + png_ptr->zstream.next_in = (png_bytep)text; png_ptr->zstream.avail_in = (uInt)(png_ptr->current_text_size - - (text - key)); + (text - key)); png_ptr->zstream.next_out = png_ptr->zbuf; png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; @@ -1405,42 +1490,45 @@ png_push_read_zTXt(png_structp png_ptr, png_infop info_ptr) png_free(png_ptr, text); return; } + if (!(png_ptr->zstream.avail_out) || ret == Z_STREAM_END) { if (text == NULL) { text = (png_charp)png_malloc(png_ptr, - (png_ptr->zbuf_size - - png_ptr->zstream.avail_out + key_size + 1)); + (png_ptr->zbuf_size + - png_ptr->zstream.avail_out + key_size + 1)); png_memcpy(text + key_size, png_ptr->zbuf, - png_ptr->zbuf_size - png_ptr->zstream.avail_out); + png_ptr->zbuf_size - png_ptr->zstream.avail_out); png_memcpy(text, key, key_size); text_size = key_size + png_ptr->zbuf_size - - png_ptr->zstream.avail_out; + png_ptr->zstream.avail_out; *(text + text_size) = '\0'; } + else { png_charp tmp; tmp = text; text = (png_charp)png_malloc(png_ptr, text_size + - (png_ptr->zbuf_size - - png_ptr->zstream.avail_out + 1)); + (png_ptr->zbuf_size + - png_ptr->zstream.avail_out + 1)); png_memcpy(text, tmp, text_size); png_free(png_ptr, tmp); png_memcpy(text + text_size, png_ptr->zbuf, - png_ptr->zbuf_size - png_ptr->zstream.avail_out); + png_ptr->zbuf_size - png_ptr->zstream.avail_out); text_size += png_ptr->zbuf_size - png_ptr->zstream.avail_out; *(text + text_size) = '\0'; } + if (ret != Z_STREAM_END) { png_ptr->zstream.next_out = png_ptr->zbuf; @@ -1476,10 +1564,9 @@ png_push_read_zTXt(png_structp png_ptr, png_infop info_ptr) png_sizeof(png_text)); text_ptr->compression = PNG_TEXT_COMPRESSION_zTXt; text_ptr->key = key; -#ifdef PNG_iTXt_SUPPORTED + text_ptr->itxt_length = 0; text_ptr->lang = NULL; text_ptr->lang_key = NULL; -#endif text_ptr->text = text; ret = png_set_text_2(png_ptr, info_ptr, text_ptr, 1); @@ -1488,7 +1575,7 @@ png_push_read_zTXt(png_structp png_ptr, png_infop info_ptr) png_free(png_ptr, text_ptr); if (ret) - png_warning(png_ptr, "Insufficient memory to store text chunk"); + png_warning(png_ptr, "Insufficient memory to store text chunk"); } } #endif @@ -1496,13 +1583,14 @@ png_push_read_zTXt(png_structp png_ptr, png_infop info_ptr) #ifdef PNG_READ_iTXt_SUPPORTED void /* PRIVATE */ png_push_handle_iTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 - length) + length) { if (!(png_ptr->mode & PNG_HAVE_IHDR) || (png_ptr->mode & PNG_HAVE_IEND)) - { - png_error(png_ptr, "Out of place iTXt"); - info_ptr = info_ptr; /* To quiet some compiler warnings */ - } + { + PNG_UNUSED(info_ptr) /* To quiet some compiler warnings */ + png_error(png_ptr, "Out of place iTXt"); + /*NOT REACHED*/ + } #ifdef PNG_MAX_MALLOC_64K png_ptr->skip_length = 0; /* This may not be necessary */ @@ -1516,7 +1604,7 @@ png_push_handle_iTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 #endif png_ptr->current_text = (png_charp)png_malloc(png_ptr, - (png_size_t)(length + 1)); + (png_size_t)(length + 1)); png_ptr->current_text[length] = '\0'; png_ptr->current_text_ptr = png_ptr->current_text; png_ptr->current_text_size = (png_size_t)length; @@ -1542,6 +1630,7 @@ png_push_read_iTXt(png_structp png_ptr, png_infop info_ptr) png_ptr->current_text_left -= text_size; png_ptr->current_text_ptr += text_size; } + if (!(png_ptr->current_text_left)) { png_textp text_ptr; @@ -1585,15 +1674,15 @@ png_push_read_iTXt(png_structp png_ptr, png_infop info_ptr) if (lang_key < key + png_ptr->current_text_size - 1) { - for (; *text; text++) - /* Empty loop */ ; + for (; *text; text++) + /* Empty loop */ ; } if (text < key + png_ptr->current_text_size) text++; text_ptr = (png_textp)png_malloc(png_ptr, - png_sizeof(png_text)); + png_sizeof(png_text)); text_ptr->compression = comp_flag + 2; text_ptr->key = key; @@ -1620,7 +1709,7 @@ png_push_read_iTXt(png_structp png_ptr, png_infop info_ptr) */ void /* PRIVATE */ png_push_handle_unknown(png_structp png_ptr, png_infop info_ptr, png_uint_32 - length) + length) { png_uint_32 skip = 0; @@ -1628,15 +1717,15 @@ png_push_handle_unknown(png_structp png_ptr, png_infop info_ptr, png_uint_32 { #ifdef PNG_READ_UNKNOWN_CHUNKS_SUPPORTED if (png_handle_as_unknown(png_ptr, png_ptr->chunk_name) != - PNG_HANDLE_CHUNK_ALWAYS + PNG_HANDLE_CHUNK_ALWAYS #ifdef PNG_READ_USER_CHUNKS_SUPPORTED - && png_ptr->read_user_chunk_fn == NULL + && png_ptr->read_user_chunk_fn == NULL #endif - ) + ) #endif png_chunk_error(png_ptr, "unknown critical chunk"); - info_ptr = info_ptr; /* To quiet some compiler warnings */ + PNG_UNUSED(info_ptr) /* To quiet some compiler warnings */ } #ifdef PNG_READ_UNKNOWN_CHUNKS_SUPPORTED @@ -1645,16 +1734,16 @@ png_push_handle_unknown(png_structp png_ptr, png_infop info_ptr, png_uint_32 #ifdef PNG_MAX_MALLOC_64K if (length > (png_uint_32)65535L) { - png_warning(png_ptr, "unknown chunk too large to fit in memory"); - skip = length - (png_uint_32)65535L; - length = (png_uint_32)65535L; + png_warning(png_ptr, "unknown chunk too large to fit in memory"); + skip = length - (png_uint_32)65535L; + length = (png_uint_32)65535L; } #endif png_memcpy((png_charp)png_ptr->unknown_chunk.name, - (png_charp)png_ptr->chunk_name, - png_sizeof(png_ptr->unknown_chunk.name)); + (png_charp)png_ptr->chunk_name, + png_sizeof(png_ptr->unknown_chunk.name)); png_ptr->unknown_chunk.name[png_sizeof(png_ptr->unknown_chunk.name) - 1] - = '\0'; + = '\0'; png_ptr->unknown_chunk.size = (png_size_t)length; @@ -1664,7 +1753,7 @@ png_push_handle_unknown(png_structp png_ptr, png_infop info_ptr, png_uint_32 else { png_ptr->unknown_chunk.data = (png_bytep)png_malloc(png_ptr, - (png_size_t)length); + (png_size_t)length); png_crc_read(png_ptr, (png_bytep)png_ptr->unknown_chunk.data, length); } @@ -1674,7 +1763,7 @@ png_push_handle_unknown(png_structp png_ptr, png_infop info_ptr, png_uint_32 /* Callback to user unknown chunk handler */ int ret; ret = (*(png_ptr->read_user_chunk_fn)) - (png_ptr, &png_ptr->unknown_chunk); + (png_ptr, &png_ptr->unknown_chunk); if (ret < 0) png_chunk_error(png_ptr, "error in user chunk"); @@ -1683,16 +1772,16 @@ png_push_handle_unknown(png_structp png_ptr, png_infop info_ptr, png_uint_32 { if (!(png_ptr->chunk_name[0] & 0x20)) if (png_handle_as_unknown(png_ptr, png_ptr->chunk_name) != - PNG_HANDLE_CHUNK_ALWAYS) + PNG_HANDLE_CHUNK_ALWAYS) png_chunk_error(png_ptr, "unknown critical chunk"); png_set_unknown_chunks(png_ptr, info_ptr, - &png_ptr->unknown_chunk, 1); + &png_ptr->unknown_chunk, 1); } } else #endif - png_set_unknown_chunks(png_ptr, info_ptr, &png_ptr->unknown_chunk, 1); + png_set_unknown_chunks(png_ptr, info_ptr, &png_ptr->unknown_chunk, 1); png_free(png_ptr, png_ptr->unknown_chunk.data); png_ptr->unknown_chunk.data = NULL; } @@ -1726,8 +1815,8 @@ png_push_have_row(png_structp png_ptr, png_bytep row) } void PNGAPI -png_progressive_combine_row (png_structp png_ptr, - png_bytep old_row, png_bytep new_row) +png_progressive_combine_row (png_structp png_ptr, png_bytep old_row, + png_const_bytep new_row) { PNG_CONST int FARDATA png_pass_dsp_mask[7] = {0xff, 0x0f, 0xff, 0x33, 0xff, 0x55, 0xff}; @@ -1741,8 +1830,8 @@ png_progressive_combine_row (png_structp png_ptr, void PNGAPI png_set_progressive_read_fn(png_structp png_ptr, png_voidp progressive_ptr, - png_progressive_info_ptr info_fn, png_progressive_row_ptr row_fn, - png_progressive_end_ptr end_fn) + png_progressive_info_ptr info_fn, png_progressive_row_ptr row_fn, + png_progressive_end_ptr end_fn) { if (png_ptr == NULL) return; @@ -1755,7 +1844,7 @@ png_set_progressive_read_fn(png_structp png_ptr, png_voidp progressive_ptr, } png_voidp PNGAPI -png_get_progressive_ptr(png_structp png_ptr) +png_get_progressive_ptr(png_const_structp png_ptr) { if (png_ptr == NULL) return (NULL); diff --git a/reactos/dll/3rdparty/libpng/pngread.c b/reactos/dll/3rdparty/libpng/pngread.c index 92060d2bc6c..aa84001c452 100644 --- a/reactos/dll/3rdparty/libpng/pngread.c +++ b/reactos/dll/3rdparty/libpng/pngread.c @@ -1,8 +1,8 @@ /* pngread.c - read a PNG file * - * Last changed in libpng 1.4.1 [February 25, 2010] - * Copyright (c) 1998-2010 Glenn Randers-Pehrson + * Last changed in libpng 1.5.2 [March 31, 2011] + * Copyright (c) 1998-2011 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * @@ -14,30 +14,28 @@ * read a PNG file or stream. */ -#define PNG_NO_PEDANTIC_WARNINGS -#include "png.h" -#ifdef PNG_READ_SUPPORTED #include "pngpriv.h" +#ifdef PNG_READ_SUPPORTED /* Create a PNG structure for reading, and allocate any memory needed. */ -png_structp PNGAPI -png_create_read_struct(png_const_charp user_png_ver, png_voidp error_ptr, - png_error_ptr error_fn, png_error_ptr warn_fn) +PNG_FUNCTION(png_structp,PNGAPI +png_create_read_struct,(png_const_charp user_png_ver, png_voidp error_ptr, + png_error_ptr error_fn, png_error_ptr warn_fn),PNG_ALLOCATED) { #ifdef PNG_USER_MEM_SUPPORTED return (png_create_read_struct_2(user_png_ver, error_ptr, error_fn, - warn_fn, NULL, NULL, NULL)); + warn_fn, NULL, NULL, NULL)); } /* Alternate create PNG structure for reading, and allocate any memory * needed. */ -png_structp PNGAPI -png_create_read_struct_2(png_const_charp user_png_ver, png_voidp error_ptr, - png_error_ptr error_fn, png_error_ptr warn_fn, png_voidp mem_ptr, - png_malloc_ptr malloc_fn, png_free_ptr free_fn) +PNG_FUNCTION(png_structp,PNGAPI +png_create_read_struct_2,(png_const_charp user_png_ver, png_voidp error_ptr, + png_error_ptr error_fn, png_error_ptr warn_fn, png_voidp mem_ptr, + png_malloc_ptr malloc_fn, png_free_ptr free_fn),PNG_ALLOCATED) { #endif /* PNG_USER_MEM_SUPPORTED */ @@ -49,7 +47,7 @@ png_create_read_struct_2(png_const_charp user_png_ver, png_voidp error_ptr, #ifdef PNG_SETJMP_SUPPORTED #ifdef USE_FAR_KEYWORD - jmp_buf jmpbuf; + jmp_buf png_jmpbuf; #endif #endif @@ -59,7 +57,7 @@ png_create_read_struct_2(png_const_charp user_png_ver, png_voidp error_ptr, #ifdef PNG_USER_MEM_SUPPORTED png_ptr = (png_structp)png_create_struct_2(PNG_STRUCT_PNG, - malloc_fn, mem_ptr); + malloc_fn, mem_ptr); #else png_ptr = (png_structp)png_create_struct(PNG_STRUCT_PNG); #endif @@ -70,10 +68,12 @@ png_create_read_struct_2(png_const_charp user_png_ver, png_voidp error_ptr, #ifdef PNG_USER_LIMITS_SUPPORTED png_ptr->user_width_max = PNG_USER_WIDTH_MAX; png_ptr->user_height_max = PNG_USER_HEIGHT_MAX; + # ifdef PNG_USER_CHUNK_CACHE_MAX /* Added at libpng-1.2.43 and 1.4.0 */ png_ptr->user_chunk_cache_max = PNG_USER_CHUNK_CACHE_MAX; # endif + # ifdef PNG_SET_USER_CHUNK_MALLOC_MAX /* Added at libpng-1.2.43 and 1.4.1 */ png_ptr->user_chunk_malloc_max = PNG_USER_CHUNK_MALLOC_MAX; @@ -85,13 +85,13 @@ png_create_read_struct_2(png_const_charp user_png_ver, png_voidp error_ptr, encounter a png_error() will longjmp here. Since the jmpbuf is then meaningless we abort instead of returning. */ #ifdef USE_FAR_KEYWORD - if (setjmp(jmpbuf)) + if (setjmp(png_jmpbuf)) #else if (setjmp(png_jmpbuf(png_ptr))) /* Sets longjmp to match setjmp */ #endif PNG_ABORT(); #ifdef USE_FAR_KEYWORD - png_memcpy(png_jmpbuf(png_ptr), jmpbuf, png_sizeof(jmp_buf)); + png_memcpy(png_jmpbuf(png_ptr), png_jmpbuf, png_sizeof(jmp_buf)); #endif #endif /* PNG_SETJMP_SUPPORTED */ @@ -104,46 +104,47 @@ png_create_read_struct_2(png_const_charp user_png_ver, png_voidp error_ptr, if (user_png_ver) { i = 0; + do { if (user_png_ver[i] != png_libpng_ver[i]) png_ptr->flags |= PNG_FLAG_LIBRARY_MISMATCH; } while (png_libpng_ver[i++]); - } - else - png_ptr->flags |= PNG_FLAG_LIBRARY_MISMATCH; + } + + else + png_ptr->flags |= PNG_FLAG_LIBRARY_MISMATCH; - if (png_ptr->flags & PNG_FLAG_LIBRARY_MISMATCH) - { - /* Libpng 0.90 and later are binary incompatible with libpng 0.89, so - * we must recompile any applications that use any older library version. - * For versions after libpng 1.0, we will be compatible, so we need - * only check the first digit. - */ + if (png_ptr->flags & PNG_FLAG_LIBRARY_MISMATCH) + { + /* Libpng 0.90 and later are binary incompatible with libpng 0.89, so + * we must recompile any applications that use any older library version. + * For versions after libpng 1.0, we will be compatible, so we need + * only check the first digit. + */ if (user_png_ver == NULL || user_png_ver[0] != png_libpng_ver[0] || (user_png_ver[0] == '1' && user_png_ver[2] != png_libpng_ver[2]) || (user_png_ver[0] == '0' && user_png_ver[2] < '9')) { -#ifdef PNG_STDIO_SUPPORTED +#ifdef PNG_CONSOLE_IO_SUPPORTED char msg[80]; if (user_png_ver) { - png_snprintf(msg, 80, - "Application was compiled with png.h from libpng-%.20s", - user_png_ver); - png_warning(png_ptr, msg); + png_snprintf2(msg, 80, + "Application built with libpng-%.20s" + " but running with %.20s", + user_png_ver, + png_libpng_ver); + png_warning(png_ptr, msg); } - png_snprintf(msg, 80, - "Application is running with png.c from libpng-%.20s", - png_libpng_ver); - png_warning(png_ptr, msg); +#else + png_warning(png_ptr, + "Incompatible libpng version in application and library"); #endif #ifdef PNG_ERROR_NUMBERS_SUPPORTED png_ptr->flags = 0; #endif - png_warning(png_ptr, - "Incompatible libpng version in application and library"); png_cleanup_needed = 1; } @@ -153,11 +154,12 @@ png_create_read_struct_2(png_const_charp user_png_ver, png_voidp error_ptr, { /* Initialize zbuf - compression buffer */ png_ptr->zbuf_size = PNG_ZBUF_SIZE; - png_ptr->zbuf = (png_bytep)png_malloc_warn(png_ptr, - png_ptr->zbuf_size); + png_ptr->zbuf = (png_bytep)png_malloc_warn(png_ptr, png_ptr->zbuf_size); + if (png_ptr->zbuf == NULL) - png_cleanup_needed = 1; + png_cleanup_needed = 1; } + png_ptr->zstream.zalloc = png_zalloc; png_ptr->zstream.zfree = png_zfree; png_ptr->zstream.opaque = (voidpf)png_ptr; @@ -166,12 +168,24 @@ png_create_read_struct_2(png_const_charp user_png_ver, png_voidp error_ptr, { switch (inflateInit(&png_ptr->zstream)) { - case Z_OK: /* Do nothing */ break; + case Z_OK: + break; /* Do nothing */ + case Z_MEM_ERROR: - case Z_STREAM_ERROR: png_warning(png_ptr, "zlib memory error"); - png_cleanup_needed = 1; break; - case Z_VERSION_ERROR: png_warning(png_ptr, "zlib version error"); - png_cleanup_needed = 1; break; + png_warning(png_ptr, "zlib memory error"); + png_cleanup_needed = 1; + break; + + case Z_STREAM_ERROR: + png_warning(png_ptr, "zlib stream error"); + png_cleanup_needed = 1; + break; + + case Z_VERSION_ERROR: + png_warning(png_ptr, "zlib version error"); + png_cleanup_needed = 1; + break; + default: png_warning(png_ptr, "Unknown zlib error"); png_cleanup_needed = 1; } @@ -184,7 +198,7 @@ png_create_read_struct_2(png_const_charp user_png_ver, png_voidp error_ptr, png_ptr->zbuf = NULL; #ifdef PNG_USER_MEM_SUPPORTED png_destroy_struct_2((png_voidp)png_ptr, - (png_free_ptr)free_fn, (png_voidp)mem_ptr); + (png_free_ptr)free_fn, (png_voidp)mem_ptr); #else png_destroy_struct((png_voidp)png_ptr); #endif @@ -214,34 +228,12 @@ void PNGAPI png_read_info(png_structp png_ptr, png_infop info_ptr) { png_debug(1, "in png_read_info"); - + if (png_ptr == NULL || info_ptr == NULL) return; - - /* If we haven't checked all of the PNG signature bytes, do so now. */ - if (png_ptr->sig_bytes < 8) - { - png_size_t num_checked = png_ptr->sig_bytes, - num_to_check = 8 - num_checked; -#ifdef PNG_IO_STATE_SUPPORTED - png_ptr->io_state = PNG_IO_READING | PNG_IO_SIGNATURE; -#endif - - png_read_data(png_ptr, &(info_ptr->signature[num_checked]), num_to_check); - png_ptr->sig_bytes = 8; - - if (png_sig_cmp(info_ptr->signature, num_checked, num_to_check)) - { - if (num_checked < 4 && - png_sig_cmp(info_ptr->signature, num_checked, num_to_check - 4)) - png_error(png_ptr, "Not a PNG file"); - else - png_error(png_ptr, "PNG file corrupted by ASCII conversion"); - } - if (num_checked < 3) - png_ptr->mode |= PNG_HAVE_PNG_SIGNATURE; - } + /* Read and check the PNG file signature. */ + png_read_sig(png_ptr, info_ptr); for (;;) { @@ -307,114 +299,141 @@ png_read_info(png_structp png_ptr, png_infop info_ptr) * matching the chunk name rather than a linear search. */ if (!png_memcmp(chunk_name, png_IDAT, 4)) - if (png_ptr->mode & PNG_AFTER_IDAT) - png_ptr->mode |= PNG_HAVE_CHUNK_AFTER_IDAT; + if (png_ptr->mode & PNG_AFTER_IDAT) + png_ptr->mode |= PNG_HAVE_CHUNK_AFTER_IDAT; if (!png_memcmp(chunk_name, png_IHDR, 4)) png_handle_IHDR(png_ptr, info_ptr, length); + else if (!png_memcmp(chunk_name, png_IEND, 4)) png_handle_IEND(png_ptr, info_ptr, length); + #ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED else if (png_handle_as_unknown(png_ptr, chunk_name)) { if (!png_memcmp(chunk_name, png_IDAT, 4)) png_ptr->mode |= PNG_HAVE_IDAT; + png_handle_unknown(png_ptr, info_ptr, length); + if (!png_memcmp(chunk_name, png_PLTE, 4)) png_ptr->mode |= PNG_HAVE_PLTE; + else if (!png_memcmp(chunk_name, png_IDAT, 4)) { if (!(png_ptr->mode & PNG_HAVE_IHDR)) png_error(png_ptr, "Missing IHDR before IDAT"); + else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE && - !(png_ptr->mode & PNG_HAVE_PLTE)) + !(png_ptr->mode & PNG_HAVE_PLTE)) png_error(png_ptr, "Missing PLTE before IDAT"); + break; } } #endif else if (!png_memcmp(chunk_name, png_PLTE, 4)) png_handle_PLTE(png_ptr, info_ptr, length); + else if (!png_memcmp(chunk_name, png_IDAT, 4)) { if (!(png_ptr->mode & PNG_HAVE_IHDR)) png_error(png_ptr, "Missing IHDR before IDAT"); + else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE && - !(png_ptr->mode & PNG_HAVE_PLTE)) + !(png_ptr->mode & PNG_HAVE_PLTE)) png_error(png_ptr, "Missing PLTE before IDAT"); png_ptr->idat_size = length; png_ptr->mode |= PNG_HAVE_IDAT; break; } + #ifdef PNG_READ_bKGD_SUPPORTED else if (!png_memcmp(chunk_name, png_bKGD, 4)) png_handle_bKGD(png_ptr, info_ptr, length); #endif + #ifdef PNG_READ_cHRM_SUPPORTED else if (!png_memcmp(chunk_name, png_cHRM, 4)) png_handle_cHRM(png_ptr, info_ptr, length); #endif + #ifdef PNG_READ_gAMA_SUPPORTED else if (!png_memcmp(chunk_name, png_gAMA, 4)) png_handle_gAMA(png_ptr, info_ptr, length); #endif + #ifdef PNG_READ_hIST_SUPPORTED else if (!png_memcmp(chunk_name, png_hIST, 4)) png_handle_hIST(png_ptr, info_ptr, length); #endif + #ifdef PNG_READ_oFFs_SUPPORTED else if (!png_memcmp(chunk_name, png_oFFs, 4)) png_handle_oFFs(png_ptr, info_ptr, length); #endif + #ifdef PNG_READ_pCAL_SUPPORTED else if (!png_memcmp(chunk_name, png_pCAL, 4)) png_handle_pCAL(png_ptr, info_ptr, length); #endif + #ifdef PNG_READ_sCAL_SUPPORTED else if (!png_memcmp(chunk_name, png_sCAL, 4)) png_handle_sCAL(png_ptr, info_ptr, length); #endif + #ifdef PNG_READ_pHYs_SUPPORTED else if (!png_memcmp(chunk_name, png_pHYs, 4)) png_handle_pHYs(png_ptr, info_ptr, length); #endif + #ifdef PNG_READ_sBIT_SUPPORTED else if (!png_memcmp(chunk_name, png_sBIT, 4)) png_handle_sBIT(png_ptr, info_ptr, length); #endif + #ifdef PNG_READ_sRGB_SUPPORTED else if (!png_memcmp(chunk_name, png_sRGB, 4)) png_handle_sRGB(png_ptr, info_ptr, length); #endif + #ifdef PNG_READ_iCCP_SUPPORTED else if (!png_memcmp(chunk_name, png_iCCP, 4)) png_handle_iCCP(png_ptr, info_ptr, length); #endif + #ifdef PNG_READ_sPLT_SUPPORTED else if (!png_memcmp(chunk_name, png_sPLT, 4)) png_handle_sPLT(png_ptr, info_ptr, length); #endif + #ifdef PNG_READ_tEXt_SUPPORTED else if (!png_memcmp(chunk_name, png_tEXt, 4)) png_handle_tEXt(png_ptr, info_ptr, length); #endif + #ifdef PNG_READ_tIME_SUPPORTED else if (!png_memcmp(chunk_name, png_tIME, 4)) png_handle_tIME(png_ptr, info_ptr, length); #endif + #ifdef PNG_READ_tRNS_SUPPORTED else if (!png_memcmp(chunk_name, png_tRNS, 4)) png_handle_tRNS(png_ptr, info_ptr, length); #endif + #ifdef PNG_READ_zTXt_SUPPORTED else if (!png_memcmp(chunk_name, png_zTXt, 4)) png_handle_zTXt(png_ptr, info_ptr, length); #endif + #ifdef PNG_READ_iTXt_SUPPORTED else if (!png_memcmp(chunk_name, png_iTXt, 4)) png_handle_iTXt(png_ptr, info_ptr, length); #endif + else png_handle_unknown(png_ptr, info_ptr, length); } @@ -426,14 +445,17 @@ void PNGAPI png_read_update_info(png_structp png_ptr, png_infop info_ptr) { png_debug(1, "in png_read_update_info"); - + if (png_ptr == NULL) return; + if (!(png_ptr->flags & PNG_FLAG_ROW_INIT)) png_read_start_row(png_ptr); + else png_warning(png_ptr, - "Ignoring extra png_read_update_info() call; row buffer not reallocated"); + "Ignoring extra png_read_update_info() call;" + " row buffer not reallocated"); png_read_transform_info(png_ptr, info_ptr); } @@ -448,11 +470,16 @@ void PNGAPI png_start_read_image(png_structp png_ptr) { png_debug(1, "in png_start_read_image"); - + if (png_ptr == NULL) return; + if (!(png_ptr->flags & PNG_FLAG_ROW_INIT)) png_read_start_row(png_ptr); + else + png_warning(png_ptr, + "Ignoring extra png_start_read_image() call;" + " row buffer not reallocated"); } #endif /* PNG_SEQUENTIAL_READ_SUPPORTED */ @@ -461,19 +488,22 @@ void PNGAPI png_read_row(png_structp png_ptr, png_bytep row, png_bytep dsp_row) { PNG_IDAT; +#ifdef PNG_READ_INTERLACING_SUPPORTED PNG_CONST int png_pass_dsp_mask[7] = {0xff, 0x0f, 0xff, 0x33, 0xff, 0x55, - 0xff}; + 0xff}; PNG_CONST int png_pass_mask[7] = {0x80, 0x08, 0x88, 0x22, 0xaa, 0x55, 0xff}; +#endif int ret; - + if (png_ptr == NULL) return; - + png_debug2(1, "in png_read_row (row %lu, pass %d)", - (unsigned long) png_ptr->row_number, png_ptr->pass); + (unsigned long)png_ptr->row_number, png_ptr->pass); if (!(png_ptr->flags & PNG_FLAG_ROW_INIT)) png_read_start_row(png_ptr); + if (png_ptr->row_number == 0 && png_ptr->pass == 0) { /* Check for transforms that have been set but were defined out */ @@ -481,27 +511,33 @@ png_read_row(png_structp png_ptr, png_bytep row, png_bytep dsp_row) if (png_ptr->transformations & PNG_INVERT_MONO) png_warning(png_ptr, "PNG_READ_INVERT_SUPPORTED is not defined"); #endif + #if defined(PNG_WRITE_FILLER_SUPPORTED) && !defined(PNG_READ_FILLER_SUPPORTED) if (png_ptr->transformations & PNG_FILLER) png_warning(png_ptr, "PNG_READ_FILLER_SUPPORTED is not defined"); #endif + #if defined(PNG_WRITE_PACKSWAP_SUPPORTED) && \ !defined(PNG_READ_PACKSWAP_SUPPORTED) if (png_ptr->transformations & PNG_PACKSWAP) png_warning(png_ptr, "PNG_READ_PACKSWAP_SUPPORTED is not defined"); #endif + #if defined(PNG_WRITE_PACK_SUPPORTED) && !defined(PNG_READ_PACK_SUPPORTED) if (png_ptr->transformations & PNG_PACK) png_warning(png_ptr, "PNG_READ_PACK_SUPPORTED is not defined"); #endif + #if defined(PNG_WRITE_SHIFT_SUPPORTED) && !defined(PNG_READ_SHIFT_SUPPORTED) if (png_ptr->transformations & PNG_SHIFT) png_warning(png_ptr, "PNG_READ_SHIFT_SUPPORTED is not defined"); #endif + #if defined(PNG_WRITE_BGR_SUPPORTED) && !defined(PNG_READ_BGR_SUPPORTED) if (png_ptr->transformations & PNG_BGR) png_warning(png_ptr, "PNG_READ_BGR_SUPPORTED is not defined"); #endif + #if defined(PNG_WRITE_SWAP_SUPPORTED) && !defined(PNG_READ_SWAP_SUPPORTED) if (png_ptr->transformations & PNG_SWAP_BYTES) png_warning(png_ptr, "PNG_READ_SWAP_SUPPORTED is not defined"); @@ -524,42 +560,50 @@ png_read_row(png_structp png_ptr, png_bytep row, png_bytep dsp_row) return; } break; + case 1: if ((png_ptr->row_number & 0x07) || png_ptr->width < 5) { if (dsp_row != NULL) png_combine_row(png_ptr, dsp_row, - png_pass_dsp_mask[png_ptr->pass]); + png_pass_dsp_mask[png_ptr->pass]); + png_read_finish_row(png_ptr); return; } break; + case 2: if ((png_ptr->row_number & 0x07) != 4) { if (dsp_row != NULL && (png_ptr->row_number & 4)) png_combine_row(png_ptr, dsp_row, - png_pass_dsp_mask[png_ptr->pass]); + png_pass_dsp_mask[png_ptr->pass]); + png_read_finish_row(png_ptr); return; } break; + case 3: if ((png_ptr->row_number & 3) || png_ptr->width < 3) { if (dsp_row != NULL) png_combine_row(png_ptr, dsp_row, - png_pass_dsp_mask[png_ptr->pass]); + png_pass_dsp_mask[png_ptr->pass]); + png_read_finish_row(png_ptr); return; } break; + case 4: if ((png_ptr->row_number & 3) != 2) { if (dsp_row != NULL && (png_ptr->row_number & 2)) png_combine_row(png_ptr, dsp_row, - png_pass_dsp_mask[png_ptr->pass]); + png_pass_dsp_mask[png_ptr->pass]); + png_read_finish_row(png_ptr); return; } @@ -569,11 +613,14 @@ png_read_row(png_structp png_ptr, png_bytep row, png_bytep dsp_row) { if (dsp_row != NULL) png_combine_row(png_ptr, dsp_row, - png_pass_dsp_mask[png_ptr->pass]); + png_pass_dsp_mask[png_ptr->pass]); + png_read_finish_row(png_ptr); return; } break; + + default: case 6: if (!(png_ptr->row_number & 1)) { @@ -592,6 +639,7 @@ png_read_row(png_structp png_ptr, png_bytep row, png_bytep dsp_row) png_ptr->zstream.avail_out = (uInt)(PNG_ROWBYTES(png_ptr->pixel_depth, png_ptr->iwidth) + 1); + do { if (!(png_ptr->zstream.avail_in)) @@ -609,10 +657,12 @@ png_read_row(png_structp png_ptr, png_bytep row, png_bytep dsp_row) if (png_ptr->zbuf_size > png_ptr->idat_size) png_ptr->zstream.avail_in = (uInt)png_ptr->idat_size; png_crc_read(png_ptr, png_ptr->zbuf, - (png_size_t)png_ptr->zstream.avail_in); + (png_size_t)png_ptr->zstream.avail_in); png_ptr->idat_size -= png_ptr->zstream.avail_in; } + ret = inflate(&png_ptr->zstream, Z_PARTIAL_FLUSH); + if (ret == Z_STREAM_END) { if (png_ptr->zstream.avail_out || png_ptr->zstream.avail_in || @@ -622,9 +672,10 @@ png_read_row(png_structp png_ptr, png_bytep row, png_bytep dsp_row) png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED; break; } + if (ret != Z_OK) png_error(png_ptr, png_ptr->zstream.msg ? png_ptr->zstream.msg : - "Decompression error"); + "Decompression error"); } while (png_ptr->zstream.avail_out); @@ -638,14 +689,14 @@ png_read_row(png_structp png_ptr, png_bytep row, png_bytep dsp_row) if (png_ptr->row_buf[0]) png_read_filter_row(png_ptr, &(png_ptr->row_info), - png_ptr->row_buf + 1, png_ptr->prev_row + 1, - (int)(png_ptr->row_buf[0])); + png_ptr->row_buf + 1, png_ptr->prev_row + 1, + (int)(png_ptr->row_buf[0])); png_memcpy(png_ptr->prev_row, png_ptr->row_buf, png_ptr->rowbytes + 1); #ifdef PNG_MNG_FEATURES_SUPPORTED if ((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) && - (png_ptr->filter_type == PNG_INTRAPIXEL_DIFFERENCING)) + (png_ptr->filter_type == PNG_INTRAPIXEL_DIFFERENCING)) { /* Intrapixel differencing */ png_do_read_intrapixel(&(png_ptr->row_info), png_ptr->row_buf + 1); @@ -653,7 +704,7 @@ png_read_row(png_structp png_ptr, png_bytep row, png_bytep dsp_row) #endif - if (png_ptr->transformations || (png_ptr->flags&PNG_FLAG_STRIP_ALPHA)) + if (png_ptr->transformations) png_do_read_transformations(png_ptr); #ifdef PNG_READ_INTERLACING_SUPPORTED @@ -669,17 +720,18 @@ png_read_row(png_structp png_ptr, png_bytep row, png_bytep dsp_row) png_do_read_interlace(png_ptr); if (dsp_row != NULL) - png_combine_row(png_ptr, dsp_row, - png_pass_dsp_mask[png_ptr->pass]); + png_combine_row(png_ptr, dsp_row, png_pass_dsp_mask[png_ptr->pass]); + if (row != NULL) - png_combine_row(png_ptr, row, - png_pass_mask[png_ptr->pass]); + png_combine_row(png_ptr, row, png_pass_mask[png_ptr->pass]); } + else #endif { if (row != NULL) png_combine_row(png_ptr, row, 0xff); + if (dsp_row != NULL) png_combine_row(png_ptr, dsp_row, 0xff); } @@ -717,16 +769,17 @@ png_read_row(png_structp png_ptr, png_bytep row, png_bytep dsp_row) void PNGAPI png_read_rows(png_structp png_ptr, png_bytepp row, - png_bytepp display_row, png_uint_32 num_rows) + png_bytepp display_row, png_uint_32 num_rows) { png_uint_32 i; png_bytepp rp; png_bytepp dp; png_debug(1, "in png_read_rows"); - + if (png_ptr == NULL) return; + rp = row; dp = display_row; if (rp != NULL && dp != NULL) @@ -737,6 +790,7 @@ png_read_rows(png_structp png_ptr, png_bytepp row, png_read_row(png_ptr, rptr, dptr); } + else if (rp != NULL) for (i = 0; i < num_rows; i++) { @@ -744,6 +798,7 @@ png_read_rows(png_structp png_ptr, png_bytepp row, png_read_row(png_ptr, rptr, NULL); rp++; } + else if (dp != NULL) for (i = 0; i < num_rows; i++) { @@ -775,22 +830,45 @@ png_read_image(png_structp png_ptr, png_bytepp image) png_bytepp rp; png_debug(1, "in png_read_image"); - + if (png_ptr == NULL) return; #ifdef PNG_READ_INTERLACING_SUPPORTED - pass = png_set_interlace_handling(png_ptr); + if (!(png_ptr->flags & PNG_FLAG_ROW_INIT)) + { + pass = png_set_interlace_handling(png_ptr); + /* And make sure transforms are initialized. */ + png_start_read_image(png_ptr); + } + else + { + if (png_ptr->interlaced && !(png_ptr->transformations & PNG_INTERLACE)) + { + /* Caller called png_start_read_image or png_read_update_info without + * first turning on the PNG_INTERLACE transform. We can fix this here, + * but the caller should do it! + */ + png_warning(png_ptr, "Interlace handling should be turned on when " + "using png_read_image"); + /* Make sure this is set correctly */ + png_ptr->num_rows = png_ptr->height; + } + + /* Obtain the pass number, which also turns on the PNG_INTERLACE flag in + * the above error case. + */ + pass = png_set_interlace_handling(png_ptr); + } #else if (png_ptr->interlaced) png_error(png_ptr, - "Cannot read interlaced image -- interlace handler disabled"); + "Cannot read interlaced image -- interlace handler disabled"); + pass = 1; #endif - image_height=png_ptr->height; - png_ptr->num_rows = image_height; /* Make sure this is set correctly */ for (j = 0; j < pass; j++) { @@ -813,9 +891,10 @@ void PNGAPI png_read_end(png_structp png_ptr, png_infop info_ptr) { png_debug(1, "in png_read_end"); - + if (png_ptr == NULL) return; + png_crc_finish(png_ptr, 0); /* Finish off CRC from last IDAT chunk */ do @@ -880,8 +959,10 @@ png_read_end(png_structp png_ptr, png_infop info_ptr) if (!png_memcmp(chunk_name, png_IHDR, 4)) png_handle_IHDR(png_ptr, info_ptr, length); + else if (!png_memcmp(chunk_name, png_IEND, 4)) png_handle_IEND(png_ptr, info_ptr, length); + #ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED else if (png_handle_as_unknown(png_ptr, chunk_name)) { @@ -895,6 +976,7 @@ png_read_end(png_structp png_ptr, png_infop info_ptr) png_ptr->mode |= PNG_HAVE_PLTE; } #endif + else if (!png_memcmp(chunk_name, png_IDAT, 4)) { /* Zero length IDATs are legal after the last IDAT has been @@ -902,78 +984,97 @@ png_read_end(png_structp png_ptr, png_infop info_ptr) */ if ((length > 0) || (png_ptr->mode & PNG_HAVE_CHUNK_AFTER_IDAT)) png_benign_error(png_ptr, "Too many IDATs found"); + png_crc_finish(png_ptr, length); } else if (!png_memcmp(chunk_name, png_PLTE, 4)) png_handle_PLTE(png_ptr, info_ptr, length); + #ifdef PNG_READ_bKGD_SUPPORTED else if (!png_memcmp(chunk_name, png_bKGD, 4)) png_handle_bKGD(png_ptr, info_ptr, length); #endif + #ifdef PNG_READ_cHRM_SUPPORTED else if (!png_memcmp(chunk_name, png_cHRM, 4)) png_handle_cHRM(png_ptr, info_ptr, length); #endif + #ifdef PNG_READ_gAMA_SUPPORTED else if (!png_memcmp(chunk_name, png_gAMA, 4)) png_handle_gAMA(png_ptr, info_ptr, length); #endif + #ifdef PNG_READ_hIST_SUPPORTED else if (!png_memcmp(chunk_name, png_hIST, 4)) png_handle_hIST(png_ptr, info_ptr, length); #endif + #ifdef PNG_READ_oFFs_SUPPORTED else if (!png_memcmp(chunk_name, png_oFFs, 4)) png_handle_oFFs(png_ptr, info_ptr, length); #endif + #ifdef PNG_READ_pCAL_SUPPORTED else if (!png_memcmp(chunk_name, png_pCAL, 4)) png_handle_pCAL(png_ptr, info_ptr, length); #endif + #ifdef PNG_READ_sCAL_SUPPORTED else if (!png_memcmp(chunk_name, png_sCAL, 4)) png_handle_sCAL(png_ptr, info_ptr, length); #endif + #ifdef PNG_READ_pHYs_SUPPORTED else if (!png_memcmp(chunk_name, png_pHYs, 4)) png_handle_pHYs(png_ptr, info_ptr, length); #endif + #ifdef PNG_READ_sBIT_SUPPORTED else if (!png_memcmp(chunk_name, png_sBIT, 4)) png_handle_sBIT(png_ptr, info_ptr, length); #endif + #ifdef PNG_READ_sRGB_SUPPORTED else if (!png_memcmp(chunk_name, png_sRGB, 4)) png_handle_sRGB(png_ptr, info_ptr, length); #endif + #ifdef PNG_READ_iCCP_SUPPORTED else if (!png_memcmp(chunk_name, png_iCCP, 4)) png_handle_iCCP(png_ptr, info_ptr, length); #endif + #ifdef PNG_READ_sPLT_SUPPORTED else if (!png_memcmp(chunk_name, png_sPLT, 4)) png_handle_sPLT(png_ptr, info_ptr, length); #endif + #ifdef PNG_READ_tEXt_SUPPORTED else if (!png_memcmp(chunk_name, png_tEXt, 4)) png_handle_tEXt(png_ptr, info_ptr, length); #endif + #ifdef PNG_READ_tIME_SUPPORTED else if (!png_memcmp(chunk_name, png_tIME, 4)) png_handle_tIME(png_ptr, info_ptr, length); #endif + #ifdef PNG_READ_tRNS_SUPPORTED else if (!png_memcmp(chunk_name, png_tRNS, 4)) png_handle_tRNS(png_ptr, info_ptr, length); #endif + #ifdef PNG_READ_zTXt_SUPPORTED else if (!png_memcmp(chunk_name, png_zTXt, 4)) png_handle_zTXt(png_ptr, info_ptr, length); #endif + #ifdef PNG_READ_iTXt_SUPPORTED else if (!png_memcmp(chunk_name, png_iTXt, 4)) png_handle_iTXt(png_ptr, info_ptr, length); #endif + else png_handle_unknown(png_ptr, info_ptr, length); } while (!(png_ptr->mode & PNG_HAVE_IEND)); @@ -983,7 +1084,7 @@ png_read_end(png_structp png_ptr, png_infop info_ptr) /* Free all memory used by the read */ void PNGAPI png_destroy_read_struct(png_structpp png_ptr_ptr, png_infopp info_ptr_ptr, - png_infopp end_info_ptr_ptr) + png_infopp end_info_ptr_ptr) { png_structp png_ptr = NULL; png_infop info_ptr = NULL, end_info_ptr = NULL; @@ -993,7 +1094,7 @@ png_destroy_read_struct(png_structpp png_ptr_ptr, png_infopp info_ptr_ptr, #endif png_debug(1, "in png_destroy_read_struct"); - + if (png_ptr_ptr != NULL) png_ptr = *png_ptr_ptr; if (png_ptr == NULL) @@ -1034,7 +1135,7 @@ png_destroy_read_struct(png_structpp png_ptr_ptr, png_infopp info_ptr_ptr, #endif #ifdef PNG_USER_MEM_SUPPORTED png_destroy_struct_2((png_voidp)end_info_ptr, (png_free_ptr)free_fn, - (png_voidp)mem_ptr); + (png_voidp)mem_ptr); #else png_destroy_struct((png_voidp)end_info_ptr); #endif @@ -1069,7 +1170,7 @@ png_read_destroy(png_structp png_ptr, png_infop info_ptr, #endif png_debug(1, "in png_read_destroy"); - + if (info_ptr != NULL) png_info_destroy(png_ptr, info_ptr); @@ -1080,31 +1181,38 @@ png_read_destroy(png_structp png_ptr, png_infop info_ptr, png_free(png_ptr, png_ptr->big_row_buf); png_free(png_ptr, png_ptr->prev_row); png_free(png_ptr, png_ptr->chunkdata); + #ifdef PNG_READ_QUANTIZE_SUPPORTED png_free(png_ptr, png_ptr->palette_lookup); png_free(png_ptr, png_ptr->quantize_index); #endif + #ifdef PNG_READ_GAMMA_SUPPORTED png_free(png_ptr, png_ptr->gamma_table); #endif + #ifdef PNG_READ_BACKGROUND_SUPPORTED png_free(png_ptr, png_ptr->gamma_from_1); png_free(png_ptr, png_ptr->gamma_to_1); #endif + if (png_ptr->free_me & PNG_FREE_PLTE) png_zfree(png_ptr, png_ptr->palette); png_ptr->free_me &= ~PNG_FREE_PLTE; + #if defined(PNG_tRNS_SUPPORTED) || \ defined(PNG_READ_EXPAND_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) if (png_ptr->free_me & PNG_FREE_TRNS) png_free(png_ptr, png_ptr->trans_alpha); png_ptr->free_me &= ~PNG_FREE_TRNS; #endif + #ifdef PNG_READ_hIST_SUPPORTED if (png_ptr->free_me & PNG_FREE_HIST) png_free(png_ptr, png_ptr->hist); png_ptr->free_me &= ~PNG_FREE_HIST; #endif + #ifdef PNG_READ_GAMMA_SUPPORTED if (png_ptr->gamma_16_table != NULL) { @@ -1116,6 +1224,7 @@ png_read_destroy(png_structp png_ptr, png_infop info_ptr, } png_free(png_ptr, png_ptr->gamma_16_table); } + #ifdef PNG_READ_BACKGROUND_SUPPORTED if (png_ptr->gamma_16_from_1 != NULL) { @@ -1139,11 +1248,13 @@ png_read_destroy(png_structp png_ptr, png_infop info_ptr, } #endif #endif + #ifdef PNG_TIME_RFC1123_SUPPORTED png_free(png_ptr, png_ptr->time_buffer); #endif inflateEnd(&png_ptr->zstream); + #ifdef PNG_PROGRESSIVE_READ_SUPPORTED png_free(png_ptr, png_ptr->save_buffer); #endif @@ -1158,7 +1269,7 @@ png_read_destroy(png_structp png_ptr, png_infop info_ptr, * being used again. */ #ifdef PNG_SETJMP_SUPPORTED - png_memcpy(tmp_jmp, png_ptr->jmpbuf, png_sizeof(jmp_buf)); + png_memcpy(tmp_jmp, png_ptr->png_jmpbuf, png_sizeof(jmp_buf)); #endif error_fn = png_ptr->error_fn; @@ -1178,7 +1289,7 @@ png_read_destroy(png_structp png_ptr, png_infop info_ptr, #endif #ifdef PNG_SETJMP_SUPPORTED - png_memcpy(png_ptr->jmpbuf, tmp_jmp, png_sizeof(jmp_buf)); + png_memcpy(png_ptr->png_jmpbuf, tmp_jmp, png_sizeof(jmp_buf)); #endif } @@ -1188,6 +1299,7 @@ png_set_read_status_fn(png_structp png_ptr, png_read_status_ptr read_row_fn) { if (png_ptr == NULL) return; + png_ptr->read_row_fn = read_row_fn; } @@ -1201,7 +1313,7 @@ png_read_png(png_structp png_ptr, png_infop info_ptr, { int row; - if (png_ptr == NULL) + if (png_ptr == NULL || info_ptr == NULL) return; /* png_read_info() gives us all of the information from the @@ -1283,44 +1395,44 @@ png_read_png(png_structp png_ptr, png_infop info_ptr, #endif #ifdef PNG_READ_BGR_SUPPORTED - /* Flip the RGB pixels to BGR (or RGBA to BGRA) - */ + /* Flip the RGB pixels to BGR (or RGBA to BGRA) */ if (transforms & PNG_TRANSFORM_BGR) png_set_bgr(png_ptr); #endif #ifdef PNG_READ_SWAP_ALPHA_SUPPORTED - /* Swap the RGBA or GA data to ARGB or AG (or BGRA to ABGR) - */ + /* Swap the RGBA or GA data to ARGB or AG (or BGRA to ABGR) */ if (transforms & PNG_TRANSFORM_SWAP_ALPHA) - png_set_swap_alpha(png_ptr); + png_set_swap_alpha(png_ptr); #endif #ifdef PNG_READ_SWAP_SUPPORTED - /* Swap bytes of 16 bit files to least significant byte first - */ + /* Swap bytes of 16 bit files to least significant byte first */ if (transforms & PNG_TRANSFORM_SWAP_ENDIAN) png_set_swap(png_ptr); #endif /* Added at libpng-1.2.41 */ #ifdef PNG_READ_INVERT_ALPHA_SUPPORTED - /* Invert the alpha channel from opacity to transparency - */ + /* Invert the alpha channel from opacity to transparency */ if (transforms & PNG_TRANSFORM_INVERT_ALPHA) - png_set_invert_alpha(png_ptr); + png_set_invert_alpha(png_ptr); #endif /* Added at libpng-1.2.41 */ #ifdef PNG_READ_GRAY_TO_RGB_SUPPORTED - /* Expand grayscale image to RGB - */ + /* Expand grayscale image to RGB */ if (transforms & PNG_TRANSFORM_GRAY_TO_RGB) - png_set_gray_to_rgb(png_ptr); + png_set_gray_to_rgb(png_ptr); #endif /* We don't handle adding filler bytes */ + /* We use png_read_image and rely on that for interlace handling, but we also + * call png_read_update_info therefore must turn on interlace handling now: + */ + (void)png_set_interlace_handling(png_ptr); + /* Optional call to gamma correct and add the background to the palette * and update info structure. REQUIRED if you are expecting libpng to * update the palette for you (i.e., you selected such a transform above). @@ -1332,10 +1444,10 @@ png_read_png(png_structp png_ptr, png_infop info_ptr, png_free_data(png_ptr, info_ptr, PNG_FREE_ROWS, 0); if (info_ptr->row_pointers == NULL) { - png_uint_32 iptr; + png_uint_32 iptr; info_ptr->row_pointers = (png_bytepp)png_malloc(png_ptr, - info_ptr->height * png_sizeof(png_bytep)); + info_ptr->height * png_sizeof(png_bytep)); for (iptr=0; iptrheight; iptr++) info_ptr->row_pointers[iptr] = NULL; @@ -1352,8 +1464,8 @@ png_read_png(png_structp png_ptr, png_infop info_ptr, /* Read rest of file, and get additional chunks in info_ptr - REQUIRED */ png_read_end(png_ptr, info_ptr); - transforms = transforms; /* Quiet compiler warnings */ - params = params; + PNG_UNUSED(transforms) /* Quiet compiler warnings */ + PNG_UNUSED(params) } #endif /* PNG_INFO_IMAGE_SUPPORTED */ diff --git a/reactos/dll/3rdparty/libpng/pngrio.c b/reactos/dll/3rdparty/libpng/pngrio.c index 59059caf692..e9c381c5ba4 100644 --- a/reactos/dll/3rdparty/libpng/pngrio.c +++ b/reactos/dll/3rdparty/libpng/pngrio.c @@ -1,8 +1,8 @@ /* pngrio.c - functions for data input * - * Last changed in libpng 1.4.1 [February 25, 2010] - * Copyright (c) 1998-2010 Glenn Randers-Pehrson + * Last changed in libpng 1.5.0 [January 6, 2011] + * Copyright (c) 1998-2011 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * @@ -18,11 +18,10 @@ * libpng use it at run time with png_set_read_fn(...). */ -#define PNG_NO_PEDANTIC_WARNINGS -#include "png.h" -#ifdef PNG_READ_SUPPORTED #include "pngpriv.h" +#ifdef PNG_READ_SUPPORTED + /* Read the data from whatever input you are using. The default routine * reads from a file pointer. Note that this routine sometimes gets called * with very small lengths, so you should implement some kind of simple @@ -33,9 +32,10 @@ void /* PRIVATE */ png_read_data(png_structp png_ptr, png_bytep data, png_size_t length) { png_debug1(4, "reading %d bytes", (int)length); - + if (png_ptr->read_data_fn != NULL) (*(png_ptr->read_data_fn))(png_ptr, data, length); + else png_error(png_ptr, "Call to NULL read function"); } @@ -46,14 +46,15 @@ png_read_data(png_structp png_ptr, png_bytep data, png_size_t length) * read_data function and use it at run time with png_set_read_fn(), rather * than changing the library. */ -#ifndef USE_FAR_KEYWORD -void PNGAPI +# ifndef USE_FAR_KEYWORD +void PNGCBAPI png_default_read_data(png_structp png_ptr, png_bytep data, png_size_t length) { png_size_t check; if (png_ptr == NULL) return; + /* fread() returns 0 on error, so it is OK to store this in a png_size_t * instead of an int, which is what fread() actually returns. */ @@ -62,7 +63,7 @@ png_default_read_data(png_structp png_ptr, png_bytep data, png_size_t length) if (check != length) png_error(png_ptr, "Read Error"); } -#else +# else /* This is the model-independent version. Since the standard I/O library can't handle far buffers in the medium and small models, we have to copy the data. @@ -71,7 +72,7 @@ png_default_read_data(png_structp png_ptr, png_bytep data, png_size_t length) #define NEAR_BUF_SIZE 1024 #define MIN(a,b) (a <= b ? a : b) -static void PNGAPI +static void PNGCBAPI png_default_read_data(png_structp png_ptr, png_bytep data, png_size_t length) { png_size_t check; @@ -80,46 +81,57 @@ png_default_read_data(png_structp png_ptr, png_bytep data, png_size_t length) if (png_ptr == NULL) return; + /* Check if data really is near. If so, use usual code. */ n_data = (png_byte *)CVT_PTR_NOCHECK(data); io_ptr = (png_FILE_p)CVT_PTR(png_ptr->io_ptr); + if ((png_bytep)n_data == data) { check = fread(n_data, 1, length, io_ptr); } + else { png_byte buf[NEAR_BUF_SIZE]; png_size_t read, remaining, err; check = 0; remaining = length; + do { read = MIN(NEAR_BUF_SIZE, remaining); err = fread(buf, 1, read, io_ptr); png_memcpy(data, buf, read); /* copy far buffer to near buffer */ + if (err != read) break; + else check += err; + data += read; remaining -= read; } while (remaining != 0); } + if ((png_uint_32)check != (png_uint_32)length) png_error(png_ptr, "read Error"); } -#endif +# endif #endif /* This function allows the application to supply a new input function * for libpng if standard C streams aren't being used. * * This function takes as its arguments: + * * png_ptr - pointer to a png input data structure + * * io_ptr - pointer to user supplied structure containing info about * the input functions. May be NULL. + * * read_data_fn - pointer to a new input function that takes as its * arguments a pointer to a png_struct, a pointer to * a location where input data can be stored, and a 32-bit @@ -135,11 +147,13 @@ png_set_read_fn(png_structp png_ptr, png_voidp io_ptr, { if (png_ptr == NULL) return; + png_ptr->io_ptr = io_ptr; #ifdef PNG_STDIO_SUPPORTED if (read_data_fn != NULL) png_ptr->read_data_fn = read_data_fn; + else png_ptr->read_data_fn = png_default_read_data; #else @@ -151,9 +165,8 @@ png_set_read_fn(png_structp png_ptr, png_voidp io_ptr, { png_ptr->write_data_fn = NULL; png_warning(png_ptr, - "It's an error to set both read_data_fn and write_data_fn in the "); - png_warning(png_ptr, - "same structure. Resetting write_data_fn to NULL"); + "Can't set both read_data_fn and write_data_fn in the" + " same structure"); } #ifdef PNG_WRITE_FLUSH_SUPPORTED diff --git a/reactos/dll/3rdparty/libpng/pngrtran.c b/reactos/dll/3rdparty/libpng/pngrtran.c index b5e8f1a26f2..de5871add02 100644 --- a/reactos/dll/3rdparty/libpng/pngrtran.c +++ b/reactos/dll/3rdparty/libpng/pngrtran.c @@ -1,8 +1,8 @@ /* pngrtran.c - transforms the data in a row for PNG readers * - * Last changed in libpng 1.4.2 [May 6, 2010] - * Copyright (c) 1998-2010 Glenn Randers-Pehrson + * Last changed in libpng 1.5.2 [March 31, 2011] + * Copyright (c) 1998-2011 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * @@ -16,17 +16,16 @@ * in pngtrans.c. */ -#define PNG_NO_PEDANTIC_WARNINGS -#include "png.h" -#ifdef PNG_READ_SUPPORTED #include "pngpriv.h" +#ifdef PNG_READ_SUPPORTED + /* Set the action on getting a CRC error for an ancillary or critical chunk. */ void PNGAPI png_set_crc_action(png_structp png_ptr, int crit_action, int ancil_action) { png_debug(1, "in png_set_crc_action"); - + if (png_ptr == NULL) return; @@ -89,18 +88,18 @@ png_set_crc_action(png_structp png_ptr, int crit_action, int ancil_action) } } -#if defined(PNG_READ_BACKGROUND_SUPPORTED) && \ - defined(PNG_FLOATING_POINT_SUPPORTED) +#ifdef PNG_READ_BACKGROUND_SUPPORTED /* Handle alpha and tRNS via a background color */ -void PNGAPI -png_set_background(png_structp png_ptr, - png_color_16p background_color, int background_gamma_code, - int need_expand, double background_gamma) +void PNGFAPI +png_set_background_fixed(png_structp png_ptr, + png_const_color_16p background_color, int background_gamma_code, + int need_expand, png_fixed_point background_gamma) { - png_debug(1, "in png_set_background"); - + png_debug(1, "in png_set_background_fixed"); + if (png_ptr == NULL) return; + if (background_gamma_code == PNG_BACKGROUND_GAMMA_UNKNOWN) { png_warning(png_ptr, "Application must supply a known background gamma"); @@ -110,11 +109,22 @@ png_set_background(png_structp png_ptr, png_ptr->transformations |= PNG_BACKGROUND; png_memcpy(&(png_ptr->background), background_color, png_sizeof(png_color_16)); - png_ptr->background_gamma = (float)background_gamma; + png_ptr->background_gamma = background_gamma; png_ptr->background_gamma_type = (png_byte)(background_gamma_code); png_ptr->transformations |= (need_expand ? PNG_BACKGROUND_EXPAND : 0); } -#endif + +# ifdef PNG_FLOATING_POINT_SUPPORTED +void PNGAPI +png_set_background(png_structp png_ptr, + png_const_color_16p background_color, int background_gamma_code, + int need_expand, double background_gamma) +{ + png_set_background_fixed(png_ptr, background_color, background_gamma_code, + need_expand, png_fixed(png_ptr, background_gamma, "png_set_background")); +} +# endif /* FLOATING_POINT */ +#endif /* READ_BACKGROUND */ #ifdef PNG_READ_16_TO_8_SUPPORTED /* Strip 16 bit depth files to 8 bit depth */ @@ -125,7 +135,9 @@ png_set_strip_16(png_structp png_ptr) if (png_ptr == NULL) return; + png_ptr->transformations |= PNG_16_TO_8; + png_ptr->transformations &= ~PNG_EXPAND_16; } #endif @@ -137,17 +149,18 @@ png_set_strip_alpha(png_structp png_ptr) if (png_ptr == NULL) return; - png_ptr->flags |= PNG_FLAG_STRIP_ALPHA; + + png_ptr->transformations |= PNG_STRIP_ALPHA; } #endif #ifdef PNG_READ_QUANTIZE_SUPPORTED -/* Quantize file to 8 bit. Supply a palette, the current number +/* Dither file to 8 bit. Supply a palette, the current number * of elements in the palette, the maximum number of elements * allowed, and a histogram if possible. If the current number * of colors is greater then the maximum number, the palette will be * modified to fit in the maximum number. "full_quantize" indicates - * whether we need a quantizeing cube set up for RGB images, or if we + * whether we need a quantizing cube set up for RGB images, or if we * simply are reducing the number of colors in a paletted image. */ @@ -162,13 +175,14 @@ typedef png_dsort FAR * FAR * png_dsortpp; void PNGAPI png_set_quantize(png_structp png_ptr, png_colorp palette, - int num_palette, int maximum_colors, png_uint_16p histogram, - int full_quantize) + int num_palette, int maximum_colors, png_const_uint_16p histogram, + int full_quantize) { png_debug(1, "in png_set_quantize"); if (png_ptr == NULL) return; + png_ptr->transformations |= PNG_QUANTIZE; if (!full_quantize) @@ -176,7 +190,7 @@ png_set_quantize(png_structp png_ptr, png_colorp palette, int i; png_ptr->quantize_index = (png_bytep)png_malloc(png_ptr, - (png_uint_32)(num_palette * png_sizeof(png_byte))); + (png_uint_32)(num_palette * png_sizeof(png_byte))); for (i = 0; i < num_palette; i++) png_ptr->quantize_index[i] = (png_byte)i; } @@ -193,7 +207,7 @@ png_set_quantize(png_structp png_ptr, png_colorp palette, /* Initialize an array to sort colors */ png_ptr->quantize_sort = (png_bytep)png_malloc(png_ptr, - (png_uint_32)(num_palette * png_sizeof(png_byte))); + (png_uint_32)(num_palette * png_sizeof(png_byte))); /* Initialize the quantize_sort array */ for (i = 0; i < num_palette; i++) @@ -225,6 +239,7 @@ png_set_quantize(png_structp png_ptr, png_colorp palette, done = 0; } } + if (done) break; } @@ -244,6 +259,7 @@ png_set_quantize(png_structp png_ptr, png_colorp palette, do j--; while ((int)png_ptr->quantize_sort[j] >= maximum_colors); + palette[i] = palette[j]; } } @@ -325,9 +341,9 @@ png_set_quantize(png_structp png_ptr, png_colorp palette, /* Initialize palette index arrays */ png_ptr->index_to_palette = (png_bytep)png_malloc(png_ptr, - (png_uint_32)(num_palette * png_sizeof(png_byte))); + (png_uint_32)(num_palette * png_sizeof(png_byte))); png_ptr->palette_to_index = (png_bytep)png_malloc(png_ptr, - (png_uint_32)(num_palette * png_sizeof(png_byte))); + (png_uint_32)(num_palette * png_sizeof(png_byte))); /* Initialize the sort array */ for (i = 0; i < num_palette; i++) @@ -337,7 +353,7 @@ png_set_quantize(png_structp png_ptr, png_colorp palette, } hash = (png_dsortpp)png_calloc(png_ptr, (png_uint_32)(769 * - png_sizeof(png_dsortp))); + png_sizeof(png_dsortp))); num_new_palette = num_palette; @@ -368,8 +384,10 @@ png_set_quantize(png_structp png_ptr, png_colorp palette, t = (png_dsortp)png_malloc_warn(png_ptr, (png_uint_32)(png_sizeof(png_dsort))); + if (t == NULL) break; + t->next = hash[d]; t->left = (png_byte)i; t->right = (png_byte)j; @@ -390,9 +408,9 @@ png_set_quantize(png_structp png_ptr, png_colorp palette, for (p = hash[i]; p; p = p->next) { if ((int)png_ptr->index_to_palette[p->left] - < num_new_palette && - (int)png_ptr->index_to_palette[p->right] - < num_new_palette) + < num_new_palette && + (int)png_ptr->index_to_palette[p->right] + < num_new_palette) { int j, next_j; @@ -409,7 +427,7 @@ png_set_quantize(png_structp png_ptr, png_colorp palette, num_new_palette--; palette[png_ptr->index_to_palette[j]] - = palette[num_new_palette]; + = palette[num_new_palette]; if (!full_quantize) { int k; @@ -417,23 +435,26 @@ png_set_quantize(png_structp png_ptr, png_colorp palette, for (k = 0; k < num_palette; k++) { if (png_ptr->quantize_index[k] == - png_ptr->index_to_palette[j]) + png_ptr->index_to_palette[j]) png_ptr->quantize_index[k] = - png_ptr->index_to_palette[next_j]; + png_ptr->index_to_palette[next_j]; + if ((int)png_ptr->quantize_index[k] == - num_new_palette) + num_new_palette) png_ptr->quantize_index[k] = - png_ptr->index_to_palette[j]; + png_ptr->index_to_palette[j]; } } png_ptr->index_to_palette[png_ptr->palette_to_index - [num_new_palette]] = png_ptr->index_to_palette[j]; + [num_new_palette]] = png_ptr->index_to_palette[j]; + png_ptr->palette_to_index[png_ptr->index_to_palette[j]] - = png_ptr->palette_to_index[num_new_palette]; + = png_ptr->palette_to_index[num_new_palette]; png_ptr->index_to_palette[j] = (png_byte)num_new_palette; + png_ptr->palette_to_index[num_new_palette] = (png_byte)j; } @@ -480,17 +501,18 @@ png_set_quantize(png_structp png_ptr, png_colorp palette, int i; png_bytep distance; int total_bits = PNG_QUANTIZE_RED_BITS + PNG_QUANTIZE_GREEN_BITS + - PNG_QUANTIZE_BLUE_BITS; + PNG_QUANTIZE_BLUE_BITS; int num_red = (1 << PNG_QUANTIZE_RED_BITS); int num_green = (1 << PNG_QUANTIZE_GREEN_BITS); int num_blue = (1 << PNG_QUANTIZE_BLUE_BITS); png_size_t num_entries = ((png_size_t)1 << total_bits); - png_ptr->palette_lookup = (png_bytep )png_calloc(png_ptr, - (png_uint_32)(num_entries * png_sizeof(png_byte))); + png_ptr->palette_lookup = (png_bytep)png_calloc(png_ptr, + (png_uint_32)(num_entries * png_sizeof(png_byte))); distance = (png_bytep)png_malloc(png_ptr, (png_uint_32)(num_entries * - png_sizeof(png_byte))); + png_sizeof(png_byte))); + png_memset(distance, 0xff, num_entries * png_sizeof(png_byte)); for (i = 0; i < num_palette; i++) @@ -538,7 +560,7 @@ png_set_quantize(png_structp png_ptr, png_colorp palette, } #endif /* PNG_READ_QUANTIZE_SUPPORTED */ -#if defined(PNG_READ_GAMMA_SUPPORTED) && defined(PNG_FLOATING_POINT_SUPPORTED) +#ifdef PNG_READ_GAMMA_SUPPORTED /* Transform the image from the file_gamma to the screen_gamma. We * only do transformations on images where the file_gamma and screen_gamma * are not close reciprocals, otherwise it slows things down slightly, and @@ -548,22 +570,48 @@ png_set_quantize(png_structp png_ptr, png_colorp palette, * are present in the tRNS array for palette images. We can't do it here * because we don't necessarily have the tRNS chunk yet. */ -void PNGAPI -png_set_gamma(png_structp png_ptr, double scrn_gamma, double file_gamma) +static int /* PRIVATE */ +png_gamma_threshold(png_fixed_point scrn_gamma, png_fixed_point file_gamma) { - png_debug(1, "in png_set_gamma"); + /* PNG_GAMMA_THRESHOLD is the threshold for performing gamma + * correction as a difference of the overall transform from 1.0 + * + * We want to compare the threshold with s*f - 1, if we get + * overflow here it is because of wacky gamma values so we + * turn on processing anyway. + */ + png_fixed_point gtest; + return !png_muldiv(>est, scrn_gamma, file_gamma, PNG_FP_1) || + png_gamma_significant(gtest); +} + +void PNGFAPI +png_set_gamma_fixed(png_structp png_ptr, png_fixed_point scrn_gamma, + png_fixed_point file_gamma) +{ + png_debug(1, "in png_set_gamma_fixed"); if (png_ptr == NULL) return; - if ((fabs(scrn_gamma * file_gamma - 1.0) > PNG_GAMMA_THRESHOLD) || - (png_ptr->color_type & PNG_COLOR_MASK_ALPHA) || - (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE)) - png_ptr->transformations |= PNG_GAMMA; - png_ptr->gamma = (float)file_gamma; - png_ptr->screen_gamma = (float)scrn_gamma; + if ((png_ptr->color_type & PNG_COLOR_MASK_ALPHA) || + (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) || + png_gamma_threshold(scrn_gamma, file_gamma)) + png_ptr->transformations |= PNG_GAMMA; + png_ptr->gamma = file_gamma; + png_ptr->screen_gamma = scrn_gamma; } -#endif + +# ifdef PNG_FLOATING_POINT_SUPPORTED +void PNGAPI +png_set_gamma(png_structp png_ptr, double scrn_gamma, double file_gamma) +{ + png_set_gamma_fixed(png_ptr, + png_fixed(png_ptr, scrn_gamma, "png_set_gamma screen gamma"), + png_fixed(png_ptr, file_gamma, "png_set_gamma file gamma")); +} +# endif /* FLOATING_POINT_SUPPORTED */ +#endif /* READ_GAMMA */ #ifdef PNG_READ_EXPAND_SUPPORTED /* Expand paletted images to RGB, expand grayscale images of @@ -639,38 +687,45 @@ png_set_tRNS_to_alpha(png_structp png_ptr) } #endif /* defined(PNG_READ_EXPAND_SUPPORTED) */ +#ifdef PNG_READ_EXPAND_16_SUPPORTED +/* Expand to 16 bit channels, expand the tRNS chunk too (because otherwise + * it may not work correctly.) + */ +void PNGAPI +png_set_expand_16(png_structp png_ptr) +{ + png_debug(1, "in png_set_expand_16"); + + if (png_ptr == NULL) + return; + + png_ptr->transformations |= (PNG_EXPAND_16 | PNG_EXPAND | PNG_EXPAND_tRNS); + png_ptr->transformations &= ~PNG_16_TO_8; + + png_ptr->flags &= ~PNG_FLAG_ROW_INIT; +} +#endif + #ifdef PNG_READ_GRAY_TO_RGB_SUPPORTED void PNGAPI png_set_gray_to_rgb(png_structp png_ptr) { png_debug(1, "in png_set_gray_to_rgb"); - png_ptr->transformations |= PNG_GRAY_TO_RGB; - png_ptr->flags &= ~PNG_FLAG_ROW_INIT; + if (png_ptr != NULL) + { + /* Because rgb must be 8 bits or more: */ + png_set_expand_gray_1_2_4_to_8(png_ptr); + png_ptr->transformations |= PNG_GRAY_TO_RGB; + png_ptr->flags &= ~PNG_FLAG_ROW_INIT; + } } #endif #ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED -#ifdef PNG_FLOATING_POINT_SUPPORTED -/* Convert a RGB image to a grayscale of the same width. This allows us, - * for example, to convert a 24 bpp RGB image into an 8 bpp grayscale image. - */ - -void PNGAPI -png_set_rgb_to_gray(png_structp png_ptr, int error_action, double red, - double green) -{ - int red_fixed = (int)((float)red*100000.0 + 0.5); - int green_fixed = (int)((float)green*100000.0 + 0.5); - if (png_ptr == NULL) - return; - png_set_rgb_to_gray_fixed(png_ptr, error_action, red_fixed, green_fixed); -} -#endif - -void PNGAPI +void PNGFAPI png_set_rgb_to_gray_fixed(png_structp png_ptr, int error_action, - png_fixed_point red, png_fixed_point green) + png_fixed_point red, png_fixed_point green) { png_debug(1, "in png_set_rgb_to_gray"); @@ -679,13 +734,21 @@ png_set_rgb_to_gray_fixed(png_structp png_ptr, int error_action, switch(error_action) { - case 1: png_ptr->transformations |= PNG_RGB_TO_GRAY; - break; + case 1: + png_ptr->transformations |= PNG_RGB_TO_GRAY; + break; - case 2: png_ptr->transformations |= PNG_RGB_TO_GRAY_WARN; - break; + case 2: + png_ptr->transformations |= PNG_RGB_TO_GRAY_WARN; + break; - case 3: png_ptr->transformations |= PNG_RGB_TO_GRAY_ERR; + case 3: + png_ptr->transformations |= PNG_RGB_TO_GRAY_ERR; + break; + + default: + png_error(png_ptr, "invalid error action to rgb_to_gray"); + break; } if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) #ifdef PNG_READ_EXPAND_SUPPORTED @@ -694,6 +757,7 @@ png_set_rgb_to_gray_fixed(png_structp png_ptr, int error_action, { png_warning(png_ptr, "Cannot do RGB_TO_GRAY without EXPAND_SUPPORTED"); + png_ptr->transformations &= ~PNG_RGB_TO_GRAY; } #endif @@ -704,30 +768,52 @@ png_set_rgb_to_gray_fixed(png_structp png_ptr, int error_action, red_int = 6968; /* .212671 * 32768 + .5 */ green_int = 23434; /* .715160 * 32768 + .5 */ } + else if (red + green < 100000L) { red_int = (png_uint_16)(((png_uint_32)red*32768L)/100000L); green_int = (png_uint_16)(((png_uint_32)green*32768L)/100000L); } + else { png_warning(png_ptr, "ignoring out of range rgb_to_gray coefficients"); red_int = 6968; green_int = 23434; } + png_ptr->rgb_to_gray_red_coeff = red_int; png_ptr->rgb_to_gray_green_coeff = green_int; png_ptr->rgb_to_gray_blue_coeff = - (png_uint_16)(32768 - red_int - green_int); + (png_uint_16)(32768 - red_int - green_int); } } + +#ifdef PNG_FLOATING_POINT_SUPPORTED +/* Convert a RGB image to a grayscale of the same width. This allows us, + * for example, to convert a 24 bpp RGB image into an 8 bpp grayscale image. + */ + +void PNGAPI +png_set_rgb_to_gray(png_structp png_ptr, int error_action, double red, + double green) +{ + if (png_ptr == NULL) + return; + + png_set_rgb_to_gray_fixed(png_ptr, error_action, + png_fixed(png_ptr, red, "rgb to gray red coefficient"), + png_fixed(png_ptr, green, "rgb to gray green coefficient")); +} +#endif /* FLOATING POINT */ + #endif #if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) void PNGAPI png_set_read_user_transform_fn(png_structp png_ptr, png_user_transform_ptr - read_user_transform_fn) + read_user_transform_fn) { png_debug(1, "in png_set_read_user_transform_fn"); @@ -772,15 +858,17 @@ png_init_read_transformations(png_structp png_ptr) if ((png_ptr->transformations & PNG_BACKGROUND_EXPAND) && !(color_type & PNG_COLOR_MASK_COLOR)) { - png_ptr->mode |= PNG_BACKGROUND_IS_GRAY; - } else if ((png_ptr->transformations & PNG_BACKGROUND) && - !(png_ptr->transformations & PNG_BACKGROUND_EXPAND) && - (png_ptr->transformations & PNG_GRAY_TO_RGB) && - png_ptr->background.red == png_ptr->background.green && - png_ptr->background.red == png_ptr->background.blue) + png_ptr->mode |= PNG_BACKGROUND_IS_GRAY; + } + + else if ((png_ptr->transformations & PNG_BACKGROUND) && + !(png_ptr->transformations & PNG_BACKGROUND_EXPAND) && + (png_ptr->transformations & PNG_GRAY_TO_RGB) && + png_ptr->background.red == png_ptr->background.green && + png_ptr->background.red == png_ptr->background.blue) { - png_ptr->mode |= PNG_BACKGROUND_IS_GRAY; - png_ptr->background.gray = png_ptr->background.red; + png_ptr->mode |= PNG_BACKGROUND_IS_GRAY; + png_ptr->background.gray = png_ptr->background.red; } #endif @@ -795,55 +883,57 @@ png_init_read_transformations(png_structp png_ptr) case 1: png_ptr->background.gray *= (png_uint_16)0xff; png_ptr->background.red = png_ptr->background.green - = png_ptr->background.blue = png_ptr->background.gray; + = png_ptr->background.blue = png_ptr->background.gray; if (!(png_ptr->transformations & PNG_EXPAND_tRNS)) { png_ptr->trans_color.gray *= (png_uint_16)0xff; png_ptr->trans_color.red = png_ptr->trans_color.green - = png_ptr->trans_color.blue = png_ptr->trans_color.gray; + = png_ptr->trans_color.blue = png_ptr->trans_color.gray; } break; case 2: png_ptr->background.gray *= (png_uint_16)0x55; png_ptr->background.red = png_ptr->background.green - = png_ptr->background.blue = png_ptr->background.gray; + = png_ptr->background.blue = png_ptr->background.gray; if (!(png_ptr->transformations & PNG_EXPAND_tRNS)) { - png_ptr->trans_color.gray *= (png_uint_16)0x55; - png_ptr->trans_color.red = png_ptr->trans_color.green - = png_ptr->trans_color.blue = png_ptr->trans_color.gray; + png_ptr->trans_color.gray *= (png_uint_16)0x55; + png_ptr->trans_color.red = png_ptr->trans_color.green + = png_ptr->trans_color.blue = png_ptr->trans_color.gray; } break; case 4: png_ptr->background.gray *= (png_uint_16)0x11; png_ptr->background.red = png_ptr->background.green - = png_ptr->background.blue = png_ptr->background.gray; + = png_ptr->background.blue = png_ptr->background.gray; if (!(png_ptr->transformations & PNG_EXPAND_tRNS)) { - png_ptr->trans_color.gray *= (png_uint_16)0x11; - png_ptr->trans_color.red = png_ptr->trans_color.green - = png_ptr->trans_color.blue = png_ptr->trans_color.gray; + png_ptr->trans_color.gray *= (png_uint_16)0x11; + png_ptr->trans_color.red = png_ptr->trans_color.green + = png_ptr->trans_color.blue = png_ptr->trans_color.gray; } break; + default: + case 8: case 16: png_ptr->background.red = png_ptr->background.green - = png_ptr->background.blue = png_ptr->background.gray; + = png_ptr->background.blue = png_ptr->background.gray; break; } } else if (color_type == PNG_COLOR_TYPE_PALETTE) { png_ptr->background.red = - png_ptr->palette[png_ptr->background.index].red; + png_ptr->palette[png_ptr->background.index].red; png_ptr->background.green = - png_ptr->palette[png_ptr->background.index].green; + png_ptr->palette[png_ptr->background.index].green; png_ptr->background.blue = - png_ptr->palette[png_ptr->background.index].blue; + png_ptr->palette[png_ptr->background.index].blue; #ifdef PNG_READ_INVERT_ALPHA_SUPPORTED if (png_ptr->transformations & PNG_INVERT_ALPHA) @@ -852,13 +942,14 @@ png_init_read_transformations(png_structp png_ptr) if (!(png_ptr->transformations & PNG_EXPAND_tRNS)) #endif { - /* Invert the alpha channel (in tRNS) unless the pixels are - * going to be expanded, in which case leave it for later - */ + /* Invert the alpha channel (in tRNS) unless the pixels are + * going to be expanded, in which case leave it for later + */ int i, istop; istop=(int)png_ptr->num_trans; for (i=0; itrans_alpha[i] = (png_byte)(255 - png_ptr->trans_alpha[i]); + png_ptr->trans_alpha[i] = (png_byte)(255 - + png_ptr->trans_alpha[i]); } } #endif @@ -870,25 +961,24 @@ png_init_read_transformations(png_structp png_ptr) #if defined(PNG_READ_BACKGROUND_SUPPORTED) && defined(PNG_READ_GAMMA_SUPPORTED) png_ptr->background_1 = png_ptr->background; #endif -#if defined(PNG_READ_GAMMA_SUPPORTED) && defined(PNG_FLOATING_POINT_SUPPORTED) +#ifdef PNG_READ_GAMMA_SUPPORTED if ((color_type == PNG_COLOR_TYPE_PALETTE && png_ptr->num_trans != 0) - && (fabs(png_ptr->screen_gamma * png_ptr->gamma - 1.0) - < PNG_GAMMA_THRESHOLD)) + && png_gamma_threshold(png_ptr->screen_gamma, png_ptr->gamma)) { - int i, k; - k=0; - for (i=0; inum_trans; i++) - { - if (png_ptr->trans_alpha[i] != 0 && png_ptr->trans_alpha[i] != 0xff) - k=1; /* Partial transparency is present */ - } - if (k == 0) - png_ptr->transformations &= ~PNG_GAMMA; + int i, k; + k=0; + for (i=0; inum_trans; i++) + { + if (png_ptr->trans_alpha[i] != 0 && png_ptr->trans_alpha[i] != 0xff) + k=1; /* Partial transparency is present */ + } + if (k == 0) + png_ptr->transformations &= ~PNG_GAMMA; } if ((png_ptr->transformations & (PNG_GAMMA | PNG_RGB_TO_GRAY)) && - png_ptr->gamma != 0.0) + png_ptr->gamma != 0) { png_build_gamma_table(png_ptr, png_ptr->bit_depth); @@ -897,13 +987,14 @@ png_init_read_transformations(png_structp png_ptr) { if (color_type == PNG_COLOR_TYPE_PALETTE) { - /* Could skip if no transparency */ + /* Could skip if no transparency */ png_color back, back_1; png_colorp palette = png_ptr->palette; int num_palette = png_ptr->num_palette; int i; if (png_ptr->background_gamma_type == PNG_BACKGROUND_GAMMA_FILE) { + back.red = png_ptr->gamma_table[png_ptr->background.red]; back.green = png_ptr->gamma_table[png_ptr->background.green]; back.blue = png_ptr->gamma_table[png_ptr->background.blue]; @@ -914,57 +1005,58 @@ png_init_read_transformations(png_structp png_ptr) } else { - double g, gs; + png_fixed_point g, gs; switch (png_ptr->background_gamma_type) { case PNG_BACKGROUND_GAMMA_SCREEN: g = (png_ptr->screen_gamma); - gs = 1.0; + gs = PNG_FP_1; break; case PNG_BACKGROUND_GAMMA_FILE: - g = 1.0 / (png_ptr->gamma); - gs = 1.0 / (png_ptr->gamma * png_ptr->screen_gamma); + g = png_reciprocal(png_ptr->gamma); + gs = png_reciprocal2(png_ptr->gamma, + png_ptr->screen_gamma); break; case PNG_BACKGROUND_GAMMA_UNIQUE: - g = 1.0 / (png_ptr->background_gamma); - gs = 1.0 / (png_ptr->background_gamma * - png_ptr->screen_gamma); + g = png_reciprocal(png_ptr->background_gamma); + gs = png_reciprocal2(png_ptr->background_gamma, + png_ptr->screen_gamma); break; default: - g = 1.0; /* back_1 */ - gs = 1.0; /* back */ + g = PNG_FP_1; /* back_1 */ + gs = PNG_FP_1; /* back */ + break; } - if ( fabs(gs - 1.0) < PNG_GAMMA_THRESHOLD) + if (png_gamma_significant(gs)) { back.red = (png_byte)png_ptr->background.red; back.green = (png_byte)png_ptr->background.green; back.blue = (png_byte)png_ptr->background.blue; } + else { - back.red = (png_byte)(pow( - (double)png_ptr->background.red/255.0, gs) * 255.0 + .5); - back.green = (png_byte)(pow( - (double)png_ptr->background.green/255.0, gs) * 255.0 - + .5); - back.blue = (png_byte)(pow( - (double)png_ptr->background.blue/255.0, gs) * 255.0 + .5); + back.red = png_gamma_8bit_correct(png_ptr->background.red, + gs); + back.green = png_gamma_8bit_correct(png_ptr->background.green, + gs); + back.blue = png_gamma_8bit_correct(png_ptr->background.blue, + gs); } - - back_1.red = (png_byte)(pow( - (double)png_ptr->background.red/255.0, g) * 255.0 + .5); - back_1.green = (png_byte)(pow( - (double)png_ptr->background.green/255.0, g) * 255.0 + .5); - back_1.blue = (png_byte)(pow( - (double)png_ptr->background.blue/255.0, g) * 255.0 + .5); + back_1.red = png_gamma_8bit_correct(png_ptr->background.red, g); + back_1.green = png_gamma_8bit_correct(png_ptr->background.green, + g); + back_1.blue = png_gamma_8bit_correct(png_ptr->background.blue, + g); } for (i = 0; i < num_palette; i++) { - if (i < (int)png_ptr->num_trans && png_ptr->trans_alpha[i] != 0xff) + if (i < (int)png_ptr->num_trans && + png_ptr->trans_alpha[i] != 0xff) { if (png_ptr->trans_alpha[i] == 0) { @@ -1003,63 +1095,74 @@ png_init_read_transformations(png_structp png_ptr) png_ptr->transformations &= ~PNG_GAMMA; png_ptr->transformations |= PNG_STRIP_ALPHA; } + /* if (png_ptr->background_gamma_type!=PNG_BACKGROUND_GAMMA_UNKNOWN) */ else /* color_type != PNG_COLOR_TYPE_PALETTE */ { - double m = (double)(((png_uint_32)1 << png_ptr->bit_depth) - 1); - double g = 1.0; - double gs = 1.0; + png_fixed_point g = PNG_FP_1; + png_fixed_point gs = PNG_FP_1; switch (png_ptr->background_gamma_type) { case PNG_BACKGROUND_GAMMA_SCREEN: - g = (png_ptr->screen_gamma); - gs = 1.0; + g = png_ptr->screen_gamma; + /* gs = PNG_FP_1; */ break; case PNG_BACKGROUND_GAMMA_FILE: - g = 1.0 / (png_ptr->gamma); - gs = 1.0 / (png_ptr->gamma * png_ptr->screen_gamma); + g = png_reciprocal(png_ptr->gamma); + gs = png_reciprocal2(png_ptr->gamma, png_ptr->screen_gamma); break; case PNG_BACKGROUND_GAMMA_UNIQUE: - g = 1.0 / (png_ptr->background_gamma); - gs = 1.0 / (png_ptr->background_gamma * - png_ptr->screen_gamma); + g = png_reciprocal(png_ptr->background_gamma); + gs = png_reciprocal2(png_ptr->background_gamma, + png_ptr->screen_gamma); break; + + default: + png_error(png_ptr, "invalid background gamma type"); } - png_ptr->background_1.gray = (png_uint_16)(pow( - (double)png_ptr->background.gray / m, g) * m + .5); - png_ptr->background.gray = (png_uint_16)(pow( - (double)png_ptr->background.gray / m, gs) * m + .5); + png_ptr->background_1.gray = png_gamma_correct(png_ptr, + png_ptr->background.gray, g); + + png_ptr->background.gray = png_gamma_correct(png_ptr, + png_ptr->background.gray, gs); if ((png_ptr->background.red != png_ptr->background.green) || (png_ptr->background.red != png_ptr->background.blue) || (png_ptr->background.red != png_ptr->background.gray)) { /* RGB or RGBA with color background */ - png_ptr->background_1.red = (png_uint_16)(pow( - (double)png_ptr->background.red / m, g) * m + .5); - png_ptr->background_1.green = (png_uint_16)(pow( - (double)png_ptr->background.green / m, g) * m + .5); - png_ptr->background_1.blue = (png_uint_16)(pow( - (double)png_ptr->background.blue / m, g) * m + .5); - png_ptr->background.red = (png_uint_16)(pow( - (double)png_ptr->background.red / m, gs) * m + .5); - png_ptr->background.green = (png_uint_16)(pow( - (double)png_ptr->background.green / m, gs) * m + .5); - png_ptr->background.blue = (png_uint_16)(pow( - (double)png_ptr->background.blue / m, gs) * m + .5); + png_ptr->background_1.red = png_gamma_correct(png_ptr, + png_ptr->background.red, g); + + png_ptr->background_1.green = png_gamma_correct(png_ptr, + png_ptr->background.green, g); + + png_ptr->background_1.blue = png_gamma_correct(png_ptr, + png_ptr->background.blue, g); + + png_ptr->background.red = png_gamma_correct(png_ptr, + png_ptr->background.red, gs); + + png_ptr->background.green = png_gamma_correct(png_ptr, + png_ptr->background.green, gs); + + png_ptr->background.blue = png_gamma_correct(png_ptr, + png_ptr->background.blue, gs); } + else { /* GRAY, GRAY ALPHA, RGB, or RGBA with gray background */ png_ptr->background_1.red = png_ptr->background_1.green - = png_ptr->background_1.blue = png_ptr->background_1.gray; + = png_ptr->background_1.blue = png_ptr->background_1.gray; + png_ptr->background.red = png_ptr->background.green - = png_ptr->background.blue = png_ptr->background.gray; + = png_ptr->background.blue = png_ptr->background.gray; } } } @@ -1086,7 +1189,7 @@ png_init_read_transformations(png_structp png_ptr) #ifdef PNG_READ_BACKGROUND_SUPPORTED else #endif -#endif /* PNG_READ_GAMMA_SUPPORTED && PNG_FLOATING_POINT_SUPPORTED */ +#endif /* PNG_READ_GAMMA_SUPPORTED */ #ifdef PNG_READ_BACKGROUND_SUPPORTED /* No GAMMA transformation */ if ((png_ptr->transformations & PNG_BACKGROUND) && @@ -1107,15 +1210,18 @@ png_init_read_transformations(png_structp png_ptr) { palette[i] = back; } + else if (png_ptr->trans_alpha[i] != 0xff) { /* The png_composite() macro is defined in png.h */ png_composite(palette[i].red, palette[i].red, - png_ptr->trans_alpha[i], back.red); + png_ptr->trans_alpha[i], back.red); + png_composite(palette[i].green, palette[i].green, - png_ptr->trans_alpha[i], back.green); + png_ptr->trans_alpha[i], back.green); + png_composite(palette[i].blue, palette[i].blue, - png_ptr->trans_alpha[i], back.blue); + png_ptr->trans_alpha[i], back.blue); } } @@ -1127,7 +1233,7 @@ png_init_read_transformations(png_structp png_ptr) #ifdef PNG_READ_SHIFT_SUPPORTED if ((png_ptr->transformations & PNG_SHIFT) && - (color_type == PNG_COLOR_TYPE_PALETTE)) + (color_type == PNG_COLOR_TYPE_PALETTE)) { png_uint_16 i; png_uint_16 istop = png_ptr->num_palette; @@ -1137,10 +1243,13 @@ png_init_read_transformations(png_structp png_ptr) if (sr < 0 || sr > 8) sr = 0; + if (sg < 0 || sg > 8) sg = 0; + if (sb < 0 || sb > 8) sb = 0; + for (i = 0; i < istop; i++) { png_ptr->palette[i].red >>= sr; @@ -1172,10 +1281,12 @@ png_read_transform_info(png_structp png_ptr, png_infop info_ptr) if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) { if (png_ptr->num_trans && - (png_ptr->transformations & PNG_EXPAND_tRNS)) + (png_ptr->transformations & PNG_EXPAND_tRNS)) info_ptr->color_type = PNG_COLOR_TYPE_RGB_ALPHA; + else info_ptr->color_type = PNG_COLOR_TYPE_RGB; + info_ptr->bit_depth = 8; info_ptr->num_trans = 0; } @@ -1184,19 +1295,29 @@ png_read_transform_info(png_structp png_ptr, png_infop info_ptr) if (png_ptr->num_trans) { if (png_ptr->transformations & PNG_EXPAND_tRNS) - info_ptr->color_type |= PNG_COLOR_MASK_ALPHA; + info_ptr->color_type |= PNG_COLOR_MASK_ALPHA; } if (info_ptr->bit_depth < 8) info_ptr->bit_depth = 8; + info_ptr->num_trans = 0; } } #endif +#ifdef PNG_READ_EXPAND_16_SUPPORTED + if (png_ptr->transformations & PNG_EXPAND_16 && info_ptr->bit_depth == 8 && + info_ptr->color_type != PNG_COLOR_TYPE_PALETTE) + { + info_ptr->bit_depth = 16; + } +#endif + #ifdef PNG_READ_BACKGROUND_SUPPORTED if (png_ptr->transformations & PNG_BACKGROUND) { - info_ptr->color_type &= ~PNG_COLOR_MASK_ALPHA; + info_ptr->color_type = (png_byte)(info_ptr->color_type & + ~PNG_COLOR_MASK_ALPHA); info_ptr->num_trans = 0; info_ptr->background = png_ptr->background; } @@ -1205,18 +1326,22 @@ png_read_transform_info(png_structp png_ptr, png_infop info_ptr) #ifdef PNG_READ_GAMMA_SUPPORTED if (png_ptr->transformations & PNG_GAMMA) { -#ifdef PNG_FLOATING_POINT_SUPPORTED info_ptr->gamma = png_ptr->gamma; -#endif -#ifdef PNG_FIXED_POINT_SUPPORTED - info_ptr->int_gamma = png_ptr->int_gamma; -#endif } #endif #ifdef PNG_READ_16_TO_8_SUPPORTED +#ifdef PNG_READ_16BIT_SUPPORTED if ((png_ptr->transformations & PNG_16_TO_8) && (info_ptr->bit_depth == 16)) info_ptr->bit_depth = 8; +#else + /* Force chopping 16-bit input down to 8 */ + if (info_ptr->bit_depth == 16) + { + png_ptr->transformations |=PNG_16_TO_8; + info_ptr->bit_depth = 8; + } +#endif #endif #ifdef PNG_READ_GRAY_TO_RGB_SUPPORTED @@ -1248,13 +1373,15 @@ png_read_transform_info(png_structp png_ptr, png_infop info_ptr) if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) info_ptr->channels = 1; + else if (info_ptr->color_type & PNG_COLOR_MASK_COLOR) info_ptr->channels = 3; + else info_ptr->channels = 1; #ifdef PNG_READ_STRIP_ALPHA_SUPPORTED - if (png_ptr->flags & PNG_FLAG_STRIP_ALPHA) + if (png_ptr->transformations & PNG_STRIP_ALPHA) info_ptr->color_type &= ~PNG_COLOR_MASK_ALPHA; #endif @@ -1270,23 +1397,24 @@ png_read_transform_info(png_structp png_ptr, png_infop info_ptr) info_ptr->channels++; /* If adding a true alpha channel not just filler */ if (png_ptr->transformations & PNG_ADD_ALPHA) - info_ptr->color_type |= PNG_COLOR_MASK_ALPHA; + info_ptr->color_type |= PNG_COLOR_MASK_ALPHA; } #endif #if defined(PNG_USER_TRANSFORM_PTR_SUPPORTED) && \ defined(PNG_READ_USER_TRANSFORM_SUPPORTED) if (png_ptr->transformations & PNG_USER_TRANSFORM) - { - if (info_ptr->bit_depth < png_ptr->user_transform_depth) + { + if (info_ptr->bit_depth < png_ptr->user_transform_depth) info_ptr->bit_depth = png_ptr->user_transform_depth; - if (info_ptr->channels < png_ptr->user_transform_channels) + + if (info_ptr->channels < png_ptr->user_transform_channels) info_ptr->channels = png_ptr->user_transform_channels; - } + } #endif info_ptr->pixel_depth = (png_byte)(info_ptr->channels * - info_ptr->bit_depth); + info_ptr->bit_depth); info_ptr->rowbytes = PNG_ROWBYTES(info_ptr->pixel_depth, info_ptr->width); @@ -1307,12 +1435,12 @@ png_do_read_transformations(png_structp png_ptr) if (png_ptr->row_buf == NULL) { -#ifdef PNG_STDIO_SUPPORTED +#ifdef PNG_CONSOLE_IO_SUPPORTED char msg[50]; png_snprintf2(msg, 50, - "NULL row buffer for row %ld, pass %d", (long)png_ptr->row_number, - png_ptr->pass); + "NULL row buffer for row %ld, pass %d", (long)png_ptr->row_number, + png_ptr->pass); png_error(png_ptr, msg); #else png_error(png_ptr, "NULL row buffer"); @@ -1337,39 +1465,49 @@ png_do_read_transformations(png_structp png_ptr) if (png_ptr->row_info.color_type == PNG_COLOR_TYPE_PALETTE) { png_do_expand_palette(&(png_ptr->row_info), png_ptr->row_buf + 1, - png_ptr->palette, png_ptr->trans_alpha, png_ptr->num_trans); + png_ptr->palette, png_ptr->trans_alpha, png_ptr->num_trans); } + else { if (png_ptr->num_trans && (png_ptr->transformations & PNG_EXPAND_tRNS)) png_do_expand(&(png_ptr->row_info), png_ptr->row_buf + 1, - &(png_ptr->trans_color)); + &(png_ptr->trans_color)); + else png_do_expand(&(png_ptr->row_info), png_ptr->row_buf + 1, - NULL); + NULL); } } #endif + /* Delay the 'expand 16' step until later for efficiency, so that the + * intermediate steps work with 8 bit data. + */ + #ifdef PNG_READ_STRIP_ALPHA_SUPPORTED - if (png_ptr->flags & PNG_FLAG_STRIP_ALPHA) - png_do_strip_filler(&(png_ptr->row_info), png_ptr->row_buf + 1, - PNG_FLAG_FILLER_AFTER | (png_ptr->flags & PNG_FLAG_STRIP_ALPHA)); + if ((png_ptr->transformations & PNG_STRIP_ALPHA) && + (png_ptr->row_info.color_type == PNG_COLOR_TYPE_RGB_ALPHA || + png_ptr->row_info.color_type == PNG_COLOR_TYPE_GRAY_ALPHA)) + png_do_strip_channel(&(png_ptr->row_info), png_ptr->row_buf + 1, + 0/*!at_start, because SWAP_ALPHA happens later*/); #endif #ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED if (png_ptr->transformations & PNG_RGB_TO_GRAY) { int rgb_error = - png_do_rgb_to_gray(png_ptr, &(png_ptr->row_info), - png_ptr->row_buf + 1); + png_do_rgb_to_gray(png_ptr, &(png_ptr->row_info), + png_ptr->row_buf + 1); + if (rgb_error) { png_ptr->rgb_to_gray_status=1; if ((png_ptr->transformations & PNG_RGB_TO_GRAY) == PNG_RGB_TO_GRAY_WARN) png_warning(png_ptr, "png_do_rgb_to_gray found nongray pixel"); + if ((png_ptr->transformations & PNG_RGB_TO_GRAY) == PNG_RGB_TO_GRAY_ERR) png_error(png_ptr, "png_do_rgb_to_gray found nongray pixel"); @@ -1419,18 +1557,18 @@ png_do_read_transformations(png_structp png_ptr) #ifdef PNG_READ_BACKGROUND_SUPPORTED if ((png_ptr->transformations & PNG_BACKGROUND) && - ((png_ptr->num_trans != 0 ) || - (png_ptr->color_type & PNG_COLOR_MASK_ALPHA))) + ((png_ptr->num_trans != 0) || + (png_ptr->color_type & PNG_COLOR_MASK_ALPHA))) png_do_background(&(png_ptr->row_info), png_ptr->row_buf + 1, - &(png_ptr->trans_color), &(png_ptr->background) + &(png_ptr->trans_color), &(png_ptr->background) #ifdef PNG_READ_GAMMA_SUPPORTED - , &(png_ptr->background_1), - png_ptr->gamma_table, png_ptr->gamma_from_1, - png_ptr->gamma_to_1, png_ptr->gamma_16_table, - png_ptr->gamma_16_from_1, png_ptr->gamma_16_to_1, - png_ptr->gamma_shift + , &(png_ptr->background_1), + png_ptr->gamma_table, png_ptr->gamma_from_1, + png_ptr->gamma_to_1, png_ptr->gamma_16_table, + png_ptr->gamma_16_from_1, png_ptr->gamma_16_to_1, + png_ptr->gamma_shift #endif -); + ); #endif #ifdef PNG_READ_GAMMA_SUPPORTED @@ -1454,11 +1592,22 @@ png_do_read_transformations(png_structp png_ptr) #ifdef PNG_READ_QUANTIZE_SUPPORTED if (png_ptr->transformations & PNG_QUANTIZE) { - png_do_quantize((png_row_infop)&(png_ptr->row_info), png_ptr->row_buf + 1, - png_ptr->palette_lookup, png_ptr->quantize_index); - if (png_ptr->row_info.rowbytes == (png_uint_32)0) + png_do_quantize(&(png_ptr->row_info), png_ptr->row_buf + 1, + png_ptr->palette_lookup, png_ptr->quantize_index); + + if (png_ptr->row_info.rowbytes == 0) png_error(png_ptr, "png_do_quantize returned rowbytes=0"); } +#endif /* PNG_READ_QUANTIZE_SUPPORTED */ + +#ifdef PNG_READ_EXPAND_16_SUPPORTED + /* Do the expansion now, after all the arithmetic has been done. Notice + * that previous transformations can handle the PNG_EXPAND_16 flag if this + * is efficient (particularly true in the case of gamma correction, where + * better accuracy results faster!) + */ + if (png_ptr->transformations & PNG_EXPAND_16) + png_do_expand_16(&png_ptr->row_info, png_ptr->row_buf + 1); #endif #ifdef PNG_READ_INVERT_SUPPORTED @@ -1469,7 +1618,7 @@ png_do_read_transformations(png_structp png_ptr) #ifdef PNG_READ_SHIFT_SUPPORTED if (png_ptr->transformations & PNG_SHIFT) png_do_unshift(&(png_ptr->row_info), png_ptr->row_buf + 1, - &(png_ptr->shift)); + &(png_ptr->shift)); #endif #ifdef PNG_READ_PACK_SUPPORTED @@ -1488,6 +1637,9 @@ png_do_read_transformations(png_structp png_ptr) #endif #ifdef PNG_READ_GRAY_TO_RGB_SUPPORTED + /*NOTE: this must be in the wrong place - what happens if BGR is set too? + * Need pngvalid to test this combo. + */ /* If gray -> RGB, do so now only if we did not do so above */ if ((png_ptr->transformations & PNG_GRAY_TO_RGB) && (png_ptr->mode & PNG_BACKGROUND_IS_GRAY)) @@ -1497,7 +1649,7 @@ png_do_read_transformations(png_structp png_ptr) #ifdef PNG_READ_FILLER_SUPPORTED if (png_ptr->transformations & PNG_FILLER) png_do_read_filler(&(png_ptr->row_info), png_ptr->row_buf + 1, - (png_uint_32)png_ptr->filler, png_ptr->flags); + (png_uint_32)png_ptr->filler, png_ptr->flags); #endif #ifdef PNG_READ_INVERT_ALPHA_SUPPORTED @@ -1510,35 +1662,39 @@ png_do_read_transformations(png_structp png_ptr) png_do_read_swap_alpha(&(png_ptr->row_info), png_ptr->row_buf + 1); #endif +#ifdef PNG_READ_16BIT_SUPPORTED #ifdef PNG_READ_SWAP_SUPPORTED if (png_ptr->transformations & PNG_SWAP_BYTES) png_do_swap(&(png_ptr->row_info), png_ptr->row_buf + 1); #endif +#endif #ifdef PNG_READ_USER_TRANSFORM_SUPPORTED if (png_ptr->transformations & PNG_USER_TRANSFORM) { if (png_ptr->read_user_transform_fn != NULL) (*(png_ptr->read_user_transform_fn)) /* User read transform function */ - (png_ptr, /* png_ptr */ - &(png_ptr->row_info), /* row_info: */ - /* png_uint_32 width; width of row */ - /* png_uint_32 rowbytes; number of bytes in row */ - /* png_byte color_type; color type of pixels */ - /* png_byte bit_depth; bit depth of samples */ - /* png_byte channels; number of channels (1-4) */ - /* png_byte pixel_depth; bits per pixel (depth*channels) */ - png_ptr->row_buf + 1); /* start of pixel data for row */ + (png_ptr, /* png_ptr */ + &(png_ptr->row_info), /* row_info: */ + /* png_uint_32 width; width of row */ + /* png_size_t rowbytes; number of bytes in row */ + /* png_byte color_type; color type of pixels */ + /* png_byte bit_depth; bit depth of samples */ + /* png_byte channels; number of channels (1-4) */ + /* png_byte pixel_depth; bits per pixel (depth*channels) */ + png_ptr->row_buf + 1); /* start of pixel data for row */ #ifdef PNG_USER_TRANSFORM_PTR_SUPPORTED if (png_ptr->user_transform_depth) png_ptr->row_info.bit_depth = png_ptr->user_transform_depth; + if (png_ptr->user_transform_channels) png_ptr->row_info.channels = png_ptr->user_transform_channels; #endif png_ptr->row_info.pixel_depth = (png_byte)(png_ptr->row_info.bit_depth * - png_ptr->row_info.channels); + png_ptr->row_info.channels); + png_ptr->row_info.rowbytes = PNG_ROWBYTES(png_ptr->row_info.pixel_depth, - png_ptr->row_info.width); + png_ptr->row_info.width); } #endif @@ -1571,11 +1727,13 @@ png_do_unpack(png_row_infop row_info, png_bytep row) for (i = 0; i < row_width; i++) { *dp = (png_byte)((*sp >> shift) & 0x01); + if (shift == 7) { shift = 0; sp--; } + else shift++; @@ -1593,11 +1751,13 @@ png_do_unpack(png_row_infop row_info, png_bytep row) for (i = 0; i < row_width; i++) { *dp = (png_byte)((*sp >> shift) & 0x03); + if (shift == 6) { shift = 0; sp--; } + else shift += 2; @@ -1614,11 +1774,13 @@ png_do_unpack(png_row_infop row_info, png_bytep row) for (i = 0; i < row_width; i++) { *dp = (png_byte)((*sp >> shift) & 0x0f); + if (shift == 4) { shift = 0; sp--; } + else shift = 4; @@ -1626,6 +1788,9 @@ png_do_unpack(png_row_infop row_info, png_bytep row) } break; } + + default: + break; } row_info->bit_depth = 8; row_info->pixel_depth = (png_byte)(8 * row_info->channels); @@ -1641,7 +1806,8 @@ png_do_unpack(png_row_infop row_info, png_bytep row) * the values back to 0 through 31. */ void /* PRIVATE */ -png_do_unshift(png_row_infop row_info, png_bytep row, png_color_8p sig_bits) +png_do_unshift(png_row_infop row_info, png_bytep row, + png_const_color_8p sig_bits) { png_debug(1, "in png_do_unshift"); @@ -1660,10 +1826,12 @@ png_do_unshift(png_row_infop row_info, png_bytep row, png_color_8p sig_bits) shift[channels++] = row_info->bit_depth - sig_bits->green; shift[channels++] = row_info->bit_depth - sig_bits->blue; } + else { shift[channels++] = row_info->bit_depth - sig_bits->gray; } + if (row_info->color_type & PNG_COLOR_MASK_ALPHA) { shift[channels++] = row_info->bit_depth - sig_bits->alpha; @@ -1673,6 +1841,7 @@ png_do_unshift(png_row_infop row_info, png_bytep row, png_color_8p sig_bits) { if (shift[c] <= 0) shift[c] = 0; + else value = 1; } @@ -1682,11 +1851,14 @@ png_do_unshift(png_row_infop row_info, png_bytep row, png_color_8p sig_bits) switch (row_info->bit_depth) { + default: + break; + case 2: { png_bytep bp; - png_uint_32 i; - png_uint_32 istop = row_info->rowbytes; + png_size_t i; + png_size_t istop = row_info->rowbytes; for (bp = row, i = 0; i < istop; i++) { @@ -1699,10 +1871,10 @@ png_do_unshift(png_row_infop row_info, png_bytep row, png_color_8p sig_bits) case 4: { png_bytep bp = row; - png_uint_32 i; - png_uint_32 istop = row_info->rowbytes; + png_size_t i; + png_size_t istop = row_info->rowbytes; png_byte mask = (png_byte)((((int)0xf0 >> shift[0]) & (int)0xf0) | - (png_byte)((int)0xf >> shift[0])); + (png_byte)((int)0xf >> shift[0])); for (i = 0; i < istop; i++) { @@ -1725,6 +1897,7 @@ png_do_unshift(png_row_infop row_info, png_bytep row, png_color_8p sig_bits) break; } +#ifdef PNG_READ_16BIT_SUPPORTED case 16: { png_bytep bp = row; @@ -1740,6 +1913,7 @@ png_do_unshift(png_row_infop row_info, png_bytep row, png_color_8p sig_bits) } break; } +#endif } } } @@ -1827,6 +2001,8 @@ png_do_read_swap_alpha(png_row_infop row_info, png_bytep row) *(--dp) = save; } } + +#ifdef PNG_READ_16BIT_SUPPORTED /* This converts from RRGGBBAA to AARRGGBB */ else { @@ -1849,7 +2025,9 @@ png_do_read_swap_alpha(png_row_infop row_info, png_bytep row) *(--dp) = save[1]; } } +#endif } + else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA) { /* This converts from GA to AG */ @@ -1867,6 +2045,8 @@ png_do_read_swap_alpha(png_row_infop row_info, png_bytep row) *(--dp) = save; } } + +#ifdef PNG_READ_16BIT_SUPPORTED /* This converts from GGAA to AAGG */ else { @@ -1885,6 +2065,7 @@ png_do_read_swap_alpha(png_row_infop row_info, png_bytep row) *(--dp) = save[1]; } } +#endif } } } @@ -1894,94 +2075,99 @@ png_do_read_swap_alpha(png_row_infop row_info, png_bytep row) void /* PRIVATE */ png_do_read_invert_alpha(png_row_infop row_info, png_bytep row) { + png_uint_32 row_width; png_debug(1, "in png_do_read_invert_alpha"); + row_width = row_info->width; + if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) { - png_uint_32 row_width = row_info->width; - if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) + if (row_info->bit_depth == 8) { /* This inverts the alpha channel in RGBA */ - if (row_info->bit_depth == 8) + png_bytep sp = row + row_info->rowbytes; + png_bytep dp = sp; + png_uint_32 i; + + for (i = 0; i < row_width; i++) { - png_bytep sp = row + row_info->rowbytes; - png_bytep dp = sp; - png_uint_32 i; + *(--dp) = (png_byte)(255 - *(--sp)); - for (i = 0; i < row_width; i++) - { - *(--dp) = (png_byte)(255 - *(--sp)); - -/* This does nothing: - *(--dp) = *(--sp); - *(--dp) = *(--sp); - *(--dp) = *(--sp); - We can replace it with: +/* This does nothing: + *(--dp) = *(--sp); + *(--dp) = *(--sp); + *(--dp) = *(--sp); + We can replace it with: */ - sp-=3; - dp=sp; - } - } - /* This inverts the alpha channel in RRGGBBAA */ - else - { - png_bytep sp = row + row_info->rowbytes; - png_bytep dp = sp; - png_uint_32 i; - - for (i = 0; i < row_width; i++) - { - *(--dp) = (png_byte)(255 - *(--sp)); - *(--dp) = (png_byte)(255 - *(--sp)); - -/* This does nothing: - *(--dp) = *(--sp); - *(--dp) = *(--sp); - *(--dp) = *(--sp); - *(--dp) = *(--sp); - *(--dp) = *(--sp); - *(--dp) = *(--sp); - We can replace it with: -*/ - sp-=6; - dp=sp; - } + sp-=3; + dp=sp; } } - else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA) + +#ifdef PNG_READ_16BIT_SUPPORTED + /* This inverts the alpha channel in RRGGBBAA */ + else + { + png_bytep sp = row + row_info->rowbytes; + png_bytep dp = sp; + png_uint_32 i; + + for (i = 0; i < row_width; i++) + { + *(--dp) = (png_byte)(255 - *(--sp)); + *(--dp) = (png_byte)(255 - *(--sp)); + +/* This does nothing: + *(--dp) = *(--sp); + *(--dp) = *(--sp); + *(--dp) = *(--sp); + *(--dp) = *(--sp); + *(--dp) = *(--sp); + *(--dp) = *(--sp); + We can replace it with: +*/ + sp-=6; + dp=sp; + } + } +#endif + } + else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA) + { + if (row_info->bit_depth == 8) { /* This inverts the alpha channel in GA */ - if (row_info->bit_depth == 8) - { - png_bytep sp = row + row_info->rowbytes; - png_bytep dp = sp; - png_uint_32 i; + png_bytep sp = row + row_info->rowbytes; + png_bytep dp = sp; + png_uint_32 i; - for (i = 0; i < row_width; i++) - { - *(--dp) = (png_byte)(255 - *(--sp)); - *(--dp) = *(--sp); - } - } - /* This inverts the alpha channel in GGAA */ - else + for (i = 0; i < row_width; i++) { - png_bytep sp = row + row_info->rowbytes; - png_bytep dp = sp; - png_uint_32 i; - - for (i = 0; i < row_width; i++) - { - *(--dp) = (png_byte)(255 - *(--sp)); - *(--dp) = (png_byte)(255 - *(--sp)); -/* - *(--dp) = *(--sp); - *(--dp) = *(--sp); -*/ - sp-=2; - dp=sp; - } + *(--dp) = (png_byte)(255 - *(--sp)); + *(--dp) = *(--sp); } } + +#ifdef PNG_READ_16BIT_SUPPORTED + else + { + /* This inverts the alpha channel in GGAA */ + png_bytep sp = row + row_info->rowbytes; + png_bytep dp = sp; + png_uint_32 i; + + for (i = 0; i < row_width; i++) + { + *(--dp) = (png_byte)(255 - *(--sp)); + *(--dp) = (png_byte)(255 - *(--sp)); +/* + *(--dp) = *(--sp); + *(--dp) = *(--sp); +*/ + sp-=2; + dp=sp; + } + } +#endif } } #endif @@ -1990,12 +2176,14 @@ png_do_read_invert_alpha(png_row_infop row_info, png_bytep row) /* Add filler channel if we have RGB color */ void /* PRIVATE */ png_do_read_filler(png_row_infop row_info, png_bytep row, - png_uint_32 filler, png_uint_32 flags) + png_uint_32 filler, png_uint_32 flags) { png_uint_32 i; png_uint_32 row_width = row_info->width; +#ifdef PNG_READ_16BIT_SUPPORTED png_byte hi_filler = (png_byte)((filler>>8) & 0xff); +#endif png_byte lo_filler = (png_byte)(filler & 0xff); png_debug(1, "in png_do_read_filler"); @@ -2005,9 +2193,9 @@ png_do_read_filler(png_row_infop row_info, png_bytep row, { if (row_info->bit_depth == 8) { - /* This changes the data from G to GX */ if (flags & PNG_FLAG_FILLER_AFTER) { + /* This changes the data from G to GX */ png_bytep sp = row + (png_size_t)row_width; png_bytep dp = sp + (png_size_t)row_width; for (i = 1; i < row_width; i++) @@ -2020,9 +2208,10 @@ png_do_read_filler(png_row_infop row_info, png_bytep row, row_info->pixel_depth = 16; row_info->rowbytes = row_width * 2; } - /* This changes the data from G to XG */ + else { + /* This changes the data from G to XG */ png_bytep sp = row + (png_size_t)row_width; png_bytep dp = sp + (png_size_t)row_width; for (i = 0; i < row_width; i++) @@ -2035,11 +2224,13 @@ png_do_read_filler(png_row_infop row_info, png_bytep row, row_info->rowbytes = row_width * 2; } } + +#ifdef PNG_READ_16BIT_SUPPORTED else if (row_info->bit_depth == 16) { - /* This changes the data from GG to GGXX */ if (flags & PNG_FLAG_FILLER_AFTER) { + /* This changes the data from GG to GGXX */ png_bytep sp = row + (png_size_t)row_width * 2; png_bytep dp = sp + (png_size_t)row_width * 2; for (i = 1; i < row_width; i++) @@ -2055,9 +2246,10 @@ png_do_read_filler(png_row_infop row_info, png_bytep row, row_info->pixel_depth = 32; row_info->rowbytes = row_width * 4; } - /* This changes the data from GG to XXGG */ + else { + /* This changes the data from GG to XXGG */ png_bytep sp = row + (png_size_t)row_width * 2; png_bytep dp = sp + (png_size_t)row_width * 2; for (i = 0; i < row_width; i++) @@ -2072,14 +2264,15 @@ png_do_read_filler(png_row_infop row_info, png_bytep row, row_info->rowbytes = row_width * 4; } } +#endif } /* COLOR_TYPE == GRAY */ else if (row_info->color_type == PNG_COLOR_TYPE_RGB) { if (row_info->bit_depth == 8) { - /* This changes the data from RGB to RGBX */ if (flags & PNG_FLAG_FILLER_AFTER) { + /* This changes the data from RGB to RGBX */ png_bytep sp = row + (png_size_t)row_width * 3; png_bytep dp = sp + (png_size_t)row_width; for (i = 1; i < row_width; i++) @@ -2094,9 +2287,10 @@ png_do_read_filler(png_row_infop row_info, png_bytep row, row_info->pixel_depth = 32; row_info->rowbytes = row_width * 4; } - /* This changes the data from RGB to XRGB */ + else { + /* This changes the data from RGB to XRGB */ png_bytep sp = row + (png_size_t)row_width * 3; png_bytep dp = sp + (png_size_t)row_width; for (i = 0; i < row_width; i++) @@ -2111,11 +2305,13 @@ png_do_read_filler(png_row_infop row_info, png_bytep row, row_info->rowbytes = row_width * 4; } } + +#ifdef PNG_READ_16BIT_SUPPORTED else if (row_info->bit_depth == 16) { - /* This changes the data from RRGGBB to RRGGBBXX */ if (flags & PNG_FLAG_FILLER_AFTER) { + /* This changes the data from RRGGBB to RRGGBBXX */ png_bytep sp = row + (png_size_t)row_width * 6; png_bytep dp = sp + (png_size_t)row_width * 2; for (i = 1; i < row_width; i++) @@ -2135,9 +2331,10 @@ png_do_read_filler(png_row_infop row_info, png_bytep row, row_info->pixel_depth = 64; row_info->rowbytes = row_width * 8; } - /* This changes the data from RRGGBB to XXRRGGBB */ + else { + /* This changes the data from RRGGBB to XXRRGGBB */ png_bytep sp = row + (png_size_t)row_width * 6; png_bytep dp = sp + (png_size_t)row_width * 2; for (i = 0; i < row_width; i++) @@ -2151,11 +2348,13 @@ png_do_read_filler(png_row_infop row_info, png_bytep row, *(--dp) = hi_filler; *(--dp) = lo_filler; } + row_info->channels = 4; row_info->pixel_depth = 64; row_info->rowbytes = row_width * 8; } } +#endif } /* COLOR_TYPE == RGB */ } #endif @@ -2171,12 +2370,13 @@ png_do_gray_to_rgb(png_row_infop row_info, png_bytep row) png_debug(1, "in png_do_gray_to_rgb"); if (row_info->bit_depth >= 8 && - !(row_info->color_type & PNG_COLOR_MASK_COLOR)) + !(row_info->color_type & PNG_COLOR_MASK_COLOR)) { if (row_info->color_type == PNG_COLOR_TYPE_GRAY) { if (row_info->bit_depth == 8) { + /* This changes G to RGB */ png_bytep sp = row + (png_size_t)row_width - 1; png_bytep dp = sp + (png_size_t)row_width * 2; for (i = 0; i < row_width; i++) @@ -2186,8 +2386,10 @@ png_do_gray_to_rgb(png_row_infop row_info, png_bytep row) *(dp--) = *(sp--); } } + else { + /* This changes GG to RRGGBB */ png_bytep sp = row + (png_size_t)row_width * 2 - 1; png_bytep dp = sp + (png_size_t)row_width * 4; for (i = 0; i < row_width; i++) @@ -2201,10 +2403,12 @@ png_do_gray_to_rgb(png_row_infop row_info, png_bytep row) } } } + else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA) { if (row_info->bit_depth == 8) { + /* This changes GA to RGBA */ png_bytep sp = row + (png_size_t)row_width * 2 - 1; png_bytep dp = sp + (png_size_t)row_width * 2; for (i = 0; i < row_width; i++) @@ -2215,8 +2419,10 @@ png_do_gray_to_rgb(png_row_infop row_info, png_bytep row) *(dp--) = *(sp--); } } + else { + /* This changes GGAA to RRGGBBAA */ png_bytep sp = row + (png_size_t)row_width * 4 - 1; png_bytep dp = sp + (png_size_t)row_width * 4; for (i = 0; i < row_width; i++) @@ -2235,7 +2441,7 @@ png_do_gray_to_rgb(png_row_infop row_info, png_bytep row) row_info->channels += (png_byte)2; row_info->color_type |= PNG_COLOR_MASK_COLOR; row_info->pixel_depth = (png_byte)(row_info->channels * - row_info->bit_depth); + row_info->bit_depth); row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, row_width); } } @@ -2274,8 +2480,8 @@ png_do_rgb_to_gray(png_structp png_ptr, png_row_infop row_info, png_bytep row) png_debug(1, "in png_do_rgb_to_gray"); - if ( - (row_info->color_type & PNG_COLOR_MASK_COLOR)) + if (!(row_info->color_type & PNG_COLOR_MASK_PALETTE) && + (row_info->color_type & PNG_COLOR_MASK_COLOR)) { png_uint_32 rc = png_ptr->rgb_to_gray_red_coeff; png_uint_32 gc = png_ptr->rgb_to_gray_green_coeff; @@ -2296,12 +2502,14 @@ png_do_rgb_to_gray(png_structp png_ptr, png_row_infop row_info, png_bytep row) png_byte red = png_ptr->gamma_to_1[*(sp++)]; png_byte green = png_ptr->gamma_to_1[*(sp++)]; png_byte blue = png_ptr->gamma_to_1[*(sp++)]; + if (red != green || red != blue) { rgb_error |= 1; *(dp++) = png_ptr->gamma_from_1[ - (rc*red + gc*green + bc*blue)>>15]; + (rc*red + gc*green + bc*blue)>>15]; } + else *(dp++) = *(sp - 1); } @@ -2316,11 +2524,13 @@ png_do_rgb_to_gray(png_structp png_ptr, png_row_infop row_info, png_bytep row) png_byte red = *(sp++); png_byte green = *(sp++); png_byte blue = *(sp++); + if (red != green || red != blue) { rgb_error |= 1; *(dp++) = (png_byte)((rc*red + gc*green + bc*blue)>>15); } + else *(dp++) = *(sp - 1); } @@ -2339,23 +2549,24 @@ png_do_rgb_to_gray(png_structp png_ptr, png_row_infop row_info, png_bytep row) { png_uint_16 red, green, blue, w; - red = (png_uint_16)(((*(sp))<<8) | *(sp+1)); sp+=2; - green = (png_uint_16)(((*(sp))<<8) | *(sp+1)); sp+=2; - blue = (png_uint_16)(((*(sp))<<8) | *(sp+1)); sp+=2; + red = (png_uint_16)(((*(sp))<<8) | *(sp + 1)); sp += 2; + green = (png_uint_16)(((*(sp))<<8) | *(sp + 1)); sp += 2; + blue = (png_uint_16)(((*(sp))<<8) | *(sp + 1)); sp += 2; if (red == green && red == blue) w = red; + else { - png_uint_16 red_1 = png_ptr->gamma_16_to_1[(red&0xff) >> - png_ptr->gamma_shift][red>>8]; + png_uint_16 red_1 = png_ptr->gamma_16_to_1[(red&0xff) + >> png_ptr->gamma_shift][red>>8]; png_uint_16 green_1 = png_ptr->gamma_16_to_1[(green&0xff) >> - png_ptr->gamma_shift][green>>8]; - png_uint_16 blue_1 = png_ptr->gamma_16_to_1[(blue&0xff) >> - png_ptr->gamma_shift][blue>>8]; + png_ptr->gamma_shift][green>>8]; + png_uint_16 blue_1 = png_ptr->gamma_16_to_1[(blue&0xff) + >> png_ptr->gamma_shift][blue>>8]; png_uint_16 gray16 = (png_uint_16)((rc*red_1 + gc*green_1 - + bc*blue_1)>>15); + + bc*blue_1)>>15); w = png_ptr->gamma_16_from_1[(gray16&0xff) >> png_ptr->gamma_shift][gray16 >> 8]; rgb_error |= 1; @@ -2374,12 +2585,13 @@ png_do_rgb_to_gray(png_structp png_ptr, png_row_infop row_info, png_bytep row) { png_uint_16 red, green, blue, gray16; - red = (png_uint_16)(((*(sp))<<8) | *(sp+1)); sp+=2; - green = (png_uint_16)(((*(sp))<<8) | *(sp+1)); sp+=2; - blue = (png_uint_16)(((*(sp))<<8) | *(sp+1)); sp+=2; + red = (png_uint_16)(((*(sp))<<8) | *(sp + 1)); sp += 2; + green = (png_uint_16)(((*(sp))<<8) | *(sp + 1)); sp += 2; + blue = (png_uint_16)(((*(sp))<<8) | *(sp + 1)); sp += 2; if (red != green || red != blue) rgb_error |= 1; + gray16 = (png_uint_16)((rc*red + gc*green + bc*blue)>>15); *(dp++) = (png_byte)((gray16>>8) & 0xff); *(dp++) = (png_byte)(gray16 & 0xff); @@ -2401,10 +2613,13 @@ png_do_rgb_to_gray(png_structp png_ptr, png_row_infop row_info, png_bytep row) png_byte red = png_ptr->gamma_to_1[*(sp++)]; png_byte green = png_ptr->gamma_to_1[*(sp++)]; png_byte blue = png_ptr->gamma_to_1[*(sp++)]; + if (red != green || red != blue) rgb_error |= 1; + *(dp++) = png_ptr->gamma_from_1 - [(rc*red + gc*green + bc*blue)>>15]; + [(rc*red + gc*green + bc*blue)>>15]; + *(dp++) = *(sp++); /* alpha */ } } @@ -2420,6 +2635,7 @@ png_do_rgb_to_gray(png_structp png_ptr, png_row_infop row_info, png_bytep row) png_byte blue = *(sp++); if (red != green || red != blue) rgb_error |= 1; + *(dp++) = (png_byte)((rc*red + gc*green + bc*blue)>>15); *(dp++) = *(sp++); /* alpha */ } @@ -2437,25 +2653,31 @@ png_do_rgb_to_gray(png_structp png_ptr, png_row_infop row_info, png_bytep row) { png_uint_16 red, green, blue, w; - red = (png_uint_16)(((*(sp))<<8) | *(sp+1)); sp+=2; - green = (png_uint_16)(((*(sp))<<8) | *(sp+1)); sp+=2; - blue = (png_uint_16)(((*(sp))<<8) | *(sp+1)); sp+=2; + red = (png_uint_16)(((*(sp))<<8) | *(sp + 1)); sp += 2; + green = (png_uint_16)(((*(sp))<<8) | *(sp + 1)); sp += 2; + blue = (png_uint_16)(((*(sp))<<8) | *(sp + 1)); sp += 2; if (red == green && red == blue) w = red; + else { png_uint_16 red_1 = png_ptr->gamma_16_to_1[(red&0xff) >> png_ptr->gamma_shift][red>>8]; + png_uint_16 green_1 = png_ptr->gamma_16_to_1[(green&0xff) >> png_ptr->gamma_shift][green>>8]; + png_uint_16 blue_1 = png_ptr->gamma_16_to_1[(blue&0xff) >> png_ptr->gamma_shift][blue>>8]; + png_uint_16 gray16 = (png_uint_16)((rc * red_1 + gc * green_1 + bc * blue_1)>>15); + w = png_ptr->gamma_16_from_1[(gray16&0xff) >> png_ptr->gamma_shift][gray16 >> 8]; + rgb_error |= 1; } @@ -2473,11 +2695,13 @@ png_do_rgb_to_gray(png_structp png_ptr, png_row_infop row_info, png_bytep row) for (i = 0; i < row_width; i++) { png_uint_16 red, green, blue, gray16; - red = (png_uint_16)((*(sp)<<8) | *(sp+1)); sp+=2; - green = (png_uint_16)((*(sp)<<8) | *(sp+1)); sp+=2; - blue = (png_uint_16)((*(sp)<<8) | *(sp+1)); sp+=2; + red = (png_uint_16)((*(sp)<<8) | *(sp + 1)); sp += 2; + green = (png_uint_16)((*(sp)<<8) | *(sp + 1)); sp += 2; + blue = (png_uint_16)((*(sp)<<8) | *(sp + 1)); sp += 2; + if (red != green || red != blue) rgb_error |= 1; + gray16 = (png_uint_16)((rc*red + gc*green + bc*blue)>>15); *(dp++) = (png_byte)((gray16>>8) & 0xff); *(dp++) = (png_byte)(gray16 & 0xff); @@ -2487,10 +2711,11 @@ png_do_rgb_to_gray(png_structp png_ptr, png_row_infop row_info, png_bytep row) } } } - row_info->channels -= (png_byte)2; - row_info->color_type &= ~PNG_COLOR_MASK_COLOR; + row_info->channels -= 2; + row_info->color_type = (png_byte)(row_info->color_type & + ~PNG_COLOR_MASK_COLOR); row_info->pixel_depth = (png_byte)(row_info->channels * - row_info->bit_depth); + row_info->bit_depth); row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, row_width); } return rgb_error; @@ -2559,18 +2784,18 @@ png_build_grayscale_palette(int bit_depth, png_colorp palette) */ void /* PRIVATE */ png_do_background(png_row_infop row_info, png_bytep row, - png_color_16p trans_color, png_color_16p background + png_const_color_16p trans_color, png_const_color_16p background #ifdef PNG_READ_GAMMA_SUPPORTED - , png_color_16p background_1, - png_bytep gamma_table, png_bytep gamma_from_1, png_bytep gamma_to_1, - png_uint_16pp gamma_16, png_uint_16pp gamma_16_from_1, - png_uint_16pp gamma_16_to_1, int gamma_shift + , png_const_color_16p background_1, png_const_bytep gamma_table, + png_const_bytep gamma_from_1, png_const_bytep gamma_to_1, + png_const_uint_16pp gamma_16, png_const_uint_16pp gamma_16_from_1, + png_const_uint_16pp gamma_16_to_1, int gamma_shift #endif - ) + ) { png_bytep sp, dp; png_uint_32 i; - png_uint_32 row_width=row_info->width; + png_uint_32 row_width = row_info->width; int shift; png_debug(1, "in png_do_background"); @@ -2597,11 +2822,13 @@ png_do_background(png_row_infop row_info, png_bytep row, *sp &= (png_byte)((0x7f7f >> (7 - shift)) & 0xff); *sp |= (png_byte)(background->gray << shift); } + if (!shift) { shift = 7; sp++; } + else shift--; } @@ -2623,6 +2850,7 @@ png_do_background(png_row_infop row_info, png_bytep row, *sp &= (png_byte)((0x3f3f >> (6 - shift)) & 0xff); *sp |= (png_byte)(background->gray << shift); } + else { png_byte p = (png_byte)((*sp >> shift) & 0x03); @@ -2631,15 +2859,18 @@ png_do_background(png_row_infop row_info, png_bytep row, *sp &= (png_byte)((0x3f3f >> (6 - shift)) & 0xff); *sp |= (png_byte)(g << shift); } + if (!shift) { shift = 6; sp++; } + else shift -= 2; } } + else #endif { @@ -2653,11 +2884,13 @@ png_do_background(png_row_infop row_info, png_bytep row, *sp &= (png_byte)((0x3f3f >> (6 - shift)) & 0xff); *sp |= (png_byte)(background->gray << shift); } + if (!shift) { shift = 6; sp++; } + else shift -= 2; } @@ -2680,23 +2913,27 @@ png_do_background(png_row_infop row_info, png_bytep row, *sp &= (png_byte)((0xf0f >> (4 - shift)) & 0xff); *sp |= (png_byte)(background->gray << shift); } + else { png_byte p = (png_byte)((*sp >> shift) & 0x0f); png_byte g = (png_byte)((gamma_table[p | - (p << 4)] >> 4) & 0x0f); + (p << 4)] >> 4) & 0x0f); *sp &= (png_byte)((0xf0f >> (4 - shift)) & 0xff); *sp |= (png_byte)(g << shift); } + if (!shift) { shift = 4; sp++; } + else shift -= 4; } } + else #endif { @@ -2710,11 +2947,13 @@ png_do_background(png_row_infop row_info, png_bytep row, *sp &= (png_byte)((0xf0f >> (4 - shift)) & 0xff); *sp |= (png_byte)(background->gray << shift); } + if (!shift) { shift = 4; sp++; } + else shift -= 4; } @@ -2731,13 +2970,10 @@ png_do_background(png_row_infop row_info, png_bytep row, for (i = 0; i < row_width; i++, sp++) { if (*sp == trans_color->gray) - { *sp = (png_byte)background->gray; - } + else - { *sp = gamma_table[*sp]; - } } } else @@ -2747,9 +2983,7 @@ png_do_background(png_row_infop row_info, png_bytep row, for (i = 0; i < row_width; i++, sp++) { if (*sp == trans_color->gray) - { *sp = (png_byte)background->gray; - } } } break; @@ -2766,12 +3000,14 @@ png_do_background(png_row_infop row_info, png_bytep row, png_uint_16 v; v = (png_uint_16)(((*sp) << 8) + *(sp + 1)); + if (v == trans_color->gray) { /* Background is already in screen gamma */ *sp = (png_byte)((background->gray >> 8) & 0xff); *(sp + 1) = (png_byte)(background->gray & 0xff); } + else { v = gamma_16[*(sp + 1) >> gamma_shift][*sp]; @@ -2789,6 +3025,7 @@ png_do_background(png_row_infop row_info, png_bytep row, png_uint_16 v; v = (png_uint_16)(((*sp) << 8) + *(sp + 1)); + if (v == trans_color->gray) { *sp = (png_byte)((background->gray >> 8) & 0xff); @@ -2798,6 +3035,9 @@ png_do_background(png_row_infop row_info, png_bytep row, } break; } + + default: + break; } break; } @@ -2813,13 +3053,14 @@ png_do_background(png_row_infop row_info, png_bytep row, for (i = 0; i < row_width; i++, sp += 3) { if (*sp == trans_color->red && - *(sp + 1) == trans_color->green && - *(sp + 2) == trans_color->blue) + *(sp + 1) == trans_color->green && + *(sp + 2) == trans_color->blue) { *sp = (png_byte)background->red; *(sp + 1) = (png_byte)background->green; *(sp + 2) = (png_byte)background->blue; } + else { *sp = gamma_table[*sp]; @@ -2835,8 +3076,8 @@ png_do_background(png_row_infop row_info, png_bytep row, for (i = 0; i < row_width; i++, sp += 3) { if (*sp == trans_color->red && - *(sp + 1) == trans_color->green && - *(sp + 2) == trans_color->blue) + *(sp + 1) == trans_color->green && + *(sp + 2) == trans_color->blue) { *sp = (png_byte)background->red; *(sp + 1) = (png_byte)background->green; @@ -2854,10 +3095,15 @@ png_do_background(png_row_infop row_info, png_bytep row, for (i = 0; i < row_width; i++, sp += 6) { png_uint_16 r = (png_uint_16)(((*sp) << 8) + *(sp + 1)); - png_uint_16 g = (png_uint_16)(((*(sp+2)) << 8) + *(sp+3)); - png_uint_16 b = (png_uint_16)(((*(sp+4)) << 8) + *(sp+5)); + + png_uint_16 g = (png_uint_16)(((*(sp + 2)) << 8) + + *(sp + 3)); + + png_uint_16 b = (png_uint_16)(((*(sp + 4)) << 8) + + *(sp + 5)); + if (r == trans_color->red && g == trans_color->green && - b == trans_color->blue) + b == trans_color->blue) { /* Background is already in screen gamma */ *sp = (png_byte)((background->red >> 8) & 0xff); @@ -2867,32 +3113,40 @@ png_do_background(png_row_infop row_info, png_bytep row, *(sp + 4) = (png_byte)((background->blue >> 8) & 0xff); *(sp + 5) = (png_byte)(background->blue & 0xff); } + else { png_uint_16 v = gamma_16[*(sp + 1) >> gamma_shift][*sp]; *sp = (png_byte)((v >> 8) & 0xff); *(sp + 1) = (png_byte)(v & 0xff); + v = gamma_16[*(sp + 3) >> gamma_shift][*(sp + 2)]; *(sp + 2) = (png_byte)((v >> 8) & 0xff); *(sp + 3) = (png_byte)(v & 0xff); + v = gamma_16[*(sp + 5) >> gamma_shift][*(sp + 4)]; *(sp + 4) = (png_byte)((v >> 8) & 0xff); *(sp + 5) = (png_byte)(v & 0xff); } } } + else #endif { sp = row; for (i = 0; i < row_width; i++, sp += 6) { - png_uint_16 r = (png_uint_16)(((*sp) << 8) + *(sp+1)); - png_uint_16 g = (png_uint_16)(((*(sp+2)) << 8) + *(sp+3)); - png_uint_16 b = (png_uint_16)(((*(sp+4)) << 8) + *(sp+5)); + png_uint_16 r = (png_uint_16)(((*sp) << 8) + *(sp + 1)); + + png_uint_16 g = (png_uint_16)(((*(sp + 2)) << 8) + + *(sp + 3)); + + png_uint_16 b = (png_uint_16)(((*(sp + 4)) << 8) + + *(sp + 5)); if (r == trans_color->red && g == trans_color->green && - b == trans_color->blue) + b == trans_color->blue) { *sp = (png_byte)((background->red >> 8) & 0xff); *(sp + 1) = (png_byte)(background->red & 0xff); @@ -2922,14 +3176,14 @@ png_do_background(png_row_infop row_info, png_bytep row, png_uint_16 a = *(sp + 1); if (a == 0xff) - { *dp = gamma_table[*sp]; - } + else if (a == 0) { /* Background is already in screen gamma */ *dp = (png_byte)background->gray; } + else { png_byte v, w; @@ -2950,18 +3204,15 @@ png_do_background(png_row_infop row_info, png_bytep row, png_byte a = *(sp + 1); if (a == 0xff) - { *dp = *sp; - } + #ifdef PNG_READ_GAMMA_SUPPORTED else if (a == 0) - { *dp = (png_byte)background->gray; - } + else - { png_composite(*dp, *sp, a, background_1->gray); - } + #else *dp = (png_byte)background->gray; #endif @@ -2978,7 +3229,8 @@ png_do_background(png_row_infop row_info, png_bytep row, dp = row; for (i = 0; i < row_width; i++, sp += 4, dp += 2) { - png_uint_16 a = (png_uint_16)(((*(sp+2)) << 8) + *(sp+3)); + png_uint_16 a = (png_uint_16)(((*(sp + 2)) << 8) + + *(sp + 3)); if (a == (png_uint_16)0xffff) { @@ -2988,6 +3240,7 @@ png_do_background(png_row_infop row_info, png_bytep row, *dp = (png_byte)((v >> 8) & 0xff); *(dp + 1) = (png_byte)(v & 0xff); } + #ifdef PNG_READ_GAMMA_SUPPORTED else if (a == 0) #else @@ -2998,6 +3251,7 @@ png_do_background(png_row_infop row_info, png_bytep row, *dp = (png_byte)((background->gray >> 8) & 0xff); *(dp + 1) = (png_byte)(background->gray & 0xff); } + #ifdef PNG_READ_GAMMA_SUPPORTED else { @@ -3019,11 +3273,12 @@ png_do_background(png_row_infop row_info, png_bytep row, dp = row; for (i = 0; i < row_width; i++, sp += 4, dp += 2) { - png_uint_16 a = (png_uint_16)(((*(sp+2)) << 8) + *(sp+3)); + png_uint_16 a = (png_uint_16)(((*(sp + 2)) << 8) + + *(sp + 3)); + if (a == (png_uint_16)0xffff) - { png_memcpy(dp, sp, 2); - } + #ifdef PNG_READ_GAMMA_SUPPORTED else if (a == 0) #else @@ -3033,6 +3288,7 @@ png_do_background(png_row_infop row_info, png_bytep row, *dp = (png_byte)((background->gray >> 8) & 0xff); *(dp + 1) = (png_byte)(background->gray & 0xff); } + #ifdef PNG_READ_GAMMA_SUPPORTED else { @@ -3070,6 +3326,7 @@ png_do_background(png_row_infop row_info, png_bytep row, *(dp + 1) = gamma_table[*(sp + 1)]; *(dp + 2) = gamma_table[*(sp + 2)]; } + else if (a == 0) { /* Background is already in screen gamma */ @@ -3077,6 +3334,7 @@ png_do_background(png_row_infop row_info, png_bytep row, *(dp + 1) = (png_byte)background->green; *(dp + 2) = (png_byte)background->blue; } + else { png_byte v, w; @@ -3084,9 +3342,11 @@ png_do_background(png_row_infop row_info, png_bytep row, v = gamma_to_1[*sp]; png_composite(w, v, a, background_1->red); *dp = gamma_from_1[w]; + v = gamma_to_1[*(sp + 1)]; png_composite(w, v, a, background_1->green); *(dp + 1) = gamma_from_1[w]; + v = gamma_to_1[*(sp + 2)]; png_composite(w, v, a, background_1->blue); *(dp + 2) = gamma_from_1[w]; @@ -3108,19 +3368,23 @@ png_do_background(png_row_infop row_info, png_bytep row, *(dp + 1) = *(sp + 1); *(dp + 2) = *(sp + 2); } + else if (a == 0) { *dp = (png_byte)background->red; *(dp + 1) = (png_byte)background->green; *(dp + 2) = (png_byte)background->blue; } + else { png_composite(*dp, *sp, a, background->red); + png_composite(*(dp + 1), *(sp + 1), a, - background->green); + background->green); + png_composite(*(dp + 2), *(sp + 2), a, - background->blue); + background->blue); } } } @@ -3137,6 +3401,7 @@ png_do_background(png_row_infop row_info, png_bytep row, { png_uint_16 a = (png_uint_16)(((png_uint_16)(*(sp + 6)) << 8) + (png_uint_16)(*(sp + 7))); + if (a == (png_uint_16)0xffff) { png_uint_16 v; @@ -3144,13 +3409,16 @@ png_do_background(png_row_infop row_info, png_bytep row, v = gamma_16[*(sp + 1) >> gamma_shift][*sp]; *dp = (png_byte)((v >> 8) & 0xff); *(dp + 1) = (png_byte)(v & 0xff); + v = gamma_16[*(sp + 3) >> gamma_shift][*(sp + 2)]; *(dp + 2) = (png_byte)((v >> 8) & 0xff); *(dp + 3) = (png_byte)(v & 0xff); + v = gamma_16[*(sp + 5) >> gamma_shift][*(sp + 4)]; *(dp + 4) = (png_byte)((v >> 8) & 0xff); *(dp + 5) = (png_byte)(v & 0xff); } + else if (a == 0) { /* Background is already in screen gamma */ @@ -3161,28 +3429,35 @@ png_do_background(png_row_infop row_info, png_bytep row, *(dp + 4) = (png_byte)((background->blue >> 8) & 0xff); *(dp + 5) = (png_byte)(background->blue & 0xff); } + else { png_uint_16 v, w, x; v = gamma_16_to_1[*(sp + 1) >> gamma_shift][*sp]; png_composite_16(w, v, a, background_1->red); + x = gamma_16_from_1[((w&0xff) >> gamma_shift)][w >> 8]; *dp = (png_byte)((x >> 8) & 0xff); *(dp + 1) = (png_byte)(x & 0xff); + v = gamma_16_to_1[*(sp + 3) >> gamma_shift][*(sp + 2)]; png_composite_16(w, v, a, background_1->green); + x = gamma_16_from_1[((w&0xff) >> gamma_shift)][w >> 8]; *(dp + 2) = (png_byte)((x >> 8) & 0xff); *(dp + 3) = (png_byte)(x & 0xff); + v = gamma_16_to_1[*(sp + 5) >> gamma_shift][*(sp + 4)]; png_composite_16(w, v, a, background_1->blue); + x = gamma_16_from_1[(w & 0xff) >> gamma_shift][w >> 8]; *(dp + 4) = (png_byte)((x >> 8) & 0xff); *(dp + 5) = (png_byte)(x & 0xff); } } } + else #endif { @@ -3191,11 +3466,13 @@ png_do_background(png_row_infop row_info, png_bytep row, for (i = 0; i < row_width; i++, sp += 8, dp += 6) { png_uint_16 a = (png_uint_16)(((png_uint_16)(*(sp + 6)) - << 8) + (png_uint_16)(*(sp + 7))); + << 8) + (png_uint_16)(*(sp + 7))); + if (a == (png_uint_16)0xffff) { png_memcpy(dp, sp, 6); } + else if (a == 0) { *dp = (png_byte)((background->red >> 8) & 0xff); @@ -3205,6 +3482,7 @@ png_do_background(png_row_infop row_info, png_bytep row, *(dp + 4) = (png_byte)((background->blue >> 8) & 0xff); *(dp + 5) = (png_byte)(background->blue & 0xff); } + else { png_uint_16 v; @@ -3218,9 +3496,11 @@ png_do_background(png_row_infop row_info, png_bytep row, png_composite_16(v, r, a, background->red); *dp = (png_byte)((v >> 8) & 0xff); *(dp + 1) = (png_byte)(v & 0xff); + png_composite_16(v, g, a, background->green); *(dp + 2) = (png_byte)((v >> 8) & 0xff); *(dp + 3) = (png_byte)(v & 0xff); + png_composite_16(v, b, a, background->blue); *(dp + 4) = (png_byte)((v >> 8) & 0xff); *(dp + 5) = (png_byte)(v & 0xff); @@ -3230,14 +3510,18 @@ png_do_background(png_row_infop row_info, png_bytep row, } break; } + + default: + break; } if (row_info->color_type & PNG_COLOR_MASK_ALPHA) { - row_info->color_type &= ~PNG_COLOR_MASK_ALPHA; + row_info->color_type = (png_byte)(row_info->color_type & + ~PNG_COLOR_MASK_ALPHA); row_info->channels--; row_info->pixel_depth = (png_byte)(row_info->channels * - row_info->bit_depth); + row_info->bit_depth); row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, row_width); } } @@ -3253,8 +3537,8 @@ png_do_background(png_row_infop row_info, png_bytep row, */ void /* PRIVATE */ png_do_gamma(png_row_infop row_info, png_bytep row, - png_bytep gamma_table, png_uint_16pp gamma_16_table, - int gamma_shift) + png_const_bytep gamma_table, png_const_uint_16pp gamma_16_table, + int gamma_shift) { png_bytep sp; png_uint_32 i; @@ -3262,9 +3546,8 @@ png_do_gamma(png_row_infop row_info, png_bytep row, png_debug(1, "in png_do_gamma"); - if ( - ((row_info->bit_depth <= 8 && gamma_table != NULL) || - (row_info->bit_depth == 16 && gamma_16_table != NULL))) + if (((row_info->bit_depth <= 8 && gamma_table != NULL) || + (row_info->bit_depth == 16 && gamma_16_table != NULL))) { switch (row_info->color_type) { @@ -3283,6 +3566,7 @@ png_do_gamma(png_row_infop row_info, png_bytep row, sp++; } } + else /* if (row_info->bit_depth == 16) */ { sp = row; @@ -3294,10 +3578,12 @@ png_do_gamma(png_row_infop row_info, png_bytep row, *sp = (png_byte)((v >> 8) & 0xff); *(sp + 1) = (png_byte)(v & 0xff); sp += 2; + v = gamma_16_table[*(sp + 1) >> gamma_shift][*sp]; *sp = (png_byte)((v >> 8) & 0xff); *(sp + 1) = (png_byte)(v & 0xff); sp += 2; + v = gamma_16_table[*(sp + 1) >> gamma_shift][*sp]; *sp = (png_byte)((v >> 8) & 0xff); *(sp + 1) = (png_byte)(v & 0xff); @@ -3316,13 +3602,17 @@ png_do_gamma(png_row_infop row_info, png_bytep row, { *sp = gamma_table[*sp]; sp++; + *sp = gamma_table[*sp]; sp++; + *sp = gamma_table[*sp]; sp++; + sp++; } } + else /* if (row_info->bit_depth == 16) */ { sp = row; @@ -3332,10 +3622,12 @@ png_do_gamma(png_row_infop row_info, png_bytep row, *sp = (png_byte)((v >> 8) & 0xff); *(sp + 1) = (png_byte)(v & 0xff); sp += 2; + v = gamma_16_table[*(sp + 1) >> gamma_shift][*sp]; *sp = (png_byte)((v >> 8) & 0xff); *(sp + 1) = (png_byte)(v & 0xff); sp += 2; + v = gamma_16_table[*(sp + 1) >> gamma_shift][*sp]; *sp = (png_byte)((v >> 8) & 0xff); *(sp + 1) = (png_byte)(v & 0xff); @@ -3356,6 +3648,7 @@ png_do_gamma(png_row_infop row_info, png_bytep row, sp += 2; } } + else /* if (row_info->bit_depth == 16) */ { sp = row; @@ -3428,6 +3721,9 @@ png_do_gamma(png_row_infop row_info, png_bytep row, } break; } + + default: + break; } } } @@ -3439,7 +3735,7 @@ png_do_gamma(png_row_infop row_info, png_bytep row, */ void /* PRIVATE */ png_do_expand_palette(png_row_infop row_info, png_bytep row, - png_colorp palette, png_bytep trans_alpha, int num_trans) + png_const_colorp palette, png_const_bytep trans_alpha, int num_trans) { int shift, value; png_bytep sp, dp; @@ -3448,8 +3744,7 @@ png_do_expand_palette(png_row_infop row_info, png_bytep row, png_debug(1, "in png_do_expand_palette"); - if ( - row_info->color_type == PNG_COLOR_TYPE_PALETTE) + if (row_info->color_type == PNG_COLOR_TYPE_PALETTE) { if (row_info->bit_depth < 8) { @@ -3464,13 +3759,16 @@ png_do_expand_palette(png_row_infop row_info, png_bytep row, { if ((*sp >> shift) & 0x01) *dp = 1; + else *dp = 0; + if (shift == 7) { shift = 0; sp--; } + else shift++; @@ -3493,6 +3791,7 @@ png_do_expand_palette(png_row_infop row_info, png_bytep row, shift = 0; sp--; } + else shift += 2; @@ -3515,6 +3814,7 @@ png_do_expand_palette(png_row_infop row_info, png_bytep row, shift = 0; sp--; } + else shift += 4; @@ -3522,14 +3822,17 @@ png_do_expand_palette(png_row_infop row_info, png_bytep row, } break; } + + default: + break; } row_info->bit_depth = 8; row_info->pixel_depth = 8; row_info->rowbytes = row_width; } - switch (row_info->bit_depth) + + if (row_info->bit_depth == 8) { - case 8: { if (trans_alpha != NULL) { @@ -3540,8 +3843,10 @@ png_do_expand_palette(png_row_infop row_info, png_bytep row, { if ((int)(*sp) >= num_trans) *dp-- = 0xff; + else *dp-- = trans_alpha[*sp]; + *dp-- = palette[*sp].blue; *dp-- = palette[*sp].green; *dp-- = palette[*sp].red; @@ -3553,6 +3858,7 @@ png_do_expand_palette(png_row_infop row_info, png_bytep row, row_info->color_type = 6; row_info->channels = 4; } + else { sp = row + (png_size_t)row_width - 1; @@ -3572,7 +3878,6 @@ png_do_expand_palette(png_row_infop row_info, png_bytep row, row_info->color_type = 2; row_info->channels = 3; } - break; } } } @@ -3583,7 +3888,7 @@ png_do_expand_palette(png_row_infop row_info, png_bytep row, */ void /* PRIVATE */ png_do_expand(png_row_infop row_info, png_bytep row, - png_color_16p trans_value) + png_const_color_16p trans_value) { int shift, value; png_bytep sp, dp; @@ -3603,7 +3908,7 @@ png_do_expand(png_row_infop row_info, png_bytep row, { case 1: { - gray = (png_uint_16)((gray&0x01)*0xff); + gray = (png_uint_16)((gray & 0x01) * 0xff); sp = row + (png_size_t)((row_width - 1) >> 3); dp = row + (png_size_t)row_width - 1; shift = 7 - (int)((row_width + 7) & 0x07); @@ -3611,13 +3916,16 @@ png_do_expand(png_row_infop row_info, png_bytep row, { if ((*sp >> shift) & 0x01) *dp = 0xff; + else *dp = 0; + if (shift == 7) { shift = 0; sp--; } + else shift++; @@ -3628,7 +3936,7 @@ png_do_expand(png_row_infop row_info, png_bytep row, case 2: { - gray = (png_uint_16)((gray&0x03)*0x55); + gray = (png_uint_16)((gray & 0x03) * 0x55); sp = row + (png_size_t)((row_width - 1) >> 2); dp = row + (png_size_t)row_width - 1; shift = (int)((3 - ((row_width + 3) & 0x03)) << 1); @@ -3642,6 +3950,7 @@ png_do_expand(png_row_infop row_info, png_bytep row, shift = 0; sp--; } + else shift += 2; @@ -3652,7 +3961,7 @@ png_do_expand(png_row_infop row_info, png_bytep row, case 4: { - gray = (png_uint_16)((gray&0x0f)*0x11); + gray = (png_uint_16)((gray & 0x0f) * 0x11); sp = row + (png_size_t)((row_width - 1) >> 1); dp = row + (png_size_t)row_width - 1; shift = (int)((1 - ((row_width + 1) & 0x01)) << 2); @@ -3665,6 +3974,7 @@ png_do_expand(png_row_infop row_info, png_bytep row, shift = 0; sp--; } + else shift = 4; @@ -3672,6 +3982,9 @@ png_do_expand(png_row_infop row_info, png_bytep row, } break; } + + default: + break; } row_info->bit_depth = 8; @@ -3686,20 +3999,23 @@ png_do_expand(png_row_infop row_info, png_bytep row, gray = gray & 0xff; sp = row + (png_size_t)row_width - 1; dp = row + (png_size_t)(row_width << 1) - 1; + for (i = 0; i < row_width; i++) { if (*sp == gray) *dp-- = 0; + else *dp-- = 0xff; + *dp-- = *sp--; } } else if (row_info->bit_depth == 16) { - png_byte gray_high = (gray >> 8) & 0xff; - png_byte gray_low = gray & 0xff; + png_byte gray_high = (png_byte)((gray >> 8) & 0xff); + png_byte gray_low = (png_byte)(gray & 0xff); sp = row + row_info->rowbytes - 1; dp = row + (row_info->rowbytes << 1) - 1; for (i = 0; i < row_width; i++) @@ -3709,11 +4025,13 @@ png_do_expand(png_row_infop row_info, png_bytep row, *dp-- = 0; *dp-- = 0; } + else { *dp-- = 0xff; *dp-- = 0xff; } + *dp-- = *sp--; *dp-- = *sp--; } @@ -3730,17 +4048,19 @@ png_do_expand(png_row_infop row_info, png_bytep row, { if (row_info->bit_depth == 8) { - png_byte red = trans_value->red & 0xff; - png_byte green = trans_value->green & 0xff; - png_byte blue = trans_value->blue & 0xff; + png_byte red = (png_byte)(trans_value->red & 0xff); + png_byte green = (png_byte)(trans_value->green & 0xff); + png_byte blue = (png_byte)(trans_value->blue & 0xff); sp = row + (png_size_t)row_info->rowbytes - 1; dp = row + (png_size_t)(row_width << 2) - 1; for (i = 0; i < row_width; i++) { if (*(sp - 2) == red && *(sp - 1) == green && *(sp) == blue) *dp-- = 0; + else *dp-- = 0xff; + *dp-- = *sp--; *dp-- = *sp--; *dp-- = *sp--; @@ -3748,31 +4068,33 @@ png_do_expand(png_row_infop row_info, png_bytep row, } else if (row_info->bit_depth == 16) { - png_byte red_high = (trans_value->red >> 8) & 0xff; - png_byte green_high = (trans_value->green >> 8) & 0xff; - png_byte blue_high = (trans_value->blue >> 8) & 0xff; - png_byte red_low = trans_value->red & 0xff; - png_byte green_low = trans_value->green & 0xff; - png_byte blue_low = trans_value->blue & 0xff; + png_byte red_high = (png_byte)((trans_value->red >> 8) & 0xff); + png_byte green_high = (png_byte)((trans_value->green >> 8) & 0xff); + png_byte blue_high = (png_byte)((trans_value->blue >> 8) & 0xff); + png_byte red_low = (png_byte)(trans_value->red & 0xff); + png_byte green_low = (png_byte)(trans_value->green & 0xff); + png_byte blue_low = (png_byte)(trans_value->blue & 0xff); sp = row + row_info->rowbytes - 1; dp = row + (png_size_t)(row_width << 3) - 1; for (i = 0; i < row_width; i++) { if (*(sp - 5) == red_high && - *(sp - 4) == red_low && - *(sp - 3) == green_high && - *(sp - 2) == green_low && - *(sp - 1) == blue_high && - *(sp ) == blue_low) + *(sp - 4) == red_low && + *(sp - 3) == green_high && + *(sp - 2) == green_low && + *(sp - 1) == blue_high && + *(sp ) == blue_low) { *dp-- = 0; *dp-- = 0; } + else { *dp-- = 0xff; *dp-- = 0xff; } + *dp-- = *sp--; *dp-- = *sp--; *dp-- = *sp--; @@ -3790,10 +4112,41 @@ png_do_expand(png_row_infop row_info, png_bytep row, } #endif +#ifdef PNG_READ_EXPAND_16_SUPPORTED +/* If the bit depth is 8 and the colour type is not a palette type expand the + * whole row to 16 bits. Has no effect otherwise. + */ +void /* PRIVATE */ +png_do_expand_16(png_row_infop row_info, png_bytep row) +{ + if (row_info->bit_depth == 8 && + row_info->color_type != PNG_COLOR_TYPE_PALETTE) + { + /* The row have a sequence of bytes containing [0..255] and we need + * to turn it into another row containing [0..65535], to do this we + * calculate: + * + * (input / 255) * 65535 + * + * Which happens to be exactly input * 257 and this can be achieved + * simply by byte replication in place (copying backwards). + */ + png_byte *sp = row + row_info->rowbytes; /* source, last byte + 1 */ + png_byte *dp = sp + row_info->rowbytes; /* destination, end + 1 */ + while (dp > sp) + dp[-2] = dp[-1] = *--sp, dp -= 2; + + row_info->rowbytes *= 2; + row_info->bit_depth = 16; + row_info->pixel_depth = (png_byte)(row_info->channels * 16); + } +} +#endif + #ifdef PNG_READ_QUANTIZE_SUPPORTED void /* PRIVATE */ png_do_quantize(png_row_infop row_info, png_bytep row, - png_bytep palette_lookup, png_bytep quantize_lookup) + png_const_bytep palette_lookup, png_const_bytep quantize_lookup) { png_bytep sp, dp; png_uint_32 i; @@ -3801,9 +4154,9 @@ png_do_quantize(png_row_infop row_info, png_bytep row, png_debug(1, "in png_do_quantize"); + if (row_info->bit_depth == 8) { - if (row_info->color_type == PNG_COLOR_TYPE_RGB && - palette_lookup && row_info->bit_depth == 8) + if (row_info->color_type == PNG_COLOR_TYPE_RGB && palette_lookup) { int r, g, b, p; sp = row; @@ -3822,23 +4175,25 @@ png_do_quantize(png_row_infop row_info, png_bytep row, * ((b >> 3) & 0x1f); */ p = (((r >> (8 - PNG_QUANTIZE_RED_BITS)) & - ((1 << PNG_QUANTIZE_RED_BITS) - 1)) << - (PNG_QUANTIZE_GREEN_BITS + PNG_QUANTIZE_BLUE_BITS)) | - (((g >> (8 - PNG_QUANTIZE_GREEN_BITS)) & - ((1 << PNG_QUANTIZE_GREEN_BITS) - 1)) << - (PNG_QUANTIZE_BLUE_BITS)) | - ((b >> (8 - PNG_QUANTIZE_BLUE_BITS)) & - ((1 << PNG_QUANTIZE_BLUE_BITS) - 1)); + ((1 << PNG_QUANTIZE_RED_BITS) - 1)) << + (PNG_QUANTIZE_GREEN_BITS + PNG_QUANTIZE_BLUE_BITS)) | + (((g >> (8 - PNG_QUANTIZE_GREEN_BITS)) & + ((1 << PNG_QUANTIZE_GREEN_BITS) - 1)) << + (PNG_QUANTIZE_BLUE_BITS)) | + ((b >> (8 - PNG_QUANTIZE_BLUE_BITS)) & + ((1 << PNG_QUANTIZE_BLUE_BITS) - 1)); *dp++ = palette_lookup[p]; } + row_info->color_type = PNG_COLOR_TYPE_PALETTE; row_info->channels = 1; row_info->pixel_depth = row_info->bit_depth; row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, row_width); } + else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA && - palette_lookup != NULL && row_info->bit_depth == 8) + palette_lookup != NULL) { int r, g, b, p; sp = row; @@ -3851,25 +4206,28 @@ png_do_quantize(png_row_infop row_info, png_bytep row, sp++; p = (((r >> (8 - PNG_QUANTIZE_RED_BITS)) & - ((1 << PNG_QUANTIZE_RED_BITS) - 1)) << - (PNG_QUANTIZE_GREEN_BITS + PNG_QUANTIZE_BLUE_BITS)) | - (((g >> (8 - PNG_QUANTIZE_GREEN_BITS)) & - ((1 << PNG_QUANTIZE_GREEN_BITS) - 1)) << - (PNG_QUANTIZE_BLUE_BITS)) | - ((b >> (8 - PNG_QUANTIZE_BLUE_BITS)) & - ((1 << PNG_QUANTIZE_BLUE_BITS) - 1)); + ((1 << PNG_QUANTIZE_RED_BITS) - 1)) << + (PNG_QUANTIZE_GREEN_BITS + PNG_QUANTIZE_BLUE_BITS)) | + (((g >> (8 - PNG_QUANTIZE_GREEN_BITS)) & + ((1 << PNG_QUANTIZE_GREEN_BITS) - 1)) << + (PNG_QUANTIZE_BLUE_BITS)) | + ((b >> (8 - PNG_QUANTIZE_BLUE_BITS)) & + ((1 << PNG_QUANTIZE_BLUE_BITS) - 1)); *dp++ = palette_lookup[p]; } + row_info->color_type = PNG_COLOR_TYPE_PALETTE; row_info->channels = 1; row_info->pixel_depth = row_info->bit_depth; row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, row_width); } + else if (row_info->color_type == PNG_COLOR_TYPE_PALETTE && - quantize_lookup && row_info->bit_depth == 8) + quantize_lookup) { sp = row; + for (i = 0; i < row_width; i++, sp++) { *sp = quantize_lookup[*sp]; @@ -3877,266 +4235,7 @@ png_do_quantize(png_row_infop row_info, png_bytep row, } } } -#endif - -#ifdef PNG_FLOATING_POINT_SUPPORTED -#ifdef PNG_READ_GAMMA_SUPPORTED -static PNG_CONST int png_gamma_shift[] = - {0x10, 0x21, 0x42, 0x84, 0x110, 0x248, 0x550, 0xff0, 0x00}; - -/* We build the 8- or 16-bit gamma tables here. Note that for 16-bit - * tables, we don't make a full table if we are reducing to 8-bit in - * the future. Note also how the gamma_16 tables are segmented so that - * we don't need to allocate > 64K chunks for a full 16-bit table. - * - * See the PNG extensions document for an integer algorithm for creating - * the gamma tables. Maybe we will implement that here someday. - * - * We should only reach this point if - * - * the file_gamma is known (i.e., the gAMA or sRGB chunk is present, - * or the application has provided a file_gamma) - * - * AND - * { - * the screen_gamma is known - * - * OR - * - * RGB_to_gray transformation is being performed - * } - * - * AND - * { - * the screen_gamma is different from the reciprocal of the - * file_gamma by more than the specified threshold - * - * OR - * - * a background color has been specified and the file_gamma - * and screen_gamma are not 1.0, within the specified threshold. - * } - */ - -void /* PRIVATE */ -png_build_gamma_table(png_structp png_ptr, png_byte bit_depth) -{ - png_debug(1, "in png_build_gamma_table"); - - if (bit_depth <= 8) - { - int i; - double g; - - if (png_ptr->screen_gamma > .000001) - g = 1.0 / (png_ptr->gamma * png_ptr->screen_gamma); - - else - g = 1.0; - - png_ptr->gamma_table = (png_bytep)png_malloc(png_ptr, - (png_uint_32)256); - - for (i = 0; i < 256; i++) - { - png_ptr->gamma_table[i] = (png_byte)(pow((double)i / 255.0, - g) * 255.0 + .5); - } - -#if defined(PNG_READ_BACKGROUND_SUPPORTED) || \ - defined(PNG_READ_RGB_TO_GRAY_SUPPORTED) - if (png_ptr->transformations & ((PNG_BACKGROUND) | PNG_RGB_TO_GRAY)) - { - - g = 1.0 / (png_ptr->gamma); - - png_ptr->gamma_to_1 = (png_bytep)png_malloc(png_ptr, - (png_uint_32)256); - - for (i = 0; i < 256; i++) - { - png_ptr->gamma_to_1[i] = (png_byte)(pow((double)i / 255.0, - g) * 255.0 + .5); - } - - - png_ptr->gamma_from_1 = (png_bytep)png_malloc(png_ptr, - (png_uint_32)256); - - if (png_ptr->screen_gamma > 0.000001) - g = 1.0 / png_ptr->screen_gamma; - - else - g = png_ptr->gamma; /* Probably doing rgb_to_gray */ - - for (i = 0; i < 256; i++) - { - png_ptr->gamma_from_1[i] = (png_byte)(pow((double)i / 255.0, - g) * 255.0 + .5); - - } - } -#endif /* PNG_READ_BACKGROUND_SUPPORTED || PNG_RGB_TO_GRAY_SUPPORTED */ - } - else - { - double g; - int i, j, shift, num; - int sig_bit; - png_uint_32 ig; - - if (png_ptr->color_type & PNG_COLOR_MASK_COLOR) - { - sig_bit = (int)png_ptr->sig_bit.red; - - if ((int)png_ptr->sig_bit.green > sig_bit) - sig_bit = png_ptr->sig_bit.green; - - if ((int)png_ptr->sig_bit.blue > sig_bit) - sig_bit = png_ptr->sig_bit.blue; - } - else - { - sig_bit = (int)png_ptr->sig_bit.gray; - } - - if (sig_bit > 0) - shift = 16 - sig_bit; - - else - shift = 0; - - if (png_ptr->transformations & PNG_16_TO_8) - { - if (shift < (16 - PNG_MAX_GAMMA_8)) - shift = (16 - PNG_MAX_GAMMA_8); - } - - if (shift > 8) - shift = 8; - - if (shift < 0) - shift = 0; - - png_ptr->gamma_shift = (png_byte)shift; - - num = (1 << (8 - shift)); - - if (png_ptr->screen_gamma > .000001) - g = 1.0 / (png_ptr->gamma * png_ptr->screen_gamma); - else - g = 1.0; - - png_ptr->gamma_16_table = (png_uint_16pp)png_calloc(png_ptr, - (png_uint_32)(num * png_sizeof(png_uint_16p))); - - if (png_ptr->transformations & (PNG_16_TO_8 | PNG_BACKGROUND)) - { - double fin, fout; - png_uint_32 last, max; - - for (i = 0; i < num; i++) - { - png_ptr->gamma_16_table[i] = (png_uint_16p)png_malloc(png_ptr, - (png_uint_32)(256 * png_sizeof(png_uint_16))); - } - - g = 1.0 / g; - last = 0; - for (i = 0; i < 256; i++) - { - fout = ((double)i + 0.5) / 256.0; - fin = pow(fout, g); - max = (png_uint_32)(fin * (double)((png_uint_32)num << 8)); - while (last <= max) - { - png_ptr->gamma_16_table[(int)(last & (0xff >> shift))] - [(int)(last >> (8 - shift))] = (png_uint_16)( - (png_uint_16)i | ((png_uint_16)i << 8)); - last++; - } - } - while (last < ((png_uint_32)num << 8)) - { - png_ptr->gamma_16_table[(int)(last & (0xff >> shift))] - [(int)(last >> (8 - shift))] = (png_uint_16)65535L; - last++; - } - } - else - { - for (i = 0; i < num; i++) - { - png_ptr->gamma_16_table[i] = (png_uint_16p)png_malloc(png_ptr, - (png_uint_32)(256 * png_sizeof(png_uint_16))); - - ig = (((png_uint_32)i * (png_uint_32)png_gamma_shift[shift]) >> 4); - - for (j = 0; j < 256; j++) - { - png_ptr->gamma_16_table[i][j] = - (png_uint_16)(pow((double)(ig + ((png_uint_32)j << 8)) / - 65535.0, g) * 65535.0 + .5); - } - } - } - -#if defined(PNG_READ_BACKGROUND_SUPPORTED) || \ - defined(PNG_READ_RGB_TO_GRAY_SUPPORTED) - if (png_ptr->transformations & (PNG_BACKGROUND | PNG_RGB_TO_GRAY)) - { - - g = 1.0 / (png_ptr->gamma); - - png_ptr->gamma_16_to_1 = (png_uint_16pp)png_calloc(png_ptr, - (png_uint_32)(num * png_sizeof(png_uint_16p ))); - - for (i = 0; i < num; i++) - { - png_ptr->gamma_16_to_1[i] = (png_uint_16p)png_malloc(png_ptr, - (png_uint_32)(256 * png_sizeof(png_uint_16))); - - ig = (((png_uint_32)i * - (png_uint_32)png_gamma_shift[shift]) >> 4); - for (j = 0; j < 256; j++) - { - png_ptr->gamma_16_to_1[i][j] = - (png_uint_16)(pow((double)(ig + ((png_uint_32)j << 8)) / - 65535.0, g) * 65535.0 + .5); - } - } - - if (png_ptr->screen_gamma > 0.000001) - g = 1.0 / png_ptr->screen_gamma; - - else - g = png_ptr->gamma; /* Probably doing rgb_to_gray */ - - png_ptr->gamma_16_from_1 = (png_uint_16pp)png_calloc(png_ptr, - (png_uint_32)(num * png_sizeof(png_uint_16p))); - - for (i = 0; i < num; i++) - { - png_ptr->gamma_16_from_1[i] = (png_uint_16p)png_malloc(png_ptr, - (png_uint_32)(256 * png_sizeof(png_uint_16))); - - ig = (((png_uint_32)i * - (png_uint_32)png_gamma_shift[shift]) >> 4); - - for (j = 0; j < 256; j++) - { - png_ptr->gamma_16_from_1[i][j] = - (png_uint_16)(pow((double)(ig + ((png_uint_32)j << 8)) / - 65535.0, g) * 65535.0 + .5); - } - } - } -#endif /* PNG_READ_BACKGROUND_SUPPORTED || PNG_RGB_TO_GRAY_SUPPORTED */ - } -} -#endif -/* To do: install integer version of png_build_gamma_table here */ -#endif +#endif /* PNG_READ_QUANTIZE_SUPPORTED */ #ifdef PNG_MNG_FEATURES_SUPPORTED /* Undoes intrapixel differencing */ @@ -4150,6 +4249,7 @@ png_do_read_intrapixel(png_row_infop row_info, png_bytep row) { int bytes_per_pixel; png_uint_32 row_width = row_info->width; + if (row_info->bit_depth == 8) { png_bytep rp; @@ -4166,8 +4266,8 @@ png_do_read_intrapixel(png_row_infop row_info, png_bytep row) for (i = 0, rp = row; i < row_width; i++, rp += bytes_per_pixel) { - *(rp) = (png_byte)((256 + *rp + *(rp+1))&0xff); - *(rp+2) = (png_byte)((256 + *(rp+2) + *(rp+1))&0xff); + *(rp) = (png_byte)((256 + *rp + *(rp + 1)) & 0xff); + *(rp+2) = (png_byte)((256 + *(rp + 2) + *(rp + 1)) & 0xff); } } else if (row_info->bit_depth == 16) @@ -4191,10 +4291,10 @@ png_do_read_intrapixel(png_row_infop row_info, png_bytep row) png_uint_32 s2 = (*(rp + 4) << 8) | *(rp + 5); png_uint_32 red = (png_uint_32)((s0 + s1 + 65536L) & 0xffffL); png_uint_32 blue = (png_uint_32)((s2 + s1 + 65536L) & 0xffffL); - *(rp ) = (png_byte)((red >> 8) & 0xff); - *(rp+1) = (png_byte)(red & 0xff); - *(rp+4) = (png_byte)((blue >> 8) & 0xff); - *(rp+5) = (png_byte)(blue & 0xff); + *(rp ) = (png_byte)((red >> 8) & 0xff); + *(rp + 1) = (png_byte)(red & 0xff); + *(rp + 4) = (png_byte)((blue >> 8) & 0xff); + *(rp + 5) = (png_byte)(blue & 0xff); } } } diff --git a/reactos/dll/3rdparty/libpng/pngrutil.c b/reactos/dll/3rdparty/libpng/pngrutil.c index 416e5d228a1..d4764317444 100644 --- a/reactos/dll/3rdparty/libpng/pngrutil.c +++ b/reactos/dll/3rdparty/libpng/pngrutil.c @@ -1,8 +1,8 @@ /* pngrutil.c - utilities to read a PNG file * - * Last changed in libpng 1.4.3 [June 26, 2010] - * Copyright (c) 1998-2010 Glenn Randers-Pehrson + * Last changed in libpng 1.5.2 [March 31, 2011] + * Copyright (c) 1998-2011 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * @@ -14,58 +14,136 @@ * libpng itself during the course of reading an image. */ -#define PNG_NO_PEDANTIC_WARNINGS -#include "png.h" -#ifdef PNG_READ_SUPPORTED #include "pngpriv.h" -# define png_strtod(p,a,b) strtod(a,b) -png_uint_32 PNGAPI -png_get_uint_31(png_structp png_ptr, png_bytep buf) -{ - png_uint_32 i = png_get_uint_32(buf); - if (i > PNG_UINT_31_MAX) - png_error(png_ptr, "PNG unsigned integer out of range"); - return (i); -} -#ifndef PNG_USE_READ_MACROS -/* Grab an unsigned 32-bit integer from a buffer in big-endian format. */ -png_uint_32 PNGAPI -png_get_uint_32(png_bytep buf) -{ - png_uint_32 i = ((png_uint_32)(*buf) << 24) + - ((png_uint_32)(*(buf + 1)) << 16) + - ((png_uint_32)(*(buf + 2)) << 8) + - (png_uint_32)(*(buf + 3)); +#ifdef PNG_READ_SUPPORTED - return (i); +#define png_strtod(p,a,b) strtod(a,b) + +png_uint_32 PNGAPI +png_get_uint_31(png_structp png_ptr, png_const_bytep buf) +{ + png_uint_32 uval = png_get_uint_32(buf); + + if (uval > PNG_UINT_31_MAX) + png_error(png_ptr, "PNG unsigned integer out of range"); + + return (uval); +} + +#if defined(PNG_READ_gAMA_SUPPORTED) || defined(PNG_READ_cHRM_SUPPORTED) +/* The following is a variation on the above for use with the fixed + * point values used for gAMA and cHRM. Instead of png_error it + * issues a warning and returns (-1) - an invalid value because both + * gAMA and cHRM use *unsigned* integers for fixed point values. + */ +#define PNG_FIXED_ERROR (-1) + +static png_fixed_point /* PRIVATE */ +png_get_fixed_point(png_structp png_ptr, png_const_bytep buf) +{ + png_uint_32 uval = png_get_uint_32(buf); + + if (uval <= PNG_UINT_31_MAX) + return (png_fixed_point)uval; /* known to be in range */ + + /* The caller can turn off the warning by passing NULL. */ + if (png_ptr != NULL) + png_warning(png_ptr, "PNG fixed point integer out of range"); + + return PNG_FIXED_ERROR; +} +#endif + +#ifdef PNG_READ_INT_FUNCTIONS_SUPPORTED +/* NOTE: the read macros will obscure these definitions, so that if + * PNG_USE_READ_MACROS is set the library will not use them internally, + * but the APIs will still be available externally. + * + * The parentheses around "PNGAPI function_name" in the following three + * functions are necessary because they allow the macros to co-exist with + * these (unused but exported) functions. + */ + +/* Grab an unsigned 32-bit integer from a buffer in big-endian format. */ +png_uint_32 (PNGAPI +png_get_uint_32)(png_const_bytep buf) +{ + png_uint_32 uval = + ((png_uint_32)(*(buf )) << 24) + + ((png_uint_32)(*(buf + 1)) << 16) + + ((png_uint_32)(*(buf + 2)) << 8) + + ((png_uint_32)(*(buf + 3)) ) ; + + return uval; } /* Grab a signed 32-bit integer from a buffer in big-endian format. The - * data is stored in the PNG file in two's complement format, and it is - * assumed that the machine format for signed integers is the same. + * data is stored in the PNG file in two's complement format and there + * is no guarantee that a 'png_int_32' is exactly 32 bits, therefore + * the following code does a two's complement to native conversion. */ -png_int_32 PNGAPI -png_get_int_32(png_bytep buf) +png_int_32 (PNGAPI +png_get_int_32)(png_const_bytep buf) { - png_int_32 i = ((png_int_32)(*buf) << 24) + - ((png_int_32)(*(buf + 1)) << 16) + - ((png_int_32)(*(buf + 2)) << 8) + - (png_int_32)(*(buf + 3)); + png_uint_32 uval = png_get_uint_32(buf); + if ((uval & 0x80000000L) == 0) /* non-negative */ + return uval; - return (i); + uval = (uval ^ 0xffffffffL) + 1; /* 2's complement: -x = ~x+1 */ + return -(png_int_32)uval; } /* Grab an unsigned 16-bit integer from a buffer in big-endian format. */ -png_uint_16 PNGAPI -png_get_uint_16(png_bytep buf) +png_uint_16 (PNGAPI +png_get_uint_16)(png_const_bytep buf) { - png_uint_16 i = (png_uint_16)(((png_uint_16)(*buf) << 8) + - (png_uint_16)(*(buf + 1))); + /* ANSI-C requires an int value to accomodate at least 16 bits so this + * works and allows the compiler not to worry about possible narrowing + * on 32 bit systems. (Pre-ANSI systems did not make integers smaller + * than 16 bits either.) + */ + unsigned int val = + ((unsigned int)(*buf) << 8) + + ((unsigned int)(*(buf + 1))); - return (i); + return (png_uint_16)val; +} + +#endif /* PNG_READ_INT_FUNCTIONS_SUPPORTED */ + +/* Read and check the PNG file signature */ +void /* PRIVATE */ +png_read_sig(png_structp png_ptr, png_infop info_ptr) +{ + png_size_t num_checked, num_to_check; + + /* Exit if the user application does not expect a signature. */ + if (png_ptr->sig_bytes >= 8) + return; + + num_checked = png_ptr->sig_bytes; + num_to_check = 8 - num_checked; + +#ifdef PNG_IO_STATE_SUPPORTED + png_ptr->io_state = PNG_IO_READING | PNG_IO_SIGNATURE; +#endif + + /* The signature must be serialized in a single I/O call. */ + png_read_data(png_ptr, &(info_ptr->signature[num_checked]), num_to_check); + png_ptr->sig_bytes = 8; + + if (png_sig_cmp(info_ptr->signature, num_checked, num_to_check)) + { + if (num_checked < 4 && + png_sig_cmp(info_ptr->signature, num_checked, num_to_check - 4)) + png_error(png_ptr, "Not a PNG file"); + else + png_error(png_ptr, "PNG file corrupted by ASCII conversion"); + } + if (num_checked < 3) + png_ptr->mode |= PNG_HAVE_PNG_SIGNATURE; } -#endif /* PNG_USE_READ_MACROS */ /* Read the chunk header (length + type name). * Put the type name into png_ptr->chunk_name, and return the length. @@ -77,33 +155,29 @@ png_read_chunk_header(png_structp png_ptr) png_uint_32 length; #ifdef PNG_IO_STATE_SUPPORTED - /* Inform the I/O callback that the chunk header is being read. - * PNG_IO_CHUNK_HDR requires a single I/O call. - */ png_ptr->io_state = PNG_IO_READING | PNG_IO_CHUNK_HDR; #endif - /* Read the length and the chunk name */ + /* Read the length and the chunk name. + * This must be performed in a single I/O call. + */ png_read_data(png_ptr, buf, 8); length = png_get_uint_31(png_ptr, buf); - /* Put the chunk name into png_ptr->chunk_name */ + /* Put the chunk name into png_ptr->chunk_name. */ png_memcpy(png_ptr->chunk_name, buf + 4, 4); - png_debug2(0, "Reading %s chunk, length = %lu", - png_ptr->chunk_name, length); + png_debug2(0, "Reading %s chunk, length = %u", + png_ptr->chunk_name, length); - /* Reset the crc and run it over the chunk name */ + /* Reset the crc and run it over the chunk name. */ png_reset_crc(png_ptr); png_calculate_crc(png_ptr, png_ptr->chunk_name, 4); - /* Check to see if chunk name is valid */ + /* Check to see if chunk name is valid. */ png_check_chunk_name(png_ptr, png_ptr->chunk_name); #ifdef PNG_IO_STATE_SUPPORTED - /* Inform the I/O callback that chunk data will (possibly) be read. - * PNG_IO_CHUNK_DATA does NOT require a specific number of I/O calls. - */ png_ptr->io_state = PNG_IO_READING | PNG_IO_CHUNK_DATA; #endif @@ -116,6 +190,7 @@ png_crc_read(png_structp png_ptr, png_bytep buf, png_size_t length) { if (png_ptr == NULL) return; + png_read_data(png_ptr, buf, length); png_calculate_crc(png_ptr, buf, length); } @@ -135,6 +210,7 @@ png_crc_finish(png_structp png_ptr, png_uint_32 skip) { png_crc_read(png_ptr, png_ptr->zbuf, png_ptr->zbuf_size); } + if (i) { png_crc_read(png_ptr, png_ptr->zbuf, i); @@ -149,11 +225,13 @@ png_crc_finish(png_structp png_ptr, png_uint_32 skip) { png_chunk_warning(png_ptr, "CRC error"); } + else { png_chunk_benign_error(png_ptr, "CRC error"); return (0); } + return (1); } @@ -176,6 +254,7 @@ png_crc_error(png_structp png_ptr) (PNG_FLAG_CRC_ANCILLARY_USE | PNG_FLAG_CRC_ANCILLARY_NOWARN)) need_crc = 0; } + else /* critical */ { if (png_ptr->flags & PNG_FLAG_CRC_CRITICAL_IGNORE) @@ -183,11 +262,10 @@ png_crc_error(png_structp png_ptr) } #ifdef PNG_IO_STATE_SUPPORTED - /* Inform the I/O callback that the chunk CRC is being read */ - /* PNG_IO_CHUNK_CRC requires the I/O to be done at once */ png_ptr->io_state = PNG_IO_READING | PNG_IO_CHUNK_CRC; #endif + /* The chunk CRC must be serialized in a single I/O call. */ png_read_data(png_ptr, crc_bytes, 4); if (need_crc) @@ -195,6 +273,7 @@ png_crc_error(png_structp png_ptr) crc = png_get_uint_32(crc_bytes); return ((int)(crc != png_ptr->crc)); } + else return (0); } @@ -202,18 +281,51 @@ png_crc_error(png_structp png_ptr) #if defined(PNG_READ_zTXt_SUPPORTED) || defined(PNG_READ_iTXt_SUPPORTED) || \ defined(PNG_READ_iCCP_SUPPORTED) static png_size_t -png_inflate(png_structp png_ptr, const png_byte *data, png_size_t size, - png_bytep output, png_size_t output_size) +png_inflate(png_structp png_ptr, png_bytep data, png_size_t size, + png_bytep output, png_size_t output_size) { png_size_t count = 0; - png_ptr->zstream.next_in = (png_bytep)data; /* const_cast: VALID */ - png_ptr->zstream.avail_in = size; + /* zlib can't necessarily handle more than 65535 bytes at once (i.e. it can't + * even necessarily handle 65536 bytes) because the type uInt is "16 bits or + * more". Consequently it is necessary to chunk the input to zlib. This + * code uses ZLIB_IO_MAX, from pngpriv.h, as the maximum (the maximum value + * that can be stored in a uInt.) It is possible to set ZLIB_IO_MAX to a + * lower value in pngpriv.h and this may sometimes have a performance + * advantage, because it forces access of the input data to be separated from + * at least some of the use by some period of time. + */ + png_ptr->zstream.next_in = data; + /* avail_in is set below from 'size' */ + png_ptr->zstream.avail_in = 0; while (1) { int ret, avail; + /* The setting of 'avail_in' used to be outside the loop, by setting it + * inside it is possible to chunk the input to zlib and simply rely on + * zlib to advance the 'next_in' pointer. This allows arbitrary amounts o + * data to be passed through zlib at the unavoidable cost of requiring a + * window save (memcpy of up to 32768 output bytes) every ZLIB_IO_MAX + * input bytes. + */ + if (png_ptr->zstream.avail_in == 0 && size > 0) + { + if (size <= ZLIB_IO_MAX) + { + /* The value is less than ZLIB_IO_MAX so the cast is safe: */ + png_ptr->zstream.avail_in = (uInt)size; + size = 0; + } + + else + { + png_ptr->zstream.avail_in = ZLIB_IO_MAX; + size -= ZLIB_IO_MAX; + } + } + /* Reset the output buffer each time round - we empty it * after every inflate call. */ @@ -228,13 +340,18 @@ png_inflate(png_structp png_ptr, const png_byte *data, png_size_t size, */ if ((ret == Z_OK || ret == Z_STREAM_END) && avail > 0) { + png_size_t space = avail; /* > 0, see above */ + if (output != 0 && output_size > count) { - int copy = output_size - count; - if (avail < copy) copy = avail; + png_size_t copy = output_size - count; + + if (space < copy) + copy = space; + png_memcpy(output + count, png_ptr->zbuf, copy); } - count += avail; + count += space; } if (ret == Z_OK) @@ -255,21 +372,25 @@ png_inflate(png_structp png_ptr, const png_byte *data, png_size_t size, */ { PNG_CONST char *msg; +#ifdef PNG_CONSOLE_IO_SUPPORTED + char umsg[52]; +#endif if (png_ptr->zstream.msg != 0) msg = png_ptr->zstream.msg; + else { -#ifdef PNG_STDIO_SUPPORTED - char umsg[52]; - +#ifdef PNG_CONSOLE_IO_SUPPORTED switch (ret) { case Z_BUF_ERROR: msg = "Buffer error in compressed datastream in %s chunk"; break; + case Z_DATA_ERROR: msg = "Data error in compressed datastream in %s chunk"; break; + default: msg = "Incomplete compressed datastream in %s chunk"; break; @@ -285,7 +406,7 @@ png_inflate(png_structp png_ptr, const png_byte *data, png_size_t size, png_warning(png_ptr, msg); } - /* 0 means an error - notice that this code simple ignores + /* 0 means an error - notice that this code simply ignores * zero length compressed chunks as a result. */ return 0; @@ -315,9 +436,10 @@ png_decompress_chunk(png_structp png_ptr, int comp_type, else if (comp_type == PNG_COMPRESSION_TYPE_BASE) { png_size_t expanded_size = png_inflate(png_ptr, - (png_bytep)(png_ptr->chunkdata + prefix_size), - chunklength - prefix_size, - 0/*output*/, 0/*output size*/); + (png_bytep)(png_ptr->chunkdata + prefix_size), + chunklength - prefix_size, + 0, /*output*/ + 0); /*output size*/ /* Now check the limits on this chunk - if the limit fails the * compressed data will be removed, the prefix will remain. @@ -340,14 +462,15 @@ png_decompress_chunk(png_structp png_ptr, int comp_type, */ #if defined(PNG_SET_CHUNK_MALLOC_LIMIT_SUPPORTED) || \ defined(PNG_USER_CHUNK_MALLOC_MAX) - else -#endif + else if (expanded_size > 0) +#else if (expanded_size > 0) +#endif { /* Success (maybe) - really uncompress the chunk. */ png_size_t new_size = 0; png_charp text = png_malloc_warn(png_ptr, - prefix_size + expanded_size + 1); + prefix_size + expanded_size + 1); if (text != NULL) { @@ -369,8 +492,9 @@ png_decompress_chunk(png_structp png_ptr, int comp_type, png_warning(png_ptr, "png_inflate logic error"); png_free(png_ptr, text); } + else - png_warning(png_ptr, "Not enough memory to decompress chunk"); + png_warning(png_ptr, "Not enough memory to decompress chunk"); } } @@ -379,8 +503,8 @@ png_decompress_chunk(png_structp png_ptr, int comp_type, #ifdef PNG_STDIO_SUPPORTED char umsg[50]; - png_snprintf(umsg, sizeof umsg, "Unknown zTXt compression type %d", - comp_type); + png_snprintf(umsg, sizeof umsg, + "Unknown zTXt compression type %d", comp_type); png_warning(png_ptr, umsg); #else png_warning(png_ptr, "Unknown zTXt compression type"); @@ -395,10 +519,12 @@ png_decompress_chunk(png_structp png_ptr, int comp_type, */ { png_charp text = png_malloc_warn(png_ptr, prefix_size + 1); + if (text != NULL) { if (prefix_size > 0) png_memcpy(text, png_ptr->chunkdata, prefix_size); + png_free(png_ptr, png_ptr->chunkdata); png_ptr->chunkdata = text; @@ -457,6 +583,7 @@ png_handle_IHDR(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) /* Find number of channels */ switch (png_ptr->color_type) { + default: /* invalid, png_set_IHDR calls png_error */ case PNG_COLOR_TYPE_GRAY: case PNG_COLOR_TYPE_PALETTE: png_ptr->channels = 1; @@ -481,9 +608,9 @@ png_handle_IHDR(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) png_ptr->rowbytes = PNG_ROWBYTES(png_ptr->pixel_depth, png_ptr->width); png_debug1(3, "bit_depth = %d", png_ptr->bit_depth); png_debug1(3, "channels = %d", png_ptr->channels); - png_debug1(3, "rowbytes = %lu", png_ptr->rowbytes); + png_debug1(3, "rowbytes = %lu", (unsigned long)png_ptr->rowbytes); png_set_IHDR(png_ptr, info_ptr, width, height, bit_depth, - color_type, interlace_type, compression_type, filter_type); + color_type, interlace_type, compression_type, filter_type); } /* Read and check the palette */ @@ -516,10 +643,11 @@ png_handle_PLTE(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) if (!(png_ptr->color_type&PNG_COLOR_MASK_COLOR)) { png_warning(png_ptr, - "Ignoring PLTE chunk in grayscale PNG"); + "Ignoring PLTE chunk in grayscale PNG"); png_crc_finish(png_ptr, length); return; } + #ifndef PNG_READ_OPT_PLTE_SUPPORTED if (png_ptr->color_type != PNG_COLOR_TYPE_PALETTE) { @@ -568,7 +696,7 @@ png_handle_PLTE(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) } #endif - /* If we actually NEED the PLTE chunk (ie for a paletted image), we do + /* If we actually need the PLTE chunk (ie for a paletted image), we do * whatever the normal CRC configuration tells us. However, if we * have an RGB image, the PLTE can be considered ancillary, so * we will act as though it is. @@ -579,25 +707,29 @@ png_handle_PLTE(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) { png_crc_finish(png_ptr, 0); } + #ifndef PNG_READ_OPT_PLTE_SUPPORTED else if (png_crc_error(png_ptr)) /* Only if we have a CRC error */ { /* If we don't want to use the data from an ancillary chunk, - we have two options: an error abort, or a warning and we - ignore the data in this chunk (which should be OK, since - it's considered ancillary for a RGB or RGBA image). */ + * we have two options: an error abort, or a warning and we + * ignore the data in this chunk (which should be OK, since + * it's considered ancillary for a RGB or RGBA image). + */ if (!(png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_USE)) { if (png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_NOWARN) { png_chunk_benign_error(png_ptr, "CRC error"); } + else { png_chunk_warning(png_ptr, "CRC error"); return; } } + /* Otherwise, we (optionally) emit a warning and use the chunk. */ else if (!(png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_NOWARN)) { @@ -618,6 +750,7 @@ png_handle_PLTE(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) png_warning(png_ptr, "Truncating incorrect tRNS chunk length"); png_ptr->num_trans = (png_uint_16)num; } + if (info_ptr->num_trans > (png_uint_16)num) { png_warning(png_ptr, "Truncating incorrect info tRNS chunk length"); @@ -645,9 +778,10 @@ png_handle_IEND(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) { png_warning(png_ptr, "Incorrect IEND chunk length"); } + png_crc_finish(png_ptr, length); - info_ptr = info_ptr; /* Quiet compiler warnings about unused info_ptr */ + PNG_UNUSED(info_ptr) /* Quiet compiler warnings about unused info_ptr */ } #ifdef PNG_READ_gAMA_SUPPORTED @@ -655,30 +789,29 @@ void /* PRIVATE */ png_handle_gAMA(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) { png_fixed_point igamma; -#ifdef PNG_FLOATING_POINT_SUPPORTED - float file_gamma; -#endif png_byte buf[4]; png_debug(1, "in png_handle_gAMA"); if (!(png_ptr->mode & PNG_HAVE_IHDR)) png_error(png_ptr, "Missing IHDR before gAMA"); + else if (png_ptr->mode & PNG_HAVE_IDAT) { png_warning(png_ptr, "Invalid gAMA after IDAT"); png_crc_finish(png_ptr, length); return; } + else if (png_ptr->mode & PNG_HAVE_PLTE) /* Should be an error, but we can cope with it */ png_warning(png_ptr, "Out of place gAMA chunk"); if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_gAMA) #ifdef PNG_READ_sRGB_SUPPORTED - && !(info_ptr->valid & PNG_INFO_sRGB) + && !(info_ptr->valid & PNG_INFO_sRGB) #endif - ) + ) { png_warning(png_ptr, "Duplicate gAMA chunk"); png_crc_finish(png_ptr, length); @@ -693,41 +826,43 @@ png_handle_gAMA(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) } png_crc_read(png_ptr, buf, 4); + if (png_crc_finish(png_ptr, 0)) return; - igamma = (png_fixed_point)png_get_uint_32(buf); - /* Check for zero gamma */ - if (igamma == 0) - { - png_warning(png_ptr, - "Ignoring gAMA chunk with gamma=0"); - return; - } + igamma = png_get_fixed_point(NULL, buf); -#ifdef PNG_READ_sRGB_SUPPORTED + /* Check for zero gamma or an error. */ + if (igamma <= 0) + { + png_warning(png_ptr, + "Ignoring gAMA chunk with out of range gamma"); + + return; + } + +# ifdef PNG_READ_sRGB_SUPPORTED if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_sRGB)) + { if (PNG_OUT_OF_RANGE(igamma, 45500L, 500)) { png_warning(png_ptr, - "Ignoring incorrect gAMA value when sRGB is also present"); -#ifdef PNG_CONSOLE_IO_SUPPORTED + "Ignoring incorrect gAMA value when sRGB is also present"); + +# ifdef PNG_CONSOLE_IO_SUPPORTED fprintf(stderr, "gamma = (%d/100000)", (int)igamma); -#endif +# endif return; } -#endif /* PNG_READ_sRGB_SUPPORTED */ + } +# endif /* PNG_READ_sRGB_SUPPORTED */ -#ifdef PNG_FLOATING_POINT_SUPPORTED - file_gamma = (float)igamma / (float)100000.0; # ifdef PNG_READ_GAMMA_SUPPORTED - png_ptr->gamma = file_gamma; + /* Gamma correction on read is supported. */ + png_ptr->gamma = igamma; # endif - png_set_gAMA(png_ptr, info_ptr, file_gamma); -#endif -#ifdef PNG_FIXED_POINT_SUPPORTED + /* And set the 'info' structure members. */ png_set_gAMA_fixed(png_ptr, info_ptr, igamma); -#endif } #endif @@ -744,17 +879,20 @@ png_handle_sBIT(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) if (!(png_ptr->mode & PNG_HAVE_IHDR)) png_error(png_ptr, "Missing IHDR before sBIT"); + else if (png_ptr->mode & PNG_HAVE_IDAT) { png_warning(png_ptr, "Invalid sBIT after IDAT"); png_crc_finish(png_ptr, length); return; } + else if (png_ptr->mode & PNG_HAVE_PLTE) { /* Should be an error, but we can cope with it */ png_warning(png_ptr, "Out of place sBIT chunk"); } + if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_sBIT)) { png_warning(png_ptr, "Duplicate sBIT chunk"); @@ -764,6 +902,7 @@ png_handle_sBIT(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) truelen = 3; + else truelen = (png_size_t)png_ptr->channels; @@ -775,6 +914,7 @@ png_handle_sBIT(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) } png_crc_read(png_ptr, buf, truelen); + if (png_crc_finish(png_ptr, 0)) return; @@ -785,6 +925,7 @@ png_handle_sBIT(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) png_ptr->sig_bit.blue = buf[2]; png_ptr->sig_bit.alpha = buf[3]; } + else { png_ptr->sig_bit.gray = buf[0]; @@ -793,6 +934,7 @@ png_handle_sBIT(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) png_ptr->sig_bit.blue = buf[0]; png_ptr->sig_bit.alpha = buf[1]; } + png_set_sBIT(png_ptr, info_ptr, &(png_ptr->sig_bit)); } #endif @@ -802,32 +944,29 @@ void /* PRIVATE */ png_handle_cHRM(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) { png_byte buf[32]; -#ifdef PNG_FLOATING_POINT_SUPPORTED - float white_x, white_y, red_x, red_y, green_x, green_y, blue_x, blue_y; -#endif - png_fixed_point int_x_white, int_y_white, int_x_red, int_y_red, int_x_green, - int_y_green, int_x_blue, int_y_blue; - - png_uint_32 uint_x, uint_y; + png_fixed_point x_white, y_white, x_red, y_red, x_green, y_green, x_blue, + y_blue; png_debug(1, "in png_handle_cHRM"); if (!(png_ptr->mode & PNG_HAVE_IHDR)) png_error(png_ptr, "Missing IHDR before cHRM"); + else if (png_ptr->mode & PNG_HAVE_IDAT) { png_warning(png_ptr, "Invalid cHRM after IDAT"); png_crc_finish(png_ptr, length); return; } + else if (png_ptr->mode & PNG_HAVE_PLTE) /* Should be an error, but we can cope with it */ png_warning(png_ptr, "Missing PLTE before cHRM"); if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_cHRM) -#ifdef PNG_READ_sRGB_SUPPORTED - && !(info_ptr->valid & PNG_INFO_sRGB) -#endif +# ifdef PNG_READ_sRGB_SUPPORTED + && !(info_ptr->valid & PNG_INFO_sRGB) +# endif ) { png_warning(png_ptr, "Duplicate cHRM chunk"); @@ -843,83 +982,61 @@ png_handle_cHRM(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) } png_crc_read(png_ptr, buf, 32); + if (png_crc_finish(png_ptr, 0)) return; - uint_x = png_get_uint_32(buf); - uint_y = png_get_uint_32(buf + 4); - int_x_white = (png_fixed_point)uint_x; - int_y_white = (png_fixed_point)uint_y; + x_white = png_get_fixed_point(NULL, buf); + y_white = png_get_fixed_point(NULL, buf + 4); + x_red = png_get_fixed_point(NULL, buf + 8); + y_red = png_get_fixed_point(NULL, buf + 12); + x_green = png_get_fixed_point(NULL, buf + 16); + y_green = png_get_fixed_point(NULL, buf + 20); + x_blue = png_get_fixed_point(NULL, buf + 24); + y_blue = png_get_fixed_point(NULL, buf + 28); - uint_x = png_get_uint_32(buf + 8); - uint_y = png_get_uint_32(buf + 12); - int_x_red = (png_fixed_point)uint_x; - int_y_red = (png_fixed_point)uint_y; - - uint_x = png_get_uint_32(buf + 16); - uint_y = png_get_uint_32(buf + 20); - int_x_green = (png_fixed_point)uint_x; - int_y_green = (png_fixed_point)uint_y; - - uint_x = png_get_uint_32(buf + 24); - uint_y = png_get_uint_32(buf + 28); - int_x_blue = (png_fixed_point)uint_x; - int_y_blue = (png_fixed_point)uint_y; - -#ifdef PNG_FLOATING_POINT_SUPPORTED - white_x = (float)int_x_white / (float)100000.0; - white_y = (float)int_y_white / (float)100000.0; - red_x = (float)int_x_red / (float)100000.0; - red_y = (float)int_y_red / (float)100000.0; - green_x = (float)int_x_green / (float)100000.0; - green_y = (float)int_y_green / (float)100000.0; - blue_x = (float)int_x_blue / (float)100000.0; - blue_y = (float)int_y_blue / (float)100000.0; -#endif + if (x_white == PNG_FIXED_ERROR || + y_white == PNG_FIXED_ERROR || + x_red == PNG_FIXED_ERROR || + y_red == PNG_FIXED_ERROR || + x_green == PNG_FIXED_ERROR || + y_green == PNG_FIXED_ERROR || + x_blue == PNG_FIXED_ERROR || + y_blue == PNG_FIXED_ERROR) + { + png_warning(png_ptr, "Ignoring cHRM chunk with negative chromaticities"); + return; + } #ifdef PNG_READ_sRGB_SUPPORTED if ((info_ptr != NULL) && (info_ptr->valid & PNG_INFO_sRGB)) + { + if (PNG_OUT_OF_RANGE(x_white, 31270, 1000) || + PNG_OUT_OF_RANGE(y_white, 32900, 1000) || + PNG_OUT_OF_RANGE(x_red, 64000L, 1000) || + PNG_OUT_OF_RANGE(y_red, 33000, 1000) || + PNG_OUT_OF_RANGE(x_green, 30000, 1000) || + PNG_OUT_OF_RANGE(y_green, 60000L, 1000) || + PNG_OUT_OF_RANGE(x_blue, 15000, 1000) || + PNG_OUT_OF_RANGE(y_blue, 6000, 1000)) { - if (PNG_OUT_OF_RANGE(int_x_white, 31270, 1000) || - PNG_OUT_OF_RANGE(int_y_white, 32900, 1000) || - PNG_OUT_OF_RANGE(int_x_red, 64000L, 1000) || - PNG_OUT_OF_RANGE(int_y_red, 33000, 1000) || - PNG_OUT_OF_RANGE(int_x_green, 30000, 1000) || - PNG_OUT_OF_RANGE(int_y_green, 60000L, 1000) || - PNG_OUT_OF_RANGE(int_x_blue, 15000, 1000) || - PNG_OUT_OF_RANGE(int_y_blue, 6000, 1000)) - { - png_warning(png_ptr, - "Ignoring incorrect cHRM value when sRGB is also present"); + png_warning(png_ptr, + "Ignoring incorrect cHRM value when sRGB is also present"); + #ifdef PNG_CONSOLE_IO_SUPPORTED -#ifdef PNG_FLOATING_POINT_SUPPORTED - fprintf(stderr, "wx=%f, wy=%f, rx=%f, ry=%f\n", - white_x, white_y, red_x, red_y); - fprintf(stderr, "gx=%f, gy=%f, bx=%f, by=%f\n", - green_x, green_y, blue_x, blue_y); -#else - fprintf(stderr, "wx=%ld, wy=%ld, rx=%ld, ry=%ld\n", - (long)int_x_white, (long)int_y_white, - (long)int_x_red, (long)int_y_red); - fprintf(stderr, "gx=%ld, gy=%ld, bx=%ld, by=%ld\n", - (long)int_x_green, (long)int_y_green, - (long)int_x_blue, (long)int_y_blue); -#endif + fprintf(stderr, "wx=%d, wy=%d, rx=%d, ry=%d\n", + x_white, y_white, x_red, y_red); + + fprintf(stderr, "gx=%d, gy=%d, bx=%d, by=%d\n", + x_green, y_green, x_blue, y_blue); #endif /* PNG_CONSOLE_IO_SUPPORTED */ - } - return; } + return; + } #endif /* PNG_READ_sRGB_SUPPORTED */ -#ifdef PNG_FLOATING_POINT_SUPPORTED - png_set_cHRM(png_ptr, info_ptr, - white_x, white_y, red_x, red_y, green_x, green_y, blue_x, blue_y); -#endif -#ifdef PNG_FIXED_POINT_SUPPORTED - png_set_cHRM_fixed(png_ptr, info_ptr, - int_x_white, int_y_white, int_x_red, int_y_red, int_x_green, - int_y_green, int_x_blue, int_y_blue); -#endif + png_set_cHRM_fixed(png_ptr, info_ptr, x_white, y_white, x_red, y_red, + x_green, y_green, x_blue, y_blue); } #endif @@ -934,12 +1051,14 @@ png_handle_sRGB(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) if (!(png_ptr->mode & PNG_HAVE_IHDR)) png_error(png_ptr, "Missing IHDR before sRGB"); + else if (png_ptr->mode & PNG_HAVE_IDAT) { png_warning(png_ptr, "Invalid sRGB after IDAT"); png_crc_finish(png_ptr, length); return; } + else if (png_ptr->mode & PNG_HAVE_PLTE) /* Should be an error, but we can cope with it */ png_warning(png_ptr, "Out of place sRGB chunk"); @@ -959,10 +1078,12 @@ png_handle_sRGB(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) } png_crc_read(png_ptr, buf, 1); + if (png_crc_finish(png_ptr, 0)) return; intent = buf[0]; + /* Check for bad intent */ if (intent >= PNG_sRGB_INTENT_LAST) { @@ -973,48 +1094,31 @@ png_handle_sRGB(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) #if defined(PNG_READ_gAMA_SUPPORTED) && defined(PNG_READ_GAMMA_SUPPORTED) if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_gAMA)) { - png_fixed_point igamma; -#ifdef PNG_FIXED_POINT_SUPPORTED - igamma=info_ptr->int_gamma; -#else -# ifdef PNG_FLOATING_POINT_SUPPORTED - igamma=(png_fixed_point)(info_ptr->gamma * 100000.); -# endif -#endif - if (PNG_OUT_OF_RANGE(igamma, 45500L, 500)) + if (PNG_OUT_OF_RANGE(info_ptr->gamma, 45500L, 500)) { png_warning(png_ptr, - "Ignoring incorrect gAMA value when sRGB is also present"); + "Ignoring incorrect gAMA value when sRGB is also present"); #ifdef PNG_CONSOLE_IO_SUPPORTED -# ifdef PNG_FIXED_POINT_SUPPORTED - fprintf(stderr, "incorrect gamma=(%d/100000)\n", - (int)png_ptr->int_gamma); -# else -# ifdef PNG_FLOATING_POINT_SUPPORTED - fprintf(stderr, "incorrect gamma=%f\n", png_ptr->gamma); -# endif -# endif + fprintf(stderr, "incorrect gamma=(%d/100000)\n", info_ptr->gamma); #endif } } #endif /* PNG_READ_gAMA_SUPPORTED */ #ifdef PNG_READ_cHRM_SUPPORTED -#ifdef PNG_FIXED_POINT_SUPPORTED if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_cHRM)) - if (PNG_OUT_OF_RANGE(info_ptr->int_x_white, 31270, 1000) || - PNG_OUT_OF_RANGE(info_ptr->int_y_white, 32900, 1000) || - PNG_OUT_OF_RANGE(info_ptr->int_x_red, 64000L, 1000) || - PNG_OUT_OF_RANGE(info_ptr->int_y_red, 33000, 1000) || - PNG_OUT_OF_RANGE(info_ptr->int_x_green, 30000, 1000) || - PNG_OUT_OF_RANGE(info_ptr->int_y_green, 60000L, 1000) || - PNG_OUT_OF_RANGE(info_ptr->int_x_blue, 15000, 1000) || - PNG_OUT_OF_RANGE(info_ptr->int_y_blue, 6000, 1000)) - { - png_warning(png_ptr, - "Ignoring incorrect cHRM value when sRGB is also present"); - } -#endif /* PNG_FIXED_POINT_SUPPORTED */ + if (PNG_OUT_OF_RANGE(info_ptr->x_white, 31270, 1000) || + PNG_OUT_OF_RANGE(info_ptr->y_white, 32900, 1000) || + PNG_OUT_OF_RANGE(info_ptr->x_red, 64000L, 1000) || + PNG_OUT_OF_RANGE(info_ptr->y_red, 33000, 1000) || + PNG_OUT_OF_RANGE(info_ptr->x_green, 30000, 1000) || + PNG_OUT_OF_RANGE(info_ptr->y_green, 60000L, 1000) || + PNG_OUT_OF_RANGE(info_ptr->x_blue, 15000, 1000) || + PNG_OUT_OF_RANGE(info_ptr->y_blue, 6000, 1000)) + { + png_warning(png_ptr, + "Ignoring incorrect cHRM value when sRGB is also present"); + } #endif /* PNG_READ_cHRM_SUPPORTED */ png_set_sRGB_gAMA_and_cHRM(png_ptr, info_ptr, intent); @@ -1030,19 +1134,22 @@ png_handle_iCCP(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) png_bytep pC; png_charp profile; png_uint_32 skip = 0; - png_uint_32 profile_size, profile_length; + png_uint_32 profile_size; + png_alloc_size_t profile_length; png_size_t slength, prefix_length, data_length; png_debug(1, "in png_handle_iCCP"); if (!(png_ptr->mode & PNG_HAVE_IHDR)) png_error(png_ptr, "Missing IHDR before iCCP"); + else if (png_ptr->mode & PNG_HAVE_IDAT) { png_warning(png_ptr, "Invalid iCCP after IDAT"); png_crc_finish(png_ptr, length); return; } + else if (png_ptr->mode & PNG_HAVE_PLTE) /* Should be an error, but we can cope with it */ png_warning(png_ptr, "Out of place iCCP chunk"); @@ -1085,7 +1192,7 @@ png_handle_iCCP(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) /* There should be at least one zero (the compression type byte) * following the separator, and we should be on it */ - if ( profile >= png_ptr->chunkdata + slength - 1) + if (profile >= png_ptr->chunkdata + slength - 1) { png_free(png_ptr, png_ptr->chunkdata); png_ptr->chunkdata = NULL; @@ -1095,6 +1202,7 @@ png_handle_iCCP(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) /* Compression_type should always be zero */ compression_type = *profile++; + if (compression_type) { png_warning(png_ptr, "Ignoring nonzero compression type in iCCP chunk"); @@ -1104,11 +1212,11 @@ png_handle_iCCP(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) prefix_length = profile - png_ptr->chunkdata; png_decompress_chunk(png_ptr, compression_type, - slength, prefix_length, &data_length); + slength, prefix_length, &data_length); profile_length = data_length - prefix_length; - if ( prefix_length > data_length || profile_length < 4) + if (prefix_length > data_length || profile_length < 4) { png_free(png_ptr, png_ptr->chunkdata); png_ptr->chunkdata = NULL; @@ -1118,36 +1226,43 @@ png_handle_iCCP(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) /* Check the profile_size recorded in the first 32 bits of the ICC profile */ pC = (png_bytep)(png_ptr->chunkdata + prefix_length); - profile_size = ((*(pC ))<<24) | - ((*(pC + 1))<<16) | - ((*(pC + 2))<< 8) | - ((*(pC + 3)) ); + profile_size = ((*(pC )) << 24) | + ((*(pC + 1)) << 16) | + ((*(pC + 2)) << 8) | + ((*(pC + 3)) ); + /* NOTE: the following guarantees that 'profile_length' fits into 32 bits, + * because profile_size is a 32 bit value. + */ if (profile_size < profile_length) profile_length = profile_size; + /* And the following guarantees that profile_size == profile_length. */ if (profile_size > profile_length) { png_free(png_ptr, png_ptr->chunkdata); png_ptr->chunkdata = NULL; - png_warning(png_ptr, "Ignoring truncated iCCP profile"); #ifdef PNG_STDIO_SUPPORTED - { - char umsg[50]; + { + char umsg[80]; - png_snprintf(umsg, 50, "declared profile size = %lu", - (unsigned long)profile_size); - png_warning(png_ptr, umsg); - png_snprintf(umsg, 50, "actual profile length = %lu", - (unsigned long)profile_length); - png_warning(png_ptr, umsg); - } + png_snprintf2(umsg, 80, + "Ignoring iCCP chunk with declared size = %u " + "and actual length = %u", + (unsigned int) profile_size, + (unsigned int) profile_length); + png_warning(png_ptr, umsg); + } +#else + png_warning(png_ptr, + "Ignoring iCCP chunk with uncompressed size mismatch"); #endif return; } png_set_iCCP(png_ptr, info_ptr, png_ptr->chunkdata, - compression_type, png_ptr->chunkdata + prefix_length, profile_length); + compression_type, (png_bytep)png_ptr->chunkdata + prefix_length, + profile_size); png_free(png_ptr, png_ptr->chunkdata); png_ptr->chunkdata = NULL; } @@ -1160,12 +1275,13 @@ png_handle_sPLT(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) { png_bytep entry_start; png_sPLT_t new_palette; -#ifdef PNG_POINTER_INDEXING_SUPPORTED png_sPLT_entryp pp; -#endif - int data_length, entry_size, i; + png_uint_32 data_length; + int entry_size, i; png_uint_32 skip = 0; png_size_t slength; + png_uint_32 dl; + png_size_t max_dl; png_debug(1, "in png_handle_sPLT"); @@ -1178,6 +1294,7 @@ png_handle_sPLT(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) png_crc_finish(png_ptr, length); return; } + if (--png_ptr->user_chunk_cache_max == 1) { png_warning(png_ptr, "No space in chunk cache for sPLT"); @@ -1189,6 +1306,7 @@ png_handle_sPLT(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) if (!(png_ptr->mode & PNG_HAVE_IHDR)) png_error(png_ptr, "Missing IHDR before sPLT"); + else if (png_ptr->mode & PNG_HAVE_IDAT) { png_warning(png_ptr, "Invalid sPLT after IDAT"); @@ -1207,6 +1325,11 @@ png_handle_sPLT(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) png_free(png_ptr, png_ptr->chunkdata); png_ptr->chunkdata = (png_charp)png_malloc(png_ptr, length + 1); + + /* WARNING: this may break if size_t is less than 32 bits; it is assumed + * that the PNG_MAX_MALLOC_64K test is enabled in this case, but this is a + * potential breakage point if the types in pngconf.h aren't exactly right. + */ slength = (png_size_t)length; png_crc_read(png_ptr, (png_bytep)png_ptr->chunkdata, slength); @@ -1222,6 +1345,7 @@ png_handle_sPLT(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) for (entry_start = (png_bytep)png_ptr->chunkdata; *entry_start; entry_start++) /* Empty loop to find end of name */ ; + ++entry_start; /* A sample depth should follow the separator, and we should be on it */ @@ -1235,7 +1359,12 @@ png_handle_sPLT(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) new_palette.depth = *entry_start++; entry_size = (new_palette.depth == 8 ? 6 : 10); - data_length = (slength - (entry_start - (png_bytep)png_ptr->chunkdata)); + /* This must fit in a png_uint_32 because it is derived from the original + * chunk data length (and use 'length', not 'slength' here for clarity - + * they are guaranteed to be the same, see the tests above.) + */ + data_length = length - (png_uint_32)(entry_start - + (png_bytep)png_ptr->chunkdata); /* Integrity-check the data length */ if (data_length % entry_size) @@ -1246,15 +1375,20 @@ png_handle_sPLT(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) return; } - new_palette.nentries = (png_int_32) ( data_length / entry_size); - if ((png_uint_32) new_palette.nentries > - (png_uint_32) (PNG_SIZE_MAX / png_sizeof(png_sPLT_entry))) + dl = (png_int_32)(data_length / entry_size); + max_dl = PNG_SIZE_MAX / png_sizeof(png_sPLT_entry); + + if (dl > max_dl) { png_warning(png_ptr, "sPLT chunk too long"); return; } + + new_palette.nentries = (png_int_32)(data_length / entry_size); + new_palette.entries = (png_sPLT_entryp)png_malloc_warn( png_ptr, new_palette.nentries * png_sizeof(png_sPLT_entry)); + if (new_palette.entries == NULL) { png_warning(png_ptr, "sPLT chunk requires too much memory"); @@ -1268,40 +1402,45 @@ png_handle_sPLT(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) if (new_palette.depth == 8) { - pp->red = *entry_start++; - pp->green = *entry_start++; - pp->blue = *entry_start++; - pp->alpha = *entry_start++; + pp->red = *entry_start++; + pp->green = *entry_start++; + pp->blue = *entry_start++; + pp->alpha = *entry_start++; } + else { - pp->red = png_get_uint_16(entry_start); entry_start += 2; - pp->green = png_get_uint_16(entry_start); entry_start += 2; - pp->blue = png_get_uint_16(entry_start); entry_start += 2; - pp->alpha = png_get_uint_16(entry_start); entry_start += 2; + pp->red = png_get_uint_16(entry_start); entry_start += 2; + pp->green = png_get_uint_16(entry_start); entry_start += 2; + pp->blue = png_get_uint_16(entry_start); entry_start += 2; + pp->alpha = png_get_uint_16(entry_start); entry_start += 2; } + pp->frequency = png_get_uint_16(entry_start); entry_start += 2; } #else pp = new_palette.entries; + for (i = 0; i < new_palette.nentries; i++) { if (new_palette.depth == 8) { - pp[i].red = *entry_start++; - pp[i].green = *entry_start++; - pp[i].blue = *entry_start++; - pp[i].alpha = *entry_start++; + pp[i].red = *entry_start++; + pp[i].green = *entry_start++; + pp[i].blue = *entry_start++; + pp[i].alpha = *entry_start++; } + else { - pp[i].red = png_get_uint_16(entry_start); entry_start += 2; - pp[i].green = png_get_uint_16(entry_start); entry_start += 2; - pp[i].blue = png_get_uint_16(entry_start); entry_start += 2; - pp[i].alpha = png_get_uint_16(entry_start); entry_start += 2; + pp[i].red = png_get_uint_16(entry_start); entry_start += 2; + pp[i].green = png_get_uint_16(entry_start); entry_start += 2; + pp[i].blue = png_get_uint_16(entry_start); entry_start += 2; + pp[i].alpha = png_get_uint_16(entry_start); entry_start += 2; } - pp->frequency = png_get_uint_16(entry_start); entry_start += 2; + + pp[i].frequency = png_get_uint_16(entry_start); entry_start += 2; } #endif @@ -1326,12 +1465,14 @@ png_handle_tRNS(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) if (!(png_ptr->mode & PNG_HAVE_IHDR)) png_error(png_ptr, "Missing IHDR before tRNS"); + else if (png_ptr->mode & PNG_HAVE_IDAT) { png_warning(png_ptr, "Invalid tRNS after IDAT"); png_crc_finish(png_ptr, length); return; } + else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_tRNS)) { png_warning(png_ptr, "Duplicate tRNS chunk"); @@ -1354,6 +1495,7 @@ png_handle_tRNS(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) png_ptr->num_trans = 1; png_ptr->trans_color.gray = png_get_uint_16(buf); } + else if (png_ptr->color_type == PNG_COLOR_TYPE_RGB) { png_byte buf[6]; @@ -1364,12 +1506,14 @@ png_handle_tRNS(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) png_crc_finish(png_ptr, length); return; } + png_crc_read(png_ptr, buf, (png_size_t)length); png_ptr->num_trans = 1; png_ptr->trans_color.red = png_get_uint_16(buf); png_ptr->trans_color.green = png_get_uint_16(buf + 2); png_ptr->trans_color.blue = png_get_uint_16(buf + 4); } + else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) { if (!(png_ptr->mode & PNG_HAVE_PLTE)) @@ -1377,6 +1521,7 @@ png_handle_tRNS(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) /* Should be an error, but we can cope with it. */ png_warning(png_ptr, "Missing PLTE before tRNS"); } + if (length > (png_uint_32)png_ptr->num_palette || length > PNG_MAX_PALETTE_LENGTH) { @@ -1384,15 +1529,18 @@ png_handle_tRNS(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) png_crc_finish(png_ptr, length); return; } + if (length == 0) { png_warning(png_ptr, "Zero length tRNS chunk"); png_crc_finish(png_ptr, length); return; } + png_crc_read(png_ptr, readbuf, (png_size_t)length); png_ptr->num_trans = (png_uint_16)length; } + else { png_warning(png_ptr, "tRNS chunk not allowed with alpha channel"); @@ -1407,7 +1555,7 @@ png_handle_tRNS(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) } png_set_tRNS(png_ptr, info_ptr, readbuf, png_ptr->num_trans, - &(png_ptr->trans_color)); + &(png_ptr->trans_color)); } #endif @@ -1422,19 +1570,22 @@ png_handle_bKGD(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) if (!(png_ptr->mode & PNG_HAVE_IHDR)) png_error(png_ptr, "Missing IHDR before bKGD"); + else if (png_ptr->mode & PNG_HAVE_IDAT) { png_warning(png_ptr, "Invalid bKGD after IDAT"); png_crc_finish(png_ptr, length); return; } + else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE && - !(png_ptr->mode & PNG_HAVE_PLTE)) + !(png_ptr->mode & PNG_HAVE_PLTE)) { png_warning(png_ptr, "Missing PLTE before bKGD"); png_crc_finish(png_ptr, length); return; } + else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_bKGD)) { png_warning(png_ptr, "Duplicate bKGD chunk"); @@ -1444,8 +1595,10 @@ png_handle_bKGD(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) truelen = 1; + else if (png_ptr->color_type & PNG_COLOR_MASK_COLOR) truelen = 6; + else truelen = 2; @@ -1457,31 +1610,38 @@ png_handle_bKGD(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) } png_crc_read(png_ptr, buf, truelen); + if (png_crc_finish(png_ptr, 0)) return; /* We convert the index value into RGB components so that we can allow * arbitrary RGB values for background when we have transparency, and * so it is easy to determine the RGB values of the background color - * from the info_ptr struct. */ + * from the info_ptr struct. + */ if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) { png_ptr->background.index = buf[0]; + if (info_ptr && info_ptr->num_palette) { - if (buf[0] >= info_ptr->num_palette) - { - png_warning(png_ptr, "Incorrect bKGD chunk index value"); - return; - } - png_ptr->background.red = + if (buf[0] >= info_ptr->num_palette) + { + png_warning(png_ptr, "Incorrect bKGD chunk index value"); + return; + } + + png_ptr->background.red = (png_uint_16)png_ptr->palette[buf[0]].red; - png_ptr->background.green = + + png_ptr->background.green = (png_uint_16)png_ptr->palette[buf[0]].green; - png_ptr->background.blue = + + png_ptr->background.blue = (png_uint_16)png_ptr->palette[buf[0]].blue; } } + else if (!(png_ptr->color_type & PNG_COLOR_MASK_COLOR)) /* GRAY */ { png_ptr->background.red = @@ -1489,6 +1649,7 @@ png_handle_bKGD(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) png_ptr->background.blue = png_ptr->background.gray = png_get_uint_16(buf); } + else { png_ptr->background.red = png_get_uint_16(buf); @@ -1511,18 +1672,21 @@ png_handle_hIST(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) if (!(png_ptr->mode & PNG_HAVE_IHDR)) png_error(png_ptr, "Missing IHDR before hIST"); + else if (png_ptr->mode & PNG_HAVE_IDAT) { png_warning(png_ptr, "Invalid hIST after IDAT"); png_crc_finish(png_ptr, length); return; } + else if (!(png_ptr->mode & PNG_HAVE_PLTE)) { png_warning(png_ptr, "Missing PLTE before hIST"); png_crc_finish(png_ptr, length); return; } + else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_hIST)) { png_warning(png_ptr, "Duplicate hIST chunk"); @@ -1531,8 +1695,9 @@ png_handle_hIST(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) } num = length / 2 ; - if (num != (unsigned int) png_ptr->num_palette || num > - (unsigned int) PNG_MAX_PALETTE_LENGTH) + + if (num != (unsigned int)png_ptr->num_palette || num > + (unsigned int)PNG_MAX_PALETTE_LENGTH) { png_warning(png_ptr, "Incorrect hIST chunk length"); png_crc_finish(png_ptr, length); @@ -1566,12 +1731,14 @@ png_handle_pHYs(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) if (!(png_ptr->mode & PNG_HAVE_IHDR)) png_error(png_ptr, "Missing IHDR before pHYs"); + else if (png_ptr->mode & PNG_HAVE_IDAT) { png_warning(png_ptr, "Invalid pHYs after IDAT"); png_crc_finish(png_ptr, length); return; } + else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_pHYs)) { png_warning(png_ptr, "Duplicate pHYs chunk"); @@ -1587,6 +1754,7 @@ png_handle_pHYs(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) } png_crc_read(png_ptr, buf, 9); + if (png_crc_finish(png_ptr, 0)) return; @@ -1609,12 +1777,14 @@ png_handle_oFFs(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) if (!(png_ptr->mode & PNG_HAVE_IHDR)) png_error(png_ptr, "Missing IHDR before oFFs"); + else if (png_ptr->mode & PNG_HAVE_IDAT) { png_warning(png_ptr, "Invalid oFFs after IDAT"); png_crc_finish(png_ptr, length); return; } + else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_oFFs)) { png_warning(png_ptr, "Duplicate oFFs chunk"); @@ -1630,6 +1800,7 @@ png_handle_oFFs(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) } png_crc_read(png_ptr, buf, 9); + if (png_crc_finish(png_ptr, 0)) return; @@ -1656,12 +1827,14 @@ png_handle_pCAL(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) if (!(png_ptr->mode & PNG_HAVE_IHDR)) png_error(png_ptr, "Missing IHDR before pCAL"); + else if (png_ptr->mode & PNG_HAVE_IDAT) { png_warning(png_ptr, "Invalid pCAL after IDAT"); png_crc_finish(png_ptr, length); return; } + else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_pCAL)) { png_warning(png_ptr, "Duplicate pCAL chunk"); @@ -1669,15 +1842,17 @@ png_handle_pCAL(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) return; } - png_debug1(2, "Allocating and reading pCAL chunk data (%lu bytes)", - length + 1); + png_debug1(2, "Allocating and reading pCAL chunk data (%u bytes)", + length + 1); png_free(png_ptr, png_ptr->chunkdata); png_ptr->chunkdata = (png_charp)png_malloc_warn(png_ptr, length + 1); + if (png_ptr->chunkdata == NULL) - { - png_warning(png_ptr, "No memory for pCAL purpose"); - return; - } + { + png_warning(png_ptr, "No memory for pCAL purpose"); + return; + } + slength = (png_size_t)length; png_crc_read(png_ptr, (png_bytep)png_ptr->chunkdata, slength); @@ -1697,7 +1872,8 @@ png_handle_pCAL(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) endptr = png_ptr->chunkdata + slength; /* We need to have at least 12 bytes after the purpose string - in order to get the parameter information. */ + * in order to get the parameter information. + */ if (endptr <= buf + 12) { png_warning(png_ptr, "Invalid pCAL data"); @@ -1715,7 +1891,8 @@ png_handle_pCAL(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) png_debug(3, "Checking pCAL equation type and number of parameters"); /* Check that we have the right number of parameters for known - equation types. */ + * equation types. + */ if ((type == PNG_EQUATION_LINEAR && nparams != 2) || (type == PNG_EQUATION_BASE_E && nparams != 3) || (type == PNG_EQUATION_ARBITRARY && nparams != 3) || @@ -1726,6 +1903,7 @@ png_handle_pCAL(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) png_ptr->chunkdata = NULL; return; } + else if (type >= PNG_EQUATION_LAST) { png_warning(png_ptr, "Unrecognized equation type for pCAL chunk"); @@ -1735,15 +1913,17 @@ png_handle_pCAL(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) /* Empty loop to move past the units string. */ ; png_debug(3, "Allocating pCAL parameters array"); + params = (png_charpp)png_malloc_warn(png_ptr, - (png_size_t)(nparams * png_sizeof(png_charp))); + (png_size_t)(nparams * png_sizeof(png_charp))); + if (params == NULL) - { - png_free(png_ptr, png_ptr->chunkdata); - png_ptr->chunkdata = NULL; - png_warning(png_ptr, "No memory for pCAL params"); - return; - } + { + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + png_warning(png_ptr, "No memory for pCAL params"); + return; + } /* Get pointers to the start of each parameter string. */ for (i = 0; i < (int)nparams; i++) @@ -1751,6 +1931,7 @@ png_handle_pCAL(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) buf++; /* Skip the null string terminator from previous parameter. */ png_debug1(3, "Reading pCAL parameter %d", i); + for (params[i] = buf; buf <= endptr && *buf != 0x00; buf++) /* Empty loop to move past each parameter string */ ; @@ -1779,27 +1960,21 @@ png_handle_pCAL(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) void /* PRIVATE */ png_handle_sCAL(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) { - png_charp ep; -#ifdef PNG_FLOATING_POINT_SUPPORTED - double width, height; - png_charp vp; -#else -#ifdef PNG_FIXED_POINT_SUPPORTED - png_charp swidth, sheight; -#endif -#endif - png_size_t slength; + png_size_t slength, i; + int state; png_debug(1, "in png_handle_sCAL"); if (!(png_ptr->mode & PNG_HAVE_IHDR)) png_error(png_ptr, "Missing IHDR before sCAL"); + else if (png_ptr->mode & PNG_HAVE_IDAT) { png_warning(png_ptr, "Invalid sCAL after IDAT"); png_crc_finish(png_ptr, length); return; } + else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_sCAL)) { png_warning(png_ptr, "Duplicate sCAL chunk"); @@ -1807,17 +1982,21 @@ png_handle_sCAL(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) return; } - png_debug1(2, "Allocating and reading sCAL chunk data (%lu bytes)", + png_debug1(2, "Allocating and reading sCAL chunk data (%u bytes)", length + 1); + png_ptr->chunkdata = (png_charp)png_malloc_warn(png_ptr, length + 1); + if (png_ptr->chunkdata == NULL) { png_warning(png_ptr, "Out of memory while processing sCAL chunk"); png_crc_finish(png_ptr, length); return; } + slength = (png_size_t)length; png_crc_read(png_ptr, (png_bytep)png_ptr->chunkdata, slength); + png_ptr->chunkdata[slength] = 0x00; /* Null terminate the last string */ if (png_crc_finish(png_ptr, 0)) { @@ -1826,108 +2005,44 @@ png_handle_sCAL(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) return; } - png_ptr->chunkdata[slength] = 0x00; /* Null terminate the last string */ - - ep = png_ptr->chunkdata + 1; /* Skip unit byte */ - -#ifdef PNG_FLOATING_POINT_SUPPORTED - width = png_strtod(png_ptr, ep, &vp); - if (*vp) + /* Validate the unit. */ + if (png_ptr->chunkdata[0] != 1 && png_ptr->chunkdata[0] != 2) { - png_warning(png_ptr, "malformed width string in sCAL chunk"); - png_free(png_ptr, png_ptr->chunkdata); - png_ptr->chunkdata = NULL; - return; - } -#else -#ifdef PNG_FIXED_POINT_SUPPORTED - swidth = (png_charp)png_malloc_warn(png_ptr, png_strlen(ep) + 1); - if (swidth == NULL) - { - png_warning(png_ptr, "Out of memory while processing sCAL chunk width"); - png_free(png_ptr, png_ptr->chunkdata); - png_ptr->chunkdata = NULL; - return; - } - png_memcpy(swidth, ep, png_strlen(ep)); -#endif -#endif - - for (ep = png_ptr->chunkdata; *ep; ep++) - /* Empty loop */ ; - ep++; - - if (png_ptr->chunkdata + slength < ep) - { - png_warning(png_ptr, "Truncated sCAL chunk"); -#if defined(PNG_FIXED_POINT_SUPPORTED) && !defined(PNG_FLOATING_POINT_SUPPORTED) - png_free(png_ptr, swidth); -#endif + png_warning(png_ptr, "Invalid sCAL ignored: invalid unit"); png_free(png_ptr, png_ptr->chunkdata); png_ptr->chunkdata = NULL; return; } -#ifdef PNG_FLOATING_POINT_SUPPORTED - height = png_strtod(png_ptr, ep, &vp); - if (*vp) - { - png_warning(png_ptr, "malformed height string in sCAL chunk"); - png_free(png_ptr, png_ptr->chunkdata); - png_ptr->chunkdata = NULL; -#if defined(PNG_FIXED_POINT_SUPPORTED) && !defined(PNG_FLOATING_POINT_SUPPORTED) - png_free(png_ptr, swidth); -#endif - return; - } -#else -#ifdef PNG_FIXED_POINT_SUPPORTED - sheight = (png_charp)png_malloc_warn(png_ptr, png_strlen(ep) + 1); - if (sheight == NULL) - { - png_warning(png_ptr, "Out of memory while processing sCAL chunk height"); - png_free(png_ptr, png_ptr->chunkdata); - png_ptr->chunkdata = NULL; -#if defined(PNG_FIXED_POINT_SUPPORTED) && !defined(PNG_FLOATING_POINT_SUPPORTED) - png_free(png_ptr, swidth); -#endif - return; - } - png_memcpy(sheight, ep, png_strlen(ep)); -#endif -#endif + /* Validate the ASCII numbers, need two ASCII numbers separated by + * a '\0' and they need to fit exactly in the chunk data. + */ + i = 0; + state = 0; - if (png_ptr->chunkdata + slength < ep -#ifdef PNG_FLOATING_POINT_SUPPORTED - || width <= 0. || height <= 0. -#endif - ) + if (png_ptr->chunkdata[1] == 45 /* negative width */ || + !png_check_fp_number(png_ptr->chunkdata, slength, &state, &i) || + i >= slength || png_ptr->chunkdata[i++] != 0) + png_warning(png_ptr, "Invalid sCAL chunk ignored: bad width format"); + + else { - png_warning(png_ptr, "Invalid sCAL data"); - png_free(png_ptr, png_ptr->chunkdata); - png_ptr->chunkdata = NULL; -#if defined(PNG_FIXED_POINT_SUPPORTED) && !defined(PNG_FLOATING_POINT_SUPPORTED) - png_free(png_ptr, swidth); - png_free(png_ptr, sheight); -#endif - return; + png_size_t heighti = i; + + if (png_ptr->chunkdata[i] == 45 /* negative height */ || + !png_check_fp_number(png_ptr->chunkdata, slength, &state, &i) || + i != slength) + png_warning(png_ptr, "Invalid sCAL chunk ignored: bad height format"); + + else + /* This is the (only) success case. */ + png_set_sCAL_s(png_ptr, info_ptr, png_ptr->chunkdata[0], + png_ptr->chunkdata+1, png_ptr->chunkdata+heighti); } - -#ifdef PNG_FLOATING_POINT_SUPPORTED - png_set_sCAL(png_ptr, info_ptr, png_ptr->chunkdata[0], width, height); -#else -#ifdef PNG_FIXED_POINT_SUPPORTED - png_set_sCAL_s(png_ptr, info_ptr, png_ptr->chunkdata[0], swidth, sheight); -#endif -#endif - + /* Clean up - just free the temporarily allocated buffer. */ png_free(png_ptr, png_ptr->chunkdata); png_ptr->chunkdata = NULL; -#if defined(PNG_FIXED_POINT_SUPPORTED) && !defined(PNG_FLOATING_POINT_SUPPORTED) - png_free(png_ptr, swidth); - png_free(png_ptr, sheight); -#endif } #endif @@ -1942,6 +2057,7 @@ png_handle_tIME(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) if (!(png_ptr->mode & PNG_HAVE_IHDR)) png_error(png_ptr, "Out of place tIME chunk"); + else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_tIME)) { png_warning(png_ptr, "Duplicate tIME chunk"); @@ -1960,6 +2076,7 @@ png_handle_tIME(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) } png_crc_read(png_ptr, buf, 7); + if (png_crc_finish(png_ptr, 0)) return; @@ -1996,6 +2113,7 @@ png_handle_tEXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) png_crc_finish(png_ptr, length); return; } + if (--png_ptr->user_chunk_cache_max == 1) { png_warning(png_ptr, "No space in chunk cache for tEXt"); @@ -2023,11 +2141,13 @@ png_handle_tEXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) png_free(png_ptr, png_ptr->chunkdata); png_ptr->chunkdata = (png_charp)png_malloc_warn(png_ptr, length + 1); + if (png_ptr->chunkdata == NULL) { png_warning(png_ptr, "No memory to process text chunk"); return; } + slength = (png_size_t)length; png_crc_read(png_ptr, (png_bytep)png_ptr->chunkdata, slength); @@ -2049,21 +2169,21 @@ png_handle_tEXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) text++; text_ptr = (png_textp)png_malloc_warn(png_ptr, - png_sizeof(png_text)); + png_sizeof(png_text)); + if (text_ptr == NULL) { - png_warning(png_ptr, "Not enough memory to process text chunk"); - png_free(png_ptr, png_ptr->chunkdata); - png_ptr->chunkdata = NULL; - return; + png_warning(png_ptr, "Not enough memory to process text chunk"); + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + return; } + text_ptr->compression = PNG_TEXT_COMPRESSION_NONE; text_ptr->key = key; -#ifdef PNG_iTXt_SUPPORTED text_ptr->lang = NULL; text_ptr->lang_key = NULL; text_ptr->itxt_length = 0; -#endif text_ptr->text = text; text_ptr->text_length = png_strlen(text); @@ -2072,8 +2192,9 @@ png_handle_tEXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) png_free(png_ptr, png_ptr->chunkdata); png_ptr->chunkdata = NULL; png_free(png_ptr, text_ptr); + if (ret) - png_warning(png_ptr, "Insufficient memory to process text chunk"); + png_warning(png_ptr, "Insufficient memory to process text chunk"); } #endif @@ -2098,6 +2219,7 @@ png_handle_zTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) png_crc_finish(png_ptr, length); return; } + if (--png_ptr->user_chunk_cache_max == 1) { png_warning(png_ptr, "No space in chunk cache for zTXt"); @@ -2115,24 +2237,28 @@ png_handle_zTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) #ifdef PNG_MAX_MALLOC_64K /* We will no doubt have problems with chunks even half this size, but - there is no hard and fast rule to tell us where to stop. */ + * there is no hard and fast rule to tell us where to stop. + */ if (length > (png_uint_32)65535L) { - png_warning(png_ptr, "zTXt chunk too large to fit in memory"); - png_crc_finish(png_ptr, length); - return; + png_warning(png_ptr, "zTXt chunk too large to fit in memory"); + png_crc_finish(png_ptr, length); + return; } #endif png_free(png_ptr, png_ptr->chunkdata); png_ptr->chunkdata = (png_charp)png_malloc_warn(png_ptr, length + 1); + if (png_ptr->chunkdata == NULL) { - png_warning(png_ptr, "Out of memory processing zTXt chunk"); - return; + png_warning(png_ptr, "Out of memory processing zTXt chunk"); + return; } + slength = (png_size_t)length; png_crc_read(png_ptr, (png_bytep)png_ptr->chunkdata, slength); + if (png_crc_finish(png_ptr, 0)) { png_free(png_ptr, png_ptr->chunkdata); @@ -2153,37 +2279,41 @@ png_handle_zTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) png_ptr->chunkdata = NULL; return; } + else { comp_type = *(++text); + if (comp_type != PNG_TEXT_COMPRESSION_zTXt) { png_warning(png_ptr, "Unknown compression type in zTXt chunk"); comp_type = PNG_TEXT_COMPRESSION_zTXt; } + text++; /* Skip the compression_method byte */ } + prefix_len = text - png_ptr->chunkdata; png_decompress_chunk(png_ptr, comp_type, - (png_size_t)length, prefix_len, &data_len); + (png_size_t)length, prefix_len, &data_len); text_ptr = (png_textp)png_malloc_warn(png_ptr, - png_sizeof(png_text)); + png_sizeof(png_text)); + if (text_ptr == NULL) { - png_warning(png_ptr, "Not enough memory to process zTXt chunk"); - png_free(png_ptr, png_ptr->chunkdata); - png_ptr->chunkdata = NULL; - return; + png_warning(png_ptr, "Not enough memory to process zTXt chunk"); + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + return; } + text_ptr->compression = comp_type; text_ptr->key = png_ptr->chunkdata; -#ifdef PNG_iTXt_SUPPORTED text_ptr->lang = NULL; text_ptr->lang_key = NULL; text_ptr->itxt_length = 0; -#endif text_ptr->text = png_ptr->chunkdata + prefix_len; text_ptr->text_length = data_len; @@ -2192,8 +2322,9 @@ png_handle_zTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) png_free(png_ptr, text_ptr); png_free(png_ptr, png_ptr->chunkdata); png_ptr->chunkdata = NULL; + if (ret) - png_error(png_ptr, "Insufficient memory to store zTXt chunk"); + png_error(png_ptr, "Insufficient memory to store zTXt chunk"); } #endif @@ -2219,6 +2350,7 @@ png_handle_iTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) png_crc_finish(png_ptr, length); return; } + if (--png_ptr->user_chunk_cache_max == 1) { png_warning(png_ptr, "No space in chunk cache for iTXt"); @@ -2236,24 +2368,28 @@ png_handle_iTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) #ifdef PNG_MAX_MALLOC_64K /* We will no doubt have problems with chunks even half this size, but - there is no hard and fast rule to tell us where to stop. */ + * there is no hard and fast rule to tell us where to stop. + */ if (length > (png_uint_32)65535L) { - png_warning(png_ptr, "iTXt chunk too large to fit in memory"); - png_crc_finish(png_ptr, length); - return; + png_warning(png_ptr, "iTXt chunk too large to fit in memory"); + png_crc_finish(png_ptr, length); + return; } #endif png_free(png_ptr, png_ptr->chunkdata); png_ptr->chunkdata = (png_charp)png_malloc_warn(png_ptr, length + 1); + if (png_ptr->chunkdata == NULL) { - png_warning(png_ptr, "No memory to process iTXt chunk"); - return; + png_warning(png_ptr, "No memory to process iTXt chunk"); + return; } + slength = (png_size_t)length; png_crc_read(png_ptr, (png_bytep)png_ptr->chunkdata, slength); + if (png_crc_finish(png_ptr, 0)) { png_free(png_ptr, png_ptr->chunkdata); @@ -2265,6 +2401,7 @@ png_handle_iTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) for (lang = png_ptr->chunkdata; *lang; lang++) /* Empty loop */ ; + lang++; /* Skip NUL separator */ /* iTXt must have a language tag (possibly empty), two compression bytes, @@ -2279,14 +2416,16 @@ png_handle_iTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) png_ptr->chunkdata = NULL; return; } + else { - comp_flag = *lang++; - comp_type = *lang++; + comp_flag = *lang++; + comp_type = *lang++; } for (lang_key = lang; *lang_key; lang_key++) /* Empty loop */ ; + lang_key++; /* Skip NUL separator */ if (lang_key >= png_ptr->chunkdata + slength) @@ -2299,7 +2438,9 @@ png_handle_iTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) for (text = lang_key; *text; text++) /* Empty loop */ ; + text++; /* Skip NUL separator */ + if (text >= png_ptr->chunkdata + slength) { png_warning(png_ptr, "Malformed iTXt chunk"); @@ -2311,20 +2452,25 @@ png_handle_iTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) prefix_len = text - png_ptr->chunkdata; key=png_ptr->chunkdata; + if (comp_flag) - png_decompress_chunk(png_ptr, comp_type, - (size_t)length, prefix_len, &data_len); + png_decompress_chunk(png_ptr, comp_type, + (size_t)length, prefix_len, &data_len); + else - data_len = png_strlen(png_ptr->chunkdata + prefix_len); + data_len = png_strlen(png_ptr->chunkdata + prefix_len); + text_ptr = (png_textp)png_malloc_warn(png_ptr, - png_sizeof(png_text)); + png_sizeof(png_text)); + if (text_ptr == NULL) { - png_warning(png_ptr, "Not enough memory to process iTXt chunk"); - png_free(png_ptr, png_ptr->chunkdata); - png_ptr->chunkdata = NULL; - return; + png_warning(png_ptr, "Not enough memory to process iTXt chunk"); + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + return; } + text_ptr->compression = (int)comp_flag + 1; text_ptr->lang_key = png_ptr->chunkdata + (lang_key - key); text_ptr->lang = png_ptr->chunkdata + (lang - key); @@ -2338,16 +2484,18 @@ png_handle_iTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) png_free(png_ptr, text_ptr); png_free(png_ptr, png_ptr->chunkdata); png_ptr->chunkdata = NULL; + if (ret) - png_error(png_ptr, "Insufficient memory to store iTXt chunk"); + png_error(png_ptr, "Insufficient memory to store iTXt chunk"); } #endif /* This function is called when we haven't found a handler for a - chunk. If there isn't a problem with the chunk itself (ie bad - chunk name, CRC, or a critical chunk), the chunk is silently ignored - -- unless the PNG_FLAG_UNKNOWN_CHUNKS_SUPPORTED flag is on in which - case it will be saved away to be written out later. */ + * chunk. If there isn't a problem with the chunk itself (ie bad + * chunk name, CRC, or a critical chunk), the chunk is silently ignored + * -- unless the PNG_FLAG_UNKNOWN_CHUNKS_SUPPORTED flag is on in which + * case it will be saved away to be written out later. + */ void /* PRIVATE */ png_handle_unknown(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) { @@ -2363,6 +2511,7 @@ png_handle_unknown(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) png_crc_finish(png_ptr, length); return; } + if (--png_ptr->user_chunk_cache_max == 1) { png_warning(png_ptr, "No space in chunk cache for unknown chunk"); @@ -2375,6 +2524,7 @@ png_handle_unknown(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) if (png_ptr->mode & PNG_HAVE_IDAT) { PNG_IDAT; + if (png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) /* Not an IDAT */ png_ptr->mode |= PNG_AFTER_IDAT; } @@ -2383,13 +2533,13 @@ png_handle_unknown(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) { #ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED if (png_handle_as_unknown(png_ptr, png_ptr->chunk_name) != - PNG_HANDLE_CHUNK_ALWAYS + PNG_HANDLE_CHUNK_ALWAYS #ifdef PNG_READ_USER_CHUNKS_SUPPORTED - && png_ptr->read_user_chunk_fn == NULL + && png_ptr->read_user_chunk_fn == NULL #endif - ) + ) #endif - png_chunk_error(png_ptr, "unknown critical chunk"); + png_chunk_error(png_ptr, "unknown critical chunk"); } #ifdef PNG_READ_UNKNOWN_CHUNKS_SUPPORTED @@ -2397,56 +2547,71 @@ png_handle_unknown(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) #ifdef PNG_READ_USER_CHUNKS_SUPPORTED || (png_ptr->read_user_chunk_fn != NULL) #endif - ) + ) { #ifdef PNG_MAX_MALLOC_64K - if (length > (png_uint_32)65535L) - { - png_warning(png_ptr, "unknown chunk too large to fit in memory"); - skip = length - (png_uint_32)65535L; - length = (png_uint_32)65535L; - } + if (length > (png_uint_32)65535L) + { + png_warning(png_ptr, "unknown chunk too large to fit in memory"); + skip = length - (png_uint_32)65535L; + length = (png_uint_32)65535L; + } #endif - png_memcpy((png_charp)png_ptr->unknown_chunk.name, - (png_charp)png_ptr->chunk_name, - png_sizeof(png_ptr->unknown_chunk.name)); - png_ptr->unknown_chunk.name[png_sizeof(png_ptr->unknown_chunk.name)-1] - = '\0'; - png_ptr->unknown_chunk.size = (png_size_t)length; - if (length == 0) + + png_memcpy((png_charp)png_ptr->unknown_chunk.name, + (png_charp)png_ptr->chunk_name, + png_sizeof(png_ptr->unknown_chunk.name)); + + png_ptr->unknown_chunk.name[png_sizeof(png_ptr->unknown_chunk.name)-1] + = '\0'; + + png_ptr->unknown_chunk.size = (png_size_t)length; + + if (length == 0) png_ptr->unknown_chunk.data = NULL; - else - { + + else + { png_ptr->unknown_chunk.data = (png_bytep)png_malloc(png_ptr, length); png_crc_read(png_ptr, (png_bytep)png_ptr->unknown_chunk.data, length); - } + } + #ifdef PNG_READ_USER_CHUNKS_SUPPORTED - if (png_ptr->read_user_chunk_fn != NULL) - { - /* Callback to user unknown chunk handler */ - int ret; - ret = (*(png_ptr->read_user_chunk_fn)) - (png_ptr, &png_ptr->unknown_chunk); - if (ret < 0) - png_chunk_error(png_ptr, "error in user chunk"); - if (ret == 0) - { - if (!(png_ptr->chunk_name[0] & 0x20)) + if (png_ptr->read_user_chunk_fn != NULL) + { + /* Callback to user unknown chunk handler */ + int ret; + + ret = (*(png_ptr->read_user_chunk_fn)) + (png_ptr, &png_ptr->unknown_chunk); + + if (ret < 0) + png_chunk_error(png_ptr, "error in user chunk"); + + if (ret == 0) + { + if (!(png_ptr->chunk_name[0] & 0x20)) + { #ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED - if (png_handle_as_unknown(png_ptr, png_ptr->chunk_name) != - PNG_HANDLE_CHUNK_ALWAYS) + if (png_handle_as_unknown(png_ptr, png_ptr->chunk_name) != + PNG_HANDLE_CHUNK_ALWAYS) #endif - png_chunk_error(png_ptr, "unknown critical chunk"); - png_set_unknown_chunks(png_ptr, info_ptr, - &png_ptr->unknown_chunk, 1); - } - } - else + png_chunk_error(png_ptr, "unknown critical chunk"); + } + + png_set_unknown_chunks(png_ptr, info_ptr, + &png_ptr->unknown_chunk, 1); + } + } + + else #endif - png_set_unknown_chunks(png_ptr, info_ptr, &png_ptr->unknown_chunk, 1); - png_free(png_ptr, png_ptr->unknown_chunk.data); - png_ptr->unknown_chunk.data = NULL; + png_set_unknown_chunks(png_ptr, info_ptr, &png_ptr->unknown_chunk, 1); + + png_free(png_ptr, png_ptr->unknown_chunk.data); + png_ptr->unknown_chunk.data = NULL; } + else #endif skip = length; @@ -2454,20 +2619,21 @@ png_handle_unknown(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) png_crc_finish(png_ptr, skip); #ifndef PNG_READ_USER_CHUNKS_SUPPORTED - info_ptr = info_ptr; /* Quiet compiler warnings about unused info_ptr */ + PNG_UNUSED(info_ptr) /* Quiet compiler warnings about unused info_ptr */ #endif } /* This function is called to verify that a chunk name is valid. - This function can't have the "critical chunk check" incorporated - into it, since in the future we will need to be able to call user - functions to handle unknown critical chunks after we check that - the chunk name itself is valid. */ + * This function can't have the "critical chunk check" incorporated + * into it, since in the future we will need to be able to call user + * functions to handle unknown critical chunks after we check that + * the chunk name itself is valid. + */ #define isnonalpha(c) ((c) < 65 || (c) > 122 || ((c) > 90 && (c) < 97)) void /* PRIVATE */ -png_check_chunk_name(png_structp png_ptr, png_bytep chunk_name) +png_check_chunk_name(png_structp png_ptr, png_const_bytep chunk_name) { png_debug(1, "in png_check_chunk_name"); if (isnonalpha(chunk_name[0]) || isnonalpha(chunk_name[1]) || @@ -2478,25 +2644,28 @@ png_check_chunk_name(png_structp png_ptr, png_bytep chunk_name) } /* Combines the row recently read in with the existing pixels in the - row. This routine takes care of alpha and transparency if requested. - This routine also handles the two methods of progressive display - of interlaced images, depending on the mask value. - The mask value describes which pixels are to be combined with - the row. The pattern always repeats every 8 pixels, so just 8 - bits are needed. A one indicates the pixel is to be combined, - a zero indicates the pixel is to be skipped. This is in addition - to any alpha or transparency value associated with the pixel. If - you want all pixels to be combined, pass 0xff (255) in mask. */ + * row. This routine takes care of alpha and transparency if requested. + * This routine also handles the two methods of progressive display + * of interlaced images, depending on the mask value. + * The mask value describes which pixels are to be combined with + * the row. The pattern always repeats every 8 pixels, so just 8 + * bits are needed. A one indicates the pixel is to be combined, + * a zero indicates the pixel is to be skipped. This is in addition + * to any alpha or transparency value associated with the pixel. If + * you want all pixels to be combined, pass 0xff (255) in mask. + */ void /* PRIVATE */ png_combine_row(png_structp png_ptr, png_bytep row, int mask) { png_debug(1, "in png_combine_row"); + if (mask == 0xff) { png_memcpy(row, png_ptr->row_buf + 1, - PNG_ROWBYTES(png_ptr->row_info.pixel_depth, png_ptr->width)); + PNG_ROWBYTES(png_ptr->row_info.pixel_depth, png_ptr->width)); } + else { switch (png_ptr->row_info.pixel_depth) @@ -2518,6 +2687,7 @@ png_combine_row(png_structp png_ptr, png_bytep row, int mask) s_end = 7; s_inc = 1; } + else #endif { @@ -2545,16 +2715,19 @@ png_combine_row(png_structp png_ptr, png_bytep row, int mask) sp++; dp++; } + else shift += s_inc; if (m == 1) m = 0x80; + else m >>= 1; } break; } + case 2: { png_bytep sp = png_ptr->row_buf + 1; @@ -2573,6 +2746,7 @@ png_combine_row(png_structp png_ptr, png_bytep row, int mask) s_end = 6; s_inc = 2; } + else #endif { @@ -2598,15 +2772,19 @@ png_combine_row(png_structp png_ptr, png_bytep row, int mask) sp++; dp++; } + else shift += s_inc; + if (m == 1) m = 0x80; + else m >>= 1; } break; } + case 4: { png_bytep sp = png_ptr->row_buf + 1; @@ -2625,6 +2803,7 @@ png_combine_row(png_structp png_ptr, png_bytep row, int mask) s_end = 4; s_inc = 4; } + else #endif { @@ -2649,15 +2828,19 @@ png_combine_row(png_structp png_ptr, png_bytep row, int mask) sp++; dp++; } + else shift += s_inc; + if (m == 1) m = 0x80; + else m >>= 1; } break; } + default: { png_bytep sp = png_ptr->row_buf + 1; @@ -2667,7 +2850,6 @@ png_combine_row(png_structp png_ptr, png_bytep row, int mask) png_uint_32 row_width = png_ptr->width; png_byte m = 0x80; - for (i = 0; i < row_width; i++) { if (m & mask) @@ -2680,6 +2862,7 @@ png_combine_row(png_structp png_ptr, png_bytep row, int mask) if (m == 1) m = 0x80; + else m >>= 1; } @@ -2690,10 +2873,6 @@ png_combine_row(png_structp png_ptr, png_bytep row, int mask) } #ifdef PNG_READ_INTERLACING_SUPPORTED -/* OLD pre-1.0.9 interface: -void png_do_read_interlace(png_row_infop row_info, png_bytep row, int pass, - png_uint_32 transformations) - */ void /* PRIVATE */ png_do_read_interlace(png_structp png_ptr) { @@ -2734,6 +2913,7 @@ png_do_read_interlace(png_structp png_ptr) s_end = 0; s_inc = -1; } + else #endif { @@ -2751,24 +2931,29 @@ png_do_read_interlace(png_structp png_ptr) { *dp &= (png_byte)((0x7f7f >> (7 - dshift)) & 0xff); *dp |= (png_byte)(v << dshift); + if (dshift == s_end) { dshift = s_start; dp--; } + else dshift += s_inc; } + if (sshift == s_end) { sshift = s_start; sp--; } + else sshift += s_inc; } break; } + case 2: { png_bytep sp = row + (png_uint_32)((row_info->width - 1) >> 2); @@ -2787,6 +2972,7 @@ png_do_read_interlace(png_structp png_ptr) s_end = 0; s_inc = -2; } + else #endif { @@ -2807,24 +2993,29 @@ png_do_read_interlace(png_structp png_ptr) { *dp &= (png_byte)((0x3f3f >> (6 - dshift)) & 0xff); *dp |= (png_byte)(v << dshift); + if (dshift == s_end) { dshift = s_start; dp--; } + else dshift += s_inc; } + if (sshift == s_end) { sshift = s_start; sp--; } + else sshift += s_inc; } break; } + case 4: { png_bytep sp = row + (png_size_t)((row_info->width - 1) >> 1); @@ -2843,6 +3034,7 @@ png_do_read_interlace(png_structp png_ptr) s_end = 0; s_inc = -4; } + else #endif { @@ -2862,19 +3054,23 @@ png_do_read_interlace(png_structp png_ptr) { *dp &= (png_byte)((0xf0f >> (4 - dshift)) & 0xff); *dp |= (png_byte)(v << dshift); + if (dshift == s_end) { dshift = s_start; dp--; } + else dshift += s_inc; } + if (sshift == s_end) { sshift = s_start; sp--; } + else sshift += s_inc; } @@ -2883,8 +3079,10 @@ png_do_read_interlace(png_structp png_ptr) default: { png_size_t pixel_bytes = (row_info->pixel_depth >> 3); + png_bytep sp = row + (png_size_t)(row_info->width - 1) * pixel_bytes; + png_bytep dp = row + (png_size_t)(final_width - 1) * pixel_bytes; int jstop = png_pass_inc[pass]; @@ -2896,11 +3094,13 @@ png_do_read_interlace(png_structp png_ptr) int j; png_memcpy(v, sp, pixel_bytes); + for (j = 0; j < jstop; j++) { png_memcpy(dp, v, pixel_bytes); dp -= pixel_bytes; } + sp -= pixel_bytes; } break; @@ -2910,26 +3110,27 @@ png_do_read_interlace(png_structp png_ptr) row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, final_width); } #ifndef PNG_READ_PACKSWAP_SUPPORTED - transformations = transformations; /* Silence compiler warning */ + PNG_UNUSED(transformations) /* Silence compiler warning */ #endif } #endif /* PNG_READ_INTERLACING_SUPPORTED */ void /* PRIVATE */ png_read_filter_row(png_structp png_ptr, png_row_infop row_info, png_bytep row, - png_bytep prev_row, int filter) + png_const_bytep prev_row, int filter) { png_debug(1, "in png_read_filter_row"); - png_debug2(2, "row = %lu, filter = %d", png_ptr->row_number, filter); + png_debug2(2, "row = %u, filter = %d", png_ptr->row_number, filter); switch (filter) { case PNG_FILTER_VALUE_NONE: break; + case PNG_FILTER_VALUE_SUB: { - png_uint_32 i; - png_uint_32 istop = row_info->rowbytes; - png_uint_32 bpp = (row_info->pixel_depth + 7) >> 3; + png_size_t i; + png_size_t istop = row_info->rowbytes; + unsigned int bpp = (row_info->pixel_depth + 7) >> 3; png_bytep rp = row + bpp; png_bytep lp = row; @@ -2942,10 +3143,10 @@ png_read_filter_row(png_structp png_ptr, png_row_infop row_info, png_bytep row, } case PNG_FILTER_VALUE_UP: { - png_uint_32 i; - png_uint_32 istop = row_info->rowbytes; + png_size_t i; + png_size_t istop = row_info->rowbytes; png_bytep rp = row; - png_bytep pp = prev_row; + png_const_bytep pp = prev_row; for (i = 0; i < istop; i++) { @@ -2956,37 +3157,39 @@ png_read_filter_row(png_structp png_ptr, png_row_infop row_info, png_bytep row, } case PNG_FILTER_VALUE_AVG: { - png_uint_32 i; + png_size_t i; png_bytep rp = row; - png_bytep pp = prev_row; + png_const_bytep pp = prev_row; png_bytep lp = row; - png_uint_32 bpp = (row_info->pixel_depth + 7) >> 3; - png_uint_32 istop = row_info->rowbytes - bpp; + unsigned int bpp = (row_info->pixel_depth + 7) >> 3; + png_size_t istop = row_info->rowbytes - bpp; for (i = 0; i < bpp; i++) { *rp = (png_byte)(((int)(*rp) + - ((int)(*pp++) / 2 )) & 0xff); + ((int)(*pp++) / 2 )) & 0xff); + rp++; } for (i = 0; i < istop; i++) { *rp = (png_byte)(((int)(*rp) + - (int)(*pp++ + *lp++) / 2 ) & 0xff); + (int)(*pp++ + *lp++) / 2 ) & 0xff); + rp++; } break; } case PNG_FILTER_VALUE_PAETH: { - png_uint_32 i; + png_size_t i; png_bytep rp = row; - png_bytep pp = prev_row; + png_const_bytep pp = prev_row; png_bytep lp = row; - png_bytep cp = prev_row; - png_uint_32 bpp = (row_info->pixel_depth + 7) >> 3; - png_uint_32 istop=row_info->rowbytes - bpp; + png_const_bytep cp = prev_row; + unsigned int bpp = (row_info->pixel_depth + 7) >> 3; + png_size_t istop=row_info->rowbytes - bpp; for (i = 0; i < bpp; i++) { @@ -3018,8 +3221,10 @@ png_read_filter_row(png_structp png_ptr, png_row_infop row_info, png_bytep row, /* if (pa <= pb && pa <= pc) p = a; + else if (pb <= pc) p = b; + else p = c; */ @@ -3032,8 +3237,8 @@ png_read_filter_row(png_structp png_ptr, png_row_infop row_info, png_bytep row, break; } default: - png_warning(png_ptr, "Ignoring bad adaptive filter type"); - *row = 0; + png_error(png_ptr, "Ignoring bad adaptive filter type"); + /*NOT REACHED */ break; } } @@ -3067,13 +3272,16 @@ png_read_finish_row(png_structp png_ptr) if (png_ptr->interlaced) { png_ptr->row_number = 0; - png_memset(png_ptr->prev_row, 0, - png_ptr->rowbytes + 1); + + png_memset(png_ptr->prev_row, 0, png_ptr->rowbytes + 1); + do { png_ptr->pass++; + if (png_ptr->pass >= 7) break; + png_ptr->iwidth = (png_ptr->width + png_pass_inc[png_ptr->pass] - 1 - png_pass_start[png_ptr->pass]) / @@ -3082,15 +3290,15 @@ png_read_finish_row(png_structp png_ptr) if (!(png_ptr->transformations & PNG_INTERLACE)) { png_ptr->num_rows = (png_ptr->height + - png_pass_yinc[png_ptr->pass] - 1 - - png_pass_ystart[png_ptr->pass]) / - png_pass_yinc[png_ptr->pass]; - if (!(png_ptr->num_rows)) - continue; + png_pass_yinc[png_ptr->pass] - 1 - + png_pass_ystart[png_ptr->pass]) / + png_pass_yinc[png_ptr->pass]; } + else /* if (png_ptr->transformations & PNG_INTERLACE) */ - break; - } while (png_ptr->iwidth == 0); + break; /* libpng deinterlacing sees every row */ + + } while (png_ptr->num_rows == 0 || png_ptr->iwidth == 0); if (png_ptr->pass < 7) return; @@ -3105,44 +3313,45 @@ png_read_finish_row(png_structp png_ptr) png_ptr->zstream.next_out = (Byte *)&extra; png_ptr->zstream.avail_out = (uInt)1; + for (;;) { if (!(png_ptr->zstream.avail_in)) { while (!png_ptr->idat_size) { - png_byte chunk_length[4]; - png_crc_finish(png_ptr, 0); - - png_read_data(png_ptr, chunk_length, 4); - png_ptr->idat_size = png_get_uint_31(png_ptr, chunk_length); - png_reset_crc(png_ptr); - png_crc_read(png_ptr, png_ptr->chunk_name, 4); + png_ptr->idat_size = png_read_chunk_header(png_ptr); if (png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) png_error(png_ptr, "Not enough image data"); - } + png_ptr->zstream.avail_in = (uInt)png_ptr->zbuf_size; png_ptr->zstream.next_in = png_ptr->zbuf; + if (png_ptr->zbuf_size > png_ptr->idat_size) png_ptr->zstream.avail_in = (uInt)png_ptr->idat_size; + png_crc_read(png_ptr, png_ptr->zbuf, png_ptr->zstream.avail_in); png_ptr->idat_size -= png_ptr->zstream.avail_in; } + ret = inflate(&png_ptr->zstream, Z_PARTIAL_FLUSH); + if (ret == Z_STREAM_END) { if (!(png_ptr->zstream.avail_out) || png_ptr->zstream.avail_in || - png_ptr->idat_size) + png_ptr->idat_size) png_warning(png_ptr, "Extra compressed data"); + png_ptr->mode |= PNG_AFTER_IDAT; png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED; break; } + if (ret != Z_OK) png_error(png_ptr, png_ptr->zstream.msg ? png_ptr->zstream.msg : - "Decompression Error"); + "Decompression Error"); if (!(png_ptr->zstream.avail_out)) { @@ -3195,21 +3404,24 @@ png_read_start_row(png_structp png_ptr) { if (!(png_ptr->transformations & PNG_INTERLACE)) png_ptr->num_rows = (png_ptr->height + png_pass_yinc[0] - 1 - - png_pass_ystart[0]) / png_pass_yinc[0]; + png_pass_ystart[0]) / png_pass_yinc[0]; + else png_ptr->num_rows = png_ptr->height; png_ptr->iwidth = (png_ptr->width + - png_pass_inc[png_ptr->pass] - 1 - - png_pass_start[png_ptr->pass]) / - png_pass_inc[png_ptr->pass]; + png_pass_inc[png_ptr->pass] - 1 - + png_pass_start[png_ptr->pass]) / + png_pass_inc[png_ptr->pass]; } + else #endif /* PNG_READ_INTERLACING_SUPPORTED */ { png_ptr->num_rows = png_ptr->height; png_ptr->iwidth = png_ptr->width; } + max_pixel_depth = png_ptr->pixel_depth; #ifdef PNG_READ_PACK_SUPPORTED @@ -3224,16 +3436,20 @@ png_read_start_row(png_structp png_ptr) { if (png_ptr->num_trans) max_pixel_depth = 32; + else max_pixel_depth = 24; } + else if (png_ptr->color_type == PNG_COLOR_TYPE_GRAY) { if (max_pixel_depth < 8) max_pixel_depth = 8; + if (png_ptr->num_trans) max_pixel_depth *= 2; } + else if (png_ptr->color_type == PNG_COLOR_TYPE_RGB) { if (png_ptr->num_trans) @@ -3245,22 +3461,44 @@ png_read_start_row(png_structp png_ptr) } #endif +#ifdef PNG_READ_EXPAND_16_SUPPORTED + if (png_ptr->transformations & PNG_EXPAND_16) + { +# ifdef PNG_READ_EXPAND_SUPPORTED + /* In fact it is an error if it isn't supported, but checking is + * the safe way. + */ + if (png_ptr->transformations & PNG_EXPAND) + { + if (png_ptr->bit_depth < 16) + max_pixel_depth *= 2; + } + else +# endif + png_ptr->transformations &= ~PNG_EXPAND_16; + } +#endif + #ifdef PNG_READ_FILLER_SUPPORTED if (png_ptr->transformations & (PNG_FILLER)) { if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) max_pixel_depth = 32; + else if (png_ptr->color_type == PNG_COLOR_TYPE_GRAY) { if (max_pixel_depth <= 8) max_pixel_depth = 16; + else max_pixel_depth = 32; } + else if (png_ptr->color_type == PNG_COLOR_TYPE_RGB) { if (max_pixel_depth <= 32) max_pixel_depth = 32; + else max_pixel_depth = 64; } @@ -3272,29 +3510,34 @@ png_read_start_row(png_structp png_ptr) { if ( #ifdef PNG_READ_EXPAND_SUPPORTED - (png_ptr->num_trans && (png_ptr->transformations & PNG_EXPAND)) || + (png_ptr->num_trans && (png_ptr->transformations & PNG_EXPAND)) || #endif #ifdef PNG_READ_FILLER_SUPPORTED - (png_ptr->transformations & (PNG_FILLER)) || + (png_ptr->transformations & (PNG_FILLER)) || #endif - png_ptr->color_type == PNG_COLOR_TYPE_GRAY_ALPHA) + png_ptr->color_type == PNG_COLOR_TYPE_GRAY_ALPHA) { if (max_pixel_depth <= 16) max_pixel_depth = 32; + else max_pixel_depth = 64; } + else { if (max_pixel_depth <= 8) - { - if (png_ptr->color_type == PNG_COLOR_TYPE_RGB_ALPHA) + { + if (png_ptr->color_type == PNG_COLOR_TYPE_RGB_ALPHA) max_pixel_depth = 32; - else + + else max_pixel_depth = 24; - } + } + else if (png_ptr->color_type == PNG_COLOR_TYPE_RGB_ALPHA) max_pixel_depth = 64; + else max_pixel_depth = 48; } @@ -3304,12 +3547,13 @@ png_read_start_row(png_structp png_ptr) #if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) && \ defined(PNG_USER_TRANSFORM_PTR_SUPPORTED) if (png_ptr->transformations & PNG_USER_TRANSFORM) - { - int user_pixel_depth = png_ptr->user_transform_depth* + { + int user_pixel_depth = png_ptr->user_transform_depth* png_ptr->user_transform_channels; - if (user_pixel_depth > max_pixel_depth) + + if (user_pixel_depth > max_pixel_depth) max_pixel_depth=user_pixel_depth; - } + } #endif /* Align the width on the next larger 8 pixels. Mainly used @@ -3320,7 +3564,8 @@ defined(PNG_USER_TRANSFORM_PTR_SUPPORTED) * for safety's sake */ row_bytes = PNG_ROWBYTES(max_pixel_depth, row_bytes) + - 1 + ((max_pixel_depth + 7) >> 3); + 1 + ((max_pixel_depth + 7) >> 3); + #ifdef PNG_MAX_MALLOC_64K if (row_bytes > (png_uint_32)65536L) png_error(png_ptr, "This image requires a row greater than 64KB"); @@ -3329,20 +3574,24 @@ defined(PNG_USER_TRANSFORM_PTR_SUPPORTED) if (row_bytes + 48 > png_ptr->old_big_row_buf_size) { png_free(png_ptr, png_ptr->big_row_buf); + if (png_ptr->interlaced) png_ptr->big_row_buf = (png_bytep)png_calloc(png_ptr, row_bytes + 48); + else png_ptr->big_row_buf = (png_bytep)png_malloc(png_ptr, row_bytes + 48); + png_ptr->old_big_row_buf_size = row_bytes + 48; #ifdef PNG_ALIGNED_MEMORY_SUPPORTED /* Use 16-byte aligned memory for row_buf with at least 16 bytes * of padding before and after row_buf. */ - png_ptr->row_buf = png_ptr->big_row_buf + 32 - - (((png_alloc_size_t)&(png_ptr->big_row_buf[0]) + 15) % 16); + png_ptr->row_buf = png_ptr->big_row_buf + 32 - + (((png_alloc_size_t)png_ptr->big_row_buf + 15) & 0x0F); + png_ptr->old_big_row_buf_size = row_bytes + 48; #else /* Use 32 bytes of padding before and 16 bytes after row_buf. */ @@ -3352,29 +3601,31 @@ defined(PNG_USER_TRANSFORM_PTR_SUPPORTED) } #ifdef PNG_MAX_MALLOC_64K - if ((png_uint_32)png_ptr->rowbytes + 1 > (png_uint_32)65536L) + if (png_ptr->rowbytes > 65535) png_error(png_ptr, "This image requires a row greater than 64KB"); + #endif - if ((png_uint_32)png_ptr->rowbytes > (png_uint_32)(PNG_SIZE_MAX - 1)) + if (png_ptr->rowbytes > (PNG_SIZE_MAX - 1)) png_error(png_ptr, "Row has too many bytes to allocate in memory"); if (png_ptr->rowbytes + 1 > png_ptr->old_prev_row_size) { png_free(png_ptr, png_ptr->prev_row); - png_ptr->prev_row = (png_bytep)png_malloc(png_ptr, (png_uint_32)( - png_ptr->rowbytes + 1)); + + png_ptr->prev_row = (png_bytep)png_malloc(png_ptr, png_ptr->rowbytes + 1); + png_ptr->old_prev_row_size = png_ptr->rowbytes + 1; } png_memset(png_ptr->prev_row, 0, png_ptr->rowbytes + 1); - png_debug1(3, "width = %lu,", png_ptr->width); - png_debug1(3, "height = %lu,", png_ptr->height); - png_debug1(3, "iwidth = %lu,", png_ptr->iwidth); - png_debug1(3, "num_rows = %lu,", png_ptr->num_rows); - png_debug1(3, "rowbytes = %lu,", png_ptr->rowbytes); + png_debug1(3, "width = %u,", png_ptr->width); + png_debug1(3, "height = %u,", png_ptr->height); + png_debug1(3, "iwidth = %u,", png_ptr->iwidth); + png_debug1(3, "num_rows = %u,", png_ptr->num_rows); + png_debug1(3, "rowbytes = %lu,", (unsigned long)png_ptr->rowbytes); png_debug1(3, "irowbytes = %lu", - PNG_ROWBYTES(png_ptr->pixel_depth, png_ptr->iwidth) + 1); + (unsigned long)PNG_ROWBYTES(png_ptr->pixel_depth, png_ptr->iwidth) + 1); png_ptr->flags |= PNG_FLAG_ROW_INIT; } diff --git a/reactos/dll/3rdparty/libpng/pngset.c b/reactos/dll/3rdparty/libpng/pngset.c index 1f972c4edb6..2cfcf33bdf9 100644 --- a/reactos/dll/3rdparty/libpng/pngset.c +++ b/reactos/dll/3rdparty/libpng/pngset.c @@ -1,8 +1,8 @@ /* pngset.c - storage of image information into info struct * - * Last changed in libpng 1.4.1 [February 25, 2010] - * Copyright (c) 1998-2010 Glenn Randers-Pehrson + * Last changed in libpng 1.5.1 [February 3, 2011] + * Copyright (c) 1998-2011 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * @@ -16,14 +16,14 @@ * info struct and allows us to change the structure in the future. */ -#define PNG_NO_PEDANTIC_WARNINGS -#include "png.h" -#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) #include "pngpriv.h" +#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) + #ifdef PNG_bKGD_SUPPORTED void PNGAPI -png_set_bKGD(png_structp png_ptr, png_infop info_ptr, png_color_16p background) +png_set_bKGD(png_structp png_ptr, png_infop info_ptr, + png_const_color_16p background) { png_debug1(1, "in %s storage function", "bKGD"); @@ -36,150 +36,94 @@ png_set_bKGD(png_structp png_ptr, png_infop info_ptr, png_color_16p background) #endif #ifdef PNG_cHRM_SUPPORTED -#ifdef PNG_FLOATING_POINT_SUPPORTED -void PNGAPI -png_set_cHRM(png_structp png_ptr, png_infop info_ptr, - double white_x, double white_y, double red_x, double red_y, - double green_x, double green_y, double blue_x, double blue_y) -{ - png_debug1(1, "in %s storage function", "cHRM"); - - if (png_ptr == NULL || info_ptr == NULL) - return; - - info_ptr->x_white = (float)white_x; - info_ptr->y_white = (float)white_y; - info_ptr->x_red = (float)red_x; - info_ptr->y_red = (float)red_y; - info_ptr->x_green = (float)green_x; - info_ptr->y_green = (float)green_y; - info_ptr->x_blue = (float)blue_x; - info_ptr->y_blue = (float)blue_y; -#ifdef PNG_FIXED_POINT_SUPPORTED - info_ptr->int_x_white = (png_fixed_point)(white_x*100000.+0.5); - info_ptr->int_y_white = (png_fixed_point)(white_y*100000.+0.5); - info_ptr->int_x_red = (png_fixed_point)( red_x*100000.+0.5); - info_ptr->int_y_red = (png_fixed_point)( red_y*100000.+0.5); - info_ptr->int_x_green = (png_fixed_point)(green_x*100000.+0.5); - info_ptr->int_y_green = (png_fixed_point)(green_y*100000.+0.5); - info_ptr->int_x_blue = (png_fixed_point)( blue_x*100000.+0.5); - info_ptr->int_y_blue = (png_fixed_point)( blue_y*100000.+0.5); -#endif - info_ptr->valid |= PNG_INFO_cHRM; -} -#endif /* PNG_FLOATING_POINT_SUPPORTED */ - -#ifdef PNG_FIXED_POINT_SUPPORTED -void PNGAPI +void PNGFAPI png_set_cHRM_fixed(png_structp png_ptr, png_infop info_ptr, - png_fixed_point white_x, png_fixed_point white_y, png_fixed_point red_x, - png_fixed_point red_y, png_fixed_point green_x, png_fixed_point green_y, - png_fixed_point blue_x, png_fixed_point blue_y) + png_fixed_point white_x, png_fixed_point white_y, png_fixed_point red_x, + png_fixed_point red_y, png_fixed_point green_x, png_fixed_point green_y, + png_fixed_point blue_x, png_fixed_point blue_y) { png_debug1(1, "in %s storage function", "cHRM fixed"); if (png_ptr == NULL || info_ptr == NULL) return; -#ifdef PNG_CHECK_cHRM_SUPPORTED +# ifdef PNG_CHECK_cHRM_SUPPORTED if (png_check_cHRM_fixed(png_ptr, - white_x, white_y, red_x, red_y, green_x, green_y, blue_x, blue_y)) -#endif + white_x, white_y, red_x, red_y, green_x, green_y, blue_x, blue_y)) +# endif { - info_ptr->int_x_white = white_x; - info_ptr->int_y_white = white_y; - info_ptr->int_x_red = red_x; - info_ptr->int_y_red = red_y; - info_ptr->int_x_green = green_x; - info_ptr->int_y_green = green_y; - info_ptr->int_x_blue = blue_x; - info_ptr->int_y_blue = blue_y; -#ifdef PNG_FLOATING_POINT_SUPPORTED - info_ptr->x_white = (float)(white_x/100000.); - info_ptr->y_white = (float)(white_y/100000.); - info_ptr->x_red = (float)( red_x/100000.); - info_ptr->y_red = (float)( red_y/100000.); - info_ptr->x_green = (float)(green_x/100000.); - info_ptr->y_green = (float)(green_y/100000.); - info_ptr->x_blue = (float)( blue_x/100000.); - info_ptr->y_blue = (float)( blue_y/100000.); -#endif + info_ptr->x_white = white_x; + info_ptr->y_white = white_y; + info_ptr->x_red = red_x; + info_ptr->y_red = red_y; + info_ptr->x_green = green_x; + info_ptr->y_green = green_y; + info_ptr->x_blue = blue_x; + info_ptr->y_blue = blue_y; info_ptr->valid |= PNG_INFO_cHRM; } } -#endif /* PNG_FIXED_POINT_SUPPORTED */ + +# ifdef PNG_FLOATING_POINT_SUPPORTED +void PNGAPI +png_set_cHRM(png_structp png_ptr, png_infop info_ptr, + double white_x, double white_y, double red_x, double red_y, + double green_x, double green_y, double blue_x, double blue_y) +{ + png_set_cHRM_fixed(png_ptr, info_ptr, + png_fixed(png_ptr, white_x, "cHRM White X"), + png_fixed(png_ptr, white_y, "cHRM White Y"), + png_fixed(png_ptr, red_x, "cHRM Red X"), + png_fixed(png_ptr, red_y, "cHRM Red Y"), + png_fixed(png_ptr, green_x, "cHRM Green X"), + png_fixed(png_ptr, green_y, "cHRM Green Y"), + png_fixed(png_ptr, blue_x, "cHRM Blue X"), + png_fixed(png_ptr, blue_y, "cHRM Blue Y")); +} +# endif /* PNG_FLOATING_POINT_SUPPORTED */ + #endif /* PNG_cHRM_SUPPORTED */ #ifdef PNG_gAMA_SUPPORTED -#ifdef PNG_FLOATING_POINT_SUPPORTED +void PNGFAPI +png_set_gAMA_fixed(png_structp png_ptr, png_infop info_ptr, png_fixed_point + file_gamma) +{ + png_debug1(1, "in %s storage function", "gAMA"); + + if (png_ptr == NULL || info_ptr == NULL) + return; + + /* Previously these values were limited, however they must be + * wrong, therefore storing them (and setting PNG_INFO_gAMA) + * must be wrong too. + */ + if (file_gamma > (png_fixed_point)PNG_UINT_31_MAX) + png_warning(png_ptr, "Gamma too large, ignored"); + + else if (file_gamma <= 0) + png_warning(png_ptr, "Negative or zero gamma ignored"); + + else + { + info_ptr->gamma = file_gamma; + info_ptr->valid |= PNG_INFO_gAMA; + } +} + +# ifdef PNG_FLOATING_POINT_SUPPORTED void PNGAPI png_set_gAMA(png_structp png_ptr, png_infop info_ptr, double file_gamma) { - double png_gamma; - - png_debug1(1, "in %s storage function", "gAMA"); - - if (png_ptr == NULL || info_ptr == NULL) - return; - - /* Check for overflow */ - if (file_gamma > 21474.83) - { - png_warning(png_ptr, "Limiting gamma to 21474.83"); - png_gamma=21474.83; - } - else - png_gamma = file_gamma; - info_ptr->gamma = (float)png_gamma; -#ifdef PNG_FIXED_POINT_SUPPORTED - info_ptr->int_gamma = (int)(png_gamma*100000.+.5); -#endif - info_ptr->valid |= PNG_INFO_gAMA; - if (png_gamma == 0.0) - png_warning(png_ptr, "Setting gamma=0"); -} -#endif -void PNGAPI -png_set_gAMA_fixed(png_structp png_ptr, png_infop info_ptr, png_fixed_point - int_gamma) -{ - png_fixed_point png_gamma; - - png_debug1(1, "in %s storage function", "gAMA"); - - if (png_ptr == NULL || info_ptr == NULL) - return; - - if (int_gamma > (png_fixed_point)PNG_UINT_31_MAX) - { - png_warning(png_ptr, "Limiting gamma to 21474.83"); - png_gamma=PNG_UINT_31_MAX; - } - else - { - if (int_gamma < 0) - { - png_warning(png_ptr, "Setting negative gamma to zero"); - png_gamma = 0; - } - else - png_gamma = int_gamma; - } -#ifdef PNG_FLOATING_POINT_SUPPORTED - info_ptr->gamma = (float)(png_gamma/100000.); -#endif -#ifdef PNG_FIXED_POINT_SUPPORTED - info_ptr->int_gamma = png_gamma; -#endif - info_ptr->valid |= PNG_INFO_gAMA; - if (png_gamma == 0) - png_warning(png_ptr, "Setting gamma=0"); + png_set_gAMA_fixed(png_ptr, info_ptr, png_fixed(png_ptr, file_gamma, + "png_set_gAMA")); } +# endif #endif #ifdef PNG_hIST_SUPPORTED void PNGAPI -png_set_hIST(png_structp png_ptr, png_infop info_ptr, png_uint_16p hist) +png_set_hIST(png_structp png_ptr, png_infop info_ptr, png_const_uint_16p hist) { int i; @@ -192,16 +136,19 @@ png_set_hIST(png_structp png_ptr, png_infop info_ptr, png_uint_16p hist) > PNG_MAX_PALETTE_LENGTH) { png_warning(png_ptr, - "Invalid palette size, hIST allocation skipped"); + "Invalid palette size, hIST allocation skipped"); + return; } png_free_data(png_ptr, info_ptr, PNG_FREE_HIST, 0); + /* Changed from info->num_palette to PNG_MAX_PALETTE_LENGTH in * version 1.2.1 */ png_ptr->hist = (png_uint_16p)png_malloc_warn(png_ptr, - PNG_MAX_PALETTE_LENGTH * png_sizeof(png_uint_16)); + PNG_MAX_PALETTE_LENGTH * png_sizeof(png_uint_16)); + if (png_ptr->hist == NULL) { png_warning(png_ptr, "Insufficient memory for hIST chunk data"); @@ -210,18 +157,18 @@ png_set_hIST(png_structp png_ptr, png_infop info_ptr, png_uint_16p hist) for (i = 0; i < info_ptr->num_palette; i++) png_ptr->hist[i] = hist[i]; + info_ptr->hist = png_ptr->hist; info_ptr->valid |= PNG_INFO_hIST; - info_ptr->free_me |= PNG_FREE_HIST; } #endif void PNGAPI png_set_IHDR(png_structp png_ptr, png_infop info_ptr, - png_uint_32 width, png_uint_32 height, int bit_depth, - int color_type, int interlace_type, int compression_type, - int filter_type) + png_uint_32 width, png_uint_32 height, int bit_depth, + int color_type, int interlace_type, int compression_type, + int filter_type) { png_debug1(1, "in %s storage function", "IHDR"); @@ -242,21 +189,25 @@ png_set_IHDR(png_structp png_ptr, png_infop info_ptr, if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) info_ptr->channels = 1; + else if (info_ptr->color_type & PNG_COLOR_MASK_COLOR) info_ptr->channels = 3; + else info_ptr->channels = 1; + if (info_ptr->color_type & PNG_COLOR_MASK_ALPHA) info_ptr->channels++; + info_ptr->pixel_depth = (png_byte)(info_ptr->channels * info_ptr->bit_depth); /* Check for potential overflow */ - if (width > (PNG_UINT_32_MAX - >> 3) /* 8-byte RGBA pixels */ - - 64 /* bigrowbuf hack */ - - 1 /* filter byte */ - - 7*8 /* rounding of width to multiple of 8 pixels */ - - 8) /* extra max_pixel_depth pad */ + if (width > + (PNG_UINT_32_MAX >> 3) /* 8-byte RRGGBBAA pixels */ + - 48 /* bigrowbuf hack */ + - 1 /* filter byte */ + - 7*8 /* rounding of width to multiple of 8 pixels */ + - 8) /* extra max_pixel_depth pad */ info_ptr->rowbytes = 0; else info_ptr->rowbytes = PNG_ROWBYTES(info_ptr->pixel_depth, width); @@ -265,7 +216,7 @@ png_set_IHDR(png_structp png_ptr, png_infop info_ptr, #ifdef PNG_oFFs_SUPPORTED void PNGAPI png_set_oFFs(png_structp png_ptr, png_infop info_ptr, - png_int_32 offset_x, png_int_32 offset_y, int unit_type) + png_int_32 offset_x, png_int_32 offset_y, int unit_type) { png_debug1(1, "in %s storage function", "oFFs"); @@ -282,8 +233,8 @@ png_set_oFFs(png_structp png_ptr, png_infop info_ptr, #ifdef PNG_pCAL_SUPPORTED void PNGAPI png_set_pCAL(png_structp png_ptr, png_infop info_ptr, - png_charp purpose, png_int_32 X0, png_int_32 X1, int type, int nparams, - png_charp units, png_charpp params) + png_const_charp purpose, png_int_32 X0, png_int_32 X1, int type, + int nparams, png_const_charp units, png_charpp params) { png_size_t length; int i; @@ -295,13 +246,27 @@ png_set_pCAL(png_structp png_ptr, png_infop info_ptr, length = png_strlen(purpose) + 1; png_debug1(3, "allocating purpose for info (%lu bytes)", - (unsigned long)length); + (unsigned long)length); + + /* TODO: validate format of calibration name and unit name */ + + /* Check that the type matches the specification. */ + if (type < 0 || type > 3) + png_error(png_ptr, "Invalid pCAL equation type"); + + /* Validate params[nparams] */ + for (i=0; ipcal_purpose = (png_charp)png_malloc_warn(png_ptr, length); + if (info_ptr->pcal_purpose == NULL) { png_warning(png_ptr, "Insufficient memory for pCAL purpose"); return; } + png_memcpy(info_ptr->pcal_purpose, purpose, length); png_debug(3, "storing X0, X1, type, and nparams in info"); @@ -313,16 +278,20 @@ png_set_pCAL(png_structp png_ptr, png_infop info_ptr, length = png_strlen(units) + 1; png_debug1(3, "allocating units for info (%lu bytes)", (unsigned long)length); + info_ptr->pcal_units = (png_charp)png_malloc_warn(png_ptr, length); + if (info_ptr->pcal_units == NULL) { png_warning(png_ptr, "Insufficient memory for pCAL units"); return; } + png_memcpy(info_ptr->pcal_units, units, length); info_ptr->pcal_params = (png_charpp)png_malloc_warn(png_ptr, - (png_size_t)((nparams + 1) * png_sizeof(png_charp))); + (png_size_t)((nparams + 1) * png_sizeof(png_charp))); + if (info_ptr->pcal_params == NULL) { png_warning(png_ptr, "Insufficient memory for pCAL params"); @@ -335,13 +304,16 @@ png_set_pCAL(png_structp png_ptr, png_infop info_ptr, { length = png_strlen(params[i]) + 1; png_debug2(3, "allocating parameter %d for info (%lu bytes)", i, - (unsigned long)length); + (unsigned long)length); + info_ptr->pcal_params[i] = (png_charp)png_malloc_warn(png_ptr, length); + if (info_ptr->pcal_params[i] == NULL) { png_warning(png_ptr, "Insufficient memory for pCAL parameter"); return; } + png_memcpy(info_ptr->pcal_params[i], params[i], length); } @@ -350,74 +322,132 @@ png_set_pCAL(png_structp png_ptr, png_infop info_ptr, } #endif -#if defined(PNG_READ_sCAL_SUPPORTED) || defined(PNG_WRITE_sCAL_SUPPORTED) -#ifdef PNG_FLOATING_POINT_SUPPORTED -void PNGAPI -png_set_sCAL(png_structp png_ptr, png_infop info_ptr, - int unit, double width, double height) -{ - png_debug1(1, "in %s storage function", "sCAL"); - - if (png_ptr == NULL || info_ptr == NULL) - return; - - info_ptr->scal_unit = (png_byte)unit; - info_ptr->scal_pixel_width = width; - info_ptr->scal_pixel_height = height; - - info_ptr->valid |= PNG_INFO_sCAL; -} -#else -#ifdef PNG_FIXED_POINT_SUPPORTED +#ifdef PNG_sCAL_SUPPORTED void PNGAPI png_set_sCAL_s(png_structp png_ptr, png_infop info_ptr, - int unit, png_charp swidth, png_charp sheight) + int unit, png_const_charp swidth, png_const_charp sheight) { - png_size_t length; + png_size_t lengthw = 0, lengthh = 0; png_debug1(1, "in %s storage function", "sCAL"); if (png_ptr == NULL || info_ptr == NULL) return; + /* Double check the unit (should never get here with an invalid + * unit unless this is an API call.) + */ + if (unit != 1 && unit != 2) + png_error(png_ptr, "Invalid sCAL unit"); + + if (swidth == NULL || (lengthw = png_strlen(swidth)) <= 0 || + swidth[0] == 45 /*'-'*/ || !png_check_fp_string(swidth, lengthw)) + png_error(png_ptr, "Invalid sCAL width"); + + if (sheight == NULL || (lengthh = png_strlen(sheight)) <= 0 || + sheight[0] == 45 /*'-'*/ || !png_check_fp_string(sheight, lengthh)) + png_error(png_ptr, "Invalid sCAL height"); + info_ptr->scal_unit = (png_byte)unit; - length = png_strlen(swidth) + 1; - png_debug1(3, "allocating unit for info (%u bytes)", - (unsigned int)length); - info_ptr->scal_s_width = (png_charp)png_malloc_warn(png_ptr, length); + ++lengthw; + + png_debug1(3, "allocating unit for info (%u bytes)", (unsigned int)lengthw); + + info_ptr->scal_s_width = (png_charp)png_malloc_warn(png_ptr, lengthw); + if (info_ptr->scal_s_width == NULL) { - png_warning(png_ptr, - "Memory allocation failed while processing sCAL"); + png_warning(png_ptr, "Memory allocation failed while processing sCAL"); return; } - png_memcpy(info_ptr->scal_s_width, swidth, length); - length = png_strlen(sheight) + 1; - png_debug1(3, "allocating unit for info (%u bytes)", - (unsigned int)length); - info_ptr->scal_s_height = (png_charp)png_malloc_warn(png_ptr, length); + png_memcpy(info_ptr->scal_s_width, swidth, lengthw); + + ++lengthh; + + png_debug1(3, "allocating unit for info (%u bytes)", (unsigned int)lengthh); + + info_ptr->scal_s_height = (png_charp)png_malloc_warn(png_ptr, lengthh); + if (info_ptr->scal_s_height == NULL) { png_free (png_ptr, info_ptr->scal_s_width); info_ptr->scal_s_width = NULL; - png_warning(png_ptr, - "Memory allocation failed while processing sCAL"); + + png_warning(png_ptr, "Memory allocation failed while processing sCAL"); return; } - png_memcpy(info_ptr->scal_s_height, sheight, length); + + png_memcpy(info_ptr->scal_s_height, sheight, lengthh); + info_ptr->valid |= PNG_INFO_sCAL; info_ptr->free_me |= PNG_FREE_SCAL; } -#endif -#endif + +# ifdef PNG_FLOATING_POINT_SUPPORTED +void PNGAPI +png_set_sCAL(png_structp png_ptr, png_infop info_ptr, int unit, double width, + double height) +{ + png_debug1(1, "in %s storage function", "sCAL"); + + /* Check the arguments. */ + if (width <= 0) + png_warning(png_ptr, "Invalid sCAL width ignored"); + + else if (height <= 0) + png_warning(png_ptr, "Invalid sCAL height ignored"); + + else + { + /* Convert 'width' and 'height' to ASCII. */ + char swidth[PNG_sCAL_MAX_DIGITS+1]; + char sheight[PNG_sCAL_MAX_DIGITS+1]; + + png_ascii_from_fp(png_ptr, swidth, sizeof swidth, width, + PNG_sCAL_PRECISION); + png_ascii_from_fp(png_ptr, sheight, sizeof sheight, height, + PNG_sCAL_PRECISION); + + png_set_sCAL_s(png_ptr, info_ptr, unit, swidth, sheight); + } +} +# endif + +# ifdef PNG_FIXED_POINT_SUPPORTED +void PNGAPI +png_set_sCAL_fixed(png_structp png_ptr, png_infop info_ptr, int unit, + png_fixed_point width, png_fixed_point height) +{ + png_debug1(1, "in %s storage function", "sCAL"); + + /* Check the arguments. */ + if (width <= 0) + png_warning(png_ptr, "Invalid sCAL width ignored"); + + else if (height <= 0) + png_warning(png_ptr, "Invalid sCAL height ignored"); + + else + { + /* Convert 'width' and 'height' to ASCII. */ + char swidth[PNG_sCAL_MAX_DIGITS+1]; + char sheight[PNG_sCAL_MAX_DIGITS+1]; + + png_ascii_from_fixed(png_ptr, swidth, sizeof swidth, width); + png_ascii_from_fixed(png_ptr, sheight, sizeof sheight, height); + + png_set_sCAL_s(png_ptr, info_ptr, unit, swidth, sheight); + } +} +# endif #endif #ifdef PNG_pHYs_SUPPORTED void PNGAPI png_set_pHYs(png_structp png_ptr, png_infop info_ptr, - png_uint_32 res_x, png_uint_32 res_y, int unit_type) + png_uint_32 res_x, png_uint_32 res_y, int unit_type) { png_debug1(1, "in %s storage function", "pHYs"); @@ -433,7 +463,7 @@ png_set_pHYs(png_structp png_ptr, png_infop info_ptr, void PNGAPI png_set_PLTE(png_structp png_ptr, png_infop info_ptr, - png_colorp palette, int num_palette) + png_const_colorp palette, int num_palette) { png_debug1(1, "in %s storage function", "PLTE"); @@ -445,6 +475,7 @@ png_set_PLTE(png_structp png_ptr, png_infop info_ptr, { if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) png_error(png_ptr, "Invalid palette length"); + else { png_warning(png_ptr, "Invalid palette length"); @@ -463,7 +494,8 @@ png_set_PLTE(png_structp png_ptr, png_infop info_ptr, * too-large sample values. */ png_ptr->palette = (png_colorp)png_calloc(png_ptr, - PNG_MAX_PALETTE_LENGTH * png_sizeof(png_color)); + PNG_MAX_PALETTE_LENGTH * png_sizeof(png_color)); + png_memcpy(png_ptr->palette, palette, num_palette * png_sizeof(png_color)); info_ptr->palette = png_ptr->palette; info_ptr->num_palette = png_ptr->num_palette = (png_uint_16)num_palette; @@ -476,7 +508,7 @@ png_set_PLTE(png_structp png_ptr, png_infop info_ptr, #ifdef PNG_sBIT_SUPPORTED void PNGAPI png_set_sBIT(png_structp png_ptr, png_infop info_ptr, - png_color_8p sig_bit) + png_const_color_8p sig_bit) { png_debug1(1, "in %s storage function", "sBIT"); @@ -490,85 +522,41 @@ png_set_sBIT(png_structp png_ptr, png_infop info_ptr, #ifdef PNG_sRGB_SUPPORTED void PNGAPI -png_set_sRGB(png_structp png_ptr, png_infop info_ptr, int intent) +png_set_sRGB(png_structp png_ptr, png_infop info_ptr, int srgb_intent) { png_debug1(1, "in %s storage function", "sRGB"); if (png_ptr == NULL || info_ptr == NULL) return; - info_ptr->srgb_intent = (png_byte)intent; + info_ptr->srgb_intent = (png_byte)srgb_intent; info_ptr->valid |= PNG_INFO_sRGB; } void PNGAPI png_set_sRGB_gAMA_and_cHRM(png_structp png_ptr, png_infop info_ptr, - int intent) + int srgb_intent) { -#ifdef PNG_gAMA_SUPPORTED -#ifdef PNG_FLOATING_POINT_SUPPORTED - float file_gamma; -#endif -#ifdef PNG_FIXED_POINT_SUPPORTED - png_fixed_point int_file_gamma; -#endif -#endif -#ifdef PNG_cHRM_SUPPORTED -#ifdef PNG_FLOATING_POINT_SUPPORTED - float white_x, white_y, red_x, red_y, green_x, green_y, blue_x, blue_y; -#endif - png_fixed_point int_white_x, int_white_y, int_red_x, int_red_y, int_green_x, - int_green_y, int_blue_x, int_blue_y; -#endif png_debug1(1, "in %s storage function", "sRGB_gAMA_and_cHRM"); if (png_ptr == NULL || info_ptr == NULL) return; - png_set_sRGB(png_ptr, info_ptr, intent); + png_set_sRGB(png_ptr, info_ptr, srgb_intent); -#ifdef PNG_gAMA_SUPPORTED -#ifdef PNG_FLOATING_POINT_SUPPORTED - file_gamma = (float).45455; - png_set_gAMA(png_ptr, info_ptr, file_gamma); -#endif -#ifdef PNG_FIXED_POINT_SUPPORTED - int_file_gamma = 45455L; - png_set_gAMA_fixed(png_ptr, info_ptr, int_file_gamma); -#endif -#endif +# ifdef PNG_gAMA_SUPPORTED + png_set_gAMA_fixed(png_ptr, info_ptr, 45455L); +# endif -#ifdef PNG_cHRM_SUPPORTED - int_white_x = 31270L; - int_white_y = 32900L; - int_red_x = 64000L; - int_red_y = 33000L; - int_green_x = 30000L; - int_green_y = 60000L; - int_blue_x = 15000L; - int_blue_y = 6000L; - -#ifdef PNG_FLOATING_POINT_SUPPORTED - white_x = (float).3127; - white_y = (float).3290; - red_x = (float).64; - red_y = (float).33; - green_x = (float).30; - green_y = (float).60; - blue_x = (float).15; - blue_y = (float).06; -#endif - -#ifdef PNG_FIXED_POINT_SUPPORTED +# ifdef PNG_cHRM_SUPPORTED png_set_cHRM_fixed(png_ptr, info_ptr, - int_white_x, int_white_y, int_red_x, int_red_y, int_green_x, - int_green_y, int_blue_x, int_blue_y); -#endif -#ifdef PNG_FLOATING_POINT_SUPPORTED - png_set_cHRM(png_ptr, info_ptr, - white_x, white_y, red_x, red_y, green_x, green_y, blue_x, blue_y); -#endif -#endif /* cHRM */ + /* color x y */ + /* white */ 31270L, 32900L, + /* red */ 64000L, 33000L, + /* green */ 30000L, 60000L, + /* blue */ 15000L, 6000L + ); +# endif /* cHRM */ } #endif /* sRGB */ @@ -576,11 +564,11 @@ png_set_sRGB_gAMA_and_cHRM(png_structp png_ptr, png_infop info_ptr, #ifdef PNG_iCCP_SUPPORTED void PNGAPI png_set_iCCP(png_structp png_ptr, png_infop info_ptr, - png_charp name, int compression_type, - png_charp profile, png_uint_32 proflen) + png_const_charp name, int compression_type, + png_const_bytep profile, png_uint_32 proflen) { png_charp new_iccp_name; - png_charp new_iccp_profile; + png_bytep new_iccp_profile; png_uint_32 length; png_debug1(1, "in %s storage function", "iCCP"); @@ -590,13 +578,16 @@ png_set_iCCP(png_structp png_ptr, png_infop info_ptr, length = png_strlen(name)+1; new_iccp_name = (png_charp)png_malloc_warn(png_ptr, length); + if (new_iccp_name == NULL) { png_warning(png_ptr, "Insufficient memory to process iCCP chunk"); return; } + png_memcpy(new_iccp_name, name, length); - new_iccp_profile = (png_charp)png_malloc_warn(png_ptr, proflen); + new_iccp_profile = (png_bytep)png_malloc_warn(png_ptr, proflen); + if (new_iccp_profile == NULL) { png_free (png_ptr, new_iccp_name); @@ -604,6 +595,7 @@ png_set_iCCP(png_structp png_ptr, png_infop info_ptr, "Insufficient memory to process iCCP profile"); return; } + png_memcpy(new_iccp_profile, profile, (png_size_t)proflen); png_free_data(png_ptr, info_ptr, PNG_FREE_ICCP, 0); @@ -622,24 +614,25 @@ png_set_iCCP(png_structp png_ptr, png_infop info_ptr, #ifdef PNG_TEXT_SUPPORTED void PNGAPI -png_set_text(png_structp png_ptr, png_infop info_ptr, png_textp text_ptr, - int num_text) +png_set_text(png_structp png_ptr, png_infop info_ptr, png_const_textp text_ptr, + int num_text) { int ret; ret = png_set_text_2(png_ptr, info_ptr, text_ptr, num_text); + if (ret) png_error(png_ptr, "Insufficient memory to store text"); } int /* PRIVATE */ -png_set_text_2(png_structp png_ptr, png_infop info_ptr, png_textp text_ptr, - int num_text) +png_set_text_2(png_structp png_ptr, png_infop info_ptr, + png_const_textp text_ptr, int num_text) { int i; png_debug1(1, "in %s storage function", ((png_ptr == NULL || - png_ptr->chunk_name[0] == '\0') ? - "text" : (png_const_charp)png_ptr->chunk_name)); + png_ptr->chunk_name[0] == '\0') ? + "text" : (png_const_charp)png_ptr->chunk_name)); if (png_ptr == NULL || info_ptr == NULL || num_text == 0) return(0); @@ -659,27 +652,31 @@ png_set_text_2(png_structp png_ptr, png_infop info_ptr, png_textp text_ptr, old_text = info_ptr->text; info_ptr->text = (png_textp)png_malloc_warn(png_ptr, (png_size_t)(info_ptr->max_text * png_sizeof(png_text))); + if (info_ptr->text == NULL) { png_free(png_ptr, old_text); return(1); } + png_memcpy(info_ptr->text, old_text, (png_size_t)(old_max * - png_sizeof(png_text))); + png_sizeof(png_text))); png_free(png_ptr, old_text); } + else { info_ptr->max_text = num_text + 8; info_ptr->num_text = 0; info_ptr->text = (png_textp)png_malloc_warn(png_ptr, - (png_size_t)(info_ptr->max_text * png_sizeof(png_text))); + (png_size_t)(info_ptr->max_text * png_sizeof(png_text))); if (info_ptr->text == NULL) return(1); info_ptr->free_me |= PNG_FREE_TEXT; } + png_debug1(3, "allocated %d entries for info_ptr->text", - info_ptr->max_text); + info_ptr->max_text); } for (i = 0; i < num_text; i++) { @@ -690,6 +687,13 @@ png_set_text_2(png_structp png_ptr, png_infop info_ptr, png_textp text_ptr, if (text_ptr[i].key == NULL) continue; + if (text_ptr[i].compression < PNG_TEXT_COMPRESSION_NONE || + text_ptr[i].compression >= PNG_TEXT_COMPRESSION_LAST) + { + png_warning(png_ptr, "text compression mode is out of range"); + continue; + } + key_len = png_strlen(text_ptr[i].key); if (text_ptr[i].compression <= 0) @@ -699,34 +703,38 @@ png_set_text_2(png_structp png_ptr, png_infop info_ptr, png_textp text_ptr, } else -#ifdef PNG_iTXt_SUPPORTED +# ifdef PNG_iTXt_SUPPORTED { /* Set iTXt data */ if (text_ptr[i].lang != NULL) lang_len = png_strlen(text_ptr[i].lang); + else lang_len = 0; + if (text_ptr[i].lang_key != NULL) lang_key_len = png_strlen(text_ptr[i].lang_key); + else lang_key_len = 0; } -#else /* PNG_iTXt_SUPPORTED */ +# else /* PNG_iTXt_SUPPORTED */ { png_warning(png_ptr, "iTXt chunk not supported"); continue; } -#endif +# endif if (text_ptr[i].text == NULL || text_ptr[i].text[0] == '\0') { text_length = 0; -#ifdef PNG_iTXt_SUPPORTED +# ifdef PNG_iTXt_SUPPORTED if (text_ptr[i].compression > 0) textp->compression = PNG_ITXT_COMPRESSION_NONE; + else -#endif +# endif textp->compression = PNG_TEXT_COMPRESSION_NONE; } @@ -737,18 +745,20 @@ png_set_text_2(png_structp png_ptr, png_infop info_ptr, png_textp text_ptr, } textp->key = (png_charp)png_malloc_warn(png_ptr, - (png_size_t) - (key_len + text_length + lang_len + lang_key_len + 4)); + (png_size_t) + (key_len + text_length + lang_len + lang_key_len + 4)); + if (textp->key == NULL) return(1); - png_debug2(2, "Allocated %lu bytes at %x in png_set_text", - (unsigned long)(png_uint_32) - (key_len + lang_len + lang_key_len + text_length + 4), - (int)textp->key); + + png_debug2(2, "Allocated %lu bytes at %p in png_set_text", + (unsigned long)(png_uint_32) + (key_len + lang_len + lang_key_len + text_length + 4), + textp->key); png_memcpy(textp->key, text_ptr[i].key,(png_size_t)(key_len)); *(textp->key + key_len) = '\0'; -#ifdef PNG_iTXt_SUPPORTED + if (text_ptr[i].compression > 0) { textp->lang = textp->key + key_len + 1; @@ -759,35 +769,34 @@ png_set_text_2(png_structp png_ptr, png_infop info_ptr, png_textp text_ptr, *(textp->lang_key + lang_key_len) = '\0'; textp->text = textp->lang_key + lang_key_len + 1; } + else -#endif { -#ifdef PNG_iTXt_SUPPORTED textp->lang=NULL; textp->lang_key=NULL; -#endif textp->text = textp->key + key_len + 1; } + if (text_length) png_memcpy(textp->text, text_ptr[i].text, - (png_size_t)(text_length)); + (png_size_t)(text_length)); + *(textp->text + text_length) = '\0'; -#ifdef PNG_iTXt_SUPPORTED +# ifdef PNG_iTXt_SUPPORTED if (textp->compression > 0) { textp->text_length = 0; textp->itxt_length = text_length; } - else -#endif + else +# endif { textp->text_length = text_length; -#ifdef PNG_iTXt_SUPPORTED textp->itxt_length = 0; -#endif } + info_ptr->num_text++; png_debug1(3, "transferred text chunk %d", info_ptr->num_text); } @@ -797,7 +806,7 @@ png_set_text_2(png_structp png_ptr, png_infop info_ptr, png_textp text_ptr, #ifdef PNG_tIME_SUPPORTED void PNGAPI -png_set_tIME(png_structp png_ptr, png_infop info_ptr, png_timep mod_time) +png_set_tIME(png_structp png_ptr, png_infop info_ptr, png_const_timep mod_time) { png_debug1(1, "in %s storage function", "tIME"); @@ -813,7 +822,7 @@ png_set_tIME(png_structp png_ptr, png_infop info_ptr, png_timep mod_time) #ifdef PNG_tRNS_SUPPORTED void PNGAPI png_set_tRNS(png_structp png_ptr, png_infop info_ptr, - png_bytep trans_alpha, int num_trans, png_color_16p trans_color) + png_const_bytep trans_alpha, int num_trans, png_const_color_16p trans_color) { png_debug1(1, "in %s storage function", "tRNS"); @@ -830,8 +839,9 @@ png_set_tRNS(png_structp png_ptr, png_infop info_ptr, png_free_data(png_ptr, info_ptr, PNG_FREE_TRNS, 0); /* Changed from num_trans to PNG_MAX_PALETTE_LENGTH in version 1.2.1 */ - png_ptr->trans_alpha = info_ptr->trans_alpha = (png_bytep)png_malloc(png_ptr, - (png_size_t)PNG_MAX_PALETTE_LENGTH); + png_ptr->trans_alpha = info_ptr->trans_alpha = + (png_bytep)png_malloc(png_ptr, (png_size_t)PNG_MAX_PALETTE_LENGTH); + if (num_trans > 0 && num_trans <= PNG_MAX_PALETTE_LENGTH) png_memcpy(info_ptr->trans_alpha, trans_alpha, (png_size_t)num_trans); } @@ -839,6 +849,7 @@ png_set_tRNS(png_structp png_ptr, png_infop info_ptr, if (trans_color != NULL) { int sample_max = (1 << info_ptr->bit_depth); + if ((info_ptr->color_type == PNG_COLOR_TYPE_GRAY && (int)trans_color->gray > sample_max) || (info_ptr->color_type == PNG_COLOR_TYPE_RGB && @@ -847,13 +858,16 @@ png_set_tRNS(png_structp png_ptr, png_infop info_ptr, (int)trans_color->blue > sample_max))) png_warning(png_ptr, "tRNS chunk has out-of-range samples for bit_depth"); + png_memcpy(&(info_ptr->trans_color), trans_color, png_sizeof(png_color_16)); + if (num_trans == 0) num_trans = 1; } info_ptr->num_trans = (png_uint_16)num_trans; + if (num_trans != 0) { info_ptr->valid |= PNG_INFO_tRNS; @@ -865,11 +879,12 @@ png_set_tRNS(png_structp png_ptr, png_infop info_ptr, #ifdef PNG_sPLT_SUPPORTED void PNGAPI png_set_sPLT(png_structp png_ptr, - png_infop info_ptr, png_sPLT_tp entries, int nentries) + png_infop info_ptr, png_const_sPLT_tp entries, int nentries) /* * entries - array of png_sPLT_t structures * to be added to the list of palettes * in the info structure. + * * nentries - number of palette structures to be * added. */ @@ -882,7 +897,8 @@ png_set_sPLT(png_structp png_ptr, np = (png_sPLT_tp)png_malloc_warn(png_ptr, (info_ptr->splt_palettes_num + nentries) * - (png_size_t)png_sizeof(png_sPLT_t)); + (png_size_t)png_sizeof(png_sPLT_t)); + if (np == NULL) { png_warning(png_ptr, "No memory for sPLT palettes"); @@ -891,36 +907,42 @@ png_set_sPLT(png_structp png_ptr, png_memcpy(np, info_ptr->splt_palettes, info_ptr->splt_palettes_num * png_sizeof(png_sPLT_t)); + png_free(png_ptr, info_ptr->splt_palettes); info_ptr->splt_palettes=NULL; for (i = 0; i < nentries; i++) { png_sPLT_tp to = np + info_ptr->splt_palettes_num + i; - png_sPLT_tp from = entries + i; + png_const_sPLT_tp from = entries + i; png_uint_32 length; length = png_strlen(from->name) + 1; to->name = (png_charp)png_malloc_warn(png_ptr, (png_size_t)length); + if (to->name == NULL) { png_warning(png_ptr, - "Out of memory while processing sPLT chunk"); + "Out of memory while processing sPLT chunk"); continue; } + png_memcpy(to->name, from->name, length); to->entries = (png_sPLT_entryp)png_malloc_warn(png_ptr, (png_size_t)(from->nentries * png_sizeof(png_sPLT_entry))); + if (to->entries == NULL) { png_warning(png_ptr, - "Out of memory while processing sPLT chunk"); + "Out of memory while processing sPLT chunk"); png_free(png_ptr, to->name); to->name = NULL; continue; } + png_memcpy(to->entries, from->entries, from->nentries * png_sizeof(png_sPLT_entry)); + to->nentries = from->nentries; to->depth = from->depth; } @@ -935,7 +957,7 @@ png_set_sPLT(png_structp png_ptr, #ifdef PNG_UNKNOWN_CHUNKS_SUPPORTED void PNGAPI png_set_unknown_chunks(png_structp png_ptr, - png_infop info_ptr, png_unknown_chunkp unknowns, int num_unknowns) + png_infop info_ptr, png_const_unknown_chunkp unknowns, int num_unknowns) { png_unknown_chunkp np; int i; @@ -944,8 +966,9 @@ png_set_unknown_chunks(png_structp png_ptr, return; np = (png_unknown_chunkp)png_malloc_warn(png_ptr, - (png_size_t)((info_ptr->unknown_chunks_num + num_unknowns) * - png_sizeof(png_unknown_chunk))); + (png_size_t)(info_ptr->unknown_chunks_num + num_unknowns) * + png_sizeof(png_unknown_chunk)); + if (np == NULL) { png_warning(png_ptr, @@ -954,34 +977,39 @@ png_set_unknown_chunks(png_structp png_ptr, } png_memcpy(np, info_ptr->unknown_chunks, - info_ptr->unknown_chunks_num * png_sizeof(png_unknown_chunk)); + (png_size_t)info_ptr->unknown_chunks_num * + png_sizeof(png_unknown_chunk)); + png_free(png_ptr, info_ptr->unknown_chunks); info_ptr->unknown_chunks = NULL; for (i = 0; i < num_unknowns; i++) { png_unknown_chunkp to = np + info_ptr->unknown_chunks_num + i; - png_unknown_chunkp from = unknowns + i; + png_const_unknown_chunkp from = unknowns + i; - png_memcpy((png_charp)to->name, (png_charp)from->name, - png_sizeof(from->name)); + png_memcpy(to->name, from->name, png_sizeof(from->name)); to->name[png_sizeof(to->name)-1] = '\0'; to->size = from->size; + /* Note our location in the read or write sequence */ to->location = (png_byte)(png_ptr->mode & 0xff); if (from->size == 0) to->data=NULL; + else { to->data = (png_bytep)png_malloc_warn(png_ptr, - (png_size_t)from->size); + (png_size_t)from->size); + if (to->data == NULL) { png_warning(png_ptr, - "Out of memory while processing unknown chunk"); + "Out of memory while processing unknown chunk"); to->size = 0; } + else png_memcpy(to->data, from->data, from->size); } @@ -991,12 +1019,13 @@ png_set_unknown_chunks(png_structp png_ptr, info_ptr->unknown_chunks_num += num_unknowns; info_ptr->free_me |= PNG_FREE_UNKN; } + void PNGAPI png_set_unknown_chunk_location(png_structp png_ptr, png_infop info_ptr, - int chunk, int location) + int chunk, int location) { if (png_ptr != NULL && info_ptr != NULL && chunk >= 0 && chunk < - (int)info_ptr->unknown_chunks_num) + info_ptr->unknown_chunks_num) info_ptr->unknown_chunks[chunk].location = (png_byte)location; } #endif @@ -1010,40 +1039,48 @@ png_permit_mng_features (png_structp png_ptr, png_uint_32 mng_features) if (png_ptr == NULL) return (png_uint_32)0; + png_ptr->mng_features_permitted = - (png_byte)(mng_features & PNG_ALL_MNG_FEATURES); + (png_byte)(mng_features & PNG_ALL_MNG_FEATURES); + return (png_uint_32)png_ptr->mng_features_permitted; } #endif #ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED void PNGAPI -png_set_keep_unknown_chunks(png_structp png_ptr, int keep, png_bytep - chunk_list, int num_chunks) +png_set_keep_unknown_chunks(png_structp png_ptr, int keep, png_const_bytep + chunk_list, int num_chunks) { png_bytep new_list, p; int i, old_num_chunks; if (png_ptr == NULL) return; + if (num_chunks == 0) { if (keep == PNG_HANDLE_CHUNK_ALWAYS || keep == PNG_HANDLE_CHUNK_IF_SAFE) png_ptr->flags |= PNG_FLAG_KEEP_UNKNOWN_CHUNKS; + else png_ptr->flags &= ~PNG_FLAG_KEEP_UNKNOWN_CHUNKS; if (keep == PNG_HANDLE_CHUNK_ALWAYS) png_ptr->flags |= PNG_FLAG_KEEP_UNSAFE_CHUNKS; + else png_ptr->flags &= ~PNG_FLAG_KEEP_UNSAFE_CHUNKS; + return; } + if (chunk_list == NULL) return; + old_num_chunks = png_ptr->num_chunk_list; new_list=(png_bytep)png_malloc(png_ptr, - (png_size_t) - (5*(num_chunks + old_num_chunks))); + (png_size_t)(5*(num_chunks + old_num_chunks))); + if (png_ptr->chunk_list != NULL) { png_memcpy(new_list, png_ptr->chunk_list, @@ -1051,10 +1088,13 @@ png_set_keep_unknown_chunks(png_structp png_ptr, int keep, png_bytep png_free(png_ptr, png_ptr->chunk_list); png_ptr->chunk_list=NULL; } + png_memcpy(new_list + 5*old_num_chunks, chunk_list, (png_size_t)(5*num_chunks)); + for (p = new_list + 5*old_num_chunks + 4, i = 0; inum_chunk_list = old_num_chunks + num_chunks; png_ptr->chunk_list = new_list; png_ptr->free_me |= PNG_FREE_LIST; @@ -1064,7 +1104,7 @@ png_set_keep_unknown_chunks(png_structp png_ptr, int keep, png_bytep #ifdef PNG_READ_USER_CHUNKS_SUPPORTED void PNGAPI png_set_read_user_chunk_fn(png_structp png_ptr, png_voidp user_chunk_ptr, - png_user_chunk_ptr read_user_chunk_fn) + png_user_chunk_ptr read_user_chunk_fn) { png_debug(1, "in png_set_read_user_chunk_fn"); @@ -1087,23 +1127,40 @@ png_set_rows(png_structp png_ptr, png_infop info_ptr, png_bytepp row_pointers) if (info_ptr->row_pointers && (info_ptr->row_pointers != row_pointers)) png_free_data(png_ptr, info_ptr, PNG_FREE_ROWS, 0); + info_ptr->row_pointers = row_pointers; + if (row_pointers) info_ptr->valid |= PNG_INFO_IDAT; } #endif void PNGAPI -png_set_compression_buffer_size(png_structp png_ptr, - png_size_t size) +png_set_compression_buffer_size(png_structp png_ptr, png_size_t size) { if (png_ptr == NULL) return; + png_free(png_ptr, png_ptr->zbuf); - png_ptr->zbuf_size = size; + + if (size > ZLIB_IO_MAX) + { + png_warning(png_ptr, "Attempt to set buffer size beyond max ignored"); + png_ptr->zbuf_size = ZLIB_IO_MAX; + size = ZLIB_IO_MAX; /* must fit */ + } + + else + png_ptr->zbuf_size = (uInt)size; + png_ptr->zbuf = (png_bytep)png_malloc(png_ptr, size); + + /* The following ensures a relatively safe failure if this gets called while + * the buffer is actually in use. + */ png_ptr->zstream.next_out = png_ptr->zbuf; - png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; + png_ptr->zstream.avail_out = 0; + png_ptr->zstream.avail_in = 0; } void PNGAPI @@ -1127,6 +1184,7 @@ png_set_user_limits (png_structp png_ptr, png_uint_32 user_width_max, */ if (png_ptr == NULL) return; + png_ptr->user_width_max = user_width_max; png_ptr->user_height_max = user_height_max; } @@ -1143,11 +1201,10 @@ png_set_chunk_cache_max (png_structp png_ptr, /* This function was added to libpng 1.4.1 */ void PNGAPI png_set_chunk_malloc_max (png_structp png_ptr, - png_alloc_size_t user_chunk_malloc_max) + png_alloc_size_t user_chunk_malloc_max) { - if (png_ptr) - png_ptr->user_chunk_malloc_max = - (png_size_t)user_chunk_malloc_max; + if (png_ptr) + png_ptr->user_chunk_malloc_max = user_chunk_malloc_max; } #endif /* ?PNG_SET_USER_LIMITS_SUPPORTED */ @@ -1160,6 +1217,7 @@ png_set_benign_errors(png_structp png_ptr, int allowed) if (allowed) png_ptr->flags |= PNG_FLAG_BENIGN_ERRORS_WARN; + else png_ptr->flags &= ~PNG_FLAG_BENIGN_ERRORS_WARN; } diff --git a/reactos/dll/3rdparty/libpng/pngtest.c b/reactos/dll/3rdparty/libpng/pngtest.c index 836441d6dbe..a6a3ae489c1 100644 --- a/reactos/dll/3rdparty/libpng/pngtest.c +++ b/reactos/dll/3rdparty/libpng/pngtest.c @@ -1,8 +1,8 @@ /* pngtest.c - a simple test program to test libpng * - * Last changed in libpng 1.4.1 [February 25, 2010] - * Copyright (c) 1998-2010 Glenn Randers-Pehrson + * Last changed in libpng 1.5.0 [January 6, 2011] + * Copyright (c) 1998-2011 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * @@ -31,26 +31,51 @@ * of files at once by typing "pngtest -m file1.png file2.png ..." */ +#include "zlib.h" #include "png.h" -#include "pngpriv.h" - +/* Copied from pngpriv.h but only used in error messages below. */ +#ifndef PNG_ZBUF_SIZE +# define PNG_ZBUF_SIZE 8192 +#endif # include # include +# include # define FCLOSE(file) fclose(file) #ifndef PNG_STDIO_SUPPORTED - typedef FILE * png_FILE_p; +typedef FILE * png_FILE_p; #endif -/* Makes pngtest verbose so we can find problems (needs to be before png.h) */ +/* Makes pngtest verbose so we can find problems. */ #ifndef PNG_DEBUG # define PNG_DEBUG 0 #endif +#if PNG_DEBUG > 1 +# define pngtest_debug(m) ((void)fprintf(stderr, m "\n")) +# define pngtest_debug1(m,p1) ((void)fprintf(stderr, m "\n", p1)) +# define pngtest_debug2(m,p1,p2) ((void)fprintf(stderr, m "\n", p1, p2)) +#else +# define pngtest_debug(m) ((void)0) +# define pngtest_debug1(m,p1) ((void)0) +# define pngtest_debug2(m,p1,p2) ((void)0) +#endif + #if !PNG_DEBUG # define SINGLE_ROWBUF_ALLOC /* Makes buffer overruns easier to nail */ #endif +/* The code uses memcmp and memcpy on large objects (typically row pointers) so + * it is necessary to do soemthing special on certain architectures, note that + * the actual support for this was effectively removed in 1.4, so only the + * memory remains in this program: + */ +#define CVT_PTR(ptr) (ptr) +#define CVT_PTR_NOCHECK(ptr) (ptr) +#define png_memcmp memcmp +#define png_memcpy memcpy +#define png_memset memset + /* Turn on CPU timing #define PNGTEST_TIMING */ @@ -82,11 +107,6 @@ int test_one_file PNGARG((PNG_CONST char *inname, PNG_CONST char *outname)); /* #define STDERR stderr */ #define STDERR stdout /* For DOS */ -/* In case a system header (e.g., on AIX) defined jmpbuf */ -#ifdef jmpbuf -# undef jmpbuf -#endif - /* Define png_jmpbuf() in case we are using a pre-1.0.6 version of libpng */ #ifndef png_jmpbuf # define png_jmpbuf(png_ptr) png_ptr->jmpbuf @@ -97,35 +117,40 @@ static int status_pass = 1; static int status_dots_requested = 0; static int status_dots = 1; -void +void PNGCBAPI read_row_callback(png_structp png_ptr, png_uint_32 row_number, int pass); -void +void PNGCBAPI read_row_callback(png_structp png_ptr, png_uint_32 row_number, int pass) { if (png_ptr == NULL || row_number > PNG_UINT_31_MAX) return; + if (status_pass != pass) { fprintf(stdout, "\n Pass %d: ", pass); status_pass = pass; status_dots = 31; } + status_dots--; + if (status_dots == 0) { fprintf(stdout, "\n "); status_dots=30; } + fprintf(stdout, "r"); } -void +void PNGCBAPI write_row_callback(png_structp png_ptr, png_uint_32 row_number, int pass); -void +void PNGCBAPI write_row_callback(png_structp png_ptr, png_uint_32 row_number, int pass) { if (png_ptr == NULL || row_number > PNG_UINT_31_MAX || pass > 7) return; + fprintf(stdout, "w"); } @@ -136,9 +161,9 @@ write_row_callback(png_structp png_ptr, png_uint_32 row_number, int pass) * 5 in case illegal filter values are present.) */ static png_uint_32 filters_used[256]; -void +void PNGCBAPI count_filters(png_structp png_ptr, png_row_infop row_info, png_bytep data); -void +void PNGCBAPI count_filters(png_structp png_ptr, png_row_infop row_info, png_bytep data) { if (png_ptr != NULL && row_info != NULL) @@ -153,13 +178,14 @@ count_filters(png_structp png_ptr, png_row_infop row_info, png_bytep data) static png_uint_32 zero_samples; -void +void PNGCBAPI count_zero_samples(png_structp png_ptr, png_row_infop row_info, png_bytep data); -void +void PNGCBAPI count_zero_samples(png_structp png_ptr, png_row_infop row_info, png_bytep data) { png_bytep dp = data; - if (png_ptr == NULL)return; + if (png_ptr == NULL) + return; /* Contents of row_info: * png_uint_32 width width of row @@ -176,41 +202,49 @@ count_zero_samples(png_structp png_ptr, png_row_infop row_info, png_bytep data) { int pos = 0; png_uint_32 n, nstop; + for (n = 0, nstop=row_info->width; nbit_depth == 1) { if (((*dp << pos++ ) & 0x80) == 0) zero_samples++; + if (pos == 8) { pos = 0; dp++; } } + if (row_info->bit_depth == 2) { if (((*dp << (pos+=2)) & 0xc0) == 0) zero_samples++; + if (pos == 8) { pos = 0; dp++; } } + if (row_info->bit_depth == 4) { if (((*dp << (pos+=4)) & 0xf0) == 0) zero_samples++; + if (pos == 8) { pos = 0; dp++; } } + if (row_info->bit_depth == 8) if (*dp++ == 0) zero_samples++; + if (row_info->bit_depth == 16) { if ((*dp | *(dp+1)) == 0) @@ -233,10 +267,12 @@ count_zero_samples(png_structp png_ptr, png_row_infop row_info, png_bytep data) if (row_info->bit_depth == 8) if (*dp++ == 0) zero_samples++; + if (row_info->bit_depth == 16) { if ((*dp | *(dp+1)) == 0) zero_samples++; + dp+=2; } } @@ -263,8 +299,50 @@ static int wrote_question = 0; * than changing the library. */ +#ifdef PNG_IO_STATE_SUPPORTED +void +pngtest_check_io_state(png_structp png_ptr, png_size_t data_length, + png_uint_32 io_op); +void +pngtest_check_io_state(png_structp png_ptr, png_size_t data_length, + png_uint_32 io_op) +{ + png_uint_32 io_state = png_get_io_state(png_ptr); + int err = 0; + + /* Check if the current operation (reading / writing) is as expected. */ + if ((io_state & PNG_IO_MASK_OP) != io_op) + png_error(png_ptr, "Incorrect operation in I/O state"); + + /* Check if the buffer size specific to the current location + * (file signature / header / data / crc) is as expected. + */ + switch (io_state & PNG_IO_MASK_LOC) + { + case PNG_IO_SIGNATURE: + if (data_length > 8) + err = 1; + break; + case PNG_IO_CHUNK_HDR: + if (data_length != 8) + err = 1; + break; + case PNG_IO_CHUNK_DATA: + break; /* no restrictions here */ + case PNG_IO_CHUNK_CRC: + if (data_length != 4) + err = 1; + break; + default: + err = 1; /* uninitialized */ + } + if (err) + png_error(png_ptr, "Bad I/O state or buffer size"); +} +#endif + #ifndef USE_FAR_KEYWORD -static void +static void PNGCBAPI pngtest_read_data(png_structp png_ptr, png_bytep data, png_size_t length) { png_size_t check = 0; @@ -281,8 +359,12 @@ pngtest_read_data(png_structp png_ptr, png_bytep data, png_size_t length) if (check != length) { - png_error(png_ptr, "Read Error!"); + png_error(png_ptr, "Read Error"); } + +#ifdef PNG_IO_STATE_SUPPORTED + pngtest_check_io_state(png_ptr, length, PNG_IO_READING); +#endif } #else /* This is the model-independent version. Since the standard I/O library @@ -293,7 +375,7 @@ pngtest_read_data(png_structp png_ptr, png_bytep data, png_size_t length) #define NEAR_BUF_SIZE 1024 #define MIN(a,b) (a <= b ? a : b) -static void +static void PNGCBAPI pngtest_read_data(png_structp png_ptr, png_bytep data, png_size_t length) { png_size_t check; @@ -302,7 +384,7 @@ pngtest_read_data(png_structp png_ptr, png_bytep data, png_size_t length) /* Check if data really is near. If so, use usual code. */ n_data = (png_byte *)CVT_PTR_NOCHECK(data); - io_ptr = (png_FILE_p)CVT_PTR(png_ptr->io_ptr); + io_ptr = (png_FILE_p)CVT_PTR(png_get_io_ptr(png_ptr)); if ((png_bytep)n_data == data) { check = fread(n_data, 1, length, io_ptr); @@ -313,6 +395,7 @@ pngtest_read_data(png_structp png_ptr, png_bytep data, png_size_t length) png_size_t read, remaining, err; check = 0; remaining = length; + do { read = MIN(NEAR_BUF_SIZE, remaining); @@ -327,17 +410,22 @@ pngtest_read_data(png_structp png_ptr, png_bytep data, png_size_t length) } while (remaining != 0); } + if (check != length) - png_error(png_ptr, "read Error"); + png_error(png_ptr, "Read Error"); + +#ifdef PNG_IO_STATE_SUPPORTED + pngtest_check_io_state(png_ptr, length, PNG_IO_READING); +#endif } #endif /* USE_FAR_KEYWORD */ #ifdef PNG_WRITE_FLUSH_SUPPORTED -static void +static void PNGCBAPI pngtest_flush(png_structp png_ptr) { /* Do nothing; fflush() is said to be just a waste of energy. */ - png_ptr = png_ptr; /* Stifle compiler warning */ + PNG_UNUSED(png_ptr) /* Stifle compiler warning */ } #endif @@ -347,16 +435,21 @@ pngtest_flush(png_structp png_ptr) * than changing the library. */ #ifndef USE_FAR_KEYWORD -static void +static void PNGCBAPI pngtest_write_data(png_structp png_ptr, png_bytep data, png_size_t length) { png_size_t check; - check = fwrite(data, 1, length, (png_FILE_p)png_ptr->io_ptr); + check = fwrite(data, 1, length, (png_FILE_p)png_get_io_ptr(png_ptr)); + if (check != length) { png_error(png_ptr, "Write Error"); } + +#ifdef PNG_IO_STATE_SUPPORTED + pngtest_check_io_state(png_ptr, length, PNG_IO_WRITING); +#endif } #else /* This is the model-independent version. Since the standard I/O library @@ -367,7 +460,7 @@ pngtest_write_data(png_structp png_ptr, png_bytep data, png_size_t length) #define NEAR_BUF_SIZE 1024 #define MIN(a,b) (a <= b ? a : b) -static void +static void PNGCBAPI pngtest_write_data(png_structp png_ptr, png_bytep data, png_size_t length) { png_size_t check; @@ -376,17 +469,20 @@ pngtest_write_data(png_structp png_ptr, png_bytep data, png_size_t length) /* Check if data really is near. If so, use usual code. */ near_data = (png_byte *)CVT_PTR_NOCHECK(data); - io_ptr = (png_FILE_p)CVT_PTR(png_ptr->io_ptr); + io_ptr = (png_FILE_p)CVT_PTR(png_get_io_ptr(png_ptr)); + if ((png_bytep)near_data == data) { check = fwrite(near_data, 1, length, io_ptr); } + else { png_byte buf[NEAR_BUF_SIZE]; png_size_t written, remaining, err; check = 0; remaining = length; + do { written = MIN(NEAR_BUF_SIZE, remaining); @@ -401,10 +497,15 @@ pngtest_write_data(png_structp png_ptr, png_bytep data, png_size_t length) } while (remaining != 0); } + if (check != length) { png_error(png_ptr, "Write Error"); } + +#ifdef PNG_IO_STATE_SUPPORTED + pngtest_check_io_state(png_ptr, length, PNG_IO_WRITING); +#endif } #endif /* USE_FAR_KEYWORD */ @@ -413,14 +514,16 @@ pngtest_write_data(png_structp png_ptr, png_bytep data, png_size_t length) * here if you don't want to. In the default configuration, png_ptr is * not used, but it is passed in case it may be useful. */ -static void +static void PNGCBAPI pngtest_warning(png_structp png_ptr, png_const_charp message) { PNG_CONST char *name = "UNKNOWN (ERROR!)"; char *test; test = png_get_error_ptr(png_ptr); + if (test == NULL) fprintf(STDERR, "%s: libpng warning: %s\n", name, message); + else fprintf(STDERR, "%s: libpng warning: %s\n", test, message); } @@ -430,7 +533,7 @@ pngtest_warning(png_structp png_ptr, png_const_charp message) * function is used by default, or if the program supplies NULL for the * error function pointer in png_set_error_fn(). */ -static void +static void PNGCBAPI pngtest_error(png_structp png_ptr, png_const_charp message) { pngtest_warning(png_ptr, message); @@ -467,12 +570,12 @@ static int maximum_allocation = 0; static int total_allocation = 0; static int num_allocations = 0; -png_voidp png_debug_malloc - PNGARG((png_structp png_ptr, png_alloc_size_t size)); -void png_debug_free PNGARG((png_structp png_ptr, png_voidp ptr)); +png_voidp PNGCBAPI png_debug_malloc PNGARG((png_structp png_ptr, + png_alloc_size_t size)); +void PNGCBAPI png_debug_free PNGARG((png_structp png_ptr, png_voidp ptr)); png_voidp -png_debug_malloc(png_structp png_ptr, png_alloc_size_t size) +PNGCBAPI png_debug_malloc(png_structp png_ptr, png_alloc_size_t size) { /* png_malloc has already tested for NULL; png_create_struct calls @@ -494,12 +597,16 @@ png_debug_malloc(png_structp png_ptr, png_alloc_size_t size) current_allocation += size; total_allocation += size; num_allocations ++; + if (current_allocation > maximum_allocation) maximum_allocation = current_allocation; + pinfo->pointer = png_malloc(png_ptr, size); /* Restore malloc_fn and free_fn */ + png_set_mem_fn(png_ptr, NULL, png_debug_malloc, png_debug_free); + if (size != 0 && pinfo->pointer == NULL) { current_allocation -= size; @@ -507,23 +614,27 @@ png_debug_malloc(png_structp png_ptr, png_alloc_size_t size) png_error(png_ptr, "out of memory in pngtest->png_debug_malloc"); } + pinfo->next = pinformation; pinformation = pinfo; /* Make sure the caller isn't assuming zeroed memory. */ png_memset(pinfo->pointer, 0xdd, pinfo->size); + if (verbose) - printf("png_malloc %lu bytes at %x\n", (unsigned long)size, + printf("png_malloc %lu bytes at %p\n", (unsigned long)size, pinfo->pointer); + return (png_voidp)(pinfo->pointer); } } /* Free a pointer. It is removed from the list at the same time. */ -void +void PNGCBAPI png_debug_free(png_structp png_ptr, png_voidp ptr) { if (png_ptr == NULL) fprintf(STDERR, "NULL pointer to png_debug_free.\n"); + if (ptr == 0) { #if 0 /* This happens all the time. */ @@ -535,9 +646,11 @@ png_debug_free(png_structp png_ptr, png_voidp ptr) /* Unlink the element from the list. */ { memory_infop FAR *ppinfo = &pinformation; + for (;;) { memory_infop pinfo = *ppinfo; + if (pinfo->pointer == ptr) { *ppinfo = pinfo->next; @@ -551,18 +664,21 @@ png_debug_free(png_structp png_ptr, png_voidp ptr) pinfo = NULL; break; } + if (pinfo->next == NULL) { fprintf(STDERR, "Pointer %x not found\n", (unsigned int)ptr); break; } + ppinfo = &pinfo->next; } } /* Finally free the data. */ if (verbose) - printf("Freeing %x\n", ptr); + printf("Freeing %p\n", ptr); + png_free_default(png_ptr, ptr); ptr = NULL; } @@ -584,7 +700,7 @@ static png_uint_32 user_chunk_data[4]; * 3: vpAg units */ -static int read_user_chunk_callback(png_struct *png_ptr, +static int PNGCBAPI read_user_chunk_callback(png_struct *png_ptr, png_unknown_chunkp chunk) { png_uint_32 @@ -609,8 +725,10 @@ static int read_user_chunk_callback(png_struct *png_ptr, /* Found sTER chunk */ if (chunk->size != 1) return (-1); /* Error return */ + if (chunk->data[0] != 0 && chunk->data[0] != 1) return (-1); /* Invalid mode */ + my_user_chunk_data=(png_uint_32 *) png_get_user_chunk_ptr(png_ptr); my_user_chunk_data[0]=chunk->data[0]+1; return (1); @@ -661,7 +779,7 @@ test_one_file(PNG_CONST char *inname, PNG_CONST char *outname) int bit_depth, color_type; #ifdef PNG_SETJMP_SUPPORTED #ifdef USE_FAR_KEYWORD - jmp_buf jmpbuf; + jmp_buf png_jmpbuf; #endif #endif @@ -682,12 +800,11 @@ test_one_file(PNG_CONST char *inname, PNG_CONST char *outname) return (1); } - png_debug(0, "Allocating read and write structures"); + pngtest_debug("Allocating read and write structures"); #if defined(PNG_USER_MEM_SUPPORTED) && PNG_DEBUG read_ptr = png_create_read_struct_2(PNG_LIBPNG_VER_STRING, NULL, - NULL, NULL, NULL, - (png_malloc_ptr)png_debug_malloc, (png_free_ptr)png_debug_free); + NULL, NULL, NULL, png_debug_malloc, png_debug_free); #else read_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); @@ -720,7 +837,7 @@ test_one_file(PNG_CONST char *inname, PNG_CONST char *outname) pngtest_warning); #endif #endif - png_debug(0, "Allocating read_info, write_info and end_info structures"); + pngtest_debug("Allocating read_info, write_info and end_info structures"); read_info_ptr = png_create_info_struct(read_ptr); end_info_ptr = png_create_info_struct(read_ptr); #ifdef PNG_WRITE_SUPPORTED @@ -729,9 +846,9 @@ test_one_file(PNG_CONST char *inname, PNG_CONST char *outname) #endif #ifdef PNG_SETJMP_SUPPORTED - png_debug(0, "Setting jmpbuf for read struct"); + pngtest_debug("Setting jmpbuf for read struct"); #ifdef USE_FAR_KEYWORD - if (setjmp(jmpbuf)) + if (setjmp(png_jmpbuf)) #else if (setjmp(png_jmpbuf(read_ptr))) #endif @@ -749,13 +866,14 @@ test_one_file(PNG_CONST char *inname, PNG_CONST char *outname) return (1); } #ifdef USE_FAR_KEYWORD - png_memcpy(png_jmpbuf(read_ptr), jmpbuf, png_sizeof(jmp_buf)); + png_memcpy(png_jmpbuf(read_ptr), png_jmpbuf, png_sizeof(jmp_buf)); #endif #ifdef PNG_WRITE_SUPPORTED - png_debug(0, "Setting jmpbuf for write struct"); + pngtest_debug("Setting jmpbuf for write struct"); #ifdef USE_FAR_KEYWORD - if (setjmp(jmpbuf)) + + if (setjmp(png_jmpbuf)) #else if (setjmp(png_jmpbuf(write_ptr))) #endif @@ -770,13 +888,14 @@ test_one_file(PNG_CONST char *inname, PNG_CONST char *outname) FCLOSE(fpout); return (1); } + #ifdef USE_FAR_KEYWORD - png_memcpy(png_jmpbuf(write_ptr), jmpbuf, png_sizeof(jmp_buf)); + png_memcpy(png_jmpbuf(write_ptr), png_jmpbuf, png_sizeof(jmp_buf)); #endif #endif #endif - png_debug(0, "Initializing input and output streams"); + pngtest_debug("Initializing input and output streams"); #ifdef PNG_STDIO_SUPPORTED png_init_io(read_ptr, fpin); # ifdef PNG_WRITE_SUPPORTED @@ -793,6 +912,7 @@ test_one_file(PNG_CONST char *inname, PNG_CONST char *outname) # endif # endif #endif + if (status_dots_requested == 1) { #ifdef PNG_WRITE_SUPPORTED @@ -800,6 +920,7 @@ test_one_file(PNG_CONST char *inname, PNG_CONST char *outname) #endif png_set_read_status_fn(read_ptr, read_row_callback); } + else { #ifdef PNG_WRITE_SUPPORTED @@ -811,8 +932,10 @@ test_one_file(PNG_CONST char *inname, PNG_CONST char *outname) #ifdef PNG_READ_USER_TRANSFORM_SUPPORTED { int i; + for (i = 0; i<256; i++) filters_used[i] = 0; + png_set_read_user_transform_fn(read_ptr, count_filters); } #endif @@ -836,10 +959,10 @@ test_one_file(PNG_CONST char *inname, PNG_CONST char *outname) NULL, 0); #endif - png_debug(0, "Reading info struct"); + pngtest_debug("Reading info struct"); png_read_info(read_ptr, read_info_ptr); - png_debug(0, "Transferring info struct"); + pngtest_debug("Transferring info struct"); { int interlace_type, compression_type, filter_type; @@ -859,6 +982,7 @@ test_one_file(PNG_CONST char *inname, PNG_CONST char *outname) { png_fixed_point white_x, white_y, red_x, red_y, green_x, green_y, blue_x, blue_y; + if (png_get_cHRM_fixed(read_ptr, read_info_ptr, &white_x, &white_y, &red_x, &red_y, &green_x, &green_y, &blue_x, &blue_y)) { @@ -881,6 +1005,7 @@ test_one_file(PNG_CONST char *inname, PNG_CONST char *outname) { double white_x, white_y, red_x, red_y, green_x, green_y, blue_x, blue_y; + if (png_get_cHRM(read_ptr, read_info_ptr, &white_x, &white_y, &red_x, &red_y, &green_x, &green_y, &blue_x, &blue_y)) { @@ -902,7 +1027,7 @@ test_one_file(PNG_CONST char *inname, PNG_CONST char *outname) #ifdef PNG_iCCP_SUPPORTED { png_charp name; - png_charp profile; + png_bytep profile; png_uint_32 proflen; int compression_type; @@ -1026,7 +1151,7 @@ test_one_file(PNG_CONST char *inname, PNG_CONST char *outname) if (png_get_text(read_ptr, read_info_ptr, &text_ptr, &num_text) > 0) { - png_debug1(0, "Handling %d iTXt/tEXt/zTXt chunks", num_text); + pngtest_debug1("Handling %d iTXt/tEXt/zTXt chunks", num_text); png_set_text(write_ptr, write_info_ptr, text_ptr, num_text); } } @@ -1046,6 +1171,7 @@ test_one_file(PNG_CONST char *inname, PNG_CONST char *outname) png_memcpy(tIME_string, png_convert_to_rfc1123(read_ptr, mod_time), png_sizeof(tIME_string)); + tIME_string[png_sizeof(tIME_string) - 1] = '\0'; tIME_chunk_present++; #endif /* PNG_TIME_RFC1123_SUPPORTED */ @@ -1077,18 +1203,19 @@ test_one_file(PNG_CONST char *inname, PNG_CONST char *outname) #ifdef PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED { png_unknown_chunkp unknowns; - int num_unknowns = (int)png_get_unknown_chunks(read_ptr, read_info_ptr, + int num_unknowns = png_get_unknown_chunks(read_ptr, read_info_ptr, &unknowns); + if (num_unknowns) { - png_size_t i; + int i; png_set_unknown_chunks(write_ptr, write_info_ptr, unknowns, num_unknowns); /* Copy the locations from the read_info_ptr. The automatically * generated locations in write_info_ptr are wrong because we * haven't written anything yet. */ - for (i = 0; i < (png_size_t)num_unknowns; i++) + for (i = 0; i < num_unknowns; i++) png_set_unknown_chunk_location(write_ptr, write_info_ptr, i, unknowns[i].location); } @@ -1096,7 +1223,7 @@ test_one_file(PNG_CONST char *inname, PNG_CONST char *outname) #endif #ifdef PNG_WRITE_SUPPORTED - png_debug(0, "Writing info struct"); + pngtest_debug("Writing info struct"); /* If we wanted, we could write info in two steps: * png_write_info_before_PLTE(write_ptr, write_info_ptr); @@ -1114,9 +1241,11 @@ test_one_file(PNG_CONST char *inname, PNG_CONST char *outname) if (verbose) fprintf(STDERR, "\n stereo mode = %lu\n", (unsigned long)(user_chunk_data[0] - 1)); + ster_chunk_data[0]=(unsigned char)(user_chunk_data[0] - 1); png_write_chunk(write_ptr, png_sTER, ster_chunk_data, 1); } + if (user_chunk_data[1] != 0 || user_chunk_data[2] != 0) { png_byte png_vpAg[5] = {118, 112, 65, 103, '\0'}; @@ -1129,6 +1258,7 @@ test_one_file(PNG_CONST char *inname, PNG_CONST char *outname) (unsigned long)user_chunk_data[1], (unsigned long)user_chunk_data[2], (unsigned long)user_chunk_data[3]); + png_save_uint_32(vpag_chunk_data, user_chunk_data[1]); png_save_uint_32(vpag_chunk_data + 4, user_chunk_data[2]); vpag_chunk_data[8] = (unsigned char)(user_chunk_data[3] & 0xff); @@ -1139,12 +1269,13 @@ test_one_file(PNG_CONST char *inname, PNG_CONST char *outname) #endif #ifdef SINGLE_ROWBUF_ALLOC - png_debug(0, "Allocating row buffer..."); + pngtest_debug("Allocating row buffer..."); row_buf = (png_bytep)png_malloc(read_ptr, png_get_rowbytes(read_ptr, read_info_ptr)); - png_debug1(0, "0x%08lx", (unsigned long)row_buf); + + pngtest_debug1("\t0x%08lx", (unsigned long)row_buf); #endif /* SINGLE_ROWBUF_ALLOC */ - png_debug(0, "Writing row data"); + pngtest_debug("Writing row data"); #if defined(PNG_READ_INTERLACING_SUPPORTED) || \ defined(PNG_WRITE_INTERLACING_SUPPORTED) @@ -1163,15 +1294,17 @@ test_one_file(PNG_CONST char *inname, PNG_CONST char *outname) #endif for (pass = 0; pass < num_pass; pass++) { - png_debug1(0, "Writing row data for pass %d", pass); + pngtest_debug1("Writing row data for pass %d", pass); for (y = 0; y < height; y++) { #ifndef SINGLE_ROWBUF_ALLOC - png_debug2(0, "Allocating row buffer (pass %d, y = %ld)...", pass, y); + pngtest_debug2("Allocating row buffer (pass %d, y = %u)...", pass, y); row_buf = (png_bytep)png_malloc(read_ptr, png_get_rowbytes(read_ptr, read_info_ptr)); - png_debug2(0, "0x%08lx (%ld bytes)", (unsigned long)row_buf, + + pngtest_debug2("\t0x%08lx (%u bytes)", (unsigned long)row_buf, png_get_rowbytes(read_ptr, read_info_ptr)); + #endif /* !SINGLE_ROWBUF_ALLOC */ png_read_rows(read_ptr, (png_bytepp)&row_buf, NULL, 1); @@ -1190,7 +1323,7 @@ test_one_file(PNG_CONST char *inname, PNG_CONST char *outname) #endif /* PNG_WRITE_SUPPORTED */ #ifndef SINGLE_ROWBUF_ALLOC - png_debug2(0, "Freeing row buffer (pass %d, y = %ld)", pass, y); + pngtest_debug2("Freeing row buffer (pass %d, y = %u)", pass, y); png_free(read_ptr, row_buf); row_buf = NULL; #endif /* !SINGLE_ROWBUF_ALLOC */ @@ -1204,7 +1337,7 @@ test_one_file(PNG_CONST char *inname, PNG_CONST char *outname) png_free_data(write_ptr, write_info_ptr, PNG_FREE_UNKN, -1); #endif - png_debug(0, "Reading and writing end_info data"); + pngtest_debug("Reading and writing end_info data"); png_read_end(read_ptr, end_info_ptr); #ifdef PNG_TEXT_SUPPORTED @@ -1214,7 +1347,7 @@ test_one_file(PNG_CONST char *inname, PNG_CONST char *outname) if (png_get_text(read_ptr, end_info_ptr, &text_ptr, &num_text) > 0) { - png_debug1(0, "Handling %d iTXt/tEXt/zTXt chunks", num_text); + pngtest_debug1("Handling %d iTXt/tEXt/zTXt chunks", num_text); png_set_text(write_ptr, write_end_info_ptr, text_ptr, num_text); } } @@ -1233,6 +1366,7 @@ test_one_file(PNG_CONST char *inname, PNG_CONST char *outname) png_memcpy(tIME_string, png_convert_to_rfc1123(read_ptr, mod_time), png_sizeof(tIME_string)); + tIME_string[png_sizeof(tIME_string) - 1] = '\0'; tIME_chunk_present++; #endif /* PNG_TIME_RFC1123_SUPPORTED */ @@ -1242,19 +1376,19 @@ test_one_file(PNG_CONST char *inname, PNG_CONST char *outname) #ifdef PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED { png_unknown_chunkp unknowns; - int num_unknowns; - num_unknowns = (int)png_get_unknown_chunks(read_ptr, end_info_ptr, + int num_unknowns = png_get_unknown_chunks(read_ptr, end_info_ptr, &unknowns); + if (num_unknowns) { - png_size_t i; + int i; png_set_unknown_chunks(write_ptr, write_end_info_ptr, unknowns, num_unknowns); /* Copy the locations from the read_info_ptr. The automatically * generated locations in write_end_info_ptr are wrong because we * haven't written the end_info yet. */ - for (i = 0; i < (png_size_t)num_unknowns; i++) + for (i = 0; i < num_unknowns; i++) png_set_unknown_chunk_location(write_ptr, write_end_info_ptr, i, unknowns[i].location); } @@ -1275,26 +1409,26 @@ test_one_file(PNG_CONST char *inname, PNG_CONST char *outname) } #endif - png_debug(0, "Destroying data structs"); + pngtest_debug("Destroying data structs"); #ifdef SINGLE_ROWBUF_ALLOC - png_debug(1, "destroying row_buf for read_ptr"); + pngtest_debug("destroying row_buf for read_ptr"); png_free(read_ptr, row_buf); row_buf = NULL; #endif /* SINGLE_ROWBUF_ALLOC */ - png_debug(1, "destroying read_ptr, read_info_ptr, end_info_ptr"); + pngtest_debug("destroying read_ptr, read_info_ptr, end_info_ptr"); png_destroy_read_struct(&read_ptr, &read_info_ptr, &end_info_ptr); #ifdef PNG_WRITE_SUPPORTED - png_debug(1, "destroying write_end_info_ptr"); + pngtest_debug("destroying write_end_info_ptr"); png_destroy_info_struct(write_ptr, &write_end_info_ptr); - png_debug(1, "destroying write_ptr, write_info_ptr"); + pngtest_debug("destroying write_ptr, write_info_ptr"); png_destroy_write_struct(&write_ptr, &write_info_ptr); #endif - png_debug(0, "Destruction complete."); + pngtest_debug("Destruction complete."); FCLOSE(fpin); FCLOSE(fpout); - png_debug(0, "Opening files for comparison"); + pngtest_debug("Opening files for comparison"); if ((fpin = fopen(inname, "rb")) == NULL) { fprintf(STDERR, "Could not find file %s\n", inname); @@ -1319,6 +1453,7 @@ test_one_file(PNG_CONST char *inname, PNG_CONST char *outname) { fprintf(STDERR, "\nFiles %s and %s are of a different size\n", inname, outname); + if (wrote_question == 0) { fprintf(STDERR, @@ -1331,6 +1466,7 @@ test_one_file(PNG_CONST char *inname, PNG_CONST char *outname) ZLIB_VERSION); wrote_question = 1; } + FCLOSE(fpin); FCLOSE(fpout); return (0); @@ -1342,6 +1478,7 @@ test_one_file(PNG_CONST char *inname, PNG_CONST char *outname) if (png_memcmp(inbuf, outbuf, num_in)) { fprintf(STDERR, "\nFiles %s and %s are different\n", inname, outname); + if (wrote_question == 0) { fprintf(STDERR, @@ -1354,6 +1491,7 @@ test_one_file(PNG_CONST char *inname, PNG_CONST char *outname) ZLIB_VERSION); wrote_question = 1; } + FCLOSE(fpin); FCLOSE(fpout); return (0); @@ -1388,11 +1526,10 @@ main(int argc, char *argv[]) fprintf(STDERR, " library (%lu):%s", (unsigned long)png_access_version_number(), png_get_header_version(NULL)); + /* Show the version of libpng used in building the application */ fprintf(STDERR, " pngtest (%lu):%s", (unsigned long)PNG_LIBPNG_VER, PNG_HEADER_VERSION_STRING); - fprintf(STDERR, " sizeof(png_struct)=%ld, sizeof(png_info)=%ld\n", - (long)png_sizeof(png_struct), (long)png_sizeof(png_info)); /* Do some consistency checking on the memory allocation settings, I'm * not sure this matters, but it is nice to know, the first of these @@ -1423,6 +1560,7 @@ main(int argc, char *argv[]) multiple = 1; status_dots_requested = 0; } + else if (strcmp(argv[1], "-mv") == 0 || strcmp(argv[1], "-vm") == 0 ) { @@ -1430,12 +1568,14 @@ main(int argc, char *argv[]) verbose = 1; status_dots_requested = 1; } + else if (strcmp(argv[1], "-v") == 0) { verbose = 1; status_dots_requested = 1; inname = argv[2]; } + else { inname = argv[1]; @@ -1489,9 +1629,11 @@ main(int argc, char *argv[]) #ifdef PNG_TIME_RFC1123_SUPPORTED if (tIME_chunk_present != 0) fprintf(STDERR, " tIME = %s\n", tIME_string); + tIME_chunk_present = 0; #endif /* PNG_TIME_RFC1123_SUPPORTED */ } + else { fprintf(STDERR, " FAIL\n"); @@ -1501,17 +1643,19 @@ main(int argc, char *argv[]) if (allocation_now != current_allocation) fprintf(STDERR, "MEMORY ERROR: %d bytes lost\n", current_allocation - allocation_now); + if (current_allocation != 0) { memory_infop pinfo = pinformation; fprintf(STDERR, "MEMORY ERROR: %d bytes still allocated\n", current_allocation); + while (pinfo != NULL) { fprintf(STDERR, " %lu bytes at %x\n", (unsigned long)pinfo->size, - (unsigned int) pinfo->pointer); + (unsigned int)pinfo->pointer); pinfo = pinfo->next; } } @@ -1528,6 +1672,7 @@ main(int argc, char *argv[]) num_allocations); #endif } + else { int i; @@ -1537,11 +1682,17 @@ main(int argc, char *argv[]) #if defined(PNG_USER_MEM_SUPPORTED) && PNG_DEBUG int allocation_now = current_allocation; #endif - if (i == 1) status_dots_requested = 1; - else if (verbose == 0)status_dots_requested = 0; + if (i == 1) + status_dots_requested = 1; + + else if (verbose == 0) + status_dots_requested = 0; + if (i == 0 || verbose == 1 || ierror != 0) fprintf(STDERR, "\n Testing %s:", inname); + kerror = test_one_file(inname, outname); + if (kerror == 0) { if (verbose == 1 || i == 2) @@ -1567,10 +1718,12 @@ main(int argc, char *argv[]) #endif /* PNG_TIME_RFC1123_SUPPORTED */ } } + else { if (verbose == 0 && i != 2) fprintf(STDERR, "\n Testing %s:", inname); + fprintf(STDERR, " FAIL\n"); ierror += kerror; } @@ -1578,12 +1731,14 @@ main(int argc, char *argv[]) if (allocation_now != current_allocation) fprintf(STDERR, "MEMORY ERROR: %d bytes lost\n", current_allocation - allocation_now); + if (current_allocation != 0) { memory_infop pinfo = pinformation; fprintf(STDERR, "MEMORY ERROR: %d bytes still allocated\n", current_allocation); + while (pinfo != NULL) { fprintf(STDERR, " %lu bytes at %x\n", @@ -1621,10 +1776,12 @@ main(int argc, char *argv[]) if (ierror == 0) fprintf(STDERR, " libpng passes test\n"); + else fprintf(STDERR, " libpng FAILS test\n"); + return (int)(ierror != 0); } /* Generate a compiler error if there is an old png.h in the search path. */ -typedef version_1_4_3 your_png_h_is_not_version_1_4_3; +typedef png_libpng_version_1_5_2 Your_png_h_is_not_version_1_5_2; diff --git a/reactos/dll/3rdparty/libpng/pngtrans.c b/reactos/dll/3rdparty/libpng/pngtrans.c index f80679a19d1..cf7622cdc6e 100644 --- a/reactos/dll/3rdparty/libpng/pngtrans.c +++ b/reactos/dll/3rdparty/libpng/pngtrans.c @@ -1,8 +1,8 @@ /* pngtrans.c - transforms the data in a row (used by both readers and writers) * - * Last changed in libpng 1.4.2 [April 29, 2010] - * Copyright (c) 1998-2010 Glenn Randers-Pehrson + * Last changed in libpng 1.5.2 [March 31, 2011] + * Copyright (c) 1998-2011 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * @@ -11,11 +11,10 @@ * and license in png.h */ -#define PNG_NO_PEDANTIC_WARNINGS -#include "png.h" -#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) #include "pngpriv.h" +#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) + #if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED) /* Turn on BGR-to-RGB mapping */ void PNGAPI @@ -25,6 +24,7 @@ png_set_bgr(png_structp png_ptr) if (png_ptr == NULL) return; + png_ptr->transformations |= PNG_BGR; } #endif @@ -38,6 +38,7 @@ png_set_swap(png_structp png_ptr) if (png_ptr == NULL) return; + if (png_ptr->bit_depth == 16) png_ptr->transformations |= PNG_SWAP_BYTES; } @@ -52,6 +53,7 @@ png_set_packing(png_structp png_ptr) if (png_ptr == NULL) return; + if (png_ptr->bit_depth < 8) { png_ptr->transformations |= PNG_PACK; @@ -69,6 +71,7 @@ png_set_packswap(png_structp png_ptr) if (png_ptr == NULL) return; + if (png_ptr->bit_depth < 8) png_ptr->transformations |= PNG_PACKSWAP; } @@ -76,12 +79,13 @@ png_set_packswap(png_structp png_ptr) #if defined(PNG_READ_SHIFT_SUPPORTED) || defined(PNG_WRITE_SHIFT_SUPPORTED) void PNGAPI -png_set_shift(png_structp png_ptr, png_color_8p true_bits) +png_set_shift(png_structp png_ptr, png_const_color_8p true_bits) { png_debug(1, "in png_set_shift"); if (png_ptr == NULL) return; + png_ptr->transformations |= PNG_SHIFT; png_ptr->shift = *true_bits; } @@ -117,10 +121,13 @@ png_set_filler(png_structp png_ptr, png_uint_32 filler, int filler_loc) if (png_ptr == NULL) return; + png_ptr->transformations |= PNG_FILLER; png_ptr->filler = (png_uint_16)filler; + if (filler_loc == PNG_FILLER_AFTER) png_ptr->flags |= PNG_FLAG_FILLER_AFTER; + else png_ptr->flags &= ~PNG_FLAG_FILLER_AFTER; @@ -135,7 +142,7 @@ png_set_filler(png_structp png_ptr, png_uint_32 filler, int filler_loc) } /* Also I added this in libpng-1.0.2a (what happens when we expand - * a less-than-8-bit grayscale to GA? */ + * a less-than-8-bit grayscale to GA?) */ if (png_ptr->color_type == PNG_COLOR_TYPE_GRAY && png_ptr->bit_depth >= 8) { @@ -151,6 +158,7 @@ png_set_add_alpha(png_structp png_ptr, png_uint_32 filler, int filler_loc) if (png_ptr == NULL) return; + png_set_filler(png_ptr, filler, filler_loc); png_ptr->transformations |= PNG_ADD_ALPHA; } @@ -166,6 +174,7 @@ png_set_swap_alpha(png_structp png_ptr) if (png_ptr == NULL) return; + png_ptr->transformations |= PNG_SWAP_ALPHA; } #endif @@ -179,6 +188,7 @@ png_set_invert_alpha(png_structp png_ptr) if (png_ptr == NULL) return; + png_ptr->transformations |= PNG_INVERT_ALPHA; } #endif @@ -191,6 +201,7 @@ png_set_invert_mono(png_structp png_ptr) if (png_ptr == NULL) return; + png_ptr->transformations |= PNG_INVERT_MONO; } @@ -206,8 +217,8 @@ png_do_invert(png_row_infop row_info, png_bytep row) if (row_info->color_type == PNG_COLOR_TYPE_GRAY) { png_bytep rp = row; - png_uint_32 i; - png_uint_32 istop = row_info->rowbytes; + png_size_t i; + png_size_t istop = row_info->rowbytes; for (i = 0; i < istop; i++) { @@ -215,36 +226,41 @@ png_do_invert(png_row_infop row_info, png_bytep row) rp++; } } + else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA && row_info->bit_depth == 8) { png_bytep rp = row; - png_uint_32 i; - png_uint_32 istop = row_info->rowbytes; + png_size_t i; + png_size_t istop = row_info->rowbytes; - for (i = 0; i < istop; i+=2) + for (i = 0; i < istop; i += 2) { *rp = (png_byte)(~(*rp)); - rp+=2; + rp += 2; } } + +#ifdef PNG_16BIT_SUPPORTED else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA && row_info->bit_depth == 16) { png_bytep rp = row; - png_uint_32 i; - png_uint_32 istop = row_info->rowbytes; + png_size_t i; + png_size_t istop = row_info->rowbytes; - for (i = 0; i < istop; i+=4) + for (i = 0; i < istop; i += 4) { *rp = (png_byte)(~(*rp)); - *(rp+1) = (png_byte)(~(*(rp+1))); - rp+=4; + *(rp + 1) = (png_byte)(~(*(rp + 1))); + rp += 4; } } +#endif } #endif +#ifdef PNG_16BIT_SUPPORTED #if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED) /* Swaps byte order on 16 bit depth images */ void /* PRIVATE */ @@ -252,8 +268,7 @@ png_do_swap(png_row_infop row_info, png_bytep row) { png_debug(1, "in png_do_swap"); - if ( - row_info->bit_depth == 16) + if (row_info->bit_depth == 16) { png_bytep rp = row; png_uint_32 i; @@ -268,6 +283,7 @@ png_do_swap(png_row_infop row_info, png_bytep row) } } #endif +#endif #if defined(PNG_READ_PACKSWAP_SUPPORTED)||defined(PNG_WRITE_PACKSWAP_SUPPORTED) static PNG_CONST png_byte onebppswaptable[256] = { @@ -381,19 +397,22 @@ png_do_packswap(png_row_infop row_info, png_bytep row) { png_debug(1, "in png_do_packswap"); - if ( - row_info->bit_depth < 8) + if (row_info->bit_depth < 8) { - png_bytep rp, end, table; + png_bytep rp; + png_const_bytep end, table; end = row + row_info->rowbytes; if (row_info->bit_depth == 1) - table = (png_bytep)onebppswaptable; + table = onebppswaptable; + else if (row_info->bit_depth == 2) - table = (png_bytep)twobppswaptable; + table = twobppswaptable; + else if (row_info->bit_depth == 4) - table = (png_bytep)fourbppswaptable; + table = fourbppswaptable; + else return; @@ -405,158 +424,115 @@ png_do_packswap(png_row_infop row_info, png_bytep row) #if defined(PNG_WRITE_FILLER_SUPPORTED) || \ defined(PNG_READ_STRIP_ALPHA_SUPPORTED) -/* Remove filler or alpha byte(s) */ +/* Remove a channel - this used to be 'png_do_strip_filler' but it used a + * somewhat weird combination of flags to determine what to do. All the calls + * to png_do_strip_filler are changed in 1.5.2 to call this instead with the + * correct arguments. + * + * The routine isn't general - the channel must be the channel at the start or + * end (not in the middle) of each pixel. + */ void /* PRIVATE */ -png_do_strip_filler(png_row_infop row_info, png_bytep row, png_uint_32 flags) +png_do_strip_channel(png_row_infop row_info, png_bytep row, int at_start) { - png_debug(1, "in png_do_strip_filler"); + png_bytep sp = row; /* source pointer */ + png_bytep dp = row; /* destination pointer */ + png_bytep ep = row + row_info->rowbytes; /* One beyond end of row */ + /* At the start sp will point to the first byte to copy and dp to where + * it is copied to. ep always points just beyond the end of the row, so + * the loop simply copies (channels-1) channels until sp reaches ep. + */ + /* GA, GX, XG cases */ + if (row_info->channels == 2) { - png_bytep sp=row; - png_bytep dp=row; - png_uint_32 row_width=row_info->width; - png_uint_32 i; - - if ((row_info->color_type == PNG_COLOR_TYPE_RGB || - (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA && - (flags & PNG_FLAG_STRIP_ALPHA))) && - row_info->channels == 4) + if (row_info->bit_depth == 8) { - if (row_info->bit_depth == 8) - { - /* This converts from RGBX or RGBA to RGB */ - if (flags & PNG_FLAG_FILLER_AFTER) - { - dp+=3; sp+=4; - for (i = 1; i < row_width; i++) - { - *dp++ = *sp++; - *dp++ = *sp++; - *dp++ = *sp++; - sp++; - } - } - /* This converts from XRGB or ARGB to RGB */ - else - { - for (i = 0; i < row_width; i++) - { - sp++; - *dp++ = *sp++; - *dp++ = *sp++; - *dp++ = *sp++; - } - } - row_info->pixel_depth = 24; - row_info->rowbytes = row_width * 3; - } - else /* if (row_info->bit_depth == 16) */ - { - if (flags & PNG_FLAG_FILLER_AFTER) - { - /* This converts from RRGGBBXX or RRGGBBAA to RRGGBB */ - sp += 8; dp += 6; - for (i = 1; i < row_width; i++) - { - /* This could be (although png_memcpy is probably slower): - png_memcpy(dp, sp, 6); - sp += 8; - dp += 6; - */ + if (at_start) /* Skip initial filler */ + ++sp; + else /* Skip initial channels and, for sp, the filler */ + sp += 2, ++dp; - *dp++ = *sp++; - *dp++ = *sp++; - *dp++ = *sp++; - *dp++ = *sp++; - *dp++ = *sp++; - *dp++ = *sp++; - sp += 2; - } - } - else - { - /* This converts from XXRRGGBB or AARRGGBB to RRGGBB */ - for (i = 0; i < row_width; i++) - { - /* This could be (although png_memcpy is probably slower): - png_memcpy(dp, sp, 6); - sp += 8; - dp += 6; - */ + /* For a 1 pixel wide image there is nothing to do */ + while (sp < ep) + *dp++ = *sp, sp += 2; - sp+=2; - *dp++ = *sp++; - *dp++ = *sp++; - *dp++ = *sp++; - *dp++ = *sp++; - *dp++ = *sp++; - *dp++ = *sp++; - } - } - row_info->pixel_depth = 48; - row_info->rowbytes = row_width * 6; - } - row_info->channels = 3; + row_info->pixel_depth = 8; } - else if ((row_info->color_type == PNG_COLOR_TYPE_GRAY || - (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA && - (flags & PNG_FLAG_STRIP_ALPHA))) && - row_info->channels == 2) + + else if (row_info->bit_depth == 16) { - if (row_info->bit_depth == 8) - { - /* This converts from GX or GA to G */ - if (flags & PNG_FLAG_FILLER_AFTER) - { - for (i = 0; i < row_width; i++) - { - *dp++ = *sp++; - sp++; - } - } - /* This converts from XG or AG to G */ - else - { - for (i = 0; i < row_width; i++) - { - sp++; - *dp++ = *sp++; - } - } - row_info->pixel_depth = 8; - row_info->rowbytes = row_width; - } - else /* if (row_info->bit_depth == 16) */ - { - if (flags & PNG_FLAG_FILLER_AFTER) - { - /* This converts from GGXX or GGAA to GG */ - sp += 4; dp += 2; - for (i = 1; i < row_width; i++) - { - *dp++ = *sp++; - *dp++ = *sp++; - sp += 2; - } - } - else - { - /* This converts from XXGG or AAGG to GG */ - for (i = 0; i < row_width; i++) - { - sp += 2; - *dp++ = *sp++; - *dp++ = *sp++; - } - } - row_info->pixel_depth = 16; - row_info->rowbytes = row_width * 2; - } - row_info->channels = 1; + if (at_start) + sp += 2; + else + sp += 4, dp += 2; + + while (sp < ep) + *dp++ = *sp++, *dp++ = *sp, sp += 3; + + row_info->pixel_depth = 16; } - if (flags & PNG_FLAG_STRIP_ALPHA) - row_info->color_type &= ~PNG_COLOR_MASK_ALPHA; + + else + return; /* bad bit depth */ + + row_info->channels = 1; + + /* Finally fix the color type if it records an alpha channel */ + if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA) + row_info->color_type = PNG_COLOR_TYPE_GRAY; } + + /* RGBA, RGBX, XRGB cases */ + else if (row_info->channels == 4) + { + if (row_info->bit_depth == 8) + { + if (at_start) /* Skip initial filler */ + ++sp; + else /* Skip initial channels and, for sp, the filler */ + sp += 4, dp += 3; + + /* Note that the loop adds 3 to dp and 4 to sp each time. */ + while (sp < ep) + *dp++ = *sp++, *dp++ = *sp++, *dp++ = *sp, sp += 2; + + row_info->pixel_depth = 24; + } + + else if (row_info->bit_depth == 16) + { + if (at_start) + sp += 2; + else + sp += 8, dp += 6; + + while (sp < ep) + { + /* Copy 6 bytes, skip 2 */ + *dp++ = *sp++, *dp++ = *sp++; + *dp++ = *sp++, *dp++ = *sp++; + *dp++ = *sp++, *dp++ = *sp, sp += 3; + } + + row_info->pixel_depth = 48; + } + + else + return; /* bad bit depth */ + + row_info->channels = 3; + + /* Finally fix the color type if it records an alpha channel */ + if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) + row_info->color_type = PNG_COLOR_TYPE_RGB; + } + + else + return; /* The filler channel has gone already */ + + /* Fix the rowbytes value. */ + row_info->rowbytes = dp-row; } #endif @@ -567,8 +543,7 @@ png_do_bgr(png_row_infop row_info, png_bytep row) { png_debug(1, "in png_do_bgr"); - if ( - (row_info->color_type & PNG_COLOR_MASK_COLOR)) + if ((row_info->color_type & PNG_COLOR_MASK_COLOR)) { png_uint_32 row_width = row_info->width; if (row_info->bit_depth == 8) @@ -585,6 +560,7 @@ png_do_bgr(png_row_infop row_info, png_bytep row) *(rp + 2) = save; } } + else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) { png_bytep rp; @@ -598,6 +574,8 @@ png_do_bgr(png_row_infop row_info, png_bytep row) } } } + +#ifdef PNG_16BIT_SUPPORTED else if (row_info->bit_depth == 16) { if (row_info->color_type == PNG_COLOR_TYPE_RGB) @@ -615,6 +593,7 @@ png_do_bgr(png_row_infop row_info, png_bytep row) *(rp + 5) = save; } } + else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) { png_bytep rp; @@ -631,12 +610,14 @@ png_do_bgr(png_row_infop row_info, png_bytep row) } } } +#endif } } #endif /* PNG_READ_BGR_SUPPORTED or PNG_WRITE_BGR_SUPPORTED */ #if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) +#ifdef PNG_USER_TRANSFORM_PTR_SUPPORTED void PNGAPI png_set_user_transform_info(png_structp png_ptr, png_voidp user_transform_ptr, int user_transform_depth, int user_transform_channels) @@ -645,33 +626,49 @@ png_set_user_transform_info(png_structp png_ptr, png_voidp if (png_ptr == NULL) return; -#ifdef PNG_USER_TRANSFORM_PTR_SUPPORTED png_ptr->user_transform_ptr = user_transform_ptr; png_ptr->user_transform_depth = (png_byte)user_transform_depth; png_ptr->user_transform_channels = (png_byte)user_transform_channels; -#else - if (user_transform_ptr || user_transform_depth || user_transform_channels) - png_warning(png_ptr, - "This version of libpng does not support user transform info"); -#endif } +#endif /* This function returns a pointer to the user_transform_ptr associated with * the user transform functions. The application should free any memory * associated with this pointer before png_write_destroy and png_read_destroy * are called. */ +#ifdef PNG_USER_TRANSFORM_PTR_SUPPORTED png_voidp PNGAPI -png_get_user_transform_ptr(png_structp png_ptr) +png_get_user_transform_ptr(png_const_structp png_ptr) { if (png_ptr == NULL) return (NULL); -#ifdef PNG_USER_TRANSFORM_PTR_SUPPORTED + return ((png_voidp)png_ptr->user_transform_ptr); -#else - return (NULL); -#endif } +#endif + +#ifdef PNG_USER_TRANSFORM_INFO_SUPPORTED +png_uint_32 PNGAPI +png_get_current_row_number(png_const_structp png_ptr) +{ + /* See the comments in png.h - this is the sub-image row when reading and + * interlaced image. + */ + if (png_ptr != NULL) + return png_ptr->row_number; + + return PNG_UINT_32_MAX; /* help the app not to fail silently */ +} + +png_byte PNGAPI +png_get_current_pass_number(png_const_structp png_ptr) +{ + if (png_ptr != NULL) + return png_ptr->pass; + return 8; /* invalid */ +} +#endif /* PNG_USER_TRANSFORM_INFO_SUPPORTED */ #endif /* PNG_READ_USER_TRANSFORM_SUPPORTED || - PNG_WRITE_USER_TRANSFORM_SUPPORTED */ + PNG_WRITE_USER_TRANSFORM_SUPPORTED */ #endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */ diff --git a/reactos/dll/3rdparty/libpng/pngwio.c b/reactos/dll/3rdparty/libpng/pngwio.c index 513a71a0622..95ffb3429f1 100644 --- a/reactos/dll/3rdparty/libpng/pngwio.c +++ b/reactos/dll/3rdparty/libpng/pngwio.c @@ -1,8 +1,8 @@ /* pngwio.c - functions for data output * - * Last changed in libpng 1.4.0 [January 3, 2010] - * Copyright (c) 1998-2010 Glenn Randers-Pehrson + * Last changed in libpng 1.5.0 [January 6, 2011] + * Copyright (c) 1998-2011 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * @@ -18,11 +18,10 @@ * them at run time with png_set_write_fn(...). */ -#define PNG_NO_PEDANTIC_WARNINGS -#include "png.h" -#ifdef PNG_WRITE_SUPPORTED #include "pngpriv.h" +#ifdef PNG_WRITE_SUPPORTED + /* Write the data to whatever output you are using. The default routine * writes to a file pointer. Note that this routine sometimes gets called * with very small lengths, so you should implement some kind of simple @@ -31,10 +30,12 @@ */ void /* PRIVATE */ -png_write_data(png_structp png_ptr, png_bytep data, png_size_t length) +png_write_data(png_structp png_ptr, png_const_bytep data, png_size_t length) { + /* NOTE: write_data_fn must not change the buffer! */ if (png_ptr->write_data_fn != NULL ) - (*(png_ptr->write_data_fn))(png_ptr, data, length); + (*(png_ptr->write_data_fn))(png_ptr, (png_bytep)data, length); + else png_error(png_ptr, "Call to NULL write function"); } @@ -46,14 +47,16 @@ png_write_data(png_structp png_ptr, png_bytep data, png_size_t length) * than changing the library. */ #ifndef USE_FAR_KEYWORD -void PNGAPI +void PNGCBAPI png_default_write_data(png_structp png_ptr, png_bytep data, png_size_t length) { - png_uint_32 check; + png_size_t check; if (png_ptr == NULL) return; + check = fwrite(data, 1, length, (png_FILE_p)(png_ptr->io_ptr)); + if (check != length) png_error(png_ptr, "Write Error"); } @@ -66,7 +69,7 @@ png_default_write_data(png_structp png_ptr, png_bytep data, png_size_t length) #define NEAR_BUF_SIZE 1024 #define MIN(a,b) (a <= b ? a : b) -void PNGAPI +void PNGCBAPI png_default_write_data(png_structp png_ptr, png_bytep data, png_size_t length) { png_uint_32 check; @@ -75,24 +78,29 @@ png_default_write_data(png_structp png_ptr, png_bytep data, png_size_t length) if (png_ptr == NULL) return; + /* Check if data really is near. If so, use usual code. */ near_data = (png_byte *)CVT_PTR_NOCHECK(data); io_ptr = (png_FILE_p)CVT_PTR(png_ptr->io_ptr); + if ((png_bytep)near_data == data) { check = fwrite(near_data, 1, length, io_ptr); } + else { png_byte buf[NEAR_BUF_SIZE]; png_size_t written, remaining, err; check = 0; remaining = length; + do { written = MIN(NEAR_BUF_SIZE, remaining); png_memcpy(buf, data, written); /* Copy far buffer to near buffer */ err = fwrite(buf, 1, written, io_ptr); + if (err != written) break; @@ -104,6 +112,7 @@ png_default_write_data(png_structp png_ptr, png_bytep data, png_size_t length) } while (remaining != 0); } + if (check != length) png_error(png_ptr, "Write Error"); } @@ -123,17 +132,19 @@ png_flush(png_structp png_ptr) (*(png_ptr->output_flush_fn))(png_ptr); } -#ifdef PNG_STDIO_SUPPORTED -void PNGAPI +# ifdef PNG_STDIO_SUPPORTED +void PNGCBAPI png_default_flush(png_structp png_ptr) { png_FILE_p io_ptr; + if (png_ptr == NULL) return; + io_ptr = (png_FILE_p)CVT_PTR((png_ptr->io_ptr)); fflush(io_ptr); } -#endif +# endif #endif /* This function allows the application to supply new output functions for @@ -167,7 +178,7 @@ png_default_flush(png_structp png_ptr) */ void PNGAPI png_set_write_fn(png_structp png_ptr, png_voidp io_ptr, - png_rw_ptr write_data_fn, png_flush_ptr output_flush_fn) + png_rw_ptr write_data_fn, png_flush_ptr output_flush_fn) { if (png_ptr == NULL) return; @@ -185,30 +196,32 @@ png_set_write_fn(png_structp png_ptr, png_voidp io_ptr, #endif #ifdef PNG_WRITE_FLUSH_SUPPORTED -#ifdef PNG_STDIO_SUPPORTED +# ifdef PNG_STDIO_SUPPORTED + if (output_flush_fn != NULL) png_ptr->output_flush_fn = output_flush_fn; else png_ptr->output_flush_fn = png_default_flush; -#else + +# else png_ptr->output_flush_fn = output_flush_fn; -#endif +# endif #endif /* PNG_WRITE_FLUSH_SUPPORTED */ /* It is an error to read while writing a png file */ if (png_ptr->read_data_fn != NULL) { png_ptr->read_data_fn = NULL; + png_warning(png_ptr, - "Attempted to set both read_data_fn and write_data_fn in"); - png_warning(png_ptr, - "the same structure. Resetting read_data_fn to NULL"); + "Can't set both read_data_fn and write_data_fn in the" + " same structure"); } } #ifdef USE_FAR_KEYWORD -#ifdef _MSC_VER +# ifdef _MSC_VER void *png_far_to_near(png_structp png_ptr, png_voidp ptr, int check) { void *near_ptr; @@ -236,6 +249,6 @@ void *png_far_to_near(png_structp png_ptr, png_voidp ptr, int check) return(near_ptr); } -# endif -# endif +# endif +#endif #endif /* PNG_WRITE_SUPPORTED */ diff --git a/reactos/dll/3rdparty/libpng/pngwrite.c b/reactos/dll/3rdparty/libpng/pngwrite.c index 0252051989c..9277a951628 100644 --- a/reactos/dll/3rdparty/libpng/pngwrite.c +++ b/reactos/dll/3rdparty/libpng/pngwrite.c @@ -1,8 +1,8 @@ /* pngwrite.c - general routines to write a PNG file * - * Last changed in libpng 1.4.0 [January 3, 2010] - * Copyright (c) 1998-2010 Glenn Randers-Pehrson + * Last changed in libpng 1.5.1 [February 3, 2011] + * Copyright (c) 1998-2011 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * @@ -11,12 +11,10 @@ * and license in png.h */ -/* Get internal access to png.h */ -#define PNG_NO_PEDANTIC_WARNINGS -#include "png.h" -#ifdef PNG_WRITE_SUPPORTED #include "pngpriv.h" +#ifdef PNG_WRITE_SUPPORTED + /* Writes all the PNG information. This is the suggested way to use the * library. If you have a new chunk to add, make a function to write it, * and put it in the correct location here. If you want the chunk written @@ -33,50 +31,46 @@ png_write_info_before_PLTE(png_structp png_ptr, png_infop info_ptr) if (png_ptr == NULL || info_ptr == NULL) return; + if (!(png_ptr->mode & PNG_WROTE_INFO_BEFORE_PLTE)) { /* Write PNG signature */ png_write_sig(png_ptr); + #ifdef PNG_MNG_FEATURES_SUPPORTED if ((png_ptr->mode&PNG_HAVE_PNG_SIGNATURE) && \ - (png_ptr->mng_features_permitted)) + (png_ptr->mng_features_permitted)) { png_warning(png_ptr, "MNG features are not allowed in a PNG datastream"); png_ptr->mng_features_permitted = 0; } #endif + /* Write IHDR information. */ png_write_IHDR(png_ptr, info_ptr->width, info_ptr->height, - info_ptr->bit_depth, info_ptr->color_type, info_ptr->compression_type, - info_ptr->filter_type, + info_ptr->bit_depth, info_ptr->color_type, info_ptr->compression_type, + info_ptr->filter_type, #ifdef PNG_WRITE_INTERLACING_SUPPORTED - info_ptr->interlace_type); + info_ptr->interlace_type); #else - 0); + 0); #endif /* The rest of these check to see if the valid field has the appropriate * flag set, and if it does, writes the chunk. */ #ifdef PNG_WRITE_gAMA_SUPPORTED if (info_ptr->valid & PNG_INFO_gAMA) - { -# ifdef PNG_FLOATING_POINT_SUPPORTED - png_write_gAMA(png_ptr, info_ptr->gamma); -#else -#ifdef PNG_FIXED_POINT_SUPPORTED - png_write_gAMA_fixed(png_ptr, info_ptr->int_gamma); -# endif -#endif - } + png_write_gAMA_fixed(png_ptr, info_ptr->gamma); #endif #ifdef PNG_WRITE_sRGB_SUPPORTED if (info_ptr->valid & PNG_INFO_sRGB) png_write_sRGB(png_ptr, (int)info_ptr->srgb_intent); #endif + #ifdef PNG_WRITE_iCCP_SUPPORTED if (info_ptr->valid & PNG_INFO_iCCP) png_write_iCCP(png_ptr, info_ptr->iccp_name, PNG_COMPRESSION_TYPE_BASE, - info_ptr->iccp_profile, (int)info_ptr->iccp_proflen); + (png_charp)info_ptr->iccp_profile, (int)info_ptr->iccp_proflen); #endif #ifdef PNG_WRITE_sBIT_SUPPORTED if (info_ptr->valid & PNG_INFO_sBIT) @@ -84,24 +78,13 @@ png_write_info_before_PLTE(png_structp png_ptr, png_infop info_ptr) #endif #ifdef PNG_WRITE_cHRM_SUPPORTED if (info_ptr->valid & PNG_INFO_cHRM) - { -#ifdef PNG_FLOATING_POINT_SUPPORTED - png_write_cHRM(png_ptr, - info_ptr->x_white, info_ptr->y_white, - info_ptr->x_red, info_ptr->y_red, - info_ptr->x_green, info_ptr->y_green, - info_ptr->x_blue, info_ptr->y_blue); -#else -# ifdef PNG_FIXED_POINT_SUPPORTED png_write_cHRM_fixed(png_ptr, - info_ptr->int_x_white, info_ptr->int_y_white, - info_ptr->int_x_red, info_ptr->int_y_red, - info_ptr->int_x_green, info_ptr->int_y_green, - info_ptr->int_x_blue, info_ptr->int_y_blue); -# endif -#endif - } + info_ptr->x_white, info_ptr->y_white, + info_ptr->x_red, info_ptr->y_red, + info_ptr->x_green, info_ptr->y_green, + info_ptr->x_blue, info_ptr->y_blue); #endif + #ifdef PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED if (info_ptr->unknown_chunks_num) { @@ -114,14 +97,16 @@ png_write_info_before_PLTE(png_structp png_ptr, png_infop info_ptr) up++) { int keep = png_handle_as_unknown(png_ptr, up->name); + if (keep != PNG_HANDLE_CHUNK_NEVER && - up->location && !(up->location & PNG_HAVE_PLTE) && - !(up->location & PNG_HAVE_IDAT) && - ((up->name[3] & 0x20) || keep == PNG_HANDLE_CHUNK_ALWAYS || - (png_ptr->flags & PNG_FLAG_KEEP_UNSAFE_CHUNKS))) + up->location && !(up->location & PNG_HAVE_PLTE) && + !(up->location & PNG_HAVE_IDAT) && + ((up->name[3] & 0x20) || keep == PNG_HANDLE_CHUNK_ALWAYS || + (png_ptr->flags & PNG_FLAG_KEEP_UNSAFE_CHUNKS))) { if (up->size == 0) png_warning(png_ptr, "Writing zero-length unknown chunk"); + png_write_chunk(png_ptr, up->name, up->data, up->size); } } @@ -147,7 +132,8 @@ png_write_info(png_structp png_ptr, png_infop info_ptr) if (info_ptr->valid & PNG_INFO_PLTE) png_write_PLTE(png_ptr, info_ptr->palette, - (png_uint_32)info_ptr->num_palette); + (png_uint_32)info_ptr->num_palette); + else if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) png_error(png_ptr, "Valid palette required for paletted images"); @@ -157,59 +143,51 @@ png_write_info(png_structp png_ptr, png_infop info_ptr) #ifdef PNG_WRITE_INVERT_ALPHA_SUPPORTED /* Invert the alpha channel (in tRNS) */ if ((png_ptr->transformations & PNG_INVERT_ALPHA) && - info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) + info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) { int j; for (j = 0; j<(int)info_ptr->num_trans; j++) - info_ptr->trans_alpha[j] = (png_byte)(255 - info_ptr->trans_alpha[j]); + info_ptr->trans_alpha[j] = + (png_byte)(255 - info_ptr->trans_alpha[j]); } #endif png_write_tRNS(png_ptr, info_ptr->trans_alpha, &(info_ptr->trans_color), - info_ptr->num_trans, info_ptr->color_type); + info_ptr->num_trans, info_ptr->color_type); } #endif #ifdef PNG_WRITE_bKGD_SUPPORTED if (info_ptr->valid & PNG_INFO_bKGD) png_write_bKGD(png_ptr, &(info_ptr->background), info_ptr->color_type); #endif + #ifdef PNG_WRITE_hIST_SUPPORTED if (info_ptr->valid & PNG_INFO_hIST) png_write_hIST(png_ptr, info_ptr->hist, info_ptr->num_palette); #endif + #ifdef PNG_WRITE_oFFs_SUPPORTED if (info_ptr->valid & PNG_INFO_oFFs) png_write_oFFs(png_ptr, info_ptr->x_offset, info_ptr->y_offset, - info_ptr->offset_unit_type); + info_ptr->offset_unit_type); #endif + #ifdef PNG_WRITE_pCAL_SUPPORTED if (info_ptr->valid & PNG_INFO_pCAL) png_write_pCAL(png_ptr, info_ptr->pcal_purpose, info_ptr->pcal_X0, - info_ptr->pcal_X1, info_ptr->pcal_type, info_ptr->pcal_nparams, - info_ptr->pcal_units, info_ptr->pcal_params); + info_ptr->pcal_X1, info_ptr->pcal_type, info_ptr->pcal_nparams, + info_ptr->pcal_units, info_ptr->pcal_params); #endif -#ifdef PNG_sCAL_SUPPORTED - if (info_ptr->valid & PNG_INFO_sCAL) #ifdef PNG_WRITE_sCAL_SUPPORTED -#if defined(PNG_FLOATING_POINT_SUPPORTED) && defined(PNG_STDIO_SUPPORTED) - png_write_sCAL(png_ptr, (int)info_ptr->scal_unit, - info_ptr->scal_pixel_width, info_ptr->scal_pixel_height); -#else /* !FLOATING_POINT */ -#ifdef PNG_FIXED_POINT_SUPPORTED + if (info_ptr->valid & PNG_INFO_sCAL) png_write_sCAL_s(png_ptr, (int)info_ptr->scal_unit, info_ptr->scal_s_width, info_ptr->scal_s_height); -#endif /* FIXED_POINT */ -#endif /* FLOATING_POINT */ -#else /* !WRITE_sCAL */ - png_warning(png_ptr, - "png_write_sCAL not supported; sCAL chunk not written"); -#endif /* WRITE_sCAL */ #endif /* sCAL */ #ifdef PNG_WRITE_pHYs_SUPPORTED if (info_ptr->valid & PNG_INFO_pHYs) png_write_pHYs(png_ptr, info_ptr->x_pixels_per_unit, - info_ptr->y_pixels_per_unit, info_ptr->phys_unit_type); + info_ptr->y_pixels_per_unit, info_ptr->phys_unit_type); #endif /* pHYs */ #ifdef PNG_WRITE_tIME_SUPPORTED @@ -222,8 +200,8 @@ png_write_info(png_structp png_ptr, png_infop info_ptr) #ifdef PNG_WRITE_sPLT_SUPPORTED if (info_ptr->valid & PNG_INFO_sPLT) - for (i = 0; i < (int)info_ptr->splt_palettes_num; i++) - png_write_sPLT(png_ptr, info_ptr->splt_palettes + i); + for (i = 0; i < (int)info_ptr->splt_palettes_num; i++) + png_write_sPLT(png_ptr, info_ptr->splt_palettes + i); #endif /* sPLT */ #ifdef PNG_WRITE_TEXT_SUPPORTED @@ -231,45 +209,47 @@ png_write_info(png_structp png_ptr, png_infop info_ptr) for (i = 0; i < info_ptr->num_text; i++) { png_debug2(2, "Writing header text chunk %d, type %d", i, - info_ptr->text[i].compression); + info_ptr->text[i].compression); /* An internationalized chunk? */ if (info_ptr->text[i].compression > 0) { #ifdef PNG_WRITE_iTXt_SUPPORTED - /* Write international chunk */ - png_write_iTXt(png_ptr, - info_ptr->text[i].compression, - info_ptr->text[i].key, - info_ptr->text[i].lang, - info_ptr->text[i].lang_key, - info_ptr->text[i].text); + /* Write international chunk */ + png_write_iTXt(png_ptr, + info_ptr->text[i].compression, + info_ptr->text[i].key, + info_ptr->text[i].lang, + info_ptr->text[i].lang_key, + info_ptr->text[i].text); #else png_warning(png_ptr, "Unable to write international text"); #endif /* Mark this chunk as written */ info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR; } + /* If we want a compressed text chunk */ else if (info_ptr->text[i].compression == PNG_TEXT_COMPRESSION_zTXt) { #ifdef PNG_WRITE_zTXt_SUPPORTED /* Write compressed chunk */ png_write_zTXt(png_ptr, info_ptr->text[i].key, - info_ptr->text[i].text, 0, - info_ptr->text[i].compression); + info_ptr->text[i].text, 0, + info_ptr->text[i].compression); #else png_warning(png_ptr, "Unable to write compressed text"); #endif /* Mark this chunk as written */ info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_zTXt_WR; } + else if (info_ptr->text[i].compression == PNG_TEXT_COMPRESSION_NONE) { #ifdef PNG_WRITE_tEXt_SUPPORTED /* Write uncompressed chunk */ png_write_tEXt(png_ptr, info_ptr->text[i].key, - info_ptr->text[i].text, - 0); + info_ptr->text[i].text, + 0); /* Mark this chunk as written */ info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR; #else @@ -293,10 +273,10 @@ png_write_info(png_structp png_ptr, png_infop info_ptr) { int keep = png_handle_as_unknown(png_ptr, up->name); if (keep != PNG_HANDLE_CHUNK_NEVER && - up->location && (up->location & PNG_HAVE_PLTE) && - !(up->location & PNG_HAVE_IDAT) && - ((up->name[3] & 0x20) || keep == PNG_HANDLE_CHUNK_ALWAYS || - (png_ptr->flags & PNG_FLAG_KEEP_UNSAFE_CHUNKS))) + up->location && (up->location & PNG_HAVE_PLTE) && + !(up->location & PNG_HAVE_IDAT) && + ((up->name[3] & 0x20) || keep == PNG_HANDLE_CHUNK_ALWAYS || + (png_ptr->flags & PNG_FLAG_KEEP_UNSAFE_CHUNKS))) { png_write_chunk(png_ptr, up->name, up->data, up->size); } @@ -317,6 +297,7 @@ png_write_end(png_structp png_ptr, png_infop info_ptr) if (png_ptr == NULL) return; + if (!(png_ptr->mode & PNG_HAVE_IDAT)) png_error(png_ptr, "No IDATs written into file"); @@ -329,8 +310,9 @@ png_write_end(png_structp png_ptr, png_infop info_ptr) #ifdef PNG_WRITE_tIME_SUPPORTED /* Check to see if user has supplied a time chunk */ if ((info_ptr->valid & PNG_INFO_tIME) && - !(png_ptr->mode & PNG_WROTE_tIME)) + !(png_ptr->mode & PNG_WROTE_tIME)) png_write_tIME(png_ptr, &(info_ptr->mod_time)); + #endif #ifdef PNG_WRITE_TEXT_SUPPORTED /* Loop through comment chunks */ @@ -344,36 +326,38 @@ png_write_end(png_structp png_ptr, png_infop info_ptr) #ifdef PNG_WRITE_iTXt_SUPPORTED /* Write international chunk */ png_write_iTXt(png_ptr, - info_ptr->text[i].compression, - info_ptr->text[i].key, - info_ptr->text[i].lang, - info_ptr->text[i].lang_key, - info_ptr->text[i].text); + info_ptr->text[i].compression, + info_ptr->text[i].key, + info_ptr->text[i].lang, + info_ptr->text[i].lang_key, + info_ptr->text[i].text); #else png_warning(png_ptr, "Unable to write international text"); #endif /* Mark this chunk as written */ info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR; } + else if (info_ptr->text[i].compression >= PNG_TEXT_COMPRESSION_zTXt) { #ifdef PNG_WRITE_zTXt_SUPPORTED /* Write compressed chunk */ png_write_zTXt(png_ptr, info_ptr->text[i].key, - info_ptr->text[i].text, 0, - info_ptr->text[i].compression); + info_ptr->text[i].text, 0, + info_ptr->text[i].compression); #else png_warning(png_ptr, "Unable to write compressed text"); #endif /* Mark this chunk as written */ info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_zTXt_WR; } + else if (info_ptr->text[i].compression == PNG_TEXT_COMPRESSION_NONE) { #ifdef PNG_WRITE_tEXt_SUPPORTED /* Write uncompressed chunk */ png_write_tEXt(png_ptr, info_ptr->text[i].key, - info_ptr->text[i].text, 0); + info_ptr->text[i].text, 0); #else png_warning(png_ptr, "Unable to write uncompressed text"); #endif @@ -396,9 +380,9 @@ png_write_end(png_structp png_ptr, png_infop info_ptr) { int keep = png_handle_as_unknown(png_ptr, up->name); if (keep != PNG_HANDLE_CHUNK_NEVER && - up->location && (up->location & PNG_AFTER_IDAT) && - ((up->name[3] & 0x20) || keep == PNG_HANDLE_CHUNK_ALWAYS || - (png_ptr->flags & PNG_FLAG_KEEP_UNSAFE_CHUNKS))) + up->location && (up->location & PNG_AFTER_IDAT) && + ((up->name[3] & 0x20) || keep == PNG_HANDLE_CHUNK_ALWAYS || + (png_ptr->flags & PNG_FLAG_KEEP_UNSAFE_CHUNKS))) { png_write_chunk(png_ptr, up->name, up->data, up->size); } @@ -428,7 +412,7 @@ png_write_end(png_structp png_ptr, png_infop info_ptr) #ifdef PNG_CONVERT_tIME_SUPPORTED /* "tm" structure is not supported on WindowsCE */ void PNGAPI -png_convert_from_struct_tm(png_timep ptime, struct tm FAR * ttime) +png_convert_from_struct_tm(png_timep ptime, PNG_CONST struct tm FAR * ttime) { png_debug(1, "in png_convert_from_struct_tm"); @@ -453,20 +437,22 @@ png_convert_from_time_t(png_timep ptime, time_t ttime) #endif /* Initialize png_ptr structure, and allocate any memory needed */ -png_structp PNGAPI -png_create_write_struct(png_const_charp user_png_ver, png_voidp error_ptr, - png_error_ptr error_fn, png_error_ptr warn_fn) +PNG_FUNCTION(png_structp,PNGAPI +png_create_write_struct,(png_const_charp user_png_ver, png_voidp error_ptr, + png_error_ptr error_fn, png_error_ptr warn_fn),PNG_ALLOCATED) { #ifdef PNG_USER_MEM_SUPPORTED return (png_create_write_struct_2(user_png_ver, error_ptr, error_fn, - warn_fn, NULL, NULL, NULL)); + warn_fn, NULL, NULL, NULL)); } /* Alternate initialize png_ptr structure, and allocate any memory needed */ -png_structp PNGAPI -png_create_write_struct_2(png_const_charp user_png_ver, png_voidp error_ptr, - png_error_ptr error_fn, png_error_ptr warn_fn, png_voidp mem_ptr, - png_malloc_ptr malloc_fn, png_free_ptr free_fn) +static void png_reset_filter_heuristics(png_structp png_ptr); /* forward decl */ + +PNG_FUNCTION(png_structp,PNGAPI +png_create_write_struct_2,(png_const_charp user_png_ver, png_voidp error_ptr, + png_error_ptr error_fn, png_error_ptr warn_fn, png_voidp mem_ptr, + png_malloc_ptr malloc_fn, png_free_ptr free_fn),PNG_ALLOCATED) { #endif /* PNG_USER_MEM_SUPPORTED */ volatile int png_cleanup_needed = 0; @@ -476,7 +462,7 @@ png_create_write_struct_2(png_const_charp user_png_ver, png_voidp error_ptr, png_structp png_ptr; #ifdef PNG_SETJMP_SUPPORTED #ifdef USE_FAR_KEYWORD - jmp_buf jmpbuf; + jmp_buf png_jmpbuf; #endif #endif int i; @@ -485,7 +471,7 @@ png_create_write_struct_2(png_const_charp user_png_ver, png_voidp error_ptr, #ifdef PNG_USER_MEM_SUPPORTED png_ptr = (png_structp)png_create_struct_2(PNG_STRUCT_PNG, - (png_malloc_ptr)malloc_fn, (png_voidp)mem_ptr); + (png_malloc_ptr)malloc_fn, (png_voidp)mem_ptr); #else png_ptr = (png_structp)png_create_struct(PNG_STRUCT_PNG); #endif /* PNG_USER_MEM_SUPPORTED */ @@ -503,12 +489,12 @@ png_create_write_struct_2(png_const_charp user_png_ver, png_voidp error_ptr, encounter a png_error() will longjmp here. Since the jmpbuf is then meaningless we abort instead of returning. */ #ifdef USE_FAR_KEYWORD - if (setjmp(jmpbuf)) + if (setjmp(png_jmpbuf)) #else if (setjmp(png_jmpbuf(png_ptr))) /* sets longjmp to match setjmp */ #endif #ifdef USE_FAR_KEYWORD - png_memcpy(png_jmpbuf(png_ptr), jmpbuf, png_sizeof(jmp_buf)); + png_memcpy(png_jmpbuf(png_ptr), png_jmpbuf, png_sizeof(jmp_buf)); #endif PNG_ABORT(); #endif @@ -539,38 +525,40 @@ png_create_write_struct_2(png_const_charp user_png_ver, png_voidp error_ptr, (user_png_ver[0] == '1' && user_png_ver[2] != png_libpng_ver[2]) || (user_png_ver[0] == '0' && user_png_ver[2] < '9')) { -#ifdef PNG_STDIO_SUPPORTED +#ifdef PNG_CONSOLE_IO_SUPPORTED char msg[80]; + if (user_png_ver) { - png_snprintf(msg, 80, - "Application was compiled with png.h from libpng-%.20s", - user_png_ver); - png_warning(png_ptr, msg); - } - png_snprintf(msg, 80, - "Application is running with png.c from libpng-%.20s", - png_libpng_ver); - png_warning(png_ptr, msg); + png_snprintf2(msg, 80, + "Application built with libpng-%.20s" + " but running with %.20s", + user_png_ver, + png_libpng_ver); + png_warning(png_ptr, msg); + } +#else + png_warning(png_ptr, + "Incompatible libpng version in application and library"); #endif #ifdef PNG_ERROR_NUMBERS_SUPPORTED png_ptr->flags = 0; #endif - png_warning(png_ptr, - "Incompatible libpng version in application and library"); png_cleanup_needed = 1; } } /* Initialize zbuf - compression buffer */ png_ptr->zbuf_size = PNG_ZBUF_SIZE; + if (!png_cleanup_needed) { png_ptr->zbuf = (png_bytep)png_malloc_warn(png_ptr, - png_ptr->zbuf_size); + png_ptr->zbuf_size); if (png_ptr->zbuf == NULL) png_cleanup_needed = 1; } + if (png_cleanup_needed) { /* Clean up PNG structure and deallocate any memory. */ @@ -578,7 +566,7 @@ png_create_write_struct_2(png_const_charp user_png_ver, png_voidp error_ptr, png_ptr->zbuf = NULL; #ifdef PNG_USER_MEM_SUPPORTED png_destroy_struct_2((png_voidp)png_ptr, - (png_free_ptr)free_fn, (png_voidp)mem_ptr); + (png_free_ptr)free_fn, (png_voidp)mem_ptr); #else png_destroy_struct((png_voidp)png_ptr); #endif @@ -588,8 +576,7 @@ png_create_write_struct_2(png_const_charp user_png_ver, png_voidp error_ptr, png_set_write_fn(png_ptr, NULL, NULL, NULL); #ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED - png_set_filter_heuristics(png_ptr, PNG_FILTER_HEURISTIC_DEFAULT, - 1, NULL, NULL); + png_reset_filter_heuristics(png_ptr); #endif return (png_ptr); @@ -603,7 +590,7 @@ png_create_write_struct_2(png_const_charp user_png_ver, png_voidp error_ptr, */ void PNGAPI png_write_rows(png_structp png_ptr, png_bytepp row, - png_uint_32 num_rows) + png_uint_32 num_rows) { png_uint_32 i; /* row counter */ png_bytepp rp; /* row pointer */ @@ -656,12 +643,12 @@ png_write_image(png_structp png_ptr, png_bytepp image) /* Called by user to write a row of image data */ void PNGAPI -png_write_row(png_structp png_ptr, png_bytep row) +png_write_row(png_structp png_ptr, png_const_bytep row) { if (png_ptr == NULL) return; - png_debug2(1, "in png_write_row (row %ld, pass %d)", + png_debug2(1, "in png_write_row (row %u, pass %d)", png_ptr->row_number, png_ptr->pass); /* Initialize transformations and other stuff if first time */ @@ -670,13 +657,14 @@ png_write_row(png_structp png_ptr, png_bytep row) /* Make sure we wrote the header info */ if (!(png_ptr->mode & PNG_WROTE_INFO_BEFORE_PLTE)) png_error(png_ptr, - "png_write_info was never called before png_write_row"); + "png_write_info was never called before png_write_row"); /* Check for transforms that have been set but were defined out */ #if !defined(PNG_WRITE_INVERT_SUPPORTED) && defined(PNG_READ_INVERT_SUPPORTED) if (png_ptr->transformations & PNG_INVERT_MONO) png_warning(png_ptr, "PNG_WRITE_INVERT_SUPPORTED is not defined"); #endif + #if !defined(PNG_WRITE_FILLER_SUPPORTED) && defined(PNG_READ_FILLER_SUPPORTED) if (png_ptr->transformations & PNG_FILLER) png_warning(png_ptr, "PNG_WRITE_FILLER_SUPPORTED is not defined"); @@ -687,18 +675,22 @@ png_write_row(png_structp png_ptr, png_bytep row) png_warning(png_ptr, "PNG_WRITE_PACKSWAP_SUPPORTED is not defined"); #endif + #if !defined(PNG_WRITE_PACK_SUPPORTED) && defined(PNG_READ_PACK_SUPPORTED) if (png_ptr->transformations & PNG_PACK) png_warning(png_ptr, "PNG_WRITE_PACK_SUPPORTED is not defined"); #endif + #if !defined(PNG_WRITE_SHIFT_SUPPORTED) && defined(PNG_READ_SHIFT_SUPPORTED) if (png_ptr->transformations & PNG_SHIFT) png_warning(png_ptr, "PNG_WRITE_SHIFT_SUPPORTED is not defined"); #endif + #if !defined(PNG_WRITE_BGR_SUPPORTED) && defined(PNG_READ_BGR_SUPPORTED) if (png_ptr->transformations & PNG_BGR) png_warning(png_ptr, "PNG_WRITE_BGR_SUPPORTED is not defined"); #endif + #if !defined(PNG_WRITE_SWAP_SUPPORTED) && defined(PNG_READ_SWAP_SUPPORTED) if (png_ptr->transformations & PNG_SWAP_BYTES) png_warning(png_ptr, "PNG_WRITE_SWAP_SUPPORTED is not defined"); @@ -720,6 +712,7 @@ png_write_row(png_structp png_ptr, png_bytep row) return; } break; + case 1: if ((png_ptr->row_number & 0x07) || png_ptr->width < 5) { @@ -727,6 +720,7 @@ png_write_row(png_structp png_ptr, png_bytep row) return; } break; + case 2: if ((png_ptr->row_number & 0x07) != 4) { @@ -734,6 +728,7 @@ png_write_row(png_structp png_ptr, png_bytep row) return; } break; + case 3: if ((png_ptr->row_number & 0x03) || png_ptr->width < 3) { @@ -741,6 +736,7 @@ png_write_row(png_structp png_ptr, png_bytep row) return; } break; + case 4: if ((png_ptr->row_number & 0x03) != 2) { @@ -748,6 +744,7 @@ png_write_row(png_structp png_ptr, png_bytep row) return; } break; + case 5: if ((png_ptr->row_number & 0x01) || png_ptr->width < 2) { @@ -755,6 +752,7 @@ png_write_row(png_structp png_ptr, png_bytep row) return; } break; + case 6: if (!(png_ptr->row_number & 0x01)) { @@ -762,6 +760,9 @@ png_write_row(png_structp png_ptr, png_bytep row) return; } break; + + default: /* error: ignore it */ + break; } } #endif @@ -778,11 +779,12 @@ png_write_row(png_structp png_ptr, png_bytep row) png_ptr->row_info.width); png_debug1(3, "row_info->color_type = %d", png_ptr->row_info.color_type); - png_debug1(3, "row_info->width = %lu", png_ptr->row_info.width); + png_debug1(3, "row_info->width = %u", png_ptr->row_info.width); png_debug1(3, "row_info->channels = %d", png_ptr->row_info.channels); png_debug1(3, "row_info->bit_depth = %d", png_ptr->row_info.bit_depth); png_debug1(3, "row_info->pixel_depth = %d", png_ptr->row_info.pixel_depth); - png_debug1(3, "row_info->rowbytes = %lu", png_ptr->row_info.rowbytes); + png_debug1(3, "row_info->rowbytes = %lu", + (unsigned long)png_ptr->row_info.rowbytes); /* Copy user's row into buffer, leaving room for filter byte. */ png_memcpy(png_ptr->row_buf + 1, row, png_ptr->row_info.rowbytes); @@ -790,10 +792,10 @@ png_write_row(png_structp png_ptr, png_bytep row) #ifdef PNG_WRITE_INTERLACING_SUPPORTED /* Handle interlacing */ if (png_ptr->interlaced && png_ptr->pass < 6 && - (png_ptr->transformations & PNG_INTERLACE)) + (png_ptr->transformations & PNG_INTERLACE)) { png_do_write_interlace(&(png_ptr->row_info), - png_ptr->row_buf + 1, png_ptr->pass); + png_ptr->row_buf + 1, png_ptr->pass); /* This should always get caught above, but still ... */ if (!(png_ptr->row_info.width)) { @@ -818,7 +820,7 @@ png_write_row(png_structp png_ptr, png_bytep row) * 5. The color_type is RGB or RGBA */ if ((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) && - (png_ptr->filter_type == PNG_INTRAPIXEL_DIFFERENCING)) + (png_ptr->filter_type == PNG_INTRAPIXEL_DIFFERENCING)) { /* Intrapixel differencing */ png_do_write_intrapixel(&(png_ptr->row_info), png_ptr->row_buf + 1); @@ -841,6 +843,7 @@ png_set_flush(png_structp png_ptr, int nrows) if (png_ptr == NULL) return; + png_ptr->flush_dist = (nrows < 0 ? 0 : nrows); } @@ -854,6 +857,7 @@ png_write_flush(png_structp png_ptr) if (png_ptr == NULL) return; + /* We have already written out all of the data */ if (png_ptr->row_number >= png_ptr->num_rows) return; @@ -871,6 +875,7 @@ png_write_flush(png_structp png_ptr) { if (png_ptr->zstream.msg != NULL) png_error(png_ptr, png_ptr->zstream.msg); + else png_error(png_ptr, "zlib error"); } @@ -878,20 +883,19 @@ png_write_flush(png_structp png_ptr) if (!(png_ptr->zstream.avail_out)) { /* Write the IDAT and reset the zlib output buffer */ - png_write_IDAT(png_ptr, png_ptr->zbuf, - png_ptr->zbuf_size); + png_write_IDAT(png_ptr, png_ptr->zbuf, png_ptr->zbuf_size); png_ptr->zstream.next_out = png_ptr->zbuf; png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; wrote_IDAT = 1; } - } while(wrote_IDAT == 1); + } while (wrote_IDAT == 1); /* If there is any data left to be output, write it into a new IDAT */ if (png_ptr->zbuf_size != png_ptr->zstream.avail_out) { /* Write the IDAT and reset the zlib output buffer */ png_write_IDAT(png_ptr, png_ptr->zbuf, - png_ptr->zbuf_size - png_ptr->zstream.avail_out); + png_ptr->zbuf_size - png_ptr->zstream.avail_out); png_ptr->zstream.next_out = png_ptr->zbuf; png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; } @@ -937,20 +941,20 @@ png_destroy_write_struct(png_structpp png_ptr_ptr, png_infopp info_ptr_ptr) { if (png_ptr != NULL) { - png_free_data(png_ptr, info_ptr, PNG_FREE_ALL, -1); + png_free_data(png_ptr, info_ptr, PNG_FREE_ALL, -1); #ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED - if (png_ptr->num_chunk_list) - { - png_free(png_ptr, png_ptr->chunk_list); - png_ptr->num_chunk_list = 0; - } + if (png_ptr->num_chunk_list) + { + png_free(png_ptr, png_ptr->chunk_list); + png_ptr->num_chunk_list = 0; + } #endif } #ifdef PNG_USER_MEM_SUPPORTED png_destroy_struct_2((png_voidp)info_ptr, (png_free_ptr)free_fn, - (png_voidp)mem_ptr); + (png_voidp)mem_ptr); #else png_destroy_struct((png_voidp)info_ptr); #endif @@ -962,7 +966,7 @@ png_destroy_write_struct(png_structpp png_ptr_ptr, png_infopp info_ptr_ptr) png_write_destroy(png_ptr); #ifdef PNG_USER_MEM_SUPPORTED png_destroy_struct_2((png_voidp)png_ptr, (png_free_ptr)free_fn, - (png_voidp)mem_ptr); + (png_voidp)mem_ptr); #else png_destroy_struct((png_voidp)png_ptr); #endif @@ -1006,16 +1010,15 @@ png_write_destroy(png_structp png_ptr) #endif #ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED - png_free(png_ptr, png_ptr->prev_filters); - png_free(png_ptr, png_ptr->filter_weights); - png_free(png_ptr, png_ptr->inv_filter_weights); + /* Use this to save a little code space, it doesn't free the filter_costs */ + png_reset_filter_heuristics(png_ptr); png_free(png_ptr, png_ptr->filter_costs); png_free(png_ptr, png_ptr->inv_filter_costs); #endif #ifdef PNG_SETJMP_SUPPORTED /* Reset structure */ - png_memcpy(tmp_jmp, png_ptr->jmpbuf, png_sizeof(jmp_buf)); + png_memcpy(tmp_jmp, png_ptr->png_jmpbuf, png_sizeof(jmp_buf)); #endif error_fn = png_ptr->error_fn; @@ -1035,7 +1038,7 @@ png_write_destroy(png_structp png_ptr) #endif #ifdef PNG_SETJMP_SUPPORTED - png_memcpy(png_ptr->jmpbuf, tmp_jmp, png_sizeof(jmp_buf)); + png_memcpy(png_ptr->png_jmpbuf, tmp_jmp, png_sizeof(jmp_buf)); #endif } @@ -1047,10 +1050,12 @@ png_set_filter(png_structp png_ptr, int method, int filters) if (png_ptr == NULL) return; + #ifdef PNG_MNG_FEATURES_SUPPORTED if ((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) && - (method == PNG_INTRAPIXEL_DIFFERENCING)) - method = PNG_FILTER_TYPE_BASE; + (method == PNG_INTRAPIXEL_DIFFERENCING)) + method = PNG_FILTER_TYPE_BASE; + #endif if (method == PNG_FILTER_TYPE_BASE) { @@ -1062,19 +1067,26 @@ png_set_filter(png_structp png_ptr, int method, int filters) case 7: png_warning(png_ptr, "Unknown row filter for method 0"); #endif /* PNG_WRITE_FILTER_SUPPORTED */ case PNG_FILTER_VALUE_NONE: - png_ptr->do_filter = PNG_FILTER_NONE; break; + png_ptr->do_filter = PNG_FILTER_NONE; break; + #ifdef PNG_WRITE_FILTER_SUPPORTED case PNG_FILTER_VALUE_SUB: - png_ptr->do_filter = PNG_FILTER_SUB; break; + png_ptr->do_filter = PNG_FILTER_SUB; break; + case PNG_FILTER_VALUE_UP: - png_ptr->do_filter = PNG_FILTER_UP; break; + png_ptr->do_filter = PNG_FILTER_UP; break; + case PNG_FILTER_VALUE_AVG: - png_ptr->do_filter = PNG_FILTER_AVG; break; + png_ptr->do_filter = PNG_FILTER_AVG; break; + case PNG_FILTER_VALUE_PAETH: - png_ptr->do_filter = PNG_FILTER_PAETH; break; - default: png_ptr->do_filter = (png_byte)filters; break; + png_ptr->do_filter = PNG_FILTER_PAETH; break; + + default: + png_ptr->do_filter = (png_byte)filters; break; #else - default: png_warning(png_ptr, "Unknown row filter for method 0"); + default: + png_warning(png_ptr, "Unknown row filter for method 0"); #endif /* PNG_WRITE_FILTER_SUPPORTED */ } @@ -1093,7 +1105,7 @@ png_set_filter(png_structp png_ptr, int method, int filters) if ((png_ptr->do_filter & PNG_FILTER_SUB) && png_ptr->sub_row == NULL) { png_ptr->sub_row = (png_bytep)png_malloc(png_ptr, - (png_ptr->rowbytes + 1)); + (png_ptr->rowbytes + 1)); png_ptr->sub_row[0] = PNG_FILTER_VALUE_SUB; } @@ -1102,12 +1114,14 @@ png_set_filter(png_structp png_ptr, int method, int filters) if (png_ptr->prev_row == NULL) { png_warning(png_ptr, "Can't add Up filter after starting"); - png_ptr->do_filter &= ~PNG_FILTER_UP; + png_ptr->do_filter = (png_byte)(png_ptr->do_filter & + ~PNG_FILTER_UP); } + else { png_ptr->up_row = (png_bytep)png_malloc(png_ptr, - (png_ptr->rowbytes + 1)); + (png_ptr->rowbytes + 1)); png_ptr->up_row[0] = PNG_FILTER_VALUE_UP; } } @@ -1117,12 +1131,14 @@ png_set_filter(png_structp png_ptr, int method, int filters) if (png_ptr->prev_row == NULL) { png_warning(png_ptr, "Can't add Average filter after starting"); - png_ptr->do_filter &= ~PNG_FILTER_AVG; + png_ptr->do_filter = (png_byte)(png_ptr->do_filter & + ~PNG_FILTER_AVG); } + else { png_ptr->avg_row = (png_bytep)png_malloc(png_ptr, - (png_ptr->rowbytes + 1)); + (png_ptr->rowbytes + 1)); png_ptr->avg_row[0] = PNG_FILTER_VALUE_AVG; } } @@ -1135,10 +1151,11 @@ png_set_filter(png_structp png_ptr, int method, int filters) png_warning(png_ptr, "Can't add Paeth filter after starting"); png_ptr->do_filter &= (png_byte)(~PNG_FILTER_PAETH); } + else { png_ptr->paeth_row = (png_bytep)png_malloc(png_ptr, - (png_ptr->rowbytes + 1)); + (png_ptr->rowbytes + 1)); png_ptr->paeth_row[0] = PNG_FILTER_VALUE_PAETH; } } @@ -1160,123 +1177,242 @@ png_set_filter(png_structp png_ptr, int method, int filters) * better compression. */ #ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED /* GRR 970116 */ -void PNGAPI -png_set_filter_heuristics(png_structp png_ptr, int heuristic_method, - int num_weights, png_doublep filter_weights, - png_doublep filter_costs) +/* Convenience reset API. */ +static void +png_reset_filter_heuristics(png_structp png_ptr) { - int i; + /* Clear out any old values in the 'weights' - this must be done because if + * the app calls set_filter_heuristics multiple times with different + * 'num_weights' values we would otherwise potentially have wrong sized + * arrays. + */ + png_ptr->num_prev_filters = 0; + png_ptr->heuristic_method = PNG_FILTER_HEURISTIC_UNWEIGHTED; + if (png_ptr->prev_filters != NULL) + { + png_bytep old = png_ptr->prev_filters; + png_ptr->prev_filters = NULL; + png_free(png_ptr, old); + } + if (png_ptr->filter_weights != NULL) + { + png_uint_16p old = png_ptr->filter_weights; + png_ptr->filter_weights = NULL; + png_free(png_ptr, old); + } - png_debug(1, "in png_set_filter_heuristics"); + if (png_ptr->inv_filter_weights != NULL) + { + png_uint_16p old = png_ptr->inv_filter_weights; + png_ptr->inv_filter_weights = NULL; + png_free(png_ptr, old); + } + /* Leave the filter_costs - this array is fixed size. */ +} + +static int +png_init_filter_heuristics(png_structp png_ptr, int heuristic_method, + int num_weights) +{ if (png_ptr == NULL) - return; - if (heuristic_method >= PNG_FILTER_HEURISTIC_LAST) - { - png_warning(png_ptr, "Unknown filter heuristic method"); - return; - } + return 0; - if (heuristic_method == PNG_FILTER_HEURISTIC_DEFAULT) - { - heuristic_method = PNG_FILTER_HEURISTIC_UNWEIGHTED; - } + /* Clear out the arrays */ + png_reset_filter_heuristics(png_ptr); - if (num_weights < 0 || filter_weights == NULL || - heuristic_method == PNG_FILTER_HEURISTIC_UNWEIGHTED) + /* Check arguments; the 'reset' function makes the correct settings for the + * unweighted case, but we must handle the weight case by initializing the + * arrays for the caller. + */ + if (heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED) { - num_weights = 0; - } + int i; - png_ptr->num_prev_filters = (png_byte)num_weights; - png_ptr->heuristic_method = (png_byte)heuristic_method; - - if (num_weights > 0) - { - if (png_ptr->prev_filters == NULL) + if (num_weights > 0) { png_ptr->prev_filters = (png_bytep)png_malloc(png_ptr, - (png_uint_32)(png_sizeof(png_byte) * num_weights)); + (png_uint_32)(png_sizeof(png_byte) * num_weights)); /* To make sure that the weighting starts out fairly */ for (i = 0; i < num_weights; i++) { png_ptr->prev_filters[i] = 255; } - } - if (png_ptr->filter_weights == NULL) - { png_ptr->filter_weights = (png_uint_16p)png_malloc(png_ptr, - (png_uint_32)(png_sizeof(png_uint_16) * num_weights)); + (png_uint_32)(png_sizeof(png_uint_16) * num_weights)); png_ptr->inv_filter_weights = (png_uint_16p)png_malloc(png_ptr, - (png_uint_32)(png_sizeof(png_uint_16) * num_weights)); + (png_uint_32)(png_sizeof(png_uint_16) * num_weights)); + for (i = 0; i < num_weights; i++) { png_ptr->inv_filter_weights[i] = png_ptr->filter_weights[i] = PNG_WEIGHT_FACTOR; } + + /* Safe to set this now */ + png_ptr->num_prev_filters = (png_byte)num_weights; } - for (i = 0; i < num_weights; i++) + /* If, in the future, there are other filter methods, this would + * need to be based on png_ptr->filter. + */ + if (png_ptr->filter_costs == NULL) { - if (filter_weights[i] < 0.0) - { - png_ptr->inv_filter_weights[i] = - png_ptr->filter_weights[i] = PNG_WEIGHT_FACTOR; - } - else - { - png_ptr->inv_filter_weights[i] = - (png_uint_16)((double)PNG_WEIGHT_FACTOR*filter_weights[i]+0.5); - png_ptr->filter_weights[i] = - (png_uint_16)((double)PNG_WEIGHT_FACTOR/filter_weights[i]+0.5); - } + png_ptr->filter_costs = (png_uint_16p)png_malloc(png_ptr, + (png_uint_32)(png_sizeof(png_uint_16) * PNG_FILTER_VALUE_LAST)); + + png_ptr->inv_filter_costs = (png_uint_16p)png_malloc(png_ptr, + (png_uint_32)(png_sizeof(png_uint_16) * PNG_FILTER_VALUE_LAST)); } - } - - /* If, in the future, there are other filter methods, this would - * need to be based on png_ptr->filter. - */ - if (png_ptr->filter_costs == NULL) - { - png_ptr->filter_costs = (png_uint_16p)png_malloc(png_ptr, - (png_uint_32)(png_sizeof(png_uint_16) * PNG_FILTER_VALUE_LAST)); - - png_ptr->inv_filter_costs = (png_uint_16p)png_malloc(png_ptr, - (png_uint_32)(png_sizeof(png_uint_16) * PNG_FILTER_VALUE_LAST)); for (i = 0; i < PNG_FILTER_VALUE_LAST; i++) { png_ptr->inv_filter_costs[i] = png_ptr->filter_costs[i] = PNG_COST_FACTOR; } - } - /* Here is where we set the relative costs of the different filters. We - * should take the desired compression level into account when setting - * the costs, so that Paeth, for instance, has a high relative cost at low - * compression levels, while it has a lower relative cost at higher - * compression settings. The filter types are in order of increasing - * relative cost, so it would be possible to do this with an algorithm. - */ - for (i = 0; i < PNG_FILTER_VALUE_LAST; i++) + /* All the arrays are inited, safe to set this: */ + png_ptr->heuristic_method = PNG_FILTER_HEURISTIC_WEIGHTED; + + /* Return the 'ok' code. */ + return 1; + } + else if (heuristic_method == PNG_FILTER_HEURISTIC_DEFAULT || + heuristic_method == PNG_FILTER_HEURISTIC_UNWEIGHTED) { - if (filter_costs == NULL || filter_costs[i] < 0.0) + return 1; + } + else + { + png_warning(png_ptr, "Unknown filter heuristic method"); + return 0; + } +} + +/* Provide floating and fixed point APIs */ +#ifdef PNG_FLOATING_POINT_SUPPORTED +void PNGAPI +png_set_filter_heuristics(png_structp png_ptr, int heuristic_method, + int num_weights, png_const_doublep filter_weights, + png_const_doublep filter_costs) +{ + png_debug(1, "in png_set_filter_heuristics"); + + /* The internal API allocates all the arrays and ensures that the elements of + * those arrays are set to the default value. + */ + if (!png_init_filter_heuristics(png_ptr, heuristic_method, num_weights)) + return; + + /* If using the weighted method copy in the weights. */ + if (heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED) + { + int i; + for (i = 0; i < num_weights; i++) { - png_ptr->inv_filter_costs[i] = - png_ptr->filter_costs[i] = PNG_COST_FACTOR; + if (filter_weights[i] <= 0.0) + { + png_ptr->inv_filter_weights[i] = + png_ptr->filter_weights[i] = PNG_WEIGHT_FACTOR; + } + + else + { + png_ptr->inv_filter_weights[i] = + (png_uint_16)(PNG_WEIGHT_FACTOR*filter_weights[i]+.5); + + png_ptr->filter_weights[i] = + (png_uint_16)(PNG_WEIGHT_FACTOR/filter_weights[i]+.5); + } } - else if (filter_costs[i] >= 1.0) + + /* Here is where we set the relative costs of the different filters. We + * should take the desired compression level into account when setting + * the costs, so that Paeth, for instance, has a high relative cost at low + * compression levels, while it has a lower relative cost at higher + * compression settings. The filter types are in order of increasing + * relative cost, so it would be possible to do this with an algorithm. + */ + for (i = 0; i < PNG_FILTER_VALUE_LAST; i++) if (filter_costs[i] >= 1.0) { png_ptr->inv_filter_costs[i] = - (png_uint_16)((double)PNG_COST_FACTOR / filter_costs[i] + 0.5); + (png_uint_16)(PNG_COST_FACTOR / filter_costs[i] + .5); + png_ptr->filter_costs[i] = - (png_uint_16)((double)PNG_COST_FACTOR * filter_costs[i] + 0.5); + (png_uint_16)(PNG_COST_FACTOR * filter_costs[i] + .5); } } } +#endif /* FLOATING_POINT */ + +#ifdef PNG_FIXED_POINT_SUPPORTED +void PNGAPI +png_set_filter_heuristics_fixed(png_structp png_ptr, int heuristic_method, + int num_weights, png_const_fixed_point_p filter_weights, + png_const_fixed_point_p filter_costs) +{ + png_debug(1, "in png_set_filter_heuristics_fixed"); + + /* The internal API allocates all the arrays and ensures that the elements of + * those arrays are set to the default value. + */ + if (!png_init_filter_heuristics(png_ptr, heuristic_method, num_weights)) + return; + + /* If using the weighted method copy in the weights. */ + if (heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED) + { + int i; + for (i = 0; i < num_weights; i++) + { + if (filter_weights[i] <= 0) + { + png_ptr->inv_filter_weights[i] = + png_ptr->filter_weights[i] = PNG_WEIGHT_FACTOR; + } + + else + { + png_ptr->inv_filter_weights[i] = (png_uint_16) + ((PNG_WEIGHT_FACTOR*filter_weights[i]+PNG_FP_HALF)/PNG_FP_1); + + png_ptr->filter_weights[i] = (png_uint_16)((PNG_WEIGHT_FACTOR* + PNG_FP_1+(filter_weights[i]/2))/filter_weights[i]); + } + } + + /* Here is where we set the relative costs of the different filters. We + * should take the desired compression level into account when setting + * the costs, so that Paeth, for instance, has a high relative cost at low + * compression levels, while it has a lower relative cost at higher + * compression settings. The filter types are in order of increasing + * relative cost, so it would be possible to do this with an algorithm. + */ + for (i = 0; i < PNG_FILTER_VALUE_LAST; i++) + if (filter_costs[i] >= PNG_FP_1) + { + png_uint_32 tmp; + + /* Use a 32 bit unsigned temporary here because otherwise the + * intermediate value will be a 32 bit *signed* integer (ANSI rules) + * and this will get the wrong answer on division. + */ + tmp = PNG_COST_FACTOR*PNG_FP_1 + (filter_costs[i]/2); + tmp /= filter_costs[i]; + + png_ptr->inv_filter_costs[i] = (png_uint_16)tmp; + + tmp = PNG_COST_FACTOR * filter_costs[i] + PNG_FP_HALF; + tmp /= PNG_FP_1; + + png_ptr->filter_costs[i] = (png_uint_16)tmp; + } + } +} +#endif /* FIXED_POINT */ #endif /* PNG_WRITE_WEIGHTED_FILTER_SUPPORTED */ void PNGAPI @@ -1286,6 +1422,7 @@ png_set_compression_level(png_structp png_ptr, int level) if (png_ptr == NULL) return; + png_ptr->flags |= PNG_FLAG_ZLIB_CUSTOM_LEVEL; png_ptr->zlib_level = level; } @@ -1297,6 +1434,7 @@ png_set_compression_mem_level(png_structp png_ptr, int mem_level) if (png_ptr == NULL) return; + png_ptr->flags |= PNG_FLAG_ZLIB_CUSTOM_MEM_LEVEL; png_ptr->zlib_mem_level = mem_level; } @@ -1308,6 +1446,7 @@ png_set_compression_strategy(png_structp png_ptr, int strategy) if (png_ptr == NULL) return; + png_ptr->flags |= PNG_FLAG_ZLIB_CUSTOM_STRATEGY; png_ptr->zlib_strategy = strategy; } @@ -1317,17 +1456,21 @@ png_set_compression_window_bits(png_structp png_ptr, int window_bits) { if (png_ptr == NULL) return; + if (window_bits > 15) png_warning(png_ptr, "Only compression windows <= 32k supported by PNG"); + else if (window_bits < 8) png_warning(png_ptr, "Only compression windows >= 256 supported by PNG"); + #ifndef WBITS_8_OK /* Avoid libpng bug with 256-byte windows */ if (window_bits == 8) - { - png_warning(png_ptr, "Compression window is being reset to 512"); - window_bits = 9; - } + { + png_warning(png_ptr, "Compression window is being reset to 512"); + window_bits = 9; + } + #endif png_ptr->flags |= PNG_FLAG_ZLIB_CUSTOM_WINDOW_BITS; png_ptr->zlib_window_bits = window_bits; @@ -1340,8 +1483,10 @@ png_set_compression_method(png_structp png_ptr, int method) if (png_ptr == NULL) return; + if (method != 8) png_warning(png_ptr, "Only compression method 8 is supported by PNG"); + png_ptr->flags |= PNG_FLAG_ZLIB_CUSTOM_METHOD; png_ptr->zlib_method = method; } @@ -1351,18 +1496,20 @@ png_set_write_status_fn(png_structp png_ptr, png_write_status_ptr write_row_fn) { if (png_ptr == NULL) return; + png_ptr->write_row_fn = write_row_fn; } #ifdef PNG_WRITE_USER_TRANSFORM_SUPPORTED void PNGAPI png_set_write_user_transform_fn(png_structp png_ptr, png_user_transform_ptr - write_user_transform_fn) + write_user_transform_fn) { png_debug(1, "in png_set_write_user_transform_fn"); if (png_ptr == NULL) return; + png_ptr->transformations |= PNG_USER_TRANSFORM; png_ptr->write_user_transform_fn = write_user_transform_fn; } @@ -1372,7 +1519,7 @@ png_set_write_user_transform_fn(png_structp png_ptr, png_user_transform_ptr #ifdef PNG_INFO_IMAGE_SUPPORTED void PNGAPI png_write_png(png_structp png_ptr, png_infop info_ptr, - int transforms, voidp params) + int transforms, voidp params) { if (png_ptr == NULL || info_ptr == NULL) return; @@ -1393,7 +1540,7 @@ png_write_png(png_structp png_ptr, png_infop info_ptr, * as appropriate to correctly scale the image. */ if ((transforms & PNG_TRANSFORM_SHIFT) - && (info_ptr->valid & PNG_INFO_sBIT)) + && (info_ptr->valid & PNG_INFO_sBIT)) png_set_shift(png_ptr, &info_ptr->sig_bit); #endif @@ -1413,6 +1560,7 @@ png_write_png(png_structp png_ptr, png_infop info_ptr, /* Pack XRGB/RGBX/ARGB/RGBA into * RGB (4 channels -> 3 channels) */ if (transforms & PNG_TRANSFORM_STRIP_FILLER_AFTER) png_set_filler(png_ptr, 0, PNG_FILLER_AFTER); + else if (transforms & PNG_TRANSFORM_STRIP_FILLER_BEFORE) png_set_filler(png_ptr, 0, PNG_FILLER_BEFORE); #endif @@ -1450,8 +1598,8 @@ png_write_png(png_structp png_ptr, png_infop info_ptr, /* It is REQUIRED to call this to finish writing the rest of the file */ png_write_end(png_ptr, info_ptr); - transforms = transforms; /* Quiet compiler warnings */ - params = params; + PNG_UNUSED(transforms) /* Quiet compiler warnings */ + PNG_UNUSED(params) } #endif #endif /* PNG_WRITE_SUPPORTED */ diff --git a/reactos/dll/3rdparty/libpng/pngwtran.c b/reactos/dll/3rdparty/libpng/pngwtran.c index 070caa544de..bbf4a25b92e 100644 --- a/reactos/dll/3rdparty/libpng/pngwtran.c +++ b/reactos/dll/3rdparty/libpng/pngwtran.c @@ -1,8 +1,8 @@ /* pngwtran.c - transforms the data in a row for PNG writers * - * Last changed in libpng 1.4.1 [February 25, 2010] - * Copyright (c) 1998-2010 Glenn Randers-Pehrson + * Last changed in libpng 1.5.2 [March 31, 2011] + * Copyright (c) 1998-2011 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * @@ -11,11 +11,10 @@ * and license in png.h */ -#define PNG_NO_PEDANTIC_WARNINGS -#include "png.h" -#ifdef PNG_WRITE_SUPPORTED #include "pngpriv.h" +#ifdef PNG_WRITE_SUPPORTED + /* Transform the data according to the user's wishes. The order of * transformations is significant. */ @@ -30,53 +29,62 @@ png_do_write_transformations(png_structp png_ptr) #ifdef PNG_WRITE_USER_TRANSFORM_SUPPORTED if (png_ptr->transformations & PNG_USER_TRANSFORM) if (png_ptr->write_user_transform_fn != NULL) - (*(png_ptr->write_user_transform_fn)) /* User write transform + (*(png_ptr->write_user_transform_fn)) /* User write transform function */ - (png_ptr, /* png_ptr */ - &(png_ptr->row_info), /* row_info: */ - /* png_uint_32 width; width of row */ - /* png_uint_32 rowbytes; number of bytes in row */ - /* png_byte color_type; color type of pixels */ - /* png_byte bit_depth; bit depth of samples */ - /* png_byte channels; number of channels (1-4) */ - /* png_byte pixel_depth; bits per pixel (depth*channels) */ - png_ptr->row_buf + 1); /* start of pixel data for row */ + (png_ptr, /* png_ptr */ + &(png_ptr->row_info), /* row_info: */ + /* png_uint_32 width; width of row */ + /* png_size_t rowbytes; number of bytes in row */ + /* png_byte color_type; color type of pixels */ + /* png_byte bit_depth; bit depth of samples */ + /* png_byte channels; number of channels (1-4) */ + /* png_byte pixel_depth; bits per pixel (depth*channels) */ + png_ptr->row_buf + 1); /* start of pixel data for row */ #endif + #ifdef PNG_WRITE_FILLER_SUPPORTED if (png_ptr->transformations & PNG_FILLER) - png_do_strip_filler(&(png_ptr->row_info), png_ptr->row_buf + 1, - png_ptr->flags); + png_do_strip_channel(&(png_ptr->row_info), png_ptr->row_buf + 1, + !(png_ptr->flags & PNG_FILLER_AFTER)); #endif + #ifdef PNG_WRITE_PACKSWAP_SUPPORTED if (png_ptr->transformations & PNG_PACKSWAP) png_do_packswap(&(png_ptr->row_info), png_ptr->row_buf + 1); #endif + #ifdef PNG_WRITE_PACK_SUPPORTED if (png_ptr->transformations & PNG_PACK) png_do_pack(&(png_ptr->row_info), png_ptr->row_buf + 1, - (png_uint_32)png_ptr->bit_depth); + (png_uint_32)png_ptr->bit_depth); #endif + #ifdef PNG_WRITE_SWAP_SUPPORTED if (png_ptr->transformations & PNG_SWAP_BYTES) png_do_swap(&(png_ptr->row_info), png_ptr->row_buf + 1); #endif + #ifdef PNG_WRITE_SHIFT_SUPPORTED if (png_ptr->transformations & PNG_SHIFT) png_do_shift(&(png_ptr->row_info), png_ptr->row_buf + 1, - &(png_ptr->shift)); + &(png_ptr->shift)); #endif + #ifdef PNG_WRITE_SWAP_ALPHA_SUPPORTED if (png_ptr->transformations & PNG_SWAP_ALPHA) png_do_write_swap_alpha(&(png_ptr->row_info), png_ptr->row_buf + 1); #endif + #ifdef PNG_WRITE_INVERT_ALPHA_SUPPORTED if (png_ptr->transformations & PNG_INVERT_ALPHA) png_do_write_invert_alpha(&(png_ptr->row_info), png_ptr->row_buf + 1); #endif + #ifdef PNG_WRITE_BGR_SUPPORTED if (png_ptr->transformations & PNG_BGR) png_do_bgr(&(png_ptr->row_info), png_ptr->row_buf + 1); #endif + #ifdef PNG_WRITE_INVERT_SUPPORTED if (png_ptr->transformations & PNG_INVERT_MONO) png_do_invert(&(png_ptr->row_info), png_ptr->row_buf + 1); @@ -114,9 +122,12 @@ png_do_pack(png_row_infop row_info, png_bytep row, png_uint_32 bit_depth) { if (*sp != 0) v |= mask; + sp++; + if (mask > 1) mask >>= 1; + else { mask = 0x80; @@ -125,10 +136,13 @@ png_do_pack(png_row_infop row_info, png_bytep row, png_uint_32 bit_depth) v = 0; } } + if (mask != 0x80) *dp = (png_byte)v; + break; } + case 2: { png_bytep sp, dp; @@ -140,12 +154,14 @@ png_do_pack(png_row_infop row_info, png_bytep row, png_uint_32 bit_depth) dp = row; shift = 6; v = 0; + for (i = 0; i < row_width; i++) { png_byte value; value = (png_byte)(*sp & 0x03); v |= (value << shift); + if (shift == 0) { shift = 6; @@ -153,14 +169,19 @@ png_do_pack(png_row_infop row_info, png_bytep row, png_uint_32 bit_depth) dp++; v = 0; } + else shift -= 2; + sp++; } + if (shift != 6) *dp = (png_byte)v; + break; } + case 4: { png_bytep sp, dp; @@ -172,6 +193,7 @@ png_do_pack(png_row_infop row_info, png_bytep row, png_uint_32 bit_depth) dp = row; shift = 4; v = 0; + for (i = 0; i < row_width; i++) { png_byte value; @@ -186,20 +208,27 @@ png_do_pack(png_row_infop row_info, png_bytep row, png_uint_32 bit_depth) dp++; v = 0; } + else shift -= 4; sp++; } + if (shift != 4) *dp = (png_byte)v; + break; } + + default: + break; } + row_info->bit_depth = (png_byte)bit_depth; row_info->pixel_depth = (png_byte)(bit_depth * row_info->channels); row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, - row_info->width); + row_info->width); } } #endif @@ -213,12 +242,12 @@ png_do_pack(png_row_infop row_info, png_bytep row, png_uint_32 bit_depth) * data to 0 to 15. */ void /* PRIVATE */ -png_do_shift(png_row_infop row_info, png_bytep row, png_color_8p bit_depth) +png_do_shift(png_row_infop row_info, png_bytep row, + png_const_color_8p bit_depth) { png_debug(1, "in png_do_shift"); - if ( - row_info->color_type != PNG_COLOR_TYPE_PALETTE) + if (row_info->color_type != PNG_COLOR_TYPE_PALETTE) { int shift_start[4], shift_dec[4]; int channels = 0; @@ -228,19 +257,23 @@ png_do_shift(png_row_infop row_info, png_bytep row, png_color_8p bit_depth) shift_start[channels] = row_info->bit_depth - bit_depth->red; shift_dec[channels] = bit_depth->red; channels++; + shift_start[channels] = row_info->bit_depth - bit_depth->green; shift_dec[channels] = bit_depth->green; channels++; + shift_start[channels] = row_info->bit_depth - bit_depth->blue; shift_dec[channels] = bit_depth->blue; channels++; } + else { shift_start[channels] = row_info->bit_depth - bit_depth->gray; shift_dec[channels] = bit_depth->gray; channels++; } + if (row_info->color_type & PNG_COLOR_MASK_ALPHA) { shift_start[channels] = row_info->bit_depth - bit_depth->alpha; @@ -252,14 +285,16 @@ png_do_shift(png_row_infop row_info, png_bytep row, png_color_8p bit_depth) if (row_info->bit_depth < 8) { png_bytep bp = row; - png_uint_32 i; + png_size_t i; png_byte mask; - png_uint_32 row_bytes = row_info->rowbytes; + png_size_t row_bytes = row_info->rowbytes; if (bit_depth->gray == 1 && row_info->bit_depth == 2) mask = 0x55; + else if (row_info->bit_depth == 4 && bit_depth->gray == 3) mask = 0x11; + else mask = 0xff; @@ -270,15 +305,18 @@ png_do_shift(png_row_infop row_info, png_bytep row, png_color_8p bit_depth) v = *bp; *bp = 0; + for (j = shift_start[0]; j > -shift_dec[0]; j -= shift_dec[0]) { if (j > 0) *bp |= (png_byte)((v << j) & 0xff); + else *bp |= (png_byte)((v >> (-j)) & mask); } } } + else if (row_info->bit_depth == 8) { png_bytep bp = row; @@ -294,15 +332,18 @@ png_do_shift(png_row_infop row_info, png_bytep row, png_color_8p bit_depth) v = *bp; *bp = 0; + for (j = shift_start[c]; j > -shift_dec[c]; j -= shift_dec[c]) { if (j > 0) *bp |= (png_byte)((v << j) & 0xff); + else *bp |= (png_byte)((v >> (-j)) & 0xff); } } } + else { png_bytep bp; @@ -317,10 +358,12 @@ png_do_shift(png_row_infop row_info, png_bytep row, png_color_8p bit_depth) v = (png_uint_16)(((png_uint_16)(*bp) << 8) + *(bp + 1)); value = 0; + for (j = shift_start[c]; j > -shift_dec[c]; j -= shift_dec[c]) { if (j > 0) value |= (png_uint_16)((v << j) & (png_uint_16)0xffff); + else value |= (png_uint_16)((v >> (-j)) & (png_uint_16)0xffff); } @@ -341,12 +384,13 @@ png_do_write_swap_alpha(png_row_infop row_info, png_bytep row) { if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) { - /* This converts from ARGB to RGBA */ if (row_info->bit_depth == 8) { + /* This converts from ARGB to RGBA */ png_bytep sp, dp; png_uint_32 i; png_uint_32 row_width = row_info->width; + for (i = 0, sp = dp = row; i < row_width; i++) { png_byte save = *(sp++); @@ -356,9 +400,11 @@ png_do_write_swap_alpha(png_row_infop row_info, png_bytep row) *(dp++) = save; } } - /* This converts from AARRGGBB to RRGGBBAA */ + +#ifdef PNG_WRITE_16BIT_SUPPORTED else { + /* This converts from AARRGGBB to RRGGBBAA */ png_bytep sp, dp; png_uint_32 i; png_uint_32 row_width = row_info->width; @@ -378,12 +424,14 @@ png_do_write_swap_alpha(png_row_infop row_info, png_bytep row) *(dp++) = save[1]; } } +#endif /* PNG_WRITE_16BIT_SUPPORTED */ } + else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA) { - /* This converts from AG to GA */ if (row_info->bit_depth == 8) { + /* This converts from AG to GA */ png_bytep sp, dp; png_uint_32 i; png_uint_32 row_width = row_info->width; @@ -395,9 +443,11 @@ png_do_write_swap_alpha(png_row_infop row_info, png_bytep row) *(dp++) = save; } } - /* This converts from AAGG to GGAA */ + +#ifdef PNG_WRITE_16BIT_SUPPORTED else { + /* This converts from AAGG to GGAA */ png_bytep sp, dp; png_uint_32 i; png_uint_32 row_width = row_info->width; @@ -413,6 +463,7 @@ png_do_write_swap_alpha(png_row_infop row_info, png_bytep row) *(dp++) = save[1]; } } +#endif /* PNG_WRITE_16BIT_SUPPORTED */ } } } @@ -427,12 +478,13 @@ png_do_write_invert_alpha(png_row_infop row_info, png_bytep row) { if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) { - /* This inverts the alpha channel in RGBA */ if (row_info->bit_depth == 8) { + /* This inverts the alpha channel in RGBA */ png_bytep sp, dp; png_uint_32 i; png_uint_32 row_width = row_info->width; + for (i = 0, sp = dp = row; i < row_width; i++) { /* Does nothing @@ -444,9 +496,11 @@ png_do_write_invert_alpha(png_row_infop row_info, png_bytep row) *(dp++) = (png_byte)(255 - *(sp++)); } } - /* This inverts the alpha channel in RRGGBBAA */ + +#ifdef PNG_WRITE_16BIT_SUPPORTED else { + /* This inverts the alpha channel in RRGGBBAA */ png_bytep sp, dp; png_uint_32 i; png_uint_32 row_width = row_info->width; @@ -466,12 +520,14 @@ png_do_write_invert_alpha(png_row_infop row_info, png_bytep row) *(dp++) = (png_byte)(255 - *(sp++)); } } +#endif /* PNG_WRITE_16BIT_SUPPORTED */ } + else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA) { - /* This inverts the alpha channel in GA */ if (row_info->bit_depth == 8) { + /* This inverts the alpha channel in GA */ png_bytep sp, dp; png_uint_32 i; png_uint_32 row_width = row_info->width; @@ -482,9 +538,11 @@ png_do_write_invert_alpha(png_row_infop row_info, png_bytep row) *(dp++) = (png_byte)(255 - *(sp++)); } } - /* This inverts the alpha channel in GGAA */ + +#ifdef PNG_WRITE_16BIT_SUPPORTED else { + /* This inverts the alpha channel in GGAA */ png_bytep sp, dp; png_uint_32 i; png_uint_32 row_width = row_info->width; @@ -500,6 +558,7 @@ png_do_write_invert_alpha(png_row_infop row_info, png_bytep row) *(dp++) = (png_byte)(255 - *(sp++)); } } +#endif /* PNG_WRITE_16BIT_SUPPORTED */ } } } @@ -512,8 +571,7 @@ png_do_write_intrapixel(png_row_infop row_info, png_bytep row) { png_debug(1, "in png_do_write_intrapixel"); - if ( - (row_info->color_type & PNG_COLOR_MASK_COLOR)) + if ((row_info->color_type & PNG_COLOR_MASK_COLOR)) { int bytes_per_pixel; png_uint_32 row_width = row_info->width; @@ -524,17 +582,21 @@ png_do_write_intrapixel(png_row_infop row_info, png_bytep row) if (row_info->color_type == PNG_COLOR_TYPE_RGB) bytes_per_pixel = 3; + else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) bytes_per_pixel = 4; + else return; for (i = 0, rp = row; i < row_width; i++, rp += bytes_per_pixel) { - *(rp) = (png_byte)((*rp - *(rp+1))&0xff); - *(rp+2) = (png_byte)((*(rp+2) - *(rp+1))&0xff); + *(rp) = (png_byte)((*rp - *(rp + 1)) & 0xff); + *(rp + 2) = (png_byte)((*(rp + 2) - *(rp + 1)) & 0xff); } } + +#ifdef PNG_WRITE_16BIT_SUPPORTED else if (row_info->bit_depth == 16) { png_bytep rp; @@ -542,24 +604,27 @@ png_do_write_intrapixel(png_row_infop row_info, png_bytep row) if (row_info->color_type == PNG_COLOR_TYPE_RGB) bytes_per_pixel = 6; + else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) bytes_per_pixel = 8; + else return; for (i = 0, rp = row; i < row_width; i++, rp += bytes_per_pixel) { - png_uint_32 s0 = (*(rp ) << 8) | *(rp+1); - png_uint_32 s1 = (*(rp+2) << 8) | *(rp+3); - png_uint_32 s2 = (*(rp+4) << 8) | *(rp+5); + png_uint_32 s0 = (*(rp ) << 8) | *(rp + 1); + png_uint_32 s1 = (*(rp + 2) << 8) | *(rp + 3); + png_uint_32 s2 = (*(rp + 4) << 8) | *(rp + 5); png_uint_32 red = (png_uint_32)((s0 - s1) & 0xffffL); png_uint_32 blue = (png_uint_32)((s2 - s1) & 0xffffL); - *(rp ) = (png_byte)((red >> 8) & 0xff); - *(rp+1) = (png_byte)(red & 0xff); - *(rp+4) = (png_byte)((blue >> 8) & 0xff); - *(rp+5) = (png_byte)(blue & 0xff); + *(rp ) = (png_byte)((red >> 8) & 0xff); + *(rp + 1) = (png_byte)(red & 0xff); + *(rp + 4) = (png_byte)((blue >> 8) & 0xff); + *(rp + 5) = (png_byte)(blue & 0xff); } } +#endif /* PNG_WRITE_16BIT_SUPPORTED */ } } #endif /* PNG_MNG_FEATURES_SUPPORTED */ diff --git a/reactos/dll/3rdparty/libpng/pngwutil.c b/reactos/dll/3rdparty/libpng/pngwutil.c index 19feb1d98c2..2c35785aa12 100644 --- a/reactos/dll/3rdparty/libpng/pngwutil.c +++ b/reactos/dll/3rdparty/libpng/pngwutil.c @@ -1,8 +1,8 @@ /* pngwutil.c - utilities to write a PNG file * - * Last changed in libpng 1.4.1 [February 25, 2010] - * Copyright (c) 1998-2010 Glenn Randers-Pehrson + * Last changed in libpng 1.5.0 [January 6, 2011] + * Copyright (c) 1998-2011 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * @@ -11,11 +11,11 @@ * and license in png.h */ -#define PNG_NO_PEDANTIC_WARNINGS -#include "png.h" -#ifdef PNG_WRITE_SUPPORTED #include "pngpriv.h" +#ifdef PNG_WRITE_SUPPORTED + +#ifdef PNG_WRITE_INT_FUNCTIONS_SUPPORTED /* Place a 32-bit number into a buffer in PNG byte order. We work * with unsigned numbers for convenience, although one supported * ancillary chunk uses signed (two's complement) numbers. @@ -32,7 +32,9 @@ png_save_uint_32(png_bytep buf, png_uint_32 i) #ifdef PNG_SAVE_INT_32_SUPPORTED /* The png_save_int_32 function assumes integers are stored in two's * complement format. If this isn't the case, then this routine needs to - * be modified to write data in two's complement format. + * be modified to write data in two's complement format. Note that, + * the following works correctly even if png_int_32 has more than 32 bits + * (compare the more complex code required on read for sign extention.) */ void PNGAPI png_save_int_32(png_bytep buf, png_int_32 i) @@ -54,6 +56,7 @@ png_save_uint_16(png_bytep buf, unsigned int i) buf[0] = (png_byte)((i >> 8) & 0xff); buf[1] = (png_byte)(i & 0xff); } +#endif /* Simple function to write the signature. If we have already written * the magic bytes of the signature, or more likely, the PNG stream is @@ -74,6 +77,7 @@ png_write_sig(png_structp png_ptr) /* Write the rest of the 8 byte signature */ png_write_data(png_ptr, &png_signature[png_ptr->sig_bytes], (png_size_t)(8 - png_ptr->sig_bytes)); + if (png_ptr->sig_bytes < 3) png_ptr->mode |= PNG_HAVE_PNG_SIGNATURE; } @@ -88,11 +92,12 @@ png_write_sig(png_structp png_ptr) * functions instead. */ void PNGAPI -png_write_chunk(png_structp png_ptr, png_bytep chunk_name, - png_bytep data, png_size_t length) +png_write_chunk(png_structp png_ptr, png_const_bytep chunk_name, + png_const_bytep data, png_size_t length) { if (png_ptr == NULL) return; + png_write_chunk_start(png_ptr, chunk_name, (png_uint_32)length); png_write_chunk_data(png_ptr, data, (png_size_t)length); png_write_chunk_end(png_ptr); @@ -103,8 +108,8 @@ png_write_chunk(png_structp png_ptr, png_bytep chunk_name, * passing in png_write_chunk_data(). */ void PNGAPI -png_write_chunk_start(png_structp png_ptr, png_bytep chunk_name, - png_uint_32 length) +png_write_chunk_start(png_structp png_ptr, png_const_bytep chunk_name, + png_uint_32 length) { png_byte buf[8]; @@ -125,10 +130,13 @@ png_write_chunk_start(png_structp png_ptr, png_bytep chunk_name, png_save_uint_32(buf, length); png_memcpy(buf + 4, chunk_name, 4); png_write_data(png_ptr, buf, (png_size_t)8); + /* Put the chunk name into png_ptr->chunk_name */ png_memcpy(png_ptr->chunk_name, chunk_name, 4); + /* Reset the crc and run it over the chunk name */ png_reset_crc(png_ptr); + png_calculate_crc(png_ptr, chunk_name, 4); #ifdef PNG_IO_STATE_SUPPORTED @@ -145,14 +153,17 @@ png_write_chunk_start(png_structp png_ptr, png_bytep chunk_name, * given to png_write_chunk_start(). */ void PNGAPI -png_write_chunk_data(png_structp png_ptr, png_bytep data, png_size_t length) +png_write_chunk_data(png_structp png_ptr, png_const_bytep data, + png_size_t length) { /* Write the data, and run the CRC over it */ if (png_ptr == NULL) return; + if (data != NULL && length > 0) { png_write_data(png_ptr, data, length); + /* Update the CRC after writing the data, * in case that the user I/O routine alters it. */ @@ -190,18 +201,18 @@ png_write_chunk_end(png_structp png_ptr) typedef struct { - char *input; /* The uncompressed input data */ - int input_len; /* Its length */ - int num_output_ptr; /* Number of output pointers used */ - int max_output_ptr; /* Size of output_ptr */ - png_charpp output_ptr; /* Array of pointers to output */ + png_const_bytep input; /* The uncompressed input data */ + png_size_t input_len; /* Its length */ + int num_output_ptr; /* Number of output pointers used */ + int max_output_ptr; /* Size of output_ptr */ + png_bytep *output_ptr; /* Array of pointers to output */ } compression_state; /* Compress given text into storage in the png_ptr structure */ static int /* PRIVATE */ png_text_compress(png_structp png_ptr, - png_charp text, png_size_t text_len, int compression, - compression_state *comp) + png_const_charp text, png_size_t text_len, int compression, + compression_state *comp) { int ret; @@ -214,14 +225,14 @@ png_text_compress(png_structp png_ptr, /* We may just want to pass the text right through */ if (compression == PNG_TEXT_COMPRESSION_NONE) { - comp->input = text; - comp->input_len = text_len; - return((int)text_len); + comp->input = (png_const_bytep)text; + comp->input_len = text_len; + return((int)text_len); } if (compression >= PNG_TEXT_COMPRESSION_LAST) { -#ifdef PNG_STDIO_SUPPORTED +#ifdef PNG_CONSOLE_IO_SUPPORTED char msg[50]; png_snprintf(msg, 50, "Unknown compression type %d", compression); png_warning(png_ptr, msg); @@ -246,24 +257,29 @@ png_text_compress(png_structp png_ptr, */ /* Set up the compression buffers */ + /* TODO: the following cast hides a potential overflow problem. */ png_ptr->zstream.avail_in = (uInt)text_len; + /* NOTE: assume zlib doesn't overwrite the input */ png_ptr->zstream.next_in = (Bytef *)text; - png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; - png_ptr->zstream.next_out = (Bytef *)png_ptr->zbuf; + png_ptr->zstream.avail_out = png_ptr->zbuf_size; + png_ptr->zstream.next_out = png_ptr->zbuf; /* This is the same compression loop as in png_write_row() */ do { /* Compress the data */ ret = deflate(&png_ptr->zstream, Z_NO_FLUSH); + if (ret != Z_OK) { /* Error */ if (png_ptr->zstream.msg != NULL) png_error(png_ptr, png_ptr->zstream.msg); + else png_error(png_ptr, "zlib error"); } + /* Check to see if we need more room */ if (!(png_ptr->zstream.avail_out)) { @@ -276,28 +292,33 @@ png_text_compress(png_structp png_ptr, comp->max_output_ptr = comp->num_output_ptr + 4; if (comp->output_ptr != NULL) { - png_charpp old_ptr; + png_bytepp old_ptr; old_ptr = comp->output_ptr; - comp->output_ptr = (png_charpp)png_malloc(png_ptr, - (png_alloc_size_t) - (comp->max_output_ptr * png_sizeof(png_charpp))); + + comp->output_ptr = (png_bytepp)png_malloc(png_ptr, + (png_alloc_size_t) + (comp->max_output_ptr * png_sizeof(png_charpp))); + png_memcpy(comp->output_ptr, old_ptr, old_max - * png_sizeof(png_charp)); + * png_sizeof(png_charp)); + png_free(png_ptr, old_ptr); } else - comp->output_ptr = (png_charpp)png_malloc(png_ptr, - (png_alloc_size_t) - (comp->max_output_ptr * png_sizeof(png_charp))); + comp->output_ptr = (png_bytepp)png_malloc(png_ptr, + (png_alloc_size_t) + (comp->max_output_ptr * png_sizeof(png_charp))); } /* Save the data */ comp->output_ptr[comp->num_output_ptr] = - (png_charp)png_malloc(png_ptr, - (png_alloc_size_t)png_ptr->zbuf_size); + (png_bytep)png_malloc(png_ptr, + (png_alloc_size_t)png_ptr->zbuf_size); + png_memcpy(comp->output_ptr[comp->num_output_ptr], png_ptr->zbuf, - png_ptr->zbuf_size); + png_ptr->zbuf_size); + comp->num_output_ptr++; /* and reset the buffer */ @@ -327,29 +348,35 @@ png_text_compress(png_structp png_ptr, comp->max_output_ptr = comp->num_output_ptr + 4; if (comp->output_ptr != NULL) { - png_charpp old_ptr; + png_bytepp old_ptr; old_ptr = comp->output_ptr; + /* This could be optimized to realloc() */ - comp->output_ptr = (png_charpp)png_malloc(png_ptr, - (png_alloc_size_t)(comp->max_output_ptr * - png_sizeof(png_charp))); + comp->output_ptr = (png_bytepp)png_malloc(png_ptr, + (png_alloc_size_t)(comp->max_output_ptr * + png_sizeof(png_charp))); + png_memcpy(comp->output_ptr, old_ptr, - old_max * png_sizeof(png_charp)); + old_max * png_sizeof(png_charp)); + png_free(png_ptr, old_ptr); } + else - comp->output_ptr = (png_charpp)png_malloc(png_ptr, - (png_alloc_size_t)(comp->max_output_ptr * - png_sizeof(png_charp))); + comp->output_ptr = (png_bytepp)png_malloc(png_ptr, + (png_alloc_size_t)(comp->max_output_ptr * + png_sizeof(png_charp))); } /* Save the data */ comp->output_ptr[comp->num_output_ptr] = - (png_charp)png_malloc(png_ptr, - (png_alloc_size_t)png_ptr->zbuf_size); + (png_bytep)png_malloc(png_ptr, + (png_alloc_size_t)png_ptr->zbuf_size); + png_memcpy(comp->output_ptr[comp->num_output_ptr], png_ptr->zbuf, - png_ptr->zbuf_size); + png_ptr->zbuf_size); + comp->num_output_ptr++; /* and reset the buffer pointers */ @@ -362,6 +389,7 @@ png_text_compress(png_structp png_ptr, /* We got an error */ if (png_ptr->zstream.msg != NULL) png_error(png_ptr, png_ptr->zstream.msg); + else png_error(png_ptr, "zlib error"); } @@ -369,6 +397,7 @@ png_text_compress(png_structp png_ptr, /* Text length is number of buffers plus last buffer */ text_len = png_ptr->zbuf_size * comp->num_output_ptr; + if (png_ptr->zstream.avail_out < png_ptr->zbuf_size) text_len += png_ptr->zbuf_size - (png_size_t)png_ptr->zstream.avail_out; @@ -384,24 +413,27 @@ png_write_compressed_data_out(png_structp png_ptr, compression_state *comp) /* Handle the no-compression case */ if (comp->input) { - png_write_chunk_data(png_ptr, (png_bytep)comp->input, - (png_size_t)comp->input_len); + png_write_chunk_data(png_ptr, comp->input, comp->input_len); + return; } /* Write saved output buffers, if any */ for (i = 0; i < comp->num_output_ptr; i++) { - png_write_chunk_data(png_ptr, (png_bytep)comp->output_ptr[i], - (png_size_t)png_ptr->zbuf_size); + png_write_chunk_data(png_ptr, comp->output_ptr[i], + (png_size_t)png_ptr->zbuf_size); + png_free(png_ptr, comp->output_ptr[i]); } + if (comp->max_output_ptr != 0) png_free(png_ptr, comp->output_ptr); + /* Write anything left in zbuf */ if (png_ptr->zstream.avail_out < (png_uint_32)png_ptr->zbuf_size) png_write_chunk_data(png_ptr, png_ptr->zbuf, - (png_size_t)(png_ptr->zbuf_size - png_ptr->zstream.avail_out)); + (png_size_t)(png_ptr->zbuf_size - png_ptr->zstream.avail_out)); /* Reset zlib for another zTXt/iTXt or image data */ deflateReset(&png_ptr->zstream); @@ -415,8 +447,8 @@ png_write_compressed_data_out(png_structp png_ptr, compression_state *comp) */ void /* PRIVATE */ png_write_IHDR(png_structp png_ptr, png_uint_32 width, png_uint_32 height, - int bit_depth, int color_type, int compression_type, int filter_type, - int interlace_type) + int bit_depth, int color_type, int compression_type, int filter_type, + int interlace_type) { PNG_IHDR; int ret; @@ -435,36 +467,61 @@ png_write_IHDR(png_structp png_ptr, png_uint_32 width, png_uint_32 height, case 2: case 4: case 8: - case 16: png_ptr->channels = 1; break; - default: png_error(png_ptr, - "Invalid bit depth for grayscale image"); +#ifdef PNG_WRITE_16BIT_SUPPORTED + case 16: +#endif + png_ptr->channels = 1; break; + + default: + png_error(png_ptr, + "Invalid bit depth for grayscale image"); } break; + case PNG_COLOR_TYPE_RGB: +#ifdef PNG_WRITE_16BIT_SUPPORTED if (bit_depth != 8 && bit_depth != 16) +#else + if (bit_depth != 8) +#endif png_error(png_ptr, "Invalid bit depth for RGB image"); + png_ptr->channels = 3; break; + case PNG_COLOR_TYPE_PALETTE: switch (bit_depth) { case 1: case 2: case 4: - case 8: png_ptr->channels = 1; break; - default: png_error(png_ptr, "Invalid bit depth for paletted image"); + case 8: + png_ptr->channels = 1; + break; + + default: + png_error(png_ptr, "Invalid bit depth for paletted image"); } break; + case PNG_COLOR_TYPE_GRAY_ALPHA: if (bit_depth != 8 && bit_depth != 16) png_error(png_ptr, "Invalid bit depth for grayscale+alpha image"); + png_ptr->channels = 2; break; + case PNG_COLOR_TYPE_RGB_ALPHA: +#ifdef PNG_WRITE_16BIT_SUPPORTED if (bit_depth != 8 && bit_depth != 16) +#else + if (bit_depth != 8) +#endif png_error(png_ptr, "Invalid bit depth for RGBA image"); + png_ptr->channels = 4; break; + default: png_error(png_ptr, "Invalid image color type specified"); } @@ -486,13 +543,13 @@ png_write_IHDR(png_structp png_ptr, png_uint_32 width, png_uint_32 height, */ if ( #ifdef PNG_MNG_FEATURES_SUPPORTED - !((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) && - ((png_ptr->mode&PNG_HAVE_PNG_SIGNATURE) == 0) && - (color_type == PNG_COLOR_TYPE_RGB || - color_type == PNG_COLOR_TYPE_RGB_ALPHA) && - (filter_type == PNG_INTRAPIXEL_DIFFERENCING)) && + !((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) && + ((png_ptr->mode&PNG_HAVE_PNG_SIGNATURE) == 0) && + (color_type == PNG_COLOR_TYPE_RGB || + color_type == PNG_COLOR_TYPE_RGB_ALPHA) && + (filter_type == PNG_INTRAPIXEL_DIFFERENCING)) && #endif - filter_type != PNG_FILTER_TYPE_BASE) + filter_type != PNG_FILTER_TYPE_BASE) { png_warning(png_ptr, "Invalid filter type specified"); filter_type = PNG_FILTER_TYPE_BASE; @@ -500,7 +557,7 @@ png_write_IHDR(png_structp png_ptr, png_uint_32 width, png_uint_32 height, #ifdef PNG_WRITE_INTERLACING_SUPPORTED if (interlace_type != PNG_INTERLACE_NONE && - interlace_type != PNG_INTERLACE_ADAM7) + interlace_type != PNG_INTERLACE_ADAM7) { png_warning(png_ptr, "Invalid interlace type specified"); interlace_type = PNG_INTERLACE_ADAM7; @@ -537,52 +594,70 @@ png_write_IHDR(png_structp png_ptr, png_uint_32 width, png_uint_32 height, buf[12] = (png_byte)interlace_type; /* Write the chunk */ - png_write_chunk(png_ptr, (png_bytep)png_IHDR, buf, (png_size_t)13); + png_write_chunk(png_ptr, png_IHDR, buf, (png_size_t)13); /* Initialize zlib with PNG info */ png_ptr->zstream.zalloc = png_zalloc; png_ptr->zstream.zfree = png_zfree; png_ptr->zstream.opaque = (voidpf)png_ptr; + if (!(png_ptr->do_filter)) { if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE || - png_ptr->bit_depth < 8) + png_ptr->bit_depth < 8) png_ptr->do_filter = PNG_FILTER_NONE; + else png_ptr->do_filter = PNG_ALL_FILTERS; } + if (!(png_ptr->flags & PNG_FLAG_ZLIB_CUSTOM_STRATEGY)) { if (png_ptr->do_filter != PNG_FILTER_NONE) png_ptr->zlib_strategy = Z_FILTERED; + else png_ptr->zlib_strategy = Z_DEFAULT_STRATEGY; } + if (!(png_ptr->flags & PNG_FLAG_ZLIB_CUSTOM_LEVEL)) png_ptr->zlib_level = Z_DEFAULT_COMPRESSION; + if (!(png_ptr->flags & PNG_FLAG_ZLIB_CUSTOM_MEM_LEVEL)) png_ptr->zlib_mem_level = 8; + if (!(png_ptr->flags & PNG_FLAG_ZLIB_CUSTOM_WINDOW_BITS)) png_ptr->zlib_window_bits = 15; + if (!(png_ptr->flags & PNG_FLAG_ZLIB_CUSTOM_METHOD)) png_ptr->zlib_method = 8; + ret = deflateInit2(&png_ptr->zstream, png_ptr->zlib_level, - png_ptr->zlib_method, png_ptr->zlib_window_bits, - png_ptr->zlib_mem_level, png_ptr->zlib_strategy); + png_ptr->zlib_method, png_ptr->zlib_window_bits, + png_ptr->zlib_mem_level, png_ptr->zlib_strategy); + if (ret != Z_OK) { - if (ret == Z_VERSION_ERROR) png_error(png_ptr, - "zlib failed to initialize compressor -- version error"); - if (ret == Z_STREAM_ERROR) png_error(png_ptr, - "zlib failed to initialize compressor -- stream error"); - if (ret == Z_MEM_ERROR) png_error(png_ptr, - "zlib failed to initialize compressor -- mem error"); + if (ret == Z_VERSION_ERROR) + png_error(png_ptr, + "zlib failed to initialize compressor -- version error"); + + if (ret == Z_STREAM_ERROR) + png_error(png_ptr, + "zlib failed to initialize compressor -- stream error"); + + if (ret == Z_MEM_ERROR) + png_error(png_ptr, + "zlib failed to initialize compressor -- mem error"); + png_error(png_ptr, "zlib failed to initialize compressor"); } + png_ptr->zstream.next_out = png_ptr->zbuf; png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; - /* libpng is not interested in zstream.data_type */ - /* Set it to a predefined value, to avoid its evaluation inside zlib */ + /* libpng is not interested in zstream.data_type, so set it + * to a predefined value, to avoid its evaluation inside zlib + */ png_ptr->zstream.data_type = Z_BINARY; png_ptr->mode = PNG_HAVE_IHDR; @@ -593,45 +668,48 @@ png_write_IHDR(png_structp png_ptr, png_uint_32 width, png_uint_32 height, * structure. */ void /* PRIVATE */ -png_write_PLTE(png_structp png_ptr, png_colorp palette, png_uint_32 num_pal) +png_write_PLTE(png_structp png_ptr, png_const_colorp palette, + png_uint_32 num_pal) { PNG_PLTE; png_uint_32 i; - png_colorp pal_ptr; + png_const_colorp pal_ptr; png_byte buf[3]; png_debug(1, "in png_write_PLTE"); if (( #ifdef PNG_MNG_FEATURES_SUPPORTED - !(png_ptr->mng_features_permitted & PNG_FLAG_MNG_EMPTY_PLTE) && + !(png_ptr->mng_features_permitted & PNG_FLAG_MNG_EMPTY_PLTE) && #endif - num_pal == 0) || num_pal > 256) + num_pal == 0) || num_pal > 256) { - if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) - { - png_error(png_ptr, "Invalid number of colors in palette"); - } - else - { - png_warning(png_ptr, "Invalid number of colors in palette"); - return; - } + if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) + { + png_error(png_ptr, "Invalid number of colors in palette"); + } + + else + { + png_warning(png_ptr, "Invalid number of colors in palette"); + return; + } } if (!(png_ptr->color_type&PNG_COLOR_MASK_COLOR)) { png_warning(png_ptr, - "Ignoring request to write a PLTE chunk in grayscale PNG"); + "Ignoring request to write a PLTE chunk in grayscale PNG"); + return; } png_ptr->num_palette = (png_uint_16)num_pal; png_debug1(3, "num_palette = %d", png_ptr->num_palette); - png_write_chunk_start(png_ptr, (png_bytep)png_PLTE, - (png_uint_32)(num_pal * 3)); + png_write_chunk_start(png_ptr, png_PLTE, (png_uint_32)(num_pal * 3)); #ifdef PNG_POINTER_INDEXING_SUPPORTED + for (i = 0, pal_ptr = palette; i < num_pal; i++, pal_ptr++) { buf[0] = pal_ptr->red; @@ -639,11 +717,13 @@ png_write_PLTE(png_structp png_ptr, png_colorp palette, png_uint_32 num_pal) buf[2] = pal_ptr->blue; png_write_chunk_data(png_ptr, buf, (png_size_t)3); } + #else /* This is a little slower but some buggy compilers need to do this * instead */ pal_ptr=palette; + for (i = 0; i < num_pal; i++) { buf[0] = pal_ptr[i].red; @@ -651,6 +731,7 @@ png_write_PLTE(png_structp png_ptr, png_colorp palette, png_uint_32 num_pal) buf[2] = pal_ptr[i].blue; png_write_chunk_data(png_ptr, buf, (png_size_t)3); } + #endif png_write_chunk_end(png_ptr); png_ptr->mode |= PNG_HAVE_PLTE; @@ -681,31 +762,36 @@ png_write_IDAT(png_structp png_ptr, png_bytep data, png_size_t length) png_ptr->height < 16384 && png_ptr->width < 16384) { png_uint_32 uncompressed_idat_size = png_ptr->height * - ((png_ptr->width * - png_ptr->channels * png_ptr->bit_depth + 15) >> 3); + ((png_ptr->width * + png_ptr->channels * png_ptr->bit_depth + 15) >> 3); unsigned int z_cinfo = z_cmf >> 4; unsigned int half_z_window_size = 1 << (z_cinfo + 7); while (uncompressed_idat_size <= half_z_window_size && - half_z_window_size >= 256) + half_z_window_size >= 256) { z_cinfo--; half_z_window_size >>= 1; } + z_cmf = (z_cmf & 0x0f) | (z_cinfo << 4); - if (data[0] != (png_byte)z_cmf) + + if (data[0] != z_cmf) { + int tmp; data[0] = (png_byte)z_cmf; - data[1] &= 0xe0; - data[1] += (png_byte)(0x1f - ((z_cmf << 8) + data[1]) % 0x1f); + tmp = data[1] & 0xe0; + tmp += 0x1f - ((z_cmf << 8) + tmp) % 0x1f; + data[1] = (png_byte)tmp; } } } + else png_error(png_ptr, - "Invalid zlib compression method or flags in IDAT"); + "Invalid zlib compression method or flags in IDAT"); } - png_write_chunk(png_ptr, (png_bytep)png_IDAT, data, length); + png_write_chunk(png_ptr, png_IDAT, data, length); png_ptr->mode |= PNG_HAVE_IDAT; } @@ -717,30 +803,12 @@ png_write_IEND(png_structp png_ptr) png_debug(1, "in png_write_IEND"); - png_write_chunk(png_ptr, (png_bytep)png_IEND, NULL, - (png_size_t)0); + png_write_chunk(png_ptr, png_IEND, NULL, (png_size_t)0); png_ptr->mode |= PNG_HAVE_IEND; } #ifdef PNG_WRITE_gAMA_SUPPORTED /* Write a gAMA chunk */ -#ifdef PNG_FLOATING_POINT_SUPPORTED -void /* PRIVATE */ -png_write_gAMA(png_structp png_ptr, double file_gamma) -{ - PNG_gAMA; - png_uint_32 igamma; - png_byte buf[4]; - - png_debug(1, "in png_write_gAMA"); - - /* file_gamma is saved in 1/100,000ths */ - igamma = (png_uint_32)(file_gamma * 100000.0 + 0.5); - png_save_uint_32(buf, igamma); - png_write_chunk(png_ptr, (png_bytep)png_gAMA, buf, (png_size_t)4); -} -#endif -#ifdef PNG_FIXED_POINT_SUPPORTED void /* PRIVATE */ png_write_gAMA_fixed(png_structp png_ptr, png_fixed_point file_gamma) { @@ -751,10 +819,9 @@ png_write_gAMA_fixed(png_structp png_ptr, png_fixed_point file_gamma) /* file_gamma is saved in 1/100,000ths */ png_save_uint_32(buf, (png_uint_32)file_gamma); - png_write_chunk(png_ptr, (png_bytep)png_gAMA, buf, (png_size_t)4); + png_write_chunk(png_ptr, png_gAMA, buf, (png_size_t)4); } #endif -#endif #ifdef PNG_WRITE_sRGB_SUPPORTED /* Write a sRGB chunk */ @@ -767,18 +834,19 @@ png_write_sRGB(png_structp png_ptr, int srgb_intent) png_debug(1, "in png_write_sRGB"); if (srgb_intent >= PNG_sRGB_INTENT_LAST) - png_warning(png_ptr, - "Invalid sRGB rendering intent specified"); + png_warning(png_ptr, + "Invalid sRGB rendering intent specified"); + buf[0]=(png_byte)srgb_intent; - png_write_chunk(png_ptr, (png_bytep)png_sRGB, buf, (png_size_t)1); + png_write_chunk(png_ptr, png_sRGB, buf, (png_size_t)1); } #endif #ifdef PNG_WRITE_iCCP_SUPPORTED /* Write an iCCP chunk */ void /* PRIVATE */ -png_write_iCCP(png_structp png_ptr, png_charp name, int compression_type, - png_charp profile, int profile_len) +png_write_iCCP(png_structp png_ptr, png_const_charp name, int compression_type, + png_const_charp profile, int profile_len) { PNG_iCCP; png_size_t name_len; @@ -794,8 +862,7 @@ png_write_iCCP(png_structp png_ptr, png_charp name, int compression_type, comp.input = NULL; comp.input_len = 0; - if ((name_len = png_check_keyword(png_ptr, name, - &new_name)) == 0) + if ((name_len = png_check_keyword(png_ptr, name, &new_name)) == 0) return; if (compression_type != PNG_COMPRESSION_TYPE_BASE) @@ -806,15 +873,16 @@ png_write_iCCP(png_structp png_ptr, png_charp name, int compression_type, if (profile_len > 3) embedded_profile_len = - ((*( (png_bytep)profile ))<<24) | - ((*( (png_bytep)profile + 1))<<16) | - ((*( (png_bytep)profile + 2))<< 8) | - ((*( (png_bytep)profile + 3)) ); + ((*( (png_const_bytep)profile ))<<24) | + ((*( (png_const_bytep)profile + 1))<<16) | + ((*( (png_const_bytep)profile + 2))<< 8) | + ((*( (png_const_bytep)profile + 3)) ); if (embedded_profile_len < 0) { png_warning(png_ptr, - "Embedded profile length in iCCP chunk is negative"); + "Embedded profile length in iCCP chunk is negative"); + png_free(png_ptr, new_name); return; } @@ -822,7 +890,8 @@ png_write_iCCP(png_structp png_ptr, png_charp name, int compression_type, if (profile_len < embedded_profile_len) { png_warning(png_ptr, - "Embedded profile length too large in iCCP chunk"); + "Embedded profile length too large in iCCP chunk"); + png_free(png_ptr, new_name); return; } @@ -830,20 +899,23 @@ png_write_iCCP(png_structp png_ptr, png_charp name, int compression_type, if (profile_len > embedded_profile_len) { png_warning(png_ptr, - "Truncating profile to actual length in iCCP chunk"); + "Truncating profile to actual length in iCCP chunk"); + profile_len = embedded_profile_len; } if (profile_len) profile_len = png_text_compress(png_ptr, profile, - (png_size_t)profile_len, PNG_COMPRESSION_TYPE_BASE, &comp); + (png_size_t)profile_len, PNG_COMPRESSION_TYPE_BASE, &comp); /* Make sure we include the NULL after the name and the compression type */ - png_write_chunk_start(png_ptr, (png_bytep)png_iCCP, - (png_uint_32)(name_len + profile_len + 2)); + png_write_chunk_start(png_ptr, png_iCCP, + (png_uint_32)(name_len + profile_len + 2)); + new_name[name_len + 1] = 0x00; + png_write_chunk_data(png_ptr, (png_bytep)new_name, - (png_size_t)(name_len + 2)); + (png_size_t)(name_len + 2)); if (profile_len) png_write_compressed_data_out(png_ptr, &comp); @@ -856,7 +928,7 @@ png_write_iCCP(png_structp png_ptr, png_charp name, int compression_type, #ifdef PNG_WRITE_sPLT_SUPPORTED /* Write a sPLT chunk */ void /* PRIVATE */ -png_write_sPLT(png_structp png_ptr, png_sPLT_tp spalette) +png_write_sPLT(png_structp png_ptr, png_const_sPLT_tp spalette) { PNG_sPLT; png_size_t name_len; @@ -875,11 +947,13 @@ png_write_sPLT(png_structp png_ptr, png_sPLT_tp spalette) return; /* Make sure we include the NULL after the name */ - png_write_chunk_start(png_ptr, (png_bytep)png_sPLT, - (png_uint_32)(name_len + 2 + palette_size)); + png_write_chunk_start(png_ptr, png_sPLT, + (png_uint_32)(name_len + 2 + palette_size)); + png_write_chunk_data(png_ptr, (png_bytep)new_name, - (png_size_t)(name_len + 1)); - png_write_chunk_data(png_ptr, (png_bytep)&spalette->depth, (png_size_t)1); + (png_size_t)(name_len + 1)); + + png_write_chunk_data(png_ptr, &spalette->depth, (png_size_t)1); /* Loop through each palette entry, writing appropriately */ #ifdef PNG_POINTER_INDEXING_SUPPORTED @@ -887,42 +961,46 @@ png_write_sPLT(png_structp png_ptr, png_sPLT_tp spalette) { if (spalette->depth == 8) { - entrybuf[0] = (png_byte)ep->red; - entrybuf[1] = (png_byte)ep->green; - entrybuf[2] = (png_byte)ep->blue; - entrybuf[3] = (png_byte)ep->alpha; - png_save_uint_16(entrybuf + 4, ep->frequency); + entrybuf[0] = (png_byte)ep->red; + entrybuf[1] = (png_byte)ep->green; + entrybuf[2] = (png_byte)ep->blue; + entrybuf[3] = (png_byte)ep->alpha; + png_save_uint_16(entrybuf + 4, ep->frequency); } + else { - png_save_uint_16(entrybuf + 0, ep->red); - png_save_uint_16(entrybuf + 2, ep->green); - png_save_uint_16(entrybuf + 4, ep->blue); - png_save_uint_16(entrybuf + 6, ep->alpha); - png_save_uint_16(entrybuf + 8, ep->frequency); + png_save_uint_16(entrybuf + 0, ep->red); + png_save_uint_16(entrybuf + 2, ep->green); + png_save_uint_16(entrybuf + 4, ep->blue); + png_save_uint_16(entrybuf + 6, ep->alpha); + png_save_uint_16(entrybuf + 8, ep->frequency); } + png_write_chunk_data(png_ptr, entrybuf, (png_size_t)entry_size); } #else ep=spalette->entries; - for (i=0; i>spalette->nentries; i++) + for (i = 0; i>spalette->nentries; i++) { if (spalette->depth == 8) { - entrybuf[0] = (png_byte)ep[i].red; - entrybuf[1] = (png_byte)ep[i].green; - entrybuf[2] = (png_byte)ep[i].blue; - entrybuf[3] = (png_byte)ep[i].alpha; - png_save_uint_16(entrybuf + 4, ep[i].frequency); + entrybuf[0] = (png_byte)ep[i].red; + entrybuf[1] = (png_byte)ep[i].green; + entrybuf[2] = (png_byte)ep[i].blue; + entrybuf[3] = (png_byte)ep[i].alpha; + png_save_uint_16(entrybuf + 4, ep[i].frequency); } + else { - png_save_uint_16(entrybuf + 0, ep[i].red); - png_save_uint_16(entrybuf + 2, ep[i].green); - png_save_uint_16(entrybuf + 4, ep[i].blue); - png_save_uint_16(entrybuf + 6, ep[i].alpha); - png_save_uint_16(entrybuf + 8, ep[i].frequency); + png_save_uint_16(entrybuf + 0, ep[i].red); + png_save_uint_16(entrybuf + 2, ep[i].green); + png_save_uint_16(entrybuf + 4, ep[i].blue); + png_save_uint_16(entrybuf + 6, ep[i].alpha); + png_save_uint_16(entrybuf + 8, ep[i].frequency); } + png_write_chunk_data(png_ptr, entrybuf, (png_size_t)entry_size); } #endif @@ -935,7 +1013,7 @@ png_write_sPLT(png_structp png_ptr, png_sPLT_tp spalette) #ifdef PNG_WRITE_sBIT_SUPPORTED /* Write the sBIT chunk */ void /* PRIVATE */ -png_write_sBIT(png_structp png_ptr, png_color_8p sbit, int color_type) +png_write_sBIT(png_structp png_ptr, png_const_color_8p sbit, int color_type) { PNG_sBIT; png_byte buf[4]; @@ -949,7 +1027,8 @@ png_write_sBIT(png_structp png_ptr, png_color_8p sbit, int color_type) png_byte maxbits; maxbits = (png_byte)(color_type==PNG_COLOR_TYPE_PALETTE ? 8 : - png_ptr->usr_bit_depth); + png_ptr->usr_bit_depth); + if (sbit->red == 0 || sbit->red > maxbits || sbit->green == 0 || sbit->green > maxbits || sbit->blue == 0 || sbit->blue > maxbits) @@ -957,11 +1036,13 @@ png_write_sBIT(png_structp png_ptr, png_color_8p sbit, int color_type) png_warning(png_ptr, "Invalid sBIT depth specified"); return; } + buf[0] = sbit->red; buf[1] = sbit->green; buf[2] = sbit->blue; size = 3; } + else { if (sbit->gray == 0 || sbit->gray > png_ptr->usr_bit_depth) @@ -969,6 +1050,7 @@ png_write_sBIT(png_structp png_ptr, png_color_8p sbit, int color_type) png_warning(png_ptr, "Invalid sBIT depth specified"); return; } + buf[0] = sbit->gray; size = 1; } @@ -980,67 +1062,21 @@ png_write_sBIT(png_structp png_ptr, png_color_8p sbit, int color_type) png_warning(png_ptr, "Invalid sBIT depth specified"); return; } + buf[size++] = sbit->alpha; } - png_write_chunk(png_ptr, (png_bytep)png_sBIT, buf, size); + png_write_chunk(png_ptr, png_sBIT, buf, size); } #endif #ifdef PNG_WRITE_cHRM_SUPPORTED /* Write the cHRM chunk */ -#ifdef PNG_FLOATING_POINT_SUPPORTED -void /* PRIVATE */ -png_write_cHRM(png_structp png_ptr, double white_x, double white_y, - double red_x, double red_y, double green_x, double green_y, - double blue_x, double blue_y) -{ - PNG_cHRM; - png_byte buf[32]; - - png_fixed_point int_white_x, int_white_y, int_red_x, int_red_y, - int_green_x, int_green_y, int_blue_x, int_blue_y; - - png_debug(1, "in png_write_cHRM"); - - int_white_x = (png_uint_32)(white_x * 100000.0 + 0.5); - int_white_y = (png_uint_32)(white_y * 100000.0 + 0.5); - int_red_x = (png_uint_32)(red_x * 100000.0 + 0.5); - int_red_y = (png_uint_32)(red_y * 100000.0 + 0.5); - int_green_x = (png_uint_32)(green_x * 100000.0 + 0.5); - int_green_y = (png_uint_32)(green_y * 100000.0 + 0.5); - int_blue_x = (png_uint_32)(blue_x * 100000.0 + 0.5); - int_blue_y = (png_uint_32)(blue_y * 100000.0 + 0.5); - -#ifdef PNG_CHECK_cHRM_SUPPORTED - if (png_check_cHRM_fixed(png_ptr, int_white_x, int_white_y, - int_red_x, int_red_y, int_green_x, int_green_y, int_blue_x, int_blue_y)) -#endif - { - /* Each value is saved in 1/100,000ths */ - - png_save_uint_32(buf, int_white_x); - png_save_uint_32(buf + 4, int_white_y); - - png_save_uint_32(buf + 8, int_red_x); - png_save_uint_32(buf + 12, int_red_y); - - png_save_uint_32(buf + 16, int_green_x); - png_save_uint_32(buf + 20, int_green_y); - - png_save_uint_32(buf + 24, int_blue_x); - png_save_uint_32(buf + 28, int_blue_y); - - png_write_chunk(png_ptr, (png_bytep)png_cHRM, buf, (png_size_t)32); - } -} -#endif -#ifdef PNG_FIXED_POINT_SUPPORTED void /* PRIVATE */ png_write_cHRM_fixed(png_structp png_ptr, png_fixed_point white_x, - png_fixed_point white_y, png_fixed_point red_x, png_fixed_point red_y, - png_fixed_point green_x, png_fixed_point green_y, png_fixed_point blue_x, - png_fixed_point blue_y) + png_fixed_point white_y, png_fixed_point red_x, png_fixed_point red_y, + png_fixed_point green_x, png_fixed_point green_y, png_fixed_point blue_x, + png_fixed_point blue_y) { PNG_cHRM; png_byte buf[32]; @@ -1050,7 +1086,7 @@ png_write_cHRM_fixed(png_structp png_ptr, png_fixed_point white_x, /* Each value is saved in 1/100,000ths */ #ifdef PNG_CHECK_cHRM_SUPPORTED if (png_check_cHRM_fixed(png_ptr, white_x, white_y, red_x, red_y, - green_x, green_y, blue_x, blue_y)) + green_x, green_y, blue_x, blue_y)) #endif { png_save_uint_32(buf, (png_uint_32)white_x); @@ -1065,17 +1101,16 @@ png_write_cHRM_fixed(png_structp png_ptr, png_fixed_point white_x, png_save_uint_32(buf + 24, (png_uint_32)blue_x); png_save_uint_32(buf + 28, (png_uint_32)blue_y); - png_write_chunk(png_ptr, (png_bytep)png_cHRM, buf, (png_size_t)32); + png_write_chunk(png_ptr, png_cHRM, buf, (png_size_t)32); } } #endif -#endif #ifdef PNG_WRITE_tRNS_SUPPORTED /* Write the tRNS chunk */ void /* PRIVATE */ -png_write_tRNS(png_structp png_ptr, png_bytep trans_alpha, png_color_16p tran, - int num_trans, int color_type) +png_write_tRNS(png_structp png_ptr, png_const_bytep trans_alpha, + png_const_color_16p tran, int num_trans, int color_type) { PNG_tRNS; png_byte buf[6]; @@ -1089,36 +1124,46 @@ png_write_tRNS(png_structp png_ptr, png_bytep trans_alpha, png_color_16p tran, png_warning(png_ptr, "Invalid number of transparent colors specified"); return; } + /* Write the chunk out as it is */ - png_write_chunk(png_ptr, (png_bytep)png_tRNS, trans_alpha, - (png_size_t)num_trans); + png_write_chunk(png_ptr, png_tRNS, trans_alpha, (png_size_t)num_trans); } + else if (color_type == PNG_COLOR_TYPE_GRAY) { /* One 16 bit value */ if (tran->gray >= (1 << png_ptr->bit_depth)) { png_warning(png_ptr, - "Ignoring attempt to write tRNS chunk out-of-range for bit_depth"); + "Ignoring attempt to write tRNS chunk out-of-range for bit_depth"); + return; } + png_save_uint_16(buf, tran->gray); - png_write_chunk(png_ptr, (png_bytep)png_tRNS, buf, (png_size_t)2); + png_write_chunk(png_ptr, png_tRNS, buf, (png_size_t)2); } + else if (color_type == PNG_COLOR_TYPE_RGB) { /* Three 16 bit values */ png_save_uint_16(buf, tran->red); png_save_uint_16(buf + 2, tran->green); png_save_uint_16(buf + 4, tran->blue); +#ifdef PNG_WRITE_16BIT_SUPPORTED if (png_ptr->bit_depth == 8 && (buf[0] | buf[2] | buf[4])) +#else + if (buf[0] | buf[2] | buf[4]) +#endif { png_warning(png_ptr, "Ignoring attempt to write 16-bit tRNS chunk when bit_depth is 8"); return; } - png_write_chunk(png_ptr, (png_bytep)png_tRNS, buf, (png_size_t)6); + + png_write_chunk(png_ptr, png_tRNS, buf, (png_size_t)6); } + else { png_warning(png_ptr, "Can't write tRNS with an alpha channel"); @@ -1129,7 +1174,7 @@ png_write_tRNS(png_structp png_ptr, png_bytep trans_alpha, png_color_16p tran, #ifdef PNG_WRITE_bKGD_SUPPORTED /* Write the background chunk */ void /* PRIVATE */ -png_write_bKGD(png_structp png_ptr, png_color_16p back, int color_type) +png_write_bKGD(png_structp png_ptr, png_const_color_16p back, int color_type) { PNG_bKGD; png_byte buf[6]; @@ -1148,32 +1193,43 @@ png_write_bKGD(png_structp png_ptr, png_color_16p back, int color_type) png_warning(png_ptr, "Invalid background palette index"); return; } + buf[0] = back->index; - png_write_chunk(png_ptr, (png_bytep)png_bKGD, buf, (png_size_t)1); + png_write_chunk(png_ptr, png_bKGD, buf, (png_size_t)1); } + else if (color_type & PNG_COLOR_MASK_COLOR) { png_save_uint_16(buf, back->red); png_save_uint_16(buf + 2, back->green); png_save_uint_16(buf + 4, back->blue); +#ifdef PNG_WRITE_16BIT_SUPPORTED if (png_ptr->bit_depth == 8 && (buf[0] | buf[2] | buf[4])) +#else + if (buf[0] | buf[2] | buf[4]) +#endif { png_warning(png_ptr, - "Ignoring attempt to write 16-bit bKGD chunk when bit_depth is 8"); + "Ignoring attempt to write 16-bit bKGD chunk when bit_depth is 8"); + return; } - png_write_chunk(png_ptr, (png_bytep)png_bKGD, buf, (png_size_t)6); + + png_write_chunk(png_ptr, png_bKGD, buf, (png_size_t)6); } + else { if (back->gray >= (1 << png_ptr->bit_depth)) { png_warning(png_ptr, - "Ignoring attempt to write bKGD chunk out-of-range for bit_depth"); + "Ignoring attempt to write bKGD chunk out-of-range for bit_depth"); + return; } + png_save_uint_16(buf, back->gray); - png_write_chunk(png_ptr, (png_bytep)png_bKGD, buf, (png_size_t)2); + png_write_chunk(png_ptr, png_bKGD, buf, (png_size_t)2); } } #endif @@ -1181,7 +1237,7 @@ png_write_bKGD(png_structp png_ptr, png_color_16p back, int color_type) #ifdef PNG_WRITE_hIST_SUPPORTED /* Write the histogram */ void /* PRIVATE */ -png_write_hIST(png_structp png_ptr, png_uint_16p hist, int num_hist) +png_write_hIST(png_structp png_ptr, png_const_uint_16p hist, int num_hist) { PNG_hIST; int i; @@ -1192,18 +1248,20 @@ png_write_hIST(png_structp png_ptr, png_uint_16p hist, int num_hist) if (num_hist > (int)png_ptr->num_palette) { png_debug2(3, "num_hist = %d, num_palette = %d", num_hist, - png_ptr->num_palette); + png_ptr->num_palette); + png_warning(png_ptr, "Invalid number of histogram entries specified"); return; } - png_write_chunk_start(png_ptr, (png_bytep)png_hIST, - (png_uint_32)(num_hist * 2)); + png_write_chunk_start(png_ptr, png_hIST, (png_uint_32)(num_hist * 2)); + for (i = 0; i < num_hist; i++) { png_save_uint_16(buf, hist[i]); png_write_chunk_data(png_ptr, buf, (png_size_t)2); } + png_write_chunk_end(png_ptr); } #endif @@ -1221,9 +1279,10 @@ png_write_hIST(png_structp png_ptr, png_uint_16p hist, int num_hist) * static keywords without having to have duplicate copies of the strings. */ png_size_t /* PRIVATE */ -png_check_keyword(png_structp png_ptr, png_charp key, png_charpp new_key) +png_check_keyword(png_structp png_ptr, png_const_charp key, png_charpp new_key) { png_size_t key_len; + png_const_charp ikp; png_charp kp, dp; int kflag; int kwarn=0; @@ -1241,6 +1300,7 @@ png_check_keyword(png_structp png_ptr, png_charp key, png_charpp new_key) png_debug1(2, "Keyword to be checked is '%s'", key); *new_key = (png_charp)png_malloc_warn(png_ptr, (png_uint_32)(key_len + 2)); + if (*new_key == NULL) { png_warning(png_ptr, "Out of memory while procesing keyword"); @@ -1248,25 +1308,26 @@ png_check_keyword(png_structp png_ptr, png_charp key, png_charpp new_key) } /* Replace non-printing characters with a blank and print a warning */ - for (kp = key, dp = *new_key; *kp != '\0'; kp++, dp++) + for (ikp = key, dp = *new_key; *ikp != '\0'; ikp++, dp++) { - if ((png_byte)*kp < 0x20 || - ((png_byte)*kp > 0x7E && (png_byte)*kp < 0xA1)) + if ((png_byte)*ikp < 0x20 || + ((png_byte)*ikp > 0x7E && (png_byte)*ikp < 0xA1)) { -#ifdef PNG_STDIO_SUPPORTED +#ifdef PNG_CONSOLE_IO_SUPPORTED char msg[40]; png_snprintf(msg, 40, - "invalid keyword character 0x%02X", (png_byte)*kp); + "invalid keyword character 0x%02X", (png_byte)*ikp); png_warning(png_ptr, msg); #else png_warning(png_ptr, "invalid character in keyword"); #endif *dp = ' '; } + else { - *dp = *kp; + *dp = *ikp; } } *dp = '\0'; @@ -1307,11 +1368,13 @@ png_check_keyword(png_structp png_ptr, png_charp key, png_charpp new_key) *(dp++) = *kp; kflag = 1; } + else if (*kp == ' ') { key_len--; - kwarn=1; + kwarn = 1; } + else { *(dp++) = *kp; @@ -1342,8 +1405,8 @@ png_check_keyword(png_structp png_ptr, png_charp key, png_charpp new_key) #ifdef PNG_WRITE_tEXt_SUPPORTED /* Write a tEXt chunk */ void /* PRIVATE */ -png_write_tEXt(png_structp png_ptr, png_charp key, png_charp text, - png_size_t text_len) +png_write_tEXt(png_structp png_ptr, png_const_charp key, png_const_charp text, + png_size_t text_len) { PNG_tEXt; png_size_t key_len; @@ -1356,12 +1419,13 @@ png_write_tEXt(png_structp png_ptr, png_charp key, png_charp text, if (text == NULL || *text == '\0') text_len = 0; + else text_len = png_strlen(text); /* Make sure we include the 0 after the key */ - png_write_chunk_start(png_ptr, (png_bytep)png_tEXt, - (png_uint_32)(key_len + text_len + 1)); + png_write_chunk_start(png_ptr, png_tEXt, + (png_uint_32)(key_len + text_len + 1)); /* * We leave it to the application to meet PNG-1.0 requirements on the * contents of the text. PNG-1.0 through PNG-1.2 discourage the use of @@ -1369,9 +1433,11 @@ png_write_tEXt(png_structp png_ptr, png_charp key, png_charp text, * The NUL character is forbidden by PNG-1.0 through PNG-1.2 and ISO PNG. */ png_write_chunk_data(png_ptr, (png_bytep)new_key, - (png_size_t)(key_len + 1)); + (png_size_t)(key_len + 1)); + if (text_len) - png_write_chunk_data(png_ptr, (png_bytep)text, (png_size_t)text_len); + png_write_chunk_data(png_ptr, (png_const_bytep)text, + (png_size_t)text_len); png_write_chunk_end(png_ptr); png_free(png_ptr, new_key); @@ -1381,12 +1447,12 @@ png_write_tEXt(png_structp png_ptr, png_charp key, png_charp text, #ifdef PNG_WRITE_zTXt_SUPPORTED /* Write a compressed text chunk */ void /* PRIVATE */ -png_write_zTXt(png_structp png_ptr, png_charp key, png_charp text, - png_size_t text_len, int compression) +png_write_zTXt(png_structp png_ptr, png_const_charp key, png_const_charp text, + png_size_t text_len, int compression) { PNG_zTXt; png_size_t key_len; - char buf[1]; + png_byte buf; png_charp new_key; compression_state comp; @@ -1398,7 +1464,7 @@ png_write_zTXt(png_structp png_ptr, png_charp key, png_charp text, comp.input = NULL; comp.input_len = 0; - if ((key_len = png_check_keyword(png_ptr, key, &new_key))==0) + if ((key_len = png_check_keyword(png_ptr, key, &new_key)) == 0) { png_free(png_ptr, new_key); return; @@ -1418,16 +1484,20 @@ png_write_zTXt(png_structp png_ptr, png_charp key, png_charp text, &comp); /* Write start of chunk */ - png_write_chunk_start(png_ptr, (png_bytep)png_zTXt, - (png_uint_32)(key_len+text_len + 2)); + png_write_chunk_start(png_ptr, png_zTXt, + (png_uint_32)(key_len+text_len + 2)); + /* Write key */ png_write_chunk_data(png_ptr, (png_bytep)new_key, - (png_size_t)(key_len + 1)); + (png_size_t)(key_len + 1)); + png_free(png_ptr, new_key); - buf[0] = (png_byte)compression; + buf = (png_byte)compression; + /* Write compression */ - png_write_chunk_data(png_ptr, (png_bytep)buf, (png_size_t)1); + png_write_chunk_data(png_ptr, &buf, (png_size_t)1); + /* Write the compressed data */ png_write_compressed_data_out(png_ptr, &comp); @@ -1439,8 +1509,8 @@ png_write_zTXt(png_structp png_ptr, png_charp key, png_charp text, #ifdef PNG_WRITE_iTXt_SUPPORTED /* Write an iTXt chunk */ void /* PRIVATE */ -png_write_iTXt(png_structp png_ptr, int compression, png_charp key, - png_charp lang, png_charp lang_key, png_charp text) +png_write_iTXt(png_structp png_ptr, int compression, png_const_charp key, + png_const_charp lang, png_const_charp lang_key, png_const_charp text) { PNG_iTXt; png_size_t lang_len, key_len, lang_key_len, text_len; @@ -1456,10 +1526,10 @@ png_write_iTXt(png_structp png_ptr, int compression, png_charp key, comp.output_ptr = NULL; comp.input = NULL; - if ((key_len = png_check_keyword(png_ptr, key, &new_key))==0) + if ((key_len = png_check_keyword(png_ptr, key, &new_key)) == 0) return; - if ((lang_len = png_check_keyword(png_ptr, lang, &new_lang))==0) + if ((lang_len = png_check_keyword(png_ptr, lang, &new_lang)) == 0) { png_warning(png_ptr, "Empty language field in iTXt chunk"); new_lang = NULL; @@ -1468,24 +1538,26 @@ png_write_iTXt(png_structp png_ptr, int compression, png_charp key, if (lang_key == NULL) lang_key_len = 0; + else lang_key_len = png_strlen(lang_key); if (text == NULL) text_len = 0; + else text_len = png_strlen(text); /* Compute the compressed data; do it now for the length */ - text_len = png_text_compress(png_ptr, text, text_len, compression-2, - &comp); + text_len = png_text_compress(png_ptr, text, text_len, compression - 2, + &comp); /* Make sure we include the compression flag, the compression byte, - * and the NULs after the key, lang, and lang_key parts */ + * and the NULs after the key, lang, and lang_key parts + */ - png_write_chunk_start(png_ptr, (png_bytep)png_iTXt, - (png_uint_32)( + png_write_chunk_start(png_ptr, png_iTXt, (png_uint_32)( 5 /* comp byte, comp flag, terminators for key, lang and lang_key */ + key_len + lang_len @@ -1497,27 +1569,32 @@ png_write_iTXt(png_structp png_ptr, int compression, png_charp key, * any non-Latin-1 characters except for NEWLINE. ISO PNG will forbid them. * The NUL character is forbidden by PNG-1.0 through PNG-1.2 and ISO PNG. */ - png_write_chunk_data(png_ptr, (png_bytep)new_key, - (png_size_t)(key_len + 1)); + png_write_chunk_data(png_ptr, (png_bytep)new_key, (png_size_t)(key_len + 1)); /* Set the compression flag */ - if (compression == PNG_ITXT_COMPRESSION_NONE || \ + if (compression == PNG_ITXT_COMPRESSION_NONE || compression == PNG_TEXT_COMPRESSION_NONE) - cbuf[0] = 0; + cbuf[0] = 0; + else /* compression == PNG_ITXT_COMPRESSION_zTXt */ - cbuf[0] = 1; + cbuf[0] = 1; + /* Set the compression method */ cbuf[1] = 0; + png_write_chunk_data(png_ptr, cbuf, (png_size_t)2); cbuf[0] = 0; - png_write_chunk_data(png_ptr, (new_lang ? (png_bytep)new_lang : cbuf), - (png_size_t)(lang_len + 1)); - png_write_chunk_data(png_ptr, (lang_key ? (png_bytep)lang_key : cbuf), - (png_size_t)(lang_key_len + 1)); + png_write_chunk_data(png_ptr, (new_lang ? (png_const_bytep)new_lang : cbuf), + (png_size_t)(lang_len + 1)); + + png_write_chunk_data(png_ptr, (lang_key ? (png_const_bytep)lang_key : cbuf), + (png_size_t)(lang_key_len + 1)); + png_write_compressed_data_out(png_ptr, &comp); png_write_chunk_end(png_ptr); + png_free(png_ptr, new_key); png_free(png_ptr, new_lang); } @@ -1527,7 +1604,7 @@ png_write_iTXt(png_structp png_ptr, int compression, png_charp key, /* Write the oFFs chunk */ void /* PRIVATE */ png_write_oFFs(png_structp png_ptr, png_int_32 x_offset, png_int_32 y_offset, - int unit_type) + int unit_type) { PNG_oFFs; png_byte buf[9]; @@ -1541,14 +1618,15 @@ png_write_oFFs(png_structp png_ptr, png_int_32 x_offset, png_int_32 y_offset, png_save_int_32(buf + 4, y_offset); buf[8] = (png_byte)unit_type; - png_write_chunk(png_ptr, (png_bytep)png_oFFs, buf, (png_size_t)9); + png_write_chunk(png_ptr, png_oFFs, buf, (png_size_t)9); } #endif #ifdef PNG_WRITE_pCAL_SUPPORTED /* Write the pCAL chunk (described in the PNG extensions document) */ void /* PRIVATE */ png_write_pCAL(png_structp png_ptr, png_charp purpose, png_int_32 X0, - png_int_32 X1, int type, int nparams, png_charp units, png_charpp params) + png_int_32 X1, int type, int nparams, png_const_charp units, + png_charpp params) { PNG_pCAL; png_size_t purpose_len, units_len, total_len; @@ -1569,35 +1647,36 @@ png_write_pCAL(png_structp png_ptr, png_charp purpose, png_int_32 X0, total_len = purpose_len + units_len + 10; params_len = (png_uint_32p)png_malloc(png_ptr, - (png_alloc_size_t)(nparams * png_sizeof(png_uint_32))); + (png_alloc_size_t)(nparams * png_sizeof(png_uint_32))); /* Find the length of each parameter, making sure we don't count the - null terminator for the last parameter. */ + * null terminator for the last parameter. + */ for (i = 0; i < nparams; i++) { params_len[i] = png_strlen(params[i]) + (i == nparams - 1 ? 0 : 1); png_debug2(3, "pCAL parameter %d length = %lu", i, - (unsigned long) params_len[i]); + (unsigned long)params_len[i]); total_len += (png_size_t)params_len[i]; } png_debug1(3, "pCAL total length = %d", (int)total_len); - png_write_chunk_start(png_ptr, (png_bytep)png_pCAL, (png_uint_32)total_len); - png_write_chunk_data(png_ptr, (png_bytep)new_purpose, - (png_size_t)purpose_len); + png_write_chunk_start(png_ptr, png_pCAL, (png_uint_32)total_len); + png_write_chunk_data(png_ptr, (png_const_bytep)new_purpose, + (png_size_t)purpose_len); png_save_int_32(buf, X0); png_save_int_32(buf + 4, X1); buf[8] = (png_byte)type; buf[9] = (png_byte)nparams; png_write_chunk_data(png_ptr, buf, (png_size_t)10); - png_write_chunk_data(png_ptr, (png_bytep)units, (png_size_t)units_len); + png_write_chunk_data(png_ptr, (png_const_bytep)units, (png_size_t)units_len); png_free(png_ptr, new_purpose); for (i = 0; i < nparams; i++) { - png_write_chunk_data(png_ptr, (png_bytep)params[i], - (png_size_t)params_len[i]); + png_write_chunk_data(png_ptr, (png_const_bytep)params[i], + (png_size_t)params_len[i]); } png_free(png_ptr, params_len); @@ -1607,30 +1686,9 @@ png_write_pCAL(png_structp png_ptr, png_charp purpose, png_int_32 X0, #ifdef PNG_WRITE_sCAL_SUPPORTED /* Write the sCAL chunk */ -#if defined(PNG_FLOATING_POINT_SUPPORTED) && defined(PNG_STDIO_SUPPORTED) void /* PRIVATE */ -png_write_sCAL(png_structp png_ptr, int unit, double width, double height) -{ - PNG_sCAL; - char buf[64]; - png_size_t total_len; - - png_debug(1, "in png_write_sCAL"); - - buf[0] = (char)unit; - png_snprintf(buf + 1, 63, "%12.12e", width); - total_len = 1 + png_strlen(buf + 1) + 1; - png_snprintf(buf + total_len, 64-total_len, "%12.12e", height); - total_len += png_strlen(buf + total_len); - - png_debug1(3, "sCAL total length = %u", (unsigned int)total_len); - png_write_chunk(png_ptr, (png_bytep)png_sCAL, (png_bytep)buf, total_len); -} -#else -#ifdef PNG_FIXED_POINT_SUPPORTED -void /* PRIVATE */ -png_write_sCAL_s(png_structp png_ptr, int unit, png_charp width, - png_charp height) +png_write_sCAL_s(png_structp png_ptr, int unit, png_const_charp width, + png_const_charp height) { PNG_sCAL; png_byte buf[64]; @@ -1641,6 +1699,7 @@ png_write_sCAL_s(png_structp png_ptr, int unit, png_charp width, wlen = png_strlen(width); hlen = png_strlen(height); total_len = wlen + hlen + 2; + if (total_len > 64) { png_warning(png_ptr, "Can't write sCAL (buffer too small)"); @@ -1652,18 +1711,16 @@ png_write_sCAL_s(png_structp png_ptr, int unit, png_charp width, png_memcpy(buf + wlen + 2, height, hlen); /* Do NOT append the '\0' here */ png_debug1(3, "sCAL total length = %u", (unsigned int)total_len); - png_write_chunk(png_ptr, (png_bytep)png_sCAL, buf, total_len); + png_write_chunk(png_ptr, png_sCAL, buf, total_len); } #endif -#endif -#endif #ifdef PNG_WRITE_pHYs_SUPPORTED /* Write the pHYs chunk */ void /* PRIVATE */ png_write_pHYs(png_structp png_ptr, png_uint_32 x_pixels_per_unit, - png_uint_32 y_pixels_per_unit, - int unit_type) + png_uint_32 y_pixels_per_unit, + int unit_type) { PNG_pHYs; png_byte buf[9]; @@ -1677,7 +1734,7 @@ png_write_pHYs(png_structp png_ptr, png_uint_32 x_pixels_per_unit, png_save_uint_32(buf + 4, y_pixels_per_unit); buf[8] = (png_byte)unit_type; - png_write_chunk(png_ptr, (png_bytep)png_pHYs, buf, (png_size_t)9); + png_write_chunk(png_ptr, png_pHYs, buf, (png_size_t)9); } #endif @@ -1686,7 +1743,7 @@ png_write_pHYs(png_structp png_ptr, png_uint_32 x_pixels_per_unit, * or png_convert_from_time_t(), or fill in the structure yourself. */ void /* PRIVATE */ -png_write_tIME(png_structp png_ptr, png_timep mod_time) +png_write_tIME(png_structp png_ptr, png_const_timep mod_time) { PNG_tIME; png_byte buf[7]; @@ -1708,7 +1765,7 @@ png_write_tIME(png_structp png_ptr, png_timep mod_time) buf[5] = mod_time->minute; buf[6] = mod_time->second; - png_write_chunk(png_ptr, (png_bytep)png_tIME, buf, (png_size_t)7); + png_write_chunk(png_ptr, png_tIME, buf, (png_size_t)7); } #endif @@ -1737,19 +1794,20 @@ png_write_start_row(png_structp png_ptr) png_debug(1, "in png_write_start_row"); buf_size = (png_size_t)(PNG_ROWBYTES( - png_ptr->usr_channels*png_ptr->usr_bit_depth, png_ptr->width) + 1); + png_ptr->usr_channels*png_ptr->usr_bit_depth, png_ptr->width) + 1); /* Set up row buffer */ png_ptr->row_buf = (png_bytep)png_malloc(png_ptr, - (png_alloc_size_t)buf_size); + (png_alloc_size_t)buf_size); + png_ptr->row_buf[0] = PNG_FILTER_VALUE_NONE; #ifdef PNG_WRITE_FILTER_SUPPORTED /* Set up filtering buffer, if using this filter */ if (png_ptr->do_filter & PNG_FILTER_SUB) { - png_ptr->sub_row = (png_bytep)png_malloc(png_ptr, - (png_alloc_size_t)(png_ptr->rowbytes + 1)); + png_ptr->sub_row = (png_bytep)png_malloc(png_ptr, png_ptr->rowbytes + 1); + png_ptr->sub_row[0] = PNG_FILTER_VALUE_SUB; } @@ -1758,26 +1816,29 @@ png_write_start_row(png_structp png_ptr) { /* Set up previous row buffer */ png_ptr->prev_row = (png_bytep)png_calloc(png_ptr, - (png_alloc_size_t)buf_size); + (png_alloc_size_t)buf_size); if (png_ptr->do_filter & PNG_FILTER_UP) { png_ptr->up_row = (png_bytep)png_malloc(png_ptr, - (png_size_t)(png_ptr->rowbytes + 1)); + png_ptr->rowbytes + 1); + png_ptr->up_row[0] = PNG_FILTER_VALUE_UP; } if (png_ptr->do_filter & PNG_FILTER_AVG) { png_ptr->avg_row = (png_bytep)png_malloc(png_ptr, - (png_alloc_size_t)(png_ptr->rowbytes + 1)); + png_ptr->rowbytes + 1); + png_ptr->avg_row[0] = PNG_FILTER_VALUE_AVG; } if (png_ptr->do_filter & PNG_FILTER_PAETH) { png_ptr->paeth_row = (png_bytep)png_malloc(png_ptr, - (png_size_t)(png_ptr->rowbytes + 1)); + png_ptr->rowbytes + 1); + png_ptr->paeth_row[0] = PNG_FILTER_VALUE_PAETH; } } @@ -1790,22 +1851,26 @@ png_write_start_row(png_structp png_ptr) if (!(png_ptr->transformations & PNG_INTERLACE)) { png_ptr->num_rows = (png_ptr->height + png_pass_yinc[0] - 1 - - png_pass_ystart[0]) / png_pass_yinc[0]; + png_pass_ystart[0]) / png_pass_yinc[0]; + png_ptr->usr_width = (png_ptr->width + png_pass_inc[0] - 1 - - png_pass_start[0]) / png_pass_inc[0]; + png_pass_start[0]) / png_pass_inc[0]; } + else { png_ptr->num_rows = png_ptr->height; png_ptr->usr_width = png_ptr->width; } } + else #endif { png_ptr->num_rows = png_ptr->height; png_ptr->usr_width = png_ptr->width; } + png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; png_ptr->zstream.next_out = png_ptr->zbuf; } @@ -1850,24 +1915,30 @@ png_write_finish_row(png_structp png_ptr) { png_ptr->pass++; } + else { /* Loop until we find a non-zero width or height pass */ do { png_ptr->pass++; + if (png_ptr->pass >= 7) break; + png_ptr->usr_width = (png_ptr->width + - png_pass_inc[png_ptr->pass] - 1 - - png_pass_start[png_ptr->pass]) / - png_pass_inc[png_ptr->pass]; + png_pass_inc[png_ptr->pass] - 1 - + png_pass_start[png_ptr->pass]) / + png_pass_inc[png_ptr->pass]; + png_ptr->num_rows = (png_ptr->height + - png_pass_yinc[png_ptr->pass] - 1 - - png_pass_ystart[png_ptr->pass]) / - png_pass_yinc[png_ptr->pass]; + png_pass_yinc[png_ptr->pass] - 1 - + png_pass_ystart[png_ptr->pass]) / + png_pass_yinc[png_ptr->pass]; + if (png_ptr->transformations & PNG_INTERLACE) break; + } while (png_ptr->usr_width == 0 || png_ptr->num_rows == 0); } @@ -1877,8 +1948,9 @@ png_write_finish_row(png_structp png_ptr) { if (png_ptr->prev_row != NULL) png_memset(png_ptr->prev_row, 0, - (png_size_t)(PNG_ROWBYTES(png_ptr->usr_channels* - png_ptr->usr_bit_depth, png_ptr->width)) + 1); + (png_size_t)(PNG_ROWBYTES(png_ptr->usr_channels* + png_ptr->usr_bit_depth, png_ptr->width)) + 1); + return; } } @@ -1890,6 +1962,7 @@ png_write_finish_row(png_structp png_ptr) { /* Tell the compressor we are done */ ret = deflate(&png_ptr->zstream, Z_FINISH); + /* Check for an error */ if (ret == Z_OK) { @@ -1901,10 +1974,12 @@ png_write_finish_row(png_structp png_ptr) png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; } } + else if (ret != Z_STREAM_END) { if (png_ptr->zstream.msg != NULL) png_error(png_ptr, png_ptr->zstream.msg); + else png_error(png_ptr, "zlib error"); } @@ -1914,7 +1989,7 @@ png_write_finish_row(png_structp png_ptr) if (png_ptr->zstream.avail_out < png_ptr->zbuf_size) { png_write_IDAT(png_ptr, png_ptr->zbuf, png_ptr->zbuf_size - - png_ptr->zstream.avail_out); + png_ptr->zstream.avail_out); } deflateReset(&png_ptr->zstream); @@ -1961,6 +2036,7 @@ png_do_write_interlace(png_row_infop row_info, png_bytep row, int pass) dp = row; d = 0; shift = 7; + for (i = png_pass_start[pass]; i < row_width; i += png_pass_inc[pass]) { @@ -1974,14 +2050,17 @@ png_do_write_interlace(png_row_infop row_info, png_bytep row, int pass) *dp++ = (png_byte)d; d = 0; } + else shift--; } if (shift != 7) *dp = (png_byte)d; + break; } + case 2: { png_bytep sp; @@ -1995,6 +2074,7 @@ png_do_write_interlace(png_row_infop row_info, png_bytep row, int pass) dp = row; shift = 6; d = 0; + for (i = png_pass_start[pass]; i < row_width; i += png_pass_inc[pass]) { @@ -2008,13 +2088,16 @@ png_do_write_interlace(png_row_infop row_info, png_bytep row, int pass) *dp++ = (png_byte)d; d = 0; } + else shift -= 2; } if (shift != 6) - *dp = (png_byte)d; + *dp = (png_byte)d; + break; } + case 4: { png_bytep sp; @@ -2029,7 +2112,7 @@ png_do_write_interlace(png_row_infop row_info, png_bytep row, int pass) shift = 4; d = 0; for (i = png_pass_start[pass]; i < row_width; - i += png_pass_inc[pass]) + i += png_pass_inc[pass]) { sp = row + (png_size_t)(i >> 1); value = (*sp >> ((1 - (int)(i & 0x01)) << 2)) & 0x0f; @@ -2041,13 +2124,16 @@ png_do_write_interlace(png_row_infop row_info, png_bytep row, int pass) *dp++ = (png_byte)d; d = 0; } + else shift -= 4; } if (shift != 4) *dp = (png_byte)d; + break; } + default: { png_bytep sp; @@ -2058,18 +2144,21 @@ png_do_write_interlace(png_row_infop row_info, png_bytep row, int pass) /* Start at the beginning */ dp = row; + /* Find out how many bytes each pixel takes up */ pixel_bytes = (row_info->pixel_depth >> 3); - /* Loop through the row, only looking at the pixels that - matter */ + + /* Loop through the row, only looking at the pixels that matter */ for (i = png_pass_start[pass]; i < row_width; i += png_pass_inc[pass]) { /* Find out where the original pixel is */ sp = row + (png_size_t)i * pixel_bytes; + /* Move the pixel */ if (dp != sp) png_memcpy(dp, sp, pixel_bytes); + /* Next pixel */ dp += pixel_bytes; } @@ -2078,11 +2167,12 @@ png_do_write_interlace(png_row_infop row_info, png_bytep row, int pass) } /* Set new row width */ row_info->width = (row_info->width + - png_pass_inc[pass] - 1 - - png_pass_start[pass]) / - png_pass_inc[pass]; - row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, - row_info->width); + png_pass_inc[pass] - 1 - + png_pass_start[pass]) / + png_pass_inc[pass]; + + row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, + row_info->width); } } #endif @@ -2103,7 +2193,7 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info) png_bytep prev_row, row_buf; png_uint_32 mins, bpp; png_byte filter_to_do = png_ptr->do_filter; - png_uint_32 row_bytes = row_info->rowbytes; + png_size_t row_bytes = row_info->rowbytes; #ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED int num_p_filters = (int)png_ptr->num_prev_filters; #endif @@ -2113,8 +2203,8 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info) #ifndef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED if (png_ptr->row_number == 0 && filter_to_do == PNG_ALL_FILTERS) { - /* These will never be selected so we need not test them. */ - filter_to_do &= ~(PNG_FILTER_UP | PNG_FILTER_PAETH); + /* These will never be selected so we need not test them. */ + filter_to_do &= ~(PNG_FILTER_UP | PNG_FILTER_PAETH); } #endif @@ -2140,11 +2230,14 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info) * computationally expensive). * * GRR 980525: consider also + * * (1) minimum sum of absolute differences from running average (i.e., * keep running sum of non-absolute differences & count of bytes) * [track dispersion, too? restart average if dispersion too large?] + * * (1b) minimum sum of absolute differences from sliding average, probably * with window size <= deflate window (usually 32K) + * * (2) minimum sum of squared differences from zero or running average * (i.e., ~ root-mean-square approach) */ @@ -2153,12 +2246,11 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info) /* We don't need to test the 'no filter' case if this is the only filter * that has been chosen, as it doesn't actually do anything to the data. */ - if ((filter_to_do & PNG_FILTER_NONE) && - filter_to_do != PNG_FILTER_NONE) + if ((filter_to_do & PNG_FILTER_NONE) && filter_to_do != PNG_FILTER_NONE) { png_bytep rp; png_uint_32 sum = 0; - png_uint_32 i; + png_size_t i; int v; for (i = 0, rp = row_buf + 1; i < row_bytes; i++, rp++) @@ -2181,9 +2273,10 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info) if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_NONE) { sumlo = (sumlo * png_ptr->filter_weights[j]) >> - PNG_WEIGHT_SHIFT; + PNG_WEIGHT_SHIFT; + sumhi = (sumhi * png_ptr->filter_weights[j]) >> - PNG_WEIGHT_SHIFT; + PNG_WEIGHT_SHIFT; } } @@ -2192,12 +2285,14 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info) * it has the minimum possible computational cost - none). */ sumlo = (sumlo * png_ptr->filter_costs[PNG_FILTER_VALUE_NONE]) >> - PNG_COST_SHIFT; + PNG_COST_SHIFT; + sumhi = (sumhi * png_ptr->filter_costs[PNG_FILTER_VALUE_NONE]) >> - PNG_COST_SHIFT; + PNG_COST_SHIFT; if (sumhi > PNG_HIMASK) sum = PNG_MAXSUM; + else sum = (sumhi << PNG_HISHIFT) + sumlo; } @@ -2210,17 +2305,20 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info) /* It's the only filter so no testing is needed */ { png_bytep rp, lp, dp; - png_uint_32 i; + png_size_t i; + for (i = 0, rp = row_buf + 1, dp = png_ptr->sub_row + 1; i < bpp; i++, rp++, dp++) { *dp = *rp; } + for (lp = row_buf + 1; i < row_bytes; i++, rp++, lp++, dp++) { *dp = (png_byte)(((int)*rp - (int)*lp) & 0xff); } + best_row = png_ptr->sub_row; } @@ -2228,7 +2326,7 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info) { png_bytep rp, dp, lp; png_uint_32 sum = 0, lmins = mins; - png_uint_32 i; + png_size_t i; int v; #ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED @@ -2248,19 +2346,22 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info) if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_SUB) { lmlo = (lmlo * png_ptr->inv_filter_weights[j]) >> - PNG_WEIGHT_SHIFT; + PNG_WEIGHT_SHIFT; + lmhi = (lmhi * png_ptr->inv_filter_weights[j]) >> - PNG_WEIGHT_SHIFT; + PNG_WEIGHT_SHIFT; } } lmlo = (lmlo * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_SUB]) >> - PNG_COST_SHIFT; + PNG_COST_SHIFT; + lmhi = (lmhi * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_SUB]) >> - PNG_COST_SHIFT; + PNG_COST_SHIFT; if (lmhi > PNG_HIMASK) lmins = PNG_MAXSUM; + else lmins = (lmhi << PNG_HISHIFT) + lmlo; } @@ -2273,6 +2374,7 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info) sum += (v < 128) ? v : 256 - v; } + for (lp = row_buf + 1; i < row_bytes; i++, rp++, lp++, dp++) { @@ -2297,19 +2399,22 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info) if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_SUB) { sumlo = (sumlo * png_ptr->inv_filter_weights[j]) >> - PNG_WEIGHT_SHIFT; + PNG_WEIGHT_SHIFT; + sumhi = (sumhi * png_ptr->inv_filter_weights[j]) >> - PNG_WEIGHT_SHIFT; + PNG_WEIGHT_SHIFT; } } sumlo = (sumlo * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_SUB]) >> - PNG_COST_SHIFT; + PNG_COST_SHIFT; + sumhi = (sumhi * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_SUB]) >> - PNG_COST_SHIFT; + PNG_COST_SHIFT; if (sumhi > PNG_HIMASK) sum = PNG_MAXSUM; + else sum = (sumhi << PNG_HISHIFT) + sumlo; } @@ -2326,14 +2431,15 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info) if (filter_to_do == PNG_FILTER_UP) { png_bytep rp, dp, pp; - png_uint_32 i; + png_size_t i; for (i = 0, rp = row_buf + 1, dp = png_ptr->up_row + 1, - pp = prev_row + 1; i < row_bytes; - i++, rp++, pp++, dp++) + pp = prev_row + 1; i < row_bytes; + i++, rp++, pp++, dp++) { *dp = (png_byte)(((int)*rp - (int)*pp) & 0xff); } + best_row = png_ptr->up_row; } @@ -2341,7 +2447,7 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info) { png_bytep rp, dp, pp; png_uint_32 sum = 0, lmins = mins; - png_uint_32 i; + png_size_t i; int v; @@ -2358,26 +2464,29 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info) if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_UP) { lmlo = (lmlo * png_ptr->inv_filter_weights[j]) >> - PNG_WEIGHT_SHIFT; + PNG_WEIGHT_SHIFT; + lmhi = (lmhi * png_ptr->inv_filter_weights[j]) >> - PNG_WEIGHT_SHIFT; + PNG_WEIGHT_SHIFT; } } lmlo = (lmlo * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_UP]) >> - PNG_COST_SHIFT; + PNG_COST_SHIFT; + lmhi = (lmhi * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_UP]) >> - PNG_COST_SHIFT; + PNG_COST_SHIFT; if (lmhi > PNG_HIMASK) lmins = PNG_MAXSUM; + else lmins = (lmhi << PNG_HISHIFT) + lmlo; } #endif for (i = 0, rp = row_buf + 1, dp = png_ptr->up_row + 1, - pp = prev_row + 1; i < row_bytes; i++) + pp = prev_row + 1; i < row_bytes; i++) { v = *dp++ = (png_byte)(((int)*rp++ - (int)*pp++) & 0xff); @@ -2400,19 +2509,22 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info) if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_UP) { sumlo = (sumlo * png_ptr->filter_weights[j]) >> - PNG_WEIGHT_SHIFT; + PNG_WEIGHT_SHIFT; + sumhi = (sumhi * png_ptr->filter_weights[j]) >> - PNG_WEIGHT_SHIFT; + PNG_WEIGHT_SHIFT; } } sumlo = (sumlo * png_ptr->filter_costs[PNG_FILTER_VALUE_UP]) >> - PNG_COST_SHIFT; + PNG_COST_SHIFT; + sumhi = (sumhi * png_ptr->filter_costs[PNG_FILTER_VALUE_UP]) >> - PNG_COST_SHIFT; + PNG_COST_SHIFT; if (sumhi > PNG_HIMASK) sum = PNG_MAXSUM; + else sum = (sumhi << PNG_HISHIFT) + sumlo; } @@ -2430,11 +2542,13 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info) { png_bytep rp, dp, pp, lp; png_uint_32 i; + for (i = 0, rp = row_buf + 1, dp = png_ptr->avg_row + 1, pp = prev_row + 1; i < bpp; i++) { *dp++ = (png_byte)(((int)*rp++ - ((int)*pp++ / 2)) & 0xff); } + for (lp = row_buf + 1; i < row_bytes; i++) { *dp++ = (png_byte)(((int)*rp++ - (((int)*pp++ + (int)*lp++) / 2)) @@ -2447,7 +2561,7 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info) { png_bytep rp, dp, pp, lp; png_uint_32 sum = 0, lmins = mins; - png_uint_32 i; + png_size_t i; int v; #ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED @@ -2463,19 +2577,22 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info) if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_AVG) { lmlo = (lmlo * png_ptr->inv_filter_weights[j]) >> - PNG_WEIGHT_SHIFT; + PNG_WEIGHT_SHIFT; + lmhi = (lmhi * png_ptr->inv_filter_weights[j]) >> - PNG_WEIGHT_SHIFT; + PNG_WEIGHT_SHIFT; } } lmlo = (lmlo * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_AVG]) >> - PNG_COST_SHIFT; + PNG_COST_SHIFT; + lmhi = (lmhi * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_AVG]) >> - PNG_COST_SHIFT; + PNG_COST_SHIFT; if (lmhi > PNG_HIMASK) lmins = PNG_MAXSUM; + else lmins = (lmhi << PNG_HISHIFT) + lmlo; } @@ -2488,10 +2605,11 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info) sum += (v < 128) ? v : 256 - v; } + for (lp = row_buf + 1; i < row_bytes; i++) { v = *dp++ = - (png_byte)(((int)*rp++ - (((int)*pp++ + (int)*lp++) / 2)) & 0xff); + (png_byte)(((int)*rp++ - (((int)*pp++ + (int)*lp++) / 2)) & 0xff); sum += (v < 128) ? v : 256 - v; @@ -2512,19 +2630,22 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info) if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_NONE) { sumlo = (sumlo * png_ptr->filter_weights[j]) >> - PNG_WEIGHT_SHIFT; + PNG_WEIGHT_SHIFT; + sumhi = (sumhi * png_ptr->filter_weights[j]) >> - PNG_WEIGHT_SHIFT; + PNG_WEIGHT_SHIFT; } } sumlo = (sumlo * png_ptr->filter_costs[PNG_FILTER_VALUE_AVG]) >> - PNG_COST_SHIFT; + PNG_COST_SHIFT; + sumhi = (sumhi * png_ptr->filter_costs[PNG_FILTER_VALUE_AVG]) >> - PNG_COST_SHIFT; + PNG_COST_SHIFT; if (sumhi > PNG_HIMASK) sum = PNG_MAXSUM; + else sum = (sumhi << PNG_HISHIFT) + sumlo; } @@ -2541,9 +2662,10 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info) if (filter_to_do == PNG_FILTER_PAETH) { png_bytep rp, dp, pp, cp, lp; - png_uint_32 i; + png_size_t i; + for (i = 0, rp = row_buf + 1, dp = png_ptr->paeth_row + 1, - pp = prev_row + 1; i < bpp; i++) + pp = prev_row + 1; i < bpp; i++) { *dp++ = (png_byte)(((int)*rp++ - (int)*pp++) & 0xff); } @@ -2580,7 +2702,7 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info) { png_bytep rp, dp, pp, cp, lp; png_uint_32 sum = 0, lmins = mins; - png_uint_32 i; + png_size_t i; int v; #ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED @@ -2596,26 +2718,29 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info) if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_PAETH) { lmlo = (lmlo * png_ptr->inv_filter_weights[j]) >> - PNG_WEIGHT_SHIFT; + PNG_WEIGHT_SHIFT; + lmhi = (lmhi * png_ptr->inv_filter_weights[j]) >> - PNG_WEIGHT_SHIFT; + PNG_WEIGHT_SHIFT; } } lmlo = (lmlo * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_PAETH]) >> - PNG_COST_SHIFT; + PNG_COST_SHIFT; + lmhi = (lmhi * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_PAETH]) >> - PNG_COST_SHIFT; + PNG_COST_SHIFT; if (lmhi > PNG_HIMASK) lmins = PNG_MAXSUM; + else lmins = (lmhi << PNG_HISHIFT) + lmlo; } #endif for (i = 0, rp = row_buf + 1, dp = png_ptr->paeth_row + 1, - pp = prev_row + 1; i < bpp; i++) + pp = prev_row + 1; i < bpp; i++) { v = *dp++ = (png_byte)(((int)*rp++ - (int)*pp++) & 0xff); @@ -2648,10 +2773,13 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info) pa = abs(p - a); pb = abs(p - b); pc = abs(p - c); + if (pa <= pb && pa <= pc) p = a; + else if (pb <= pc) p = b; + else p = c; #endif /* PNG_SLOW_PAETH */ @@ -2677,19 +2805,22 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info) if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_PAETH) { sumlo = (sumlo * png_ptr->filter_weights[j]) >> - PNG_WEIGHT_SHIFT; + PNG_WEIGHT_SHIFT; + sumhi = (sumhi * png_ptr->filter_weights[j]) >> - PNG_WEIGHT_SHIFT; + PNG_WEIGHT_SHIFT; } } sumlo = (sumlo * png_ptr->filter_costs[PNG_FILTER_VALUE_PAETH]) >> - PNG_COST_SHIFT; + PNG_COST_SHIFT; + sumhi = (sumhi * png_ptr->filter_costs[PNG_FILTER_VALUE_PAETH]) >> - PNG_COST_SHIFT; + PNG_COST_SHIFT; if (sumhi > PNG_HIMASK) sum = PNG_MAXSUM; + else sum = (sumhi << PNG_HISHIFT) + sumlo; } @@ -2711,10 +2842,12 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info) if (png_ptr->num_prev_filters > 0) { int j; + for (j = 1; j < num_p_filters; j++) { png_ptr->prev_filters[j] = png_ptr->prev_filters[j - 1]; } + png_ptr->prev_filters[j] = best_row[0]; } #endif @@ -2726,25 +2859,54 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info) void /* PRIVATE */ png_write_filtered_row(png_structp png_ptr, png_bytep filtered_row) { + png_size_t avail; + png_debug(1, "in png_write_filtered_row"); png_debug1(2, "filter = %d", filtered_row[0]); /* Set up the zlib input buffer */ png_ptr->zstream.next_in = filtered_row; - png_ptr->zstream.avail_in = (uInt)png_ptr->row_info.rowbytes + 1; + png_ptr->zstream.avail_in = 0; + avail = png_ptr->row_info.rowbytes + 1; /* Repeat until we have compressed all the data */ do { int ret; /* Return of zlib */ + /* Record the number of bytes available - zlib supports at least 65535 + * bytes at one step, depending on the size of the zlib type 'uInt', the + * maximum size zlib can write at once is ZLIB_IO_MAX (from pngpriv.h). + * Use this because on 16 bit systems 'rowbytes' can be up to 65536 (i.e. + * one more than 16 bits) and, in this case 'rowbytes+1' can overflow a + * uInt. ZLIB_IO_MAX can be safely reduced to cause zlib to be called + * with smaller chunks of data. + */ + if (png_ptr->zstream.avail_in == 0) + { + if (avail > ZLIB_IO_MAX) + { + png_ptr->zstream.avail_in = ZLIB_IO_MAX; + avail -= ZLIB_IO_MAX; + } + + else + { + /* So this will fit in the available uInt space: */ + png_ptr->zstream.avail_in = (uInt)avail; + avail = 0; + } + } + /* Compress the data */ ret = deflate(&png_ptr->zstream, Z_NO_FLUSH); + /* Check for compression errors */ if (ret != Z_OK) { if (png_ptr->zstream.msg != NULL) png_error(png_ptr, png_ptr->zstream.msg); + else png_error(png_ptr, "zlib error"); } @@ -2758,7 +2920,7 @@ png_write_filtered_row(png_structp png_ptr, png_bytep filtered_row) png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; } /* Repeat until all data has been compressed */ - } while (png_ptr->zstream.avail_in); + } while (avail > 0 || png_ptr->zstream.avail_in > 0); /* Swap the current and previous rows */ if (png_ptr->prev_row != NULL) diff --git a/reactos/include/reactos/libs/libpng/png.h b/reactos/include/reactos/libs/libpng/png.h index 842f3fc951b..0af42b170ec 100644 --- a/reactos/include/reactos/libs/libpng/png.h +++ b/reactos/include/reactos/libs/libpng/png.h @@ -1,26 +1,26 @@ /* png.h - header file for PNG reference library * - * libpng version 1.4.3 - June 26, 2010 - * Copyright (c) 1998-2010 Glenn Randers-Pehrson + * libpng version 1.5.2 - March 31, 2011 + * Copyright (c) 1998-2011 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * * This code is released under the libpng license (See LICENSE, below) * * Authors and maintainers: - * libpng versions 0.71, May 1995, through 0.88, January 1996: Guy Schalnat - * libpng versions 0.89c, June 1996, through 0.96, May 1997: Andreas Dilger - * libpng versions 0.97, January 1998, through 1.4.3 - June 26, 2010: Glenn - * See also "Contributing Authors", below. + * libpng versions 0.71, May 1995, through 0.88, January 1996: Guy Schalnat + * libpng versions 0.89c, June 1996, through 0.96, May 1997: Andreas Dilger + * libpng versions 0.97, January 1998, through 1.5.2 - March 31, 2011: Glenn + * See also "Contributing Authors", below. * * Note about libpng version numbers: * - * Due to various miscommunications, unforeseen code incompatibilities - * and occasional factors outside the authors' control, version numbering - * on the library has not always been consistent and straightforward. - * The following table summarizes matters since version 0.89c, which was - * the first widely used release: + * Due to various miscommunications, unforeseen code incompatibilities + * and occasional factors outside the authors' control, version numbering + * on the library has not always been consistent and straightforward. + * The following table summarizes matters since version 0.89c, which was + * the first widely used release: * * source png.h png.h shared-lib * version string int version @@ -137,35 +137,40 @@ * 1.4.1beta01-03 14 10401 14.so.14.1[.0] * 1.4.1rc01 14 10401 14.so.14.1[.0] * 1.4.1beta04-12 14 10401 14.so.14.1[.0] - * 1.4.1rc02-04 14 10401 14.so.14.1[.0] * 1.4.1 14 10401 14.so.14.1[.0] - * 1.4.2beta01 14 10402 14.so.14.2[.0] - * 1.4.2rc02-06 14 10402 14.so.14.2[.0] * 1.4.2 14 10402 14.so.14.2[.0] - * 1.4.3beta01-05 14 10403 14.so.14.3[.0] - * 1.4.3rc01-03 14 10403 14.so.14.3[.0] * 1.4.3 14 10403 14.so.14.3[.0] + * 1.4.4 14 10404 14.so.14.4[.0] + * 1.5.0beta01-58 15 10500 15.so.15.0[.0] + * 1.5.0rc01-07 15 10500 15.so.15.0[.0] + * 1.5.0 15 10500 15.so.15.0[.0] + * 1.5.1beta01-11 15 10501 15.so.15.1[.0] + * 1.5.1rc01-02 15 10501 15.so.15.1[.0] + * 1.5.1 15 10501 15.so.15.1[.0] + * 1.5.2beta01-03 15 10502 15.so.15.2[.0] + * 1.5.2rc01-03 15 10502 15.so.15.2[.0] + * 1.5.2 15 10502 15.so.15.2[.0] * - * Henceforth the source version will match the shared-library major - * and minor numbers; the shared-library major version number will be - * used for changes in backward compatibility, as it is intended. The - * PNG_LIBPNG_VER macro, which is not used within libpng but is available - * for applications, is an unsigned integer of the form xyyzz corresponding - * to the source version x.y.z (leading zeros in y and z). Beta versions - * were given the previous public release number plus a letter, until - * version 1.0.6j; from then on they were given the upcoming public - * release number plus "betaNN" or "rcN". + * Henceforth the source version will match the shared-library major + * and minor numbers; the shared-library major version number will be + * used for changes in backward compatibility, as it is intended. The + * PNG_LIBPNG_VER macro, which is not used within libpng but is available + * for applications, is an unsigned integer of the form xyyzz corresponding + * to the source version x.y.z (leading zeros in y and z). Beta versions + * were given the previous public release number plus a letter, until + * version 1.0.6j; from then on they were given the upcoming public + * release number plus "betaNN" or "rcN". * - * Binary incompatibility exists only when applications make direct access - * to the info_ptr or png_ptr members through png.h, and the compiled - * application is loaded with a different version of the library. + * Binary incompatibility exists only when applications make direct access + * to the info_ptr or png_ptr members through png.h, and the compiled + * application is loaded with a different version of the library. * - * DLLNUM will change each time there are forward or backward changes - * in binary compatibility (e.g., when a new feature is added). + * DLLNUM will change each time there are forward or backward changes + * in binary compatibility (e.g., when a new feature is added). * - * See libpng.txt or libpng.3 for more information. The PNG specification - * is available as a W3C Recommendation and as an ISO Specification, - * +# endif + + /* Need the time information for converting tIME chunks, it + * defines struct tm: + */ +# ifdef PNG_CONVERT_tIME_SUPPORTED + /* "time.h" functions are not supported on all operating systems */ +# include +# endif +# endif + +/* Machine specific configuration. */ +# include "pngconf.h" +#endif /* * Added at libpng-1.2.8 @@ -414,13 +444,13 @@ * StringFileInfo block must contain a SpecialBuild string. */ -#ifdef PNG_USER_PRIVATEBUILD +#ifdef PNG_USER_PRIVATEBUILD /* From pnglibconf.h */ # define PNG_LIBPNG_BUILD_TYPE \ - (PNG_LIBPNG_BUILD_BASE_TYPE | PNG_LIBPNG_BUILD_PRIVATE) + (PNG_LIBPNG_BUILD_BASE_TYPE | PNG_LIBPNG_BUILD_PRIVATE) #else # ifdef PNG_LIBPNG_SPECIALBUILD # define PNG_LIBPNG_BUILD_TYPE \ - (PNG_LIBPNG_BUILD_BASE_TYPE | PNG_LIBPNG_BUILD_SPECIAL) + (PNG_LIBPNG_BUILD_BASE_TYPE | PNG_LIBPNG_BUILD_SPECIAL) # else # define PNG_LIBPNG_BUILD_TYPE (PNG_LIBPNG_BUILD_BASE_TYPE) # endif @@ -433,20 +463,61 @@ extern "C" { #endif /* __cplusplus */ -/* This file is arranged in several sections. The first section contains - * structure and type definitions. The second section contains the external - * library functions, while the third has the internal library functions, - * which applications aren't expected to use directly. - */ - -/* Variables declared in png.c - only it needs to define PNG_NO_EXTERN */ -#if !defined(PNG_NO_EXTERN) || defined(PNG_ALWAYS_EXTERN) /* Version information for C files, stored in png.c. This had better match * the version above. */ #define png_libpng_ver png_get_header_ver(NULL) -#endif /* PNG_NO_EXTERN */ +/* This file is arranged in several sections: + * + * 1. Any configuration options that can be specified by for the application + * code when it is built. (Build time configuration is in pnglibconf.h) + * 2. Type definitions (base types are defined in pngconf.h), structure + * definitions. + * 3. Exported library functions. + * + * The library source code has additional files (principally pngpriv.h) that + * allow configuration of the library. + */ +/* Section 1: run time configuration + * See pnglibconf.h for build time configuration + * + * Run time configuration allows the application to choose between + * implementations of certain arithmetic APIs. The default is set + * at build time and recorded in pnglibconf.h, but it is safe to + * override these (and only these) settings. Note that this won't + * change what the library does, only application code, and the + * settings can (and probably should) be made on a per-file basis + * by setting the #defines before including png.h + * + * Use macros to read integers from PNG data or use the exported + * functions? + * PNG_USE_READ_MACROS: use the macros (see below) Note that + * the macros evaluate their argument multiple times. + * PNG_NO_USE_READ_MACROS: call the relevant library function. + * + * Use the alternative algorithm for compositing alpha samples that + * does not use division? + * PNG_READ_COMPOSITE_NODIV_SUPPORTED: use the 'no division' + * algorithm. + * PNG_NO_READ_COMPOSITE_NODIV: use the 'division' algorithm. + * + * How to handle benign errors if PNG_ALLOW_BENIGN_ERRORS is + * false? + * PNG_ALLOW_BENIGN_ERRORS: map calls to the benign error + * APIs to png_warning. + * Otherwise the calls are mapped to png_error. + */ + +/* Section 2: type definitions, including structures and compile time + * constants. + * See pngconf.h for base types that vary by machine/system + */ + +/* This triggers a compiler error in png.c, if png.c and png.h + * do not agree upon the version number. + */ +typedef char* png_libpng_version_1_5_2; /* Three color definitions. The order of the red, green, and blue, (and the * exact size) is not important, although the size of the fields need to @@ -459,6 +530,7 @@ typedef struct png_color_struct png_byte blue; } png_color; typedef png_color FAR * png_colorp; +typedef PNG_CONST png_color FAR * png_const_colorp; typedef png_color FAR * FAR * png_colorpp; typedef struct png_color_16_struct @@ -470,6 +542,7 @@ typedef struct png_color_16_struct png_uint_16 gray; /* for use in grayscale files */ } png_color_16; typedef png_color_16 FAR * png_color_16p; +typedef PNG_CONST png_color_16 FAR * png_const_color_16p; typedef png_color_16 FAR * FAR * png_color_16pp; typedef struct png_color_8_struct @@ -481,6 +554,7 @@ typedef struct png_color_8_struct png_byte alpha; /* for alpha channel files */ } png_color_8; typedef png_color_8 FAR * png_color_8p; +typedef PNG_CONST png_color_8 FAR * png_const_color_8p; typedef png_color_8 FAR * FAR * png_color_8pp; /* @@ -496,6 +570,7 @@ typedef struct png_sPLT_entry_struct png_uint_16 frequency; } png_sPLT_entry; typedef png_sPLT_entry FAR * png_sPLT_entryp; +typedef PNG_CONST png_sPLT_entry FAR * png_const_sPLT_entryp; typedef png_sPLT_entry FAR * FAR * png_sPLT_entrypp; /* When the depth of the sPLT palette is 8 bits, the color and alpha samples @@ -511,6 +586,7 @@ typedef struct png_sPLT_struct png_int_32 nentries; /* number of palette entries */ } png_sPLT_t; typedef png_sPLT_t FAR * png_sPLT_tp; +typedef PNG_CONST png_sPLT_t FAR * png_const_sPLT_tp; typedef png_sPLT_t FAR * FAR * png_sPLT_tpp; #ifdef PNG_TEXT_SUPPORTED @@ -533,15 +609,14 @@ typedef struct png_text_struct png_charp text; /* comment, may be an empty string (ie "") or a NULL pointer */ png_size_t text_length; /* length of the text string */ -#ifdef PNG_iTXt_SUPPORTED png_size_t itxt_length; /* length of the itxt string */ png_charp lang; /* language code, 0-79 characters or a NULL pointer */ png_charp lang_key; /* keyword translated UTF-8 string, 0 or more chars or a NULL pointer */ -#endif } png_text; typedef png_text FAR * png_textp; +typedef PNG_CONST png_text FAR * png_const_textp; typedef png_text FAR * FAR * png_textpp; #endif @@ -571,10 +646,11 @@ typedef struct png_time_struct png_byte second; /* second of minute, 0 - 60 (for leap seconds) */ } png_time; typedef png_time FAR * png_timep; +typedef PNG_CONST png_time FAR * png_const_timep; typedef png_time FAR * FAR * png_timepp; #if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) || \ - defined(PNG_HANDLE_AS_UNKNOWN_SUPPORTED) + defined(PNG_HANDLE_AS_UNKNOWN_SUPPORTED) /* png_unknown_chunk is a structure to hold queued chunks for which there is * no specific support. The idea is that we can use this to queue * up private chunks for output even though the library doesn't actually @@ -591,312 +667,13 @@ typedef struct png_unknown_chunk_t } png_unknown_chunk; typedef png_unknown_chunk FAR * png_unknown_chunkp; +typedef PNG_CONST png_unknown_chunk FAR * png_const_unknown_chunkp; typedef png_unknown_chunk FAR * FAR * png_unknown_chunkpp; #endif -/* png_info is a structure that holds the information in a PNG file so - * that the application can find out the characteristics of the image. - * If you are reading the file, this structure will tell you what is - * in the PNG file. If you are writing the file, fill in the information - * you want to put into the PNG file, then call png_write_info(). - * The names chosen should be very close to the PNG specification, so - * consult that document for information about the meaning of each field. - * - * With libpng < 0.95, it was only possible to directly set and read the - * the values in the png_info_struct, which meant that the contents and - * order of the values had to remain fixed. With libpng 0.95 and later, - * however, there are now functions that abstract the contents of - * png_info_struct from the application, so this makes it easier to use - * libpng with dynamic libraries, and even makes it possible to use - * libraries that don't have all of the libpng ancillary chunk-handing - * functionality. - * - * In any case, the order of the parameters in png_info_struct should NOT - * be changed for as long as possible to keep compatibility with applications - * that use the old direct-access method with png_info_struct. - * - * The following members may have allocated storage attached that should be - * cleaned up before the structure is discarded: palette, trans, text, - * pcal_purpose, pcal_units, pcal_params, hist, iccp_name, iccp_profile, - * splt_palettes, scal_unit, row_pointers, and unknowns. By default, these - * are automatically freed when the info structure is deallocated, if they were - * allocated internally by libpng. This behavior can be changed by means - * of the png_data_freer() function. - * - * More allocation details: all the chunk-reading functions that - * change these members go through the corresponding png_set_* - * functions. A function to clear these members is available: see - * png_free_data(). The png_set_* functions do not depend on being - * able to point info structure members to any of the storage they are - * passed (they make their own copies), EXCEPT that the png_set_text - * functions use the same storage passed to them in the text_ptr or - * itxt_ptr structure argument, and the png_set_rows and png_set_unknowns - * functions do not make their own copies. - */ -typedef struct png_info_struct -{ - /* the following are necessary for every PNG file */ - png_uint_32 width PNG_DEPSTRUCT; /* width of image in pixels (from IHDR) */ - png_uint_32 height PNG_DEPSTRUCT; /* height of image in pixels (from IHDR) */ - png_uint_32 valid PNG_DEPSTRUCT; /* valid chunk data (see PNG_INFO_ - below) */ - png_size_t rowbytes PNG_DEPSTRUCT; /* bytes needed to hold an untransformed - row */ - png_colorp palette PNG_DEPSTRUCT; /* array of color values - (valid & PNG_INFO_PLTE) */ - png_uint_16 num_palette PNG_DEPSTRUCT; /* number of color entries in - "palette" (PLTE) */ - png_uint_16 num_trans PNG_DEPSTRUCT; /* number of transparent palette - color (tRNS) */ - png_byte bit_depth PNG_DEPSTRUCT; /* 1, 2, 4, 8, or 16 bits/channel - (from IHDR) */ - png_byte color_type PNG_DEPSTRUCT; /* see PNG_COLOR_TYPE_ below - (from IHDR) */ - /* The following three should have been named *_method not *_type */ - png_byte compression_type PNG_DEPSTRUCT; /* must be - PNG_COMPRESSION_TYPE_BASE (IHDR) */ - png_byte filter_type PNG_DEPSTRUCT; /* must be PNG_FILTER_TYPE_BASE - (from IHDR) */ - png_byte interlace_type PNG_DEPSTRUCT; /* One of PNG_INTERLACE_NONE, - PNG_INTERLACE_ADAM7 */ - - /* The following is informational only on read, and not used on writes. */ - png_byte channels PNG_DEPSTRUCT; /* number of data channels per - pixel (1, 2, 3, 4) */ - png_byte pixel_depth PNG_DEPSTRUCT; /* number of bits per pixel */ - png_byte spare_byte PNG_DEPSTRUCT; /* to align the data, and for - future use */ - png_byte signature[8] PNG_DEPSTRUCT; /* magic bytes read by libpng - from start of file */ - - /* The rest of the data is optional. If you are reading, check the - * valid field to see if the information in these are valid. If you - * are writing, set the valid field to those chunks you want written, - * and initialize the appropriate fields below. - */ - -#if defined(PNG_gAMA_SUPPORTED) && defined(PNG_FLOATING_POINT_SUPPORTED) - /* The gAMA chunk describes the gamma characteristics of the system - * on which the image was created, normally in the range [1.0, 2.5]. - * Data is valid if (valid & PNG_INFO_gAMA) is non-zero. - */ - float gamma PNG_DEPSTRUCT; /* gamma value of image, - if (valid & PNG_INFO_gAMA) */ -#endif - -#ifdef PNG_sRGB_SUPPORTED - /* GR-P, 0.96a */ - /* Data valid if (valid & PNG_INFO_sRGB) non-zero. */ - png_byte srgb_intent PNG_DEPSTRUCT; /* sRGB rendering intent - [0, 1, 2, or 3] */ -#endif - -#ifdef PNG_TEXT_SUPPORTED - /* The tEXt, and zTXt chunks contain human-readable textual data in - * uncompressed, compressed, and optionally compressed forms, respectively. - * The data in "text" is an array of pointers to uncompressed, - * null-terminated C strings. Each chunk has a keyword that describes the - * textual data contained in that chunk. Keywords are not required to be - * unique, and the text string may be empty. Any number of text chunks may - * be in an image. - */ - int num_text PNG_DEPSTRUCT; /* number of comments read/to write */ - int max_text PNG_DEPSTRUCT; /* current size of text array */ - png_textp text PNG_DEPSTRUCT; /* array of comments read/to write */ -#endif /* PNG_TEXT_SUPPORTED */ - -#ifdef PNG_tIME_SUPPORTED - /* The tIME chunk holds the last time the displayed image data was - * modified. See the png_time struct for the contents of this struct. - */ - png_time mod_time PNG_DEPSTRUCT; -#endif - -#ifdef PNG_sBIT_SUPPORTED - /* The sBIT chunk specifies the number of significant high-order bits - * in the pixel data. Values are in the range [1, bit_depth], and are - * only specified for the channels in the pixel data. The contents of - * the low-order bits is not specified. Data is valid if - * (valid & PNG_INFO_sBIT) is non-zero. - */ - png_color_8 sig_bit PNG_DEPSTRUCT; /* significant bits in color channels */ -#endif - -#if defined(PNG_tRNS_SUPPORTED) || defined(PNG_READ_EXPAND_SUPPORTED) || \ -defined(PNG_READ_BACKGROUND_SUPPORTED) - /* The tRNS chunk supplies transparency data for paletted images and - * other image types that don't need a full alpha channel. There are - * "num_trans" transparency values for a paletted image, stored in the - * same order as the palette colors, starting from index 0. Values - * for the data are in the range [0, 255], ranging from fully transparent - * to fully opaque, respectively. For non-paletted images, there is a - * single color specified that should be treated as fully transparent. - * Data is valid if (valid & PNG_INFO_tRNS) is non-zero. - */ - png_bytep trans_alpha PNG_DEPSTRUCT; /* alpha values for paletted - image */ - png_color_16 trans_color PNG_DEPSTRUCT; /* transparent color for - non-palette image */ -#endif - -#if defined(PNG_bKGD_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) - /* The bKGD chunk gives the suggested image background color if the - * display program does not have its own background color and the image - * is needs to composited onto a background before display. The colors - * in "background" are normally in the same color space/depth as the - * pixel data. Data is valid if (valid & PNG_INFO_bKGD) is non-zero. - */ - png_color_16 background PNG_DEPSTRUCT; -#endif - -#ifdef PNG_oFFs_SUPPORTED - /* The oFFs chunk gives the offset in "offset_unit_type" units rightwards - * and downwards from the top-left corner of the display, page, or other - * application-specific co-ordinate space. See the PNG_OFFSET_ defines - * below for the unit types. Valid if (valid & PNG_INFO_oFFs) non-zero. - */ - png_int_32 x_offset PNG_DEPSTRUCT; /* x offset on page */ - png_int_32 y_offset PNG_DEPSTRUCT; /* y offset on page */ - png_byte offset_unit_type PNG_DEPSTRUCT; /* offset units type */ -#endif - -#ifdef PNG_pHYs_SUPPORTED - /* The pHYs chunk gives the physical pixel density of the image for - * display or printing in "phys_unit_type" units (see PNG_RESOLUTION_ - * defines below). Data is valid if (valid & PNG_INFO_pHYs) is non-zero. - */ - png_uint_32 x_pixels_per_unit PNG_DEPSTRUCT; /* horizontal pixel density */ - png_uint_32 y_pixels_per_unit PNG_DEPSTRUCT; /* vertical pixel density */ - png_byte phys_unit_type PNG_DEPSTRUCT; /* resolution type (see - PNG_RESOLUTION_ below) */ -#endif - -#ifdef PNG_hIST_SUPPORTED - /* The hIST chunk contains the relative frequency or importance of the - * various palette entries, so that a viewer can intelligently select a - * reduced-color palette, if required. Data is an array of "num_palette" - * values in the range [0,65535]. Data valid if (valid & PNG_INFO_hIST) - * is non-zero. - */ - png_uint_16p hist PNG_DEPSTRUCT; -#endif - -#ifdef PNG_cHRM_SUPPORTED - /* The cHRM chunk describes the CIE color characteristics of the monitor - * on which the PNG was created. This data allows the viewer to do gamut - * mapping of the input image to ensure that the viewer sees the same - * colors in the image as the creator. Values are in the range - * [0.0, 0.8]. Data valid if (valid & PNG_INFO_cHRM) non-zero. - */ -#ifdef PNG_FLOATING_POINT_SUPPORTED - float x_white PNG_DEPSTRUCT; - float y_white PNG_DEPSTRUCT; - float x_red PNG_DEPSTRUCT; - float y_red PNG_DEPSTRUCT; - float x_green PNG_DEPSTRUCT; - float y_green PNG_DEPSTRUCT; - float x_blue PNG_DEPSTRUCT; - float y_blue PNG_DEPSTRUCT; -#endif -#endif - -#ifdef PNG_pCAL_SUPPORTED - /* The pCAL chunk describes a transformation between the stored pixel - * values and original physical data values used to create the image. - * The integer range [0, 2^bit_depth - 1] maps to the floating-point - * range given by [pcal_X0, pcal_X1], and are further transformed by a - * (possibly non-linear) transformation function given by "pcal_type" - * and "pcal_params" into "pcal_units". Please see the PNG_EQUATION_ - * defines below, and the PNG-Group's PNG extensions document for a - * complete description of the transformations and how they should be - * implemented, and for a description of the ASCII parameter strings. - * Data values are valid if (valid & PNG_INFO_pCAL) non-zero. - */ - png_charp pcal_purpose PNG_DEPSTRUCT; /* pCAL chunk description string */ - png_int_32 pcal_X0 PNG_DEPSTRUCT; /* minimum value */ - png_int_32 pcal_X1 PNG_DEPSTRUCT; /* maximum value */ - png_charp pcal_units PNG_DEPSTRUCT; /* Latin-1 string giving physical - units */ - png_charpp pcal_params PNG_DEPSTRUCT; /* ASCII strings containing - parameter values */ - png_byte pcal_type PNG_DEPSTRUCT; /* equation type - (see PNG_EQUATION_ below) */ - png_byte pcal_nparams PNG_DEPSTRUCT; /* number of parameters given - in pcal_params */ -#endif - -/* New members added in libpng-1.0.6 */ - png_uint_32 free_me PNG_DEPSTRUCT; /* flags items libpng is - responsible for freeing */ - -#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) || \ - defined(PNG_HANDLE_AS_UNKNOWN_SUPPORTED) - /* Storage for unknown chunks that the library doesn't recognize. */ - png_unknown_chunkp unknown_chunks PNG_DEPSTRUCT; - png_size_t unknown_chunks_num PNG_DEPSTRUCT; -#endif - -#ifdef PNG_iCCP_SUPPORTED - /* iCCP chunk data. */ - png_charp iccp_name PNG_DEPSTRUCT; /* profile name */ - png_charp iccp_profile PNG_DEPSTRUCT; /* International Color Consortium - profile data */ - /* Note to maintainer: should be png_bytep */ - png_uint_32 iccp_proflen PNG_DEPSTRUCT; /* ICC profile data length */ - png_byte iccp_compression PNG_DEPSTRUCT; /* Always zero */ -#endif - -#ifdef PNG_sPLT_SUPPORTED - /* Data on sPLT chunks (there may be more than one). */ - png_sPLT_tp splt_palettes PNG_DEPSTRUCT; - png_uint_32 splt_palettes_num PNG_DEPSTRUCT; -#endif - -#ifdef PNG_sCAL_SUPPORTED - /* The sCAL chunk describes the actual physical dimensions of the - * subject matter of the graphic. The chunk contains a unit specification - * a byte value, and two ASCII strings representing floating-point - * values. The values are width and height corresponsing to one pixel - * in the image. This external representation is converted to double - * here. Data values are valid if (valid & PNG_INFO_sCAL) is non-zero. - */ - png_byte scal_unit PNG_DEPSTRUCT; /* unit of physical scale */ -#ifdef PNG_FLOATING_POINT_SUPPORTED - double scal_pixel_width PNG_DEPSTRUCT; /* width of one pixel */ - double scal_pixel_height PNG_DEPSTRUCT; /* height of one pixel */ -#endif -#ifdef PNG_FIXED_POINT_SUPPORTED - png_charp scal_s_width PNG_DEPSTRUCT; /* string containing height */ - png_charp scal_s_height PNG_DEPSTRUCT; /* string containing width */ -#endif -#endif - -#ifdef PNG_INFO_IMAGE_SUPPORTED - /* Memory has been allocated if (valid & PNG_ALLOCATED_INFO_ROWS) - non-zero */ - /* Data valid if (valid & PNG_INFO_IDAT) non-zero */ - png_bytepp row_pointers PNG_DEPSTRUCT; /* the image bits */ -#endif - -#if defined(PNG_FIXED_POINT_SUPPORTED) && defined(PNG_gAMA_SUPPORTED) - png_fixed_point int_gamma PNG_DEPSTRUCT; /* gamma of image, - if (valid & PNG_INFO_gAMA) */ -#endif - -#if defined(PNG_cHRM_SUPPORTED) && defined(PNG_FIXED_POINT_SUPPORTED) - png_fixed_point int_x_white PNG_DEPSTRUCT; - png_fixed_point int_y_white PNG_DEPSTRUCT; - png_fixed_point int_x_red PNG_DEPSTRUCT; - png_fixed_point int_y_red PNG_DEPSTRUCT; - png_fixed_point int_x_green PNG_DEPSTRUCT; - png_fixed_point int_y_green PNG_DEPSTRUCT; - png_fixed_point int_x_blue PNG_DEPSTRUCT; - png_fixed_point int_y_blue PNG_DEPSTRUCT; -#endif - -} png_info; - +typedef struct png_info_def png_info; typedef png_info FAR * png_infop; +typedef PNG_CONST png_info FAR * png_const_infop; typedef png_info FAR * FAR * png_infopp; /* Maximum positive integer used in PNG is (2^31)-1 */ @@ -904,6 +681,12 @@ typedef png_info FAR * FAR * png_infopp; #define PNG_UINT_32_MAX ((png_uint_32)(-1)) #define PNG_SIZE_MAX ((png_size_t)(-1)) +/* These are constants for fixed point values encoded in the + * PNG specification manner (x100000) + */ +#define PNG_FP_1 100000 +#define PNG_FP_HALF 50000 + /* These describe the color_type field in png_info. */ /* color type masks */ #define PNG_COLOR_MASK_PALETTE 1 @@ -998,11 +781,11 @@ typedef png_info FAR * FAR * png_infopp; */ typedef struct png_row_info_struct { - png_uint_32 width; /* width of row */ - png_size_t rowbytes; /* number of bytes in row */ - png_byte color_type; /* color type of row */ - png_byte bit_depth; /* bit depth of row */ - png_byte channels; /* number of channels (1, 2, 3, or 4) */ + png_uint_32 width; /* width of row */ + png_size_t rowbytes; /* number of bytes in row */ + png_byte color_type; /* color type of row */ + png_byte bit_depth; /* bit depth of row */ + png_byte channels; /* number of channels (1, 2, 3, or 4) */ png_byte pixel_depth; /* bits per pixel (depth * channels) */ } png_row_info; @@ -1013,46 +796,74 @@ typedef png_row_info FAR * FAR * png_row_infopp; * that allow the user to override the default I/O functions with his or her * own. The png_error_ptr type should match that of user-supplied warning * and error functions, while the png_rw_ptr type should match that of the - * user read/write data functions. + * user read/write data functions. Note that the 'write' function must not + * modify the buffer it is passed. The 'read' function, on the other hand, is + * expected to return the read data in the buffer. */ typedef struct png_struct_def png_struct; +typedef PNG_CONST png_struct FAR * png_const_structp; typedef png_struct FAR * png_structp; -typedef void (PNGAPI *png_error_ptr) PNGARG((png_structp, png_const_charp)); -typedef void (PNGAPI *png_rw_ptr) PNGARG((png_structp, png_bytep, png_size_t)); -typedef void (PNGAPI *png_flush_ptr) PNGARG((png_structp)); -typedef void (PNGAPI *png_read_status_ptr) PNGARG((png_structp, png_uint_32, - int)); -typedef void (PNGAPI *png_write_status_ptr) PNGARG((png_structp, png_uint_32, - int)); +typedef PNG_CALLBACK(void, *png_error_ptr, (png_structp, png_const_charp)); +typedef PNG_CALLBACK(void, *png_rw_ptr, (png_structp, png_bytep, png_size_t)); +typedef PNG_CALLBACK(void, *png_flush_ptr, (png_structp)); +typedef PNG_CALLBACK(void, *png_read_status_ptr, (png_structp, png_uint_32, + int)); +typedef PNG_CALLBACK(void, *png_write_status_ptr, (png_structp, png_uint_32, + int)); #ifdef PNG_PROGRESSIVE_READ_SUPPORTED -typedef void (PNGAPI *png_progressive_info_ptr) PNGARG((png_structp, - png_infop)); -typedef void (PNGAPI *png_progressive_end_ptr) PNGARG((png_structp, png_infop)); -typedef void (PNGAPI *png_progressive_row_ptr) PNGARG((png_structp, png_bytep, - png_uint_32, int)); +typedef PNG_CALLBACK(void, *png_progressive_info_ptr, (png_structp, png_infop)); +typedef PNG_CALLBACK(void, *png_progressive_end_ptr, (png_structp, png_infop)); + +/* The following callback receives png_uint_32 row_number, int pass for the + * png_bytep data of the row. When transforming an interlaced image the + * row number is the row number within the sub-image of the interlace pass, so + * the value will increase to the height of the sub-image (not the full image) + * then reset to 0 for the next pass. + * + * Use PNG_ROW_FROM_PASS_ROW(row, pass) and PNG_COL_FROM_PASS_COL(col, pass) to + * find the output pixel (x,y) given an interlaced sub-image pixel + * (row,col,pass). (See below for these macros.) + */ +typedef PNG_CALLBACK(void, *png_progressive_row_ptr, (png_structp, png_bytep, + png_uint_32, int)); #endif #if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) -typedef void (PNGAPI *png_user_transform_ptr) PNGARG((png_structp, - png_row_infop, png_bytep)); +typedef PNG_CALLBACK(void, *png_user_transform_ptr, (png_structp, png_row_infop, + png_bytep)); #endif #ifdef PNG_USER_CHUNKS_SUPPORTED -typedef int (PNGAPI *png_user_chunk_ptr) PNGARG((png_structp, - png_unknown_chunkp)); +typedef PNG_CALLBACK(int, *png_user_chunk_ptr, (png_structp, + png_unknown_chunkp)); #endif #ifdef PNG_UNKNOWN_CHUNKS_SUPPORTED -typedef void (PNGAPI *png_unknown_chunk_ptr) PNGARG((png_structp)); +typedef PNG_CALLBACK(void, *png_unknown_chunk_ptr, (png_structp)); #endif + #ifdef PNG_SETJMP_SUPPORTED /* This must match the function definition in , and the * application must include this before png.h to obtain the definition - * of jmp_buf. + * of jmp_buf. The function is required to be PNG_NORETURN. (Note that + * PNG_PTR_NORETURN is used here because current versions of the Microsoft + * C compiler do not support the PNG_NORETURN attribute on a pointer.) + * + * If you get a type warning from the compiler when linking against this line + * then your compiler has 'longjmp' that does not match the requirements of the + * compiler that built libpng. You will have to write a wrapper function for + * your compiler's longjmp and call png_set_longjmp_fn directly (not via the + * png_jmpbuf macro.) + * + * If you get a warning here while building the library you will need to make + * changes to ensure that pnglibconf.h records the calling convention used by + * your compiler. This may be very difficult - try using a different compiler + * to build the library! */ -typedef void (PNGAPI *png_longjmp_ptr) PNGARG((jmp_buf, int)); +typedef PNG_FUNCTION(void, (PNGCAPI *png_longjmp_ptr), PNGARG((jmp_buf, int)), + PNG_PTR_NORETURN); #endif /* Transform masks for the high-level interface */ @@ -1080,447 +891,85 @@ typedef void (PNGAPI *png_longjmp_ptr) PNGARG((jmp_buf, int)); #define PNG_FLAG_MNG_FILTER_64 0x04 #define PNG_ALL_MNG_FEATURES 0x05 -typedef png_voidp (*png_malloc_ptr) PNGARG((png_structp, png_alloc_size_t)); -typedef void (*png_free_ptr) PNGARG((png_structp, png_voidp)); - -/* The structure that holds the information to read and write PNG files. - * The only people who need to care about what is inside of this are the - * people who will be modifying the library for their own special needs. - * It should NOT be accessed directly by an application, except to store - * the jmp_buf. +/* NOTE: prior to 1.5 these functions had no 'API' style declaration, + * this allowed the zlib default functions to be used on Windows + * platforms. In 1.5 the zlib default malloc (which just calls malloc and + * ignores the first argument) should be completely compatible with the + * following. */ - -struct png_struct_def -{ -#ifdef PNG_SETJMP_SUPPORTED - jmp_buf jmpbuf PNG_DEPSTRUCT; /* used in png_error */ - png_longjmp_ptr longjmp_fn PNG_DEPSTRUCT;/* setjmp non-local goto - function. */ -#endif - png_error_ptr error_fn PNG_DEPSTRUCT; /* function for printing - errors and aborting */ - png_error_ptr warning_fn PNG_DEPSTRUCT; /* function for printing - warnings */ - png_voidp error_ptr PNG_DEPSTRUCT; /* user supplied struct for - error functions */ - png_rw_ptr write_data_fn PNG_DEPSTRUCT; /* function for writing - output data */ - png_rw_ptr read_data_fn PNG_DEPSTRUCT; /* function for reading - input data */ - png_voidp io_ptr PNG_DEPSTRUCT; /* ptr to application struct - for I/O functions */ - -#ifdef PNG_READ_USER_TRANSFORM_SUPPORTED - png_user_transform_ptr read_user_transform_fn PNG_DEPSTRUCT; /* user read - transform */ -#endif - -#ifdef PNG_WRITE_USER_TRANSFORM_SUPPORTED - png_user_transform_ptr write_user_transform_fn PNG_DEPSTRUCT; /* user write - transform */ -#endif - -/* These were added in libpng-1.0.2 */ -#ifdef PNG_USER_TRANSFORM_PTR_SUPPORTED -#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ - defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) - png_voidp user_transform_ptr PNG_DEPSTRUCT; /* user supplied struct - for user transform */ - png_byte user_transform_depth PNG_DEPSTRUCT; /* bit depth of user - transformed pixels */ - png_byte user_transform_channels PNG_DEPSTRUCT; /* channels in user - transformed pixels */ -#endif -#endif - - png_uint_32 mode PNG_DEPSTRUCT; /* tells us where we are in - the PNG file */ - png_uint_32 flags PNG_DEPSTRUCT; /* flags indicating various - things to libpng */ - png_uint_32 transformations PNG_DEPSTRUCT; /* which transformations - to perform */ - - z_stream zstream PNG_DEPSTRUCT; /* pointer to decompression - structure (below) */ - png_bytep zbuf PNG_DEPSTRUCT; /* buffer for zlib */ - png_size_t zbuf_size PNG_DEPSTRUCT; /* size of zbuf */ - int zlib_level PNG_DEPSTRUCT; /* holds zlib compression level */ - int zlib_method PNG_DEPSTRUCT; /* holds zlib compression method */ - int zlib_window_bits PNG_DEPSTRUCT; /* holds zlib compression window - bits */ - int zlib_mem_level PNG_DEPSTRUCT; /* holds zlib compression memory - level */ - int zlib_strategy PNG_DEPSTRUCT; /* holds zlib compression - strategy */ - - png_uint_32 width PNG_DEPSTRUCT; /* width of image in pixels */ - png_uint_32 height PNG_DEPSTRUCT; /* height of image in pixels */ - png_uint_32 num_rows PNG_DEPSTRUCT; /* number of rows in current pass */ - png_uint_32 usr_width PNG_DEPSTRUCT; /* width of row at start of write */ - png_size_t rowbytes PNG_DEPSTRUCT; /* size of row in bytes */ -#if 0 /* Replaced with the following in libpng-1.4.1 */ - png_size_t irowbytes PNG_DEPSTRUCT; -#endif -/* Added in libpng-1.4.1 */ -#ifdef PNG_USER_LIMITS_SUPPORTED - /* Total memory that a zTXt, sPLT, iTXt, iCCP, or unknown chunk - * can occupy when decompressed. 0 means unlimited. - * We will change the typedef from png_size_t to png_alloc_size_t - * in libpng-1.6.0 - */ - png_alloc_size_t user_chunk_malloc_max PNG_DEPSTRUCT; -#endif - png_uint_32 iwidth PNG_DEPSTRUCT; /* width of current interlaced - row in pixels */ - png_uint_32 row_number PNG_DEPSTRUCT; /* current row in interlace pass */ - png_bytep prev_row PNG_DEPSTRUCT; /* buffer to save previous - (unfiltered) row */ - png_bytep row_buf PNG_DEPSTRUCT; /* buffer to save current - (unfiltered) row */ - png_bytep sub_row PNG_DEPSTRUCT; /* buffer to save "sub" row - when filtering */ - png_bytep up_row PNG_DEPSTRUCT; /* buffer to save "up" row - when filtering */ - png_bytep avg_row PNG_DEPSTRUCT; /* buffer to save "avg" row - when filtering */ - png_bytep paeth_row PNG_DEPSTRUCT; /* buffer to save "Paeth" row - when filtering */ - png_row_info row_info PNG_DEPSTRUCT; /* used for transformation - routines */ - - png_uint_32 idat_size PNG_DEPSTRUCT; /* current IDAT size for read */ - png_uint_32 crc PNG_DEPSTRUCT; /* current chunk CRC value */ - png_colorp palette PNG_DEPSTRUCT; /* palette from the input file */ - png_uint_16 num_palette PNG_DEPSTRUCT; /* number of color entries in - palette */ - png_uint_16 num_trans PNG_DEPSTRUCT; /* number of transparency values */ - png_byte chunk_name[5] PNG_DEPSTRUCT; /* null-terminated name of current - chunk */ - png_byte compression PNG_DEPSTRUCT; /* file compression type - (always 0) */ - png_byte filter PNG_DEPSTRUCT; /* file filter type (always 0) */ - png_byte interlaced PNG_DEPSTRUCT; /* PNG_INTERLACE_NONE, - PNG_INTERLACE_ADAM7 */ - png_byte pass PNG_DEPSTRUCT; /* current interlace pass (0 - 6) */ - png_byte do_filter PNG_DEPSTRUCT; /* row filter flags (see - PNG_FILTER_ below ) */ - png_byte color_type PNG_DEPSTRUCT; /* color type of file */ - png_byte bit_depth PNG_DEPSTRUCT; /* bit depth of file */ - png_byte usr_bit_depth PNG_DEPSTRUCT; /* bit depth of users row */ - png_byte pixel_depth PNG_DEPSTRUCT; /* number of bits per pixel */ - png_byte channels PNG_DEPSTRUCT; /* number of channels in file */ - png_byte usr_channels PNG_DEPSTRUCT; /* channels at start of write */ - png_byte sig_bytes PNG_DEPSTRUCT; /* magic bytes read/written from - start of file */ - -#if defined(PNG_READ_FILLER_SUPPORTED) || defined(PNG_WRITE_FILLER_SUPPORTED) - png_uint_16 filler PNG_DEPSTRUCT; /* filler bytes for pixel - expansion */ -#endif - -#ifdef PNG_bKGD_SUPPORTED - png_byte background_gamma_type PNG_DEPSTRUCT; -# ifdef PNG_FLOATING_POINT_SUPPORTED - float background_gamma PNG_DEPSTRUCT; -# endif - png_color_16 background PNG_DEPSTRUCT; /* background color in - screen gamma space */ -#ifdef PNG_READ_GAMMA_SUPPORTED - png_color_16 background_1 PNG_DEPSTRUCT; /* background normalized - to gamma 1.0 */ -#endif -#endif /* PNG_bKGD_SUPPORTED */ - -#ifdef PNG_WRITE_FLUSH_SUPPORTED - png_flush_ptr output_flush_fn PNG_DEPSTRUCT; /* Function for flushing - output */ - png_uint_32 flush_dist PNG_DEPSTRUCT; /* how many rows apart to flush, - 0 - no flush */ - png_uint_32 flush_rows PNG_DEPSTRUCT; /* number of rows written since - last flush */ -#endif - -#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) - int gamma_shift PNG_DEPSTRUCT; /* number of "insignificant" bits - 16-bit gamma */ -#ifdef PNG_FLOATING_POINT_SUPPORTED - float gamma PNG_DEPSTRUCT; /* file gamma value */ - float screen_gamma PNG_DEPSTRUCT; /* screen gamma value - (display_exponent) */ -#endif -#endif - -#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) - png_bytep gamma_table PNG_DEPSTRUCT; /* gamma table for 8-bit - depth files */ - png_bytep gamma_from_1 PNG_DEPSTRUCT; /* converts from 1.0 to screen */ - png_bytep gamma_to_1 PNG_DEPSTRUCT; /* converts from file to 1.0 */ - png_uint_16pp gamma_16_table PNG_DEPSTRUCT; /* gamma table for 16-bit - depth files */ - png_uint_16pp gamma_16_from_1 PNG_DEPSTRUCT; /* converts from 1.0 to - screen */ - png_uint_16pp gamma_16_to_1 PNG_DEPSTRUCT; /* converts from file to 1.0 */ -#endif - -#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_sBIT_SUPPORTED) - png_color_8 sig_bit PNG_DEPSTRUCT; /* significant bits in each - available channel */ -#endif - -#if defined(PNG_READ_SHIFT_SUPPORTED) || defined(PNG_WRITE_SHIFT_SUPPORTED) - png_color_8 shift PNG_DEPSTRUCT; /* shift for significant bit - tranformation */ -#endif - -#if defined(PNG_tRNS_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) \ - || defined(PNG_READ_EXPAND_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) - png_bytep trans_alpha PNG_DEPSTRUCT; /* alpha values for - paletted files */ - png_color_16 trans_color PNG_DEPSTRUCT; /* transparent color for - non-paletted files */ -#endif - - png_read_status_ptr read_row_fn PNG_DEPSTRUCT; /* called after each - row is decoded */ - png_write_status_ptr write_row_fn PNG_DEPSTRUCT; /* called after each - row is encoded */ -#ifdef PNG_PROGRESSIVE_READ_SUPPORTED - png_progressive_info_ptr info_fn PNG_DEPSTRUCT; /* called after header - data fully read */ - png_progressive_row_ptr row_fn PNG_DEPSTRUCT; /* called after each - prog. row is decoded */ - png_progressive_end_ptr end_fn PNG_DEPSTRUCT; /* called after image - is complete */ - png_bytep save_buffer_ptr PNG_DEPSTRUCT; /* current location in - save_buffer */ - png_bytep save_buffer PNG_DEPSTRUCT; /* buffer for previously - read data */ - png_bytep current_buffer_ptr PNG_DEPSTRUCT; /* current location in - current_buffer */ - png_bytep current_buffer PNG_DEPSTRUCT; /* buffer for recently - used data */ - png_uint_32 push_length PNG_DEPSTRUCT; /* size of current input - chunk */ - png_uint_32 skip_length PNG_DEPSTRUCT; /* bytes to skip in - input data */ - png_size_t save_buffer_size PNG_DEPSTRUCT; /* amount of data now - in save_buffer */ - png_size_t save_buffer_max PNG_DEPSTRUCT; /* total size of - save_buffer */ - png_size_t buffer_size PNG_DEPSTRUCT; /* total amount of - available input data */ - png_size_t current_buffer_size PNG_DEPSTRUCT; /* amount of data now - in current_buffer */ - int process_mode PNG_DEPSTRUCT; /* what push library - is currently doing */ - int cur_palette PNG_DEPSTRUCT; /* current push library - palette index */ - -# ifdef PNG_TEXT_SUPPORTED - png_size_t current_text_size PNG_DEPSTRUCT; /* current size of - text input data */ - png_size_t current_text_left PNG_DEPSTRUCT; /* how much text left - to read in input */ - png_charp current_text PNG_DEPSTRUCT; /* current text chunk - buffer */ - png_charp current_text_ptr PNG_DEPSTRUCT; /* current location - in current_text */ -# endif /* PNG_PROGRESSIVE_READ_SUPPORTED && PNG_TEXT_SUPPORTED */ - -#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ - -#if defined(__TURBOC__) && !defined(_Windows) && !defined(__FLAT__) -/* For the Borland special 64K segment handler */ - png_bytepp offset_table_ptr PNG_DEPSTRUCT; - png_bytep offset_table PNG_DEPSTRUCT; - png_uint_16 offset_table_number PNG_DEPSTRUCT; - png_uint_16 offset_table_count PNG_DEPSTRUCT; - png_uint_16 offset_table_count_free PNG_DEPSTRUCT; -#endif - -#ifdef PNG_READ_QUANTIZE_SUPPORTED - png_bytep palette_lookup PNG_DEPSTRUCT; /* lookup table for quantizing */ - png_bytep quantize_index PNG_DEPSTRUCT; /* index translation for palette - files */ -#endif - -#if defined(PNG_READ_QUANTIZE_SUPPORTED) || defined(PNG_hIST_SUPPORTED) - png_uint_16p hist PNG_DEPSTRUCT; /* histogram */ -#endif - -#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED - png_byte heuristic_method PNG_DEPSTRUCT; /* heuristic for row - filter selection */ - png_byte num_prev_filters PNG_DEPSTRUCT; /* number of weights - for previous rows */ - png_bytep prev_filters PNG_DEPSTRUCT; /* filter type(s) of - previous row(s) */ - png_uint_16p filter_weights PNG_DEPSTRUCT; /* weight(s) for previous - line(s) */ - png_uint_16p inv_filter_weights PNG_DEPSTRUCT; /* 1/weight(s) for - previous line(s) */ - png_uint_16p filter_costs PNG_DEPSTRUCT; /* relative filter - calculation cost */ - png_uint_16p inv_filter_costs PNG_DEPSTRUCT; /* 1/relative filter - calculation cost */ -#endif - -#ifdef PNG_TIME_RFC1123_SUPPORTED - png_charp time_buffer PNG_DEPSTRUCT; /* String to hold RFC 1123 time text */ -#endif - -/* New members added in libpng-1.0.6 */ - - png_uint_32 free_me PNG_DEPSTRUCT; /* flags items libpng is - responsible for freeing */ - -#ifdef PNG_USER_CHUNKS_SUPPORTED - png_voidp user_chunk_ptr PNG_DEPSTRUCT; - png_user_chunk_ptr read_user_chunk_fn PNG_DEPSTRUCT; /* user read - chunk handler */ -#endif - -#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED - int num_chunk_list PNG_DEPSTRUCT; - png_bytep chunk_list PNG_DEPSTRUCT; -#endif - -/* New members added in libpng-1.0.3 */ -#ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED - png_byte rgb_to_gray_status PNG_DEPSTRUCT; - /* These were changed from png_byte in libpng-1.0.6 */ - png_uint_16 rgb_to_gray_red_coeff PNG_DEPSTRUCT; - png_uint_16 rgb_to_gray_green_coeff PNG_DEPSTRUCT; - png_uint_16 rgb_to_gray_blue_coeff PNG_DEPSTRUCT; -#endif - -/* New member added in libpng-1.0.4 (renamed in 1.0.9) */ -#if defined(PNG_MNG_FEATURES_SUPPORTED) || \ - defined(PNG_READ_EMPTY_PLTE_SUPPORTED) || \ - defined(PNG_WRITE_EMPTY_PLTE_SUPPORTED) -/* Changed from png_byte to png_uint_32 at version 1.2.0 */ - png_uint_32 mng_features_permitted PNG_DEPSTRUCT; -#endif - -/* New member added in libpng-1.0.7 */ -#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) - png_fixed_point int_gamma PNG_DEPSTRUCT; -#endif - -/* New member added in libpng-1.0.9, ifdef'ed out in 1.0.12, enabled in 1.2.0 */ -#ifdef PNG_MNG_FEATURES_SUPPORTED - png_byte filter_type PNG_DEPSTRUCT; -#endif - -/* New members added in libpng-1.2.0 */ - -/* New members added in libpng-1.0.2 but first enabled by default in 1.2.0 */ -#ifdef PNG_USER_MEM_SUPPORTED - png_voidp mem_ptr PNG_DEPSTRUCT; /* user supplied struct for - mem functions */ - png_malloc_ptr malloc_fn PNG_DEPSTRUCT; /* function for - allocating memory */ - png_free_ptr free_fn PNG_DEPSTRUCT; /* function for - freeing memory */ -#endif - -/* New member added in libpng-1.0.13 and 1.2.0 */ - png_bytep big_row_buf PNG_DEPSTRUCT; /* buffer to save current - (unfiltered) row */ - -#ifdef PNG_READ_QUANTIZE_SUPPORTED -/* The following three members were added at version 1.0.14 and 1.2.4 */ - png_bytep quantize_sort PNG_DEPSTRUCT; /* working sort array */ - png_bytep index_to_palette PNG_DEPSTRUCT; /* where the original - index currently is - in the palette */ - png_bytep palette_to_index PNG_DEPSTRUCT; /* which original index - points to this - palette color */ -#endif - -/* New members added in libpng-1.0.16 and 1.2.6 */ - png_byte compression_type PNG_DEPSTRUCT; - -#ifdef PNG_USER_LIMITS_SUPPORTED - png_uint_32 user_width_max PNG_DEPSTRUCT; - png_uint_32 user_height_max PNG_DEPSTRUCT; - /* Added in libpng-1.4.0: Total number of sPLT, text, and unknown - * chunks that can be stored (0 means unlimited). - */ - png_uint_32 user_chunk_cache_max PNG_DEPSTRUCT; -#endif - -/* New member added in libpng-1.0.25 and 1.2.17 */ -#ifdef PNG_UNKNOWN_CHUNKS_SUPPORTED - /* Storage for unknown chunk that the library doesn't recognize. */ - png_unknown_chunk unknown_chunk PNG_DEPSTRUCT; -#endif - -/* New members added in libpng-1.2.26 */ - png_uint_32 old_big_row_buf_size PNG_DEPSTRUCT; - png_uint_32 old_prev_row_size PNG_DEPSTRUCT; - -/* New member added in libpng-1.2.30 */ - png_charp chunkdata PNG_DEPSTRUCT; /* buffer for reading chunk data */ - -#ifdef PNG_IO_STATE_SUPPORTED -/* New member added in libpng-1.4.0 */ - png_uint_32 io_state PNG_DEPSTRUCT; -#endif -}; - - -/* This triggers a compiler error in png.c, if png.c and png.h - * do not agree upon the version number. - */ -typedef png_structp version_1_4_3; +typedef PNG_CALLBACK(png_voidp, *png_malloc_ptr, (png_structp, + png_alloc_size_t)); +typedef PNG_CALLBACK(void, *png_free_ptr, (png_structp, png_voidp)); typedef png_struct FAR * FAR * png_structpp; -/* Here are the function definitions most commonly used. This is not - * the place to find out how to use libpng. See libpng.txt for the +/* Section 3: exported functions + * Here are the function definitions most commonly used. This is not + * the place to find out how to use libpng. See libpng-manual.txt for the * full explanation, see example.c for the summary. This just provides * a simple one line description of the use of each function. + * + * The PNG_EXPORT() and PNG_EXPORTA() macros used below are defined in + * pngconf.h and in the *.dfn files in the scripts directory. + * + * PNG_EXPORT(ordinal, type, name, (args)); + * + * ordinal: ordinal that is used while building + * *.def files. The ordinal value is only + * relevant when preprocessing png.h with + * the *.dfn files for building symbol table + * entries, and are removed by pngconf.h. + * type: return type of the function + * name: function name + * args: function arguments, with types + * + * When we wish to append attributes to a function prototype we use + * the PNG_EXPORTA() macro instead. + * + * PNG_EXPORTA(ordinal, type, name, (args), attributes); + * + * ordinal, type, name, and args: same as in PNG_EXPORT(). + * attributes: function attributes */ /* Returns the version number of the library */ -extern PNG_EXPORT(png_uint_32,png_access_version_number) PNGARG((void)); +PNG_EXPORT(1, png_uint_32, png_access_version_number, (void)); /* Tell lib we have already handled the first magic bytes. * Handling more than 8 bytes from the beginning of the file is an error. */ -extern PNG_EXPORT(void,png_set_sig_bytes) PNGARG((png_structp png_ptr, - int num_bytes)); +PNG_EXPORT(2, void, png_set_sig_bytes, (png_structp png_ptr, int num_bytes)); /* Check sig[start] through sig[start + num_to_check - 1] to see if it's a * PNG file. Returns zero if the supplied bytes match the 8-byte PNG * signature, and non-zero otherwise. Having num_to_check == 0 or * start > 7 will always fail (ie return non-zero). */ -extern PNG_EXPORT(int,png_sig_cmp) PNGARG((png_bytep sig, png_size_t start, - png_size_t num_to_check)); +PNG_EXPORT(3, int, png_sig_cmp, (png_const_bytep sig, png_size_t start, + png_size_t num_to_check)); /* Simple signature checking function. This is the same as calling * png_check_sig(sig, n) := !png_sig_cmp(sig, 0, n). */ -#define png_check_sig(sig,n) !png_sig_cmp((sig), 0, (n)) +#define png_check_sig(sig, n) !png_sig_cmp((sig), 0, (n)) /* Allocate and initialize png_ptr struct for reading, and any other memory. */ -extern PNG_EXPORT(png_structp,png_create_read_struct) - PNGARG((png_const_charp user_png_ver, png_voidp error_ptr, - png_error_ptr error_fn, png_error_ptr warn_fn)) PNG_ALLOCATED; +PNG_EXPORTA(4, png_structp, png_create_read_struct, + (png_const_charp user_png_ver, png_voidp error_ptr, + png_error_ptr error_fn, png_error_ptr warn_fn), + PNG_ALLOCATED); /* Allocate and initialize png_ptr struct for writing, and any other memory */ -extern PNG_EXPORT(png_structp,png_create_write_struct) - PNGARG((png_const_charp user_png_ver, png_voidp error_ptr, - png_error_ptr error_fn, png_error_ptr warn_fn)) PNG_ALLOCATED; +PNG_EXPORTA(5, png_structp, png_create_write_struct, + (png_const_charp user_png_ver, png_voidp error_ptr, png_error_ptr error_fn, + png_error_ptr warn_fn), + PNG_ALLOCATED); -extern PNG_EXPORT(png_size_t,png_get_compression_buffer_size) - PNGARG((png_structp png_ptr)); +PNG_EXPORT(6, png_size_t, png_get_compression_buffer_size, + (png_const_structp png_ptr)); -extern PNG_EXPORT(void,png_set_compression_buffer_size) - PNGARG((png_structp png_ptr, png_size_t size)); +PNG_EXPORT(7, void, png_set_compression_buffer_size, (png_structp png_ptr, + png_size_t size)); /* Moved from pngconf.h in 1.4.0 and modified to ensure setjmp/longjmp * match up. @@ -1533,288 +982,316 @@ extern PNG_EXPORT(void,png_set_compression_buffer_size) * allocated by the library - the call will return NULL on a mismatch * indicating an ABI mismatch. */ -extern PNG_EXPORT(jmp_buf*, png_set_longjmp_fn) - PNGARG((png_structp png_ptr, png_longjmp_ptr longjmp_fn, size_t - jmp_buf_size)); +PNG_EXPORT(8, jmp_buf*, png_set_longjmp_fn, (png_structp png_ptr, + png_longjmp_ptr longjmp_fn, size_t jmp_buf_size)); # define png_jmpbuf(png_ptr) \ - (*png_set_longjmp_fn((png_ptr), longjmp, sizeof (jmp_buf))) + (*png_set_longjmp_fn((png_ptr), longjmp, sizeof (jmp_buf))) #else # define png_jmpbuf(png_ptr) \ - (LIBPNG_WAS_COMPILED_WITH__PNG_NO_SETJMP) + (LIBPNG_WAS_COMPILED_WITH__PNG_NO_SETJMP) #endif +/* This function should be used by libpng applications in place of + * longjmp(png_ptr->jmpbuf, val). If longjmp_fn() has been set, it + * will use it; otherwise it will call PNG_ABORT(). This function was + * added in libpng-1.5.0. + */ +PNG_EXPORTA(9, void, png_longjmp, (png_structp png_ptr, int val), + PNG_NORETURN); #ifdef PNG_READ_SUPPORTED /* Reset the compression stream */ -extern PNG_EXPORT(int,png_reset_zstream) PNGARG((png_structp png_ptr)); +PNG_EXPORT(10, int, png_reset_zstream, (png_structp png_ptr)); #endif /* New functions added in libpng-1.0.2 (not enabled by default until 1.2.0) */ #ifdef PNG_USER_MEM_SUPPORTED -extern PNG_EXPORT(png_structp,png_create_read_struct_2) - PNGARG((png_const_charp user_png_ver, png_voidp error_ptr, - png_error_ptr error_fn, png_error_ptr warn_fn, png_voidp mem_ptr, - png_malloc_ptr malloc_fn, png_free_ptr free_fn)) PNG_ALLOCATED; -extern PNG_EXPORT(png_structp,png_create_write_struct_2) - PNGARG((png_const_charp user_png_ver, png_voidp error_ptr, - png_error_ptr error_fn, png_error_ptr warn_fn, png_voidp mem_ptr, - png_malloc_ptr malloc_fn, png_free_ptr free_fn)) PNG_ALLOCATED; +PNG_EXPORTA(11, png_structp, png_create_read_struct_2, + (png_const_charp user_png_ver, png_voidp error_ptr, png_error_ptr error_fn, + png_error_ptr warn_fn, + png_voidp mem_ptr, png_malloc_ptr malloc_fn, png_free_ptr free_fn), + PNG_ALLOCATED); +PNG_EXPORTA(12, png_structp, png_create_write_struct_2, + (png_const_charp user_png_ver, png_voidp error_ptr, png_error_ptr error_fn, + png_error_ptr warn_fn, + png_voidp mem_ptr, png_malloc_ptr malloc_fn, png_free_ptr free_fn), + PNG_ALLOCATED); #endif /* Write the PNG file signature. */ -extern PNG_EXPORT(void,png_write_sig) PNGARG((png_structp png_ptr)); +PNG_EXPORT(13, void, png_write_sig, (png_structp png_ptr)); /* Write a PNG chunk - size, type, (optional) data, CRC. */ -extern PNG_EXPORT(void,png_write_chunk) PNGARG((png_structp png_ptr, - png_bytep chunk_name, png_bytep data, png_size_t length)); +PNG_EXPORT(14, void, png_write_chunk, (png_structp png_ptr, png_const_bytep + chunk_name, png_const_bytep data, png_size_t length)); /* Write the start of a PNG chunk - length and chunk name. */ -extern PNG_EXPORT(void,png_write_chunk_start) PNGARG((png_structp png_ptr, - png_bytep chunk_name, png_uint_32 length)); +PNG_EXPORT(15, void, png_write_chunk_start, (png_structp png_ptr, + png_const_bytep chunk_name, png_uint_32 length)); /* Write the data of a PNG chunk started with png_write_chunk_start(). */ -extern PNG_EXPORT(void,png_write_chunk_data) PNGARG((png_structp png_ptr, - png_bytep data, png_size_t length)); +PNG_EXPORT(16, void, png_write_chunk_data, (png_structp png_ptr, + png_const_bytep data, png_size_t length)); /* Finish a chunk started with png_write_chunk_start() (includes CRC). */ -extern PNG_EXPORT(void,png_write_chunk_end) PNGARG((png_structp png_ptr)); +PNG_EXPORT(17, void, png_write_chunk_end, (png_structp png_ptr)); /* Allocate and initialize the info structure */ -extern PNG_EXPORT(png_infop,png_create_info_struct) - PNGARG((png_structp png_ptr)) PNG_ALLOCATED; +PNG_EXPORTA(18, png_infop, png_create_info_struct, (png_structp png_ptr), + PNG_ALLOCATED); -extern PNG_EXPORT(void,png_info_init_3) PNGARG((png_infopp info_ptr, +PNG_EXPORT(19, void, png_info_init_3, (png_infopp info_ptr, png_size_t png_info_struct_size)); /* Writes all the PNG information before the image. */ -extern PNG_EXPORT(void,png_write_info_before_PLTE) PNGARG((png_structp png_ptr, - png_infop info_ptr)); -extern PNG_EXPORT(void,png_write_info) PNGARG((png_structp png_ptr, - png_infop info_ptr)); +PNG_EXPORT(20, void, png_write_info_before_PLTE, + (png_structp png_ptr, png_infop info_ptr)); +PNG_EXPORT(21, void, png_write_info, + (png_structp png_ptr, png_infop info_ptr)); #ifdef PNG_SEQUENTIAL_READ_SUPPORTED /* Read the information before the actual image data. */ -extern PNG_EXPORT(void,png_read_info) PNGARG((png_structp png_ptr, - png_infop info_ptr)); +PNG_EXPORT(22, void, png_read_info, + (png_structp png_ptr, png_infop info_ptr)); #endif #ifdef PNG_TIME_RFC1123_SUPPORTED -extern PNG_EXPORT(png_charp,png_convert_to_rfc1123) - PNGARG((png_structp png_ptr, png_timep ptime)); +PNG_EXPORT(23, png_const_charp, png_convert_to_rfc1123, + (png_structp png_ptr, + png_const_timep ptime)); #endif #ifdef PNG_CONVERT_tIME_SUPPORTED /* Convert from a struct tm to png_time */ -extern PNG_EXPORT(void,png_convert_from_struct_tm) PNGARG((png_timep ptime, - struct tm FAR * ttime)); +PNG_EXPORT(24, void, png_convert_from_struct_tm, (png_timep ptime, + PNG_CONST struct tm FAR * ttime)); /* Convert from time_t to png_time. Uses gmtime() */ -extern PNG_EXPORT(void,png_convert_from_time_t) PNGARG((png_timep ptime, - time_t ttime)); +PNG_EXPORT(25, void, png_convert_from_time_t, + (png_timep ptime, time_t ttime)); #endif /* PNG_CONVERT_tIME_SUPPORTED */ #ifdef PNG_READ_EXPAND_SUPPORTED /* Expand data to 24-bit RGB, or 8-bit grayscale, with alpha if available. */ -extern PNG_EXPORT(void,png_set_expand) PNGARG((png_structp png_ptr)); -extern PNG_EXPORT(void,png_set_expand_gray_1_2_4_to_8) PNGARG((png_structp - png_ptr)); -extern PNG_EXPORT(void,png_set_palette_to_rgb) PNGARG((png_structp png_ptr)); -extern PNG_EXPORT(void,png_set_tRNS_to_alpha) PNGARG((png_structp png_ptr)); +PNG_EXPORT(26, void, png_set_expand, (png_structp png_ptr)); +PNG_EXPORT(27, void, png_set_expand_gray_1_2_4_to_8, (png_structp png_ptr)); +PNG_EXPORT(28, void, png_set_palette_to_rgb, (png_structp png_ptr)); +PNG_EXPORT(29, void, png_set_tRNS_to_alpha, (png_structp png_ptr)); +#endif + +#ifdef PNG_READ_EXPAND_16_SUPPORTED +/* Expand to 16 bit channels, forces conversion of palette to RGB and expansion + * of a tRNS chunk if present. + */ +PNG_EXPORT(221, void, png_set_expand_16, (png_structp png_ptr)); #endif #if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED) /* Use blue, green, red order for pixels. */ -extern PNG_EXPORT(void,png_set_bgr) PNGARG((png_structp png_ptr)); +PNG_EXPORT(30, void, png_set_bgr, (png_structp png_ptr)); #endif #ifdef PNG_READ_GRAY_TO_RGB_SUPPORTED /* Expand the grayscale to 24-bit RGB if necessary. */ -extern PNG_EXPORT(void,png_set_gray_to_rgb) PNGARG((png_structp png_ptr)); +PNG_EXPORT(31, void, png_set_gray_to_rgb, (png_structp png_ptr)); #endif #ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED /* Reduce RGB to grayscale. */ -#ifdef PNG_FLOATING_POINT_SUPPORTED -extern PNG_EXPORT(void,png_set_rgb_to_gray) PNGARG((png_structp png_ptr, - int error_action, double red, double green )); -#endif -extern PNG_EXPORT(void,png_set_rgb_to_gray_fixed) PNGARG((png_structp png_ptr, - int error_action, png_fixed_point red, png_fixed_point green )); -extern PNG_EXPORT(png_byte,png_get_rgb_to_gray_status) PNGARG((png_structp - png_ptr)); +PNG_FP_EXPORT(32, void, png_set_rgb_to_gray, (png_structp png_ptr, + int error_action, double red, double green)); +PNG_FIXED_EXPORT(33, void, png_set_rgb_to_gray_fixed, (png_structp png_ptr, + int error_action, png_fixed_point red, png_fixed_point green)); + +PNG_EXPORT(34, png_byte, png_get_rgb_to_gray_status, (png_const_structp + png_ptr)); #endif -extern PNG_EXPORT(void,png_build_grayscale_palette) PNGARG((int bit_depth, - png_colorp palette)); +PNG_EXPORT(35, void, png_build_grayscale_palette, (int bit_depth, + png_colorp palette)); #ifdef PNG_READ_STRIP_ALPHA_SUPPORTED -extern PNG_EXPORT(void,png_set_strip_alpha) PNGARG((png_structp png_ptr)); +PNG_EXPORT(36, void, png_set_strip_alpha, (png_structp png_ptr)); #endif #if defined(PNG_READ_SWAP_ALPHA_SUPPORTED) || \ defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED) -extern PNG_EXPORT(void,png_set_swap_alpha) PNGARG((png_structp png_ptr)); +PNG_EXPORT(37, void, png_set_swap_alpha, (png_structp png_ptr)); #endif #if defined(PNG_READ_INVERT_ALPHA_SUPPORTED) || \ defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED) -extern PNG_EXPORT(void,png_set_invert_alpha) PNGARG((png_structp png_ptr)); +PNG_EXPORT(38, void, png_set_invert_alpha, (png_structp png_ptr)); #endif #if defined(PNG_READ_FILLER_SUPPORTED) || defined(PNG_WRITE_FILLER_SUPPORTED) /* Add a filler byte to 8-bit Gray or 24-bit RGB images. */ -extern PNG_EXPORT(void,png_set_filler) PNGARG((png_structp png_ptr, - png_uint_32 filler, int flags)); +PNG_EXPORT(39, void, png_set_filler, (png_structp png_ptr, png_uint_32 filler, + int flags)); /* The values of the PNG_FILLER_ defines should NOT be changed */ -#define PNG_FILLER_BEFORE 0 -#define PNG_FILLER_AFTER 1 +# define PNG_FILLER_BEFORE 0 +# define PNG_FILLER_AFTER 1 /* Add an alpha byte to 8-bit Gray or 24-bit RGB images. */ -extern PNG_EXPORT(void,png_set_add_alpha) PNGARG((png_structp png_ptr, - png_uint_32 filler, int flags)); +PNG_EXPORT(40, void, png_set_add_alpha, + (png_structp png_ptr, png_uint_32 filler, + int flags)); #endif /* PNG_READ_FILLER_SUPPORTED || PNG_WRITE_FILLER_SUPPORTED */ #if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED) /* Swap bytes in 16-bit depth files. */ -extern PNG_EXPORT(void,png_set_swap) PNGARG((png_structp png_ptr)); +PNG_EXPORT(41, void, png_set_swap, (png_structp png_ptr)); #endif #if defined(PNG_READ_PACK_SUPPORTED) || defined(PNG_WRITE_PACK_SUPPORTED) /* Use 1 byte per pixel in 1, 2, or 4-bit depth files. */ -extern PNG_EXPORT(void,png_set_packing) PNGARG((png_structp png_ptr)); +PNG_EXPORT(42, void, png_set_packing, (png_structp png_ptr)); #endif #if defined(PNG_READ_PACKSWAP_SUPPORTED) || \ defined(PNG_WRITE_PACKSWAP_SUPPORTED) /* Swap packing order of pixels in bytes. */ -extern PNG_EXPORT(void,png_set_packswap) PNGARG((png_structp png_ptr)); +PNG_EXPORT(43, void, png_set_packswap, (png_structp png_ptr)); #endif #if defined(PNG_READ_SHIFT_SUPPORTED) || defined(PNG_WRITE_SHIFT_SUPPORTED) /* Converts files to legal bit depths. */ -extern PNG_EXPORT(void,png_set_shift) PNGARG((png_structp png_ptr, - png_color_8p true_bits)); +PNG_EXPORT(44, void, png_set_shift, (png_structp png_ptr, png_const_color_8p + true_bits)); #endif #if defined(PNG_READ_INTERLACING_SUPPORTED) || \ defined(PNG_WRITE_INTERLACING_SUPPORTED) -/* Have the code handle the interlacing. Returns the number of passes. */ -extern PNG_EXPORT(int,png_set_interlace_handling) PNGARG((png_structp png_ptr)); +/* Have the code handle the interlacing. Returns the number of passes. + * MUST be called before png_read_update_info or png_start_read_image, + * otherwise it will not have the desired effect. Note that it is still + * necessary to call png_read_row or png_read_rows png_get_image_height + * times for each pass. +*/ +PNG_EXPORT(45, int, png_set_interlace_handling, (png_structp png_ptr)); #endif #if defined(PNG_READ_INVERT_SUPPORTED) || defined(PNG_WRITE_INVERT_SUPPORTED) /* Invert monochrome files */ -extern PNG_EXPORT(void,png_set_invert_mono) PNGARG((png_structp png_ptr)); +PNG_EXPORT(46, void, png_set_invert_mono, (png_structp png_ptr)); #endif #ifdef PNG_READ_BACKGROUND_SUPPORTED /* Handle alpha and tRNS by replacing with a background color. */ -#ifdef PNG_FLOATING_POINT_SUPPORTED -extern PNG_EXPORT(void,png_set_background) PNGARG((png_structp png_ptr, - png_color_16p background_color, int background_gamma_code, - int need_expand, double background_gamma)); +PNG_FP_EXPORT(47, void, png_set_background, (png_structp png_ptr, + png_const_color_16p background_color, int background_gamma_code, + int need_expand, double background_gamma)); +PNG_FIXED_EXPORT(215, void, png_set_background_fixed, (png_structp png_ptr, + png_const_color_16p background_color, int background_gamma_code, + int need_expand, png_fixed_point background_gamma)); #endif -#define PNG_BACKGROUND_GAMMA_UNKNOWN 0 -#define PNG_BACKGROUND_GAMMA_SCREEN 1 -#define PNG_BACKGROUND_GAMMA_FILE 2 -#define PNG_BACKGROUND_GAMMA_UNIQUE 3 +#ifdef PNG_READ_BACKGROUND_SUPPORTED +# define PNG_BACKGROUND_GAMMA_UNKNOWN 0 +# define PNG_BACKGROUND_GAMMA_SCREEN 1 +# define PNG_BACKGROUND_GAMMA_FILE 2 +# define PNG_BACKGROUND_GAMMA_UNIQUE 3 #endif #ifdef PNG_READ_16_TO_8_SUPPORTED /* Strip the second byte of information from a 16-bit depth file. */ -extern PNG_EXPORT(void,png_set_strip_16) PNGARG((png_structp png_ptr)); +PNG_EXPORT(48, void, png_set_strip_16, (png_structp png_ptr)); #endif #ifdef PNG_READ_QUANTIZE_SUPPORTED /* Turn on quantizing, and reduce the palette to the number of colors - * available. Prior to libpng-1.4.2, this was png_set_dither(). + * available. */ -extern PNG_EXPORT(void,png_set_quantize) PNGARG((png_structp png_ptr, - png_colorp palette, int num_palette, int maximum_colors, - png_uint_16p histogram, int full_quantize)); +PNG_EXPORT(49, void, png_set_quantize, + (png_structp png_ptr, png_colorp palette, + int num_palette, int maximum_colors, png_const_uint_16p histogram, + int full_quantize)); #endif -/* This migration aid will be removed from libpng-1.5.0 */ -#define png_set_dither png_set_quantize #ifdef PNG_READ_GAMMA_SUPPORTED -/* Handle gamma correction. Screen_gamma=(display_exponent) */ -#ifdef PNG_FLOATING_POINT_SUPPORTED -extern PNG_EXPORT(void,png_set_gamma) PNGARG((png_structp png_ptr, - double screen_gamma, double default_file_gamma)); -#endif -#endif +/* The threshold on gamma processing is configurable but hard-wired into the + * library. The following is the floating point variant. + */ +#define PNG_GAMMA_THRESHOLD (PNG_GAMMA_THRESHOLD_FIXED*.00001) +/* Handle gamma correction. Screen_gamma=(display_exponent) */ +PNG_FP_EXPORT(50, void, png_set_gamma, + (png_structp png_ptr, double screen_gamma, + double default_file_gamma)); +PNG_FIXED_EXPORT(208, void, png_set_gamma_fixed, (png_structp png_ptr, + png_fixed_point screen_gamma, png_fixed_point default_file_gamma)); +#endif #ifdef PNG_WRITE_FLUSH_SUPPORTED /* Set how many lines between output flushes - 0 for no flushing */ -extern PNG_EXPORT(void,png_set_flush) PNGARG((png_structp png_ptr, int nrows)); +PNG_EXPORT(51, void, png_set_flush, (png_structp png_ptr, int nrows)); /* Flush the current PNG output buffer */ -extern PNG_EXPORT(void,png_write_flush) PNGARG((png_structp png_ptr)); +PNG_EXPORT(52, void, png_write_flush, (png_structp png_ptr)); #endif /* Optional update palette with requested transformations */ -extern PNG_EXPORT(void,png_start_read_image) PNGARG((png_structp png_ptr)); +PNG_EXPORT(53, void, png_start_read_image, (png_structp png_ptr)); /* Optional call to update the users info structure */ -extern PNG_EXPORT(void,png_read_update_info) PNGARG((png_structp png_ptr, - png_infop info_ptr)); +PNG_EXPORT(54, void, png_read_update_info, + (png_structp png_ptr, png_infop info_ptr)); #ifdef PNG_SEQUENTIAL_READ_SUPPORTED /* Read one or more rows of image data. */ -extern PNG_EXPORT(void,png_read_rows) PNGARG((png_structp png_ptr, - png_bytepp row, png_bytepp display_row, png_uint_32 num_rows)); +PNG_EXPORT(55, void, png_read_rows, (png_structp png_ptr, png_bytepp row, + png_bytepp display_row, png_uint_32 num_rows)); #endif #ifdef PNG_SEQUENTIAL_READ_SUPPORTED /* Read a row of data. */ -extern PNG_EXPORT(void,png_read_row) PNGARG((png_structp png_ptr, - png_bytep row, - png_bytep display_row)); +PNG_EXPORT(56, void, png_read_row, (png_structp png_ptr, png_bytep row, + png_bytep display_row)); #endif #ifdef PNG_SEQUENTIAL_READ_SUPPORTED /* Read the whole image into memory at once. */ -extern PNG_EXPORT(void,png_read_image) PNGARG((png_structp png_ptr, - png_bytepp image)); +PNG_EXPORT(57, void, png_read_image, (png_structp png_ptr, png_bytepp image)); #endif /* Write a row of image data */ -extern PNG_EXPORT(void,png_write_row) PNGARG((png_structp png_ptr, - png_bytep row)); +PNG_EXPORT(58, void, png_write_row, + (png_structp png_ptr, png_const_bytep row)); -/* Write a few rows of image data */ -extern PNG_EXPORT(void,png_write_rows) PNGARG((png_structp png_ptr, - png_bytepp row, png_uint_32 num_rows)); +/* Write a few rows of image data: (*row) is not written; however, the type + * is declared as writeable to maintain compatibility with previous versions + * of libpng and to allow the 'display_row' array from read_rows to be passed + * unchanged to write_rows. + */ +PNG_EXPORT(59, void, png_write_rows, (png_structp png_ptr, png_bytepp row, + png_uint_32 num_rows)); /* Write the image data */ -extern PNG_EXPORT(void,png_write_image) PNGARG((png_structp png_ptr, - png_bytepp image)); +PNG_EXPORT(60, void, png_write_image, + (png_structp png_ptr, png_bytepp image)); /* Write the end of the PNG file. */ -extern PNG_EXPORT(void,png_write_end) PNGARG((png_structp png_ptr, - png_infop info_ptr)); +PNG_EXPORT(61, void, png_write_end, + (png_structp png_ptr, png_infop info_ptr)); #ifdef PNG_SEQUENTIAL_READ_SUPPORTED /* Read the end of the PNG file. */ -extern PNG_EXPORT(void,png_read_end) PNGARG((png_structp png_ptr, - png_infop info_ptr)); +PNG_EXPORT(62, void, png_read_end, (png_structp png_ptr, png_infop info_ptr)); #endif /* Free any memory associated with the png_info_struct */ -extern PNG_EXPORT(void,png_destroy_info_struct) PNGARG((png_structp png_ptr, - png_infopp info_ptr_ptr)); +PNG_EXPORT(63, void, png_destroy_info_struct, (png_structp png_ptr, + png_infopp info_ptr_ptr)); /* Free any memory associated with the png_struct and the png_info_structs */ -extern PNG_EXPORT(void,png_destroy_read_struct) PNGARG((png_structpp - png_ptr_ptr, png_infopp info_ptr_ptr, png_infopp end_info_ptr_ptr)); +PNG_EXPORT(64, void, png_destroy_read_struct, (png_structpp png_ptr_ptr, + png_infopp info_ptr_ptr, png_infopp end_info_ptr_ptr)); /* Free any memory associated with the png_struct and the png_info_structs */ -extern PNG_EXPORT(void,png_destroy_write_struct) - PNGARG((png_structpp png_ptr_ptr, png_infopp info_ptr_ptr)); +PNG_EXPORT(65, void, png_destroy_write_struct, (png_structpp png_ptr_ptr, + png_infopp info_ptr_ptr)); /* Set the libpng method of handling chunk CRC errors */ -extern PNG_EXPORT(void,png_set_crc_action) PNGARG((png_structp png_ptr, - int crit_action, int ancil_action)); +PNG_EXPORT(66, void, png_set_crc_action, + (png_structp png_ptr, int crit_action, int ancil_action)); -/* Values for png_set_crc_action() to say how to handle CRC errors in +/* Values for png_set_crc_action() say how to handle CRC errors in * ancillary and critical chunks, and whether to use the data contained * therein. Note that it is impossible to "discard" data in a critical * chunk. For versions prior to 0.90, the action was always error/quit, @@ -1841,8 +1318,8 @@ extern PNG_EXPORT(void,png_set_crc_action) PNGARG((png_structp png_ptr, /* Set the filtering method(s) used by libpng. Currently, the only valid * value for "method" is 0. */ -extern PNG_EXPORT(void,png_set_filter) PNGARG((png_structp png_ptr, int method, - int filters)); +PNG_EXPORT(67, void, png_set_filter, + (png_structp png_ptr, int method, int filters)); /* Flags for png_set_filter() to say which filters to use. The flags * are chosen so that they don't conflict with real filter types @@ -1897,11 +1374,13 @@ extern PNG_EXPORT(void,png_set_filter) PNGARG((png_structp png_ptr, int method, * the weights and costs are set to 1.0, this degenerates the WEIGHTED method * to the UNWEIGHTED method, but with added encoding time/computation. */ -#ifdef PNG_FLOATING_POINT_SUPPORTED -extern PNG_EXPORT(void,png_set_filter_heuristics) PNGARG((png_structp png_ptr, - int heuristic_method, int num_weights, png_doublep filter_weights, - png_doublep filter_costs)); -#endif +PNG_FP_EXPORT(68, void, png_set_filter_heuristics, (png_structp png_ptr, + int heuristic_method, int num_weights, png_const_doublep filter_weights, + png_const_doublep filter_costs)); +PNG_FIXED_EXPORT(209, void, png_set_filter_heuristics_fixed, + (png_structp png_ptr, + int heuristic_method, int num_weights, png_const_fixed_point_p + filter_weights, png_const_fixed_point_p filter_costs)); #endif /* PNG_WRITE_WEIGHTED_FILTER_SUPPORTED */ /* Heuristic used for row filter selection. These defines should NOT be @@ -1919,34 +1398,33 @@ extern PNG_EXPORT(void,png_set_filter_heuristics) PNGARG((png_structp png_ptr, * for PNG images, and do considerably fewer caclulations. In the future, * these values may not correspond directly to the zlib compression levels. */ -extern PNG_EXPORT(void,png_set_compression_level) PNGARG((png_structp png_ptr, - int level)); +PNG_EXPORT(69, void, png_set_compression_level, + (png_structp png_ptr, int level)); -extern PNG_EXPORT(void,png_set_compression_mem_level) - PNGARG((png_structp png_ptr, int mem_level)); +PNG_EXPORT(70, void, png_set_compression_mem_level, (png_structp png_ptr, + int mem_level)); -extern PNG_EXPORT(void,png_set_compression_strategy) - PNGARG((png_structp png_ptr, int strategy)); +PNG_EXPORT(71, void, png_set_compression_strategy, (png_structp png_ptr, + int strategy)); -extern PNG_EXPORT(void,png_set_compression_window_bits) - PNGARG((png_structp png_ptr, int window_bits)); +PNG_EXPORT(72, void, png_set_compression_window_bits, (png_structp png_ptr, + int window_bits)); -extern PNG_EXPORT(void,png_set_compression_method) PNGARG((png_structp png_ptr, - int method)); +PNG_EXPORT(73, void, png_set_compression_method, (png_structp png_ptr, + int method)); /* These next functions are called for input/output, memory, and error * handling. They are in the file pngrio.c, pngwio.c, and pngerror.c, * and call standard C I/O routines such as fread(), fwrite(), and * fprintf(). These functions can be made to use other I/O routines * at run time for those applications that need to handle I/O in a - * different manner by calling png_set_???_fn(). See libpng.txt for + * different manner by calling png_set_???_fn(). See libpng-manual.txt for * more information. */ #ifdef PNG_STDIO_SUPPORTED /* Initialize the input/output for the PNG file to the default functions. */ -extern PNG_EXPORT(void,png_init_io) PNGARG((png_structp png_ptr, - png_FILE_p fp)); +PNG_EXPORT(74, void, png_init_io, (png_structp png_ptr, png_FILE_p fp)); #endif /* Replace the (error and abort), and warning functions with user @@ -1957,11 +1435,12 @@ extern PNG_EXPORT(void,png_init_io) PNGARG((png_structp png_ptr, * default function will be used. */ -extern PNG_EXPORT(void,png_set_error_fn) PNGARG((png_structp png_ptr, - png_voidp error_ptr, png_error_ptr error_fn, png_error_ptr warning_fn)); +PNG_EXPORT(75, void, png_set_error_fn, + (png_structp png_ptr, png_voidp error_ptr, + png_error_ptr error_fn, png_error_ptr warning_fn)); /* Return the user pointer associated with the error functions */ -extern PNG_EXPORT(png_voidp,png_get_error_ptr) PNGARG((png_structp png_ptr)); +PNG_EXPORT(76, png_voidp, png_get_error_ptr, (png_const_structp png_ptr)); /* Replace the default data output functions with a user supplied one(s). * If buffered output is not used, then output_flush_fn can be set to NULL. @@ -1973,101 +1452,137 @@ extern PNG_EXPORT(png_voidp,png_get_error_ptr) PNGARG((png_structp png_ptr)); * default flush function, which uses the standard *FILE structure, will * be used. */ -extern PNG_EXPORT(void,png_set_write_fn) PNGARG((png_structp png_ptr, - png_voidp io_ptr, png_rw_ptr write_data_fn, png_flush_ptr output_flush_fn)); +PNG_EXPORT(77, void, png_set_write_fn, (png_structp png_ptr, png_voidp io_ptr, + png_rw_ptr write_data_fn, png_flush_ptr output_flush_fn)); /* Replace the default data input function with a user supplied one. */ -extern PNG_EXPORT(void,png_set_read_fn) PNGARG((png_structp png_ptr, - png_voidp io_ptr, png_rw_ptr read_data_fn)); +PNG_EXPORT(78, void, png_set_read_fn, (png_structp png_ptr, png_voidp io_ptr, + png_rw_ptr read_data_fn)); /* Return the user pointer associated with the I/O functions */ -extern PNG_EXPORT(png_voidp,png_get_io_ptr) PNGARG((png_structp png_ptr)); +PNG_EXPORT(79, png_voidp, png_get_io_ptr, (png_structp png_ptr)); -extern PNG_EXPORT(void,png_set_read_status_fn) PNGARG((png_structp png_ptr, - png_read_status_ptr read_row_fn)); +PNG_EXPORT(80, void, png_set_read_status_fn, (png_structp png_ptr, + png_read_status_ptr read_row_fn)); -extern PNG_EXPORT(void,png_set_write_status_fn) PNGARG((png_structp png_ptr, - png_write_status_ptr write_row_fn)); +PNG_EXPORT(81, void, png_set_write_status_fn, (png_structp png_ptr, + png_write_status_ptr write_row_fn)); #ifdef PNG_USER_MEM_SUPPORTED /* Replace the default memory allocation functions with user supplied one(s). */ -extern PNG_EXPORT(void,png_set_mem_fn) PNGARG((png_structp png_ptr, - png_voidp mem_ptr, png_malloc_ptr malloc_fn, png_free_ptr free_fn)); +PNG_EXPORT(82, void, png_set_mem_fn, (png_structp png_ptr, png_voidp mem_ptr, + png_malloc_ptr malloc_fn, png_free_ptr free_fn)); /* Return the user pointer associated with the memory functions */ -extern PNG_EXPORT(png_voidp,png_get_mem_ptr) PNGARG((png_structp png_ptr)); +PNG_EXPORT(83, png_voidp, png_get_mem_ptr, (png_const_structp png_ptr)); #endif #ifdef PNG_READ_USER_TRANSFORM_SUPPORTED -extern PNG_EXPORT(void,png_set_read_user_transform_fn) PNGARG((png_structp - png_ptr, png_user_transform_ptr read_user_transform_fn)); +PNG_EXPORT(84, void, png_set_read_user_transform_fn, (png_structp png_ptr, + png_user_transform_ptr read_user_transform_fn)); #endif #ifdef PNG_WRITE_USER_TRANSFORM_SUPPORTED -extern PNG_EXPORT(void,png_set_write_user_transform_fn) PNGARG((png_structp - png_ptr, png_user_transform_ptr write_user_transform_fn)); +PNG_EXPORT(85, void, png_set_write_user_transform_fn, (png_structp png_ptr, + png_user_transform_ptr write_user_transform_fn)); #endif -#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ - defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) -extern PNG_EXPORT(void,png_set_user_transform_info) PNGARG((png_structp - png_ptr, png_voidp user_transform_ptr, int user_transform_depth, - int user_transform_channels)); +#ifdef PNG_USER_TRANSFORM_PTR_SUPPORTED +PNG_EXPORT(86, void, png_set_user_transform_info, (png_structp png_ptr, + png_voidp user_transform_ptr, int user_transform_depth, + int user_transform_channels)); /* Return the user pointer associated with the user transform functions */ -extern PNG_EXPORT(png_voidp,png_get_user_transform_ptr) - PNGARG((png_structp png_ptr)); +PNG_EXPORT(87, png_voidp, png_get_user_transform_ptr, + (png_const_structp png_ptr)); +#endif + +#ifdef PNG_USER_TRANSFORM_INFO_SUPPORTED +/* Return information about the row currently being processed. Note that these + * APIs do not fail but will return unexpected results if called outside a user + * transform callback. Also note that when transforming an interlaced image the + * row number is the row number within the sub-image of the interlace pass, so + * the value will increase to the height of the sub-image (not the full image) + * then reset to 0 for the next pass. + * + * Use PNG_ROW_FROM_PASS_ROW(row, pass) and PNG_COL_FROM_PASS_COL(col, pass) to + * find the output pixel (x,y) given an interlaced sub-image pixel + * (row,col,pass). (See below for these macros.) + */ +PNG_EXPORT(217, png_uint_32, png_get_current_row_number, (png_const_structp)); +PNG_EXPORT(218, png_byte, png_get_current_pass_number, (png_const_structp)); #endif #ifdef PNG_USER_CHUNKS_SUPPORTED -extern PNG_EXPORT(void,png_set_read_user_chunk_fn) PNGARG((png_structp png_ptr, - png_voidp user_chunk_ptr, png_user_chunk_ptr read_user_chunk_fn)); -extern PNG_EXPORT(png_voidp,png_get_user_chunk_ptr) PNGARG((png_structp - png_ptr)); +PNG_EXPORT(88, void, png_set_read_user_chunk_fn, (png_structp png_ptr, + png_voidp user_chunk_ptr, png_user_chunk_ptr read_user_chunk_fn)); +PNG_EXPORT(89, png_voidp, png_get_user_chunk_ptr, (png_const_structp png_ptr)); #endif #ifdef PNG_PROGRESSIVE_READ_SUPPORTED /* Sets the function callbacks for the push reader, and a pointer to a * user-defined structure available to the callback functions. */ -extern PNG_EXPORT(void,png_set_progressive_read_fn) PNGARG((png_structp png_ptr, - png_voidp progressive_ptr, - png_progressive_info_ptr info_fn, png_progressive_row_ptr row_fn, - png_progressive_end_ptr end_fn)); +PNG_EXPORT(90, void, png_set_progressive_read_fn, (png_structp png_ptr, + png_voidp progressive_ptr, png_progressive_info_ptr info_fn, + png_progressive_row_ptr row_fn, png_progressive_end_ptr end_fn)); /* Returns the user pointer associated with the push read functions */ -extern PNG_EXPORT(png_voidp,png_get_progressive_ptr) - PNGARG((png_structp png_ptr)); +PNG_EXPORT(91, png_voidp, png_get_progressive_ptr, (png_const_structp png_ptr)); /* Function to be called when data becomes available */ -extern PNG_EXPORT(void,png_process_data) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_bytep buffer, png_size_t buffer_size)); +PNG_EXPORT(92, void, png_process_data, + (png_structp png_ptr, png_infop info_ptr, + png_bytep buffer, png_size_t buffer_size)); -/* Function that combines rows. Not very much different than the - * png_combine_row() call. Is this even used????? +/* A function which may be called *only* within png_process_data to stop the + * processing of any more data. The function returns the number of bytes + * remaining, excluding any that libpng has cached internally. A subsequent + * call to png_process_data must supply these bytes again. If the argument + * 'save' is set to true the routine will first save all the pending data and + * will always return 0. */ -extern PNG_EXPORT(void,png_progressive_combine_row) PNGARG((png_structp png_ptr, - png_bytep old_row, png_bytep new_row)); +PNG_EXPORT(219, png_size_t, png_process_data_pause, (png_structp, int save)); + +/* A function which may be called *only* outside (after) a call to + * png_process_data. It returns the number of bytes of data to skip in the + * input. Normally it will return 0, but if it returns a non-zero value the + * application must skip than number of bytes of input data and pass the + * following data to the next call to png_process_data. + */ +PNG_EXPORT(220, png_uint_32, png_process_data_skip, (png_structp)); + +/* Function that combines rows. 'new_row' is a flag that should come from + * the callback and be non-NULL if anything needs to be done; the library + * stores its own version of the new data internally and ignores the passed + * in value. + */ +PNG_EXPORT(93, void, png_progressive_combine_row, (png_structp png_ptr, + png_bytep old_row, png_const_bytep new_row)); #endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ -extern PNG_EXPORT(png_voidp,png_malloc) PNGARG((png_structp png_ptr, - png_alloc_size_t size)) PNG_ALLOCATED; +PNG_EXPORTA(94, png_voidp, png_malloc, + (png_structp png_ptr, png_alloc_size_t size), + PNG_ALLOCATED); /* Added at libpng version 1.4.0 */ -extern PNG_EXPORT(png_voidp,png_calloc) PNGARG((png_structp png_ptr, - png_alloc_size_t size)) PNG_ALLOCATED; +PNG_EXPORTA(95, png_voidp, png_calloc, + (png_structp png_ptr, png_alloc_size_t size), + PNG_ALLOCATED); /* Added at libpng version 1.2.4 */ -extern PNG_EXPORT(png_voidp,png_malloc_warn) PNGARG((png_structp png_ptr, - png_alloc_size_t size)) PNG_ALLOCATED; +PNG_EXPORTA(96, png_voidp, png_malloc_warn, (png_structp png_ptr, + png_alloc_size_t size), PNG_ALLOCATED); /* Frees a pointer allocated by png_malloc() */ -extern PNG_EXPORT(void,png_free) PNGARG((png_structp png_ptr, png_voidp ptr)); +PNG_EXPORT(97, void, png_free, (png_structp png_ptr, png_voidp ptr)); /* Free data that was allocated internally */ -extern PNG_EXPORT(void,png_free_data) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_uint_32 free_me, int num)); +PNG_EXPORT(98, void, png_free_data, + (png_structp png_ptr, png_infop info_ptr, png_uint_32 free_me, int num)); + /* Reassign responsibility for freeing existing data, whether allocated * by libpng or by the application */ -extern PNG_EXPORT(void,png_data_freer) PNGARG((png_structp png_ptr, - png_infop info_ptr, int freer, png_uint_32 mask)); +PNG_EXPORT(99, void, png_data_freer, + (png_structp png_ptr, png_infop info_ptr, int freer, png_uint_32 mask)); + /* Assignments for png_data_freer */ #define PNG_DESTROY_WILL_FREE_DATA 1 #define PNG_SET_WILL_FREE_DATA 1 @@ -2088,46 +1603,56 @@ extern PNG_EXPORT(void,png_data_freer) PNGARG((png_structp png_ptr, #define PNG_FREE_MUL 0x4220 /* PNG_FREE_SPLT|PNG_FREE_TEXT|PNG_FREE_UNKN */ #ifdef PNG_USER_MEM_SUPPORTED -extern PNG_EXPORT(png_voidp,png_malloc_default) PNGARG((png_structp png_ptr, - png_alloc_size_t size)) PNG_ALLOCATED; -extern PNG_EXPORT(void,png_free_default) PNGARG((png_structp png_ptr, - png_voidp ptr)); +PNG_EXPORTA(100, png_voidp, png_malloc_default, (png_structp png_ptr, + png_alloc_size_t size), PNG_ALLOCATED); +PNG_EXPORT(101, void, png_free_default, (png_structp png_ptr, png_voidp ptr)); #endif -#ifndef PNG_NO_ERROR_TEXT +#ifdef PNG_ERROR_TEXT_SUPPORTED /* Fatal error in PNG image of libpng - can't continue */ -extern PNG_EXPORT(void,png_error) PNGARG((png_structp png_ptr, - png_const_charp error_message)) PNG_NORETURN; +PNG_EXPORTA(102, void, png_error, + (png_structp png_ptr, png_const_charp error_message), + PNG_NORETURN); /* The same, but the chunk name is prepended to the error string. */ -extern PNG_EXPORT(void,png_chunk_error) PNGARG((png_structp png_ptr, - png_const_charp error_message)) PNG_NORETURN; +PNG_EXPORTA(103, void, png_chunk_error, (png_structp png_ptr, + png_const_charp error_message), PNG_NORETURN); #else /* Fatal error in PNG image of libpng - can't continue */ -extern PNG_EXPORT(void,png_err) PNGARG((png_structp png_ptr)) PNG_NORETURN; +PNG_EXPORTA(104, void, png_err, (png_structp png_ptr), PNG_NORETURN); #endif /* Non-fatal error in libpng. Can continue, but may have a problem. */ -extern PNG_EXPORT(void,png_warning) PNGARG((png_structp png_ptr, - png_const_charp warning_message)); +PNG_EXPORT(105, void, png_warning, (png_structp png_ptr, + png_const_charp warning_message)); /* Non-fatal error in libpng, chunk name is prepended to message. */ -extern PNG_EXPORT(void,png_chunk_warning) PNGARG((png_structp png_ptr, - png_const_charp warning_message)); +PNG_EXPORT(106, void, png_chunk_warning, (png_structp png_ptr, + png_const_charp warning_message)); #ifdef PNG_BENIGN_ERRORS_SUPPORTED /* Benign error in libpng. Can continue, but may have a problem. * User can choose whether to handle as a fatal error or as a warning. */ -extern PNG_EXPORT(void,png_benign_error) PNGARG((png_structp png_ptr, - png_const_charp warning_message)); +# undef png_benign_error +PNG_EXPORT(107, void, png_benign_error, (png_structp png_ptr, + png_const_charp warning_message)); /* Same, chunk name is prepended to message. */ -extern PNG_EXPORT(void,png_chunk_benign_error) PNGARG((png_structp png_ptr, - png_const_charp warning_message)); +# undef png_chunk_benign_error +PNG_EXPORT(108, void, png_chunk_benign_error, (png_structp png_ptr, + png_const_charp warning_message)); -extern PNG_EXPORT(void,png_set_benign_errors) PNGARG((png_structp - png_ptr, int allowed)); +PNG_EXPORT(109, void, png_set_benign_errors, + (png_structp png_ptr, int allowed)); +#else +# ifdef PNG_ALLOW_BENIGN_ERRORS +# define png_benign_error png_warning +# define png_chunk_benign_error png_chunk_warning +# else +# define png_benign_error png_error +# define png_chunk_benign_error png_chunk_error +# endif #endif /* The png_set_ functions are for storing values in the png_info_struct. @@ -2143,258 +1668,268 @@ extern PNG_EXPORT(void,png_set_benign_errors) PNGARG((png_structp * png_info_struct. */ /* Returns "flag" if chunk data is valid in info_ptr. */ -extern PNG_EXPORT(png_uint_32,png_get_valid) PNGARG((png_structp png_ptr, -png_infop info_ptr, png_uint_32 flag)); +PNG_EXPORT(110, png_uint_32, png_get_valid, + (png_const_structp png_ptr, png_const_infop info_ptr, + png_uint_32 flag)); /* Returns number of bytes needed to hold a transformed row. */ -extern PNG_EXPORT(png_size_t,png_get_rowbytes) PNGARG((png_structp png_ptr, -png_infop info_ptr)); +PNG_EXPORT(111, png_size_t, png_get_rowbytes, (png_const_structp png_ptr, + png_const_infop info_ptr)); #ifdef PNG_INFO_IMAGE_SUPPORTED /* Returns row_pointers, which is an array of pointers to scanlines that was * returned from png_read_png(). */ -extern PNG_EXPORT(png_bytepp,png_get_rows) PNGARG((png_structp png_ptr, -png_infop info_ptr)); +PNG_EXPORT(112, png_bytepp, png_get_rows, + (png_const_structp png_ptr, png_const_infop info_ptr)); /* Set row_pointers, which is an array of pointers to scanlines for use * by png_write_png(). */ -extern PNG_EXPORT(void,png_set_rows) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_bytepp row_pointers)); +PNG_EXPORT(113, void, png_set_rows, (png_structp png_ptr, + png_infop info_ptr, png_bytepp row_pointers)); #endif /* Returns number of color channels in image. */ -extern PNG_EXPORT(png_byte,png_get_channels) PNGARG((png_structp png_ptr, -png_infop info_ptr)); +PNG_EXPORT(114, png_byte, png_get_channels, + (png_const_structp png_ptr, png_const_infop info_ptr)); #ifdef PNG_EASY_ACCESS_SUPPORTED /* Returns image width in pixels. */ -extern PNG_EXPORT(png_uint_32, png_get_image_width) PNGARG((png_structp -png_ptr, png_infop info_ptr)); +PNG_EXPORT(115, png_uint_32, png_get_image_width, (png_const_structp png_ptr, + png_const_infop info_ptr)); /* Returns image height in pixels. */ -extern PNG_EXPORT(png_uint_32, png_get_image_height) PNGARG((png_structp -png_ptr, png_infop info_ptr)); +PNG_EXPORT(116, png_uint_32, png_get_image_height, (png_const_structp png_ptr, + png_const_infop info_ptr)); /* Returns image bit_depth. */ -extern PNG_EXPORT(png_byte, png_get_bit_depth) PNGARG((png_structp -png_ptr, png_infop info_ptr)); +PNG_EXPORT(117, png_byte, png_get_bit_depth, + (png_const_structp png_ptr, png_const_infop info_ptr)); /* Returns image color_type. */ -extern PNG_EXPORT(png_byte, png_get_color_type) PNGARG((png_structp -png_ptr, png_infop info_ptr)); +PNG_EXPORT(118, png_byte, png_get_color_type, (png_const_structp png_ptr, + png_const_infop info_ptr)); /* Returns image filter_type. */ -extern PNG_EXPORT(png_byte, png_get_filter_type) PNGARG((png_structp -png_ptr, png_infop info_ptr)); +PNG_EXPORT(119, png_byte, png_get_filter_type, (png_const_structp png_ptr, + png_const_infop info_ptr)); /* Returns image interlace_type. */ -extern PNG_EXPORT(png_byte, png_get_interlace_type) PNGARG((png_structp -png_ptr, png_infop info_ptr)); +PNG_EXPORT(120, png_byte, png_get_interlace_type, (png_const_structp png_ptr, + png_const_infop info_ptr)); /* Returns image compression_type. */ -extern PNG_EXPORT(png_byte, png_get_compression_type) PNGARG((png_structp -png_ptr, png_infop info_ptr)); +PNG_EXPORT(121, png_byte, png_get_compression_type, (png_const_structp png_ptr, + png_const_infop info_ptr)); /* Returns image resolution in pixels per meter, from pHYs chunk data. */ -extern PNG_EXPORT(png_uint_32, png_get_pixels_per_meter) PNGARG((png_structp -png_ptr, png_infop info_ptr)); -extern PNG_EXPORT(png_uint_32, png_get_x_pixels_per_meter) PNGARG((png_structp -png_ptr, png_infop info_ptr)); -extern PNG_EXPORT(png_uint_32, png_get_y_pixels_per_meter) PNGARG((png_structp -png_ptr, png_infop info_ptr)); +PNG_EXPORT(122, png_uint_32, png_get_pixels_per_meter, + (png_const_structp png_ptr, png_const_infop info_ptr)); +PNG_EXPORT(123, png_uint_32, png_get_x_pixels_per_meter, + (png_const_structp png_ptr, png_const_infop info_ptr)); +PNG_EXPORT(124, png_uint_32, png_get_y_pixels_per_meter, + (png_const_structp png_ptr, png_const_infop info_ptr)); /* Returns pixel aspect ratio, computed from pHYs chunk data. */ -#ifdef PNG_FLOATING_POINT_SUPPORTED -extern PNG_EXPORT(float, png_get_pixel_aspect_ratio) PNGARG((png_structp -png_ptr, png_infop info_ptr)); -#endif +PNG_FP_EXPORT(125, float, png_get_pixel_aspect_ratio, + (png_const_structp png_ptr, png_const_infop info_ptr)); +PNG_FIXED_EXPORT(210, png_fixed_point, png_get_pixel_aspect_ratio_fixed, + (png_const_structp png_ptr, png_const_infop info_ptr)); /* Returns image x, y offset in pixels or microns, from oFFs chunk data. */ -extern PNG_EXPORT(png_int_32, png_get_x_offset_pixels) PNGARG((png_structp -png_ptr, png_infop info_ptr)); -extern PNG_EXPORT(png_int_32, png_get_y_offset_pixels) PNGARG((png_structp -png_ptr, png_infop info_ptr)); -extern PNG_EXPORT(png_int_32, png_get_x_offset_microns) PNGARG((png_structp -png_ptr, png_infop info_ptr)); -extern PNG_EXPORT(png_int_32, png_get_y_offset_microns) PNGARG((png_structp -png_ptr, png_infop info_ptr)); +PNG_EXPORT(126, png_int_32, png_get_x_offset_pixels, + (png_const_structp png_ptr, png_const_infop info_ptr)); +PNG_EXPORT(127, png_int_32, png_get_y_offset_pixels, + (png_const_structp png_ptr, png_const_infop info_ptr)); +PNG_EXPORT(128, png_int_32, png_get_x_offset_microns, + (png_const_structp png_ptr, png_const_infop info_ptr)); +PNG_EXPORT(129, png_int_32, png_get_y_offset_microns, + (png_const_structp png_ptr, png_const_infop info_ptr)); #endif /* PNG_EASY_ACCESS_SUPPORTED */ /* Returns pointer to signature string read from PNG header */ -extern PNG_EXPORT(png_bytep,png_get_signature) PNGARG((png_structp png_ptr, -png_infop info_ptr)); +PNG_EXPORT(130, png_const_bytep, png_get_signature, + (png_const_structp png_ptr, png_infop info_ptr)); #ifdef PNG_bKGD_SUPPORTED -extern PNG_EXPORT(png_uint_32,png_get_bKGD) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_color_16p *background)); +PNG_EXPORT(131, png_uint_32, png_get_bKGD, + (png_const_structp png_ptr, png_infop info_ptr, + png_color_16p *background)); #endif #ifdef PNG_bKGD_SUPPORTED -extern PNG_EXPORT(void,png_set_bKGD) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_color_16p background)); +PNG_EXPORT(132, void, png_set_bKGD, (png_structp png_ptr, png_infop info_ptr, + png_const_color_16p background)); #endif #ifdef PNG_cHRM_SUPPORTED -#ifdef PNG_FLOATING_POINT_SUPPORTED -extern PNG_EXPORT(png_uint_32,png_get_cHRM) PNGARG((png_structp png_ptr, - png_infop info_ptr, double *white_x, double *white_y, double *red_x, - double *red_y, double *green_x, double *green_y, double *blue_x, - double *blue_y)); -#endif -#ifdef PNG_FIXED_POINT_SUPPORTED -extern PNG_EXPORT(png_uint_32,png_get_cHRM_fixed) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_fixed_point *int_white_x, png_fixed_point - *int_white_y, png_fixed_point *int_red_x, png_fixed_point *int_red_y, - png_fixed_point *int_green_x, png_fixed_point *int_green_y, png_fixed_point - *int_blue_x, png_fixed_point *int_blue_y)); +PNG_FP_EXPORT(133, png_uint_32, png_get_cHRM, (png_const_structp png_ptr, + png_const_infop info_ptr, double *white_x, double *white_y, double *red_x, + double *red_y, double *green_x, double *green_y, double *blue_x, + double *blue_y)); +#ifdef PNG_FIXED_POINT_SUPPORTED /* Otherwise not implemented */ +PNG_FIXED_EXPORT(134, png_uint_32, png_get_cHRM_fixed, + (png_const_structp png_ptr, + png_const_infop info_ptr, png_fixed_point *int_white_x, + png_fixed_point *int_white_y, png_fixed_point *int_red_x, + png_fixed_point *int_red_y, png_fixed_point *int_green_x, + png_fixed_point *int_green_y, png_fixed_point *int_blue_x, + png_fixed_point *int_blue_y)); #endif #endif #ifdef PNG_cHRM_SUPPORTED -#ifdef PNG_FLOATING_POINT_SUPPORTED -extern PNG_EXPORT(void,png_set_cHRM) PNGARG((png_structp png_ptr, - png_infop info_ptr, double white_x, double white_y, double red_x, - double red_y, double green_x, double green_y, double blue_x, double blue_y)); -#endif -#ifdef PNG_FIXED_POINT_SUPPORTED -extern PNG_EXPORT(void,png_set_cHRM_fixed) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_fixed_point int_white_x, png_fixed_point int_white_y, - png_fixed_point int_red_x, png_fixed_point int_red_y, png_fixed_point - int_green_x, png_fixed_point int_green_y, png_fixed_point int_blue_x, - png_fixed_point int_blue_y)); -#endif +PNG_FP_EXPORT(135, void, png_set_cHRM, + (png_structp png_ptr, png_infop info_ptr, + double white_x, double white_y, double red_x, double red_y, double green_x, + double green_y, double blue_x, double blue_y)); +PNG_FIXED_EXPORT(136, void, png_set_cHRM_fixed, (png_structp png_ptr, + png_infop info_ptr, png_fixed_point int_white_x, + png_fixed_point int_white_y, png_fixed_point int_red_x, + png_fixed_point int_red_y, png_fixed_point int_green_x, + png_fixed_point int_green_y, png_fixed_point int_blue_x, + png_fixed_point int_blue_y)); #endif #ifdef PNG_gAMA_SUPPORTED -#ifdef PNG_FLOATING_POINT_SUPPORTED -extern PNG_EXPORT(png_uint_32,png_get_gAMA) PNGARG((png_structp png_ptr, - png_infop info_ptr, double *file_gamma)); -#endif -extern PNG_EXPORT(png_uint_32,png_get_gAMA_fixed) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_fixed_point *int_file_gamma)); +PNG_FP_EXPORT(137, png_uint_32, png_get_gAMA, + (png_const_structp png_ptr, png_const_infop info_ptr, + double *file_gamma)); +PNG_FIXED_EXPORT(138, png_uint_32, png_get_gAMA_fixed, + (png_const_structp png_ptr, png_const_infop info_ptr, + png_fixed_point *int_file_gamma)); #endif #ifdef PNG_gAMA_SUPPORTED -#ifdef PNG_FLOATING_POINT_SUPPORTED -extern PNG_EXPORT(void,png_set_gAMA) PNGARG((png_structp png_ptr, - png_infop info_ptr, double file_gamma)); -#endif -extern PNG_EXPORT(void,png_set_gAMA_fixed) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_fixed_point int_file_gamma)); +PNG_FP_EXPORT(139, void, png_set_gAMA, (png_structp png_ptr, + png_infop info_ptr, double file_gamma)); +PNG_FIXED_EXPORT(140, void, png_set_gAMA_fixed, (png_structp png_ptr, + png_infop info_ptr, png_fixed_point int_file_gamma)); #endif #ifdef PNG_hIST_SUPPORTED -extern PNG_EXPORT(png_uint_32,png_get_hIST) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_uint_16p *hist)); +PNG_EXPORT(141, png_uint_32, png_get_hIST, + (png_const_structp png_ptr, png_const_infop info_ptr, + png_uint_16p *hist)); #endif #ifdef PNG_hIST_SUPPORTED -extern PNG_EXPORT(void,png_set_hIST) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_uint_16p hist)); +PNG_EXPORT(142, void, png_set_hIST, (png_structp png_ptr, + png_infop info_ptr, png_const_uint_16p hist)); #endif -extern PNG_EXPORT(png_uint_32,png_get_IHDR) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_uint_32 *width, png_uint_32 *height, - int *bit_depth, int *color_type, int *interlace_method, - int *compression_method, int *filter_method)); +PNG_EXPORT(143, png_uint_32, png_get_IHDR, + (png_structp png_ptr, png_infop info_ptr, + png_uint_32 *width, png_uint_32 *height, int *bit_depth, int *color_type, + int *interlace_method, int *compression_method, int *filter_method)); -extern PNG_EXPORT(void,png_set_IHDR) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_uint_32 width, png_uint_32 height, int bit_depth, - int color_type, int interlace_method, int compression_method, - int filter_method)); +PNG_EXPORT(144, void, png_set_IHDR, + (png_structp png_ptr, png_infop info_ptr, + png_uint_32 width, png_uint_32 height, int bit_depth, int color_type, + int interlace_method, int compression_method, int filter_method)); #ifdef PNG_oFFs_SUPPORTED -extern PNG_EXPORT(png_uint_32,png_get_oFFs) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_int_32 *offset_x, png_int_32 *offset_y, - int *unit_type)); +PNG_EXPORT(145, png_uint_32, png_get_oFFs, + (png_const_structp png_ptr, png_const_infop info_ptr, + png_int_32 *offset_x, png_int_32 *offset_y, int *unit_type)); #endif #ifdef PNG_oFFs_SUPPORTED -extern PNG_EXPORT(void,png_set_oFFs) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_int_32 offset_x, png_int_32 offset_y, - int unit_type)); +PNG_EXPORT(146, void, png_set_oFFs, + (png_structp png_ptr, png_infop info_ptr, + png_int_32 offset_x, png_int_32 offset_y, int unit_type)); #endif #ifdef PNG_pCAL_SUPPORTED -extern PNG_EXPORT(png_uint_32,png_get_pCAL) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_charp *purpose, png_int_32 *X0, png_int_32 *X1, - int *type, int *nparams, png_charp *units, png_charpp *params)); +PNG_EXPORT(147, png_uint_32, png_get_pCAL, + (png_const_structp png_ptr, png_const_infop info_ptr, + png_charp *purpose, png_int_32 *X0, png_int_32 *X1, int *type, + int *nparams, + png_charp *units, png_charpp *params)); #endif #ifdef PNG_pCAL_SUPPORTED -extern PNG_EXPORT(void,png_set_pCAL) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_charp purpose, png_int_32 X0, png_int_32 X1, - int type, int nparams, png_charp units, png_charpp params)); +PNG_EXPORT(148, void, png_set_pCAL, (png_structp png_ptr, + png_infop info_ptr, + png_const_charp purpose, png_int_32 X0, png_int_32 X1, int type, + int nparams, png_const_charp units, png_charpp params)); #endif #ifdef PNG_pHYs_SUPPORTED -extern PNG_EXPORT(png_uint_32,png_get_pHYs) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_uint_32 *res_x, png_uint_32 *res_y, int *unit_type)); +PNG_EXPORT(149, png_uint_32, png_get_pHYs, + (png_const_structp png_ptr, png_const_infop info_ptr, + png_uint_32 *res_x, png_uint_32 *res_y, int *unit_type)); #endif #ifdef PNG_pHYs_SUPPORTED -extern PNG_EXPORT(void,png_set_pHYs) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_uint_32 res_x, png_uint_32 res_y, int unit_type)); +PNG_EXPORT(150, void, png_set_pHYs, + (png_structp png_ptr, png_infop info_ptr, + png_uint_32 res_x, png_uint_32 res_y, int unit_type)); #endif -extern PNG_EXPORT(png_uint_32,png_get_PLTE) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_colorp *palette, int *num_palette)); +PNG_EXPORT(151, png_uint_32, png_get_PLTE, + (png_const_structp png_ptr, png_const_infop info_ptr, + png_colorp *palette, int *num_palette)); -extern PNG_EXPORT(void,png_set_PLTE) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_colorp palette, int num_palette)); +PNG_EXPORT(152, void, png_set_PLTE, + (png_structp png_ptr, png_infop info_ptr, + png_const_colorp palette, int num_palette)); #ifdef PNG_sBIT_SUPPORTED -extern PNG_EXPORT(png_uint_32,png_get_sBIT) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_color_8p *sig_bit)); +PNG_EXPORT(153, png_uint_32, png_get_sBIT, + (png_const_structp png_ptr, png_infop info_ptr, + png_color_8p *sig_bit)); #endif #ifdef PNG_sBIT_SUPPORTED -extern PNG_EXPORT(void,png_set_sBIT) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_color_8p sig_bit)); +PNG_EXPORT(154, void, png_set_sBIT, + (png_structp png_ptr, png_infop info_ptr, png_const_color_8p sig_bit)); #endif #ifdef PNG_sRGB_SUPPORTED -extern PNG_EXPORT(png_uint_32,png_get_sRGB) PNGARG((png_structp png_ptr, - png_infop info_ptr, int *intent)); +PNG_EXPORT(155, png_uint_32, png_get_sRGB, (png_const_structp png_ptr, + png_const_infop info_ptr, int *file_srgb_intent)); #endif #ifdef PNG_sRGB_SUPPORTED -extern PNG_EXPORT(void,png_set_sRGB) PNGARG((png_structp png_ptr, - png_infop info_ptr, int intent)); -extern PNG_EXPORT(void,png_set_sRGB_gAMA_and_cHRM) PNGARG((png_structp png_ptr, - png_infop info_ptr, int intent)); +PNG_EXPORT(156, void, png_set_sRGB, + (png_structp png_ptr, png_infop info_ptr, int srgb_intent)); +PNG_EXPORT(157, void, png_set_sRGB_gAMA_and_cHRM, (png_structp png_ptr, + png_infop info_ptr, int srgb_intent)); #endif #ifdef PNG_iCCP_SUPPORTED -extern PNG_EXPORT(png_uint_32,png_get_iCCP) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_charpp name, int *compression_type, - png_charpp profile, png_uint_32 *proflen)); - /* Note to maintainer: profile should be png_bytepp */ +PNG_EXPORT(158, png_uint_32, png_get_iCCP, + (png_const_structp png_ptr, png_const_infop info_ptr, + png_charpp name, int *compression_type, png_bytepp profile, + png_uint_32 *proflen)); #endif #ifdef PNG_iCCP_SUPPORTED -extern PNG_EXPORT(void,png_set_iCCP) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_charp name, int compression_type, - png_charp profile, png_uint_32 proflen)); - /* Note to maintainer: profile should be png_bytep */ +PNG_EXPORT(159, void, png_set_iCCP, + (png_structp png_ptr, png_infop info_ptr, + png_const_charp name, int compression_type, png_const_bytep profile, + png_uint_32 proflen)); #endif #ifdef PNG_sPLT_SUPPORTED -extern PNG_EXPORT(png_uint_32,png_get_sPLT) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_sPLT_tpp entries)); +PNG_EXPORT(160, png_uint_32, png_get_sPLT, + (png_const_structp png_ptr, png_const_infop info_ptr, + png_sPLT_tpp entries)); #endif #ifdef PNG_sPLT_SUPPORTED -extern PNG_EXPORT(void,png_set_sPLT) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_sPLT_tp entries, int nentries)); +PNG_EXPORT(161, void, png_set_sPLT, + (png_structp png_ptr, png_infop info_ptr, + png_const_sPLT_tp entries, int nentries)); #endif #ifdef PNG_TEXT_SUPPORTED /* png_get_text also returns the number of text chunks in *num_text */ -extern PNG_EXPORT(png_uint_32,png_get_text) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_textp *text_ptr, int *num_text)); +PNG_EXPORT(162, png_uint_32, png_get_text, + (png_const_structp png_ptr, png_const_infop info_ptr, + png_textp *text_ptr, int *num_text)); #endif /* Note while png_set_text() will accept a structure whose text, @@ -2405,59 +1940,64 @@ extern PNG_EXPORT(png_uint_32,png_get_text) PNGARG((png_structp png_ptr, */ #ifdef PNG_TEXT_SUPPORTED -extern PNG_EXPORT(void,png_set_text) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_textp text_ptr, int num_text)); +PNG_EXPORT(163, void, png_set_text, + (png_structp png_ptr, png_infop info_ptr, + png_const_textp text_ptr, int num_text)); #endif #ifdef PNG_tIME_SUPPORTED -extern PNG_EXPORT(png_uint_32,png_get_tIME) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_timep *mod_time)); +PNG_EXPORT(164, png_uint_32, png_get_tIME, + (png_const_structp png_ptr, png_infop info_ptr, png_timep *mod_time)); #endif #ifdef PNG_tIME_SUPPORTED -extern PNG_EXPORT(void,png_set_tIME) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_timep mod_time)); +PNG_EXPORT(165, void, png_set_tIME, + (png_structp png_ptr, png_infop info_ptr, png_const_timep mod_time)); #endif #ifdef PNG_tRNS_SUPPORTED -extern PNG_EXPORT(png_uint_32,png_get_tRNS) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_bytep *trans_alpha, int *num_trans, - png_color_16p *trans_color)); -#endif - -#ifdef PNG_tRNS_SUPPORTED -extern PNG_EXPORT(void,png_set_tRNS) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_bytep trans_alpha, int num_trans, - png_color_16p trans_color)); +PNG_EXPORT(166, png_uint_32, png_get_tRNS, + (png_const_structp png_ptr, png_infop info_ptr, + png_bytep *trans_alpha, int *num_trans, png_color_16p *trans_color)); #endif #ifdef PNG_tRNS_SUPPORTED +PNG_EXPORT(167, void, png_set_tRNS, + (png_structp png_ptr, png_infop info_ptr, + png_const_bytep trans_alpha, int num_trans, + png_const_color_16p trans_color)); #endif #ifdef PNG_sCAL_SUPPORTED -#ifdef PNG_FLOATING_POINT_SUPPORTED -extern PNG_EXPORT(png_uint_32,png_get_sCAL) PNGARG((png_structp png_ptr, - png_infop info_ptr, int *unit, double *width, double *height)); -#else -#ifdef PNG_FIXED_POINT_SUPPORTED -extern PNG_EXPORT(png_uint_32,png_get_sCAL_s) PNGARG((png_structp png_ptr, - png_infop info_ptr, int *unit, png_charpp swidth, png_charpp sheight)); -#endif +PNG_FP_EXPORT(168, png_uint_32, png_get_sCAL, + (png_const_structp png_ptr, png_const_infop info_ptr, + int *unit, double *width, double *height)); +#ifdef PNG_FLOATING_ARITHMETIC_SUPPORTED +/* NOTE: this API is currently implemented using floating point arithmetic, + * consequently it can only be used on systems with floating point support. + * In any case the range of values supported by png_fixed_point is small and it + * is highly recommended that png_get_sCAL_s be used instead. + */ +PNG_FIXED_EXPORT(214, png_uint_32, png_get_sCAL_fixed, + (png_structp png_ptr, png_const_infop info_ptr, int *unit, + png_fixed_point *width, + png_fixed_point *height)); #endif +PNG_EXPORT(169, png_uint_32, png_get_sCAL_s, + (png_const_structp png_ptr, png_const_infop info_ptr, + int *unit, png_charpp swidth, png_charpp sheight)); + +PNG_FP_EXPORT(170, void, png_set_sCAL, + (png_structp png_ptr, png_infop info_ptr, + int unit, double width, double height)); +PNG_FIXED_EXPORT(213, void, png_set_sCAL_fixed, (png_structp png_ptr, + png_infop info_ptr, int unit, png_fixed_point width, + png_fixed_point height)); +PNG_EXPORT(171, void, png_set_sCAL_s, + (png_structp png_ptr, png_infop info_ptr, + int unit, png_const_charp swidth, png_const_charp sheight)); #endif /* PNG_sCAL_SUPPORTED */ -#ifdef PNG_sCAL_SUPPORTED -#ifdef PNG_FLOATING_POINT_SUPPORTED -extern PNG_EXPORT(void,png_set_sCAL) PNGARG((png_structp png_ptr, - png_infop info_ptr, int unit, double width, double height)); -#else -#ifdef PNG_FIXED_POINT_SUPPORTED -extern PNG_EXPORT(void,png_set_sCAL_s) PNGARG((png_structp png_ptr, - png_infop info_ptr, int unit, png_charp swidth, png_charp sheight)); -#endif -#endif -#endif /* PNG_sCAL_SUPPORTED || PNG_WRITE_sCAL_SUPPORTED */ - #ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED /* Provide a list of chunks and how they are to be handled, if the built-in handling or default unknown chunk handling is not desired. Any chunks not @@ -2468,48 +2008,49 @@ extern PNG_EXPORT(void,png_set_sCAL_s) PNGARG((png_structp png_ptr, = 2: keep only if safe-to-copy = 3: keep even if unsafe-to-copy */ -extern PNG_EXPORT(void, png_set_keep_unknown_chunks) PNGARG((png_structp - png_ptr, int keep, png_bytep chunk_list, int num_chunks)); -PNG_EXPORT(int,png_handle_as_unknown) PNGARG((png_structp png_ptr, png_bytep - chunk_name)); +PNG_EXPORT(172, void, png_set_keep_unknown_chunks, + (png_structp png_ptr, int keep, + png_const_bytep chunk_list, int num_chunks)); +PNG_EXPORT(173, int, png_handle_as_unknown, (png_structp png_ptr, + png_const_bytep chunk_name)); #endif #ifdef PNG_UNKNOWN_CHUNKS_SUPPORTED -extern PNG_EXPORT(void, png_set_unknown_chunks) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_unknown_chunkp unknowns, int num_unknowns)); -extern PNG_EXPORT(void, png_set_unknown_chunk_location) - PNGARG((png_structp png_ptr, png_infop info_ptr, int chunk, int location)); -extern PNG_EXPORT(png_uint_32,png_get_unknown_chunks) PNGARG((png_structp - png_ptr, png_infop info_ptr, png_unknown_chunkpp entries)); +PNG_EXPORT(174, void, png_set_unknown_chunks, (png_structp png_ptr, + png_infop info_ptr, png_const_unknown_chunkp unknowns, + int num_unknowns)); +PNG_EXPORT(175, void, png_set_unknown_chunk_location, + (png_structp png_ptr, png_infop info_ptr, int chunk, int location)); +PNG_EXPORT(176, int, png_get_unknown_chunks, (png_const_structp png_ptr, + png_const_infop info_ptr, png_unknown_chunkpp entries)); #endif /* Png_free_data() will turn off the "valid" flag for anything it frees. * If you need to turn it off for a chunk that your application has freed, * you can use png_set_invalid(png_ptr, info_ptr, PNG_INFO_CHNK); */ -extern PNG_EXPORT(void, png_set_invalid) PNGARG((png_structp png_ptr, - png_infop info_ptr, int mask)); +PNG_EXPORT(177, void, png_set_invalid, + (png_structp png_ptr, png_infop info_ptr, int mask)); #ifdef PNG_INFO_IMAGE_SUPPORTED /* The "params" pointer is currently not used and is for future expansion. */ -extern PNG_EXPORT(void, png_read_png) PNGARG((png_structp png_ptr, - png_infop info_ptr, - int transforms, - png_voidp params)); -extern PNG_EXPORT(void, png_write_png) PNGARG((png_structp png_ptr, - png_infop info_ptr, - int transforms, - png_voidp params)); +PNG_EXPORT(178, void, png_read_png, (png_structp png_ptr, png_infop info_ptr, + int transforms, png_voidp params)); +PNG_EXPORT(179, void, png_write_png, (png_structp png_ptr, png_infop info_ptr, + int transforms, png_voidp params)); #endif -extern PNG_EXPORT(png_charp,png_get_copyright) PNGARG((png_structp png_ptr)); -extern PNG_EXPORT(png_charp,png_get_header_ver) PNGARG((png_structp png_ptr)); -extern PNG_EXPORT(png_charp,png_get_header_version) PNGARG((png_structp - png_ptr)); -extern PNG_EXPORT(png_charp,png_get_libpng_ver) PNGARG((png_structp png_ptr)); +PNG_EXPORT(180, png_const_charp, png_get_copyright, + (png_const_structp png_ptr)); +PNG_EXPORT(181, png_const_charp, png_get_header_ver, + (png_const_structp png_ptr)); +PNG_EXPORT(182, png_const_charp, png_get_header_version, + (png_const_structp png_ptr)); +PNG_EXPORT(183, png_const_charp, png_get_libpng_ver, + (png_const_structp png_ptr)); #ifdef PNG_MNG_FEATURES_SUPPORTED -extern PNG_EXPORT(png_uint_32,png_permit_mng_features) PNGARG((png_structp - png_ptr, png_uint_32 mng_features_permitted)); +PNG_EXPORT(184, png_uint_32, png_permit_mng_features, (png_structp png_ptr, + png_uint_32 mng_features_permitted)); #endif /* For use in png_set_keep_unknown, added to version 1.2.6 */ @@ -2522,74 +2063,136 @@ extern PNG_EXPORT(png_uint_32,png_permit_mng_features) PNGARG((png_structp * messages before passing them to the error or warning handler. */ #ifdef PNG_ERROR_NUMBERS_SUPPORTED -extern PNG_EXPORT(void,png_set_strip_error_numbers) PNGARG((png_structp - png_ptr, png_uint_32 strip_mode)); +PNG_EXPORT(185, void, png_set_strip_error_numbers, + (png_structp png_ptr, + png_uint_32 strip_mode)); #endif /* Added in libpng-1.2.6 */ #ifdef PNG_SET_USER_LIMITS_SUPPORTED -extern PNG_EXPORT(void,png_set_user_limits) PNGARG((png_structp - png_ptr, png_uint_32 user_width_max, png_uint_32 user_height_max)); -extern PNG_EXPORT(png_uint_32,png_get_user_width_max) PNGARG((png_structp - png_ptr)); -extern PNG_EXPORT(png_uint_32,png_get_user_height_max) PNGARG((png_structp - png_ptr)); +PNG_EXPORT(186, void, png_set_user_limits, (png_structp png_ptr, + png_uint_32 user_width_max, png_uint_32 user_height_max)); +PNG_EXPORT(187, png_uint_32, png_get_user_width_max, + (png_const_structp png_ptr)); +PNG_EXPORT(188, png_uint_32, png_get_user_height_max, + (png_const_structp png_ptr)); /* Added in libpng-1.4.0 */ -extern PNG_EXPORT(void,png_set_chunk_cache_max) PNGARG((png_structp - png_ptr, png_uint_32 user_chunk_cache_max)); -extern PNG_EXPORT(png_uint_32,png_get_chunk_cache_max) - PNGARG((png_structp png_ptr)); +PNG_EXPORT(189, void, png_set_chunk_cache_max, (png_structp png_ptr, + png_uint_32 user_chunk_cache_max)); +PNG_EXPORT(190, png_uint_32, png_get_chunk_cache_max, + (png_const_structp png_ptr)); /* Added in libpng-1.4.1 */ -extern PNG_EXPORT(void,png_set_chunk_malloc_max) PNGARG((png_structp - png_ptr, png_alloc_size_t user_chunk_cache_max)); -extern PNG_EXPORT(png_alloc_size_t,png_get_chunk_malloc_max) - PNGARG((png_structp png_ptr)); +PNG_EXPORT(191, void, png_set_chunk_malloc_max, (png_structp png_ptr, + png_alloc_size_t user_chunk_cache_max)); +PNG_EXPORT(192, png_alloc_size_t, png_get_chunk_malloc_max, + (png_const_structp png_ptr)); #endif -#if defined(PNG_INCH_CONVERSIONS) && defined(PNG_FLOATING_POINT_SUPPORTED) -PNG_EXPORT(png_uint_32,png_get_pixels_per_inch) PNGARG((png_structp png_ptr, -png_infop info_ptr)); +#if defined(PNG_INCH_CONVERSIONS_SUPPORTED) +PNG_EXPORT(193, png_uint_32, png_get_pixels_per_inch, + (png_const_structp png_ptr, png_const_infop info_ptr)); -PNG_EXPORT(png_uint_32,png_get_x_pixels_per_inch) PNGARG((png_structp png_ptr, -png_infop info_ptr)); +PNG_EXPORT(194, png_uint_32, png_get_x_pixels_per_inch, + (png_const_structp png_ptr, png_const_infop info_ptr)); -PNG_EXPORT(png_uint_32,png_get_y_pixels_per_inch) PNGARG((png_structp png_ptr, -png_infop info_ptr)); +PNG_EXPORT(195, png_uint_32, png_get_y_pixels_per_inch, + (png_const_structp png_ptr, png_const_infop info_ptr)); -PNG_EXPORT(float,png_get_x_offset_inches) PNGARG((png_structp png_ptr, -png_infop info_ptr)); +PNG_FP_EXPORT(196, float, png_get_x_offset_inches, + (png_const_structp png_ptr, png_const_infop info_ptr)); +#ifdef PNG_FIXED_POINT_SUPPORTED /* otherwise not implemented. */ +PNG_FIXED_EXPORT(211, png_fixed_point, png_get_x_offset_inches_fixed, + (png_structp png_ptr, png_const_infop info_ptr)); +#endif -PNG_EXPORT(float,png_get_y_offset_inches) PNGARG((png_structp png_ptr, -png_infop info_ptr)); +PNG_FP_EXPORT(197, float, png_get_y_offset_inches, (png_const_structp png_ptr, + png_const_infop info_ptr)); +#ifdef PNG_FIXED_POINT_SUPPORTED /* otherwise not implemented. */ +PNG_FIXED_EXPORT(212, png_fixed_point, png_get_y_offset_inches_fixed, + (png_structp png_ptr, png_const_infop info_ptr)); +#endif -#ifdef PNG_pHYs_SUPPORTED -PNG_EXPORT(png_uint_32,png_get_pHYs_dpi) PNGARG((png_structp png_ptr, -png_infop info_ptr, png_uint_32 *res_x, png_uint_32 *res_y, int *unit_type)); -#endif /* PNG_pHYs_SUPPORTED */ -#endif /* PNG_INCH_CONVERSIONS && PNG_FLOATING_POINT_SUPPORTED */ +# ifdef PNG_pHYs_SUPPORTED +PNG_EXPORT(198, png_uint_32, png_get_pHYs_dpi, (png_const_structp png_ptr, + png_const_infop info_ptr, png_uint_32 *res_x, png_uint_32 *res_y, + int *unit_type)); +# endif /* PNG_pHYs_SUPPORTED */ +#endif /* PNG_INCH_CONVERSIONS_SUPPORTED */ /* Added in libpng-1.4.0 */ #ifdef PNG_IO_STATE_SUPPORTED -extern PNG_EXPORT(png_uint_32,png_get_io_state) PNGARG((png_structp png_ptr)); +PNG_EXPORT(199, png_uint_32, png_get_io_state, (png_structp png_ptr)); -extern PNG_EXPORT(png_bytep,png_get_io_chunk_name) - PNGARG((png_structp png_ptr)); +PNG_EXPORTA(200, png_const_bytep, png_get_io_chunk_name, + (png_structp png_ptr), PNG_DEPRECATED); +PNG_EXPORT(216, png_uint_32, png_get_io_chunk_type, + (png_const_structp png_ptr)); /* The flags returned by png_get_io_state() are the following: */ -#define PNG_IO_NONE 0x0000 /* no I/O at this moment */ -#define PNG_IO_READING 0x0001 /* currently reading */ -#define PNG_IO_WRITING 0x0002 /* currently writing */ -#define PNG_IO_SIGNATURE 0x0010 /* currently at the file signature */ -#define PNG_IO_CHUNK_HDR 0x0020 /* currently at the chunk header */ -#define PNG_IO_CHUNK_DATA 0x0040 /* currently at the chunk data */ -#define PNG_IO_CHUNK_CRC 0x0080 /* currently at the chunk crc */ -#define PNG_IO_MASK_OP 0x000f /* current operation: reading/writing */ -#define PNG_IO_MASK_LOC 0x00f0 /* current location: sig/hdr/data/crc */ +# define PNG_IO_NONE 0x0000 /* no I/O at this moment */ +# define PNG_IO_READING 0x0001 /* currently reading */ +# define PNG_IO_WRITING 0x0002 /* currently writing */ +# define PNG_IO_SIGNATURE 0x0010 /* currently at the file signature */ +# define PNG_IO_CHUNK_HDR 0x0020 /* currently at the chunk header */ +# define PNG_IO_CHUNK_DATA 0x0040 /* currently at the chunk data */ +# define PNG_IO_CHUNK_CRC 0x0080 /* currently at the chunk crc */ +# define PNG_IO_MASK_OP 0x000f /* current operation: reading/writing */ +# define PNG_IO_MASK_LOC 0x00f0 /* current location: sig/hdr/data/crc */ #endif /* ?PNG_IO_STATE_SUPPORTED */ -/* Maintainer: Put new public prototypes here ^, in libpng.3, and project - * defs +/* Interlace support. The following macros are always defined so that if + * libpng interlace handling is turned off the macros may be used to handle + * interlaced images within the application. */ +#define PNG_INTERLACE_ADAM7_PASSES 7 + +/* Two macros to return the first row and first column of the original, + * full, image which appears in a given pass. 'pass' is in the range 0 + * to 6 and the result is in the range 0 to 7. + */ +#define PNG_PASS_START_ROW(pass) (((1U&~(pass))<<(3-((pass)>>1)))&7) +#define PNG_PASS_START_COL(pass) (((1U& (pass))<<(3-(((pass)+1)>>1)))&7) + +/* Two macros to help evaluate the number of rows or columns in each + * pass. This is expressed as a shift - effectively log2 of the number or + * rows or columns in each 8x8 tile of the original image. + */ +#define PNG_PASS_ROW_SHIFT(pass) ((pass)>2?(8-(pass))>>1:3) +#define PNG_PASS_COL_SHIFT(pass) ((pass)>1?(7-(pass))>>1:3) + +/* Hence two macros to determine the number of rows or columns in a given + * pass of an image given its height or width. In fact these macros may + * return non-zero even though the sub-image is empty, because the other + * dimension may be empty for a small image. + */ +#define PNG_PASS_ROWS(height, pass) (((height)+(((1<>PNG_PASS_ROW_SHIFT(pass)) +#define PNG_PASS_COLS(width, pass) (((width)+(((1<>PNG_PASS_COL_SHIFT(pass)) + +/* For the reader row callbacks (both progressive and sequential) it is + * necessary to find the row in the output image given a row in an interlaced + * image, so two more macros: + */ +#define PNG_ROW_FROM_PASS_ROW(yIn, pass) \ + (((yIn)<>(((7-(off))-(pass))<<2)) & 0xFU) | \ + ((0x01145AF0U>>(((7-(off))-(pass))<<2)) & 0xF0U)) + +#define PNG_ROW_IN_INTERLACE_PASS(y, pass) \ + ((PNG_PASS_MASK(pass,0) >> ((y)&7)) & 1) +#define PNG_COL_IN_INTERLACE_PASS(x, pass) \ + ((PNG_PASS_MASK(pass,1) >> ((x)&7)) & 1) #ifdef PNG_READ_COMPOSITE_NODIV_SUPPORTED /* With these routines we avoid an integer divide, which will be slower on @@ -2604,7 +2207,7 @@ extern PNG_EXPORT(png_bytep,png_get_io_chunk_name) * [Optimized code by Greg Roelofs and Mark Adler...blame us for bugs. :-) ] */ - /* fg and bg should be in `gamma 1.0' space; alpha is the opacity */ + /* fg and bg should be in `gamma 1.0' space; alpha is the opacity */ # define png_composite(composite, fg, alpha, bg) \ { png_uint_16 temp = (png_uint_16)((png_uint_16)(fg) \ @@ -2622,75 +2225,80 @@ extern PNG_EXPORT(png_bytep,png_get_io_chunk_name) #else /* Standard method using integer division */ -# define png_composite(composite, fg, alpha, bg) \ - (composite) = (png_byte)(((png_uint_16)(fg) * (png_uint_16)(alpha) + \ - (png_uint_16)(bg) * (png_uint_16)(255 - (png_uint_16)(alpha)) + \ - (png_uint_16)127) / 255) +# define png_composite(composite, fg, alpha, bg) \ + (composite) = (png_byte)(((png_uint_16)(fg) * (png_uint_16)(alpha) + \ + (png_uint_16)(bg) * (png_uint_16)(255 - (png_uint_16)(alpha)) + \ + (png_uint_16)127) / 255) # define png_composite_16(composite, fg, alpha, bg) \ (composite) = (png_uint_16)(((png_uint_32)(fg) * (png_uint_32)(alpha) + \ - (png_uint_32)(bg)*(png_uint_32)(65535L - (png_uint_32)(alpha)) + \ - (png_uint_32)32767) / (png_uint_32)65535L) + (png_uint_32)(bg)*(png_uint_32)(65535L - (png_uint_32)(alpha)) + \ + (png_uint_32)32767) / (png_uint_32)65535L) #endif /* PNG_READ_COMPOSITE_NODIV_SUPPORTED */ +#ifdef PNG_READ_INT_FUNCTIONS_SUPPORTED +PNG_EXPORT(201, png_uint_32, png_get_uint_32, (png_const_bytep buf)); +PNG_EXPORT(202, png_uint_16, png_get_uint_16, (png_const_bytep buf)); +PNG_EXPORT(203, png_int_32, png_get_int_32, (png_const_bytep buf)); +#endif + +PNG_EXPORT(204, png_uint_32, png_get_uint_31, (png_structp png_ptr, + png_const_bytep buf)); +/* No png_get_int_16 -- may be added if there's a real need for it. */ + +/* Place a 32-bit number into a buffer in PNG byte order (big-endian). */ +#ifdef PNG_WRITE_INT_FUNCTIONS_SUPPORTED +PNG_EXPORT(205, void, png_save_uint_32, (png_bytep buf, png_uint_32 i)); +#endif +#ifdef PNG_SAVE_INT_32_SUPPORTED +PNG_EXPORT(206, void, png_save_int_32, (png_bytep buf, png_int_32 i)); +#endif + +/* Place a 16-bit number into a buffer in PNG byte order. + * The parameter is declared unsigned int, not png_uint_16, + * just to avoid potential problems on pre-ANSI C compilers. + */ +#ifdef PNG_WRITE_INT_FUNCTIONS_SUPPORTED +PNG_EXPORT(207, void, png_save_uint_16, (png_bytep buf, unsigned int i)); +/* No png_save_int_16 -- may be added if there's a real need for it. */ +#endif + #ifdef PNG_USE_READ_MACROS /* Inline macros to do direct reads of bytes from the input buffer. * The png_get_int_32() routine assumes we are using two's complement * format for negative values, which is almost certainly true. */ -/* We could make special-case BIG_ENDIAN macros that do direct reads here */ # define png_get_uint_32(buf) \ (((png_uint_32)(*(buf)) << 24) + \ ((png_uint_32)(*((buf) + 1)) << 16) + \ ((png_uint_32)(*((buf) + 2)) << 8) + \ ((png_uint_32)(*((buf) + 3)))) + + /* From libpng-1.4.0 until 1.4.4, the png_get_uint_16 macro (but not the + * function) incorrectly returned a value of type png_uint_32. + */ # define png_get_uint_16(buf) \ - (((png_uint_32)(*(buf)) << 8) + \ - ((png_uint_32)(*((buf) + 1)))) -#ifdef PNG_GET_INT_32_SUPPORTED + ((png_uint_16) \ + (((unsigned int)(*(buf)) << 8) + \ + ((unsigned int)(*((buf) + 1))))) + # define png_get_int_32(buf) \ - (((png_int_32)(*(buf)) << 24) + \ - ((png_int_32)(*((buf) + 1)) << 16) + \ - ((png_int_32)(*((buf) + 2)) << 8) + \ - ((png_int_32)(*((buf) + 3)))) + ((png_int_32)((*(buf) & 0x80) \ + ? -((png_int_32)((png_get_uint_32(buf) ^ 0xffffffffL) + 1)) \ + : (png_int_32)png_get_uint_32(buf))) #endif -#else -extern PNG_EXPORT(png_uint_32,png_get_uint_32) PNGARG((png_bytep buf)); -extern PNG_EXPORT(png_uint_16,png_get_uint_16) PNGARG((png_bytep buf)); -#ifdef PNG_GET_INT_32_SUPPORTED -extern PNG_EXPORT(png_int_32,png_get_int_32) PNGARG((png_bytep buf)); -#endif -#endif -extern PNG_EXPORT(png_uint_32,png_get_uint_31) - PNGARG((png_structp png_ptr, png_bytep buf)); -/* No png_get_int_16 -- may be added if there's a real need for it. */ -/* Place a 32-bit number into a buffer in PNG byte order (big-endian). */ -extern PNG_EXPORT(void,png_save_uint_32) - PNGARG((png_bytep buf, png_uint_32 i)); -extern PNG_EXPORT(void,png_save_int_32) - PNGARG((png_bytep buf, png_int_32 i)); - -/* Place a 16-bit number into a buffer in PNG byte order. - * The parameter is declared unsigned int, not png_uint_16, - * just to avoid potential problems on pre-ANSI C compilers. +/* Maintainer: Put new public prototypes here ^, in libpng.3, and project + * defs */ -extern PNG_EXPORT(void,png_save_uint_16) - PNGARG((png_bytep buf, unsigned int i)); -/* No png_save_int_16 -- may be added if there's a real need for it. */ -/* ************************************************************************* */ - -/* Various modes of operation. Note that after an init, mode is set to - * zero automatically when the structure is created. +/* The last ordinal number (this is the *last* one already used; the next + * one to use is one more than this.) Maintainer, remember to add an entry to + * scripts/symbols.def as well. */ -#define PNG_HAVE_IHDR 0x01 -#define PNG_HAVE_PLTE 0x02 -#define PNG_HAVE_IDAT 0x04 -#define PNG_AFTER_IDAT 0x08 /* Have complete zlib datastream */ -#define PNG_HAVE_IEND 0x10 -#define PNG_HAVE_gAMA 0x20 -#define PNG_HAVE_cHRM 0x40 +#ifdef PNG_EXPORT_LAST_ORDINAL + PNG_EXPORT_LAST_ORDINAL(221); +#endif #ifdef __cplusplus } diff --git a/reactos/include/reactos/libs/libpng/pngconf.h b/reactos/include/reactos/libs/libpng/pngconf.h index 0c1065cfb47..c82fa5866c1 100644 --- a/reactos/include/reactos/libs/libpng/pngconf.h +++ b/reactos/include/reactos/libs/libpng/pngconf.h @@ -1,9 +1,9 @@ /* pngconf.h - machine configurable file for libpng * - * libpng version 1.4.3 - June 26, 2010 - * For conditions of distribution and use, see copyright notice in png.h - * Copyright (c) 1998-2010 Glenn Randers-Pehrson + * libpng version 1.5.2 - March 31, 2011 + * + * Copyright (c) 1998-2011 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * @@ -22,282 +22,57 @@ #ifndef PNGCONF_H #define PNGCONF_H -#ifndef PNG_NO_LIMITS_H -# include -#endif - -/* Added at libpng-1.2.9 */ - -/* config.h is created by and PNG_CONFIGURE_LIBPNG is set by the "configure" - * script. +#ifndef PNG_BUILDING_SYMBOL_TABLE +/* PNG_NO_LIMITS_H may be used to turn off the use of the standard C + * definition file for machine specific limits, this may impact the + * correctness of the definitons below (see uses of INT_MAX). */ -#ifdef PNG_CONFIGURE_LIBPNG -# ifdef HAVE_CONFIG_H -# include "config.h" -# endif -#endif - -/* - * Added at libpng-1.2.8 - * - * PNG_USER_CONFIG has to be defined on the compiler command line. This - * includes the resource compiler for Windows DLL configurations. - */ -#ifdef PNG_USER_CONFIG -# ifndef PNG_USER_PRIVATEBUILD -# define PNG_USER_PRIVATEBUILD -# endif -# include "pngusr.h" -#endif - -/* - * If you create a private DLL you need to define in "pngusr.h" the followings: - * #define PNG_USER_PRIVATEBUILD - * e.g. #define PNG_USER_PRIVATEBUILD "Build by MyCompany for xyz reasons." - * #define PNG_USER_DLLFNAME_POSTFIX - * e.g. // private DLL "libpng13gx.dll" - * #define PNG_USER_DLLFNAME_POSTFIX "gx" - * - * The following macros are also at your disposal if you want to complete the - * DLL VERSIONINFO structure. - * - PNG_USER_VERSIONINFO_COMMENTS - * - PNG_USER_VERSIONINFO_COMPANYNAME - * - PNG_USER_VERSIONINFO_LEGALTRADEMARKS - */ - -#ifdef __STDC__ -# ifdef SPECIALBUILD -# pragma message("PNG_LIBPNG_SPECIALBUILD (and deprecated SPECIALBUILD)\ - are now LIBPNG reserved macros. Use PNG_USER_PRIVATEBUILD instead.") +# ifndef PNG_NO_LIMITS_H +# include # endif -# ifdef PRIVATEBUILD -# pragma message("PRIVATEBUILD is deprecated.\ - Use PNG_USER_PRIVATEBUILD instead.") -# define PNG_USER_PRIVATEBUILD PRIVATEBUILD -# endif -#endif /* __STDC__ */ - -/* End of material added to libpng-1.2.8 */ - -#ifndef PNG_VERSION_INFO_ONLY - -/* This is the size of the compression buffer, and thus the size of - * an IDAT chunk. Make this whatever size you feel is best for your - * machine. One of these will be allocated per png_struct. When this - * is full, it writes the data to the disk, and does some other - * calculations. Making this an extremely small size will slow - * the library down, but you may want to experiment to determine - * where it becomes significant, if you are concerned with memory - * usage. Note that zlib allocates at least 32Kb also. For readers, - * this describes the size of the buffer available to read the data in. - * Unless this gets smaller than the size of a row (compressed), - * it should not make much difference how big this is. +/* For the memory copy APIs (i.e. the standard definitions of these), + * because this file defines png_memcpy and so on the base APIs must + * be defined here. */ - -#ifndef PNG_ZBUF_SIZE -# define PNG_ZBUF_SIZE 8192 -#endif - -/* Enable if you want a write-only libpng */ - -#ifndef PNG_NO_READ_SUPPORTED -# define PNG_READ_SUPPORTED -#endif - -/* Enable if you want a read-only libpng */ - -#ifndef PNG_NO_WRITE_SUPPORTED -# define PNG_WRITE_SUPPORTED -#endif - -/* Enabled in 1.4.0. */ -#ifdef PNG_ALLOW_BENIGN_ERRORS -# define png_benign_error png_warning -# define png_chunk_benign_error png_chunk_warning -#else -# ifndef PNG_BENIGN_ERRORS_SUPPORTED -# define png_benign_error png_error -# define png_chunk_benign_error png_chunk_error -# endif -#endif - -/* Added at libpng version 1.4.0 */ -#if !defined(PNG_NO_WARNINGS) && !defined(PNG_WARNINGS_SUPPORTED) -# define PNG_WARNINGS_SUPPORTED -#endif - -/* Added at libpng version 1.4.0 */ -#if !defined(PNG_NO_ERROR_TEXT) && !defined(PNG_ERROR_TEXT_SUPPORTED) -# define PNG_ERROR_TEXT_SUPPORTED -#endif - -/* Added at libpng version 1.4.0 */ -#if !defined(PNG_NO_CHECK_cHRM) && !defined(PNG_CHECK_cHRM_SUPPORTED) -# define PNG_CHECK_cHRM_SUPPORTED -#endif - -/* Added at libpng version 1.4.0 */ -#if !defined(PNG_NO_ALIGNED_MEMORY) && !defined(PNG_ALIGNED_MEMORY_SUPPORTED) -# define PNG_ALIGNED_MEMORY_SUPPORTED -#endif - -/* Enabled by default in 1.2.0. You can disable this if you don't need to - support PNGs that are embedded in MNG datastreams */ -#ifndef PNG_NO_MNG_FEATURES -# ifndef PNG_MNG_FEATURES_SUPPORTED -# define PNG_MNG_FEATURES_SUPPORTED -# endif -#endif - -/* Added at libpng version 1.4.0 */ -#ifndef PNG_NO_FLOATING_POINT_SUPPORTED -# ifndef PNG_FLOATING_POINT_SUPPORTED -# define PNG_FLOATING_POINT_SUPPORTED -# endif -#endif - -/* Added at libpng-1.4.0beta49 for testing (this test is no longer used - in libpng and png_calloc() is always present) - */ -#define PNG_CALLOC_SUPPORTED - -/* If you are running on a machine where you cannot allocate more - * than 64K of memory at once, uncomment this. While libpng will not - * normally need that much memory in a chunk (unless you load up a very - * large file), zlib needs to know how big of a chunk it can use, and - * libpng thus makes sure to check any memory allocation to verify it - * will fit into memory. -#define PNG_MAX_MALLOC_64K - */ -#if defined(MAXSEG_64K) && !defined(PNG_MAX_MALLOC_64K) -# define PNG_MAX_MALLOC_64K -#endif - -/* Special munging to support doing things the 'cygwin' way: - * 'Normal' png-on-win32 defines/defaults: - * PNG_BUILD_DLL -- building dll - * PNG_USE_DLL -- building an application, linking to dll - * (no define) -- building static library, or building an - * application and linking to the static lib - * 'Cygwin' defines/defaults: - * PNG_BUILD_DLL -- (ignored) building the dll - * (no define) -- (ignored) building an application, linking to the dll - * PNG_STATIC -- (ignored) building the static lib, or building an - * application that links to the static lib. - * ALL_STATIC -- (ignored) building various static libs, or building an - * application that links to the static libs. - * Thus, - * a cygwin user should define either PNG_BUILD_DLL or PNG_STATIC, and - * this bit of #ifdefs will define the 'correct' config variables based on - * that. If a cygwin user *wants* to define 'PNG_USE_DLL' that's okay, but - * unnecessary. - * - * Also, the precedence order is: - * ALL_STATIC (since we can't #undef something outside our namespace) - * PNG_BUILD_DLL - * PNG_STATIC - * (nothing) == PNG_USE_DLL - * - * CYGWIN (2002-01-20): The preceding is now obsolete. With the advent - * of auto-import in binutils, we no longer need to worry about - * __declspec(dllexport) / __declspec(dllimport) and friends. Therefore, - * we don't need to worry about PNG_STATIC or ALL_STATIC when it comes - * to __declspec() stuff. However, we DO need to worry about - * PNG_BUILD_DLL and PNG_STATIC because those change some defaults - * such as CONSOLE_IO. - */ -#ifdef __CYGWIN__ -# ifdef ALL_STATIC -# ifdef PNG_BUILD_DLL -# undef PNG_BUILD_DLL -# endif -# ifdef PNG_USE_DLL -# undef PNG_USE_DLL -# endif -# ifdef PNG_DLL -# undef PNG_DLL -# endif -# ifndef PNG_STATIC -# define PNG_STATIC -# endif +# ifdef BSD +# include # else -# ifdef PNG_BUILD_DLL -# ifdef PNG_STATIC -# undef PNG_STATIC -# endif -# ifdef PNG_USE_DLL -# undef PNG_USE_DLL -# endif -# ifndef PNG_DLL -# define PNG_DLL -# endif -# else -# ifdef PNG_STATIC -# ifdef PNG_USE_DLL -# undef PNG_USE_DLL -# endif -# ifdef PNG_DLL -# undef PNG_DLL -# endif -# else -# ifndef PNG_USE_DLL -# define PNG_USE_DLL -# endif -# ifndef PNG_DLL -# define PNG_DLL -# endif -# endif -# endif +# include # endif -#endif -/* This protects us against compilers that run on a windowing system - * and thus don't have or would rather us not use the stdio types: - * stdin, stdout, and stderr. The only one currently used is stderr - * in png_error() and png_warning(). #defining PNG_NO_CONSOLE_IO will - * prevent these from being compiled and used. #defining PNG_NO_STDIO - * will also prevent these, plus will prevent the entire set of stdio - * macros and functions (FILE *, printf, etc.) from being compiled and used, - * unless (PNG_DEBUG > 0) has been #defined. - * - * #define PNG_NO_CONSOLE_IO - * #define PNG_NO_STDIO +/* For png_FILE_p - this provides the standard definition of a + * FILE */ - -#if !defined(PNG_NO_STDIO) && !defined(PNG_STDIO_SUPPORTED) -# define PNG_STDIO_SUPPORTED -#endif - - -#ifdef PNG_BUILD_DLL -# if !defined(PNG_CONSOLE_IO_SUPPORTED) && !defined(PNG_NO_CONSOLE_IO) -# define PNG_NO_CONSOLE_IO -# endif -#endif - -# ifdef PNG_NO_STDIO -# ifndef PNG_NO_CONSOLE_IO -# define PNG_NO_CONSOLE_IO -# endif -# ifdef PNG_DEBUG -# if (PNG_DEBUG > 0) -# include -# endif -# endif -# else +# ifdef PNG_STDIO_SUPPORTED # include # endif - -#if !(defined PNG_NO_CONSOLE_IO) && !defined(PNG_CONSOLE_IO_SUPPORTED) -# define PNG_CONSOLE_IO_SUPPORTED #endif -/* This macro protects us against machines that don't have function +/* This controls optimization of the reading of 16 and 32 bit values + * from PNG files. It can be set on a per-app-file basis - it + * just changes whether a macro is used to the function is called. + * The library builder sets the default, if read functions are not + * built into the library the macro implementation is forced on. + */ +#ifndef PNG_READ_INT_FUNCTIONS_SUPPORTED +# define PNG_USE_READ_MACROS +#endif +#if !defined(PNG_NO_USE_READ_MACROS) && !defined(PNG_USE_READ_MACROS) +# if PNG_DEFAULT_READ_MACROS +# define PNG_USE_READ_MACROS +# endif +#endif + +/* COMPILER SPECIFIC OPTIONS. + * + * These options are provided so that a variety of difficult compilers + * can be used. Some are fixed at build time (e.g. PNG_API_RULE + * below) but still have compiler specific implementations, others + * may be changed on a per-file basis when compiling against libpng. + */ + +/* The PNGARG macro protects us against machines that don't have function * prototypes (ie K&R style headers). If your compiler does not handle * function prototypes, define this macro and use the included ansi2knr. * I've always been able to use _NO_PROTO as the indicator, but you may @@ -306,142 +81,399 @@ */ #ifndef PNGARG -#ifdef OF /* zlib prototype munger */ -# define PNGARG(arglist) OF(arglist) -#else +# ifdef OF /* zlib prototype munger */ +# define PNGARG(arglist) OF(arglist) +# else -#ifdef _NO_PROTO -# define PNGARG(arglist) () -#else -# define PNGARG(arglist) arglist -#endif /* _NO_PROTO */ +# ifdef _NO_PROTO +# define PNGARG(arglist) () +# else +# define PNGARG(arglist) arglist +# endif /* _NO_PROTO */ -#endif /* OF */ +# endif /* OF */ #endif /* PNGARG */ -/* Try to determine if we are compiling on a Mac. Note that testing for - * just __MWERKS__ is not good enough, because the Codewarrior is now used - * on non-Mac platforms. +/* Function calling conventions. + * ============================= + * Normally it is not necessary to specify to the compiler how to call + * a function - it just does it - however on x86 systems derived from + * Microsoft and Borland C compilers ('IBM PC', 'DOS', 'Windows' systems + * and some others) there are multiple ways to call a function and the + * default can be changed on the compiler command line. For this reason + * libpng specifies the calling convention of every exported function and + * every function called via a user supplied function pointer. This is + * done in this file by defining the following macros: + * + * PNGAPI Calling convention for exported functions. + * PNGCBAPI Calling convention for user provided (callback) functions. + * PNGCAPI Calling convention used by the ANSI-C library (required + * for longjmp callbacks and sometimes used internally to + * specify the calling convention for zlib). + * + * These macros should never be overridden. If it is necessary to + * change calling convention in a private build this can be done + * by setting PNG_API_RULE (which defaults to 0) to one of the values + * below to select the correct 'API' variants. + * + * PNG_API_RULE=0 Use PNGCAPI - the 'C' calling convention - throughout. + * This is correct in every known environment. + * PNG_API_RULE=1 Use the operating system convention for PNGAPI and + * the 'C' calling convention (from PNGCAPI) for + * callbacks (PNGCBAPI). This is no longer required + * in any known environment - if it has to be used + * please post an explanation of the problem to the + * libpng mailing list. + * + * These cases only differ if the operating system does not use the C + * calling convention, at present this just means the above cases + * (x86 DOS/Windows sytems) and, even then, this does not apply to + * Cygwin running on those systems. + * + * Note that the value must be defined in pnglibconf.h so that what + * the application uses to call the library matches the conventions + * set when building the library. */ -#ifndef MACOS -# if (defined(__MWERKS__) && defined(macintosh)) || defined(applec) || \ - defined(THINK_C) || defined(__SC__) || defined(TARGET_OS_MAC) -# define MACOS + +/* Symbol export + * ============= + * When building a shared library it is almost always necessary to tell + * the compiler which symbols to export. The png.h macro 'PNG_EXPORT' + * is used to mark the symbols. On some systems these symbols can be + * extracted at link time and need no special processing by the compiler, + * on other systems the symbols are flagged by the compiler and just + * the declaration requires a special tag applied (unfortunately) in a + * compiler dependent way. Some systems can do either. + * + * A small number of older systems also require a symbol from a DLL to + * be flagged to the program that calls it. This is a problem because + * we do not know in the header file included by application code that + * the symbol will come from a shared library, as opposed to a statically + * linked one. For this reason the application must tell us by setting + * the magic flag PNG_USE_DLL to turn on the special processing before + * it includes png.h. + * + * Four additional macros are used to make this happen: + * + * PNG_IMPEXP The magic (if any) to cause a symbol to be exported from + * the build or imported if PNG_USE_DLL is set - compiler + * and system specific. + * + * PNG_EXPORT_TYPE(type) A macro that pre or appends PNG_IMPEXP to + * 'type', compiler specific. + * + * PNG_DLL_EXPORT Set to the magic to use during a libpng build to + * make a symbol exported from the DLL. + * + * PNG_DLL_IMPORT Set to the magic to force the libpng symbols to come + * from a DLL - used to define PNG_IMPEXP when + * PNG_USE_DLL is set. + */ + +/* System specific discovery. + * ========================== + * This code is used at build time to find PNG_IMPEXP, the API settings + * and PNG_EXPORT_TYPE(), it may also set a macro to indicate the DLL + * import processing is possible. On Windows/x86 systems it also sets + * compiler-specific macros to the values required to change the calling + * conventions of the various functions. + */ +#if ( defined(_Windows) || defined(_WINDOWS) || defined(WIN32) ||\ + defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) ) &&\ + ( defined(_X86_) || defined(_X64_) || defined(_M_IX86) ||\ + defined(_M_X64) || defined(_M_IA64) ) + /* Windows system (DOS doesn't support DLLs) running on x86/x64. Includes + * builds under Cygwin or MinGW. Also includes Watcom builds but these need + * special treatment because they are not compatible with GCC or Visual C + * because of different calling conventions. + */ +# if PNG_API_RULE == 2 + /* If this line results in an error, either because __watcall is not + * understood or because of a redefine just below you cannot use *this* + * build of the library with the compiler you are using. *This* build was + * build using Watcom and applications must also be built using Watcom! + */ +# define PNGCAPI __watcall +# endif + +# if defined(__GNUC__) || (defined (_MSC_VER) && (_MSC_VER >= 800)) +# define PNGCAPI __cdecl +# if PNG_API_RULE == 1 +# define PNGAPI __stdcall +# endif +# else + /* An older compiler, or one not detected (erroneously) above, + * if necessary override on the command line to get the correct + * variants for the compiler. + */ +# ifndef PNGCAPI +# define PNGCAPI _cdecl +# endif +# if PNG_API_RULE == 1 && !defined(PNGAPI) +# define PNGAPI _stdcall +# endif +# endif /* compiler/api */ + /* NOTE: PNGCBAPI always defaults to PNGCAPI. */ + +# if defined(PNGAPI) && !defined(PNG_USER_PRIVATEBUILD) + ERROR: PNG_USER_PRIVATEBUILD must be defined if PNGAPI is changed +# endif + +# if (defined(_MSC_VER) && _MSC_VER < 800) ||\ + (defined(__BORLANDC__) && __BORLANDC__ < 0x500) + /* older Borland and MSC + * compilers used '__export' and required this to be after + * the type. + */ +# ifndef PNG_EXPORT_TYPE +# define PNG_EXPORT_TYPE(type) type PNG_IMPEXP +# endif +# define PNG_DLL_EXPORT __export +# else /* newer compiler */ +# define PNG_DLL_EXPORT __declspec(dllexport) +# ifndef PNG_DLL_IMPORT +# define PNG_DLL_IMPORT __declspec(dllimport) +# endif +# endif /* compiler */ + +#else /* !Windows/x86 */ +# if (defined(__IBMC__) || defined(__IBMCPP__)) && defined(__OS2__) +# define PNGAPI _System +# else /* !Windows/x86 && !OS/2 */ + /* Use the defaults, or define PNG*API on the command line (but + * this will have to be done for every compile!) + */ +# endif /* other system, !OS/2 */ +#endif /* !Windows/x86 */ + +/* Now do all the defaulting . */ +#ifndef PNGCAPI +# define PNGCAPI +#endif +#ifndef PNGCBAPI +# define PNGCBAPI PNGCAPI +#endif +#ifndef PNGAPI +# define PNGAPI PNGCAPI +#endif + +/* The default for PNG_IMPEXP depends on whether the library is + * being built or used. + */ +#ifndef PNG_IMPEXP +# ifdef PNGLIB_BUILD + /* Building the library */ +# if (defined(DLL_EXPORT)/*from libtool*/ ||\ + defined(_WINDLL) || defined(_DLL) || defined(__DLL__) ||\ + defined(_USRDLL) ||\ + defined(PNG_BUILD_DLL)) && defined(PNG_DLL_EXPORT) + /* Building a DLL. */ +# define PNG_IMPEXP PNG_DLL_EXPORT +# endif /* DLL */ +# else + /* Using the library */ +# if defined(PNG_USE_DLL) && defined(PNG_DLL_IMPORT) + /* This forces use of a DLL, disallowing static linking */ +# define PNG_IMPEXP PNG_DLL_IMPORT +# endif +# endif + +# ifndef PNG_IMPEXP +# define PNG_IMPEXP # endif #endif -/* Enough people need this for various reasons to include it here */ -#if !defined(MACOS) && !defined(RISCOS) -# include +/* In 1.5.2 the definition of PNG_FUNCTION has been changed to always treat + * 'attributes' as a storage class - the attributes go at the start of the + * function definition, and attributes are always appended regardless of the + * compiler. This considerably simplifies these macros but may cause problems + * if any compilers both need function attributes and fail to handle them as + * a storage class (this is unlikely.) + */ +#ifndef PNG_FUNCTION +# define PNG_FUNCTION(type, name, args, attributes) attributes type name args #endif -/* PNG_SETJMP_NOT_SUPPORTED and PNG_NO_SETJMP_SUPPORTED are deprecated. */ -#if !defined(PNG_NO_SETJMP) && \ - !defined(PNG_SETJMP_NOT_SUPPORTED) && !defined(PNG_NO_SETJMP_SUPPORTED) -# define PNG_SETJMP_SUPPORTED +#ifndef PNG_EXPORT_TYPE +# define PNG_EXPORT_TYPE(type) PNG_IMPEXP type #endif -#ifdef PNG_SETJMP_SUPPORTED -/* This is an attempt to force a single setjmp behaviour on Linux. If - * the X config stuff didn't define _BSD_SOURCE we wouldn't need this. + /* The ordinal value is only relevant when preprocessing png.h for symbol + * table entries, so we discard it here. See the .dfn files in the + * scripts directory. + */ +#ifndef PNG_EXPORTA + +# define PNG_EXPORTA(ordinal, type, name, args, attributes)\ + PNG_FUNCTION(PNG_EXPORT_TYPE(type),(PNGAPI name),PNGARG(args), \ + extern attributes) +#endif + +/* ANSI-C (C90) does not permit a macro to be invoked with an empty argument, + * so make something non-empty to satisfy the requirement: + */ +#define PNG_EMPTY /*empty list*/ + +#define PNG_EXPORT(ordinal, type, name, args)\ + PNG_EXPORTA(ordinal, type, name, args, PNG_EMPTY) + +/* Use PNG_REMOVED to comment out a removed interface. */ +#ifndef PNG_REMOVED +# define PNG_REMOVED(ordinal, type, name, args, attributes) +#endif + +#ifndef PNG_CALLBACK +# define PNG_CALLBACK(type, name, args) type (PNGCBAPI name) PNGARG(args) +#endif + +/* Support for compiler specific function attributes. These are used + * so that where compiler support is available incorrect use of API + * functions in png.h will generate compiler warnings. * - * You can bypass this test if you know that your application uses exactly - * the same setjmp.h that was included when libpng was built. Only define - * PNG_SKIP_SETJMP_CHECK while building your application, prior to the - * application's '#include "png.h"'. Don't define PNG_SKIP_SETJMP_CHECK - * while building a separate libpng library for general use. + * Added at libpng-1.2.41. */ -# ifndef PNG_SKIP_SETJMP_CHECK -# ifdef __linux__ -# ifdef _BSD_SOURCE -# define PNG_SAVE_BSD_SOURCE -# undef _BSD_SOURCE -# endif -# ifdef _SETJMP_H - /* If you encounter a compiler error here, see the explanation - * near the end of INSTALL. - */ - __pngconf.h__ in libpng already includes setjmp.h; - __dont__ include it again.; -# endif -# endif /* __linux__ */ -# endif /* PNG_SKIP_SETJMP_CHECK */ +#ifndef PNG_NO_PEDANTIC_WARNINGS +# ifndef PNG_PEDANTIC_WARNINGS_SUPPORTED +# define PNG_PEDANTIC_WARNINGS_SUPPORTED +# endif +#endif - /* Include setjmp.h for error handling */ -# include - -# ifdef __linux__ -# ifdef PNG_SAVE_BSD_SOURCE -# ifdef _BSD_SOURCE -# undef _BSD_SOURCE -# endif -# define _BSD_SOURCE -# undef PNG_SAVE_BSD_SOURCE +#ifdef PNG_PEDANTIC_WARNINGS_SUPPORTED + /* Support for compiler specific function attributes. These are used + * so that where compiler support is available incorrect use of API + * functions in png.h will generate compiler warnings. Added at libpng + * version 1.2.41. + */ +# if defined(__GNUC__) +# ifndef PNG_USE_RESULT +# define PNG_USE_RESULT __attribute__((__warn_unused_result__)) +# endif +# ifndef PNG_NORETURN +# define PNG_NORETURN __attribute__((__noreturn__)) +# endif +# ifndef PNG_PTR_NORETURN + /* It's not enough to have the compiler be the correct compiler at + * this point - it's necessary for the library (which defines + * the type of the library longjmp) to also be the GNU library. + * This is because many systems use the GNU compiler with a + * non-GNU libc implementation. Min/GW headers are also compatible + * with GCC as well as uclibc, so it seems best to exclude known + * problem libcs here rather than just including known libcs. + * + * NOTE: this relies on the only use of PNG_PTR_NORETURN being with + * the system longjmp. If the same type is used elsewhere then this + * will need to be changed. + */ +# if !defined(__CYGWIN__) +# define PNG_PTR_NORETURN __attribute__((__noreturn__)) +# endif +# endif +# ifndef PNG_ALLOCATED +# define PNG_ALLOCATED __attribute__((__malloc__)) # endif -# endif /* __linux__ */ -#endif /* PNG_SETJMP_SUPPORTED */ -#ifdef BSD -# include -#else -# include -#endif + /* This specifically protects structure members that should only be + * accessed from within the library, therefore should be empty during + * a library build. + */ +# ifndef PNGLIB_BUILD +# ifndef PNG_DEPRECATED +# define PNG_DEPRECATED __attribute__((__deprecated__)) +# endif +# ifndef PNG_DEPSTRUCT +# define PNG_DEPSTRUCT __attribute__((__deprecated__)) +# endif +# ifndef PNG_PRIVATE +# if 0 /* Doesn't work so we use deprecated instead*/ +# define PNG_PRIVATE \ + __attribute__((warning("This function is not exported by libpng."))) +# else +# define PNG_PRIVATE \ + __attribute__((__deprecated__)) +# endif +# endif +# endif /* PNGLIB_BUILD */ +# endif /* __GNUC__ */ -/* Other defines for things like memory and the like can go here. */ +# if defined(_MSC_VER) && (_MSC_VER >= 1300) +# ifndef PNG_USE_RESULT +# define PNG_USE_RESULT /* not supported */ +# endif +# ifndef PNG_NORETURN +# define PNG_NORETURN __declspec(noreturn) +# endif +# ifndef PNG_PTR_NORETURN +# define PNG_PTR_NORETURN /* not supported */ +# endif +# ifndef PNG_ALLOCATED +# define PNG_ALLOCATED __declspec(restrict) +# endif -/* This controls how fine the quantizing gets. As this allocates - * a largish chunk of memory (32K), those who are not as concerned - * with quantizing quality can decrease some or all of these. - */ + /* This specifically protects structure members that should only be + * accessed from within the library, therefore should be empty during + * a library build. + */ +# ifndef PNGLIB_BUILD +# ifndef PNG_DEPRECATED +# define PNG_DEPRECATED __declspec(deprecated) +# endif +# ifndef PNG_DEPSTRUCT +# define PNG_DEPSTRUCT __declspec(deprecated) +# endif +# ifndef PNG_PRIVATE +# define PNG_PRIVATE __declspec(deprecated) +# endif +# endif /* PNGLIB_BUILD */ +# endif /* _MSC_VER */ +#endif /* PNG_PEDANTIC_WARNINGS */ -/* Prior to libpng-1.4.2, these were PNG_DITHER_*_BITS - * These migration aids will be removed from libpng-1.5.0. - */ -#ifdef PNG_DITHER_RED_BITS -# define PNG_QUANTIZE_RED_BITS PNG_DITHER_RED_BITS +#ifndef PNG_DEPRECATED +# define PNG_DEPRECATED /* Use of this function is deprecated */ #endif -#ifdef PNG_DITHER_GREEN_BITS -# define PNG_QUANTIZE_GREEN_BITS PNG_DITHER_GREEN_BITS +#ifndef PNG_USE_RESULT +# define PNG_USE_RESULT /* The result of this function must be checked */ #endif -#ifdef PNG_DITHER_BLUE_BITS -# define PNG_QUANTIZE_BLUE_BITS PNG_DITHER_BLUE_BITS +#ifndef PNG_NORETURN +# define PNG_NORETURN /* This function does not return */ #endif - -#ifndef PNG_QUANTIZE_RED_BITS -# define PNG_QUANTIZE_RED_BITS 5 +#ifndef PNG_PTR_NORETURN +# define PNG_PTR_NORETURN /* This function does not return */ #endif -#ifndef PNG_QUANTIZE_GREEN_BITS -# define PNG_QUANTIZE_GREEN_BITS 5 +#ifndef PNG_ALLOCATED +# define PNG_ALLOCATED /* The result of the function is new memory */ #endif -#ifndef PNG_QUANTIZE_BLUE_BITS -# define PNG_QUANTIZE_BLUE_BITS 5 +#ifndef PNG_DEPSTRUCT +# define PNG_DEPSTRUCT /* Access to this struct member is deprecated */ #endif - -/* This controls how fine the gamma correction becomes when you - * are only interested in 8 bits anyway. Increasing this value - * results in more memory being used, and more pow() functions - * being called to fill in the gamma tables. Don't set this value - * less then 8, and even that may not work (I haven't tested it). - */ - -#ifndef PNG_MAX_GAMMA_8 -# define PNG_MAX_GAMMA_8 11 +#ifndef PNG_PRIVATE +# define PNG_PRIVATE /* This is a private libpng function */ #endif - -/* This controls how much a difference in gamma we can tolerate before - * we actually start doing gamma conversion. - */ -#ifndef PNG_GAMMA_THRESHOLD -# define PNG_GAMMA_THRESHOLD 0.05 +#ifndef PNG_FP_EXPORT /* A floating point API. */ +# ifdef PNG_FLOATING_POINT_SUPPORTED +# define PNG_FP_EXPORT(ordinal, type, name, args)\ + PNG_EXPORT(ordinal, type, name, args) +# else /* No floating point APIs */ +# define PNG_FP_EXPORT(ordinal, type, name, args) +# endif +#endif +#ifndef PNG_FIXED_EXPORT /* A fixed point API. */ +# ifdef PNG_FIXED_POINT_SUPPORTED +# define PNG_FIXED_EXPORT(ordinal, type, name, args)\ + PNG_EXPORT(ordinal, type, name, args) +# else /* No fixed point APIs */ +# define PNG_FIXED_EXPORT(ordinal, type, name, args) +# endif #endif /* The following uses const char * instead of char * for error * and warning message functions, so some compilers won't complain. * If you do not want to use const, define PNG_NO_CONST here. + * + * This should not change how the APIs are called, so it can be done + * on a per-file basis in the application. */ - #ifndef PNG_CONST # ifndef PNG_NO_CONST # define PNG_CONST const @@ -450,646 +482,6 @@ # endif #endif -/* The following defines give you the ability to remove code from the - * library that you will not be using. I wish I could figure out how to - * automate this, but I can't do that without making it seriously hard - * on the users. So if you are not using an ability, change the #define - * to and #undef, and that part of the library will not be compiled. If - * your linker can't find a function, you may want to make sure the - * ability is defined here. Some of these depend upon some others being - * defined. I haven't figured out all the interactions here, so you may - * have to experiment awhile to get everything to compile. If you are - * creating or using a shared library, you probably shouldn't touch this, - * as it will affect the size of the structures, and this will cause bad - * things to happen if the library and/or application ever change. - */ - -/* Any features you will not be using can be undef'ed here */ - -/* GR-P, 0.96a: Set "*TRANSFORMS_SUPPORTED as default but allow user - * to turn it off with PNG_NO_READ|WRITE_TRANSFORMS on the compile line, - * then pick and choose which ones to define without having to edit this - * file. It is safe to use the PNG_NO_READ|WRITE_TRANSFORMS - * if you only want to have a png-compliant reader/writer but don't need - * any of the extra transformations. This saves about 80 kbytes in a - * typical installation of the library. (PNG_NO_* form added in version - * 1.0.1c, for consistency; PNG_*_TRANSFORMS_NOT_SUPPORTED deprecated in - * 1.4.0) - */ - -/* Ignore attempt to turn off both floating and fixed point support */ -#if !defined(PNG_FLOATING_POINT_SUPPORTED) || \ - !defined(PNG_NO_FIXED_POINT_SUPPORTED) -# define PNG_FIXED_POINT_SUPPORTED -#endif - -#ifdef PNG_READ_SUPPORTED - -/* PNG_READ_TRANSFORMS_NOT_SUPPORTED is deprecated. */ -#if !defined(PNG_READ_TRANSFORMS_NOT_SUPPORTED) && \ - !defined(PNG_NO_READ_TRANSFORMS) -# define PNG_READ_TRANSFORMS_SUPPORTED -#endif - -#ifdef PNG_READ_TRANSFORMS_SUPPORTED -# ifndef PNG_NO_READ_EXPAND -# define PNG_READ_EXPAND_SUPPORTED -# endif -# ifndef PNG_NO_READ_SHIFT -# define PNG_READ_SHIFT_SUPPORTED -# endif -# ifndef PNG_NO_READ_PACK -# define PNG_READ_PACK_SUPPORTED -# endif -# ifndef PNG_NO_READ_BGR -# define PNG_READ_BGR_SUPPORTED -# endif -# ifndef PNG_NO_READ_SWAP -# define PNG_READ_SWAP_SUPPORTED -# endif -# ifndef PNG_NO_READ_PACKSWAP -# define PNG_READ_PACKSWAP_SUPPORTED -# endif -# ifndef PNG_NO_READ_INVERT -# define PNG_READ_INVERT_SUPPORTED -# endif -# ifndef PNG_NO_READ_QUANTIZE - /* Prior to libpng-1.4.0 this was PNG_READ_DITHER_SUPPORTED */ -# ifndef PNG_NO_READ_DITHER /* This migration aid will be removed */ -# define PNG_READ_QUANTIZE_SUPPORTED -# endif -# endif -# ifndef PNG_NO_READ_BACKGROUND -# define PNG_READ_BACKGROUND_SUPPORTED -# endif -# ifndef PNG_NO_READ_16_TO_8 -# define PNG_READ_16_TO_8_SUPPORTED -# endif -# ifndef PNG_NO_READ_FILLER -# define PNG_READ_FILLER_SUPPORTED -# endif -# ifndef PNG_NO_READ_GAMMA -# define PNG_READ_GAMMA_SUPPORTED -# endif -# ifndef PNG_NO_READ_GRAY_TO_RGB -# define PNG_READ_GRAY_TO_RGB_SUPPORTED -# endif -# ifndef PNG_NO_READ_SWAP_ALPHA -# define PNG_READ_SWAP_ALPHA_SUPPORTED -# endif -# ifndef PNG_NO_READ_INVERT_ALPHA -# define PNG_READ_INVERT_ALPHA_SUPPORTED -# endif -# ifndef PNG_NO_READ_STRIP_ALPHA -# define PNG_READ_STRIP_ALPHA_SUPPORTED -# endif -# ifndef PNG_NO_READ_USER_TRANSFORM -# define PNG_READ_USER_TRANSFORM_SUPPORTED -# endif -# ifndef PNG_NO_READ_RGB_TO_GRAY -# define PNG_READ_RGB_TO_GRAY_SUPPORTED -# endif -#endif /* PNG_READ_TRANSFORMS_SUPPORTED */ - -/* PNG_PROGRESSIVE_READ_NOT_SUPPORTED is deprecated. */ -#if !defined(PNG_NO_PROGRESSIVE_READ) && \ - !defined(PNG_PROGRESSIVE_READ_NOT_SUPPORTED) /* if you don't do progressive */ -# define PNG_PROGRESSIVE_READ_SUPPORTED /* reading. This is not talking */ -#endif /* about interlacing capability! You'll */ - /* still have interlacing unless you change the following define: */ - -#define PNG_READ_INTERLACING_SUPPORTED /* required for PNG-compliant decoders */ - -/* PNG_NO_SEQUENTIAL_READ_SUPPORTED is deprecated. */ -#if !defined(PNG_NO_SEQUENTIAL_READ) && \ - !defined(PNG_SEQUENTIAL_READ_SUPPORTED) && \ - !defined(PNG_NO_SEQUENTIAL_READ_SUPPORTED) -# define PNG_SEQUENTIAL_READ_SUPPORTED -#endif - -#ifndef PNG_NO_READ_COMPOSITE_NODIV -# ifndef PNG_NO_READ_COMPOSITED_NODIV /* libpng-1.0.x misspelling */ -# define PNG_READ_COMPOSITE_NODIV_SUPPORTED /* well tested on Intel, SGI */ -# endif -#endif - -#if !defined(PNG_NO_GET_INT_32) || defined(PNG_READ_oFFS_SUPPORTED) || \ - defined(PNG_READ_pCAL_SUPPORTED) -# ifndef PNG_GET_INT_32_SUPPORTED -# define PNG_GET_INT_32_SUPPORTED -# endif -#endif - -#endif /* PNG_READ_SUPPORTED */ - -#ifdef PNG_WRITE_SUPPORTED - -/* PNG_WRITE_TRANSFORMS_NOT_SUPPORTED is deprecated. */ -#if !defined(PNG_WRITE_TRANSFORMS_NOT_SUPPORTED) && \ - !defined(PNG_NO_WRITE_TRANSFORMS) -# define PNG_WRITE_TRANSFORMS_SUPPORTED -#endif - -#ifdef PNG_WRITE_TRANSFORMS_SUPPORTED -# ifndef PNG_NO_WRITE_SHIFT -# define PNG_WRITE_SHIFT_SUPPORTED -# endif -# ifndef PNG_NO_WRITE_PACK -# define PNG_WRITE_PACK_SUPPORTED -# endif -# ifndef PNG_NO_WRITE_BGR -# define PNG_WRITE_BGR_SUPPORTED -# endif -# ifndef PNG_NO_WRITE_SWAP -# define PNG_WRITE_SWAP_SUPPORTED -# endif -# ifndef PNG_NO_WRITE_PACKSWAP -# define PNG_WRITE_PACKSWAP_SUPPORTED -# endif -# ifndef PNG_NO_WRITE_INVERT -# define PNG_WRITE_INVERT_SUPPORTED -# endif -# ifndef PNG_NO_WRITE_FILLER -# define PNG_WRITE_FILLER_SUPPORTED /* same as WRITE_STRIP_ALPHA */ -# endif -# ifndef PNG_NO_WRITE_SWAP_ALPHA -# define PNG_WRITE_SWAP_ALPHA_SUPPORTED -# endif -# ifndef PNG_NO_WRITE_INVERT_ALPHA -# define PNG_WRITE_INVERT_ALPHA_SUPPORTED -# endif -# ifndef PNG_NO_WRITE_USER_TRANSFORM -# define PNG_WRITE_USER_TRANSFORM_SUPPORTED -# endif -#endif /* PNG_WRITE_TRANSFORMS_SUPPORTED */ - -#if !defined(PNG_NO_WRITE_INTERLACING_SUPPORTED) && \ - !defined(PNG_WRITE_INTERLACING_SUPPORTED) - /* This is not required for PNG-compliant encoders, but can cause - * trouble if left undefined - */ -# define PNG_WRITE_INTERLACING_SUPPORTED -#endif - -#if !defined(PNG_NO_WRITE_WEIGHTED_FILTER) && \ - !defined(PNG_WRITE_WEIGHTED_FILTER) && \ - defined(PNG_FLOATING_POINT_SUPPORTED) -# define PNG_WRITE_WEIGHTED_FILTER_SUPPORTED -#endif - -#ifndef PNG_NO_WRITE_FLUSH -# define PNG_WRITE_FLUSH_SUPPORTED -#endif - -#if !defined(PNG_NO_SAVE_INT_32) || defined(PNG_WRITE_oFFS_SUPPORTED) || \ - defined(PNG_WRITE_pCAL_SUPPORTED) -# ifndef PNG_SAVE_INT_32_SUPPORTED -# define PNG_SAVE_INT_32_SUPPORTED -# endif -#endif - -#endif /* PNG_WRITE_SUPPORTED */ - -#define PNG_NO_ERROR_NUMBERS - -#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ - defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) -# ifndef PNG_NO_USER_TRANSFORM_PTR -# define PNG_USER_TRANSFORM_PTR_SUPPORTED -# endif -#endif - -#if defined(PNG_STDIO_SUPPORTED) && !defined(PNG_TIME_RFC1123_SUPPORTED) -# define PNG_TIME_RFC1123_SUPPORTED -#endif - -/* This adds extra functions in pngget.c for accessing data from the - * info pointer (added in version 0.99) - * png_get_image_width() - * png_get_image_height() - * png_get_bit_depth() - * png_get_color_type() - * png_get_compression_type() - * png_get_filter_type() - * png_get_interlace_type() - * png_get_pixel_aspect_ratio() - * png_get_pixels_per_meter() - * png_get_x_offset_pixels() - * png_get_y_offset_pixels() - * png_get_x_offset_microns() - * png_get_y_offset_microns() - */ -#if !defined(PNG_NO_EASY_ACCESS) && !defined(PNG_EASY_ACCESS_SUPPORTED) -# define PNG_EASY_ACCESS_SUPPORTED -#endif - -/* Added at libpng-1.2.0 */ -#if !defined(PNG_NO_USER_MEM) && !defined(PNG_USER_MEM_SUPPORTED) -# define PNG_USER_MEM_SUPPORTED -#endif - -/* Added at libpng-1.2.6 */ -#ifndef PNG_NO_SET_USER_LIMITS -# ifndef PNG_SET_USER_LIMITS_SUPPORTED -# define PNG_SET_USER_LIMITS_SUPPORTED -# endif - /* Feature added at libpng-1.4.0, this flag added at 1.4.1 */ -# ifndef PNG_SET_CHUNK_CACHE_LIMIT_SUPPORTED -# define PNG_SET_CHUNK_CACHE_LIMIT_SUPPORTED -# endif - /* Feature added at libpng-1.4.1, this flag added at 1.4.1 */ -# ifndef PNG_SET_CHUNK_MALLOC_LIMIT_SUPPORTED -# define PNG_SET_CHUNK_MALLOC_LIMIT_SUPPORTED -# endif -#endif - -/* Added at libpng-1.2.43 */ -#ifndef PNG_USER_LIMITS_SUPPORTED -# ifndef PNG_NO_USER_LIMITS -# define PNG_USER_LIMITS_SUPPORTED -# endif -#endif - -/* Added at libpng-1.0.16 and 1.2.6. To accept all valid PNGs no matter - * how large, set these two limits to 0x7fffffffL - */ -#ifndef PNG_USER_WIDTH_MAX -# define PNG_USER_WIDTH_MAX 1000000L -#endif -#ifndef PNG_USER_HEIGHT_MAX -# define PNG_USER_HEIGHT_MAX 1000000L -#endif - -/* Added at libpng-1.2.43. To accept all valid PNGs no matter - * how large, set these two limits to 0. - */ -#ifndef PNG_USER_CHUNK_CACHE_MAX -# define PNG_USER_CHUNK_CACHE_MAX 0 -#endif - -/* Added at libpng-1.2.43 */ -#ifndef PNG_USER_CHUNK_MALLOC_MAX -# define PNG_USER_CHUNK_MALLOC_MAX 0 -#endif - -/* Added at libpng-1.4.0 */ -#if !defined(PNG_NO_IO_STATE) && !defined(PNG_IO_STATE_SUPPORTED) -# define PNG_IO_STATE_SUPPORTED -#endif - -#ifndef PNG_LITERAL_SHARP -# define PNG_LITERAL_SHARP 0x23 -#endif -#ifndef PNG_LITERAL_LEFT_SQUARE_BRACKET -# define PNG_LITERAL_LEFT_SQUARE_BRACKET 0x5b -#endif -#ifndef PNG_LITERAL_RIGHT_SQUARE_BRACKET -# define PNG_LITERAL_RIGHT_SQUARE_BRACKET 0x5d -#endif -#ifndef PNG_STRING_NEWLINE -#define PNG_STRING_NEWLINE "\n" -#endif - -/* These are currently experimental features, define them if you want */ - -/* Very little testing */ -/* -#ifdef PNG_READ_SUPPORTED -# ifndef PNG_READ_16_TO_8_ACCURATE_SCALE_SUPPORTED -# define PNG_READ_16_TO_8_ACCURATE_SCALE_SUPPORTED -# endif -#endif -*/ - -/* This is only for PowerPC big-endian and 680x0 systems */ -/* some testing */ -/* -#ifndef PNG_READ_BIG_ENDIAN_SUPPORTED -# define PNG_READ_BIG_ENDIAN_SUPPORTED -#endif -*/ - -#if !defined(PNG_NO_USE_READ_MACROS) && !defined(PNG_USE_READ_MACROS) -# define PNG_USE_READ_MACROS -#endif - -/* Buggy compilers (e.g., gcc 2.7.2.2) need PNG_NO_POINTER_INDEXING */ - -#if !defined(PNG_NO_POINTER_INDEXING) && \ - !defined(PNG_POINTER_INDEXING_SUPPORTED) -# define PNG_POINTER_INDEXING_SUPPORTED -#endif - - -/* Any chunks you are not interested in, you can undef here. The - * ones that allocate memory may be expecially important (hIST, - * tEXt, zTXt, tRNS, pCAL). Others will just save time and make png_info - * a bit smaller. - */ - -/* The size of the png_text structure changed in libpng-1.0.6 when - * iTXt support was added. iTXt support was turned off by default through - * libpng-1.2.x, to support old apps that malloc the png_text structure - * instead of calling png_set_text() and letting libpng malloc it. It - * was turned on by default in libpng-1.4.0. - */ - -/* PNG_READ_ANCILLARY_CHUNKS_NOT_SUPPORTED is deprecated. */ -#if defined(PNG_READ_SUPPORTED) && \ - !defined(PNG_READ_ANCILLARY_CHUNKS_NOT_SUPPORTED) && \ - !defined(PNG_NO_READ_ANCILLARY_CHUNKS) -# define PNG_READ_ANCILLARY_CHUNKS_SUPPORTED -#endif - -/* PNG_WRITE_ANCILLARY_CHUNKS_NOT_SUPPORTED is deprecated. */ -#if defined(PNG_WRITE_SUPPORTED) && \ - !defined(PNG_WRITE_ANCILLARY_CHUNKS_NOT_SUPPORTED) && \ - !defined(PNG_NO_WRITE_ANCILLARY_CHUNKS) -# define PNG_WRITE_ANCILLARY_CHUNKS_SUPPORTED -#endif - -#ifdef PNG_READ_ANCILLARY_CHUNKS_SUPPORTED - -#ifdef PNG_NO_READ_TEXT -# define PNG_NO_READ_iTXt -# define PNG_NO_READ_tEXt -# define PNG_NO_READ_zTXt -#endif - -#ifndef PNG_NO_READ_bKGD -# define PNG_READ_bKGD_SUPPORTED -# define PNG_bKGD_SUPPORTED -#endif -#ifndef PNG_NO_READ_cHRM -# define PNG_READ_cHRM_SUPPORTED -# define PNG_cHRM_SUPPORTED -#endif -#ifndef PNG_NO_READ_gAMA -# define PNG_READ_gAMA_SUPPORTED -# define PNG_gAMA_SUPPORTED -#endif -#ifndef PNG_NO_READ_hIST -# define PNG_READ_hIST_SUPPORTED -# define PNG_hIST_SUPPORTED -#endif -#ifndef PNG_NO_READ_iCCP -# define PNG_READ_iCCP_SUPPORTED -# define PNG_iCCP_SUPPORTED -#endif -#ifndef PNG_NO_READ_iTXt -# ifndef PNG_READ_iTXt_SUPPORTED -# define PNG_READ_iTXt_SUPPORTED -# endif -# ifndef PNG_iTXt_SUPPORTED -# define PNG_iTXt_SUPPORTED -# endif -#endif -#ifndef PNG_NO_READ_oFFs -# define PNG_READ_oFFs_SUPPORTED -# define PNG_oFFs_SUPPORTED -#endif -#ifndef PNG_NO_READ_pCAL -# define PNG_READ_pCAL_SUPPORTED -# define PNG_pCAL_SUPPORTED -#endif -#ifndef PNG_NO_READ_sCAL -# define PNG_READ_sCAL_SUPPORTED -# define PNG_sCAL_SUPPORTED -#endif -#ifndef PNG_NO_READ_pHYs -# define PNG_READ_pHYs_SUPPORTED -# define PNG_pHYs_SUPPORTED -#endif -#ifndef PNG_NO_READ_sBIT -# define PNG_READ_sBIT_SUPPORTED -# define PNG_sBIT_SUPPORTED -#endif -#ifndef PNG_NO_READ_sPLT -# define PNG_READ_sPLT_SUPPORTED -# define PNG_sPLT_SUPPORTED -#endif -#ifndef PNG_NO_READ_sRGB -# define PNG_READ_sRGB_SUPPORTED -# define PNG_sRGB_SUPPORTED -#endif -#ifndef PNG_NO_READ_tEXt -# define PNG_READ_tEXt_SUPPORTED -# define PNG_tEXt_SUPPORTED -#endif -#ifndef PNG_NO_READ_tIME -# define PNG_READ_tIME_SUPPORTED -# define PNG_tIME_SUPPORTED -#endif -#ifndef PNG_NO_READ_tRNS -# define PNG_READ_tRNS_SUPPORTED -# define PNG_tRNS_SUPPORTED -#endif -#ifndef PNG_NO_READ_zTXt -# define PNG_READ_zTXt_SUPPORTED -# define PNG_zTXt_SUPPORTED -#endif -#ifndef PNG_NO_READ_OPT_PLTE -# define PNG_READ_OPT_PLTE_SUPPORTED /* only affects support of the */ -#endif /* optional PLTE chunk in RGB and RGBA images */ -#if defined(PNG_READ_iTXt_SUPPORTED) || defined(PNG_READ_tEXt_SUPPORTED) || \ - defined(PNG_READ_zTXt_SUPPORTED) -# define PNG_READ_TEXT_SUPPORTED -# define PNG_TEXT_SUPPORTED -#endif - -#endif /* PNG_READ_ANCILLARY_CHUNKS_SUPPORTED */ - -#ifndef PNG_NO_READ_UNKNOWN_CHUNKS -# ifndef PNG_READ_UNKNOWN_CHUNKS_SUPPORTED -# define PNG_READ_UNKNOWN_CHUNKS_SUPPORTED -# endif -# ifndef PNG_UNKNOWN_CHUNKS_SUPPORTED -# define PNG_UNKNOWN_CHUNKS_SUPPORTED -# endif -# ifndef PNG_READ_USER_CHUNKS_SUPPORTED -# define PNG_READ_USER_CHUNKS_SUPPORTED -# endif -#endif -#ifndef PNG_NO_READ_USER_CHUNKS -# ifndef PNG_READ_USER_CHUNKS_SUPPORTED -# define PNG_READ_USER_CHUNKS_SUPPORTED -# endif -# ifndef PNG_USER_CHUNKS_SUPPORTED -# define PNG_USER_CHUNKS_SUPPORTED -# endif -#endif -#ifndef PNG_NO_HANDLE_AS_UNKNOWN -# ifndef PNG_HANDLE_AS_UNKNOWN_SUPPORTED -# define PNG_HANDLE_AS_UNKNOWN_SUPPORTED -# endif -#endif - -#ifdef PNG_WRITE_SUPPORTED -#ifdef PNG_WRITE_ANCILLARY_CHUNKS_SUPPORTED - -#ifdef PNG_NO_WRITE_TEXT -# define PNG_NO_WRITE_iTXt -# define PNG_NO_WRITE_tEXt -# define PNG_NO_WRITE_zTXt -#endif -#ifndef PNG_NO_WRITE_bKGD -# define PNG_WRITE_bKGD_SUPPORTED -# ifndef PNG_bKGD_SUPPORTED -# define PNG_bKGD_SUPPORTED -# endif -#endif -#ifndef PNG_NO_WRITE_cHRM -# define PNG_WRITE_cHRM_SUPPORTED -# ifndef PNG_cHRM_SUPPORTED -# define PNG_cHRM_SUPPORTED -# endif -#endif -#ifndef PNG_NO_WRITE_gAMA -# define PNG_WRITE_gAMA_SUPPORTED -# ifndef PNG_gAMA_SUPPORTED -# define PNG_gAMA_SUPPORTED -# endif -#endif -#ifndef PNG_NO_WRITE_hIST -# define PNG_WRITE_hIST_SUPPORTED -# ifndef PNG_hIST_SUPPORTED -# define PNG_hIST_SUPPORTED -# endif -#endif -#ifndef PNG_NO_WRITE_iCCP -# define PNG_WRITE_iCCP_SUPPORTED -# ifndef PNG_iCCP_SUPPORTED -# define PNG_iCCP_SUPPORTED -# endif -#endif -#ifndef PNG_NO_WRITE_iTXt -# ifndef PNG_WRITE_iTXt_SUPPORTED -# define PNG_WRITE_iTXt_SUPPORTED -# endif -# ifndef PNG_iTXt_SUPPORTED -# define PNG_iTXt_SUPPORTED -# endif -#endif -#ifndef PNG_NO_WRITE_oFFs -# define PNG_WRITE_oFFs_SUPPORTED -# ifndef PNG_oFFs_SUPPORTED -# define PNG_oFFs_SUPPORTED -# endif -#endif -#ifndef PNG_NO_WRITE_pCAL -# define PNG_WRITE_pCAL_SUPPORTED -# ifndef PNG_pCAL_SUPPORTED -# define PNG_pCAL_SUPPORTED -# endif -#endif -#ifndef PNG_NO_WRITE_sCAL -# define PNG_WRITE_sCAL_SUPPORTED -# ifndef PNG_sCAL_SUPPORTED -# define PNG_sCAL_SUPPORTED -# endif -#endif -#ifndef PNG_NO_WRITE_pHYs -# define PNG_WRITE_pHYs_SUPPORTED -# ifndef PNG_pHYs_SUPPORTED -# define PNG_pHYs_SUPPORTED -# endif -#endif -#ifndef PNG_NO_WRITE_sBIT -# define PNG_WRITE_sBIT_SUPPORTED -# ifndef PNG_sBIT_SUPPORTED -# define PNG_sBIT_SUPPORTED -# endif -#endif -#ifndef PNG_NO_WRITE_sPLT -# define PNG_WRITE_sPLT_SUPPORTED -# ifndef PNG_sPLT_SUPPORTED -# define PNG_sPLT_SUPPORTED -# endif -#endif -#ifndef PNG_NO_WRITE_sRGB -# define PNG_WRITE_sRGB_SUPPORTED -# ifndef PNG_sRGB_SUPPORTED -# define PNG_sRGB_SUPPORTED -# endif -#endif -#ifndef PNG_NO_WRITE_tEXt -# define PNG_WRITE_tEXt_SUPPORTED -# ifndef PNG_tEXt_SUPPORTED -# define PNG_tEXt_SUPPORTED -# endif -#endif -#ifndef PNG_NO_WRITE_tIME -# define PNG_WRITE_tIME_SUPPORTED -# ifndef PNG_tIME_SUPPORTED -# define PNG_tIME_SUPPORTED -# endif -#endif -#ifndef PNG_NO_WRITE_tRNS -# define PNG_WRITE_tRNS_SUPPORTED -# ifndef PNG_tRNS_SUPPORTED -# define PNG_tRNS_SUPPORTED -# endif -#endif -#ifndef PNG_NO_WRITE_zTXt -# define PNG_WRITE_zTXt_SUPPORTED -# ifndef PNG_zTXt_SUPPORTED -# define PNG_zTXt_SUPPORTED -# endif -#endif -#if defined(PNG_WRITE_iTXt_SUPPORTED) || defined(PNG_WRITE_tEXt_SUPPORTED) || \ - defined(PNG_WRITE_zTXt_SUPPORTED) -# define PNG_WRITE_TEXT_SUPPORTED -# ifndef PNG_TEXT_SUPPORTED -# define PNG_TEXT_SUPPORTED -# endif -#endif - -#ifdef PNG_WRITE_tIME_SUPPORTED -# ifndef PNG_NO_CONVERT_tIME -# ifndef _WIN32_WCE -/* The "tm" structure is not supported on WindowsCE */ -# ifndef PNG_CONVERT_tIME_SUPPORTED -# define PNG_CONVERT_tIME_SUPPORTED -# endif -# endif -# endif -#endif - -#endif /* PNG_WRITE_ANCILLARY_CHUNKS_SUPPORTED */ - -#ifndef PNG_NO_WRITE_FILTER -# ifndef PNG_WRITE_FILTER_SUPPORTED -# define PNG_WRITE_FILTER_SUPPORTED -# endif -#endif - -#ifndef PNG_NO_WRITE_UNKNOWN_CHUNKS -# define PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED -# ifndef PNG_UNKNOWN_CHUNKS_SUPPORTED -# define PNG_UNKNOWN_CHUNKS_SUPPORTED -# endif -#endif -#ifndef PNG_NO_HANDLE_AS_UNKNOWN -# ifndef PNG_HANDLE_AS_UNKNOWN_SUPPORTED -# define PNG_HANDLE_AS_UNKNOWN_SUPPORTED -# endif -#endif -#endif /* PNG_WRITE_SUPPORTED */ - -/* Turn this off to disable png_read_png() and - * png_write_png() and leave the row_pointers member - * out of the info structure. - */ -#ifndef PNG_NO_INFO_IMAGE -# define PNG_INFO_IMAGE_SUPPORTED -#endif - -/* Need the time information for converting tIME chunks */ -#ifdef PNG_CONVERT_tIME_SUPPORTED - /* "time.h" functions are not supported on WindowsCE */ -# include -#endif - /* Some typedefs to get us started. These should be safe on most of the * common platforms. The typedefs should be at least as large as the * numbers suggest (a png_uint_32 must be at least 32 bits long), but they @@ -1110,11 +502,11 @@ typedef short png_int_16; typedef unsigned char png_byte; #ifdef PNG_NO_SIZE_T - typedef unsigned int png_size_t; +typedef unsigned int png_size_t; #else - typedef size_t png_size_t; +typedef size_t png_size_t; #endif -#define png_sizeof(x) sizeof(x) +#define png_sizeof(x) (sizeof (x)) /* The following is needed for medium model support. It cannot be in the * pngpriv.h header. Needs modification for other compilers besides @@ -1134,20 +526,20 @@ typedef unsigned char png_byte; # else # define LDATA 0 # endif - /* GRR: why is Cygwin in here? Cygwin is not Borland C... */ + /* GRR: why is Cygwin in here? Cygwin is not Borland C... */ # if !defined(__WIN32__) && !defined(__FLAT__) && !defined(__CYGWIN__) -# define PNG_MAX_MALLOC_64K +# define PNG_MAX_MALLOC_64K /* only used in build */ # if (LDATA != 1) # ifndef FAR # define FAR __far # endif # define USE_FAR_KEYWORD # endif /* LDATA != 1 */ - /* Possibly useful for moving data out of default segment. - * Uncomment it if you want. Could also define FARDATA as - * const if your compiler supports it. (SJT) -# define FARDATA FAR - */ + /* Possibly useful for moving data out of default segment. + * Uncomment it if you want. Could also define FARDATA as + * const if your compiler supports it. (SJT) +# define FARDATA FAR + */ # endif /* __WIN32__, __FLAT__, __CYGWIN__ */ #endif /* __BORLANDC__ */ @@ -1177,26 +569,37 @@ typedef unsigned char png_byte; #endif /* Typedef for floating-point numbers that are converted - to fixed-point with a multiple of 100,000, e.g., int_gamma */ + * to fixed-point with a multiple of 100,000, e.g., gamma + */ typedef png_int_32 png_fixed_point; /* Add typedefs for pointers */ -typedef void FAR * png_voidp; -typedef png_byte FAR * png_bytep; -typedef png_uint_32 FAR * png_uint_32p; -typedef png_int_32 FAR * png_int_32p; -typedef png_uint_16 FAR * png_uint_16p; -typedef png_int_16 FAR * png_int_16p; -typedef PNG_CONST char FAR * png_const_charp; -typedef char FAR * png_charp; -typedef png_fixed_point FAR * png_fixed_point_p; +typedef void FAR * png_voidp; +typedef PNG_CONST void FAR * png_const_voidp; +typedef png_byte FAR * png_bytep; +typedef PNG_CONST png_byte FAR * png_const_bytep; +typedef png_uint_32 FAR * png_uint_32p; +typedef PNG_CONST png_uint_32 FAR * png_const_uint_32p; +typedef png_int_32 FAR * png_int_32p; +typedef PNG_CONST png_int_32 FAR * png_const_int_32p; +typedef png_uint_16 FAR * png_uint_16p; +typedef PNG_CONST png_uint_16 FAR * png_const_uint_16p; +typedef png_int_16 FAR * png_int_16p; +typedef PNG_CONST png_int_16 FAR * png_const_int_16p; +typedef char FAR * png_charp; +typedef PNG_CONST char FAR * png_const_charp; +typedef png_fixed_point FAR * png_fixed_point_p; +typedef PNG_CONST png_fixed_point FAR * png_const_fixed_point_p; +typedef png_size_t FAR * png_size_tp; +typedef PNG_CONST png_size_t FAR * png_const_size_tp; -#ifndef PNG_NO_STDIO -typedef FILE * png_FILE_p; +#ifdef PNG_STDIO_SUPPORTED +typedef FILE * png_FILE_p; #endif #ifdef PNG_FLOATING_POINT_SUPPORTED -typedef double FAR * png_doublep; +typedef double FAR * png_doublep; +typedef PNG_CONST double FAR * png_const_doublep; #endif /* Pointers to pointers; i.e. arrays */ @@ -1215,269 +618,6 @@ typedef double FAR * FAR * png_doublepp; /* Pointers to pointers to pointers; i.e., pointer to array */ typedef char FAR * FAR * FAR * png_charppp; -/* Define PNG_BUILD_DLL if the module being built is a Windows - * LIBPNG DLL. - * - * Define PNG_USE_DLL if you want to *link* to the Windows LIBPNG DLL. - * It is equivalent to Microsoft predefined macro _DLL that is - * automatically defined when you compile using the share - * version of the CRT (C Run-Time library) - * - * The cygwin mods make this behavior a little different: - * Define PNG_BUILD_DLL if you are building a dll for use with cygwin - * Define PNG_STATIC if you are building a static library for use with cygwin, - * -or- if you are building an application that you want to link to the - * static library. - * PNG_USE_DLL is defined by default (no user action needed) unless one of - * the other flags is defined. - */ - -#if !defined(PNG_DLL) && (defined(PNG_BUILD_DLL) || defined(PNG_USE_DLL)) -# define PNG_DLL -#endif - -#ifdef __CYGWIN__ -# undef PNGAPI -# define PNGAPI __cdecl -# undef PNG_IMPEXP -# define PNG_IMPEXP -#endif - -#define PNG_USE_LOCAL_ARRAYS /* Not used in libpng, defined for legacy apps */ - -/* If you define PNGAPI, e.g., with compiler option "-DPNGAPI=__stdcall", - * you may get warnings regarding the linkage of png_zalloc and png_zfree. - * Don't ignore those warnings; you must also reset the default calling - * convention in your compiler to match your PNGAPI, and you must build - * zlib and your applications the same way you build libpng. - */ - -#if defined(__MINGW32__) && !defined(PNG_MODULEDEF) -# ifndef PNG_NO_MODULEDEF -# define PNG_NO_MODULEDEF -# endif -#endif - -#if !defined(PNG_IMPEXP) && defined(PNG_BUILD_DLL) && !defined(PNG_NO_MODULEDEF) -# define PNG_IMPEXP -#endif - -#if defined(PNG_DLL) || defined(_DLL) || defined(__DLL__ ) || \ - (( defined(_Windows) || defined(_WINDOWS) || \ - defined(WIN32) || defined(_WIN32) || defined(__WIN32__) )) - -# ifndef PNGAPI -# if defined(__GNUC__) || (defined (_MSC_VER) && (_MSC_VER >= 800)) -# define PNGAPI __cdecl -# else -# define PNGAPI _cdecl -# endif -# endif - -# if !defined(PNG_IMPEXP) && (!defined(PNG_DLL) || \ - 0 /* WINCOMPILER_WITH_NO_SUPPORT_FOR_DECLIMPEXP */) -# define PNG_IMPEXP -# endif - -# ifndef PNG_IMPEXP - -# define PNG_EXPORT_TYPE1(type,symbol) PNG_IMPEXP type PNGAPI symbol -# define PNG_EXPORT_TYPE2(type,symbol) type PNG_IMPEXP PNGAPI symbol - - /* Borland/Microsoft */ -# if defined(_MSC_VER) || defined(__BORLANDC__) -# if (_MSC_VER >= 800) || (__BORLANDC__ >= 0x500) -# define PNG_EXPORT PNG_EXPORT_TYPE1 -# else -# define PNG_EXPORT PNG_EXPORT_TYPE2 -# ifdef PNG_BUILD_DLL -# define PNG_IMPEXP __export -# else -# define PNG_IMPEXP /*__import */ /* doesn't exist AFAIK in VC++ */ -# endif /* Exists in Borland C++ for - C++ classes (== huge) */ -# endif -# endif - -# ifndef PNG_IMPEXP -# ifdef PNG_BUILD_DLL -# define PNG_IMPEXP __declspec(dllexport) -# else -# define PNG_IMPEXP __declspec(dllimport) -# endif -# endif -# endif /* PNG_IMPEXP */ -#else /* !(DLL || non-cygwin WINDOWS) */ -# if (defined(__IBMC__) || defined(__IBMCPP__)) && defined(__OS2__) -# ifndef PNGAPI -# define PNGAPI _System -# endif -# else -# if 0 /* ... other platforms, with other meanings */ -# endif -# endif -#endif - -#ifndef PNGAPI -# define PNGAPI -#endif -#ifndef PNG_IMPEXP -# define PNG_IMPEXP -#endif - -#ifdef PNG_BUILDSYMS -# ifndef PNG_EXPORT -# define PNG_EXPORT(type,symbol) PNG_FUNCTION_EXPORT symbol END -# endif -#endif - -#ifndef PNG_EXPORT -# define PNG_EXPORT(type,symbol) PNG_IMPEXP type PNGAPI symbol -#endif - -/* Support for compiler specific function attributes. These are used - * so that where compiler support is available incorrect use of API - * functions in png.h will generate compiler warnings. - * - * Added at libpng-1.2.41. - */ - -#ifndef PNG_NO_PEDANTIC_WARNINGS -# ifndef PNG_PEDANTIC_WARNINGS_SUPPORTED -# define PNG_PEDANTIC_WARNINGS_SUPPORTED -# endif -#endif - -#ifdef PNG_PEDANTIC_WARNINGS_SUPPORTED -/* Support for compiler specific function attributes. These are used - * so that where compiler support is available incorrect use of API - * functions in png.h will generate compiler warnings. Added at libpng - * version 1.2.41. - */ -# ifdef __GNUC__ -# ifndef PNG_USE_RESULT -# define PNG_USE_RESULT __attribute__((__warn_unused_result__)) -# endif -# ifndef PNG_NORETURN -# define PNG_NORETURN __attribute__((__noreturn__)) -# endif -# ifndef PNG_ALLOCATED -# define PNG_ALLOCATED __attribute__((__malloc__)) -# endif - - /* This specifically protects structure members that should only be - * accessed from within the library, therefore should be empty during - * a library build. - */ -# ifndef PNG_DEPRECATED -# define PNG_DEPRECATED __attribute__((__deprecated__)) -# endif -# ifndef PNG_DEPSTRUCT -# define PNG_DEPSTRUCT __attribute__((__deprecated__)) -# endif -# ifndef PNG_PRIVATE -# if 0 /* Doesn't work so we use deprecated instead*/ -# define PNG_PRIVATE \ - __attribute__((warning("This function is not exported by libpng."))) -# else -# define PNG_PRIVATE \ - __attribute__((__deprecated__)) -# endif -# endif /* PNG_PRIVATE */ -# endif /* __GNUC__ */ -#endif /* PNG_PEDANTIC_WARNINGS */ - -#ifndef PNG_DEPRECATED -# define PNG_DEPRECATED /* Use of this function is deprecated */ -#endif -#ifndef PNG_USE_RESULT -# define PNG_USE_RESULT /* The result of this function must be checked */ -#endif -#ifndef PNG_NORETURN -# define PNG_NORETURN /* This function does not return */ -#endif -#ifndef PNG_ALLOCATED -# define PNG_ALLOCATED /* The result of the function is new memory */ -#endif -#ifndef PNG_DEPSTRUCT -# define PNG_DEPSTRUCT /* Access to this struct member is deprecated */ -#endif -#ifndef PNG_PRIVATE -# define PNG_PRIVATE /* This is a private libpng function */ -#endif - -/* Users may want to use these so they are not private. Any library - * functions that are passed far data must be model-independent. - */ - -/* memory model/platform independent fns */ -#ifndef PNG_ABORT -# ifdef _WINDOWS_ -# define PNG_ABORT() ExitProcess(0) -# else -# define PNG_ABORT() abort() -# endif -#endif - -#ifdef USE_FAR_KEYWORD -/* Use this to make far-to-near assignments */ -# define CHECK 1 -# define NOCHECK 0 -# define CVT_PTR(ptr) (png_far_to_near(png_ptr,ptr,CHECK)) -# define CVT_PTR_NOCHECK(ptr) (png_far_to_near(png_ptr,ptr,NOCHECK)) -# define png_strcpy _fstrcpy -# define png_strncpy _fstrncpy /* Added to v 1.2.6 */ -# define png_strlen _fstrlen -# define png_memcmp _fmemcmp /* SJT: added */ -# define png_memcpy _fmemcpy -# define png_memset _fmemset -# define png_sprintf sprintf -#else -# ifdef _WINDOWS_ /* Favor Windows over C runtime fns */ -# define CVT_PTR(ptr) (ptr) -# define CVT_PTR_NOCHECK(ptr) (ptr) -# define png_strcpy lstrcpyA -# define png_strncpy lstrcpynA -# define png_strlen lstrlenA -# define png_memcmp memcmp -# define png_memcpy CopyMemory -# define png_memset memset -# define png_sprintf wsprintfA -# else -# define CVT_PTR(ptr) (ptr) -# define CVT_PTR_NOCHECK(ptr) (ptr) -# define png_strcpy strcpy -# define png_strncpy strncpy /* Added to v 1.2.6 */ -# define png_strlen strlen -# define png_memcmp memcmp /* SJT: added */ -# define png_memcpy memcpy -# define png_memset memset -# define png_sprintf sprintf -# ifndef PNG_NO_SNPRINTF -# ifdef _MSC_VER -# define png_snprintf _snprintf /* Added to v 1.2.19 */ -# define png_snprintf2 _snprintf -# define png_snprintf6 _snprintf -# else -# define png_snprintf snprintf /* Added to v 1.2.19 */ -# define png_snprintf2 snprintf -# define png_snprintf6 snprintf -# endif -# else - /* You don't have or don't want to use snprintf(). Caution: Using - * sprintf instead of snprintf exposes your application to accidental - * or malevolent buffer overflows. If you don't have snprintf() - * as a general rule you should provide one (you can get one from - * Portable OpenSSH). - */ -# define png_snprintf(s1,n,fmt,x1) sprintf(s1,fmt,x1) -# define png_snprintf2(s1,n,fmt,x1,x2) sprintf(s1,fmt,x1,x2) -# define png_snprintf6(s1,n,fmt,x1,x2,x3,x4,x5,x6) \ - sprintf(s1,fmt,x1,x2,x3,x4,x5,x6) -# endif -# endif -#endif - /* png_alloc_size_t is guaranteed to be no smaller than png_size_t, * and no smaller than png_uint_32. Casts from png_size_t or png_uint_32 * to png_alloc_size_t are not necessary; in fact, it is recommended @@ -1488,38 +628,22 @@ typedef char FAR * FAR * FAR * png_charppp; * to encounter practical situations that require such conversions. */ #if defined(__TURBOC__) && !defined(__FLAT__) -# define png_mem_alloc farmalloc -# define png_mem_free farfree typedef unsigned long png_alloc_size_t; #else # if defined(_MSC_VER) && defined(MAXSEG_64K) -# define png_mem_alloc(s) halloc(s, 1) -# define png_mem_free hfree typedef unsigned long png_alloc_size_t; # else -# if defined(_WINDOWS_) && (!defined(INT_MAX) || INT_MAX <= 0x7ffffffeL) -# define png_mem_alloc(s) HeapAlloc(GetProcessHeap(), 0, s) -# define png_mem_free(p) HeapFree(GetProcessHeap(), 0, p) - typedef DWORD png_alloc_size_t; + /* This is an attempt to detect an old Windows system where (int) is + * actually 16 bits, in that case png_malloc must have an argument with a + * bigger size to accomodate the requirements of the library. + */ +# if (defined(_Windows) || defined(_WINDOWS) || defined(_WINDOWS_)) && \ + (!defined(INT_MAX) || INT_MAX <= 0x7ffffffeL) + typedef DWORD png_alloc_size_t; # else -# define png_mem_alloc malloc -# define png_mem_free free typedef png_size_t png_alloc_size_t; # endif # endif #endif -/* End of memory model/platform independent support */ - -/* Just a little check that someone hasn't tried to define something - * contradictory. - */ -#if (PNG_ZBUF_SIZE > 65536L) && defined(PNG_MAX_MALLOC_64K) -# undef PNG_ZBUF_SIZE -# define PNG_ZBUF_SIZE 65536L -#endif - - -/* Added at libpng-1.2.8 */ -#endif /* PNG_VERSION_INFO_ONLY */ #endif /* PNGCONF_H */ diff --git a/reactos/include/reactos/libs/libpng/pngdebug.h b/reactos/include/reactos/libs/libpng/pngdebug.h new file mode 100644 index 00000000000..984bc28f47b --- /dev/null +++ b/reactos/include/reactos/libs/libpng/pngdebug.h @@ -0,0 +1,471 @@ + +/* pngdebug.h - Debugging macros for libpng, also used in pngtest.c + * + * Copyright (c) 1998-2011 Glenn Randers-Pehrson + * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) + * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) + * + * Last changed in libpng 1.5.0 [January 6, 2011] + * + * This code is released under the libpng license. + * For conditions of distribution and use, see the disclaimer + * and license in png.h + */ + +/* Define PNG_DEBUG at compile time for debugging information. Higher + * numbers for PNG_DEBUG mean more debugging information. This has + * only been added since version 0.95 so it is not implemented throughout + * libpng yet, but more support will be added as needed. + * + * png_debug[1-2]?(level, message ,arg{0-2}) + * Expands to a statement (either a simple expression or a compound + * do..while(0) statement) that outputs a message with parameter + * substitution if PNG_DEBUG is defined to 2 or more. If PNG_DEBUG + * is undefined, 0 or 1 every png_debug expands to a simple expression + * (actually ((void)0)). + * + * level: level of detail of message, starting at 0. A level 'n' + * message is preceded by 'n' tab characters (not implemented + * on Microsoft compilers unless PNG_DEBUG_FILE is also + * defined, to allow debug DLL compilation with no standard IO). + * message: a printf(3) style text string. A trailing '\n' is added + * to the message. + * arg: 0 to 2 arguments for printf(3) style substitution in message. + */ +#ifndef PNGDEBUG_H +#define PNGDEBUG_H +/* These settings control the formatting of messages in png.c and pngerror.c */ +/* Moved to pngdebug.h at 1.5.0 */ +# ifndef PNG_LITERAL_SHARP +# define PNG_LITERAL_SHARP 0x23 +# endif +# ifndef PNG_LITERAL_LEFT_SQUARE_BRACKET +# define PNG_LITERAL_LEFT_SQUARE_BRACKET 0x5b +# endif +# ifndef PNG_LITERAL_RIGHT_SQUARE_BRACKET +# define PNG_LITERAL_RIGHT_SQUARE_BRACKET 0x5d +# endif +# ifndef PNG_STRING_NEWLINE +# define PNG_STRING_NEWLINE "\n" +# endif + +#ifdef PNG_DEBUG +# if (PNG_DEBUG > 0) +# if !defined(PNG_DEBUG_FILE) && defined(_MSC_VER) +# include +# if (PNG_DEBUG > 1) +# ifndef _DEBUG +# define _DEBUG +# endif +# ifndef png_debug +# define png_debug(l,m) _RPT0(_CRT_WARN,m PNG_STRING_NEWLINE) +# endif +# ifndef png_debug1 +# define png_debug1(l,m,p1) _RPT1(_CRT_WARN,m PNG_STRING_NEWLINE,p1) +# endif +# ifndef png_debug2 +# define png_debug2(l,m,p1,p2) \ + _RPT2(_CRT_WARN,m PNG_STRING_NEWLINE,p1,p2) +# endif +# endif +# else /* PNG_DEBUG_FILE || !_MSC_VER */ +# ifndef PNG_STDIO_SUPPORTED +# include /* not included yet */ +# endif +# ifndef PNG_DEBUG_FILE +# define PNG_DEBUG_FILE stderr +# endif /* PNG_DEBUG_FILE */ + +# if (PNG_DEBUG > 1) +/* Note: ["%s"m PNG_STRING_NEWLINE] probably does not work on + * non-ISO compilers + */ +# ifdef __STDC__ +# ifndef png_debug +# define png_debug(l,m) \ + do { \ + int num_tabs=l; \ + fprintf(PNG_DEBUG_FILE,"%s"m PNG_STRING_NEWLINE,(num_tabs==1 ? "\t" : \ + (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":"")))); \ + } while (0) +# endif +# ifndef png_debug1 +# define png_debug1(l,m,p1) \ + do { \ + int num_tabs=l; \ + fprintf(PNG_DEBUG_FILE,"%s"m PNG_STRING_NEWLINE,(num_tabs==1 ? "\t" : \ + (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))),p1); \ + } while (0) +# endif +# ifndef png_debug2 +# define png_debug2(l,m,p1,p2) \ + do { \ + int num_tabs=l; \ + fprintf(PNG_DEBUG_FILE,"%s"m PNG_STRING_NEWLINE,(num_tabs==1 ? "\t" : \ + (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))),p1,p2); \ + } while (0) +# endif +# else /* __STDC __ */ +# ifndef png_debug +# define png_debug(l,m) \ + do { \ + int num_tabs=l; \ + char format[256]; \ + snprintf(format,256,"%s%s%s",(num_tabs==1 ? "\t" : \ + (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))), \ + m,PNG_STRING_NEWLINE); \ + fprintf(PNG_DEBUG_FILE,format); \ + } while (0) +# endif +# ifndef png_debug1 +# define png_debug1(l,m,p1) \ + do { \ + int num_tabs=l; \ + char format[256]; \ + snprintf(format,256,"%s%s%s",(num_tabs==1 ? "\t" : \ + (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))), \ + m,PNG_STRING_NEWLINE); \ + fprintf(PNG_DEBUG_FILE,format,p1); \ + } while (0) +# endif +# ifndef png_debug2 +# define png_debug2(l,m,p1,p2) \ + do { \ + int num_tabs=l; \ + char format[256]; \ + snprintf(format,256,"%s%s%s",(num_tabs==1 ? "\t" : \ + (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))), \ + m,PNG_STRING_NEWLINE); \ + fprintf(PNG_DEBUG_FILE,format,p1,p2); \ + } while (0) +# endif +# endif /* __STDC __ */ +# endif /* (PNG_DEBUG > 1) */ + +# endif /* _MSC_VER */ +# endif /* (PNG_DEBUG > 0) */ +#endif /* PNG_DEBUG */ +#ifndef png_debug +# define png_debug(l, m) ((void)0) +#endif +#ifndef png_debug1 +# define png_debug1(l, m, p1) ((void)0) +#endif +#ifndef png_debug2 +# define png_debug2(l, m, p1, p2) ((void)0) +#endif +#endif /* PNGDEBUG_H */ + +/* pngdebug.h - Debugging macros for libpng, also used in pngtest.c + * + * Copyright (c) 1998-2011 Glenn Randers-Pehrson + * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) + * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) + * + * Last changed in libpng 1.5.0 [January 6, 2011] + * + * This code is released under the libpng license. + * For conditions of distribution and use, see the disclaimer + * and license in png.h + */ + +/* Define PNG_DEBUG at compile time for debugging information. Higher + * numbers for PNG_DEBUG mean more debugging information. This has + * only been added since version 0.95 so it is not implemented throughout + * libpng yet, but more support will be added as needed. + * + * png_debug[1-2]?(level, message ,arg{0-2}) + * Expands to a statement (either a simple expression or a compound + * do..while(0) statement) that outputs a message with parameter + * substitution if PNG_DEBUG is defined to 2 or more. If PNG_DEBUG + * is undefined, 0 or 1 every png_debug expands to a simple expression + * (actually ((void)0)). + * + * level: level of detail of message, starting at 0. A level 'n' + * message is preceded by 'n' tab characters (not implemented + * on Microsoft compilers unless PNG_DEBUG_FILE is also + * defined, to allow debug DLL compilation with no standard IO). + * message: a printf(3) style text string. A trailing '\n' is added + * to the message. + * arg: 0 to 2 arguments for printf(3) style substitution in message. + */ +#ifndef PNGDEBUG_H +#define PNGDEBUG_H +/* These settings control the formatting of messages in png.c and pngerror.c */ +/* Moved to pngdebug.h at 1.5.0 */ +# ifndef PNG_LITERAL_SHARP +# define PNG_LITERAL_SHARP 0x23 +# endif +# ifndef PNG_LITERAL_LEFT_SQUARE_BRACKET +# define PNG_LITERAL_LEFT_SQUARE_BRACKET 0x5b +# endif +# ifndef PNG_LITERAL_RIGHT_SQUARE_BRACKET +# define PNG_LITERAL_RIGHT_SQUARE_BRACKET 0x5d +# endif +# ifndef PNG_STRING_NEWLINE +# define PNG_STRING_NEWLINE "\n" +# endif + +#ifdef PNG_DEBUG +# if (PNG_DEBUG > 0) +# if !defined(PNG_DEBUG_FILE) && defined(_MSC_VER) +# include +# if (PNG_DEBUG > 1) +# ifndef _DEBUG +# define _DEBUG +# endif +# ifndef png_debug +# define png_debug(l,m) _RPT0(_CRT_WARN,m PNG_STRING_NEWLINE) +# endif +# ifndef png_debug1 +# define png_debug1(l,m,p1) _RPT1(_CRT_WARN,m PNG_STRING_NEWLINE,p1) +# endif +# ifndef png_debug2 +# define png_debug2(l,m,p1,p2) \ + _RPT2(_CRT_WARN,m PNG_STRING_NEWLINE,p1,p2) +# endif +# endif +# else /* PNG_DEBUG_FILE || !_MSC_VER */ +# ifndef PNG_STDIO_SUPPORTED +# include /* not included yet */ +# endif +# ifndef PNG_DEBUG_FILE +# define PNG_DEBUG_FILE stderr +# endif /* PNG_DEBUG_FILE */ + +# if (PNG_DEBUG > 1) +/* Note: ["%s"m PNG_STRING_NEWLINE] probably does not work on + * non-ISO compilers + */ +# ifdef __STDC__ +# ifndef png_debug +# define png_debug(l,m) \ + do { \ + int num_tabs=l; \ + fprintf(PNG_DEBUG_FILE,"%s"m PNG_STRING_NEWLINE,(num_tabs==1 ? "\t" : \ + (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":"")))); \ + } while (0) +# endif +# ifndef png_debug1 +# define png_debug1(l,m,p1) \ + do { \ + int num_tabs=l; \ + fprintf(PNG_DEBUG_FILE,"%s"m PNG_STRING_NEWLINE,(num_tabs==1 ? "\t" : \ + (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))),p1); \ + } while (0) +# endif +# ifndef png_debug2 +# define png_debug2(l,m,p1,p2) \ + do { \ + int num_tabs=l; \ + fprintf(PNG_DEBUG_FILE,"%s"m PNG_STRING_NEWLINE,(num_tabs==1 ? "\t" : \ + (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))),p1,p2); \ + } while (0) +# endif +# else /* __STDC __ */ +# ifndef png_debug +# define png_debug(l,m) \ + do { \ + int num_tabs=l; \ + char format[256]; \ + snprintf(format,256,"%s%s%s",(num_tabs==1 ? "\t" : \ + (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))), \ + m,PNG_STRING_NEWLINE); \ + fprintf(PNG_DEBUG_FILE,format); \ + } while (0) +# endif +# ifndef png_debug1 +# define png_debug1(l,m,p1) \ + do { \ + int num_tabs=l; \ + char format[256]; \ + snprintf(format,256,"%s%s%s",(num_tabs==1 ? "\t" : \ + (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))), \ + m,PNG_STRING_NEWLINE); \ + fprintf(PNG_DEBUG_FILE,format,p1); \ + } while (0) +# endif +# ifndef png_debug2 +# define png_debug2(l,m,p1,p2) \ + do { \ + int num_tabs=l; \ + char format[256]; \ + snprintf(format,256,"%s%s%s",(num_tabs==1 ? "\t" : \ + (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))), \ + m,PNG_STRING_NEWLINE); \ + fprintf(PNG_DEBUG_FILE,format,p1,p2); \ + } while (0) +# endif +# endif /* __STDC __ */ +# endif /* (PNG_DEBUG > 1) */ + +# endif /* _MSC_VER */ +# endif /* (PNG_DEBUG > 0) */ +#endif /* PNG_DEBUG */ +#ifndef png_debug +# define png_debug(l, m) ((void)0) +#endif +#ifndef png_debug1 +# define png_debug1(l, m, p1) ((void)0) +#endif +#ifndef png_debug2 +# define png_debug2(l, m, p1, p2) ((void)0) +#endif +#endif /* PNGDEBUG_H */ + +/* pngdebug.h - Debugging macros for libpng, also used in pngtest.c + * + * Copyright (c) 1998-2011 Glenn Randers-Pehrson + * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) + * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) + * + * Last changed in libpng 1.5.0 [January 6, 2011] + * + * This code is released under the libpng license. + * For conditions of distribution and use, see the disclaimer + * and license in png.h + */ + +/* Define PNG_DEBUG at compile time for debugging information. Higher + * numbers for PNG_DEBUG mean more debugging information. This has + * only been added since version 0.95 so it is not implemented throughout + * libpng yet, but more support will be added as needed. + * + * png_debug[1-2]?(level, message ,arg{0-2}) + * Expands to a statement (either a simple expression or a compound + * do..while(0) statement) that outputs a message with parameter + * substitution if PNG_DEBUG is defined to 2 or more. If PNG_DEBUG + * is undefined, 0 or 1 every png_debug expands to a simple expression + * (actually ((void)0)). + * + * level: level of detail of message, starting at 0. A level 'n' + * message is preceded by 'n' tab characters (not implemented + * on Microsoft compilers unless PNG_DEBUG_FILE is also + * defined, to allow debug DLL compilation with no standard IO). + * message: a printf(3) style text string. A trailing '\n' is added + * to the message. + * arg: 0 to 2 arguments for printf(3) style substitution in message. + */ +#ifndef PNGDEBUG_H +#define PNGDEBUG_H +/* These settings control the formatting of messages in png.c and pngerror.c */ +/* Moved to pngdebug.h at 1.5.0 */ +# ifndef PNG_LITERAL_SHARP +# define PNG_LITERAL_SHARP 0x23 +# endif +# ifndef PNG_LITERAL_LEFT_SQUARE_BRACKET +# define PNG_LITERAL_LEFT_SQUARE_BRACKET 0x5b +# endif +# ifndef PNG_LITERAL_RIGHT_SQUARE_BRACKET +# define PNG_LITERAL_RIGHT_SQUARE_BRACKET 0x5d +# endif +# ifndef PNG_STRING_NEWLINE +# define PNG_STRING_NEWLINE "\n" +# endif + +#ifdef PNG_DEBUG +# if (PNG_DEBUG > 0) +# if !defined(PNG_DEBUG_FILE) && defined(_MSC_VER) +# include +# if (PNG_DEBUG > 1) +# ifndef _DEBUG +# define _DEBUG +# endif +# ifndef png_debug +# define png_debug(l,m) _RPT0(_CRT_WARN,m PNG_STRING_NEWLINE) +# endif +# ifndef png_debug1 +# define png_debug1(l,m,p1) _RPT1(_CRT_WARN,m PNG_STRING_NEWLINE,p1) +# endif +# ifndef png_debug2 +# define png_debug2(l,m,p1,p2) \ + _RPT2(_CRT_WARN,m PNG_STRING_NEWLINE,p1,p2) +# endif +# endif +# else /* PNG_DEBUG_FILE || !_MSC_VER */ +# ifndef PNG_STDIO_SUPPORTED +# include /* not included yet */ +# endif +# ifndef PNG_DEBUG_FILE +# define PNG_DEBUG_FILE stderr +# endif /* PNG_DEBUG_FILE */ + +# if (PNG_DEBUG > 1) +/* Note: ["%s"m PNG_STRING_NEWLINE] probably does not work on + * non-ISO compilers + */ +# ifdef __STDC__ +# ifndef png_debug +# define png_debug(l,m) \ + do { \ + int num_tabs=l; \ + fprintf(PNG_DEBUG_FILE,"%s"m PNG_STRING_NEWLINE,(num_tabs==1 ? "\t" : \ + (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":"")))); \ + } while (0) +# endif +# ifndef png_debug1 +# define png_debug1(l,m,p1) \ + do { \ + int num_tabs=l; \ + fprintf(PNG_DEBUG_FILE,"%s"m PNG_STRING_NEWLINE,(num_tabs==1 ? "\t" : \ + (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))),p1); \ + } while (0) +# endif +# ifndef png_debug2 +# define png_debug2(l,m,p1,p2) \ + do { \ + int num_tabs=l; \ + fprintf(PNG_DEBUG_FILE,"%s"m PNG_STRING_NEWLINE,(num_tabs==1 ? "\t" : \ + (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))),p1,p2); \ + } while (0) +# endif +# else /* __STDC __ */ +# ifndef png_debug +# define png_debug(l,m) \ + do { \ + int num_tabs=l; \ + char format[256]; \ + snprintf(format,256,"%s%s%s",(num_tabs==1 ? "\t" : \ + (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))), \ + m,PNG_STRING_NEWLINE); \ + fprintf(PNG_DEBUG_FILE,format); \ + } while (0) +# endif +# ifndef png_debug1 +# define png_debug1(l,m,p1) \ + do { \ + int num_tabs=l; \ + char format[256]; \ + snprintf(format,256,"%s%s%s",(num_tabs==1 ? "\t" : \ + (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))), \ + m,PNG_STRING_NEWLINE); \ + fprintf(PNG_DEBUG_FILE,format,p1); \ + } while (0) +# endif +# ifndef png_debug2 +# define png_debug2(l,m,p1,p2) \ + do { \ + int num_tabs=l; \ + char format[256]; \ + snprintf(format,256,"%s%s%s",(num_tabs==1 ? "\t" : \ + (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))), \ + m,PNG_STRING_NEWLINE); \ + fprintf(PNG_DEBUG_FILE,format,p1,p2); \ + } while (0) +# endif +# endif /* __STDC __ */ +# endif /* (PNG_DEBUG > 1) */ + +# endif /* _MSC_VER */ +# endif /* (PNG_DEBUG > 0) */ +#endif /* PNG_DEBUG */ +#ifndef png_debug +# define png_debug(l, m) ((void)0) +#endif +#ifndef png_debug1 +# define png_debug1(l, m, p1) ((void)0) +#endif +#ifndef png_debug2 +# define png_debug2(l, m, p1, p2) ((void)0) +#endif +#endif /* PNGDEBUG_H */ diff --git a/reactos/include/reactos/libs/libpng/pnginfo.h b/reactos/include/reactos/libs/libpng/pnginfo.h new file mode 100644 index 00000000000..1b82efb8c9b --- /dev/null +++ b/reactos/include/reactos/libs/libpng/pnginfo.h @@ -0,0 +1,810 @@ + +/* pnginfo.h - header file for PNG reference library + * + * Copyright (c) 1998-2011 Glenn Randers-Pehrson + * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) + * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) + * + * Last changed in libpng 1.5.0 [January 6, 2011] + * + * This code is released under the libpng license. + * For conditions of distribution and use, see the disclaimer + * and license in png.h + */ + + /* png_info is a structure that holds the information in a PNG file so + * that the application can find out the characteristics of the image. + * If you are reading the file, this structure will tell you what is + * in the PNG file. If you are writing the file, fill in the information + * you want to put into the PNG file, using png_set_*() functions, then + * call png_write_info(). + * + * The names chosen should be very close to the PNG specification, so + * consult that document for information about the meaning of each field. + * + * With libpng < 0.95, it was only possible to directly set and read the + * the values in the png_info_struct, which meant that the contents and + * order of the values had to remain fixed. With libpng 0.95 and later, + * however, there are now functions that abstract the contents of + * png_info_struct from the application, so this makes it easier to use + * libpng with dynamic libraries, and even makes it possible to use + * libraries that don't have all of the libpng ancillary chunk-handing + * functionality. In libpng-1.5.0 this was moved into a separate private + * file that is not visible to applications. + * + * The following members may have allocated storage attached that should be + * cleaned up before the structure is discarded: palette, trans, text, + * pcal_purpose, pcal_units, pcal_params, hist, iccp_name, iccp_profile, + * splt_palettes, scal_unit, row_pointers, and unknowns. By default, these + * are automatically freed when the info structure is deallocated, if they were + * allocated internally by libpng. This behavior can be changed by means + * of the png_data_freer() function. + * + * More allocation details: all the chunk-reading functions that + * change these members go through the corresponding png_set_* + * functions. A function to clear these members is available: see + * png_free_data(). The png_set_* functions do not depend on being + * able to point info structure members to any of the storage they are + * passed (they make their own copies), EXCEPT that the png_set_text + * functions use the same storage passed to them in the text_ptr or + * itxt_ptr structure argument, and the png_set_rows and png_set_unknowns + * functions do not make their own copies. + */ +#ifndef PNGINFO_H +#define PNGINFO_H + +struct png_info_def +{ + /* the following are necessary for every PNG file */ + png_uint_32 width; /* width of image in pixels (from IHDR) */ + png_uint_32 height; /* height of image in pixels (from IHDR) */ + png_uint_32 valid; /* valid chunk data (see PNG_INFO_ below) */ + png_size_t rowbytes; /* bytes needed to hold an untransformed row */ + png_colorp palette; /* array of color values (valid & PNG_INFO_PLTE) */ + png_uint_16 num_palette; /* number of color entries in "palette" (PLTE) */ + png_uint_16 num_trans; /* number of transparent palette color (tRNS) */ + png_byte bit_depth; /* 1, 2, 4, 8, or 16 bits/channel (from IHDR) */ + png_byte color_type; /* see PNG_COLOR_TYPE_ below (from IHDR) */ + /* The following three should have been named *_method not *_type */ + png_byte compression_type; /* must be PNG_COMPRESSION_TYPE_BASE (IHDR) */ + png_byte filter_type; /* must be PNG_FILTER_TYPE_BASE (from IHDR) */ + png_byte interlace_type; /* One of PNG_INTERLACE_NONE, PNG_INTERLACE_ADAM7 */ + + /* The following is informational only on read, and not used on writes. */ + png_byte channels; /* number of data channels per pixel (1, 2, 3, 4) */ + png_byte pixel_depth; /* number of bits per pixel */ + png_byte spare_byte; /* to align the data, and for future use */ + png_byte signature[8]; /* magic bytes read by libpng from start of file */ + + /* The rest of the data is optional. If you are reading, check the + * valid field to see if the information in these are valid. If you + * are writing, set the valid field to those chunks you want written, + * and initialize the appropriate fields below. + */ + +#if defined(PNG_gAMA_SUPPORTED) + /* The gAMA chunk describes the gamma characteristics of the system + * on which the image was created, normally in the range [1.0, 2.5]. + * Data is valid if (valid & PNG_INFO_gAMA) is non-zero. + */ + png_fixed_point gamma; +#endif + +#ifdef PNG_sRGB_SUPPORTED + /* GR-P, 0.96a */ + /* Data valid if (valid & PNG_INFO_sRGB) non-zero. */ + png_byte srgb_intent; /* sRGB rendering intent [0, 1, 2, or 3] */ +#endif + +#ifdef PNG_TEXT_SUPPORTED + /* The tEXt, and zTXt chunks contain human-readable textual data in + * uncompressed, compressed, and optionally compressed forms, respectively. + * The data in "text" is an array of pointers to uncompressed, + * null-terminated C strings. Each chunk has a keyword that describes the + * textual data contained in that chunk. Keywords are not required to be + * unique, and the text string may be empty. Any number of text chunks may + * be in an image. + */ + int num_text; /* number of comments read or comments to write */ + int max_text; /* current size of text array */ + png_textp text; /* array of comments read or comments to write */ +#endif /* PNG_TEXT_SUPPORTED */ + +#ifdef PNG_tIME_SUPPORTED + /* The tIME chunk holds the last time the displayed image data was + * modified. See the png_time struct for the contents of this struct. + */ + png_time mod_time; +#endif + +#ifdef PNG_sBIT_SUPPORTED + /* The sBIT chunk specifies the number of significant high-order bits + * in the pixel data. Values are in the range [1, bit_depth], and are + * only specified for the channels in the pixel data. The contents of + * the low-order bits is not specified. Data is valid if + * (valid & PNG_INFO_sBIT) is non-zero. + */ + png_color_8 sig_bit; /* significant bits in color channels */ +#endif + +#if defined(PNG_tRNS_SUPPORTED) || defined(PNG_READ_EXPAND_SUPPORTED) || \ +defined(PNG_READ_BACKGROUND_SUPPORTED) + /* The tRNS chunk supplies transparency data for paletted images and + * other image types that don't need a full alpha channel. There are + * "num_trans" transparency values for a paletted image, stored in the + * same order as the palette colors, starting from index 0. Values + * for the data are in the range [0, 255], ranging from fully transparent + * to fully opaque, respectively. For non-paletted images, there is a + * single color specified that should be treated as fully transparent. + * Data is valid if (valid & PNG_INFO_tRNS) is non-zero. + */ + png_bytep trans; /* alpha values for paletted image */ + png_bytep trans_alpha; /* alpha values for paletted image */ + png_color_16 trans_color; /* transparent color for non-palette image */ +#endif + +#if defined(PNG_bKGD_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) + /* The bKGD chunk gives the suggested image background color if the + * display program does not have its own background color and the image + * is needs to composited onto a background before display. The colors + * in "background" are normally in the same color space/depth as the + * pixel data. Data is valid if (valid & PNG_INFO_bKGD) is non-zero. + */ + png_color_16 background; +#endif + +#ifdef PNG_oFFs_SUPPORTED + /* The oFFs chunk gives the offset in "offset_unit_type" units rightwards + * and downwards from the top-left corner of the display, page, or other + * application-specific co-ordinate space. See the PNG_OFFSET_ defines + * below for the unit types. Valid if (valid & PNG_INFO_oFFs) non-zero. + */ + png_int_32 x_offset; /* x offset on page */ + png_int_32 y_offset; /* y offset on page */ + png_byte offset_unit_type; /* offset units type */ +#endif + +#ifdef PNG_pHYs_SUPPORTED + /* The pHYs chunk gives the physical pixel density of the image for + * display or printing in "phys_unit_type" units (see PNG_RESOLUTION_ + * defines below). Data is valid if (valid & PNG_INFO_pHYs) is non-zero. + */ + png_uint_32 x_pixels_per_unit; /* horizontal pixel density */ + png_uint_32 y_pixels_per_unit; /* vertical pixel density */ + png_byte phys_unit_type; /* resolution type (see PNG_RESOLUTION_ below) */ +#endif + +#ifdef PNG_hIST_SUPPORTED + /* The hIST chunk contains the relative frequency or importance of the + * various palette entries, so that a viewer can intelligently select a + * reduced-color palette, if required. Data is an array of "num_palette" + * values in the range [0,65535]. Data valid if (valid & PNG_INFO_hIST) + * is non-zero. + */ + png_uint_16p hist; +#endif + +#ifdef PNG_cHRM_SUPPORTED + /* The cHRM chunk describes the CIE color characteristics of the monitor + * on which the PNG was created. This data allows the viewer to do gamut + * mapping of the input image to ensure that the viewer sees the same + * colors in the image as the creator. Values are in the range + * [0.0, 0.8]. Data valid if (valid & PNG_INFO_cHRM) non-zero. + */ + png_fixed_point x_white; + png_fixed_point y_white; + png_fixed_point x_red; + png_fixed_point y_red; + png_fixed_point x_green; + png_fixed_point y_green; + png_fixed_point x_blue; + png_fixed_point y_blue; +#endif + +#ifdef PNG_pCAL_SUPPORTED + /* The pCAL chunk describes a transformation between the stored pixel + * values and original physical data values used to create the image. + * The integer range [0, 2^bit_depth - 1] maps to the floating-point + * range given by [pcal_X0, pcal_X1], and are further transformed by a + * (possibly non-linear) transformation function given by "pcal_type" + * and "pcal_params" into "pcal_units". Please see the PNG_EQUATION_ + * defines below, and the PNG-Group's PNG extensions document for a + * complete description of the transformations and how they should be + * implemented, and for a description of the ASCII parameter strings. + * Data values are valid if (valid & PNG_INFO_pCAL) non-zero. + */ + png_charp pcal_purpose; /* pCAL chunk description string */ + png_int_32 pcal_X0; /* minimum value */ + png_int_32 pcal_X1; /* maximum value */ + png_charp pcal_units; /* Latin-1 string giving physical units */ + png_charpp pcal_params; /* ASCII strings containing parameter values */ + png_byte pcal_type; /* equation type (see PNG_EQUATION_ below) */ + png_byte pcal_nparams; /* number of parameters given in pcal_params */ +#endif + +/* New members added in libpng-1.0.6 */ + png_uint_32 free_me; /* flags items libpng is responsible for freeing */ + +#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) || \ + defined(PNG_HANDLE_AS_UNKNOWN_SUPPORTED) + /* Storage for unknown chunks that the library doesn't recognize. */ + png_unknown_chunkp unknown_chunks; + int unknown_chunks_num; +#endif + +#ifdef PNG_iCCP_SUPPORTED + /* iCCP chunk data. */ + png_charp iccp_name; /* profile name */ + png_bytep iccp_profile; /* International Color Consortium profile data */ + png_uint_32 iccp_proflen; /* ICC profile data length */ + png_byte iccp_compression; /* Always zero */ +#endif + +#ifdef PNG_sPLT_SUPPORTED + /* Data on sPLT chunks (there may be more than one). */ + png_sPLT_tp splt_palettes; + png_uint_32 splt_palettes_num; +#endif + +#ifdef PNG_sCAL_SUPPORTED + /* The sCAL chunk describes the actual physical dimensions of the + * subject matter of the graphic. The chunk contains a unit specification + * a byte value, and two ASCII strings representing floating-point + * values. The values are width and height corresponsing to one pixel + * in the image. Data values are valid if (valid & PNG_INFO_sCAL) is + * non-zero. + */ + png_byte scal_unit; /* unit of physical scale */ + png_charp scal_s_width; /* string containing height */ + png_charp scal_s_height; /* string containing width */ +#endif + +#ifdef PNG_INFO_IMAGE_SUPPORTED + /* Memory has been allocated if (valid & PNG_ALLOCATED_INFO_ROWS) + non-zero */ + /* Data valid if (valid & PNG_INFO_IDAT) non-zero */ + png_bytepp row_pointers; /* the image bits */ +#endif + +}; +#endif /* PNGINFO_H */ + +/* pnginfo.h - header file for PNG reference library + * + * Copyright (c) 1998-2011 Glenn Randers-Pehrson + * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) + * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) + * + * Last changed in libpng 1.5.0 [January 6, 2011] + * + * This code is released under the libpng license. + * For conditions of distribution and use, see the disclaimer + * and license in png.h + */ + + /* png_info is a structure that holds the information in a PNG file so + * that the application can find out the characteristics of the image. + * If you are reading the file, this structure will tell you what is + * in the PNG file. If you are writing the file, fill in the information + * you want to put into the PNG file, using png_set_*() functions, then + * call png_write_info(). + * + * The names chosen should be very close to the PNG specification, so + * consult that document for information about the meaning of each field. + * + * With libpng < 0.95, it was only possible to directly set and read the + * the values in the png_info_struct, which meant that the contents and + * order of the values had to remain fixed. With libpng 0.95 and later, + * however, there are now functions that abstract the contents of + * png_info_struct from the application, so this makes it easier to use + * libpng with dynamic libraries, and even makes it possible to use + * libraries that don't have all of the libpng ancillary chunk-handing + * functionality. In libpng-1.5.0 this was moved into a separate private + * file that is not visible to applications. + * + * The following members may have allocated storage attached that should be + * cleaned up before the structure is discarded: palette, trans, text, + * pcal_purpose, pcal_units, pcal_params, hist, iccp_name, iccp_profile, + * splt_palettes, scal_unit, row_pointers, and unknowns. By default, these + * are automatically freed when the info structure is deallocated, if they were + * allocated internally by libpng. This behavior can be changed by means + * of the png_data_freer() function. + * + * More allocation details: all the chunk-reading functions that + * change these members go through the corresponding png_set_* + * functions. A function to clear these members is available: see + * png_free_data(). The png_set_* functions do not depend on being + * able to point info structure members to any of the storage they are + * passed (they make their own copies), EXCEPT that the png_set_text + * functions use the same storage passed to them in the text_ptr or + * itxt_ptr structure argument, and the png_set_rows and png_set_unknowns + * functions do not make their own copies. + */ +#ifndef PNGINFO_H +#define PNGINFO_H + +struct png_info_def +{ + /* the following are necessary for every PNG file */ + png_uint_32 width; /* width of image in pixels (from IHDR) */ + png_uint_32 height; /* height of image in pixels (from IHDR) */ + png_uint_32 valid; /* valid chunk data (see PNG_INFO_ below) */ + png_size_t rowbytes; /* bytes needed to hold an untransformed row */ + png_colorp palette; /* array of color values (valid & PNG_INFO_PLTE) */ + png_uint_16 num_palette; /* number of color entries in "palette" (PLTE) */ + png_uint_16 num_trans; /* number of transparent palette color (tRNS) */ + png_byte bit_depth; /* 1, 2, 4, 8, or 16 bits/channel (from IHDR) */ + png_byte color_type; /* see PNG_COLOR_TYPE_ below (from IHDR) */ + /* The following three should have been named *_method not *_type */ + png_byte compression_type; /* must be PNG_COMPRESSION_TYPE_BASE (IHDR) */ + png_byte filter_type; /* must be PNG_FILTER_TYPE_BASE (from IHDR) */ + png_byte interlace_type; /* One of PNG_INTERLACE_NONE, PNG_INTERLACE_ADAM7 */ + + /* The following is informational only on read, and not used on writes. */ + png_byte channels; /* number of data channels per pixel (1, 2, 3, 4) */ + png_byte pixel_depth; /* number of bits per pixel */ + png_byte spare_byte; /* to align the data, and for future use */ + png_byte signature[8]; /* magic bytes read by libpng from start of file */ + + /* The rest of the data is optional. If you are reading, check the + * valid field to see if the information in these are valid. If you + * are writing, set the valid field to those chunks you want written, + * and initialize the appropriate fields below. + */ + +#if defined(PNG_gAMA_SUPPORTED) + /* The gAMA chunk describes the gamma characteristics of the system + * on which the image was created, normally in the range [1.0, 2.5]. + * Data is valid if (valid & PNG_INFO_gAMA) is non-zero. + */ + png_fixed_point gamma; +#endif + +#ifdef PNG_sRGB_SUPPORTED + /* GR-P, 0.96a */ + /* Data valid if (valid & PNG_INFO_sRGB) non-zero. */ + png_byte srgb_intent; /* sRGB rendering intent [0, 1, 2, or 3] */ +#endif + +#ifdef PNG_TEXT_SUPPORTED + /* The tEXt, and zTXt chunks contain human-readable textual data in + * uncompressed, compressed, and optionally compressed forms, respectively. + * The data in "text" is an array of pointers to uncompressed, + * null-terminated C strings. Each chunk has a keyword that describes the + * textual data contained in that chunk. Keywords are not required to be + * unique, and the text string may be empty. Any number of text chunks may + * be in an image. + */ + int num_text; /* number of comments read or comments to write */ + int max_text; /* current size of text array */ + png_textp text; /* array of comments read or comments to write */ +#endif /* PNG_TEXT_SUPPORTED */ + +#ifdef PNG_tIME_SUPPORTED + /* The tIME chunk holds the last time the displayed image data was + * modified. See the png_time struct for the contents of this struct. + */ + png_time mod_time; +#endif + +#ifdef PNG_sBIT_SUPPORTED + /* The sBIT chunk specifies the number of significant high-order bits + * in the pixel data. Values are in the range [1, bit_depth], and are + * only specified for the channels in the pixel data. The contents of + * the low-order bits is not specified. Data is valid if + * (valid & PNG_INFO_sBIT) is non-zero. + */ + png_color_8 sig_bit; /* significant bits in color channels */ +#endif + +#if defined(PNG_tRNS_SUPPORTED) || defined(PNG_READ_EXPAND_SUPPORTED) || \ +defined(PNG_READ_BACKGROUND_SUPPORTED) + /* The tRNS chunk supplies transparency data for paletted images and + * other image types that don't need a full alpha channel. There are + * "num_trans" transparency values for a paletted image, stored in the + * same order as the palette colors, starting from index 0. Values + * for the data are in the range [0, 255], ranging from fully transparent + * to fully opaque, respectively. For non-paletted images, there is a + * single color specified that should be treated as fully transparent. + * Data is valid if (valid & PNG_INFO_tRNS) is non-zero. + */ + png_bytep trans; /* alpha values for paletted image */ + png_bytep trans_alpha; /* alpha values for paletted image */ + png_color_16 trans_color; /* transparent color for non-palette image */ +#endif + +#if defined(PNG_bKGD_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) + /* The bKGD chunk gives the suggested image background color if the + * display program does not have its own background color and the image + * is needs to composited onto a background before display. The colors + * in "background" are normally in the same color space/depth as the + * pixel data. Data is valid if (valid & PNG_INFO_bKGD) is non-zero. + */ + png_color_16 background; +#endif + +#ifdef PNG_oFFs_SUPPORTED + /* The oFFs chunk gives the offset in "offset_unit_type" units rightwards + * and downwards from the top-left corner of the display, page, or other + * application-specific co-ordinate space. See the PNG_OFFSET_ defines + * below for the unit types. Valid if (valid & PNG_INFO_oFFs) non-zero. + */ + png_int_32 x_offset; /* x offset on page */ + png_int_32 y_offset; /* y offset on page */ + png_byte offset_unit_type; /* offset units type */ +#endif + +#ifdef PNG_pHYs_SUPPORTED + /* The pHYs chunk gives the physical pixel density of the image for + * display or printing in "phys_unit_type" units (see PNG_RESOLUTION_ + * defines below). Data is valid if (valid & PNG_INFO_pHYs) is non-zero. + */ + png_uint_32 x_pixels_per_unit; /* horizontal pixel density */ + png_uint_32 y_pixels_per_unit; /* vertical pixel density */ + png_byte phys_unit_type; /* resolution type (see PNG_RESOLUTION_ below) */ +#endif + +#ifdef PNG_hIST_SUPPORTED + /* The hIST chunk contains the relative frequency or importance of the + * various palette entries, so that a viewer can intelligently select a + * reduced-color palette, if required. Data is an array of "num_palette" + * values in the range [0,65535]. Data valid if (valid & PNG_INFO_hIST) + * is non-zero. + */ + png_uint_16p hist; +#endif + +#ifdef PNG_cHRM_SUPPORTED + /* The cHRM chunk describes the CIE color characteristics of the monitor + * on which the PNG was created. This data allows the viewer to do gamut + * mapping of the input image to ensure that the viewer sees the same + * colors in the image as the creator. Values are in the range + * [0.0, 0.8]. Data valid if (valid & PNG_INFO_cHRM) non-zero. + */ + png_fixed_point x_white; + png_fixed_point y_white; + png_fixed_point x_red; + png_fixed_point y_red; + png_fixed_point x_green; + png_fixed_point y_green; + png_fixed_point x_blue; + png_fixed_point y_blue; +#endif + +#ifdef PNG_pCAL_SUPPORTED + /* The pCAL chunk describes a transformation between the stored pixel + * values and original physical data values used to create the image. + * The integer range [0, 2^bit_depth - 1] maps to the floating-point + * range given by [pcal_X0, pcal_X1], and are further transformed by a + * (possibly non-linear) transformation function given by "pcal_type" + * and "pcal_params" into "pcal_units". Please see the PNG_EQUATION_ + * defines below, and the PNG-Group's PNG extensions document for a + * complete description of the transformations and how they should be + * implemented, and for a description of the ASCII parameter strings. + * Data values are valid if (valid & PNG_INFO_pCAL) non-zero. + */ + png_charp pcal_purpose; /* pCAL chunk description string */ + png_int_32 pcal_X0; /* minimum value */ + png_int_32 pcal_X1; /* maximum value */ + png_charp pcal_units; /* Latin-1 string giving physical units */ + png_charpp pcal_params; /* ASCII strings containing parameter values */ + png_byte pcal_type; /* equation type (see PNG_EQUATION_ below) */ + png_byte pcal_nparams; /* number of parameters given in pcal_params */ +#endif + +/* New members added in libpng-1.0.6 */ + png_uint_32 free_me; /* flags items libpng is responsible for freeing */ + +#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) || \ + defined(PNG_HANDLE_AS_UNKNOWN_SUPPORTED) + /* Storage for unknown chunks that the library doesn't recognize. */ + png_unknown_chunkp unknown_chunks; + int unknown_chunks_num; +#endif + +#ifdef PNG_iCCP_SUPPORTED + /* iCCP chunk data. */ + png_charp iccp_name; /* profile name */ + png_bytep iccp_profile; /* International Color Consortium profile data */ + png_uint_32 iccp_proflen; /* ICC profile data length */ + png_byte iccp_compression; /* Always zero */ +#endif + +#ifdef PNG_sPLT_SUPPORTED + /* Data on sPLT chunks (there may be more than one). */ + png_sPLT_tp splt_palettes; + png_uint_32 splt_palettes_num; +#endif + +#ifdef PNG_sCAL_SUPPORTED + /* The sCAL chunk describes the actual physical dimensions of the + * subject matter of the graphic. The chunk contains a unit specification + * a byte value, and two ASCII strings representing floating-point + * values. The values are width and height corresponsing to one pixel + * in the image. Data values are valid if (valid & PNG_INFO_sCAL) is + * non-zero. + */ + png_byte scal_unit; /* unit of physical scale */ + png_charp scal_s_width; /* string containing height */ + png_charp scal_s_height; /* string containing width */ +#endif + +#ifdef PNG_INFO_IMAGE_SUPPORTED + /* Memory has been allocated if (valid & PNG_ALLOCATED_INFO_ROWS) + non-zero */ + /* Data valid if (valid & PNG_INFO_IDAT) non-zero */ + png_bytepp row_pointers; /* the image bits */ +#endif + +}; +#endif /* PNGINFO_H */ + +/* pnginfo.h - header file for PNG reference library + * + * Copyright (c) 1998-2011 Glenn Randers-Pehrson + * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) + * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) + * + * Last changed in libpng 1.5.0 [January 6, 2011] + * + * This code is released under the libpng license. + * For conditions of distribution and use, see the disclaimer + * and license in png.h + */ + + /* png_info is a structure that holds the information in a PNG file so + * that the application can find out the characteristics of the image. + * If you are reading the file, this structure will tell you what is + * in the PNG file. If you are writing the file, fill in the information + * you want to put into the PNG file, using png_set_*() functions, then + * call png_write_info(). + * + * The names chosen should be very close to the PNG specification, so + * consult that document for information about the meaning of each field. + * + * With libpng < 0.95, it was only possible to directly set and read the + * the values in the png_info_struct, which meant that the contents and + * order of the values had to remain fixed. With libpng 0.95 and later, + * however, there are now functions that abstract the contents of + * png_info_struct from the application, so this makes it easier to use + * libpng with dynamic libraries, and even makes it possible to use + * libraries that don't have all of the libpng ancillary chunk-handing + * functionality. In libpng-1.5.0 this was moved into a separate private + * file that is not visible to applications. + * + * The following members may have allocated storage attached that should be + * cleaned up before the structure is discarded: palette, trans, text, + * pcal_purpose, pcal_units, pcal_params, hist, iccp_name, iccp_profile, + * splt_palettes, scal_unit, row_pointers, and unknowns. By default, these + * are automatically freed when the info structure is deallocated, if they were + * allocated internally by libpng. This behavior can be changed by means + * of the png_data_freer() function. + * + * More allocation details: all the chunk-reading functions that + * change these members go through the corresponding png_set_* + * functions. A function to clear these members is available: see + * png_free_data(). The png_set_* functions do not depend on being + * able to point info structure members to any of the storage they are + * passed (they make their own copies), EXCEPT that the png_set_text + * functions use the same storage passed to them in the text_ptr or + * itxt_ptr structure argument, and the png_set_rows and png_set_unknowns + * functions do not make their own copies. + */ +#ifndef PNGINFO_H +#define PNGINFO_H + +struct png_info_def +{ + /* the following are necessary for every PNG file */ + png_uint_32 width; /* width of image in pixels (from IHDR) */ + png_uint_32 height; /* height of image in pixels (from IHDR) */ + png_uint_32 valid; /* valid chunk data (see PNG_INFO_ below) */ + png_size_t rowbytes; /* bytes needed to hold an untransformed row */ + png_colorp palette; /* array of color values (valid & PNG_INFO_PLTE) */ + png_uint_16 num_palette; /* number of color entries in "palette" (PLTE) */ + png_uint_16 num_trans; /* number of transparent palette color (tRNS) */ + png_byte bit_depth; /* 1, 2, 4, 8, or 16 bits/channel (from IHDR) */ + png_byte color_type; /* see PNG_COLOR_TYPE_ below (from IHDR) */ + /* The following three should have been named *_method not *_type */ + png_byte compression_type; /* must be PNG_COMPRESSION_TYPE_BASE (IHDR) */ + png_byte filter_type; /* must be PNG_FILTER_TYPE_BASE (from IHDR) */ + png_byte interlace_type; /* One of PNG_INTERLACE_NONE, PNG_INTERLACE_ADAM7 */ + + /* The following is informational only on read, and not used on writes. */ + png_byte channels; /* number of data channels per pixel (1, 2, 3, 4) */ + png_byte pixel_depth; /* number of bits per pixel */ + png_byte spare_byte; /* to align the data, and for future use */ + png_byte signature[8]; /* magic bytes read by libpng from start of file */ + + /* The rest of the data is optional. If you are reading, check the + * valid field to see if the information in these are valid. If you + * are writing, set the valid field to those chunks you want written, + * and initialize the appropriate fields below. + */ + +#if defined(PNG_gAMA_SUPPORTED) + /* The gAMA chunk describes the gamma characteristics of the system + * on which the image was created, normally in the range [1.0, 2.5]. + * Data is valid if (valid & PNG_INFO_gAMA) is non-zero. + */ + png_fixed_point gamma; +#endif + +#ifdef PNG_sRGB_SUPPORTED + /* GR-P, 0.96a */ + /* Data valid if (valid & PNG_INFO_sRGB) non-zero. */ + png_byte srgb_intent; /* sRGB rendering intent [0, 1, 2, or 3] */ +#endif + +#ifdef PNG_TEXT_SUPPORTED + /* The tEXt, and zTXt chunks contain human-readable textual data in + * uncompressed, compressed, and optionally compressed forms, respectively. + * The data in "text" is an array of pointers to uncompressed, + * null-terminated C strings. Each chunk has a keyword that describes the + * textual data contained in that chunk. Keywords are not required to be + * unique, and the text string may be empty. Any number of text chunks may + * be in an image. + */ + int num_text; /* number of comments read or comments to write */ + int max_text; /* current size of text array */ + png_textp text; /* array of comments read or comments to write */ +#endif /* PNG_TEXT_SUPPORTED */ + +#ifdef PNG_tIME_SUPPORTED + /* The tIME chunk holds the last time the displayed image data was + * modified. See the png_time struct for the contents of this struct. + */ + png_time mod_time; +#endif + +#ifdef PNG_sBIT_SUPPORTED + /* The sBIT chunk specifies the number of significant high-order bits + * in the pixel data. Values are in the range [1, bit_depth], and are + * only specified for the channels in the pixel data. The contents of + * the low-order bits is not specified. Data is valid if + * (valid & PNG_INFO_sBIT) is non-zero. + */ + png_color_8 sig_bit; /* significant bits in color channels */ +#endif + +#if defined(PNG_tRNS_SUPPORTED) || defined(PNG_READ_EXPAND_SUPPORTED) || \ +defined(PNG_READ_BACKGROUND_SUPPORTED) + /* The tRNS chunk supplies transparency data for paletted images and + * other image types that don't need a full alpha channel. There are + * "num_trans" transparency values for a paletted image, stored in the + * same order as the palette colors, starting from index 0. Values + * for the data are in the range [0, 255], ranging from fully transparent + * to fully opaque, respectively. For non-paletted images, there is a + * single color specified that should be treated as fully transparent. + * Data is valid if (valid & PNG_INFO_tRNS) is non-zero. + */ + png_bytep trans; /* alpha values for paletted image */ + png_bytep trans_alpha; /* alpha values for paletted image */ + png_color_16 trans_color; /* transparent color for non-palette image */ +#endif + +#if defined(PNG_bKGD_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) + /* The bKGD chunk gives the suggested image background color if the + * display program does not have its own background color and the image + * is needs to composited onto a background before display. The colors + * in "background" are normally in the same color space/depth as the + * pixel data. Data is valid if (valid & PNG_INFO_bKGD) is non-zero. + */ + png_color_16 background; +#endif + +#ifdef PNG_oFFs_SUPPORTED + /* The oFFs chunk gives the offset in "offset_unit_type" units rightwards + * and downwards from the top-left corner of the display, page, or other + * application-specific co-ordinate space. See the PNG_OFFSET_ defines + * below for the unit types. Valid if (valid & PNG_INFO_oFFs) non-zero. + */ + png_int_32 x_offset; /* x offset on page */ + png_int_32 y_offset; /* y offset on page */ + png_byte offset_unit_type; /* offset units type */ +#endif + +#ifdef PNG_pHYs_SUPPORTED + /* The pHYs chunk gives the physical pixel density of the image for + * display or printing in "phys_unit_type" units (see PNG_RESOLUTION_ + * defines below). Data is valid if (valid & PNG_INFO_pHYs) is non-zero. + */ + png_uint_32 x_pixels_per_unit; /* horizontal pixel density */ + png_uint_32 y_pixels_per_unit; /* vertical pixel density */ + png_byte phys_unit_type; /* resolution type (see PNG_RESOLUTION_ below) */ +#endif + +#ifdef PNG_hIST_SUPPORTED + /* The hIST chunk contains the relative frequency or importance of the + * various palette entries, so that a viewer can intelligently select a + * reduced-color palette, if required. Data is an array of "num_palette" + * values in the range [0,65535]. Data valid if (valid & PNG_INFO_hIST) + * is non-zero. + */ + png_uint_16p hist; +#endif + +#ifdef PNG_cHRM_SUPPORTED + /* The cHRM chunk describes the CIE color characteristics of the monitor + * on which the PNG was created. This data allows the viewer to do gamut + * mapping of the input image to ensure that the viewer sees the same + * colors in the image as the creator. Values are in the range + * [0.0, 0.8]. Data valid if (valid & PNG_INFO_cHRM) non-zero. + */ + png_fixed_point x_white; + png_fixed_point y_white; + png_fixed_point x_red; + png_fixed_point y_red; + png_fixed_point x_green; + png_fixed_point y_green; + png_fixed_point x_blue; + png_fixed_point y_blue; +#endif + +#ifdef PNG_pCAL_SUPPORTED + /* The pCAL chunk describes a transformation between the stored pixel + * values and original physical data values used to create the image. + * The integer range [0, 2^bit_depth - 1] maps to the floating-point + * range given by [pcal_X0, pcal_X1], and are further transformed by a + * (possibly non-linear) transformation function given by "pcal_type" + * and "pcal_params" into "pcal_units". Please see the PNG_EQUATION_ + * defines below, and the PNG-Group's PNG extensions document for a + * complete description of the transformations and how they should be + * implemented, and for a description of the ASCII parameter strings. + * Data values are valid if (valid & PNG_INFO_pCAL) non-zero. + */ + png_charp pcal_purpose; /* pCAL chunk description string */ + png_int_32 pcal_X0; /* minimum value */ + png_int_32 pcal_X1; /* maximum value */ + png_charp pcal_units; /* Latin-1 string giving physical units */ + png_charpp pcal_params; /* ASCII strings containing parameter values */ + png_byte pcal_type; /* equation type (see PNG_EQUATION_ below) */ + png_byte pcal_nparams; /* number of parameters given in pcal_params */ +#endif + +/* New members added in libpng-1.0.6 */ + png_uint_32 free_me; /* flags items libpng is responsible for freeing */ + +#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) || \ + defined(PNG_HANDLE_AS_UNKNOWN_SUPPORTED) + /* Storage for unknown chunks that the library doesn't recognize. */ + png_unknown_chunkp unknown_chunks; + int unknown_chunks_num; +#endif + +#ifdef PNG_iCCP_SUPPORTED + /* iCCP chunk data. */ + png_charp iccp_name; /* profile name */ + png_bytep iccp_profile; /* International Color Consortium profile data */ + png_uint_32 iccp_proflen; /* ICC profile data length */ + png_byte iccp_compression; /* Always zero */ +#endif + +#ifdef PNG_sPLT_SUPPORTED + /* Data on sPLT chunks (there may be more than one). */ + png_sPLT_tp splt_palettes; + png_uint_32 splt_palettes_num; +#endif + +#ifdef PNG_sCAL_SUPPORTED + /* The sCAL chunk describes the actual physical dimensions of the + * subject matter of the graphic. The chunk contains a unit specification + * a byte value, and two ASCII strings representing floating-point + * values. The values are width and height corresponsing to one pixel + * in the image. Data values are valid if (valid & PNG_INFO_sCAL) is + * non-zero. + */ + png_byte scal_unit; /* unit of physical scale */ + png_charp scal_s_width; /* string containing height */ + png_charp scal_s_height; /* string containing width */ +#endif + +#ifdef PNG_INFO_IMAGE_SUPPORTED + /* Memory has been allocated if (valid & PNG_ALLOCATED_INFO_ROWS) + non-zero */ + /* Data valid if (valid & PNG_INFO_IDAT) non-zero */ + png_bytepp row_pointers; /* the image bits */ +#endif + +}; +#endif /* PNGINFO_H */ diff --git a/reactos/include/reactos/libs/libpng/pnglibconf.h b/reactos/include/reactos/libs/libpng/pnglibconf.h new file mode 100644 index 00000000000..77bb98e8d73 --- /dev/null +++ b/reactos/include/reactos/libs/libpng/pnglibconf.h @@ -0,0 +1,543 @@ + +/* libpng STANDARD API DEFINITION */ + +/* pnglibconf.h - library build configuration */ + +/* libpng version 1.5.0 - last changed on February 11, 2011 */ + +/* Copyright (c) 1998-2011 Glenn Randers-Pehrson */ + +/* This code is released under the libpng license. */ +/* For conditions of distribution and use, see the disclaimer */ +/* and license in png.h */ + +/* pnglibconf.h */ +/* Derived from: scripts/pnglibconf.dfa */ +/* If you edit this file by hand you must obey the rules expressed in */ +/* pnglibconf.dfa with respect to the dependencies between the following */ +/* symbols. It is much better to generate a new file using */ +/* scripts/libpngconf.mak */ + +#ifndef PNGLCONF_H +#define PNGLCONF_H +/* settings */ +#define PNG_API_RULE 0 +#define PNG_CALLOC_SUPPORTED +#define PNG_COST_SHIFT 3 +#define PNG_DEFAULT_READ_MACROS 1 +#define PNG_GAMMA_THRESHOLD_FIXED 5000 +#define PNG_MAX_GAMMA_8 11 +#define PNG_QUANTIZE_BLUE_BITS 5 +#define PNG_QUANTIZE_GREEN_BITS 5 +#define PNG_QUANTIZE_RED_BITS 5 +#define PNG_sCAL_PRECISION 5 +#define PNG_USER_CHUNK_CACHE_MAX 0 +#define PNG_USER_CHUNK_MALLOC_MAX 0 +#define PNG_USER_HEIGHT_MAX 1000000L +#define PNG_USER_WIDTH_MAX 1000000L +#define PNG_WEIGHT_SHIFT 8 +#define PNG_ZBUF_SIZE 8192 +/* end of settings */ +/* options */ +#define PNG_16BIT_SUPPORTED +#define PNG_ALIGN_MEMORY_SUPPORTED +#define PNG_BENIGN_ERRORS_SUPPORTED +#define PNG_bKGD_SUPPORTED +#define PNG_CHECK_cHRM_SUPPORTED +#define PNG_cHRM_SUPPORTED +#define PNG_CONSOLE_IO_SUPPORTED +#define PNG_CONVERT_tIME_SUPPORTED +#define PNG_EASY_ACCESS_SUPPORTED +#define PNG_ERROR_TEXT_SUPPORTED +#define PNG_FIXED_POINT_SUPPORTED +#define PNG_FLOATING_ARITHMETIC_SUPPORTED +#define PNG_FLOATING_POINT_SUPPORTED +#define PNG_gAMA_SUPPORTED +#define PNG_HANDLE_AS_UNKNOWN_SUPPORTED +#define PNG_hIST_SUPPORTED +#define PNG_iCCP_SUPPORTED +#define PNG_INCH_CONVERSIONS_SUPPORTED +#define PNG_INFO_IMAGE_SUPPORTED +#define PNG_IO_STATE_SUPPORTED +#define PNG_iTXt_SUPPORTED +#define PNG_MNG_FEATURES_SUPPORTED +#define PNG_oFFs_SUPPORTED +#define PNG_pCAL_SUPPORTED +#define PNG_pHYs_SUPPORTED +#define PNG_POINTER_INDEXING_SUPPORTED +#define PNG_PROGRESSIVE_READ_SUPPORTED +#define PNG_READ_16BIT_SUPPORTED +#define PNG_READ_16_TO_8_SUPPORTED +#define PNG_READ_ANCILLARY_CHUNKS_SUPPORTED +#define PNG_READ_BACKGROUND_SUPPORTED +#define PNG_READ_BGR_SUPPORTED +#define PNG_READ_bKGD_SUPPORTED +#define PNG_READ_cHRM_SUPPORTED +#define PNG_READ_COMPOSITE_NODIV_SUPPORTED +#define PNG_READ_EXPAND_16_SUPPORTED +#define PNG_READ_EXPAND_SUPPORTED +#define PNG_READ_FILLER_SUPPORTED +#define PNG_READ_gAMA_SUPPORTED +#define PNG_READ_GAMMA_SUPPORTED +#define PNG_READ_GRAY_TO_RGB_SUPPORTED +#define PNG_READ_hIST_SUPPORTED +#define PNG_READ_iCCP_SUPPORTED +#define PNG_READ_INTERLACING_SUPPORTED +#define PNG_READ_INT_FUNCTIONS_SUPPORTED +#define PNG_READ_INVERT_ALPHA_SUPPORTED +#define PNG_READ_INVERT_SUPPORTED +#define PNG_READ_iTXt_SUPPORTED +#define PNG_READ_oFFs_SUPPORTED +#define PNG_READ_OPT_PLTE_SUPPORTED +#define PNG_READ_PACK_SUPPORTED +#define PNG_READ_PACKSWAP_SUPPORTED +#define PNG_READ_pCAL_SUPPORTED +#define PNG_READ_pHYs_SUPPORTED +#define PNG_READ_QUANTIZE_SUPPORTED +#define PNG_READ_RGB_TO_GRAY_SUPPORTED +#define PNG_READ_sBIT_SUPPORTED +#define PNG_READ_sCAL_SUPPORTED +#define PNG_READ_SHIFT_SUPPORTED +#define PNG_READ_sPLT_SUPPORTED +#define PNG_READ_sRGB_SUPPORTED +#define PNG_READ_STRIP_ALPHA_SUPPORTED +#define PNG_READ_SUPPORTED +#define PNG_READ_SWAP_ALPHA_SUPPORTED +#define PNG_READ_SWAP_SUPPORTED +#define PNG_READ_tEXt_SUPPORTED +#define PNG_READ_TEXT_SUPPORTED +#define PNG_READ_tIME_SUPPORTED +#define PNG_READ_TRANSFORMS_SUPPORTED +#define PNG_READ_tRNS_SUPPORTED +#define PNG_READ_UNKNOWN_CHUNKS_SUPPORTED +#define PNG_READ_USER_CHUNKS_SUPPORTED +#define PNG_READ_USER_TRANSFORM_SUPPORTED +#define PNG_READ_zTXt_SUPPORTED +#define PNG_SAVE_INT_32_SUPPORTED +#define PNG_sBIT_SUPPORTED +#define PNG_sCAL_SUPPORTED +#define PNG_SEQUENTIAL_READ_SUPPORTED +#define PNG_SET_CHUNK_CACHE_LIMIT_SUPPORTED +#define PNG_SET_CHUNK_MALLOC_LIMIT_SUPPORTED +#define PNG_SETJMP_SUPPORTED +#define PNG_SET_USER_LIMITS_SUPPORTED +#define PNG_sPLT_SUPPORTED +#define PNG_sRGB_SUPPORTED +#define PNG_STDIO_SUPPORTED +#define PNG_tEXt_SUPPORTED +#define PNG_TEXT_SUPPORTED +#define PNG_TIME_RFC1123_SUPPORTED +#define PNG_tIME_SUPPORTED +#define PNG_tRNS_SUPPORTED +#define PNG_UNKNOWN_CHUNKS_SUPPORTED +#define PNG_USER_CHUNKS_SUPPORTED +#define PNG_USER_LIMITS_SUPPORTED +#define PNG_USER_MEM_SUPPORTED +#define PNG_USER_TRANSFORM_INFO_SUPPORTED +#define PNG_USER_TRANSFORM_PTR_SUPPORTED +#define PNG_WARNINGS_SUPPORTED +#define PNG_WRITE_16BIT_SUPPORTED +#define PNG_WRITE_ANCILLARY_CHUNKS_SUPPORTED +#define PNG_WRITE_BGR_SUPPORTED +#define PNG_WRITE_bKGD_SUPPORTED +#define PNG_WRITE_cHRM_SUPPORTED +#define PNG_WRITE_FILLER_SUPPORTED +#define PNG_WRITE_FILTER_SUPPORTED +#define PNG_WRITE_FLUSH_SUPPORTED +#define PNG_WRITE_gAMA_SUPPORTED +#define PNG_WRITE_hIST_SUPPORTED +#define PNG_WRITE_iCCP_SUPPORTED +#define PNG_WRITE_INTERLACING_SUPPORTED +#define PNG_WRITE_INT_FUNCTIONS_SUPPORTED +#define PNG_WRITE_INVERT_ALPHA_SUPPORTED +#define PNG_WRITE_INVERT_SUPPORTED +#define PNG_WRITE_iTXt_SUPPORTED +#define PNG_WRITE_oFFs_SUPPORTED +#define PNG_WRITE_PACK_SUPPORTED +#define PNG_WRITE_PACKSWAP_SUPPORTED +#define PNG_WRITE_pCAL_SUPPORTED +#define PNG_WRITE_pHYs_SUPPORTED +#define PNG_WRITE_sBIT_SUPPORTED +#define PNG_WRITE_sCAL_SUPPORTED +#define PNG_WRITE_SHIFT_SUPPORTED +#define PNG_WRITE_sPLT_SUPPORTED +#define PNG_WRITE_sRGB_SUPPORTED +#define PNG_WRITE_SUPPORTED +#define PNG_WRITE_SWAP_ALPHA_SUPPORTED +#define PNG_WRITE_SWAP_SUPPORTED +#define PNG_WRITE_tEXt_SUPPORTED +#define PNG_WRITE_TEXT_SUPPORTED +#define PNG_WRITE_tIME_SUPPORTED +#define PNG_WRITE_TRANSFORMS_SUPPORTED +#define PNG_WRITE_tRNS_SUPPORTED +#define PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED +#define PNG_WRITE_USER_TRANSFORM_SUPPORTED +#define PNG_WRITE_WEIGHTED_FILTER_SUPPORTED +#define PNG_WRITE_zTXt_SUPPORTED +#define PNG_zTXt_SUPPORTED +/*#undef PNG_ERROR_NUMBERS_SUPPORTED*/ +/*#undef PNG_READ_16_TO_8_ACCURATE_SCALE_SUPPORTED*/ +/* end of options */ +#endif /* PNGLCONF_H */ + +/* libpng STANDARD API DEFINITION */ + +/* pnglibconf.h - library build configuration */ + +/* libpng version 1.5.0 - last changed on February 11, 2011 */ + +/* Copyright (c) 1998-2011 Glenn Randers-Pehrson */ + +/* This code is released under the libpng license. */ +/* For conditions of distribution and use, see the disclaimer */ +/* and license in png.h */ + +/* pnglibconf.h */ +/* Derived from: scripts/pnglibconf.dfa */ +/* If you edit this file by hand you must obey the rules expressed in */ +/* pnglibconf.dfa with respect to the dependencies between the following */ +/* symbols. It is much better to generate a new file using */ +/* scripts/libpngconf.mak */ + +#ifndef PNGLCONF_H +#define PNGLCONF_H +/* settings */ +#define PNG_API_RULE 0 +#define PNG_CALLOC_SUPPORTED +#define PNG_COST_SHIFT 3 +#define PNG_DEFAULT_READ_MACROS 1 +#define PNG_GAMMA_THRESHOLD_FIXED 5000 +#define PNG_MAX_GAMMA_8 11 +#define PNG_QUANTIZE_BLUE_BITS 5 +#define PNG_QUANTIZE_GREEN_BITS 5 +#define PNG_QUANTIZE_RED_BITS 5 +#define PNG_sCAL_PRECISION 5 +#define PNG_USER_CHUNK_CACHE_MAX 0 +#define PNG_USER_CHUNK_MALLOC_MAX 0 +#define PNG_USER_HEIGHT_MAX 1000000L +#define PNG_USER_WIDTH_MAX 1000000L +#define PNG_WEIGHT_SHIFT 8 +#define PNG_ZBUF_SIZE 8192 +/* end of settings */ +/* options */ +#define PNG_16BIT_SUPPORTED +#define PNG_ALIGN_MEMORY_SUPPORTED +#define PNG_BENIGN_ERRORS_SUPPORTED +#define PNG_bKGD_SUPPORTED +#define PNG_CHECK_cHRM_SUPPORTED +#define PNG_cHRM_SUPPORTED +#define PNG_CONSOLE_IO_SUPPORTED +#define PNG_CONVERT_tIME_SUPPORTED +#define PNG_EASY_ACCESS_SUPPORTED +#define PNG_ERROR_TEXT_SUPPORTED +#define PNG_FIXED_POINT_SUPPORTED +#define PNG_FLOATING_ARITHMETIC_SUPPORTED +#define PNG_FLOATING_POINT_SUPPORTED +#define PNG_gAMA_SUPPORTED +#define PNG_HANDLE_AS_UNKNOWN_SUPPORTED +#define PNG_hIST_SUPPORTED +#define PNG_iCCP_SUPPORTED +#define PNG_INCH_CONVERSIONS_SUPPORTED +#define PNG_INFO_IMAGE_SUPPORTED +#define PNG_IO_STATE_SUPPORTED +#define PNG_iTXt_SUPPORTED +#define PNG_MNG_FEATURES_SUPPORTED +#define PNG_oFFs_SUPPORTED +#define PNG_pCAL_SUPPORTED +#define PNG_pHYs_SUPPORTED +#define PNG_POINTER_INDEXING_SUPPORTED +#define PNG_PROGRESSIVE_READ_SUPPORTED +#define PNG_READ_16BIT_SUPPORTED +#define PNG_READ_16_TO_8_SUPPORTED +#define PNG_READ_ANCILLARY_CHUNKS_SUPPORTED +#define PNG_READ_BACKGROUND_SUPPORTED +#define PNG_READ_BGR_SUPPORTED +#define PNG_READ_bKGD_SUPPORTED +#define PNG_READ_cHRM_SUPPORTED +#define PNG_READ_COMPOSITE_NODIV_SUPPORTED +#define PNG_READ_EXPAND_16_SUPPORTED +#define PNG_READ_EXPAND_SUPPORTED +#define PNG_READ_FILLER_SUPPORTED +#define PNG_READ_gAMA_SUPPORTED +#define PNG_READ_GAMMA_SUPPORTED +#define PNG_READ_GRAY_TO_RGB_SUPPORTED +#define PNG_READ_hIST_SUPPORTED +#define PNG_READ_iCCP_SUPPORTED +#define PNG_READ_INTERLACING_SUPPORTED +#define PNG_READ_INT_FUNCTIONS_SUPPORTED +#define PNG_READ_INVERT_ALPHA_SUPPORTED +#define PNG_READ_INVERT_SUPPORTED +#define PNG_READ_iTXt_SUPPORTED +#define PNG_READ_oFFs_SUPPORTED +#define PNG_READ_OPT_PLTE_SUPPORTED +#define PNG_READ_PACK_SUPPORTED +#define PNG_READ_PACKSWAP_SUPPORTED +#define PNG_READ_pCAL_SUPPORTED +#define PNG_READ_pHYs_SUPPORTED +#define PNG_READ_QUANTIZE_SUPPORTED +#define PNG_READ_RGB_TO_GRAY_SUPPORTED +#define PNG_READ_sBIT_SUPPORTED +#define PNG_READ_sCAL_SUPPORTED +#define PNG_READ_SHIFT_SUPPORTED +#define PNG_READ_sPLT_SUPPORTED +#define PNG_READ_sRGB_SUPPORTED +#define PNG_READ_STRIP_ALPHA_SUPPORTED +#define PNG_READ_SUPPORTED +#define PNG_READ_SWAP_ALPHA_SUPPORTED +#define PNG_READ_SWAP_SUPPORTED +#define PNG_READ_tEXt_SUPPORTED +#define PNG_READ_TEXT_SUPPORTED +#define PNG_READ_tIME_SUPPORTED +#define PNG_READ_TRANSFORMS_SUPPORTED +#define PNG_READ_tRNS_SUPPORTED +#define PNG_READ_UNKNOWN_CHUNKS_SUPPORTED +#define PNG_READ_USER_CHUNKS_SUPPORTED +#define PNG_READ_USER_TRANSFORM_SUPPORTED +#define PNG_READ_zTXt_SUPPORTED +#define PNG_SAVE_INT_32_SUPPORTED +#define PNG_sBIT_SUPPORTED +#define PNG_sCAL_SUPPORTED +#define PNG_SEQUENTIAL_READ_SUPPORTED +#define PNG_SET_CHUNK_CACHE_LIMIT_SUPPORTED +#define PNG_SET_CHUNK_MALLOC_LIMIT_SUPPORTED +#define PNG_SETJMP_SUPPORTED +#define PNG_SET_USER_LIMITS_SUPPORTED +#define PNG_sPLT_SUPPORTED +#define PNG_sRGB_SUPPORTED +#define PNG_STDIO_SUPPORTED +#define PNG_tEXt_SUPPORTED +#define PNG_TEXT_SUPPORTED +#define PNG_TIME_RFC1123_SUPPORTED +#define PNG_tIME_SUPPORTED +#define PNG_tRNS_SUPPORTED +#define PNG_UNKNOWN_CHUNKS_SUPPORTED +#define PNG_USER_CHUNKS_SUPPORTED +#define PNG_USER_LIMITS_SUPPORTED +#define PNG_USER_MEM_SUPPORTED +#define PNG_USER_TRANSFORM_INFO_SUPPORTED +#define PNG_USER_TRANSFORM_PTR_SUPPORTED +#define PNG_WARNINGS_SUPPORTED +#define PNG_WRITE_16BIT_SUPPORTED +#define PNG_WRITE_ANCILLARY_CHUNKS_SUPPORTED +#define PNG_WRITE_BGR_SUPPORTED +#define PNG_WRITE_bKGD_SUPPORTED +#define PNG_WRITE_cHRM_SUPPORTED +#define PNG_WRITE_FILLER_SUPPORTED +#define PNG_WRITE_FILTER_SUPPORTED +#define PNG_WRITE_FLUSH_SUPPORTED +#define PNG_WRITE_gAMA_SUPPORTED +#define PNG_WRITE_hIST_SUPPORTED +#define PNG_WRITE_iCCP_SUPPORTED +#define PNG_WRITE_INTERLACING_SUPPORTED +#define PNG_WRITE_INT_FUNCTIONS_SUPPORTED +#define PNG_WRITE_INVERT_ALPHA_SUPPORTED +#define PNG_WRITE_INVERT_SUPPORTED +#define PNG_WRITE_iTXt_SUPPORTED +#define PNG_WRITE_oFFs_SUPPORTED +#define PNG_WRITE_PACK_SUPPORTED +#define PNG_WRITE_PACKSWAP_SUPPORTED +#define PNG_WRITE_pCAL_SUPPORTED +#define PNG_WRITE_pHYs_SUPPORTED +#define PNG_WRITE_sBIT_SUPPORTED +#define PNG_WRITE_sCAL_SUPPORTED +#define PNG_WRITE_SHIFT_SUPPORTED +#define PNG_WRITE_sPLT_SUPPORTED +#define PNG_WRITE_sRGB_SUPPORTED +#define PNG_WRITE_SUPPORTED +#define PNG_WRITE_SWAP_ALPHA_SUPPORTED +#define PNG_WRITE_SWAP_SUPPORTED +#define PNG_WRITE_tEXt_SUPPORTED +#define PNG_WRITE_TEXT_SUPPORTED +#define PNG_WRITE_tIME_SUPPORTED +#define PNG_WRITE_TRANSFORMS_SUPPORTED +#define PNG_WRITE_tRNS_SUPPORTED +#define PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED +#define PNG_WRITE_USER_TRANSFORM_SUPPORTED +#define PNG_WRITE_WEIGHTED_FILTER_SUPPORTED +#define PNG_WRITE_zTXt_SUPPORTED +#define PNG_zTXt_SUPPORTED +/*#undef PNG_ERROR_NUMBERS_SUPPORTED*/ +/*#undef PNG_READ_16_TO_8_ACCURATE_SCALE_SUPPORTED*/ +/* end of options */ +#endif /* PNGLCONF_H */ + +/* libpng STANDARD API DEFINITION */ + +/* pnglibconf.h - library build configuration */ + +/* libpng version 1.5.0 - last changed on February 11, 2011 */ + +/* Copyright (c) 1998-2011 Glenn Randers-Pehrson */ + +/* This code is released under the libpng license. */ +/* For conditions of distribution and use, see the disclaimer */ +/* and license in png.h */ + +/* pnglibconf.h */ +/* Derived from: scripts/pnglibconf.dfa */ +/* If you edit this file by hand you must obey the rules expressed in */ +/* pnglibconf.dfa with respect to the dependencies between the following */ +/* symbols. It is much better to generate a new file using */ +/* scripts/libpngconf.mak */ + +#ifndef PNGLCONF_H +#define PNGLCONF_H +/* settings */ +#define PNG_API_RULE 0 +#define PNG_CALLOC_SUPPORTED +#define PNG_COST_SHIFT 3 +#define PNG_DEFAULT_READ_MACROS 1 +#define PNG_GAMMA_THRESHOLD_FIXED 5000 +#define PNG_MAX_GAMMA_8 11 +#define PNG_QUANTIZE_BLUE_BITS 5 +#define PNG_QUANTIZE_GREEN_BITS 5 +#define PNG_QUANTIZE_RED_BITS 5 +#define PNG_sCAL_PRECISION 5 +#define PNG_USER_CHUNK_CACHE_MAX 0 +#define PNG_USER_CHUNK_MALLOC_MAX 0 +#define PNG_USER_HEIGHT_MAX 1000000L +#define PNG_USER_WIDTH_MAX 1000000L +#define PNG_WEIGHT_SHIFT 8 +#define PNG_ZBUF_SIZE 8192 +/* end of settings */ +/* options */ +#define PNG_16BIT_SUPPORTED +#define PNG_ALIGN_MEMORY_SUPPORTED +#define PNG_BENIGN_ERRORS_SUPPORTED +#define PNG_bKGD_SUPPORTED +#define PNG_CHECK_cHRM_SUPPORTED +#define PNG_cHRM_SUPPORTED +#define PNG_CONSOLE_IO_SUPPORTED +#define PNG_CONVERT_tIME_SUPPORTED +#define PNG_EASY_ACCESS_SUPPORTED +#define PNG_ERROR_TEXT_SUPPORTED +#define PNG_FIXED_POINT_SUPPORTED +#define PNG_FLOATING_ARITHMETIC_SUPPORTED +#define PNG_FLOATING_POINT_SUPPORTED +#define PNG_gAMA_SUPPORTED +#define PNG_HANDLE_AS_UNKNOWN_SUPPORTED +#define PNG_hIST_SUPPORTED +#define PNG_iCCP_SUPPORTED +#define PNG_INCH_CONVERSIONS_SUPPORTED +#define PNG_INFO_IMAGE_SUPPORTED +#define PNG_IO_STATE_SUPPORTED +#define PNG_iTXt_SUPPORTED +#define PNG_MNG_FEATURES_SUPPORTED +#define PNG_oFFs_SUPPORTED +#define PNG_pCAL_SUPPORTED +#define PNG_pHYs_SUPPORTED +#define PNG_POINTER_INDEXING_SUPPORTED +#define PNG_PROGRESSIVE_READ_SUPPORTED +#define PNG_READ_16BIT_SUPPORTED +#define PNG_READ_16_TO_8_SUPPORTED +#define PNG_READ_ANCILLARY_CHUNKS_SUPPORTED +#define PNG_READ_BACKGROUND_SUPPORTED +#define PNG_READ_BGR_SUPPORTED +#define PNG_READ_bKGD_SUPPORTED +#define PNG_READ_cHRM_SUPPORTED +#define PNG_READ_COMPOSITE_NODIV_SUPPORTED +#define PNG_READ_EXPAND_16_SUPPORTED +#define PNG_READ_EXPAND_SUPPORTED +#define PNG_READ_FILLER_SUPPORTED +#define PNG_READ_gAMA_SUPPORTED +#define PNG_READ_GAMMA_SUPPORTED +#define PNG_READ_GRAY_TO_RGB_SUPPORTED +#define PNG_READ_hIST_SUPPORTED +#define PNG_READ_iCCP_SUPPORTED +#define PNG_READ_INTERLACING_SUPPORTED +#define PNG_READ_INT_FUNCTIONS_SUPPORTED +#define PNG_READ_INVERT_ALPHA_SUPPORTED +#define PNG_READ_INVERT_SUPPORTED +#define PNG_READ_iTXt_SUPPORTED +#define PNG_READ_oFFs_SUPPORTED +#define PNG_READ_OPT_PLTE_SUPPORTED +#define PNG_READ_PACK_SUPPORTED +#define PNG_READ_PACKSWAP_SUPPORTED +#define PNG_READ_pCAL_SUPPORTED +#define PNG_READ_pHYs_SUPPORTED +#define PNG_READ_QUANTIZE_SUPPORTED +#define PNG_READ_RGB_TO_GRAY_SUPPORTED +#define PNG_READ_sBIT_SUPPORTED +#define PNG_READ_sCAL_SUPPORTED +#define PNG_READ_SHIFT_SUPPORTED +#define PNG_READ_sPLT_SUPPORTED +#define PNG_READ_sRGB_SUPPORTED +#define PNG_READ_STRIP_ALPHA_SUPPORTED +#define PNG_READ_SUPPORTED +#define PNG_READ_SWAP_ALPHA_SUPPORTED +#define PNG_READ_SWAP_SUPPORTED +#define PNG_READ_tEXt_SUPPORTED +#define PNG_READ_TEXT_SUPPORTED +#define PNG_READ_tIME_SUPPORTED +#define PNG_READ_TRANSFORMS_SUPPORTED +#define PNG_READ_tRNS_SUPPORTED +#define PNG_READ_UNKNOWN_CHUNKS_SUPPORTED +#define PNG_READ_USER_CHUNKS_SUPPORTED +#define PNG_READ_USER_TRANSFORM_SUPPORTED +#define PNG_READ_zTXt_SUPPORTED +#define PNG_SAVE_INT_32_SUPPORTED +#define PNG_sBIT_SUPPORTED +#define PNG_sCAL_SUPPORTED +#define PNG_SEQUENTIAL_READ_SUPPORTED +#define PNG_SET_CHUNK_CACHE_LIMIT_SUPPORTED +#define PNG_SET_CHUNK_MALLOC_LIMIT_SUPPORTED +#define PNG_SETJMP_SUPPORTED +#define PNG_SET_USER_LIMITS_SUPPORTED +#define PNG_sPLT_SUPPORTED +#define PNG_sRGB_SUPPORTED +#define PNG_STDIO_SUPPORTED +#define PNG_tEXt_SUPPORTED +#define PNG_TEXT_SUPPORTED +#define PNG_TIME_RFC1123_SUPPORTED +#define PNG_tIME_SUPPORTED +#define PNG_tRNS_SUPPORTED +#define PNG_UNKNOWN_CHUNKS_SUPPORTED +#define PNG_USER_CHUNKS_SUPPORTED +#define PNG_USER_LIMITS_SUPPORTED +#define PNG_USER_MEM_SUPPORTED +#define PNG_USER_TRANSFORM_INFO_SUPPORTED +#define PNG_USER_TRANSFORM_PTR_SUPPORTED +#define PNG_WARNINGS_SUPPORTED +#define PNG_WRITE_16BIT_SUPPORTED +#define PNG_WRITE_ANCILLARY_CHUNKS_SUPPORTED +#define PNG_WRITE_BGR_SUPPORTED +#define PNG_WRITE_bKGD_SUPPORTED +#define PNG_WRITE_cHRM_SUPPORTED +#define PNG_WRITE_FILLER_SUPPORTED +#define PNG_WRITE_FILTER_SUPPORTED +#define PNG_WRITE_FLUSH_SUPPORTED +#define PNG_WRITE_gAMA_SUPPORTED +#define PNG_WRITE_hIST_SUPPORTED +#define PNG_WRITE_iCCP_SUPPORTED +#define PNG_WRITE_INTERLACING_SUPPORTED +#define PNG_WRITE_INT_FUNCTIONS_SUPPORTED +#define PNG_WRITE_INVERT_ALPHA_SUPPORTED +#define PNG_WRITE_INVERT_SUPPORTED +#define PNG_WRITE_iTXt_SUPPORTED +#define PNG_WRITE_oFFs_SUPPORTED +#define PNG_WRITE_PACK_SUPPORTED +#define PNG_WRITE_PACKSWAP_SUPPORTED +#define PNG_WRITE_pCAL_SUPPORTED +#define PNG_WRITE_pHYs_SUPPORTED +#define PNG_WRITE_sBIT_SUPPORTED +#define PNG_WRITE_sCAL_SUPPORTED +#define PNG_WRITE_SHIFT_SUPPORTED +#define PNG_WRITE_sPLT_SUPPORTED +#define PNG_WRITE_sRGB_SUPPORTED +#define PNG_WRITE_SUPPORTED +#define PNG_WRITE_SWAP_ALPHA_SUPPORTED +#define PNG_WRITE_SWAP_SUPPORTED +#define PNG_WRITE_tEXt_SUPPORTED +#define PNG_WRITE_TEXT_SUPPORTED +#define PNG_WRITE_tIME_SUPPORTED +#define PNG_WRITE_TRANSFORMS_SUPPORTED +#define PNG_WRITE_tRNS_SUPPORTED +#define PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED +#define PNG_WRITE_USER_TRANSFORM_SUPPORTED +#define PNG_WRITE_WEIGHTED_FILTER_SUPPORTED +#define PNG_WRITE_zTXt_SUPPORTED +#define PNG_zTXt_SUPPORTED +/*#undef PNG_ERROR_NUMBERS_SUPPORTED*/ +/*#undef PNG_READ_16_TO_8_ACCURATE_SCALE_SUPPORTED*/ +/* end of options */ +#endif /* PNGLCONF_H */ diff --git a/reactos/include/reactos/libs/libpng/pngpriv.h b/reactos/include/reactos/libs/libpng/pngpriv.h index 19b797c7447..a7e3b527270 100644 --- a/reactos/include/reactos/libs/libpng/pngpriv.h +++ b/reactos/include/reactos/libs/libpng/pngpriv.h @@ -1,12 +1,13 @@ /* pngpriv.h - private declarations for use inside libpng * - * libpng version 1.4.3 - June 26, 2010 * For conditions of distribution and use, see copyright notice in png.h - * Copyright (c) 1998-2010 Glenn Randers-Pehrson + * Copyright (c) 1998-2011 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * + * Last changed in libpng 1.5.2 [March 31, 2011] + * * This code is released under the libpng license. * For conditions of distribution and use, see the disclaimer * and license in png.h @@ -24,25 +25,132 @@ #ifndef PNGPRIV_H #define PNGPRIV_H -#ifndef PNG_VERSION_INFO_ONLY - +/* This is required for the definition of abort(), used as a last ditch + * error handler when all else fails. + */ #include +#define PNGLIB_BUILD +#ifdef PNG_USER_CONFIG +# include "pngusr.h" + /* These should have been defined in pngusr.h */ +# ifndef PNG_USER_PRIVATEBUILD +# define PNG_USER_PRIVATEBUILD "Custom libpng build" +# endif +# ifndef PNG_USER_DLLFNAME_POSTFIX +# define PNG_USER_DLLFNAME_POSTFIX "Cb" +# endif +#endif +#include "png.h" +#include "pnginfo.h" +#include "pngstruct.h" + +/* This is used for 16 bit gamma tables - only the top level pointers are const, + * this could be changed: + */ +typedef PNG_CONST png_uint_16p FAR * png_const_uint_16pp; + +/* Added at libpng-1.2.9 */ +/* Moved to pngpriv.h at libpng-1.5.0 */ + +/* config.h is created by and PNG_CONFIGURE_LIBPNG is set by the "configure" + * script. We may need it here to get the correct configuration on things + * like limits. + */ +#ifdef PNG_CONFIGURE_LIBPNG +# ifdef HAVE_CONFIG_H +# include "config.h" +# endif +#endif + +/* Moved to pngpriv.h at libpng-1.5.0 */ +/* NOTE: some of these may have been used in external applications as + * these definitions were exposed in pngconf.h prior to 1.5. + */ + +/* If you are running on a machine where you cannot allocate more + * than 64K of memory at once, uncomment this. While libpng will not + * normally need that much memory in a chunk (unless you load up a very + * large file), zlib needs to know how big of a chunk it can use, and + * libpng thus makes sure to check any memory allocation to verify it + * will fit into memory. + * + * zlib provides 'MAXSEG_64K' which, if defined, indicates the + * same limit and pngconf.h (already included) sets the limit + * if certain operating systems are detected. + */ +#if defined(MAXSEG_64K) && !defined(PNG_MAX_MALLOC_64K) +# define PNG_MAX_MALLOC_64K +#endif + +#ifndef PNG_UNUSED +/* Unused formal parameter warnings are silenced using the following macro + * which is expected to have no bad effects on performance (optimizing + * compilers will probably remove it entirely). Note that if you replace + * it with something other than whitespace, you must include the terminating + * semicolon. + */ +# define PNG_UNUSED(param) (void)param; +#endif + +/* Just a little check that someone hasn't tried to define something + * contradictory. + */ +#if (PNG_ZBUF_SIZE > 65536L) && defined(PNG_MAX_MALLOC_64K) +# undef PNG_ZBUF_SIZE +# define PNG_ZBUF_SIZE 65536L +#endif + +/* If warnings or errors are turned off the code is disabled + * or redirected here. + */ +#ifndef PNG_WARNINGS_SUPPORTED +# define png_warning(s1,s2) ((void)0) +# define png_chunk_warning(s1,s2) ((void)0) +#endif +#ifndef PNG_ERROR_TEXT_SUPPORTED +# define png_error(s1,s2) png_err(s1) +# define png_chunk_error(s1,s2) png_err(s1) +# define png_fixed_error(s1,s2) png_err(s1) +#endif + +#ifndef PNG_EXTERN /* The functions exported by PNG_EXTERN are internal functions, which * aren't usually used outside the library (as far as I know), so it is * debatable if they should be exported at all. In the future, when it * is possible to have run-time registry of chunk-handling functions, - * some of these will be made available again. -#define PNG_EXTERN extern + * some of these might be made available again. +# define PNG_EXTERN extern */ -#define PNG_EXTERN +# define PNG_EXTERN +#endif + +/* Some fixed point APIs are still required even if not exported because + * they get used by the corresponding floating point APIs. This magic + * deals with this: + */ +#ifdef PNG_FIXED_POINT_SUPPORTED +# define PNGFAPI PNGAPI +#else +# define PNGFAPI /* PRIVATE */ +#endif /* Other defines specific to compilers can go here. Try to keep * them inside an appropriate ifdef/endif pair for portability. */ +#if defined(PNG_FLOATING_POINT_SUPPORTED) ||\ + defined(PNG_FLOATING_ARITHMETIC_SUPPORTED) + /* png.c requires the following ANSI-C constants if the conversion of + * floating point to ASCII is implemented therein: + * + * DBL_DIG Maximum number of decimal digits (can be set to any constant) + * DBL_MIN Smallest normalized fp number (can be set to an arbitrary value) + * DBL_MAX Maximum floating point number (can be set to an arbitrary value) + */ +# include -#ifdef PNG_FLOATING_POINT_SUPPORTED -# ifdef MACOS +# if (defined(__MWERKS__) && defined(macintosh)) || defined(applec) || \ + defined(THINK_C) || defined(__SC__) || defined(TARGET_OS_MAC) /* We need to check that hasn't already been included earlier * as it seems it doesn't agree with , yet we should really use * if possible. @@ -61,11 +169,6 @@ # endif #endif -/* Codewarrior on NT has linking problems without this. */ -#if (defined(__MWERKS__) && defined(WIN32)) || defined(__STDC__) -# define PNG_ALWAYS_EXTERN -#endif - /* This provides the non-ANSI (far) memory allocation routines. */ #if defined(__TURBOC__) && defined(__MSDOS__) # include @@ -75,12 +178,88 @@ #if defined(WIN32) || defined(_Windows) || defined(_WINDOWS) || \ defined(_WIN32) || defined(__WIN32__) # include /* defines _WINDOWS_ macro */ -/* I have no idea why is this necessary... */ -# ifdef _MSC_VER -# include +#endif + +/* Moved here around 1.5.0beta36 from pngconf.h */ +/* Users may want to use these so they are not private. Any library + * functions that are passed far data must be model-independent. + */ + +/* Memory model/platform independent fns */ +#ifndef PNG_ABORT +# ifdef _WINDOWS_ +# define PNG_ABORT() ExitProcess(0) +# else +# define PNG_ABORT() abort() # endif #endif +#ifdef USE_FAR_KEYWORD +/* Use this to make far-to-near assignments */ +# define CHECK 1 +# define NOCHECK 0 +# define CVT_PTR(ptr) (png_far_to_near(png_ptr,ptr,CHECK)) +# define CVT_PTR_NOCHECK(ptr) (png_far_to_near(png_ptr,ptr,NOCHECK)) +# define png_strcpy _fstrcpy +# define png_strncpy _fstrncpy /* Added to v 1.2.6 */ +# define png_strlen _fstrlen +# define png_memcmp _fmemcmp /* SJT: added */ +# define png_memcpy _fmemcpy +# define png_memset _fmemset +# define png_sprintf sprintf +#else +# ifdef _WINDOWS_ /* Favor Windows over C runtime fns */ +# define CVT_PTR(ptr) (ptr) +# define CVT_PTR_NOCHECK(ptr) (ptr) +# define png_strcpy lstrcpyA +# define png_strncpy lstrcpynA +# define png_strlen lstrlenA +# define png_memcmp memcmp +# define png_memcpy CopyMemory +# define png_memset memset +# define png_sprintf wsprintfA +# else +# define CVT_PTR(ptr) (ptr) +# define CVT_PTR_NOCHECK(ptr) (ptr) +# define png_strcpy strcpy +# define png_strncpy strncpy /* Added to v 1.2.6 */ +# define png_strlen strlen +# define png_memcmp memcmp /* SJT: added */ +# define png_memcpy memcpy +# define png_memset memset +# define png_sprintf sprintf +# endif +#endif +/* End of memory model/platform independent support */ + +#ifndef PNG_NO_SNPRINTF +# ifdef _MSC_VER +# define png_snprintf _snprintf /* Added to v 1.2.19 */ +# define png_snprintf2 _snprintf +# define png_snprintf6 _snprintf +# else +# define png_snprintf snprintf /* Added to v 1.2.19 */ +# define png_snprintf2 snprintf +# define png_snprintf6 snprintf +# endif +#else + /* You don't have or don't want to use snprintf(). Caution: Using + * sprintf instead of snprintf exposes your application to accidental + * or malevolent buffer overflows. If you don't have snprintf() + * as a general rule you should provide one (you can get one from + * Portable OpenSSH). + */ +# define png_snprintf(s1,n,fmt,x1) png_sprintf(s1,fmt,x1) +# define png_snprintf2(s1,n,fmt,x1,x2) png_sprintf(s1,fmt,x1,x2) +# define png_snprintf6(s1,n,fmt,x1,x2,x3,x4,x5,x6) \ + png_sprintf(s1,fmt,x1,x2,x3,x4,x5,x6) +#endif +/* End of 1.5.0beta36 move from pngconf.h */ + +/* CONSTANTS and UTILITY MACROS + * These are used internally by libpng and not exposed in the API + */ + /* Various modes of operation. Note that after an init, mode is set to * zero automatically when the structure is created. */ @@ -106,10 +285,10 @@ #define PNG_SHIFT 0x0008 #define PNG_SWAP_BYTES 0x0010 #define PNG_INVERT_MONO 0x0020 -#define PNG_QUANTIZE 0x0040 /* formerly PNG_DITHER */ +#define PNG_QUANTIZE 0x0040 #define PNG_BACKGROUND 0x0080 #define PNG_BACKGROUND_EXPAND 0x0100 - /* 0x0200 unused */ +#define PNG_EXPAND_16 0x0200 /* Added to libpng 1.5.2 */ #define PNG_16_TO_8 0x0400 #define PNG_RGBA 0x0800 #define PNG_EXPAND 0x1000 @@ -138,9 +317,7 @@ #define PNG_STRUCT_INFO 0x0002 /* Scaling factor for filter heuristic weighting calculations */ -#define PNG_WEIGHT_SHIFT 8 #define PNG_WEIGHT_FACTOR (1<<(PNG_WEIGHT_SHIFT)) -#define PNG_COST_SHIFT 3 #define PNG_COST_FACTOR (1<<(PNG_COST_SHIFT)) /* Flags for the png_ptr->flags rather than declaring a byte for each one */ @@ -165,8 +342,8 @@ #define PNG_FLAG_STRIP_ERROR_NUMBERS 0x40000L #define PNG_FLAG_STRIP_ERROR_TEXT 0x80000L #define PNG_FLAG_MALLOC_NULL_MEM_OK 0x100000L -#define PNG_FLAG_ADD_ALPHA 0x200000L /* Added to libpng-1.2.8 */ -#define PNG_FLAG_STRIP_ALPHA 0x400000L /* Added to libpng-1.2.8 */ + /* 0x200000L unused */ + /* 0x400000L unused */ #define PNG_FLAG_BENIGN_ERRORS_WARN 0x800000L /* Added to libpng-1.4.0 */ /* 0x1000000L unused */ /* 0x2000000L unused */ @@ -185,6 +362,18 @@ #define PNG_FLAG_CRC_MASK (PNG_FLAG_CRC_ANCILLARY_MASK | \ PNG_FLAG_CRC_CRITICAL_MASK) +/* zlib.h declares a magic type 'uInt' that limits the amount of data that zlib + * can handle at once. This type need be no larger than 16 bits (so maximum of + * 65535), this define allows us to discover how big it is, but limited by the + * maximuum for png_size_t. The value can be overriden in a library build + * (pngusr.h, or set it in CPPFLAGS) and it works to set it to a considerably + * lower value (e.g. 255 works). A lower value may help memory usage (slightly) + * and may even improve performance on some systems (and degrade it on others.) + */ +#ifndef ZLIB_IO_MAX +# define ZLIB_IO_MAX ((uInt)-1) +#endif + /* Save typing and make code easier to understand */ #define PNG_COLOR_DIST(c1, c2) (abs((int)((c1).red) - (int)((c2).red)) + \ @@ -203,7 +392,46 @@ * integers, "value" a variable. Added to libpng-1.2.6 JB */ #define PNG_OUT_OF_RANGE(value, ideal, delta) \ - ( (value) < (ideal)-(delta) || (value) > (ideal)+(delta) ) + ( (value) < (ideal)-(delta) || (value) > (ideal)+(delta) ) + +/* Conversions between fixed and floating point, only defined if + * required (to make sure the code doesn't accidentally use float + * when it is supposedly disabled.) + */ +#ifdef PNG_FLOATING_POINT_SUPPORTED +/* The floating point conversion can't overflow, though it can and + * does lose accuracy relative to the original fixed point value. + * In practice this doesn't matter because png_fixed_point only + * stores numbers with very low precision. The png_ptr and s + * arguments are unused by default but are there in case error + * checking becomes a requirement. + */ +#define png_float(png_ptr, fixed, s) (.00001 * (fixed)) + +/* The fixed point conversion performs range checking and evaluates + * its argument multiple times, so must be used with care. The + * range checking uses the PNG specification values for a signed + * 32 bit fixed point value except that the values are deliberately + * rounded-to-zero to an integral value - 21474 (21474.83 is roughly + * (2^31-1) * 100000). 's' is a string that describes the value being + * converted. + * + * NOTE: this macro will raise a png_error if the range check fails, + * therefore it is normally only appropriate to use this on values + * that come from API calls or other sources where an out of range + * error indicates a programming error, not a data error! + * + * NOTE: by default this is off - the macro is not used - because the + * function call saves a lot of code. + */ +#ifdef PNG_FIXED_POINT_MACRO_SUPPORTED +#define png_fixed(png_ptr, fp, s) ((fp) <= 21474 && (fp) >= -21474 ?\ + ((png_fixed_point)(100000 * (fp))) : (png_fixed_error(png_ptr, s),0)) +#else +PNG_EXTERN png_fixed_point png_fixed PNGARG((png_structp png_ptr, double fp, + png_const_charp text)); +#endif +#endif /* Constant strings for known chunk types. If you need to add a chunk, * define the name here, and add an invocation of the macro wherever it's @@ -245,70 +473,78 @@ extern "C" { */ /* Allocate memory for an internal libpng struct */ -PNG_EXTERN png_voidp png_create_struct PNGARG((int type)); +PNG_EXTERN PNG_FUNCTION(png_voidp,png_create_struct,PNGARG((int type)), + PNG_ALLOCATED); /* Free memory from internal libpng struct */ PNG_EXTERN void png_destroy_struct PNGARG((png_voidp struct_ptr)); -PNG_EXTERN png_voidp png_create_struct_2 PNGARG((int type, png_malloc_ptr - malloc_fn, png_voidp mem_ptr)); +PNG_EXTERN PNG_FUNCTION(png_voidp,png_create_struct_2, + PNGARG((int type, png_malloc_ptr malloc_fn, png_voidp mem_ptr)), + PNG_ALLOCATED); PNG_EXTERN void png_destroy_struct_2 PNGARG((png_voidp struct_ptr, - png_free_ptr free_fn, png_voidp mem_ptr)); + png_free_ptr free_fn, png_voidp mem_ptr)); /* Free any memory that info_ptr points to and reset struct. */ PNG_EXTERN void png_info_destroy PNGARG((png_structp png_ptr, - png_infop info_ptr)); + png_infop info_ptr)); /* Function to allocate memory for zlib. PNGAPI is disallowed. */ -PNG_EXTERN voidpf png_zalloc PNGARG((voidpf png_ptr, uInt items, uInt size)); +PNG_EXTERN PNG_FUNCTION(voidpf,png_zalloc,PNGARG((voidpf png_ptr, uInt items, + uInt size)),PNG_ALLOCATED); /* Function to free memory for zlib. PNGAPI is disallowed. */ PNG_EXTERN void png_zfree PNGARG((voidpf png_ptr, voidpf ptr)); -/* Next four functions are used internally as callbacks. PNGAPI is required - * but not PNG_EXPORT. PNGAPI added at libpng version 1.2.3. */ +/* Next four functions are used internally as callbacks. PNGCBAPI is required + * but not PNG_EXPORT. PNGAPI added at libpng version 1.2.3, changed to + * PNGCBAPI at 1.5.0 + */ -PNG_EXTERN void PNGAPI png_default_read_data PNGARG((png_structp png_ptr, - png_bytep data, png_size_t length)); +PNG_EXTERN void PNGCBAPI png_default_read_data PNGARG((png_structp png_ptr, + png_bytep data, png_size_t length)); #ifdef PNG_PROGRESSIVE_READ_SUPPORTED -PNG_EXTERN void PNGAPI png_push_fill_buffer PNGARG((png_structp png_ptr, - png_bytep buffer, png_size_t length)); +PNG_EXTERN void PNGCBAPI png_push_fill_buffer PNGARG((png_structp png_ptr, + png_bytep buffer, png_size_t length)); #endif -PNG_EXTERN void PNGAPI png_default_write_data PNGARG((png_structp png_ptr, - png_bytep data, png_size_t length)); +PNG_EXTERN void PNGCBAPI png_default_write_data PNGARG((png_structp png_ptr, + png_bytep data, png_size_t length)); #ifdef PNG_WRITE_FLUSH_SUPPORTED -#ifdef PNG_STDIO_SUPPORTED -PNG_EXTERN void PNGAPI png_default_flush PNGARG((png_structp png_ptr)); -#endif +# ifdef PNG_STDIO_SUPPORTED +PNG_EXTERN void PNGCBAPI png_default_flush PNGARG((png_structp png_ptr)); +# endif #endif /* Reset the CRC variable */ PNG_EXTERN void png_reset_crc PNGARG((png_structp png_ptr)); /* Write the "data" buffer to whatever output you are using */ -PNG_EXTERN void png_write_data PNGARG((png_structp png_ptr, png_bytep data, - png_size_t length)); +PNG_EXTERN void png_write_data PNGARG((png_structp png_ptr, + png_const_bytep data, png_size_t length)); + +/* Read and check the PNG file signature */ +PNG_EXTERN void png_read_sig PNGARG((png_structp png_ptr, png_infop info_ptr)); /* Read the chunk header (length + type name) */ PNG_EXTERN png_uint_32 png_read_chunk_header PNGARG((png_structp png_ptr)); /* Read data from whatever input you are using into the "data" buffer */ PNG_EXTERN void png_read_data PNGARG((png_structp png_ptr, png_bytep data, - png_size_t length)); + png_size_t length)); /* Read bytes into buf, and update png_ptr->crc */ PNG_EXTERN void png_crc_read PNGARG((png_structp png_ptr, png_bytep buf, - png_size_t length)); + png_size_t length)); /* Decompress data in a chunk that uses compression */ #if defined(PNG_zTXt_SUPPORTED) || defined(PNG_iTXt_SUPPORTED) || \ defined(PNG_iCCP_SUPPORTED) || defined(PNG_sPLT_SUPPORTED) PNG_EXTERN void png_decompress_chunk PNGARG((png_structp png_ptr, - int comp_type, png_size_t chunklength, png_size_t prefix_length, - png_size_t *data_length)); + int comp_type, png_size_t chunklength, png_size_t prefix_length, + png_size_t *data_length)); #endif /* Read "skip" bytes, read the file crc, and (optionally) verify png_ptr->crc */ @@ -321,8 +557,8 @@ PNG_EXTERN int png_crc_error PNGARG((png_structp png_ptr)); * passing a maximum of 64K on systems that have this as a memory limit, * since this is the maximum buffer size we can specify. */ -PNG_EXTERN void png_calculate_crc PNGARG((png_structp png_ptr, png_bytep ptr, - png_size_t length)); +PNG_EXTERN void png_calculate_crc PNGARG((png_structp png_ptr, + png_const_bytep ptr, png_size_t length)); #ifdef PNG_WRITE_FLUSH_SUPPORTED PNG_EXTERN void png_flush PNGARG((png_structp png_ptr)); @@ -334,138 +570,132 @@ PNG_EXTERN void png_flush PNGARG((png_structp png_ptr)); * information. */ PNG_EXTERN void png_write_IHDR PNGARG((png_structp png_ptr, png_uint_32 width, - png_uint_32 height, - int bit_depth, int color_type, int compression_method, int filter_method, - int interlace_method)); + png_uint_32 height, + int bit_depth, int color_type, int compression_method, int filter_method, + int interlace_method)); -PNG_EXTERN void png_write_PLTE PNGARG((png_structp png_ptr, png_colorp palette, - png_uint_32 num_pal)); +PNG_EXTERN void png_write_PLTE PNGARG((png_structp png_ptr, + png_const_colorp palette, png_uint_32 num_pal)); PNG_EXTERN void png_write_IDAT PNGARG((png_structp png_ptr, png_bytep data, - png_size_t length)); + png_size_t length)); PNG_EXTERN void png_write_IEND PNGARG((png_structp png_ptr)); #ifdef PNG_WRITE_gAMA_SUPPORTED -#ifdef PNG_FLOATING_POINT_SUPPORTED +# ifdef PNG_FLOATING_POINT_SUPPORTED PNG_EXTERN void png_write_gAMA PNGARG((png_structp png_ptr, double file_gamma)); -#endif -#ifdef PNG_FIXED_POINT_SUPPORTED +# endif +# ifdef PNG_FIXED_POINT_SUPPORTED PNG_EXTERN void png_write_gAMA_fixed PNGARG((png_structp png_ptr, png_fixed_point file_gamma)); -#endif +# endif #endif #ifdef PNG_WRITE_sBIT_SUPPORTED -PNG_EXTERN void png_write_sBIT PNGARG((png_structp png_ptr, png_color_8p sbit, - int color_type)); +PNG_EXTERN void png_write_sBIT PNGARG((png_structp png_ptr, + png_const_color_8p sbit, int color_type)); #endif #ifdef PNG_WRITE_cHRM_SUPPORTED -#ifdef PNG_FLOATING_POINT_SUPPORTED +# ifdef PNG_FLOATING_POINT_SUPPORTED PNG_EXTERN void png_write_cHRM PNGARG((png_structp png_ptr, - double white_x, double white_y, - double red_x, double red_y, double green_x, double green_y, - double blue_x, double blue_y)); -#endif + double white_x, double white_y, + double red_x, double red_y, double green_x, double green_y, + double blue_x, double blue_y)); +# endif PNG_EXTERN void png_write_cHRM_fixed PNGARG((png_structp png_ptr, - png_fixed_point int_white_x, png_fixed_point int_white_y, - png_fixed_point int_red_x, png_fixed_point int_red_y, png_fixed_point - int_green_x, png_fixed_point int_green_y, png_fixed_point int_blue_x, - png_fixed_point int_blue_y)); + png_fixed_point int_white_x, png_fixed_point int_white_y, + png_fixed_point int_red_x, png_fixed_point int_red_y, png_fixed_point + int_green_x, png_fixed_point int_green_y, png_fixed_point int_blue_x, + png_fixed_point int_blue_y)); #endif #ifdef PNG_WRITE_sRGB_SUPPORTED PNG_EXTERN void png_write_sRGB PNGARG((png_structp png_ptr, - int intent)); + int intent)); #endif #ifdef PNG_WRITE_iCCP_SUPPORTED PNG_EXTERN void png_write_iCCP PNGARG((png_structp png_ptr, - png_charp name, int compression_type, - png_charp profile, int proflen)); + png_const_charp name, int compression_type, + png_const_charp profile, int proflen)); /* Note to maintainer: profile should be png_bytep */ #endif #ifdef PNG_WRITE_sPLT_SUPPORTED PNG_EXTERN void png_write_sPLT PNGARG((png_structp png_ptr, - png_sPLT_tp palette)); + png_const_sPLT_tp palette)); #endif #ifdef PNG_WRITE_tRNS_SUPPORTED -PNG_EXTERN void png_write_tRNS PNGARG((png_structp png_ptr, png_bytep trans, - png_color_16p values, int number, int color_type)); +PNG_EXTERN void png_write_tRNS PNGARG((png_structp png_ptr, + png_const_bytep trans, png_const_color_16p values, int number, + int color_type)); #endif #ifdef PNG_WRITE_bKGD_SUPPORTED PNG_EXTERN void png_write_bKGD PNGARG((png_structp png_ptr, - png_color_16p values, int color_type)); + png_const_color_16p values, int color_type)); #endif #ifdef PNG_WRITE_hIST_SUPPORTED -PNG_EXTERN void png_write_hIST PNGARG((png_structp png_ptr, png_uint_16p hist, - int num_hist)); +PNG_EXTERN void png_write_hIST PNGARG((png_structp png_ptr, + png_const_uint_16p hist, int num_hist)); #endif #if defined(PNG_WRITE_TEXT_SUPPORTED) || defined(PNG_WRITE_pCAL_SUPPORTED) || \ defined(PNG_WRITE_iCCP_SUPPORTED) || defined(PNG_WRITE_sPLT_SUPPORTED) PNG_EXTERN png_size_t png_check_keyword PNGARG((png_structp png_ptr, - png_charp key, png_charpp new_key)); + png_const_charp key, png_charpp new_key)); #endif #ifdef PNG_WRITE_tEXt_SUPPORTED -PNG_EXTERN void png_write_tEXt PNGARG((png_structp png_ptr, png_charp key, - png_charp text, png_size_t text_len)); +PNG_EXTERN void png_write_tEXt PNGARG((png_structp png_ptr, png_const_charp key, + png_const_charp text, png_size_t text_len)); #endif #ifdef PNG_WRITE_zTXt_SUPPORTED -PNG_EXTERN void png_write_zTXt PNGARG((png_structp png_ptr, png_charp key, - png_charp text, png_size_t text_len, int compression)); +PNG_EXTERN void png_write_zTXt PNGARG((png_structp png_ptr, png_const_charp key, + png_const_charp text, png_size_t text_len, int compression)); #endif #ifdef PNG_WRITE_iTXt_SUPPORTED PNG_EXTERN void png_write_iTXt PNGARG((png_structp png_ptr, - int compression, png_charp key, png_charp lang, png_charp lang_key, - png_charp text)); + int compression, png_const_charp key, png_const_charp lang, + png_const_charp lang_key, png_const_charp text)); #endif #ifdef PNG_TEXT_SUPPORTED /* Added at version 1.0.14 and 1.2.4 */ PNG_EXTERN int png_set_text_2 PNGARG((png_structp png_ptr, - png_infop info_ptr, png_textp text_ptr, int num_text)); + png_infop info_ptr, png_const_textp text_ptr, int num_text)); #endif #ifdef PNG_WRITE_oFFs_SUPPORTED PNG_EXTERN void png_write_oFFs PNGARG((png_structp png_ptr, - png_int_32 x_offset, png_int_32 y_offset, int unit_type)); + png_int_32 x_offset, png_int_32 y_offset, int unit_type)); #endif #ifdef PNG_WRITE_pCAL_SUPPORTED PNG_EXTERN void png_write_pCAL PNGARG((png_structp png_ptr, png_charp purpose, - png_int_32 X0, png_int_32 X1, int type, int nparams, - png_charp units, png_charpp params)); + png_int_32 X0, png_int_32 X1, int type, int nparams, + png_const_charp units, png_charpp params)); #endif #ifdef PNG_WRITE_pHYs_SUPPORTED PNG_EXTERN void png_write_pHYs PNGARG((png_structp png_ptr, - png_uint_32 x_pixels_per_unit, png_uint_32 y_pixels_per_unit, - int unit_type)); + png_uint_32 x_pixels_per_unit, png_uint_32 y_pixels_per_unit, + int unit_type)); #endif #ifdef PNG_WRITE_tIME_SUPPORTED PNG_EXTERN void png_write_tIME PNGARG((png_structp png_ptr, - png_timep mod_time)); + png_const_timep mod_time)); #endif #ifdef PNG_WRITE_sCAL_SUPPORTED -#if defined(PNG_FLOATING_POINT_SUPPORTED) && defined(PNG_STDIO_SUPPORTED) -PNG_EXTERN void png_write_sCAL PNGARG((png_structp png_ptr, - int unit, double width, double height)); -#else -#ifdef PNG_FIXED_POINT_SUPPORTED PNG_EXTERN void png_write_sCAL_s PNGARG((png_structp png_ptr, - int unit, png_charp width, png_charp height)); -#endif -#endif + int unit, png_const_charp width, png_const_charp height)); #endif /* Called when finished processing a row of data */ @@ -474,20 +704,15 @@ PNG_EXTERN void png_write_finish_row PNGARG((png_structp png_ptr)); /* Internal use only. Called before first row of data */ PNG_EXTERN void png_write_start_row PNGARG((png_structp png_ptr)); -#ifdef PNG_READ_GAMMA_SUPPORTED -PNG_EXTERN void png_build_gamma_table PNGARG((png_structp png_ptr, - png_byte bit_depth)); -#endif - /* Combine a row of data, dealing with alpha, etc. if requested */ PNG_EXTERN void png_combine_row PNGARG((png_structp png_ptr, png_bytep row, - int mask)); + int mask)); #ifdef PNG_READ_INTERLACING_SUPPORTED /* Expand an interlaced row */ /* OLD pre-1.0.9 interface: PNG_EXTERN void png_do_read_interlace PNGARG((png_row_infop row_info, - png_bytep row, int pass, png_uint_32 transformations)); + png_bytep row, int pass, png_uint_32 transformations)); */ PNG_EXTERN void png_do_read_interlace PNGARG((png_structp png_ptr)); #endif @@ -497,20 +722,21 @@ PNG_EXTERN void png_do_read_interlace PNGARG((png_structp png_ptr)); #ifdef PNG_WRITE_INTERLACING_SUPPORTED /* Grab pixels out of a row for an interlaced pass */ PNG_EXTERN void png_do_write_interlace PNGARG((png_row_infop row_info, - png_bytep row, int pass)); + png_bytep row, int pass)); #endif /* Unfilter a row */ PNG_EXTERN void png_read_filter_row PNGARG((png_structp png_ptr, - png_row_infop row_info, png_bytep row, png_bytep prev_row, int filter)); + png_row_infop row_info, png_bytep row, png_const_bytep prev_row, + int filter)); /* Choose the best filter to use and filter the row data */ PNG_EXTERN void png_write_find_filter PNGARG((png_structp png_ptr, - png_row_infop row_info)); + png_row_infop row_info)); /* Write out the filtered row. */ PNG_EXTERN void png_write_filtered_row PNGARG((png_structp png_ptr, - png_bytep filtered_row)); + png_bytep filtered_row)); /* Finish a row while reading, dealing with interlacing passes, etc. */ PNG_EXTERN void png_read_finish_row PNGARG((png_structp png_ptr)); @@ -518,88 +744,97 @@ PNG_EXTERN void png_read_finish_row PNGARG((png_structp png_ptr)); PNG_EXTERN void png_read_start_row PNGARG((png_structp png_ptr)); /* Optional call to update the users info structure */ PNG_EXTERN void png_read_transform_info PNGARG((png_structp png_ptr, - png_infop info_ptr)); + png_infop info_ptr)); /* These are the functions that do the transformations */ #ifdef PNG_READ_FILLER_SUPPORTED PNG_EXTERN void png_do_read_filler PNGARG((png_row_infop row_info, - png_bytep row, png_uint_32 filler, png_uint_32 flags)); + png_bytep row, png_uint_32 filler, png_uint_32 flags)); #endif #ifdef PNG_READ_SWAP_ALPHA_SUPPORTED PNG_EXTERN void png_do_read_swap_alpha PNGARG((png_row_infop row_info, - png_bytep row)); + png_bytep row)); #endif #ifdef PNG_WRITE_SWAP_ALPHA_SUPPORTED PNG_EXTERN void png_do_write_swap_alpha PNGARG((png_row_infop row_info, - png_bytep row)); + png_bytep row)); #endif #ifdef PNG_READ_INVERT_ALPHA_SUPPORTED PNG_EXTERN void png_do_read_invert_alpha PNGARG((png_row_infop row_info, - png_bytep row)); + png_bytep row)); #endif #ifdef PNG_WRITE_INVERT_ALPHA_SUPPORTED PNG_EXTERN void png_do_write_invert_alpha PNGARG((png_row_infop row_info, - png_bytep row)); + png_bytep row)); #endif #if defined(PNG_WRITE_FILLER_SUPPORTED) || \ defined(PNG_READ_STRIP_ALPHA_SUPPORTED) -PNG_EXTERN void png_do_strip_filler PNGARG((png_row_infop row_info, - png_bytep row, png_uint_32 flags)); +PNG_EXTERN void png_do_strip_channel PNGARG((png_row_infop row_info, + png_bytep row, int at_start)); #endif +#ifdef PNG_16BIT_SUPPORTED #if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED) -PNG_EXTERN void png_do_swap PNGARG((png_row_infop row_info, png_bytep row)); +PNG_EXTERN void png_do_swap PNGARG((png_row_infop row_info, + png_bytep row)); +#endif #endif #if defined(PNG_READ_PACKSWAP_SUPPORTED) || \ defined(PNG_WRITE_PACKSWAP_SUPPORTED) -PNG_EXTERN void png_do_packswap PNGARG((png_row_infop row_info, png_bytep row)); +PNG_EXTERN void png_do_packswap PNGARG((png_row_infop row_info, + png_bytep row)); #endif #ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED -PNG_EXTERN int png_do_rgb_to_gray PNGARG((png_structp png_ptr, png_row_infop - row_info, png_bytep row)); +PNG_EXTERN int png_do_rgb_to_gray PNGARG((png_structp png_ptr, + png_row_infop row_info, png_bytep row)); #endif #ifdef PNG_READ_GRAY_TO_RGB_SUPPORTED PNG_EXTERN void png_do_gray_to_rgb PNGARG((png_row_infop row_info, - png_bytep row)); + png_bytep row)); #endif #ifdef PNG_READ_PACK_SUPPORTED -PNG_EXTERN void png_do_unpack PNGARG((png_row_infop row_info, png_bytep row)); +PNG_EXTERN void png_do_unpack PNGARG((png_row_infop row_info, + png_bytep row)); #endif #ifdef PNG_READ_SHIFT_SUPPORTED -PNG_EXTERN void png_do_unshift PNGARG((png_row_infop row_info, png_bytep row, - png_color_8p sig_bits)); +PNG_EXTERN void png_do_unshift PNGARG((png_row_infop row_info, + png_bytep row, png_const_color_8p sig_bits)); #endif #if defined(PNG_READ_INVERT_SUPPORTED) || defined(PNG_WRITE_INVERT_SUPPORTED) -PNG_EXTERN void png_do_invert PNGARG((png_row_infop row_info, png_bytep row)); +PNG_EXTERN void png_do_invert PNGARG((png_row_infop row_info, + png_bytep row)); #endif #ifdef PNG_READ_16_TO_8_SUPPORTED -PNG_EXTERN void png_do_chop PNGARG((png_row_infop row_info, png_bytep row)); +PNG_EXTERN void png_do_chop PNGARG((png_row_infop row_info, + png_bytep row)); #endif #ifdef PNG_READ_QUANTIZE_SUPPORTED PNG_EXTERN void png_do_quantize PNGARG((png_row_infop row_info, - png_bytep row, png_bytep palette_lookup, png_bytep quantize_lookup)); + png_bytep row, png_const_bytep palette_lookup, + png_const_bytep quantize_lookup)); # ifdef PNG_CORRECT_PALETTE_SUPPORTED PNG_EXTERN void png_correct_palette PNGARG((png_structp png_ptr, - png_colorp palette, int num_palette)); + png_colorp palette, int num_palette)); # endif #endif #if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED) -PNG_EXTERN void png_do_bgr PNGARG((png_row_infop row_info, png_bytep row)); +PNG_EXTERN void png_do_bgr PNGARG((png_row_infop row_info, + png_bytep row)); #endif #ifdef PNG_WRITE_PACK_SUPPORTED @@ -608,35 +843,43 @@ PNG_EXTERN void png_do_pack PNGARG((png_row_infop row_info, #endif #ifdef PNG_WRITE_SHIFT_SUPPORTED -PNG_EXTERN void png_do_shift PNGARG((png_row_infop row_info, png_bytep row, - png_color_8p bit_depth)); +PNG_EXTERN void png_do_shift PNGARG((png_row_infop row_info, + png_bytep row, png_const_color_8p bit_depth)); #endif #ifdef PNG_READ_BACKGROUND_SUPPORTED -#ifdef PNG_READ_GAMMA_SUPPORTED -PNG_EXTERN void png_do_background PNGARG((png_row_infop row_info, png_bytep row, - png_color_16p trans_color, png_color_16p background, - png_color_16p background_1, - png_bytep gamma_table, png_bytep gamma_from_1, png_bytep gamma_to_1, - png_uint_16pp gamma_16, png_uint_16pp gamma_16_from_1, - png_uint_16pp gamma_16_to_1, int gamma_shift)); -#else -PNG_EXTERN void png_do_background PNGARG((png_row_infop row_info, png_bytep row, - png_color_16p trans_color, png_color_16p background)); -#endif +# ifdef PNG_READ_GAMMA_SUPPORTED +PNG_EXTERN void png_do_background PNGARG((png_row_infop row_info, + png_bytep row, png_const_color_16p trans_color, + png_const_color_16p background, png_const_color_16p background_1, + png_const_bytep gamma_table, png_const_bytep gamma_from_1, + png_const_bytep gamma_to_1, png_const_uint_16pp gamma_16, + png_const_uint_16pp gamma_16_from_1, png_const_uint_16pp gamma_16_to_1, + int gamma_shift)); +# else +PNG_EXTERN void png_do_background PNGARG((png_row_infop row_info, + png_bytep row, png_const_color_16p trans_color, + png_const_color_16p background)); +# endif #endif #ifdef PNG_READ_GAMMA_SUPPORTED -PNG_EXTERN void png_do_gamma PNGARG((png_row_infop row_info, png_bytep row, - png_bytep gamma_table, png_uint_16pp gamma_16_table, - int gamma_shift)); +PNG_EXTERN void png_do_gamma PNGARG((png_row_infop row_info, + png_bytep row, png_const_bytep gamma_table, + png_const_uint_16pp gamma_16_table, int gamma_shift)); #endif #ifdef PNG_READ_EXPAND_SUPPORTED PNG_EXTERN void png_do_expand_palette PNGARG((png_row_infop row_info, - png_bytep row, png_colorp palette, png_bytep trans, int num_trans)); + png_bytep row, png_const_colorp palette, png_const_bytep trans, + int num_trans)); PNG_EXTERN void png_do_expand PNGARG((png_row_infop row_info, - png_bytep row, png_color_16p trans_value)); + png_bytep row, png_const_color_16p trans_color)); +#endif + +#ifdef PNG_READ_EXPAND_16_SUPPORTED +PNG_EXTERN void png_do_expand_16 PNGARG((png_row_infop row_info, + png_bytep row)); #endif /* The following decodes the appropriate chunks, and does error correction, @@ -645,102 +888,102 @@ PNG_EXTERN void png_do_expand PNGARG((png_row_infop row_info, /* Decode the IHDR chunk */ PNG_EXTERN void png_handle_IHDR PNGARG((png_structp png_ptr, png_infop info_ptr, - png_uint_32 length)); + png_uint_32 length)); PNG_EXTERN void png_handle_PLTE PNGARG((png_structp png_ptr, png_infop info_ptr, - png_uint_32 length)); + png_uint_32 length)); PNG_EXTERN void png_handle_IEND PNGARG((png_structp png_ptr, png_infop info_ptr, - png_uint_32 length)); + png_uint_32 length)); #ifdef PNG_READ_bKGD_SUPPORTED PNG_EXTERN void png_handle_bKGD PNGARG((png_structp png_ptr, png_infop info_ptr, - png_uint_32 length)); + png_uint_32 length)); #endif #ifdef PNG_READ_cHRM_SUPPORTED PNG_EXTERN void png_handle_cHRM PNGARG((png_structp png_ptr, png_infop info_ptr, - png_uint_32 length)); + png_uint_32 length)); #endif #ifdef PNG_READ_gAMA_SUPPORTED PNG_EXTERN void png_handle_gAMA PNGARG((png_structp png_ptr, png_infop info_ptr, - png_uint_32 length)); + png_uint_32 length)); #endif #ifdef PNG_READ_hIST_SUPPORTED PNG_EXTERN void png_handle_hIST PNGARG((png_structp png_ptr, png_infop info_ptr, - png_uint_32 length)); + png_uint_32 length)); #endif #ifdef PNG_READ_iCCP_SUPPORTED -extern void png_handle_iCCP PNGARG((png_structp png_ptr, png_infop info_ptr, - png_uint_32 length)); +PNG_EXTERN void png_handle_iCCP PNGARG((png_structp png_ptr, png_infop info_ptr, + png_uint_32 length)); #endif /* PNG_READ_iCCP_SUPPORTED */ #ifdef PNG_READ_iTXt_SUPPORTED PNG_EXTERN void png_handle_iTXt PNGARG((png_structp png_ptr, png_infop info_ptr, - png_uint_32 length)); + png_uint_32 length)); #endif #ifdef PNG_READ_oFFs_SUPPORTED PNG_EXTERN void png_handle_oFFs PNGARG((png_structp png_ptr, png_infop info_ptr, - png_uint_32 length)); + png_uint_32 length)); #endif #ifdef PNG_READ_pCAL_SUPPORTED PNG_EXTERN void png_handle_pCAL PNGARG((png_structp png_ptr, png_infop info_ptr, - png_uint_32 length)); + png_uint_32 length)); #endif #ifdef PNG_READ_pHYs_SUPPORTED PNG_EXTERN void png_handle_pHYs PNGARG((png_structp png_ptr, png_infop info_ptr, - png_uint_32 length)); + png_uint_32 length)); #endif #ifdef PNG_READ_sBIT_SUPPORTED PNG_EXTERN void png_handle_sBIT PNGARG((png_structp png_ptr, png_infop info_ptr, - png_uint_32 length)); + png_uint_32 length)); #endif #ifdef PNG_READ_sCAL_SUPPORTED PNG_EXTERN void png_handle_sCAL PNGARG((png_structp png_ptr, png_infop info_ptr, - png_uint_32 length)); + png_uint_32 length)); #endif #ifdef PNG_READ_sPLT_SUPPORTED -extern void png_handle_sPLT PNGARG((png_structp png_ptr, png_infop info_ptr, - png_uint_32 length)); +PNG_EXTERN void png_handle_sPLT PNGARG((png_structp png_ptr, png_infop info_ptr, + png_uint_32 length)); #endif /* PNG_READ_sPLT_SUPPORTED */ #ifdef PNG_READ_sRGB_SUPPORTED PNG_EXTERN void png_handle_sRGB PNGARG((png_structp png_ptr, png_infop info_ptr, - png_uint_32 length)); + png_uint_32 length)); #endif #ifdef PNG_READ_tEXt_SUPPORTED PNG_EXTERN void png_handle_tEXt PNGARG((png_structp png_ptr, png_infop info_ptr, - png_uint_32 length)); + png_uint_32 length)); #endif #ifdef PNG_READ_tIME_SUPPORTED PNG_EXTERN void png_handle_tIME PNGARG((png_structp png_ptr, png_infop info_ptr, - png_uint_32 length)); + png_uint_32 length)); #endif #ifdef PNG_READ_tRNS_SUPPORTED PNG_EXTERN void png_handle_tRNS PNGARG((png_structp png_ptr, png_infop info_ptr, - png_uint_32 length)); + png_uint_32 length)); #endif #ifdef PNG_READ_zTXt_SUPPORTED PNG_EXTERN void png_handle_zTXt PNGARG((png_structp png_ptr, png_infop info_ptr, - png_uint_32 length)); + png_uint_32 length)); #endif PNG_EXTERN void png_handle_unknown PNGARG((png_structp png_ptr, - png_infop info_ptr, png_uint_32 length)); + png_infop info_ptr, png_uint_32 length)); PNG_EXTERN void png_check_chunk_name PNGARG((png_structp png_ptr, - png_bytep chunk_name)); + png_const_bytep chunk_name)); /* Handle the transformations for reading and writing */ PNG_EXTERN void png_do_read_transformations PNGARG((png_structp png_ptr)); @@ -750,19 +993,19 @@ PNG_EXTERN void png_init_read_transformations PNGARG((png_structp png_ptr)); #ifdef PNG_PROGRESSIVE_READ_SUPPORTED PNG_EXTERN void png_push_read_chunk PNGARG((png_structp png_ptr, - png_infop info_ptr)); + png_infop info_ptr)); PNG_EXTERN void png_push_read_sig PNGARG((png_structp png_ptr, - png_infop info_ptr)); + png_infop info_ptr)); PNG_EXTERN void png_push_check_crc PNGARG((png_structp png_ptr)); PNG_EXTERN void png_push_crc_skip PNGARG((png_structp png_ptr, - png_uint_32 length)); + png_uint_32 length)); PNG_EXTERN void png_push_crc_finish PNGARG((png_structp png_ptr)); PNG_EXTERN void png_push_save_buffer PNGARG((png_structp png_ptr)); PNG_EXTERN void png_push_restore_buffer PNGARG((png_structp png_ptr, - png_bytep buffer, png_size_t buffer_length)); + png_bytep buffer, png_size_t buffer_length)); PNG_EXTERN void png_push_read_IDAT PNGARG((png_structp png_ptr)); PNG_EXTERN void png_process_IDAT_data PNGARG((png_structp png_ptr, - png_bytep buffer, png_size_t buffer_length)); + png_bytep buffer, png_size_t buffer_length)); PNG_EXTERN void png_push_process_row PNGARG((png_structp png_ptr)); PNG_EXTERN void png_push_handle_unknown PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); @@ -772,185 +1015,232 @@ PNG_EXTERN void png_push_have_end PNGARG((png_structp png_ptr, png_infop info_ptr)); PNG_EXTERN void png_push_have_row PNGARG((png_structp png_ptr, png_bytep row)); PNG_EXTERN void png_push_read_end PNGARG((png_structp png_ptr, - png_infop info_ptr)); + png_infop info_ptr)); PNG_EXTERN void png_process_some_data PNGARG((png_structp png_ptr, - png_infop info_ptr)); + png_infop info_ptr)); PNG_EXTERN void png_read_push_finish_row PNGARG((png_structp png_ptr)); -#ifdef PNG_READ_tEXt_SUPPORTED +# ifdef PNG_READ_tEXt_SUPPORTED PNG_EXTERN void png_push_handle_tEXt PNGARG((png_structp png_ptr, - png_infop info_ptr, png_uint_32 length)); + png_infop info_ptr, png_uint_32 length)); PNG_EXTERN void png_push_read_tEXt PNGARG((png_structp png_ptr, - png_infop info_ptr)); -#endif -#ifdef PNG_READ_zTXt_SUPPORTED + png_infop info_ptr)); +# endif +# ifdef PNG_READ_zTXt_SUPPORTED PNG_EXTERN void png_push_handle_zTXt PNGARG((png_structp png_ptr, - png_infop info_ptr, png_uint_32 length)); + png_infop info_ptr, png_uint_32 length)); PNG_EXTERN void png_push_read_zTXt PNGARG((png_structp png_ptr, - png_infop info_ptr)); -#endif -#ifdef PNG_READ_iTXt_SUPPORTED + png_infop info_ptr)); +# endif +# ifdef PNG_READ_iTXt_SUPPORTED PNG_EXTERN void png_push_handle_iTXt PNGARG((png_structp png_ptr, - png_infop info_ptr, png_uint_32 length)); + png_infop info_ptr, png_uint_32 length)); PNG_EXTERN void png_push_read_iTXt PNGARG((png_structp png_ptr, - png_infop info_ptr)); -#endif + png_infop info_ptr)); +# endif #endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ #ifdef PNG_MNG_FEATURES_SUPPORTED PNG_EXTERN void png_do_read_intrapixel PNGARG((png_row_infop row_info, - png_bytep row)); + png_bytep row)); PNG_EXTERN void png_do_write_intrapixel PNGARG((png_row_infop row_info, - png_bytep row)); + png_bytep row)); #endif /* Added at libpng version 1.4.0 */ -#ifdef PNG_cHRM_SUPPORTED +#ifdef PNG_CHECK_cHRM_SUPPORTED PNG_EXTERN int png_check_cHRM_fixed PNGARG((png_structp png_ptr, - png_fixed_point int_white_x, png_fixed_point int_white_y, - png_fixed_point int_red_x, png_fixed_point int_red_y, png_fixed_point - int_green_x, png_fixed_point int_green_y, png_fixed_point int_blue_x, - png_fixed_point int_blue_y)); + png_fixed_point int_white_x, png_fixed_point int_white_y, + png_fixed_point int_red_x, png_fixed_point int_red_y, png_fixed_point + int_green_x, png_fixed_point int_green_y, png_fixed_point int_blue_x, + png_fixed_point int_blue_y)); #endif -#ifdef PNG_cHRM_SUPPORTED #ifdef PNG_CHECK_cHRM_SUPPORTED /* Added at libpng version 1.2.34 and 1.4.0 */ +/* Currently only used by png_check_cHRM_fixed */ PNG_EXTERN void png_64bit_product PNGARG((long v1, long v2, - unsigned long *hi_product, unsigned long *lo_product)); -#endif + unsigned long *hi_product, unsigned long *lo_product)); #endif /* Added at libpng version 1.4.0 */ PNG_EXTERN void png_check_IHDR PNGARG((png_structp png_ptr, - png_uint_32 width, png_uint_32 height, int bit_depth, - int color_type, int interlace_type, int compression_type, - int filter_type)); + png_uint_32 width, png_uint_32 height, int bit_depth, + int color_type, int interlace_type, int compression_type, + int filter_type)); /* Free all memory used by the read (old method - NOT DLL EXPORTED) */ -extern void png_read_destroy PNGARG((png_structp png_ptr, png_infop info_ptr, - png_infop end_info_ptr)); +PNG_EXTERN void png_read_destroy PNGARG((png_structp png_ptr, + png_infop info_ptr, png_infop end_info_ptr)); /* Free any memory used in png_ptr struct (old method - NOT DLL EXPORTED) */ -extern void png_write_destroy PNGARG((png_structp png_ptr)); +PNG_EXTERN void png_write_destroy PNGARG((png_structp png_ptr)); #ifdef USE_FAR_KEYWORD /* memory model conversion function */ -extern void *png_far_to_near PNGARG((png_structp png_ptr,png_voidp ptr, - int check)); +PNG_EXTERN void *png_far_to_near PNGARG((png_structp png_ptr, png_voidp ptr, + int check)); #endif /* USE_FAR_KEYWORD */ -/* Define PNG_DEBUG at compile time for debugging information. Higher - * numbers for PNG_DEBUG mean more debugging information. This has - * only been added since version 0.95 so it is not implemented throughout - * libpng yet, but more support will be added as needed. - */ -#ifdef PNG_DEBUG -#if (PNG_DEBUG > 0) -#if !defined(PNG_DEBUG_FILE) && defined(_MSC_VER) -#include -#if (PNG_DEBUG > 1) -#ifndef _DEBUG -# define _DEBUG +#if defined(PNG_FLOATING_POINT_SUPPORTED) && defined(PNG_ERROR_TEXT_SUPPORTED) +PNG_EXTERN PNG_FUNCTION(void, png_fixed_error, (png_structp png_ptr, + png_const_charp name),PNG_NORETURN); #endif -#ifndef png_debug -#define png_debug(l,m) _RPT0(_CRT_WARN,m PNG_STRING_NEWLINE) -#endif -#ifndef png_debug1 -#define png_debug1(l,m,p1) _RPT1(_CRT_WARN,m PNG_STRING_NEWLINE,p1) -#endif -#ifndef png_debug2 -#define png_debug2(l,m,p1,p2) _RPT2(_CRT_WARN,m PNG_STRING_NEWLINE,p1,p2) -#endif -#endif -#else /* PNG_DEBUG_FILE || !_MSC_VER */ -#ifndef PNG_DEBUG_FILE -#define PNG_DEBUG_FILE stderr -#endif /* PNG_DEBUG_FILE */ -#if (PNG_DEBUG > 1) -/* Note: ["%s"m PNG_STRING_NEWLINE] probably does not work on - * non-ISO compilers +/* ASCII to FP interfaces, currently only implemented if sCAL + * support is required. */ -# ifdef __STDC__ -# ifndef png_debug -# define png_debug(l,m) \ - { \ - int num_tabs=l; \ - fprintf(PNG_DEBUG_FILE,"%s"m PNG_STRING_NEWLINE,(num_tabs==1 ? "\t" : \ - (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":"")))); \ - } -# endif -# ifndef png_debug1 -# define png_debug1(l,m,p1) \ - { \ - int num_tabs=l; \ - fprintf(PNG_DEBUG_FILE,"%s"m PNG_STRING_NEWLINE,(num_tabs==1 ? "\t" : \ - (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))),p1); \ - } -# endif -# ifndef png_debug2 -# define png_debug2(l,m,p1,p2) \ - { \ - int num_tabs=l; \ - fprintf(PNG_DEBUG_FILE,"%s"m PNG_STRING_NEWLINE,(num_tabs==1 ? "\t" : \ - (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))),p1,p2); \ - } -# endif -# else /* __STDC __ */ -# ifndef png_debug -# define png_debug(l,m) \ - { \ - int num_tabs=l; \ - char format[256]; \ - snprintf(format,256,"%s%s%s",(num_tabs==1 ? "\t" : \ - (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))), \ - m,PNG_STRING_NEWLINE); \ - fprintf(PNG_DEBUG_FILE,format); \ - } -# endif -# ifndef png_debug1 -# define png_debug1(l,m,p1) \ - { \ - int num_tabs=l; \ - char format[256]; \ - snprintf(format,256,"%s%s%s",(num_tabs==1 ? "\t" : \ - (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))), \ - m,PNG_STRING_NEWLINE); \ - fprintf(PNG_DEBUG_FILE,format,p1); \ - } -# endif -# ifndef png_debug2 -# define png_debug2(l,m,p1,p2) \ - { \ - int num_tabs=l; \ - char format[256]; \ - snprintf(format,256,"%s%s%s",(num_tabs==1 ? "\t" : \ - (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))), \ - m,PNG_STRING_NEWLINE); \ - fprintf(PNG_DEBUG_FILE,format,p1,p2); \ - } -# endif -# endif /* __STDC __ */ -#endif /* (PNG_DEBUG > 1) */ +#if defined(PNG_READ_sCAL_SUPPORTED) +/* MAX_DIGITS is actually the maximum number of characters in an sCAL + * width or height, derived from the precision (number of significant + * digits - a build time settable option) and assumpitions about the + * maximum ridiculous exponent. + */ +#define PNG_sCAL_MAX_DIGITS (PNG_sCAL_PRECISION+1/*.*/+1/*E*/+10/*exponent*/) -#endif /* _MSC_VER */ -#endif /* (PNG_DEBUG > 0) */ -#endif /* PNG_DEBUG */ -#ifndef png_debug -#define png_debug(l, m) +#ifdef PNG_FLOATING_POINT_SUPPORTED +PNG_EXTERN void png_ascii_from_fp PNGARG((png_structp png_ptr, png_charp ascii, + png_size_t size, double fp, unsigned int precision)); +#endif /* FLOATING_POINT */ + +#ifdef PNG_FIXED_POINT_SUPPORTED +PNG_EXTERN void png_ascii_from_fixed PNGARG((png_structp png_ptr, + png_charp ascii, png_size_t size, png_fixed_point fp)); +#endif /* FIXED_POINT */ +#endif /* READ_sCAL */ + +#if defined(PNG_sCAL_SUPPORTED) || defined(PNG_pCAL_SUPPORTED) +/* An internal API to validate the format of a floating point number. + * The result is the index of the next character. If the number is + * not valid it will be the index of a character in the supposed number. + * + * The format of a number is defined in the PNG extensions specification + * and this API is strictly conformant to that spec, not anyone elses! + * + * The format as a regular expression is: + * + * [+-]?[0-9]+.?([Ee][+-]?[0-9]+)? + * + * or: + * + * [+-]?.[0-9]+(.[0-9]+)?([Ee][+-]?[0-9]+)? + * + * The complexity is that either integer or fraction must be present and the + * fraction is permitted to have no digits only if the integer is present. + * + * NOTE: The dangling E problem. + * There is a PNG valid floating point number in the following: + * + * PNG floating point numb1.ers are not greedy. + * + * Working this out requires *TWO* character lookahead (because of the + * sign), the parser does not do this - it will fail at the 'r' - this + * doesn't matter for PNG sCAL chunk values, but it requires more care + * if the value were ever to be embedded in something more complex. Use + * ANSI-C strtod if you need the lookahead. + */ +/* State table for the parser. */ +#define PNG_FP_INTEGER 0 /* before or in integer */ +#define PNG_FP_FRACTION 1 /* before or in fraction */ +#define PNG_FP_EXPONENT 2 /* before or in exponent */ +#define PNG_FP_STATE 3 /* mask for the above */ +#define PNG_FP_SAW_SIGN 4 /* Saw +/- in current state */ +#define PNG_FP_SAW_DIGIT 8 /* Saw a digit in current state */ +#define PNG_FP_SAW_DOT 16 /* Saw a dot in current state */ +#define PNG_FP_SAW_E 32 /* Saw an E (or e) in current state */ +#define PNG_FP_SAW_ANY 60 /* Saw any of the above 4 */ +#define PNG_FP_WAS_VALID 64 /* Preceding substring is a valid fp number */ +#define PNG_FP_INVALID 128 /* Available for callers as a distinct value */ + +/* Result codes for the parser (boolean - true meants ok, false means + * not ok yet.) + */ +#define PNG_FP_MAYBE 0 /* The number may be valid in the future */ +#define PNG_FP_OK 1 /* The number is valid */ + +/* The actual parser. This can be called repeatedly, it updates + * the index into the string and the state variable (which must + * be initialzed to 0). It returns a result code, as above. There + * is no point calling the parser any more if it fails to advance to + * the end of the string - it is stuck on an invalid character (or + * terminated by '\0'). + * + * Note that the pointer will consume an E or even an E+ then leave + * a 'maybe' state even though a preceding integer.fraction is valid. + * The PNG_FP_WAS_VALID flag indicates that a preceding substring was + * a valid number. It's possible to recover from this by calling + * the parser again (from the start, with state 0) but with a string + * that omits the last character (i.e. set the size to the index of + * the problem character.) This has not been tested within libpng. + */ +PNG_EXTERN int png_check_fp_number PNGARG((png_const_charp string, + png_size_t size, int *statep, png_size_tp whereami)); + +/* This is the same but it checks a complete string and returns true + * only if it just contains a floating point number. + */ +PNG_EXTERN int png_check_fp_string PNGARG((png_const_charp string, + png_size_t size)); +#endif /* pCAL || sCAL */ + +#if defined(PNG_READ_GAMMA_SUPPORTED) ||\ + defined(PNG_INCH_CONVERSIONS_SUPPORTED) || defined(PNG_READ_pHYs_SUPPORTED) +/* Added at libpng version 1.5.0 */ +/* This is a utility to provide a*times/div (rounded) and indicate + * if there is an overflow. The result is a boolean - false (0) + * for overflow, true (1) if no overflow, in which case *res + * holds the result. + */ +PNG_EXTERN int png_muldiv PNGARG((png_fixed_point_p res, png_fixed_point a, + png_int_32 multiplied_by, png_int_32 divided_by)); #endif -#ifndef png_debug1 -#define png_debug1(l, m, p1) + +#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_INCH_CONVERSIONS_SUPPORTED) +/* Same deal, but issue a warning on overflow and return 0. */ +PNG_EXTERN png_fixed_point png_muldiv_warn PNGARG((png_structp png_ptr, + png_fixed_point a, png_int_32 multiplied_by, png_int_32 divided_by)); #endif -#ifndef png_debug2 -#define png_debug2(l, m, p1, p2) + +#ifdef PNG_READ_GAMMA_SUPPORTED +/* Calculate a reciprocal - used for gamma values. This returns + * 0 if the argument is 0 in order to maintain an undefined value, + * there are no warnings. + */ +PNG_EXTERN png_fixed_point png_reciprocal PNGARG((png_fixed_point a)); + +/* The same but gives a reciprocal of the product of two fixed point + * values. Accuracy is suitable for gamma calculations but this is + * not exact - use png_muldiv for that. + */ +PNG_EXTERN png_fixed_point png_reciprocal2 PNGARG((png_fixed_point a, + png_fixed_point b)); +#endif + +#ifdef PNG_READ_GAMMA_SUPPORTED +/* Internal fixed point gamma correction. These APIs are called as + * required to convert single values - they don't need to be fast, + * they are not used when processing image pixel values. + * + * While the input is an 'unsigned' value it must actually be the + * correct bit value - 0..255 or 0..65535 as required. + */ +PNG_EXTERN png_uint_16 png_gamma_correct PNGARG((png_structp png_ptr, + unsigned int value, png_fixed_point gamma_value)); +PNG_EXTERN int png_gamma_significant PNGARG((png_fixed_point gamma_value)); +PNG_EXTERN png_uint_16 png_gamma_16bit_correct PNGARG((unsigned int value, + png_fixed_point gamma_value)); +PNG_EXTERN png_byte png_gamma_8bit_correct PNGARG((unsigned int value, + png_fixed_point gamma_value)); +PNG_EXTERN void png_build_gamma_table PNGARG((png_structp png_ptr, + int bit_depth)); #endif /* Maintainer: Put new private prototypes here ^ and in libpngpf.3 */ + +#include "pngdebug.h" + #ifdef __cplusplus } #endif -#endif /* PNG_VERSION_INFO_ONLY */ #endif /* PNGPRIV_H */ diff --git a/reactos/include/reactos/libs/libpng/pngstruct.h b/reactos/include/reactos/libs/libpng/pngstruct.h new file mode 100644 index 00000000000..ed6723dee77 --- /dev/null +++ b/reactos/include/reactos/libs/libpng/pngstruct.h @@ -0,0 +1,924 @@ + +/* pngstruct.h - header file for PNG reference library + * + * Copyright (c) 1998-2011 Glenn Randers-Pehrson + * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) + * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) + * + * Last changed in libpng 1.5.0 [January 6, 2011] + * + * This code is released under the libpng license. + * For conditions of distribution and use, see the disclaimer + * and license in png.h + */ + +/* The structure that holds the information to read and write PNG files. + * The only people who need to care about what is inside of this are the + * people who will be modifying the library for their own special needs. + * It should NOT be accessed directly by an application. + */ + +#ifndef PNGSTRUCT_H +#define PNGSTRUCT_H +/* zlib.h defines the structure z_stream, an instance of which is included + * in this structure and is required for decompressing the LZ compressed + * data in PNG files. + */ +#include "zlib.h" + +struct png_struct_def +{ +#ifdef PNG_SETJMP_SUPPORTED + jmp_buf png_jmpbuf; /* used in png_error */ + png_longjmp_ptr longjmp_fn;/* setjmp non-local goto function. */ +#endif + png_error_ptr error_fn; /* function for printing errors and aborting */ + png_error_ptr warning_fn; /* function for printing warnings */ + png_voidp error_ptr; /* user supplied struct for error functions */ + png_rw_ptr write_data_fn; /* function for writing output data */ + png_rw_ptr read_data_fn; /* function for reading input data */ + png_voidp io_ptr; /* ptr to application struct for I/O functions */ + +#ifdef PNG_READ_USER_TRANSFORM_SUPPORTED + png_user_transform_ptr read_user_transform_fn; /* user read transform */ +#endif + +#ifdef PNG_WRITE_USER_TRANSFORM_SUPPORTED + png_user_transform_ptr write_user_transform_fn; /* user write transform */ +#endif + +/* These were added in libpng-1.0.2 */ +#ifdef PNG_USER_TRANSFORM_PTR_SUPPORTED +#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ + defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) + png_voidp user_transform_ptr; /* user supplied struct for user transform */ + png_byte user_transform_depth; /* bit depth of user transformed pixels */ + png_byte user_transform_channels; /* channels in user transformed pixels */ +#endif +#endif + + png_uint_32 mode; /* tells us where we are in the PNG file */ + png_uint_32 flags; /* flags indicating various things to libpng */ + png_uint_32 transformations; /* which transformations to perform */ + + z_stream zstream; /* pointer to decompression structure (below) */ + png_bytep zbuf; /* buffer for zlib */ + uInt zbuf_size; /* size of zbuf (typically 65536) */ + int zlib_level; /* holds zlib compression level */ + int zlib_method; /* holds zlib compression method */ + int zlib_window_bits; /* holds zlib compression window bits */ + int zlib_mem_level; /* holds zlib compression memory level */ + int zlib_strategy; /* holds zlib compression strategy */ + + png_uint_32 width; /* width of image in pixels */ + png_uint_32 height; /* height of image in pixels */ + png_uint_32 num_rows; /* number of rows in current pass */ + png_uint_32 usr_width; /* width of row at start of write */ + png_size_t rowbytes; /* size of row in bytes */ + png_uint_32 iwidth; /* width of current interlaced row in pixels */ + png_uint_32 row_number; /* current row in interlace pass */ + png_bytep prev_row; /* buffer to save previous (unfiltered) row */ + png_bytep row_buf; /* buffer to save current (unfiltered) row */ + png_bytep sub_row; /* buffer to save "sub" row when filtering */ + png_bytep up_row; /* buffer to save "up" row when filtering */ + png_bytep avg_row; /* buffer to save "avg" row when filtering */ + png_bytep paeth_row; /* buffer to save "Paeth" row when filtering */ + png_row_info row_info; /* used for transformation routines */ + + png_uint_32 idat_size; /* current IDAT size for read */ + png_uint_32 crc; /* current chunk CRC value */ + png_colorp palette; /* palette from the input file */ + png_uint_16 num_palette; /* number of color entries in palette */ + png_uint_16 num_trans; /* number of transparency values */ + png_byte chunk_name[5]; /* null-terminated name of current chunk */ + png_byte compression; /* file compression type (always 0) */ + png_byte filter; /* file filter type (always 0) */ + png_byte interlaced; /* PNG_INTERLACE_NONE, PNG_INTERLACE_ADAM7 */ + png_byte pass; /* current interlace pass (0 - 6) */ + png_byte do_filter; /* row filter flags (see PNG_FILTER_ below ) */ + png_byte color_type; /* color type of file */ + png_byte bit_depth; /* bit depth of file */ + png_byte usr_bit_depth; /* bit depth of users row */ + png_byte pixel_depth; /* number of bits per pixel */ + png_byte channels; /* number of channels in file */ + png_byte usr_channels; /* channels at start of write */ + png_byte sig_bytes; /* magic bytes read/written from start of file */ + +#if defined(PNG_READ_FILLER_SUPPORTED) || defined(PNG_WRITE_FILLER_SUPPORTED) + png_uint_16 filler; /* filler bytes for pixel expansion */ +#endif + +#ifdef PNG_bKGD_SUPPORTED + png_byte background_gamma_type; + png_fixed_point background_gamma; + png_color_16 background; /* background color in screen gamma space */ +#ifdef PNG_READ_GAMMA_SUPPORTED + png_color_16 background_1; /* background normalized to gamma 1.0 */ +#endif +#endif /* PNG_bKGD_SUPPORTED */ + +#ifdef PNG_WRITE_FLUSH_SUPPORTED + png_flush_ptr output_flush_fn; /* Function for flushing output */ + png_uint_32 flush_dist; /* how many rows apart to flush, 0 - no flush */ + png_uint_32 flush_rows; /* number of rows written since last flush */ +#endif + +#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) + int gamma_shift; /* number of "insignificant" bits in 16-bit gamma */ + png_fixed_point gamma; /* file gamma value */ + png_fixed_point screen_gamma; /* screen gamma value (display_exponent) */ +#endif + +#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) + png_bytep gamma_table; /* gamma table for 8-bit depth files */ + png_bytep gamma_from_1; /* converts from 1.0 to screen */ + png_bytep gamma_to_1; /* converts from file to 1.0 */ + png_uint_16pp gamma_16_table; /* gamma table for 16-bit depth files */ + png_uint_16pp gamma_16_from_1; /* converts from 1.0 to screen */ + png_uint_16pp gamma_16_to_1; /* converts from file to 1.0 */ +#endif + +#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_sBIT_SUPPORTED) + png_color_8 sig_bit; /* significant bits in each available channel */ +#endif + +#if defined(PNG_READ_SHIFT_SUPPORTED) || defined(PNG_WRITE_SHIFT_SUPPORTED) + png_color_8 shift; /* shift for significant bit tranformation */ +#endif + +#if defined(PNG_tRNS_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) \ + || defined(PNG_READ_EXPAND_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) + png_bytep trans_alpha; /* alpha values for paletted files */ + png_color_16 trans_color; /* transparent color for non-paletted files */ +#endif + + png_read_status_ptr read_row_fn; /* called after each row is decoded */ + png_write_status_ptr write_row_fn; /* called after each row is encoded */ +#ifdef PNG_PROGRESSIVE_READ_SUPPORTED + png_progressive_info_ptr info_fn; /* called after header data fully read */ + png_progressive_row_ptr row_fn; /* called after a prog. row is decoded */ + png_progressive_end_ptr end_fn; /* called after image is complete */ + png_bytep save_buffer_ptr; /* current location in save_buffer */ + png_bytep save_buffer; /* buffer for previously read data */ + png_bytep current_buffer_ptr; /* current location in current_buffer */ + png_bytep current_buffer; /* buffer for recently used data */ + png_uint_32 push_length; /* size of current input chunk */ + png_uint_32 skip_length; /* bytes to skip in input data */ + png_size_t save_buffer_size; /* amount of data now in save_buffer */ + png_size_t save_buffer_max; /* total size of save_buffer */ + png_size_t buffer_size; /* total amount of available input data */ + png_size_t current_buffer_size; /* amount of data now in current_buffer */ + int process_mode; /* what push library is currently doing */ + int cur_palette; /* current push library palette index */ + +# ifdef PNG_TEXT_SUPPORTED + png_size_t current_text_size; /* current size of text input data */ + png_size_t current_text_left; /* how much text left to read in input */ + png_charp current_text; /* current text chunk buffer */ + png_charp current_text_ptr; /* current location in current_text */ +# endif /* PNG_PROGRESSIVE_READ_SUPPORTED && PNG_TEXT_SUPPORTED */ + +#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ + +#if defined(__TURBOC__) && !defined(_Windows) && !defined(__FLAT__) +/* For the Borland special 64K segment handler */ + png_bytepp offset_table_ptr; + png_bytep offset_table; + png_uint_16 offset_table_number; + png_uint_16 offset_table_count; + png_uint_16 offset_table_count_free; +#endif + +#ifdef PNG_READ_QUANTIZE_SUPPORTED + png_bytep palette_lookup; /* lookup table for quantizing */ + png_bytep quantize_index; /* index translation for palette files */ +#endif + +#if defined(PNG_READ_QUANTIZE_SUPPORTED) || defined(PNG_hIST_SUPPORTED) + png_uint_16p hist; /* histogram */ +#endif + +#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED + png_byte heuristic_method; /* heuristic for row filter selection */ + png_byte num_prev_filters; /* number of weights for previous rows */ + png_bytep prev_filters; /* filter type(s) of previous row(s) */ + png_uint_16p filter_weights; /* weight(s) for previous line(s) */ + png_uint_16p inv_filter_weights; /* 1/weight(s) for previous line(s) */ + png_uint_16p filter_costs; /* relative filter calculation cost */ + png_uint_16p inv_filter_costs; /* 1/relative filter calculation cost */ +#endif + +#ifdef PNG_TIME_RFC1123_SUPPORTED + png_charp time_buffer; /* String to hold RFC 1123 time text */ +#endif + +/* New members added in libpng-1.0.6 */ + + png_uint_32 free_me; /* flags items libpng is responsible for freeing */ + +#ifdef PNG_USER_CHUNKS_SUPPORTED + png_voidp user_chunk_ptr; + png_user_chunk_ptr read_user_chunk_fn; /* user read chunk handler */ +#endif + +#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED + int num_chunk_list; + png_bytep chunk_list; +#endif + +/* New members added in libpng-1.0.3 */ +#ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED + png_byte rgb_to_gray_status; + /* These were changed from png_byte in libpng-1.0.6 */ + png_uint_16 rgb_to_gray_red_coeff; + png_uint_16 rgb_to_gray_green_coeff; + png_uint_16 rgb_to_gray_blue_coeff; +#endif + +/* New member added in libpng-1.0.4 (renamed in 1.0.9) */ +#if defined(PNG_MNG_FEATURES_SUPPORTED) || \ + defined(PNG_READ_EMPTY_PLTE_SUPPORTED) || \ + defined(PNG_WRITE_EMPTY_PLTE_SUPPORTED) +/* Changed from png_byte to png_uint_32 at version 1.2.0 */ + png_uint_32 mng_features_permitted; +#endif + +/* New member added in libpng-1.0.9, ifdef'ed out in 1.0.12, enabled in 1.2.0 */ +#ifdef PNG_MNG_FEATURES_SUPPORTED + png_byte filter_type; +#endif + +/* New members added in libpng-1.2.0 */ + +/* New members added in libpng-1.0.2 but first enabled by default in 1.2.0 */ +#ifdef PNG_USER_MEM_SUPPORTED + png_voidp mem_ptr; /* user supplied struct for mem functions */ + png_malloc_ptr malloc_fn; /* function for allocating memory */ + png_free_ptr free_fn; /* function for freeing memory */ +#endif + +/* New member added in libpng-1.0.13 and 1.2.0 */ + png_bytep big_row_buf; /* buffer to save current (unfiltered) row */ + +#ifdef PNG_READ_QUANTIZE_SUPPORTED +/* The following three members were added at version 1.0.14 and 1.2.4 */ + png_bytep quantize_sort; /* working sort array */ + png_bytep index_to_palette; /* where the original index currently is + in the palette */ + png_bytep palette_to_index; /* which original index points to this + palette color */ +#endif + +/* New members added in libpng-1.0.16 and 1.2.6 */ + png_byte compression_type; + +#ifdef PNG_USER_LIMITS_SUPPORTED + png_uint_32 user_width_max; + png_uint_32 user_height_max; + + /* Added in libpng-1.4.0: Total number of sPLT, text, and unknown + * chunks that can be stored (0 means unlimited). + */ + png_uint_32 user_chunk_cache_max; + + /* Total memory that a zTXt, sPLT, iTXt, iCCP, or unknown chunk + * can occupy when decompressed. 0 means unlimited. + */ + png_alloc_size_t user_chunk_malloc_max; +#endif + +/* New member added in libpng-1.0.25 and 1.2.17 */ +#ifdef PNG_UNKNOWN_CHUNKS_SUPPORTED + /* Storage for unknown chunk that the library doesn't recognize. */ + png_unknown_chunk unknown_chunk; +#endif + +/* New members added in libpng-1.2.26 */ + png_size_t old_big_row_buf_size; + png_size_t old_prev_row_size; + +/* New member added in libpng-1.2.30 */ + png_charp chunkdata; /* buffer for reading chunk data */ + +#ifdef PNG_IO_STATE_SUPPORTED +/* New member added in libpng-1.4.0 */ + png_uint_32 io_state; +#endif +}; +#endif /* PNGSTRUCT_H */ + +/* pngstruct.h - header file for PNG reference library + * + * Copyright (c) 1998-2011 Glenn Randers-Pehrson + * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) + * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) + * + * Last changed in libpng 1.5.0 [January 6, 2011] + * + * This code is released under the libpng license. + * For conditions of distribution and use, see the disclaimer + * and license in png.h + */ + +/* The structure that holds the information to read and write PNG files. + * The only people who need to care about what is inside of this are the + * people who will be modifying the library for their own special needs. + * It should NOT be accessed directly by an application. + */ + +#ifndef PNGSTRUCT_H +#define PNGSTRUCT_H +/* zlib.h defines the structure z_stream, an instance of which is included + * in this structure and is required for decompressing the LZ compressed + * data in PNG files. + */ +#include "zlib.h" + +struct png_struct_def +{ +#ifdef PNG_SETJMP_SUPPORTED + jmp_buf png_jmpbuf; /* used in png_error */ + png_longjmp_ptr longjmp_fn;/* setjmp non-local goto function. */ +#endif + png_error_ptr error_fn; /* function for printing errors and aborting */ + png_error_ptr warning_fn; /* function for printing warnings */ + png_voidp error_ptr; /* user supplied struct for error functions */ + png_rw_ptr write_data_fn; /* function for writing output data */ + png_rw_ptr read_data_fn; /* function for reading input data */ + png_voidp io_ptr; /* ptr to application struct for I/O functions */ + +#ifdef PNG_READ_USER_TRANSFORM_SUPPORTED + png_user_transform_ptr read_user_transform_fn; /* user read transform */ +#endif + +#ifdef PNG_WRITE_USER_TRANSFORM_SUPPORTED + png_user_transform_ptr write_user_transform_fn; /* user write transform */ +#endif + +/* These were added in libpng-1.0.2 */ +#ifdef PNG_USER_TRANSFORM_PTR_SUPPORTED +#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ + defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) + png_voidp user_transform_ptr; /* user supplied struct for user transform */ + png_byte user_transform_depth; /* bit depth of user transformed pixels */ + png_byte user_transform_channels; /* channels in user transformed pixels */ +#endif +#endif + + png_uint_32 mode; /* tells us where we are in the PNG file */ + png_uint_32 flags; /* flags indicating various things to libpng */ + png_uint_32 transformations; /* which transformations to perform */ + + z_stream zstream; /* pointer to decompression structure (below) */ + png_bytep zbuf; /* buffer for zlib */ + uInt zbuf_size; /* size of zbuf (typically 65536) */ + int zlib_level; /* holds zlib compression level */ + int zlib_method; /* holds zlib compression method */ + int zlib_window_bits; /* holds zlib compression window bits */ + int zlib_mem_level; /* holds zlib compression memory level */ + int zlib_strategy; /* holds zlib compression strategy */ + + png_uint_32 width; /* width of image in pixels */ + png_uint_32 height; /* height of image in pixels */ + png_uint_32 num_rows; /* number of rows in current pass */ + png_uint_32 usr_width; /* width of row at start of write */ + png_size_t rowbytes; /* size of row in bytes */ + png_uint_32 iwidth; /* width of current interlaced row in pixels */ + png_uint_32 row_number; /* current row in interlace pass */ + png_bytep prev_row; /* buffer to save previous (unfiltered) row */ + png_bytep row_buf; /* buffer to save current (unfiltered) row */ + png_bytep sub_row; /* buffer to save "sub" row when filtering */ + png_bytep up_row; /* buffer to save "up" row when filtering */ + png_bytep avg_row; /* buffer to save "avg" row when filtering */ + png_bytep paeth_row; /* buffer to save "Paeth" row when filtering */ + png_row_info row_info; /* used for transformation routines */ + + png_uint_32 idat_size; /* current IDAT size for read */ + png_uint_32 crc; /* current chunk CRC value */ + png_colorp palette; /* palette from the input file */ + png_uint_16 num_palette; /* number of color entries in palette */ + png_uint_16 num_trans; /* number of transparency values */ + png_byte chunk_name[5]; /* null-terminated name of current chunk */ + png_byte compression; /* file compression type (always 0) */ + png_byte filter; /* file filter type (always 0) */ + png_byte interlaced; /* PNG_INTERLACE_NONE, PNG_INTERLACE_ADAM7 */ + png_byte pass; /* current interlace pass (0 - 6) */ + png_byte do_filter; /* row filter flags (see PNG_FILTER_ below ) */ + png_byte color_type; /* color type of file */ + png_byte bit_depth; /* bit depth of file */ + png_byte usr_bit_depth; /* bit depth of users row */ + png_byte pixel_depth; /* number of bits per pixel */ + png_byte channels; /* number of channels in file */ + png_byte usr_channels; /* channels at start of write */ + png_byte sig_bytes; /* magic bytes read/written from start of file */ + +#if defined(PNG_READ_FILLER_SUPPORTED) || defined(PNG_WRITE_FILLER_SUPPORTED) + png_uint_16 filler; /* filler bytes for pixel expansion */ +#endif + +#ifdef PNG_bKGD_SUPPORTED + png_byte background_gamma_type; + png_fixed_point background_gamma; + png_color_16 background; /* background color in screen gamma space */ +#ifdef PNG_READ_GAMMA_SUPPORTED + png_color_16 background_1; /* background normalized to gamma 1.0 */ +#endif +#endif /* PNG_bKGD_SUPPORTED */ + +#ifdef PNG_WRITE_FLUSH_SUPPORTED + png_flush_ptr output_flush_fn; /* Function for flushing output */ + png_uint_32 flush_dist; /* how many rows apart to flush, 0 - no flush */ + png_uint_32 flush_rows; /* number of rows written since last flush */ +#endif + +#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) + int gamma_shift; /* number of "insignificant" bits in 16-bit gamma */ + png_fixed_point gamma; /* file gamma value */ + png_fixed_point screen_gamma; /* screen gamma value (display_exponent) */ +#endif + +#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) + png_bytep gamma_table; /* gamma table for 8-bit depth files */ + png_bytep gamma_from_1; /* converts from 1.0 to screen */ + png_bytep gamma_to_1; /* converts from file to 1.0 */ + png_uint_16pp gamma_16_table; /* gamma table for 16-bit depth files */ + png_uint_16pp gamma_16_from_1; /* converts from 1.0 to screen */ + png_uint_16pp gamma_16_to_1; /* converts from file to 1.0 */ +#endif + +#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_sBIT_SUPPORTED) + png_color_8 sig_bit; /* significant bits in each available channel */ +#endif + +#if defined(PNG_READ_SHIFT_SUPPORTED) || defined(PNG_WRITE_SHIFT_SUPPORTED) + png_color_8 shift; /* shift for significant bit tranformation */ +#endif + +#if defined(PNG_tRNS_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) \ + || defined(PNG_READ_EXPAND_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) + png_bytep trans_alpha; /* alpha values for paletted files */ + png_color_16 trans_color; /* transparent color for non-paletted files */ +#endif + + png_read_status_ptr read_row_fn; /* called after each row is decoded */ + png_write_status_ptr write_row_fn; /* called after each row is encoded */ +#ifdef PNG_PROGRESSIVE_READ_SUPPORTED + png_progressive_info_ptr info_fn; /* called after header data fully read */ + png_progressive_row_ptr row_fn; /* called after a prog. row is decoded */ + png_progressive_end_ptr end_fn; /* called after image is complete */ + png_bytep save_buffer_ptr; /* current location in save_buffer */ + png_bytep save_buffer; /* buffer for previously read data */ + png_bytep current_buffer_ptr; /* current location in current_buffer */ + png_bytep current_buffer; /* buffer for recently used data */ + png_uint_32 push_length; /* size of current input chunk */ + png_uint_32 skip_length; /* bytes to skip in input data */ + png_size_t save_buffer_size; /* amount of data now in save_buffer */ + png_size_t save_buffer_max; /* total size of save_buffer */ + png_size_t buffer_size; /* total amount of available input data */ + png_size_t current_buffer_size; /* amount of data now in current_buffer */ + int process_mode; /* what push library is currently doing */ + int cur_palette; /* current push library palette index */ + +# ifdef PNG_TEXT_SUPPORTED + png_size_t current_text_size; /* current size of text input data */ + png_size_t current_text_left; /* how much text left to read in input */ + png_charp current_text; /* current text chunk buffer */ + png_charp current_text_ptr; /* current location in current_text */ +# endif /* PNG_PROGRESSIVE_READ_SUPPORTED && PNG_TEXT_SUPPORTED */ + +#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ + +#if defined(__TURBOC__) && !defined(_Windows) && !defined(__FLAT__) +/* For the Borland special 64K segment handler */ + png_bytepp offset_table_ptr; + png_bytep offset_table; + png_uint_16 offset_table_number; + png_uint_16 offset_table_count; + png_uint_16 offset_table_count_free; +#endif + +#ifdef PNG_READ_QUANTIZE_SUPPORTED + png_bytep palette_lookup; /* lookup table for quantizing */ + png_bytep quantize_index; /* index translation for palette files */ +#endif + +#if defined(PNG_READ_QUANTIZE_SUPPORTED) || defined(PNG_hIST_SUPPORTED) + png_uint_16p hist; /* histogram */ +#endif + +#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED + png_byte heuristic_method; /* heuristic for row filter selection */ + png_byte num_prev_filters; /* number of weights for previous rows */ + png_bytep prev_filters; /* filter type(s) of previous row(s) */ + png_uint_16p filter_weights; /* weight(s) for previous line(s) */ + png_uint_16p inv_filter_weights; /* 1/weight(s) for previous line(s) */ + png_uint_16p filter_costs; /* relative filter calculation cost */ + png_uint_16p inv_filter_costs; /* 1/relative filter calculation cost */ +#endif + +#ifdef PNG_TIME_RFC1123_SUPPORTED + png_charp time_buffer; /* String to hold RFC 1123 time text */ +#endif + +/* New members added in libpng-1.0.6 */ + + png_uint_32 free_me; /* flags items libpng is responsible for freeing */ + +#ifdef PNG_USER_CHUNKS_SUPPORTED + png_voidp user_chunk_ptr; + png_user_chunk_ptr read_user_chunk_fn; /* user read chunk handler */ +#endif + +#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED + int num_chunk_list; + png_bytep chunk_list; +#endif + +/* New members added in libpng-1.0.3 */ +#ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED + png_byte rgb_to_gray_status; + /* These were changed from png_byte in libpng-1.0.6 */ + png_uint_16 rgb_to_gray_red_coeff; + png_uint_16 rgb_to_gray_green_coeff; + png_uint_16 rgb_to_gray_blue_coeff; +#endif + +/* New member added in libpng-1.0.4 (renamed in 1.0.9) */ +#if defined(PNG_MNG_FEATURES_SUPPORTED) || \ + defined(PNG_READ_EMPTY_PLTE_SUPPORTED) || \ + defined(PNG_WRITE_EMPTY_PLTE_SUPPORTED) +/* Changed from png_byte to png_uint_32 at version 1.2.0 */ + png_uint_32 mng_features_permitted; +#endif + +/* New member added in libpng-1.0.9, ifdef'ed out in 1.0.12, enabled in 1.2.0 */ +#ifdef PNG_MNG_FEATURES_SUPPORTED + png_byte filter_type; +#endif + +/* New members added in libpng-1.2.0 */ + +/* New members added in libpng-1.0.2 but first enabled by default in 1.2.0 */ +#ifdef PNG_USER_MEM_SUPPORTED + png_voidp mem_ptr; /* user supplied struct for mem functions */ + png_malloc_ptr malloc_fn; /* function for allocating memory */ + png_free_ptr free_fn; /* function for freeing memory */ +#endif + +/* New member added in libpng-1.0.13 and 1.2.0 */ + png_bytep big_row_buf; /* buffer to save current (unfiltered) row */ + +#ifdef PNG_READ_QUANTIZE_SUPPORTED +/* The following three members were added at version 1.0.14 and 1.2.4 */ + png_bytep quantize_sort; /* working sort array */ + png_bytep index_to_palette; /* where the original index currently is + in the palette */ + png_bytep palette_to_index; /* which original index points to this + palette color */ +#endif + +/* New members added in libpng-1.0.16 and 1.2.6 */ + png_byte compression_type; + +#ifdef PNG_USER_LIMITS_SUPPORTED + png_uint_32 user_width_max; + png_uint_32 user_height_max; + + /* Added in libpng-1.4.0: Total number of sPLT, text, and unknown + * chunks that can be stored (0 means unlimited). + */ + png_uint_32 user_chunk_cache_max; + + /* Total memory that a zTXt, sPLT, iTXt, iCCP, or unknown chunk + * can occupy when decompressed. 0 means unlimited. + */ + png_alloc_size_t user_chunk_malloc_max; +#endif + +/* New member added in libpng-1.0.25 and 1.2.17 */ +#ifdef PNG_UNKNOWN_CHUNKS_SUPPORTED + /* Storage for unknown chunk that the library doesn't recognize. */ + png_unknown_chunk unknown_chunk; +#endif + +/* New members added in libpng-1.2.26 */ + png_size_t old_big_row_buf_size; + png_size_t old_prev_row_size; + +/* New member added in libpng-1.2.30 */ + png_charp chunkdata; /* buffer for reading chunk data */ + +#ifdef PNG_IO_STATE_SUPPORTED +/* New member added in libpng-1.4.0 */ + png_uint_32 io_state; +#endif +}; +#endif /* PNGSTRUCT_H */ + +/* pngstruct.h - header file for PNG reference library + * + * Copyright (c) 1998-2011 Glenn Randers-Pehrson + * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) + * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) + * + * Last changed in libpng 1.5.0 [January 6, 2011] + * + * This code is released under the libpng license. + * For conditions of distribution and use, see the disclaimer + * and license in png.h + */ + +/* The structure that holds the information to read and write PNG files. + * The only people who need to care about what is inside of this are the + * people who will be modifying the library for their own special needs. + * It should NOT be accessed directly by an application. + */ + +#ifndef PNGSTRUCT_H +#define PNGSTRUCT_H +/* zlib.h defines the structure z_stream, an instance of which is included + * in this structure and is required for decompressing the LZ compressed + * data in PNG files. + */ +#include "zlib.h" + +struct png_struct_def +{ +#ifdef PNG_SETJMP_SUPPORTED + jmp_buf png_jmpbuf; /* used in png_error */ + png_longjmp_ptr longjmp_fn;/* setjmp non-local goto function. */ +#endif + png_error_ptr error_fn; /* function for printing errors and aborting */ + png_error_ptr warning_fn; /* function for printing warnings */ + png_voidp error_ptr; /* user supplied struct for error functions */ + png_rw_ptr write_data_fn; /* function for writing output data */ + png_rw_ptr read_data_fn; /* function for reading input data */ + png_voidp io_ptr; /* ptr to application struct for I/O functions */ + +#ifdef PNG_READ_USER_TRANSFORM_SUPPORTED + png_user_transform_ptr read_user_transform_fn; /* user read transform */ +#endif + +#ifdef PNG_WRITE_USER_TRANSFORM_SUPPORTED + png_user_transform_ptr write_user_transform_fn; /* user write transform */ +#endif + +/* These were added in libpng-1.0.2 */ +#ifdef PNG_USER_TRANSFORM_PTR_SUPPORTED +#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ + defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) + png_voidp user_transform_ptr; /* user supplied struct for user transform */ + png_byte user_transform_depth; /* bit depth of user transformed pixels */ + png_byte user_transform_channels; /* channels in user transformed pixels */ +#endif +#endif + + png_uint_32 mode; /* tells us where we are in the PNG file */ + png_uint_32 flags; /* flags indicating various things to libpng */ + png_uint_32 transformations; /* which transformations to perform */ + + z_stream zstream; /* pointer to decompression structure (below) */ + png_bytep zbuf; /* buffer for zlib */ + uInt zbuf_size; /* size of zbuf (typically 65536) */ + int zlib_level; /* holds zlib compression level */ + int zlib_method; /* holds zlib compression method */ + int zlib_window_bits; /* holds zlib compression window bits */ + int zlib_mem_level; /* holds zlib compression memory level */ + int zlib_strategy; /* holds zlib compression strategy */ + + png_uint_32 width; /* width of image in pixels */ + png_uint_32 height; /* height of image in pixels */ + png_uint_32 num_rows; /* number of rows in current pass */ + png_uint_32 usr_width; /* width of row at start of write */ + png_size_t rowbytes; /* size of row in bytes */ + png_uint_32 iwidth; /* width of current interlaced row in pixels */ + png_uint_32 row_number; /* current row in interlace pass */ + png_bytep prev_row; /* buffer to save previous (unfiltered) row */ + png_bytep row_buf; /* buffer to save current (unfiltered) row */ + png_bytep sub_row; /* buffer to save "sub" row when filtering */ + png_bytep up_row; /* buffer to save "up" row when filtering */ + png_bytep avg_row; /* buffer to save "avg" row when filtering */ + png_bytep paeth_row; /* buffer to save "Paeth" row when filtering */ + png_row_info row_info; /* used for transformation routines */ + + png_uint_32 idat_size; /* current IDAT size for read */ + png_uint_32 crc; /* current chunk CRC value */ + png_colorp palette; /* palette from the input file */ + png_uint_16 num_palette; /* number of color entries in palette */ + png_uint_16 num_trans; /* number of transparency values */ + png_byte chunk_name[5]; /* null-terminated name of current chunk */ + png_byte compression; /* file compression type (always 0) */ + png_byte filter; /* file filter type (always 0) */ + png_byte interlaced; /* PNG_INTERLACE_NONE, PNG_INTERLACE_ADAM7 */ + png_byte pass; /* current interlace pass (0 - 6) */ + png_byte do_filter; /* row filter flags (see PNG_FILTER_ below ) */ + png_byte color_type; /* color type of file */ + png_byte bit_depth; /* bit depth of file */ + png_byte usr_bit_depth; /* bit depth of users row */ + png_byte pixel_depth; /* number of bits per pixel */ + png_byte channels; /* number of channels in file */ + png_byte usr_channels; /* channels at start of write */ + png_byte sig_bytes; /* magic bytes read/written from start of file */ + +#if defined(PNG_READ_FILLER_SUPPORTED) || defined(PNG_WRITE_FILLER_SUPPORTED) + png_uint_16 filler; /* filler bytes for pixel expansion */ +#endif + +#ifdef PNG_bKGD_SUPPORTED + png_byte background_gamma_type; + png_fixed_point background_gamma; + png_color_16 background; /* background color in screen gamma space */ +#ifdef PNG_READ_GAMMA_SUPPORTED + png_color_16 background_1; /* background normalized to gamma 1.0 */ +#endif +#endif /* PNG_bKGD_SUPPORTED */ + +#ifdef PNG_WRITE_FLUSH_SUPPORTED + png_flush_ptr output_flush_fn; /* Function for flushing output */ + png_uint_32 flush_dist; /* how many rows apart to flush, 0 - no flush */ + png_uint_32 flush_rows; /* number of rows written since last flush */ +#endif + +#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) + int gamma_shift; /* number of "insignificant" bits in 16-bit gamma */ + png_fixed_point gamma; /* file gamma value */ + png_fixed_point screen_gamma; /* screen gamma value (display_exponent) */ +#endif + +#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) + png_bytep gamma_table; /* gamma table for 8-bit depth files */ + png_bytep gamma_from_1; /* converts from 1.0 to screen */ + png_bytep gamma_to_1; /* converts from file to 1.0 */ + png_uint_16pp gamma_16_table; /* gamma table for 16-bit depth files */ + png_uint_16pp gamma_16_from_1; /* converts from 1.0 to screen */ + png_uint_16pp gamma_16_to_1; /* converts from file to 1.0 */ +#endif + +#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_sBIT_SUPPORTED) + png_color_8 sig_bit; /* significant bits in each available channel */ +#endif + +#if defined(PNG_READ_SHIFT_SUPPORTED) || defined(PNG_WRITE_SHIFT_SUPPORTED) + png_color_8 shift; /* shift for significant bit tranformation */ +#endif + +#if defined(PNG_tRNS_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) \ + || defined(PNG_READ_EXPAND_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) + png_bytep trans_alpha; /* alpha values for paletted files */ + png_color_16 trans_color; /* transparent color for non-paletted files */ +#endif + + png_read_status_ptr read_row_fn; /* called after each row is decoded */ + png_write_status_ptr write_row_fn; /* called after each row is encoded */ +#ifdef PNG_PROGRESSIVE_READ_SUPPORTED + png_progressive_info_ptr info_fn; /* called after header data fully read */ + png_progressive_row_ptr row_fn; /* called after a prog. row is decoded */ + png_progressive_end_ptr end_fn; /* called after image is complete */ + png_bytep save_buffer_ptr; /* current location in save_buffer */ + png_bytep save_buffer; /* buffer for previously read data */ + png_bytep current_buffer_ptr; /* current location in current_buffer */ + png_bytep current_buffer; /* buffer for recently used data */ + png_uint_32 push_length; /* size of current input chunk */ + png_uint_32 skip_length; /* bytes to skip in input data */ + png_size_t save_buffer_size; /* amount of data now in save_buffer */ + png_size_t save_buffer_max; /* total size of save_buffer */ + png_size_t buffer_size; /* total amount of available input data */ + png_size_t current_buffer_size; /* amount of data now in current_buffer */ + int process_mode; /* what push library is currently doing */ + int cur_palette; /* current push library palette index */ + +# ifdef PNG_TEXT_SUPPORTED + png_size_t current_text_size; /* current size of text input data */ + png_size_t current_text_left; /* how much text left to read in input */ + png_charp current_text; /* current text chunk buffer */ + png_charp current_text_ptr; /* current location in current_text */ +# endif /* PNG_PROGRESSIVE_READ_SUPPORTED && PNG_TEXT_SUPPORTED */ + +#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ + +#if defined(__TURBOC__) && !defined(_Windows) && !defined(__FLAT__) +/* For the Borland special 64K segment handler */ + png_bytepp offset_table_ptr; + png_bytep offset_table; + png_uint_16 offset_table_number; + png_uint_16 offset_table_count; + png_uint_16 offset_table_count_free; +#endif + +#ifdef PNG_READ_QUANTIZE_SUPPORTED + png_bytep palette_lookup; /* lookup table for quantizing */ + png_bytep quantize_index; /* index translation for palette files */ +#endif + +#if defined(PNG_READ_QUANTIZE_SUPPORTED) || defined(PNG_hIST_SUPPORTED) + png_uint_16p hist; /* histogram */ +#endif + +#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED + png_byte heuristic_method; /* heuristic for row filter selection */ + png_byte num_prev_filters; /* number of weights for previous rows */ + png_bytep prev_filters; /* filter type(s) of previous row(s) */ + png_uint_16p filter_weights; /* weight(s) for previous line(s) */ + png_uint_16p inv_filter_weights; /* 1/weight(s) for previous line(s) */ + png_uint_16p filter_costs; /* relative filter calculation cost */ + png_uint_16p inv_filter_costs; /* 1/relative filter calculation cost */ +#endif + +#ifdef PNG_TIME_RFC1123_SUPPORTED + png_charp time_buffer; /* String to hold RFC 1123 time text */ +#endif + +/* New members added in libpng-1.0.6 */ + + png_uint_32 free_me; /* flags items libpng is responsible for freeing */ + +#ifdef PNG_USER_CHUNKS_SUPPORTED + png_voidp user_chunk_ptr; + png_user_chunk_ptr read_user_chunk_fn; /* user read chunk handler */ +#endif + +#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED + int num_chunk_list; + png_bytep chunk_list; +#endif + +/* New members added in libpng-1.0.3 */ +#ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED + png_byte rgb_to_gray_status; + /* These were changed from png_byte in libpng-1.0.6 */ + png_uint_16 rgb_to_gray_red_coeff; + png_uint_16 rgb_to_gray_green_coeff; + png_uint_16 rgb_to_gray_blue_coeff; +#endif + +/* New member added in libpng-1.0.4 (renamed in 1.0.9) */ +#if defined(PNG_MNG_FEATURES_SUPPORTED) || \ + defined(PNG_READ_EMPTY_PLTE_SUPPORTED) || \ + defined(PNG_WRITE_EMPTY_PLTE_SUPPORTED) +/* Changed from png_byte to png_uint_32 at version 1.2.0 */ + png_uint_32 mng_features_permitted; +#endif + +/* New member added in libpng-1.0.9, ifdef'ed out in 1.0.12, enabled in 1.2.0 */ +#ifdef PNG_MNG_FEATURES_SUPPORTED + png_byte filter_type; +#endif + +/* New members added in libpng-1.2.0 */ + +/* New members added in libpng-1.0.2 but first enabled by default in 1.2.0 */ +#ifdef PNG_USER_MEM_SUPPORTED + png_voidp mem_ptr; /* user supplied struct for mem functions */ + png_malloc_ptr malloc_fn; /* function for allocating memory */ + png_free_ptr free_fn; /* function for freeing memory */ +#endif + +/* New member added in libpng-1.0.13 and 1.2.0 */ + png_bytep big_row_buf; /* buffer to save current (unfiltered) row */ + +#ifdef PNG_READ_QUANTIZE_SUPPORTED +/* The following three members were added at version 1.0.14 and 1.2.4 */ + png_bytep quantize_sort; /* working sort array */ + png_bytep index_to_palette; /* where the original index currently is + in the palette */ + png_bytep palette_to_index; /* which original index points to this + palette color */ +#endif + +/* New members added in libpng-1.0.16 and 1.2.6 */ + png_byte compression_type; + +#ifdef PNG_USER_LIMITS_SUPPORTED + png_uint_32 user_width_max; + png_uint_32 user_height_max; + + /* Added in libpng-1.4.0: Total number of sPLT, text, and unknown + * chunks that can be stored (0 means unlimited). + */ + png_uint_32 user_chunk_cache_max; + + /* Total memory that a zTXt, sPLT, iTXt, iCCP, or unknown chunk + * can occupy when decompressed. 0 means unlimited. + */ + png_alloc_size_t user_chunk_malloc_max; +#endif + +/* New member added in libpng-1.0.25 and 1.2.17 */ +#ifdef PNG_UNKNOWN_CHUNKS_SUPPORTED + /* Storage for unknown chunk that the library doesn't recognize. */ + png_unknown_chunk unknown_chunk; +#endif + +/* New members added in libpng-1.2.26 */ + png_size_t old_big_row_buf_size; + png_size_t old_prev_row_size; + +/* New member added in libpng-1.2.30 */ + png_charp chunkdata; /* buffer for reading chunk data */ + +#ifdef PNG_IO_STATE_SUPPORTED +/* New member added in libpng-1.4.0 */ + png_uint_32 io_state; +#endif +}; +#endif /* PNGSTRUCT_H */ From e2d00b9f53d740ce69e1d163ed39b8e33db1086e Mon Sep 17 00:00:00 2001 From: Gregor Schneider Date: Thu, 5 May 2011 20:22:06 +0000 Subject: [PATCH 303/317] [shell32] * Igor Paliychuk : - Remove duplicate string and add some missing resources - Increase buffer sizes in FolderOptionsFileTypesDlg - Update RU and UA translations * Myself: update German translation svn path=/trunk/; revision=51596 --- reactos/dll/win32/shell32/folder_options.c | 2 +- reactos/dll/win32/shell32/lang/bg-BG.rc | 4 +++- reactos/dll/win32/shell32/lang/ca-ES.rc | 4 +++- reactos/dll/win32/shell32/lang/cs-CZ.rc | 4 +++- reactos/dll/win32/shell32/lang/da-DK.rc | 4 +++- reactos/dll/win32/shell32/lang/de-DE.rc | 4 +++- reactos/dll/win32/shell32/lang/el-GR.rc | 4 +++- reactos/dll/win32/shell32/lang/en-GB.rc | 4 +++- reactos/dll/win32/shell32/lang/en-US.rc | 4 +++- reactos/dll/win32/shell32/lang/es-ES.rc | 4 +++- reactos/dll/win32/shell32/lang/fi-FI.rc | 4 +++- reactos/dll/win32/shell32/lang/fr-FR.rc | 4 +++- reactos/dll/win32/shell32/lang/hu-HU.rc | 4 +++- reactos/dll/win32/shell32/lang/it-IT.rc | 4 +++- reactos/dll/win32/shell32/lang/ja-JP.rc | 4 +++- reactos/dll/win32/shell32/lang/ko-KR.rc | 4 +++- reactos/dll/win32/shell32/lang/nl-NL.rc | 4 +++- reactos/dll/win32/shell32/lang/no-NO.rc | 4 +++- reactos/dll/win32/shell32/lang/pl-PL.rc | 4 +++- reactos/dll/win32/shell32/lang/pt-BR.rc | 4 +++- reactos/dll/win32/shell32/lang/pt-PT.rc | 4 +++- reactos/dll/win32/shell32/lang/ro-RO.rc | 4 +++- reactos/dll/win32/shell32/lang/ru-RU.rc | 4 +++- reactos/dll/win32/shell32/lang/sk-SK.rc | 4 +++- reactos/dll/win32/shell32/lang/sl-SI.rc | 4 +++- reactos/dll/win32/shell32/lang/sv-SE.rc | 4 +++- reactos/dll/win32/shell32/lang/tr-TR.rc | 4 +++- reactos/dll/win32/shell32/lang/uk-UA.rc | 4 +++- reactos/dll/win32/shell32/lang/zh-CN.rc | 4 +++- reactos/dll/win32/shell32/lang/zh-TW.rc | 4 +++- 30 files changed, 88 insertions(+), 30 deletions(-) diff --git a/reactos/dll/win32/shell32/folder_options.c b/reactos/dll/win32/shell32/folder_options.c index 8d9b643dcef..3d72018dbd3 100644 --- a/reactos/dll/win32/shell32/folder_options.c +++ b/reactos/dll/win32/shell32/folder_options.c @@ -399,7 +399,7 @@ FolderOptionsFileTypesDlg( { LPNMLISTVIEW lppl; LVITEMW lvItem; - WCHAR Buffer[200], FormatBuffer[100]; //FIXME + WCHAR Buffer[255], FormatBuffer[255]; PFOLDER_FILE_TYPE_ENTRY pItem; OPENASINFO Info; diff --git a/reactos/dll/win32/shell32/lang/bg-BG.rc b/reactos/dll/win32/shell32/lang/bg-BG.rc index 39be8ade1fa..6bc22cf438a 100644 --- a/reactos/dll/win32/shell32/lang/bg-BG.rc +++ b/reactos/dll/win32/shell32/lang/bg-BG.rc @@ -423,7 +423,7 @@ LTEXT " //ICON LTEXT " ", 14005, 100, 140, 40, 10 PUSHBUTTON "&...", 14006, 180, 140, 50, 14, WS_TABSTOP -LTEXT " '%s' '%s'. , '%s' , .", 14007, 12, 155, 160, 32 +LTEXT "", 14007, 12, 155, 160, 32 PUSHBUTTON "&", 14008, 180, 175, 50, 14, WS_TABSTOP END @@ -762,6 +762,8 @@ BEGIN IDS_FILE_DETAILS " '%s" IDS_FILE_DETAILSADV " '%s' '%s'. , '%s' , ." + IDS_FILE_TYPES "FileTypes" + IDS_COLUMN_EXTENSION "Extensions" END diff --git a/reactos/dll/win32/shell32/lang/ca-ES.rc b/reactos/dll/win32/shell32/lang/ca-ES.rc index f3159e9f2be..0c0571e0f4c 100644 --- a/reactos/dll/win32/shell32/lang/ca-ES.rc +++ b/reactos/dll/win32/shell32/lang/ca-ES.rc @@ -424,7 +424,7 @@ LTEXT "Opens with:", -1, 12, 140, 40, 10 //ICON LTEXT "Appname", 14005, 100, 140, 40, 10 PUSHBUTTON "&Change...", 14006, 180, 140, 50, 14, WS_TABSTOP -LTEXT "Files with extension '%s' are of type '%s'. To change settings that affect all '%s' files, click Advanced.", 14007, 12, 155, 160, 30 +LTEXT "", 14007, 12, 155, 160, 30 PUSHBUTTON "Ad&vanced", 14008, 180, 175, 50, 14, WS_TABSTOP END @@ -761,4 +761,6 @@ BEGIN IDS_FILE_DETAILS "Details for '%s' extension" IDS_FILE_DETAILSADV "Files with extension '%s' are of type '%s'. To change settings that affect all '%s' files, click Advanced." + IDS_FILE_TYPES "FileTypes" + IDS_COLUMN_EXTENSION "Extensions" END diff --git a/reactos/dll/win32/shell32/lang/cs-CZ.rc b/reactos/dll/win32/shell32/lang/cs-CZ.rc index bc8f9aa6c11..ae61ccdefbe 100644 --- a/reactos/dll/win32/shell32/lang/cs-CZ.rc +++ b/reactos/dll/win32/shell32/lang/cs-CZ.rc @@ -412,7 +412,7 @@ LTEXT "Otev //ICON LTEXT "Appname", 14005, 100, 140, 40, 10 PUSHBUTTON "&Zmnit...", 14006, 180, 140, 50, 14, WS_TABSTOP -LTEXT "Soubory s pponou '%s' jsou typu '%s'. Kliknutm na tlatko Pokroil lze zmnit nastaven pro vechny soubory '%s'.", 14007, 12, 155, 160, 30 +LTEXT "", 14007, 12, 155, 160, 30 PUSHBUTTON "&Pokroil", 14008, 180, 175, 50, 14, WS_TABSTOP END @@ -748,4 +748,6 @@ BEGIN IDS_FILE_DETAILS "Podrobnosti pro typ soubor '%s'" IDS_FILE_DETAILSADV "Soubory s pponou '%s' jsou typu '%s'. Kliknutm na tlatko Pokroil lze zmnit nastaven pro vechny soubory '%s'." + IDS_FILE_TYPES "FileTypes" + IDS_COLUMN_EXTENSION "Extensions" END diff --git a/reactos/dll/win32/shell32/lang/da-DK.rc b/reactos/dll/win32/shell32/lang/da-DK.rc index e9c5e412872..31142a6196c 100644 --- a/reactos/dll/win32/shell32/lang/da-DK.rc +++ b/reactos/dll/win32/shell32/lang/da-DK.rc @@ -413,7 +413,7 @@ LTEXT "Opens with:", -1, 12, 140, 40, 10 //ICON LTEXT "Appname", 14005, 100, 140, 40, 10 PUSHBUTTON "&Change...", 14006, 180, 140, 50, 14, WS_TABSTOP -LTEXT "Files with extension '%s' are of type '%s'. To change settings that affect all '%s' files, click Advanced.", 14007, 12, 155, 160, 30 +LTEXT "", 14007, 12, 155, 160, 30 PUSHBUTTON "Ad&vanced", 14008, 180, 175, 50, 14, WS_TABSTOP END @@ -750,4 +750,6 @@ BEGIN IDS_FILE_DETAILS "Details for '%s' extension" IDS_FILE_DETAILSADV "Files with extension '%s' are of type '%s'. To change settings that affect all '%s' files, click Advanced." + IDS_FILE_TYPES "FileTypes" + IDS_COLUMN_EXTENSION "Extensions" END diff --git a/reactos/dll/win32/shell32/lang/de-DE.rc b/reactos/dll/win32/shell32/lang/de-DE.rc index bfe735a5bc0..72edc251120 100644 --- a/reactos/dll/win32/shell32/lang/de-DE.rc +++ b/reactos/dll/win32/shell32/lang/de-DE.rc @@ -427,7 +427,7 @@ BEGIN //ICON LTEXT "Anwendungsname", 14005, 100, 140, 40, 10 PUSHBUTTON "n&dern...", 14006, 180, 140, 50, 14, WS_TABSTOP - LTEXT "Um die Einstellungen, die alle Dateien des Typs '%s' betreffen zu ndern, klicken Sie auf Erweitert.", 14007, 12, 155, 160, 30 + LTEXT "", 14007, 12, 155, 160, 30 PUSHBUTTON "&Erweitert", 14008, 180, 175, 50, 14, WS_TABSTOP END @@ -765,4 +765,6 @@ BEGIN IDS_FILE_DETAILS "Details zum Dateityp '%s'" IDS_FILE_DETAILSADV "Um die Einstellungen, die alle Dateien des Typs '%s' betreffen zu ndern, klicken Sie auf Erweitert." + IDS_FILE_TYPES "Dateitypen" + IDS_COLUMN_EXTENSION "Erweiterungen" END diff --git a/reactos/dll/win32/shell32/lang/el-GR.rc b/reactos/dll/win32/shell32/lang/el-GR.rc index 8b0198f936c..bb08952155a 100644 --- a/reactos/dll/win32/shell32/lang/el-GR.rc +++ b/reactos/dll/win32/shell32/lang/el-GR.rc @@ -424,7 +424,7 @@ LTEXT "Opens with:", -1, 12, 140, 40, 10 //ICON LTEXT "Appname", 14005, 100, 140, 40, 10 PUSHBUTTON "&Change...", 14006, 180, 140, 50, 14, WS_TABSTOP -LTEXT "Files with extension '%s' are of type '%s'. To change settings that affect all '%s' files, click Advanced.", 14007, 12, 155, 160, 30 +LTEXT "", 14007, 12, 155, 160, 30 PUSHBUTTON "Ad&vanced", 14008, 180, 175, 50, 14, WS_TABSTOP END @@ -762,4 +762,6 @@ BEGIN IDS_FILE_DETAILS "Details for '%s' extension" IDS_FILE_DETAILSADV "Files with extension '%s' are of type '%s'. To change settings that affect all '%s' files, click Advanced." + IDS_FILE_TYPES "FileTypes" + IDS_COLUMN_EXTENSION "Extensions" END diff --git a/reactos/dll/win32/shell32/lang/en-GB.rc b/reactos/dll/win32/shell32/lang/en-GB.rc index 8791d765b1b..20844af2f95 100644 --- a/reactos/dll/win32/shell32/lang/en-GB.rc +++ b/reactos/dll/win32/shell32/lang/en-GB.rc @@ -424,7 +424,7 @@ LTEXT "Opens with:", -1, 12, 140, 40, 10 //ICON LTEXT "Appname", 14005, 100, 140, 40, 10 PUSHBUTTON "&Change...", 14006, 180, 140, 50, 14, WS_TABSTOP -LTEXT "Files with extension '%s' are of type '%s'. To change settings that affect all '%s' files, click Advanced.", 14007, 12, 155, 160, 30 +LTEXT "", 14007, 12, 155, 160, 30 PUSHBUTTON "Ad&vanced", 14008, 180, 175, 50, 14, WS_TABSTOP END @@ -761,4 +761,6 @@ BEGIN IDS_FILE_DETAILS "Details for '%s' extension" IDS_FILE_DETAILSADV "Files with extension '%s' are of type '%s'. To change settings that affect all '%s' files, click Advanced." + IDS_FILE_TYPES "FileTypes" + IDS_COLUMN_EXTENSION "Extensions" END diff --git a/reactos/dll/win32/shell32/lang/en-US.rc b/reactos/dll/win32/shell32/lang/en-US.rc index 31266b4859c..1ae2b8c0c26 100644 --- a/reactos/dll/win32/shell32/lang/en-US.rc +++ b/reactos/dll/win32/shell32/lang/en-US.rc @@ -435,7 +435,7 @@ LTEXT "Opens with:", -1, 12, 140, 40, 10 //ICON LTEXT "Appname", 14005, 100, 140, 40, 10 PUSHBUTTON "&Change...", 14006, 180, 140, 50, 14, WS_TABSTOP -LTEXT "Files with extension '%s' are of type '%s'. To change settings that affect all '%s' files, click Advanced.", 14007, 12, 155, 160, 30 +LTEXT "", 14007, 12, 155, 160, 30 PUSHBUTTON "Ad&vanced", 14008, 180, 175, 50, 14, WS_TABSTOP END @@ -772,4 +772,6 @@ BEGIN IDS_FILE_DETAILS "Details for '%s' extension" IDS_FILE_DETAILSADV "Files with extension '%s' are of type '%s'. To change settings that affect all '%s' files, click Advanced." + IDS_FILE_TYPES "FileTypes" + IDS_COLUMN_EXTENSION "Extensions" END diff --git a/reactos/dll/win32/shell32/lang/es-ES.rc b/reactos/dll/win32/shell32/lang/es-ES.rc index accc4cecd02..f44b33948fa 100644 --- a/reactos/dll/win32/shell32/lang/es-ES.rc +++ b/reactos/dll/win32/shell32/lang/es-ES.rc @@ -437,7 +437,7 @@ LTEXT "Se abre con:", -1, 12, 140, 50, 10 //ICON LTEXT "Aplicacin", 14005, 100, 140, 40, 10 PUSHBUTTON "Cam&biar...", 14006, 230, 140, 50, 14, WS_TABSTOP -LTEXT "Archivos con extensin '%s' son del tipo '%s'. Para cambiar la configuracin de los archivos '%s', haga clic en Opciones avanzadas.", 14007, 12, 165, 220, 30 +LTEXT "", 14007, 12, 165, 220, 30 PUSHBUTTON "Opciones avanza&das", 14008, 190, 213, 90, 14, WS_TABSTOP END @@ -774,4 +774,6 @@ BEGIN IDS_FILE_DETAILS "Detalles para el tipo de archivo '%s'" IDS_FILE_DETAILSADV "Los archivos con extensin '%s' son del tipo '%s'. Para cambiar la configuracin de los archivos '%s', haga clic en Opciones avanzadas." + IDS_FILE_TYPES "FileTypes" + IDS_COLUMN_EXTENSION "Extensions" END diff --git a/reactos/dll/win32/shell32/lang/fi-FI.rc b/reactos/dll/win32/shell32/lang/fi-FI.rc index c6e70ca085d..e554eba007c 100644 --- a/reactos/dll/win32/shell32/lang/fi-FI.rc +++ b/reactos/dll/win32/shell32/lang/fi-FI.rc @@ -424,7 +424,7 @@ LTEXT "Opens with:", -1, 12, 140, 40, 10 //ICON LTEXT "Appname", 14005, 100, 140, 40, 10 PUSHBUTTON "&Change...", 14006, 180, 140, 50, 14, WS_TABSTOP -LTEXT "Files with extension '%s' are of type '%s'. To change settings that affect all '%s' files, click Advanced.", 14007, 12, 155, 160, 30 +LTEXT "", 14007, 12, 155, 160, 30 PUSHBUTTON "Ad&vanced", 14008, 180, 175, 50, 14, WS_TABSTOP END @@ -761,4 +761,6 @@ BEGIN IDS_FILE_DETAILS "Details for '%s' extension" IDS_FILE_DETAILSADV "Files with extension '%s' are of type '%s'. To change settings that affect all '%s' files, click Advanced." + IDS_FILE_TYPES "FileTypes" + IDS_COLUMN_EXTENSION "Extensions" END diff --git a/reactos/dll/win32/shell32/lang/fr-FR.rc b/reactos/dll/win32/shell32/lang/fr-FR.rc index 19964ae3d33..ec088732e40 100644 --- a/reactos/dll/win32/shell32/lang/fr-FR.rc +++ b/reactos/dll/win32/shell32/lang/fr-FR.rc @@ -428,7 +428,7 @@ LTEXT "Ouvrir avec :", -1, 12, 140, 40, 10 //ICON LTEXT "Nom de l'application", 14005, 100, 140, 40, 10 PUSHBUTTON "&Modifier...", 14006, 180, 140, 50, 14, WS_TABSTOP -LTEXT "Les fichiers avec l'extension '%s' sont de type '%s'. Pour modifier les paramtres qui concernent tous les fichiers '%s', cliquez sur Avanc.", 14007, 12, 155, 160, 30 +LTEXT "", 14007, 12, 155, 160, 30 PUSHBUTTON "A&vanc", 14008, 180, 175, 50, 14, WS_TABSTOP END @@ -765,4 +765,6 @@ BEGIN IDS_FILE_DETAILS "Dtails concernant l'extension '%s'" IDS_FILE_DETAILSADV "Les fichiers avec l'extension '%s' sont de type '%s'. Pour modifier les paramtres qui concernent tous les fichiers '%s', cliquez sur Avanc." + IDS_FILE_TYPES "FileTypes" + IDS_COLUMN_EXTENSION "Extensions" END diff --git a/reactos/dll/win32/shell32/lang/hu-HU.rc b/reactos/dll/win32/shell32/lang/hu-HU.rc index 9381fcb27bd..8f7d4e15650 100644 --- a/reactos/dll/win32/shell32/lang/hu-HU.rc +++ b/reactos/dll/win32/shell32/lang/hu-HU.rc @@ -427,7 +427,7 @@ LTEXT "Opens with:", -1, 12, 140, 40, 10 //ICON LTEXT "Appname", 14005, 100, 140, 40, 10 PUSHBUTTON "&Change...", 14006, 180, 140, 50, 14, WS_TABSTOP -LTEXT "Files with extension '%s' are of type '%s'. To change settings that affect all '%s' files, click Advanced.", 14007, 12, 155, 160, 30 +LTEXT "", 14007, 12, 155, 160, 30 PUSHBUTTON "Ad&vanced", 14008, 180, 175, 50, 14, WS_TABSTOP END @@ -764,4 +764,6 @@ BEGIN IDS_FILE_DETAILS "Details for '%s' extension" IDS_FILE_DETAILSADV "Files with extension '%s' are of type '%s'. To change settings that affect all '%s' files, click Advanced." + IDS_FILE_TYPES "FileTypes" + IDS_COLUMN_EXTENSION "Extensions" END diff --git a/reactos/dll/win32/shell32/lang/it-IT.rc b/reactos/dll/win32/shell32/lang/it-IT.rc index 39ace93692d..e5be401cac2 100644 --- a/reactos/dll/win32/shell32/lang/it-IT.rc +++ b/reactos/dll/win32/shell32/lang/it-IT.rc @@ -435,7 +435,7 @@ LTEXT "Si apre con:", -1, 12, 140, 40, 10 //ICON LTEXT "Nome", 14005, 100, 140, 40, 10 PUSHBUTTON "&Cambia...", 14006, 180, 140, 50, 14, WS_TABSTOP -LTEXT "I files con estensione '%s' sono di tipo '%s'. Per cambiare le impostazioni per tutti i file '%s', cliccare su Avanzate.", 14007, 12, 155, 160, 30 +LTEXT "", 14007, 12, 155, 160, 30 PUSHBUTTON "A&vanzate", 14008, 180, 175, 50, 14, WS_TABSTOP END @@ -772,4 +772,6 @@ BEGIN IDS_FILE_DETAILS "Dettagli per l'estensione '%s'" IDS_FILE_DETAILSADV "I files con estensione '%s' sono di tipo '%s'. Per modificare le impostazioni per tutti i file '%s', cliccare su Avanzate." + IDS_FILE_TYPES "FileTypes" + IDS_COLUMN_EXTENSION "Extensions" END diff --git a/reactos/dll/win32/shell32/lang/ja-JP.rc b/reactos/dll/win32/shell32/lang/ja-JP.rc index cb62fdb740c..077bf43339c 100644 --- a/reactos/dll/win32/shell32/lang/ja-JP.rc +++ b/reactos/dll/win32/shell32/lang/ja-JP.rc @@ -424,7 +424,7 @@ LTEXT " //ICON LTEXT "Av", 14005, 100, 140, 40, 10 PUSHBUTTON "ύX(&C)...", 14006, 180, 140, 50, 14, WS_TABSTOP -LTEXT "gq '%s' ̃t@C̎ނ'%s'łB '%s' ̃t@CׂĂɑ΂ݒύXɂ ڍאݒNbNĂB", 14007, 12, 155, 160, 30 +LTEXT "", 14007, 12, 155, 160, 30 PUSHBUTTON "ڍאݒ(&V)", 14008, 180, 175, 50, 14, WS_TABSTOP END @@ -761,4 +761,6 @@ BEGIN IDS_FILE_DETAILS "gq '%s' ̏ڍ" IDS_FILE_DETAILSADV "gq '%s' ̃t@C̎ނ'%s'łB '%s' ̃t@CׂĂɑ΂ݒύXɂ ڍאݒNbNĂB" + IDS_FILE_TYPES "FileTypes" + IDS_COLUMN_EXTENSION "Extensions" END diff --git a/reactos/dll/win32/shell32/lang/ko-KR.rc b/reactos/dll/win32/shell32/lang/ko-KR.rc index 0bb1f329674..0f746160c3d 100644 --- a/reactos/dll/win32/shell32/lang/ko-KR.rc +++ b/reactos/dll/win32/shell32/lang/ko-KR.rc @@ -424,7 +424,7 @@ LTEXT "Opens with:", -1, 12, 140, 40, 10 //ICON LTEXT "Appname", 14005, 100, 140, 40, 10 PUSHBUTTON "&Change...", 14006, 180, 140, 50, 14, WS_TABSTOP -LTEXT "Files with extension '%s' are of type '%s'. To change settings that affect all '%s' files, click Advanced.", 14007, 12, 155, 160, 30 +LTEXT "", 14007, 12, 155, 160, 30 PUSHBUTTON "Ad&vanced", 14008, 180, 175, 50, 14, WS_TABSTOP END @@ -761,4 +761,6 @@ BEGIN IDS_FILE_DETAILS "Details for '%s' extension" IDS_FILE_DETAILSADV "Files with extension '%s' are of type '%s'. To change settings that affect all '%s' files, click Advanced." + IDS_FILE_TYPES "FileTypes" + IDS_COLUMN_EXTENSION "Extensions" END diff --git a/reactos/dll/win32/shell32/lang/nl-NL.rc b/reactos/dll/win32/shell32/lang/nl-NL.rc index 784be8dec05..0e55ef5c514 100644 --- a/reactos/dll/win32/shell32/lang/nl-NL.rc +++ b/reactos/dll/win32/shell32/lang/nl-NL.rc @@ -424,7 +424,7 @@ LTEXT "Opens with:", -1, 12, 140, 40, 10 //ICON LTEXT "Appname", 14005, 100, 140, 40, 10 PUSHBUTTON "&Change...", 14006, 180, 140, 50, 14, WS_TABSTOP -LTEXT "Files with extension '%s' are of type '%s'. To change settings that affect all '%s' files, click Advanced.", 14007, 12, 155, 160, 30 +LTEXT "", 14007, 12, 155, 160, 30 PUSHBUTTON "Ad&vanced", 14008, 180, 175, 50, 14, WS_TABSTOP END @@ -761,4 +761,6 @@ BEGIN IDS_FILE_DETAILS "Details for '%s' extension" IDS_FILE_DETAILSADV "Files with extension '%s' are of type '%s'. To change settings that affect all '%s' files, click Advanced." + IDS_FILE_TYPES "FileTypes" + IDS_COLUMN_EXTENSION "Extensions" END diff --git a/reactos/dll/win32/shell32/lang/no-NO.rc b/reactos/dll/win32/shell32/lang/no-NO.rc index 41464164dae..5b5342912e0 100644 --- a/reactos/dll/win32/shell32/lang/no-NO.rc +++ b/reactos/dll/win32/shell32/lang/no-NO.rc @@ -425,7 +425,7 @@ LTEXT " //ICON LTEXT "Appname", 14005, 100, 140, 40, 10 PUSHBUTTON "&Endre...", 14006, 180, 140, 50, 14, WS_TABSTOP -LTEXT "Filer med utvidelser '%s' er av typen '%s'. For endre innstillingene som er av filen '%s', trykk p avansert.", 14007, 12, 155, 160, 30 +LTEXT "", 14007, 12, 155, 160, 30 PUSHBUTTON "Av&ansert", 14008, 180, 175, 50, 14, WS_TABSTOP END @@ -764,4 +764,6 @@ BEGIN IDS_FILE_DETAILS "Detailjer for '%s' utvidelser" IDS_FILE_DETAILSADV "Filer med utvidelser '%s' er av typen '%s'. For endre innstillingene som er av filen '%s', trykk p avansert." + IDS_FILE_TYPES "FileTypes" + IDS_COLUMN_EXTENSION "Extensions" END diff --git a/reactos/dll/win32/shell32/lang/pl-PL.rc b/reactos/dll/win32/shell32/lang/pl-PL.rc index 283ddbf3db9..af8e48fda01 100644 --- a/reactos/dll/win32/shell32/lang/pl-PL.rc +++ b/reactos/dll/win32/shell32/lang/pl-PL.rc @@ -432,7 +432,7 @@ LTEXT "Otwiera z:", -1, 12, 140, 40, 10 //ICON LTEXT "Nazwa Aplikacji", 14005, 100, 140, 40, 10 PUSHBUTTON "Z&mie", 14006, 180, 140, 50, 14, WS_TABSTOP -LTEXT "Pliki z rozszerzeniem '%s' nale do typu: '%s'. Aby zmieni ustawienia dotyczce wszystkich plikw '%s', wybierz Zaawansowane.", 14007, 12, 155, 160, 30 +LTEXT "", 14007, 12, 155, 160, 30 PUSHBUTTON "Zaawa&nsowane", 14008, 180, 175, 50, 14, WS_TABSTOP END @@ -769,4 +769,6 @@ BEGIN IDS_FILE_DETAILS "Szczegy dla rozszerzenia '%s'" IDS_FILE_DETAILSADV "Pliki z rozszerzeniem '%s' s typu '%s'. Aby zmieni ustawienia, ktre dotycz wszystkich plikw '%s', kliknij przycisk Zaawansowane." + IDS_FILE_TYPES "FileTypes" + IDS_COLUMN_EXTENSION "Extensions" END diff --git a/reactos/dll/win32/shell32/lang/pt-BR.rc b/reactos/dll/win32/shell32/lang/pt-BR.rc index 008950441fa..b795809137b 100644 --- a/reactos/dll/win32/shell32/lang/pt-BR.rc +++ b/reactos/dll/win32/shell32/lang/pt-BR.rc @@ -426,7 +426,7 @@ LTEXT "Opens with:", -1, 12, 140, 40, 10 //ICON LTEXT "Appname", 14005, 100, 140, 40, 10 PUSHBUTTON "&Change...", 14006, 180, 140, 50, 14, WS_TABSTOP -LTEXT "Files with extension '%s' are of type '%s'. To change settings that affect all '%s' files, click Advanced.", 14007, 12, 155, 160, 30 +LTEXT "", 14007, 12, 155, 160, 30 PUSHBUTTON "Ad&vanced", 14008, 180, 175, 50, 14, WS_TABSTOP END @@ -763,4 +763,6 @@ BEGIN IDS_FILE_DETAILS "Details for '%s' extension" IDS_FILE_DETAILSADV "Files with extension '%s' are of type '%s'. To change settings that affect all '%s' files, click Advanced." + IDS_FILE_TYPES "FileTypes" + IDS_COLUMN_EXTENSION "Extensions" END diff --git a/reactos/dll/win32/shell32/lang/pt-PT.rc b/reactos/dll/win32/shell32/lang/pt-PT.rc index d6b9c8ee078..99d51b58331 100644 --- a/reactos/dll/win32/shell32/lang/pt-PT.rc +++ b/reactos/dll/win32/shell32/lang/pt-PT.rc @@ -427,7 +427,7 @@ LTEXT "Abre com:", -1, 12, 140, 40, 10 //ICON LTEXT "Appnome", 14005, 100, 140, 40, 10 PUSHBUTTON "&Mudar...", 14006, 180, 140, 50, 14, WS_TABSTOP -LTEXT "Ficheiros com extenso '%s' so do tipo '%s'. Para mudar definies que afectam todos '%s' ficheiros, click Avanado.", 14007, 12, 155, 160, 30 +LTEXT "", 14007, 12, 155, 160, 30 PUSHBUTTON "A&vanado", 14008, 180, 175, 50, 14, WS_TABSTOP END @@ -764,4 +764,6 @@ BEGIN IDS_FILE_DETAILS "Detalhes para '%s' extenso" IDS_FILE_DETAILSADV "Ficheiros com extenso '%s' so do tipo '%s'. Para mudar definies que afectam todos '%s' ficheiros, click Avanado." + IDS_FILE_TYPES "FileTypes" + IDS_COLUMN_EXTENSION "Extensions" END diff --git a/reactos/dll/win32/shell32/lang/ro-RO.rc b/reactos/dll/win32/shell32/lang/ro-RO.rc index 5c2310545ea..ebf83231aa9 100644 --- a/reactos/dll/win32/shell32/lang/ro-RO.rc +++ b/reactos/dll/win32/shell32/lang/ro-RO.rc @@ -427,7 +427,7 @@ LTEXT "Deschidere cu:", -1, 12, 140, 40, 10 //ICON LTEXT "Nume ap.", 14005, 100, 140, 40, 10 PUSHBUTTON "&Schimbare", 14006, 180, 140, 50, 14, WS_TABSTOP -LTEXT "Fișierele cu extensia '%s' sunt de tipul '%s'. Pentru a schimbat setări care vor afecta toate fișierele '%s', clic pe Avansat.", 14007, 12, 155, 160, 30 +LTEXT "", 14007, 12, 155, 160, 30 PUSHBUTTON "A&vansat", 14008, 180, 175, 50, 14, WS_TABSTOP END @@ -763,6 +763,8 @@ BEGIN IDS_FILE_DETAILS "Detalii pentru extensia '%s'" IDS_FILE_DETAILSADV "Fișierele cu extensia '%s' sunt de tipul '%s'. Pentru a schimbat setări care vor afecta toate fișierele '%s', clic pe Avansat." + IDS_FILE_TYPES "FileTypes" + IDS_COLUMN_EXTENSION "Extensions" END #pragma code_page(default) diff --git a/reactos/dll/win32/shell32/lang/ru-RU.rc b/reactos/dll/win32/shell32/lang/ru-RU.rc index d038aa3f6d8..36de151db0d 100644 --- a/reactos/dll/win32/shell32/lang/ru-RU.rc +++ b/reactos/dll/win32/shell32/lang/ru-RU.rc @@ -424,7 +424,7 @@ LTEXT " //ICON LTEXT ":", 14005, 100, 142, 54, 10 PUSHBUTTON "&...", 14006, 180, 140, 63, 14, WS_TABSTOP -LTEXT " '%s' '%s'. '%s', ''.", 14007, 12, 155, 162, 36 +LTEXT "", 14007, 12, 155, 162, 36 PUSHBUTTON "&", 14008, 180, 175, 63, 14, WS_TABSTOP END @@ -760,4 +760,6 @@ BEGIN IDS_FILE_DETAILS " '%s'" IDS_FILE_DETAILSADV " '%s' '%s'. '%s', ''." + IDS_FILE_TYPES " " + IDS_COLUMN_EXTENSION "" END diff --git a/reactos/dll/win32/shell32/lang/sk-SK.rc b/reactos/dll/win32/shell32/lang/sk-SK.rc index 7e25164eee9..44e228a878a 100644 --- a/reactos/dll/win32/shell32/lang/sk-SK.rc +++ b/reactos/dll/win32/shell32/lang/sk-SK.rc @@ -430,7 +430,7 @@ LTEXT "Opens with:", -1, 12, 140, 40, 10 //ICON LTEXT "Appname", 14005, 100, 140, 40, 10 PUSHBUTTON "&Zmeni...", 14006, 180, 140, 50, 14, WS_TABSTOP -LTEXT "Files with extension '%s' are of type '%s'. To change settings that affect all '%s' files, click Advanced.", 14007, 12, 155, 160, 30 +LTEXT "", 14007, 12, 155, 160, 30 PUSHBUTTON "Ad&vanced", 14008, 180, 175, 50, 14, WS_TABSTOP END @@ -769,4 +769,6 @@ BEGIN IDS_FILE_DETAILS "Details for '%s' extension" IDS_FILE_DETAILSADV "Files with extension '%s' are of type '%s'. To change settings that affect all '%s' files, click Advanced." + IDS_FILE_TYPES "FileTypes" + IDS_COLUMN_EXTENSION "Extensions" END diff --git a/reactos/dll/win32/shell32/lang/sl-SI.rc b/reactos/dll/win32/shell32/lang/sl-SI.rc index 9b9f01b9a3e..5fbdbdd1518 100644 --- a/reactos/dll/win32/shell32/lang/sl-SI.rc +++ b/reactos/dll/win32/shell32/lang/sl-SI.rc @@ -424,7 +424,7 @@ LTEXT "Opens with:", -1, 12, 140, 40, 10 //ICON LTEXT "Appname", 14005, 100, 140, 40, 10 PUSHBUTTON "&Change...", 14006, 180, 140, 50, 14, WS_TABSTOP -LTEXT "Files with extension '%s' are of type '%s'. To change settings that affect all '%s' files, click Advanced.", 14007, 12, 155, 160, 30 +LTEXT "", 14007, 12, 155, 160, 30 PUSHBUTTON "Ad&vanced", 14008, 180, 175, 50, 14, WS_TABSTOP END @@ -761,4 +761,6 @@ BEGIN IDS_FILE_DETAILS "Details for '%s' extension" IDS_FILE_DETAILSADV "Files with extension '%s' are of type '%s'. To change settings that affect all '%s' files, click Advanced." + IDS_FILE_TYPES "FileTypes" + IDS_COLUMN_EXTENSION "Extensions" END diff --git a/reactos/dll/win32/shell32/lang/sv-SE.rc b/reactos/dll/win32/shell32/lang/sv-SE.rc index 117b1196d73..ae5f88381bf 100644 --- a/reactos/dll/win32/shell32/lang/sv-SE.rc +++ b/reactos/dll/win32/shell32/lang/sv-SE.rc @@ -424,7 +424,7 @@ LTEXT "Opens with:", -1, 12, 140, 40, 10 //ICON LTEXT "Appname", 14005, 100, 140, 40, 10 PUSHBUTTON "&Change...", 14006, 180, 140, 50, 14, WS_TABSTOP -LTEXT "Files with extension '%s' are of type '%s'. To change settings that affect all '%s' files, click Advanced.", 14007, 12, 155, 160, 30 +LTEXT "", 14007, 12, 155, 160, 30 PUSHBUTTON "Ad&vanced", 14008, 180, 175, 50, 14, WS_TABSTOP END @@ -761,4 +761,6 @@ BEGIN IDS_FILE_DETAILS "Details for '%s' extension" IDS_FILE_DETAILSADV "Files with extension '%s' are of type '%s'. To change settings that affect all '%s' files, click Advanced." + IDS_FILE_TYPES "FileTypes" + IDS_COLUMN_EXTENSION "Extensions" END diff --git a/reactos/dll/win32/shell32/lang/tr-TR.rc b/reactos/dll/win32/shell32/lang/tr-TR.rc index b3153ac1f3e..59600e9c3d1 100644 --- a/reactos/dll/win32/shell32/lang/tr-TR.rc +++ b/reactos/dll/win32/shell32/lang/tr-TR.rc @@ -424,7 +424,7 @@ LTEXT "Opens with:", -1, 12, 140, 40, 10 //ICON LTEXT "Appname", 14005, 100, 140, 40, 10 PUSHBUTTON "&Change...", 14006, 180, 140, 50, 14, WS_TABSTOP -LTEXT "Files with extension '%s' are of type '%s'. To change settings that affect all '%s' files, click Advanced.", 14007, 12, 155, 160, 30 +LTEXT "", 14007, 12, 155, 160, 30 PUSHBUTTON "Ad&vanced", 14008, 180, 175, 50, 14, WS_TABSTOP END @@ -761,4 +761,6 @@ BEGIN IDS_FILE_DETAILS "Details for '%s' extension" IDS_FILE_DETAILSADV "Files with extension '%s' are of type '%s'. To change settings that affect all '%s' files, click Advanced." + IDS_FILE_TYPES "FileTypes" + IDS_COLUMN_EXTENSION "Extensions" END diff --git a/reactos/dll/win32/shell32/lang/uk-UA.rc b/reactos/dll/win32/shell32/lang/uk-UA.rc index 9c48275745b..37541587583 100644 --- a/reactos/dll/win32/shell32/lang/uk-UA.rc +++ b/reactos/dll/win32/shell32/lang/uk-UA.rc @@ -437,7 +437,7 @@ LTEXT "³ //ICON LTEXT "", 14005, 100, 140, 40, 10 PUSHBUTTON "&...", 14006, 180, 140, 50, 14, WS_TABSTOP -LTEXT " '%s' '%s'. , '%s', ''.", 14007, 12, 155, 160, 30 +LTEXT "", 14007, 12, 155, 160, 40 PUSHBUTTON "&", 14008, 180, 175, 50, 14, WS_TABSTOP END @@ -774,4 +774,6 @@ BEGIN IDS_FILE_DETAILS " '%s'" IDS_FILE_DETAILSADV " '%s' '%s'. , '%s', ''." + IDS_FILE_TYPES " " + IDS_COLUMN_EXTENSION "" END diff --git a/reactos/dll/win32/shell32/lang/zh-CN.rc b/reactos/dll/win32/shell32/lang/zh-CN.rc index 8e6978bb86b..00602a08085 100644 --- a/reactos/dll/win32/shell32/lang/zh-CN.rc +++ b/reactos/dll/win32/shell32/lang/zh-CN.rc @@ -413,7 +413,7 @@ LTEXT "Opens with:", -1, 12, 140, 40, 10 //ICON LTEXT "Appname", 14005, 100, 140, 40, 10 PUSHBUTTON "&Change...", 14006, 180, 140, 50, 14, WS_TABSTOP -LTEXT "Files with extension '%s' are of type '%s'. To change settings that affect all '%s' files, click Advanced.", 14007, 12, 155, 160, 30 +LTEXT "", 14007, 12, 155, 160, 30 PUSHBUTTON "Ad&vanced", 14008, 180, 175, 50, 14, WS_TABSTOP END @@ -749,5 +749,7 @@ BEGIN IDS_FILE_DETAILS "Details for '%s' extension" IDS_FILE_DETAILSADV "Files with extension '%s' are of type '%s'. To change settings that affect all '%s' files, click Advanced." + IDS_FILE_TYPES "FileTypes" + IDS_COLUMN_EXTENSION "Extensions" END diff --git a/reactos/dll/win32/shell32/lang/zh-TW.rc b/reactos/dll/win32/shell32/lang/zh-TW.rc index 8b4a9893c77..376f7fbb056 100644 --- a/reactos/dll/win32/shell32/lang/zh-TW.rc +++ b/reactos/dll/win32/shell32/lang/zh-TW.rc @@ -425,7 +425,7 @@ LTEXT "Opens with:", -1, 12, 140, 40, 10 //ICON LTEXT "Appname", 14005, 100, 140, 40, 10 PUSHBUTTON "&Change...", 14006, 180, 140, 50, 14, WS_TABSTOP -LTEXT "Files with extension '%s' are of type '%s'. To change settings that affect all '%s' files, click Advanced.", 14007, 12, 155, 160, 30 +LTEXT "", 14007, 12, 155, 160, 30 PUSHBUTTON "Ad&vanced", 14008, 180, 175, 50, 14, WS_TABSTOP END @@ -762,6 +762,8 @@ BEGIN IDS_FILE_DETAILS "Details for '%s' extension" IDS_FILE_DETAILSADV "Files with extension '%s' are of type '%s'. To change settings that affect all '%s' files, click Advanced." + IDS_FILE_TYPES "FileTypes" + IDS_COLUMN_EXTENSION "Extensions" END #pragma code_page(default) From 45e1070d6d68ff7636c64efe179ab98ffe129058 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Thu, 5 May 2011 20:27:05 +0000 Subject: [PATCH 304/317] [EVENTLOG] Fix the calculation of the number of event records. svn path=/trunk/; revision=51598 --- reactos/base/services/eventlog/rpc.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/reactos/base/services/eventlog/rpc.c b/reactos/base/services/eventlog/rpc.c index 5991da71f76..0f1a8acad0f 100644 --- a/reactos/base/services/eventlog/rpc.c +++ b/reactos/base/services/eventlog/rpc.c @@ -199,7 +199,7 @@ NTSTATUS ElfrNumberOfRecords( DWORD *NumberOfRecords) { PLOGHANDLE lpLogHandle; - DWORD dwRecords; + PLOGFILE lpLogFile; lpLogHandle = ElfGetLogHandleEntryByHandle(LogHandle); if (!lpLogHandle) @@ -207,9 +207,13 @@ NTSTATUS ElfrNumberOfRecords( return STATUS_INVALID_HANDLE; } - dwRecords = lpLogHandle->LogFile->Header.CurrentRecordNumber; + lpLogFile = lpLogHandle->LogFile; - *NumberOfRecords = (dwRecords > 0) ? (dwRecords - 1) : 0; + if (lpLogFile->Header.OldestRecordNumber == 0) + *NumberOfRecords = 0; + else + *NumberOfRecords = lpLogFile->Header.CurrentRecordNumber - + lpLogFile->Header.OldestRecordNumber; return STATUS_SUCCESS; } From c99f3785496095f6a43462010a6a433207b7c241 Mon Sep 17 00:00:00 2001 From: Gregor Schneider Date: Thu, 5 May 2011 20:36:07 +0000 Subject: [PATCH 305/317] [charmap] [eventvwr] [reactos] [syssetup] - Igor Paliychuk : Update RU and UA resources svn path=/trunk/; revision=51600 --- .../base/applications/charmap/lang/ru-RU.rc | 14 ++++++------- .../base/applications/charmap/lang/uk-UA.rc | 14 ++++++------- .../mscutils/eventvwr/lang/ru-RU.rc | 20 +++++++++---------- .../mscutils/eventvwr/lang/uk-UA.rc | 4 ++-- reactos/base/setup/reactos/lang/uk-UA.rc | 14 ++++++------- reactos/dll/win32/syssetup/lang/uk-UA.rc | 4 ++-- 6 files changed, 35 insertions(+), 35 deletions(-) diff --git a/reactos/base/applications/charmap/lang/ru-RU.rc b/reactos/base/applications/charmap/lang/ru-RU.rc index c52593abcb1..dcc1effd04c 100644 --- a/reactos/base/applications/charmap/lang/ru-RU.rc +++ b/reactos/base/applications/charmap/lang/ru-RU.rc @@ -14,21 +14,21 @@ BEGIN CONTROL "",IDC_TEXTBOX,RICHEDIT_CLASS,ES_AUTOHSCROLL | WS_BORDER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 74, 186, 114, 13 DEFPUSHBUTTON "", IDC_SELECT, 194, 186, 44, 13 PUSHBUTTON "", IDC_COPY, 242, 186, 44, 13, WS_DISABLED - CONTROL "Advanced view",IDC_CHECK_ADVANCED,"Button", BS_AUTOCHECKBOX | WS_TABSTOP, 8, 208, 95, 10 + CONTROL " ",IDC_CHECK_ADVANCED,"Button", BS_AUTOCHECKBOX | WS_TABSTOP, 8, 208, 95, 10 END IDD_ADVANCED DIALOGEX 0, 0, 292, 64 STYLE DS_SHELLFONT | WS_CHILD FONT 8, "MS Shell Dlg" BEGIN - LTEXT "Charset:",IDC_STATIC,8,8,48,8 + LTEXT " :",IDC_STATIC,8,8,55,8 COMBOBOX IDC_COMBO_CHARSET,72,4,116,80,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - LTEXT "Group by:",IDC_STATIC,8,28,50,8 + LTEXT " :",IDC_STATIC,8,28,50,8 COMBOBOX IDC_COMBO_GROUPBY,72,24,116,80,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Search",IDC_BUTTON_SEARCH,200,44,50,14 + PUSHBUTTON "",IDC_BUTTON_SEARCH,200,44,50,14 EDITTEXT IDC_EDIT_SEARCH,72,44,116,14,ES_AUTOHSCROLL - LTEXT "Search for:",IDC_STATIC,8,48,42,8 - LTEXT "Unicode:",IDC_STATIC,200,8,30,8 + LTEXT ":",IDC_STATIC,8,48,42,8 + LTEXT ":",IDC_STATIC,200,8,30,8 EDITTEXT IDC_EDIT_UNICODE,236,4,28,12,ES_AUTOHSCROLL END @@ -47,5 +47,5 @@ STRINGTABLE DISCARDABLE BEGIN IDS_LICENSE " ; () , GNU, ; 2 , ( ) , .\r\n\r\n , , - , . GNU.\r\n\r\n GNU, , (Free Software Foundation, Inc.), 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA." IDS_ABOUT "& ..." - IDS_TITLE "Character Map" + IDS_TITLE " " END diff --git a/reactos/base/applications/charmap/lang/uk-UA.rc b/reactos/base/applications/charmap/lang/uk-UA.rc index a76da186bec..9d4cbe8e80c 100644 --- a/reactos/base/applications/charmap/lang/uk-UA.rc +++ b/reactos/base/applications/charmap/lang/uk-UA.rc @@ -20,21 +20,21 @@ BEGIN CONTROL "",IDC_TEXTBOX,RICHEDIT_CLASS,ES_AUTOHSCROLL | WS_BORDER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 74, 186, 114, 13 DEFPUSHBUTTON "", IDC_SELECT, 194, 186, 44, 13 PUSHBUTTON "", IDC_COPY, 242, 186, 44, 13, WS_DISABLED - CONTROL "Advanced view",IDC_CHECK_ADVANCED,"Button", BS_AUTOCHECKBOX | WS_TABSTOP, 8, 208, 95, 10 + CONTROL " ",IDC_CHECK_ADVANCED,"Button", BS_AUTOCHECKBOX | WS_TABSTOP, 8, 208, 95, 10 END IDD_ADVANCED DIALOGEX 0, 0, 292, 64 STYLE DS_SHELLFONT | WS_CHILD FONT 8, "MS Shell Dlg" BEGIN - LTEXT "Charset:",IDC_STATIC,8,8,48,8 + LTEXT " :",IDC_STATIC,8,8,55,8 COMBOBOX IDC_COMBO_CHARSET,72,4,116,80,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - LTEXT "Group by:",IDC_STATIC,8,28,50,8 + LTEXT " :",IDC_STATIC,8,28,50,8 COMBOBOX IDC_COMBO_GROUPBY,72,24,116,80,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Search",IDC_BUTTON_SEARCH,200,44,50,14 + PUSHBUTTON "",IDC_BUTTON_SEARCH,200,44,50,14 EDITTEXT IDC_EDIT_SEARCH,72,44,116,14,ES_AUTOHSCROLL - LTEXT "Search for:",IDC_STATIC,8,48,42,8 - LTEXT "Unicode:",IDC_STATIC,200,8,30,8 + LTEXT ":",IDC_STATIC,8,48,42,8 + LTEXT ":",IDC_STATIC,200,8,30,8 EDITTEXT IDC_EDIT_UNICODE,236,4,28,12,ES_AUTOHSCROLL END @@ -53,5 +53,5 @@ STRINGTABLE DISCARDABLE BEGIN IDS_LICENSE " - ; , ³ GNU, ; 2 , - , .\r\n\r\n 䳿 , , - Ҳ, Ҳ Ҳ Ҳ . ³ GNU.\r\n\r\n ³ GNU. , (Free Software Foundation, Inc.), 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA." IDS_ABOUT "& ..." - IDS_TITLE "Character Map" + IDS_TITLE " C" END diff --git a/reactos/base/applications/mscutils/eventvwr/lang/ru-RU.rc b/reactos/base/applications/mscutils/eventvwr/lang/ru-RU.rc index e2c6cb2f714..e36da0ee26d 100644 --- a/reactos/base/applications/mscutils/eventvwr/lang/ru-RU.rc +++ b/reactos/base/applications/mscutils/eventvwr/lang/ru-RU.rc @@ -105,19 +105,19 @@ END STRINGTABLE BEGIN - IDS_COLUMNTYPE "Type" - IDS_COLUMNDATE "Date" - IDS_COLUMNTIME "Time" - IDS_COLUMNSOURCE "Source" - IDS_COLUMNCATEGORY "Category" - IDS_COLUMNEVENT "Event" - IDS_COLUMNUSER "User" - IDS_COLUMNCOMPUTER "Computer" - IDS_COLUMNEVENTDATA "Event Data" + IDS_COLUMNTYPE "" + IDS_COLUMNDATE "" + IDS_COLUMNTIME "" + IDS_COLUMNSOURCE "" + IDS_COLUMNCATEGORY "" + IDS_COLUMNEVENT "" + IDS_COLUMNUSER "" + IDS_COLUMNCOMPUTER "" + IDS_COLUMNEVENTDATA " " END STRINGTABLE BEGIN - IDS_NONE "None" + IDS_NONE "" IDS_NOT_AVAILABLE "N/A" END diff --git a/reactos/base/applications/mscutils/eventvwr/lang/uk-UA.rc b/reactos/base/applications/mscutils/eventvwr/lang/uk-UA.rc index 8a703aecf5c..a8faa4fac6d 100644 --- a/reactos/base/applications/mscutils/eventvwr/lang/uk-UA.rc +++ b/reactos/base/applications/mscutils/eventvwr/lang/uk-UA.rc @@ -43,7 +43,7 @@ CAPTION " FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN ICON IDI_EVENTVWR,IDC_MYICON,14,9,21,20 - LTEXT "ReactOS 1.0",IDC_STATIC,49,10,119,8,SS_NOPREFIX + LTEXT " ReactOS 1.0",IDC_STATIC,49,10,119,8,SS_NOPREFIX LTEXT "Copyright (C) 2007 Marc Piulachs (marc.piulachs@codexchange.net)",IDC_STATIC,49,20,119,22 DEFPUSHBUTTON "OK",IDOK,90,48,42,16,WS_GROUP END @@ -118,6 +118,6 @@ END STRINGTABLE BEGIN - IDS_NONE "None" + IDS_NONE "" IDS_NOT_AVAILABLE "N/A" END diff --git a/reactos/base/setup/reactos/lang/uk-UA.rc b/reactos/base/setup/reactos/lang/uk-UA.rc index 7e52e71b499..99f395a9562 100644 --- a/reactos/base/setup/reactos/lang/uk-UA.rc +++ b/reactos/base/setup/reactos/lang/uk-UA.rc @@ -71,18 +71,18 @@ BEGIN LTEXT " ", IDC_STATIC, 10, 180 ,277, 20 END -IDD_PARTITION DIALOGEX DISCARDABLE 0, 0, 145, 90 +IDD_PARTITION DIALOGEX DISCARDABLE 0, 0, 172, 90 STYLE WS_VISIBLE|WS_CAPTION|WS_THICKFRAME CAPTION " " FONT 8, "MS Shell Dlg" BEGIN - CONTROL "",IDC_UPDOWN1,"msctls_updown32", WS_VISIBLE,104,22,9,13 - CONTROL " ",IDC_STATIC,"Button",BS_GROUPBOX,7,5,129,57 + CONTROL "",IDC_UPDOWN1,"msctls_updown32", WS_VISIBLE,131,22,9,13 + CONTROL " ",IDC_STATIC,"Button",BS_GROUPBOX,7,5,156,57 LTEXT ":",IDC_STATIC, 13,24,27,9 - EDITTEXT IDC_PARTSIZE,52,23,53,13, WS_VISIBLE|WS_TABSTOP - LTEXT "",IDC_UNIT, 117,24,14,9 - LTEXT " :",IDC_STATIC,13,46,35,9 - CONTROL "",IDC_FSTYPE,"ComboBox",WS_VISIBLE|WS_TABSTOP|CBS_DROPDOWNLIST,52,42,79,50 + EDITTEXT IDC_PARTSIZE,79,23,53,13, WS_VISIBLE|WS_TABSTOP + LTEXT "",IDC_UNIT, 144,24,14,9 + LTEXT " :",IDC_STATIC,13,46,65,9 + CONTROL "",IDC_FSTYPE,"ComboBox",WS_VISIBLE|WS_TABSTOP|CBS_DROPDOWNLIST,79,42,79,50 PUSHBUTTON "&OK",IDOK,35,68,47,15, WS_VISIBLE|WS_TABSTOP PUSHBUTTON "&",IDCANCEL,87,68,47,15, WS_VISIBLE|WS_TABSTOP END diff --git a/reactos/dll/win32/syssetup/lang/uk-UA.rc b/reactos/dll/win32/syssetup/lang/uk-UA.rc index 7d10b8b8845..eda7715287f 100644 --- a/reactos/dll/win32/syssetup/lang/uk-UA.rc +++ b/reactos/dll/win32/syssetup/lang/uk-UA.rc @@ -194,7 +194,7 @@ BEGIN IDS_CMT_CALC " " IDS_CMT_CMD "³ " IDS_CMT_DEVMGMT " " - IDS_CMT_EVENTVIEW " " + IDS_CMT_EVENTVIEW " " IDS_CMT_EXPLORER " " IDS_CMT_MSCONFIG " " IDS_CMT_NOTEPAD " " @@ -258,7 +258,7 @@ BEGIN IDS_SHORT_DEVICE " .lnk" IDS_SHORT_DOWNLOADER " ReactOS.lnk" IDS_SHORT_DXDIAG "ij ReactX.lnk" - IDS_SHORT_EVENTVIEW " .lnk" + IDS_SHORT_EVENTVIEW " .lnk" IDS_SHORT_EXPLORER " ReactOS.lnk" IDS_SHORT_KBSWITCH " .lnk" IDS_SHORT_MAGNIFY " .lnk" From 036acd8c8c0a5f837ad026dd92c5c7299d36f06b Mon Sep 17 00:00:00 2001 From: Olaf Siejka Date: Thu, 5 May 2011 21:09:37 +0000 Subject: [PATCH 306/317] [SHELL32] - Translation update svn path=/trunk/; revision=51602 --- reactos/dll/win32/shell32/lang/pl-PL.rc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/reactos/dll/win32/shell32/lang/pl-PL.rc b/reactos/dll/win32/shell32/lang/pl-PL.rc index af8e48fda01..29f5d4922db 100644 --- a/reactos/dll/win32/shell32/lang/pl-PL.rc +++ b/reactos/dll/win32/shell32/lang/pl-PL.rc @@ -17,7 +17,7 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA * * ReactOS shell32 fork translation updated by Caemyr - - * - Olaf Siejka (Jan,Mar,Apr,Jul, Aug 2008; Apr, 2010) + * - Olaf Siejka (Jan,Mar,Apr,Jul, Aug 2008; Apr, 2010, May 2011) * Use ReactOS forum PM or IRC to contact me * http://www.reactos.org * IRC: irc.freenode.net #reactos-pl; @@ -769,6 +769,6 @@ BEGIN IDS_FILE_DETAILS "Szczegy dla rozszerzenia '%s'" IDS_FILE_DETAILSADV "Pliki z rozszerzeniem '%s' s typu '%s'. Aby zmieni ustawienia, ktre dotycz wszystkich plikw '%s', kliknij przycisk Zaawansowane." - IDS_FILE_TYPES "FileTypes" - IDS_COLUMN_EXTENSION "Extensions" + IDS_FILE_TYPES "Typy plikw" + IDS_COLUMN_EXTENSION "Rozszerzenia" END From d0b88508358d7026b7affb2dfa9d6b5e6dda5933 Mon Sep 17 00:00:00 2001 From: Gabriel Ilardi Date: Thu, 5 May 2011 21:28:57 +0000 Subject: [PATCH 307/317] [SHELL32] Update Italian & Spanish translations. svn path=/trunk/; revision=51604 --- reactos/dll/win32/shell32/lang/es-ES.rc | 4 ++-- reactos/dll/win32/shell32/lang/it-IT.rc | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/reactos/dll/win32/shell32/lang/es-ES.rc b/reactos/dll/win32/shell32/lang/es-ES.rc index f44b33948fa..56a9039b91f 100644 --- a/reactos/dll/win32/shell32/lang/es-ES.rc +++ b/reactos/dll/win32/shell32/lang/es-ES.rc @@ -774,6 +774,6 @@ BEGIN IDS_FILE_DETAILS "Detalles para el tipo de archivo '%s'" IDS_FILE_DETAILSADV "Los archivos con extensin '%s' son del tipo '%s'. Para cambiar la configuracin de los archivos '%s', haga clic en Opciones avanzadas." - IDS_FILE_TYPES "FileTypes" - IDS_COLUMN_EXTENSION "Extensions" + IDS_FILE_TYPES "Tipos de archivos" + IDS_COLUMN_EXTENSION "Extensiones" END diff --git a/reactos/dll/win32/shell32/lang/it-IT.rc b/reactos/dll/win32/shell32/lang/it-IT.rc index e5be401cac2..1aea150df34 100644 --- a/reactos/dll/win32/shell32/lang/it-IT.rc +++ b/reactos/dll/win32/shell32/lang/it-IT.rc @@ -772,6 +772,6 @@ BEGIN IDS_FILE_DETAILS "Dettagli per l'estensione '%s'" IDS_FILE_DETAILSADV "I files con estensione '%s' sono di tipo '%s'. Per modificare le impostazioni per tutti i file '%s', cliccare su Avanzate." - IDS_FILE_TYPES "FileTypes" - IDS_COLUMN_EXTENSION "Extensions" + IDS_FILE_TYPES "Tipi di file" + IDS_COLUMN_EXTENSION "Estensioni" END From ac4e2c2ab45046f9979b59bcd8e5ea0678ca4ce0 Mon Sep 17 00:00:00 2001 From: Gregor Schneider Date: Fri, 6 May 2011 18:00:41 +0000 Subject: [PATCH 308/317] [paint] Implement cut function See issue #6224 for more details. svn path=/trunk/; revision=51611 --- reactos/base/applications/mspaint/winproc.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/reactos/base/applications/mspaint/winproc.c b/reactos/base/applications/mspaint/winproc.c index 213efaffd58..2f6af2dcd8e 100644 --- a/reactos/base/applications/mspaint/winproc.c +++ b/reactos/base/applications/mspaint/winproc.c @@ -794,6 +794,12 @@ WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) SetClipboardData(CF_BITMAP, CopyImage(hSelBm, IMAGE_BITMAP, 0, 0, LR_COPYRETURNORG)); CloseClipboard(); break; + case IDM_EDITCUT: + /* Copy */ + SendMessage(hwnd, WM_COMMAND, IDM_EDITCOPY, 0); + /* Delete selection */ + SendMessage(hwnd, WM_COMMAND, IDM_EDITDELETESELECTION, 0); + break; case IDM_EDITPASTE: OpenClipboard(hMainWnd); if (GetClipboardData(CF_BITMAP) != NULL) From acf317b8b87368f255012d5dc453360f1b7eb941 Mon Sep 17 00:00:00 2001 From: Gregor Schneider Date: Fri, 6 May 2011 18:32:45 +0000 Subject: [PATCH 309/317] [paint] Hide selection window and clear undo history when starting a new painting See issue #6226 for more details. svn path=/trunk/; revision=51612 --- reactos/base/applications/mspaint/winproc.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/reactos/base/applications/mspaint/winproc.c b/reactos/base/applications/mspaint/winproc.c index 2f6af2dcd8e..051698d66c0 100644 --- a/reactos/base/applications/mspaint/winproc.c +++ b/reactos/base/applications/mspaint/winproc.c @@ -721,6 +721,9 @@ WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) SendMessage(hwnd, WM_CLOSE, wParam, lParam); break; case IDM_FILENEW: + ShowWindow(hSelection, SW_HIDE); + clearHistory(); + Rectangle(hDrawingDC, 0 - 1, 0 - 1, imgXRes + 1, imgYRes + 1); SendMessage(hImageArea, WM_PAINT, 0, 0); break; From de2892249a7eed01949ac520715093c5fbc4ac67 Mon Sep 17 00:00:00 2001 From: Gregor Schneider Date: Fri, 6 May 2011 22:02:29 +0000 Subject: [PATCH 310/317] [paint] Fill the whole miniature window by using stretchblt svn path=/trunk/; revision=51614 --- reactos/base/applications/mspaint/winproc.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/reactos/base/applications/mspaint/winproc.c b/reactos/base/applications/mspaint/winproc.c index 051698d66c0..2e450699433 100644 --- a/reactos/base/applications/mspaint/winproc.c +++ b/reactos/base/applications/mspaint/winproc.c @@ -447,11 +447,11 @@ WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) } else if (hwnd == hwndMiniature) { - long mclient[4]; + RECT mclient; HDC hdc; - GetClientRect(hwndMiniature, (LPRECT) &mclient); + GetClientRect(hwndMiniature, &mclient); hdc = GetDC(hwndMiniature); - BitBlt(hdc, 0, 0, imgXRes, imgYRes, hDrawingDC, 0, 0, SRCCOPY); + StretchBlt(hdc, 0, 0, mclient.right, mclient.bottom, hDrawingDC, 0, 0, imgXRes, imgYRes, SRCCOPY); ReleaseDC(hwndMiniature, hdc); } break; From c5aa7bac2ea0b9df621849b0bb11914be20fecba Mon Sep 17 00:00:00 2001 From: James Tabor Date: Sat, 7 May 2011 02:59:20 +0000 Subject: [PATCH 311/317] [User32] - Add missing wine sync for system command sub functions. svn path=/trunk/; revision=51615 --- reactos/dll/win32/user32/windows/defwnd.c | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/reactos/dll/win32/user32/windows/defwnd.c b/reactos/dll/win32/user32/windows/defwnd.c index 83155b66ca6..9519c61c177 100644 --- a/reactos/dll/win32/user32/windows/defwnd.c +++ b/reactos/dll/win32/user32/windows/defwnd.c @@ -293,8 +293,9 @@ DefWndStartSizeMove(HWND hWnd, PWND Wnd, WPARAM wParam, POINT *capturePoint) pt.x = pt.y = 0; while(!hittest) { - if (GetMessageW(&msg, NULL, 0, 0) <= 0) - break; + if (!GetMessageW(&msg, NULL, 0, 0)) break; //return 0; + if (CallMsgFilterW( &msg, MSGF_SIZE )) continue; + switch(msg.message) { case WM_MOUSEMOVE: @@ -330,8 +331,13 @@ DefWndStartSizeMove(HWND hWnd, PWND Wnd, WPARAM wParam, POINT *capturePoint) pt.y =(rectWindow.top+rectWindow.bottom)/2; break; case VK_RETURN: - case VK_ESCAPE: return 0; + case VK_ESCAPE: + return 0; } + default: + TranslateMessage( &msg ); + DispatchMessageW( &msg ); + break; } } *capturePoint = pt; @@ -555,8 +561,8 @@ DefWndDoSizeMove(HWND hwnd, WORD wParam) { int dx = 0, dy = 0; - if (GetMessageW(&msg, 0, 0, 0) <= 0) - break; + if (!GetMessageW(&msg, 0, 0, 0)) break; + if (CallMsgFilterW( &msg, MSGF_SIZE )) continue; /* Exit on button-up, Return, or Esc */ if ((msg.message == WM_LBUTTONUP) || @@ -572,7 +578,11 @@ DefWndDoSizeMove(HWND hwnd, WORD wParam) } if ((msg.message != WM_KEYDOWN) && (msg.message != WM_MOUSEMOVE)) - continue; /* We are not interested in other messages */ + { + TranslateMessage( &msg ); + DispatchMessageW( &msg ); + continue; /* We are not interested in other messages */ + } pt = msg.pt; From b2a42bc17ca59bd5dd47d6ddb17908b24e56db1b Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Sat, 7 May 2011 11:22:08 +0000 Subject: [PATCH 312/317] [KERNEL32/NLS] * Sync nls files to wine 1.3.19 * Escape some characters to fix MSVC build * Patch by Igor Paliychuk svn path=/trunk/; revision=51616 --- reactos/dll/win32/kernel32/nls/afk.nls | 2 + reactos/dll/win32/kernel32/nls/ara.nls | 2 + reactos/dll/win32/kernel32/nls/arb.nls | 2 + reactos/dll/win32/kernel32/nls/are.nls | 2 + reactos/dll/win32/kernel32/nls/arg.nls | 2 + reactos/dll/win32/kernel32/nls/arh.nls | 2 + reactos/dll/win32/kernel32/nls/ari.nls | 2 + reactos/dll/win32/kernel32/nls/arj.nls | 2 + reactos/dll/win32/kernel32/nls/ark.nls | 2 + reactos/dll/win32/kernel32/nls/arl.nls | 2 + reactos/dll/win32/kernel32/nls/arm.nls | 2 + reactos/dll/win32/kernel32/nls/aro.nls | 2 + reactos/dll/win32/kernel32/nls/arq.nls | 2 + reactos/dll/win32/kernel32/nls/ars.nls | 2 + reactos/dll/win32/kernel32/nls/art.nls | 2 + reactos/dll/win32/kernel32/nls/aru.nls | 2 + reactos/dll/win32/kernel32/nls/ary.nls | 2 + reactos/dll/win32/kernel32/nls/aze.nls | 2 + reactos/dll/win32/kernel32/nls/azl.nls | 16 +++-- reactos/dll/win32/kernel32/nls/bel.nls | 2 + reactos/dll/win32/kernel32/nls/bgr.nls | 2 + reactos/dll/win32/kernel32/nls/brf.nls | 2 + reactos/dll/win32/kernel32/nls/cat.nls | 2 + reactos/dll/win32/kernel32/nls/chs.nls | 4 +- reactos/dll/win32/kernel32/nls/cht.nls | 16 +++-- reactos/dll/win32/kernel32/nls/csy.nls | 42 ++++++------ reactos/dll/win32/kernel32/nls/cym.nls | 2 + reactos/dll/win32/kernel32/nls/dan.nls | 2 + reactos/dll/win32/kernel32/nls/dea.nls | 2 + reactos/dll/win32/kernel32/nls/dec.nls | 2 + reactos/dll/win32/kernel32/nls/del.nls | 2 + reactos/dll/win32/kernel32/nls/des.nls | 2 + reactos/dll/win32/kernel32/nls/deu.nls | 2 + reactos/dll/win32/kernel32/nls/div.nls | 2 + reactos/dll/win32/kernel32/nls/ell.nls | 2 + reactos/dll/win32/kernel32/nls/ena.nls | 2 + reactos/dll/win32/kernel32/nls/enb.nls | 2 + reactos/dll/win32/kernel32/nls/enc.nls | 2 + reactos/dll/win32/kernel32/nls/eng.nls | 2 + reactos/dll/win32/kernel32/nls/eni.nls | 2 + reactos/dll/win32/kernel32/nls/enj.nls | 2 + reactos/dll/win32/kernel32/nls/enl.nls | 2 + reactos/dll/win32/kernel32/nls/enp.nls | 2 + reactos/dll/win32/kernel32/nls/ens.nls | 2 + reactos/dll/win32/kernel32/nls/ent.nls | 2 + reactos/dll/win32/kernel32/nls/enu.nls | 2 + reactos/dll/win32/kernel32/nls/enw.nls | 2 + reactos/dll/win32/kernel32/nls/enz.nls | 2 + reactos/dll/win32/kernel32/nls/esa.nls | 2 + reactos/dll/win32/kernel32/nls/esb.nls | 2 + reactos/dll/win32/kernel32/nls/esc.nls | 2 + reactos/dll/win32/kernel32/nls/esd.nls | 2 + reactos/dll/win32/kernel32/nls/ese.nls | 2 + reactos/dll/win32/kernel32/nls/esf.nls | 2 + reactos/dll/win32/kernel32/nls/esg.nls | 2 + reactos/dll/win32/kernel32/nls/esh.nls | 2 + reactos/dll/win32/kernel32/nls/esi.nls | 2 + reactos/dll/win32/kernel32/nls/esl.nls | 2 + reactos/dll/win32/kernel32/nls/esm.nls | 2 + reactos/dll/win32/kernel32/nls/esn.nls | 2 + reactos/dll/win32/kernel32/nls/eso.nls | 2 + reactos/dll/win32/kernel32/nls/esp.nls | 2 + reactos/dll/win32/kernel32/nls/esr.nls | 2 + reactos/dll/win32/kernel32/nls/ess.nls | 2 + reactos/dll/win32/kernel32/nls/esu.nls | 2 + reactos/dll/win32/kernel32/nls/esv.nls | 2 + reactos/dll/win32/kernel32/nls/esy.nls | 2 + reactos/dll/win32/kernel32/nls/esz.nls | 2 + reactos/dll/win32/kernel32/nls/eti.nls | 2 + reactos/dll/win32/kernel32/nls/euq.nls | 2 + reactos/dll/win32/kernel32/nls/far.nls | 90 +++++++++++++------------- reactos/dll/win32/kernel32/nls/fin.nls | 2 + reactos/dll/win32/kernel32/nls/fos.nls | 24 +++---- reactos/dll/win32/kernel32/nls/fra.nls | 2 + reactos/dll/win32/kernel32/nls/frb.nls | 2 + reactos/dll/win32/kernel32/nls/frc.nls | 2 + reactos/dll/win32/kernel32/nls/frl.nls | 2 + reactos/dll/win32/kernel32/nls/frm.nls | 2 + reactos/dll/win32/kernel32/nls/frs.nls | 2 + reactos/dll/win32/kernel32/nls/glc.nls | 2 + reactos/dll/win32/kernel32/nls/guj.nls | 2 + reactos/dll/win32/kernel32/nls/heb.nls | 38 +++++------ reactos/dll/win32/kernel32/nls/hin.nls | 2 + reactos/dll/win32/kernel32/nls/hrv.nls | 14 ++-- reactos/dll/win32/kernel32/nls/hun.nls | 2 + reactos/dll/win32/kernel32/nls/hye.nls | 2 + reactos/dll/win32/kernel32/nls/ind.nls | 2 + reactos/dll/win32/kernel32/nls/isl.nls | 2 + reactos/dll/win32/kernel32/nls/ita.nls | 2 + reactos/dll/win32/kernel32/nls/its.nls | 2 + reactos/dll/win32/kernel32/nls/jpn.nls | 2 + reactos/dll/win32/kernel32/nls/kan.nls | 2 + reactos/dll/win32/kernel32/nls/kat.nls | 2 + reactos/dll/win32/kernel32/nls/kkz.nls | 2 + reactos/dll/win32/kernel32/nls/knk.nls | 2 + reactos/dll/win32/kernel32/nls/kor.nls | 68 +++++++++---------- reactos/dll/win32/kernel32/nls/kyr.nls | 2 + reactos/dll/win32/kernel32/nls/lth.nls | 2 + reactos/dll/win32/kernel32/nls/lvi.nls | 2 + reactos/dll/win32/kernel32/nls/mar.nls | 2 + reactos/dll/win32/kernel32/nls/mki.nls | 2 + reactos/dll/win32/kernel32/nls/mon.nls | 62 +++++++++--------- reactos/dll/win32/kernel32/nls/msb.nls | 2 + reactos/dll/win32/kernel32/nls/msl.nls | 2 + reactos/dll/win32/kernel32/nls/nlb.nls | 2 + reactos/dll/win32/kernel32/nls/nld.nls | 2 + reactos/dll/win32/kernel32/nls/non.nls | 2 + reactos/dll/win32/kernel32/nls/nor.nls | 2 + reactos/dll/win32/kernel32/nls/pan.nls | 2 + reactos/dll/win32/kernel32/nls/plk.nls | 2 + reactos/dll/win32/kernel32/nls/ptb.nls | 2 + reactos/dll/win32/kernel32/nls/ptg.nls | 2 + reactos/dll/win32/kernel32/nls/rmc.nls | 2 + reactos/dll/win32/kernel32/nls/rom.nls | 2 + reactos/dll/win32/kernel32/nls/rus.nls | 2 + reactos/dll/win32/kernel32/nls/san.nls | 2 + reactos/dll/win32/kernel32/nls/sky.nls | 2 + reactos/dll/win32/kernel32/nls/slv.nls | 2 + reactos/dll/win32/kernel32/nls/sqi.nls | 2 + reactos/dll/win32/kernel32/nls/srb.nls | 10 +-- reactos/dll/win32/kernel32/nls/srl.nls | 10 +-- reactos/dll/win32/kernel32/nls/sve.nls | 2 + reactos/dll/win32/kernel32/nls/svf.nls | 2 + reactos/dll/win32/kernel32/nls/swk.nls | 2 + reactos/dll/win32/kernel32/nls/syr.nls | 2 + reactos/dll/win32/kernel32/nls/tam.nls | 2 + reactos/dll/win32/kernel32/nls/tel.nls | 2 + reactos/dll/win32/kernel32/nls/tha.nls | 2 + reactos/dll/win32/kernel32/nls/trk.nls | 2 + reactos/dll/win32/kernel32/nls/ttt.nls | 2 + reactos/dll/win32/kernel32/nls/ukr.nls | 2 + reactos/dll/win32/kernel32/nls/urd.nls | 2 + reactos/dll/win32/kernel32/nls/uzb.nls | 2 + reactos/dll/win32/kernel32/nls/uzl.nls | 2 + reactos/dll/win32/kernel32/nls/vit.nls | 2 + reactos/dll/win32/kernel32/nls/zhh.nls | 2 + reactos/dll/win32/kernel32/nls/zhi.nls | 2 + reactos/dll/win32/kernel32/nls/zhm.nls | 14 ++-- reactos/include/psdk/winnls.h | 3 + 139 files changed, 470 insertions(+), 191 deletions(-) diff --git a/reactos/dll/win32/kernel32/nls/afk.nls b/reactos/dll/win32/kernel32/nls/afk.nls index 32cb571a2a0..183f07bb24e 100644 --- a/reactos/dll/win32/kernel32/nls/afk.nls +++ b/reactos/dll/win32/kernel32/nls/afk.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_AFRIKAANS, SUBLANG_DEFAULT LOCALE_INEGSEPBYSPACE "0" LOCALE_INEGSIGNPOSN "4" LOCALE_INEGSYMPRECEDES "1" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "4" LOCALE_IPOSSYMPRECEDES "1" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "0" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "1" diff --git a/reactos/dll/win32/kernel32/nls/ara.nls b/reactos/dll/win32/kernel32/nls/ara.nls index 0f131cc8fb0..43cdcde7b06 100644 --- a/reactos/dll/win32/kernel32/nls/ara.nls +++ b/reactos/dll/win32/kernel32/nls/ara.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_ARABIC, SUBLANG_ARABIC_SAUDI_ARABIA LOCALE_INEGSEPBYSPACE "0" LOCALE_INEGSIGNPOSN "2" LOCALE_INEGSYMPRECEDES "1" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "6" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "2" LOCALE_IPOSSYMPRECEDES "1" + LOCALE_IREADINGLAYOUT "1" LOCALE_ITIME "0" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "1" diff --git a/reactos/dll/win32/kernel32/nls/arb.nls b/reactos/dll/win32/kernel32/nls/arb.nls index 7a413a15ecd..2d86be70f10 100644 --- a/reactos/dll/win32/kernel32/nls/arb.nls +++ b/reactos/dll/win32/kernel32/nls/arb.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_ARABIC, SUBLANG_ARABIC_LEBANON LOCALE_INEGSEPBYSPACE "0" LOCALE_INEGSIGNPOSN "2" LOCALE_INEGSYMPRECEDES "1" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "6" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "2" LOCALE_IPOSSYMPRECEDES "1" + LOCALE_IREADINGLAYOUT "1" LOCALE_ITIME "0" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "1" diff --git a/reactos/dll/win32/kernel32/nls/are.nls b/reactos/dll/win32/kernel32/nls/are.nls index 1678e93b0dc..55ac91502d9 100644 --- a/reactos/dll/win32/kernel32/nls/are.nls +++ b/reactos/dll/win32/kernel32/nls/are.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_ARABIC, SUBLANG_ARABIC_EGYPT LOCALE_INEGSEPBYSPACE "0" LOCALE_INEGSIGNPOSN "2" LOCALE_INEGSYMPRECEDES "1" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "6" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "2" LOCALE_IPOSSYMPRECEDES "1" + LOCALE_IREADINGLAYOUT "1" LOCALE_ITIME "0" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "1" diff --git a/reactos/dll/win32/kernel32/nls/arg.nls b/reactos/dll/win32/kernel32/nls/arg.nls index c15a30ac766..cf3a7b00f2e 100644 --- a/reactos/dll/win32/kernel32/nls/arg.nls +++ b/reactos/dll/win32/kernel32/nls/arg.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_ARABIC, SUBLANG_ARABIC_ALGERIA LOCALE_INEGSEPBYSPACE "0" LOCALE_INEGSIGNPOSN "2" LOCALE_INEGSYMPRECEDES "1" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "6" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "2" LOCALE_IPOSSYMPRECEDES "1" + LOCALE_IREADINGLAYOUT "1" LOCALE_ITIME "1" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "0" diff --git a/reactos/dll/win32/kernel32/nls/arh.nls b/reactos/dll/win32/kernel32/nls/arh.nls index 62ba4e4475d..bf857d00c80 100644 --- a/reactos/dll/win32/kernel32/nls/arh.nls +++ b/reactos/dll/win32/kernel32/nls/arh.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_ARABIC, SUBLANG_ARABIC_BAHRAIN LOCALE_INEGSEPBYSPACE "0" LOCALE_INEGSIGNPOSN "2" LOCALE_INEGSYMPRECEDES "1" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "6" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "2" LOCALE_IPOSSYMPRECEDES "1" + LOCALE_IREADINGLAYOUT "1" LOCALE_ITIME "0" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "1" diff --git a/reactos/dll/win32/kernel32/nls/ari.nls b/reactos/dll/win32/kernel32/nls/ari.nls index e1d47740c22..36ac2f20066 100644 --- a/reactos/dll/win32/kernel32/nls/ari.nls +++ b/reactos/dll/win32/kernel32/nls/ari.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_ARABIC, SUBLANG_ARABIC_IRAQ LOCALE_INEGSEPBYSPACE "0" LOCALE_INEGSIGNPOSN "2" LOCALE_INEGSYMPRECEDES "1" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "6" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "2" LOCALE_IPOSSYMPRECEDES "1" + LOCALE_IREADINGLAYOUT "1" LOCALE_ITIME "0" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "1" diff --git a/reactos/dll/win32/kernel32/nls/arj.nls b/reactos/dll/win32/kernel32/nls/arj.nls index 951d913c93d..2d5588c6918 100644 --- a/reactos/dll/win32/kernel32/nls/arj.nls +++ b/reactos/dll/win32/kernel32/nls/arj.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_ARABIC, SUBLANG_ARABIC_JORDAN LOCALE_INEGSEPBYSPACE "0" LOCALE_INEGSIGNPOSN "2" LOCALE_INEGSYMPRECEDES "1" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "6" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "2" LOCALE_IPOSSYMPRECEDES "1" + LOCALE_IREADINGLAYOUT "1" LOCALE_ITIME "0" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "1" diff --git a/reactos/dll/win32/kernel32/nls/ark.nls b/reactos/dll/win32/kernel32/nls/ark.nls index aa2486d2ea1..7f02887c1ea 100644 --- a/reactos/dll/win32/kernel32/nls/ark.nls +++ b/reactos/dll/win32/kernel32/nls/ark.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_ARABIC, SUBLANG_ARABIC_KUWAIT LOCALE_INEGSEPBYSPACE "0" LOCALE_INEGSIGNPOSN "2" LOCALE_INEGSYMPRECEDES "1" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "6" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "2" LOCALE_IPOSSYMPRECEDES "1" + LOCALE_IREADINGLAYOUT "1" LOCALE_ITIME "0" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "1" diff --git a/reactos/dll/win32/kernel32/nls/arl.nls b/reactos/dll/win32/kernel32/nls/arl.nls index cbafbe04aeb..99fc5c20ec8 100644 --- a/reactos/dll/win32/kernel32/nls/arl.nls +++ b/reactos/dll/win32/kernel32/nls/arl.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_ARABIC, SUBLANG_ARABIC_LIBYA LOCALE_INEGSEPBYSPACE "0" LOCALE_INEGSIGNPOSN "2" LOCALE_INEGSYMPRECEDES "1" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "6" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "2" LOCALE_IPOSSYMPRECEDES "1" + LOCALE_IREADINGLAYOUT "1" LOCALE_ITIME "0" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "1" diff --git a/reactos/dll/win32/kernel32/nls/arm.nls b/reactos/dll/win32/kernel32/nls/arm.nls index 1f7dfa7ccc9..f8314fed91a 100644 --- a/reactos/dll/win32/kernel32/nls/arm.nls +++ b/reactos/dll/win32/kernel32/nls/arm.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_ARABIC, SUBLANG_ARABIC_MOROCCO LOCALE_INEGSEPBYSPACE "0" LOCALE_INEGSIGNPOSN "2" LOCALE_INEGSYMPRECEDES "1" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "6" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "2" LOCALE_IPOSSYMPRECEDES "1" + LOCALE_IREADINGLAYOUT "1" LOCALE_ITIME "1" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "0" diff --git a/reactos/dll/win32/kernel32/nls/aro.nls b/reactos/dll/win32/kernel32/nls/aro.nls index 6a5f705092f..50825b6cc23 100644 --- a/reactos/dll/win32/kernel32/nls/aro.nls +++ b/reactos/dll/win32/kernel32/nls/aro.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_ARABIC, SUBLANG_ARABIC_OMAN LOCALE_INEGSEPBYSPACE "0" LOCALE_INEGSIGNPOSN "2" LOCALE_INEGSYMPRECEDES "1" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "6" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "2" LOCALE_IPOSSYMPRECEDES "1" + LOCALE_IREADINGLAYOUT "1" LOCALE_ITIME "0" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "1" diff --git a/reactos/dll/win32/kernel32/nls/arq.nls b/reactos/dll/win32/kernel32/nls/arq.nls index 328f8160b6e..9001939a0b4 100644 --- a/reactos/dll/win32/kernel32/nls/arq.nls +++ b/reactos/dll/win32/kernel32/nls/arq.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_ARABIC, SUBLANG_ARABIC_QATAR LOCALE_INEGSEPBYSPACE "0" LOCALE_INEGSIGNPOSN "2" LOCALE_INEGSYMPRECEDES "1" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "6" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "2" LOCALE_IPOSSYMPRECEDES "1" + LOCALE_IREADINGLAYOUT "1" LOCALE_ITIME "0" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "1" diff --git a/reactos/dll/win32/kernel32/nls/ars.nls b/reactos/dll/win32/kernel32/nls/ars.nls index 5f4b57e116b..ef64dc4ace5 100644 --- a/reactos/dll/win32/kernel32/nls/ars.nls +++ b/reactos/dll/win32/kernel32/nls/ars.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_ARABIC, SUBLANG_ARABIC_SYRIA LOCALE_INEGSEPBYSPACE "0" LOCALE_INEGSIGNPOSN "2" LOCALE_INEGSYMPRECEDES "1" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "6" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "2" LOCALE_IPOSSYMPRECEDES "1" + LOCALE_IREADINGLAYOUT "1" LOCALE_ITIME "0" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "1" diff --git a/reactos/dll/win32/kernel32/nls/art.nls b/reactos/dll/win32/kernel32/nls/art.nls index 8f400de15ae..2f1696160fc 100644 --- a/reactos/dll/win32/kernel32/nls/art.nls +++ b/reactos/dll/win32/kernel32/nls/art.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_ARABIC, SUBLANG_ARABIC_TUNISIA LOCALE_INEGSEPBYSPACE "0" LOCALE_INEGSIGNPOSN "2" LOCALE_INEGSYMPRECEDES "1" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "6" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "2" LOCALE_IPOSSYMPRECEDES "1" + LOCALE_IREADINGLAYOUT "1" LOCALE_ITIME "1" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "0" diff --git a/reactos/dll/win32/kernel32/nls/aru.nls b/reactos/dll/win32/kernel32/nls/aru.nls index c058f1b8dee..5d05398e5d6 100644 --- a/reactos/dll/win32/kernel32/nls/aru.nls +++ b/reactos/dll/win32/kernel32/nls/aru.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_ARABIC, SUBLANG_ARABIC_UAE LOCALE_INEGSEPBYSPACE "0" LOCALE_INEGSIGNPOSN "2" LOCALE_INEGSYMPRECEDES "1" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "6" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "2" LOCALE_IPOSSYMPRECEDES "1" + LOCALE_IREADINGLAYOUT "1" LOCALE_ITIME "0" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "1" diff --git a/reactos/dll/win32/kernel32/nls/ary.nls b/reactos/dll/win32/kernel32/nls/ary.nls index fbc3adfcb42..551e3e64cb7 100644 --- a/reactos/dll/win32/kernel32/nls/ary.nls +++ b/reactos/dll/win32/kernel32/nls/ary.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_ARABIC, SUBLANG_ARABIC_YEMEN LOCALE_INEGSEPBYSPACE "0" LOCALE_INEGSIGNPOSN "2" LOCALE_INEGSYMPRECEDES "1" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "6" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "2" LOCALE_IPOSSYMPRECEDES "1" + LOCALE_IREADINGLAYOUT "1" LOCALE_ITIME "0" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "1" diff --git a/reactos/dll/win32/kernel32/nls/aze.nls b/reactos/dll/win32/kernel32/nls/aze.nls index 8cd71fd5c9d..be5244247c3 100644 --- a/reactos/dll/win32/kernel32/nls/aze.nls +++ b/reactos/dll/win32/kernel32/nls/aze.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_AZERI, SUBLANG_AZERI_CYRILLIC LOCALE_INEGSEPBYSPACE "1" LOCALE_INEGSIGNPOSN "1" LOCALE_INEGSYMPRECEDES "0" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "1" LOCALE_IPOSSYMPRECEDES "0" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "1" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "0" diff --git a/reactos/dll/win32/kernel32/nls/azl.nls b/reactos/dll/win32/kernel32/nls/azl.nls index 7c2f3df56a0..380b1faeb1c 100644 --- a/reactos/dll/win32/kernel32/nls/azl.nls +++ b/reactos/dll/win32/kernel32/nls/azl.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_AZERI, SUBLANG_AZERI_LATIN LOCALE_INEGSEPBYSPACE "1" LOCALE_INEGSIGNPOSN "1" LOCALE_INEGSYMPRECEDES "0" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "1" LOCALE_IPOSSYMPRECEDES "0" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "1" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "0" @@ -64,11 +66,11 @@ STRINGTABLE LANGUAGE LANG_AZERI, SUBLANG_AZERI_LATIN LOCALE_S2359 "" LOCALE_SABBREVCTRYNAME "AZE" LOCALE_SABBREVDAYNAME1 "Be" - LOCALE_SABBREVDAYNAME2 "\x00c7a" - LOCALE_SABBREVDAYNAME3 "\x00c7" + LOCALE_SABBREVDAYNAME2 L"\x00c7a" + LOCALE_SABBREVDAYNAME3 L"\x00c7" LOCALE_SABBREVDAYNAME4 "Ca" LOCALE_SABBREVDAYNAME5 "C" - LOCALE_SABBREVDAYNAME6 "\x00de" + LOCALE_SABBREVDAYNAME6 L"\x015E" LOCALE_SABBREVDAYNAME7 "B" LOCALE_SABBREVLANGNAME "AZE" LOCALE_SABBREVMONTHNAME1 "Yan" @@ -76,8 +78,8 @@ STRINGTABLE LANGUAGE LANG_AZERI, SUBLANG_AZERI_LATIN LOCALE_SABBREVMONTHNAME3 "Mar" LOCALE_SABBREVMONTHNAME4 "Apr" LOCALE_SABBREVMONTHNAME5 "May" - LOCALE_SABBREVMONTHNAME6 "\x00DDyun" - LOCALE_SABBREVMONTHNAME7 "\x00DDyul" + LOCALE_SABBREVMONTHNAME6 L"\x0130yun" + LOCALE_SABBREVMONTHNAME7 L"\x0130yul" LOCALE_SABBREVMONTHNAME8 "Avg" LOCALE_SABBREVMONTHNAME9 "Sen" LOCALE_SABBREVMONTHNAME10 "Okt" @@ -112,8 +114,8 @@ STRINGTABLE LANGUAGE LANG_AZERI, SUBLANG_AZERI_LATIN LOCALE_SMONTHNAME3 "Mart" LOCALE_SMONTHNAME4 "Aprel" LOCALE_SMONTHNAME5 "May" - LOCALE_SMONTHNAME6 "\x00ddyun" - LOCALE_SMONTHNAME7 "\x00ddyul" + LOCALE_SMONTHNAME6 L"\x0130yun" + LOCALE_SMONTHNAME7 L"\x0130yul" LOCALE_SMONTHNAME8 "Avgust" LOCALE_SMONTHNAME9 "Sentyabr" LOCALE_SMONTHNAME10 "Oktyabr" diff --git a/reactos/dll/win32/kernel32/nls/bel.nls b/reactos/dll/win32/kernel32/nls/bel.nls index 5f39c9133ce..a10c75b5ce0 100644 --- a/reactos/dll/win32/kernel32/nls/bel.nls +++ b/reactos/dll/win32/kernel32/nls/bel.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_BELARUSIAN, SUBLANG_DEFAULT LOCALE_INEGSEPBYSPACE "1" LOCALE_INEGSIGNPOSN "1" LOCALE_INEGSYMPRECEDES "0" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "1" LOCALE_IPOSSYMPRECEDES "0" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "1" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "0" diff --git a/reactos/dll/win32/kernel32/nls/bgr.nls b/reactos/dll/win32/kernel32/nls/bgr.nls index 18a350a01d1..68eee438e88 100644 --- a/reactos/dll/win32/kernel32/nls/bgr.nls +++ b/reactos/dll/win32/kernel32/nls/bgr.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_BULGARIAN, SUBLANG_DEFAULT LOCALE_INEGSEPBYSPACE "1" LOCALE_INEGSIGNPOSN "1" LOCALE_INEGSYMPRECEDES "0" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "1" LOCALE_IPOSSYMPRECEDES "0" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "1" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "1" diff --git a/reactos/dll/win32/kernel32/nls/brf.nls b/reactos/dll/win32/kernel32/nls/brf.nls index 7ac1e2e06dd..b565491ec6d 100644 --- a/reactos/dll/win32/kernel32/nls/brf.nls +++ b/reactos/dll/win32/kernel32/nls/brf.nls @@ -53,11 +53,13 @@ STRINGTABLE LANGUAGE LANG_BRETON, SUBLANG_DEFAULT LOCALE_INEGSEPBYSPACE "1" LOCALE_INEGSIGNPOSN "1" LOCALE_INEGSYMPRECEDES "0" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "1" LOCALE_IPOSSYMPRECEDES "0" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "1" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "1" diff --git a/reactos/dll/win32/kernel32/nls/cat.nls b/reactos/dll/win32/kernel32/nls/cat.nls index 75cca9f4b5e..f08973e8e09 100644 --- a/reactos/dll/win32/kernel32/nls/cat.nls +++ b/reactos/dll/win32/kernel32/nls/cat.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_CATALAN, SUBLANG_DEFAULT LOCALE_INEGSEPBYSPACE "1" LOCALE_INEGSIGNPOSN "1" LOCALE_INEGSYMPRECEDES "0" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "1" LOCALE_IPOSSYMPRECEDES "0" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "1" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "1" diff --git a/reactos/dll/win32/kernel32/nls/chs.nls b/reactos/dll/win32/kernel32/nls/chs.nls index c3e7bf8490c..fb45b54b44b 100644 --- a/reactos/dll/win32/kernel32/nls/chs.nls +++ b/reactos/dll/win32/kernel32/nls/chs.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED LOCALE_INEGSEPBYSPACE "0" LOCALE_INEGSIGNPOSN "4" LOCALE_INEGSYMPRECEDES "1" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "0" LOCALE_IPOSSIGNPOSN "4" LOCALE_IPOSSYMPRECEDES "1" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "1" LOCALE_ITIMEMARKPOSN "1" LOCALE_ITLZERO "0" @@ -97,7 +99,7 @@ STRINGTABLE LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED LOCALE_SDECIMAL "." LOCALE_SENGCOUNTRY "People's Republic of China" LOCALE_SENGCURRNAME "PRC Yuan Renminbi" - LOCALE_SENGLANGUAGE "Chinese" + LOCALE_SENGLANGUAGE "Chinese (Simplified)" LOCALE_SGROUPING "3;0" LOCALE_SINTLSYMBOL "CNY" LOCALE_SISO3166CTRYNAME "CN" diff --git a/reactos/dll/win32/kernel32/nls/cht.nls b/reactos/dll/win32/kernel32/nls/cht.nls index 56ac5a1abea..11a42351cec 100644 --- a/reactos/dll/win32/kernel32/nls/cht.nls +++ b/reactos/dll/win32/kernel32/nls/cht.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL LOCALE_INEGSEPBYSPACE "0" LOCALE_INEGSIGNPOSN "3" LOCALE_INEGSYMPRECEDES "1" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "2" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "0" LOCALE_IPOSSIGNPOSN "3" LOCALE_IPOSSYMPRECEDES "1" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "0" LOCALE_ITIMEMARKPOSN "1" LOCALE_ITLZERO "1" @@ -80,9 +82,9 @@ STRINGTABLE LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL LOCALE_SABBREVMONTHNAME7 "C" LOCALE_SABBREVMONTHNAME8 "K" LOCALE_SABBREVMONTHNAME9 "E" - LOCALE_SABBREVMONTHNAME10 "BROKEN PLEASE FIX" - LOCALE_SABBREVMONTHNAME11 "BROKEN PLEASE FIX" - LOCALE_SABBREVMONTHNAME12 "BROKEN PLEASE FIX" + LOCALE_SABBREVMONTHNAME10 "Q" + LOCALE_SABBREVMONTHNAME11 "Q@" + LOCALE_SABBREVMONTHNAME12 "QG" LOCALE_SABBREVMONTHNAME13 "" LOCALE_SCOUNTRY "Taiwan" LOCALE_SCURRENCY "NT$" @@ -97,7 +99,7 @@ STRINGTABLE LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL LOCALE_SDECIMAL "." LOCALE_SENGCOUNTRY "Taiwan" LOCALE_SENGCURRNAME "New Taiwan Dollar" - LOCALE_SENGLANGUAGE "Chinese" + LOCALE_SENGLANGUAGE "Chinese (Traditional)" LOCALE_SGROUPING "3;0" LOCALE_SINTLSYMBOL "TWD" LOCALE_SISO3166CTRYNAME "TW" @@ -116,9 +118,9 @@ STRINGTABLE LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL LOCALE_SMONTHNAME7 "C" LOCALE_SMONTHNAME8 "K" LOCALE_SMONTHNAME9 "E" - LOCALE_SMONTHNAME10 "BROKEN PLEASE FIX" - LOCALE_SMONTHNAME11 "BROKEN PLEASE FIX" - LOCALE_SMONTHNAME12 "BROKEN PLEASE FIX" + LOCALE_SMONTHNAME10 "Q" + LOCALE_SMONTHNAME11 "Q@" + LOCALE_SMONTHNAME12 "QG" LOCALE_SMONTHNAME13 "" LOCALE_SMONTHOUSANDSEP "," LOCALE_SNAME "zh-TW" diff --git a/reactos/dll/win32/kernel32/nls/csy.nls b/reactos/dll/win32/kernel32/nls/csy.nls index 03a0e61d206..7dd94671ccc 100644 --- a/reactos/dll/win32/kernel32/nls/csy.nls +++ b/reactos/dll/win32/kernel32/nls/csy.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_CZECH, SUBLANG_DEFAULT LOCALE_INEGSEPBYSPACE "1" LOCALE_INEGSIGNPOSN "1" LOCALE_INEGSYMPRECEDES "0" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "1" LOCALE_IPOSSYMPRECEDES "0" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "1" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "0" @@ -64,10 +66,10 @@ STRINGTABLE LANGUAGE LANG_CZECH, SUBLANG_DEFAULT LOCALE_S2359 "odp." LOCALE_SABBREVCTRYNAME "CZE" LOCALE_SABBREVDAYNAME1 "po" - LOCALE_SABBREVDAYNAME2 "t" + LOCALE_SABBREVDAYNAME2 L"\x00FAt" LOCALE_SABBREVDAYNAME3 "st" - LOCALE_SABBREVDAYNAME4 "t" - LOCALE_SABBREVDAYNAME5 "p" + LOCALE_SABBREVDAYNAME4 L"\x010Dt" + LOCALE_SABBREVDAYNAME5 L"p\x00E1" LOCALE_SABBREVDAYNAME6 "so" LOCALE_SABBREVDAYNAME7 "ne" LOCALE_SABBREVLANGNAME "CSY" @@ -85,13 +87,13 @@ STRINGTABLE LANGUAGE LANG_CZECH, SUBLANG_DEFAULT LOCALE_SABBREVMONTHNAME12 "XII" LOCALE_SABBREVMONTHNAME13 "" LOCALE_SCOUNTRY "Czech Republic" - LOCALE_SCURRENCY "K" + LOCALE_SCURRENCY L"K\x010D" LOCALE_SDATE "." - LOCALE_SDAYNAME1 "pondl" - LOCALE_SDAYNAME2 "ter" - LOCALE_SDAYNAME3 "steda" - LOCALE_SDAYNAME4 "tvrtek" - LOCALE_SDAYNAME5 "ptek" + LOCALE_SDAYNAME1 L"pond\x011Bl\x00ED" + LOCALE_SDAYNAME2 L"\x00FAter\x00FD" + LOCALE_SDAYNAME3 L"st\x0159eda" + LOCALE_SDAYNAME4 L"\x010Dtvrtek" + LOCALE_SDAYNAME5 L"p\x00E1tek" LOCALE_SDAYNAME6 "sobota" LOCALE_SDAYNAME7 "nedle" LOCALE_SDECIMAL "," @@ -108,30 +110,30 @@ STRINGTABLE LANGUAGE LANG_CZECH, SUBLANG_DEFAULT LOCALE_SMONDECIMALSEP "," LOCALE_SMONGROUPING "3;0" LOCALE_SMONTHNAME1 "leden" - LOCALE_SMONTHNAME2 "nor" - LOCALE_SMONTHNAME3 "bezen" + LOCALE_SMONTHNAME2 L"\x00FAnor" + LOCALE_SMONTHNAME3 L"b\x0159ezen" LOCALE_SMONTHNAME4 "duben" LOCALE_SMONTHNAME5 "kvten" - LOCALE_SMONTHNAME6 "erven" - LOCALE_SMONTHNAME7 "ervenec" + LOCALE_SMONTHNAME6 L"\x010Derven" + LOCALE_SMONTHNAME7 L"\x010Dervenec" LOCALE_SMONTHNAME8 "srpen" - LOCALE_SMONTHNAME9 "z" - LOCALE_SMONTHNAME10 "jen" + LOCALE_SMONTHNAME9 L"z\x00E1\x0159\x00ED" + LOCALE_SMONTHNAME10 L"\x0159\x00EDjen" LOCALE_SMONTHNAME11 "listopad" LOCALE_SMONTHNAME12 "prosinec" LOCALE_SMONTHNAME13 "" - LOCALE_SMONTHOUSANDSEP "" + LOCALE_SMONTHOUSANDSEP " " LOCALE_SNAME "cs-CZ" - LOCALE_SNATIVECTRYNAME "eskrepublika" - LOCALE_SNATIVECURRNAME "Koruna esk" + LOCALE_SNATIVECTRYNAME L"\x010Cesk\x00E1 republika" + LOCALE_SNATIVECURRNAME L"Koruna \x010Cesk\x00E1" LOCALE_SNATIVEDIGITS "0123456789" - LOCALE_SNATIVELANGNAME "etina" + LOCALE_SNATIVELANGNAME L"\x010De\x0161tina" LOCALE_SNEGATIVESIGN "-" LOCALE_SPOSITIVESIGN "" LOCALE_SSCRIPTS "Latn;" LOCALE_SSHORTDATE "d.M.yyyy" LOCALE_SSORTNAME "Default" - LOCALE_STHOUSAND "" + LOCALE_STHOUSAND " " LOCALE_STIME ":" LOCALE_STIMEFORMAT "H:mm:ss" LOCALE_SYEARMONTH "MMMM yyyy" diff --git a/reactos/dll/win32/kernel32/nls/cym.nls b/reactos/dll/win32/kernel32/nls/cym.nls index 28df9b24621..5ab91d097e7 100644 --- a/reactos/dll/win32/kernel32/nls/cym.nls +++ b/reactos/dll/win32/kernel32/nls/cym.nls @@ -53,11 +53,13 @@ STRINGTABLE LANGUAGE LANG_WELSH, SUBLANG_DEFAULT LOCALE_INEGSEPBYSPACE "0" LOCALE_INEGSIGNPOSN "3" LOCALE_INEGSYMPRECEDES "1" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "0" LOCALE_IPOSSIGNPOSN "3" LOCALE_IPOSSYMPRECEDES "1" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "1" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "1" diff --git a/reactos/dll/win32/kernel32/nls/dan.nls b/reactos/dll/win32/kernel32/nls/dan.nls index 6f41a9e11be..5f31e5112fe 100644 --- a/reactos/dll/win32/kernel32/nls/dan.nls +++ b/reactos/dll/win32/kernel32/nls/dan.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_DANISH, SUBLANG_DEFAULT LOCALE_INEGSEPBYSPACE "1" LOCALE_INEGSIGNPOSN "4" LOCALE_INEGSYMPRECEDES "1" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "4" LOCALE_IPOSSYMPRECEDES "1" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "1" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "1" diff --git a/reactos/dll/win32/kernel32/nls/dea.nls b/reactos/dll/win32/kernel32/nls/dea.nls index 777961dd3f7..abda02bbf5e 100644 --- a/reactos/dll/win32/kernel32/nls/dea.nls +++ b/reactos/dll/win32/kernel32/nls/dea.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_GERMAN, SUBLANG_GERMAN_AUSTRIAN LOCALE_INEGSEPBYSPACE "1" LOCALE_INEGSIGNPOSN "3" LOCALE_INEGSYMPRECEDES "1" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "3" LOCALE_IPOSSYMPRECEDES "1" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "1" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "1" diff --git a/reactos/dll/win32/kernel32/nls/dec.nls b/reactos/dll/win32/kernel32/nls/dec.nls index a77cac021f8..bc3a80a566a 100644 --- a/reactos/dll/win32/kernel32/nls/dec.nls +++ b/reactos/dll/win32/kernel32/nls/dec.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_GERMAN, SUBLANG_GERMAN_LIECHTENSTEIN LOCALE_INEGSEPBYSPACE "0" LOCALE_INEGSIGNPOSN "4" LOCALE_INEGSYMPRECEDES "1" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "4" LOCALE_IPOSSYMPRECEDES "1" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "1" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "1" diff --git a/reactos/dll/win32/kernel32/nls/del.nls b/reactos/dll/win32/kernel32/nls/del.nls index 396be9f85ec..bc97d93ad81 100644 --- a/reactos/dll/win32/kernel32/nls/del.nls +++ b/reactos/dll/win32/kernel32/nls/del.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_GERMAN, SUBLANG_GERMAN_LUXEMBOURG LOCALE_INEGSEPBYSPACE "1" LOCALE_INEGSIGNPOSN "1" LOCALE_INEGSYMPRECEDES "0" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "1" LOCALE_IPOSSYMPRECEDES "0" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "1" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "1" diff --git a/reactos/dll/win32/kernel32/nls/des.nls b/reactos/dll/win32/kernel32/nls/des.nls index acc470ae081..9e1ffbd6176 100644 --- a/reactos/dll/win32/kernel32/nls/des.nls +++ b/reactos/dll/win32/kernel32/nls/des.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_GERMAN, SUBLANG_GERMAN_SWISS LOCALE_INEGSEPBYSPACE "0" LOCALE_INEGSIGNPOSN "4" LOCALE_INEGSYMPRECEDES "1" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "4" LOCALE_IPOSSYMPRECEDES "1" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "1" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "1" diff --git a/reactos/dll/win32/kernel32/nls/deu.nls b/reactos/dll/win32/kernel32/nls/deu.nls index a4d39b472e5..a488b446762 100644 --- a/reactos/dll/win32/kernel32/nls/deu.nls +++ b/reactos/dll/win32/kernel32/nls/deu.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_GERMAN, SUBLANG_GERMAN LOCALE_INEGSEPBYSPACE "1" LOCALE_INEGSIGNPOSN "1" LOCALE_INEGSYMPRECEDES "0" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "1" LOCALE_IPOSSYMPRECEDES "0" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "1" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "1" diff --git a/reactos/dll/win32/kernel32/nls/div.nls b/reactos/dll/win32/kernel32/nls/div.nls index 0d3886a1fff..08168b812d3 100644 --- a/reactos/dll/win32/kernel32/nls/div.nls +++ b/reactos/dll/win32/kernel32/nls/div.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_DIVEHI, SUBLANG_DEFAULT LOCALE_INEGSEPBYSPACE "1" LOCALE_INEGSIGNPOSN "4" LOCALE_INEGSYMPRECEDES "0" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "6" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "4" LOCALE_IPOSSYMPRECEDES "0" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "1" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "1" diff --git a/reactos/dll/win32/kernel32/nls/ell.nls b/reactos/dll/win32/kernel32/nls/ell.nls index c1a4f1e5ba5..763150c1eb0 100644 --- a/reactos/dll/win32/kernel32/nls/ell.nls +++ b/reactos/dll/win32/kernel32/nls/ell.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_GREEK, SUBLANG_DEFAULT LOCALE_INEGSEPBYSPACE "1" LOCALE_INEGSIGNPOSN "1" LOCALE_INEGSYMPRECEDES "0" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "1" LOCALE_IPOSSYMPRECEDES "0" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "0" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "0" diff --git a/reactos/dll/win32/kernel32/nls/ena.nls b/reactos/dll/win32/kernel32/nls/ena.nls index a9d08c8b161..fd8a7a9c778 100644 --- a/reactos/dll/win32/kernel32/nls/ena.nls +++ b/reactos/dll/win32/kernel32/nls/ena.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_AUS LOCALE_INEGSEPBYSPACE "0" LOCALE_INEGSIGNPOSN "3" LOCALE_INEGSYMPRECEDES "1" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "0" LOCALE_IPOSSIGNPOSN "3" LOCALE_IPOSSYMPRECEDES "1" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "0" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "0" diff --git a/reactos/dll/win32/kernel32/nls/enb.nls b/reactos/dll/win32/kernel32/nls/enb.nls index dfb8be83591..f09eb938c7e 100644 --- a/reactos/dll/win32/kernel32/nls/enb.nls +++ b/reactos/dll/win32/kernel32/nls/enb.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_CARIBBEAN LOCALE_INEGSEPBYSPACE "0" LOCALE_INEGSIGNPOSN "3" LOCALE_INEGSYMPRECEDES "1" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "1" LOCALE_IPOSSEPBYSPACE "0" LOCALE_IPOSSIGNPOSN "3" LOCALE_IPOSSYMPRECEDES "1" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "0" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "0" diff --git a/reactos/dll/win32/kernel32/nls/enc.nls b/reactos/dll/win32/kernel32/nls/enc.nls index 09fee476fe8..437a364a6c7 100644 --- a/reactos/dll/win32/kernel32/nls/enc.nls +++ b/reactos/dll/win32/kernel32/nls/enc.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_CAN LOCALE_INEGSEPBYSPACE "0" LOCALE_INEGSIGNPOSN "3" LOCALE_INEGSYMPRECEDES "1" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "1" LOCALE_IPOSSEPBYSPACE "0" LOCALE_IPOSSIGNPOSN "3" LOCALE_IPOSSYMPRECEDES "1" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "0" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "0" diff --git a/reactos/dll/win32/kernel32/nls/eng.nls b/reactos/dll/win32/kernel32/nls/eng.nls index 0a8f26fd25c..2262fad5336 100644 --- a/reactos/dll/win32/kernel32/nls/eng.nls +++ b/reactos/dll/win32/kernel32/nls/eng.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_UK LOCALE_INEGSEPBYSPACE "0" LOCALE_INEGSIGNPOSN "3" LOCALE_INEGSYMPRECEDES "1" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "0" LOCALE_IPOSSIGNPOSN "3" LOCALE_IPOSSYMPRECEDES "1" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "1" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "1" diff --git a/reactos/dll/win32/kernel32/nls/eni.nls b/reactos/dll/win32/kernel32/nls/eni.nls index d86e35c783c..27f76548d96 100644 --- a/reactos/dll/win32/kernel32/nls/eni.nls +++ b/reactos/dll/win32/kernel32/nls/eni.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_EIRE LOCALE_INEGSEPBYSPACE "0" LOCALE_INEGSIGNPOSN "3" LOCALE_INEGSYMPRECEDES "1" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "0" LOCALE_IPOSSIGNPOSN "3" LOCALE_IPOSSYMPRECEDES "1" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "1" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "1" diff --git a/reactos/dll/win32/kernel32/nls/enj.nls b/reactos/dll/win32/kernel32/nls/enj.nls index e1e82599bdd..1a1cdfbeb33 100644 --- a/reactos/dll/win32/kernel32/nls/enj.nls +++ b/reactos/dll/win32/kernel32/nls/enj.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_JAMAICA LOCALE_INEGSEPBYSPACE "0" LOCALE_INEGSIGNPOSN "3" LOCALE_INEGSYMPRECEDES "1" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "1" LOCALE_IPOSSEPBYSPACE "0" LOCALE_IPOSSIGNPOSN "3" LOCALE_IPOSSYMPRECEDES "1" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "0" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "1" diff --git a/reactos/dll/win32/kernel32/nls/enl.nls b/reactos/dll/win32/kernel32/nls/enl.nls index c8c69a0b74a..fc15a42da8c 100644 --- a/reactos/dll/win32/kernel32/nls/enl.nls +++ b/reactos/dll/win32/kernel32/nls/enl.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_BELIZE LOCALE_INEGSEPBYSPACE "0" LOCALE_INEGSIGNPOSN "0" LOCALE_INEGSYMPRECEDES "1" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "1" LOCALE_IPOSSEPBYSPACE "0" LOCALE_IPOSSIGNPOSN "3" LOCALE_IPOSSYMPRECEDES "1" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "0" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "1" diff --git a/reactos/dll/win32/kernel32/nls/enp.nls b/reactos/dll/win32/kernel32/nls/enp.nls index 46aa4a2df03..9e067955704 100644 --- a/reactos/dll/win32/kernel32/nls/enp.nls +++ b/reactos/dll/win32/kernel32/nls/enp.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_PHILIPPINES LOCALE_INEGSEPBYSPACE "0" LOCALE_INEGSIGNPOSN "0" LOCALE_INEGSYMPRECEDES "1" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "1" LOCALE_IPOSSEPBYSPACE "0" LOCALE_IPOSSIGNPOSN "3" LOCALE_IPOSSYMPRECEDES "1" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "0" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "0" diff --git a/reactos/dll/win32/kernel32/nls/ens.nls b/reactos/dll/win32/kernel32/nls/ens.nls index 76d02d796e9..ab27b470e45 100644 --- a/reactos/dll/win32/kernel32/nls/ens.nls +++ b/reactos/dll/win32/kernel32/nls/ens.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_SOUTH_AFRICA LOCALE_INEGSEPBYSPACE "0" LOCALE_INEGSIGNPOSN "4" LOCALE_INEGSYMPRECEDES "1" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "4" LOCALE_IPOSSYMPRECEDES "1" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "0" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "1" diff --git a/reactos/dll/win32/kernel32/nls/ent.nls b/reactos/dll/win32/kernel32/nls/ent.nls index 1d1eff7bd5a..9eba8949e9c 100644 --- a/reactos/dll/win32/kernel32/nls/ent.nls +++ b/reactos/dll/win32/kernel32/nls/ent.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_TRINIDAD LOCALE_INEGSEPBYSPACE "0" LOCALE_INEGSIGNPOSN "0" LOCALE_INEGSYMPRECEDES "1" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "1" LOCALE_IPOSSEPBYSPACE "0" LOCALE_IPOSSIGNPOSN "3" LOCALE_IPOSSYMPRECEDES "1" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "0" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "1" diff --git a/reactos/dll/win32/kernel32/nls/enu.nls b/reactos/dll/win32/kernel32/nls/enu.nls index 06322c0f75b..e07a9e00436 100644 --- a/reactos/dll/win32/kernel32/nls/enu.nls +++ b/reactos/dll/win32/kernel32/nls/enu.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US LOCALE_INEGSEPBYSPACE "0" LOCALE_INEGSIGNPOSN "0" LOCALE_INEGSYMPRECEDES "1" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "1" LOCALE_IPOSSEPBYSPACE "0" LOCALE_IPOSSIGNPOSN "3" LOCALE_IPOSSYMPRECEDES "1" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "0" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "0" diff --git a/reactos/dll/win32/kernel32/nls/enw.nls b/reactos/dll/win32/kernel32/nls/enw.nls index b554462f0fd..2533ff99811 100644 --- a/reactos/dll/win32/kernel32/nls/enw.nls +++ b/reactos/dll/win32/kernel32/nls/enw.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_ZIMBABWE LOCALE_INEGSEPBYSPACE "0" LOCALE_INEGSIGNPOSN "0" LOCALE_INEGSYMPRECEDES "1" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "0" LOCALE_IPOSSIGNPOSN "3" LOCALE_IPOSSYMPRECEDES "1" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "0" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "0" diff --git a/reactos/dll/win32/kernel32/nls/enz.nls b/reactos/dll/win32/kernel32/nls/enz.nls index 1d511437510..9c656bcb601 100644 --- a/reactos/dll/win32/kernel32/nls/enz.nls +++ b/reactos/dll/win32/kernel32/nls/enz.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_NZ LOCALE_INEGSEPBYSPACE "0" LOCALE_INEGSIGNPOSN "3" LOCALE_INEGSYMPRECEDES "1" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "0" LOCALE_IPOSSIGNPOSN "3" LOCALE_IPOSSYMPRECEDES "1" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "0" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "0" diff --git a/reactos/dll/win32/kernel32/nls/esa.nls b/reactos/dll/win32/kernel32/nls/esa.nls index b27bb4ee28e..f2803136996 100644 --- a/reactos/dll/win32/kernel32/nls/esa.nls +++ b/reactos/dll/win32/kernel32/nls/esa.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_SPANISH, SUBLANG_SPANISH_PANAMA LOCALE_INEGSEPBYSPACE "1" LOCALE_INEGSIGNPOSN "0" LOCALE_INEGSYMPRECEDES "1" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "1" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "3" LOCALE_IPOSSYMPRECEDES "1" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "0" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "1" diff --git a/reactos/dll/win32/kernel32/nls/esb.nls b/reactos/dll/win32/kernel32/nls/esb.nls index 90e1a106e56..9aeec4368e4 100644 --- a/reactos/dll/win32/kernel32/nls/esb.nls +++ b/reactos/dll/win32/kernel32/nls/esb.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_SPANISH, SUBLANG_SPANISH_BOLIVIA LOCALE_INEGSEPBYSPACE "1" LOCALE_INEGSIGNPOSN "0" LOCALE_INEGSYMPRECEDES "1" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "1" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "3" LOCALE_IPOSSYMPRECEDES "1" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "0" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "1" diff --git a/reactos/dll/win32/kernel32/nls/esc.nls b/reactos/dll/win32/kernel32/nls/esc.nls index c26be6e0c93..102c9e8c86d 100644 --- a/reactos/dll/win32/kernel32/nls/esc.nls +++ b/reactos/dll/win32/kernel32/nls/esc.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_SPANISH, SUBLANG_SPANISH_COSTA_RICA LOCALE_INEGSEPBYSPACE "0" LOCALE_INEGSIGNPOSN "0" LOCALE_INEGSYMPRECEDES "1" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "1" LOCALE_IPOSSEPBYSPACE "0" LOCALE_IPOSSIGNPOSN "3" LOCALE_IPOSSYMPRECEDES "1" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "0" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "1" diff --git a/reactos/dll/win32/kernel32/nls/esd.nls b/reactos/dll/win32/kernel32/nls/esd.nls index f424770356a..ac8dfae1886 100644 --- a/reactos/dll/win32/kernel32/nls/esd.nls +++ b/reactos/dll/win32/kernel32/nls/esd.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_SPANISH, SUBLANG_SPANISH_DOMINICAN_REPUBLIC LOCALE_INEGSEPBYSPACE "0" LOCALE_INEGSIGNPOSN "0" LOCALE_INEGSYMPRECEDES "1" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "1" LOCALE_IPOSSEPBYSPACE "0" LOCALE_IPOSSIGNPOSN "3" LOCALE_IPOSSYMPRECEDES "1" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "0" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "1" diff --git a/reactos/dll/win32/kernel32/nls/ese.nls b/reactos/dll/win32/kernel32/nls/ese.nls index d8296229221..6baaab2689e 100644 --- a/reactos/dll/win32/kernel32/nls/ese.nls +++ b/reactos/dll/win32/kernel32/nls/ese.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_SPANISH, SUBLANG_SPANISH_EL_SALVADOR LOCALE_INEGSEPBYSPACE "0" LOCALE_INEGSIGNPOSN "0" LOCALE_INEGSYMPRECEDES "1" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "1" LOCALE_IPOSSEPBYSPACE "0" LOCALE_IPOSSIGNPOSN "3" LOCALE_IPOSSYMPRECEDES "1" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "0" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "1" diff --git a/reactos/dll/win32/kernel32/nls/esf.nls b/reactos/dll/win32/kernel32/nls/esf.nls index c62cab4a138..c33bf2189a9 100644 --- a/reactos/dll/win32/kernel32/nls/esf.nls +++ b/reactos/dll/win32/kernel32/nls/esf.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_SPANISH, SUBLANG_SPANISH_ECUADOR LOCALE_INEGSEPBYSPACE "1" LOCALE_INEGSIGNPOSN "0" LOCALE_INEGSYMPRECEDES "1" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "1" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "3" LOCALE_IPOSSYMPRECEDES "1" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "1" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "0" diff --git a/reactos/dll/win32/kernel32/nls/esg.nls b/reactos/dll/win32/kernel32/nls/esg.nls index 2ebc5da9b31..914bb2fadaf 100644 --- a/reactos/dll/win32/kernel32/nls/esg.nls +++ b/reactos/dll/win32/kernel32/nls/esg.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_SPANISH, SUBLANG_SPANISH_GUATEMALA LOCALE_INEGSEPBYSPACE "0" LOCALE_INEGSIGNPOSN "0" LOCALE_INEGSYMPRECEDES "1" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "1" LOCALE_IPOSSEPBYSPACE "0" LOCALE_IPOSSIGNPOSN "3" LOCALE_IPOSSYMPRECEDES "1" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "0" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "1" diff --git a/reactos/dll/win32/kernel32/nls/esh.nls b/reactos/dll/win32/kernel32/nls/esh.nls index 606626aa3f5..eabd9f67120 100644 --- a/reactos/dll/win32/kernel32/nls/esh.nls +++ b/reactos/dll/win32/kernel32/nls/esh.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_SPANISH, SUBLANG_SPANISH_HONDURAS LOCALE_INEGSEPBYSPACE "1" LOCALE_INEGSIGNPOSN "4" LOCALE_INEGSYMPRECEDES "1" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "1" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "4" LOCALE_IPOSSYMPRECEDES "1" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "0" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "1" diff --git a/reactos/dll/win32/kernel32/nls/esi.nls b/reactos/dll/win32/kernel32/nls/esi.nls index e90db977b19..c5d02c13991 100644 --- a/reactos/dll/win32/kernel32/nls/esi.nls +++ b/reactos/dll/win32/kernel32/nls/esi.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_SPANISH, SUBLANG_SPANISH_NICARAGUA LOCALE_INEGSEPBYSPACE "1" LOCALE_INEGSIGNPOSN "0" LOCALE_INEGSYMPRECEDES "1" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "1" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "3" LOCALE_IPOSSYMPRECEDES "1" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "0" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "1" diff --git a/reactos/dll/win32/kernel32/nls/esl.nls b/reactos/dll/win32/kernel32/nls/esl.nls index 869194a9887..6c25db1d47b 100644 --- a/reactos/dll/win32/kernel32/nls/esl.nls +++ b/reactos/dll/win32/kernel32/nls/esl.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_SPANISH, SUBLANG_SPANISH_CHILE LOCALE_INEGSEPBYSPACE "1" LOCALE_INEGSIGNPOSN "3" LOCALE_INEGSYMPRECEDES "1" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "1" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "3" LOCALE_IPOSSYMPRECEDES "1" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "1" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "0" diff --git a/reactos/dll/win32/kernel32/nls/esm.nls b/reactos/dll/win32/kernel32/nls/esm.nls index dcfead8ff26..a36cf87fba9 100644 --- a/reactos/dll/win32/kernel32/nls/esm.nls +++ b/reactos/dll/win32/kernel32/nls/esm.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_SPANISH, SUBLANG_SPANISH_MEXICAN LOCALE_INEGSEPBYSPACE "0" LOCALE_INEGSIGNPOSN "3" LOCALE_INEGSYMPRECEDES "1" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "1" LOCALE_IPOSSEPBYSPACE "0" LOCALE_IPOSSIGNPOSN "3" LOCALE_IPOSSYMPRECEDES "1" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "0" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "1" diff --git a/reactos/dll/win32/kernel32/nls/esn.nls b/reactos/dll/win32/kernel32/nls/esn.nls index 38885ee2cbc..1727882ecc0 100644 --- a/reactos/dll/win32/kernel32/nls/esn.nls +++ b/reactos/dll/win32/kernel32/nls/esn.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_SPANISH, SUBLANG_SPANISH_MODERN LOCALE_INEGSEPBYSPACE "1" LOCALE_INEGSIGNPOSN "1" LOCALE_INEGSYMPRECEDES "0" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "1" LOCALE_IPOSSYMPRECEDES "0" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "1" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "0" diff --git a/reactos/dll/win32/kernel32/nls/eso.nls b/reactos/dll/win32/kernel32/nls/eso.nls index 6b0b54159bd..3847d12acea 100644 --- a/reactos/dll/win32/kernel32/nls/eso.nls +++ b/reactos/dll/win32/kernel32/nls/eso.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_SPANISH, SUBLANG_SPANISH_COLOMBIA LOCALE_INEGSEPBYSPACE "1" LOCALE_INEGSIGNPOSN "0" LOCALE_INEGSYMPRECEDES "1" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "1" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "3" LOCALE_IPOSSYMPRECEDES "1" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "0" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "1" diff --git a/reactos/dll/win32/kernel32/nls/esp.nls b/reactos/dll/win32/kernel32/nls/esp.nls index 68aafc386b6..ba18a9972b5 100644 --- a/reactos/dll/win32/kernel32/nls/esp.nls +++ b/reactos/dll/win32/kernel32/nls/esp.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_SPANISH, SUBLANG_SPANISH LOCALE_INEGSEPBYSPACE "1" LOCALE_INEGSIGNPOSN "1" LOCALE_INEGSYMPRECEDES "0" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "1" LOCALE_IPOSSYMPRECEDES "0" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "1" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "0" diff --git a/reactos/dll/win32/kernel32/nls/esr.nls b/reactos/dll/win32/kernel32/nls/esr.nls index 06e431d0b0a..82c9918406b 100644 --- a/reactos/dll/win32/kernel32/nls/esr.nls +++ b/reactos/dll/win32/kernel32/nls/esr.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_SPANISH, SUBLANG_SPANISH_PERU LOCALE_INEGSEPBYSPACE "1" LOCALE_INEGSIGNPOSN "4" LOCALE_INEGSYMPRECEDES "1" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "1" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "4" LOCALE_IPOSSYMPRECEDES "1" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "0" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "1" diff --git a/reactos/dll/win32/kernel32/nls/ess.nls b/reactos/dll/win32/kernel32/nls/ess.nls index 79e4d7fe0aa..aee9b625284 100644 --- a/reactos/dll/win32/kernel32/nls/ess.nls +++ b/reactos/dll/win32/kernel32/nls/ess.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_SPANISH, SUBLANG_SPANISH_ARGENTINA LOCALE_INEGSEPBYSPACE "0" LOCALE_INEGSIGNPOSN "4" LOCALE_INEGSYMPRECEDES "1" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "1" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "4" LOCALE_IPOSSYMPRECEDES "1" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "0" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "1" diff --git a/reactos/dll/win32/kernel32/nls/esu.nls b/reactos/dll/win32/kernel32/nls/esu.nls index 87f1de4a705..2ccabdf76eb 100644 --- a/reactos/dll/win32/kernel32/nls/esu.nls +++ b/reactos/dll/win32/kernel32/nls/esu.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_SPANISH, SUBLANG_SPANISH_PUERTO_RICO LOCALE_INEGSEPBYSPACE "1" LOCALE_INEGSIGNPOSN "0" LOCALE_INEGSYMPRECEDES "1" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "1" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "3" LOCALE_IPOSSYMPRECEDES "1" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "0" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "1" diff --git a/reactos/dll/win32/kernel32/nls/esv.nls b/reactos/dll/win32/kernel32/nls/esv.nls index 09c77cab9ad..ac9fe68e0e3 100644 --- a/reactos/dll/win32/kernel32/nls/esv.nls +++ b/reactos/dll/win32/kernel32/nls/esv.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_SPANISH, SUBLANG_SPANISH_VENEZUELA LOCALE_INEGSEPBYSPACE "1" LOCALE_INEGSIGNPOSN "4" LOCALE_INEGSYMPRECEDES "1" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "1" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "4" LOCALE_IPOSSYMPRECEDES "1" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "0" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "1" diff --git a/reactos/dll/win32/kernel32/nls/esy.nls b/reactos/dll/win32/kernel32/nls/esy.nls index b74495358b9..f50071f9f6d 100644 --- a/reactos/dll/win32/kernel32/nls/esy.nls +++ b/reactos/dll/win32/kernel32/nls/esy.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_SPANISH, SUBLANG_SPANISH_URUGUAY LOCALE_INEGSEPBYSPACE "1" LOCALE_INEGSIGNPOSN "0" LOCALE_INEGSYMPRECEDES "1" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "3" LOCALE_IPOSSYMPRECEDES "1" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "0" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "1" diff --git a/reactos/dll/win32/kernel32/nls/esz.nls b/reactos/dll/win32/kernel32/nls/esz.nls index 35755a38625..5d4bef29a78 100644 --- a/reactos/dll/win32/kernel32/nls/esz.nls +++ b/reactos/dll/win32/kernel32/nls/esz.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_SPANISH, SUBLANG_SPANISH_PARAGUAY LOCALE_INEGSEPBYSPACE "1" LOCALE_INEGSIGNPOSN "0" LOCALE_INEGSYMPRECEDES "1" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "1" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "3" LOCALE_IPOSSYMPRECEDES "1" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "0" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "1" diff --git a/reactos/dll/win32/kernel32/nls/eti.nls b/reactos/dll/win32/kernel32/nls/eti.nls index d6940abfdfd..c28b3e08381 100644 --- a/reactos/dll/win32/kernel32/nls/eti.nls +++ b/reactos/dll/win32/kernel32/nls/eti.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_ESTONIAN, SUBLANG_DEFAULT LOCALE_INEGSEPBYSPACE "1" LOCALE_INEGSIGNPOSN "1" LOCALE_INEGSYMPRECEDES "0" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "1" LOCALE_IPOSSYMPRECEDES "0" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "1" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "0" diff --git a/reactos/dll/win32/kernel32/nls/euq.nls b/reactos/dll/win32/kernel32/nls/euq.nls index 05b42bfbd20..7210ecf9de5 100644 --- a/reactos/dll/win32/kernel32/nls/euq.nls +++ b/reactos/dll/win32/kernel32/nls/euq.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_BASQUE, SUBLANG_DEFAULT LOCALE_INEGSEPBYSPACE "1" LOCALE_INEGSIGNPOSN "1" LOCALE_INEGSYMPRECEDES "0" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "1" LOCALE_IPOSSYMPRECEDES "0" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "1" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "1" diff --git a/reactos/dll/win32/kernel32/nls/far.nls b/reactos/dll/win32/kernel32/nls/far.nls index a158e4de3d2..745b6bcc4d7 100644 --- a/reactos/dll/win32/kernel32/nls/far.nls +++ b/reactos/dll/win32/kernel32/nls/far.nls @@ -52,48 +52,50 @@ STRINGTABLE LANGUAGE LANG_FARSI, SUBLANG_DEFAULT LOCALE_INEGSEPBYSPACE "0" LOCALE_INEGSIGNPOSN "2" LOCALE_INEGSYMPRECEDES "1" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "2" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "2" LOCALE_IPOSSYMPRECEDES "1" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "0" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "1" - LOCALE_S1159 "\x00DE.\x00D9" - LOCALE_S2359 "\x00C8.\x00D9" + LOCALE_S1159 L"\x0642.\x0638" + LOCALE_S2359 L"\x0628.\x0638" LOCALE_SABBREVCTRYNAME "IRN" - LOCALE_SABBREVDAYNAME1 "\x00CF\x00E6\x00D4\x00E4\x00C8\x00E5" - LOCALE_SABBREVDAYNAME2 "\x00D3\x00E5\x00A0\x00D4\x00E4\x00C8\x00E5" - LOCALE_SABBREVDAYNAME3 "\x008D\x00E5\x00C7\x00D1\x00D4\x00E4\x00C8\x00E5" - LOCALE_SABBREVDAYNAME4 "\x0081\x00E4\x00CC\x00D4\x00E4\x00C8\x00E5" - LOCALE_SABBREVDAYNAME5 "\x00CC\x00E3\x00DA\x00E5" - LOCALE_SABBREVDAYNAME6 "\x00D4\x00E4\x00C8\x00E5" - LOCALE_SABBREVDAYNAME7 "\x00ED\x00DF\x00D4\x00E4\x00C8\x00E5" + LOCALE_SABBREVDAYNAME1 L"\x062F\x0648\x0634\x0646\x0628\x0647" + LOCALE_SABBREVDAYNAME2 L"\x0633\x0647 \x0634\x0646\x0628\x0647" + LOCALE_SABBREVDAYNAME3 L"\x0686\x0647\x0627\x0631\x0634\x0646\x0628\x0647" + LOCALE_SABBREVDAYNAME4 L"\x067E\x0646\x062C\x0634\x0646\x0628\x0647" + LOCALE_SABBREVDAYNAME5 L"\x062C\x0645\x0639\x0647" + LOCALE_SABBREVDAYNAME6 L"\x0634\x0646\x0628\x0647" + LOCALE_SABBREVDAYNAME7 L"\x064A\x0643\x0634\x0646\x0628\x0647" LOCALE_SABBREVLANGNAME "FAR" - LOCALE_SABBREVMONTHNAME1 "\x017D\x00C7\x00E4\x00E6\x00ED\x00E5" - LOCALE_SABBREVMONTHNAME2 "\x00DD\x00E6\x00D1\x00ED\x00E5" - LOCALE_SABBREVMONTHNAME3 "\x00E3\x00C7\x00D1\x00D3" - LOCALE_SABBREVMONTHNAME4 "\x00C2\x00E6\x00D1\x00ED\x00E1" - LOCALE_SABBREVMONTHNAME5 "\x00E3\x00EC" - LOCALE_SABBREVMONTHNAME6 "\x017D\x00E6\x00C6\x00E4" - LOCALE_SABBREVMONTHNAME7 "\x017D\x00E6\x00C6\x00ED\x00E5" - LOCALE_SABBREVMONTHNAME8 "\x00C7\x00E6\x00CA" - LOCALE_SABBREVMONTHNAME9 "\x00D3\x0081\x00CA\x00C7\x00E3\x00C8\x00D1" - LOCALE_SABBREVMONTHNAME10 "\x00C7\x00F5\x00DF\x00CA\x00C8\x00D1" - LOCALE_SABBREVMONTHNAME11 "\x00E4\x00E6\x00C7\x00E3\x00C8\x00D1" - LOCALE_SABBREVMONTHNAME12 "\x00CF\x00D3\x00C7\x00E3\x00C8\x00D1" + LOCALE_SABBREVMONTHNAME1 L"\x0698\x0627\x0646\x0648\x064A\x0647" + LOCALE_SABBREVMONTHNAME2 L"\x0641\x0648\x0631\x064A\x0647" + LOCALE_SABBREVMONTHNAME3 L"\x0645\x0627\x0631\x0633" + LOCALE_SABBREVMONTHNAME4 L"\x0622\x0648\x0631\x064A\x0644" + LOCALE_SABBREVMONTHNAME5 L"\x0645\x0649" + LOCALE_SABBREVMONTHNAME6 L"\x0698\x0648\x0626\x0646" + LOCALE_SABBREVMONTHNAME7 L"\x0698\x0648\x0626\x064A\x0647" + LOCALE_SABBREVMONTHNAME8 L"\x0627\x0648\x062A" + LOCALE_SABBREVMONTHNAME9 L"\x0633\x067E\x062A\x0627\x0645\x0628\x0631" + LOCALE_SABBREVMONTHNAME10 L"\x0627\x064F\x0643\x062A\x0628\x0631" + LOCALE_SABBREVMONTHNAME11 L"\x0646\x0648\x0627\x0645\x0628\x0631" + LOCALE_SABBREVMONTHNAME12 L"\x062F\x0633\x0627\x0645\x0628\x0631" LOCALE_SABBREVMONTHNAME13 "" LOCALE_SCOUNTRY "Iran" - LOCALE_SCURRENCY "\x00D1\x00ED 00C7\x00E1" + LOCALE_SCURRENCY L"\x0631\x064A\x0627\x0644" LOCALE_SDATE "/" - LOCALE_SDAYNAME1 "\x00CF\x00E6\x00D4\x00E4\x00C8\x00E5" - LOCALE_SDAYNAME2 "\x00D3\x00E5\x00A0\x00D4\x00E4\x00C8\x00E5" - LOCALE_SDAYNAME3 "\x008D\x00E5\x00C7\x00D1\x00D4\x00E4\x00C8\x00E5" - LOCALE_SDAYNAME4 "\x0081\x00E4\x00CC\x00D4\x00E4\x00C8\x00E5" - LOCALE_SDAYNAME5 "\x00CC\x00E3\x00DA\x00E5" - LOCALE_SDAYNAME6 "\x00D4\x00E4\x00C8\x00E5" - LOCALE_SDAYNAME7 "\x00ED\x00DF\x00D4\x00E4\x00C8\x00E5" + LOCALE_SDAYNAME1 L"\x062F\x0648\x0634\x0646\x0628\x0647" + LOCALE_SDAYNAME2 L"\x0633\x0647 \x0634\x0646\x0628\x0647" + LOCALE_SDAYNAME3 L"\x0686\x0647\x0627\x0631\x0634\x0646\x0628\x0647" + LOCALE_SDAYNAME4 L"\x067E\x0646\x062C\x0634\x0646\x0628\x0647" + LOCALE_SDAYNAME5 L"\x062C\x0645\x0639\x0647" + LOCALE_SDAYNAME6 L"\x0634\x0646\x0628\x0647" + LOCALE_SDAYNAME7 L"\x064A\x0643\x0634\x0646\x0628\x0647" LOCALE_SDECIMAL "." LOCALE_SENGCOUNTRY "Iran" LOCALE_SENGCURRNAME "Iranian Rial" @@ -107,25 +109,25 @@ STRINGTABLE LANGUAGE LANG_FARSI, SUBLANG_DEFAULT LOCALE_SLONGDATE "yyyy/MM/dd" LOCALE_SMONDECIMALSEP "/" LOCALE_SMONGROUPING "3;0" - LOCALE_SMONTHNAME1 "\x017D\x00C7\x00E4\x00E6\x00ED\x00E5" - LOCALE_SMONTHNAME2 "\x00DD\x00E6\x00D1\x00ED\x00E5" - LOCALE_SMONTHNAME3 "\x00E3\x00C7\x00D1\x00D3" - LOCALE_SMONTHNAME4 "\x00C2\x00E6\x00D1\x00ED\x00E1" - LOCALE_SMONTHNAME5 "\x00E3\x00EC" - LOCALE_SMONTHNAME6 "\x017D\x00E6\x00C6\x00E4" - LOCALE_SMONTHNAME7 "\x017D\x00E6\x00C6\x00ED\x00E5" - LOCALE_SMONTHNAME8 "\x00C7\x00E6\x00CA" - LOCALE_SMONTHNAME9 "\x00D3\x0081\x00CA\x00C7\x00E3\x00C8\x00D1" - LOCALE_SMONTHNAME10 "\x00C7\x00F5\x00DF\x00CA\x00C8\x00D1" - LOCALE_SMONTHNAME11 "\x00E4\x00E6\x00C7\x00E3\x00C8\x00D1" - LOCALE_SMONTHNAME12 "\x00CF\x00D3\x00C7\x00E3\x00C8\x00D1" + LOCALE_SMONTHNAME1 L"\x0698\x0627\x0646\x0648\x064A\x0647" + LOCALE_SMONTHNAME2 L"\x0641\x0648\x0631\x064A\x0647" + LOCALE_SMONTHNAME3 L"\x0645\x0627\x0631\x0633" + LOCALE_SMONTHNAME4 L"\x0622\x0648\x0631\x064A\x0644" + LOCALE_SMONTHNAME5 L"\x0645\x0649" + LOCALE_SMONTHNAME6 L"\x0698\x0648\x0626\x0646" + LOCALE_SMONTHNAME7 L"\x0698\x0648\x0626\x064A\x0647" + LOCALE_SMONTHNAME8 L"\x0627\x0648\x062A" + LOCALE_SMONTHNAME9 L"\x0633\x067E\x062A\x0627\x0645\x0628\x0631" + LOCALE_SMONTHNAME10 L"\x0627\x064F\x0643\x062A\x0628\x0631" + LOCALE_SMONTHNAME11 L"\x0646\x0648\x0627\x0645\x0628\x0631" + LOCALE_SMONTHNAME12 L"\x062F\x0633\x0627\x0645\x0628\x0631" LOCALE_SMONTHNAME13 "" LOCALE_SMONTHOUSANDSEP "," LOCALE_SNAME "fa-IR" - LOCALE_SNATIVECTRYNAME "\x00C7\x00ED\x00D1\x00C7\x00E4" - LOCALE_SNATIVECURRNAME "\x00D1\x00EC\x00C7\x00E1" + LOCALE_SNATIVECTRYNAME L"\x0627\x064A\x0631\x0627\x0646" + LOCALE_SNATIVECURRNAME L"\x0631\x0649\x0627\x0644" LOCALE_SNATIVEDIGITS L"\x06f0\x06f1\x06f2\x06f3\x06f4\x06f5\x06f6\x06f7\x06f8\x06f9" - LOCALE_SNATIVELANGNAME "\x00DD\x00C7\x00D1\x00D3\x00EC" + LOCALE_SNATIVELANGNAME L"\x0641\x0627\x0631\x0633\x0649" LOCALE_SNEGATIVESIGN "-" LOCALE_SPOSITIVESIGN "" LOCALE_SSCRIPTS "Arab;" diff --git a/reactos/dll/win32/kernel32/nls/fin.nls b/reactos/dll/win32/kernel32/nls/fin.nls index 88725e89c3a..d7f4f2254c9 100644 --- a/reactos/dll/win32/kernel32/nls/fin.nls +++ b/reactos/dll/win32/kernel32/nls/fin.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_FINNISH, SUBLANG_DEFAULT LOCALE_INEGSEPBYSPACE "1" LOCALE_INEGSIGNPOSN "1" LOCALE_INEGSYMPRECEDES "0" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "1" LOCALE_IPOSSYMPRECEDES "0" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "1" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "0" diff --git a/reactos/dll/win32/kernel32/nls/fos.nls b/reactos/dll/win32/kernel32/nls/fos.nls index 10eea99edf8..ac6075a9e99 100644 --- a/reactos/dll/win32/kernel32/nls/fos.nls +++ b/reactos/dll/win32/kernel32/nls/fos.nls @@ -52,22 +52,24 @@ STRINGTABLE LANGUAGE LANG_FAEROESE, SUBLANG_DEFAULT LOCALE_INEGSEPBYSPACE "1" LOCALE_INEGSIGNPOSN "4" LOCALE_INEGSYMPRECEDES "1" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "4" LOCALE_IPOSSYMPRECEDES "1" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "1" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "1" LOCALE_S1159 "" LOCALE_S2359 "" LOCALE_SABBREVCTRYNAME "FRO" - LOCALE_SABBREVDAYNAME1 "m\x00E1n" - LOCALE_SABBREVDAYNAME2 "t\x00FDs" + LOCALE_SABBREVDAYNAME1 L"m\x00E1n" + LOCALE_SABBREVDAYNAME2 L"t\x00FDs" LOCALE_SABBREVDAYNAME3 "mik" - LOCALE_SABBREVDAYNAME4 "h\x00F3s" - LOCALE_SABBREVDAYNAME5 "fr\x00ED" + LOCALE_SABBREVDAYNAME4 L"h\x00F3s" + LOCALE_SABBREVDAYNAME5 L"fr\x00ED" LOCALE_SABBREVDAYNAME6 "leyg" LOCALE_SABBREVDAYNAME7 "sun" LOCALE_SABBREVLANGNAME "FOS" @@ -87,11 +89,11 @@ STRINGTABLE LANGUAGE LANG_FAEROESE, SUBLANG_DEFAULT LOCALE_SCOUNTRY "Faeroe Islands" LOCALE_SCURRENCY "kr" LOCALE_SDATE "-" - LOCALE_SDAYNAME1 "m\x00E1nadagur" - LOCALE_SDAYNAME2 "t\x00FDsdagur" + LOCALE_SDAYNAME1 L"m\x00E1nadagur" + LOCALE_SDAYNAME2 L"t\x00FDsdagur" LOCALE_SDAYNAME3 "mikudagur" - LOCALE_SDAYNAME4 "h\x00F3sdagur" - LOCALE_SDAYNAME5 "fr\x00EDggjadagur" + LOCALE_SDAYNAME4 L"h\x00F3sdagur" + LOCALE_SDAYNAME5 L"fr\x00EDggjadagur" LOCALE_SDAYNAME6 "leygardagur" LOCALE_SDAYNAME7 "sunnudagur" LOCALE_SDECIMAL "," @@ -110,7 +112,7 @@ STRINGTABLE LANGUAGE LANG_FAEROESE, SUBLANG_DEFAULT LOCALE_SMONTHNAME1 "januar" LOCALE_SMONTHNAME2 "februar" LOCALE_SMONTHNAME3 "mars" - LOCALE_SMONTHNAME4 "apr\x00EDl" + LOCALE_SMONTHNAME4 L"apr\x00EDl" LOCALE_SMONTHNAME5 "mai" LOCALE_SMONTHNAME6 "juni" LOCALE_SMONTHNAME7 "juli" @@ -122,10 +124,10 @@ STRINGTABLE LANGUAGE LANG_FAEROESE, SUBLANG_DEFAULT LOCALE_SMONTHNAME13 "" LOCALE_SMONTHOUSANDSEP "." LOCALE_SNAME "fo-FO" - LOCALE_SNATIVECTRYNAME "F\x00F8royar" + LOCALE_SNATIVECTRYNAME L"F\x00F8royar" LOCALE_SNATIVECURRNAME "Dansk krone" LOCALE_SNATIVEDIGITS "0123456789" - LOCALE_SNATIVELANGNAME "f\x00F8royskt" + LOCALE_SNATIVELANGNAME L"f\x00F8royskt" LOCALE_SNEGATIVESIGN "-" LOCALE_SPOSITIVESIGN "" LOCALE_SSCRIPTS "Latn;" diff --git a/reactos/dll/win32/kernel32/nls/fra.nls b/reactos/dll/win32/kernel32/nls/fra.nls index 9ee0137f916..1d39d6942f9 100644 --- a/reactos/dll/win32/kernel32/nls/fra.nls +++ b/reactos/dll/win32/kernel32/nls/fra.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_FRENCH, SUBLANG_FRENCH LOCALE_INEGSEPBYSPACE "1" LOCALE_INEGSIGNPOSN "1" LOCALE_INEGSYMPRECEDES "0" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "1" LOCALE_IPOSSYMPRECEDES "0" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "1" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "1" diff --git a/reactos/dll/win32/kernel32/nls/frb.nls b/reactos/dll/win32/kernel32/nls/frb.nls index 1a0480f1928..f420a8a3b50 100644 --- a/reactos/dll/win32/kernel32/nls/frb.nls +++ b/reactos/dll/win32/kernel32/nls/frb.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_FRENCH, SUBLANG_FRENCH_BELGIAN LOCALE_INEGSEPBYSPACE "1" LOCALE_INEGSIGNPOSN "1" LOCALE_INEGSYMPRECEDES "0" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "1" LOCALE_IPOSSYMPRECEDES "0" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "1" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "0" diff --git a/reactos/dll/win32/kernel32/nls/frc.nls b/reactos/dll/win32/kernel32/nls/frc.nls index a8c07b9934a..4e640b3eec7 100644 --- a/reactos/dll/win32/kernel32/nls/frc.nls +++ b/reactos/dll/win32/kernel32/nls/frc.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_FRENCH, SUBLANG_FRENCH_CANADIAN LOCALE_INEGSEPBYSPACE "0" LOCALE_INEGSIGNPOSN "0" LOCALE_INEGSYMPRECEDES "0" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "1" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "1" LOCALE_IPOSSYMPRECEDES "0" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "1" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "1" diff --git a/reactos/dll/win32/kernel32/nls/frl.nls b/reactos/dll/win32/kernel32/nls/frl.nls index bc5874cfd29..40b006680cf 100644 --- a/reactos/dll/win32/kernel32/nls/frl.nls +++ b/reactos/dll/win32/kernel32/nls/frl.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_FRENCH, SUBLANG_FRENCH_LUXEMBOURG LOCALE_INEGSEPBYSPACE "1" LOCALE_INEGSIGNPOSN "1" LOCALE_INEGSYMPRECEDES "0" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "1" LOCALE_IPOSSYMPRECEDES "0" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "1" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "1" diff --git a/reactos/dll/win32/kernel32/nls/frm.nls b/reactos/dll/win32/kernel32/nls/frm.nls index 0fc0b57546b..1e7e09ad0be 100644 --- a/reactos/dll/win32/kernel32/nls/frm.nls +++ b/reactos/dll/win32/kernel32/nls/frm.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_FRENCH, SUBLANG_FRENCH_MONACO LOCALE_INEGSEPBYSPACE "1" LOCALE_INEGSIGNPOSN "1" LOCALE_INEGSYMPRECEDES "0" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "1" LOCALE_IPOSSYMPRECEDES "0" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "1" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "1" diff --git a/reactos/dll/win32/kernel32/nls/frs.nls b/reactos/dll/win32/kernel32/nls/frs.nls index 6613776bd86..e56b81f7857 100644 --- a/reactos/dll/win32/kernel32/nls/frs.nls +++ b/reactos/dll/win32/kernel32/nls/frs.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_FRENCH, SUBLANG_FRENCH_SWISS LOCALE_INEGSEPBYSPACE "0" LOCALE_INEGSIGNPOSN "4" LOCALE_INEGSYMPRECEDES "1" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "4" LOCALE_IPOSSYMPRECEDES "1" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "1" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "1" diff --git a/reactos/dll/win32/kernel32/nls/glc.nls b/reactos/dll/win32/kernel32/nls/glc.nls index 16a845de46f..2cc861fd529 100644 --- a/reactos/dll/win32/kernel32/nls/glc.nls +++ b/reactos/dll/win32/kernel32/nls/glc.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_GALICIAN, SUBLANG_DEFAULT LOCALE_INEGSEPBYSPACE "1" LOCALE_INEGSIGNPOSN "1" LOCALE_INEGSYMPRECEDES "0" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "1" LOCALE_IPOSSYMPRECEDES "1" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "1" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "0" diff --git a/reactos/dll/win32/kernel32/nls/guj.nls b/reactos/dll/win32/kernel32/nls/guj.nls index 0c757c3b86b..e85b2503fc9 100644 --- a/reactos/dll/win32/kernel32/nls/guj.nls +++ b/reactos/dll/win32/kernel32/nls/guj.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_GUJARATI, SUBLANG_DEFAULT LOCALE_INEGSEPBYSPACE "1" LOCALE_INEGSIGNPOSN "4" LOCALE_INEGSYMPRECEDES "1" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "4" LOCALE_IPOSSYMPRECEDES "1" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "1" LOCALE_ITIMEMARKPOSN "1" LOCALE_ITLZERO "1" diff --git a/reactos/dll/win32/kernel32/nls/heb.nls b/reactos/dll/win32/kernel32/nls/heb.nls index 23cd711e1c0..b298b56ae25 100644 --- a/reactos/dll/win32/kernel32/nls/heb.nls +++ b/reactos/dll/win32/kernel32/nls/heb.nls @@ -53,11 +53,13 @@ STRINGTABLE LANGUAGE LANG_HEBREW, SUBLANG_DEFAULT LOCALE_INEGSEPBYSPACE "0" LOCALE_INEGSIGNPOSN "4" LOCALE_INEGSYMPRECEDES "1" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "8" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "4" LOCALE_IPOSSYMPRECEDES "1" + LOCALE_IREADINGLAYOUT "1" LOCALE_ITIME "1" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "1" @@ -105,7 +107,7 @@ STRINGTABLE LANGUAGE LANG_HEBREW, SUBLANG_DEFAULT LOCALE_SISO639LANGNAME "he" LOCALE_SLANGUAGE "Hebrew" LOCALE_SLIST "," - LOCALE_SLONGDATE "dddd dd MMMM yyyy" + LOCALE_SLONGDATE "dddd dd MMMM yyyy" LOCALE_SMONDECIMALSEP "." LOCALE_SMONGROUPING "3;0" LOCALE_SMONTHNAME1 "" @@ -137,21 +139,21 @@ STRINGTABLE LANGUAGE LANG_HEBREW, SUBLANG_DEFAULT LOCALE_STIMEFORMAT "HH:mm:ss" LOCALE_SYEARMONTH "MMMM yyyy" - LGRPID_WESTERN_EUROPE+LGRPID_RES_BASE " " - LGRPID_CENTRAL_EUROPE+LGRPID_RES_BASE " " - LGRPID_BALTIC+LGRPID_RES_BASE "Baltic" - LGRPID_GREEK+LGRPID_RES_BASE "" - LGRPID_CYRILLIC+LGRPID_RES_BASE "" - LGRPID_TURKISH+LGRPID_RES_BASE "" - LGRPID_JAPANESE+LGRPID_RES_BASE "" - LGRPID_KOREAN+LGRPID_RES_BASE "" - LGRPID_TRADITIONAL_CHINESE+LGRPID_RES_BASE " " - LGRPID_SIMPLIFIED_CHINESE+LGRPID_RES_BASE " " - LGRPID_THAI+LGRPID_RES_BASE "" - LGRPID_HEBREW+LGRPID_RES_BASE "" - LGRPID_ARABIC+LGRPID_RES_BASE "" - LGRPID_VIETNAMESE+LGRPID_RES_BASE "" - LGRPID_INDIC+LGRPID_RES_BASE "Indic" - LGRPID_GEORGIAN+LGRPID_RES_BASE "Georgian" - LGRPID_ARMENIAN+LGRPID_RES_BASE "" + LGRPID_WESTERN_EUROPE+LGRPID_RES_BASE " " + LGRPID_CENTRAL_EUROPE+LGRPID_RES_BASE " " + LGRPID_BALTIC+LGRPID_RES_BASE "" + LGRPID_GREEK+LGRPID_RES_BASE "" + LGRPID_CYRILLIC+LGRPID_RES_BASE "" + LGRPID_TURKISH+LGRPID_RES_BASE "" + LGRPID_JAPANESE+LGRPID_RES_BASE "" + LGRPID_KOREAN+LGRPID_RES_BASE "" + LGRPID_TRADITIONAL_CHINESE+LGRPID_RES_BASE " " + LGRPID_SIMPLIFIED_CHINESE+LGRPID_RES_BASE " " + LGRPID_THAI+LGRPID_RES_BASE "" + LGRPID_HEBREW+LGRPID_RES_BASE "" + LGRPID_ARABIC+LGRPID_RES_BASE "" + LGRPID_VIETNAMESE+LGRPID_RES_BASE "" + LGRPID_INDIC+LGRPID_RES_BASE "" + LGRPID_GEORGIAN+LGRPID_RES_BASE "" + LGRPID_ARMENIAN+LGRPID_RES_BASE "" } diff --git a/reactos/dll/win32/kernel32/nls/hin.nls b/reactos/dll/win32/kernel32/nls/hin.nls index b8893d2722c..22a7d5840b2 100644 --- a/reactos/dll/win32/kernel32/nls/hin.nls +++ b/reactos/dll/win32/kernel32/nls/hin.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_HINDI, SUBLANG_DEFAULT LOCALE_INEGSEPBYSPACE "1" LOCALE_INEGSIGNPOSN "4" LOCALE_INEGSYMPRECEDES "1" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "4" LOCALE_IPOSSYMPRECEDES "1" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "1" LOCALE_ITIMEMARKPOSN "1" LOCALE_ITLZERO "1" diff --git a/reactos/dll/win32/kernel32/nls/hrv.nls b/reactos/dll/win32/kernel32/nls/hrv.nls index 38d827bfb48..ea6cb260b03 100644 --- a/reactos/dll/win32/kernel32/nls/hrv.nls +++ b/reactos/dll/win32/kernel32/nls/hrv.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_SERBIAN, SUBLANG_DEFAULT LOCALE_INEGSEPBYSPACE "1" LOCALE_INEGSIGNPOSN "1" LOCALE_INEGSYMPRECEDES "0" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "1" LOCALE_IPOSSYMPRECEDES "0" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "1" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "0" @@ -66,14 +68,14 @@ STRINGTABLE LANGUAGE LANG_SERBIAN, SUBLANG_DEFAULT LOCALE_SABBREVDAYNAME1 "pon" LOCALE_SABBREVDAYNAME2 "uto" LOCALE_SABBREVDAYNAME3 "sri" - LOCALE_SABBREVDAYNAME4 "\x00E8et" + LOCALE_SABBREVDAYNAME4 L"\x010Det" LOCALE_SABBREVDAYNAME5 "pet" LOCALE_SABBREVDAYNAME6 "sub" LOCALE_SABBREVDAYNAME7 "ned" LOCALE_SABBREVLANGNAME "HRV" LOCALE_SABBREVMONTHNAME1 "sij" LOCALE_SABBREVMONTHNAME2 "vlj" - LOCALE_SABBREVMONTHNAME3 "o\x017Eu" + LOCALE_SABBREVMONTHNAME3 L"o\x017Eu" LOCALE_SABBREVMONTHNAME4 "tra" LOCALE_SABBREVMONTHNAME5 "svi" LOCALE_SABBREVMONTHNAME6 "lip" @@ -90,7 +92,7 @@ STRINGTABLE LANGUAGE LANG_SERBIAN, SUBLANG_DEFAULT LOCALE_SDAYNAME1 "ponedjeljak" LOCALE_SDAYNAME2 "utorak" LOCALE_SDAYNAME3 "srijeda" - LOCALE_SDAYNAME4 "\x00E8etvrtak" + LOCALE_SDAYNAME4 L"\x010Detvrtak" LOCALE_SDAYNAME5 "petak" LOCALE_SDAYNAME6 "subota" LOCALE_SDAYNAME7 "nedjelja" @@ -107,9 +109,9 @@ STRINGTABLE LANGUAGE LANG_SERBIAN, SUBLANG_DEFAULT LOCALE_SLONGDATE "d. MMMM yyyy" LOCALE_SMONDECIMALSEP "," LOCALE_SMONGROUPING "3;0" - LOCALE_SMONTHNAME1 "sije\x00E8anj" - LOCALE_SMONTHNAME2 "velja\x00E8a" - LOCALE_SMONTHNAME3 "o\x017Eujak" + LOCALE_SMONTHNAME1 L"sije\x010Danj" + LOCALE_SMONTHNAME2 L"velja\x010Da" + LOCALE_SMONTHNAME3 L"o\x017Eujak" LOCALE_SMONTHNAME4 "travanj" LOCALE_SMONTHNAME5 "svibanj" LOCALE_SMONTHNAME6 "lipanj" diff --git a/reactos/dll/win32/kernel32/nls/hun.nls b/reactos/dll/win32/kernel32/nls/hun.nls index f6a00c719d3..c1991d47da8 100644 --- a/reactos/dll/win32/kernel32/nls/hun.nls +++ b/reactos/dll/win32/kernel32/nls/hun.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_HUNGARIAN, SUBLANG_DEFAULT LOCALE_INEGSEPBYSPACE "1" LOCALE_INEGSIGNPOSN "1" LOCALE_INEGSYMPRECEDES "0" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "1" LOCALE_IPOSSYMPRECEDES "0" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "1" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "0" diff --git a/reactos/dll/win32/kernel32/nls/hye.nls b/reactos/dll/win32/kernel32/nls/hye.nls index fd10c7d6c62..a3ef4be563d 100644 --- a/reactos/dll/win32/kernel32/nls/hye.nls +++ b/reactos/dll/win32/kernel32/nls/hye.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_ARMENIAN, SUBLANG_DEFAULT LOCALE_INEGSEPBYSPACE "1" LOCALE_INEGSIGNPOSN "1" LOCALE_INEGSYMPRECEDES "0" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "1" LOCALE_IPOSSYMPRECEDES "0" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "1" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "0" diff --git a/reactos/dll/win32/kernel32/nls/ind.nls b/reactos/dll/win32/kernel32/nls/ind.nls index f929e27c2b5..80991404819 100644 --- a/reactos/dll/win32/kernel32/nls/ind.nls +++ b/reactos/dll/win32/kernel32/nls/ind.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_INDONESIAN, SUBLANG_DEFAULT LOCALE_INEGSEPBYSPACE "0" LOCALE_INEGSIGNPOSN "0" LOCALE_INEGSYMPRECEDES "1" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "0" LOCALE_IPOSSIGNPOSN "3" LOCALE_IPOSSYMPRECEDES "1" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "1" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "0" diff --git a/reactos/dll/win32/kernel32/nls/isl.nls b/reactos/dll/win32/kernel32/nls/isl.nls index 055068ff3a6..1975d36246c 100644 --- a/reactos/dll/win32/kernel32/nls/isl.nls +++ b/reactos/dll/win32/kernel32/nls/isl.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_ICELANDIC, SUBLANG_DEFAULT LOCALE_INEGSEPBYSPACE "1" LOCALE_INEGSIGNPOSN "1" LOCALE_INEGSYMPRECEDES "0" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "1" LOCALE_IPOSSYMPRECEDES "0" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "1" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "1" diff --git a/reactos/dll/win32/kernel32/nls/ita.nls b/reactos/dll/win32/kernel32/nls/ita.nls index a74fe36bde5..46670cda8bd 100644 --- a/reactos/dll/win32/kernel32/nls/ita.nls +++ b/reactos/dll/win32/kernel32/nls/ita.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_ITALIAN, SUBLANG_ITALIAN LOCALE_INEGSEPBYSPACE "1" LOCALE_INEGSIGNPOSN "3" LOCALE_INEGSYMPRECEDES "1" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "3" LOCALE_IPOSSYMPRECEDES "1" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "1" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "0" diff --git a/reactos/dll/win32/kernel32/nls/its.nls b/reactos/dll/win32/kernel32/nls/its.nls index 0f6f3f142a4..3e83f42e151 100644 --- a/reactos/dll/win32/kernel32/nls/its.nls +++ b/reactos/dll/win32/kernel32/nls/its.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_ITALIAN, SUBLANG_ITALIAN_SWISS LOCALE_INEGSEPBYSPACE "0" LOCALE_INEGSIGNPOSN "4" LOCALE_INEGSYMPRECEDES "1" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "4" LOCALE_IPOSSYMPRECEDES "1" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "1" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "1" diff --git a/reactos/dll/win32/kernel32/nls/jpn.nls b/reactos/dll/win32/kernel32/nls/jpn.nls index c2eb795a6e3..db6d489a7f2 100644 --- a/reactos/dll/win32/kernel32/nls/jpn.nls +++ b/reactos/dll/win32/kernel32/nls/jpn.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT LOCALE_INEGSEPBYSPACE "0" LOCALE_INEGSIGNPOSN "3" LOCALE_INEGSYMPRECEDES "1" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "3" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "0" LOCALE_IPOSSIGNPOSN "3" LOCALE_IPOSSYMPRECEDES "1" + LOCALE_IREADINGLAYOUT "2" LOCALE_ITIME "1" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "0" diff --git a/reactos/dll/win32/kernel32/nls/kan.nls b/reactos/dll/win32/kernel32/nls/kan.nls index 725ba84e471..cf56381d654 100644 --- a/reactos/dll/win32/kernel32/nls/kan.nls +++ b/reactos/dll/win32/kernel32/nls/kan.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_KANNADA, SUBLANG_DEFAULT LOCALE_INEGSEPBYSPACE "1" LOCALE_INEGSIGNPOSN "4" LOCALE_INEGSYMPRECEDES "1" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "4" LOCALE_IPOSSYMPRECEDES "1" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "1" LOCALE_ITIMEMARKPOSN "1" LOCALE_ITLZERO "1" diff --git a/reactos/dll/win32/kernel32/nls/kat.nls b/reactos/dll/win32/kernel32/nls/kat.nls index d9d1430bb45..c25b31aa167 100644 --- a/reactos/dll/win32/kernel32/nls/kat.nls +++ b/reactos/dll/win32/kernel32/nls/kat.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_GEORGIAN, SUBLANG_DEFAULT LOCALE_INEGSEPBYSPACE "1" LOCALE_INEGSIGNPOSN "1" LOCALE_INEGSYMPRECEDES "0" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "1" LOCALE_IPOSSYMPRECEDES "0" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "1" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "0" diff --git a/reactos/dll/win32/kernel32/nls/kkz.nls b/reactos/dll/win32/kernel32/nls/kkz.nls index 929ebfe91b3..8ec369ca90c 100644 --- a/reactos/dll/win32/kernel32/nls/kkz.nls +++ b/reactos/dll/win32/kernel32/nls/kkz.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_KAZAK, SUBLANG_DEFAULT LOCALE_INEGSEPBYSPACE "0" LOCALE_INEGSIGNPOSN "3" LOCALE_INEGSYMPRECEDES "1" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "0" LOCALE_IPOSSIGNPOSN "3" LOCALE_IPOSSYMPRECEDES "1" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "1" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "0" diff --git a/reactos/dll/win32/kernel32/nls/knk.nls b/reactos/dll/win32/kernel32/nls/knk.nls index 705398d26cb..7268731236f 100644 --- a/reactos/dll/win32/kernel32/nls/knk.nls +++ b/reactos/dll/win32/kernel32/nls/knk.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_KONKANI, SUBLANG_DEFAULT LOCALE_INEGSEPBYSPACE "1" LOCALE_INEGSIGNPOSN "4" LOCALE_INEGSYMPRECEDES "1" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "4" LOCALE_IPOSSYMPRECEDES "1" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "1" LOCALE_ITIMEMARKPOSN "1" LOCALE_ITLZERO "1" diff --git a/reactos/dll/win32/kernel32/nls/kor.nls b/reactos/dll/win32/kernel32/nls/kor.nls index c3ea67b6cd2..d2a65e96e4e 100644 --- a/reactos/dll/win32/kernel32/nls/kor.nls +++ b/reactos/dll/win32/kernel32/nls/kor.nls @@ -52,24 +52,26 @@ STRINGTABLE LANGUAGE LANG_KOREAN, SUBLANG_KOREAN LOCALE_INEGSEPBYSPACE "0" LOCALE_INEGSIGNPOSN "3" LOCALE_INEGSYMPRECEDES "1" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "5" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "0" LOCALE_IPOSSIGNPOSN "3" LOCALE_IPOSSYMPRECEDES "1" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "0" LOCALE_ITIMEMARKPOSN "1" LOCALE_ITLZERO "0" - LOCALE_S1159 "" - LOCALE_S2359 "" + LOCALE_S1159 L"\xC624\xC804" + LOCALE_S2359 L"\xC624\xD6C4" LOCALE_SABBREVCTRYNAME "KOR" - LOCALE_SABBREVDAYNAME1 "" - LOCALE_SABBREVDAYNAME2 "ȭ" - LOCALE_SABBREVDAYNAME3 "" - LOCALE_SABBREVDAYNAME4 "" - LOCALE_SABBREVDAYNAME5 "" - LOCALE_SABBREVDAYNAME6 "" - LOCALE_SABBREVDAYNAME7 "" + LOCALE_SABBREVDAYNAME1 L"\xC6D4" + LOCALE_SABBREVDAYNAME2 L"\xD654" + LOCALE_SABBREVDAYNAME3 L"\xC218" + LOCALE_SABBREVDAYNAME4 L"\xBAA9" + LOCALE_SABBREVDAYNAME5 L"\xAE08" + LOCALE_SABBREVDAYNAME6 L"\xD1A0" + LOCALE_SABBREVDAYNAME7 L"\xC77C" LOCALE_SABBREVLANGNAME "KOR" LOCALE_SABBREVMONTHNAME1 "1" LOCALE_SABBREVMONTHNAME2 "2" @@ -87,13 +89,13 @@ STRINGTABLE LANGUAGE LANG_KOREAN, SUBLANG_KOREAN LOCALE_SCOUNTRY "Korea" LOCALE_SCURRENCY L"\x20a9" LOCALE_SDATE "-" - LOCALE_SDAYNAME1 "" - LOCALE_SDAYNAME2 "ȭ" - LOCALE_SDAYNAME3 "" - LOCALE_SDAYNAME4 "" - LOCALE_SDAYNAME5 "ݿ" - LOCALE_SDAYNAME6 "" - LOCALE_SDAYNAME7 "Ͽ" + LOCALE_SDAYNAME1 L"\xC6D4\xC694\xC77C" + LOCALE_SDAYNAME2 L"\xD654\xC694\xC77C" + LOCALE_SDAYNAME3 L"\xC218\xC694\xC77C" + LOCALE_SDAYNAME4 L"\xBAA9\xC694\xC77C" + LOCALE_SDAYNAME5 L"\xAE08\xC694\xC77C" + LOCALE_SDAYNAME6 L"\xD1A0\xC694\xC77C" + LOCALE_SDAYNAME7 L"\xC77C\xC694\xC77C" LOCALE_SDECIMAL "." LOCALE_SENGCOUNTRY "Korea" LOCALE_SENGCURRNAME "Korean Won" @@ -104,28 +106,28 @@ STRINGTABLE LANGUAGE LANG_KOREAN, SUBLANG_KOREAN LOCALE_SISO639LANGNAME "ko" LOCALE_SLANGUAGE "Korean" LOCALE_SLIST "," - LOCALE_SLONGDATE "yyyy'' M'' d'' dddd" + LOCALE_SLONGDATE L"yyyy'\xB144' M'\xC6D4' d'\xC77C' dddd" LOCALE_SMONDECIMALSEP "." LOCALE_SMONGROUPING "3;0" - LOCALE_SMONTHNAME1 "1" - LOCALE_SMONTHNAME2 "2" - LOCALE_SMONTHNAME3 "3" - LOCALE_SMONTHNAME4 "4" - LOCALE_SMONTHNAME5 "5" - LOCALE_SMONTHNAME6 "6" - LOCALE_SMONTHNAME7 "7" - LOCALE_SMONTHNAME8 "8" - LOCALE_SMONTHNAME9 "9" - LOCALE_SMONTHNAME10 "10" - LOCALE_SMONTHNAME11 "11" - LOCALE_SMONTHNAME12 "12" + LOCALE_SMONTHNAME1 L"1\xC6D4" + LOCALE_SMONTHNAME2 L"2\xC6D4" + LOCALE_SMONTHNAME3 L"3\xC6D4" + LOCALE_SMONTHNAME4 L"4\xC6D4" + LOCALE_SMONTHNAME5 L"5\xC6D4" + LOCALE_SMONTHNAME6 L"6\xC6D4" + LOCALE_SMONTHNAME7 L"7\xC6D4" + LOCALE_SMONTHNAME8 L"8\xC6D4" + LOCALE_SMONTHNAME9 L"9\xC6D4" + LOCALE_SMONTHNAME10 L"10\xC6D4" + LOCALE_SMONTHNAME11 L"11\xC6D4" + LOCALE_SMONTHNAME12 L"12\xC6D4" LOCALE_SMONTHNAME13 "" LOCALE_SMONTHOUSANDSEP "," LOCALE_SNAME "ko-KR" - LOCALE_SNATIVECTRYNAME "ѹα" - LOCALE_SNATIVECURRNAME "" + LOCALE_SNATIVECTRYNAME L"\xB300\xD55C\xBBFC\xAD6D" + LOCALE_SNATIVECURRNAME L"\xC6D0" LOCALE_SNATIVEDIGITS "0123456789" - LOCALE_SNATIVELANGNAME "ѱ" + LOCALE_SNATIVELANGNAME L"\xD55C\xAD6D\xC5B4" LOCALE_SNEGATIVESIGN "-" LOCALE_SPOSITIVESIGN "" LOCALE_SSCRIPTS "Hang;Hani;" @@ -134,7 +136,7 @@ STRINGTABLE LANGUAGE LANG_KOREAN, SUBLANG_KOREAN LOCALE_STHOUSAND "," LOCALE_STIME ":" LOCALE_STIMEFORMAT "tt h:mm:ss" - LOCALE_SYEARMONTH "yyyy'' M''" + LOCALE_SYEARMONTH L"yyyy'\xB144' M'\xC6D4'" LGRPID_WESTERN_EUROPE+LGRPID_RES_BASE "Western Europe and United States" LGRPID_CENTRAL_EUROPE+LGRPID_RES_BASE "Central Europe" diff --git a/reactos/dll/win32/kernel32/nls/kyr.nls b/reactos/dll/win32/kernel32/nls/kyr.nls index e720a886012..ff6dde31f73 100644 --- a/reactos/dll/win32/kernel32/nls/kyr.nls +++ b/reactos/dll/win32/kernel32/nls/kyr.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_KYRGYZ, SUBLANG_DEFAULT LOCALE_INEGSEPBYSPACE "1" LOCALE_INEGSIGNPOSN "1" LOCALE_INEGSYMPRECEDES "0" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "1" LOCALE_IPOSSYMPRECEDES "0" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "1" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "0" diff --git a/reactos/dll/win32/kernel32/nls/lth.nls b/reactos/dll/win32/kernel32/nls/lth.nls index 40944c167e4..b92fc3fc241 100644 --- a/reactos/dll/win32/kernel32/nls/lth.nls +++ b/reactos/dll/win32/kernel32/nls/lth.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_LITHUANIAN, SUBLANG_LITHUANIAN LOCALE_INEGSEPBYSPACE "1" LOCALE_INEGSIGNPOSN "1" LOCALE_INEGSYMPRECEDES "0" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "1" LOCALE_IPOSSYMPRECEDES "0" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "1" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "1" diff --git a/reactos/dll/win32/kernel32/nls/lvi.nls b/reactos/dll/win32/kernel32/nls/lvi.nls index 99ee7f1f79b..f5dc90ffa6c 100644 --- a/reactos/dll/win32/kernel32/nls/lvi.nls +++ b/reactos/dll/win32/kernel32/nls/lvi.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_LATVIAN, SUBLANG_DEFAULT LOCALE_INEGSEPBYSPACE "1" LOCALE_INEGSIGNPOSN "3" LOCALE_INEGSYMPRECEDES "1" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "3" LOCALE_IPOSSYMPRECEDES "1" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "1" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "0" diff --git a/reactos/dll/win32/kernel32/nls/mar.nls b/reactos/dll/win32/kernel32/nls/mar.nls index 531819599a0..597a46224d5 100644 --- a/reactos/dll/win32/kernel32/nls/mar.nls +++ b/reactos/dll/win32/kernel32/nls/mar.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_MARATHI, SUBLANG_DEFAULT LOCALE_INEGSEPBYSPACE "1" LOCALE_INEGSIGNPOSN "4" LOCALE_INEGSYMPRECEDES "1" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "4" LOCALE_IPOSSYMPRECEDES "1" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "1" LOCALE_ITIMEMARKPOSN "1" LOCALE_ITLZERO "1" diff --git a/reactos/dll/win32/kernel32/nls/mki.nls b/reactos/dll/win32/kernel32/nls/mki.nls index 760967dcab1..c50010b1628 100644 --- a/reactos/dll/win32/kernel32/nls/mki.nls +++ b/reactos/dll/win32/kernel32/nls/mki.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_MACEDONIAN, SUBLANG_DEFAULT LOCALE_INEGSEPBYSPACE "1" LOCALE_INEGSIGNPOSN "1" LOCALE_INEGSYMPRECEDES "0" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "1" LOCALE_IPOSSYMPRECEDES "0" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "1" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "1" diff --git a/reactos/dll/win32/kernel32/nls/mon.nls b/reactos/dll/win32/kernel32/nls/mon.nls index 0dc4dea725d..845664fa780 100644 --- a/reactos/dll/win32/kernel32/nls/mon.nls +++ b/reactos/dll/win32/kernel32/nls/mon.nls @@ -52,24 +52,26 @@ STRINGTABLE LANGUAGE LANG_MONGOLIAN, SUBLANG_DEFAULT LOCALE_INEGSEPBYSPACE "0" LOCALE_INEGSIGNPOSN "1" LOCALE_INEGSYMPRECEDES "0" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "0" LOCALE_IPOSSIGNPOSN "1" LOCALE_IPOSSYMPRECEDES "0" + LOCALE_IREADINGLAYOUT "3" LOCALE_ITIME "1" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "0" LOCALE_S1159 "" LOCALE_S2359 "" LOCALE_SABBREVCTRYNAME "MNG" - LOCALE_SABBREVDAYNAME1 "\x041f\x04af" - LOCALE_SABBREVDAYNAME2 "\x041f\x04af" - LOCALE_SABBREVDAYNAME3 "\x041f\x04af" - LOCALE_SABBREVDAYNAME4 "\x041f\x04af" - LOCALE_SABBREVDAYNAME5 "\x041f\x04af" - LOCALE_SABBREVDAYNAME6 "\x041f\x04af" - LOCALE_SABBREVDAYNAME7 "\x041f\x04af" + LOCALE_SABBREVDAYNAME1 L"\x0414\x0430" + LOCALE_SABBREVDAYNAME2 L"\x041C\x044F" + LOCALE_SABBREVDAYNAME3 L"\x041B\x0445" + LOCALE_SABBREVDAYNAME4 L"\x041f\x04af" + LOCALE_SABBREVDAYNAME5 L"\x0411\x0430" + LOCALE_SABBREVDAYNAME6 L"\x0411\x044F" + LOCALE_SABBREVDAYNAME7 L"\x041D\x044F" LOCALE_SABBREVLANGNAME "MON" LOCALE_SABBREVMONTHNAME1 "I" LOCALE_SABBREVMONTHNAME2 "II" @@ -78,7 +80,7 @@ STRINGTABLE LANGUAGE LANG_MONGOLIAN, SUBLANG_DEFAULT LOCALE_SABBREVMONTHNAME5 "V" LOCALE_SABBREVMONTHNAME6 "VI" LOCALE_SABBREVMONTHNAME7 "VII" - LOCALE_SABBREVMONTHNAME8 "V\x0000" + LOCALE_SABBREVMONTHNAME8 L"V\x0428" LOCALE_SABBREVMONTHNAME9 "IX" LOCALE_SABBREVMONTHNAME10 "X" LOCALE_SABBREVMONTHNAME11 "XI" @@ -87,13 +89,13 @@ STRINGTABLE LANGUAGE LANG_MONGOLIAN, SUBLANG_DEFAULT LOCALE_SCOUNTRY "Mongolia" LOCALE_SCURRENCY L"\x20ae" LOCALE_SDATE "." - LOCALE_SDAYNAME1 "\x0000\x0000\x0000\x0000\x0000" - LOCALE_SDAYNAME2 "\x0000\x0000\x0000\x0000\x0000\x0000" - LOCALE_SDAYNAME3 "\x0000\x0000\x0000\x0000\x0000\x0000" + LOCALE_SDAYNAME1 L"\x0414\x0430\x0432\x0430\x0430" + LOCALE_SDAYNAME2 L"\x041C\x044F\x0433\x043C\x0430\x0440" + LOCALE_SDAYNAME3 L"\x041B\x0445\x0430\x0433\x0432\x0430" LOCALE_SDAYNAME4 L"\x041f\x04af\x0440\x044d\x0432" - LOCALE_SDAYNAME5 "\x0000\x0000\x0000\x0000\x0000\x0000" - LOCALE_SDAYNAME6 "\x0000\x0000\x0000\x0000\x0000" - LOCALE_SDAYNAME7 "\x0000\x0000\x0000" + LOCALE_SDAYNAME5 L"\x0411\x0430\x0430\x0441\x0430\x043D" + LOCALE_SDAYNAME6 L"\x0411\x044F\x043C\x0431\x0430" + LOCALE_SDAYNAME7 L"\x041D\x044F\x043C" LOCALE_SDECIMAL "," LOCALE_SENGCOUNTRY "Mongolia" LOCALE_SENGCURRNAME "Tugrik" @@ -104,28 +106,28 @@ STRINGTABLE LANGUAGE LANG_MONGOLIAN, SUBLANG_DEFAULT LOCALE_SISO639LANGNAME "mn" LOCALE_SLANGUAGE "Mongolian (Cyrillic)" LOCALE_SLIST ";" - LOCALE_SLONGDATE "yyyy '\x0000\x0000\x0000' MMMM d" + LOCALE_SLONGDATE L"yyyy '\x043E\x043D\x044B' MMMM d" LOCALE_SMONDECIMALSEP "," LOCALE_SMONGROUPING "3;0" LOCALE_SMONTHNAME1 L"1\x00a0\x0434\x04af\x0433\x044d\x044d\x0440\x00a0\x0441\x0430\x0440" - LOCALE_SMONTHNAME2 "2\x00a0\x0434\x04af\x0433\x044d\x044d\x0440\x00a0\x0441\x0430\x0440" - LOCALE_SMONTHNAME3 "3\x00a0\x0434\x04af\x0433\x044d\x044d\x0440\x00a0\x0441\x0430\x0440" - LOCALE_SMONTHNAME4 "4\x00a0\x0434\x04af\x0433\x044d\x044d\x0440\x00a0\x0441\x0430\x0440" - LOCALE_SMONTHNAME5 "5\x00a0\x0434\x04af\x0433\x044d\x044d\x0440\x00a0\x0441\x0430\x0440" - LOCALE_SMONTHNAME6 "6\x00a0\x0434\x04af\x0433\x044d\x044d\x0440\x00a0\x0441\x0430\x0440" - LOCALE_SMONTHNAME7 "7\x00a0\x0434\x04af\x0433\x044d\x044d\x0440\x00a0\x0441\x0430\x0440" - LOCALE_SMONTHNAME8 "8\x00a0\x0434\x04af\x0433\x044d\x044d\x0440\x00a0\x0441\x0430\x0440" - LOCALE_SMONTHNAME9 "9\x00a0\x0434\x04af\x0433\x044d\x044d\x0440\x00a0\x0441\x0430\x0440" - LOCALE_SMONTHNAME10 "10\x00a0\x0434\x04af\x0433\x044d\x044d\x0440\x00a0\x0441\x0430\x0440" - LOCALE_SMONTHNAME11 "11\x00a0\x0434\x04af\x0433\x044d\x044d\x0440\x00a0\x0441\x0430\x0440" - LOCALE_SMONTHNAME12 "12\x00a0\x0434\x04af\x0433\x044d\x044d\x0440\x00a0\x0441\x0430\x0440" + LOCALE_SMONTHNAME2 L"2 \x0434\x0443\x0433\x0430\x0430\x0440 \x0441\x0430\x0440" + LOCALE_SMONTHNAME3 L"3 \x0434\x0443\x0433\x0430\x0430\x0440 \x0441\x0430\x0440" + LOCALE_SMONTHNAME4 L"4\x00a0\x0434\x04af\x0433\x044d\x044d\x0440\x00a0\x0441\x0430\x0440" + LOCALE_SMONTHNAME5 L"5 \x0434\x0443\x0433\x0430\x0430\x0440 \x0441\x0430\x0440" + LOCALE_SMONTHNAME6 L"6 \x0434\x0443\x0433\x0430\x0430\x0440 \x0441\x0430\x0440" + LOCALE_SMONTHNAME7 L"7 \x0434\x0443\x0433\x0430\x0430\x0440 \x0441\x0430\x0440" + LOCALE_SMONTHNAME8 L"8 \x0434\x0443\x0433\x0430\x0430\x0440 \x0441\x0430\x0440" + LOCALE_SMONTHNAME9 L"9\x00a0\x0434\x04af\x0433\x044d\x044d\x0440\x00a0\x0441\x0430\x0440" + LOCALE_SMONTHNAME10 L"10 \x0434\x0443\x0433\x0430\x0430\x0440 \x0441\x0430\x0440" + LOCALE_SMONTHNAME11 L"11\x00a0\x0434\x04af\x0433\x044d\x044d\x0440\x00a0\x0441\x0430\x0440" + LOCALE_SMONTHNAME12 L"12 \x0434\x0443\x0433\x0430\x0430\x0440 \x0441\x0430\x0440" LOCALE_SMONTHNAME13 "" - LOCALE_SMONTHOUSANDSEP "." + LOCALE_SMONTHOUSANDSEP " " LOCALE_SNAME "mn-MN" - LOCALE_SNATIVECTRYNAME "\x0000\x0000\x0000í\x0000ã\x0000\x0000 \x0000ó\x0000\x0441" + LOCALE_SNATIVECTRYNAME L"\x041C\x043E\x043D\x0433\x043E\x043B \x0443\x043B\x0441" LOCALE_SNATIVECURRNAME L"\x0422\x04e9\x0433\x0440\x04e9\x0433" LOCALE_SNATIVEDIGITS "0123456789" - LOCALE_SNATIVELANGNAME "\x0000\x0000\x0000\x0000\x0000\x0000 \x0000\x0000\x0000" + LOCALE_SNATIVELANGNAME L"\x041C\x043E\x043D\x0433\x043E\x043B \x0445\x044D\x043B" LOCALE_SNEGATIVESIGN "-" LOCALE_SPOSITIVESIGN "" LOCALE_SSCRIPTS "Cyrl;" @@ -134,7 +136,7 @@ STRINGTABLE LANGUAGE LANG_MONGOLIAN, SUBLANG_DEFAULT LOCALE_STHOUSAND " " LOCALE_STIME ":" LOCALE_STIMEFORMAT "H:mm:ss" - LOCALE_SYEARMONTH "yyyy '\x0000\x0000' MMMM" + LOCALE_SYEARMONTH "yyyy '\x043E\x043D' MMMM" LGRPID_WESTERN_EUROPE+LGRPID_RES_BASE "Western Europe and United States" LGRPID_CENTRAL_EUROPE+LGRPID_RES_BASE "Central Europe" diff --git a/reactos/dll/win32/kernel32/nls/msb.nls b/reactos/dll/win32/kernel32/nls/msb.nls index 8e3a8cbabcf..20469d15f6e 100644 --- a/reactos/dll/win32/kernel32/nls/msb.nls +++ b/reactos/dll/win32/kernel32/nls/msb.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_MALAY, SUBLANG_MALAY_BRUNEI_DARUSSALAM LOCALE_INEGSEPBYSPACE "0" LOCALE_INEGSIGNPOSN "0" LOCALE_INEGSYMPRECEDES "1" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "0" LOCALE_IPOSSIGNPOSN "3" LOCALE_IPOSSYMPRECEDES "1" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "1" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "0" diff --git a/reactos/dll/win32/kernel32/nls/msl.nls b/reactos/dll/win32/kernel32/nls/msl.nls index 4f9bacb7717..af08e550085 100644 --- a/reactos/dll/win32/kernel32/nls/msl.nls +++ b/reactos/dll/win32/kernel32/nls/msl.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_MALAY, SUBLANG_MALAY_MALAYSIA LOCALE_INEGSEPBYSPACE "0" LOCALE_INEGSIGNPOSN "0" LOCALE_INEGSYMPRECEDES "1" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "0" LOCALE_IPOSSIGNPOSN "3" LOCALE_IPOSSYMPRECEDES "1" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "1" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "0" diff --git a/reactos/dll/win32/kernel32/nls/nlb.nls b/reactos/dll/win32/kernel32/nls/nlb.nls index e2c9ed11ab5..a901ecbc78e 100644 --- a/reactos/dll/win32/kernel32/nls/nlb.nls +++ b/reactos/dll/win32/kernel32/nls/nlb.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_DUTCH, SUBLANG_DUTCH_BELGIAN LOCALE_INEGSEPBYSPACE "1" LOCALE_INEGSIGNPOSN "1" LOCALE_INEGSYMPRECEDES "0" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "1" LOCALE_IPOSSYMPRECEDES "0" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "1" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "0" diff --git a/reactos/dll/win32/kernel32/nls/nld.nls b/reactos/dll/win32/kernel32/nls/nld.nls index e5be60f0459..9b8975ece58 100644 --- a/reactos/dll/win32/kernel32/nls/nld.nls +++ b/reactos/dll/win32/kernel32/nls/nld.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_DUTCH, SUBLANG_DUTCH LOCALE_INEGSEPBYSPACE "1" LOCALE_INEGSIGNPOSN "2" LOCALE_INEGSYMPRECEDES "1" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "2" LOCALE_IPOSSYMPRECEDES "1" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "1" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "0" diff --git a/reactos/dll/win32/kernel32/nls/non.nls b/reactos/dll/win32/kernel32/nls/non.nls index e33611b231a..1cdd102580b 100644 --- a/reactos/dll/win32/kernel32/nls/non.nls +++ b/reactos/dll/win32/kernel32/nls/non.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_NORWEGIAN, SUBLANG_NORWEGIAN_NYNORSK LOCALE_INEGSEPBYSPACE "1" LOCALE_INEGSIGNPOSN "4" LOCALE_INEGSYMPRECEDES "1" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "4" LOCALE_IPOSSYMPRECEDES "1" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "1" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "1" diff --git a/reactos/dll/win32/kernel32/nls/nor.nls b/reactos/dll/win32/kernel32/nls/nor.nls index f7340f34744..05ad6dc9098 100644 --- a/reactos/dll/win32/kernel32/nls/nor.nls +++ b/reactos/dll/win32/kernel32/nls/nor.nls @@ -53,11 +53,13 @@ STRINGTABLE LANGUAGE LANG_NORWEGIAN, SUBLANG_NORWEGIAN_BOKMAL LOCALE_INEGSEPBYSPACE "1" LOCALE_INEGSIGNPOSN "4" LOCALE_INEGSYMPRECEDES "1" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "4" LOCALE_IPOSSYMPRECEDES "1" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "1" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "1" diff --git a/reactos/dll/win32/kernel32/nls/pan.nls b/reactos/dll/win32/kernel32/nls/pan.nls index febaa1d7f52..b52d8ea1a13 100644 --- a/reactos/dll/win32/kernel32/nls/pan.nls +++ b/reactos/dll/win32/kernel32/nls/pan.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_PUNJABI, SUBLANG_DEFAULT LOCALE_INEGSEPBYSPACE "1" LOCALE_INEGSIGNPOSN "4" LOCALE_INEGSYMPRECEDES "1" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "4" LOCALE_IPOSSYMPRECEDES "1" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "0" LOCALE_ITIMEMARKPOSN "1" LOCALE_ITLZERO "1" diff --git a/reactos/dll/win32/kernel32/nls/plk.nls b/reactos/dll/win32/kernel32/nls/plk.nls index 3a441ffd769..9bc7897c4c2 100644 --- a/reactos/dll/win32/kernel32/nls/plk.nls +++ b/reactos/dll/win32/kernel32/nls/plk.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_POLISH, SUBLANG_DEFAULT LOCALE_INEGSEPBYSPACE "1" LOCALE_INEGSIGNPOSN "1" LOCALE_INEGSYMPRECEDES "0" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "1" LOCALE_IPOSSYMPRECEDES "0" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "1" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "1" diff --git a/reactos/dll/win32/kernel32/nls/ptb.nls b/reactos/dll/win32/kernel32/nls/ptb.nls index 6ca15204d3d..e77ae3f8fc3 100644 --- a/reactos/dll/win32/kernel32/nls/ptb.nls +++ b/reactos/dll/win32/kernel32/nls/ptb.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE_BRAZILIAN LOCALE_INEGSEPBYSPACE "0" LOCALE_INEGSIGNPOSN "0" LOCALE_INEGSYMPRECEDES "1" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "0" LOCALE_IPOSSIGNPOSN "3" LOCALE_IPOSSYMPRECEDES "1" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "1" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "1" diff --git a/reactos/dll/win32/kernel32/nls/ptg.nls b/reactos/dll/win32/kernel32/nls/ptg.nls index 38a3e546c12..d27056c0547 100644 --- a/reactos/dll/win32/kernel32/nls/ptg.nls +++ b/reactos/dll/win32/kernel32/nls/ptg.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE LOCALE_INEGSEPBYSPACE "1" LOCALE_INEGSIGNPOSN "1" LOCALE_INEGSYMPRECEDES "0" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "1" LOCALE_IPOSSYMPRECEDES "0" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "1" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "0" diff --git a/reactos/dll/win32/kernel32/nls/rmc.nls b/reactos/dll/win32/kernel32/nls/rmc.nls index aff624e2062..d1e818f1ca1 100644 --- a/reactos/dll/win32/kernel32/nls/rmc.nls +++ b/reactos/dll/win32/kernel32/nls/rmc.nls @@ -63,11 +63,13 @@ STRINGTABLE LANGUAGE LANG_ROMANSH, SUBLANG_ROMANSH_SWITZERLAND LOCALE_INEGSEPBYSPACE "0" LOCALE_INEGSIGNPOSN "4" LOCALE_INEGSYMPRECEDES "1" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "4" LOCALE_IPOSSYMPRECEDES "1" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "1" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "1" diff --git a/reactos/dll/win32/kernel32/nls/rom.nls b/reactos/dll/win32/kernel32/nls/rom.nls index f3837a55457..9c4d4ec224e 100644 --- a/reactos/dll/win32/kernel32/nls/rom.nls +++ b/reactos/dll/win32/kernel32/nls/rom.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_ROMANIAN, SUBLANG_DEFAULT LOCALE_INEGSEPBYSPACE "1" LOCALE_INEGSIGNPOSN "1" LOCALE_INEGSYMPRECEDES "0" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "1" LOCALE_IPOSSYMPRECEDES "0" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "1" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "1" diff --git a/reactos/dll/win32/kernel32/nls/rus.nls b/reactos/dll/win32/kernel32/nls/rus.nls index 5cead8134a8..2d35a15e627 100644 --- a/reactos/dll/win32/kernel32/nls/rus.nls +++ b/reactos/dll/win32/kernel32/nls/rus.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT LOCALE_INEGSEPBYSPACE "0" LOCALE_INEGSIGNPOSN "1" LOCALE_INEGSYMPRECEDES "0" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "0" LOCALE_IPOSSIGNPOSN "1" LOCALE_IPOSSYMPRECEDES "0" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "1" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "0" diff --git a/reactos/dll/win32/kernel32/nls/san.nls b/reactos/dll/win32/kernel32/nls/san.nls index d6f353f3858..fd1c2fd77ba 100644 --- a/reactos/dll/win32/kernel32/nls/san.nls +++ b/reactos/dll/win32/kernel32/nls/san.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_SANSKRIT, SUBLANG_DEFAULT LOCALE_INEGSEPBYSPACE "1" LOCALE_INEGSIGNPOSN "4" LOCALE_INEGSYMPRECEDES "1" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "4" LOCALE_IPOSSYMPRECEDES "1" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "1" LOCALE_ITIMEMARKPOSN "1" LOCALE_ITLZERO "1" diff --git a/reactos/dll/win32/kernel32/nls/sky.nls b/reactos/dll/win32/kernel32/nls/sky.nls index 7fe7ffa4c66..d631b1df445 100644 --- a/reactos/dll/win32/kernel32/nls/sky.nls +++ b/reactos/dll/win32/kernel32/nls/sky.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_SLOVAK, SUBLANG_DEFAULT LOCALE_INEGSEPBYSPACE "1" LOCALE_INEGSIGNPOSN "1" LOCALE_INEGSYMPRECEDES "0" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "1" LOCALE_IPOSSYMPRECEDES "0" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "1" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "0" diff --git a/reactos/dll/win32/kernel32/nls/slv.nls b/reactos/dll/win32/kernel32/nls/slv.nls index 58cfce93605..327df7e72d6 100644 --- a/reactos/dll/win32/kernel32/nls/slv.nls +++ b/reactos/dll/win32/kernel32/nls/slv.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_SLOVENIAN, SUBLANG_DEFAULT LOCALE_INEGSEPBYSPACE "1" LOCALE_INEGSIGNPOSN "1" LOCALE_INEGSYMPRECEDES "0" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "1" LOCALE_IPOSSYMPRECEDES "0" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "1" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "0" diff --git a/reactos/dll/win32/kernel32/nls/sqi.nls b/reactos/dll/win32/kernel32/nls/sqi.nls index 3a772071286..fd4641fd87c 100644 --- a/reactos/dll/win32/kernel32/nls/sqi.nls +++ b/reactos/dll/win32/kernel32/nls/sqi.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_ALBANIAN, SUBLANG_DEFAULT LOCALE_INEGSEPBYSPACE "0" LOCALE_INEGSIGNPOSN "1" LOCALE_INEGSYMPRECEDES "0" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "0" LOCALE_IPOSSIGNPOSN "1" LOCALE_IPOSSYMPRECEDES "0" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "0" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "0" diff --git a/reactos/dll/win32/kernel32/nls/srb.nls b/reactos/dll/win32/kernel32/nls/srb.nls index 2f0423214e4..2d75eb20712 100644 --- a/reactos/dll/win32/kernel32/nls/srb.nls +++ b/reactos/dll/win32/kernel32/nls/srb.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_SERBIAN, SUBLANG_SERBIAN_CYRILLIC LOCALE_INEGSEPBYSPACE "1" LOCALE_INEGSIGNPOSN "1" LOCALE_INEGSYMPRECEDES "0" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "1" LOCALE_IPOSSYMPRECEDES "0" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "1" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "0" @@ -96,11 +98,11 @@ STRINGTABLE LANGUAGE LANG_SERBIAN, SUBLANG_SERBIAN_CYRILLIC LOCALE_SDAYNAME7 "" LOCALE_SDECIMAL "," LOCALE_SENGCOUNTRY "Serbia" - LOCALE_SENGCURRNAME "Yugoslavian Dinar" + LOCALE_SENGCURRNAME "Serbian Dinar" LOCALE_SENGLANGUAGE "Serbian (Cyrillic)" LOCALE_SGROUPING "3;0" - LOCALE_SINTLSYMBOL "YUN" - LOCALE_SISO3166CTRYNAME "SP" + LOCALE_SINTLSYMBOL "RSD" + LOCALE_SISO3166CTRYNAME "RS" LOCALE_SISO639LANGNAME "sr" LOCALE_SLANGUAGE "Serbian (Cyrillic)" LOCALE_SLIST ";" @@ -121,7 +123,7 @@ STRINGTABLE LANGUAGE LANG_SERBIAN, SUBLANG_SERBIAN_CYRILLIC LOCALE_SMONTHNAME12 "" LOCALE_SMONTHNAME13 "" LOCALE_SMONTHOUSANDSEP "." - LOCALE_SNAME "sr-SP" + LOCALE_SNAME "sr-RS" LOCALE_SNATIVECTRYNAME "" LOCALE_SNATIVECURRNAME "" LOCALE_SNATIVEDIGITS "0123456789" diff --git a/reactos/dll/win32/kernel32/nls/srl.nls b/reactos/dll/win32/kernel32/nls/srl.nls index d334f702541..cc53cac151a 100644 --- a/reactos/dll/win32/kernel32/nls/srl.nls +++ b/reactos/dll/win32/kernel32/nls/srl.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_SERBIAN, SUBLANG_SERBIAN_LATIN LOCALE_INEGSEPBYSPACE "1" LOCALE_INEGSIGNPOSN "1" LOCALE_INEGSYMPRECEDES "0" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "1" LOCALE_IPOSSYMPRECEDES "0" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "1" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "0" @@ -96,11 +98,11 @@ STRINGTABLE LANGUAGE LANG_SERBIAN, SUBLANG_SERBIAN_LATIN LOCALE_SDAYNAME7 "nedelja" LOCALE_SDECIMAL "," LOCALE_SENGCOUNTRY "Serbia" - LOCALE_SENGCURRNAME "Yugoslavian Dinar" + LOCALE_SENGCURRNAME "Serbian Dinar" LOCALE_SENGLANGUAGE "Serbian (Latin)" LOCALE_SGROUPING "3;0" - LOCALE_SINTLSYMBOL "YUN" - LOCALE_SISO3166CTRYNAME "SP" + LOCALE_SINTLSYMBOL "RSD" + LOCALE_SISO3166CTRYNAME "RS" LOCALE_SISO639LANGNAME "sr" LOCALE_SLANGUAGE "Serbian (Latin)" LOCALE_SLIST ";" @@ -121,7 +123,7 @@ STRINGTABLE LANGUAGE LANG_SERBIAN, SUBLANG_SERBIAN_LATIN LOCALE_SMONTHNAME12 "decembar" LOCALE_SMONTHNAME13 "" LOCALE_SMONTHOUSANDSEP "." - LOCALE_SNAME "sr-Latn-SP" + LOCALE_SNAME "sr-Latn-RS" LOCALE_SNATIVECTRYNAME "Srbija" LOCALE_SNATIVECURRNAME "dinar" LOCALE_SNATIVEDIGITS "0123456789" diff --git a/reactos/dll/win32/kernel32/nls/sve.nls b/reactos/dll/win32/kernel32/nls/sve.nls index 14d8c058dbf..6ea19d022f3 100644 --- a/reactos/dll/win32/kernel32/nls/sve.nls +++ b/reactos/dll/win32/kernel32/nls/sve.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_SWEDISH, SUBLANG_SWEDISH LOCALE_INEGSEPBYSPACE "1" LOCALE_INEGSIGNPOSN "1" LOCALE_INEGSYMPRECEDES "0" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "1" LOCALE_IPOSSYMPRECEDES "0" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "1" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "1" diff --git a/reactos/dll/win32/kernel32/nls/svf.nls b/reactos/dll/win32/kernel32/nls/svf.nls index 4e217ab54c9..0dfece162ac 100644 --- a/reactos/dll/win32/kernel32/nls/svf.nls +++ b/reactos/dll/win32/kernel32/nls/svf.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_SWEDISH, SUBLANG_SWEDISH_FINLAND LOCALE_INEGSEPBYSPACE "1" LOCALE_INEGSIGNPOSN "1" LOCALE_INEGSYMPRECEDES "0" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "1" LOCALE_IPOSSYMPRECEDES "0" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "1" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "1" diff --git a/reactos/dll/win32/kernel32/nls/swk.nls b/reactos/dll/win32/kernel32/nls/swk.nls index 79d62c3186c..9291aba590f 100644 --- a/reactos/dll/win32/kernel32/nls/swk.nls +++ b/reactos/dll/win32/kernel32/nls/swk.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_SWAHILI, SUBLANG_DEFAULT LOCALE_INEGSEPBYSPACE "0" LOCALE_INEGSIGNPOSN "0" LOCALE_INEGSYMPRECEDES "1" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "0" LOCALE_IPOSSIGNPOSN "3" LOCALE_IPOSSYMPRECEDES "1" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "0" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "0" diff --git a/reactos/dll/win32/kernel32/nls/syr.nls b/reactos/dll/win32/kernel32/nls/syr.nls index 45bb96c25a0..49761edd76a 100644 --- a/reactos/dll/win32/kernel32/nls/syr.nls +++ b/reactos/dll/win32/kernel32/nls/syr.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_SYRIAC, SUBLANG_DEFAULT LOCALE_INEGSEPBYSPACE "0" LOCALE_INEGSIGNPOSN "2" LOCALE_INEGSYMPRECEDES "1" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "1" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "2" LOCALE_IPOSSYMPRECEDES "1" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "0" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "1" diff --git a/reactos/dll/win32/kernel32/nls/tam.nls b/reactos/dll/win32/kernel32/nls/tam.nls index 9820517264b..190482b2841 100644 --- a/reactos/dll/win32/kernel32/nls/tam.nls +++ b/reactos/dll/win32/kernel32/nls/tam.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_TAMIL, SUBLANG_DEFAULT LOCALE_INEGSEPBYSPACE "1" LOCALE_INEGSIGNPOSN "4" LOCALE_INEGSYMPRECEDES "1" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "4" LOCALE_IPOSSYMPRECEDES "1" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "1" LOCALE_ITIMEMARKPOSN "1" LOCALE_ITLZERO "1" diff --git a/reactos/dll/win32/kernel32/nls/tel.nls b/reactos/dll/win32/kernel32/nls/tel.nls index 370a6c96104..1f715863409 100644 --- a/reactos/dll/win32/kernel32/nls/tel.nls +++ b/reactos/dll/win32/kernel32/nls/tel.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_TELUGU, SUBLANG_DEFAULT LOCALE_INEGSEPBYSPACE "1" LOCALE_INEGSIGNPOSN "4" LOCALE_INEGSYMPRECEDES "1" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "4" LOCALE_IPOSSYMPRECEDES "1" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "1" LOCALE_ITIMEMARKPOSN "1" LOCALE_ITLZERO "1" diff --git a/reactos/dll/win32/kernel32/nls/tha.nls b/reactos/dll/win32/kernel32/nls/tha.nls index 42f0a806ad3..85699e28050 100644 --- a/reactos/dll/win32/kernel32/nls/tha.nls +++ b/reactos/dll/win32/kernel32/nls/tha.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_THAI, SUBLANG_DEFAULT LOCALE_INEGSEPBYSPACE "0" LOCALE_INEGSIGNPOSN "3" LOCALE_INEGSYMPRECEDES "1" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "7" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "0" LOCALE_IPOSSIGNPOSN "3" LOCALE_IPOSSYMPRECEDES "1" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "1" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "0" diff --git a/reactos/dll/win32/kernel32/nls/trk.nls b/reactos/dll/win32/kernel32/nls/trk.nls index 7933d4f37b2..8a854e45bc7 100644 --- a/reactos/dll/win32/kernel32/nls/trk.nls +++ b/reactos/dll/win32/kernel32/nls/trk.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_TURKISH, SUBLANG_DEFAULT LOCALE_INEGSEPBYSPACE "1" LOCALE_INEGSIGNPOSN "1" LOCALE_INEGSYMPRECEDES "0" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "1" LOCALE_IPOSSYMPRECEDES "0" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "1" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "1" diff --git a/reactos/dll/win32/kernel32/nls/ttt.nls b/reactos/dll/win32/kernel32/nls/ttt.nls index 9a21d710435..54a040e274b 100644 --- a/reactos/dll/win32/kernel32/nls/ttt.nls +++ b/reactos/dll/win32/kernel32/nls/ttt.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_TATAR, SUBLANG_DEFAULT LOCALE_INEGSEPBYSPACE "1" LOCALE_INEGSIGNPOSN "1" LOCALE_INEGSYMPRECEDES "0" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "1" LOCALE_IPOSSYMPRECEDES "0" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "1" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "0" diff --git a/reactos/dll/win32/kernel32/nls/ukr.nls b/reactos/dll/win32/kernel32/nls/ukr.nls index 6620d0e3959..5df430813ec 100644 --- a/reactos/dll/win32/kernel32/nls/ukr.nls +++ b/reactos/dll/win32/kernel32/nls/ukr.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT LOCALE_INEGSEPBYSPACE "1" LOCALE_INEGSIGNPOSN "1" LOCALE_INEGSYMPRECEDES "0" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "1" LOCALE_IPOSSYMPRECEDES "0" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "1" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "0" diff --git a/reactos/dll/win32/kernel32/nls/urd.nls b/reactos/dll/win32/kernel32/nls/urd.nls index 26ea2edd466..e41e9b674ca 100644 --- a/reactos/dll/win32/kernel32/nls/urd.nls +++ b/reactos/dll/win32/kernel32/nls/urd.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_URDU, SUBLANG_URDU_PAKISTAN LOCALE_INEGSEPBYSPACE "0" LOCALE_INEGSIGNPOSN "2" LOCALE_INEGSYMPRECEDES "1" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "1" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "0" LOCALE_IPOSSIGNPOSN "2" LOCALE_IPOSSYMPRECEDES "1" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "0" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "0" diff --git a/reactos/dll/win32/kernel32/nls/uzb.nls b/reactos/dll/win32/kernel32/nls/uzb.nls index b6b0c7b4c86..4feff2ec921 100644 --- a/reactos/dll/win32/kernel32/nls/uzb.nls +++ b/reactos/dll/win32/kernel32/nls/uzb.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_UZBEK, SUBLANG_UZBEK_CYRILLIC LOCALE_INEGSEPBYSPACE "1" LOCALE_INEGSIGNPOSN "1" LOCALE_INEGSYMPRECEDES "0" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "1" LOCALE_IPOSSYMPRECEDES "0" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "1" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "1" diff --git a/reactos/dll/win32/kernel32/nls/uzl.nls b/reactos/dll/win32/kernel32/nls/uzl.nls index c0778d44dd7..fbac8883aee 100644 --- a/reactos/dll/win32/kernel32/nls/uzl.nls +++ b/reactos/dll/win32/kernel32/nls/uzl.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_UZBEK, SUBLANG_UZBEK_LATIN LOCALE_INEGSEPBYSPACE "1" LOCALE_INEGSIGNPOSN "1" LOCALE_INEGSYMPRECEDES "0" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "1" LOCALE_IPOSSYMPRECEDES "0" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "1" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "1" diff --git a/reactos/dll/win32/kernel32/nls/vit.nls b/reactos/dll/win32/kernel32/nls/vit.nls index e7236b54439..16126d8c33c 100644 --- a/reactos/dll/win32/kernel32/nls/vit.nls +++ b/reactos/dll/win32/kernel32/nls/vit.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_VIETNAMESE, SUBLANG_DEFAULT LOCALE_INEGSEPBYSPACE "1" LOCALE_INEGSIGNPOSN "1" LOCALE_INEGSYMPRECEDES "0" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "1" LOCALE_IPOSSIGNPOSN "1" LOCALE_IPOSSYMPRECEDES "0" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "0" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "0" diff --git a/reactos/dll/win32/kernel32/nls/zhh.nls b/reactos/dll/win32/kernel32/nls/zhh.nls index d36ee68a097..0a0b6208a9a 100644 --- a/reactos/dll/win32/kernel32/nls/zhh.nls +++ b/reactos/dll/win32/kernel32/nls/zhh.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_HONGKONG LOCALE_INEGSEPBYSPACE "0" LOCALE_INEGSIGNPOSN "0" LOCALE_INEGSYMPRECEDES "1" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "0" LOCALE_IPOSSIGNPOSN "3" LOCALE_IPOSSYMPRECEDES "1" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "1" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "0" diff --git a/reactos/dll/win32/kernel32/nls/zhi.nls b/reactos/dll/win32/kernel32/nls/zhi.nls index 25ba406410f..9c192c7b502 100644 --- a/reactos/dll/win32/kernel32/nls/zhi.nls +++ b/reactos/dll/win32/kernel32/nls/zhi.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SINGAPORE LOCALE_INEGSEPBYSPACE "0" LOCALE_INEGSIGNPOSN "0" LOCALE_INEGSYMPRECEDES "1" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "0" LOCALE_IPOSSIGNPOSN "3" LOCALE_IPOSSYMPRECEDES "1" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "0" LOCALE_ITIMEMARKPOSN "1" LOCALE_ITLZERO "0" diff --git a/reactos/dll/win32/kernel32/nls/zhm.nls b/reactos/dll/win32/kernel32/nls/zhm.nls index 8e666d04c06..4cf3bfab1c7 100644 --- a/reactos/dll/win32/kernel32/nls/zhm.nls +++ b/reactos/dll/win32/kernel32/nls/zhm.nls @@ -52,11 +52,13 @@ STRINGTABLE LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_MACAU LOCALE_INEGSEPBYSPACE "0" LOCALE_INEGSIGNPOSN "0" LOCALE_INEGSYMPRECEDES "1" + LOCALE_INEUTRAL "0" LOCALE_IOPTIONALCALENDAR "0" LOCALE_IPAPERSIZE "9" LOCALE_IPOSSEPBYSPACE "0" LOCALE_IPOSSIGNPOSN "3" LOCALE_IPOSSYMPRECEDES "1" + LOCALE_IREADINGLAYOUT "0" LOCALE_ITIME "1" LOCALE_ITIMEMARKPOSN "0" LOCALE_ITLZERO "0" @@ -80,9 +82,9 @@ STRINGTABLE LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_MACAU LOCALE_SABBREVMONTHNAME7 "C" LOCALE_SABBREVMONTHNAME8 "K" LOCALE_SABBREVMONTHNAME9 "E" - LOCALE_SABBREVMONTHNAME10 "BROKEN PLEASE FIX" - LOCALE_SABBREVMONTHNAME11 "BROKEN PLEASE FIX" - LOCALE_SABBREVMONTHNAME12 "BROKEN PLEASE FIX" + LOCALE_SABBREVMONTHNAME10 "Q" + LOCALE_SABBREVMONTHNAME11 "Q@" + LOCALE_SABBREVMONTHNAME12 "QG" LOCALE_SABBREVMONTHNAME13 "" LOCALE_SCOUNTRY "Macau S.A.R." LOCALE_SCURRENCY "P" @@ -116,9 +118,9 @@ STRINGTABLE LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_MACAU LOCALE_SMONTHNAME7 "C" LOCALE_SMONTHNAME8 "K" LOCALE_SMONTHNAME9 "E" - LOCALE_SMONTHNAME10 "BROKEN PLEASE FIX" - LOCALE_SMONTHNAME11 "BROKEN PLEASE FIX" - LOCALE_SMONTHNAME12 "BROKEN PLEASE FIX" + LOCALE_SMONTHNAME10 "Q" + LOCALE_SMONTHNAME11 "Q@" + LOCALE_SMONTHNAME12 "QG" LOCALE_SMONTHNAME13 "" LOCALE_SMONTHOUSANDSEP "," LOCALE_SNAME "zh-MO" diff --git a/reactos/include/psdk/winnls.h b/reactos/include/psdk/winnls.h index 2bb65024bb8..7677e3ad96b 100644 --- a/reactos/include/psdk/winnls.h +++ b/reactos/include/psdk/winnls.h @@ -132,6 +132,9 @@ extern "C" { #define LOCALE_SYSTEM_DEFAULT 0x800 #define LOCALE_USER_DEFAULT 0x400 +#define LOCALE_IREADINGLAYOUT 0x0070 +#define LOCALE_INEUTRAL 0x0071 + #define LOCALE_IDEFAULTUNIXCODEPAGE 0x1030 /* Wine extension */ #define NORM_IGNORECASE 1 From e02e2d6316ccdb263a15bc56af1bcc8061e135e9 Mon Sep 17 00:00:00 2001 From: Sylvain Petreolle Date: Sat, 7 May 2011 12:45:59 +0000 Subject: [PATCH 313/317] [MSCONFIG] Fix typo in startuppage.h, this fixes build without compilation units. svn path=/trunk/; revision=51617 --- reactos/base/applications/msconfig/startuppage.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/base/applications/msconfig/startuppage.h b/reactos/base/applications/msconfig/startuppage.h index a016fb320fb..54f85d1a82f 100644 --- a/reactos/base/applications/msconfig/startuppage.h +++ b/reactos/base/applications/msconfig/startuppage.h @@ -2,7 +2,7 @@ #define _STARTUPPAGE_H_ extern HWND hStartupPage; -extern HWND hStartupPageListCtrl; +extern HWND hStartupListCtrl; INT_PTR CALLBACK StartupPageWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam); From 5c49122627d69882177ef51e3d398ee4d681a726 Mon Sep 17 00:00:00 2001 From: Gabriel Ilardi Date: Sat, 7 May 2011 14:43:49 +0000 Subject: [PATCH 314/317] [regedit] - Fix formatting. No code changes. svn path=/trunk/; revision=51619 --- reactos/base/applications/regedit/resource.h | 142 +++++++++---------- 1 file changed, 71 insertions(+), 71 deletions(-) diff --git a/reactos/base/applications/regedit/resource.h b/reactos/base/applications/regedit/resource.h index 771d743ab9f..19432c8cdc1 100644 --- a/reactos/base/applications/regedit/resource.h +++ b/reactos/base/applications/regedit/resource.h @@ -115,36 +115,36 @@ #define ID_HEXEDIT_SELECT_ALL 32839 #define IDS_LICENSE 32835 #define IDS_ERROR 32836 -#define IDS_BAD_VALUE 32837 -#define IDS_UNSUPPORTED_TYPE 32838 -#define IDS_TOO_BIG_VALUE 32839 -#define ID_EDIT_MODIFY_BIN 32840 -#define IDS_WARNING 32841 -#define IDS_MULTI_SZ_EMPTY_STRING 32842 -#define IDS_BINARY_EMPTY 32843 -#define IDS_DEFAULT_VALUE_NAME 32844 -#define IDS_VALUE_NOT_SET 32845 -#define IDS_UNKNOWN_TYPE 32846 -#define IDS_MY_COMPUTER 32847 -#define IDS_IMPORT_REG_FILE 32848 -#define IDS_EXPORT_REG_FILE 32849 -#define IDS_INVALID_DWORD 32850 -#define IDS_QUERY_DELETE_ONE 32851 -#define IDS_QUERY_DELETE_MORE 32852 -#define IDS_QUERY_DELETE_CONFIRM 32853 -#define IDS_ERR_DELVAL_CAPTION 32854 -#define IDS_ERR_DELETEVALUE 32855 -#define IDS_ERR_RENVAL_CAPTION 32856 -#define IDS_ERR_RENVAL_TOEMPTY 32857 +#define IDS_BAD_VALUE 32837 +#define IDS_UNSUPPORTED_TYPE 32838 +#define IDS_TOO_BIG_VALUE 32839 +#define ID_EDIT_MODIFY_BIN 32840 +#define IDS_WARNING 32841 +#define IDS_MULTI_SZ_EMPTY_STRING 32842 +#define IDS_BINARY_EMPTY 32843 +#define IDS_DEFAULT_VALUE_NAME 32844 +#define IDS_VALUE_NOT_SET 32845 +#define IDS_UNKNOWN_TYPE 32846 +#define IDS_MY_COMPUTER 32847 +#define IDS_IMPORT_REG_FILE 32848 +#define IDS_EXPORT_REG_FILE 32849 +#define IDS_INVALID_DWORD 32850 +#define IDS_QUERY_DELETE_ONE 32851 +#define IDS_QUERY_DELETE_MORE 32852 +#define IDS_QUERY_DELETE_CONFIRM 32853 +#define IDS_ERR_DELVAL_CAPTION 32854 +#define IDS_ERR_DELETEVALUE 32855 +#define IDS_ERR_RENVAL_CAPTION 32856 +#define IDS_ERR_RENVAL_TOEMPTY 32857 #define IDS_BAD_KEY 32858 -#define IDS_LOAD_HIVE 32859 -#define IDS_UNLOAD_HIVE 32860 +#define IDS_LOAD_HIVE 32859 +#define IDS_UNLOAD_HIVE 32860 #define ID_EDIT_NEW_MULTISTRINGVALUE 32861 #define ID_EDIT_NEW_EXPANDABLESTRINGVALUE 32862 #define ID_SWITCH_PANELS 32871 -#define ID_EDIT_PERMISSIONS 32872 +#define ID_EDIT_PERMISSIONS 32872 #define ID_TREE_DELETE 32873 #define ID_TREE_RENAME 32874 #define IDS_QUERY_DELETE_KEY_ONE 32875 @@ -155,30 +155,30 @@ #define ID_TREE_EXPORT 32888 #define ID_TREE_PERMISSIONS 32889 -#define IDS_FLT_REGFILE 31000 -#define IDS_FLT_REGFILES 31001 -#define IDS_FLT_REGFILES_FLT 31002 -#define IDS_FLT_REGEDIT4 31003 -#define IDS_FLT_REGEDIT4_FLT 31004 -#define IDS_FLT_ALLFILES 31005 -#define IDS_FLT_ALLFILES_FLT 31006 +#define IDS_FLT_REGFILE 31000 +#define IDS_FLT_REGFILES 31001 +#define IDS_FLT_REGFILES_FLT 31002 +#define IDS_FLT_REGEDIT4 31003 +#define IDS_FLT_REGEDIT4_FLT 31004 +#define IDS_FLT_ALLFILES 31005 +#define IDS_FLT_ALLFILES_FLT 31006 -#define IDS_ACCESS_FULLCONTROL 31101 -#define IDS_ACCESS_READ 31102 -#define IDS_ACCESS_QUERYVALUE 31103 -#define IDS_ACCESS_SETVALUE 31104 -#define IDS_ACCESS_CREATESUBKEY 31105 -#define IDS_ACCESS_ENUMERATESUBKEYS 31106 -#define IDS_ACCESS_NOTIFY 31107 -#define IDS_ACCESS_CREATELINK 31108 -#define IDS_ACCESS_DELETE 31109 -#define IDS_ACCESS_WRITEDAC 31110 -#define IDS_ACCESS_WRITEOWNER 31111 -#define IDS_ACCESS_READCONTROL 31112 +#define IDS_ACCESS_FULLCONTROL 31101 +#define IDS_ACCESS_READ 31102 +#define IDS_ACCESS_QUERYVALUE 31103 +#define IDS_ACCESS_SETVALUE 31104 +#define IDS_ACCESS_CREATESUBKEY 31105 +#define IDS_ACCESS_ENUMERATESUBKEYS 31106 +#define IDS_ACCESS_NOTIFY 31107 +#define IDS_ACCESS_CREATELINK 31108 +#define IDS_ACCESS_DELETE 31109 +#define IDS_ACCESS_WRITEDAC 31110 +#define IDS_ACCESS_WRITEOWNER 31111 +#define IDS_ACCESS_READCONTROL 31112 -#define IDS_INHERIT_THISKEYONLY 31121 +#define IDS_INHERIT_THISKEYONLY 31121 #define IDS_INHERIT_THISKEYANDSUBKEYS 31122 -#define IDS_INHERIT_SUBKEYSONLY 31123 +#define IDS_INHERIT_SUBKEYSONLY 31123 #define IDS_EXPAND 31124 #define IDS_COLLAPSE 31125 #define IDS_NEW_KEY 31126 @@ -186,39 +186,39 @@ #define IDS_GOTO_SUGGESTED_KEY 31128 -#define IDD_EDIT_STRING 2000 -#define IDC_VALUE_NAME 2001 -#define IDC_VALUE_DATA 2002 +#define IDD_EDIT_STRING 2000 +#define IDC_VALUE_NAME 2001 +#define IDC_VALUE_DATA 2002 -#define IDD_EDIT_DWORD 2003 -#define IDC_FORMAT_HEX 2004 -#define IDC_FORMAT_DEC 2005 +#define IDD_EDIT_DWORD 2003 +#define IDC_FORMAT_HEX 2004 +#define IDC_FORMAT_DEC 2005 -#define IDD_EDIT_MULTI_STRING 2006 -#define IDD_EDIT_BIN_DATA 2007 +#define IDD_EDIT_MULTI_STRING 2006 +#define IDD_EDIT_BIN_DATA 2007 -#define IDC_EXPORT_ALL 2008 -#define IDC_EXPORT_BRANCH 2009 -#define IDC_EXPORT_BRANCH_TEXT 2010 +#define IDC_EXPORT_ALL 2008 +#define IDC_EXPORT_BRANCH 2009 +#define IDC_EXPORT_BRANCH_TEXT 2010 -#define IDD_LOADHIVE 2500 -#define IDC_EDIT_KEY 2501 +#define IDD_LOADHIVE 2500 +#define IDC_EDIT_KEY 2501 -#define IDC_FAVORITENAME 2011 -#define IDC_FAVORITESLIST 2012 -#define IDC_FINDWHAT 2013 -#define IDC_LOOKAT_KEYS 2014 -#define IDC_LOOKAT_VALUES 2015 -#define IDC_LOOKAT_DATA 2016 -#define IDC_MATCHSTRING 2017 -#define IDC_MATCHCASE 2018 +#define IDC_FAVORITENAME 2011 +#define IDC_FAVORITESLIST 2012 +#define IDC_FINDWHAT 2013 +#define IDC_LOOKAT_KEYS 2014 +#define IDC_LOOKAT_VALUES 2015 +#define IDC_LOOKAT_DATA 2016 +#define IDC_MATCHSTRING 2017 +#define IDC_MATCHCASE 2018 -#define IDS_FINISHEDFIND 2019 +#define IDS_FINISHEDFIND 2019 -#define ID_FAVORITES_MIN 2100 -#define ID_FAVORITES_MAX 2999 +#define ID_FAVORITES_MIN 2100 +#define ID_FAVORITES_MAX 2999 -#define ID_ACCEL 3000 +#define ID_ACCEL 3000 -#define IDC_STATIC -1 +#define IDC_STATIC -1 From 21fa0801787172aa6a772e0f71a4f323d4410594 Mon Sep 17 00:00:00 2001 From: Gabriel Ilardi Date: Sat, 7 May 2011 14:53:32 +0000 Subject: [PATCH 315/317] [regedit] - Prompt before importing from the command line. - Inform the user about successful import from the command line and the menu. - Updated Spanish & Italian translations. See issue #6230 for more details. svn path=/trunk/; revision=51621 --- reactos/base/applications/regedit/framewnd.c | 6 +++++- .../base/applications/regedit/lang/bg-BG.rc | 6 ++++++ .../base/applications/regedit/lang/cs-CZ.rc | 6 ++++++ .../base/applications/regedit/lang/de-DE.rc | 6 ++++++ .../base/applications/regedit/lang/el-GR.rc | 6 ++++++ .../base/applications/regedit/lang/en-US.rc | 6 ++++++ .../base/applications/regedit/lang/es-ES.rc | 6 ++++++ .../base/applications/regedit/lang/fr-FR.rc | 6 ++++++ .../base/applications/regedit/lang/hu-HU.rc | 6 ++++++ .../base/applications/regedit/lang/id-ID.rc | 6 ++++++ .../base/applications/regedit/lang/it-IT.rc | 6 ++++++ .../base/applications/regedit/lang/ja-JP.rc | 6 ++++++ .../base/applications/regedit/lang/ko-KR.rc | 6 ++++++ .../base/applications/regedit/lang/nl-NL.rc | 6 ++++++ .../base/applications/regedit/lang/no-NO.rc | 6 ++++++ .../base/applications/regedit/lang/pl-PL.rc | 6 ++++++ .../base/applications/regedit/lang/pt-BR.rc | 6 ++++++ .../base/applications/regedit/lang/pt-PT.rc | 6 ++++++ .../base/applications/regedit/lang/ru-RU.rc | 6 ++++++ .../base/applications/regedit/lang/sk-SK.rc | 6 ++++++ .../base/applications/regedit/lang/sl-SI.rc | 6 ++++++ .../base/applications/regedit/lang/sv-SE.rc | 6 ++++++ .../base/applications/regedit/lang/th-TH.rc | 6 ++++++ .../base/applications/regedit/lang/uk-UA.rc | 6 ++++++ .../base/applications/regedit/lang/zh-CN.rc | 6 ++++++ reactos/base/applications/regedit/regedit.c | 20 ++++++++++++++++--- reactos/base/applications/regedit/resource.h | 2 ++ 27 files changed, 168 insertions(+), 4 deletions(-) diff --git a/reactos/base/applications/regedit/framewnd.c b/reactos/base/applications/regedit/framewnd.c index e37adbef08b..79cc3b36b7f 100644 --- a/reactos/base/applications/regedit/framewnd.c +++ b/reactos/base/applications/regedit/framewnd.c @@ -393,7 +393,7 @@ static BOOL UnloadHive(HWND hWnd) static BOOL ImportRegistryFile(HWND hWnd) { OPENFILENAME ofn; - TCHAR Caption[128]; + TCHAR Caption[128], szTitle[256], szText[256]; LPCTSTR pszKeyPath; HKEY hRootKey; @@ -414,6 +414,10 @@ static BOOL ImportRegistryFile(HWND hWnd) fclose(fp); return FALSE; } + LoadString(hInst, IDS_APP_TITLE, szTitle, sizeof(szTitle)); + LoadString(hInst, IDS_IMPORTED_OK, szText, sizeof(szTitle)); + /* show successful import */ + MessageBox(NULL, szText, szTitle, MB_OK); fclose(fp); } else diff --git a/reactos/base/applications/regedit/lang/bg-BG.rc b/reactos/base/applications/regedit/lang/bg-BG.rc index 8603663ce1e..854d276977f 100644 --- a/reactos/base/applications/regedit/lang/bg-BG.rc +++ b/reactos/base/applications/regedit/lang/bg-BG.rc @@ -394,6 +394,12 @@ BEGIN IDS_FINISHEDFIND " ." END +STRINGTABLE DISCARDABLE +BEGIN + IDS_IMPORT_PROMPT "Add the data to the registry?" + IDS_IMPORTED_OK "Information added to the registry" +END + /*****************************************************************/ diff --git a/reactos/base/applications/regedit/lang/cs-CZ.rc b/reactos/base/applications/regedit/lang/cs-CZ.rc index 9226c8eb36a..be14bc5002c 100644 --- a/reactos/base/applications/regedit/lang/cs-CZ.rc +++ b/reactos/base/applications/regedit/lang/cs-CZ.rc @@ -391,6 +391,12 @@ BEGIN IDS_FINISHEDFIND "Prohledvn registru bylo dokoneno." END +STRINGTABLE DISCARDABLE +BEGIN + IDS_IMPORT_PROMPT "Add the data to the registry?" + IDS_IMPORTED_OK "Information added to the registry" +END + /*****************************************************************/ diff --git a/reactos/base/applications/regedit/lang/de-DE.rc b/reactos/base/applications/regedit/lang/de-DE.rc index 8d6f251f962..e48dc17a4c5 100644 --- a/reactos/base/applications/regedit/lang/de-DE.rc +++ b/reactos/base/applications/regedit/lang/de-DE.rc @@ -393,6 +393,12 @@ BEGIN IDS_FINISHEDFIND "Durchsuchen der Registry beendet." END +STRINGTABLE DISCARDABLE +BEGIN + IDS_IMPORT_PROMPT "Add the data to the registry?" + IDS_IMPORTED_OK "Information added to the registry" +END + /*****************************************************************/ diff --git a/reactos/base/applications/regedit/lang/el-GR.rc b/reactos/base/applications/regedit/lang/el-GR.rc index 44ca2d9f33c..c7228641bb8 100644 --- a/reactos/base/applications/regedit/lang/el-GR.rc +++ b/reactos/base/applications/regedit/lang/el-GR.rc @@ -393,6 +393,12 @@ BEGIN IDS_FINISHEDFIND " registry." END +STRINGTABLE DISCARDABLE +BEGIN + IDS_IMPORT_PROMPT "Add the data to the registry?" + IDS_IMPORTED_OK "Information added to the registry" +END + /*****************************************************************/ diff --git a/reactos/base/applications/regedit/lang/en-US.rc b/reactos/base/applications/regedit/lang/en-US.rc index fb81f164e87..679f264d0e6 100644 --- a/reactos/base/applications/regedit/lang/en-US.rc +++ b/reactos/base/applications/regedit/lang/en-US.rc @@ -381,6 +381,12 @@ BEGIN IDS_FINISHEDFIND "Finished searching through the registry." END +STRINGTABLE DISCARDABLE +BEGIN + IDS_IMPORT_PROMPT "Add the data the registry?" + IDS_IMPORTED_OK "Information added to the registry" +END + /*****************************************************************/ diff --git a/reactos/base/applications/regedit/lang/es-ES.rc b/reactos/base/applications/regedit/lang/es-ES.rc index 0e1dc4c5d86..c4c4b1f0545 100644 --- a/reactos/base/applications/regedit/lang/es-ES.rc +++ b/reactos/base/applications/regedit/lang/es-ES.rc @@ -396,6 +396,12 @@ BEGIN IDS_FINISHEDFIND "Finalizado la busqueda del registro." END +STRINGTABLE DISCARDABLE +BEGIN + IDS_IMPORT_PROMPT "Agregar los datos al registro?" + IDS_IMPORTED_OK "La informacin ha sido agregada al registro" +END + /*****************************************************************/ diff --git a/reactos/base/applications/regedit/lang/fr-FR.rc b/reactos/base/applications/regedit/lang/fr-FR.rc index 56e31bcd755..7f01199c3e2 100644 --- a/reactos/base/applications/regedit/lang/fr-FR.rc +++ b/reactos/base/applications/regedit/lang/fr-FR.rc @@ -396,6 +396,12 @@ BEGIN IDS_FINISHEDFIND "Recherche dans le registre termine." END +STRINGTABLE DISCARDABLE +BEGIN + IDS_IMPORT_PROMPT "Add the data to the registry?" + IDS_IMPORTED_OK "Information added to the registry" +END + /*****************************************************************/ diff --git a/reactos/base/applications/regedit/lang/hu-HU.rc b/reactos/base/applications/regedit/lang/hu-HU.rc index 7efa45d5221..ba56f983dbe 100644 --- a/reactos/base/applications/regedit/lang/hu-HU.rc +++ b/reactos/base/applications/regedit/lang/hu-HU.rc @@ -394,6 +394,12 @@ BEGIN IDS_FINISHEDFIND "Finished searching through the registry." END +STRINGTABLE DISCARDABLE +BEGIN + IDS_IMPORT_PROMPT "Add the data to the registry?" + IDS_IMPORTED_OK "Information added to the registry" +END + /*****************************************************************/ diff --git a/reactos/base/applications/regedit/lang/id-ID.rc b/reactos/base/applications/regedit/lang/id-ID.rc index 4d8571470fe..4195cd20756 100644 --- a/reactos/base/applications/regedit/lang/id-ID.rc +++ b/reactos/base/applications/regedit/lang/id-ID.rc @@ -393,6 +393,12 @@ BEGIN IDS_FINISHEDFIND "Selesai mencari seluruh registri." END +STRINGTABLE DISCARDABLE +BEGIN + IDS_IMPORT_PROMPT "Add the data to the registry?" + IDS_IMPORTED_OK "Information added to the registry" +END + /*****************************************************************/ diff --git a/reactos/base/applications/regedit/lang/it-IT.rc b/reactos/base/applications/regedit/lang/it-IT.rc index 8f81f05ea36..370a6d5e562 100644 --- a/reactos/base/applications/regedit/lang/it-IT.rc +++ b/reactos/base/applications/regedit/lang/it-IT.rc @@ -398,6 +398,12 @@ BEGIN IDS_FINISHEDFIND "Fine ricerca nel registro." END +STRINGTABLE DISCARDABLE +BEGIN + IDS_IMPORT_PROMPT "Aggiungere l'informazione al registro?" + IDS_IMPORTED_OK "L'informazione stata aggiunta al registro" +END + /*****************************************************************/ diff --git a/reactos/base/applications/regedit/lang/ja-JP.rc b/reactos/base/applications/regedit/lang/ja-JP.rc index 66a0967fb17..62eb80fb2b4 100644 --- a/reactos/base/applications/regedit/lang/ja-JP.rc +++ b/reactos/base/applications/regedit/lang/ja-JP.rc @@ -391,6 +391,12 @@ BEGIN IDS_FINISHEDFIND "WXgׂČ܂B" END +STRINGTABLE DISCARDABLE +BEGIN + IDS_IMPORT_PROMPT "Add the data to the registry?" + IDS_IMPORTED_OK "Information added to the registry" +END + /*****************************************************************/ diff --git a/reactos/base/applications/regedit/lang/ko-KR.rc b/reactos/base/applications/regedit/lang/ko-KR.rc index b2057978fca..783b12bef14 100644 --- a/reactos/base/applications/regedit/lang/ko-KR.rc +++ b/reactos/base/applications/regedit/lang/ko-KR.rc @@ -378,6 +378,12 @@ BEGIN IDS_FINISHEDFIND "Ʈ ˻ Ϸ߽ϴ." END +STRINGTABLE DISCARDABLE +BEGIN + IDS_IMPORT_PROMPT "Add the data to the registry?" + IDS_IMPORTED_OK "Information added to the registry" +END + /*****************************************************************/ diff --git a/reactos/base/applications/regedit/lang/nl-NL.rc b/reactos/base/applications/regedit/lang/nl-NL.rc index 2bc09796371..24e77cf8708 100644 --- a/reactos/base/applications/regedit/lang/nl-NL.rc +++ b/reactos/base/applications/regedit/lang/nl-NL.rc @@ -393,6 +393,12 @@ BEGIN IDS_FINISHEDFIND "Finished searching through the registry." END +STRINGTABLE DISCARDABLE +BEGIN + IDS_IMPORT_PROMPT "Add the data to the registry?" + IDS_IMPORTED_OK "Information added to the registry" +END + /*****************************************************************/ diff --git a/reactos/base/applications/regedit/lang/no-NO.rc b/reactos/base/applications/regedit/lang/no-NO.rc index 60d0d1af091..166dea05c25 100644 --- a/reactos/base/applications/regedit/lang/no-NO.rc +++ b/reactos/base/applications/regedit/lang/no-NO.rc @@ -393,6 +393,12 @@ BEGIN IDS_FINISHEDFIND "Sket i registret er fullfrt." END +STRINGTABLE DISCARDABLE +BEGIN + IDS_IMPORT_PROMPT "Add the data to the registry?" + IDS_IMPORTED_OK "Information added to the registry" +END + /*****************************************************************/ diff --git a/reactos/base/applications/regedit/lang/pl-PL.rc b/reactos/base/applications/regedit/lang/pl-PL.rc index 50087cfe068..f908a26c0a3 100644 --- a/reactos/base/applications/regedit/lang/pl-PL.rc +++ b/reactos/base/applications/regedit/lang/pl-PL.rc @@ -400,6 +400,12 @@ BEGIN IDS_FINISHEDFIND "Przeszukiwanie rejestru zakoczone." END +STRINGTABLE DISCARDABLE +BEGIN + IDS_IMPORT_PROMPT "Add the data to the registry?" + IDS_IMPORTED_OK "Information added to the registry" +END + /*****************************************************************/ diff --git a/reactos/base/applications/regedit/lang/pt-BR.rc b/reactos/base/applications/regedit/lang/pt-BR.rc index 7abc3c211ba..a7b6acbf75d 100644 --- a/reactos/base/applications/regedit/lang/pt-BR.rc +++ b/reactos/base/applications/regedit/lang/pt-BR.rc @@ -394,6 +394,12 @@ BEGIN IDS_FINISHEDFIND "Pesquisa do Registro concluda." END +STRINGTABLE DISCARDABLE +BEGIN + IDS_IMPORT_PROMPT "Add the data to the registry?" + IDS_IMPORTED_OK "Information added to the registry" +END + /*****************************************************************/ diff --git a/reactos/base/applications/regedit/lang/pt-PT.rc b/reactos/base/applications/regedit/lang/pt-PT.rc index 52b15fd526c..ed973c09c0c 100644 --- a/reactos/base/applications/regedit/lang/pt-PT.rc +++ b/reactos/base/applications/regedit/lang/pt-PT.rc @@ -384,6 +384,12 @@ BEGIN IDS_FINISHEDFIND "Finished searching through the registry." END +STRINGTABLE DISCARDABLE +BEGIN + IDS_IMPORT_PROMPT "Add the data to the registry?" + IDS_IMPORTED_OK "Information added to the registry" +END + /*****************************************************************/ diff --git a/reactos/base/applications/regedit/lang/ru-RU.rc b/reactos/base/applications/regedit/lang/ru-RU.rc index f8e74660ab9..538644acb70 100644 --- a/reactos/base/applications/regedit/lang/ru-RU.rc +++ b/reactos/base/applications/regedit/lang/ru-RU.rc @@ -391,6 +391,12 @@ BEGIN IDS_FINISHEDFIND " ." END +STRINGTABLE DISCARDABLE +BEGIN + IDS_IMPORT_PROMPT "Add the data to the registry?" + IDS_IMPORTED_OK "Information added to the registry" +END + /*****************************************************************/ diff --git a/reactos/base/applications/regedit/lang/sk-SK.rc b/reactos/base/applications/regedit/lang/sk-SK.rc index b6cb4754993..ea0c0bdb9ed 100644 --- a/reactos/base/applications/regedit/lang/sk-SK.rc +++ b/reactos/base/applications/regedit/lang/sk-SK.rc @@ -378,6 +378,12 @@ BEGIN IDS_FINISHEDFIND "Finished searching through the registry." END +STRINGTABLE DISCARDABLE +BEGIN + IDS_IMPORT_PROMPT "Add the data to the registry?" + IDS_IMPORTED_OK "Information added to the registry" +END + /*****************************************************************/ diff --git a/reactos/base/applications/regedit/lang/sl-SI.rc b/reactos/base/applications/regedit/lang/sl-SI.rc index 0be7a429a8a..b3c40553c23 100644 --- a/reactos/base/applications/regedit/lang/sl-SI.rc +++ b/reactos/base/applications/regedit/lang/sl-SI.rc @@ -393,6 +393,12 @@ BEGIN IDS_FINISHEDFIND "Finished searching through the registry." END +STRINGTABLE DISCARDABLE +BEGIN + IDS_IMPORT_PROMPT "Add the data to the registry?" + IDS_IMPORTED_OK "Information added to the registry" +END + /*****************************************************************/ diff --git a/reactos/base/applications/regedit/lang/sv-SE.rc b/reactos/base/applications/regedit/lang/sv-SE.rc index 8a890d7a48d..9931b9af3c1 100644 --- a/reactos/base/applications/regedit/lang/sv-SE.rc +++ b/reactos/base/applications/regedit/lang/sv-SE.rc @@ -391,6 +391,12 @@ BEGIN IDS_FINISHEDFIND "Slutfrt skningen av registret." END +STRINGTABLE DISCARDABLE +BEGIN + IDS_IMPORT_PROMPT "Add the data to the registry?" + IDS_IMPORTED_OK "Information added to the registry" +END + /*****************************************************************/ diff --git a/reactos/base/applications/regedit/lang/th-TH.rc b/reactos/base/applications/regedit/lang/th-TH.rc index 51aa5da0a8f..9bfd14c493d 100644 --- a/reactos/base/applications/regedit/lang/th-TH.rc +++ b/reactos/base/applications/regedit/lang/th-TH.rc @@ -393,6 +393,12 @@ BEGIN IDS_FINISHEDFIND "Finished searching through the registry." END +STRINGTABLE DISCARDABLE +BEGIN + IDS_IMPORT_PROMPT "Add the data to the registry?" + IDS_IMPORTED_OK "Information added to the registry" +END + /*****************************************************************/ diff --git a/reactos/base/applications/regedit/lang/uk-UA.rc b/reactos/base/applications/regedit/lang/uk-UA.rc index 6f98e38c0eb..4bde2043e90 100644 --- a/reactos/base/applications/regedit/lang/uk-UA.rc +++ b/reactos/base/applications/regedit/lang/uk-UA.rc @@ -394,6 +394,12 @@ BEGIN IDS_FINISHEDFIND " ." END +STRINGTABLE DISCARDABLE +BEGIN + IDS_IMPORT_PROMPT "Add the data to the registry?" + IDS_IMPORTED_OK "Information added to the registry" +END + /*****************************************************************/ diff --git a/reactos/base/applications/regedit/lang/zh-CN.rc b/reactos/base/applications/regedit/lang/zh-CN.rc index 8e098469ad3..21acd7999ef 100644 --- a/reactos/base/applications/regedit/lang/zh-CN.rc +++ b/reactos/base/applications/regedit/lang/zh-CN.rc @@ -393,6 +393,12 @@ BEGIN IDS_FINISHEDFIND "עϡ" END +STRINGTABLE DISCARDABLE +BEGIN + IDS_IMPORT_PROMPT "Add the data to the registry?" + IDS_IMPORTED_OK "Information added to the registry" +END + /*****************************************************************/ diff --git a/reactos/base/applications/regedit/regedit.c b/reactos/base/applications/regedit/regedit.c index 1a91ffa0397..e49f0e0b11b 100644 --- a/reactos/base/applications/regedit/regedit.c +++ b/reactos/base/applications/regedit/regedit.c @@ -134,6 +134,7 @@ void get_file_name(LPWSTR *command_line, LPWSTR file_name) BOOL PerformRegAction(REGEDIT_ACTION action, LPWSTR s) { + TCHAR szTitle[256], szText[256]; switch (action) { case ACTION_ADD: @@ -162,6 +163,10 @@ BOOL PerformRegAction(REGEDIT_ACTION action, LPWSTR s) } import_registry_file(fp); get_file_name(&s, filename); + LoadString(hInst, IDS_APP_TITLE, szTitle, sizeof(szTitle)); + LoadString(hInst, IDS_IMPORTED_OK, szText, sizeof(szTitle)); + /* show successful import */ + MessageBox(NULL, szText, szTitle, MB_OK); } break; } @@ -311,9 +316,18 @@ BOOL ProcessCmdLine(LPWSTR lpCmdLine) } if (*s && action == ACTION_UNDEF) - action = ACTION_ADD; - - if (action == ACTION_UNDEF) + { + TCHAR szTitle[256], szText[256]; + LoadString(hInst, IDS_APP_TITLE, szTitle, sizeof(szTitle)); + LoadString(hInst, IDS_IMPORT_PROMPT, szText, sizeof(szTitle)); + /* request import confirmation */ + if (MessageBox(NULL, szText, szTitle, MB_YESNO) == IDYES) + { + action = ACTION_ADD; + } + else return TRUE; + } + if (action == ACTION_UNDEF) return FALSE; return PerformRegAction(action, s); diff --git a/reactos/base/applications/regedit/resource.h b/reactos/base/applications/regedit/resource.h index 19432c8cdc1..8ee02c6d811 100644 --- a/reactos/base/applications/regedit/resource.h +++ b/reactos/base/applications/regedit/resource.h @@ -185,6 +185,8 @@ #define IDS_NEW_VALUE 31127 #define IDS_GOTO_SUGGESTED_KEY 31128 +#define IDS_IMPORT_PROMPT 31129 +#define IDS_IMPORTED_OK 31130 #define IDD_EDIT_STRING 2000 #define IDC_VALUE_NAME 2001 From 91fb429184cb2c5f894bac60f3f468cdc785b694 Mon Sep 17 00:00:00 2001 From: Olaf Siejka Date: Sat, 7 May 2011 16:23:44 +0000 Subject: [PATCH 316/317] [REGEDIT] - Polish translation update svn path=/trunk/; revision=51623 --- reactos/base/applications/regedit/lang/pl-PL.rc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/reactos/base/applications/regedit/lang/pl-PL.rc b/reactos/base/applications/regedit/lang/pl-PL.rc index f908a26c0a3..43a053365a6 100644 --- a/reactos/base/applications/regedit/lang/pl-PL.rc +++ b/reactos/base/applications/regedit/lang/pl-PL.rc @@ -3,7 +3,7 @@ * * Copyright 2005 Sebastian Gasiorek * - * Update by Caemyr - Olaf Siejka (Dec-Jan, 2007) + * Update by Caemyr - Olaf Siejka (Jan, 2007; May, 2011) * Use ReactOS forum PM or IRC to contact me * http://www.reactos.org * IRC: irc.freenode.net #reactos-pl; @@ -402,8 +402,8 @@ END STRINGTABLE DISCARDABLE BEGIN - IDS_IMPORT_PROMPT "Add the data to the registry?" - IDS_IMPORTED_OK "Information added to the registry" + IDS_IMPORT_PROMPT "Czy doda dane do rejestru?" + IDS_IMPORTED_OK "Dane dopisane do rejestru" END /*****************************************************************/ From eac4b331b0e202b1c88e73a731c2cc5bf2729741 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herv=C3=A9=20Poussineau?= Date: Sat, 7 May 2011 16:31:49 +0000 Subject: [PATCH 317/317] [smss] Display program which failed to run svn path=/trunk/; revision=51624 --- reactos/base/system/smss/initrun.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/base/system/smss/initrun.c b/reactos/base/system/smss/initrun.c index 7136bfe7c97..ff35e576a8f 100644 --- a/reactos/base/system/smss/initrun.c +++ b/reactos/base/system/smss/initrun.c @@ -85,8 +85,8 @@ SmpRunBootAppsQueryRoutine(PWSTR ValueName, NULL, NULL); if (!NT_SUCCESS(Status)) { - DPRINT1("SM: %s: running '$S' failed (Status=0x%08lx)\n", - __FUNCTION__, Status); + DPRINT1("SM: %s: running '%S' failed (Status=0x%08lx)\n", + __FUNCTION__, ImagePath, Status); } return(STATUS_SUCCESS); }

8B@;@Oh1WZC6QiV+c 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 F{{WoxgpL3J delta 41092 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 IQ`#>0e?nf`pa1{> diff --git a/reactos/media/fonts/DejaVuSerif-Bold.ttf b/reactos/media/fonts/DejaVuSerif-Bold.ttf index 8c53b1a1124daab1aa7b685a7bd89f82cca409b3..afa2d5ec3d06e78dd527d14420111844fbc926cb 100644 GIT binary patch delta 87142 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⪻1?pkw_;Sb-IGgHI2W!CoP#M(~G+P<7v+j&{rd0E>NV{K22wLP)S)FgW# z*7n3$+Y@7LPmHxaG1m6PGW~oza_FMufITzTP66RZeD<9J!jJguI|YOv@!59@2tVRy zriLHDSv&c{57_KG6A0hT*|!V!XQqblFjzY?4nN#vriLGGGE>73E3BOvg&$VfcV-lR zRAE0nqtx)D3j0n0Y0kiDPT^_JB{w^CNu@CJ*-ql{bvZM2p3`BT(_x;|VV*P7dGlI# ztT30m{a!A(_@wwWBs<&5p?zmN^*@e>ViNu%KK?)A_a6`S-G4mkzxAE##D|XW&+nhh zPU?R&>`#=)@&DZ3pEPtl$%&u!-?sP1hmP-$4{gtO;zND+Zzr&w>RNKx%)cxx^<-VW VB(zSn;}YhihIU#{D>rX-{SQD!`;hX~}B4R@X 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 UGL8$68yRzLO2YFF&zP6-UoY66p#T5? diff --git a/reactos/media/fonts/DejaVuSerif-Italic.ttf b/reactos/media/fonts/DejaVuSerif-Italic.ttf index b2ed04a1230757a3cb2482f3c4f987c51619cc3f..c1864a3071c67157f9b3e0a4146d9c5ef0438348 100644 GIT binary patch delta 90322 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 delta 54122 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%0AEW!lT^>ThdpJ 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⪻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 delta 52367 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 yR60+zy7mh>*B;Qd$0Da?;C{ZyoVqLBvQ~ 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