diff options
| author | Jabier Arraiza Cenoz <jabier.arraiza@marker.es> | 2014-02-08 19:12:21 +0000 |
|---|---|---|
| committer | Jabiertxof <jtx@jtx.marker.es> | 2014-02-08 19:12:21 +0000 |
| commit | 0912ab9a77d4b3f26975f3ca94e14ee72b63d6b6 (patch) | |
| tree | c9342a4d89751b8157c9fe8f9cdd9404114aaae0 | |
| parent | update to trunk (diff) | |
| parent | Fix for Bug #879058 (Spray Single Path Mode includes original object). (diff) | |
| download | inkscape-0912ab9a77d4b3f26975f3ca94e14ee72b63d6b6.tar.gz inkscape-0912ab9a77d4b3f26975f3ca94e14ee72b63d6b6.zip | |
update to trunk
(bzr r11950.1.250)
75 files changed, 4191 insertions, 2445 deletions
@@ -59,7 +59,7 @@ msgstr "" "Project-Id-Version: inkscape 0.49\n" "Report-Msgid-Bugs-To: inkscape-devel@lists.sourceforge.net\n" "POT-Creation-Date: 2014-01-19 16:41+0100\n" -"PO-Revision-Date: 2014-01-19 22:01+0100\n" +"PO-Revision-Date: 2014-02-05 19:58+0100\n" "Last-Translator: Kris De Gussem <Kris.DeGussem@gmail.com>\n" "Language-Team: Dutch\n" "MIME-Version: 1.0\n" @@ -3742,49 +3742,49 @@ msgstr "Tekstballonnen" #: ../share/symbols/symbols.h:134 msgctxt "Symbol" msgid "Thought Balloon" -msgstr "" +msgstr "Gedachtenballon" #. Symbols: ./BalloonSymbols.svg #: ../share/symbols/symbols.h:135 msgctxt "Symbol" msgid "Dream Speaking" -msgstr "" +msgstr "Wensballon" #. Symbols: ./FlowSymbols.svg #: ../share/symbols/symbols.h:136 msgctxt "Symbol" msgid "Flow Chart Shapes" -msgstr "" +msgstr "Stroomdiagramvormen" #. Symbols: ./FlowSymbols.svg #: ../share/symbols/symbols.h:137 msgctxt "Symbol" msgid "Process" -msgstr "" +msgstr "Proces" #. Symbols: ./FlowSymbols.svg #: ../share/symbols/symbols.h:138 msgctxt "Symbol" msgid "Predefined Process" -msgstr "" +msgstr "Voorgedefinieerd proces" #. Symbols: ./FlowSymbols.svg #: ../share/symbols/symbols.h:139 msgctxt "Symbol" msgid "Alternate Process" -msgstr "" +msgstr "Alternatief proces" #. Symbols: ./FlowSymbols.svg #: ../share/symbols/symbols.h:140 msgctxt "Symbol" msgid "Extract" -msgstr "" +msgstr "Extraheren" #. Symbols: ./FlowSymbols.svg #: ../share/symbols/symbols.h:141 msgctxt "Symbol" msgid "Manual Input" -msgstr "" +msgstr "Manuele invoer" #. Symbols: ./FlowSymbols.svg #: ../share/symbols/symbols.h:142 @@ -3796,25 +3796,25 @@ msgstr "Samenvoegen" #: ../share/symbols/symbols.h:143 msgctxt "Symbol" msgid "Delay" -msgstr "" +msgstr "Vertraging" #. Symbols: ./FlowSymbols.svg #: ../share/symbols/symbols.h:144 msgctxt "Symbol" msgid "Data I/O" -msgstr "" +msgstr "Data I/O" #. Symbols: ./FlowSymbols.svg #: ../share/symbols/symbols.h:145 msgctxt "Symbol" msgid "Internal Storage" -msgstr "" +msgstr "Interne opslag" #. Symbols: ./FlowSymbols.svg #: ../share/symbols/symbols.h:146 msgctxt "Symbol" msgid "Card" -msgstr "" +msgstr "Kaart" #. Symbols: ./FlowSymbols.svg #: ../share/symbols/symbols.h:147 @@ -3826,49 +3826,49 @@ msgstr "Document" #: ../share/symbols/symbols.h:148 msgctxt "Symbol" msgid "Direct Access Storage" -msgstr "" +msgstr "Opslag met directe toegang" #. Symbols: ./FlowSymbols.svg #: ../share/symbols/symbols.h:149 msgctxt "Symbol" msgid "Stored Data" -msgstr "" +msgstr "Opgeslagen data" #. Symbols: ./FlowSymbols.svg #: ../share/symbols/symbols.h:150 msgctxt "Symbol" msgid "Magnetic Disk (Database)" -msgstr "" +msgstr "Magneetschijf (database)" #. Symbols: ./FlowSymbols.svg #: ../share/symbols/symbols.h:151 msgctxt "Symbol" msgid "Punched Tape" -msgstr "" +msgstr "Ponskaart" #. Symbols: ./FlowSymbols.svg #: ../share/symbols/symbols.h:152 msgctxt "Symbol" msgid "Terminator" -msgstr "" +msgstr "Terminator" #. Symbols: ./FlowSymbols.svg #: ../share/symbols/symbols.h:153 msgctxt "Symbol" msgid "Thick Arrow" -msgstr "" +msgstr "Dikke pijl" #. Symbols: ./FlowSymbols.svg #: ../share/symbols/symbols.h:154 msgctxt "Symbol" msgid "Transfer" -msgstr "" +msgstr "Transfer" #. Symbols: ./FlowSymbols.svg #: ../share/symbols/symbols.h:155 msgctxt "Symbol" msgid "Decision" -msgstr "" +msgstr "Beslissing" #. Symbols: ./FlowSymbols.svg #: ../share/symbols/symbols.h:156 @@ -3892,19 +3892,19 @@ msgstr "" #: ../share/symbols/symbols.h:159 msgctxt "Symbol" msgid "Connector" -msgstr "" +msgstr "Verbinding" #. Symbols: ./FlowSymbols.svg #: ../share/symbols/symbols.h:160 msgctxt "Symbol" msgid "Logical Or" -msgstr "" +msgstr "Logische of" #. Symbols: ./FlowSymbols.svg #: ../share/symbols/symbols.h:161 msgctxt "Symbol" msgid "Logical And" -msgstr "" +msgstr "Logische en" #. Symbols: ./FlowSymbols.svg #: ../share/symbols/symbols.h:162 @@ -3922,7 +3922,7 @@ msgstr "Voorbereiding" #: ../share/symbols/symbols.h:164 msgctxt "Symbol" msgid "Display" -msgstr "" +msgstr "Display" #. Symbols: ./FlowSymbols.svg #: ../share/symbols/symbols.h:165 @@ -3934,7 +3934,7 @@ msgstr "Sorteren" #: ../share/symbols/symbols.h:166 msgctxt "Symbol" msgid "Collate" -msgstr "" +msgstr "Vergelijken" #. Symbols: ./LogicSymbols.svg #: ../share/symbols/symbols.h:167 @@ -3946,61 +3946,61 @@ msgstr "Logicasymbolen" #: ../share/symbols/symbols.h:168 msgctxt "Symbol" msgid "Xnor Gate" -msgstr "" +msgstr "Xnor-poort" #. Symbols: ./LogicSymbols.svg #: ../share/symbols/symbols.h:169 msgctxt "Symbol" msgid "Xor Gate" -msgstr "" +msgstr "Xor-poort" #. Symbols: ./LogicSymbols.svg #: ../share/symbols/symbols.h:170 msgctxt "Symbol" msgid "Nor Gate" -msgstr "" +msgstr "Nor-poort" #. Symbols: ./LogicSymbols.svg #: ../share/symbols/symbols.h:171 msgctxt "Symbol" msgid "Or Gate" -msgstr "" +msgstr "Of-poort" #. Symbols: ./LogicSymbols.svg #: ../share/symbols/symbols.h:172 msgctxt "Symbol" msgid "Nand Gate" -msgstr "" +msgstr "Nand-poort" #. Symbols: ./LogicSymbols.svg #: ../share/symbols/symbols.h:173 msgctxt "Symbol" msgid "And Gate" -msgstr "" +msgstr "En-poort" #. Symbols: ./LogicSymbols.svg #: ../share/symbols/symbols.h:174 msgctxt "Symbol" msgid "Buffer" -msgstr "" +msgstr "Buffer" #. Symbols: ./LogicSymbols.svg #: ../share/symbols/symbols.h:175 msgctxt "Symbol" msgid "Not Gate" -msgstr "" +msgstr "Not-poort" #. Symbols: ./LogicSymbols.svg #: ../share/symbols/symbols.h:176 msgctxt "Symbol" msgid "Buffer Small" -msgstr "" +msgstr "Buffer klein" #. Symbols: ./LogicSymbols.svg #: ../share/symbols/symbols.h:177 msgctxt "Symbol" msgid "Not Gate Small" -msgstr "" +msgstr "Not-poort klein" #. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:178 @@ -4024,13 +4024,13 @@ msgstr "Jeugdhotel" #: ../share/symbols/symbols.h:181 msgctxt "Symbol" msgid "Shelter" -msgstr "" +msgstr "Onderdak" #. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:182 msgctxt "Symbol" msgid "Motel" -msgstr "" +msgstr "Motel" #. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:183 @@ -4054,7 +4054,7 @@ msgstr "Chalet" #: ../share/symbols/symbols.h:186 msgctxt "Symbol" msgid "Caravan Park" -msgstr "" +msgstr "Camperplaats" #. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:187 @@ -4096,49 +4096,49 @@ msgstr "Bibliotheek" #: ../share/symbols/symbols.h:193 msgctxt "Symbol" msgid "Town Hall" -msgstr "Stadshuis" +msgstr "Stadhuis" #. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:194 msgctxt "Symbol" msgid "Court" -msgstr "" +msgstr "Gerechtsgebouw" #. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:195 msgctxt "Symbol" msgid "Fire Station / House" -msgstr "" +msgstr "Brandweer" #. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:196 msgctxt "Symbol" msgid "Police Station" -msgstr "" +msgstr "Politiekantoor" #. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:197 msgctxt "Symbol" msgid "Prison" -msgstr "" +msgstr "Gevangenis" #. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:198 msgctxt "Symbol" msgid "Post Office" -msgstr "" +msgstr "Postkantoor" #. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:199 msgctxt "Symbol" msgid "Public Building" -msgstr "" +msgstr "Publiek gebouw" #. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:200 msgctxt "Symbol" msgid "Recycling" -msgstr "" +msgstr "Recyclage" #. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:201 @@ -26602,7 +26602,7 @@ msgstr "Selecteer een overgang voor het huidige kleurverloop" #: ../src/widgets/gradient-toolbar.cpp:1162 msgid "Stops:" -msgstr "Overgangen:" +msgstr "Overgang:" #. Label #: ../src/widgets/gradient-toolbar.cpp:1174 @@ -3,17 +3,17 @@ # This file is distributed under the same license as the Inkscape package. # Copyright (C) 2001, 2007, 2008, 2009 Free Software Foundation, Inc. # +#: ../share/filters/filters.svg.h:1 # Yuri Syrota <rasta@renome.rovno.ua>, 2000. # Maxim Dziumanenko <dziumanenko@gmail.com>, 2004-2007. # Alex <pilipchukap@rambler.ru>, 2005. -# Yuri Chornoivan <yurchor@ukr.net>, 2007, 2008, 2009, 2010, 2011, 2012, 2013. -#: ../share/filters/filters.svg.h:1 +# Yuri Chornoivan <yurchor@ukr.net>, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014. msgid "" msgstr "" "Project-Id-Version: uk\n" "Report-Msgid-Bugs-To: inkscape-devel@lists.sourceforge.net\n" -"POT-Creation-Date: 2013-12-31 11:34+0200\n" -"PO-Revision-Date: 2013-12-31 14:55+0200\n" +"POT-Creation-Date: 2014-02-05 19:26+0200\n" +"PO-Revision-Date: 2014-02-05 19:30+0200\n" "Last-Translator: Yuri Chornoivan <yurchor@ukr.net>\n" "Language-Team: Ukrainian <translation@linux.org.ua>\n" "Language: uk\n" @@ -1008,7 +1008,7 @@ msgstr "Чорне світло" #: ../src/extension/internal/filter/transparency.h:345 #: ../src/filter-enums.cpp:67 ../src/ui/dialog/clonetiler.cpp:832 #: ../src/ui/dialog/clonetiler.cpp:983 -#: ../src/ui/dialog/document-properties.cpp:153 +#: ../src/ui/dialog/document-properties.cpp:154 #: ../share/extensions/color_blackandwhite.inx.h:2 #: ../share/extensions/color_brighter.inx.h:2 #: ../share/extensions/color_custom.inx.h:15 @@ -3296,6 +3296,1862 @@ msgstr "Сукно (растр)" msgid "Old paint (bitmap)" msgstr "Стара картина (растр)" +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:2 +msgctxt "Symbol" +msgid "Flow Chart Shapes" +msgstr "Форми блок-схем" + +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:3 +msgctxt "Symbol" +msgid "Process" +msgstr "Обробляти" + +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:4 +msgctxt "Symbol" +msgid "Predefined Process" +msgstr "Наперед визначений процес" + +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:5 +msgctxt "Symbol" +msgid "Alternate Process" +msgstr "Альтернативний процес" + +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:6 +msgctxt "Symbol" +msgid "Extract" +msgstr "Видобування" + +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:7 +msgctxt "Symbol" +msgid "Manual Input" +msgstr "Ручний ввід" + +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:8 +msgctxt "Symbol" +msgid "Merge" +msgstr "Об’єднання" + +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:9 +msgctxt "Symbol" +msgid "Delay" +msgstr "Затримка" + +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:10 +msgctxt "Symbol" +msgid "Data I/O" +msgstr "Введення-виведення даних" + +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:11 +msgctxt "Symbol" +msgid "Internal Storage" +msgstr "Внутрішня пам'ять" + +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:12 +msgctxt "Symbol" +msgid "Card" +msgstr "Картка" + +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:13 +msgctxt "Symbol" +msgid "Document" +msgstr "Документ" + +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:14 +msgctxt "Symbol" +msgid "Direct Access Storage" +msgstr "Сховище даних безпосереднього доступу" + +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:15 +msgctxt "Symbol" +msgid "Stored Data" +msgstr "Збережені дані" + +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:16 +msgctxt "Symbol" +msgid "Magnetic Disk (Database)" +msgstr "Магнітний диск (база даних)" + +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:17 +msgctxt "Symbol" +msgid "Punched Tape" +msgstr "Перфострічка" + +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:18 +msgctxt "Symbol" +msgid "Terminator" +msgstr "Завершення" + +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:19 +msgctxt "Symbol" +msgid "Thick Arrow" +msgstr "Товста стрілка" + +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:20 +msgctxt "Symbol" +msgid "Transfer" +msgstr "Передавання" + +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:21 +msgctxt "Symbol" +msgid "Decision" +msgstr "Рішення" + +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:22 +msgctxt "Symbol" +msgid "Flow Arrow" +msgstr "Стрілка потоку" + +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:23 +msgctxt "Symbol" +msgid "Circle Arrow" +msgstr "Кругова стрілка" + +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:24 +msgctxt "Symbol" +msgid "Off-Page Connector" +msgstr "З'єднання поза сторінкою" + +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:25 +msgctxt "Symbol" +msgid "Connector" +msgstr "З’єднання" + +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:26 +msgctxt "Symbol" +msgid "Logical Or" +msgstr "Логічне «АБО»" + +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:27 +msgctxt "Symbol" +msgid "Logical And" +msgstr "Логічне «ТА»" + +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:28 +msgctxt "Symbol" +msgid "Manual Operation" +msgstr "Ручна дія" + +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:29 +msgctxt "Symbol" +msgid "Preparation" +msgstr "Підготовка" + +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:30 +msgctxt "Symbol" +msgid "Display" +msgstr "Показ" + +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:31 +msgctxt "Symbol" +msgid "Sort" +msgstr "Упорядкування" + +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:32 +msgctxt "Symbol" +msgid "Collate" +msgstr "Об’єднання" + +#. Symbols: ./BalloonSymbols.svg +#: ../share/symbols/symbols.h:33 +msgctxt "Symbol" +msgid "Word Balloons" +msgstr "Мовні бульки" + +#. Symbols: ./BalloonSymbols.svg +#: ../share/symbols/symbols.h:34 +msgctxt "Symbol" +msgid "Thought Balloon" +msgstr "Бульки думок" + +#. Symbols: ./BalloonSymbols.svg +#: ../share/symbols/symbols.h:35 +msgctxt "Symbol" +msgid "Dream Speaking" +msgstr "Висловлення мрій" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:36 +msgctxt "Symbol" +msgid "Map Symbols" +msgstr "Символи карт" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:37 +msgctxt "Symbol" +msgid "Bed and Breakfast" +msgstr "Ночівля і сніданок" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:38 +msgctxt "Symbol" +msgid "Youth Hostel" +msgstr "Молодіжний гуртожиток" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:39 +msgctxt "Symbol" +msgid "Shelter" +msgstr "Притулок" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:40 +msgctxt "Symbol" +msgid "Motel" +msgstr "Мотель" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:41 +msgctxt "Symbol" +msgid "Hotel" +msgstr "Готель" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:42 +msgctxt "Symbol" +msgid "Hostel" +msgstr "Турбаза" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:43 +msgctxt "Symbol" +msgid "Chalet" +msgstr "Шале" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:44 +msgctxt "Symbol" +msgid "Caravan Park" +msgstr "Стоянка для фургонів" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:45 +msgctxt "Symbol" +msgid "Camping" +msgstr "Кемпінг" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:46 +msgctxt "Symbol" +msgid "Alpine Hut" +msgstr "Альпійська хижа" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:47 +msgctxt "Symbol" +msgid "Bench or Park" +msgstr "Лава або парк" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:48 +msgctxt "Symbol" +msgid "Playground" +msgstr "Ігровий майданчик" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:49 +msgctxt "Symbol" +msgid "Fountain" +msgstr "Фонтан" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:50 +msgctxt "Symbol" +msgid "Library" +msgstr "Бібліотека" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:51 +msgctxt "Symbol" +msgid "Town Hall" +msgstr "Ратуша" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:52 +msgctxt "Symbol" +msgid "Court" +msgstr "Суд" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:53 +msgctxt "Symbol" +msgid "Fire Station / House" +msgstr "Пожежна станція" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:54 +msgctxt "Symbol" +msgid "Police Station" +msgstr "Поліційна дільниця" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:55 +msgctxt "Symbol" +msgid "Prison" +msgstr "В’язниця" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:56 +msgctxt "Symbol" +msgid "Post Office" +msgstr "Поштове відділення" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:57 +msgctxt "Symbol" +msgid "Public Building" +msgstr "Громадська будівля" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:58 +msgctxt "Symbol" +msgid "Recycling" +msgstr "Пункт переробки" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:59 +msgctxt "Symbol" +msgid "Survey Point" +msgstr "Оглядовий майданчик" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:60 +msgctxt "Symbol" +msgid "Toll Booth" +msgstr "Будка" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:61 +msgctxt "Symbol" +msgid "Lift Gate" +msgstr "Підйомні ворота" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:62 +msgctxt "Symbol" +msgid "Steps" +msgstr "Сходи" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:63 +msgctxt "Symbol" +msgid "Stile" +msgstr "Турнікет" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:64 +msgctxt "Symbol" +msgid "Kissing Gate" +msgstr "Вузька хвіртка" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:65 +msgctxt "Symbol" +msgid "Gate" +msgstr "Ворота" + +#. Symbols: ./MapSymbols.svg +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:66 ../share/symbols/symbols.h:295 +#: ../share/symbols/symbols.h:296 +msgctxt "Symbol" +msgid "Exit" +msgstr "Вихід" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:67 +msgctxt "Symbol" +msgid "Entrance" +msgstr "Вхід" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:68 +msgctxt "Symbol" +msgid "Cycle Barrier" +msgstr "Круговий бар’єр" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:69 +msgctxt "Symbol" +msgid "Cattle Grid" +msgstr "Огорожа" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:70 +msgctxt "Symbol" +msgid "Bollard" +msgstr "Пал" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:71 +msgctxt "Symbol" +msgid "University" +msgstr "Університет" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:72 +msgctxt "Symbol" +msgid "High/Secondary School" +msgstr "Школа третього ступеня" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:73 +msgctxt "Symbol" +msgid "School" +msgstr "Школа" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:74 +msgctxt "Symbol" +msgid "Kindergatten" +msgstr "Дитячий садок" + +#. Symbols: ./MapSymbols.svg +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:75 ../share/symbols/symbols.h:229 +#: ../share/symbols/symbols.h:230 +msgctxt "Symbol" +msgid "Nursery" +msgstr "Ясла" + +#. Symbols: ./MapSymbols.svg +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:76 ../share/symbols/symbols.h:255 +#: ../share/symbols/symbols.h:256 +msgctxt "Symbol" +msgid "Restaurant" +msgstr "Ресторан" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:77 +msgctxt "Symbol" +msgid "Pub" +msgstr "Пив’ярня" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:78 +msgctxt "Symbol" +msgid "Deserts/Cakes Shop" +msgstr "Десерти та печиво" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:79 +msgctxt "Symbol" +msgid "Fast Food" +msgstr "Фастфуд" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:80 +msgctxt "Symbol" +msgid "Public Tap/Water" +msgstr "Соки і води" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:81 +msgctxt "Symbol" +msgid "Cafe" +msgstr "Кав’ярня" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:82 +msgctxt "Symbol" +msgid "Beer Garden" +msgstr "Пивний сад" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:83 +msgctxt "Symbol" +msgid "Wine Bar" +msgstr "Бар" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:84 +msgctxt "Symbol" +msgid "Opticians/Eye Doctors" +msgstr "Окуліст" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:85 +msgctxt "Symbol" +msgid "Dentist" +msgstr "Дантист" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:86 +msgctxt "Symbol" +msgid "Veterinarian" +msgstr "Ветеринарія" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:87 +msgctxt "Symbol" +msgid "Drugs Dispensary" +msgstr "Аптека" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:88 +msgctxt "Symbol" +msgid "Pharmacy" +msgstr "Аптека" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:89 +msgctxt "Symbol" +msgid "Accident & Emergency" +msgstr "Служби реагування на надзвичайні ситуації" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:90 +msgctxt "Symbol" +msgid "Hospital" +msgstr "Лікарня" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:91 +msgctxt "Symbol" +msgid "Doctors" +msgstr "Лікар" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:92 +msgctxt "Symbol" +msgid "Scrub Land" +msgstr "Чагарники" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:93 +msgctxt "Symbol" +msgid "Swamp" +msgstr "Болото" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:94 +msgctxt "Symbol" +msgid "Hills" +msgstr "Пагорби" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:95 +msgctxt "Symbol" +msgid "Grass Land" +msgstr "Луки" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:96 +msgctxt "Symbol" +msgid "Deciduous Forest" +msgstr "Листяний ліс" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:97 +msgctxt "Symbol" +msgid "Mixed Forest" +msgstr "Мішаний ліс" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:98 +msgctxt "Symbol" +msgid "Coniferous Forest" +msgstr "Хвойний ліс" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:99 +msgctxt "Symbol" +msgid "Church or Place of Worship" +msgstr "Церква або місце поклоніння" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:100 +msgctxt "Symbol" +msgid "Bank" +msgstr "Банк" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:101 +msgctxt "Symbol" +msgid "Power Lines" +msgstr "Лінії електропередачі" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:102 +msgctxt "Symbol" +msgid "Watch Tower" +msgstr "Спостережна вежа" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:103 +msgctxt "Symbol" +msgid "Transmitter" +msgstr "Радіопередавач" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:104 +msgctxt "Symbol" +msgid "Village" +msgstr "Село" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:105 +msgctxt "Symbol" +msgid "Town" +msgstr "Місто" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:106 +msgctxt "Symbol" +msgid "Hamlet" +msgstr "Хутір" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:107 +msgctxt "Symbol" +msgid "City" +msgstr "Місто" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:108 +msgctxt "Symbol" +msgid "Peak" +msgstr "Пік" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:109 +msgctxt "Symbol" +msgid "Mountain Pass" +msgstr "Ущелина" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:110 +msgctxt "Symbol" +msgid "Mine" +msgstr "Шахта" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:111 +msgctxt "Symbol" +msgid "Military Complex" +msgstr "Військовий комплекс" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:112 +msgctxt "Symbol" +msgid "Embassy" +msgstr "Посольство" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:113 +msgctxt "Symbol" +msgid "Toy Shop" +msgstr "Магазин іграшок" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:114 +msgctxt "Symbol" +msgid "Supermarket" +msgstr "Супермаркет" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:115 +msgctxt "Symbol" +msgid "Jewlers" +msgstr "Ювелірна крамниця" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:116 +msgctxt "Symbol" +msgid "Hairdressers" +msgstr "Перукарня" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:117 +msgctxt "Symbol" +msgid "Greengrocer" +msgstr "Овочевий магазин" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:118 +msgctxt "Symbol" +msgid "Gift Shop" +msgstr "Магазин подарунків" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:119 +msgctxt "Symbol" +msgid "Garden Center" +msgstr "Садовий центр" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:120 +msgctxt "Symbol" +msgid "Florist" +msgstr "Квіткова крамниця" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:121 +msgctxt "Symbol" +msgid "Fish Monger" +msgstr "Торгівля рибою" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:122 +msgctxt "Symbol" +msgid "Real Estate" +msgstr "Агенція нерухомості" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:123 +msgctxt "Symbol" +msgid "Hardware / DIY" +msgstr "Обладнання і торгівля запчастинами" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:124 +msgctxt "Symbol" +msgid "Shop" +msgstr "Крамниці" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:125 +msgctxt "Symbol" +msgid "Confectioner" +msgstr "Кондитерська" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:126 +msgctxt "Symbol" +msgid "Computer Shop" +msgstr "Комп’ютерна крамниця" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:127 +msgctxt "Symbol" +msgid "Clothing" +msgstr "Торгівля одягом" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:128 +msgctxt "Symbol" +msgid "Mechanic" +msgstr "Механічна майстерня" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:129 +msgctxt "Symbol" +msgid "Car Dealer" +msgstr "Продаж автомобілів" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:130 +msgctxt "Symbol" +msgid "Butcher" +msgstr "Торгівля м’ясом" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:131 +msgctxt "Symbol" +msgid "Meat Shop" +msgstr "М’ясні вироби" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:132 +msgctxt "Symbol" +msgid "Bicycle Shop" +msgstr "Велокрамниця" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:133 +msgctxt "Symbol" +msgid "Baker" +msgstr "Пекарня" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:134 +msgctxt "Symbol" +msgid "Off License / Liquor Store" +msgstr "Торгівля спиртними напоями" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:135 +msgctxt "Symbol" +msgid "Wind Surfing" +msgstr "Віндсерфінг" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:136 +msgctxt "Symbol" +msgid "Tennis" +msgstr "Теніс" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:137 +msgctxt "Symbol" +msgid "Outdoor Pool" +msgstr "Відкритий басейн" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:138 +msgctxt "Symbol" +msgid "Indoor Pool" +msgstr "Критий басейн" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:139 +msgctxt "Symbol" +msgid "Skiing" +msgstr "Катання на лижах" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:140 +msgctxt "Symbol" +msgid "Sailing" +msgstr "Парусний спорт" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:141 +msgctxt "Symbol" +msgid "Leisure Center" +msgstr "Центр дозвілля" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:142 +msgctxt "Symbol" +msgid "Ice Skating" +msgstr "Катання на ковзанах" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:143 +msgctxt "Symbol" +msgid "Equine Sports" +msgstr "Кінний спорт" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:144 +msgctxt "Symbol" +msgid "Rock Climbing" +msgstr "Скелелазання" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:145 +msgctxt "Symbol" +msgid "Gym" +msgstr "Тренажерна зала" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:146 +msgctxt "Symbol" +msgid "Golf" +msgstr "Гольф" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:147 +msgctxt "Symbol" +msgid "Diving" +msgstr "Пірнання" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:148 +msgctxt "Symbol" +msgid "Archery" +msgstr "Стрільба з лука" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:149 +msgctxt "Symbol" +msgid "Zoo" +msgstr "Зоопарк" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:150 +msgctxt "Symbol" +msgid "Wreck" +msgstr "Місце катастрофи" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:151 +msgctxt "Symbol" +msgid "Water Wheel" +msgstr "Водяне колесо" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:152 +msgctxt "Symbol" +msgid "Point of Interest" +msgstr "Цікаве місце" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:153 +msgctxt "Symbol" +msgid "Theater" +msgstr "Театр" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:154 +msgctxt "Symbol" +msgid "Park / Picnic Area" +msgstr "Парк і місця для пікніків" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:155 +msgctxt "Symbol" +msgid "Monument" +msgstr "Монумент" + +#. Symbols: ./MapSymbols.svg +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:156 ../share/symbols/symbols.h:235 +#: ../share/symbols/symbols.h:236 +msgctxt "Symbol" +msgid "Information" +msgstr "Довідкова служба" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:157 +msgctxt "Symbol" +msgid "Beach" +msgstr "Пляж" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:158 +msgctxt "Symbol" +msgid "Battle Location" +msgstr "Місце битви" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:159 +msgctxt "Symbol" +msgid "Archaeology / Ruins" +msgstr "Археологічна пам’ятка" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:160 +msgctxt "Symbol" +msgid "Walking" +msgstr "Піший маршрут" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:161 +msgctxt "Symbol" +msgid "Train" +msgstr "Потяг" + +#. Symbols: ./MapSymbols.svg +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:162 ../share/symbols/symbols.h:243 +#: ../share/symbols/symbols.h:244 +msgctxt "Symbol" +msgid "Taxi" +msgstr "Таксі" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:163 +msgctxt "Symbol" +msgid "Underground Rail" +msgstr "Метро" + +#. Symbols: ./MapSymbols.svg +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:164 ../share/symbols/symbols.h:253 +#: ../share/symbols/symbols.h:254 +msgctxt "Symbol" +msgid "Car Rental" +msgstr "Оренда автомобілів" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:165 +msgctxt "Symbol" +msgid "Bike Rental" +msgstr "Оренда велосипедів" + +#. Symbols: ./MapSymbols.svg +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:166 ../share/symbols/symbols.h:241 +#: ../share/symbols/symbols.h:242 +msgctxt "Symbol" +msgid "Heliport" +msgstr "Вертодром" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:167 +msgctxt "Symbol" +msgid "Carpool" +msgstr "Автостоп" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:168 +msgctxt "Symbol" +msgid "Flood Gate" +msgstr "Шлюз" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:169 +msgctxt "Symbol" +msgid "Shipping" +msgstr "Перевезення кораблем" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:170 +msgctxt "Symbol" +msgid "Disabled Parking" +msgstr "Паркування для осіб з обмеженими можливостями" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:171 +msgctxt "Symbol" +msgid "Paid Parking" +msgstr "Платний паркувальний майданчик" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:172 +msgctxt "Symbol" +msgid "Bike Parking" +msgstr "Велопаркінґ" + +#. Symbols: ./MapSymbols.svg +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:173 ../share/symbols/symbols.h:287 +#: ../share/symbols/symbols.h:288 +msgctxt "Symbol" +msgid "Parking" +msgstr "Паркувальний майданчик" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:174 +msgctxt "Symbol" +msgid "Marina" +msgstr "Пристань" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:175 +msgctxt "Symbol" +msgid "Fuel Station" +msgstr "Заправна станція" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:176 +msgctxt "Symbol" +msgid "Bus Stop" +msgstr "Автобусна зупинка" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:177 +msgctxt "Symbol" +msgid "Bus Station" +msgstr "Автостанція" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:178 +msgctxt "Symbol" +msgid "Airport" +msgstr "Аеропорт" + +#. Symbols: ./LogicSymbols.svg +#: ../share/symbols/symbols.h:179 +msgctxt "Symbol" +msgid "Logic Symbols" +msgstr "Символи логіки" + +#. Symbols: ./LogicSymbols.svg +#: ../share/symbols/symbols.h:180 +msgctxt "Symbol" +msgid "Xnor Gate" +msgstr "Ключ виключне заперечувальне АБО»" + +#. Symbols: ./LogicSymbols.svg +#: ../share/symbols/symbols.h:181 +msgctxt "Symbol" +msgid "Xor Gate" +msgstr "Ключ виключне І" + +#. Symbols: ./LogicSymbols.svg +#: ../share/symbols/symbols.h:182 +msgctxt "Symbol" +msgid "Nor Gate" +msgstr "Ключ АБО-НІ" + +#. Symbols: ./LogicSymbols.svg +#: ../share/symbols/symbols.h:183 +msgctxt "Symbol" +msgid "Or Gate" +msgstr "Ключ АБО" + +#. Symbols: ./LogicSymbols.svg +#: ../share/symbols/symbols.h:184 +msgctxt "Symbol" +msgid "Nand Gate" +msgstr "Ключ І-НІ" + +#. Symbols: ./LogicSymbols.svg +#: ../share/symbols/symbols.h:185 +msgctxt "Symbol" +msgid "And Gate" +msgstr "Ключ І" + +#. Symbols: ./LogicSymbols.svg +#: ../share/symbols/symbols.h:186 +msgctxt "Symbol" +msgid "Buffer" +msgstr "Буфер" + +#. Symbols: ./LogicSymbols.svg +#: ../share/symbols/symbols.h:187 +msgctxt "Symbol" +msgid "Not Gate" +msgstr "Ключ НІ" + +#. Symbols: ./LogicSymbols.svg +#: ../share/symbols/symbols.h:188 +msgctxt "Symbol" +msgid "Buffer Small" +msgstr "Малий буфер" + +#. Symbols: ./LogicSymbols.svg +#: ../share/symbols/symbols.h:189 +msgctxt "Symbol" +msgid "Not Gate Small" +msgstr "Малий ключ НІ" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:190 +msgctxt "Symbol" +msgid "AIGA Symbol Signs" +msgstr "Знаки-символи AIGA" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:191 ../share/symbols/symbols.h:192 +msgctxt "Symbol" +msgid "Telephone" +msgstr "Телефон" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:193 ../share/symbols/symbols.h:194 +msgctxt "Symbol" +msgid "Mail" +msgstr "Пошта" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:195 ../share/symbols/symbols.h:196 +msgctxt "Symbol" +msgid "Currency Exchange" +msgstr "Обмін валют" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:197 ../share/symbols/symbols.h:198 +msgctxt "Symbol" +msgid "Currency Exchange - Euro" +msgstr "Обмін валют — євро" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:199 ../share/symbols/symbols.h:200 +msgctxt "Symbol" +msgid "Cashier" +msgstr "Каса" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:201 ../share/symbols/symbols.h:202 +msgctxt "Symbol" +msgid "First Aid" +msgstr "Перша допомога" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:203 ../share/symbols/symbols.h:204 +msgctxt "Symbol" +msgid "Lost and Found" +msgstr "Втрачено і знайдено" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:205 ../share/symbols/symbols.h:206 +msgctxt "Symbol" +msgid "Coat Check" +msgstr "Гардероб" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:207 ../share/symbols/symbols.h:208 +msgctxt "Symbol" +msgid "Baggage Lockers" +msgstr "Шафи для зберігання речей" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:209 ../share/symbols/symbols.h:210 +msgctxt "Symbol" +msgid "Escalator" +msgstr "Ескалатор" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:211 ../share/symbols/symbols.h:212 +msgctxt "Symbol" +msgid "Escalator Down" +msgstr "Ескалатор вниз" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:213 ../share/symbols/symbols.h:214 +msgctxt "Symbol" +msgid "Escalator Up" +msgstr "Ескалатор вгору" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:215 ../share/symbols/symbols.h:216 +msgctxt "Symbol" +msgid "Stairs" +msgstr "Сходи" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:217 ../share/symbols/symbols.h:218 +msgctxt "Symbol" +msgid "Stairs Down" +msgstr "Сходи вниз" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:219 ../share/symbols/symbols.h:220 +msgctxt "Symbol" +msgid "Stairs Up" +msgstr "Сходи вгору" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:221 ../share/symbols/symbols.h:222 +msgctxt "Symbol" +msgid "Elevator" +msgstr "Ліфт" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:223 ../share/symbols/symbols.h:224 +msgctxt "Symbol" +msgid "Toilets - Men" +msgstr "Чоловічий туалет" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:225 ../share/symbols/symbols.h:226 +msgctxt "Symbol" +msgid "Toilets - Women" +msgstr "Жіночий туалет" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:227 ../share/symbols/symbols.h:228 +msgctxt "Symbol" +msgid "Toilets" +msgstr "Туалети" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:231 ../share/symbols/symbols.h:232 +msgctxt "Symbol" +msgid "Drinking Fountain" +msgstr "Питний фонтанчик" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:233 ../share/symbols/symbols.h:234 +msgctxt "Symbol" +msgid "Waiting Room" +msgstr "Зала очікування" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:237 ../share/symbols/symbols.h:238 +msgctxt "Symbol" +msgid "Hotel Information" +msgstr "Інформація щодо готелів" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:239 ../share/symbols/symbols.h:240 +msgctxt "Symbol" +msgid "Air Transportation" +msgstr "Повітряний транспорт" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:245 ../share/symbols/symbols.h:246 +msgctxt "Symbol" +msgid "Bus" +msgstr "Автобус" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:247 ../share/symbols/symbols.h:248 +msgctxt "Symbol" +msgid "Ground Transportation" +msgstr "Наземний транспорт" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:249 ../share/symbols/symbols.h:250 +msgctxt "Symbol" +msgid "Rail Transportation" +msgstr "Залізничний транспорт" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:251 ../share/symbols/symbols.h:252 +msgctxt "Symbol" +msgid "Water Transportation" +msgstr "Водний транспорт" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:257 ../share/symbols/symbols.h:258 +msgctxt "Symbol" +msgid "Coffeeshop" +msgstr "Кав’ярня" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:259 ../share/symbols/symbols.h:260 +msgctxt "Symbol" +msgid "Bar" +msgstr "Бар" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:261 ../share/symbols/symbols.h:262 +msgctxt "Symbol" +msgid "Shops" +msgstr "Крамниці" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:263 ../share/symbols/symbols.h:264 +msgctxt "Symbol" +msgid "Barber Shop - Beauty Salon" +msgstr "Перукарня і салон краси" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:265 ../share/symbols/symbols.h:266 +msgctxt "Symbol" +msgid "Barber Shop" +msgstr "Перукарня" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:267 ../share/symbols/symbols.h:268 +msgctxt "Symbol" +msgid "Beauty Salon" +msgstr "Салон краси" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:269 ../share/symbols/symbols.h:270 +msgctxt "Symbol" +msgid "Ticket Purchase" +msgstr "Придбання квитків" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:271 ../share/symbols/symbols.h:272 +msgctxt "Symbol" +msgid "Baggage Check In" +msgstr "Приймання багажу" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:273 ../share/symbols/symbols.h:274 +msgctxt "Symbol" +msgid "Baggage Claim" +msgstr "Видача багажу" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:275 ../share/symbols/symbols.h:276 +msgctxt "Symbol" +msgid "Customs" +msgstr "Митні послуги" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:277 ../share/symbols/symbols.h:278 +msgctxt "Symbol" +msgid "Immigration" +msgstr "Міграційна служба" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:279 ../share/symbols/symbols.h:280 +msgctxt "Symbol" +msgid "Departing Flights" +msgstr "Відправлення" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:281 ../share/symbols/symbols.h:282 +msgctxt "Symbol" +msgid "Arriving Flights" +msgstr "Прибуття" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:283 ../share/symbols/symbols.h:284 +msgctxt "Symbol" +msgid "Smoking" +msgstr "Місце для куріння" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:285 ../share/symbols/symbols.h:286 +msgctxt "Symbol" +msgid "No Smoking" +msgstr "Куріння заборонено" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:289 ../share/symbols/symbols.h:290 +msgctxt "Symbol" +msgid "No Parking" +msgstr "Паркування заборонено" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:291 ../share/symbols/symbols.h:292 +msgctxt "Symbol" +msgid "No Dogs" +msgstr "Вигулювання собак заборонено" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:293 ../share/symbols/symbols.h:294 +msgctxt "Symbol" +msgid "No Entry" +msgstr "Вхід заборонено" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:297 ../share/symbols/symbols.h:298 +msgctxt "Symbol" +msgid "Fire Extinguisher" +msgstr "Вогнегасник" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:299 ../share/symbols/symbols.h:300 +msgctxt "Symbol" +msgid "Right Arrow" +msgstr "Стрілка праворуч" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:301 ../share/symbols/symbols.h:302 +msgctxt "Symbol" +msgid "Forward and Right Arrow" +msgstr "Стрілка вперед і праворуч" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:303 ../share/symbols/symbols.h:304 +msgctxt "Symbol" +msgid "Up Arrow" +msgstr "Стрілка вгору" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:305 ../share/symbols/symbols.h:306 +msgctxt "Symbol" +msgid "Forward and Left Arrow" +msgstr "Стрілка вперед і ліворуч" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:307 ../share/symbols/symbols.h:308 +msgctxt "Symbol" +msgid "Left Arrow" +msgstr "Стрілка ліворуч" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:309 ../share/symbols/symbols.h:310 +msgctxt "Symbol" +msgid "Left and Down Arrow" +msgstr "Стрілка ліворуч і вниз" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:311 ../share/symbols/symbols.h:312 +msgctxt "Symbol" +msgid "Down Arrow" +msgstr "Стрілка вниз" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:313 ../share/symbols/symbols.h:314 +msgctxt "Symbol" +msgid "Right and Down Arrow" +msgstr "Стрілка праворуч і вниз" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:315 ../share/symbols/symbols.h:316 +msgctxt "Symbol" +msgid "NPS Wheelchair Accessible - 1996" +msgstr "Візок NPS — 1996" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:317 ../share/symbols/symbols.h:318 +msgctxt "Symbol" +msgid "NPS Wheelchair Accessible" +msgstr "Візок NPS" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:319 ../share/symbols/symbols.h:320 +msgctxt "Symbol" +msgid "New Wheelchair Accessible" +msgstr "Новий візок" + +#: ../share/templates/templates.h:1 +msgid "A4 Landscape Page" +msgstr "Сторінка A4, альбомна орієнтація" + +#: ../share/templates/templates.h:1 +msgid "Empty A4 landscape sheet" +msgstr "Порожній аркуш A4, альбомна орієнтація" + +#: ../share/templates/templates.h:1 +msgid "A4 paper sheet empty landscape" +msgstr "Порожній аркуш A4, альбомна орієнтація" + +#: ../share/templates/templates.h:1 +msgid "A4 Page" +msgstr "Сторінка A4" + +#: ../share/templates/templates.h:1 +msgid "Empty A4 sheet" +msgstr "Порожній аркуш A4" + +#: ../share/templates/templates.h:1 +msgid "A4 paper sheet empty" +msgstr "Порожній аркуш A4" + +#: ../share/templates/templates.h:1 +msgid "Black Opaque" +msgstr "Чорна непрозора" + +#: ../share/templates/templates.h:1 +msgid "Empty black page" +msgstr "Порожня чорна сторінка" + +#: ../share/templates/templates.h:1 +msgid "black opaque empty" +msgstr "порожня чорна непрозора" + +#: ../share/templates/templates.h:1 +msgid "White Opaque" +msgstr "Біла непрозора" + +#: ../share/templates/templates.h:1 +msgid "Empty white page" +msgstr "Порожня біла сторінка" + +#: ../share/templates/templates.h:1 +msgid "white opaque empty" +msgstr "порожня біла непрозора" + +#: ../share/templates/templates.h:1 +msgid "Business Card 85x54mm" +msgstr "Візитівка 85⨯54 мм" + +#: ../share/templates/templates.h:1 +msgid "Empty business card template." +msgstr "Шаблон порожньої візитівки." + +#: ../share/templates/templates.h:1 +msgid "business card empty 85x54" +msgstr "порожня візитівка 85⨯54" + +#: ../share/templates/templates.h:1 +msgid "Business Card 90x50mm" +msgstr "Візитівка 90⨯50 мм" + +#: ../share/templates/templates.h:1 +msgid "business card empty 90x50" +msgstr "порожня візитівка 90⨯50" + +#: ../share/templates/templates.h:1 +msgid "CD Cover 300dpi" +msgstr "Обкладинка для компакт-диска, 300 т/д" + +#: ../share/templates/templates.h:1 +msgid "Empty CD box cover." +msgstr "Порожня обкладинка для коробки з-під компакт-диска." + +#: ../share/templates/templates.h:1 +msgid "CD cover disc disk 300dpi box" +msgstr "Обкладинка для коробки з-під компакт-диска, 300 т/д" + +#: ../share/templates/templates.h:1 +msgid "CD Label 120x120 " +msgstr "Наліпка на компакт-диск 120⨯120 " + +#: ../share/templates/templates.h:1 +msgid "Simple CD Label template with disc's pattern." +msgstr "Простий шаблон наліпки на компакт диск з розміткою." + +#: ../share/templates/templates.h:1 +msgid "CD label 120x120 disc disk" +msgstr "Наліпка на компакт-диск, 120⨯120" + +#: ../share/templates/templates.h:1 +msgid "DVD Cover Regular 300dpi " +msgstr "Звичайна обкладинка для DVD, 300 т/д " + +#: ../share/templates/templates.h:1 +msgid "Template for both-sides DVD covers." +msgstr "Шаблон для двобічних обкладинок для DVD." + +#: ../share/templates/templates.h:1 +msgid "DVD cover regular 300dpi" +msgstr "Звичайна обкладинка для DVD, 300 т/д" + +#: ../share/templates/templates.h:1 +msgid "DVD Cover Slim 300dpi " +msgstr "Обкладинка тонкої коробки для DVD, 300 т/д " + +#: ../share/templates/templates.h:1 +msgid "Template for both-sides DVD slim covers." +msgstr "Шаблон для двобічних обкладинок тонких коробок для DVD." + +#: ../share/templates/templates.h:1 +msgid "DVD cover slim 300dpi" +msgstr "Обкладинка тонкої коробки для DVD, 300 т/д " + +#: ../share/templates/templates.h:1 +msgid "DVD Cover Superslim 300dpi " +msgstr "Обкладинка надтонкої коробки для DVD, 300 т/д " + +#: ../share/templates/templates.h:1 +msgid "Template for both-sides DVD superslim covers." +msgstr "Шаблон для двобічних надтонких обкладинок для DVD." + +#: ../share/templates/templates.h:1 +msgid "DVD cover superslim 300dpi" +msgstr "Обкладинка надтонкої коробки для DVD, 300 т/д" + +#: ../share/templates/templates.h:1 +msgid "DVD Cover Ultraslim 300dpi " +msgstr "Обкладинка ультратонкої коробки для DVD, 300 т/д " + +#: ../share/templates/templates.h:1 +msgid "Template for both-sides DVD ultraslim covers." +msgstr "Шаблон для двобічних обкладинок ультратонких коробок для DVD." + +#: ../share/templates/templates.h:1 +msgid "DVD cover ultraslim 300dpi" +msgstr "Обкладинка ультратонкої коробки для DVD, 300 т/д" + +#: ../share/templates/templates.h:1 +msgid "Desktop 1024x768" +msgstr "Стільниця 1024⨯768" + +#: ../share/templates/templates.h:1 +msgid "Empty desktop size sheet" +msgstr "Порожній аркуш розміром із зображення стільниці" + +#: ../share/templates/templates.h:1 +msgid "desktop 1024x768 wallpaper" +msgstr "шпалери для стільниці, 1024⨯768" + +#: ../share/templates/templates.h:1 +msgid "Desktop 1600x1200" +msgstr "Стільниця 1600⨯1200" + +#: ../share/templates/templates.h:1 +msgid "desktop 1600x1200 wallpaper" +msgstr "шпалери для стільниці, 1600⨯1200" + +#: ../share/templates/templates.h:1 +msgid "Desktop 640x480" +msgstr "Стільниця 640⨯480" + +#: ../share/templates/templates.h:1 +msgid "desktop 640x480 wallpaper" +msgstr "шпалери для стільниці, 640⨯480" + +#: ../share/templates/templates.h:1 +msgid "Desktop 800x600" +msgstr "Стільниця 800⨯600" + +#: ../share/templates/templates.h:1 +msgid "desktop 800x600 wallpaper" +msgstr "шпалери для стільниці, 800⨯600" + +#: ../share/templates/templates.h:1 +msgid "Fontforge Glyph" +msgstr "Гліф Fontforge" + +#: ../share/templates/templates.h:1 +msgid "font fontforge glyph 1000x1000" +msgstr "гліф шрифту fontforge, 1000⨯1000" + +#: ../share/templates/templates.h:1 +msgid "Icon 16x16" +msgstr "Піктограма 16⨯16" + +#: ../share/templates/templates.h:1 +msgid "Small 16x16 icon template." +msgstr "Шаблон малої піктограми 16⨯16." + +#: ../share/templates/templates.h:1 +msgid "icon 16x16 empty" +msgstr "порожня піктограма 16⨯16" + +#: ../share/templates/templates.h:1 +msgid "Icon 32x32" +msgstr "Піктограма 32⨯32" + +#: ../share/templates/templates.h:1 +msgid "32x32 icon template." +msgstr "Шаблон піктограми 32⨯32." + +#: ../share/templates/templates.h:1 +msgid "icon 32x32 empty" +msgstr "порожня піктограма 32⨯32" + +#: ../share/templates/templates.h:1 +msgid "Icon 48x48" +msgstr "Піктограма 48⨯48" + +#: ../share/templates/templates.h:1 +msgid "48x48 icon template." +msgstr "Шаблон піктограми 48⨯48." + +#: ../share/templates/templates.h:1 +msgid "icon 48x48 empty" +msgstr "порожня піктограма 48⨯48" + +#: ../share/templates/templates.h:1 +msgid "Icon 64x64" +msgstr "Піктограма 64⨯64" + +#: ../share/templates/templates.h:1 +msgid "64x64 icon template." +msgstr "Шаблон піктограми 64⨯64." + +#: ../share/templates/templates.h:1 +msgid "icon 64x64 empty" +msgstr "порожня піктограма 64⨯64" + +#: ../share/templates/templates.h:1 +msgid "Letter Landscape" +msgstr "Лист (альбомна орієнтація)" + +#: ../share/templates/templates.h:1 +msgid "Standard letter landscape sheet - 792x612" +msgstr "Стандартний аркуш листа, альбомна орієнтація — 792⨯612" + +#: ../share/templates/templates.h:1 +msgid "letter landscape 792x612 empty" +msgstr "порожній лист, альбомна орієнтація, 792⨯612" + +#: ../share/templates/templates.h:1 +msgid "Letter" +msgstr "Лист" + +#: ../share/templates/templates.h:1 +msgid "Standard letter sheet - 612x792" +msgstr "Стандартний аркуш листа — 612⨯792" + +#: ../share/templates/templates.h:1 +msgid "letter 612x792 empty" +msgstr "порожній лист 612⨯792" + +#: ../share/templates/templates.h:1 +msgid "No Borders" +msgstr "Без рамки" + +#: ../share/templates/templates.h:1 +msgid "Empty sheet with no borders" +msgstr "Порожній аркуш без рамки" + +#: ../share/templates/templates.h:1 +msgid "no borders empty" +msgstr "порожній без рамки" + +#: ../share/templates/templates.h:1 +msgid "No Layers" +msgstr "Без шарів" + +#: ../share/templates/templates.h:1 +msgid "Empty sheet with no layers" +msgstr "Порожній аркуш без шарів" + +#: ../share/templates/templates.h:1 +msgid "no layers empty" +msgstr "порожній без шарів" + +#: ../share/templates/templates.h:1 +msgid "Video HDTV 1920x1080" +msgstr "Відео HDTV 1920⨯1080" + +#: ../share/templates/templates.h:1 +msgid "HDTV video template for 1920x1080 resolution." +msgstr "Шаблон відео HDTV для роздільної здатності 1920⨯1080." + +#: ../share/templates/templates.h:1 +msgid "HDTV video empty 1920x1080" +msgstr "порожній шаблон відео HDTV 1920⨯1080" + +#: ../share/templates/templates.h:1 +msgid "Video NTSC 720x486" +msgstr "Відео NTSC 720⨯486" + +#: ../share/templates/templates.h:1 +msgid "NTSC video template for 720x486 resolution." +msgstr "Шаблон відео NTSC для роздільної здатності 720⨯486." + +#: ../share/templates/templates.h:1 +msgid "NTSC video empty 720x486" +msgstr "Порожнє відео NTSC 720⨯486" + +#: ../share/templates/templates.h:1 +msgid "Video PAL 728x576" +msgstr "Відео PAL 728⨯576" + +#: ../share/templates/templates.h:1 +msgid "PAL video template for 728x576 resolution." +msgstr "Шаблон відео PAL для роздільної здатності 728⨯576." + +#: ../share/templates/templates.h:1 +msgid "PAL video empty 728x576" +msgstr "Порожнє відео PAL 728⨯576" + +#: ../share/templates/templates.h:1 +msgid "Web Banner 468x60" +msgstr "Інтернет-банер 468⨯60" + +#: ../share/templates/templates.h:1 +msgid "Empty 468x60 web banner template." +msgstr "Шаблон порожнього інтернет-банера 468⨯60." + +#: ../share/templates/templates.h:1 +msgid "web banner 468x60 empty" +msgstr "порожній інтернет-банер 468⨯60" + +#: ../share/templates/templates.h:1 +msgid "Web Banner 728x90" +msgstr "Інтернет-банер 728⨯90" + +#: ../share/templates/templates.h:1 +msgid "Empty 728x90 web banner template." +msgstr "Порожній шаблон інтернет-банера, 728⨯90." + +#: ../share/templates/templates.h:1 +msgid "web banner 728x90 empty" +msgstr "порожній інтернет-банер 728⨯90" + +#: ../share/templates/templates.h:1 +msgid "LaTeX Beamer" +msgstr "Beamer, LaTeX" + +#: ../share/templates/templates.h:1 +msgid "LaTeX beamer template with helping grid." +msgstr "Шаблон beamer LaTeX з допоміжною сіткою." + +#: ../share/templates/templates.h:1 +msgid "LaTex LaTeX latex grid beamer" +msgstr "Сітка LaTeX beamer" + +#: ../share/templates/templates.h:1 +msgid "Typography Canvas" +msgstr "Типографічне полотно" + +#: ../share/templates/templates.h:1 +msgid "Empty typography canvas with helping guidelines." +msgstr "Порожнє типографічне полотно з допоміжними напрямними." + +#: ../share/templates/templates.h:1 +msgid "guidelines typography canvas" +msgstr "типографічне полотно з напрямними" + #. 3D box #: ../src/box3d.cpp:259 ../src/box3d.cpp:1329 #: ../src/ui/dialog/inkscape-preferences.cpp:398 @@ -3313,7 +5169,7 @@ msgstr "(некоректний рядок UTF-8)" #: ../src/color-profile.cpp:911 ../src/filter-enums.cpp:119 #: ../src/live_effects/lpe-ruler.cpp:32 -#: ../src/ui/dialog/filter-effects-dialog.cpp:518 +#: ../src/ui/dialog/filter-effects-dialog.cpp:549 #: ../src/ui/dialog/inkscape-preferences.cpp:332 #: ../src/ui/dialog/inkscape-preferences.cpp:641 #: ../src/ui/dialog/inkscape-preferences.cpp:1259 @@ -3346,11 +5202,11 @@ msgstr "" "<b>Поточний рівень заблоковано</b>. Розблокуйте його, щоб мати можливість " "креслити у ньому." -#: ../src/desktop.cpp:852 +#: ../src/desktop.cpp:859 msgid "No previous zoom." msgstr "Немає попереднього масштабу." -#: ../src/desktop.cpp:873 +#: ../src/desktop.cpp:880 msgid "No next zoom." msgstr "Немає наступного масштабу." @@ -3362,12 +5218,12 @@ msgstr "Створити напрямну" msgid "Move guide" msgstr "Пересунути напрямну" -#: ../src/desktop-events.cpp:477 ../src/desktop-events.cpp:535 +#: ../src/desktop-events.cpp:477 ../src/desktop-events.cpp:536 #: ../src/ui/dialog/guides.cpp:144 msgid "Delete guide" msgstr "Вилучити напрямну" -#: ../src/desktop-events.cpp:515 +#: ../src/desktop-events.cpp:516 #, c-format msgid "<b>Guideline</b>: %s" msgstr "<b>Напрямна</b>: %s" @@ -3737,21 +5593,21 @@ msgstr "Кратність проміжку між лініями сітки" msgid " to " msgstr " у " -#: ../src/document.cpp:507 +#: ../src/document.cpp:546 #, c-format msgid "New document %d" msgstr "Новий документ %d" -#: ../src/document.cpp:512 +#: ../src/document.cpp:551 #, c-format msgid "Memory document %d" msgstr "Документ у пам'яті %d" -#: ../src/document.cpp:541 +#: ../src/document.cpp:580 msgid "Memory document %1" msgstr "Документ у пам'яті %1" -#: ../src/document.cpp:752 +#: ../src/document.cpp:792 #, c-format msgid "Unnamed document %d" msgstr "Документ без назви %d" @@ -3954,10 +5810,7 @@ msgstr "Ширина:" msgid "Height:" msgstr "Висота:" -#. Label #: ../src/extension/internal/bitmap/adaptiveThreshold.cpp:43 -#: ../src/widgets/gradient-toolbar.cpp:1174 -#: ../src/widgets/gradient-vector.cpp:926 #: ../share/extensions/printing_marks.inx.h:12 msgid "Offset:" msgstr "Зсув:" @@ -4015,8 +5868,8 @@ msgstr "Додати шум" #: ../src/extension/internal/filter/color.h:1585 #: ../src/extension/internal/filter/distort.h:69 #: ../src/extension/internal/filter/morphology.h:60 ../src/rdf.cpp:244 -#: ../src/ui/dialog/filter-effects-dialog.cpp:2627 -#: ../src/ui/dialog/filter-effects-dialog.cpp:2706 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2833 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2907 #: ../src/ui/dialog/object-attributes.cpp:49 #: ../share/extensions/jessyInk_effects.inx.h:5 #: ../share/extensions/jessyInk_export.inx.h:3 @@ -4068,7 +5921,7 @@ msgstr "Розмиття" #: ../src/extension/internal/bitmap/oilPaint.cpp:39 #: ../src/extension/internal/bitmap/sharpen.cpp:40 #: ../src/extension/internal/bitmap/unsharpmask.cpp:43 -#: ../src/ui/dialog/filter-effects-dialog.cpp:2684 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2885 msgid "Radius:" msgstr "Радіус:" @@ -4404,7 +6257,7 @@ msgid "Opacity" msgstr "Непрозорість" #: ../src/extension/internal/bitmap/opacity.cpp:40 -#: ../src/ui/dialog/filter-effects-dialog.cpp:2674 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2875 #: ../src/widgets/dropper-toolbar.cpp:107 msgid "Opacity:" msgstr "Непрозорість:" @@ -4587,100 +6440,100 @@ msgid "PostScript" msgstr "PostScript" #: ../src/extension/internal/cairo-ps-out.cpp:329 -#: ../src/extension/internal/cairo-ps-out.cpp:370 +#: ../src/extension/internal/cairo-ps-out.cpp:368 msgid "Restrict to PS level:" msgstr "Обмежувати рівень PS:" #: ../src/extension/internal/cairo-ps-out.cpp:330 -#: ../src/extension/internal/cairo-ps-out.cpp:371 +#: ../src/extension/internal/cairo-ps-out.cpp:369 msgid "PostScript level 3" msgstr "PostScript рівень 3" -#: ../src/extension/internal/cairo-ps-out.cpp:332 -#: ../src/extension/internal/cairo-ps-out.cpp:373 +#: ../src/extension/internal/cairo-ps-out.cpp:331 +#: ../src/extension/internal/cairo-ps-out.cpp:370 msgid "PostScript level 2" msgstr "PostScript level 2" -#: ../src/extension/internal/cairo-ps-out.cpp:335 -#: ../src/extension/internal/cairo-ps-out.cpp:376 +#: ../src/extension/internal/cairo-ps-out.cpp:333 +#: ../src/extension/internal/cairo-ps-out.cpp:372 #: ../src/extension/internal/cairo-renderer-pdf-out.cpp:250 -#: ../src/extension/internal/emf-inout.cpp:3551 -#: ../src/extension/internal/wmf-inout.cpp:3236 +#: ../src/extension/internal/emf-inout.cpp:3520 +#: ../src/extension/internal/wmf-inout.cpp:3088 msgid "Convert texts to paths" msgstr "Перетворити текст на контури" -#: ../src/extension/internal/cairo-ps-out.cpp:336 +#: ../src/extension/internal/cairo-ps-out.cpp:334 msgid "PS+LaTeX: Omit text in PS, and create LaTeX file" msgstr "PS+LaTeX: пропустити текст у PS і створити файл LaTeX" -#: ../src/extension/internal/cairo-ps-out.cpp:337 -#: ../src/extension/internal/cairo-ps-out.cpp:378 +#: ../src/extension/internal/cairo-ps-out.cpp:335 +#: ../src/extension/internal/cairo-ps-out.cpp:374 #: ../src/extension/internal/cairo-renderer-pdf-out.cpp:252 msgid "Rasterize filter effects" msgstr "Растеризувати ефекти фільтрування" -#: ../src/extension/internal/cairo-ps-out.cpp:338 -#: ../src/extension/internal/cairo-ps-out.cpp:379 +#: ../src/extension/internal/cairo-ps-out.cpp:336 +#: ../src/extension/internal/cairo-ps-out.cpp:375 #: ../src/extension/internal/cairo-renderer-pdf-out.cpp:253 msgid "Resolution for rasterization (dpi):" msgstr "Роздільна здатність для растеризації (у точках на дюйм):" -#: ../src/extension/internal/cairo-ps-out.cpp:339 -#: ../src/extension/internal/cairo-ps-out.cpp:380 +#: ../src/extension/internal/cairo-ps-out.cpp:337 +#: ../src/extension/internal/cairo-ps-out.cpp:376 msgid "Output page size" msgstr "Розмір сторінки-результату" -#: ../src/extension/internal/cairo-ps-out.cpp:340 -#: ../src/extension/internal/cairo-ps-out.cpp:381 +#: ../src/extension/internal/cairo-ps-out.cpp:338 +#: ../src/extension/internal/cairo-ps-out.cpp:377 #: ../src/extension/internal/cairo-renderer-pdf-out.cpp:255 msgid "Use document's page size" msgstr "Використовувати розмір сторінки документа" -#: ../src/extension/internal/cairo-ps-out.cpp:341 -#: ../src/extension/internal/cairo-ps-out.cpp:382 +#: ../src/extension/internal/cairo-ps-out.cpp:339 +#: ../src/extension/internal/cairo-ps-out.cpp:378 #: ../src/extension/internal/cairo-renderer-pdf-out.cpp:256 msgid "Use exported object's size" msgstr "Використати розмір експортованого об’єкта" -#: ../src/extension/internal/cairo-ps-out.cpp:343 +#: ../src/extension/internal/cairo-ps-out.cpp:341 #: ../src/extension/internal/cairo-renderer-pdf-out.cpp:258 msgid "Bleed/margin (mm):" msgstr "Випуск під обрізання (у мм):" -#: ../src/extension/internal/cairo-ps-out.cpp:344 -#: ../src/extension/internal/cairo-ps-out.cpp:385 +#: ../src/extension/internal/cairo-ps-out.cpp:342 +#: ../src/extension/internal/cairo-ps-out.cpp:381 #: ../src/extension/internal/cairo-renderer-pdf-out.cpp:259 msgid "Limit export to the object with ID:" msgstr "Обмежити експорт об'єктом з вказаним ідентифікатором:" -#: ../src/extension/internal/cairo-ps-out.cpp:348 +#: ../src/extension/internal/cairo-ps-out.cpp:346 #: ../share/extensions/ps_input.inx.h:2 msgid "PostScript (*.ps)" msgstr "PostScript (*.ps)" -#: ../src/extension/internal/cairo-ps-out.cpp:349 +#: ../src/extension/internal/cairo-ps-out.cpp:347 msgid "PostScript File" msgstr "Файл Postscript" -#: ../src/extension/internal/cairo-ps-out.cpp:368 +#: ../src/extension/internal/cairo-ps-out.cpp:366 #: ../share/extensions/eps_input.inx.h:3 msgid "Encapsulated PostScript" msgstr "Інкапсульований PostScript" -#: ../src/extension/internal/cairo-ps-out.cpp:377 +#: ../src/extension/internal/cairo-ps-out.cpp:373 msgid "EPS+LaTeX: Omit text in EPS, and create LaTeX file" msgstr "EPS+LaTeX: пропустити текст у EPS і створити файл LaTeX" -#: ../src/extension/internal/cairo-ps-out.cpp:384 +#: ../src/extension/internal/cairo-ps-out.cpp:380 msgid "Bleed/margin (mm)" msgstr "Випуск/Поле під обрізання (у мм)" -#: ../src/extension/internal/cairo-ps-out.cpp:389 +#: ../src/extension/internal/cairo-ps-out.cpp:385 #: ../share/extensions/eps_input.inx.h:2 msgid "Encapsulated PostScript (*.eps)" msgstr "Інкапсульований PostScript (*.eps)" -#: ../src/extension/internal/cairo-ps-out.cpp:390 +#: ../src/extension/internal/cairo-ps-out.cpp:386 msgid "Encapsulated PostScript File" msgstr "Інкапсульований файл PostScript" @@ -4773,71 +6626,75 @@ msgstr "Файли обміну презентаціями Corel DRAW (*.cmx)" msgid "Open presentation exchange files saved in Corel DRAW" msgstr "Відкрити файли обміну презентаціями, збережені за допомогою Corel DRAW" -#: ../src/extension/internal/emf-inout.cpp:3535 +#: ../src/extension/internal/emf-inout.cpp:3504 msgid "EMF Input" msgstr "Імпорт EMF" -#: ../src/extension/internal/emf-inout.cpp:3540 +#: ../src/extension/internal/emf-inout.cpp:3509 msgid "Enhanced Metafiles (*.emf)" msgstr "Розширений метафайл (*.emf)" -#: ../src/extension/internal/emf-inout.cpp:3541 +#: ../src/extension/internal/emf-inout.cpp:3510 msgid "Enhanced Metafiles" msgstr "Розширені метафайли" -#: ../src/extension/internal/emf-inout.cpp:3549 +#: ../src/extension/internal/emf-inout.cpp:3518 msgid "EMF Output" msgstr "Експорт до EMF" -#: ../src/extension/internal/emf-inout.cpp:3552 -#: ../src/extension/internal/wmf-inout.cpp:3237 +#: ../src/extension/internal/emf-inout.cpp:3521 +#: ../src/extension/internal/wmf-inout.cpp:3089 msgid "Map Unicode to Symbol font" msgstr "Пов’язати Unicode зі шрифтом Symbol" -#: ../src/extension/internal/emf-inout.cpp:3553 -#: ../src/extension/internal/wmf-inout.cpp:3238 +#: ../src/extension/internal/emf-inout.cpp:3522 +#: ../src/extension/internal/wmf-inout.cpp:3090 msgid "Map Unicode to Wingdings" msgstr "Пов’язати Unicode з Wingdings" -#: ../src/extension/internal/emf-inout.cpp:3554 -#: ../src/extension/internal/wmf-inout.cpp:3239 +#: ../src/extension/internal/emf-inout.cpp:3523 +#: ../src/extension/internal/wmf-inout.cpp:3091 msgid "Map Unicode to Zapf Dingbats" msgstr "Пов’язати Unicode з Zapf Dingbats" -#: ../src/extension/internal/emf-inout.cpp:3555 -#: ../src/extension/internal/wmf-inout.cpp:3240 +#: ../src/extension/internal/emf-inout.cpp:3524 +#: ../src/extension/internal/wmf-inout.cpp:3092 msgid "Use MS Unicode PUA (0xF020-0xF0FF) for converted characters" msgstr "" "Використовувати для перетворених символів MS Unicode PUA (0xF020-0xF0FF)" -#: ../src/extension/internal/emf-inout.cpp:3556 -#: ../src/extension/internal/wmf-inout.cpp:3241 +#: ../src/extension/internal/emf-inout.cpp:3525 +#: ../src/extension/internal/wmf-inout.cpp:3093 msgid "Compensate for PPT font bug" msgstr "Компенсувати ваду щодо шрифтів у PPT" -#: ../src/extension/internal/emf-inout.cpp:3557 -#: ../src/extension/internal/wmf-inout.cpp:3242 +#: ../src/extension/internal/emf-inout.cpp:3526 +#: ../src/extension/internal/wmf-inout.cpp:3094 msgid "Convert dashed/dotted lines to single lines" msgstr "Перетворювати штрихову та пунктир у одну лінію" -#: ../src/extension/internal/emf-inout.cpp:3558 -#: ../src/extension/internal/wmf-inout.cpp:3243 +#: ../src/extension/internal/emf-inout.cpp:3527 +#: ../src/extension/internal/wmf-inout.cpp:3095 msgid "Convert gradients to colored polygon series" msgstr "Перетворити градієнти на послідовність кольорових багатокутників" -#: ../src/extension/internal/emf-inout.cpp:3559 +#: ../src/extension/internal/emf-inout.cpp:3528 +msgid "Use native rectangular linear gradients" +msgstr "Використовувати природні прямокутні лінійні градієнти" + +#: ../src/extension/internal/emf-inout.cpp:3529 msgid "Map all fill patterns to standard EMF hatches" msgstr "Пов’язати усі заповнення візерунками зі стандартними шаблонами EMF" -#: ../src/extension/internal/emf-inout.cpp:3560 +#: ../src/extension/internal/emf-inout.cpp:3530 msgid "Ignore image rotations" msgstr "Ігнорувати обертання зображення" -#: ../src/extension/internal/emf-inout.cpp:3564 +#: ../src/extension/internal/emf-inout.cpp:3534 msgid "Enhanced Metafile (*.emf)" msgstr "Розширений метафайл (*.emf)" -#: ../src/extension/internal/emf-inout.cpp:3565 +#: ../src/extension/internal/emf-inout.cpp:3535 msgid "Enhanced Metafile" msgstr "Розширений метафайл" @@ -4922,6 +6779,7 @@ msgstr "Колір підсвічення" #: ../src/extension/internal/filter/transparency.h:214 #: ../src/extension/internal/filter/transparency.h:287 #: ../src/extension/internal/filter/transparency.h:349 +#, c-format msgid "Filters" msgstr "Фільтри" @@ -5109,7 +6967,7 @@ msgstr "Ерозія" #: ../src/extension/internal/filter/blurs.h:336 #: ../src/extension/internal/filter/color.h:1205 #: ../src/extension/internal/filter/color.h:1317 -#: ../src/ui/dialog/document-properties.cpp:111 +#: ../src/ui/dialog/document-properties.cpp:112 msgid "Background color" msgstr "Колір тла" @@ -5275,13 +7133,13 @@ msgstr "Параметри віддаленого джерела" #: ../src/extension/internal/filter/bumps.h:110 #: ../src/extension/internal/filter/bumps.h:332 -#: ../src/ui/dialog/filter-effects-dialog.cpp:1001 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1195 msgid "Azimuth" msgstr "Азимут" #: ../src/extension/internal/filter/bumps.h:111 #: ../src/extension/internal/filter/bumps.h:333 -#: ../src/ui/dialog/filter-effects-dialog.cpp:1002 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1196 msgid "Elevation" msgstr "Висота" @@ -5502,11 +7360,13 @@ msgstr "Тотожність" #: ../src/extension/internal/filter/color.h:428 #: ../src/extension/internal/filter/paint.h:498 ../src/filter-enums.cpp:108 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1050 msgid "Table" msgstr "Табличний" #: ../src/extension/internal/filter/color.h:429 #: ../src/extension/internal/filter/paint.h:499 ../src/filter-enums.cpp:109 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1053 msgid "Discrete" msgstr "Дискретний" @@ -5700,6 +7560,7 @@ msgstr "Тіні" #: ../src/extension/internal/filter/paint.h:356 ../src/filter-enums.cpp:32 #: ../src/live_effects/effect.cpp:97 ../src/live_effects/lpe-offset.cpp:31 #: ../src/live_effects/lpe-parallel.cpp:50 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1047 #: ../src/widgets/gradient-toolbar.cpp:1174 msgid "Offset" msgstr "Зміщення" @@ -5986,8 +7847,8 @@ msgid "Detect:" msgstr "Позначити:" #: ../src/extension/internal/filter/image.h:52 -#: ../src/ui/dialog/template-load-tab.cpp:104 -#: ../src/ui/dialog/template-load-tab.cpp:141 +#: ../src/ui/dialog/template-load-tab.cpp:105 +#: ../src/ui/dialog/template-load-tab.cpp:142 msgid "All" msgstr "Всі" @@ -6264,7 +8125,7 @@ msgstr "" #: ../src/extension/internal/filter/paint.h:331 #: ../src/ui/dialog/align-and-distribute.cpp:1004 -#: ../src/widgets/desktop-widget.cpp:2007 +#: ../src/widgets/desktop-widget.cpp:1998 msgid "Drawing" msgstr "Малюнок" @@ -6552,7 +8413,7 @@ msgid "Background" msgstr "Тло" #: ../src/extension/internal/filter/transparency.h:59 -#: ../src/ui/dialog/filter-effects-dialog.cpp:2624 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2830 #: ../src/ui/dialog/input.cpp:1088 ../src/widgets/eraser-toolbar.cpp:123 #: ../src/widgets/pencil-toolbar.cpp:156 ../src/widgets/spray-toolbar.cpp:198 #: ../src/widgets/tweak-toolbar.cpp:268 ../share/extensions/extrude.inx.h:2 @@ -6607,20 +8468,24 @@ msgid "%s bitmap image import" msgstr "Імпортування растрового зображення %s" #: ../src/extension/internal/gdkpixbuf-input.cpp:176 +#, c-format msgid "Link or embed image:" msgstr "Пов'язати або вбудувати зображення:" #: ../src/extension/internal/gdkpixbuf-input.cpp:177 #: ../src/ui/dialog/inkscape-preferences.cpp:1445 +#, c-format msgid "Embed" msgstr "Вбудувати" #: ../src/extension/internal/gdkpixbuf-input.cpp:178 ../src/sp-anchor.cpp:119 #: ../src/ui/dialog/inkscape-preferences.cpp:1445 +#, c-format msgid "Link" msgstr "Пов'язати" #: ../src/extension/internal/gdkpixbuf-input.cpp:180 +#, c-format msgid "" "Embed results in stand-alone, larger SVG files. Link references a file " "outside this SVG document and all files must be moved together." @@ -6629,25 +8494,30 @@ msgstr "" "документом SVG і всі файли буде об'єднано у єдиному документі." #: ../src/extension/internal/gdkpixbuf-input.cpp:182 +#, c-format msgid "Scale image preference (image-rendering):" msgstr "Режим масштабування зображень (обробки зображення):" #: ../src/extension/internal/gdkpixbuf-input.cpp:183 #: ../src/ui/dialog/inkscape-preferences.cpp:1452 +#, c-format msgid "None (auto)" msgstr "Немає (автоматично)" #: ../src/extension/internal/gdkpixbuf-input.cpp:184 #: ../src/ui/dialog/inkscape-preferences.cpp:1452 +#, c-format msgid "Smooth (optimizeQuality)" msgstr "Згладжування (оптимальна якість)" #: ../src/extension/internal/gdkpixbuf-input.cpp:185 #: ../src/ui/dialog/inkscape-preferences.cpp:1452 +#, c-format msgid "Blocky (optimizeSpeed)" msgstr "Блоками (оптимальна швидкість)" #: ../src/extension/internal/gdkpixbuf-input.cpp:187 +#, c-format msgid "" "When an image is upscaled, apply smoothing or keep blocky (pixelated). (Will " "not work in all browsers.)" @@ -6657,11 +8527,13 @@ msgstr "" "(Працює не в усіх засобах перегляду.)" #: ../src/extension/internal/gdkpixbuf-input.cpp:189 +#, c-format msgid "Hide the dialog next time and always apply the same actions." msgstr "" "Не показувати це вікно наступного разу і завжди виконувати ті самі дії." #: ../src/extension/internal/gdkpixbuf-input.cpp:189 +#, c-format msgid "Don't ask again" msgstr "Більше не питати" @@ -6731,7 +8603,7 @@ msgid "Render" msgstr "Відтворення" #: ../src/extension/internal/grid.cpp:221 -#: ../src/ui/dialog/document-properties.cpp:151 +#: ../src/ui/dialog/document-properties.cpp:152 #: ../src/ui/dialog/inkscape-preferences.cpp:776 #: ../src/widgets/toolbox.cpp:1825 msgid "Grids" @@ -7052,33 +8924,33 @@ msgstr "Імпорт з VSDX" msgid "Microsoft Visio 2013 drawing (*.vsdx)" msgstr "Малюнок Microsoft Visio 2013 (*.vsdx)" -#: ../src/extension/internal/wmf-inout.cpp:3220 +#: ../src/extension/internal/wmf-inout.cpp:3072 msgid "WMF Input" msgstr "Імпорт WMF" -#: ../src/extension/internal/wmf-inout.cpp:3225 +#: ../src/extension/internal/wmf-inout.cpp:3077 msgid "Windows Metafiles (*.wmf)" msgstr "Метафайл Windows (*.wmf)" -#: ../src/extension/internal/wmf-inout.cpp:3226 +#: ../src/extension/internal/wmf-inout.cpp:3078 msgid "Windows Metafiles" msgstr "Метафайл Windows" -#: ../src/extension/internal/wmf-inout.cpp:3234 +#: ../src/extension/internal/wmf-inout.cpp:3086 msgid "WMF Output" msgstr "Експорт до WMF" -#: ../src/extension/internal/wmf-inout.cpp:3244 +#: ../src/extension/internal/wmf-inout.cpp:3096 msgid "Map all fill patterns to standard WMF hatches" msgstr "Пов’язати усі заповнення візерунками зі стандартними шаблонами WMF" -#: ../src/extension/internal/wmf-inout.cpp:3248 +#: ../src/extension/internal/wmf-inout.cpp:3100 #: ../share/extensions/wmf_input.inx.h:2 #: ../share/extensions/wmf_output.inx.h:2 msgid "Windows Metafile (*.wmf)" msgstr "Метафайл Windows (*.wmf)" -#: ../src/extension/internal/wmf-inout.cpp:3249 +#: ../src/extension/internal/wmf-inout.cpp:3101 msgid "Windows Metafile" msgstr "Метафайл Windows (WMF)" @@ -7114,7 +8986,7 @@ msgstr "типовий.svg" msgid "Broken links have been changed to point to existing files." msgstr "Помилкові посилання змінено так, щоб вони вказували на поточні файли." -#: ../src/file.cpp:331 ../src/file.cpp:1259 +#: ../src/file.cpp:331 ../src/file.cpp:1247 #, c-format msgid "Failed to load the requested file %s" msgstr "Не вдається завантажити потрібний файл %s" @@ -7125,28 +8997,27 @@ msgstr "" "Документ ще не був збережений. Неможливо повернутись до попереднього стану." #: ../src/file.cpp:363 -#, c-format -msgid "Changes will be lost! Are you sure you want to reload document %s?" +msgid "Changes will be lost! Are you sure you want to reload document %1?" msgstr "" -"Зміни будуть втрачені! Ви впевнені, що бажаєте завантажити документ %s знову?" +"Зміни буде втрачено! Ви впевнені, що бажаєте перезавантажити документ %1?" -#: ../src/file.cpp:392 +#: ../src/file.cpp:389 msgid "Document reverted." msgstr "Документ повернутий до попереднього стану." -#: ../src/file.cpp:394 +#: ../src/file.cpp:391 msgid "Document not reverted." msgstr "Документ не повернутий до попереднього стану." -#: ../src/file.cpp:544 +#: ../src/file.cpp:541 msgid "Select file to open" msgstr "Виберіть файл" -#: ../src/file.cpp:626 +#: ../src/file.cpp:623 msgid "Clean up document" msgstr "Очистити документ" -#: ../src/file.cpp:633 +#: ../src/file.cpp:630 #, c-format msgid "Removed <b>%i</b> unused definition in <defs>." msgid_plural "Removed <b>%i</b> unused definitions in <defs>." @@ -7154,11 +9025,11 @@ msgstr[0] "Вилучено <b>%i</b> непотрібний елемент у & msgstr[1] "Вилучено <b>%i</b> непотрібні елементи у <defs>." msgstr[2] "Вилучено <b>%i</b> непотрібних елементів у <defs>." -#: ../src/file.cpp:638 +#: ../src/file.cpp:635 msgid "No unused definitions in <defs>." msgstr "Немає непотрібних елементів у <defs>." -#: ../src/file.cpp:670 +#: ../src/file.cpp:667 #, c-format msgid "" "No Inkscape extension found to save document (%s). This may have been " @@ -7167,12 +9038,12 @@ msgstr "" "Не знайдено модуль збереження документа (%s). Можливо, невідомий суфікс " "назви файла." -#: ../src/file.cpp:671 ../src/file.cpp:679 ../src/file.cpp:687 -#: ../src/file.cpp:693 ../src/file.cpp:698 +#: ../src/file.cpp:668 ../src/file.cpp:676 ../src/file.cpp:684 +#: ../src/file.cpp:690 ../src/file.cpp:695 msgid "Document not saved." msgstr "Документ не збережено." -#: ../src/file.cpp:678 +#: ../src/file.cpp:675 #, c-format msgid "" "File %s is write protected. Please remove write protection and try again." @@ -7180,61 +9051,59 @@ msgstr "" "Файл %s захищено від запису. Будь ласка, зніміть захист від запису і " "повторіть спробу." -#: ../src/file.cpp:686 +#: ../src/file.cpp:683 #, c-format msgid "File %s could not be saved." msgstr "Файл %s неможливо зберегти." -#: ../src/file.cpp:716 ../src/file.cpp:718 +#: ../src/file.cpp:713 ../src/file.cpp:715 msgid "Document saved." msgstr "Документ збережено." #. We are saving for the first time; create a unique default filename -#: ../src/file.cpp:866 ../src/file.cpp:1422 -#, c-format -msgid "drawing%s" -msgstr "рисунок%s" +#: ../src/file.cpp:858 +msgid "drawing" +msgstr "рисунок" -#: ../src/file.cpp:872 -#, c-format -msgid "drawing-%d%s" -msgstr "рисунок-%d%s" +#: ../src/file.cpp:863 +msgid "drawing-%1" +msgstr "рисунок-%1" -#: ../src/file.cpp:876 -#, c-format -msgid "%s" -msgstr "%s" - -#: ../src/file.cpp:891 +#: ../src/file.cpp:880 msgid "Select file to save a copy to" msgstr "Оберіть файл для збереження копії" -#: ../src/file.cpp:893 +#: ../src/file.cpp:882 msgid "Select file to save to" msgstr "Виберіть файл для збереження" -#: ../src/file.cpp:999 ../src/file.cpp:1001 +#: ../src/file.cpp:987 ../src/file.cpp:989 msgid "No changes need to be saved." msgstr "Файл не було змінено. Збереження непотрібне." -#: ../src/file.cpp:1020 +#: ../src/file.cpp:1008 msgid "Saving document..." msgstr "Збереження документа…" -#: ../src/file.cpp:1256 ../src/ui/dialog/inkscape-preferences.cpp:1439 -#: ../src/ui/dialog/ocaldialogs.cpp:1245 +#: ../src/file.cpp:1244 ../src/ui/dialog/inkscape-preferences.cpp:1439 +#: ../src/ui/dialog/ocaldialogs.cpp:1246 msgid "Import" msgstr "Імпорт" -#: ../src/file.cpp:1306 +#: ../src/file.cpp:1294 msgid "Select file to import" msgstr "Виберіть файл для імпорту" -#: ../src/file.cpp:1444 +#: ../src/file.cpp:1410 +#, c-format +msgid "drawing%s" +msgstr "рисунок%s" + +#: ../src/file.cpp:1432 msgid "Select file to export to" msgstr "Оберіть файл для експорту" -#: ../src/file.cpp:1697 +#: ../src/file.cpp:1685 msgid "Import Clip Art" msgstr "Імпортування шаблонів" @@ -7401,7 +9270,7 @@ msgstr "Світліше" msgid "Arithmetic" msgstr "Арифметичний" -#: ../src/filter-enums.cpp:117 ../src/selection-chemistry.cpp:533 +#: ../src/filter-enums.cpp:117 ../src/selection-chemistry.cpp:534 msgid "Duplicate" msgstr "Дублювати" @@ -7441,7 +9310,7 @@ msgstr "Інвертувати кольори градієнта" msgid "Reverse gradient" msgstr "Обернути градієнт" -#: ../src/gradient-chemistry.cpp:1608 ../src/widgets/gradient-selector.cpp:228 +#: ../src/gradient-chemistry.cpp:1608 ../src/widgets/gradient-selector.cpp:245 msgid "Delete swatch" msgstr "Вилучити зразок" @@ -7691,6 +9560,12 @@ msgstr "" "\n" "Файл вже існує у «%s». Заміна призведе до перезапису його вмісту." +#: ../src/interface.cpp:1395 ../src/ui/dialog/export.cpp:1298 +#: ../src/widgets/desktop-widget.cpp:1127 +#: ../src/widgets/desktop-widget.cpp:1189 +msgid "_Cancel" +msgstr "_Скасувати" + #: ../src/interface.cpp:1396 ../share/extensions/web-set-att.inx.h:21 #: ../share/extensions/web-transmit-att.inx.h:19 msgid "Replace" @@ -7706,7 +9581,7 @@ msgid "Enter group #%1" msgstr "Увійти до групи №%1" #. Item dialog -#: ../src/interface.cpp:1644 ../src/verbs.cpp:2851 +#: ../src/interface.cpp:1644 ../src/verbs.cpp:2853 msgid "_Object Properties..." msgstr "В_ластивості об'єкта…" @@ -7844,12 +9719,12 @@ msgid "_Fill and Stroke..." msgstr "_Заповнення та штрих" #. Edit Text dialog -#: ../src/interface.cpp:2183 ../src/verbs.cpp:2833 +#: ../src/interface.cpp:2183 ../src/verbs.cpp:2835 msgid "_Text and Font..." msgstr "_Текст та шрифт…" #. Spellcheck dialog -#: ../src/interface.cpp:2189 ../src/verbs.cpp:2841 +#: ../src/interface.cpp:2189 ../src/verbs.cpp:2843 msgid "Check Spellin_g..." msgstr "Перевірити п_равопис…" @@ -8104,9 +9979,9 @@ msgstr "" #: ../src/libgdl/gdl-dock-notebook.c:132 #: ../src/ui/dialog/align-and-distribute.cpp:1003 -#: ../src/ui/dialog/document-properties.cpp:149 +#: ../src/ui/dialog/document-properties.cpp:150 #: ../src/ui/dialog/filedialogimpl-gtkmm.cpp:1551 -#: ../src/widgets/desktop-widget.cpp:2003 +#: ../src/widgets/desktop-widget.cpp:1994 #: ../share/extensions/voronoi2svg.inx.h:9 msgid "Page" msgstr "Сторінка" @@ -8118,7 +9993,7 @@ msgstr "Індекс поточної сторінки" #: ../src/libgdl/gdl-dock-object.c:125 #: ../src/ui/dialog/inkscape-preferences.cpp:1495 #: ../src/ui/widget/page-sizer.cpp:258 -#: ../src/widgets/gradient-selector.cpp:157 +#: ../src/widgets/gradient-selector.cpp:158 #: ../src/widgets/sp-xmlview-attr-list.cpp:54 msgid "Name" msgstr "Назва" @@ -8424,7 +10299,7 @@ msgstr "Лінійка" msgid "Power stroke" msgstr "Потужний штрих" -#: ../src/live_effects/effect.cpp:124 ../src/selection-chemistry.cpp:2790 +#: ../src/live_effects/effect.cpp:124 ../src/selection-chemistry.cpp:2797 msgid "Clone original path" msgstr "Клонувати початковий контур" @@ -8451,12 +10326,12 @@ msgstr "" "Будь ласка, вкажіть параметр контуру для геометричних побудов «%s» за " "допомогою %d клацань мишею" -#: ../src/live_effects/effect.cpp:632 +#: ../src/live_effects/effect.cpp:626 #, c-format msgid "Editing parameter <b>%s</b>." msgstr "Редагування параметра <b>%s</b>." -#: ../src/live_effects/effect.cpp:637 +#: ../src/live_effects/effect.cpp:631 msgid "None of the applied path effect's parameters can be edited on-canvas." msgstr "" "Жоден із застосованих параметрів ефекту контуру не можна редагувати на " @@ -8487,11 +10362,13 @@ msgid "Specifies the right end of the bisector" msgstr "Визначає довжину правої частини бісектриси" #: ../src/live_effects/lpe-angle_bisector.cpp:86 +#: ../src/live_effects/lpe-perp_bisector.cpp:159 msgid "Adjust the \"left\" end of the bisector" msgstr "Коригувати розташування «лівого» кінця бісектриси" #: ../src/live_effects/lpe-angle_bisector.cpp:92 -msgid "Adjust the \"right\" of the bisector" +#: ../src/live_effects/lpe-perp_bisector.cpp:165 +msgid "Adjust the \"right\" end of the bisector" msgstr "Коригувати розташування «правого» кінця бісектриси" #: ../src/live_effects/lpe-bendpath.cpp:53 @@ -8936,60 +10813,60 @@ msgstr "" "контуру траєкторії." #. initialise your parameters here: -#: ../src/live_effects/lpe-knot.cpp:347 +#: ../src/live_effects/lpe-knot.cpp:350 msgid "Fi_xed width:" msgstr "_Фіксована ширина:" -#: ../src/live_effects/lpe-knot.cpp:347 +#: ../src/live_effects/lpe-knot.cpp:350 msgid "Size of hidden region of lower string" msgstr "Розмір схованого фрагмента нижнього рядка" -#: ../src/live_effects/lpe-knot.cpp:348 +#: ../src/live_effects/lpe-knot.cpp:351 msgid "_In units of stroke width" msgstr "_У одиницях товщини штриха" -#: ../src/live_effects/lpe-knot.cpp:348 +#: ../src/live_effects/lpe-knot.cpp:351 msgid "Consider 'Interruption width' as a ratio of stroke width" msgstr "Обчислювати «ширину проміжку» відносно товщини штриха" -#: ../src/live_effects/lpe-knot.cpp:349 +#: ../src/live_effects/lpe-knot.cpp:352 msgid "St_roke width" msgstr "Тов_щина штриха" -#: ../src/live_effects/lpe-knot.cpp:349 +#: ../src/live_effects/lpe-knot.cpp:352 msgid "Add the stroke width to the interruption size" msgstr "Додати ширину штриха до розміру проміжку" -#: ../src/live_effects/lpe-knot.cpp:350 +#: ../src/live_effects/lpe-knot.cpp:353 msgid "_Crossing path stroke width" msgstr "Товщина штриха _контуру перетинання" -#: ../src/live_effects/lpe-knot.cpp:350 +#: ../src/live_effects/lpe-knot.cpp:353 msgid "Add crossed stroke width to the interruption size" msgstr "Додати ширину перпендикулярного штриха до розміру проміжку" -#: ../src/live_effects/lpe-knot.cpp:351 +#: ../src/live_effects/lpe-knot.cpp:354 msgid "S_witcher size:" msgstr "Розм_ір перемикача:" -#: ../src/live_effects/lpe-knot.cpp:351 +#: ../src/live_effects/lpe-knot.cpp:354 msgid "Orientation indicator/switcher size" msgstr "Розмір індикатора/перемикача орієнтації" -#: ../src/live_effects/lpe-knot.cpp:352 +#: ../src/live_effects/lpe-knot.cpp:355 msgid "Crossing Signs" msgstr "Знаки перехресть" -#: ../src/live_effects/lpe-knot.cpp:352 +#: ../src/live_effects/lpe-knot.cpp:355 msgid "Crossings signs" msgstr "Знаки перехресть" -#: ../src/live_effects/lpe-knot.cpp:617 +#: ../src/live_effects/lpe-knot.cpp:620 msgid "Drag to select a crossing, click to flip it" msgstr "Перетягніть, щоб вибрати перехрестя, клацніть, щоб віддзеркалити його" #. / @todo Is this the right verb? -#: ../src/live_effects/lpe-knot.cpp:655 +#: ../src/live_effects/lpe-knot.cpp:658 msgid "Change knot crossing" msgstr "Змінити перехрестя у вузлі" @@ -9193,7 +11070,7 @@ msgstr "Скоригувати «правий» кінець паралельн #: ../src/live_effects/lpe-path_length.cpp:26 #: ../src/live_effects/lpe-sketch.cpp:58 -#: ../src/ui/dialog/filter-effects-dialog.cpp:2668 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2869 #: ../share/extensions/render_alphabetsoup.inx.h:3 msgid "Scale:" msgstr "Масштаб:" @@ -9322,14 +11199,6 @@ msgid "Fuse ends closer than this number. 0 means don't fuse." msgstr "" "Об'єднувати кінці, ближчі за вказане значення. 0 означає «не об'єднувати»." -#: ../src/live_effects/lpe-perp_bisector.cpp:159 -msgid "Adjust the bisector's \"left\" end" -msgstr "Скоригувати «лівий» кінець бісектриси" - -#: ../src/live_effects/lpe-perp_bisector.cpp:165 -msgid "Adjust the bisector's \"right\" end" -msgstr "Скоригувати «правий» кінець бісектриси" - #. initialise your parameters here: #: ../src/live_effects/lpe-perspective_path.cpp:47 msgid "Scale x" @@ -10058,12 +11927,12 @@ msgstr "Змінити булівський параметр" msgid "Change enumeration parameter" msgstr "Зміна параметра нумерації" -#: ../src/live_effects/parameter/originalpath.cpp:70 -#: ../src/live_effects/parameter/path.cpp:194 +#: ../src/live_effects/parameter/originalpath.cpp:71 +#: ../src/live_effects/parameter/path.cpp:195 msgid "Link to path" msgstr "Пов'язати з контуром" -#: ../src/live_effects/parameter/originalpath.cpp:82 +#: ../src/live_effects/parameter/originalpath.cpp:83 msgid "Select original" msgstr "Позначити оригінал" @@ -10071,23 +11940,23 @@ msgstr "Позначити оригінал" msgid "Change scalar parameter" msgstr "Змінити скалярний параметр" -#: ../src/live_effects/parameter/path.cpp:164 +#: ../src/live_effects/parameter/path.cpp:165 msgid "Edit on-canvas" msgstr "Редагувати на полотні" -#: ../src/live_effects/parameter/path.cpp:174 +#: ../src/live_effects/parameter/path.cpp:175 msgid "Copy path" msgstr "Копіювати контур" -#: ../src/live_effects/parameter/path.cpp:184 +#: ../src/live_effects/parameter/path.cpp:185 msgid "Paste path" msgstr "Вставити контур" -#: ../src/live_effects/parameter/path.cpp:437 +#: ../src/live_effects/parameter/path.cpp:438 msgid "Paste path parameter" msgstr "Вставити параметр контуру" -#: ../src/live_effects/parameter/path.cpp:469 +#: ../src/live_effects/parameter/path.cpp:470 msgid "Link path parameter to path" msgstr "Пов'язати параметр контуру з контуром" @@ -10434,7 +12303,7 @@ msgstr "ІД-ОБ'ЄКТА" msgid "Start Inkscape in interactive shell mode." msgstr "Запустити Inkscape у режимі інтерактивної оболонки." -#: ../src/main.cpp:868 ../src/main.cpp:1267 +#: ../src/main.cpp:871 ../src/main.cpp:1270 msgid "" "[OPTIONS...] [FILE...]\n" "\n" @@ -10987,17 +12856,17 @@ msgstr "XML-фрагмент RDF-розділу «Ліцензія»" msgid "Fixup broken links" msgstr "Виправлення помилкових посилань" -#: ../src/selection-chemistry.cpp:394 +#: ../src/selection-chemistry.cpp:395 msgid "Delete text" msgstr "Вилучити текст" -#: ../src/selection-chemistry.cpp:402 +#: ../src/selection-chemistry.cpp:403 msgid "<b>Nothing</b> was deleted." msgstr "<b>Нічого</b> не було вилучено." -#: ../src/selection-chemistry.cpp:421 +#: ../src/selection-chemistry.cpp:422 #: ../src/ui/dialog/calligraphic-profile-rename.cpp:75 -#: ../src/ui/dialog/swatches.cpp:278 ../src/ui/tools/text-tool.cpp:994 +#: ../src/ui/dialog/swatches.cpp:278 ../src/ui/tools/text-tool.cpp:995 #: ../src/widgets/eraser-toolbar.cpp:110 #: ../src/widgets/gradient-toolbar.cpp:1196 #: ../src/widgets/gradient-toolbar.cpp:1210 @@ -11006,249 +12875,249 @@ msgstr "<b>Нічого</b> не було вилучено." msgid "Delete" msgstr "Вилучити" -#: ../src/selection-chemistry.cpp:449 +#: ../src/selection-chemistry.cpp:450 msgid "Select <b>object(s)</b> to duplicate." msgstr "Позначте <b>об'єкт(и)</b> для дублювання." -#: ../src/selection-chemistry.cpp:558 +#: ../src/selection-chemistry.cpp:559 msgid "Delete all" msgstr "Вилучити все" -#: ../src/selection-chemistry.cpp:748 +#: ../src/selection-chemistry.cpp:749 msgid "Select <b>some objects</b> to group." msgstr "Позначте <b>два або більше об'єктів</b> для групування." -#: ../src/selection-chemistry.cpp:763 ../src/sp-item-group.cpp:331 +#: ../src/selection-chemistry.cpp:764 ../src/sp-item-group.cpp:331 msgid "Group" msgstr "Згрупувати" -#: ../src/selection-chemistry.cpp:772 +#: ../src/selection-chemistry.cpp:773 msgid "Select a <b>group</b> to ungroup." msgstr "Позначте <b>групу</b> для розгрупування." -#: ../src/selection-chemistry.cpp:815 +#: ../src/selection-chemistry.cpp:816 msgid "<b>No groups</b> to ungroup in the selection." msgstr "У позначеному <b>немає груп</b>." -#: ../src/selection-chemistry.cpp:821 ../src/sp-item-group.cpp:564 +#: ../src/selection-chemistry.cpp:822 ../src/sp-item-group.cpp:564 msgid "Ungroup" msgstr "Розгрупувати" -#: ../src/selection-chemistry.cpp:902 +#: ../src/selection-chemistry.cpp:903 msgid "Select <b>object(s)</b> to raise." msgstr "Оберіть <b>об'єкт(и)</b> для підняття." -#: ../src/selection-chemistry.cpp:908 ../src/selection-chemistry.cpp:964 -#: ../src/selection-chemistry.cpp:992 ../src/selection-chemistry.cpp:1053 +#: ../src/selection-chemistry.cpp:909 ../src/selection-chemistry.cpp:965 +#: ../src/selection-chemistry.cpp:993 ../src/selection-chemistry.cpp:1054 msgid "" "You cannot raise/lower objects from <b>different groups</b> or <b>layers</b>." msgstr "" "Не можна піднімати/опускати об'єкти з <b>різних груп</b> чи <b>шарів</b>." #. TRANSLATORS: "Raise" means "to raise an object" in the undo history -#: ../src/selection-chemistry.cpp:948 +#: ../src/selection-chemistry.cpp:949 msgctxt "Undo action" msgid "Raise" msgstr "підняття" -#: ../src/selection-chemistry.cpp:956 +#: ../src/selection-chemistry.cpp:957 msgid "Select <b>object(s)</b> to raise to top." msgstr "Позначте <b>об'єкт(и)</b> для піднімання нагору." -#: ../src/selection-chemistry.cpp:979 +#: ../src/selection-chemistry.cpp:980 msgid "Raise to top" msgstr "Підняти на передній план" -#: ../src/selection-chemistry.cpp:986 +#: ../src/selection-chemistry.cpp:987 msgid "Select <b>object(s)</b> to lower." msgstr "Позначте <b>об'єкт(и)</b> для опускання." #. TRANSLATORS: "Lower" means "to lower an object" in the undo history -#: ../src/selection-chemistry.cpp:1037 +#: ../src/selection-chemistry.cpp:1038 msgctxt "Undo action" msgid "Lower" msgstr "опускання" -#: ../src/selection-chemistry.cpp:1045 +#: ../src/selection-chemistry.cpp:1046 msgid "Select <b>object(s)</b> to lower to bottom." msgstr "Позначте <b>об'єкт(и)</b> для опускання на низ." -#: ../src/selection-chemistry.cpp:1080 +#: ../src/selection-chemistry.cpp:1081 msgid "Lower to bottom" msgstr "Опустити на задній план" -#: ../src/selection-chemistry.cpp:1087 +#: ../src/selection-chemistry.cpp:1091 msgid "Nothing to undo." msgstr "Немає операцій, що можна скасувати." -#: ../src/selection-chemistry.cpp:1095 +#: ../src/selection-chemistry.cpp:1102 msgid "Nothing to redo." msgstr "Немає операцій, що можна вернути." -#: ../src/selection-chemistry.cpp:1162 +#: ../src/selection-chemistry.cpp:1169 msgid "Paste" msgstr "Вставити" -#: ../src/selection-chemistry.cpp:1170 +#: ../src/selection-chemistry.cpp:1177 msgid "Paste style" msgstr "Вставити стиль" -#: ../src/selection-chemistry.cpp:1180 +#: ../src/selection-chemistry.cpp:1187 msgid "Paste live path effect" msgstr "Вставити ефект динамічного контуру" -#: ../src/selection-chemistry.cpp:1202 +#: ../src/selection-chemistry.cpp:1209 msgid "Select <b>object(s)</b> to remove live path effects from." msgstr "Оберіть <b>об'єкт(и)</b> для вилучення анімованих ефектів контурів." -#: ../src/selection-chemistry.cpp:1214 +#: ../src/selection-chemistry.cpp:1221 msgid "Remove live path effect" msgstr "Вилучити анімований ефект контуру" -#: ../src/selection-chemistry.cpp:1225 +#: ../src/selection-chemistry.cpp:1232 msgid "Select <b>object(s)</b> to remove filters from." msgstr "Виберіть <b>об'єкт(и)</b>, з яких слід вилучити фільтри." -#: ../src/selection-chemistry.cpp:1235 -#: ../src/ui/dialog/filter-effects-dialog.cpp:1462 +#: ../src/selection-chemistry.cpp:1242 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1669 msgid "Remove filter" msgstr "Вилучити фільтр" -#: ../src/selection-chemistry.cpp:1244 +#: ../src/selection-chemistry.cpp:1251 msgid "Paste size" msgstr "Вставити розмір" -#: ../src/selection-chemistry.cpp:1253 +#: ../src/selection-chemistry.cpp:1260 msgid "Paste size separately" msgstr "Вставити розмір окремо" -#: ../src/selection-chemistry.cpp:1263 +#: ../src/selection-chemistry.cpp:1270 msgid "Select <b>object(s)</b> to move to the layer above." msgstr "Позначте <b>об'єкти</b> для переміщення на шар вище." -#: ../src/selection-chemistry.cpp:1289 +#: ../src/selection-chemistry.cpp:1296 msgid "Raise to next layer" msgstr "Піднятися на наступний шар" -#: ../src/selection-chemistry.cpp:1296 +#: ../src/selection-chemistry.cpp:1303 msgid "No more layers above." msgstr "Більше немає вищих шарів." -#: ../src/selection-chemistry.cpp:1308 +#: ../src/selection-chemistry.cpp:1315 msgid "Select <b>object(s)</b> to move to the layer below." msgstr "Позначте <b>об'єкти</b> для переміщення на шар нижче." -#: ../src/selection-chemistry.cpp:1334 +#: ../src/selection-chemistry.cpp:1341 msgid "Lower to previous layer" msgstr "Опуститися на попередній шар" -#: ../src/selection-chemistry.cpp:1341 +#: ../src/selection-chemistry.cpp:1348 msgid "No more layers below." msgstr "Немає нижчого шару." -#: ../src/selection-chemistry.cpp:1353 +#: ../src/selection-chemistry.cpp:1360 msgid "Select <b>object(s)</b> to move." msgstr "Позначте <b>об'єкти</b> для пересування." -#: ../src/selection-chemistry.cpp:1370 ../src/verbs.cpp:2581 +#: ../src/selection-chemistry.cpp:1377 ../src/verbs.cpp:2581 msgid "Move selection to layer" msgstr "Пересунути позначене до шару" -#: ../src/selection-chemistry.cpp:1594 +#: ../src/selection-chemistry.cpp:1601 msgid "Remove transform" msgstr "Прибрати трансформацію" -#: ../src/selection-chemistry.cpp:1697 +#: ../src/selection-chemistry.cpp:1704 msgid "Rotate 90° CCW" msgstr "Обернути на 90° проти годинникової стрілки" -#: ../src/selection-chemistry.cpp:1697 +#: ../src/selection-chemistry.cpp:1704 msgid "Rotate 90° CW" msgstr "Обернути на 90° за годинниковою стрілкою" -#: ../src/selection-chemistry.cpp:1718 ../src/seltrans.cpp:468 -#: ../src/ui/dialog/transformation.cpp:893 +#: ../src/selection-chemistry.cpp:1725 ../src/seltrans.cpp:468 +#: ../src/ui/dialog/transformation.cpp:894 msgid "Rotate" msgstr "Обертати" -#: ../src/selection-chemistry.cpp:2097 +#: ../src/selection-chemistry.cpp:2104 msgid "Rotate by pixels" msgstr "Обертати поточково" -#: ../src/selection-chemistry.cpp:2127 ../src/seltrans.cpp:465 -#: ../src/ui/dialog/transformation.cpp:868 +#: ../src/selection-chemistry.cpp:2134 ../src/seltrans.cpp:465 +#: ../src/ui/dialog/transformation.cpp:869 #: ../share/extensions/interp_att_g.inx.h:12 msgid "Scale" msgstr "Масштабувати" -#: ../src/selection-chemistry.cpp:2152 +#: ../src/selection-chemistry.cpp:2159 msgid "Scale by whole factor" msgstr "Масштабувати за повним коефіцієнтом" -#: ../src/selection-chemistry.cpp:2167 +#: ../src/selection-chemistry.cpp:2174 msgid "Move vertically" msgstr "Перемістити вертикально" -#: ../src/selection-chemistry.cpp:2170 +#: ../src/selection-chemistry.cpp:2177 msgid "Move horizontally" msgstr "Перемістити горизонтально" -#: ../src/selection-chemistry.cpp:2173 ../src/selection-chemistry.cpp:2199 +#: ../src/selection-chemistry.cpp:2180 ../src/selection-chemistry.cpp:2206 #: ../src/seltrans.cpp:462 ../src/ui/dialog/transformation.cpp:807 msgid "Move" msgstr "Перемістити" -#: ../src/selection-chemistry.cpp:2193 +#: ../src/selection-chemistry.cpp:2200 msgid "Move vertically by pixels" msgstr "Перемістити вертикально поточково" -#: ../src/selection-chemistry.cpp:2196 +#: ../src/selection-chemistry.cpp:2203 msgid "Move horizontally by pixels" msgstr "Перемістити горизонтально поточково" -#: ../src/selection-chemistry.cpp:2328 +#: ../src/selection-chemistry.cpp:2335 msgid "The selection has no applied path effect." msgstr "Обране не має застосованого ефекту контуру." -#: ../src/selection-chemistry.cpp:2497 ../src/ui/dialog/clonetiler.cpp:2218 +#: ../src/selection-chemistry.cpp:2504 ../src/ui/dialog/clonetiler.cpp:2218 msgid "Select an <b>object</b> to clone." msgstr "Позначте <b>об'єкт</b> для клонування." -#: ../src/selection-chemistry.cpp:2533 +#: ../src/selection-chemistry.cpp:2540 msgctxt "Action" msgid "Clone" msgstr "Клонувати" -#: ../src/selection-chemistry.cpp:2549 +#: ../src/selection-chemistry.cpp:2556 msgid "Select <b>clones</b> to relink." msgstr "Позначте <b>клон</b> для перез'єднання." -#: ../src/selection-chemistry.cpp:2556 +#: ../src/selection-chemistry.cpp:2563 msgid "Copy an <b>object</b> to clipboard to relink clones to." msgstr "" "Копіювати <b>об'єкт</b> до буфера обміну інформації для перез'єднання клонів." -#: ../src/selection-chemistry.cpp:2580 +#: ../src/selection-chemistry.cpp:2587 msgid "<b>No clones to relink</b> in the selection." msgstr "У позначеному <b>немає клонів для перез'єднання</b>." -#: ../src/selection-chemistry.cpp:2583 +#: ../src/selection-chemistry.cpp:2590 msgid "Relink clone" msgstr "Перез'єднати клон" -#: ../src/selection-chemistry.cpp:2597 +#: ../src/selection-chemistry.cpp:2604 msgid "Select <b>clones</b> to unlink." msgstr "Позначте <b>клон</b> для від'єднання." -#: ../src/selection-chemistry.cpp:2651 +#: ../src/selection-chemistry.cpp:2658 msgid "<b>No clones to unlink</b> in the selection." msgstr "У позначеному <b>немає клонів</b>." -#: ../src/selection-chemistry.cpp:2655 +#: ../src/selection-chemistry.cpp:2662 msgid "Unlink clone" msgstr "Від'єднати клон" -#: ../src/selection-chemistry.cpp:2668 +#: ../src/selection-chemistry.cpp:2675 msgid "" "Select a <b>clone</b> to go to its original. Select a <b>linked offset</b> " "to go to its source. Select a <b>text on path</b> to go to the path. Select " @@ -11258,7 +13127,7 @@ msgstr "" "перейти до її контуру; <b>текст вздовж контуру</b>, щоб перейти до його " "контуру. Позначте <b>текст у рамці</b>, щоб перейти до рамки." -#: ../src/selection-chemistry.cpp:2701 +#: ../src/selection-chemistry.cpp:2708 msgid "" "<b>Cannot find</b> the object to select (orphaned clone, offset, textpath, " "flowed text?)" @@ -11266,7 +13135,7 @@ msgstr "" "<b>Не вдається знайти</b> об'єкт, що позначається (осиротілий клон, втяжка, " "текст вздовж контуру чи текст у рамці?)" -#: ../src/selection-chemistry.cpp:2707 +#: ../src/selection-chemistry.cpp:2714 msgid "" "The object you're trying to select is <b>not visible</b> (it is in <" "defs>)" @@ -11274,135 +13143,135 @@ msgstr "" "Об'єкт, який ви намагаєтесь позначити, є <b>невидимим</b> (знаходиться у <" "defs>)" -#: ../src/selection-chemistry.cpp:2752 +#: ../src/selection-chemistry.cpp:2759 msgid "Select <b>one</b> path to clone." msgstr "Позначте <b>один</b> контур для клонування." -#: ../src/selection-chemistry.cpp:2756 +#: ../src/selection-chemistry.cpp:2763 msgid "Select one <b>path</b> to clone." msgstr "Позначте один <b>контур</b> для клонування." -#: ../src/selection-chemistry.cpp:2811 +#: ../src/selection-chemistry.cpp:2819 msgid "Select <b>object(s)</b> to convert to marker." msgstr "Позначте <b>об'єкт(и)</b> для перетворення у маркер." -#: ../src/selection-chemistry.cpp:2879 +#: ../src/selection-chemistry.cpp:2886 msgid "Objects to marker" msgstr "Об'єкти у маркер" -#: ../src/selection-chemistry.cpp:2903 +#: ../src/selection-chemistry.cpp:2910 msgid "Select <b>object(s)</b> to convert to guides." msgstr "Позначте <b>об'єкт(и)</b> для перетворення у напрямні." -#: ../src/selection-chemistry.cpp:2926 +#: ../src/selection-chemistry.cpp:2933 msgid "Objects to guides" msgstr "Об'єкти у напрямні" -#: ../src/selection-chemistry.cpp:2945 +#: ../src/selection-chemistry.cpp:2952 msgid "Select <b>groups</b> to convert to symbols." msgstr "Позначте <b>групи</b> для перетворення на символи." -#: ../src/selection-chemistry.cpp:2965 +#: ../src/selection-chemistry.cpp:2972 msgid "No <b>groups</b> converted to symbols." msgstr "На символи не перетвореною жодної <b>групи</b>." #. Group just disappears, nothing to select. -#: ../src/selection-chemistry.cpp:2972 +#: ../src/selection-chemistry.cpp:2979 msgid "Group to symbol" msgstr "Групу у символ" -#: ../src/selection-chemistry.cpp:3038 +#: ../src/selection-chemistry.cpp:3045 msgid "Select a <b>symbol</b> to extract objects from." msgstr "Позначте <b>символ</b> для видобування з нього об’єктів." -#: ../src/selection-chemistry.cpp:3047 +#: ../src/selection-chemistry.cpp:3054 msgid "Select only one <b>symbol</b> to convert to group." msgstr "Позначте лише один <b>символ</b> для перетворення на групу." -#: ../src/selection-chemistry.cpp:3088 +#: ../src/selection-chemistry.cpp:3096 msgid "Group from symbol" msgstr "Група з символу" -#: ../src/selection-chemistry.cpp:3105 +#: ../src/selection-chemistry.cpp:3114 msgid "Select <b>object(s)</b> to convert to pattern." msgstr "Позначте <b>об'єкт(и)</b> для перетворення у візерунок." -#: ../src/selection-chemistry.cpp:3195 +#: ../src/selection-chemistry.cpp:3204 msgid "Objects to pattern" msgstr "Об'єкти у візерунок" -#: ../src/selection-chemistry.cpp:3211 +#: ../src/selection-chemistry.cpp:3220 msgid "Select an <b>object with pattern fill</b> to extract objects from." msgstr "" "Позначте <b>об'єкт із заповненням візерунком</b> для витягування об'єктів з " "нього." -#: ../src/selection-chemistry.cpp:3266 +#: ../src/selection-chemistry.cpp:3275 msgid "<b>No pattern fills</b> in the selection." msgstr "У позначеному <b>немає заповнення візерунком</b>." -#: ../src/selection-chemistry.cpp:3269 +#: ../src/selection-chemistry.cpp:3278 msgid "Pattern to objects" msgstr "Візерунок у об'єкти" -#: ../src/selection-chemistry.cpp:3360 +#: ../src/selection-chemistry.cpp:3369 msgid "Select <b>object(s)</b> to make a bitmap copy." msgstr "Позначте <b>об'єкти</b> для створення їхньої растрової копії." -#: ../src/selection-chemistry.cpp:3364 +#: ../src/selection-chemistry.cpp:3373 msgid "Rendering bitmap..." msgstr "Показ растрового зображення…" -#: ../src/selection-chemistry.cpp:3543 +#: ../src/selection-chemistry.cpp:3552 msgid "Create bitmap" msgstr "Створення растрового зображення" -#: ../src/selection-chemistry.cpp:3575 +#: ../src/selection-chemistry.cpp:3584 msgid "Select <b>object(s)</b> to create clippath or mask from." msgstr "" "Оберіть <b>об'єкт(и)</b> для створення з них контуру вирізання або маски." -#: ../src/selection-chemistry.cpp:3578 +#: ../src/selection-chemistry.cpp:3587 msgid "Select mask object and <b>object(s)</b> to apply clippath or mask to." msgstr "" "Оберіть об'єкт-маску та <b>об'єкт(и)</b> для застосування вирізання або " "маскування." -#: ../src/selection-chemistry.cpp:3761 +#: ../src/selection-chemistry.cpp:3770 msgid "Set clipping path" msgstr "Задати контур вирізання" -#: ../src/selection-chemistry.cpp:3763 +#: ../src/selection-chemistry.cpp:3772 msgid "Set mask" msgstr "Задати маску" -#: ../src/selection-chemistry.cpp:3778 +#: ../src/selection-chemistry.cpp:3787 msgid "Select <b>object(s)</b> to remove clippath or mask from." msgstr "" "Оберіть <b>об'єкт(и)</b> для вилучення контуру вирізання або маскування." -#: ../src/selection-chemistry.cpp:3889 +#: ../src/selection-chemistry.cpp:3898 msgid "Release clipping path" msgstr "Від'єднати закріплений контур" -#: ../src/selection-chemistry.cpp:3891 +#: ../src/selection-chemistry.cpp:3900 msgid "Release mask" msgstr "Маску знято" -#: ../src/selection-chemistry.cpp:3910 +#: ../src/selection-chemistry.cpp:3919 msgid "Select <b>object(s)</b> to fit canvas to." msgstr "Оберіть <b>об'єкт(и)</b> для підбирання їхніх розмірів під полотно." #. Fit Page -#: ../src/selection-chemistry.cpp:3930 ../src/verbs.cpp:2907 +#: ../src/selection-chemistry.cpp:3939 ../src/verbs.cpp:2909 msgid "Fit Page to Selection" msgstr "Підігнати полотно до позначеної області" -#: ../src/selection-chemistry.cpp:3959 ../src/verbs.cpp:2909 +#: ../src/selection-chemistry.cpp:3968 ../src/verbs.cpp:2911 msgid "Fit Page to Drawing" msgstr "Підігнати полотно під намальоване" -#: ../src/selection-chemistry.cpp:3980 ../src/verbs.cpp:2911 +#: ../src/selection-chemistry.cpp:3989 ../src/verbs.cpp:2913 msgid "Fit Page to Selection or Drawing" msgstr "Підігнати полотно під позначену область чи область креслення" @@ -11493,7 +13362,7 @@ msgstr[0] "; <i>%d фільтрований об'єкт</i> " msgstr[1] "; <i>%d фільтровані об'єкти</i> " msgstr[2] "; <i>%d фільтрованих об'єктів</i> " -#: ../src/seltrans.cpp:471 ../src/ui/dialog/transformation.cpp:981 +#: ../src/seltrans.cpp:471 ../src/ui/dialog/transformation.cpp:982 msgid "Skew" msgstr "Нахил" @@ -11647,7 +13516,7 @@ msgid "Linked Flowed Text" msgstr "Пов’язаний контурний текст" #: ../src/sp-flowtext.cpp:298 ../src/sp-text.cpp:357 -#: ../src/ui/tools/text-tool.cpp:1599 +#: ../src/ui/tools/text-tool.cpp:1600 msgid " [truncated]" msgstr " (обрізано)" @@ -12067,15 +13936,15 @@ msgstr "У позначеному <b>немає тексту на контурі msgid "Remove text from path" msgstr "Зняти текст з контуру" -#: ../src/text-chemistry.cpp:261 ../src/text-chemistry.cpp:282 +#: ../src/text-chemistry.cpp:262 ../src/text-chemistry.cpp:283 msgid "Select <b>text(s)</b> to remove kerns from." msgstr "Позначте <b>текст</b> для вилучення ручного міжлітерного інтервалу." -#: ../src/text-chemistry.cpp:285 +#: ../src/text-chemistry.cpp:286 msgid "Remove manual kerns" msgstr "Вилучити ручний міжлітерний інтервал" -#: ../src/text-chemistry.cpp:305 +#: ../src/text-chemistry.cpp:306 msgid "" "Select <b>a text</b> and one or more <b>paths or shapes</b> to flow text " "into frame." @@ -12083,31 +13952,31 @@ msgstr "" "Позначте <b>текст</b> та <b>контур чи фігуру</b> для розміщення тексту у " "рамку." -#: ../src/text-chemistry.cpp:375 +#: ../src/text-chemistry.cpp:376 msgid "Flow text into shape" msgstr "Верстання тексту у фігуру" -#: ../src/text-chemistry.cpp:397 +#: ../src/text-chemistry.cpp:398 msgid "Select <b>a flowed text</b> to unflow it." msgstr "Позначте <b>текст у рамці</b>, щоб вийняти його з рамки." -#: ../src/text-chemistry.cpp:471 +#: ../src/text-chemistry.cpp:472 msgid "Unflow flowed text" msgstr "Зробити текст неконтурним" -#: ../src/text-chemistry.cpp:483 +#: ../src/text-chemistry.cpp:484 msgid "Select <b>flowed text(s)</b> to convert." msgstr "Оберіть <b>контурний текст(и)</b> для перетворення." -#: ../src/text-chemistry.cpp:501 +#: ../src/text-chemistry.cpp:502 msgid "The flowed text(s) must be <b>visible</b> in order to be converted." msgstr "Для перетворення Текст-вздовж-контуру має бути <b>видимим</b>." -#: ../src/text-chemistry.cpp:529 +#: ../src/text-chemistry.cpp:530 msgid "Convert flowed text to text" msgstr "Перетворення контурного тексту на звичайний" -#: ../src/text-chemistry.cpp:534 +#: ../src/text-chemistry.cpp:535 msgid "<b>No flowed text(s)</b> to convert in the selection." msgstr "У позначеному <b>немає контурного тексту(ів)</b> для перетворення." @@ -12207,7 +14076,7 @@ msgstr "" "напрямної, <b>Клавіші-стрілки</b> — налаштування товщини (ліворуч/праворуч) " "і кута (вгору/вниз)." -#: ../src/tools-switch.cpp:103 ../src/ui/tools/text-tool.cpp:1626 +#: ../src/tools-switch.cpp:103 ../src/ui/tools/text-tool.cpp:1627 msgid "" "<b>Click</b> to select or create text, <b>drag</b> to create flowed text; " "then type." @@ -12493,53 +14362,53 @@ msgid "_Treat selection as group: " msgstr "Вва_жати вибране групою: " #. Align -#: ../src/ui/dialog/align-and-distribute.cpp:877 ../src/verbs.cpp:2939 -#: ../src/verbs.cpp:2940 +#: ../src/ui/dialog/align-and-distribute.cpp:877 ../src/verbs.cpp:2941 +#: ../src/verbs.cpp:2942 msgid "Align right edges of objects to the left edge of the anchor" msgstr "Вирівняти праві краї об'єктів до лівого краю якоря" -#: ../src/ui/dialog/align-and-distribute.cpp:880 ../src/verbs.cpp:2941 -#: ../src/verbs.cpp:2942 +#: ../src/ui/dialog/align-and-distribute.cpp:880 ../src/verbs.cpp:2943 +#: ../src/verbs.cpp:2944 msgid "Align left edges" msgstr "Вирівняти ліві сторони" -#: ../src/ui/dialog/align-and-distribute.cpp:883 ../src/verbs.cpp:2943 -#: ../src/verbs.cpp:2944 +#: ../src/ui/dialog/align-and-distribute.cpp:883 ../src/verbs.cpp:2945 +#: ../src/verbs.cpp:2946 msgid "Center on vertical axis" msgstr "Центрувати за вертикальною віссю" -#: ../src/ui/dialog/align-and-distribute.cpp:886 ../src/verbs.cpp:2945 -#: ../src/verbs.cpp:2946 +#: ../src/ui/dialog/align-and-distribute.cpp:886 ../src/verbs.cpp:2947 +#: ../src/verbs.cpp:2948 msgid "Align right sides" msgstr "Вирівняти праві сторони" -#: ../src/ui/dialog/align-and-distribute.cpp:889 ../src/verbs.cpp:2947 -#: ../src/verbs.cpp:2948 +#: ../src/ui/dialog/align-and-distribute.cpp:889 ../src/verbs.cpp:2949 +#: ../src/verbs.cpp:2950 msgid "Align left edges of objects to the right edge of the anchor" msgstr "Вирівняти ліві краї об'єктів до правого краю якоря" -#: ../src/ui/dialog/align-and-distribute.cpp:892 ../src/verbs.cpp:2949 -#: ../src/verbs.cpp:2950 +#: ../src/ui/dialog/align-and-distribute.cpp:892 ../src/verbs.cpp:2951 +#: ../src/verbs.cpp:2952 msgid "Align bottom edges of objects to the top edge of the anchor" msgstr "Вирівняти нижні краї об'єктів до верхнього краю якоря" -#: ../src/ui/dialog/align-and-distribute.cpp:895 ../src/verbs.cpp:2951 -#: ../src/verbs.cpp:2952 +#: ../src/ui/dialog/align-and-distribute.cpp:895 ../src/verbs.cpp:2953 +#: ../src/verbs.cpp:2954 msgid "Align top edges" msgstr "Вирівняти верхні сторони" -#: ../src/ui/dialog/align-and-distribute.cpp:898 ../src/verbs.cpp:2953 -#: ../src/verbs.cpp:2954 +#: ../src/ui/dialog/align-and-distribute.cpp:898 ../src/verbs.cpp:2955 +#: ../src/verbs.cpp:2956 msgid "Center on horizontal axis" msgstr "Центрувати на горизонтальній осі" -#: ../src/ui/dialog/align-and-distribute.cpp:901 ../src/verbs.cpp:2955 -#: ../src/verbs.cpp:2956 +#: ../src/ui/dialog/align-and-distribute.cpp:901 ../src/verbs.cpp:2957 +#: ../src/verbs.cpp:2958 msgid "Align bottom edges" msgstr "Вирівняти нижні сторони" -#: ../src/ui/dialog/align-and-distribute.cpp:904 ../src/verbs.cpp:2957 -#: ../src/verbs.cpp:2958 +#: ../src/ui/dialog/align-and-distribute.cpp:904 ../src/verbs.cpp:2959 +#: ../src/verbs.cpp:2960 msgid "Align top edges of objects to the bottom edge of the anchor" msgstr "Вирівняти верхні краї об'єктів до нижнього краю якоря" @@ -12661,7 +14530,7 @@ msgstr "Найменший об'єкт" #: ../src/ui/dialog/align-and-distribute.cpp:1005 #: ../src/ui/dialog/filedialogimpl-gtkmm.cpp:1555 ../src/verbs.cpp:175 -#: ../src/widgets/desktop-widget.cpp:2011 +#: ../src/widgets/desktop-widget.cpp:2002 #: ../share/extensions/printing_marks.inx.h:18 msgid "Selection" msgstr "позначене" @@ -13455,57 +15324,57 @@ msgid "Release log messages" msgstr "Вимкнути повідомлення журналу" #: ../src/ui/dialog/document-metadata.cpp:88 -#: ../src/ui/dialog/document-properties.cpp:155 +#: ../src/ui/dialog/document-properties.cpp:156 msgid "Metadata" msgstr "Метадані" #: ../src/ui/dialog/document-metadata.cpp:89 -#: ../src/ui/dialog/document-properties.cpp:156 +#: ../src/ui/dialog/document-properties.cpp:157 msgid "License" msgstr "Ліцензія" #: ../src/ui/dialog/document-metadata.cpp:126 -#: ../src/ui/dialog/document-properties.cpp:966 +#: ../src/ui/dialog/document-properties.cpp:1002 msgid "<b>Dublin Core Entities</b>" msgstr "<b>Пункти Dublin Core</b>" #: ../src/ui/dialog/document-metadata.cpp:168 -#: ../src/ui/dialog/document-properties.cpp:1028 +#: ../src/ui/dialog/document-properties.cpp:1064 msgid "<b>License</b>" msgstr "<b>Ліцензія</b>" #. --------------------------------------------------------------- -#: ../src/ui/dialog/document-properties.cpp:108 +#: ../src/ui/dialog/document-properties.cpp:109 msgid "Show page _border" msgstr "Показувати _рамку полотна" -#: ../src/ui/dialog/document-properties.cpp:108 +#: ../src/ui/dialog/document-properties.cpp:109 msgid "If set, rectangular page border is shown" msgstr "У разі встановлення буде показано прямокутну рамку сторінки" -#: ../src/ui/dialog/document-properties.cpp:109 +#: ../src/ui/dialog/document-properties.cpp:110 msgid "Border on _top of drawing" msgstr "Рамка полотна завжди _над малюнком" -#: ../src/ui/dialog/document-properties.cpp:109 +#: ../src/ui/dialog/document-properties.cpp:110 msgid "If set, border is always on top of the drawing" msgstr "У разі встановлення над малюнком завжди буде рамка полотна" -#: ../src/ui/dialog/document-properties.cpp:110 +#: ../src/ui/dialog/document-properties.cpp:111 msgid "_Show border shadow" msgstr "_Показувати тінь від рамки" -#: ../src/ui/dialog/document-properties.cpp:110 +#: ../src/ui/dialog/document-properties.cpp:111 msgid "If set, page border shows a shadow on its right and lower side" msgstr "" "У разі встановлення границі сторінок відбиватимуть тіні на правій та нижній " "сторонах" -#: ../src/ui/dialog/document-properties.cpp:111 +#: ../src/ui/dialog/document-properties.cpp:112 msgid "Back_ground color:" msgstr "Ко_лір тла:" -#: ../src/ui/dialog/document-properties.cpp:111 +#: ../src/ui/dialog/document-properties.cpp:112 msgid "" "Color of the page background. Note: transparency setting ignored while " "editing but used when exporting to bitmap." @@ -13513,80 +15382,80 @@ msgstr "" "Колір тла сторінки. Зауваження: параметр прозорості буде проігноровано під " "час редагування, але враховано під час експортування до растра." -#: ../src/ui/dialog/document-properties.cpp:112 +#: ../src/ui/dialog/document-properties.cpp:113 msgid "Border _color:" msgstr "_Колір рамки:" -#: ../src/ui/dialog/document-properties.cpp:112 +#: ../src/ui/dialog/document-properties.cpp:113 msgid "Page border color" msgstr "Колір рамки полотна" -#: ../src/ui/dialog/document-properties.cpp:112 +#: ../src/ui/dialog/document-properties.cpp:113 msgid "Color of the page border" msgstr "Колір рамки полотна" -#: ../src/ui/dialog/document-properties.cpp:113 +#: ../src/ui/dialog/document-properties.cpp:114 msgid "Default _units:" msgstr "Типові о_диниці:" #. --------------------------------------------------------------- #. General snap options -#: ../src/ui/dialog/document-properties.cpp:117 +#: ../src/ui/dialog/document-properties.cpp:118 msgid "Show _guides" msgstr "Показувати _напрямні" -#: ../src/ui/dialog/document-properties.cpp:117 +#: ../src/ui/dialog/document-properties.cpp:118 msgid "Show or hide guides" msgstr "Показати/сховати напрямні" -#: ../src/ui/dialog/document-properties.cpp:118 +#: ../src/ui/dialog/document-properties.cpp:119 msgid "Guide co_lor:" msgstr "Ко_лір напрямних:" -#: ../src/ui/dialog/document-properties.cpp:118 +#: ../src/ui/dialog/document-properties.cpp:119 msgid "Guideline color" msgstr "Колір напрямних" -#: ../src/ui/dialog/document-properties.cpp:118 +#: ../src/ui/dialog/document-properties.cpp:119 msgid "Color of guidelines" msgstr "Колір напрямних" -#: ../src/ui/dialog/document-properties.cpp:119 +#: ../src/ui/dialog/document-properties.cpp:120 msgid "_Highlight color:" msgstr "Колір _підсвічення:" -#: ../src/ui/dialog/document-properties.cpp:119 +#: ../src/ui/dialog/document-properties.cpp:120 msgid "Highlighted guideline color" msgstr "Колір підсвіченої напрямної" -#: ../src/ui/dialog/document-properties.cpp:119 +#: ../src/ui/dialog/document-properties.cpp:120 msgid "Color of a guideline when it is under mouse" msgstr "Колір напрямної при наведенні на неї миші" #. --------------------------------------------------------------- -#: ../src/ui/dialog/document-properties.cpp:121 +#: ../src/ui/dialog/document-properties.cpp:122 msgid "Snap _distance" msgstr "_Відстань для прилипання" -#: ../src/ui/dialog/document-properties.cpp:121 +#: ../src/ui/dialog/document-properties.cpp:122 msgid "Snap only when _closer than:" msgstr "Прилипати на відстані, _меншій за:" -#: ../src/ui/dialog/document-properties.cpp:121 -#: ../src/ui/dialog/document-properties.cpp:126 -#: ../src/ui/dialog/document-properties.cpp:131 +#: ../src/ui/dialog/document-properties.cpp:122 +#: ../src/ui/dialog/document-properties.cpp:127 +#: ../src/ui/dialog/document-properties.cpp:132 msgid "Always snap" msgstr "Повсюдне прилипання" -#: ../src/ui/dialog/document-properties.cpp:122 +#: ../src/ui/dialog/document-properties.cpp:123 msgid "Snapping distance, in screen pixels, for snapping to objects" msgstr "Дистанція прилипання до об'єктів, у точках" -#: ../src/ui/dialog/document-properties.cpp:122 +#: ../src/ui/dialog/document-properties.cpp:123 msgid "Always snap to objects, regardless of their distance" msgstr "Повсюдне прилипання до об'єктів, незалежно від відстані" -#: ../src/ui/dialog/document-properties.cpp:123 +#: ../src/ui/dialog/document-properties.cpp:124 msgid "" "If set, objects only snap to another object when it's within the range " "specified below" @@ -13595,23 +15464,23 @@ msgstr "" "знаходитимуться на відстані заданій нижче" #. Options for snapping to grids -#: ../src/ui/dialog/document-properties.cpp:126 +#: ../src/ui/dialog/document-properties.cpp:127 msgid "Snap d_istance" msgstr "_Відстань для прилипання" -#: ../src/ui/dialog/document-properties.cpp:126 +#: ../src/ui/dialog/document-properties.cpp:127 msgid "Snap only when c_loser than:" msgstr "Прилипати на відстані, м_еншій за:" -#: ../src/ui/dialog/document-properties.cpp:127 +#: ../src/ui/dialog/document-properties.cpp:128 msgid "Snapping distance, in screen pixels, for snapping to grid" msgstr "Дистанція прилипання до сітки, у точках" -#: ../src/ui/dialog/document-properties.cpp:127 +#: ../src/ui/dialog/document-properties.cpp:128 msgid "Always snap to grids, regardless of the distance" msgstr "Повсюдне прилипання до сітки, незалежно від відстані" -#: ../src/ui/dialog/document-properties.cpp:128 +#: ../src/ui/dialog/document-properties.cpp:129 msgid "" "If set, objects only snap to a grid line when it's within the range " "specified below" @@ -13620,23 +15489,23 @@ msgstr "" "знаходитимуться на заданій нижче відстані" #. Options for snapping to guides -#: ../src/ui/dialog/document-properties.cpp:131 +#: ../src/ui/dialog/document-properties.cpp:132 msgid "Snap dist_ance" msgstr "В_ідстань для прилипання" -#: ../src/ui/dialog/document-properties.cpp:131 +#: ../src/ui/dialog/document-properties.cpp:132 msgid "Snap only when close_r than:" msgstr "Прилипати на відстані, ме_ншій за:" -#: ../src/ui/dialog/document-properties.cpp:132 +#: ../src/ui/dialog/document-properties.cpp:133 msgid "Snapping distance, in screen pixels, for snapping to guides" msgstr "Дистанція прилипання до напрямних, у точках" -#: ../src/ui/dialog/document-properties.cpp:132 +#: ../src/ui/dialog/document-properties.cpp:133 msgid "Always snap to guides, regardless of the distance" msgstr "Повсюдне прилипання до напрямних, незалежно від відстані" -#: ../src/ui/dialog/document-properties.cpp:133 +#: ../src/ui/dialog/document-properties.cpp:134 msgid "" "If set, objects only snap to a guide when it's within the range specified " "below" @@ -13645,106 +15514,106 @@ msgstr "" "знаходитимуться на заданій нижче відстані" #. --------------------------------------------------------------- -#: ../src/ui/dialog/document-properties.cpp:136 +#: ../src/ui/dialog/document-properties.cpp:137 msgid "Snap to clip paths" msgstr "Прилипання до контурів обрізання" -#: ../src/ui/dialog/document-properties.cpp:136 +#: ../src/ui/dialog/document-properties.cpp:137 msgid "When snapping to paths, then also try snapping to clip paths" msgstr "Намагатися виконати прилипання до контурів обрізання" -#: ../src/ui/dialog/document-properties.cpp:137 +#: ../src/ui/dialog/document-properties.cpp:138 msgid "Snap to mask paths" msgstr "Прилипання до контурів масок" -#: ../src/ui/dialog/document-properties.cpp:137 +#: ../src/ui/dialog/document-properties.cpp:138 msgid "When snapping to paths, then also try snapping to mask paths" msgstr "Намагатися виконати прилипання до контурів масок" -#: ../src/ui/dialog/document-properties.cpp:138 +#: ../src/ui/dialog/document-properties.cpp:139 msgid "Snap perpendicularly" msgstr "Перпендикулярне прилипання" -#: ../src/ui/dialog/document-properties.cpp:138 +#: ../src/ui/dialog/document-properties.cpp:139 msgid "" "When snapping to paths or guides, then also try snapping perpendicularly" msgstr "" "Намагатися під час прилипання виконувати і прилипання у перпендикулярному " "напрямку" -#: ../src/ui/dialog/document-properties.cpp:139 +#: ../src/ui/dialog/document-properties.cpp:140 msgid "Snap tangentially" msgstr "Дотичне прилипання" -#: ../src/ui/dialog/document-properties.cpp:139 +#: ../src/ui/dialog/document-properties.cpp:140 msgid "When snapping to paths or guides, then also try snapping tangentially" msgstr "" "Намагатися під час прилипання виконувати і прилипання у дотичному напрямку" -#: ../src/ui/dialog/document-properties.cpp:142 +#: ../src/ui/dialog/document-properties.cpp:143 msgctxt "Grid" msgid "_New" msgstr "_Створити" -#: ../src/ui/dialog/document-properties.cpp:142 +#: ../src/ui/dialog/document-properties.cpp:143 msgid "Create new grid." msgstr "Створити нову напрямну." -#: ../src/ui/dialog/document-properties.cpp:143 +#: ../src/ui/dialog/document-properties.cpp:144 msgctxt "Grid" msgid "_Remove" msgstr "Ви_лучити" -#: ../src/ui/dialog/document-properties.cpp:143 +#: ../src/ui/dialog/document-properties.cpp:144 msgid "Remove selected grid." msgstr "Вилучити вибрану сітку." -#: ../src/ui/dialog/document-properties.cpp:150 +#: ../src/ui/dialog/document-properties.cpp:151 #: ../src/widgets/toolbox.cpp:1834 msgid "Guides" msgstr "Напрямні" -#: ../src/ui/dialog/document-properties.cpp:152 ../src/verbs.cpp:2748 +#: ../src/ui/dialog/document-properties.cpp:153 ../src/verbs.cpp:2748 msgid "Snap" msgstr "Прилипання" -#: ../src/ui/dialog/document-properties.cpp:154 +#: ../src/ui/dialog/document-properties.cpp:155 msgid "Scripting" msgstr "Запис сценаріїв" -#: ../src/ui/dialog/document-properties.cpp:317 +#: ../src/ui/dialog/document-properties.cpp:318 msgid "<b>General</b>" msgstr "<b>Загальні</b>" -#: ../src/ui/dialog/document-properties.cpp:319 +#: ../src/ui/dialog/document-properties.cpp:320 msgid "<b>Color</b>" msgstr "<b>Колір</b>" -#: ../src/ui/dialog/document-properties.cpp:321 +#: ../src/ui/dialog/document-properties.cpp:322 msgid "<b>Border</b>" msgstr "<b>Рамка</b>" -#: ../src/ui/dialog/document-properties.cpp:323 +#: ../src/ui/dialog/document-properties.cpp:324 msgid "<b>Page Size</b>" msgstr "<b>Розмір сторінки</b>" -#: ../src/ui/dialog/document-properties.cpp:356 +#: ../src/ui/dialog/document-properties.cpp:357 msgid "<b>Guides</b>" msgstr "<b>Напрямні</b>" -#: ../src/ui/dialog/document-properties.cpp:374 +#: ../src/ui/dialog/document-properties.cpp:375 msgid "<b>Snap to objects</b>" msgstr "<b>Прилипання до об'єктів</b>" -#: ../src/ui/dialog/document-properties.cpp:376 +#: ../src/ui/dialog/document-properties.cpp:377 msgid "<b>Snap to grids</b>" msgstr "<b>Прилипання до сітки</b>" -#: ../src/ui/dialog/document-properties.cpp:378 +#: ../src/ui/dialog/document-properties.cpp:379 msgid "<b>Snap to guides</b>" msgstr "<b>Прилипання до напрямних</b>" -#: ../src/ui/dialog/document-properties.cpp:380 +#: ../src/ui/dialog/document-properties.cpp:381 msgid "<b>Miscellaneous</b>" msgstr "<b>Інше</b>" @@ -13752,135 +15621,135 @@ msgstr "<b>Інше</b>" #. Inkscape::GC::release(defsRepr); #. inform the document, so we can undo #. Color Management -#: ../src/ui/dialog/document-properties.cpp:493 ../src/verbs.cpp:2923 +#: ../src/ui/dialog/document-properties.cpp:494 ../src/verbs.cpp:2925 msgid "Link Color Profile" msgstr "Пов'язати профіль кольорів" -#: ../src/ui/dialog/document-properties.cpp:594 +#: ../src/ui/dialog/document-properties.cpp:595 msgid "Remove linked color profile" msgstr "Вилучити пов'язаний профіль кольорів" -#: ../src/ui/dialog/document-properties.cpp:607 +#: ../src/ui/dialog/document-properties.cpp:608 msgid "<b>Linked Color Profiles:</b>" msgstr "<b>Пов'язані профілі кольорів:</b>" -#: ../src/ui/dialog/document-properties.cpp:609 +#: ../src/ui/dialog/document-properties.cpp:610 msgid "<b>Available Color Profiles:</b>" msgstr "<b>Доступні профілі кольорів:</b>" -#: ../src/ui/dialog/document-properties.cpp:611 +#: ../src/ui/dialog/document-properties.cpp:612 msgid "Link Profile" msgstr "Пов'язати з профілем" -#: ../src/ui/dialog/document-properties.cpp:614 +#: ../src/ui/dialog/document-properties.cpp:621 msgid "Unlink Profile" msgstr "Від'єднати від профілю" -#: ../src/ui/dialog/document-properties.cpp:692 +#: ../src/ui/dialog/document-properties.cpp:705 msgid "Profile Name" msgstr "Назва профілю" -#: ../src/ui/dialog/document-properties.cpp:728 +#: ../src/ui/dialog/document-properties.cpp:741 msgid "External scripts" msgstr "Зовнішні скрипти" -#: ../src/ui/dialog/document-properties.cpp:729 +#: ../src/ui/dialog/document-properties.cpp:742 msgid "Embedded scripts" msgstr "Вбудовані скрипти" -#: ../src/ui/dialog/document-properties.cpp:734 +#: ../src/ui/dialog/document-properties.cpp:747 msgid "<b>External script files:</b>" msgstr "<b>Файли зовнішніх скриптів:</b>" -#: ../src/ui/dialog/document-properties.cpp:736 +#: ../src/ui/dialog/document-properties.cpp:749 msgid "Add the current file name or browse for a file" msgstr "Додайте назву поточного файла або вкажіть якийсь файл" -#: ../src/ui/dialog/document-properties.cpp:739 -#: ../src/ui/dialog/document-properties.cpp:817 +#: ../src/ui/dialog/document-properties.cpp:758 +#: ../src/ui/dialog/document-properties.cpp:847 #: ../src/ui/widget/selected-style.cpp:339 msgid "Remove" msgstr "Вилучити" -#: ../src/ui/dialog/document-properties.cpp:804 +#: ../src/ui/dialog/document-properties.cpp:828 msgid "Filename" msgstr "Назва файла" -#: ../src/ui/dialog/document-properties.cpp:812 +#: ../src/ui/dialog/document-properties.cpp:836 msgid "<b>Embedded script files:</b>" msgstr "<b>Файли вбудованих скриптів:</b>" -#: ../src/ui/dialog/document-properties.cpp:814 +#: ../src/ui/dialog/document-properties.cpp:838 msgid "New" msgstr "Створити" -#: ../src/ui/dialog/document-properties.cpp:881 +#: ../src/ui/dialog/document-properties.cpp:917 msgid "Script id" msgstr "Ід. скрипту" -#: ../src/ui/dialog/document-properties.cpp:887 +#: ../src/ui/dialog/document-properties.cpp:923 msgid "<b>Content:</b>" msgstr "<b>Вміст:</b>" -#: ../src/ui/dialog/document-properties.cpp:1004 +#: ../src/ui/dialog/document-properties.cpp:1040 msgid "_Save as default" msgstr "З_берегти як типові" -#: ../src/ui/dialog/document-properties.cpp:1005 +#: ../src/ui/dialog/document-properties.cpp:1041 msgid "Save this metadata as the default metadata" msgstr "Зберегти ці метадані як типові метадані" -#: ../src/ui/dialog/document-properties.cpp:1006 +#: ../src/ui/dialog/document-properties.cpp:1042 msgid "Use _default" msgstr "Використовувати _типові" -#: ../src/ui/dialog/document-properties.cpp:1007 +#: ../src/ui/dialog/document-properties.cpp:1043 msgid "Use the previously saved default metadata here" msgstr "Скористатися тут раніше збереженими типовими метаданими" #. inform the document, so we can undo -#: ../src/ui/dialog/document-properties.cpp:1080 +#: ../src/ui/dialog/document-properties.cpp:1116 msgid "Add external script..." msgstr "Додати зовнішній скрипт…" -#: ../src/ui/dialog/document-properties.cpp:1119 +#: ../src/ui/dialog/document-properties.cpp:1155 msgid "Select a script to load" msgstr "Виберіть скрипт для завантаження" #. inform the document, so we can undo -#: ../src/ui/dialog/document-properties.cpp:1147 +#: ../src/ui/dialog/document-properties.cpp:1183 msgid "Add embedded script..." msgstr "Додати вбудований скрипт…" #. inform the document, so we can undo -#: ../src/ui/dialog/document-properties.cpp:1178 +#: ../src/ui/dialog/document-properties.cpp:1214 msgid "Remove external script" msgstr "Вилучити зовнішній скрипт" #. inform the document, so we can undo -#: ../src/ui/dialog/document-properties.cpp:1212 +#: ../src/ui/dialog/document-properties.cpp:1248 msgid "Remove embedded script" msgstr "Вилучити вбудований скрипт" #. TODO repr->set_content(_EmbeddedContent.get_buffer()->get_text()); #. inform the document, so we can undo -#: ../src/ui/dialog/document-properties.cpp:1312 +#: ../src/ui/dialog/document-properties.cpp:1348 msgid "Edit embedded script" msgstr "Редагувати вбудований скрипт" -#: ../src/ui/dialog/document-properties.cpp:1395 +#: ../src/ui/dialog/document-properties.cpp:1431 msgid "<b>Creation</b>" msgstr "<b>Створення</b>" -#: ../src/ui/dialog/document-properties.cpp:1396 +#: ../src/ui/dialog/document-properties.cpp:1432 msgid "<b>Defined grids</b>" msgstr "<b>Визначені сітки</b>" -#: ../src/ui/dialog/document-properties.cpp:1639 +#: ../src/ui/dialog/document-properties.cpp:1675 msgid "Remove grid" msgstr "Вилучити сітку" -#: ../src/ui/dialog/document-properties.cpp:1707 +#: ../src/ui/dialog/document-properties.cpp:1743 msgid "Changed document unit" msgstr "Змінено одиницю виміру у документі" @@ -14079,6 +15948,11 @@ msgstr "Малюнок експортовано до <b>%s</b>." msgid "Export aborted." msgstr "Експорт перервано." +#: ../src/ui/dialog/export.cpp:1299 ../src/ui/dialog/input.cpp:1082 +#: ../src/verbs.cpp:2361 ../src/widgets/desktop-widget.cpp:1128 +msgid "_Save" +msgstr "З_берегти" + #: ../src/ui/dialog/extension-editor.cpp:81 msgid "Information" msgstr "Інформація" @@ -14103,7 +15977,7 @@ msgstr "Інформація" #: ../share/extensions/gcodetools_prepare_path_for_plasma.inx.h:17 #: ../share/extensions/gcodetools_tools_library.inx.h:12 #: ../share/extensions/generate_voronoi.inx.h:5 -#: ../share/extensions/gimp_xcf.inx.h:6 +#: ../share/extensions/gimp_xcf.inx.h:7 #: ../share/extensions/interp_att_g.inx.h:27 #: ../share/extensions/jessyInk_autoTexts.inx.h:8 #: ../share/extensions/jessyInk_effects.inx.h:13 @@ -14286,7 +16160,7 @@ msgid "Stroke st_yle" msgstr "С_тиль штриха" #. TRANSLATORS: this dialog is accessible via menu Filters - Filter editor -#: ../src/ui/dialog/filter-effects-dialog.cpp:515 +#: ../src/ui/dialog/filter-effects-dialog.cpp:546 msgid "" "This matrix determines a linear transform on color space. Each line affects " "one of the color components. Each column determines how much of each color " @@ -14299,38 +16173,58 @@ msgstr "" "не залежить від вхідних кольорів, отже, може бути використаний для " "визначення сталого значення у компоненті." -#: ../src/ui/dialog/filter-effects-dialog.cpp:625 +#: ../src/ui/dialog/filter-effects-dialog.cpp:656 msgid "Image File" msgstr "Файл зображення" -#: ../src/ui/dialog/filter-effects-dialog.cpp:628 +#: ../src/ui/dialog/filter-effects-dialog.cpp:659 msgid "Selected SVG Element" msgstr "Вибраний елемент SVG" #. TODO: any image, not just svg -#: ../src/ui/dialog/filter-effects-dialog.cpp:698 +#: ../src/ui/dialog/filter-effects-dialog.cpp:729 msgid "Select an image to be used as feImage input" msgstr "Оберіть зображення, що буде використано як вхідні дані feImage" -#: ../src/ui/dialog/filter-effects-dialog.cpp:790 +#: ../src/ui/dialog/filter-effects-dialog.cpp:821 msgid "This SVG filter effect does not require any parameters." msgstr "Цей примітив ефекту SVG не потребує параметрів." -#: ../src/ui/dialog/filter-effects-dialog.cpp:796 +#: ../src/ui/dialog/filter-effects-dialog.cpp:827 msgid "This SVG filter effect is not yet implemented in Inkscape." msgstr "Цей фільтр ефекту SVG ще не реалізовано у Inkscape." -#: ../src/ui/dialog/filter-effects-dialog.cpp:984 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1041 +msgid "Slope" +msgstr "Перспектива" + +#: ../src/ui/dialog/filter-effects-dialog.cpp:1042 +msgid "Intercept" +msgstr "Перетин" + +#: ../src/ui/dialog/filter-effects-dialog.cpp:1045 +msgid "Amplitude" +msgstr "Амплітуда" + +#: ../src/ui/dialog/filter-effects-dialog.cpp:1046 +msgid "Exponent" +msgstr "Експонента" + +#: ../src/ui/dialog/filter-effects-dialog.cpp:1143 +msgid "New transfer function type" +msgstr "Тип нової функції перенесення" + +#: ../src/ui/dialog/filter-effects-dialog.cpp:1178 msgid "Light Source:" msgstr "Джерело світла:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1001 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1195 msgid "Direction angle for the light source on the XY plane, in degrees" msgstr "" "Кут напрямку, під яким джерело світла знаходиться відносно площини XY (у " "градусах)" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1002 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1196 msgid "Direction angle for the light source on the YZ plane, in degrees" msgstr "" "Кут напрямку, під яким джерело світла знаходиться відносно площини YZ (у " @@ -14339,47 +16233,47 @@ msgstr "" #. default x: #. default y: #. default z: -#: ../src/ui/dialog/filter-effects-dialog.cpp:1005 -#: ../src/ui/dialog/filter-effects-dialog.cpp:1008 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1199 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1202 msgid "Location:" msgstr "Розташування:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1005 -#: ../src/ui/dialog/filter-effects-dialog.cpp:1008 -#: ../src/ui/dialog/filter-effects-dialog.cpp:1011 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1199 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1202 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1205 msgid "X coordinate" msgstr "Координата X" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1005 -#: ../src/ui/dialog/filter-effects-dialog.cpp:1008 -#: ../src/ui/dialog/filter-effects-dialog.cpp:1011 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1199 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1202 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1205 msgid "Y coordinate" msgstr "Координата Y" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1005 -#: ../src/ui/dialog/filter-effects-dialog.cpp:1008 -#: ../src/ui/dialog/filter-effects-dialog.cpp:1011 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1199 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1202 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1205 msgid "Z coordinate" msgstr "Координата Z" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1011 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1205 msgid "Points At" msgstr "Вказує на" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1012 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1206 msgid "Specular Exponent" msgstr "Степінь відбиття" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1012 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1206 msgid "Exponent value controlling the focus for the light source" msgstr "Показник експоненти, що керує фокусом джерела світла" #. TODO: here I have used 100 degrees as default value. But spec says that if not specified, no limiting cone is applied. So, there should be a way for the user to set a "no limiting cone" option. -#: ../src/ui/dialog/filter-effects-dialog.cpp:1014 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1208 msgid "Cone Angle" msgstr "Кут конуса" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1014 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1208 msgid "" "This is the angle between the spot light axis (i.e. the axis between the " "light source and the point to which it is pointing at) and the spot light " @@ -14389,111 +16283,111 @@ msgstr "" "світла і точку, на яку його спрямовано) і конусом прожектора. За межі конуса " "світло не проектується." -#: ../src/ui/dialog/filter-effects-dialog.cpp:1077 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1274 msgid "New light source" msgstr "Нове джерело світла" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1118 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1325 msgid "_Duplicate" msgstr "_Дублювати" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1152 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1359 msgid "_Filter" msgstr "_Фільтр" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1174 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1381 msgid "R_ename" msgstr "Пере_йменувати" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1304 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1511 msgid "Rename filter" msgstr "Перейменувати фільтр" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1349 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1556 msgid "Apply filter" msgstr "Застосувати фільтр" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1419 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1626 msgid "filter" msgstr "фільтрувати" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1426 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1633 msgid "Add filter" msgstr "Додати фільтр" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1478 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1685 msgid "Duplicate filter" msgstr "Дублювати фільтр" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1577 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1784 msgid "_Effect" msgstr "_Ефект" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1587 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1794 msgid "Connections" msgstr "З'єднання" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1725 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1932 msgid "Remove filter primitive" msgstr "Вилучити примітив фільтра" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2313 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2520 msgid "Remove merge node" msgstr "Вилучити вузол об'єднання" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2433 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2640 msgid "Reorder filter primitive" msgstr "Зміна порядку примітивів фільтра" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2513 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2720 msgid "Add Effect:" msgstr "Додати ефект:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2514 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2721 msgid "No effect selected" msgstr "Не вибрано жодного ефекту" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2515 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2722 msgid "No filter selected" msgstr "Не вибрано жодного фільтра" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2561 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2767 msgid "Effect parameters" msgstr "Параметри ефекту" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2562 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2768 msgid "Filter General Settings" msgstr "Загальні параметри фільтра" #. default x: #. default y: -#: ../src/ui/dialog/filter-effects-dialog.cpp:2620 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2826 msgid "Coordinates:" msgstr "Координати:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2620 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2826 msgid "X coordinate of the left corners of filter effects region" msgstr "Координата X лівих кутів області дії ефектів фільтра" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2620 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2826 msgid "Y coordinate of the upper corners of filter effects region" msgstr "Координата X верхніх кутів області дії ефектів фільтра" #. default width: #. default height: -#: ../src/ui/dialog/filter-effects-dialog.cpp:2621 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2827 msgid "Dimensions:" msgstr "Розміри:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2621 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2827 msgid "Width of filter effects region" msgstr "Ширина області дії ефектів фільтра" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2621 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2827 msgid "Height of filter effects region" msgstr "Висота області дії ефектів фільтра" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2627 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2833 msgid "" "Indicates the type of matrix operation. The keyword 'matrix' indicates that " "a full 5x4 matrix of values will be provided. The other keywords represent " @@ -14504,23 +16398,40 @@ msgstr "" "матрицю значень розміром 5×4. Інші варіанти — це простий спосіб виконати " "найпростіші операції без визначення всієї матриці вручну." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2628 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2834 msgid "Value(s):" msgstr "Значення:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2643 -#: ../src/ui/dialog/filter-effects-dialog.cpp:2683 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2838 +msgid "R:" +msgstr "Ч:" + +#: ../src/ui/dialog/filter-effects-dialog.cpp:2839 +#: ../src/widgets/sp-color-icc-selector.cpp:359 +msgid "G:" +msgstr "З:" + +#: ../src/ui/dialog/filter-effects-dialog.cpp:2840 +msgid "B:" +msgstr "С:" + +#: ../src/ui/dialog/filter-effects-dialog.cpp:2841 +msgid "A:" +msgstr "П:" + +#: ../src/ui/dialog/filter-effects-dialog.cpp:2844 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2884 msgid "Operator:" msgstr "Оператор:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2644 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2845 msgid "K1:" msgstr "K1:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2644 -#: ../src/ui/dialog/filter-effects-dialog.cpp:2645 -#: ../src/ui/dialog/filter-effects-dialog.cpp:2646 -#: ../src/ui/dialog/filter-effects-dialog.cpp:2647 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2845 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2846 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2847 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2848 msgid "" "If the arithmetic operation is chosen, each result pixel is computed using " "the formula k1*i1*i2 + k2*i1 + k3*i2 + k4 where i1 and i2 are the pixel " @@ -14530,38 +16441,38 @@ msgstr "" "за формулою k1*i1*i2 + k2*i1 + k3*i2 + k4, де i1 і i2 — значення пікселів " "першого і другого вхідних значень відповідно." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2645 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2846 msgid "K2:" msgstr "K2:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2646 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2847 msgid "K3:" msgstr "K3:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2647 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2848 msgid "K4:" msgstr "K4:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2650 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2851 msgid "Size:" msgstr "Розмір:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2650 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2851 msgid "width of the convolve matrix" msgstr "ширина матриці згортки" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2650 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2851 msgid "height of the convolve matrix" msgstr "висота матриці згортки" #. default x: #. default y: -#: ../src/ui/dialog/filter-effects-dialog.cpp:2651 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2852 #: ../src/ui/dialog/object-attributes.cpp:48 msgid "Target:" msgstr "Target:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2651 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2852 msgid "" "X coordinate of the target point in the convolve matrix. The convolution is " "applied to pixels around this point." @@ -14569,7 +16480,7 @@ msgstr "" "Координата X кінцевої точки матриці згортки. Згортка застосовується до " "пікселів навколо цієї точки." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2651 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2852 msgid "" "Y coordinate of the target point in the convolve matrix. The convolution is " "applied to pixels around this point." @@ -14578,11 +16489,11 @@ msgstr "" "пікселів навколо цієї точки." #. TRANSLATORS: for info on "Kernel", see http://en.wikipedia.org/wiki/Kernel_(matrix) -#: ../src/ui/dialog/filter-effects-dialog.cpp:2653 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2854 msgid "Kernel:" msgstr "Ядро:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2653 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2854 msgid "" "This matrix describes the convolve operation that is applied to the input " "image in order to calculate the pixel colors at the output. Different " @@ -14597,11 +16508,11 @@ msgstr "" "у той час, як матриця, заповнена сталим ненульовим значенням дасть звичайний " "ефект розмивання." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2655 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2856 msgid "Divisor:" msgstr "Дільник:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2655 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2856 msgid "" "After applying the kernelMatrix to the input image to yield a number, that " "number is divided by divisor to yield the final destination color value. A " @@ -14613,11 +16524,11 @@ msgstr "" "кольору. Дільник, що є сумою всіх значень матриці, приглушує загальну " "інтенсивність кольорів остаточного зображення." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2656 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2857 msgid "Bias:" msgstr "Зміщення:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2656 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2857 msgid "" "This value is added to each component. This is useful to define a constant " "value as the zero response of the filter." @@ -14625,11 +16536,11 @@ msgstr "" "Це значення додається до кожного компонента. Корисно для задання сталої, як " "нульового відгуку фільтра." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2657 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2858 msgid "Edge Mode:" msgstr "Режим країв:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2657 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2858 msgid "" "Determines how to extend the input image as necessary with color values so " "that the matrix operations can be applied when the kernel is positioned at " @@ -14639,31 +16550,31 @@ msgstr "" "щоб матричні операції могли працювати з ядром, розташованим на краю " "зображення або поблизу нього." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2658 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2859 msgid "Preserve Alpha" msgstr "Зберігати α-канал" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2658 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2859 msgid "If set, the alpha channel won't be altered by this filter primitive." msgstr "Якщо встановлено, α-канал не буде змінено цим примітивом фільтра." #. default: white -#: ../src/ui/dialog/filter-effects-dialog.cpp:2661 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2862 msgid "Diffuse Color:" msgstr "Колір дифузії:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2661 -#: ../src/ui/dialog/filter-effects-dialog.cpp:2694 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2862 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2895 msgid "Defines the color of the light source" msgstr "Визначає колір джерела світла" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2662 -#: ../src/ui/dialog/filter-effects-dialog.cpp:2695 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2863 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2896 msgid "Surface Scale:" msgstr "Масштаб поверхні:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2662 -#: ../src/ui/dialog/filter-effects-dialog.cpp:2695 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2863 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2896 msgid "" "This value amplifies the heights of the bump map defined by the input alpha " "channel" @@ -14671,59 +16582,59 @@ msgstr "" "Це значення визначає множник висоти карти рельєфу, що задається вхідним α-" "каналом" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2663 -#: ../src/ui/dialog/filter-effects-dialog.cpp:2696 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2864 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2897 msgid "Constant:" msgstr "Константа:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2663 -#: ../src/ui/dialog/filter-effects-dialog.cpp:2696 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2864 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2897 msgid "This constant affects the Phong lighting model." msgstr "Ця стала стосується моделі освітлення Фонга" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2664 -#: ../src/ui/dialog/filter-effects-dialog.cpp:2698 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2865 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2899 msgid "Kernel Unit Length:" msgstr "Одиниця довжини у ядрі:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2668 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2869 msgid "This defines the intensity of the displacement effect." msgstr "Ця величина визначає інтенсивність ефекту зміщення." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2669 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2870 msgid "X displacement:" msgstr "Зміщення за X:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2669 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2870 msgid "Color component that controls the displacement in the X direction" msgstr "Компонент кольору, що керує зміщенням у напрямку осі X" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2670 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2871 msgid "Y displacement:" msgstr "Зміщення за Y:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2670 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2871 msgid "Color component that controls the displacement in the Y direction" msgstr "Компонент кольору, що керує зміщенням у напрямку осі Y" #. default: black -#: ../src/ui/dialog/filter-effects-dialog.cpp:2673 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2874 msgid "Flood Color:" msgstr "Колір заливки:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2673 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2874 msgid "The whole filter region will be filled with this color." msgstr "Всю область дії фільтра буде залито цим кольором." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2677 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2878 msgid "Standard Deviation:" msgstr "Стандартне відхилення:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2677 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2878 msgid "The standard deviation for the blur operation." msgstr "Стандартне відхилення під час виконання операції розмивання" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2683 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2884 msgid "" "Erode: performs \"thinning\" of input image.\n" "Dilate: performs \"fattenning\" of input image." @@ -14731,41 +16642,41 @@ msgstr "" "Ерозія: виконує «витончення» вхідного зображення\n" "Розтягування: «потовщує» вхідне зображення" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2687 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2888 msgid "Source of Image:" msgstr "Джерело зображення:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2690 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2891 msgid "Delta X:" msgstr "Крок за X:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2690 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2891 msgid "This is how far the input image gets shifted to the right" msgstr "Визначає як далеко вхідне зображення зміщується праворуч" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2691 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2892 msgid "Delta Y:" msgstr "Крок за Y:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2691 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2892 msgid "This is how far the input image gets shifted downwards" msgstr "Визначає як далеко вхідне зображення зміщується донизу" #. default: white -#: ../src/ui/dialog/filter-effects-dialog.cpp:2694 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2895 msgid "Specular Color:" msgstr "Колір відбиття:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2697 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2898 #: ../share/extensions/interp.inx.h:2 msgid "Exponent:" msgstr "Експонента:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2697 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2898 msgid "Exponent for specular term, larger is more \"shiny\"." msgstr "Степінь відбиття: більше значення дає «яскравіше»." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2706 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2907 msgid "" "Indicates whether the filter primitive should perform a noise or turbulence " "function." @@ -14773,27 +16684,27 @@ msgstr "" "Позначає чи повинен примітив виконувати функцію створення турбулентності або " "шуму." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2707 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2908 msgid "Base Frequency:" msgstr "Опорна частота:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2708 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2909 msgid "Octaves:" msgstr "Октави:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2709 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2910 msgid "Seed:" msgstr "Випадкове значення:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2709 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2910 msgid "The starting number for the pseudo random number generator." msgstr "Початкове число для генератора псевдовипадкових чисел." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2721 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2922 msgid "Add filter primitive" msgstr "Додати примітив фільтра" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2738 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2939 msgid "" "The <b>feBlend</b> filter primitive provides 4 image blending modes: screen, " "multiply, darken and lighten." @@ -14801,7 +16712,7 @@ msgstr "" "Примітив фільтра <b>feBlend</b> надає можливість використовувати 4 режими " "змішування: просвічування, множення, темнішання та світлішання." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2742 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2943 msgid "" "The <b>feColorMatrix</b> filter primitive applies a matrix transformation to " "color of each rendered pixel. This allows for effects like turning object to " @@ -14811,7 +16722,7 @@ msgstr "" "кольору до кожної відображеної точки. Все це включає до себе перетворення " "об'єкта до півтонів сірого, зміну насиченості кольору і зміну відтінку." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2746 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2947 msgid "" "The <b>feComponentTransfer</b> filter primitive manipulates the input's " "color components (red, green, blue, and alpha) according to particular " @@ -14823,7 +16734,7 @@ msgstr "" "з окремими функціями переходу, роблячи можливим операції на зразок " "регулювання яскравості і контрасту, баланс кольорів та постеризацію." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2750 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2951 msgid "" "The <b>feComposite</b> filter primitive composites two images using one of " "the Porter-Duff blending modes or the arithmetic mode described in SVG " @@ -14835,7 +16746,7 @@ msgstr "" "описаного у стандарті SVG. Режими змішування Портера-Даффа по суті є " "булівськими операціями між значеннями кольорів відповідних точок зображень." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2754 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2955 msgid "" "The <b>feConvolveMatrix</b> lets you specify a Convolution to be applied on " "the image. Common effects created using convolution matrices are blur, " @@ -14850,7 +16761,7 @@ msgstr "" "за допомогою цього примітиву фільтра, особливий примітив фільтра для " "Гаусового розмивання є швидшим та незалежним від роздільної здатності." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2758 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2959 msgid "" "The <b>feDiffuseLighting</b> and feSpecularLighting filter primitives create " "\"embossed\" shadings. The input's alpha channel is used to provide depth " @@ -14862,7 +16773,7 @@ msgstr "" "використовується для відтворення глибини: непрозоріші області наближаються " "до глядача, а прозоріші — віддаляються." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2762 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2963 msgid "" "The <b>feDisplacementMap</b> filter primitive displaces the pixels in the " "first input using the second input as a displacement map, that shows from " @@ -14874,7 +16785,7 @@ msgstr "" "у якому напрямку і на яку відстань слід змістити точку. Класичними " "прикладами фільтра є ефекти «вихор» і «затискання»." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2766 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2967 msgid "" "The <b>feFlood</b> filter primitive fills the region with a given color and " "opacity. It is usually used as an input to other filters to apply color to " @@ -14884,7 +16795,7 @@ msgstr "" "непрозорістю. Зазвичай, його використовують як початковий для інших " "фільтрів, з метою надати графіці кольору." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2770 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2971 msgid "" "The <b>feGaussianBlur</b> filter primitive uniformly blurs its input. It is " "commonly used together with feOffset to create a drop shadow effect." @@ -14893,7 +16804,7 @@ msgstr "" "його застосовано. Зазвичай, він використовується разом з feOffset для " "створення ефекту відкидання тіні." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2774 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2975 msgid "" "The <b>feImage</b> filter primitive fills the region with an external image " "or another part of the document." @@ -14901,7 +16812,7 @@ msgstr "" "Примітив фільтра <b>feImage</b> заливає область зовнішнім зображенням або " "іншою частиною документа." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2778 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2979 msgid "" "The <b>feMerge</b> filter primitive composites several temporary images " "inside the filter primitive to a single image. It uses normal alpha " @@ -14914,7 +16825,7 @@ msgstr "" "кратне застосування примітивів feBlend у 'звичайному' режимі або кратне " "застосування примітивів feComposite у 'над'-режимі." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2782 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2983 msgid "" "The <b>feMorphology</b> filter primitive provides erode and dilate effects. " "For single-color objects erode makes the object thinner and dilate makes it " @@ -14924,7 +16835,7 @@ msgstr "" "ерозії та розширення. Для однокольорових об'єктів ерозія робить об'єкт " "меншим, а розширення — більшим." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2786 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2987 msgid "" "The <b>feOffset</b> filter primitive offsets the image by an user-defined " "amount. For example, this is useful for drop shadows, where the shadow is in " @@ -14934,7 +16845,7 @@ msgstr "" "відстань. Це, наприклад, корисно для відображення тіней, коли тінь " "розташовано з невеликим зсувом відносно об'єкта, що її відкидає." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2790 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2991 msgid "" "The <b>feDiffuseLighting</b> and <b>feSpecularLighting</b> filter primitives " "create \"embossed\" shadings. The input's alpha channel is used to provide " @@ -14946,14 +16857,14 @@ msgstr "" "матеріалу, використовується для відтворення глибини: непрозоріші області " "наближаються до глядача, а прозоріші — віддаляються." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2794 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2995 msgid "" "The <b>feTile</b> filter primitive tiles a region with its input graphic" msgstr "" "Примітив фільтра <b>feTile</b> заповнює область мозаїкою у формі вхідного " "графічного зображення" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2798 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2999 msgid "" "The <b>feTurbulence</b> filter primitive renders Perlin noise. This kind of " "noise is useful in simulating several nature phenomena like clouds, fire and " @@ -14963,11 +16874,11 @@ msgstr "" "шумів корисний для імітації деяких природних явищ на зразок хмар, полум'я та " "диму, та під час створення складних текстур на зразок мармуру та граніту." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2817 +#: ../src/ui/dialog/filter-effects-dialog.cpp:3018 msgid "Duplicate filter primitive" msgstr "Дублювати примітив фільтра" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2870 +#: ../src/ui/dialog/filter-effects-dialog.cpp:3071 msgid "Set filter primitive attribute" msgstr "Встановити атрибут примітива фільтра" @@ -16441,7 +18352,7 @@ msgstr "Стиль малювання об'єктів" #. Zoom #: ../src/ui/dialog/inkscape-preferences.cpp:376 -#: ../src/widgets/desktop-widget.cpp:635 +#: ../src/widgets/desktop-widget.cpp:636 msgid "Zoom" msgstr "Масштаб" @@ -16608,8 +18519,8 @@ msgstr "Відро з фарбою" #. Gradient #: ../src/ui/dialog/inkscape-preferences.cpp:478 -#: ../src/widgets/gradient-selector.cpp:151 -#: ../src/widgets/gradient-selector.cpp:303 +#: ../src/widgets/gradient-selector.cpp:152 +#: ../src/widgets/gradient-selector.cpp:320 msgid "Gradient" msgstr "Градієнт" @@ -17253,8 +19164,8 @@ msgid "_Time of opacity change animation:" msgstr "_Час зміни непрозорості у анімації:" #: ../src/ui/dialog/inkscape-preferences.cpp:703 -#: ../share/extensions/hpgl_output.inx.h:34 -#: ../share/extensions/plotter.inx.h:50 +#: ../share/extensions/hpgl_output.inx.h:33 +#: ../share/extensions/plotter.inx.h:49 msgid "Miscellaneous" msgstr "Інше" @@ -18046,7 +19957,7 @@ msgstr "Позначення" #. Transforms options #: ../src/ui/dialog/inkscape-preferences.cpp:1169 -#: ../src/widgets/select-toolbar.cpp:577 +#: ../src/widgets/select-toolbar.cpp:578 msgid "Scale stroke width" msgstr "Змінювати ширину штриха" @@ -18067,25 +19978,25 @@ msgid "Preserved" msgstr "Без оптимізації" #: ../src/ui/dialog/inkscape-preferences.cpp:1177 -#: ../src/widgets/select-toolbar.cpp:578 +#: ../src/widgets/select-toolbar.cpp:579 msgid "When scaling objects, scale the stroke width by the same proportion" msgstr "" "При зміні розміру об'єктів змінювати ширину штриха у відповідній пропорції" #: ../src/ui/dialog/inkscape-preferences.cpp:1179 -#: ../src/widgets/select-toolbar.cpp:589 +#: ../src/widgets/select-toolbar.cpp:590 msgid "When scaling rectangles, scale the radii of rounded corners" msgstr "" "При зміні розміру прямокутників міняти радіус округлених кутів у тій самій " "пропорції" #: ../src/ui/dialog/inkscape-preferences.cpp:1181 -#: ../src/widgets/select-toolbar.cpp:600 +#: ../src/widgets/select-toolbar.cpp:601 msgid "Move gradients (in fill or stroke) along with the objects" msgstr "Трансформувати градієнти (у заповненні чи штрихах) разом з об'єктом" #: ../src/ui/dialog/inkscape-preferences.cpp:1183 -#: ../src/widgets/select-toolbar.cpp:611 +#: ../src/widgets/select-toolbar.cpp:612 msgid "Move patterns (in fill or stroke) along with the objects" msgstr "Трансформувати візерунки (у заповненнях чи штрихах) разом з об'єктом" @@ -18736,7 +20647,7 @@ msgid "Shortcut file:" msgstr "Файл скорочень:" #: ../src/ui/dialog/inkscape-preferences.cpp:1484 -#: ../src/ui/dialog/template-load-tab.cpp:49 +#: ../src/ui/dialog/template-load-tab.cpp:48 msgid "Search:" msgstr "Шукати:" @@ -19005,10 +20916,6 @@ msgstr "" "Ви_користовувати графічний планшет чи інший пристрій (потребує " "перезавантаження)" -#: ../src/ui/dialog/input.cpp:1082 ../src/verbs.cpp:2361 -msgid "_Save" -msgstr "З_берегти" - #: ../src/ui/dialog/input.cpp:1086 msgid "Axes" msgstr "Вісі" @@ -19169,69 +21076,69 @@ msgstr "Додати ефект контуру" msgid "Add path effect" msgstr "Додати ефект контуру" -#: ../src/ui/dialog/livepatheffect-editor.cpp:113 +#: ../src/ui/dialog/livepatheffect-editor.cpp:119 msgid "Delete current path effect" msgstr "Вилучити поточний ефект контуру" -#: ../src/ui/dialog/livepatheffect-editor.cpp:117 +#: ../src/ui/dialog/livepatheffect-editor.cpp:129 msgid "Raise the current path effect" msgstr "Підняти поточний ефект контуру у списку" -#: ../src/ui/dialog/livepatheffect-editor.cpp:121 +#: ../src/ui/dialog/livepatheffect-editor.cpp:139 msgid "Lower the current path effect" msgstr "Опустити поточний ефект контуру у списку" -#: ../src/ui/dialog/livepatheffect-editor.cpp:289 +#: ../src/ui/dialog/livepatheffect-editor.cpp:313 msgid "Unknown effect is applied" msgstr "Застосовано невідомий ефект" -#: ../src/ui/dialog/livepatheffect-editor.cpp:292 +#: ../src/ui/dialog/livepatheffect-editor.cpp:316 msgid "Click button to add an effect" msgstr "Натисніть кнопку, щоб додати ефект" -#: ../src/ui/dialog/livepatheffect-editor.cpp:305 +#: ../src/ui/dialog/livepatheffect-editor.cpp:329 msgid "Click add button to convert clone" msgstr "Натисніть кнопку додавання, щоб перетворити клон" -#: ../src/ui/dialog/livepatheffect-editor.cpp:310 -#: ../src/ui/dialog/livepatheffect-editor.cpp:314 -#: ../src/ui/dialog/livepatheffect-editor.cpp:322 +#: ../src/ui/dialog/livepatheffect-editor.cpp:334 +#: ../src/ui/dialog/livepatheffect-editor.cpp:338 +#: ../src/ui/dialog/livepatheffect-editor.cpp:346 msgid "Select a path or shape" msgstr "Виберіть контур або форму" -#: ../src/ui/dialog/livepatheffect-editor.cpp:318 +#: ../src/ui/dialog/livepatheffect-editor.cpp:342 msgid "Only one item can be selected" msgstr "Можна вибрати тільки один пункт" -#: ../src/ui/dialog/livepatheffect-editor.cpp:350 +#: ../src/ui/dialog/livepatheffect-editor.cpp:374 msgid "Unknown effect" msgstr "Невідомий ефект" -#: ../src/ui/dialog/livepatheffect-editor.cpp:426 +#: ../src/ui/dialog/livepatheffect-editor.cpp:450 msgid "Create and apply path effect" msgstr "Створити і застосувати ефект контуру" -#: ../src/ui/dialog/livepatheffect-editor.cpp:461 +#: ../src/ui/dialog/livepatheffect-editor.cpp:485 msgid "Create and apply Clone original path effect" msgstr "Створити і застосувати ефект клонування початкового контуру" -#: ../src/ui/dialog/livepatheffect-editor.cpp:481 +#: ../src/ui/dialog/livepatheffect-editor.cpp:505 msgid "Remove path effect" msgstr "Вилучити ефект контуру" -#: ../src/ui/dialog/livepatheffect-editor.cpp:498 +#: ../src/ui/dialog/livepatheffect-editor.cpp:522 msgid "Move path effect up" msgstr "Пересунути ефект контуру вгору" -#: ../src/ui/dialog/livepatheffect-editor.cpp:514 +#: ../src/ui/dialog/livepatheffect-editor.cpp:538 msgid "Move path effect down" msgstr "Пересунути ефект контуру вниз" -#: ../src/ui/dialog/livepatheffect-editor.cpp:553 +#: ../src/ui/dialog/livepatheffect-editor.cpp:577 msgid "Activate path effect" msgstr "Задіяти ефект контуру" -#: ../src/ui/dialog/livepatheffect-editor.cpp:553 +#: ../src/ui/dialog/livepatheffect-editor.cpp:577 msgid "Deactivate path effect" msgstr "Вимкнути ефект контуру" @@ -19322,13 +21229,13 @@ msgstr "URL:" #: ../src/ui/dialog/object-attributes.cpp:66 #: ../src/ui/dialog/object-attributes.cpp:75 ../src/ui/dialog/tile.cpp:618 -#: ../src/widgets/desktop-widget.cpp:670 ../src/widgets/node-toolbar.cpp:594 +#: ../src/widgets/desktop-widget.cpp:671 ../src/widgets/node-toolbar.cpp:594 msgid "X:" msgstr "X:" #: ../src/ui/dialog/object-attributes.cpp:67 #: ../src/ui/dialog/object-attributes.cpp:76 ../src/ui/dialog/tile.cpp:619 -#: ../src/widgets/desktop-widget.cpp:680 ../src/widgets/node-toolbar.cpp:612 +#: ../src/widgets/desktop-widget.cpp:681 ../src/widgets/node-toolbar.cpp:612 msgid "Y:" msgstr "Y:" @@ -19457,47 +21364,47 @@ msgstr "Сховати об'єкт" msgid "Unhide object" msgstr "Показати об'єкт" -#: ../src/ui/dialog/ocaldialogs.cpp:714 +#: ../src/ui/dialog/ocaldialogs.cpp:715 msgid "Clipart found" msgstr "Виявлено шаблон" -#: ../src/ui/dialog/ocaldialogs.cpp:763 +#: ../src/ui/dialog/ocaldialogs.cpp:764 msgid "Downloading image..." msgstr "Отримання зображення…" -#: ../src/ui/dialog/ocaldialogs.cpp:911 +#: ../src/ui/dialog/ocaldialogs.cpp:912 msgid "Could not download image" msgstr "Не вдалося отримати зображення" -#: ../src/ui/dialog/ocaldialogs.cpp:921 +#: ../src/ui/dialog/ocaldialogs.cpp:922 msgid "Clipart downloaded successfully" msgstr "Шаблон успішно отримано" -#: ../src/ui/dialog/ocaldialogs.cpp:935 +#: ../src/ui/dialog/ocaldialogs.cpp:936 msgid "Could not download thumbnail file" msgstr "Не вдалося отримати файл мініатюри" -#: ../src/ui/dialog/ocaldialogs.cpp:1010 +#: ../src/ui/dialog/ocaldialogs.cpp:1011 msgid "No description" msgstr "Немає опису" -#: ../src/ui/dialog/ocaldialogs.cpp:1078 +#: ../src/ui/dialog/ocaldialogs.cpp:1079 msgid "Searching clipart..." msgstr "Пошук шаблонів…" -#: ../src/ui/dialog/ocaldialogs.cpp:1098 ../src/ui/dialog/ocaldialogs.cpp:1119 +#: ../src/ui/dialog/ocaldialogs.cpp:1099 ../src/ui/dialog/ocaldialogs.cpp:1120 msgid "Could not connect to the Open Clip Art Library" msgstr "Не вдалося встановити зв'язок з бібліотекою Open Clip Art" -#: ../src/ui/dialog/ocaldialogs.cpp:1144 +#: ../src/ui/dialog/ocaldialogs.cpp:1145 msgid "Could not parse search results" msgstr "Не вдалося обробити результати пошуку" -#: ../src/ui/dialog/ocaldialogs.cpp:1178 +#: ../src/ui/dialog/ocaldialogs.cpp:1179 msgid "No clipart named <b>%1</b> was found." msgstr "Не виявлено шаблонів з назвою <b>%1</b>." -#: ../src/ui/dialog/ocaldialogs.cpp:1180 +#: ../src/ui/dialog/ocaldialogs.cpp:1181 msgid "" "Please make sure all keywords are spelled correctly, or try again with " "different keywords." @@ -19505,25 +21412,25 @@ msgstr "" "Будь ласка, переконайтеся, що всі вказані ключові слова написано правильно " "або повторіть спробу пошуку, вказавши інші ключові слова." -#: ../src/ui/dialog/ocaldialogs.cpp:1232 +#: ../src/ui/dialog/ocaldialogs.cpp:1233 msgid "Search" msgstr "Пошук" -#: ../src/ui/dialog/ocaldialogs.cpp:1244 +#: ../src/ui/dialog/ocaldialogs.cpp:1245 msgid "Close" msgstr "Закрити" #: ../src/ui/dialog/pixelartdialog.cpp:162 -msgid "_Curves (multiplier)" -msgstr "_Криві (множник)" +msgid "_Curves (multiplier):" +msgstr "_Криві (множник):" #: ../src/ui/dialog/pixelartdialog.cpp:165 msgid "Favors connections that are part of a long curve" msgstr "Надавати перевагу з’єднанням, які є частиною довших кривих" #: ../src/ui/dialog/pixelartdialog.cpp:176 -msgid "_Islands (weight)" -msgstr "_Області (вага)" +msgid "_Islands (weight):" +msgstr "_Області (вага):" #: ../src/ui/dialog/pixelartdialog.cpp:179 msgid "Avoid single disconnected pixels" @@ -19534,16 +21441,16 @@ msgid "A constant vote value" msgstr "Стале значення рівня" #: ../src/ui/dialog/pixelartdialog.cpp:191 -msgid "Sparse pixels (window _radius)" -msgstr "Розріджені пікселі (_радіус вікна)" +msgid "Sparse pixels (window _radius):" +msgstr "Розріджені пікселі (_радіус вікна):" #: ../src/ui/dialog/pixelartdialog.cpp:200 msgid "The radius of the window analyzed" msgstr "Радіус вікна, яке буде проаналізовано" #: ../src/ui/dialog/pixelartdialog.cpp:201 -msgid "Sparse pixels (_multiplier)" -msgstr "Розріджені пікселі (_множник)" +msgid "Sparse pixels (_multiplier):" +msgstr "Розріджені пікселі (_множник):" #: ../src/ui/dialog/pixelartdialog.cpp:212 msgid "Favors connections that are part of foreground color" @@ -19874,8 +21781,8 @@ msgstr "Текст зразка" msgid "Preview Text:" msgstr "Перегляд тексту:" -#: ../src/ui/dialog/swatches.cpp:203 ../src/ui/tools/gradient-tool.cpp:369 -#: ../src/ui/tools/gradient-tool.cpp:467 +#: ../src/ui/dialog/swatches.cpp:203 ../src/ui/tools/gradient-tool.cpp:371 +#: ../src/ui/tools/gradient-tool.cpp:469 #: ../src/widgets/gradient-vector.cpp:814 msgid "Add gradient stop" msgstr "Додавання опорної точки градієнта" @@ -19904,36 +21811,36 @@ msgid "Palettes directory (%s) is unavailable." msgstr "Каталог з палітрами (%s) недоступний." #. ******************* Symbol Sets ************************ -#: ../src/ui/dialog/symbols.cpp:128 +#: ../src/ui/dialog/symbols.cpp:127 msgid "Symbol set: " msgstr "Набір символів: " #. Fill in later -#: ../src/ui/dialog/symbols.cpp:137 ../src/ui/dialog/symbols.cpp:138 +#: ../src/ui/dialog/symbols.cpp:136 ../src/ui/dialog/symbols.cpp:137 msgid "Current Document" msgstr "Поточний документ" -#: ../src/ui/dialog/symbols.cpp:205 +#: ../src/ui/dialog/symbols.cpp:204 msgid "Add Symbol from the current document." msgstr "Додати символ до поточного документа." -#: ../src/ui/dialog/symbols.cpp:214 +#: ../src/ui/dialog/symbols.cpp:213 msgid "Remove Symbol from the current document." msgstr "Вилучити символ з поточного документа." -#: ../src/ui/dialog/symbols.cpp:227 +#: ../src/ui/dialog/symbols.cpp:226 msgid "Make Icons bigger by zooming in." msgstr "Робити піктограми більшими збільшенням масштабу." -#: ../src/ui/dialog/symbols.cpp:236 +#: ../src/ui/dialog/symbols.cpp:235 msgid "Make Icons smaller by zooming out." msgstr "Робити піктограми меншими зменшенням масштабу." -#: ../src/ui/dialog/symbols.cpp:245 +#: ../src/ui/dialog/symbols.cpp:244 msgid "Toggle 'fit' symbols in icon space." msgstr "Вмикати/Вимикати символи підбирання розмірів у просторі піктограм." -#: ../src/ui/dialog/symbols.cpp:558 +#: ../src/ui/dialog/symbols.cpp:574 msgid "Unnamed Symbols" msgstr "Символи без назв" @@ -19941,10 +21848,6 @@ msgstr "Символи без назв" msgid "More info" msgstr "Додаткова інформація" -#: ../src/ui/dialog/template-widget.cpp:37 -msgid " " -msgstr " " - #: ../src/ui/dialog/template-widget.cpp:38 msgid "no template selected" msgstr "не вибрано шаблону" @@ -20011,7 +21914,7 @@ msgid "Text path offset" msgstr "Відступ тексту від контуру" #: ../src/ui/dialog/text-edit.cpp:588 ../src/ui/dialog/text-edit.cpp:662 -#: ../src/ui/tools/text-tool.cpp:1487 +#: ../src/ui/tools/text-tool.cpp:1488 msgid "Set text style" msgstr "Встановити стиль тексту" @@ -20370,7 +22273,7 @@ msgid "A_ngle:" msgstr "_Кут:" #: ../src/ui/dialog/transformation.cpp:84 -#: ../src/ui/dialog/transformation.cpp:1103 +#: ../src/ui/dialog/transformation.cpp:1104 msgid "Rotation angle (positive = counterclockwise)" msgstr "Кут повороту (додатній = проти годинникової стрілки)" @@ -20491,21 +22394,21 @@ msgstr "Обернути проти годинникової стрілки" msgid "Rotate in a clockwise direction" msgstr "Обернути за годинниковою стрілкою" -#: ../src/ui/dialog/transformation.cpp:907 -#: ../src/ui/dialog/transformation.cpp:918 -#: ../src/ui/dialog/transformation.cpp:932 -#: ../src/ui/dialog/transformation.cpp:951 -#: ../src/ui/dialog/transformation.cpp:962 -#: ../src/ui/dialog/transformation.cpp:972 -#: ../src/ui/dialog/transformation.cpp:996 +#: ../src/ui/dialog/transformation.cpp:908 +#: ../src/ui/dialog/transformation.cpp:919 +#: ../src/ui/dialog/transformation.cpp:933 +#: ../src/ui/dialog/transformation.cpp:952 +#: ../src/ui/dialog/transformation.cpp:963 +#: ../src/ui/dialog/transformation.cpp:973 +#: ../src/ui/dialog/transformation.cpp:997 msgid "Transform matrix is singular, <b>not used</b>." msgstr "Матриця перетворення є виродженою, <b>не використовуємо її</b>." -#: ../src/ui/dialog/transformation.cpp:1011 +#: ../src/ui/dialog/transformation.cpp:1012 msgid "Edit transformation matrix" msgstr "Редагування матриці трансформації" -#: ../src/ui/dialog/transformation.cpp:1110 +#: ../src/ui/dialog/transformation.cpp:1111 msgid "Rotation angle (positive = clockwise)" msgstr "Кут повороту (додатний = за годинниковою стрілкою)" @@ -20652,95 +22555,95 @@ msgstr "" "клацніть лівою кнопкою миші, щоб вставити вузол, клацніть один раз, щоб " "позначити (більше: Shift, Ctrl+Alt)" -#: ../src/ui/tool/multi-path-manipulator.cpp:326 +#: ../src/ui/tool/multi-path-manipulator.cpp:315 msgid "Retract handles" msgstr "Втягнути вуса" -#: ../src/ui/tool/multi-path-manipulator.cpp:326 ../src/ui/tool/node.cpp:270 +#: ../src/ui/tool/multi-path-manipulator.cpp:315 ../src/ui/tool/node.cpp:270 msgid "Change node type" msgstr "Змінити тип вузла" -#: ../src/ui/tool/multi-path-manipulator.cpp:334 +#: ../src/ui/tool/multi-path-manipulator.cpp:323 msgid "Straighten segments" msgstr "Розпрямляти сегменти" -#: ../src/ui/tool/multi-path-manipulator.cpp:336 +#: ../src/ui/tool/multi-path-manipulator.cpp:325 msgid "Make segments curves" msgstr "Зробити сегменти кривими" -#: ../src/ui/tool/multi-path-manipulator.cpp:344 +#: ../src/ui/tool/multi-path-manipulator.cpp:333 msgid "Add nodes" msgstr "Додати вузли" -#: ../src/ui/tool/multi-path-manipulator.cpp:350 +#: ../src/ui/tool/multi-path-manipulator.cpp:339 msgid "Add extremum nodes" msgstr "Додати вузли у екстремумах" -#: ../src/ui/tool/multi-path-manipulator.cpp:357 +#: ../src/ui/tool/multi-path-manipulator.cpp:346 msgid "Duplicate nodes" msgstr "Дублювати вузли" -#: ../src/ui/tool/multi-path-manipulator.cpp:420 +#: ../src/ui/tool/multi-path-manipulator.cpp:409 #: ../src/widgets/node-toolbar.cpp:421 msgid "Join nodes" msgstr "З'єднати вузли" -#: ../src/ui/tool/multi-path-manipulator.cpp:427 +#: ../src/ui/tool/multi-path-manipulator.cpp:416 #: ../src/widgets/node-toolbar.cpp:432 msgid "Break nodes" msgstr "Розрізати вузли" -#: ../src/ui/tool/multi-path-manipulator.cpp:434 +#: ../src/ui/tool/multi-path-manipulator.cpp:423 msgid "Delete nodes" msgstr "Вилучити вузли" -#: ../src/ui/tool/multi-path-manipulator.cpp:768 +#: ../src/ui/tool/multi-path-manipulator.cpp:757 msgid "Move nodes" msgstr "Перемістити вузли" -#: ../src/ui/tool/multi-path-manipulator.cpp:771 +#: ../src/ui/tool/multi-path-manipulator.cpp:760 msgid "Move nodes horizontally" msgstr "Перемістити вузли горизонтально" -#: ../src/ui/tool/multi-path-manipulator.cpp:775 +#: ../src/ui/tool/multi-path-manipulator.cpp:764 msgid "Move nodes vertically" msgstr "Перемістити вузли вертикально" -#: ../src/ui/tool/multi-path-manipulator.cpp:779 -#: ../src/ui/tool/multi-path-manipulator.cpp:782 +#: ../src/ui/tool/multi-path-manipulator.cpp:768 +#: ../src/ui/tool/multi-path-manipulator.cpp:771 msgid "Rotate nodes" msgstr "Обертання вузлів" -#: ../src/ui/tool/multi-path-manipulator.cpp:786 -#: ../src/ui/tool/multi-path-manipulator.cpp:792 +#: ../src/ui/tool/multi-path-manipulator.cpp:775 +#: ../src/ui/tool/multi-path-manipulator.cpp:781 msgid "Scale nodes uniformly" msgstr "Масштабувати вузли однорідно" -#: ../src/ui/tool/multi-path-manipulator.cpp:789 +#: ../src/ui/tool/multi-path-manipulator.cpp:778 msgid "Scale nodes" msgstr "Масштабувати вузли" -#: ../src/ui/tool/multi-path-manipulator.cpp:796 +#: ../src/ui/tool/multi-path-manipulator.cpp:785 msgid "Scale nodes horizontally" msgstr "Масштабувати вузли горизонтально" -#: ../src/ui/tool/multi-path-manipulator.cpp:800 +#: ../src/ui/tool/multi-path-manipulator.cpp:789 msgid "Scale nodes vertically" msgstr "Масштабувати вузли вертикально" -#: ../src/ui/tool/multi-path-manipulator.cpp:804 +#: ../src/ui/tool/multi-path-manipulator.cpp:793 msgid "Skew nodes horizontally" msgstr "Перекосити вузли горизонтально" -#: ../src/ui/tool/multi-path-manipulator.cpp:808 +#: ../src/ui/tool/multi-path-manipulator.cpp:797 msgid "Skew nodes vertically" msgstr "Перекосити вузли вертикально" -#: ../src/ui/tool/multi-path-manipulator.cpp:812 +#: ../src/ui/tool/multi-path-manipulator.cpp:801 msgid "Flip nodes horizontally" msgstr "Віддзеркалити вузли горизонтально" -#: ../src/ui/tool/multi-path-manipulator.cpp:815 +#: ../src/ui/tool/multi-path-manipulator.cpp:804 msgid "Flip nodes vertically" msgstr "Віддзеркалити вузли вертикально" @@ -21037,22 +22940,22 @@ msgstr "Створити лінію з'єднання" msgid "Finishing connector" msgstr "Завершення лінії з'єднання" -#: ../src/ui/tools/connector-tool.cpp:1275 +#: ../src/ui/tools/connector-tool.cpp:1280 msgid "<b>Connector endpoint</b>: drag to reroute or connect to new shapes" msgstr "" "<b>Кінцева з'єднувальна точка</b>: перетягніть щоб змінити напрямок " "з'єднання або з'єднання з новими фігурами" -#: ../src/ui/tools/connector-tool.cpp:1415 +#: ../src/ui/tools/connector-tool.cpp:1420 msgid "Select <b>at least one non-connector object</b>." msgstr "Позначте <b>принаймні два об'єкти</b> для з'єднання." -#: ../src/ui/tools/connector-tool.cpp:1420 +#: ../src/ui/tools/connector-tool.cpp:1425 #: ../src/widgets/connector-toolbar.cpp:326 msgid "Make connectors avoid selected objects" msgstr "Змусити лінії огинати вибрані об'єкти" -#: ../src/ui/tools/connector-tool.cpp:1421 +#: ../src/ui/tools/connector-tool.cpp:1426 #: ../src/widgets/connector-toolbar.cpp:336 msgid "Make connectors ignore selected objects" msgstr "Змусити лінії ігнорувати вибрані об'єкти" @@ -21254,27 +23157,27 @@ msgstr[0] "<b>Жодного</b> вуса градієнта з %d в %d виб msgstr[1] "<b>Жодного</b> вуса градієнта з %d в %d вибраних об'єктах" msgstr[2] "<b>Жодного</b> вуса градієнта з %d в %d вибраних об'єктах" -#: ../src/ui/tools/gradient-tool.cpp:442 +#: ../src/ui/tools/gradient-tool.cpp:444 msgid "Simplify gradient" msgstr "Спростити градієнт" -#: ../src/ui/tools/gradient-tool.cpp:518 +#: ../src/ui/tools/gradient-tool.cpp:520 msgid "Create default gradient" msgstr "Створити типовий градієнт" -#: ../src/ui/tools/gradient-tool.cpp:577 ../src/ui/tools/mesh-tool.cpp:572 +#: ../src/ui/tools/gradient-tool.cpp:579 ../src/ui/tools/mesh-tool.cpp:572 msgid "<b>Draw around</b> handles to select them" msgstr "<b>Обведіть</b> вуса, щоб вибрати їх" -#: ../src/ui/tools/gradient-tool.cpp:700 +#: ../src/ui/tools/gradient-tool.cpp:702 msgid "<b>Ctrl</b>: snap gradient angle" msgstr "<b>Ctrl</b>: обмежити кут градієнта" -#: ../src/ui/tools/gradient-tool.cpp:701 +#: ../src/ui/tools/gradient-tool.cpp:703 msgid "<b>Shift</b>: draw gradient around the starting point" msgstr "<b>Shift</b>: малювати навколо початкової точки" -#: ../src/ui/tools/gradient-tool.cpp:955 ../src/ui/tools/mesh-tool.cpp:995 +#: ../src/ui/tools/gradient-tool.cpp:957 ../src/ui/tools/mesh-tool.cpp:995 #, c-format msgid "<b>Gradient</b> for %d object; with <b>Ctrl</b> to snap angle" msgid_plural "<b>Gradient</b> for %d objects; with <b>Ctrl</b> to snap angle" @@ -21282,7 +23185,7 @@ msgstr[0] "<b>Градієнт</b> для %d об'єкта; <b>Ctrl</b> обме msgstr[1] "<b>Градієнт</b> для %d об'єктів; <b>Ctrl</b> обмежує кут" msgstr[2] "<b>Градієнт</b> для %d об'єктів; <b>Ctrl</b> обмежує кут" -#: ../src/ui/tools/gradient-tool.cpp:959 ../src/ui/tools/mesh-tool.cpp:999 +#: ../src/ui/tools/gradient-tool.cpp:961 ../src/ui/tools/mesh-tool.cpp:999 msgid "Select <b>objects</b> on which to create gradient." msgstr "Позначте <b>об'єкти</b> до яких буде застосовано градієнт." @@ -21721,58 +23624,58 @@ msgstr "<b>Зірка</b>: радіус %s, кут %5g°; з <b>Ctrl</b> — msgid "Create star" msgstr "Створення зірки" -#: ../src/ui/tools/text-tool.cpp:392 +#: ../src/ui/tools/text-tool.cpp:393 msgid "<b>Click</b> to edit the text, <b>drag</b> to select part of the text." msgstr "" "<b>Клацніть</b>, щоб редагувати текст, <b>перетягуванням</b> можна позначити " "частину тексту." -#: ../src/ui/tools/text-tool.cpp:394 +#: ../src/ui/tools/text-tool.cpp:395 msgid "" "<b>Click</b> to edit the flowed text, <b>drag</b> to select part of the text." msgstr "" "<b>Клацніть</b>, щоб редагувати текст у рамці, <b>перетягуванням</b> можна " "позначити частину тексту." -#: ../src/ui/tools/text-tool.cpp:448 +#: ../src/ui/tools/text-tool.cpp:449 msgid "Create text" msgstr "Створити текст" -#: ../src/ui/tools/text-tool.cpp:473 +#: ../src/ui/tools/text-tool.cpp:474 msgid "Non-printable character" msgstr "Недрукований символ" -#: ../src/ui/tools/text-tool.cpp:488 +#: ../src/ui/tools/text-tool.cpp:489 msgid "Insert Unicode character" msgstr "Вставити символ з таблиці Unicode" -#: ../src/ui/tools/text-tool.cpp:523 +#: ../src/ui/tools/text-tool.cpp:524 #, c-format msgid "Unicode (<b>Enter</b> to finish): %s: %s" msgstr "Юнікод (<b>Enter</b> для завершення): %s: %s" -#: ../src/ui/tools/text-tool.cpp:525 ../src/ui/tools/text-tool.cpp:832 +#: ../src/ui/tools/text-tool.cpp:526 ../src/ui/tools/text-tool.cpp:833 msgid "Unicode (<b>Enter</b> to finish): " msgstr "Unicode (<b>Enter</b> для завершення): " -#: ../src/ui/tools/text-tool.cpp:608 +#: ../src/ui/tools/text-tool.cpp:609 #, c-format msgid "<b>Flowed text frame</b>: %s × %s" msgstr "<b>Текст у рамці</b>: %s × %s" -#: ../src/ui/tools/text-tool.cpp:666 +#: ../src/ui/tools/text-tool.cpp:667 msgid "Type text; <b>Enter</b> to start new line." msgstr "Введіть текст; <b>Enter</b> — початок нового рядка." -#: ../src/ui/tools/text-tool.cpp:677 +#: ../src/ui/tools/text-tool.cpp:678 msgid "Flowed text is created." msgstr "Текстову область створено." -#: ../src/ui/tools/text-tool.cpp:679 +#: ../src/ui/tools/text-tool.cpp:680 msgid "Create flowed text" msgstr "Створити контурний текст" -#: ../src/ui/tools/text-tool.cpp:681 +#: ../src/ui/tools/text-tool.cpp:682 msgid "" "The frame is <b>too small</b> for the current font size. Flowed text not " "created." @@ -21780,75 +23683,75 @@ msgstr "" "Рамка <b>надто мала</b> для поточного розміру шрифту. Текстову область не " "створено." -#: ../src/ui/tools/text-tool.cpp:817 +#: ../src/ui/tools/text-tool.cpp:818 msgid "No-break space" msgstr "Нерозривний пробіл" -#: ../src/ui/tools/text-tool.cpp:819 +#: ../src/ui/tools/text-tool.cpp:820 msgid "Insert no-break space" msgstr "Вставити нерозривний пробіл" -#: ../src/ui/tools/text-tool.cpp:856 +#: ../src/ui/tools/text-tool.cpp:857 msgid "Make bold" msgstr "Зробити жирним" -#: ../src/ui/tools/text-tool.cpp:874 +#: ../src/ui/tools/text-tool.cpp:875 msgid "Make italic" msgstr "Зробити курсивним" -#: ../src/ui/tools/text-tool.cpp:913 +#: ../src/ui/tools/text-tool.cpp:914 msgid "New line" msgstr "Новий рядок" -#: ../src/ui/tools/text-tool.cpp:955 +#: ../src/ui/tools/text-tool.cpp:956 msgid "Backspace" msgstr "Забій" -#: ../src/ui/tools/text-tool.cpp:1011 +#: ../src/ui/tools/text-tool.cpp:1012 msgid "Kern to the left" msgstr "Відбивка ліворуч" -#: ../src/ui/tools/text-tool.cpp:1036 +#: ../src/ui/tools/text-tool.cpp:1037 msgid "Kern to the right" msgstr "Відбивка праворуч" -#: ../src/ui/tools/text-tool.cpp:1061 +#: ../src/ui/tools/text-tool.cpp:1062 msgid "Kern up" msgstr "Відбивка нагору" -#: ../src/ui/tools/text-tool.cpp:1086 +#: ../src/ui/tools/text-tool.cpp:1087 msgid "Kern down" msgstr "Відбивка донизу" -#: ../src/ui/tools/text-tool.cpp:1162 +#: ../src/ui/tools/text-tool.cpp:1163 msgid "Rotate counterclockwise" msgstr "Обертати проти годинникової стрілки" -#: ../src/ui/tools/text-tool.cpp:1183 +#: ../src/ui/tools/text-tool.cpp:1184 msgid "Rotate clockwise" msgstr "Обертати за годинниковою стрілкою" -#: ../src/ui/tools/text-tool.cpp:1200 +#: ../src/ui/tools/text-tool.cpp:1201 msgid "Contract line spacing" msgstr "Скорочення міжрядкового проміжку" -#: ../src/ui/tools/text-tool.cpp:1207 +#: ../src/ui/tools/text-tool.cpp:1208 msgid "Contract letter spacing" msgstr "Зменшена відстань між літерами" -#: ../src/ui/tools/text-tool.cpp:1225 +#: ../src/ui/tools/text-tool.cpp:1226 msgid "Expand line spacing" msgstr "Збільшена відстань між рядками" -#: ../src/ui/tools/text-tool.cpp:1232 +#: ../src/ui/tools/text-tool.cpp:1233 msgid "Expand letter spacing" msgstr "Збільшення міжрядкового проміжку" -#: ../src/ui/tools/text-tool.cpp:1362 +#: ../src/ui/tools/text-tool.cpp:1363 msgid "Paste text" msgstr "Вставити текст" -#: ../src/ui/tools/text-tool.cpp:1616 +#: ../src/ui/tools/text-tool.cpp:1617 #, c-format msgid "" "Type or edit flowed text (%d character%s); <b>Enter</b> to start new " @@ -21866,7 +23769,7 @@ msgstr[2] "" "Введіть або змініть текст за контуром (%d символів%s); <b>Enter</b> починає " "новий абзац." -#: ../src/ui/tools/text-tool.cpp:1618 +#: ../src/ui/tools/text-tool.cpp:1619 #, c-format msgid "Type or edit text (%d character%s); <b>Enter</b> to start new line." msgid_plural "" @@ -21880,7 +23783,7 @@ msgstr[2] "" "Введіть або змініть текст (%d символів%s); <b>Enter</b> — початок нового " "рядка." -#: ../src/ui/tools/text-tool.cpp:1728 +#: ../src/ui/tools/text-tool.cpp:1729 msgid "Type text" msgstr "Друк тексту" @@ -23021,19 +24924,19 @@ msgstr "tutorial-elements.svg" msgid "tutorial-tips.svg" msgstr "tutorial-tips.svg" -#: ../src/verbs.cpp:2325 ../src/verbs.cpp:2915 +#: ../src/verbs.cpp:2325 ../src/verbs.cpp:2917 msgid "Unlock all objects in the current layer" msgstr "Розблокувати усі об'єкти у поточному шарі" -#: ../src/verbs.cpp:2329 ../src/verbs.cpp:2917 +#: ../src/verbs.cpp:2329 ../src/verbs.cpp:2919 msgid "Unlock all objects in all layers" msgstr "Розблокувати усі об'єкти в усіх шарах" -#: ../src/verbs.cpp:2333 ../src/verbs.cpp:2919 +#: ../src/verbs.cpp:2333 ../src/verbs.cpp:2921 msgid "Unhide all objects in the current layer" msgstr "Розблокувати усі об'єкти у поточному шарі" -#: ../src/verbs.cpp:2337 ../src/verbs.cpp:2921 +#: ../src/verbs.cpp:2337 ../src/verbs.cpp:2923 msgid "Unhide all objects in all layers" msgstr "Показати усі об'єкти в усіх шарах" @@ -24766,117 +26669,119 @@ msgstr "" "Редагування кольорів об'єкта, градієнтів, форми стрілок та інші параметри " "заповнення та штриха…" -#: ../src/verbs.cpp:2818 +#. FIXME: Probably better to either use something from the icon naming spec or ship our own "select-font" icon +#: ../src/verbs.cpp:2819 msgid "Gl_yphs..." msgstr "Г_ліфи…" -#: ../src/verbs.cpp:2819 +#: ../src/verbs.cpp:2820 msgid "Select characters from a glyphs palette" msgstr "Виберіть символи з палітри гліфів" +#. FIXME: Probably better to either use something from the icon naming spec or ship our own "select-color" icon #. TRANSLATORS: "Swatches" means: color samples -#: ../src/verbs.cpp:2821 +#: ../src/verbs.cpp:2823 msgid "S_watches..." msgstr "Зразки _кольорів…" -#: ../src/verbs.cpp:2822 +#: ../src/verbs.cpp:2824 msgid "Select colors from a swatches palette" msgstr "Виберіть колір з палітри зразків" -#: ../src/verbs.cpp:2823 +#: ../src/verbs.cpp:2825 msgid "S_ymbols..." msgstr "С_имволи…" -#: ../src/verbs.cpp:2824 +#: ../src/verbs.cpp:2826 msgid "Select symbol from a symbols palette" msgstr "Виберіть символ з палітри символів" -#: ../src/verbs.cpp:2825 +#: ../src/verbs.cpp:2827 msgid "Transfor_m..." msgstr "_Трансформувати…" -#: ../src/verbs.cpp:2826 +#: ../src/verbs.cpp:2828 msgid "Precisely control objects' transformations" msgstr "Контролювати точність перетворень об'єктів" -#: ../src/verbs.cpp:2827 +#: ../src/verbs.cpp:2829 msgid "_Align and Distribute..." msgstr "Вирів_няти та розподілити…" -#: ../src/verbs.cpp:2828 +#: ../src/verbs.cpp:2830 msgid "Align and distribute objects" msgstr "Вирівняти та розподілити об'єкти" -#: ../src/verbs.cpp:2829 +#: ../src/verbs.cpp:2831 msgid "_Spray options..." msgstr "Параметри _розкидання…" -#: ../src/verbs.cpp:2830 +#: ../src/verbs.cpp:2832 msgid "Some options for the spray" msgstr "Параметри розкидання" -#: ../src/verbs.cpp:2831 +#: ../src/verbs.cpp:2833 msgid "Undo _History..." msgstr "Істо_рія змін…" -#: ../src/verbs.cpp:2832 +#: ../src/verbs.cpp:2834 msgid "Undo History" msgstr "Історія для скасування змін" -#: ../src/verbs.cpp:2834 +#: ../src/verbs.cpp:2836 msgid "View and select font family, font size and other text properties" msgstr "" "Перегляд та вибір назви шрифту, його розміру та інших властивостей тексту" -#: ../src/verbs.cpp:2835 +#: ../src/verbs.cpp:2837 msgid "_XML Editor..." msgstr "Редактор _XML…" -#: ../src/verbs.cpp:2836 +#: ../src/verbs.cpp:2838 msgid "View and edit the XML tree of the document" msgstr "Перегляд та редагування дерева XML поточного документа" -#: ../src/verbs.cpp:2837 +#: ../src/verbs.cpp:2839 msgid "_Find/Replace..." msgstr "Знайти і з_амінити…" -#: ../src/verbs.cpp:2838 +#: ../src/verbs.cpp:2840 msgid "Find objects in document" msgstr "Знайти об'єкти у документі" -#: ../src/verbs.cpp:2839 +#: ../src/verbs.cpp:2841 msgid "Find and _Replace Text..." msgstr "Знайти і з_амінити текст…" -#: ../src/verbs.cpp:2840 +#: ../src/verbs.cpp:2842 msgid "Find and replace text in document" msgstr "Знайти і замінити текст у документі" -#: ../src/verbs.cpp:2842 +#: ../src/verbs.cpp:2844 msgid "Check spelling of text in document" msgstr "Перевірити правопис тексту у документі" -#: ../src/verbs.cpp:2843 +#: ../src/verbs.cpp:2845 msgid "_Messages..." msgstr "По_відомлення…" -#: ../src/verbs.cpp:2844 +#: ../src/verbs.cpp:2846 msgid "View debug messages" msgstr "Переглянути діагностичні повідомлення" -#: ../src/verbs.cpp:2845 +#: ../src/verbs.cpp:2847 msgid "Show/Hide D_ialogs" msgstr "Показати/сховати діало_ги" -#: ../src/verbs.cpp:2846 +#: ../src/verbs.cpp:2848 msgid "Show or hide all open dialogs" msgstr "Показати чи сховати всі активні діалогові вікна" -#: ../src/verbs.cpp:2847 +#: ../src/verbs.cpp:2849 msgid "Create Tiled Clones..." msgstr "Створити мозаїку з клонів…" -#: ../src/verbs.cpp:2848 +#: ../src/verbs.cpp:2850 msgid "" "Create multiple clones of selected object, arranging them into a pattern or " "scattering" @@ -24884,221 +26789,221 @@ msgstr "" "Створити множину клонів позначеного об'єкта, з розташуванням їх у формі " "візерунку або покриття" -#: ../src/verbs.cpp:2849 +#: ../src/verbs.cpp:2851 msgid "_Object attributes..." msgstr "_Атрибути об'єкта…" -#: ../src/verbs.cpp:2850 +#: ../src/verbs.cpp:2852 msgid "Edit the object attributes..." msgstr "Змінити атрибути об'єкта…" -#: ../src/verbs.cpp:2852 +#: ../src/verbs.cpp:2854 msgid "Edit the ID, locked and visible status, and other object properties" msgstr "" "Редагування ідентифікатора, стану заблокованості та видимості та інших " "властивостей об'єкта" -#: ../src/verbs.cpp:2853 +#: ../src/verbs.cpp:2855 msgid "_Input Devices..." msgstr "_Пристрої введення…" -#: ../src/verbs.cpp:2854 +#: ../src/verbs.cpp:2856 msgid "Configure extended input devices, such as a graphics tablet" msgstr "Налаштовування розширених пристроїв введення" -#: ../src/verbs.cpp:2855 +#: ../src/verbs.cpp:2857 msgid "_Extensions..." msgstr "_Про додатки…" -#: ../src/verbs.cpp:2856 +#: ../src/verbs.cpp:2858 msgid "Query information about extensions" msgstr "Зібрати інформацію про додатки" -#: ../src/verbs.cpp:2857 +#: ../src/verbs.cpp:2859 msgid "Layer_s..." msgstr "_Шари…" -#: ../src/verbs.cpp:2858 +#: ../src/verbs.cpp:2860 msgid "View Layers" msgstr "Переглянути шари" -#: ../src/verbs.cpp:2859 +#: ../src/verbs.cpp:2861 msgid "Path E_ffects ..." msgstr "Е_фекти контурів…" -#: ../src/verbs.cpp:2860 +#: ../src/verbs.cpp:2862 msgid "Manage, edit, and apply path effects" msgstr "Керування, редагування і застосування ефектів контурів" -#: ../src/verbs.cpp:2861 +#: ../src/verbs.cpp:2863 msgid "Filter _Editor..." msgstr "Р_едактор фільтрів…" -#: ../src/verbs.cpp:2862 +#: ../src/verbs.cpp:2864 msgid "Manage, edit, and apply SVG filters" msgstr "Керування, редагування і застосування фільтрів SVG" -#: ../src/verbs.cpp:2863 +#: ../src/verbs.cpp:2865 msgid "SVG Font Editor..." msgstr "Редактор шрифтів SVG…" -#: ../src/verbs.cpp:2864 +#: ../src/verbs.cpp:2866 msgid "Edit SVG fonts" msgstr "Редагувати шрифти SVG" -#: ../src/verbs.cpp:2865 +#: ../src/verbs.cpp:2867 msgid "Print Colors..." msgstr "Друкувати кольори…" -#: ../src/verbs.cpp:2866 +#: ../src/verbs.cpp:2868 msgid "" "Select which color separations to render in Print Colors Preview rendermode" msgstr "" "Вкажіть ділянки кольорів, які слід обробляти у режимі обробки попереднього " "перегляду кольорів друку." -#: ../src/verbs.cpp:2867 +#: ../src/verbs.cpp:2869 msgid "_Export PNG Image..." msgstr "_Експортувати як зображення PNG…" -#: ../src/verbs.cpp:2868 +#: ../src/verbs.cpp:2870 msgid "Export this document or a selection as a PNG image" msgstr "Експортувати документ чи позначену частину як зображення PNG" #. Help -#: ../src/verbs.cpp:2870 +#: ../src/verbs.cpp:2872 msgid "About E_xtensions" msgstr "Про _додатки" -#: ../src/verbs.cpp:2871 +#: ../src/verbs.cpp:2873 msgid "Information on Inkscape extensions" msgstr "Інформація про додатки Inkscape" -#: ../src/verbs.cpp:2872 +#: ../src/verbs.cpp:2874 msgid "About _Memory" msgstr "Про п_ам'ять" -#: ../src/verbs.cpp:2873 +#: ../src/verbs.cpp:2875 msgid "Memory usage information" msgstr "Інформація про використання пам'яті" -#: ../src/verbs.cpp:2874 +#: ../src/verbs.cpp:2876 msgid "_About Inkscape" msgstr "_Про програму Inkscape" -#: ../src/verbs.cpp:2875 +#: ../src/verbs.cpp:2877 msgid "Inkscape version, authors, license" msgstr "Версія, автори та ліцензія Inkscape" #. new HelpVerb(SP_VERB_SHOW_LICENSE, "ShowLicense", N_("_License"), #. N_("Distribution terms"), /*"show_license"*/"inkscape_options"), #. Tutorials -#: ../src/verbs.cpp:2880 +#: ../src/verbs.cpp:2882 msgid "Inkscape: _Basic" msgstr "Inkscape: _Початковий рівень" -#: ../src/verbs.cpp:2881 +#: ../src/verbs.cpp:2883 msgid "Getting started with Inkscape" msgstr "Починаємо роботу з Inkscape" #. "tutorial_basic" -#: ../src/verbs.cpp:2882 +#: ../src/verbs.cpp:2884 msgid "Inkscape: _Shapes" msgstr "Inkscape: _Фігури" -#: ../src/verbs.cpp:2883 +#: ../src/verbs.cpp:2885 msgid "Using shape tools to create and edit shapes" msgstr "Використання інструментів малювання та редагування фігур" -#: ../src/verbs.cpp:2884 +#: ../src/verbs.cpp:2886 msgid "Inkscape: _Advanced" msgstr "Inkscape: _Другий рівень" -#: ../src/verbs.cpp:2885 +#: ../src/verbs.cpp:2887 msgid "Advanced Inkscape topics" msgstr "Додаткові теми з Inkscape" #. "tutorial_advanced" #. TRANSLATORS: "to trace" means "to convert a bitmap to vector graphics" (to vectorize) -#: ../src/verbs.cpp:2887 +#: ../src/verbs.cpp:2889 msgid "Inkscape: T_racing" msgstr "Inkscape: _Векторизація" -#: ../src/verbs.cpp:2888 +#: ../src/verbs.cpp:2890 msgid "Using bitmap tracing" msgstr "Використання векторизації растру" #. "tutorial_tracing" -#: ../src/verbs.cpp:2889 +#: ../src/verbs.cpp:2891 msgid "Inkscape: Tracing Pixel Art" msgstr "Inkscape: Трасування растрової графіки" -#: ../src/verbs.cpp:2890 +#: ../src/verbs.cpp:2892 msgid "Using Trace Pixel Art dialog" msgstr "Користування діалоговим вікном трасування растрової графіки" -#: ../src/verbs.cpp:2891 +#: ../src/verbs.cpp:2893 msgid "Inkscape: _Calligraphy" msgstr "Inkscape: _Каліграфія" -#: ../src/verbs.cpp:2892 +#: ../src/verbs.cpp:2894 msgid "Using the Calligraphy pen tool" msgstr "Використання каліграфічного пера" -#: ../src/verbs.cpp:2893 +#: ../src/verbs.cpp:2895 msgid "Inkscape: _Interpolate" msgstr "Inkscape: _Інтерполяція" -#: ../src/verbs.cpp:2894 +#: ../src/verbs.cpp:2896 msgid "Using the interpolate extension" msgstr "Використання додатка інтерполяції" #. "tutorial_interpolate" -#: ../src/verbs.cpp:2895 +#: ../src/verbs.cpp:2897 msgid "_Elements of Design" msgstr "_Елементи дизайну" -#: ../src/verbs.cpp:2896 +#: ../src/verbs.cpp:2898 msgid "Principles of design in the tutorial form" msgstr "Підручник з принципів дизайну" #. "tutorial_design" -#: ../src/verbs.cpp:2897 +#: ../src/verbs.cpp:2899 msgid "_Tips and Tricks" msgstr "_Поради та прийоми" -#: ../src/verbs.cpp:2898 +#: ../src/verbs.cpp:2900 msgid "Miscellaneous tips and tricks" msgstr "Різноманітні поради та прийоми" #. "tutorial_tips" #. Effect -- renamed Extension -#: ../src/verbs.cpp:2901 +#: ../src/verbs.cpp:2903 msgid "Previous Exte_nsion" msgstr "Попередній _додаток" -#: ../src/verbs.cpp:2902 +#: ../src/verbs.cpp:2904 msgid "Repeat the last extension with the same settings" msgstr "" "Повторити ефекти використання попереднього додатка з тими самими параметрами" -#: ../src/verbs.cpp:2903 +#: ../src/verbs.cpp:2905 msgid "_Previous Extension Settings..." msgstr "П_араметри попереднього додатка…" -#: ../src/verbs.cpp:2904 +#: ../src/verbs.cpp:2906 msgid "Repeat the last extension with new settings" msgstr "Повторити останній ефект з новими параметрами" -#: ../src/verbs.cpp:2908 +#: ../src/verbs.cpp:2910 msgid "Fit the page to the current selection" msgstr "Підігнати полотно до поточного позначеної області" -#: ../src/verbs.cpp:2910 +#: ../src/verbs.cpp:2912 msgid "Fit the page to the drawing" msgstr "Підганяє полотно під вже намальоване" -#: ../src/verbs.cpp:2912 +#: ../src/verbs.cpp:2914 msgid "" "Fit the page to the current selection or the drawing if there is no selection" msgstr "" @@ -25106,75 +27011,75 @@ msgstr "" "креслення, якщо нічого не позначено" #. LockAndHide -#: ../src/verbs.cpp:2914 +#: ../src/verbs.cpp:2916 msgid "Unlock All" msgstr "Розблокувати все" -#: ../src/verbs.cpp:2916 +#: ../src/verbs.cpp:2918 msgid "Unlock All in All Layers" msgstr "Розблокувати все в усіх шарах" -#: ../src/verbs.cpp:2918 +#: ../src/verbs.cpp:2920 msgid "Unhide All" msgstr "Показати все" -#: ../src/verbs.cpp:2920 +#: ../src/verbs.cpp:2922 msgid "Unhide All in All Layers" msgstr "Показати все в усіх шарах" -#: ../src/verbs.cpp:2924 +#: ../src/verbs.cpp:2926 msgid "Link an ICC color profile" msgstr "Посилання на профіль кольорів ICC" -#: ../src/verbs.cpp:2925 +#: ../src/verbs.cpp:2927 msgid "Remove Color Profile" msgstr "Вилучити профіль кольорів" -#: ../src/verbs.cpp:2926 +#: ../src/verbs.cpp:2928 msgid "Remove a linked ICC color profile" msgstr "Вилучити пов'язаний профіль кольорів ICC" -#: ../src/verbs.cpp:2929 +#: ../src/verbs.cpp:2931 msgid "Add External Script" msgstr "Додати зовнішній скрипт" -#: ../src/verbs.cpp:2929 +#: ../src/verbs.cpp:2931 msgid "Add an external script" msgstr "Додати зовнішній скрипт" -#: ../src/verbs.cpp:2931 +#: ../src/verbs.cpp:2933 msgid "Add Embedded Script" msgstr "Додати вбудований скрипт" -#: ../src/verbs.cpp:2931 +#: ../src/verbs.cpp:2933 msgid "Add an embedded script" msgstr "Додати вбудований скрипт" -#: ../src/verbs.cpp:2933 +#: ../src/verbs.cpp:2935 msgid "Edit Embedded Script" msgstr "Редагувати вбудований скрипт" -#: ../src/verbs.cpp:2933 +#: ../src/verbs.cpp:2935 msgid "Edit an embedded script" msgstr "Редагувати вбудований скрипт" -#: ../src/verbs.cpp:2935 +#: ../src/verbs.cpp:2937 msgid "Remove External Script" msgstr "Вилучити зовнішній скрипт" -#: ../src/verbs.cpp:2935 +#: ../src/verbs.cpp:2937 msgid "Remove an external script" msgstr "Вилучити зовнішній скрипт" -#: ../src/verbs.cpp:2937 +#: ../src/verbs.cpp:2939 msgid "Remove Embedded Script" msgstr "Вилучити вбудований скрипт" -#: ../src/verbs.cpp:2937 +#: ../src/verbs.cpp:2939 msgid "Remove an embedded script" msgstr "Вилучити вбудований скрипт" -#: ../src/verbs.cpp:2959 ../src/verbs.cpp:2960 +#: ../src/verbs.cpp:2961 ../src/verbs.cpp:2962 msgid "Center on horizontal and vertical axis" msgstr "Центрувати на горизонтальній і вертикальній осі" @@ -25682,20 +27587,20 @@ msgstr "Пунктир" msgid "Pattern offset" msgstr "Зміщення пунктиру" -#: ../src/widgets/desktop-widget.cpp:465 +#: ../src/widgets/desktop-widget.cpp:466 msgid "Zoom drawing if window size changes" msgstr "Змінювати масштаб при зміні розмірів вікна" -#: ../src/widgets/desktop-widget.cpp:669 +#: ../src/widgets/desktop-widget.cpp:670 msgid "Cursor coordinates" msgstr "Координати курсора" -#: ../src/widgets/desktop-widget.cpp:695 +#: ../src/widgets/desktop-widget.cpp:696 msgid "Z:" msgstr "Z:" #. display the initial welcome message in the statusbar -#: ../src/widgets/desktop-widget.cpp:738 +#: ../src/widgets/desktop-widget.cpp:739 msgid "" "<b>Welcome to Inkscape!</b> Use shape or freehand tools to create objects; " "use selector (arrow) to move or transform them." @@ -25704,69 +27609,69 @@ msgstr "" "малювання для створення об'єктів; для їх переміщення чи трансформації " "використовуйте селектор (стрілку)." -#: ../src/widgets/desktop-widget.cpp:832 +#: ../src/widgets/desktop-widget.cpp:833 msgid "grayscale" msgstr "сірі півтони" -#: ../src/widgets/desktop-widget.cpp:833 +#: ../src/widgets/desktop-widget.cpp:834 msgid ", grayscale" msgstr ", сірі півтони" -#: ../src/widgets/desktop-widget.cpp:834 +#: ../src/widgets/desktop-widget.cpp:835 msgid "print colors preview" msgstr "друк попереднього перегляду кольорів" -#: ../src/widgets/desktop-widget.cpp:835 +#: ../src/widgets/desktop-widget.cpp:836 msgid ", print colors preview" msgstr ", друк попереднього перегляду кольорів" -#: ../src/widgets/desktop-widget.cpp:836 +#: ../src/widgets/desktop-widget.cpp:837 msgid "outline" msgstr "обрис" -#: ../src/widgets/desktop-widget.cpp:837 +#: ../src/widgets/desktop-widget.cpp:838 msgid "no filters" msgstr "без фільтрування" -#: ../src/widgets/desktop-widget.cpp:864 +#: ../src/widgets/desktop-widget.cpp:865 #, c-format msgid "%s%s: %d (%s%s) - Inkscape" msgstr "%s%s: %d (%s%s) – Inkscape" -#: ../src/widgets/desktop-widget.cpp:866 ../src/widgets/desktop-widget.cpp:870 +#: ../src/widgets/desktop-widget.cpp:867 ../src/widgets/desktop-widget.cpp:871 #, c-format msgid "%s%s: %d (%s) - Inkscape" msgstr "%s%s: %d (%s) — Inkscape" -#: ../src/widgets/desktop-widget.cpp:872 +#: ../src/widgets/desktop-widget.cpp:873 #, c-format msgid "%s%s: %d - Inkscape" msgstr "%s%s: %d — Inkscape" -#: ../src/widgets/desktop-widget.cpp:878 +#: ../src/widgets/desktop-widget.cpp:879 #, c-format msgid "%s%s (%s%s) - Inkscape" msgstr "%s%s (%s%s) — Inkscape" -#: ../src/widgets/desktop-widget.cpp:880 ../src/widgets/desktop-widget.cpp:884 +#: ../src/widgets/desktop-widget.cpp:881 ../src/widgets/desktop-widget.cpp:885 #, c-format msgid "%s%s (%s) - Inkscape" msgstr "%s%s (%s) — Inkscape" -#: ../src/widgets/desktop-widget.cpp:886 +#: ../src/widgets/desktop-widget.cpp:887 #, c-format msgid "%s%s - Inkscape" msgstr "%s%s — Inkscape" -#: ../src/widgets/desktop-widget.cpp:1055 +#: ../src/widgets/desktop-widget.cpp:1056 msgid "Color-managed display is <b>enabled</b> in this window" msgstr "Показ з керуванням кольорами у цьому вікні <b>увімкнено</b>" -#: ../src/widgets/desktop-widget.cpp:1057 +#: ../src/widgets/desktop-widget.cpp:1058 msgid "Color-managed display is <b>disabled</b> in this window" msgstr "Показ з керуванням кольорами у цьому вікні <b>вимкнено</b>" -#: ../src/widgets/desktop-widget.cpp:1112 +#: ../src/widgets/desktop-widget.cpp:1113 #, c-format msgid "" "<span weight=\"bold\" size=\"larger\">Save changes to document \"%s\" before " @@ -25779,12 +27684,12 @@ msgstr "" "\n" "Якщо ви закриєте документ без збереження, усі зміни будуть втрачені." -#: ../src/widgets/desktop-widget.cpp:1122 -#: ../src/widgets/desktop-widget.cpp:1181 +#: ../src/widgets/desktop-widget.cpp:1123 +#: ../src/widgets/desktop-widget.cpp:1182 msgid "Close _without saving" msgstr "_Не зберігати" -#: ../src/widgets/desktop-widget.cpp:1171 +#: ../src/widgets/desktop-widget.cpp:1172 #, c-format msgid "" "<span weight=\"bold\" size=\"larger\">The file \"%s\" was saved with a " @@ -25797,11 +27702,11 @@ msgstr "" "\n" "Зберегти документ у форматі SVG Inkscape?" -#: ../src/widgets/desktop-widget.cpp:1183 +#: ../src/widgets/desktop-widget.cpp:1184 msgid "_Save as Inkscape SVG" msgstr "_Зберегти як SVG Inkscape" -#: ../src/widgets/desktop-widget.cpp:1393 +#: ../src/widgets/desktop-widget.cpp:1394 msgid "Note:" msgstr "Примітка:" @@ -25903,20 +27808,20 @@ msgstr "Стиль" msgid "Font size:" msgstr "Розмір шрифту:" -#: ../src/widgets/gradient-selector.cpp:208 +#: ../src/widgets/gradient-selector.cpp:214 msgid "Create a duplicate gradient" msgstr "Створення дублікат градієнта" -#: ../src/widgets/gradient-selector.cpp:218 +#: ../src/widgets/gradient-selector.cpp:230 msgid "Edit gradient" msgstr "Змінити градієнт" -#: ../src/widgets/gradient-selector.cpp:289 +#: ../src/widgets/gradient-selector.cpp:306 #: ../src/widgets/paint-selector.cpp:244 msgid "Swatch" msgstr "Зразок" -#: ../src/widgets/gradient-selector.cpp:339 +#: ../src/widgets/gradient-selector.cpp:356 msgid "Rename gradient" msgstr "Перейменувати градієнт" @@ -26055,6 +27960,13 @@ msgstr "Позначте опорну точку поточного градіє msgid "Stops:" msgstr "Опорні точки:" +#. Label +#: ../src/widgets/gradient-toolbar.cpp:1174 +#: ../src/widgets/gradient-vector.cpp:926 +msgctxt "Gradient" +msgid "Offset:" +msgstr "Зсув:" + #: ../src/widgets/gradient-toolbar.cpp:1174 msgid "Offset of selected stop" msgstr "Відступ позначеної опорної точки" @@ -26170,7 +28082,7 @@ msgstr "Показувати відомості щодо виміру для в #. Add the units menu. #: ../src/widgets/lpe-toolbar.cpp:405 ../src/widgets/node-toolbar.cpp:626 #: ../src/widgets/paintbucket-toolbar.cpp:187 -#: ../src/widgets/rect-toolbar.cpp:382 ../src/widgets/select-toolbar.cpp:543 +#: ../src/widgets/rect-toolbar.cpp:382 ../src/widgets/select-toolbar.cpp:544 msgid "Units" msgstr "Одиниці" @@ -26783,23 +28695,23 @@ msgstr "Макс. розмір" msgid "Maximum size of the ruler" msgstr "Максимальний розмір лінійки" -#: ../src/widgets/select-toolbar.cpp:267 +#: ../src/widgets/select-toolbar.cpp:268 msgid "Transform by toolbar" msgstr "Трансформувати візерунки" -#: ../src/widgets/select-toolbar.cpp:346 +#: ../src/widgets/select-toolbar.cpp:347 msgid "Now <b>stroke width</b> is <b>scaled</b> when objects are scaled." msgstr "" "Тепер <b>товщина штриха</b> <b>масштабується</b> під час зміни масштабу " "об'єктів." -#: ../src/widgets/select-toolbar.cpp:348 +#: ../src/widgets/select-toolbar.cpp:349 msgid "Now <b>stroke width</b> is <b>not scaled</b> when objects are scaled." msgstr "" "Тепер <b>товщина штриха</b> <b>не масштабується</b> під час зміни масштабу " "об'єктів." -#: ../src/widgets/select-toolbar.cpp:359 +#: ../src/widgets/select-toolbar.cpp:360 msgid "" "Now <b>rounded rectangle corners</b> are <b>scaled</b> when rectangles are " "scaled." @@ -26807,7 +28719,7 @@ msgstr "" "Тепер <b>закруглені кути прямокутника</b> <b>змінюватимуть масштаб</b> під " "час зміни масштабу прямокутника." -#: ../src/widgets/select-toolbar.cpp:361 +#: ../src/widgets/select-toolbar.cpp:362 msgid "" "Now <b>rounded rectangle corners</b> are <b>not scaled</b> when rectangles " "are scaled." @@ -26815,7 +28727,7 @@ msgstr "" "Тепер <b>закруглені кути прямокутника</b> <b>не змінюватимуть масштаб</b> " "під час зміни масштабу прямокутника." -#: ../src/widgets/select-toolbar.cpp:372 +#: ../src/widgets/select-toolbar.cpp:373 msgid "" "Now <b>gradients</b> are <b>transformed</b> along with their objects when " "those are transformed (moved, scaled, rotated, or skewed)." @@ -26824,7 +28736,7 @@ msgstr "" "коли вони перетворюватимуться (переміщуватимуться, змінюватимуть масштаб, " "повертатимуться або нахилятимуться)." -#: ../src/widgets/select-toolbar.cpp:374 +#: ../src/widgets/select-toolbar.cpp:375 msgid "" "Now <b>gradients</b> remain <b>fixed</b> when objects are transformed " "(moved, scaled, rotated, or skewed)." @@ -26832,7 +28744,7 @@ msgstr "" "Тепер <b>закруглені кути прямокутника</b> <b>не змінюватимуться</b> під час " "зміни масштабу прямокутника." -#: ../src/widgets/select-toolbar.cpp:385 +#: ../src/widgets/select-toolbar.cpp:386 msgid "" "Now <b>patterns</b> are <b>transformed</b> along with their objects when " "those are transformed (moved, scaled, rotated, or skewed)." @@ -26841,7 +28753,7 @@ msgstr "" "коли вони перетворюватимуться (переміщуватимуться, змінюватимуть масштаб, " "повертатимуться або нахилятимуться)." -#: ../src/widgets/select-toolbar.cpp:387 +#: ../src/widgets/select-toolbar.cpp:388 msgid "" "Now <b>patterns</b> remain <b>fixed</b> when objects are transformed (moved, " "scaled, rotated, or skewed)." @@ -26851,79 +28763,79 @@ msgstr "" "повертатимуться або нахилятимуться)." #. four spinbuttons -#: ../src/widgets/select-toolbar.cpp:505 +#: ../src/widgets/select-toolbar.cpp:506 msgctxt "Select toolbar" msgid "X position" msgstr "Розташування за X" -#: ../src/widgets/select-toolbar.cpp:505 +#: ../src/widgets/select-toolbar.cpp:506 msgctxt "Select toolbar" msgid "X:" msgstr "X:" -#: ../src/widgets/select-toolbar.cpp:507 +#: ../src/widgets/select-toolbar.cpp:508 msgid "Horizontal coordinate of selection" msgstr "Горизонтальна координата позначення" -#: ../src/widgets/select-toolbar.cpp:511 +#: ../src/widgets/select-toolbar.cpp:512 msgctxt "Select toolbar" msgid "Y position" msgstr "Розташування за Y" -#: ../src/widgets/select-toolbar.cpp:511 +#: ../src/widgets/select-toolbar.cpp:512 msgctxt "Select toolbar" msgid "Y:" msgstr "Y:" -#: ../src/widgets/select-toolbar.cpp:513 +#: ../src/widgets/select-toolbar.cpp:514 msgid "Vertical coordinate of selection" msgstr "Вертикальна координата позначення" -#: ../src/widgets/select-toolbar.cpp:517 +#: ../src/widgets/select-toolbar.cpp:518 msgctxt "Select toolbar" msgid "Width" msgstr "Ширина" -#: ../src/widgets/select-toolbar.cpp:517 +#: ../src/widgets/select-toolbar.cpp:518 msgctxt "Select toolbar" msgid "W:" msgstr "Ш:" -#: ../src/widgets/select-toolbar.cpp:519 +#: ../src/widgets/select-toolbar.cpp:520 msgid "Width of selection" msgstr "Ширина позначення" -#: ../src/widgets/select-toolbar.cpp:526 +#: ../src/widgets/select-toolbar.cpp:527 msgid "Lock width and height" msgstr "Заблокувати ширину і висоту" -#: ../src/widgets/select-toolbar.cpp:527 +#: ../src/widgets/select-toolbar.cpp:528 msgid "When locked, change both width and height by the same proportion" msgstr "Коли заблоковано, пропорційно змінювати ширину та висоту" -#: ../src/widgets/select-toolbar.cpp:536 +#: ../src/widgets/select-toolbar.cpp:537 msgctxt "Select toolbar" msgid "Height" msgstr "Висота" -#: ../src/widgets/select-toolbar.cpp:536 +#: ../src/widgets/select-toolbar.cpp:537 msgctxt "Select toolbar" msgid "H:" msgstr "В:" -#: ../src/widgets/select-toolbar.cpp:538 +#: ../src/widgets/select-toolbar.cpp:539 msgid "Height of selection" msgstr "Висота позначення" -#: ../src/widgets/select-toolbar.cpp:588 +#: ../src/widgets/select-toolbar.cpp:589 msgid "Scale rounded corners" msgstr "Змінити розмір округлених кутів" -#: ../src/widgets/select-toolbar.cpp:599 +#: ../src/widgets/select-toolbar.cpp:600 msgid "Move gradients" msgstr "Перемістити градієнти" -#: ../src/widgets/select-toolbar.cpp:610 +#: ../src/widgets/select-toolbar.cpp:611 msgid "Move patterns" msgstr "Перемістити текстури" @@ -26952,10 +28864,6 @@ msgid "_B:" msgstr "_B:" #: ../src/widgets/sp-color-icc-selector.cpp:359 -msgid "G:" -msgstr "С:" - -#: ../src/widgets/sp-color-icc-selector.cpp:359 msgid "Gray" msgstr "Сірий" @@ -28633,7 +30541,7 @@ msgstr "" msgid "An error occurred while processing the XCF file." msgstr "Під час спроби обробки файла XCF сталася помилка." -#: ../share/extensions/gimp_xcf.py:171 +#: ../share/extensions/gimp_xcf.py:177 msgid "This extension requires at least one non empty layer." msgstr "Для роботи цього додатка потрібен хоча б один непорожній шар." @@ -28663,7 +30571,7 @@ msgstr "" "кресленні не буде деяких елементів." #. issue error if no paths found -#: ../share/extensions/hpgl_output.py:62 +#: ../share/extensions/hpgl_output.py:63 msgid "" "No paths where found. Please convert all objects you want to save into paths." msgstr "" @@ -28689,7 +30597,12 @@ msgstr "" "Технічна інформація:\n" "%s" -#: ../share/extensions/inkex.py:260 +#: ../share/extensions/inkex.py:162 ../share/extensions/inkex.py:171 +#, python-format +msgid "Unable to open specified file: %s" +msgstr "Не вдалося відкрити вказаний файл: %s" + +#: ../share/extensions/inkex.py:276 #, python-format msgid "No matching node for expression: %s" msgstr "Не знайдено відповідного вузла для виразу: %s" @@ -28730,6 +30643,7 @@ msgstr "" "\n" #: ../share/extensions/jessyInk_autoTexts.py:54 +#, python-brace-format msgid "" "Node with id '{0}' is not a suitable text node and was therefore ignored.\n" "\n" @@ -28763,6 +30677,7 @@ msgstr "" "основного слайда.\n" #: ../share/extensions/jessyInk_summary.py:69 +#, python-brace-format msgid "JessyInk script version {0} installed." msgstr "Встановлено версію {0} скрипту JessyInk." @@ -28787,6 +30702,7 @@ msgstr "" "Слайд {0!s}:" #: ../share/extensions/jessyInk_summary.py:94 +#, python-brace-format msgid "{0}Layer name: {1}" msgstr "{0}Назва шару: {1}" @@ -28795,6 +30711,7 @@ msgid "{0}Transition in: {1} ({2!s} s)" msgstr "{0}Перехід у {1} ({2!s} с)" #: ../share/extensions/jessyInk_summary.py:104 +#, python-brace-format msgid "{0}Transition in: {1}" msgstr "{0}Перехід у {1}" @@ -28803,10 +30720,12 @@ msgid "{0}Transition out: {1} ({2!s} s)" msgstr "{0}Перехід з {1} ({2!s} с)" #: ../share/extensions/jessyInk_summary.py:113 +#, python-brace-format msgid "{0}Transition out: {1}" msgstr "{0}Вихідна позиція переходу: {1}" #: ../share/extensions/jessyInk_summary.py:120 +#, python-brace-format msgid "" "\n" "{0}Auto-texts:" @@ -28815,10 +30734,12 @@ msgstr "" "{0}Автотексти:" #: ../share/extensions/jessyInk_summary.py:123 +#, python-brace-format msgid "{0}\t\"{1}\" (object id \"{2}\") will be replaced by \"{3}\"." msgstr "{0}\t\"{1}\" (ідентифікатор об'єкта «{2}») буде замінено на «{3}»." #: ../share/extensions/jessyInk_summary.py:168 +#, python-brace-format msgid "" "\n" "{0}Initial effect (order number {1}):" @@ -28835,10 +30756,12 @@ msgstr "" "{0}Ефект {1!s} (порядковий номер {2}):" #: ../share/extensions/jessyInk_summary.py:174 +#, python-brace-format msgid "{0}\tView will be set according to object \"{1}\"" msgstr "{0}\tОбласть перегляду буде встановлено відповідно до об'єкта «{1}»" #: ../share/extensions/jessyInk_summary.py:176 +#, python-brace-format msgid "{0}\tObject \"{1}\"" msgstr "{0}\tОб'єкт «{1}»" @@ -28851,6 +30774,7 @@ msgid " will disappear" msgstr " зникне" #: ../share/extensions/jessyInk_summary.py:184 +#, python-brace-format msgid " using effect \"{0}\"" msgstr " з використанням ефекту «{0}»" @@ -28988,18 +30912,32 @@ msgstr "" "Спробуйте скористатися пунктом меню Контур -> Об'єкт у контур." #. issue error if no paths found -#: ../share/extensions/plotter.py:70 +#: ../share/extensions/plotter.py:71 msgid "" "No paths where found. Please convert all objects you want to plot into paths." msgstr "" "Контурів не знайдено. Будь ласка, перетворіть усі потрібні вам об’єкти для " "вирізання на контури." -#: ../share/extensions/plotter.py:131 -msgid "pySerial is not installed." -msgstr "Не встановлено pySerial." +#: ../share/extensions/plotter.py:132 +msgid "" +"pySerial is not installed.\n" +"\n" +"1. Download pySerial here (not the \".exe\"!): http://pypi.python.org/pypi/" +"pyserial\n" +"2. Extract the \"serial\" subfolder from the zip to the following folder: C:" +"\\[Program files]\\inkscape\\python\\Lib\\\n" +"3. Restart Inkscape." +msgstr "" +"pySerial не встановлено.\n" +"\n" +"1. Отримайте пакунок pySerial (не файл «.exe»!) тут: http://pypi.python.org/" +"pypi/pyserial\n" +"2. Виконайте видобування підтеки «serial» з архіву zip до цієї теки: C:" +"\\[Program files]\\inkscape\\python\\Lib\\\n" +"3. Перезапустіть Inkscape." -#: ../share/extensions/plotter.py:151 +#: ../share/extensions/plotter.py:152 msgid "" "Could not open port. Please check that your plotter is running, connected " "and the settings are correct." @@ -29141,8 +31079,18 @@ msgstr "Вам слід вибрати відповідне кодування #: ../share/extensions/uniconv-ext.py:56 #: ../share/extensions/uniconv_output.py:122 -msgid "You need to install the UniConvertor software.\n" -msgstr "Вам слід встановити UniConvertor.\n" +msgid "" +"You need to install the UniConvertor software.\n" +"For GNU/Linux: install the package python-uniconvertor.\n" +"For Windows: download it from\n" +"http://sk1project.org/modules.php?name=Products&product=uniconvertor\n" +"and install into your Inkscape's Python location\n" +msgstr "" +"Вам слід встановити програму UniConvertor.\n" +"У GNU/Linux: встановіть пакунок python-uniconvertor.\n" +"У Windows: отримайте пакунок зі сторінки\n" +"http://sk1project.org/modules.php?name=Products&product=uniconvertor\n" +"і встановіть його до теки Python Inkscape.\n" #: ../share/extensions/voronoi2svg.py:215 msgid "Please select objects!" @@ -31143,7 +33091,11 @@ msgstr "Зберегти сітку" msgid "Save Background" msgstr "Зберегти тло" -#: ../share/extensions/gimp_xcf.inx.h:7 +#: ../share/extensions/gimp_xcf.inx.h:6 +msgid "File Resolution:" +msgstr "Роздільність файла:" + +#: ../share/extensions/gimp_xcf.inx.h:8 msgid "" "This extension exports the document to Gimp XCF format according to the " "following options:\n" @@ -31151,6 +33103,7 @@ msgid "" " * Save Grid: convert the first rectangular grid to a Gimp grid (note " "that the default Inkscape grid is very narrow when shown in Gimp).\n" " * Save Background: add the document background to each converted layer.\n" +" * File Resolution: XCF file resolution, in DPI.\n" "\n" "Each first level layer is converted to a Gimp layer. Sublayers are " "concatenated and converted with their first level parent layer into a single " @@ -31163,12 +33116,14 @@ msgstr "" "(зауважте, що типову сітку Inkscape буде показано дуже вузькою у вікні " "Gimp).\n" " * Зберегти тло: додати тло документа до кожного з перетворених шарів.\n" +" * Роздільність файла: роздільна здатність даних у файлі XCF, у точках на " +"дюйм.\n" "\n" "Всі шари першого рівня буде перетворено у шари Gimp. Всі підлеглі шарити " "буде об'єднано і перетворено разом з відповідним батьківським шаром першого " "рівня у єдиний шар Gimp." -#: ../share/extensions/gimp_xcf.inx.h:13 +#: ../share/extensions/gimp_xcf.inx.h:15 msgid "GIMP XCF maintaining layers (*.xcf)" msgstr "GIMP XCF з підтримкою шарів (*.xcf)" @@ -31642,8 +33597,13 @@ msgid "Resolution X (dpi)" msgstr "Роздільна здатність за X (у т/дюйм):" #: ../share/extensions/hpgl_input.inx.h:4 -msgid "The amount of steps in one inch on the X axis. (Default: 1016.0)" -msgstr "Кількість кроків у одному дюймі за віссю X. (типове значення — 1016.0)" +#: ../share/extensions/hpgl_output.inx.h:5 +#: ../share/extensions/plotter.inx.h:21 +msgid "" +"The amount of steps the plotter moves if it moves for 1 inch on the X axis. " +"(Default: 1016.0)" +msgstr "" +"Кількість кроків різця у одному дюймі за віссю X (типове значення — 1016.0)" #: ../share/extensions/hpgl_input.inx.h:5 #: ../share/extensions/hpgl_output.inx.h:6 @@ -31652,8 +33612,13 @@ msgid "Resolution Y (dpi)" msgstr "Роздільна здатність за Y (у т/дюйм):" #: ../share/extensions/hpgl_input.inx.h:6 -msgid "The amount of steps in one inch on the Y axis. (Default: 1016.0)" -msgstr "Кількість кроків у одному дюймі за віссю Y. (типове значення — 1016.0)" +#: ../share/extensions/hpgl_output.inx.h:7 +#: ../share/extensions/plotter.inx.h:23 +msgid "" +"The amount of steps the plotter moves if it moves for 1 inch on the Y axis. " +"(Default: 1016.0)" +msgstr "" +"Кількість кроків різця у одному дюймі за віссю Y (типове значення — 1016.0)" #: ../share/extensions/hpgl_input.inx.h:7 msgid "Show movements between paths" @@ -31666,7 +33631,7 @@ msgstr "" "(Типове значення: не позначено)" #: ../share/extensions/hpgl_input.inx.h:9 -#: ../share/extensions/hpgl_output.inx.h:42 +#: ../share/extensions/hpgl_output.inx.h:43 msgid "HP Graphics Language file (*.hpgl)" msgstr "Файли графічної мови HP (*.hpgl)" @@ -31681,35 +33646,18 @@ msgstr "Експорт до HPGL" #: ../share/extensions/hpgl_output.inx.h:2 msgid "" "Please make sure that all objects you want to save are converted to paths. " -"The drawing will be automatically aligned to the zero point. Please use the " -"plotter extension (Extensions menu) to plot directly on a plotter." +"Please use the plotter extension (Extensions menu) to plot directly over a " +"serial connection." msgstr "" "Будь ласка, переконайтеся, що всі об’єкти, які слід вирізати, перетворено на " -"контури. Креслення буде автоматично вирівняно за нульовою точкою. " -"Скористайтеся додатком плотера (меню «Додатки»), щоб виконати вирізання " -"безпосередньо на плотері." +"контури. Скористайтеся додатком плотера (меню «Додатки»), щоб виконати " +"вирізання безпосередньо за допомогою послідовного з’єднання." #: ../share/extensions/hpgl_output.inx.h:3 #: ../share/extensions/plotter.inx.h:19 msgid "Plotter Settings" msgstr "Параметри вирізання" -#: ../share/extensions/hpgl_output.inx.h:5 -#: ../share/extensions/plotter.inx.h:21 -msgid "" -"The amount of steps the cutter moves if it moves for 1 inch on the X axis. " -"(Default: 1016.0)" -msgstr "" -"Кількість кроків різця у одному дюймі за віссю X (типове значення — 1016.0)" - -#: ../share/extensions/hpgl_output.inx.h:7 -#: ../share/extensions/plotter.inx.h:23 -msgid "" -"The amount of steps the cutter moves if it moves for 1 inch on the Y axis. " -"(Default: 1016.0)" -msgstr "" -"Кількість кроків різця у одному дюймі за віссю Y (типове значення — 1016.0)" - #: ../share/extensions/hpgl_output.inx.h:8 #: ../share/extensions/plotter.inx.h:24 msgid "Pen number" @@ -31730,26 +33678,27 @@ msgstr "Тиск різця (у грамах)" #: ../share/extensions/plotter.inx.h:27 msgid "" "The amount of force pushing down the pen in grams, set to 0 to omit command. " -"Most plotters ignore this command. (Default: 24)" +"Most plotters ignore this command. (Default: 0)" msgstr "" "Величина сили, що притискає різець, у грамах сили. Встановіть значення 0, " "якщо цю команду віддавати не слід. Більшість плотерів ігнорує цю команду. " -"(Типове значення: 24)" +"(Типове значення: 0)" #: ../share/extensions/hpgl_output.inx.h:12 #: ../share/extensions/plotter.inx.h:28 -msgid "Pen speed (cm/s)" -msgstr "Швидкість різця (у см/с)" +msgid "Pen speed (cm/s or mm/s)" +msgstr "Швидкість різця (у см/с або мм/с)" #: ../share/extensions/hpgl_output.inx.h:13 #: ../share/extensions/plotter.inx.h:29 msgid "" -"The speed the pen will move with in centimetres per second, set to 0 to omit " -"command. Most plotters ignore this command. (Default: 20)" +"The speed the pen will move with in centimeters or millimeters per second " +"(depending on your plotter model), set to 0 to omit command. Most plotters " +"ignore this command. (Default: 0)" msgstr "" -"Швидкість руху різця у сантиметрах на секунду. Встановіть значення 0, щоб " -"вимкнути команду. Більшість плотерів ігнорує цю команду. (Типове значення: " -"20)" +"Швидкість руху різця у сантиметрах або міліметрах на секунду (залежно від " +"моделі плотера). Встановіть значення 0, щоб вимкнути команду. Більшість " +"плотерів ігнорує цю команду. (Типове значення: 20)" #: ../share/extensions/hpgl_output.inx.h:14 #: ../share/extensions/plotter.inx.h:30 @@ -31758,7 +33707,7 @@ msgstr "Обертання за годинниковою стрілкою" #: ../share/extensions/hpgl_output.inx.h:15 #: ../share/extensions/plotter.inx.h:31 -msgid "Rotation of the plot. (Default: 0°)" +msgid "Rotation of the drawing. (Default: 0°)" msgstr "Кут обертання креслення. (Типове значення: 0°)" #: ../share/extensions/hpgl_output.inx.h:16 @@ -31866,30 +33815,20 @@ msgstr "Використовувати підрізання" #: ../share/extensions/hpgl_output.inx.h:32 #: ../share/extensions/plotter.inx.h:48 msgid "" -"Check this to plot a small line before the real plot to align the tool " -"orientation for the first real plot. (Default: Checked)" +"Check this to cut a small line before the real drawing starts to correctly " +"align the tool orientation. (Default: Checked)" msgstr "" "Позначте цей пункт, щоб різець вирізав невеличку пряму лінію, перш ніж " "виконати основну процедуру вирізання. Така лінія потрібна для вирівнювання " "орієнтації інструмента для першого вирізання. (Типове значення: позначено)" -#: ../share/extensions/hpgl_output.inx.h:33 -#: ../share/extensions/plotter.inx.h:49 -msgid "" -"Please note that using the tool offset correction will move your plot away " -"from the zero point by one tool offset length." -msgstr "" -"Будь ласка, зауважте, що у результаті використання виправлення відступу " -"інструмента різець буде відсунуто від нульової точки на довжину одного " -"відступу інструмента." - -#: ../share/extensions/hpgl_output.inx.h:35 -#: ../share/extensions/plotter.inx.h:51 +#: ../share/extensions/hpgl_output.inx.h:34 +#: ../share/extensions/plotter.inx.h:50 msgid "Curve flatness" msgstr "Пласкість кривої" -#: ../share/extensions/hpgl_output.inx.h:36 -#: ../share/extensions/plotter.inx.h:52 +#: ../share/extensions/hpgl_output.inx.h:35 +#: ../share/extensions/plotter.inx.h:51 msgid "" "Curves are divided into lines, this number controls how fine the curves will " "be reproduced, the smaller the finer. (Default: '1.2')" @@ -31897,36 +33836,49 @@ msgstr "" "Криві буде розділено на прямі відрізки. Це значення керує точністю такого " "поділу. Чим меншим воно буде, тим точнішим буде поділ. (Типове значення: 1.2)" -#: ../share/extensions/hpgl_output.inx.h:37 -#: ../share/extensions/plotter.inx.h:53 +#: ../share/extensions/hpgl_output.inx.h:36 +#: ../share/extensions/plotter.inx.h:52 msgid "X offset (mm)" msgstr "Відступ за X (у мм)" -#: ../share/extensions/hpgl_output.inx.h:38 -#: ../share/extensions/plotter.inx.h:54 -msgid "" -"The offset to move your plot away from the zero point on the X axis in mm. " -"(Default: '0.00')" +#: ../share/extensions/hpgl_output.inx.h:37 +#: ../share/extensions/plotter.inx.h:53 +msgid "Shifts your drawing on the X axis in mm. (Default: '0.00')" msgstr "" "Відступ вашого креслення від початкової точки за віссю X у мм. (Типове " "значення: 0.00)" -#: ../share/extensions/hpgl_output.inx.h:39 -#: ../share/extensions/plotter.inx.h:55 +#: ../share/extensions/hpgl_output.inx.h:38 +#: ../share/extensions/plotter.inx.h:54 msgid "Y offset (mm)" msgstr "Відступ за Y (у мм)" -#: ../share/extensions/hpgl_output.inx.h:40 -#: ../share/extensions/plotter.inx.h:56 -msgid "" -"The offset to move your plot away from the zero point on the Y axis in mm. " -"(Default: '0.00')" +#: ../share/extensions/hpgl_output.inx.h:39 +#: ../share/extensions/plotter.inx.h:55 +msgid "Shifts your drawing on the Y axis in mm. (Default: '0.00')" msgstr "" "Відступ вашого креслення від початкової точки за віссю Y у мм. (Типове " "значення: 0.00)" +#: ../share/extensions/hpgl_output.inx.h:40 +#: ../share/extensions/plotter.inx.h:56 +msgid "Auto align" +msgstr "Автовирівнювання" + #: ../share/extensions/hpgl_output.inx.h:41 -#: ../share/extensions/plotter.inx.h:59 +#: ../share/extensions/plotter.inx.h:57 +msgid "" +"Check this to auto align the drawing to the zero point (Plus the tool offset " +"if used). If unchecked you have to make sure that all parts of your drawing " +"are within the document border! (Default: Checked)" +msgstr "" +"Позначте цей пункт, щоб креслення було автоматично вирівняно за нульовою " +"точкою (плюс відступ інструмента, якщо він використовується). Якщо пункт не " +"буде позначено, слід переконатися, що усіх частини креслення перебувають у " +"межах документа! (Типовий стан: позначено)" + +#: ../share/extensions/hpgl_output.inx.h:42 +#: ../share/extensions/plotter.inx.h:60 msgid "" "All these settings depend on the plotter you use, for more information " "please consult the manual or homepage for your plotter." @@ -31935,7 +33887,7 @@ msgstr "" "Докладнішу інформацію можна отримати з підручника до плотера або домашньої " "сторінки компанії-виробника." -#: ../share/extensions/hpgl_output.inx.h:43 +#: ../share/extensions/hpgl_output.inx.h:44 msgid "Export an HP Graphics Language file" msgstr "Експортувати до файла графічної мови HP" @@ -33261,11 +35213,10 @@ msgstr "Різання" #: ../share/extensions/plotter.inx.h:2 msgid "" -"Please make sure that all objects you want to plot are converted to paths. " -"The plot will automatically be aligned to the zero point." +"Please make sure that all objects you want to plot are converted to paths." msgstr "" "Будь ласка, переконайтеся, що всі об’єкти, які слід вирізати, перетворено на " -"контури. Креслення буде автоматично вирівняно за нульовою точкою." +"контури." #: ../share/extensions/plotter.inx.h:3 msgid "Connection" @@ -33328,7 +35279,7 @@ msgstr "апаратне (DSR/DTR + RTS/CTS)" #: ../share/extensions/plotter.inx.h:16 msgid "" "Using wrong settings can under certain circumstances cause Inkscape to " -"freeze. Always save your work before plotting." +"freeze. Always save your work before plotting!" msgstr "" "Використання помилкових параметрів, за певних обставин, може призвести до " "зависання Inkscape. Завжди зберігайте вашу роботу до того, як розпочати " @@ -33347,11 +35298,11 @@ msgstr "" msgid "Parallel (LPT) connections are not supported." msgstr "Підтримки паралельних з’єднань (LPT) не передбачено." -#: ../share/extensions/plotter.inx.h:57 +#: ../share/extensions/plotter.inx.h:58 msgid "Show debug information" msgstr "Показувати діагностичну інформацію" -#: ../share/extensions/plotter.inx.h:58 +#: ../share/extensions/plotter.inx.h:59 msgid "" "Check this to get verbose information about the plot without actually " "sending something to the plotter (A.k.a. data dump). (Default: Unchecked)" @@ -33360,7 +35311,7 @@ msgstr "" "вирізання без надсилання даних на плотер (тобто отримувати дамп даних). " "(Типове значення: не позначено)" -#: ../share/extensions/plotter.inx.h:60 +#: ../share/extensions/plotter.inx.h:61 msgid "Plotter" msgstr "Плотер" @@ -35107,6 +37058,47 @@ msgstr "Популярний графічний формат для кліпар msgid "XAML Input" msgstr "Імпорт з XAML" +#~ msgctxt "Symbol" +#~ msgid "Intormation" +#~ msgstr "Інформація" + +#~ msgid "drawing-%d%s" +#~ msgstr "рисунок-%d%s" + +#~ msgid "%s" +#~ msgstr "%s" + +#~ msgid "Adjust the bisector's \"left\" end" +#~ msgstr "Скоригувати «лівий» кінець бісектриси" + +#~ msgid "Adjust the bisector's \"right\" end" +#~ msgstr "Скоригувати «правий» кінець бісектриси" + +#~ msgid " " +#~ msgstr " " + +#~ msgid "pySerial is not installed." +#~ msgstr "Не встановлено pySerial." + +#~ msgid "You need to install the UniConvertor software.\n" +#~ msgstr "Вам слід встановити UniConvertor.\n" + +#~ msgid "The amount of steps in one inch on the X axis. (Default: 1016.0)" +#~ msgstr "" +#~ "Кількість кроків у одному дюймі за віссю X. (типове значення — 1016.0)" + +#~ msgid "The amount of steps in one inch on the Y axis. (Default: 1016.0)" +#~ msgstr "" +#~ "Кількість кроків у одному дюймі за віссю Y. (типове значення — 1016.0)" + +#~ msgid "" +#~ "Please note that using the tool offset correction will move your plot " +#~ "away from the zero point by one tool offset length." +#~ msgstr "" +#~ "Будь ласка, зауважте, що у результаті використання виправлення відступу " +#~ "інструмента різець буде відсунуто від нульової точки на довжину одного " +#~ "відступу інструмента." + #~ msgid "(%d characters%s)" #~ msgstr "(%d символів%s)" @@ -35119,9 +37111,6 @@ msgstr "Імпорт з XAML" #~ msgid "8x8" #~ msgstr "8x8" -#~ msgid "16x16" -#~ msgstr "16x16" - #~ msgid "Oversample bitmaps:" #~ msgstr "Усереднювати растр по точках:" diff --git a/share/extensions/draw_from_triangle.py b/share/extensions/draw_from_triangle.py index 414363e86..42cda7035 100755 --- a/share/extensions/draw_from_triangle.py +++ b/share/extensions/draw_from_triangle.py @@ -148,6 +148,8 @@ def get_n_points_from_path( node, n):#returns a list of first n points (x,y) in if len(xi) == n and len(yi) == n: points = [] # returned pairs of points for i in range(n): + xi[i] = Draw_From_Triangle.unittouu(e, str(xi[i]) + 'px') + yi[i] = Draw_From_Triangle.unittouu(e, str(yi[i]) + 'px') points.append( [ xi[i], yi[i] ] ) else: #inkex.errormsg(_('Error: Not enough nodes to gather coordinates.')) #fail silently and exit, rather than invoke an error console @@ -190,17 +192,17 @@ class Style(object): #container for style information def __init__(self, options): #dot markers self.d_rad = 4 #dot marker radius - self.d_th = 2 #stroke width + self.d_th = Draw_From_Triangle.unittouu(e, '2px') #stroke width self.d_fill= '#aaaaaa' #fill colour self.d_col = '#000000' #stroke colour #lines - self.l_th = 2 + self.l_th = Draw_From_Triangle.unittouu(e, '2px') self.l_fill= 'none' self.l_col = '#000000' #circles - self.c_th = 2 + self.c_th = Draw_From_Triangle.unittouu(e, '2px') self.c_fill= 'none' self.c_col = '#000000' @@ -314,7 +316,7 @@ class Draw_From_Triangle(inkex.Effect): if len(pts) == 3: #if we have right number of nodes, else skip and end program st = Style(so)#style for dots, lines and circles - + #CREATE A GROUP TO HOLD ALL GENERATED ELEMENTS IN #Hold relative to point A (pt[0]) group_translation = 'translate(' + str( pts[0][0] ) + ','+ str( pts[0][1] ) + ')' diff --git a/share/extensions/foldablebox.py b/share/extensions/foldablebox.py index 5d5945dd9..b504de89f 100755 --- a/share/extensions/foldablebox.py +++ b/share/extensions/foldablebox.py @@ -70,7 +70,7 @@ class FoldableBox(inkex.Effect): box_id = self.uniqueId('box') self.box = g = inkex.etree.SubElement(self.current_layer, 'g', {'id':box_id}) - line_style = simplestyle.formatStyle({ 'stroke': '#000000', 'fill': 'none' }) + line_style = simplestyle.formatStyle({ 'stroke': '#000000', 'fill': 'none', 'stroke-width': str(self.unittouu('1px')) }) #self.createGuide( 0, docH, 0 ); diff --git a/share/extensions/grid_cartesian.py b/share/extensions/grid_cartesian.py index 85716a6fd..23df0ff84 100755 --- a/share/extensions/grid_cartesian.py +++ b/share/extensions/grid_cartesian.py @@ -122,7 +122,17 @@ class Grid_Polar(inkex.Effect): def effect(self): - + + self.options.border_th = self.unittouu(str(self.options.border_th) + 'px') + self.options.dx = self.unittouu(str(self.options.dx) + 'px') + self.options.x_divs_th = self.unittouu(str(self.options.x_divs_th) + 'px') + self.options.x_subdivs_th = self.unittouu(str(self.options.x_subdivs_th) + 'px') + self.options.x_subsubdivs_th = self.unittouu(str(self.options.x_subsubdivs_th) + 'px') + self.options.dy = self.unittouu(str(self.options.dy) + 'px') + self.options.y_divs_th = self.unittouu(str(self.options.y_divs_th) + 'px') + self.options.y_subdivs_th = self.unittouu(str(self.options.y_subdivs_th) + 'px') + self.options.y_subsubdivs_th = self.unittouu(str(self.options.y_subsubdivs_th) + 'px') + #find the pixel dimensions of the overall grid ymax = self.options.dy * self.options.y_divs xmax = self.options.dx * self.options.x_divs diff --git a/share/extensions/grid_isometric.py b/share/extensions/grid_isometric.py index 27951a0a8..8ac407613 100755 --- a/share/extensions/grid_isometric.py +++ b/share/extensions/grid_isometric.py @@ -84,6 +84,12 @@ class Grid_Polar(inkex.Effect): def effect(self): + self.options.dx = self.unittouu(str(self.options.dx) + 'px') + self.options.divs_th = self.unittouu(str(self.options.divs_th) + 'px') + self.options.subdivs_th = self.unittouu(str(self.options.subdivs_th) + 'px') + self.options.subsubdivs_th = self.unittouu(str(self.options.subsubdivs_th) + 'px') + self.options.border_th = self.unittouu(str(self.options.border_th) + 'px') + #Can't generate a grid too flat #If the Y dimension is smallest than half the X dimension, fix it. if self.options.y_divs<((self.options.x_divs+1)/2): diff --git a/share/extensions/grid_polar.py b/share/extensions/grid_polar.py index 3ae3fac34..17c3499cb 100755 --- a/share/extensions/grid_polar.py +++ b/share/extensions/grid_polar.py @@ -119,7 +119,16 @@ class Grid_Polar(inkex.Effect): help="The radial outset of the circumferential labels") def effect(self): - + + self.options.dr = self.unittouu(str(self.options.dr) + 'px') + self.options.r_divs_th = self.unittouu(str(self.options.r_divs_th) + 'px') + self.options.r_subdivs_th = self.unittouu(str(self.options.r_subdivs_th) + 'px') + self.options.a_divs_th = self.unittouu(str(self.options.a_divs_th) + 'px') + self.options.a_subdivs_th = self.unittouu(str(self.options.a_subdivs_th) + 'px') + self.options.c_dot_dia = self.unittouu(str(self.options.c_dot_dia) + 'px') + self.options.a_label_size = self.unittouu(str(self.options.a_label_size) + 'px') + self.options.a_label_outset = self.unittouu(str(self.options.a_label_outset) + 'px') + # Embed grid in group #Put in in the centre of the current view t = 'translate(' + str( self.view_center[0] ) + ',' + str( self.view_center[1] ) + ')' diff --git a/share/extensions/guides_creator.py b/share/extensions/guides_creator.py index abd41c6fc..21df1cd50 100755 --- a/share/extensions/guides_creator.py +++ b/share/extensions/guides_creator.py @@ -297,8 +297,8 @@ class Guides_Creator(inkex.Effect): svg = self.document.getroot() # getting the width and height attributes of the canvas - width = self.unittouu(svg.get('width')) - height = self.unittouu(svg.attrib['height']) + width = float(svg.get('width')) + height = float(svg.get('height')) # getting edges coordinates h_orientation = '0,' + str(round(width,4)) diff --git a/share/extensions/lindenmayer.py b/share/extensions/lindenmayer.py index f9abce3ec..2e058f541 100755 --- a/share/extensions/lindenmayer.py +++ b/share/extensions/lindenmayer.py @@ -104,7 +104,8 @@ class LSystem(inkex.Effect): return level_string def effect(self): - s = {'stroke-linejoin': 'miter', 'stroke-width': '1.0px', + self.options.step = self.unittouu(str(self.options.step) + 'px') + s = {'stroke-linejoin': 'miter', 'stroke-width': str(self.unittouu('1px')), 'stroke-opacity': '1.0', 'fill-opacity': '1.0', 'stroke': '#000000', 'stroke-linecap': 'butt', 'fill': 'none'} diff --git a/share/extensions/render_alphabetsoup.py b/share/extensions/render_alphabetsoup.py index ad43163e4..083f03af9 100755 --- a/share/extensions/render_alphabetsoup.py +++ b/share/extensions/render_alphabetsoup.py @@ -514,7 +514,7 @@ class AlphabetSoup(inkex.Effect): help="Generate random (unreadable) text") def effect(self): - zoom = self.options.zoom + zoom = self.unittouu( str(self.options.zoom) + 'px') if self.options.randomize: imagelist = generate_random_string(self.options.text, zoom) diff --git a/share/extensions/render_gear_rack.py b/share/extensions/render_gear_rack.py index 13eaf1017..68c5d050e 100644 --- a/share/extensions/render_gear_rack.py +++ b/share/extensions/render_gear_rack.py @@ -65,8 +65,8 @@ class RackGear(inkex.Effect): help="Contact Angle") def effect(self): - length = self.options.length - spacing = self.options.spacing + length = self.unittouu(str(self.options.length) + 'px') + spacing = self.unittouu(str(self.options.spacing) + 'px') angle = radians(self.options.angle) # generate points: list of (x, y) pairs @@ -93,7 +93,7 @@ class RackGear(inkex.Effect): g = inkex.etree.SubElement(self.current_layer, 'g', g_attribs) # Create SVG Path for gear - style = {'stroke': '#000000', 'fill': 'none'} + style = {'stroke': '#000000', 'fill': 'none', 'stroke-width': str(self.unittouu('1px'))} gear_attribs = { 'style': simplestyle.formatStyle(style), 'd': path} diff --git a/share/extensions/render_gears.py b/share/extensions/render_gears.py index 5201e553b..d5c8131a8 100644 --- a/share/extensions/render_gears.py +++ b/share/extensions/render_gears.py @@ -164,7 +164,7 @@ class Gears(inkex.Effect): g = inkex.etree.SubElement(self.current_layer, 'g', g_attribs) # Create SVG Path for gear - style = { 'stroke': '#000000', 'fill': 'none' } + style = { 'stroke': '#000000', 'fill': 'none', 'stroke-width': str(self.unittouu('1px')) } gear_attribs = {'style':simplestyle.formatStyle(style), 'd':path} gear = inkex.etree.SubElement(g, inkex.addNS('path','svg'), gear_attribs ) if(centerdiameter > 0.0): diff --git a/share/extensions/rtree.py b/share/extensions/rtree.py index 3231d284e..db677d0d5 100755 --- a/share/extensions/rtree.py +++ b/share/extensions/rtree.py @@ -44,7 +44,9 @@ class RTreeTurtle(inkex.Effect): dest="minimum", default=4.0, help="minimum branch size") def effect(self): - s = {'stroke-linejoin': 'miter', 'stroke-width': '1.0px', + self.options.size = self.unittouu(str(self.options.size) + 'px') + self.options.minimum = self.unittouu(str(self.options.minimum) + 'px') + s = {'stroke-linejoin': 'miter', 'stroke-width': str(self.unittouu('1px')), 'stroke-opacity': '1.0', 'fill-opacity': '1.0', 'stroke': '#000000', 'stroke-linecap': 'butt', 'fill': 'none'} diff --git a/share/extensions/spirograph.py b/share/extensions/spirograph.py index cb9d1ac24..77a258d5f 100755 --- a/share/extensions/spirograph.py +++ b/share/extensions/spirograph.py @@ -47,6 +47,9 @@ class Spirograph(inkex.Effect): help="The quality of the calculated output") def effect(self): + self.options.primaryr = self.unittouu(str(self.options.primaryr) + 'px') + self.options.secondaryr = self.unittouu(str(self.options.secondaryr) + 'px') + self.options.penr = self.unittouu(str(self.options.penr) + 'px') if self.options.secondaryr == 0: return @@ -68,7 +71,7 @@ class Spirograph(inkex.Effect): rotation = - math.pi * self.options.rotation / 180; new = inkex.etree.Element(inkex.addNS('path','svg')) - s = { 'stroke': '#000000', 'fill': 'none' } + s = { 'stroke': '#000000', 'fill': 'none', 'stroke-width': str(self.unittouu('1px')) } new.set('style', simplestyle.formatStyle(s)) pathString = '' diff --git a/share/symbols/AigaSymbols.svg b/share/symbols/AigaSymbols.svg index 946633315..3ac907e61 100644 --- a/share/symbols/AigaSymbols.svg +++ b/share/symbols/AigaSymbols.svg @@ -241,7 +241,7 @@ </symbol> <symbol id="BaggageLockers"> - <title>Bagage Lockers</title> + <title>Baggage Lockers</title> <!-- key --> <path d="m 34.625,11 a 7.5,7.5 0 1 0 0,7 l 2.375,0 2.5,-2.5 2,2 2,-2 2,2 2,-2 2,2 2.5,-2.5 c 0.5,-0.5 0.5,-1 0,-1.5 L 49.5,11 z M 27,14.5 a 2,2 0 1 1 -4,0 2,2 0 1 1 4,0 z" style="stroke:none"/> <!-- locker --> @@ -251,7 +251,7 @@ </symbol> <symbol id="BaggageLockers_Inv"> - <title>Bagage Lockers</title> + <title>Baggage Lockers</title> <rect x="0.5" y="0.5" width="71" height="71" ry="6" style="stroke:white"/> <!-- key --> <path d="m 34.625,11 a 7.5,7.5 0 1 0 0,7 l 2.375,0 2.5,-2.5 2,2 2,-2 2,2 2,-2 2,2 2.5,-2.5 c 0.5,-0.5 0.5,-1 0,-1.5 L 49.5,11 z M 27,14.5 a 2,2 0 1 1 -4,0 2,2 0 1 1 4,0 z" style="fill:white;stroke:none"/> @@ -1241,7 +1241,7 @@ </symbol> <symbol id="WheelChair1996"> - <title>NPS Wheelchair Accessable - 1996</title> + <title>NPS Wheelchair Accessible - 1996</title> <g style="stroke:none"> <circle cx="30" cy="11.75" r="5"/> <path d="M 51,36.5 C 50.48,35.61 49.5,35 48.5,35 L 36,35 35.8,31 45,31 a 2.25,2.25 0 0 0 0,-4.5 l -9.5,0 -0.2,-4.3 c -0.18,-2.6 -2.2,-4.75 -4.9,-4.6 -2.7,0.15 -5,2.5 -4.8,5.1 L 26.45,38 c 0.2,2.6 2.45,4.5 5.05,4.5 l 16.5,0 6.5,11.5 a 2.916,2.916 0 0 0 5,-3 z"/> @@ -1250,7 +1250,7 @@ </symbol> <symbol id="WheelChairInv"> - <title>NPS Wheelchair Accessable - 1996</title> + <title>NPS Wheelchair Accessible - 1996</title> <rect x="0.5" y="0.5" width="71" height="71" ry="6" style="stroke:white"/> <g style="fill:white;stroke:none"> <circle cx="30" cy="11.75" r="5"/> @@ -1260,7 +1260,7 @@ </symbol> <symbol id="WheelChair"> - <title>NPS Wheelchair Accessable</title> + <title>NPS Wheelchair Accessible</title> <g style="stroke:none"> <circle cx="30" cy="11.75" r="5"/> <path d="m 63.5,55.5 a 2.25,2.25 0 0 0 0,-4.5 l -4,0 L 51,36.5 C 50.48,35.61 49.5,35 48.5,35 L 36,35 35.8,31 45,31 a 2.25,2.25 0 0 0 0,-4.5 l -9.5,0 -0.2,-4.3 c -0.18,-2.6 -2.2,-4.75 -4.9,-4.6 -2.7,0.15 -5,2.5 -4.8,5.1 L 26.45,38 c 0.2,2.6 2.45,4.5 5.05,4.5 l 16.5,0 6.5,11.5 c 0.25,0.5 1.3,1.5 2.5,1.5 z"/> @@ -1269,7 +1269,7 @@ </symbol> <symbol id="WheelChair_Inv"> - <title>NPS Wheelchair Accessable</title> + <title>NPS Wheelchair Accessible</title> <rect x="0.5" y="0.5" width="71" height="71" ry="6" style="stroke:white"/> <g style="fill:white;stroke:none"> <circle cx="30" cy="11.75" r="5"/> @@ -1279,7 +1279,7 @@ </symbol> <symbol id="WheelChairNew"> - <title>New Wheelchair Accessable</title> + <title>New Wheelchair Accessible</title> <g style="stroke:none"> <circle cx="37" cy="12.5" r="5"/> <path d="m 15.9,31.3 5.3,-7.7 c 0.3,-0.4 0.9,-0.8 1.3,-1 L 32,18.5 c 4,-1.8 7,2 6.5,4.7 l -2,9.8 9.5,2 c 1.3,0.3 2.1,0.9 2.8,2 l 7.3,12.3 2.8,-1.9 c 2.2,-1.5 4.5,1.7 2.2,3.3 l -5.6,3.8 c -1,0.7 -2.5,0.4 -3,-0.5 l -7,-12 -15,-3 c -2,-0.4 -3.8,-3 -3.5,-5 l 2,-10 -4.5,2 -5.4,7.6 c -1.5,2.2 -4.8,0 -3.2,-2.4 z"/> @@ -1288,7 +1288,7 @@ </symbol> <symbol id="WheelChairNew_Inv"> - <title>New Wheelchair Accessable</title> + <title>New Wheelchair Accessible</title> <rect x="0.5" y="0.5" width="71" height="71" ry="6" style="stroke:white"/> <g style="fill:white;stroke:none"> <circle cx="37" cy="12.5" r="5"/> diff --git a/share/symbols/MapSymbols.svg b/share/symbols/MapSymbols.svg index 0d3e1b0fa..4fccc0492 100644 --- a/share/symbols/MapSymbols.svg +++ b/share/symbols/MapSymbols.svg @@ -1911,7 +1911,7 @@ <path inkscape:connector-curvature="0" transform="matrix(14.68584,0,0,14.68584,569.7658,1146.064)" style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;font-family:NPSPICT3;-inkscape-font-specification:NPSPICT3" d="m -7.062988,-45.30859 c -0.479361,0 -1.139151,0.14668 -1.97937,0.44006 -0.84028,0.29337 -1.500472,0.44006 -1.980592,0.44006 -0.47936,0 -1.14586,-0.14669 -1.99951,-0.44006 -0.85371,-0.29338 -1.50719,-0.44006 -1.96045,-0.44006 -0.47935,0 -1.14586,0.14668 -1.99951,0.44006 -0.8537,0.29337 -1.5202,0.44006 -1.99951,0.44006 -0.45413,0 -1.10781,-0.14669 -1.96106,-0.44006 -0.85329,-0.29338 -1.51959,-0.44006 -1.99891,-0.44006 -0.48015,0 -1.14035,0.14668 -1.98059,0.44006 -0.84026,0.29337 -1.50046,0.44006 -1.98059,0.44006 -0.47934,0 -1.13913,-0.14669 -1.97937,-0.44006 -0.84026,-0.29338 -1.50045,-0.44006 -1.98059,-0.44006 -0.47933,0 -1.14584,0.14668 -1.99951,0.44006 -0.85368,0.29337 -1.50717,0.44006 -1.96045,0.44006 l 0,2.91993 c 0.45328,-10e-6 1.10677,-0.1467 1.96045,-0.44007 0.85367,-0.29338 1.52018,-0.44007 1.99951,-0.44006 0.48014,-1e-5 1.14033,0.14668 1.98059,0.44006 0.84024,0.29337 1.50003,0.44006 1.97937,0.44007 0.48013,-10e-6 1.14033,-0.1467 1.98059,-0.44007 0.84024,-0.29338 1.50044,-0.44007 1.98059,-0.44006 0.47932,-1e-5 1.14562,0.14668 1.99891,0.44006 0.85325,0.29337 1.50693,0.44006 1.96106,0.44007 0.47931,-10e-6 1.14581,-0.1467 1.99951,-0.44007 0.85365,-0.29338 1.52016,-0.44007 1.99951,-0.44006 0.45326,-1e-5 1.10674,0.14668 1.96045,0.44006 0.85365,0.29337 1.52015,0.44006 1.99951,0.44007 0.48012,-10e-6 1.140312,-0.1467 1.980592,-0.44007 0.840219,-0.29338 1.500009,-0.44007 1.97937,-0.44006 0.48011,-1e-5 1.140307,0.14668 1.980591,0.44006 0.840215,0.29337 1.500005,0.44006 1.97937,0.44007 l 0,-2.91993 c -0.479365,0 -1.139155,-0.14669 -1.97937,-0.44006 -0.840284,-0.29338 -1.500481,-0.44006 -1.980591,-0.44006 L -7.062988,-45.30859 z m -8.759762,-30.52002 -18.07984,22.08008 18.07984,0 L -15.82275,-75.82861 z m 1.67968,5.08056 0,16.99952 10.841068,0 c 0.05286,-0.48014 0.07931,-0.94686 0.07935,-1.40015 -3.6e-5,-3.38622 -1.199986,-6.59951 -3.599854,-9.63989 -2.053253,-2.63996 -4.493444,-4.62645 -7.320564,-5.95948 L -14.14307,-70.74805 z m -15.47973,18.59986 0,4.36035 c 0.42723,0.13265 0.8675,0.27913 1.3208,0.43945 0.45327,0.16032 0.91958,0.24048 1.39892,0.24048 0.48013,0 1.14684,-0.14669 2.00013,-0.44006 0.85325,-0.29338 1.50694,-0.44007 1.96105,-0.44007 0.47932,0 1.14562,0.14669 1.99891,0.44007 0.85325,0.29337 1.50693,0.44006 1.96106,0.44006 0.47931,0 1.14581,-0.14669 1.99951,-0.44006 0.85365,-0.29338 1.52016,-0.44007 1.99951,-0.44007 0.45326,0 1.10674,0.14669 1.96045,0.44007 0.85365,0.29337 1.52015,0.44006 1.99951,0.44006 -3e-5,0 0.13344,-0.0134 0.40039,-0.0403 -3e-5,0 -3e-5,0 0,0 -3e-5,0 0.007,0 0.0201,0 0.0134,0 0.0466,0 0.0995,0 0.0537,-0.0269 0.1139,-0.0403 0.18066,-0.0403 0.0667,0 0.20668,-0.0269 0.419926,-0.0806 0.639619,-0.29297 1.41273,-0.75928 2.319336,-1.39893 L -4.782715,-52.14819 -29.6228,-52.14819 Z" id="path17239" /> </symbol> <symbol transform="matrix(0.1103728,0,0,0.1103728,454.4565,1345.265)" id="g70357"> -<title id="title17247">Leasure Center</title> +<title id="title17247">Leisure Center</title> <g id="g17249"> <path d="M 66.275,1.768 C 24.94,1.768 1.704,23.139 1.704,86.804 l 0,450.123 c 0,20.844 20.896,42.229 62.192,42.229 l 452.024,0 c 41.307,0 62.229,-20.313 62.229,-62.229 l 0,-450.123 C 578.149,24.203 557.227,1.768 514.628,1.768 514.624,1.768 66.133,1.625 66.275,1.768 Z" style="fill:#111111;stroke:#eeeeee;stroke-width:3.408" id="path17251" inkscape:connector-curvature="0" /> </g> @@ -2098,7 +2098,7 @@ <path inkscape:connector-curvature="0" style="fill:#ffffff;fill-opacity:1" d="m 186.1224,419.2769 c -15.5875,-2.1652 -30.477,-11.4087 -37.973,-25.4518 8.3008,-9.2226 20.1547,0.1201 29.846,1.0014 22.6039,2.8578 43.7286,-12.0049 54.7396,-30.8782 7.138,-6.8412 8.0681,-25.4986 20.4823,-22.7628 8.9533,4.9551 7.2662,16.3566 5.0791,24.6398 -1.4157,11.0444 -6.7831,20.9741 -13.878,29.3942 -5.5893,7.486 -11.1394,16.0521 -20.8063,18.5313 C 211.2499,416.0508 198.9486,421.8935 186.1224,419.2769 z m -55.2276,-120.843 c -11.9155,-7.0335 -26.2781,-11.3583 -34.72464,-23.0337 -1.88388,-13.2833 14.87324,-21.9448 26.01984,-16.757 13.1263,4.1069 25.5393,11.6235 33.8461,22.7568 5.5137,10.0174 -4.0566,25.8353 -15.9644,20.6756 C 136.9139,301.1213 133.9712,299.6034 130.8948,298.4339 z m 75.9973,-24.5921 c -8.3339,-10.9448 -8.412,-29.9962 4.5392,-37.5055 8.506,-5.6193 20.7127,-9.4814 29.7536,-2.8491 4.7457,9.7797 -3.6123,18.7431 -7.3837,27.2043 -2.2786,8.5463 -7.8821,18.1434 -17.6474,18.9946 C 212.222,279.7835 208.731,277.1721 206.8921,273.8418 Z" id="path20423" /> </symbol> <symbol transform="matrix(0.1103727,0,0,0.1103727,-15.22728,1604.204)" id="g81881"> -<title id="title20431">Park / Picnick Area</title> +<title id="title20431">Park / Picnic Area</title> <g id="g20433"> <path inkscape:connector-curvature="0" d="M 66.275,1.768 C 24.94,1.768 1.704,23.139 1.704,66.804 l 0,450.123 c 0,40.844 20.895,62.229 62.192,62.229 l 452.024,0 c 41.307,0 62.229,-20.315 62.229,-62.229 l 0,-450.123 C 578.149,24.203 557.227,1.768 514.628,1.768 514.624,1.768 66.133,1.625 66.275,1.768 Z" style="fill:#111111;stroke:#eeeeee;stroke-width:3.408" id="path20435" /> </g> @@ -2134,7 +2134,7 @@ <path inkscape:connector-curvature="0" d="m 71.97432,176.8669 0,-32.9636 214.18778,-90.82787 216.4043,88.83257 0,32.9649 L 284.1904,90.53986 71.97432,176.8669 Z M 130.5485,175.3484 287.8228,112.4378 440.7941,177.038 378.835,176.7565 287.3056,144.3501 196.0368,174.7018 130.5485,175.3484 Z" style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none" id="path20491" /> </symbol> <symbol transform="matrix(0.1103727,0,0,0.1103727,60.52537,1606.476)" id="g78634"> -<title id="title20499">Intormation</title> +<title id="title20499">Information</title> <g id="g20501"> <path inkscape:connector-curvature="0" d="M 66.275,1.768 C 24.94,1.768 1.704,23.139 1.704,66.804 l 0,450.123 c 0,40.844 20.894,62.229 62.192,62.229 l 452.024,0 c 41.307,0 62.229,-20.316 62.229,-62.229 l 0,-450.123 C 578.149,24.203 557.227,1.768 514.627,1.768 514.624,1.768 66.133,1.625 66.275,1.768 Z" style="fill:#111111;stroke:#eeeeee;stroke-width:3.408" id="path20503" /> </g> diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 54b15d342..d1a3d194e 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -78,7 +78,7 @@ set(sp_SRC sp-use-reference.cpp sp-use.cpp splivarot.cpp - + viewbox.cpp # ------- # Headers @@ -163,6 +163,7 @@ set(sp_SRC sp-tspan.h sp-use-reference.h sp-use.h + viewbox.h ) set(inkscape_SRC diff --git a/src/Makefile_insert b/src/Makefile_insert index 5e441560a..7aedb38ee 100644 --- a/src/Makefile_insert +++ b/src/Makefile_insert @@ -228,7 +228,8 @@ ink_common_sources += \ uri-references.cpp uri-references.h \ vanishing-point.cpp vanishing-point.h \ verbs.cpp verbs.h \ - version.cpp version.h + version.cpp version.h \ + viewbox.cpp viewbox.h # Additional dependencies diff --git a/src/display/canvas-arena.cpp b/src/display/canvas-arena.cpp index 8e25c1843..404a94828 100644 --- a/src/display/canvas-arena.cpp +++ b/src/display/canvas-arena.cpp @@ -216,10 +216,10 @@ sp_canvas_arena_render (SPCanvasItem *item, SPCanvasBuf *buf) Geom::OptIntRect r = buf->rect; if (!r || r->hasZeroArea()) return; - Inkscape::DrawingContext ct(buf->ct, r->min()); + Inkscape::DrawingContext dc(buf->ct, r->min()); arena->drawing.update(Geom::IntRect::infinite(), arena->ctx); - arena->drawing.render(ct, *r); + arena->drawing.render(dc, *r); } static double @@ -386,9 +386,9 @@ sp_canvas_arena_render_surface (SPCanvasArena *ca, cairo_surface_t *surface, Geo g_return_if_fail (ca != NULL); g_return_if_fail (SP_IS_CANVAS_ARENA (ca)); - Inkscape::DrawingContext ct(surface, r.min()); + Inkscape::DrawingContext dc(surface, r.min()); ca->drawing.update(Geom::IntRect::infinite(), ca->ctx); - ca->drawing.render(ct, r); + ca->drawing.render(dc, r); } /* diff --git a/src/display/drawing-context.cpp b/src/display/drawing-context.cpp index de5beb0f6..319136e06 100644 --- a/src/display/drawing-context.cpp +++ b/src/display/drawing-context.cpp @@ -25,27 +25,27 @@ using Geom::Y; */ DrawingContext::Save::Save() - : _ct(NULL) + : _dc(NULL) {} -DrawingContext::Save::Save(DrawingContext &ct) - : _ct(&ct) +DrawingContext::Save::Save(DrawingContext &dc) + : _dc(&dc) { - _ct->save(); + _dc->save(); } DrawingContext::Save::~Save() { - if (_ct) { - _ct->restore(); + if (_dc) { + _dc->restore(); } } -void DrawingContext::Save::save(DrawingContext &ct) +void DrawingContext::Save::save(DrawingContext &dc) { - if (_ct) { + if (_dc) { // TODO: it might be better to treat this occurence as a bug - _ct->restore(); + _dc->restore(); } - _ct = &ct; - _ct->save(); + _dc = &dc; + _dc->save(); } /** diff --git a/src/display/drawing-context.h b/src/display/drawing-context.h index 35be9a86b..d990bcb73 100644 --- a/src/display/drawing-context.h +++ b/src/display/drawing-context.h @@ -31,11 +31,11 @@ public: class Save { public: Save(); - Save(DrawingContext &ct); + Save(DrawingContext &dc); ~Save(); - void save(DrawingContext &ct); + void save(DrawingContext &dc); private: - DrawingContext *_ct; + DrawingContext *_dc; }; DrawingContext(cairo_t *ct, Geom::Point const &origin); diff --git a/src/display/drawing-group.cpp b/src/display/drawing-group.cpp index b5ce18891..38ace001f 100644 --- a/src/display/drawing-group.cpp +++ b/src/display/drawing-group.cpp @@ -98,12 +98,12 @@ DrawingGroup::_updateItem(Geom::IntRect const &area, UpdateContext const &ctx, u } unsigned -DrawingGroup::_renderItem(DrawingContext &ct, Geom::IntRect const &area, unsigned flags, DrawingItem *stop_at) +DrawingGroup::_renderItem(DrawingContext &dc, Geom::IntRect const &area, unsigned flags, DrawingItem *stop_at) { if (stop_at == NULL) { // normal rendering for (ChildrenList::iterator i = _children.begin(); i != _children.end(); ++i) { - i->render(ct, area, flags, stop_at); + i->render(dc, area, flags, stop_at); } } else { // background rendering @@ -111,11 +111,11 @@ DrawingGroup::_renderItem(DrawingContext &ct, Geom::IntRect const &area, unsigne if (&*i == stop_at) return RENDER_OK; // do not render the stop_at item at all if (i->isAncestorOf(stop_at)) { // render its ancestors without masks, opacity or filters - i->render(ct, area, flags | RENDER_FILTER_BACKGROUND, stop_at); + i->render(dc, area, flags | RENDER_FILTER_BACKGROUND, stop_at); // stop further rendering return RENDER_OK; } else { - i->render(ct, area, flags, stop_at); + i->render(dc, area, flags, stop_at); } } } @@ -123,10 +123,10 @@ DrawingGroup::_renderItem(DrawingContext &ct, Geom::IntRect const &area, unsigne } void -DrawingGroup::_clipItem(DrawingContext &ct, Geom::IntRect const &area) +DrawingGroup::_clipItem(DrawingContext &dc, Geom::IntRect const &area) { for (ChildrenList::iterator i = _children.begin(); i != _children.end(); ++i) { - i->clip(ct, area); + i->clip(dc, area); } } diff --git a/src/display/drawing-group.h b/src/display/drawing-group.h index 775fec8c4..651e9d8af 100644 --- a/src/display/drawing-group.h +++ b/src/display/drawing-group.h @@ -34,9 +34,9 @@ public: protected: virtual unsigned _updateItem(Geom::IntRect const &area, UpdateContext const &ctx, unsigned flags, unsigned reset); - virtual unsigned _renderItem(DrawingContext &ct, Geom::IntRect const &area, unsigned flags, + virtual unsigned _renderItem(DrawingContext &dc, Geom::IntRect const &area, unsigned flags, DrawingItem *stop_at); - virtual void _clipItem(DrawingContext &ct, Geom::IntRect const &area); + virtual void _clipItem(DrawingContext &dc, Geom::IntRect const &area); virtual DrawingItem *_pickItem(Geom::Point const &p, double delta, unsigned flags); virtual bool _canClip(); diff --git a/src/display/drawing-image.cpp b/src/display/drawing-image.cpp index 1b9214c49..8fd81caac 100644 --- a/src/display/drawing-image.cpp +++ b/src/display/drawing-image.cpp @@ -102,22 +102,22 @@ DrawingImage::_updateItem(Geom::IntRect const &, UpdateContext const &, unsigned return STATE_ALL; } -unsigned DrawingImage::_renderItem(DrawingContext &ct, Geom::IntRect const &/*area*/, unsigned /*flags*/, DrawingItem * /*stop_at*/) +unsigned DrawingImage::_renderItem(DrawingContext &dc, Geom::IntRect const &/*area*/, unsigned /*flags*/, DrawingItem * /*stop_at*/) { bool outline = _drawing.outline(); if (!outline) { if (!_pixbuf) return RENDER_OK; - Inkscape::DrawingContext::Save save(ct); - ct.transform(_ctm); - ct.newPath(); - ct.rectangle(_clipbox); - ct.clip(); + Inkscape::DrawingContext::Save save(dc); + dc.transform(_ctm); + dc.newPath(); + dc.rectangle(_clipbox); + dc.clip(); - ct.translate(_origin); - ct.scale(_scale); - ct.setSource(_pixbuf->getSurfaceRaw(), 0, 0); + dc.translate(_origin); + dc.scale(_scale); + dc.setSource(_pixbuf->getSurfaceRaw(), 0, 0); if (_style) { // See: http://www.w3.org/TR/SVG/painting.html#ImageRenderingProperty @@ -128,24 +128,24 @@ unsigned DrawingImage::_renderItem(DrawingContext &ct, Geom::IntRect const &/*ar // Do nothing break; case SP_CSS_COLOR_RENDERING_OPTIMIZEQUALITY: - ct.patternSetFilter( CAIRO_FILTER_BEST ); + dc.patternSetFilter( CAIRO_FILTER_BEST ); break; case SP_CSS_COLOR_RENDERING_OPTIMIZESPEED: default: - ct.patternSetFilter( CAIRO_FILTER_NEAREST ); + dc.patternSetFilter( CAIRO_FILTER_NEAREST ); break; } } - ct.paint(_opacity); + dc.paint(_opacity); } else { // outline; draw a rect instead Inkscape::Preferences *prefs = Inkscape::Preferences::get(); guint32 rgba = prefs->getInt("/options/wireframecolors/images", 0xff0000ff); - { Inkscape::DrawingContext::Save save(ct); - ct.transform(_ctm); - ct.newPath(); + { Inkscape::DrawingContext::Save save(dc); + dc.transform(_ctm); + dc.newPath(); Geom::Rect r = bounds(); Geom::Point c00 = r.corner(0); @@ -153,21 +153,21 @@ unsigned DrawingImage::_renderItem(DrawingContext &ct, Geom::IntRect const &/*ar Geom::Point c11 = r.corner(2); Geom::Point c10 = r.corner(1); - ct.moveTo(c00); + dc.moveTo(c00); // the box - ct.lineTo(c10); - ct.lineTo(c11); - ct.lineTo(c01); - ct.lineTo(c00); + dc.lineTo(c10); + dc.lineTo(c11); + dc.lineTo(c01); + dc.lineTo(c00); // the diagonals - ct.lineTo(c11); - ct.moveTo(c10); - ct.lineTo(c01); + dc.lineTo(c11); + dc.moveTo(c10); + dc.lineTo(c01); } - ct.setLineWidth(0.5); - ct.setSource(rgba); - ct.stroke(); + dc.setLineWidth(0.5); + dc.setSource(rgba); + dc.stroke(); } return RENDER_OK; } diff --git a/src/display/drawing-image.h b/src/display/drawing-image.h index cebaafc85..64e4517b0 100644 --- a/src/display/drawing-image.h +++ b/src/display/drawing-image.h @@ -38,7 +38,7 @@ public: protected: virtual unsigned _updateItem(Geom::IntRect const &area, UpdateContext const &ctx, unsigned flags, unsigned reset); - virtual unsigned _renderItem(DrawingContext &ct, Geom::IntRect const &area, unsigned flags, + virtual unsigned _renderItem(DrawingContext &dc, Geom::IntRect const &area, unsigned flags, DrawingItem *stop_at); virtual DrawingItem *_pickItem(Geom::Point const &p, double delta, unsigned flags); diff --git a/src/display/drawing-item.cpp b/src/display/drawing-item.cpp index a9b07bb6e..13e7b61eb 100644 --- a/src/display/drawing-item.cpp +++ b/src/display/drawing-item.cpp @@ -24,60 +24,60 @@ namespace Inkscape { #ifdef WITH_CSSBLEND -void set_cairo_blend_operator( DrawingContext &ct, unsigned blend_mode ) { +void set_cairo_blend_operator( DrawingContext &dc, unsigned blend_mode ) { // All of the blend modes are implemented in Cairo as of 1.10. // For a detailed description, see: // http://cairographics.org/operators/ switch (blend_mode) { case SP_CSS_BLEND_MULTIPLY: - ct.setOperator(CAIRO_OPERATOR_MULTIPLY); + dc.setOperator(CAIRO_OPERATOR_MULTIPLY); break; case SP_CSS_BLEND_SCREEN: - ct.setOperator(CAIRO_OPERATOR_SCREEN); + dc.setOperator(CAIRO_OPERATOR_SCREEN); break; case SP_CSS_BLEND_DARKEN: - ct.setOperator(CAIRO_OPERATOR_DARKEN); + dc.setOperator(CAIRO_OPERATOR_DARKEN); break; case SP_CSS_BLEND_LIGHTEN: - ct.setOperator(CAIRO_OPERATOR_LIGHTEN); + dc.setOperator(CAIRO_OPERATOR_LIGHTEN); break; case SP_CSS_BLEND_OVERLAY: - ct.setOperator(CAIRO_OPERATOR_OVERLAY); + dc.setOperator(CAIRO_OPERATOR_OVERLAY); break; case SP_CSS_BLEND_COLORDODGE: - ct.setOperator(CAIRO_OPERATOR_COLOR_DODGE); + dc.setOperator(CAIRO_OPERATOR_COLOR_DODGE); break; case SP_CSS_BLEND_COLORBURN: - ct.setOperator(CAIRO_OPERATOR_COLOR_BURN); + dc.setOperator(CAIRO_OPERATOR_COLOR_BURN); break; case SP_CSS_BLEND_HARDLIGHT: - ct.setOperator(CAIRO_OPERATOR_HARD_LIGHT); + dc.setOperator(CAIRO_OPERATOR_HARD_LIGHT); break; case SP_CSS_BLEND_SOFTLIGHT: - ct.setOperator(CAIRO_OPERATOR_SOFT_LIGHT); + dc.setOperator(CAIRO_OPERATOR_SOFT_LIGHT); break; case SP_CSS_BLEND_DIFFERENCE: - ct.setOperator(CAIRO_OPERATOR_DIFFERENCE); + dc.setOperator(CAIRO_OPERATOR_DIFFERENCE); break; case SP_CSS_BLEND_EXCLUSION: - ct.setOperator(CAIRO_OPERATOR_EXCLUSION); + dc.setOperator(CAIRO_OPERATOR_EXCLUSION); break; case SP_CSS_BLEND_HUE: - ct.setOperator(CAIRO_OPERATOR_HSL_HUE); + dc.setOperator(CAIRO_OPERATOR_HSL_HUE); break; case SP_CSS_BLEND_SATURATION: - ct.setOperator(CAIRO_OPERATOR_HSL_SATURATION); + dc.setOperator(CAIRO_OPERATOR_HSL_SATURATION); break; case SP_CSS_BLEND_COLOR: - ct.setOperator(CAIRO_OPERATOR_HSL_COLOR); + dc.setOperator(CAIRO_OPERATOR_HSL_COLOR); break; case SP_CSS_BLEND_LUMINOSITY: - ct.setOperator(CAIRO_OPERATOR_HSL_LUMINOSITY); + dc.setOperator(CAIRO_OPERATOR_HSL_LUMINOSITY); break; case SP_CSS_BLEND_NORMAL: default: - ct.setOperator(CAIRO_OPERATOR_OVER); + dc.setOperator(CAIRO_OPERATOR_OVER); break; } } @@ -545,7 +545,7 @@ struct MaskLuminanceToAlpha { * @param flags Rendering options. This deals mainly with cache control. */ unsigned -DrawingItem::render(DrawingContext &ct, Geom::IntRect const &area, unsigned flags, DrawingItem *stop_at) +DrawingItem::render(DrawingContext &dc, Geom::IntRect const &area, unsigned flags, DrawingItem *stop_at) { bool outline = _drawing.outline(); bool render_filters = _drawing.renderFilters(); @@ -560,7 +560,7 @@ DrawingItem::render(DrawingContext &ct, Geom::IntRect const &area, unsigned flag // TODO convert outline rendering to a separate virtual function if (outline) { - _renderOutline(ct, area, flags); + _renderOutline(dc, area, flags); return RENDER_OK; } @@ -573,9 +573,9 @@ DrawingItem::render(DrawingContext &ct, Geom::IntRect const &area, unsigned flag if (_cache) { _cache->prepare(); #ifdef WITH_CSSBLEND - set_cairo_blend_operator( ct, _blend_mode ); + set_cairo_blend_operator( dc, _blend_mode ); #endif - _cache->paintFromCache(ct, carea); + _cache->paintFromCache(dc, carea); if (!carea) return RENDER_OK; } else { // There is no cache. This could be because caching of this item @@ -625,7 +625,7 @@ DrawingItem::render(DrawingContext &ct, Geom::IntRect const &area, unsigned flag // filters and opacity do not apply when rendering the ancestors of the filtered // element if ((flags & RENDER_FILTER_BACKGROUND) || !needs_intermediate_rendering) { - return _renderItem(ct, *carea, flags & ~RENDER_FILTER_BACKGROUND, stop_at); + return _renderItem(dc, *carea, flags & ~RENDER_FILTER_BACKGROUND, stop_at); } // iarea is the bounding box for intermediate rendering @@ -688,9 +688,9 @@ DrawingItem::render(DrawingContext &ct, Geom::IntRect const &area, unsigned flag } if (bg_root) { DrawingSurface bg(*iarea); - DrawingContext bgct(bg); - bg_root->render(bgct, *iarea, flags | RENDER_FILTER_BACKGROUND, this); - _filter->render(this, ict, &bgct); + DrawingContext bgdc(bg); + bg_root->render(bgdc, *iarea, flags | RENDER_FILTER_BACKGROUND, this); + _filter->render(this, ict, &bgdc); rendered = true; } } @@ -716,20 +716,20 @@ DrawingItem::render(DrawingContext &ct, Geom::IntRect const &area, unsigned flag cachect.fill(); _cache->markClean(*carea); } - ct.rectangle(*carea); - ct.setSource(&intermediate); + dc.rectangle(*carea); + dc.setSource(&intermediate); #ifdef WITH_CSSBLEND - set_cairo_blend_operator( ct, _blend_mode ); + set_cairo_blend_operator( dc, _blend_mode ); #endif - ct.fill(); - ct.setSource(0,0,0,0); - // the call above is to clear a ref on the intermediate surface held by ct + dc.fill(); + dc.setSource(0,0,0,0); + // the call above is to clear a ref on the intermediate surface held by dc return render_result; } void -DrawingItem::_renderOutline(DrawingContext &ct, Geom::IntRect const &area, unsigned flags) +DrawingItem::_renderOutline(DrawingContext &dc, Geom::IntRect const &area, unsigned flags) { // intersect with bbox rather than drawbox, as we want to render things outside // of the clipping path as well @@ -738,7 +738,7 @@ DrawingItem::_renderOutline(DrawingContext &ct, Geom::IntRect const &area, unsig // just render everything: item, clip, mask // First, render the object itself - _renderItem(ct, *carea, flags, NULL); + _renderItem(dc, *carea, flags, NULL); // render clip and mask, if any guint32 saved_rgba = _drawing.outlinecolor; // save current outline color @@ -746,12 +746,12 @@ DrawingItem::_renderOutline(DrawingContext &ct, Geom::IntRect const &area, unsig Inkscape::Preferences *prefs = Inkscape::Preferences::get(); if (_clip) { _drawing.outlinecolor = prefs->getInt("/options/wireframecolors/clips", 0x00ff00ff); // green clips - _clip->render(ct, *carea, flags); + _clip->render(dc, *carea, flags); } // render mask as an object, using a different color if (_mask) { _drawing.outlinecolor = prefs->getInt("/options/wireframecolors/masks", 0x0000ffff); // blue masks - _mask->render(ct, *carea, flags); + _mask->render(dc, *carea, flags); } _drawing.outlinecolor = saved_rgba; // restore outline color } @@ -765,31 +765,31 @@ DrawingItem::_renderOutline(DrawingContext &ct, Geom::IntRect const &area, unsig * of render() for details. */ void -DrawingItem::clip(Inkscape::DrawingContext &ct, Geom::IntRect const &area) +DrawingItem::clip(Inkscape::DrawingContext &dc, Geom::IntRect const &area) { // don't bother if the object does not implement clipping (e.g. DrawingImage) if (!_canClip()) return; if (!_visible) return; if (!area.intersects(_bbox)) return; - ct.setSource(0,0,0,1); - ct.pushGroup(); + dc.setSource(0,0,0,1); + dc.pushGroup(); // rasterize the clipping path - _clipItem(ct, area); + _clipItem(dc, area); if (_clip) { // The item used as the clipping path itself has a clipping path. // Render this item's clipping path onto a temporary surface, then composite it // with the item using the IN operator - ct.pushGroup(); - _clip->clip(ct, area); - ct.popGroupToSource(); - ct.setOperator(CAIRO_OPERATOR_IN); - ct.paint(); + dc.pushGroup(); + _clip->clip(dc, area); + dc.popGroupToSource(); + dc.setOperator(CAIRO_OPERATOR_IN); + dc.paint(); } - ct.popGroupToSource(); - ct.setOperator(CAIRO_OPERATOR_OVER); - ct.paint(); - ct.setSource(0,0,0,0); + dc.popGroupToSource(); + dc.setOperator(CAIRO_OPERATOR_OVER); + dc.paint(); + dc.setSource(0,0,0,0); } /** diff --git a/src/display/drawing-item.h b/src/display/drawing-item.h index 1796d29d6..913706021 100644 --- a/src/display/drawing-item.h +++ b/src/display/drawing-item.h @@ -123,8 +123,8 @@ public: void *data() const { return _user_data; } void update(Geom::IntRect const &area = Geom::IntRect::infinite(), UpdateContext const &ctx = UpdateContext(), unsigned flags = STATE_ALL, unsigned reset = 0); - unsigned render(DrawingContext &ct, Geom::IntRect const &area, unsigned flags = 0, DrawingItem *stop_at = NULL); - void clip(DrawingContext &ct, Geom::IntRect const &area); + unsigned render(DrawingContext &dc, Geom::IntRect const &area, unsigned flags = 0, DrawingItem *stop_at = NULL); + void clip(DrawingContext &dc, Geom::IntRect const &area); DrawingItem *pick(Geom::Point const &p, double delta, unsigned flags = 0); protected: @@ -141,7 +141,7 @@ protected: RENDER_OK = 0, RENDER_STOP = 1 }; - void _renderOutline(DrawingContext &ct, Geom::IntRect const &area, unsigned flags); + void _renderOutline(DrawingContext &dc, Geom::IntRect const &area, unsigned flags); void _markForUpdate(unsigned state, bool propagate); void _markForRendering(); void _invalidateFilterBackground(Geom::IntRect const &area); @@ -150,9 +150,9 @@ protected: Geom::OptIntRect _cacheRect(); virtual unsigned _updateItem(Geom::IntRect const &/*area*/, UpdateContext const &/*ctx*/, unsigned /*flags*/, unsigned /*reset*/) { return 0; } - virtual unsigned _renderItem(DrawingContext &/*ct*/, Geom::IntRect const &/*area*/, unsigned /*flags*/, + virtual unsigned _renderItem(DrawingContext &/*dc*/, Geom::IntRect const &/*area*/, unsigned /*flags*/, DrawingItem * /*stop_at*/) { return RENDER_OK; } - virtual void _clipItem(DrawingContext &/*ct*/, Geom::IntRect const &/*area*/) {} + virtual void _clipItem(DrawingContext &/*dc*/, Geom::IntRect const &/*area*/) {} virtual DrawingItem *_pickItem(Geom::Point const &/*p*/, double /*delta*/, unsigned /*flags*/) { return NULL; } virtual bool _canClip() { return false; } diff --git a/src/display/drawing-shape.cpp b/src/display/drawing-shape.cpp index 03d7f51b5..f99f9442f 100644 --- a/src/display/drawing-shape.cpp +++ b/src/display/drawing-shape.cpp @@ -150,7 +150,7 @@ DrawingShape::_updateItem(Geom::IntRect const &area, UpdateContext const &ctx, u } unsigned -DrawingShape::_renderItem(DrawingContext &ct, Geom::IntRect const &area, unsigned flags, DrawingItem *stop_at) +DrawingShape::_renderItem(DrawingContext &dc, Geom::IntRect const &area, unsigned flags, DrawingItem *stop_at) { if (!_curve || !_style) return RENDER_OK; if (!area.intersects(_bbox)) return RENDER_OK; // skip if not within bounding box @@ -160,67 +160,67 @@ DrawingShape::_renderItem(DrawingContext &ct, Geom::IntRect const &area, unsigne if (outline) { guint32 rgba = _drawing.outlinecolor; - { Inkscape::DrawingContext::Save save(ct); - ct.transform(_ctm); - ct.path(_curve->get_pathvector()); + { Inkscape::DrawingContext::Save save(dc); + dc.transform(_ctm); + dc.path(_curve->get_pathvector()); } - { Inkscape::DrawingContext::Save save(ct); - ct.setSource(rgba); - ct.setLineWidth(0.5); - ct.setTolerance(0.5); - ct.stroke(); + { Inkscape::DrawingContext::Save save(dc); + dc.setSource(rgba); + dc.setLineWidth(0.5); + dc.setTolerance(0.5); + dc.stroke(); } } else { bool has_stroke, has_fill; // we assume the context has no path - Inkscape::DrawingContext::Save save(ct); - ct.transform(_ctm); + Inkscape::DrawingContext::Save save(dc); + dc.transform(_ctm); // update fill and stroke paints. // this cannot be done during nr_arena_shape_update, because we need a Cairo context // to render svg:pattern - has_fill = _nrstyle.prepareFill(ct, _item_bbox); - has_stroke = _nrstyle.prepareStroke(ct, _item_bbox); + has_fill = _nrstyle.prepareFill(dc, _item_bbox); + has_stroke = _nrstyle.prepareStroke(dc, _item_bbox); has_stroke &= (_nrstyle.stroke_width != 0); if (has_fill || has_stroke) { // TODO: remove segments outside of bbox when no dashes present - ct.path(_curve->get_pathvector()); + dc.path(_curve->get_pathvector()); if (has_fill) { - _nrstyle.applyFill(ct); - ct.fillPreserve(); + _nrstyle.applyFill(dc); + dc.fillPreserve(); } if (has_stroke) { - _nrstyle.applyStroke(ct); - ct.strokePreserve(); + _nrstyle.applyStroke(dc); + dc.strokePreserve(); } - ct.newPath(); // clear path + dc.newPath(); // clear path } // has fill or stroke pattern } // marker rendering for (ChildrenList::iterator i = _children.begin(); i != _children.end(); ++i) { - i->render(ct, area, flags, stop_at); + i->render(dc, area, flags, stop_at); } return RENDER_OK; } -void DrawingShape::_clipItem(DrawingContext &ct, Geom::IntRect const & /*area*/) +void DrawingShape::_clipItem(DrawingContext &dc, Geom::IntRect const & /*area*/) { if (!_curve) return; - Inkscape::DrawingContext::Save save(ct); + Inkscape::DrawingContext::Save save(dc); // handle clip-rule if (_style) { if (_style->clip_rule.computed == SP_WIND_RULE_EVENODD) { - ct.setFillRule(CAIRO_FILL_RULE_EVEN_ODD); + dc.setFillRule(CAIRO_FILL_RULE_EVEN_ODD); } else { - ct.setFillRule(CAIRO_FILL_RULE_WINDING); + dc.setFillRule(CAIRO_FILL_RULE_WINDING); } } - ct.transform(_ctm); - ct.path(_curve->get_pathvector()); - ct.fill(); + dc.transform(_ctm); + dc.path(_curve->get_pathvector()); + dc.fill(); } DrawingItem * diff --git a/src/display/drawing-shape.h b/src/display/drawing-shape.h index 52496d86e..47b9e807e 100644 --- a/src/display/drawing-shape.h +++ b/src/display/drawing-shape.h @@ -33,9 +33,9 @@ public: protected: virtual unsigned _updateItem(Geom::IntRect const &area, UpdateContext const &ctx, unsigned flags, unsigned reset); - virtual unsigned _renderItem(DrawingContext &ct, Geom::IntRect const &area, unsigned flags, + virtual unsigned _renderItem(DrawingContext &dc, Geom::IntRect const &area, unsigned flags, DrawingItem *stop_at); - virtual void _clipItem(DrawingContext &ct, Geom::IntRect const &area); + virtual void _clipItem(DrawingContext &dc, Geom::IntRect const &area); virtual DrawingItem *_pickItem(Geom::Point const &p, double delta, unsigned flags); virtual bool _canClip(); diff --git a/src/display/drawing-surface.cpp b/src/display/drawing-surface.cpp index bddccbd96..94e0e1ab5 100644 --- a/src/display/drawing-surface.cpp +++ b/src/display/drawing-surface.cpp @@ -267,7 +267,7 @@ DrawingCache::prepare() * parameter to the bounds of the region that must be repainted. */ void -DrawingCache::paintFromCache(DrawingContext &ct, Geom::OptIntRect &area) +DrawingCache::paintFromCache(DrawingContext &dc, Geom::OptIntRect &area) { if (!area) return; @@ -296,10 +296,10 @@ DrawingCache::paintFromCache(DrawingContext &ct, Geom::OptIntRect &area) cairo_rectangle_int_t tmp; for (int i = 0; i < nr; ++i) { cairo_region_get_rectangle(cache_region, i, &tmp); - ct.rectangle(_convertRect(tmp)); + dc.rectangle(_convertRect(tmp)); } - ct.setSource(this); - ct.fill(); + dc.setSource(this); + dc.fill(); } cairo_region_destroy(cache_region); } @@ -310,21 +310,21 @@ DrawingCache::_dumpCache(Geom::OptIntRect const &area) { static int dumpnr = 0; cairo_surface_t *surface = ink_cairo_surface_copy(_surface); - DrawingContext ct(surface, _origin); + DrawingContext dc(surface, _origin); if (!cairo_region_is_empty(_clean_region)) { - Inkscape::DrawingContext::Save save(ct); + Inkscape::DrawingContext::Save save(dc); int nr = cairo_region_num_rectangles(_clean_region); cairo_rectangle_int_t tmp; for (int i = 0; i < nr; ++i) { cairo_region_get_rectangle(_clean_region, i, &tmp); - ct.rectangle(_convertRect(tmp)); + dc.rectangle(_convertRect(tmp)); } - ct.setSource(0,1,0,0.1); - ct.fill(); + dc.setSource(0,1,0,0.1); + dc.fill(); } - ct.rectangle(*area); - ct.setSource(1,0,0,0.1); - ct.fill(); + dc.rectangle(*area); + dc.setSource(1,0,0,0.1); + dc.fill(); char *fn = g_strdup_printf("dump%d.png", dumpnr++); cairo_surface_write_to_png(surface, fn); cairo_surface_destroy(surface); diff --git a/src/display/drawing-surface.h b/src/display/drawing-surface.h index 1ec848405..e937cca55 100644 --- a/src/display/drawing-surface.h +++ b/src/display/drawing-surface.h @@ -65,7 +65,7 @@ public: void markClean(Geom::IntRect const &area = Geom::IntRect::infinite()); void scheduleTransform(Geom::IntRect const &new_area, Geom::Affine const &trans); void prepare(); - void paintFromCache(DrawingContext &ct, Geom::OptIntRect &area); + void paintFromCache(DrawingContext &dc, Geom::OptIntRect &area); protected: cairo_region_t *_clean_region; diff --git a/src/display/drawing-text.cpp b/src/display/drawing-text.cpp index f652a2970..f5a0f0af5 100644 --- a/src/display/drawing-text.cpp +++ b/src/display/drawing-text.cpp @@ -195,7 +195,7 @@ DrawingText::_updateItem(Geom::IntRect const &area, UpdateContext const &ctx, un return DrawingGroup::_updateItem(area, ctx, flags, reset); } -void DrawingText::decorateStyle(DrawingContext &ct, double vextent, double xphase, Geom::Point const &p1, Geom::Point const &p2) +void DrawingText::decorateStyle(DrawingContext &dc, double vextent, double xphase, Geom::Point const &p1, Geom::Point const &p2) { double wave[16]={ 0.000000, 0.382499, 0.706825, 0.923651, 1.000000, 0.923651, 0.706825, 0.382499, @@ -235,12 +235,12 @@ pf = Geom::Point(step * round(p2[Geom::X]/step),p2[Geom::Y]); if(_nrstyle.text_decoration_style & TEXT_DECORATION_STYLE_ISDOUBLE){ ps -= Geom::Point(0, vextent/12.0); pf -= Geom::Point(0, vextent/12.0); - ct.moveTo(ps); - ct.lineTo(pf); + dc.moveTo(ps); + dc.lineTo(pf); ps += Geom::Point(0, vextent/6.0); pf += Geom::Point(0, vextent/6.0); - ct.moveTo(ps); - ct.lineTo(pf); + dc.moveTo(ps); + dc.lineTo(pf); } /* The next three have a problem in that they are phase dependent. The bits of a line are not necessarily passing through this routine in order, so we have to use the xphase information @@ -251,14 +251,14 @@ pf = Geom::Point(step * round(p2[Geom::X]/step),p2[Geom::Y]); while(1){ if(dots[i]>0){ if(ps[Geom::X]> pf[Geom::X])break; - ct.moveTo(ps); + dc.moveTo(ps); ps += Geom::Point(step * (double)dots[i], 0.0); if(ps[Geom::X]>= pf[Geom::X]){ - ct.lineTo(pf); + dc.lineTo(pf); break; } else { - ct.lineTo(ps); + dc.lineTo(ps); } ps += Geom::Point(step * 4.0, 0.0); } @@ -272,14 +272,14 @@ pf = Geom::Point(step * round(p2[Geom::X]/step),p2[Geom::Y]); while(1){ if(dashes[i]>0){ if(ps[Geom::X]> pf[Geom::X])break; - ct.moveTo(ps); + dc.moveTo(ps); ps += Geom::Point(step * (double)dashes[i], 0.0); if(ps[Geom::X]>= pf[Geom::X]){ - ct.lineTo(pf); + dc.lineTo(pf); break; } else { - ct.lineTo(ps); + dc.lineTo(ps); } ps += Geom::Point(step * 8.0, 0.0); } @@ -293,23 +293,23 @@ pf = Geom::Point(step * round(p2[Geom::X]/step),p2[Geom::Y]); double amp = vextent/10.0; double x = ps[Geom::X]; double y = ps[Geom::Y]; - ct.moveTo(Geom::Point(x, y + amp * wave[i])); + dc.moveTo(Geom::Point(x, y + amp * wave[i])); while(1){ i = ((i + 1) & 15); x += step; - ct.lineTo(Geom::Point(x, y + amp * wave[i])); + dc.lineTo(Geom::Point(x, y + amp * wave[i])); if(x >= pf[Geom::X])break; } } else { // TEXT_DECORATION_STYLE_SOLID, also default in case it was not set for some reason - ct.moveTo(ps); - ct.lineTo(pf); -// ct.revrectangle(Geom::Rect(ps,pf)); + dc.moveTo(ps); + dc.lineTo(pf); +// dc.revrectangle(Geom::Rect(ps,pf)); } } /* returns scaled line thickness */ -double DrawingText::decorateItem(DrawingContext &ct, Geom::Affine const &aff, double phase_length) +double DrawingText::decorateItem(DrawingContext &dc, Geom::Affine const &aff, double phase_length) { double tsp_width_adj = _nrstyle.tspan_width / _nrstyle.font_size; double tsp_asc_adj = _nrstyle.ascender / _nrstyle.font_size; @@ -321,8 +321,8 @@ double DrawingText::decorateItem(DrawingContext &ct, Geom::Affine const &aff, do double scale = aff.descrim(); double xphase = phase_length/ _nrstyle.font_size; // used to figure out phase of patterns - Inkscape::DrawingContext::Save save(ct); - ct.transform(aff); // must be leftmost affine in span + Inkscape::DrawingContext::Save save(dc); + dc.transform(aff); // must be leftmost affine in span Geom::Point p1; Geom::Point p2; @@ -331,52 +331,52 @@ double DrawingText::decorateItem(DrawingContext &ct, Geom::Affine const &aff, do if(_nrstyle.text_decoration_line & TEXT_DECORATION_LINE_UNDERLINE){ p1 = Geom::Point(0.0, -_nrstyle.underline_position); p2 = Geom::Point(tsp_width_adj,-_nrstyle.underline_position); - decorateStyle(ct, tsp_size_adj, xphase, p1, p2); + decorateStyle(dc, tsp_size_adj, xphase, p1, p2); } if(_nrstyle.text_decoration_line & TEXT_DECORATION_LINE_OVERLINE){ p1 = Geom::Point(0.0, tsp_asc_adj -_nrstyle.underline_position + 1 * final_underline_thickness); p2 = Geom::Point(tsp_width_adj,tsp_asc_adj -_nrstyle.underline_position + 1 * final_underline_thickness); - decorateStyle(ct, tsp_size_adj, xphase, p1, p2); + decorateStyle(dc, tsp_size_adj, xphase, p1, p2); } if(_nrstyle.text_decoration_line & TEXT_DECORATION_LINE_LINETHROUGH){ thickness = final_line_through_thickness; p1 = Geom::Point(0.0, _nrstyle.line_through_position); p2 = Geom::Point(tsp_width_adj,_nrstyle.line_through_position); - decorateStyle(ct, tsp_size_adj, xphase, p1, p2); + decorateStyle(dc, tsp_size_adj, xphase, p1, p2); } // Obviously this does not blink, but it does indicate which text has been set with that attribute if(_nrstyle.text_decoration_line & TEXT_DECORATION_LINE_BLINK){ thickness = final_line_through_thickness; p1 = Geom::Point(0.0, _nrstyle.line_through_position - 2*final_line_through_thickness); p2 = Geom::Point(tsp_width_adj,_nrstyle.line_through_position - 2*final_line_through_thickness); - decorateStyle(ct, tsp_size_adj, xphase, p1, p2); + decorateStyle(dc, tsp_size_adj, xphase, p1, p2); p1 = Geom::Point(0.0, _nrstyle.line_through_position + 2*final_line_through_thickness); p2 = Geom::Point(tsp_width_adj,_nrstyle.line_through_position + 2*final_line_through_thickness); - decorateStyle(ct, tsp_size_adj, xphase, p1, p2); + decorateStyle(dc, tsp_size_adj, xphase, p1, p2); } thickness *= scale; return(thickness); } -unsigned DrawingText::_renderItem(DrawingContext &ct, Geom::IntRect const &/*area*/, unsigned /*flags*/, DrawingItem * /*stop_at*/) +unsigned DrawingText::_renderItem(DrawingContext &dc, Geom::IntRect const &/*area*/, unsigned /*flags*/, DrawingItem * /*stop_at*/) { if (_drawing.outline()) { guint32 rgba = _drawing.outlinecolor; - Inkscape::DrawingContext::Save save(ct); - ct.setSource(rgba); - ct.setTolerance(0.5); // low quality, but good enough for outline mode + Inkscape::DrawingContext::Save save(dc); + dc.setSource(rgba); + dc.setTolerance(0.5); // low quality, but good enough for outline mode for (ChildrenList::iterator i = _children.begin(); i != _children.end(); ++i) { DrawingGlyphs *g = dynamic_cast<DrawingGlyphs *>(&*i); if (!g) throw InvalidItemException(); - Inkscape::DrawingContext::Save save(ct); + Inkscape::DrawingContext::Save save(dc); // skip glyphs with singular transforms if (g->_ctm.isSingular()) continue; - ct.transform(g->_ctm); + dc.transform(g->_ctm); if(g->_drawable){ - ct.path(*g->_font->PathVector(g->_glyph)); - ct.fill(); + dc.path(*g->_font->PathVector(g->_glyph)); + dc.fill(); } } return RENDER_OK; @@ -398,11 +398,11 @@ unsigned DrawingText::_renderItem(DrawingContext &ct, Geom::IntRect const &/*are // Therefore, only apply this ctm temporarily. bool has_stroke, has_fill; { - Inkscape::DrawingContext::Save save(ct); - ct.transform(_ctm); + Inkscape::DrawingContext::Save save(dc); + dc.transform(_ctm); - has_fill = _nrstyle.prepareFill( ct, _item_bbox); - has_stroke = _nrstyle.prepareStroke(ct, _item_bbox); + has_fill = _nrstyle.prepareFill( dc, _item_bbox); + has_stroke = _nrstyle.prepareStroke(dc, _item_bbox); } if (has_fill || has_stroke) { @@ -418,11 +418,11 @@ unsigned DrawingText::_renderItem(DrawingContext &ct, Geom::IntRect const &/*are invset = true; } - Inkscape::DrawingContext::Save save(ct); + Inkscape::DrawingContext::Save save(dc); if (g->_ctm.isSingular()) continue; - ct.transform(g->_ctm); + dc.transform(g->_ctm); if (g->_drawable) { - ct.path(*g->_font->PathVector(g->_glyph)); + dc.path(*g->_font->PathVector(g->_glyph)); } // get the leftmost affine transform (leftmost defined with respect to the x axis of the first transform). // That way the decoration will work no matter what mix of L->R, R->L text is in the span. @@ -448,17 +448,17 @@ unsigned DrawingText::_renderItem(DrawingContext &ct, Geom::IntRect const &/*are // draw the text itself // we need to apply this object's ctm again - Inkscape::DrawingContext::Save save(ct); - ct.transform(_ctm); + Inkscape::DrawingContext::Save save(dc); + dc.transform(_ctm); if (has_fill) { - _nrstyle.applyFill(ct); - ct.fillPreserve(); + _nrstyle.applyFill(dc); + dc.fillPreserve(); } if (has_stroke) { - _nrstyle.applyStroke(ct); - ct.strokePreserve(); + _nrstyle.applyStroke(dc); + dc.strokePreserve(); } - ct.newPath(); // clear path + dc.newPath(); // clear path // draw text decoration if (_nrstyle.text_decoration_line != TEXT_DECORATION_LINE_CLEAR && decorate) { @@ -477,27 +477,27 @@ unsigned DrawingText::_renderItem(DrawingContext &ct, Geom::IntRect const &/*are _nrstyle.fill.color.v.c[2], 1.0); } - ct.setSource(ergba); - ct.setTolerance(0.5); - double thickness = decorateItem(ct, aff, phase_length); - ct.setLineWidth(thickness); - ct.strokePreserve(); - ct.newPath(); // clear path + dc.setSource(ergba); + dc.setTolerance(0.5); + double thickness = decorateItem(dc, aff, phase_length); + dc.setLineWidth(thickness); + dc.strokePreserve(); + dc.newPath(); // clear path } } return RENDER_OK; } -void DrawingText::_clipItem(DrawingContext &ct, Geom::IntRect const &/*area*/) +void DrawingText::_clipItem(DrawingContext &dc, Geom::IntRect const &/*area*/) { - Inkscape::DrawingContext::Save save(ct); + Inkscape::DrawingContext::Save save(dc); // handle clip-rule if (_style) { if (_style->clip_rule.computed == SP_WIND_RULE_EVENODD) { - ct.setFillRule(CAIRO_FILL_RULE_EVEN_ODD); + dc.setFillRule(CAIRO_FILL_RULE_EVEN_ODD); } else { - ct.setFillRule(CAIRO_FILL_RULE_WINDING); + dc.setFillRule(CAIRO_FILL_RULE_WINDING); } } @@ -507,13 +507,13 @@ void DrawingText::_clipItem(DrawingContext &ct, Geom::IntRect const &/*area*/) throw InvalidItemException(); } - Inkscape::DrawingContext::Save save(ct); - ct.transform(g->_ctm); + Inkscape::DrawingContext::Save save(dc); + dc.transform(g->_ctm); if(g->_drawable){ - ct.path(*g->_font->PathVector(g->_glyph)); + dc.path(*g->_font->PathVector(g->_glyph)); } } - ct.fill(); + dc.fill(); } DrawingItem * diff --git a/src/display/drawing-text.h b/src/display/drawing-text.h index fd122b54b..b863ca2a4 100644 --- a/src/display/drawing-text.h +++ b/src/display/drawing-text.h @@ -62,14 +62,14 @@ public: protected: virtual unsigned _updateItem(Geom::IntRect const &area, UpdateContext const &ctx, unsigned flags, unsigned reset); - virtual unsigned _renderItem(DrawingContext &ct, Geom::IntRect const &area, unsigned flags, + virtual unsigned _renderItem(DrawingContext &dc, Geom::IntRect const &area, unsigned flags, DrawingItem *stop_at); - virtual void _clipItem(DrawingContext &ct, Geom::IntRect const &area); + virtual void _clipItem(DrawingContext &dc, Geom::IntRect const &area); virtual DrawingItem *_pickItem(Geom::Point const &p, double delta, unsigned flags); virtual bool _canClip(); - double decorateItem(DrawingContext &ct, Geom::Affine const &aff, double phase_length); - void decorateStyle(DrawingContext &ct, double vextent, double xphase, Geom::Point const &p1, Geom::Point const &p2); + double decorateItem(DrawingContext &dc, Geom::Affine const &aff, double phase_length); + void decorateStyle(DrawingContext &dc, double vextent, double xphase, Geom::Point const &p1, Geom::Point const &p2); NRStyle _nrstyle; friend class DrawingGlyphs; diff --git a/src/display/drawing.cpp b/src/display/drawing.cpp index c192e4565..6e728b03d 100644 --- a/src/display/drawing.cpp +++ b/src/display/drawing.cpp @@ -167,22 +167,22 @@ Drawing::update(Geom::IntRect const &area, UpdateContext const &ctx, unsigned fl } void -Drawing::render(DrawingContext &ct, Geom::IntRect const &area, unsigned flags) +Drawing::render(DrawingContext &dc, Geom::IntRect const &area, unsigned flags) { if (_root) { - _root->render(ct, area, flags); + _root->render(dc, area, flags); } if (colorMode() == COLORMODE_GRAYSCALE) { // apply grayscale filter on top of everything - cairo_surface_t *input = ct.rawTarget(); + cairo_surface_t *input = dc.rawTarget(); cairo_surface_t *out = ink_cairo_surface_create_identical(input); ink_cairo_surface_filter(input, out, _grayscale_colormatrix); - Geom::Point origin = ct.targetLogicalBounds().min(); - ct.setSource(out, origin[Geom::X], origin[Geom::Y]); - ct.setOperator(CAIRO_OPERATOR_SOURCE); - ct.paint(); - ct.setOperator(CAIRO_OPERATOR_OVER); + Geom::Point origin = dc.targetLogicalBounds().min(); + dc.setSource(out, origin[Geom::X], origin[Geom::Y]); + dc.setOperator(CAIRO_OPERATOR_SOURCE); + dc.paint(); + dc.setOperator(CAIRO_OPERATOR_OVER); cairo_surface_destroy(out); } diff --git a/src/display/drawing.h b/src/display/drawing.h index 74ab57fae..cc74833ba 100644 --- a/src/display/drawing.h +++ b/src/display/drawing.h @@ -68,7 +68,7 @@ public: void setGrayscaleMatrix(gdouble value_matrix[20]); void update(Geom::IntRect const &area = Geom::IntRect::infinite(), UpdateContext const &ctx = UpdateContext(), unsigned flags = DrawingItem::STATE_ALL, unsigned reset = 0); - void render(DrawingContext &ct, Geom::IntRect const &area, unsigned flags = 0); + void render(DrawingContext &dc, Geom::IntRect const &area, unsigned flags = 0); DrawingItem *pick(Geom::Point const &p, double delta, unsigned flags); sigc::signal<void, DrawingItem *> signal_request_update; diff --git a/src/display/nr-filter-image.cpp b/src/display/nr-filter-image.cpp index 92bb9dcaa..154d1ab32 100644 --- a/src/display/nr-filter-image.cpp +++ b/src/display/nr-filter-image.cpp @@ -108,17 +108,17 @@ void FilterImage::render_cairo(FilterSlot &slot) Geom::Rect sa = slot.get_slot_area(); cairo_surface_t *out = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, sa.width(), sa.height()); - Inkscape::DrawingContext ct(out, sa.min()); - ct.transform(user2pb); // we are now in primitive units - ct.translate(feImageX, feImageY); -// ct.scale(scaleX, scaleY); No scaling should be done + Inkscape::DrawingContext dc(out, sa.min()); + dc.transform(user2pb); // we are now in primitive units + dc.translate(feImageX, feImageY); +// dc.scale(scaleX, scaleY); No scaling should be done Geom::IntRect render_rect = area.roundOutwards(); - ct.translate(render_rect.min()); + dc.translate(render_rect.min()); // Update to renderable state drawing.update(render_rect); - drawing.render(ct, render_rect); + drawing.render(dc, render_rect); SVGElem->invoke_hide(key); // For the moment, we'll assume that any image is in sRGB color space diff --git a/src/display/nr-filter-slot.cpp b/src/display/nr-filter-slot.cpp index 755a30a74..e4c2f048e 100644 --- a/src/display/nr-filter-slot.cpp +++ b/src/display/nr-filter-slot.cpp @@ -25,13 +25,13 @@ namespace Inkscape { namespace Filters { -FilterSlot::FilterSlot(DrawingItem *item, DrawingContext *bgct, +FilterSlot::FilterSlot(DrawingItem *item, DrawingContext *bgdc, DrawingContext &graphic, FilterUnits const &u) : _item(item) , _source_graphic(graphic.rawTarget()) - , _background_ct(bgct ? bgct->raw() : NULL) + , _background_ct(bgdc ? bgdc->raw() : NULL) , _source_graphic_area(graphic.targetLogicalBounds().roundOutwards()) // fixme - , _background_area(bgct ? bgct->targetLogicalBounds().roundOutwards() : Geom::IntRect()) // fixme + , _background_area(bgdc ? bgdc->targetLogicalBounds().roundOutwards() : Geom::IntRect()) // fixme , _units(u) , _last_out(NR_FILTER_SOURCEGRAPHIC) , filterquality(FILTER_QUALITY_BEST) diff --git a/src/display/nr-filter-slot.h b/src/display/nr-filter-slot.h index 805027bfe..f3c98b8d9 100644 --- a/src/display/nr-filter-slot.h +++ b/src/display/nr-filter-slot.h @@ -28,7 +28,7 @@ namespace Filters { class FilterSlot { public: /** Creates a new FilterSlot object. */ - FilterSlot(DrawingItem *item, DrawingContext *bgct, + FilterSlot(DrawingItem *item, DrawingContext *bgdc, DrawingContext &graphic, FilterUnits const &u); /** Destroys the FilterSlot object and all its contents */ virtual ~FilterSlot(); diff --git a/src/display/nr-filter.cpp b/src/display/nr-filter.cpp index af9c15cd8..11984ba76 100644 --- a/src/display/nr-filter.cpp +++ b/src/display/nr-filter.cpp @@ -98,7 +98,7 @@ Filter::~Filter() } -int Filter::render(Inkscape::DrawingItem const *item, DrawingContext &graphic, DrawingContext *bgct) +int Filter::render(Inkscape::DrawingItem const *item, DrawingContext &graphic, DrawingContext *bgdc) { if (_primitive.empty()) { // when no primitives are defined, clear source graphic @@ -150,7 +150,7 @@ int Filter::render(Inkscape::DrawingItem const *item, DrawingContext &graphic, D } } - FilterSlot slot(const_cast<Inkscape::DrawingItem*>(item), bgct, graphic, units); + FilterSlot slot(const_cast<Inkscape::DrawingItem*>(item), bgdc, graphic, units); slot.set_quality(filterquality); slot.set_blurquality(blurquality); diff --git a/src/display/nr-filter.h b/src/display/nr-filter.h index 5df38ffe9..f9dcf1d84 100644 --- a/src/display/nr-filter.h +++ b/src/display/nr-filter.h @@ -28,12 +28,12 @@ namespace Filters { class Filter { public: - /** Given background state from @a bgct and an intermediate rendering from the surface + /** Given background state from @a bgdc and an intermediate rendering from the surface * backing @a graphic, modify the contents of the surface backing @a graphic to represent * the results of filter rendering. @a bgarea and @a area specify bounding boxes * of both surfaces in world coordinates; Cairo contexts are assumed to be in default state * (0,0 = surface origin, no path, OVER operator) */ - int render(Inkscape::DrawingItem const *item, DrawingContext &graphic, DrawingContext *bgct); + int render(Inkscape::DrawingItem const *item, DrawingContext &graphic, DrawingContext *bgdc); /** * Creates a new filter primitive under this filter object. diff --git a/src/display/nr-style.cpp b/src/display/nr-style.cpp index 317f38635..403b139e0 100644 --- a/src/display/nr-style.cpp +++ b/src/display/nr-style.cpp @@ -207,14 +207,14 @@ void NRStyle::set(SPStyle *style) update(); } -bool NRStyle::prepareFill(Inkscape::DrawingContext &ct, Geom::OptRect const &paintbox) +bool NRStyle::prepareFill(Inkscape::DrawingContext &dc, Geom::OptRect const &paintbox) { // update fill pattern if (!fill_pattern) { switch (fill.type) { case PAINT_SERVER: { - //fill_pattern = sp_paint_server_create_pattern(fill.server, ct.raw(), paintbox, fill.opacity); - fill_pattern = fill.server->pattern_new(ct.raw(), paintbox, fill.opacity); + //fill_pattern = sp_paint_server_create_pattern(fill.server, dc.raw(), paintbox, fill.opacity); + fill_pattern = fill.server->pattern_new(dc.raw(), paintbox, fill.opacity); } break; case PAINT_COLOR: { @@ -229,19 +229,19 @@ bool NRStyle::prepareFill(Inkscape::DrawingContext &ct, Geom::OptRect const &pai return true; } -void NRStyle::applyFill(Inkscape::DrawingContext &ct) +void NRStyle::applyFill(Inkscape::DrawingContext &dc) { - ct.setSource(fill_pattern); - ct.setFillRule(fill_rule); + dc.setSource(fill_pattern); + dc.setFillRule(fill_rule); } -bool NRStyle::prepareStroke(Inkscape::DrawingContext &ct, Geom::OptRect const &paintbox) +bool NRStyle::prepareStroke(Inkscape::DrawingContext &dc, Geom::OptRect const &paintbox) { if (!stroke_pattern) { switch (stroke.type) { case PAINT_SERVER: { - //stroke_pattern = sp_paint_server_create_pattern(stroke.server, ct.raw(), paintbox, stroke.opacity); - stroke_pattern = stroke.server->pattern_new(ct.raw(), paintbox, stroke.opacity); + //stroke_pattern = sp_paint_server_create_pattern(stroke.server, dc.raw(), paintbox, stroke.opacity); + stroke_pattern = stroke.server->pattern_new(dc.raw(), paintbox, stroke.opacity); } break; case PAINT_COLOR: { @@ -256,14 +256,14 @@ bool NRStyle::prepareStroke(Inkscape::DrawingContext &ct, Geom::OptRect const &p return true; } -void NRStyle::applyStroke(Inkscape::DrawingContext &ct) +void NRStyle::applyStroke(Inkscape::DrawingContext &dc) { - ct.setSource(stroke_pattern); - ct.setLineWidth(stroke_width); - ct.setLineCap(line_cap); - ct.setLineJoin(line_join); - ct.setMiterLimit(miter_limit); - cairo_set_dash(ct.raw(), dash, n_dash, dash_offset); // fixme + dc.setSource(stroke_pattern); + dc.setLineWidth(stroke_width); + dc.setLineCap(line_cap); + dc.setLineJoin(line_join); + dc.setMiterLimit(miter_limit); + cairo_set_dash(dc.raw(), dash, n_dash, dash_offset); // fixme } void NRStyle::update() diff --git a/src/display/nr-style.h b/src/display/nr-style.h index 8fd736cc3..e54eef547 100644 --- a/src/display/nr-style.h +++ b/src/display/nr-style.h @@ -28,10 +28,10 @@ struct NRStyle { ~NRStyle(); void set(SPStyle *); - bool prepareFill(Inkscape::DrawingContext &ct, Geom::OptRect const &paintbox); - bool prepareStroke(Inkscape::DrawingContext &ct, Geom::OptRect const &paintbox); - void applyFill(Inkscape::DrawingContext &ct); - void applyStroke(Inkscape::DrawingContext &ct); + bool prepareFill(Inkscape::DrawingContext &dc, Geom::OptRect const &paintbox); + bool prepareStroke(Inkscape::DrawingContext &dc, Geom::OptRect const &paintbox); + void applyFill(Inkscape::DrawingContext &dc); + void applyStroke(Inkscape::DrawingContext &dc); void update(); enum PaintType { diff --git a/src/document.cpp b/src/document.cpp index 634462001..470d0cc5a 100644 --- a/src/document.cpp +++ b/src/document.cpp @@ -381,16 +381,6 @@ SPDocument *SPDocument::createDoc(Inkscape::XML::Document *rdoc, rroot->setAttribute("inkscape:version", Inkscape::version_string); /* fixme: Again, I moved these here to allow version determining in ::build (Lauris) */ - /* Quick hack 2 - get default image size into document */ - if (!rroot->attribute("width")) rroot->setAttribute("width", "100%"); - if (!rroot->attribute("height")) rroot->setAttribute("height", "100%"); - /* End of quick hack 2 */ - - /* Quick hack 3 - Set uri attributes */ -// if (uri) { // this is done in do_change_uri() -// rroot->setAttribute("sodipodi:docname", uri); -// } - /* End of quick hack 3 */ /* Eliminate obsolete sodipodi:docbase, for privacy reasons */ rroot->setAttribute("sodipodi:docbase", NULL); @@ -483,7 +473,7 @@ SPDocument *SPDocument::createChildDoc(std::string const &uri) SPDocument *parent = this; SPDocument *document = NULL; - while(parent != NULL && document == NULL) { + while(parent != NULL && parent->getURI() != NULL && document == NULL) { // Check myself and any parents int he chain if(uri == parent->getURI()) { document = parent; diff --git a/src/extension/internal/emf-inout.cpp b/src/extension/internal/emf-inout.cpp index cca541c5b..276dee362 100644 --- a/src/extension/internal/emf-inout.cpp +++ b/src/extension/internal/emf-inout.cpp @@ -4,6 +4,7 @@ /* Authors: * Ulf Erikson <ulferikson@users.sf.net> * Jon A. Cruz <jon@joncruz.org> + * David Mathog * Abhishek Sharma * * Copyright (C) 2006-2008 Authors @@ -1563,6 +1564,7 @@ int Emf::myEnhMetaFileProc(char *contents, unsigned int length, PEMF_CALLBACK_DA tsp.vadvance = 0.0; /* meaningful only when a complex contains two or more lines */ tsp.taln = ALILEFT + ALIBASE; tsp.ldir = LDIR_LR; + tsp.spaces = 0; // this field is only used for debugging tsp.color.Red = 0; /* RGB Black */ tsp.color.Green = 0; /* RGB Black */ tsp.color.Blue = 0; /* RGB Black */ diff --git a/src/extension/internal/emf-inout.h b/src/extension/internal/emf-inout.h index 97f93e71b..a97cb0a54 100644 --- a/src/extension/internal/emf-inout.h +++ b/src/extension/internal/emf-inout.h @@ -3,6 +3,7 @@ */ /* Authors: * Ulf Erikson <ulferikson@users.sf.net> + * David Mathog * * Copyright (C) 2006-2008 Authors * diff --git a/src/extension/internal/emf-print.cpp b/src/extension/internal/emf-print.cpp index 2680718cf..6d5bb6f4b 100644 --- a/src/extension/internal/emf-print.cpp +++ b/src/extension/internal/emf-print.cpp @@ -124,7 +124,7 @@ unsigned int PrintEmf::begin(Inkscape::Extension::Print *mod, SPDocument *doc) char *rec; gchar const *utf8_fn = mod->get_param_string("destination"); - // Typially PX2WORLD is 1200/90, using inkscape's default dpi + // Typically PX2WORLD is 1200/90, using inkscape's default dpi PX2WORLD = 1200.0 / Inkscape::Util::Quantity::convert(1.0, "in", "px"); FixPPTCharPos = mod->get_param_bool("FixPPTCharPos"); FixPPTDashLine = mod->get_param_bool("FixPPTDashLine"); @@ -848,7 +848,7 @@ Geom::Path PrintEmf::pathv_to_rect(Geom::PathVector const &pathv, bool *is_rect, int vertices; Geom::Path pR = pathv_to_simple_polygon(pathv, &vertices); *is_rect = false; - if(vertices==4){ // or else it cannot be a rectangle rectangle + if(vertices==4){ // or else it cannot be a rectangle int vertex_count=0; /* Get the ends of the LAST line segment. Find minimum rotation to align rectangle with X,Y axes. (Very degenerate if it is rotated 45 degrees.) */ @@ -862,12 +862,17 @@ Geom::Path PrintEmf::pathv_to_rect(Geom::PathVector const &pathv, bool *is_rect, if(fabs(ang) < fabs(*angle))*angle = -ang; // y increases down, flips sign on angle } } + + /* For increased numerical stability, snap the angle to the nearest 1/100th of a degree. */ + double convert = 36000.0/ (2.0 * M_PI); + *angle = round(*angle * convert)/convert; for(Geom::Path::const_iterator cit = pR.begin(); cit != pR.end_open();++cit) { P1_lead = cit->finalPoint(); v1 = unit_vector(P1 - P1_trail); v2 = unit_vector(P1_lead - P1 ); - if(!Geom::are_near(dot(v1,v2), 0.0, 1e-5))break; // P1 is center of a turn that is not 90 degrees + // P1 is center of a turn that is not 90 degrees. Limit comes from cos(89.9) = .001745 + if(!Geom::are_near(dot(v1,v2), 0.0, 2e-3))break; P1_trail = P1; P1 = P1_lead; vertex_count++; @@ -985,12 +990,13 @@ unsigned int PrintEmf::fill( int rectDir=0; Geom::Path pathRect; if(FixPPTLinGrad && brush_stat && gv.mode == DRAW_LINEAR_GRADIENT){ - pathRect = pathv_to_rect(pathv, &is_Rect, &angle); + Geom::PathVector pvr = pathv * fill_transform; + pathRect = pathv_to_rect(pvr, &is_Rect, &angle); if(is_Rect){ /* Gradientfill records can only be used if the gradient is parallel to the sides of the rectangle. That must be checked here so that we can fall back to another form of gradient fill if it is not the case. */ - rectDir = vector_rect_alignment(angle, gv.p2 - gv.p1); + rectDir = vector_rect_alignment(angle, (gv.p2 - gv.p1) * fill_transform); if(!rectDir)is_Rect = false; } if(!is_Rect && !FixPPTGrad2Polys)brush_stat=0; // fall all the way back to a solid fill @@ -1094,26 +1100,27 @@ unsigned int PrintEmf::fill( U_XFORM tmpTransform; double wRect, hRect; - /* coordinates, w,h and transform for the ENTIRE retangle */ - ul = get_pathrect_corner(pathRect, angle, 0) * fill_transform * PX2WORLD; - ur = get_pathrect_corner(pathRect, angle, 1) * fill_transform * PX2WORLD; - lr = get_pathrect_corner(pathRect, angle, 2) * fill_transform * PX2WORLD; + /* coordinates: upper left, upper right, and lower right corners of the rectangle. + inkscape transform already applied, but needs to be scaled to EMF coordinates. */ + ul = get_pathrect_corner(pathRect, angle, 0) * PX2WORLD; + ur = get_pathrect_corner(pathRect, angle, 1) * PX2WORLD; + lr = get_pathrect_corner(pathRect, angle, 2) * PX2WORLD; wRect = Geom::distance(ul,ur); hRect = Geom::distance(ur,lr); /* The basic rectangle for all of these is placed with its UL corner at 0,0 with a size wRect,hRect. Apply a world transform to place/scale it into the appropriate position on the drawing. Actual gradientfill records are either this entire rectangle or slices of it as defined by the stops. + This rectangle has already been transformed by tf (whatever rotation/scale) Inkscape had applied to it. */ Geom::Affine tf2 = Geom::Rotate(-angle); // the rectangle may be drawn skewed to the coordinate system - tf2 *= tf; // the coordinate system of the rectangular path may be rotated tmpTransform.eM11 = tf2[0]; tmpTransform.eM12 = tf2[1]; tmpTransform.eM21 = tf2[2]; tmpTransform.eM22 = tf2[3]; - tmpTransform.eDx = (ul)[Geom::X]; - tmpTransform.eDy = (ul)[Geom::Y]; + tmpTransform.eDx = round((ul)[Geom::X]); // use explicit round for better stability + tmpTransform.eDy = round((ul)[Geom::Y]); rec = U_EMRSAVEDC_set(); if (!rec || emf_append((PU_ENHMETARECORD)rec, et, U_REC_FREE)) { @@ -1138,10 +1145,10 @@ unsigned int PrintEmf::fill( gMode = U_GRADIENT_FILL_RECT_V; } doff_base = doff_range; - rcb.left = outUL[X]; - rcb.top = outUL[Y]; - rcb.right = outLR[X]; - rcb.bottom = outLR[Y]; + rcb.left = round(outUL[X]); // use explicit round for better stability + rcb.top = round(outUL[Y]); + rcb.right = round(outLR[X]); + rcb.bottom = round(outLR[Y]); sp_color_get_rgb_floatv(&tg->vector.stops[istop].color, rgb); opa = tg->vector.stops[istop].opacity; c2 = U_RGBA(255 * rgb[0], 255 * rgb[1], 255 * rgb[2], 255 * opa); @@ -1157,7 +1164,6 @@ unsigned int PrintEmf::fill( c1 = c2; // for next stop ug4.UpperLeft = 0; ug4.LowerRight= 1; - /* NEED to push world transform here for rotations */ rec = U_EMRGRADIENTFILL_set(rcb, 2, 1, gMode, ut, (uint32_t *) &ug4 ); if (!rec || emf_append((PU_ENHMETARECORD)rec, et, U_REC_FREE)) { g_error("Fatal programming error in PrintEmf::fill at U_EMRGRADIENTFILL_set"); diff --git a/src/extension/internal/emf-print.h b/src/extension/internal/emf-print.h index 8fc9908e3..1e4970a46 100644 --- a/src/extension/internal/emf-print.h +++ b/src/extension/internal/emf-print.h @@ -1,8 +1,9 @@ /** @file * @brief Enhanced Metafile printing - implementation */ -/* Author: +/* Authors: * Ulf Erikson <ulferikson@users.sf.net> + * David Mathog * * Copyright (C) 2006-2008 Authors * diff --git a/src/extension/internal/image-resolution.cpp b/src/extension/internal/image-resolution.cpp index aee46aaba..18eb97f80 100644 --- a/src/extension/internal/image-resolution.cpp +++ b/src/extension/internal/image-resolution.cpp @@ -322,6 +322,12 @@ void ImageResolution::readjfif(char const *fn) { y_ = cinfo.Y_density * 2.54; ok_ = true; } + /* According to http://www.jpeg.org/public/jfif.pdf (page 7): + * "Xdensity and Ydensity should always be non-zero". + * but in some cases, they are (see LP bug #1275443) */ + if (x_ == 0 or y_ == 0) { + ok_ = false; + } } jpeg_destroy_decompress(&cinfo); fclose(ifd); diff --git a/src/extension/internal/text_reassemble.c b/src/extension/internal/text_reassemble.c index cd84910fc..e28e5effb 100644 --- a/src/extension/internal/text_reassemble.c +++ b/src/extension/internal/text_reassemble.c @@ -67,11 +67,11 @@ Optional compiler switches for development: File: text_reassemble.c -Version: 0.0.10 -Date: 06-MAY-2013 +Version: 0.0.12 +Date: 07-FEB-2014 Author: David Mathog, Biology Division, Caltech email: mathog@caltech.edu -Copyright: 2013 David Mathog and California Institute of Technology (Caltech) +Copyright: 2014 David Mathog and California Institute of Technology (Caltech) */ #ifdef __cplusplus @@ -665,7 +665,7 @@ FT_INFO *ftinfo_clear(FT_INFO *fti){ free(fsp->file); /* release memory holding copies of paths */ free(fsp->fontspec); /* release memory holding copies of font names */ FcPatternDestroy(fsp->fpat); /* release memory for FontConfig fpats */ - FcFontSetDestroy(fti->fonts[i].fontset); + FcFontSetDestroy(fsp->fontset); if(fsp->alts){ free(fsp->alts); } } free(fti->fonts); @@ -726,9 +726,10 @@ int ftinfo_find_loaded_by_src(const FT_INFO *fti, const uint8_t *filename){ */ int ftinfo_load_fontname(FT_INFO *fti, const char *fontspec){ - FcPattern *pattern, *fpat; - FcFontSet *fontset; - FcResult result = FcResultMatch; + FcPattern *pattern = NULL; + FcPattern *fpat = NULL; + FcFontSet *fontset = NULL; + FcResult result = FcResultMatch; char *filename; double fd; FNT_SPECS *fsp; @@ -738,38 +739,45 @@ int ftinfo_load_fontname(FT_INFO *fti, const char *fontspec){ if(!fti)return(-1); /* If it is already loaded, do not load it again */ - if((status = ftinfo_find_loaded_by_spec(fti, (uint8_t *) fontspec))>=0){ - return(status); - } + status = ftinfo_find_loaded_by_spec(fti, (uint8_t *) fontspec); + if(status >= 0){ return(status); } + status = 0; /* was -1, reset to 0 */ ftinfo_make_insertable(fti); fi_idx = fti->used; - if(!(pattern = FcNameParse((const FcChar8 *)fontspec)) )return(2); - if(!FcConfigSubstitute(NULL, pattern, FcMatchPattern) )return(3); - FcDefaultSubstitute(pattern); - /* get a fontset, trimmed to only those with new glyphs as needed, so that missing glyph's may be handled */ - if(!(fontset = FcFontSort (NULL,pattern, FcTrue, NULL, &result)) - || result != FcResultMatch)return(4); - if(!(fpat = FcFontRenderPrepare(NULL, pattern, fontset->fonts[0])) )return(405); - if(FcPatternGetString( fpat, FC_FILE, 0, (FcChar8 **)&filename) != FcResultMatch)return(5); - if(FcPatternGetDouble( fpat, FC_SIZE, 0, &fd) != FcResultMatch)return(6); - - /* copy these into memory for external use */ - fsp = &(fti->fonts[fti->used]); - fsp->fontset = fontset; - fsp->alts = NULL; /* Initially no links to alternate fonts */ - fsp->space = 0; - fsp->file = (uint8_t *) U_strdup((char *) filename); - fsp->fontspec = (uint8_t *) U_strdup((char *) fontspec); - fsp->fpat = fpat; - fsp->fsize = fd; - + pattern = FcNameParse((const FcChar8 *)fontspec); + while(1) { /* this is NOT a loop, it uses breaks to avoid gotos and deep nesting */ + if(!(pattern)){ status = -2; break; } + if(!FcConfigSubstitute(NULL, pattern, FcMatchPattern)){ status = -3; break; }; + FcDefaultSubstitute(pattern); + /* get a fontset, trimmed to only those with new glyphs as needed, so that missing glyph's may be handled */ + if(!(fontset = FcFontSort (NULL,pattern, FcTrue, NULL, &result)) || (result != FcResultMatch)){ status = -4; break; } + if(!(fpat = FcFontRenderPrepare(NULL, pattern, fontset->fonts[0]))){ status = -405; break; } + if(FcPatternGetString( fpat, FC_FILE, 0, (FcChar8 **)&filename) != FcResultMatch){ status = -5; break; } + if(FcPatternGetDouble( fpat, FC_SIZE, 0, &fd) != FcResultMatch){ status = -6; break; } + + /* copy these into memory for external use */ + fsp = &(fti->fonts[fti->used]); + fsp->fontset = fontset; + fsp->alts = NULL; /* Initially no links to alternate fonts */ + fsp->space = 0; + fsp->file = (uint8_t *) U_strdup((char *) filename); + fsp->fontspec = (uint8_t *) U_strdup((char *) fontspec); + fsp->fpat = fpat; + fsp->fsize = fd; + break; + } /* release FC's own memory related to this call that does not need to be kept around so that face will work */ - FcPatternDestroy(pattern); + if(pattern)FcPatternDestroy(pattern); /* done with this memory */ + if(status<0){ + if(fontset)FcFontSetDestroy(fontset); + if(fpat)FcPatternDestroy(fpat); + return(status); + } /* get the current face */ - if(FT_New_Face( fti->library, (const char *) fsp->file, 0, &(fsp->face) )){ return(8); } + if(FT_New_Face( fti->library, (const char *) fsp->file, 0, &(fsp->face) )){ return(-8); } if(FT_Set_Char_Size( fsp->face, /* handle to face object */ @@ -777,12 +785,12 @@ int ftinfo_load_fontname(FT_INFO *fti, const char *fontspec){ fd*64, /* char_height in 1/64th of points */ 72, /* horizontal device resolution, DPI */ 72) /* vebrical device resolution, DPI */ - ){ return(9); } + ){ return(-9); } /* The space advance is needed in various places. Get it now, and get it in the font units, so that it can be scaled later with the text size */ status = TR_getadvance(fti, fsp,' ',0,FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING | FT_LOAD_NO_BITMAP, FT_KERNING_UNSCALED, NULL, NULL); - if(status < 0)return(7); + if(status < 0)return(-7); fsp->spcadv = ((double) status)/(64.0); fti->used++; @@ -1380,7 +1388,7 @@ printf("Overlap rprect (LL,UR) dst:(%lf,%lf),(%lf,%lf) src:(%lf,%lf),(%lf,%lf)\n } /** - \brief Check for a text element upstream from the start element and in the reversed direction. + \brief Check for various sorts of invalid text elements upstream (language dir changes, draw order backwards from language direction) \returns 0 on success (not upstream), 1 if upstream, anything else is an error. \param bri pointer to the BR_INFO structure \param dst index of the destination bounding rectangle. @@ -1405,6 +1413,12 @@ int brinfo_upstream(BR_INFO *bri, int dst, int src, int ddir, int sdir){ else if( ddir == LDIR_LR && sdir == LDIR_RL){ if((br_src->xll + br_src->xur)/2.0 <= br_dst->xll ){ status = 1; } } + else if( ddir == LDIR_RL && sdir == LDIR_RL){ + if(br_dst->xur <= (br_src->xll + br_src->xur)/2.0){ status = 1; } + } + else if( ddir == LDIR_LR && sdir == LDIR_LR){ + if((br_src->xll + br_src->xur)/2.0 <= br_dst->xll ){ status = 1; } + } return(status); } @@ -1490,13 +1504,19 @@ TR_INFO *trinfo_init(TR_INFO *tri){ !(tri->bri = brinfo_init()) || !(tri->cxi = cxinfo_init()) ){ tri = trinfo_release(tri); } + tri->out = NULL; /* This will allocate as needed, it might not ever be needed. */ + tri->qe = 0.0; + tri->esc = 0.0; + tri->x = DBL_MAX; + tri->y = DBL_MAX; + tri->dirty = 0; tri->use_kern = 1; - tri->usebk = BKCLR_NONE; tri->load_flags = FT_LOAD_NO_SCALE; tri->kern_mode = FT_KERNING_UNSCALED; - tri->out = NULL; /* This will allocate as needed, it might not ever be needed. */ tri->outspace = 0; tri->outused = 0; + tri->usebk = BKCLR_NONE; + memset(&(tri->bkcolor),0,sizeof(TRCOLORREF)); return(tri); } @@ -1552,9 +1572,6 @@ TR_INFO *trinfo_release_except_FC(TR_INFO *tri){ */ TR_INFO *trinfo_clear(TR_INFO *tri){ if(tri){ - tri->dirty = 0; /* set these back to their defaults */ - tri->esc = 0.0; - /* Do NOT modify use_kern, usebk, load_flags, or kern_mode */ if(tri->bri)tri->bri=brinfo_release(tri->bri); if(tri->tpi)tri->tpi=tpinfo_release(tri->tpi); @@ -1565,6 +1582,11 @@ TR_INFO *trinfo_clear(TR_INFO *tri){ tri->outused = 0; tri->outspace = 0; }; + /* Do NOT modify: qe, use_kern, usebk, load_flags, kern_mode, or bkcolor. Set the rest back to their defaults */ + tri->esc = 0.0; + tri->x = DBL_MAX; + tri->y = DBL_MAX; + tri->dirty = 0; if(!(tri->tpi = tpinfo_init()) || /* re-init the pieces just released */ !(tri->bri = brinfo_init()) || !(tri->cxi = cxinfo_init()) @@ -1958,7 +1980,7 @@ void TR_layout_2_svg(TR_INFO *tri){ cutat=strcspn((char *)fti->fonts[tsp->fi_idx].fontspec,":"); sprintf(obuf,"font-family:%.*s;",cutat,fti->fonts[tsp->fi_idx].fontspec); TRPRINT(tri, obuf); - sprintf(obuf,"\n\">%s</text>\n",tsp->string); + sprintf(obuf,"\n\">%s</text>\n",&tsp->string[tsp->spaces]); TRPRINT(tri, obuf); #endif /* DBG_TR_INPUT debugging code, original text objects */ } @@ -2278,7 +2300,10 @@ int TR_layout_analyze(TR_INFO *tri){ next logical piece of text is "upstream" positionally of its logical predecessor. The meaning of such a construct is at best ambiguous. The test is only applied with respect to the first text chunk. This sort of construct may appear when a valid initial construct like [1->English][2<-Hebrew][3->English] is edited - and the leading chunk of text removed. + and the leading chunk of text removed. + + Also reject reversed order text as in (English) <A><B><C> (draw order) arranged as <C><B><A>. This happens + if the language direction field is incorrect, perhaps due to a corrupt or malformed input file. */ if(brinfo_upstream(bri, dst_rt, /* index into bri for dst */ @@ -2422,10 +2447,28 @@ int TR_layout_analyze(TR_INFO *tri){ } } - /* if x or y kern is less than the quantization error it is probably noise, set it to zero */ - if(fabs(tspj->xkern)<tri->qe)tspj->xkern = 0.0; - if(fabs(tspj->ykern)<tri->qe)tspj->ykern = 0.0; - + /* if x or y kern is less than twice the quantization error it is probably noise, set it to zero */ + if(fabs(tspj->xkern) <= 2.0*tri->qe)tspj->xkern = 0.0; + if(fabs(tspj->ykern) <= 2.0*tri->qe)tspj->ykern = 0.0; + + /* reintroduce spaces on the leading edge of text "j" if the kerning can be in part or in whole replaced + with 1 or 2 spaces */ + if(tspj->ykern == 0.0){ + double spaces = tspj->xkern/spcadv; /* negative on RL language, positive on LR */ + if((ldir == LDIR_RL && (spaces <= -0.9 && spaces >= -2.1)) || + (ldir == LDIR_LR && (spaces >= 0.9 && spaces <= 2.1)) ){ + int ispaces = lround(spaces); + tspj->xkern -= ((double)ispaces*spcadv); + if(ispaces<0)ispaces=-ispaces; + size_t slen = strlen((char *)tspj->string); + uint8_t *newstring = malloc(1 + ispaces + slen); + sprintf((char *)newstring," "); /* start with two spaces, possibly overwrite one in the next line */ + memcpy(newstring+ispaces,tspj->string,slen+1); /* copy existing string to proper position */ + free(tspj->string); + tspj->string = newstring; + tspj->spaces = ispaces; // only needed to fix optional debugging SVG output later + } + } tspi = tspj; lastldir = ldir; @@ -2699,7 +2742,7 @@ int main(int argc, char *argv[]){ tsp.weight = 80; tsp.condensed = 100; tsp.decoration = 0; /* none */ - tsp.co = 0; + tsp.spaces = 0; /* none */ tsp.fi_idx = -1; /* set to an invalid */ tsp.rt_tidx = -1; /* set to an invalid */ tsp.xkern = tsp.ykern = 0.0; diff --git a/src/extension/internal/text_reassemble.h b/src/extension/internal/text_reassemble.h index d85b233be..6c1acafe5 100644 --- a/src/extension/internal/text_reassemble.h +++ b/src/extension/internal/text_reassemble.h @@ -4,11 +4,11 @@ See text_reassemble.c for notes File: text_reassemble.h -Version: 0.0.12 -Date: 14-MAY-2013 +Version: 0.0.13 +Date: 06-FEB-2014 Author: David Mathog, Biology Division, Caltech email: mathog@caltech.edu -Copyright: 2013 David Mathog and California Institute of Technology (Caltech) +Copyright: 2014 David Mathog and California Institute of Technology (Caltech) */ #ifndef _TEXT_REASSEMBLE_ @@ -189,6 +189,7 @@ typedef struct { int weight; /**< weight, as in FontConfig */ int condensed; /**< condensed, as in FontConfig */ int decoration; /**< text decorations, ignored during assembly, used during output */ + int spaces; /**< count of spaces converted from wide kerning (1 or 2) */ TRCOLORREF decColor; /**< text decoration color, ignored during assembly, used during output */ int co; /**< condensed override, if set Font name included narrow */ int rt_tidx; /**< index of rectangle that contains it */ diff --git a/src/extension/internal/wmf-inout.cpp b/src/extension/internal/wmf-inout.cpp index a72c16a88..fc54350df 100644 --- a/src/extension/internal/wmf-inout.cpp +++ b/src/extension/internal/wmf-inout.cpp @@ -4,6 +4,7 @@ /* Authors: * Ulf Erikson <ulferikson@users.sf.net> * Jon A. Cruz <jon@joncruz.org> + * David Mathog * Abhishek Sharma * * Copyright (C) 2006-2008 Authors @@ -1079,6 +1080,28 @@ Wmf::select_brush(PWMF_CALLBACK_DATA d, int index) g_message("Please send WMF file to developers - select_brush U_WMR_DIBCREATEPATTERNBRUSH not bm16 or dib, not handled"); } } + else if(iType == U_WMR_CREATEPATTERNBRUSH){ + uint32_t tidx; + int cbPx; + U_BITMAP16 Bm16h; + const char *px; + if(U_WMRCREATEPATTERNBRUSH_get(record, &Bm16h, &cbPx, &px)){ + tidx = add_bm16_image(d, Bm16h, px); + if(tidx == 0xFFFFFFFF){ // Problem with the image, for instance, an unsupported bitmap16 type + double r, g, b; + r = SP_COLOR_U_TO_F( U_RGBAGetR(d->dc[d->level].textColor)); + g = SP_COLOR_U_TO_F( U_RGBAGetG(d->dc[d->level].textColor)); + b = SP_COLOR_U_TO_F( U_RGBAGetB(d->dc[d->level].textColor)); + d->dc[d->level].style.fill.value.color.set( r, g, b ); + d->dc[d->level].fill_mode = DRAW_PAINT; + } + else { + d->dc[d->level].fill_idx = tidx; + d->dc[d->level].fill_mode = DRAW_IMAGE; + } + d->dc[d->level].fill_set = true; + } + } } @@ -1488,6 +1511,7 @@ int Wmf::myMetaFileProc(const char *contents, unsigned int length, PWMF_CALLBACK tsp.vadvance = 0.0; /* meaningful only when a complex contains two or more lines */ tsp.taln = ALILEFT + ALIBASE; tsp.ldir = LDIR_LR; + tsp.spaces = 0; // this field is only used for debugging tsp.color.Red = 0; /* RGB Black */ tsp.color.Green = 0; /* RGB Black */ tsp.color.Blue = 0; /* RGB Black */ @@ -1498,6 +1522,7 @@ int Wmf::myMetaFileProc(const char *contents, unsigned int length, PWMF_CALLBACK tsp.condensed = 100; tsp.co = 0; tsp.fi_idx = -1; /* set to an invalid */ + tsp.rt_tidx = -1; /* set to an invalid */ SVGOStringStream dbg_str; @@ -1568,7 +1593,10 @@ int Wmf::myMetaFileProc(const char *contents, unsigned int length, PWMF_CALLBACK d->dc[d->level].sizeView.x = d->dc[d->level].sizeWnd.x = 0; d->dc[d->level].sizeView.y = d->dc[d->level].sizeWnd.y = 0; - // Upper left corner in device units, usually both 0, but not always + /* Upper left corner in device units, usually both 0, but not always. + If a placeable header is used, and later a windoworg/windowext are found, then + the placeable information will be ignored. + */ d->ulCornerInX = Placeable.Dst.left; d->ulCornerInY = Placeable.Dst.top; @@ -1805,6 +1833,8 @@ std::cout << "BEFORE DRAW" { dbg_str << "<!-- U_WMR_SETWINDOWORG -->\n"; nSize = U_WMRSETWINDOWORG_get(contents, &d->dc[d->level].winorg); + d->ulCornerOutX = 0.0; // In the examples seen to date if this record is used with a placeable header, that header is ignored + d->ulCornerOutY = 0.0; break; } case U_WMR_SETWINDOWEXT: @@ -2322,12 +2352,12 @@ std::cout << "BEFORE DRAW" break; case U_WMR_CREATEBRUSHINDIRECT: case U_WMR_DIBCREATEPATTERNBRUSH: + case U_WMR_CREATEPATTERNBRUSH: // <- this one did not display properly on XP, DIBCREATEPATTERNBRUSH works select_brush(d, index); break; case U_WMR_CREATEFONTINDIRECT: select_font(d, index); break; - case U_WMR_CREATEPATTERNBRUSH: // <- this one did not display properly on XP, DIBCREATEPATTERNBRUSH works case U_WMR_CREATEPALETTE: case U_WMR_CREATEBITMAPINDIRECT: case U_WMR_CREATEBITMAP: @@ -2376,6 +2406,7 @@ std::cout << "BEFORE DRAW" if(iType == U_WMR_TEXTOUT){ dbg_str << "<!-- U_WMR_TEXTOUT -->\n"; nSize = U_WMRTEXTOUT_get(contents, &Dst, &tlen, &text); + Opts=0; } else { dbg_str << "<!-- U_WMR_EXTTEXTOUT -->\n"; @@ -3053,7 +3084,14 @@ Wmf::open( Inkscape::Extension::Input * /*mod*/, const gchar *uri ) // Scale and translate objects double scale = Inkscape::Util::Quantity::convert(1, "px", doc_unit); ShapeEditor::blockSetItem(true); - doc->getRoot()->scaleChildItemsRec(Geom::Scale(scale), Geom::Point(0, doc->getHeight().value("px"))); + double dh; + if(SP_ACTIVE_DOCUMENT){ // for file menu open or import, or paste from clipboard + dh = SP_ACTIVE_DOCUMENT->getHeight().value("px"); + } + else { // for open via --file on command line + dh = doc->getHeight().value("px"); + } + doc->getRoot()->scaleChildItemsRec(Geom::Scale(scale), Geom::Point(0, dh)); ShapeEditor::blockSetItem(false); Inkscape::DocumentUndo::setUndoSensitive(doc, saved); diff --git a/src/helper/pixbuf-ops.cpp b/src/helper/pixbuf-ops.cpp index cd4f539ec..1ba6628c5 100644 --- a/src/helper/pixbuf-ops.cpp +++ b/src/helper/pixbuf-ops.cpp @@ -140,10 +140,10 @@ Inkscape::Pixbuf *sp_generate_internal_bitmap(SPDocument *doc, gchar const */*fi cairo_surface_t *surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, width, height); if (cairo_surface_status(surface) == CAIRO_STATUS_SUCCESS) { - Inkscape::DrawingContext ct(surface, Geom::Point(0,0)); + Inkscape::DrawingContext dc(surface, Geom::Point(0,0)); // render items - drawing.render(ct, final_bbox, Inkscape::DrawingItem::RENDER_BYPASS_CACHE); + drawing.render(dc, final_bbox, Inkscape::DrawingItem::RENDER_BYPASS_CACHE); inkpb = new Inkscape::Pixbuf(surface); } diff --git a/src/helper/png-write.cpp b/src/helper/png-write.cpp index a16fe8e12..a7ebe7423 100644 --- a/src/helper/png-write.cpp +++ b/src/helper/png-write.cpp @@ -335,14 +335,14 @@ sp_export_get_rows(guchar const **rows, void **to_free, int row, int num_rows, v cairo_surface_t *s = cairo_image_surface_create_for_data( px, CAIRO_FORMAT_ARGB32, ebp->width, num_rows, stride); - Inkscape::DrawingContext ct(s, bbox.min()); - ct.setSource(ebp->background); - ct.setOperator(CAIRO_OPERATOR_SOURCE); - ct.paint(); - ct.setOperator(CAIRO_OPERATOR_OVER); + Inkscape::DrawingContext dc(s, bbox.min()); + dc.setSource(ebp->background); + dc.setOperator(CAIRO_OPERATOR_SOURCE); + dc.paint(); + dc.setOperator(CAIRO_OPERATOR_OVER); /* Render */ - ebp->drawing->render(ct, bbox); + ebp->drawing->render(dc, bbox); cairo_surface_destroy(s); *to_free = px; diff --git a/src/libuemf/README b/src/libuemf/README index 4c23cdd52..cfa322178 100644 --- a/src/libuemf/README +++ b/src/libuemf/README @@ -366,6 +366,12 @@ History (Note, version numbers in files represent the libUEMF release where it was last modified, so not all files will show the same version numbers in each release.) +0.1.11 2014-01-29 + Fixed bug in uwmf.c (wrong minimum record size on U_WMRTEXTOUT) + Fixed bug in uwmf.c (U_WMRCREATEPATTERNBRUSH not right) + Added error handling to uemf_utf.c for cases where src is a null pointer. + Added a test of createpatternbrush to testlib_wmf + 0.1.10 2014-01-14 Slight changes in documentation for uemf.h. Fixed typo in uemf_endian.c. diff --git a/src/libuemf/uemf_utf.c b/src/libuemf/uemf_utf.c index f329e74d9..bce60af4d 100644 --- a/src/libuemf/uemf_utf.c +++ b/src/libuemf/uemf_utf.c @@ -12,11 +12,11 @@ /* File: uemf_utf.c -Version: 0.0.4 -Date: 19-MAR-2013 +Version: 0.0.5 +Date: 29-JAN-2014 Author: David Mathog, Biology Division, Caltech email: mathog@caltech.edu -Copyright: 2013 David Mathog and California Institute of Technology (Caltech) +Copyright: 2014 David Mathog and California Institute of Technology (Caltech) */ #ifdef __cplusplus @@ -68,9 +68,14 @@ These functions are used for development and debugging and should be be includie void wchar8show( const char *src ){ - printf("char show\n"); - size_t srclen = 0; - while(*src){ printf("%d %d %x\n",(int) srclen,*src,*src); srclen++; src++; } + if(!src){ + printf("char show <NULL>\n"); + } + else { + printf("char show\n"); + size_t srclen = 0; + while(*src){ printf("%d %d %x\n",(int) srclen,*src,*src); srclen++; src++; } + } } /** @@ -80,9 +85,14 @@ void wchar8show( void wchar16show( const uint16_t *src ){ - printf("uint16_t show\n"); - size_t srclen = 0; - while(*src){ printf("%d %d %x\n",(int) srclen,*src,*src); srclen++; src++; } + if(!src){ + printf("uint16_t show <NULL>\n"); + } + else { + printf("uint16_t show\n"); + size_t srclen = 0; + while(*src){ printf("%d %d %x\n",(int) srclen,*src,*src); srclen++; src++; } + } } /** @@ -91,9 +101,14 @@ void wchar16show( void wchar32show( const uint32_t *src ){ - printf("uint32_t show\n"); - size_t srclen = 0; - while(*src){ printf("%d %d %x\n",(int) srclen,*src,*src); srclen++; src++; } + if(!src){ + printf("uint32_t show <NULL>\n"); + } + else { + printf("uint32_t show\n"); + size_t srclen = 0; + while(*src){ printf("%d %d %x\n",(int) srclen,*src,*src); srclen++; src++; } + } } /** @@ -104,13 +119,19 @@ void wchartshow( const wchar_t *src ){ uint32_t val; - printf("wchar_t show\n"); - size_t srclen = 0; - while(*src){ - val = *src; // because *src is wchar_t is not strictly an integer type, can cause warnings on next line - printf("%d %d %x\n",(int) srclen,val,val); - srclen++; - src++; + if(!src){ + printf("wchar_t show <NULL>\n"); + } + else { + printf("wchar_t show\n"); + size_t srclen = 0; + if(!src)return; + while(*src){ + val = *src; // because *src is wchar_t is not strictly an integer type, can cause warnings on next line + printf("%d %d %x\n",(int) srclen,val,val); + srclen++; + src++; + } } } @@ -127,7 +148,9 @@ size_t wchar16len( const uint16_t *src ){ size_t srclen = 0; - while(*src){ srclen++; src++; } + if(src){ + while(*src){ srclen++; src++; } + } return(srclen); } @@ -139,7 +162,9 @@ size_t wchar32len( const uint32_t *src ){ size_t srclen = 0; - while(*src){ srclen++; src++; } + if(src){ + while(*src){ srclen++; src++; } + } return(srclen); } @@ -154,9 +179,11 @@ void wchar16strncpy( const uint16_t *src, size_t nchars ){ - for(;nchars;nchars--,dst++,src++){ - *dst = *src; - if(!*src)break; + if(src){ + for(;nchars;nchars--,dst++,src++){ + *dst = *src; + if(!*src)break; + } } } @@ -172,8 +199,10 @@ void wchar16strncpypad( const uint16_t *src, size_t nchars ){ - for(;*src && nchars;nchars--,dst++,src++){ *dst = *src; } - for(;nchars;nchars--,dst++){ *dst = 0; } // Pad the remainder + if(src){ + for(;*src && nchars;nchars--,dst++,src++){ *dst = *src; } + for(;nchars;nchars--,dst++){ *dst = 0; } // Pad the remainder + } } /* For the following converstion functions, remember that iconv() modifies ALL of its parameters, @@ -197,6 +226,7 @@ uint16_t *U_Utf32leToUtf16le( char *dst,*dst2; size_t srclen,dstlen,status; + if(!src)return(NULL); if(max){ srclen = 4*max; } else { srclen = 4 + 4*wchar32len(src); } //include terminator, length in BYTES @@ -226,6 +256,8 @@ uint32_t *U_Utf16leToUtf32le( char *dst,*dst2; char *src2 = (char *) src; size_t srclen,dstlen,status; + + if(!src)return(NULL); if(max){ srclen = 2*max; } else { srclen = 2*wchar16len(src)+2; } // include terminator, length in BYTES dstlen = 2*(2 + srclen); // This should always work @@ -261,6 +293,8 @@ uint32_t *U_Latin1ToUtf32le( char *dst,*dst2; char *src2 = (char *) src; size_t srclen,dstlen,status; + + if(!src)return(NULL); if(max){ srclen = max; } else { srclen = strlen(src)+1; } // include terminator, length in BYTES dstlen = sizeof(uint32_t)*(1 + srclen); // This should always work but might waste some space @@ -290,6 +324,8 @@ uint32_t *U_Utf8ToUtf32le( char *dst,*dst2; char *src2 = (char *) src; size_t srclen,dstlen,status; + + if(!src)return(NULL); if(max){ srclen = max; } else { srclen = strlen(src)+1; } // include terminator, length in BYTES dstlen = sizeof(uint32_t)*(1 + srclen); // This should always work but might waste some space @@ -319,6 +355,8 @@ char *U_Utf32leToUtf8( char *dst,*dst2; char *src2 = (char *) src; size_t srclen,dstlen,status; + + if(!src)return(NULL); if(max){ srclen = 4*max; } else { srclen = 4*(1 + wchar32len(src)); } //include terminator, length in BYTES dstlen = 1 + srclen; // This should always work but might waste some space @@ -349,6 +387,7 @@ uint16_t *U_Utf8ToUtf16le( size_t srclen,dstlen,status; iconv_t conv; + if(!src)return(NULL); if(max){ srclen = max; } else { srclen = strlen(src)+1; } // include terminator, length in BYTES dstlen = 2 * (1 + srclen); // this will always work, but may waste space @@ -378,6 +417,8 @@ char *U_Utf16leToUtf8( char *dst, *dst2; char *ret=NULL; size_t srclen,dstlen,status; + + if(!src)return(NULL); if(max){ srclen = 2*max; } else { srclen = 2*(1 +wchar16len(src)); } //include terminator, length in BYTES dstlen = 1 + 2*srclen; // this will always work, but may waste space @@ -410,6 +451,8 @@ char *U_Utf16leToLatin1( char *dst, *dst2; char *ret=NULL; size_t srclen,dstlen,status; + + if(!src)return(NULL); if(max){ srclen = 2*max; } else { srclen = 2*(1 +wchar16len(src)); } //include terminator, length in BYTES dstlen = 1 + srclen; // this will always work as latin1 is always 1 byte/character diff --git a/src/libuemf/uwmf.c b/src/libuemf/uwmf.c index a6ac963cb..be1feadea 100644 --- a/src/libuemf/uwmf.c +++ b/src/libuemf/uwmf.c @@ -19,11 +19,11 @@ /* File: uwmf.c -Version: 0.0.12 -Date: 25-NOV-2013 +Version: 0.0.13 +Date: 30-JAN-2014 Author: David Mathog, Biology Division, Caltech email: mathog@caltech.edu -Copyright: 2013 David Mathog and California Institute of Technology (Caltech) +Copyright: 2014 David Mathog and California Institute of Technology (Caltech) */ #ifdef __cplusplus @@ -4271,13 +4271,12 @@ char *U_WMRCREATEPATTERNBRUSH_set( if(!Bm16 || !Pattern)return(NULL); cbPat = (((Bm16->Width * Bm16->BitsPixel + 15) >> 4) << 1) * Bm16->Height; - irecsize = U_SIZE_METARECORD + 14 + 4 + 18 + cbPat; /* core WMR + truncated Bm16 + pattern */ + irecsize = U_SIZE_METARECORD + 14 + 18 + cbPat; /* core WMR + truncated Bm16 + 18 spaces bytes + pattern */ record = malloc(irecsize); if(record){ U_WMRCORE_SETRECHEAD(record,irecsize,U_WMR_CREATEPATTERNBRUSH); off = U_SIZE_METARECORD; - memcpy(record + off, Bm16, 14); off+=14; /* Truncated bitmap16 object*/ - memset(record + off, 0, 4); off+=4; /* 4 bytes of its "bits", which are ignored */ + memcpy(record + off, Bm16, 14); off+=14; /* Truncated bitmap16 object, last 4 bytes are to be ignored*/ memset(record + off, 0, 18); off+=18; /* 18 bytes of zero, which are ignored */ memcpy(record + off, Pattern, cbPat); /* The pattern array */ } @@ -5359,7 +5358,7 @@ int U_WMRTEXTOUT_get( ){ int16_t L2; int off; - int size = U_WMRCORE_RECSAFE_get(contents, (U_SIZE_WMRPATBLT)); + int size = U_WMRCORE_RECSAFE_get(contents, (U_SIZE_WMRTEXTOUT)); if(!size)return(0); *Length = *(int16_t *)(contents + offsetof(U_WMRTEXTOUT, Length)); *string = contents + offsetof(U_WMRTEXTOUT, String); /* May not be null terminated!!! */ @@ -6851,12 +6850,15 @@ int U_WMRCREATEPATTERNBRUSH_get( const char **Pattern ){ int off = U_SIZE_METARECORD; - int size = U_WMRCORE_RECSAFE_get(contents, (U_SIZE_WMRSETDIBTODEV)); + /* size in next one is + 6 (core header) + 14 (truncated bitmap16) + 18 bytes reserved + 2 bytes (at least) for data */ + int size = U_WMRCORE_RECSAFE_get(contents, (U_SIZE_METARECORD + 14 + 18 + 2)); if(!size)return(0); memset(Bm16, 0, U_SIZE_BITMAP16); - memcpy(Bm16, contents + off, 14); /* BM16 is truncated in this record type */ + /* BM16 is truncated in this record type to 14 bytes, last 4 bytes must be ignored, so they are not even copied */ + memcpy(Bm16, contents + off, 10); *pasize = (((Bm16->Width * Bm16->BitsPixel + 15) >> 4) << 1) * Bm16->Height; - off += 36; /* skip [truncated bitmap16 object and 18 bytes of reserved */ + off += 32; /* skip [14 bytes of truncated bitmap16 object and 18 bytes of reserved */ *Pattern = (contents + off); return(size); } diff --git a/src/marker.cpp b/src/marker.cpp index b9464186d..900f8a2ca 100644 --- a/src/marker.cpp +++ b/src/marker.cpp @@ -47,18 +47,15 @@ namespace { bool markerRegistered = SPFactory::instance().registerObject("svg:marker", createMarker); } -SPMarker::SPMarker() : SPGroup() { - this->aspect_clip = 0; - this->aspect_align = 0; - this->aspect_set = 0; - this->markerUnits = 0; - this->orient_auto = 0; - this->markerUnits_set = 0; - this->orient_set = 0; - this->orient = 0; - - this->viewBox = Geom::OptRect(); - this->c2p.setIdentity(); +SPMarker::SPMarker() : SPGroup(), SPViewBox() { + + this->markerUnits = 0; + this->markerUnits_set = 0; + + this->orient_auto = 0; + this->orient_set = 0; + this->orient = 0; + this->views = NULL; } @@ -177,133 +174,14 @@ void SPMarker::set(unsigned int key, const gchar* value) { break; case SP_ATTR_VIEWBOX: - this->viewBox = Geom::OptRect(); - - if (value) { - double x, y, width, height; - char *eptr; - - /* fixme: We have to take original item affine into account */ - /* fixme: Think (Lauris) */ - eptr = (gchar *) value; - x = g_ascii_strtod (eptr, &eptr); - - while (*eptr && ((*eptr == ',') || (*eptr == ' '))) { - eptr++; - } - - y = g_ascii_strtod (eptr, &eptr); - - while (*eptr && ((*eptr == ',') || (*eptr == ' '))) { - eptr++; - } - - width = g_ascii_strtod (eptr, &eptr); - - while (*eptr && ((*eptr == ',') || (*eptr == ' '))) { - eptr++; - } - - height = g_ascii_strtod (eptr, &eptr); - - while (*eptr && ((*eptr == ',') || (*eptr == ' '))) { - eptr++; - } - - if ((width > 0) && (height > 0)) { - /* Set viewbox */ - this->viewBox = Geom::Rect(Geom::Point(x, y), Geom::Point(x + width, y + height)); - } - } - - this->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_VIEWPORT_MODIFIED_FLAG); - break; + set_viewBox( value ); + this->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_VIEWPORT_MODIFIED_FLAG); + break; case SP_ATTR_PRESERVEASPECTRATIO: - /* Do setup before, so we can use break to escape */ - this->aspect_set = FALSE; - this->aspect_align = SP_ASPECT_NONE; - this->aspect_clip = SP_ASPECT_MEET; - - this->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_VIEWPORT_MODIFIED_FLAG); - - if (value) { - int len; - gchar c[256]; - const gchar *p, *e; - unsigned int align, clip; - p = value; - - while (*p && *p == 32) { - p += 1; - } - - if (!*p) { - break; - } - - e = p; - - while (*e && *e != 32) { - e += 1; - } - - len = e - p; - - if (len > 8) { - break; - } - - memcpy (c, value, len); - - c[len] = 0; - - /* Now the actual part */ - if (!strcmp (c, "none")) { - align = SP_ASPECT_NONE; - } else if (!strcmp (c, "xMinYMin")) { - align = SP_ASPECT_XMIN_YMIN; - } else if (!strcmp (c, "xMidYMin")) { - align = SP_ASPECT_XMID_YMIN; - } else if (!strcmp (c, "xMaxYMin")) { - align = SP_ASPECT_XMAX_YMIN; - } else if (!strcmp (c, "xMinYMid")) { - align = SP_ASPECT_XMIN_YMID; - } else if (!strcmp (c, "xMidYMid")) { - align = SP_ASPECT_XMID_YMID; - } else if (!strcmp (c, "xMaxYMid")) { - align = SP_ASPECT_XMAX_YMID; - } else if (!strcmp (c, "xMinYMax")) { - align = SP_ASPECT_XMIN_YMAX; - } else if (!strcmp (c, "xMidYMax")) { - align = SP_ASPECT_XMID_YMAX; - } else if (!strcmp (c, "xMaxYMax")) { - align = SP_ASPECT_XMAX_YMAX; - } else { - break; - } - - clip = SP_ASPECT_MEET; - - while (*e && *e == 32) { - e += 1; - } - - if (*e) { - if (!strcmp (e, "meet")) { - clip = SP_ASPECT_MEET; - } else if (!strcmp (e, "slice")) { - clip = SP_ASPECT_SLICE; - } else { - break; - } - } - - this->aspect_set = TRUE; - this->aspect_align = align; - this->aspect_clip = clip; - } - break; + set_preserveAspectRatio( value ); + this->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_VIEWPORT_MODIFIED_FLAG); + break; default: SPGroup::set(key, value); @@ -312,112 +190,23 @@ void SPMarker::set(unsigned int key, const gchar* value) { } void SPMarker::update(SPCtx *ctx, guint flags) { - SPItemCtx rctx; - // fixme: We have to set up clip here too + SPItemCtx ictx; // Copy parent context - rctx.flags = ctx->flags; + ictx.flags = ctx->flags; // Initialize transformations - rctx.i2doc = Geom::identity(); - rctx.i2vp = Geom::identity(); + ictx.i2doc = Geom::identity(); + ictx.i2vp = Geom::identity(); // Set up viewport - rctx.viewport = Geom::Rect::from_xywh(0, 0, this->markerWidth.computed, this->markerHeight.computed); - - // Start with identity transform - this->c2p.setIdentity(); - - // Viewbox is always present, either implicitly or explicitly - Geom::Rect vb; - if (this->viewBox) { - vb = *this->viewBox; - } else { - vb = rctx.viewport; - } - - // Now set up viewbox transformation - - // Determine actual viewbox in viewport coordinates - // double x = 0; - // double y = 0; - double width = 0; - double height = 0; - - if (this->aspect_align == SP_ASPECT_NONE) { - // x = 0.0; - // y = 0.0; - width = rctx.viewport.width(); - height = rctx.viewport.height(); - } else { - double scalex, scaley, scale; - // Things are getting interesting - scalex = rctx.viewport.width() / (vb.width()); - scaley = rctx.viewport.height() / (vb.height()); - scale = (this->aspect_clip == SP_ASPECT_MEET) ? MIN (scalex, scaley) : MAX (scalex, scaley); - width = (vb.width()) * scale; - height = (vb.height()) * scale; - - // Now place viewbox to requested position - /*switch (marker->aspect_align) { - case SP_ASPECT_XMIN_YMIN: - x = 0.0; - y = 0.0; - break; - case SP_ASPECT_XMID_YMIN: - x = 0.5 * (rctx.viewport.width() - width); - y = 0.0; - break; - case SP_ASPECT_XMAX_YMIN: - x = 1.0 * (rctx.viewport.width() - width); - y = 0.0; - break; - case SP_ASPECT_XMIN_YMID: - x = 0.0; - y = 0.5 * (rctx.viewport.height() - height); - break; - case SP_ASPECT_XMID_YMID: - x = 0.5 * (rctx.viewport.width() - width); - y = 0.5 * (rctx.viewport.height() - height); - break; - case SP_ASPECT_XMAX_YMID: - x = 1.0 * (rctx.viewport.width() - width); - y = 0.5 * (rctx.viewport.height() - height); - break; - case SP_ASPECT_XMIN_YMAX: - x = 0.0; - y = 1.0 * (rctx.viewport.height() - height); - break; - case SP_ASPECT_XMID_YMAX: - x = 0.5 * (rctx.viewport.width() - width); - y = 1.0 * (rctx.viewport.height() - height); - break; - case SP_ASPECT_XMAX_YMAX: - x = 1.0 * (rctx.viewport.width() - width); - y = 1.0 * (rctx.viewport.height() - height); - break; - default: - x = 0.0; - y = 0.0; - break; - }*/ - } - - // TODO fixme: all that work is done to figure out x and y, which are just ignored. Check why. + ictx.viewport = Geom::Rect::from_xywh(0, 0, this->markerWidth.computed, this->markerHeight.computed); - // viewbox transformation and reference translation - this->c2p = Geom::Translate(-this->refX.computed, -this->refY.computed) * - Geom::Scale(width / vb.width(), height / vb.height()); + SPItemCtx rctx = get_rctx( &ictx ); - rctx.i2doc = this->c2p * rctx.i2doc; - - // If viewBox is set reinitialize child viewport - // Otherwise it already correct - if (this->viewBox) { - rctx.viewport = *this->viewBox; - rctx.i2vp = Geom::identity(); - } + // Shift according to refX, refY + this->c2p = Geom::Translate(this->viewBox.left()-this->refX.computed, this->viewBox.top()-this->refY.computed) * this->c2p; // And invoke parent method SPGroup::update((SPCtx *) &rctx, flags); @@ -494,8 +283,12 @@ Inkscape::XML::Node* SPMarker::write(Inkscape::XML::Document *xml_doc, Inkscape: } Inkscape::DrawingItem* SPMarker::show(Inkscape::Drawing &drawing, unsigned int key, unsigned int flags) { - // CPPIFY: correct? - return SPGroup::show(drawing, key, flags); + // Markers in tree are never shown directly even if outside of <defs>. + return 0; +} + +Inkscape::DrawingItem* SPMarker::private_show(Inkscape::Drawing &drawing, unsigned int key, unsigned int flags) { + return SPGroup::show(drawing, key, flags); } void SPMarker::hide(unsigned int key) { @@ -575,7 +368,7 @@ sp_marker_show_instance ( SPMarker *marker, Inkscape::DrawingItem *parent, } if (!v->items[pos]) { /* Parent class ::show method */ - v->items[pos] = marker->show(parent->drawing(), key, SP_ITEM_REFERENCE_FLAGS); + v->items[pos] = marker->private_show(parent->drawing(), key, SP_ITEM_REFERENCE_FLAGS); if (v->items[pos]) { /* fixme: Position (Lauris) */ diff --git a/src/marker.h b/src/marker.h index b780950de..21ad63a41 100644 --- a/src/marker.h +++ b/src/marker.h @@ -31,8 +31,9 @@ struct SPMarkerView; #include "sp-item-group.h" #include "sp-marker-loc.h" #include "uri-references.h" +#include "viewbox.h" -class SPMarker : public SPGroup { +class SPMarker : public SPGroup, public SPViewBox { public: SPMarker(); virtual ~SPMarker(); @@ -54,17 +55,6 @@ public: unsigned int orient_auto : 1; float orient; - /* viewBox; */ - Geom::OptRect viewBox; - - /* preserveAspectRatio */ - unsigned int aspect_set : 1; - unsigned int aspect_align : 4; - unsigned int aspect_clip : 1; - - /* Child to parent additional transform */ - Geom::Affine c2p; - /* Private views */ SPMarkerView *views; @@ -75,6 +65,7 @@ public: virtual Inkscape::XML::Node* write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags); virtual Inkscape::DrawingItem* show(Inkscape::Drawing &drawing, unsigned int key, unsigned int flags); + virtual Inkscape::DrawingItem* private_show(Inkscape::Drawing &drawing, unsigned int key, unsigned int flags); virtual void hide(unsigned int key); virtual Geom::OptRect bbox(Geom::Affine const &transform, SPItem::BBoxType type) const; diff --git a/src/sp-image.cpp b/src/sp-image.cpp index 8f7a60ca6..5f630f7b7 100644 --- a/src/sp-image.cpp +++ b/src/sp-image.cpp @@ -119,14 +119,12 @@ SPObject* createImage() { bool imageRegistered = SPFactory::instance().registerObject("svg:image", createImage); } -SPImage::SPImage() : SPItem() { - this->aspect_clip = 0; +SPImage::SPImage() : SPItem(), SPViewBox() { this->x.unset(); this->y.unset(); this->width.unset(); this->height.unset(); - this->aspect_align = SP_ASPECT_NONE; this->clipbox = Geom::Rect(); this->sx = this->sy = 1.0; this->ox = this->oy = 0.0; @@ -195,8 +193,8 @@ void SPImage::set(unsigned int key, const gchar* value) { break; case SP_ATTR_X: - if (!this->x.readAbsolute(value)) { - /* fixme: em, ex, % are probably valid, but require special treatment (Lauris) */ + /* ex, em not handled correctly. */ + if (!this->x.read(value)) { this->x.unset(); } @@ -204,8 +202,8 @@ void SPImage::set(unsigned int key, const gchar* value) { break; case SP_ATTR_Y: - if (!this->y.readAbsolute(value)) { - /* fixme: em, ex, % are probably valid, but require special treatment (Lauris) */ + /* ex, em not handled correctly. */ + if (!this->y.read(value)) { this->y.unset(); } @@ -213,8 +211,8 @@ void SPImage::set(unsigned int key, const gchar* value) { break; case SP_ATTR_WIDTH: - if (!this->width.readAbsolute(value)) { - /* fixme: em, ex, % are probably valid, but require special treatment (Lauris) */ + /* ex, em not handled correctly. */ + if (!this->width.read(value)) { this->width.unset(); } @@ -222,8 +220,8 @@ void SPImage::set(unsigned int key, const gchar* value) { break; case SP_ATTR_HEIGHT: - if (!this->height.readAbsolute(value)) { - /* fixme: em, ex, % are probably valid, but require special treatment (Lauris) */ + /* ex, em not handled correctly. */ + if (!this->height.read(value)) { this->height.unset(); } @@ -231,67 +229,8 @@ void SPImage::set(unsigned int key, const gchar* value) { break; case SP_ATTR_PRESERVEASPECTRATIO: - /* Do setup before, so we can use break to escape */ - this->aspect_align = SP_ASPECT_NONE; - this->aspect_clip = SP_ASPECT_MEET; + set_preserveAspectRatio( value ); this->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_VIEWPORT_MODIFIED_FLAG); - - if (value) { - int len; - gchar c[256]; - const gchar *p, *e; - unsigned int align, clip; - p = value; - while (*p && *p == 32) p += 1; - if (!*p) break; - e = p; - while (*e && *e != 32) e += 1; - len = e - p; - if (len > 8) break; - memcpy (c, value, len); - c[len] = 0; - /* Now the actual part */ - if (!strcmp (c, "none")) { - align = SP_ASPECT_NONE; - } else if (!strcmp (c, "xMinYMin")) { - align = SP_ASPECT_XMIN_YMIN; - } else if (!strcmp (c, "xMidYMin")) { - align = SP_ASPECT_XMID_YMIN; - } else if (!strcmp (c, "xMaxYMin")) { - align = SP_ASPECT_XMAX_YMIN; - } else if (!strcmp (c, "xMinYMid")) { - align = SP_ASPECT_XMIN_YMID; - } else if (!strcmp (c, "xMidYMid")) { - align = SP_ASPECT_XMID_YMID; - } else if (!strcmp (c, "xMaxYMid")) { - align = SP_ASPECT_XMAX_YMID; - } else if (!strcmp (c, "xMinYMax")) { - align = SP_ASPECT_XMIN_YMAX; - } else if (!strcmp (c, "xMidYMax")) { - align = SP_ASPECT_XMID_YMAX; - } else if (!strcmp (c, "xMaxYMax")) { - align = SP_ASPECT_XMAX_YMAX; - } else { - break; - } - - clip = SP_ASPECT_MEET; - - while (*e && *e == 32) e += 1; - - if (*e) { - if (!strcmp (e, "meet")) { - clip = SP_ASPECT_MEET; - } else if (!strcmp (e, "slice")) { - clip = SP_ASPECT_SLICE; - } else { - break; - } - } - - this->aspect_align = align; - this->aspect_clip = clip; - } break; #if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2) @@ -322,7 +261,79 @@ void SPImage::set(unsigned int key, const gchar* value) { sp_image_set_curve(this); //creates a curve at the image's boundary for snapping } +// BLIP +#if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2) +void SPImage::apply_profile(Inkscape::Pixbuf *pixbuf) { + + // TODO: this will prevent using MIME data when exporting. + // Integrate color correction into loading. + pixbuf->ensurePixelFormat(Inkscape::Pixbuf::PF_GDK); + int imagewidth = pixbuf->width(); + int imageheight = pixbuf->height(); + int rowstride = pixbuf->rowstride();; + guchar* px = pixbuf->pixels(); + + if ( px ) { + DEBUG_MESSAGE( lcmsFive, "in <image>'s sp_image_update. About to call colorprofile_get_handle()" ); + + guint profIntent = Inkscape::RENDERING_INTENT_UNKNOWN; + cmsHPROFILE prof = Inkscape::CMSSystem::getHandle( this->document, + &profIntent, + this->color_profile ); + if ( prof ) { + cmsProfileClassSignature profileClass = cmsGetDeviceClass( prof ); + if ( profileClass != cmsSigNamedColorClass ) { + int intent = INTENT_PERCEPTUAL; + + switch ( profIntent ) { + case Inkscape::RENDERING_INTENT_RELATIVE_COLORIMETRIC: + intent = INTENT_RELATIVE_COLORIMETRIC; + break; + case Inkscape::RENDERING_INTENT_SATURATION: + intent = INTENT_SATURATION; + break; + case Inkscape::RENDERING_INTENT_ABSOLUTE_COLORIMETRIC: + intent = INTENT_ABSOLUTE_COLORIMETRIC; + break; + case Inkscape::RENDERING_INTENT_PERCEPTUAL: + case Inkscape::RENDERING_INTENT_UNKNOWN: + case Inkscape::RENDERING_INTENT_AUTO: + default: + intent = INTENT_PERCEPTUAL; + } + + cmsHPROFILE destProf = cmsCreate_sRGBProfile(); + cmsHTRANSFORM transf = cmsCreateTransform( prof, + TYPE_RGBA_8, + destProf, + TYPE_RGBA_8, + intent, 0 ); + if ( transf ) { + guchar* currLine = px; + for ( int y = 0; y < imageheight; y++ ) { + // Since the types are the same size, we can do the transformation in-place + cmsDoTransform( transf, currLine, currLine, imagewidth ); + currLine += rowstride; + } + + cmsDeleteTransform( transf ); + } else { + DEBUG_MESSAGE( lcmsSix, "in <image>'s sp_image_update. Unable to create LCMS transform." ); + } + + cmsCloseProfile( destProf ); + } else { + DEBUG_MESSAGE( lcmsSeven, "in <image>'s sp_image_update. Profile type is named color. Can't transform." ); + } + } else { + DEBUG_MESSAGE( lcmsEight, "in <image>'s sp_image_update. No profile found." ); + } + } +} +#endif // defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2) + void SPImage::update(SPCtx *ctx, unsigned int flags) { + SPDocument *doc = this->document; SPItem::update(ctx, flags); @@ -339,170 +350,84 @@ void SPImage::update(SPCtx *ctx, unsigned int flags) { doc->getBase()); if (pixbuf) { -// BLIP #if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2) - if ( this->color_profile ) - { - // TODO: this will prevent using MIME data when exporting. - // Integrate color correction into loading. - pixbuf->ensurePixelFormat(Inkscape::Pixbuf::PF_GDK); - int imagewidth = pixbuf->width(); - int imageheight = pixbuf->height(); - int rowstride = pixbuf->rowstride();; - guchar* px = pixbuf->pixels(); - - if ( px ) { - DEBUG_MESSAGE( lcmsFive, "in <image>'s sp_image_update. About to call colorprofile_get_handle()" ); - - guint profIntent = Inkscape::RENDERING_INTENT_UNKNOWN; - cmsHPROFILE prof = Inkscape::CMSSystem::getHandle( this->document, - &profIntent, - this->color_profile ); - if ( prof ) { - cmsProfileClassSignature profileClass = cmsGetDeviceClass( prof ); - if ( profileClass != cmsSigNamedColorClass ) { - int intent = INTENT_PERCEPTUAL; - - switch ( profIntent ) { - case Inkscape::RENDERING_INTENT_RELATIVE_COLORIMETRIC: - intent = INTENT_RELATIVE_COLORIMETRIC; - break; - case Inkscape::RENDERING_INTENT_SATURATION: - intent = INTENT_SATURATION; - break; - case Inkscape::RENDERING_INTENT_ABSOLUTE_COLORIMETRIC: - intent = INTENT_ABSOLUTE_COLORIMETRIC; - break; - case Inkscape::RENDERING_INTENT_PERCEPTUAL: - case Inkscape::RENDERING_INTENT_UNKNOWN: - case Inkscape::RENDERING_INTENT_AUTO: - default: - intent = INTENT_PERCEPTUAL; - } - - cmsHPROFILE destProf = cmsCreate_sRGBProfile(); - cmsHTRANSFORM transf = cmsCreateTransform( prof, - TYPE_RGBA_8, - destProf, - TYPE_RGBA_8, - intent, 0 ); - if ( transf ) { - guchar* currLine = px; - for ( int y = 0; y < imageheight; y++ ) { - // Since the types are the same size, we can do the transformation in-place - cmsDoTransform( transf, currLine, currLine, imagewidth ); - currLine += rowstride; - } - - cmsDeleteTransform( transf ); - } else { - DEBUG_MESSAGE( lcmsSix, "in <image>'s sp_image_update. Unable to create LCMS transform." ); - } - - cmsCloseProfile( destProf ); - } else { - DEBUG_MESSAGE( lcmsSeven, "in <image>'s sp_image_update. Profile type is named color. Can't transform." ); - } - } else { - DEBUG_MESSAGE( lcmsEight, "in <image>'s sp_image_update. No profile found." ); - } - } - } -#endif // defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2) - + if ( this->color_profile ) apply_profile( pixbuf ); +#endif this->pixbuf = pixbuf; } } } + SPItemCtx *ictx = (SPItemCtx *) ctx; + + // Why continue without a pixbuf? So we can display "Missing Image" png. + // Eventually, we should properly support SVG image type (i.e. render it ourselves). + if (this->pixbuf) { - /* fixme: We are slightly violating spec here (Lauris) */ + if (!this->x._set) { + this->x.unit = SVGLength::PX; + this->x.computed = 0; + } + + if (!this->y._set) { + this->y.unit = SVGLength::PX; + this->y.computed = 0; + } + if (!this->width._set) { + this->width.unit = SVGLength::PX; this->width.computed = this->pixbuf->width(); } if (!this->height._set) { + this->height.unit = SVGLength::PX; this->height.computed = this->pixbuf->height(); } } - this->clipbox = Geom::Rect::from_xywh( - this->x.computed, this->y.computed, - this->width.computed, this->height.computed); + + // Calculate x, y, width, height from parent/initial viewport, see sp-root.cpp + if (this->x.unit == SVGLength::PERCENT) { + this->x.computed = this->x.value * ictx->viewport.width(); + } + + if (this->y.unit == SVGLength::PERCENT) { + this->y.computed = this->y.value * ictx->viewport.height(); + } + + if (this->width.unit == SVGLength::PERCENT) { + this->width.computed = this->width.value * ictx->viewport.width(); + } + + if (this->height.unit == SVGLength::PERCENT) { + this->height.computed = this->height.value * ictx->viewport.height(); + } + + // Image creates a new viewport + ictx->viewport= Geom::Rect::from_xywh( this->x.computed, this->y.computed, + this->width.computed, this->height.computed); + + this->clipbox = ictx->viewport; this->ox = this->x.computed; this->oy = this->y.computed; if (this->pixbuf) { - int pixwidth = this->pixbuf->width(); - int pixheight = this->pixbuf->height(); - - this->sx = this->width.computed / pixwidth; - this->sy = this->height.computed / pixheight; - - // preserveAspectRatio calculate bounds / clipping rectangle -- EAF - if (this->aspect_align != SP_ASPECT_NONE) { - double x, y; - - switch (this->aspect_align) { - case SP_ASPECT_XMIN_YMIN: - x = 0.0; - y = 0.0; - break; - case SP_ASPECT_XMID_YMIN: - x = 0.5; - y = 0.0; - break; - case SP_ASPECT_XMAX_YMIN: - x = 1.0; - y = 0.0; - break; - case SP_ASPECT_XMIN_YMID: - x = 0.0; - y = 0.5; - break; - case SP_ASPECT_XMID_YMID: - x = 0.5; - y = 0.5; - break; - case SP_ASPECT_XMAX_YMID: - x = 1.0; - y = 0.5; - break; - case SP_ASPECT_XMIN_YMAX: - x = 0.0; - y = 1.0; - break; - case SP_ASPECT_XMID_YMAX: - x = 0.5; - y = 1.0; - break; - case SP_ASPECT_XMAX_YMAX: - x = 1.0; - y = 1.0; - break; - default: - x = 0.0; - y = 0.0; - break; - } - if (this->aspect_clip == SP_ASPECT_SLICE) { - double scale = std::max(this->sx, this->sy); - this->sx = scale; - this->sy = scale; - } else { - double scale = std::min(this->sx, this->sy); - this->sx = scale; - this->sy = scale; - } + // Viewbox is either from SVG (not supported) or dimensions of pixbuf (PNG, JPG) + this->viewBox = Geom::Rect::from_xywh(0, 0, this->pixbuf->width(), this->pixbuf->height()); + this->viewBox_set = true; - double vw = pixwidth * this->sx; - double vh = pixheight * this->sy; - this->ox += x * (this->width.computed - vw); - this->oy += y * (this->height.computed - vh); - } + // SPItemCtx rctx = + get_rctx( ictx ); + + this->ox = c2p[4]; + this->oy = c2p[5]; + this->sx = c2p[0]; + this->sy = c2p[3]; } + + // TODO: eliminate ox, oy, sx, sy sp_image_update_canvas_image ((SPImage *) this); } diff --git a/src/sp-image.h b/src/sp-image.h index 3b7208487..50eb731d7 100644 --- a/src/sp-image.h +++ b/src/sp-image.h @@ -18,6 +18,7 @@ #include <glibmm/ustring.h> #include "svg/svg-length.h" #include "sp-shape.h" +#include "viewbox.h" #define SP_IMAGE(obj) (dynamic_cast<SPImage*>((SPObject*)obj)) #define SP_IS_IMAGE(obj) (dynamic_cast<const SPImage*>((SPObject*)obj) != NULL) @@ -25,7 +26,7 @@ #define SP_IMAGE_HREF_MODIFIED_FLAG SP_OBJECT_USER_MODIFIED_FLAG_A namespace Inkscape { class Pixbuf; } -class SPImage : public SPItem { +class SPImage : public SPItem, public SPViewBox { public: SPImage(); virtual ~SPImage(); @@ -39,13 +40,6 @@ public: double sx, sy; double ox, oy; - // Added by EAF - /* preserveAspectRatio */ - unsigned int aspect_align : 4; - unsigned int aspect_clip : 1; - //int trimx, trimy, trimwidth, trimheight; - //double viewx, viewy, viewwidth, viewheight; - SPCurve *curve; // This curve is at the image's boundary for snapping gchar *href; @@ -69,6 +63,10 @@ public: virtual Inkscape::DrawingItem* show(Inkscape::Drawing &drawing, unsigned int key, unsigned int flags); virtual void snappoints(std::vector<Inkscape::SnapCandidatePoint> &p, Inkscape::SnapPreferences const *snapprefs) const; virtual Geom::Affine set_transform(Geom::Affine const &transform); + +#if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2) + void apply_profile(Inkscape::Pixbuf *pixbuf); +#endif // defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2) }; /* Return duplicate of curve or NULL */ diff --git a/src/sp-mesh-array.cpp b/src/sp-mesh-array.cpp index 5a204e8b0..ab14e75d2 100644 --- a/src/sp-mesh-array.cpp +++ b/src/sp-mesh-array.cpp @@ -1925,10 +1925,10 @@ guint SPMeshNodeArray::color_pick( std::vector<guint> icorners, SPItem* item ) { /* Find visible area */ cairo_surface_t *s = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, ibox.width(), ibox.height()); - Inkscape::DrawingContext ct(s, ibox.min()); + Inkscape::DrawingContext dc(s, ibox.min()); /* Render copy and pick color */ - pick_drawing->render(ct, ibox); + pick_drawing->render(dc, ibox); double R = 0, G = 0, B = 0, A = 0; ink_cairo_surface_average_color(s, R, G, B, A); cairo_surface_destroy(s); diff --git a/src/sp-pattern.cpp b/src/sp-pattern.cpp index ad5449f34..425ca9efa 100644 --- a/src/sp-pattern.cpp +++ b/src/sp-pattern.cpp @@ -53,7 +53,7 @@ namespace { bool patternRegistered = SPFactory::instance().registerObject("svg:pattern", createPattern); } -SPPattern::SPPattern() : SPPaintServer() { +SPPattern::SPPattern() : SPPaintServer(), SPViewBox() { this->href = NULL; this->ref = new SPPatternReference(this); @@ -72,8 +72,6 @@ SPPattern::SPPattern() : SPPaintServer() { this->y.unset(); this->width.unset(); this->height.unset(); - - this->viewBox_set = FALSE; } SPPattern::~SPPattern() { @@ -90,6 +88,7 @@ void SPPattern::build(SPDocument* doc, Inkscape::XML::Node* repr) { this->readAttr( "width" ); this->readAttr( "height" ); this->readAttr( "viewBox" ); + this->readAttr( "preserveAspectRatio" ); this->readAttr( "xlink:href" ); /* Register ourselves */ @@ -180,50 +179,16 @@ void SPPattern::set(unsigned int key, const gchar* value) { this->requestModified(SP_OBJECT_MODIFIED_FLAG); break; - case SP_ATTR_VIEWBOX: { - /* fixme: Think (Lauris) */ - double x, y, width, height; - char *eptr; - - if (value) { - eptr = (gchar *) value; - x = g_ascii_strtod (eptr, &eptr); - - while (*eptr && ((*eptr == ',') || (*eptr == ' '))) { - eptr++; - } - - y = g_ascii_strtod (eptr, &eptr); - - while (*eptr && ((*eptr == ',') || (*eptr == ' '))) { - eptr++; - } - - width = g_ascii_strtod (eptr, &eptr); - - while (*eptr && ((*eptr == ',') || (*eptr == ' '))) { - eptr++; - } - - height = g_ascii_strtod (eptr, &eptr); - - while (*eptr && ((*eptr == ',') || (*eptr == ' '))) { - eptr++; - } + case SP_ATTR_VIEWBOX: + set_viewBox( value ); + this->requestModified(SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_VIEWPORT_MODIFIED_FLAG); + break; - if ((width > 0) && (height > 0)) { - this->viewBox = Geom::Rect::from_xywh(x, y, width, height); - this->viewBox_set = TRUE; - } else { - this->viewBox_set = FALSE; - } - } else { - this->viewBox_set = FALSE; - } + case SP_ATTR_PRESERVEASPECTRATIO: + set_preserveAspectRatio( value ); + this->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_VIEWPORT_MODIFIED_FLAG); + break; - this->requestModified(SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_VIEWPORT_MODIFIED_FLAG); - break; - } case SP_ATTR_XLINK_HREF: if ( value && this->href && ( strcmp(value, this->href) == 0 ) ) { /* Href unchanged, do nothing. */ @@ -674,25 +639,25 @@ cairo_pattern_t* SPPattern::pattern_new(cairo_t *base_ct, Geom::OptRect const &b // Create drawing surface with size of pattern tile (in tile space) but with number of pixels // based on required resolution (c). Inkscape::DrawingSurface pattern_surface(pattern_tile, c.ceil()); - Inkscape::DrawingContext ct(pattern_surface); + Inkscape::DrawingContext dc(pattern_surface); pattern_tile *= pattern_surface.drawingTransform(); Geom::IntRect one_tile = pattern_tile.roundOutwards(); // render pattern. if (needs_opacity) { - ct.pushGroup(); // this group is for pattern + opacity + dc.pushGroup(); // this group is for pattern + opacity } // TODO: make sure there are no leaks. Inkscape::UpdateContext ctx; // UpdateContext is structure with only ctm! ctx.ctm = vb2ps * pattern_surface.drawingTransform(); - ct.transform( pattern_surface.drawingTransform().inverse() ); + dc.transform( pattern_surface.drawingTransform().inverse() ); drawing.update(Geom::IntRect::infinite(), ctx); // Render drawing to pattern_surface via drawing context, this calls root->render // which is really DrawingItem->render(). - drawing.render(ct, one_tile); + drawing.render(dc, one_tile); for (SPObject *child = shown->firstChild() ; child != NULL; child = child->getNext() ) { if (SP_IS_ITEM (child)) { SP_ITEM(child)->invoke_hide(dkey); @@ -708,8 +673,8 @@ cairo_pattern_t* SPPattern::pattern_new(cairo_t *base_ct, Geom::OptRect const &b // cairo_surface_write_to_png( pattern_surface.raw(), "sp-pattern.png" ); if (needs_opacity) { - ct.popGroupToSource(); // pop raw pattern - ct.paint(opacity); // apply opacity + dc.popGroupToSource(); // pop raw pattern + dc.paint(opacity); // apply opacity } cairo_pattern_t *cp = cairo_pattern_create_for_surface(pattern_surface.raw()); diff --git a/src/sp-pattern.h b/src/sp-pattern.h index 4e3657ccf..f69ba10b3 100644 --- a/src/sp-pattern.h +++ b/src/sp-pattern.h @@ -25,12 +25,13 @@ class SPPatternReference; #include "svg/svg-length.h" #include "sp-paint-server.h" #include "uri-references.h" +#include "viewbox.h" #include <stddef.h> #include <sigc++/connection.h> -class SPPattern : public SPPaintServer { +class SPPattern : public SPPaintServer, public SPViewBox { public: SPPattern(); virtual ~SPPattern(); @@ -52,9 +53,6 @@ public: SVGLength y; SVGLength width; SVGLength height; - /* VieBox */ - Geom::Rect viewBox; - guint viewBox_set : 1; sigc::connection modified_connection; diff --git a/src/sp-root.cpp b/src/sp-root.cpp index 5466649a2..bc870b116 100644 --- a/src/sp-root.cpp +++ b/src/sp-root.cpp @@ -42,12 +42,9 @@ SPObject *createRoot() bool rootRegistered = SPFactory::instance().registerObject("svg:svg", createRoot); } -SPRoot::SPRoot() : SPGroup() +SPRoot::SPRoot() : SPGroup(), SPViewBox() { - this->aspect_set = 0; - this->aspect_align = 0; this->onload = NULL; - this->aspect_clip = 0; static Inkscape::Version const zero_version(0, 0); @@ -57,15 +54,11 @@ SPRoot::SPRoot() : SPGroup() this->version.inkscape = zero_version; this->original.inkscape = zero_version; - this->x.unset(); - this->y.unset(); + this->x.unset(SVGLength::PERCENT, 0.0, 0.0); // Ignored for root SVG element + this->y.unset(SVGLength::PERCENT, 0.0, 0.0); this->width.unset(SVGLength::PERCENT, 1.0, 1.0); this->height.unset(SVGLength::PERCENT, 1.0, 1.0); - this->viewBox_set = false; - - this->c2p.setIdentity(); - this->defs = NULL; } @@ -129,9 +122,9 @@ void SPRoot::set(unsigned int key, const gchar *value) break; case SP_ATTR_X: - if (!this->x.readAbsolute(value)) { - /* fixme: em, ex, % are probably valid, but require special treatment (Lauris) */ - this->x.unset(); + /* Valid for non-root SVG elements; ex, em not handled correctly. */ + if (!this->x.read(value)) { + this->x.unset(SVGLength::PERCENT, 0.0, 0.0); } /* fixme: I am almost sure these do not require viewport flag (Lauris) */ @@ -139,9 +132,9 @@ void SPRoot::set(unsigned int key, const gchar *value) break; case SP_ATTR_Y: - if (!this->y.readAbsolute(value)) { - /* fixme: em, ex, % are probably valid, but require special treatment (Lauris) */ - this->y.unset(); + /* Valid for non-root SVG elements; ex, em not handled correctly. */ + if (!this->y.read(value)) { + this->y.unset(SVGLength::PERCENT, 0.0, 0.0); } /* fixme: I am almost sure these do not require viewport flag (Lauris) */ @@ -149,153 +142,27 @@ void SPRoot::set(unsigned int key, const gchar *value) break; case SP_ATTR_WIDTH: - if (!this->width.readAbsolute(value) || !(this->width.computed > 0.0)) { - /* fixme: em, ex, % are probably valid, but require special treatment (Lauris) */ + if (!this->width.read(value) || !(this->width.computed > 0.0)) { this->width.unset(SVGLength::PERCENT, 1.0, 1.0); } - this->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_VIEWPORT_MODIFIED_FLAG); break; case SP_ATTR_HEIGHT: - if (!this->height.readAbsolute(value) || !(this->height.computed > 0.0)) { - /* fixme: em, ex, % are probably valid, but require special treatment (Lauris) */ + if (!this->height.read(value) || !(this->height.computed > 0.0)) { this->height.unset(SVGLength::PERCENT, 1.0, 1.0); } - this->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_VIEWPORT_MODIFIED_FLAG); break; case SP_ATTR_VIEWBOX: - if (value) { - double x, y, width, height; - char *eptr; - - /* fixme: We have to take original item affine into account */ - /* fixme: Think (Lauris) */ - eptr = (gchar *) value; - x = g_ascii_strtod(eptr, &eptr); - - while (*eptr && ((*eptr == ',') || (*eptr == ' '))) { - eptr++; - } - - y = g_ascii_strtod(eptr, &eptr); - - while (*eptr && ((*eptr == ',') || (*eptr == ' '))) { - eptr++; - } - - width = g_ascii_strtod(eptr, &eptr); - - while (*eptr && ((*eptr == ',') || (*eptr == ' '))) { - eptr++; - } - - height = g_ascii_strtod(eptr, &eptr); - - while (*eptr && ((*eptr == ',') || (*eptr == ' '))) { - eptr++; - } - - if ((width > 0) && (height > 0)) { - /* Set viewbox */ - this->viewBox = Geom::Rect::from_xywh(x, y, width, height); - this->viewBox_set = TRUE; - } else { - this->viewBox_set = FALSE; - } - } else { - this->viewBox_set = FALSE; - } - + set_viewBox( value ); this->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_VIEWPORT_MODIFIED_FLAG); break; case SP_ATTR_PRESERVEASPECTRATIO: - /* Do setup before, so we can use break to escape */ - this->aspect_set = FALSE; - this->aspect_align = SP_ASPECT_XMID_YMID; - this->aspect_clip = SP_ASPECT_MEET; - + set_preserveAspectRatio( value ); this->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_VIEWPORT_MODIFIED_FLAG); - - if (value) { - int len; - gchar c[256]; - gchar const *p, *e; - unsigned int align, clip; - p = value; - - while (*p && *p == 32) { - p += 1; - } - - if (!*p) { - break; - } - - e = p; - - while (*e && *e != 32) { - e += 1; - } - - len = e - p; - - if (len > 8) { - break; - } - - memcpy(c, value, len); - - c[len] = 0; - - /* Now the actual part */ - if (!strcmp(c, "none")) { - align = SP_ASPECT_NONE; - } else if (!strcmp(c, "xMinYMin")) { - align = SP_ASPECT_XMIN_YMIN; - } else if (!strcmp(c, "xMidYMin")) { - align = SP_ASPECT_XMID_YMIN; - } else if (!strcmp(c, "xMaxYMin")) { - align = SP_ASPECT_XMAX_YMIN; - } else if (!strcmp(c, "xMinYMid")) { - align = SP_ASPECT_XMIN_YMID; - } else if (!strcmp(c, "xMidYMid")) { - align = SP_ASPECT_XMID_YMID; - } else if (!strcmp(c, "xMaxYMid")) { - align = SP_ASPECT_XMAX_YMID; - } else if (!strcmp(c, "xMinYMax")) { - align = SP_ASPECT_XMIN_YMAX; - } else if (!strcmp(c, "xMidYMax")) { - align = SP_ASPECT_XMID_YMAX; - } else if (!strcmp(c, "xMaxYMax")) { - align = SP_ASPECT_XMAX_YMAX; - } else { - break; - } - - clip = SP_ASPECT_MEET; - - while (*e && *e == 32) { - e += 1; - } - - if (*e) { - if (!strcmp(e, "meet")) { - clip = SP_ASPECT_MEET; - } else if (!strcmp(e, "slice")) { - clip = SP_ASPECT_SLICE; - } else { - break; - } - } - - this->aspect_set = TRUE; - this->aspect_align = align; - this->aspect_clip = clip; - } break; case SP_ATTR_ONLOAD: @@ -356,141 +223,75 @@ void SPRoot::update(SPCtx *ctx, guint flags) { SPItemCtx *ictx = (SPItemCtx *) ctx; - /* fixme: This will be invoked too often (Lauris) */ - /* fixme: We should calculate only if parent viewport has changed (Lauris) */ - /* If position is specified as percentage, calculate actual values */ - if (this->x.unit == SVGLength::PERCENT) { - this->x.computed = this->x.value * ictx->viewport.width(); - } - - if (this->y.unit == SVGLength::PERCENT) { - this->y.computed = this->y.value * ictx->viewport.height(); - } - - if (this->width.unit == SVGLength::PERCENT) { - this->width.computed = this->width.value * ictx->viewport.width(); - } - - if (this->height.unit == SVGLength::PERCENT) { - this->height.computed = this->height.value * ictx->viewport.height(); - } - - /* Create copy of item context */ - SPItemCtx rctx = *ictx; - - /* Calculate child to parent transformation */ - this->c2p.setIdentity(); + if( !this->parent ) { - if (this->parent) { /* - * fixme: I am not sure whether setting x and y does or does not - * fixme: translate the content of inner SVG. - * fixme: Still applying translation and setting viewport to width and - * fixme: height seems natural, as this makes the inner svg element - * fixme: self-contained. The spec is vague here. + * This is the root SVG element: + * + * x, y, width, and height apply to positioning the SVG element inside a parent. + * For the root SVG in Inkscape there is no parent, thus special rules apply: + * If width, height not set, width = 100%, height = 100% (as always). + * If width and height are in percent, they are percent of viewBox width/height. + * If width, height, and viewBox are not set... pick "random" width/height. + * x, y are ignored. + * initial viewport = (0 0 width height) */ - this->c2p = Geom::Affine(Geom::Translate(this->x.computed, this->y.computed)); - } - - if (this->viewBox_set) { - double x, y, width, height; - /* Determine actual viewbox in viewport coordinates */ - if (this->aspect_align == SP_ASPECT_NONE) { - x = 0.0; - y = 0.0; - width = this->width.computed; - height = this->height.computed; - } else { - double scalex, scaley, scale; - /* Things are getting interesting */ - scalex = this->width.computed / this->viewBox.width(); - scaley = this->height.computed / this->viewBox.height(); - scale = (this->aspect_clip == SP_ASPECT_MEET) ? MIN(scalex, scaley) : MAX(scalex, scaley); - width = this->viewBox.width() * scale; - height = this->viewBox.height() * scale; - - /* Now place viewbox to requested position */ - /* todo: Use an array lookup to find the 0.0/0.5/1.0 coefficients, - as is done for dialogs/align.cpp. */ - switch (this->aspect_align) { - case SP_ASPECT_XMIN_YMIN: - x = 0.0; - y = 0.0; - break; - - case SP_ASPECT_XMID_YMIN: - x = 0.5 * (this->width.computed - width); - y = 0.0; - break; - - case SP_ASPECT_XMAX_YMIN: - x = 1.0 * (this->width.computed - width); - y = 0.0; - break; - - case SP_ASPECT_XMIN_YMID: - x = 0.0; - y = 0.5 * (this->height.computed - height); - break; - - case SP_ASPECT_XMID_YMID: - x = 0.5 * (this->width.computed - width); - y = 0.5 * (this->height.computed - height); - break; + if( this->viewBox_set ) { - case SP_ASPECT_XMAX_YMID: - x = 1.0 * (this->width.computed - width); - y = 0.5 * (this->height.computed - height); - break; + if( this->width._set ) { + // Check if this is necessary + if (this->width.unit == SVGLength::PERCENT) { + this->width.computed = this->width.value * this->viewBox.width(); + } + } else { + this->width.set( SVGLength::PX, this->viewBox.width(), this->viewBox.width() ); + } - case SP_ASPECT_XMIN_YMAX: - x = 0.0; - y = 1.0 * (this->height.computed - height); - break; + if( this->height._set ) { + if (this->height.unit == SVGLength::PERCENT) { + this->height.computed = this->height.value * this->viewBox.height(); + } + } else { + this->height.set(SVGLength::PX, this->viewBox.height(), this->viewBox.height() ); + } - case SP_ASPECT_XMID_YMAX: - x = 0.5 * (this->width.computed - width); - y = 1.0 * (this->height.computed - height); - break; + } else { - case SP_ASPECT_XMAX_YMAX: - x = 1.0 * (this->width.computed - width); - y = 1.0 * (this->height.computed - height); - break; + if( !this->width._set ) { + this->width.set( SVGLength::PX, 100, 100 ); // Random default + } - default: - x = 0.0; - y = 0.0; - break; + if( !this->height._set ) { + this->height.set( SVGLength::PX, 100, 100 ); // Random default } } - /* Compose additional transformation from scale and position */ - Geom::Scale const viewBox_length(this->viewBox.dimensions()); - Geom::Scale const new_length(width, height); + // Ignore x, y values for root element + this->x.unset(SVGLength::PERCENT, 0.0, 0.0); + this->y.unset(SVGLength::PERCENT, 0.0, 0.0); + } - /* Append viewbox transformation */ - /* TODO: The below looks suspicious to me (pjrm): I wonder whether the RHS - expression should have c2p at the beginning rather than at the end. Test it. */ - this->c2p = Geom::Translate(-this->viewBox.min()) * (new_length * viewBox_length.inverse()) * Geom::Translate(x, y) * this->c2p; + // Calculate x, y, width, height from parent/initial viewport + if (this->x.unit == SVGLength::PERCENT) { + this->x.computed = this->x.value * ictx->viewport.width(); } - rctx.i2doc = this->c2p * rctx.i2doc; + if (this->y.unit == SVGLength::PERCENT) { + this->y.computed = this->y.value * ictx->viewport.height(); + } - /* Initialize child viewport */ - if (this->viewBox_set) { - rctx.viewport = this->viewBox; - } else { - /* fixme: I wonder whether this logic is correct (Lauris) */ - Geom::Point minp(0, 0); - if (this->parent) { - minp = Geom::Point(this->x.computed, this->y.computed); - } + if (this->width.unit == SVGLength::PERCENT) { + this->width.computed = this->width.value * ictx->viewport.width(); + } - rctx.viewport = Geom::Rect::from_xywh(minp[Geom::X], minp[Geom::Y], this->width.computed, this->height.computed); + if (this->height.unit == SVGLength::PERCENT) { + this->height.computed = this->height.value * ictx->viewport.height(); } - rctx.i2vp = Geom::identity(); + // Calculate new viewport + ictx->viewport = Geom::Rect::from_xywh( this->x.computed, this->y.computed, + this->width.computed, this->height.computed ); + SPItemCtx rctx = get_rctx( ictx ); /* And invoke parent method */ SPGroup::update((SPCtx *) &rctx, flags); diff --git a/src/sp-root.h b/src/sp-root.h index 2931391ff..1c9faed9b 100644 --- a/src/sp-root.h +++ b/src/sp-root.h @@ -18,6 +18,7 @@ #include "svg/svg-length.h" #include "enums.h" #include "sp-item-group.h" +#include "viewbox.h" #define SP_ROOT(obj) (dynamic_cast<SPRoot*>((SPObject*)obj)) #define SP_IS_ROOT(obj) (dynamic_cast<const SPRoot*>((SPObject*)obj) != NULL) @@ -25,7 +26,7 @@ class SPDefs; /** \<svg\> element */ -class SPRoot : public SPGroup { +class SPRoot : public SPGroup, public SPViewBox { public: SPRoot(); virtual ~SPRoot(); @@ -40,18 +41,6 @@ public: SVGLength width; SVGLength height; - /* viewBox; */ - bool viewBox_set; - Geom::Rect viewBox; - - /* preserveAspectRatio */ - unsigned int aspect_set : 1; - unsigned int aspect_align : 4; - unsigned int aspect_clip : 1; - - /** Child to parent additional transform. */ - Geom::Affine c2p; - gchar *onload; /** diff --git a/src/sp-symbol.cpp b/src/sp-symbol.cpp index 8ffc2ab2c..817411a32 100644 --- a/src/sp-symbol.cpp +++ b/src/sp-symbol.cpp @@ -36,13 +36,7 @@ namespace { bool symbolRegistered = SPFactory::instance().registerObject("svg:symbol", createSymbol); } -SPSymbol::SPSymbol() : SPGroup() { - this->aspect_align = 0; - this->aspect_clip = 0; - this->aspect_set = 0; - - this->viewBox_set = FALSE; - this->c2p = Geom::identity(); +SPSymbol::SPSymbol() : SPGroup(), SPViewBox() { } SPSymbol::~SPSymbol() { @@ -62,134 +56,15 @@ void SPSymbol::release() { void SPSymbol::set(unsigned int key, const gchar* value) { switch (key) { case SP_ATTR_VIEWBOX: - if (value) { - double x, y, width, height; - char *eptr; - - /* fixme: We have to take original item affine into account */ - /* fixme: Think (Lauris) */ - eptr = (gchar *) value; - x = g_ascii_strtod (eptr, &eptr); - - while (*eptr && ((*eptr == ',') || (*eptr == ' '))) { - eptr++; - } - - y = g_ascii_strtod (eptr, &eptr); - - while (*eptr && ((*eptr == ',') || (*eptr == ' '))) { - eptr++; - } - - width = g_ascii_strtod (eptr, &eptr); - - while (*eptr && ((*eptr == ',') || (*eptr == ' '))) { - eptr++; - } - - height = g_ascii_strtod (eptr, &eptr); - - while (*eptr && ((*eptr == ',') || (*eptr == ' '))) { - eptr++; - } - - if ((width > 0) && (height > 0)) { - /* Set viewbox */ - this->viewBox = Geom::Rect::from_xywh(x, y, width, height); - this->viewBox_set = TRUE; - } else { - this->viewBox_set = FALSE; - } - } else { - this->viewBox_set = FALSE; - } - + set_viewBox( value ); + std::cout << "Symbol: ViewBox: " << viewBox << std::endl; this->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_VIEWPORT_MODIFIED_FLAG); break; case SP_ATTR_PRESERVEASPECTRATIO: - /* Do setup before, so we can use break to escape */ - this->aspect_set = FALSE; - this->aspect_align = SP_ASPECT_NONE; - this->aspect_clip = SP_ASPECT_MEET; + set_preserveAspectRatio( value ); + std::cout << "Symbol: Preserve aspect ratio: " << aspect_align << ", " << aspect_clip << std::endl; this->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_VIEWPORT_MODIFIED_FLAG); - - if (value) { - int len; - gchar c[256]; - const gchar *p, *e; - unsigned int align, clip; - p = value; - - while (*p && *p == 32) { - p += 1; - } - - if (!*p) { - break; - } - - e = p; - - while (*e && *e != 32) { - e += 1; - } - - len = e - p; - - if (len > 8) { - break; - } - - memcpy (c, value, len); - - c[len] = 0; - - /* Now the actual part */ - if (!strcmp (c, "none")) { - align = SP_ASPECT_NONE; - } else if (!strcmp (c, "xMinYMin")) { - align = SP_ASPECT_XMIN_YMIN; - } else if (!strcmp (c, "xMidYMin")) { - align = SP_ASPECT_XMID_YMIN; - } else if (!strcmp (c, "xMaxYMin")) { - align = SP_ASPECT_XMAX_YMIN; - } else if (!strcmp (c, "xMinYMid")) { - align = SP_ASPECT_XMIN_YMID; - } else if (!strcmp (c, "xMidYMid")) { - align = SP_ASPECT_XMID_YMID; - } else if (!strcmp (c, "xMaxYMid")) { - align = SP_ASPECT_XMAX_YMID; - } else if (!strcmp (c, "xMinYMax")) { - align = SP_ASPECT_XMIN_YMAX; - } else if (!strcmp (c, "xMidYMax")) { - align = SP_ASPECT_XMID_YMAX; - } else if (!strcmp (c, "xMaxYMax")) { - align = SP_ASPECT_XMAX_YMAX; - } else { - break; - } - - clip = SP_ASPECT_MEET; - - while (*e && *e == 32) { - e += 1; - } - - if (*e) { - if (!strcmp (e, "meet")) { - clip = SP_ASPECT_MEET; - } else if (!strcmp (e, "slice")) { - clip = SP_ASPECT_SLICE; - } else { - break; - } - } - - this->aspect_set = TRUE; - this->aspect_align = align; - this->aspect_clip = clip; - } break; default: @@ -204,105 +79,10 @@ void SPSymbol::child_added(Inkscape::XML::Node *child, Inkscape::XML::Node *ref) void SPSymbol::update(SPCtx *ctx, guint flags) { - SPItemCtx *ictx = (SPItemCtx *) ctx; - SPItemCtx rctx; - if (this->cloned) { - /* Cloned <symbol> is actually renderable */ - - /* fixme: We have to set up clip here too */ - - /* Create copy of item context */ - rctx = *ictx; - - /* Calculate child to parent transformation */ - /* Apply parent <use> translation (set up as vewport) */ - this->c2p = Geom::Translate(rctx.viewport.min()); - - if (this->viewBox_set) { - double x, y, width, height; - - /* Determine actual viewbox in viewport coordinates */ - if (this->aspect_align == SP_ASPECT_NONE) { - x = 0.0; - y = 0.0; - width = rctx.viewport.width(); - height = rctx.viewport.height(); - } else { - double scalex, scaley, scale; - /* Things are getting interesting */ - scalex = rctx.viewport.width() / this->viewBox.width(); - scaley = rctx.viewport.height() / this->viewBox.height(); - scale = (this->aspect_clip == SP_ASPECT_MEET) ? MIN (scalex, scaley) : MAX (scalex, scaley); - width = this->viewBox.width() * scale; - height = this->viewBox.height() * scale; - - /* Now place viewbox to requested position */ - switch (this->aspect_align) { - case SP_ASPECT_XMIN_YMIN: - x = 0.0; - y = 0.0; - break; - case SP_ASPECT_XMID_YMIN: - x = 0.5 * (rctx.viewport.width() - width); - y = 0.0; - break; - case SP_ASPECT_XMAX_YMIN: - x = 1.0 * (rctx.viewport.width() - width); - y = 0.0; - break; - case SP_ASPECT_XMIN_YMID: - x = 0.0; - y = 0.5 * (rctx.viewport.height() - height); - break; - case SP_ASPECT_XMID_YMID: - x = 0.5 * (rctx.viewport.width() - width); - y = 0.5 * (rctx.viewport.height() - height); - break; - case SP_ASPECT_XMAX_YMID: - x = 1.0 * (rctx.viewport.width() - width); - y = 0.5 * (rctx.viewport.height() - height); - break; - case SP_ASPECT_XMIN_YMAX: - x = 0.0; - y = 1.0 * (rctx.viewport.height() - height); - break; - case SP_ASPECT_XMID_YMAX: - x = 0.5 * (rctx.viewport.width() - width); - y = 1.0 * (rctx.viewport.height() - height); - break; - case SP_ASPECT_XMAX_YMAX: - x = 1.0 * (rctx.viewport.width() - width); - y = 1.0 * (rctx.viewport.height() - height); - break; - default: - x = 0.0; - y = 0.0; - break; - } - } - - /* Compose additional transformation from scale and position */ - Geom::Affine q; - q[0] = width / this->viewBox.width(); - q[1] = 0.0; - q[2] = 0.0; - q[3] = height / this->viewBox.height(); - q[4] = -this->viewBox.left() * q[0] + x; - q[5] = -this->viewBox.top() * q[3] + y; - - /* Append viewbox transformation */ - this->c2p = q * this->c2p; - } - rctx.i2doc = this->c2p * (Geom::Affine)rctx.i2doc; - - /* If viewBox is set initialize child viewport */ - /* Otherwise <use> has set it up already */ - if (this->viewBox_set) { - rctx.viewport = this->viewBox; - rctx.i2vp = Geom::identity(); - } + SPItemCtx *ictx = (SPItemCtx *) ctx; + SPItemCtx rctx = get_rctx( ictx ); // And invoke parent method SPGroup::update((SPCtx *) &rctx, flags); diff --git a/src/sp-symbol.h b/src/sp-symbol.h index 7a43ed658..d1e62e923 100644 --- a/src/sp-symbol.h +++ b/src/sp-symbol.h @@ -25,24 +25,13 @@ #include "svg/svg-length.h" #include "enums.h" #include "sp-item-group.h" +#include "viewbox.h" -class SPSymbol : public SPGroup { +class SPSymbol : public SPGroup, public SPViewBox { public: SPSymbol(); virtual ~SPSymbol(); - /* viewBox; */ - unsigned int viewBox_set : 1; - Geom::Rect viewBox; - - /* preserveAspectRatio */ - unsigned int aspect_set : 1; - unsigned int aspect_align : 4; - unsigned int aspect_clip : 1; - - /* Child to parent additional transform */ - Geom::Affine c2p; - virtual void build(SPDocument *document, Inkscape::XML::Node *repr); virtual void release(); virtual void set(unsigned int key, gchar const* value); diff --git a/src/ui/cache/svg_preview_cache.cpp b/src/ui/cache/svg_preview_cache.cpp index a09489f6d..f1d6304cb 100644 --- a/src/ui/cache/svg_preview_cache.cpp +++ b/src/ui/cache/svg_preview_cache.cpp @@ -56,9 +56,9 @@ GdkPixbuf* render_pixbuf(Inkscape::Drawing &drawing, double scale_factor, Geom:: /* Render */ cairo_surface_t *s = cairo_image_surface_create( CAIRO_FORMAT_ARGB32, psize, psize); - Inkscape::DrawingContext ct(s, area.min()); + Inkscape::DrawingContext dc(s, area.min()); - drawing.render(ct, area, Inkscape::DrawingItem::RENDER_BYPASS_CACHE); + drawing.render(dc, area, Inkscape::DrawingItem::RENDER_BYPASS_CACHE); cairo_surface_flush(s); GdkPixbuf* pixbuf = ink_pixbuf_create_from_cairo_surface(s); diff --git a/src/ui/dialog/clonetiler.cpp b/src/ui/dialog/clonetiler.cpp index 87c399339..fb131d8da 100644 --- a/src/ui/dialog/clonetiler.cpp +++ b/src/ui/dialog/clonetiler.cpp @@ -2063,9 +2063,9 @@ guint32 CloneTiler::clonetiler_trace_pick(Geom::Rect box) /* Find visible area */ cairo_surface_t *s = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, ibox.width(), ibox.height()); - Inkscape::DrawingContext ct(s, ibox.min()); + Inkscape::DrawingContext dc(s, ibox.min()); /* Render */ - trace_drawing->render(ct, ibox); + trace_drawing->render(dc, ibox); double R = 0, G = 0, B = 0, A = 0; ink_cairo_surface_average_color(s, R, G, B, A); cairo_surface_destroy(s); diff --git a/src/ui/tools/flood-tool.cpp b/src/ui/tools/flood-tool.cpp index 0b72bc9f2..4e29b8856 100644 --- a/src/ui/tools/flood-tool.cpp +++ b/src/ui/tools/flood-tool.cpp @@ -794,7 +794,7 @@ static void sp_flood_do_flood_fill(ToolBase *event_context, GdkEvent *event, boo cairo_surface_t *s = cairo_image_surface_create_for_data( px, CAIRO_FORMAT_ARGB32, width, height, stride); - Inkscape::DrawingContext ct(s, Geom::Point(0,0)); + Inkscape::DrawingContext dc(s, Geom::Point(0,0)); // cairo_translate not necessary here - surface origin is at 0,0 SPNamedView *nv = sp_desktop_namedview(desktop); @@ -802,12 +802,12 @@ static void sp_flood_do_flood_fill(ToolBase *event_context, GdkEvent *event, boo // bgcolor is 0xrrggbbaa, we need 0xaarrggbb dtc = (bgcolor >> 8) | (bgcolor << 24); - ct.setSource(bgcolor); - ct.setOperator(CAIRO_OPERATOR_SOURCE); - ct.paint(); - ct.setOperator(CAIRO_OPERATOR_OVER); + dc.setSource(bgcolor); + dc.setOperator(CAIRO_OPERATOR_SOURCE); + dc.paint(); + dc.setOperator(CAIRO_OPERATOR_OVER); - drawing.render(ct, final_bbox); + drawing.render(dc, final_bbox); //cairo_surface_write_to_png( s, "cairo.png" ); diff --git a/src/ui/tools/spray-tool.cpp b/src/ui/tools/spray-tool.cpp index 91c606e8e..4ea482461 100644 --- a/src/ui/tools/spray-tool.cpp +++ b/src/ui/tools/spray-tool.cpp @@ -453,7 +453,7 @@ static bool sp_spray_recursive(SPDesktop *desktop, Geom::OptRect a = parent_item->documentVisualBounds(); if (a) { - if (i == 2) { + if (i == 1) { Inkscape::XML::Node *copy1 = old_repr->duplicate(xml_doc); parent->appendChild(copy1); SPObject *new_obj1 = doc->getObjectByRepr(copy1); diff --git a/src/uri-references.cpp b/src/uri-references.cpp index abe16ec9d..ea8078b28 100644 --- a/src/uri-references.cpp +++ b/src/uri-references.cpp @@ -58,7 +58,7 @@ void URIReference::attach(const URI &uri) throw(BadURIException) // The path contains references to seperate document files to load. if(document && uri.getPath()) { - std::string base = std::string(document->getBase()); + std::string base = document->getBase() ? document->getBase() : ""; std::string path = uri.getFullPath(base); if(!path.empty()) document = document->createChildDoc(path); @@ -184,3 +184,14 @@ sp_uri_reference_resolve (SPDocument *document, const gchar *uri) return ref; } + +/* + Local Variables: + mode:c++ + c-file-style:"stroustrup" + c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +)) + indent-tabs-mode:nil + fill-column:99 + End: +*/ +// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 : diff --git a/src/viewbox.cpp b/src/viewbox.cpp new file mode 100644 index 000000000..2314cbf6a --- /dev/null +++ b/src/viewbox.cpp @@ -0,0 +1,277 @@ +/* + * viewBox helper class, common code used by root, symbol, marker, pattern, image, view + * + * Authors: + * Lauris Kaplinski <lauris@kaplinski.com> (code extracted from symbol.cpp) + * Tavmjong Bah <tavmjong@free.fr> + * + * Copyright (C) 2013 Tavmjong Bah, authors + * + * Released under GNU GPL, read the file 'COPYING' for more information + * + */ + +#include <2geom/transforms.h> + +#include "viewbox.h" +#include "attributes.h" +#include "enums.h" +#include "sp-item.h" + +SPViewBox::SPViewBox() { + + this->viewBox_set = FALSE; + + this->aspect_set = FALSE; + this->aspect_align = SP_ASPECT_XMID_YMID; // Default per spec; + this->aspect_clip = SP_ASPECT_MEET; + + this->c2p = Geom::identity(); +} + +SPViewBox::~SPViewBox() { +} + +void SPViewBox::set_viewBox(const gchar* value) { + + if (value) { + double x, y, width, height; + char *eptr; + + eptr = (gchar *) value; + x = g_ascii_strtod (eptr, &eptr); + + while (*eptr && ((*eptr == ',') || (*eptr == ' '))) { + eptr++; + } + + y = g_ascii_strtod (eptr, &eptr); + + while (*eptr && ((*eptr == ',') || (*eptr == ' '))) { + eptr++; + } + + width = g_ascii_strtod (eptr, &eptr); + + while (*eptr && ((*eptr == ',') || (*eptr == ' '))) { + eptr++; + } + + height = g_ascii_strtod (eptr, &eptr); + + while (*eptr && ((*eptr == ',') || (*eptr == ' '))) { + eptr++; + } + + if ((width > 0) && (height > 0)) { + /* Set viewbox */ + this->viewBox = Geom::Rect::from_xywh(x, y, width, height); + this->viewBox_set = TRUE; + } else { + this->viewBox_set = FALSE; + } + } else { + this->viewBox_set = FALSE; + } + + // The C++ way? + // std::string sv( value ); + // std::replace( sv.begin(), sv.end(), ',', ' '); + // std::stringstream ss( sv ); + // double x, y, width, height; + // ss >> x >> y >> width >> height; +} + +void SPViewBox::set_preserveAspectRatio(const gchar* value) { + + /* Do setup before, so we can use break to escape */ + this->aspect_set = FALSE; + this->aspect_align = SP_ASPECT_XMID_YMID; // Default per spec + this->aspect_clip = SP_ASPECT_MEET; + + if (value) { + int len; + gchar c[256]; + const gchar *p, *e; + unsigned int align, clip; + p = value; + + while (*p && *p == 32) { + p += 1; + } + + if (!*p) { + return; + } + + e = p; + + while (*e && *e != 32) { + e += 1; + } + + len = e - p; + + if (len > 8) { + return; + } + + memcpy (c, value, len); + + c[len] = 0; + + /* Now the actual part */ + if (!strcmp (c, "none")) { + align = SP_ASPECT_NONE; + } else if (!strcmp (c, "xMinYMin")) { + align = SP_ASPECT_XMIN_YMIN; + } else if (!strcmp (c, "xMidYMin")) { + align = SP_ASPECT_XMID_YMIN; + } else if (!strcmp (c, "xMaxYMin")) { + align = SP_ASPECT_XMAX_YMIN; + } else if (!strcmp (c, "xMinYMid")) { + align = SP_ASPECT_XMIN_YMID; + } else if (!strcmp (c, "xMidYMid")) { + align = SP_ASPECT_XMID_YMID; + } else if (!strcmp (c, "xMaxYMid")) { + align = SP_ASPECT_XMAX_YMID; + } else if (!strcmp (c, "xMinYMax")) { + align = SP_ASPECT_XMIN_YMAX; + } else if (!strcmp (c, "xMidYMax")) { + align = SP_ASPECT_XMID_YMAX; + } else if (!strcmp (c, "xMaxYMax")) { + align = SP_ASPECT_XMAX_YMAX; + } else { + return; + } + + clip = SP_ASPECT_MEET; + + while (*e && *e == 32) { + e += 1; + } + + if (*e) { + if (!strcmp (e, "meet")) { + clip = SP_ASPECT_MEET; + } else if (!strcmp (e, "slice")) { + clip = SP_ASPECT_SLICE; + } else { + return; + } + } + + this->aspect_set = TRUE; + this->aspect_align = align; + this->aspect_clip = clip; + } +} + +// Apply scaling from viewbox +void SPViewBox::apply_viewbox(const Geom::Rect& in) { + + /* Determine actual viewbox in viewport coordinates */ + double x = 0.0; + double y = 0.0; + double width = in.width(); + double height = in.height(); + // std::cout << " width: " << width << " height: " << height << std::endl; + + if (this->aspect_align != SP_ASPECT_NONE) { + double scalex, scaley, scale; + /* Things are getting interesting */ + scalex = in.width() / this->viewBox.width(); + scaley = in.height() / this->viewBox.height(); + scale = (this->aspect_clip == SP_ASPECT_MEET) ? MIN (scalex, scaley) : MAX (scalex, scaley); + width = this->viewBox.width() * scale; + height = this->viewBox.height() * scale; + + /* Now place viewbox to requested position */ + switch (this->aspect_align) { + case SP_ASPECT_XMIN_YMIN: + break; + case SP_ASPECT_XMID_YMIN: + x = 0.5 * (in.width() - width); + break; + case SP_ASPECT_XMAX_YMIN: + x = 1.0 * (in.width() - width); + break; + case SP_ASPECT_XMIN_YMID: + y = 0.5 * (in.height() - height); + break; + case SP_ASPECT_XMID_YMID: + x = 0.5 * (in.width() - width); + y = 0.5 * (in.height() - height); + break; + case SP_ASPECT_XMAX_YMID: + x = 1.0 * (in.width() - width); + y = 0.5 * (in.height() - height); + break; + case SP_ASPECT_XMIN_YMAX: + y = 1.0 * (in.height() - height); + break; + case SP_ASPECT_XMID_YMAX: + x = 0.5 * (in.width() - width); + y = 1.0 * (in.height() - height); + break; + case SP_ASPECT_XMAX_YMAX: + x = 1.0 * (in.width() - width); + y = 1.0 * (in.height() - height); + break; + default: + break; + } + } + + /* Viewbox transform from scale and position */ + Geom::Affine q; + q[0] = width / this->viewBox.width(); + q[1] = 0.0; + q[2] = 0.0; + q[3] = height / this->viewBox.height(); + q[4] = -this->viewBox.left() * q[0] + x; + q[5] = -this->viewBox.top() * q[3] + y; + + // std::cout << " q\n" << q << std::endl; + + /* Append viewbox transformation */ + this->c2p = q * this->c2p; +} + +SPItemCtx SPViewBox::get_rctx(const SPItemCtx* ictx) { + + /* Create copy of item context */ + SPItemCtx rctx = *ictx; + + /* Calculate child to parent transformation */ + /* Apply parent translation (set up as viewport) */ + this->c2p = Geom::Translate(rctx.viewport.min()); + + if (this->viewBox_set) { + // Adjusts c2p for viewbox + apply_viewbox( rctx.viewport ); + } + + rctx.i2doc = this->c2p * rctx.i2doc; + + /* If viewBox is set initialize child viewport */ + /* Otherwise it is already correct */ + if (this->viewBox_set) { + rctx.viewport = this->viewBox; + rctx.i2vp = Geom::identity(); + } + + return rctx; +} + +/* + Local Variables: + mode:c++ + c-file-style:"stroustrup" + c-basic-offset:2 + c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +)) + indent-tabs-mode:nil + fill-column:99 + End: +*/ +// vim: filetype=cpp:expandtab:shiftwidth=2:tabstop=8:softtabstop=2:fileencoding=utf-8:textwidth=99 : diff --git a/src/viewbox.h b/src/viewbox.h new file mode 100644 index 000000000..24356ed17 --- /dev/null +++ b/src/viewbox.h @@ -0,0 +1,66 @@ +#ifndef __SP_VIEWBOX_H__ +#define __SP_VIEWBOX_H__ + +/* + * viewBox helper class, common code used by root, symbol, marker, pattern, image, view + * + * Authors: + * Lauris Kaplinski <lauris@kaplinski.com> (code extracted from sp-symbol.h) + * Tavmjong Bah + * + * Copyright (C) 2013 Tavmjong Bah, authors + * + * Released under GNU GPL, read the file 'COPYING' for more information + * + */ + +#include <2geom/rect.h> +#include <glib.h> + +namespace Geom { +class Rect; +} +class SPItemCtx; + +class SPViewBox { + + public: + + SPViewBox(); + ~SPViewBox(); + + /* viewBox; */ + unsigned int viewBox_set : 1; + Geom::Rect viewBox; // Could use optrect + + /* preserveAspectRatio */ + unsigned int aspect_set : 1; + unsigned int aspect_align : 4; + unsigned int aspect_clip : 1; + + /* Child to parent additional transform */ + Geom::Affine c2p; + + void set_viewBox(const gchar* value); + void set_preserveAspectRatio(const gchar* value); + + /* Adjusts c2p for viewbox */ + void apply_viewbox(const Geom::Rect& in); + + SPItemCtx get_rctx( const SPItemCtx* ictx); + +}; + +#endif + +/* + Local Variables: + mode:c++ + c-file-style:"stroustrup" + c-basic-offset:2 + c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +)) + indent-tabs-mode:nil + fill-column:99 + End: +*/ +// vim: filetype=cpp:expandtab:shiftwidth=2:tabstop=8:softtabstop=2:fileencoding=utf-8:textwidth=99 : diff --git a/src/widgets/icon.cpp b/src/widgets/icon.cpp index a059c100c..a96f47124 100644 --- a/src/widgets/icon.cpp +++ b/src/widgets/icon.cpp @@ -1191,9 +1191,9 @@ sp_icon_doc_icon( SPDocument *doc, Inkscape::Drawing &drawing, /* Render */ cairo_surface_t *s = cairo_image_surface_create_for_data(px, CAIRO_FORMAT_ARGB32, psize, psize, stride); - Inkscape::DrawingContext ct(s, ua.min()); + Inkscape::DrawingContext dc(s, ua.min()); - drawing.render(ct, ua); + drawing.render(dc, ua); cairo_surface_destroy(s); // convert to GdkPixbuf format |
