Commit 39673126 authored by Boudewijn Rempt's avatar Boudewijn Rempt

Merge branch 'master' into video-export-rebased

parents 25c03b42 d0cb5916
......@@ -48,7 +48,7 @@ else()
URL_MD5 8fdec6d657bc370bd3183d8fe8e9c47a
PATCH_COMMAND ${PATCH_COMMAND} -p1 -i ${CMAKE_CURRENT_SOURCE_DIR}/qt-no-motion-compression.diff
INSTALL_DIR ${EXTPREFIX_qt}
CONFIGURE_COMMAND <SOURCE_DIR>/configure -prefix ${EXTPREFIX_qt} -opensource -confirm-license -nomake examples -no-sql-sqlite -no-openssl -no-qml-debug -no-mtdev -no-journald -no-syslog -no-nis -no-cups -no-tslib -no-directfb -no-linuxfb -no-libproxy -no-pch -qt-zlib -qt-pcre -qt-libpng -qt-libjpeg -qt-harfbuzz -qt-freetype -qt-xcb -qt-xkbcommon-x11 -optimized-qmake -skip qt3d -skip qtactiveqt -skip qtcanvas3d -skip qtconnectivity -skip qtenginio -skip qtgraphicaleffects -skip qtlocation -skip qtmultimedia -skip qtwayland -skip qtwebchannel -skip qtwebengine -skip qtwebsockets -skip qtwebview
CONFIGURE_COMMAND <SOURCE_DIR>/configure -prefix ${EXTPREFIX_qt} -opensource -confirm-license -nomake examples -no-sql-sqlite -no-openssl -no-qml-debug -no-mtdev -no-journald -no-syslog -no-nis -no-cups -no-tslib -no-directfb -no-linuxfb -no-libproxy -no-pch -qt-zlib -qt-pcre -qt-libpng -qt-libjpeg -qt-harfbuzz -qt-freetype -qt-xcb -qt-xkbcommon-x11 -optimized-qmake -skip qt3d -skip qtactiveqt -skip qtcanvas3d -skip qtconnectivity -skip qtenginio -skip qtgraphicaleffects -skip qtlocation -skip qtmultimedia -skip qtwayland -skip qtwebchannel -skip qtwebengine -skip qtwebsockets -skip qtwebview -skip qtandroidextras -skip qtserialport
BUILD_COMMAND make
INSTALL_COMMAND make install
......
......@@ -83,12 +83,12 @@ endif()
# define common versions of Krita applications, used to generate kritaversion.h
# update these version for every release:
set(KRITA_VERSION_STRING "3.0.1 Alpha")
set(KRITA_VERSION_STRING "3.0.1 Beta")
set(KRITA_STABLE_VERSION_MAJOR 3) # 3 for 3.x, 4 for 4.x, etc.
set(KRITA_STABLE_VERSION_MINOR 0) # 0 for 3.0, 1 for 3.1, etc.
set(KRITA_VERSION_RELEASE 89) # 89 for Alpha, increase for next test releases, set 0 for first Stable, etc.
set(KRITA_ALPHA 1) # uncomment only for Alpha
#set(KRITA_BETA 1) # uncomment only for Beta
set(KRITA_VERSION_RELEASE 90) # 89 for Alpha, increase for next test releases, set 0 for first Stable, etc.
#set(KRITA_ALPHA 1) # uncomment only for Alpha
set(KRITA_BETA 1) # uncomment only for Beta
#set(KRITA_RC 1) # uncomment only for RC
set(KRITA_YEAR 2016) # update every year
......@@ -309,7 +309,6 @@ else()
endif()
add_definitions(
-DTRANSLATION_DOMAIN=\"krita\"
-DQT_USE_QSTRINGBUILDER
-DQT_STRICT_ITERATORS
-DQT_NO_SIGNALS_SLOTS_KEYWORDS
......@@ -425,9 +424,6 @@ macro_log_feature(TIFF_FOUND "tiff" "TIFF Library and Utilities" "http://www.rem
macro_optional_find_package(JPEG)
macro_log_feature(JPEG_FOUND "jpeg" "Free library for JPEG image compression. Note: libjpeg8 is NOT supported." "http://www.libjpeg-turbo.org" FALSE "" "Required by the Krita JPEG filter")
macro_optional_find_package(OpenJPEG)
macro_log_feature(OPENJPEG_FOUND "openjpeg" "Free library for JPEG 2000 image compression" "http://www.openjpeg.org" FALSE "" "Required by the Krita JPEG 2000 filter")
set(LIBRAW_MIN_VERSION "0.16")
macro_optional_find_package(LibRaw ${LIBRAW_MIN_VERSION})
macro_log_feature(LIBRAW_FOUND "LibRaw" "Library to decode RAW images" "http://www.libraw.org" FALSE "" "Required to build the raw import plugin")
......@@ -660,6 +656,12 @@ add_subdirectory(plugins)
add_subdirectory( benchmarks )
add_definitions(-DTRANSLATION_DOMAIN=\"krita\")
if (IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/po")
ki18n_install(po)
endif()
macro_display_feature_log()
calligra_product_deps_report("product_deps")
......@@ -671,3 +673,5 @@ configure_file(config-ocio.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config-ocio.h )
check_function_exists(powf HAVE_POWF)
configure_file(config-powf.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config-powf.h)
......@@ -53,7 +53,6 @@ Krita depends on:
* libraw
* opencolorio
* openexr
* openjpeg
* png
* poppler-qt5
* pthreads
......
......@@ -52,15 +52,16 @@ version=3
4={2;1;[1000000];0;0;0}
[Zoom Canvas]
0={0;4;[];0;0;1}
1={0;2;[1000021,20];1;0;0}
10={1;2;[1000021,1000023,20];1;0;0}
11={6;1;[33];0;0;0}
2={0;2;[1000021];4;0;0}
3={2;3;[];0;1;0}
0={2;1;[2b];0;0;0}
1={4;1;[31];0;0;0}
10={5;1;[32];0;0;0}
11={0;4;[];0;0;1}
12={8;2;[1000021,1000023];4;0;0}
2={3;1;[2d];0;0;0}
3={2;1;[3d];0;0;0}
4={3;3;[];0;2;0}
5={2;1;[3d];0;0;0}
6={3;1;[2d];0;0;0}
7={4;1;[31];0;0;0}
8={2;1;[2b];0;0;0}
9={5;1;[32];0;0;0}
5={2;3;[];0;1;0}
6={7;2;[1000021];4;0;0}
7={7;2;[1000021,20];1;0;0}
8={6;1;[33];0;0;0}
9={8;2;[1000021,1000023,20];1;0;0}
......@@ -13,6 +13,7 @@ Name[it]=Animazione-Giapponese-EN
Name[nl]=Animatie-Japans-En
Name[pl]=Animacja-Japońska-En
Name[pt]=Animação-Japonês-EN
Name[ru]=Анимация-японская-англ
Name[sk]=Animation-Japanese-En
Name[sv]=Animering-japanska-en
Name[uk]=Японська анімація (англійською)
......
......@@ -13,6 +13,7 @@ Name[it]=Animazione-Giapponese-JP
Name[nl]=Animatie-Japans-JP
Name[pl]=Animacja-Japońska-JP
Name[pt]=Animação-Japonês-JP
Name[ru]=Анимация-японская-японск
Name[sk]=Animation-Japanese-JP
Name[sv]=Animering-japanska-jp
Name[uk]=Японська анімація (японською)
......
......@@ -22,6 +22,7 @@ Name[nl]=Design presentatie A3 Landschap [ 4960x3508 , 300dpi RGB , 8bit ]
Name[pl]=Prezentacja projekcyjna A3 poziomo [ 4960x3508 , 300dpi RGB , 8bit ]
Name[pt]=Desenho de apresentação A3 em Paisagem [ 4960x3508 , 300ppp RGB , 8-bits ]
Name[pt_BR]=Design de apresentação A3 paisagem [ 4960x3508, 300dpi RGB, 8bits ]
Name[ru]=Дизайн презентации A3 Ландшафтный [ 4960x3508 , 300dpi RGB , 8bit ]
Name[sk]=Dizajn prezentácia A3 krajinka [ 4960x3508 , 300dpi RGB , 8bit ]
Name[sv]=Design presentation A3 landskap [ 4960x3508, 300 punkter/tum RGB, 8 bitar ]
Name[tr]=A3 Yatay sunum tasarla [ 4960x3508 , 300dpi RGB , 8bit ]
......
......@@ -22,6 +22,7 @@ Name[nl]=Design presentatie A4 portret [ 2480x3508 , 300dpi RGB , 8bit ]
Name[pl]=Prezentacja projekcyjna A4 pionowo [ 2480x3508 , 300dpi RGB , 8bit ]
Name[pt]=Desenho de apresentação A4 em Paisagem [ 2480x3508 , 300ppp RGB , 8-bits ]
Name[pt_BR]=Design de apresentação A4 retrato [ 2480x3508, 300dpi RGB, 8bits ]
Name[ru]=Дизайн презентации A4 Портретный [ 2480x3508 , 300dpi RGB , 8bit ]
Name[sk]=Dizajn prezentácia A4 portrét [ 2480x3508 , 300dpi RGB , 8bit ]
Name[sv]=Design presentation A4 porträtt [ 2480x3508, 300 punkter/tum RGB, 8 bitar ]
Name[tr]=A4 dikey sunum tasarla [ 2480x3508 , 300dpi RGB , 8bit ]
......
......@@ -22,6 +22,7 @@ Name[nl]=Design presentatie A4 portret [ 2480x3508 , 300dpi RGB , 8bit ]
Name[pl]=Prezentacja projekcyjna A4 pionowo [ 2480x3508 , 300dpi RGB , 8bit ]
Name[pt]=Desenho de apresentação A4 em Paisagem [ 2480x3508 , 300ppp RGB , 8-bits ]
Name[pt_BR]=Design de apresentação A4 retrato [ 2480x3508, 300dpi RGB, 8bits ]
Name[ru]=Дизайн презентации A4 Портретный [ 2480x3508 , 300dpi RGB , 8bit ]
Name[sk]=Dizajn prezentácia A4 portrét [ 2480x3508 , 300dpi RGB , 8bit ]
Name[sv]=Design presentation A4 porträtt [ 2480x3508, 300 punkter/tum RGB, 8 bitar ]
Name[tr]=A4 dikey sunum tasarla [ 2480x3508 , 300dpi RGB , 8bit ]
......
......@@ -22,6 +22,7 @@ Name[nl]=Design screen 4:3 [ 2250x1680 , 96dpi RGB , 8bit ]
Name[pl]=Ekran projekcyjny 4:3 [ 2250x1680 , 96dpi RGB , 8bit ]
Name[pt]=Desenho de ecrã 4:3 [ 2250x1680 , 96ppp RGB , 8-bits ]
Name[pt_BR]=Design de tela 4:3 [ 2250x1680, 96dpi RGB, 8bits ]
Name[ru]=Дизайн экрана 4:3 [ 2250x1680 , 96dpi RGB , 8bit ]
Name[sk]=Dizajn obrazovka 4:3 [ 2250x1680 , 96dpi RGB , 8bit ]
Name[sv]=Design skärm 4:3 [ 2250x1680, 96 punkter/tum RGB, 8 bitar ]
Name[tr]=Ekran tasarla 4:3 [ 2250x1680 , 96dpi RGB , 8bit ]
......
......@@ -355,6 +355,17 @@
<isCheckable>true</isCheckable>
<statusTip></statusTip>
</Action>
<Action name="disable_pressure">
<icon>transform_icons_penPressure</icon>
<text>Use Pen Pressure</text>
<whatsThis></whatsThis>
<toolTip>Use Pen Pressure</toolTip>
<iconText>Use Pen Pressure</iconText>
<activationFlags>10000</activationFlags>
<shortcut></shortcut>
<isCheckable>true</isCheckable>
<statusTip></statusTip>
</Action>
<Action name="hmirror_action">
<icon>symmetry-horizontal</icon>
<text>Horizontal Mirror Tool</text>
......@@ -2616,6 +2627,18 @@
<isCheckable>false</isCheckable>
<statusTip></statusTip>
</Action>
<Action name="waveletdecompose">
<icon></icon>
<text>Wavelet Decompose ...</text>
<whatsThis></whatsThis>
<toolTip>Wavelet Decompose</toolTip>
<iconText>Wavelet Decompose</iconText>
<activationFlags>1000</activationFlags>
<activationConditions>1</activationConditions>
<shortcut></shortcut>
<isCheckable>false</isCheckable>
<statusTip></statusTip>
</Action>
<Action name="mirrorNodeX">
<icon>symmetry-horizontal</icon>
<text>Mirror Layer Hori&amp;zontally</text>
......
......@@ -2,7 +2,7 @@
<kpartgui xmlns="http://www.kde.org/standards/kxmlgui/1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
name="Krita"
version="93"
version="94"
xsi:schemaLocation="http://www.kde.org/standards/kxmlgui/1.0 http://www.kde.org/standards/kxmlgui/1.0/kxmlgui.xsd">
<MenuBar>
<Menu name="file">
......@@ -150,10 +150,15 @@ xsi:schemaLocation="http://www.kde.org/standards/kxmlgui/1.0 http://www.kde.org
<Action name="canvassize"/>
<Separator/>
<Action name="imagesplit"/>
<Action name="waveletdecompose"/>
<Action name="separate"/>
</Menu>
<Menu name="Layer">
<text>&amp;Layer</text>
<Action name="cut_layer_clipboard"/>
<Action name="copy_layer_clipboard"/>
<Action name="paste_layer_from_clipboard"/>
<Separator/>
<Menu name="LayerNew">
<text>New</text>
<Action name="add_new_paint_layer"/>
......@@ -183,6 +188,7 @@ xsi:schemaLocation="http://www.kde.org/standards/kxmlgui/1.0 http://www.kde.org
<Action name="convert_to_filter_mask"/>
<Action name="convert_to_selection_mask"/>
<Action name="convert_group_to_animated"/>
<Action name="layercolorspaceconversion"/>
</Menu>
<Separator/>
<Menu name="LayerSelect">
......@@ -193,37 +199,43 @@ xsi:schemaLocation="http://www.kde.org/standards/kxmlgui/1.0 http://www.kde.org
<Action name="select_locked_layers"/>
<Action name="select_unlocked_layers"/>
</Menu>
<Separator/>
<Action name="cut_layer_clipboard"/>
<Action name="copy_layer_clipboard"/>
<Action name="paste_layer_from_clipboard"/>
<Separator/>
<Menu name="LayerSplitAlpha">
<text>S&amp;plit Alpha</text>
<Action name="split_alpha_into_mask"/>
<Action name="split_alpha_write"/>
<Action name="split_alpha_save_merged"/>
<Menu name="LayerGroup">
<text>&amp;Group</text>
<Action name="create_quick_group"/>
<Action name="create_quick_clipping_group"/>
<Action name="quick_ungroup"/>
</Menu>
<Action name="layersplit"/>
<Separator/>
<Action name="mirrorNodeX"/>
<Action name="mirrorNodeY"/>
<Menu name="Rotate">
<text>&amp;Rotate</text>
<Action name="rotatelayer"/>
<Separator/>
<Action name="rotateLayerCW90"/>
<Action name="rotateLayerCCW90"/>
<Action name="rotateLayer180"/>
<Menu name="LayerTransform">
<text>&amp;Transform</text>
<Action name="mirrorNodeX"/>
<Action name="mirrorNodeY"/>
<Action name="layersize"/>
<Menu name="Rotate">
<text>&amp;Rotate</text>
<Action name="rotatelayer"/>
<Separator/>
<Action name="rotateLayerCW90"/>
<Action name="rotateLayerCCW90"/>
<Action name="rotateLayer180"/>
</Menu>
<Action name="shearlayer"/>
<Action name="offsetlayer"/>
</Menu>
<Menu name="LayerSplitAlpha">
<text>S&amp;plit</text>
<Menu name="LayerSplitAlpha">
<text>S&amp;plit Alpha</text>
<Action name="split_alpha_into_mask"/>
<Action name="split_alpha_write"/>
<Action name="split_alpha_save_merged"/>
</Menu>
<Action name="layersplit"/>
<Action name="clones_array"/>
</Menu>
<Action name="layersize"/>
<Action name="shearlayer"/>
<Action name="offsetlayer"/>
<Action name="clones_array"/>
<Separator/>
<Action name="EditLayerMetaData"/>
<Action name="histogram"/>
<Action name="layercolorspaceconversion"/>
<Separator/>
<Action name="merge_layer"/>
<Action name="flatten_layer"/>
......@@ -233,10 +245,7 @@ xsi:schemaLocation="http://www.kde.org/standards/kxmlgui/1.0 http://www.kde.org
<Action name="merge_selected_layers"/>
<Separator/>
<Action name="layer_style"/>
<Separator/>
<Action name="create_quick_group"/>
<Action name="create_quick_clipping_group"/>
<Action name="quick_ungroup"/>
</Menu>
<Menu name="Select">
<text>&amp;Select</text>
......
......@@ -634,8 +634,8 @@
<icon></icon>
<text>Reset Canvas Rotation</text>
<whatsThis></whatsThis>
<toolTip>Rotate Canvas Left</toolTip>
<iconText>Rotate Canvas Left</iconText>
<toolTip>Reset Canvas Rotation</toolTip>
<iconText>Reset Canvas Rotation</iconText>
<activationFlags>1</activationFlags>
<activationConditions>0</activationConditions>
<shortcut></shortcut>
......
......@@ -22,6 +22,7 @@
<summary xml:lang="pl">Cyfrowe malowanie, Wolność Twórcza</summary>
<summary xml:lang="pt">Pintura Digital, Liberdade Criativa</summary>
<summary xml:lang="pt-BR">Pintura Digital, Liberdade Criativa</summary>
<summary xml:lang="ru">Цифровое рисование. Творческая свобода</summary>
<summary xml:lang="sk">Digitálne maľovanie, kreatívna sloboda</summary>
<summary xml:lang="sv">Digital målning, kreativ frihet</summary>
<summary xml:lang="uk">Цифрове малювання, творча свобода</summary>
......@@ -47,6 +48,7 @@
<p xml:lang="pl">Krita jest pełnowymiarowym, cyfrowym studiem artystycznym</p>
<p xml:lang="pt">O Krita é o estúdio de arte digital completo.</p>
<p xml:lang="pt-BR">O Krita é o estúdio de arte digital completo.</p>
<p xml:lang="ru">Krita полнофункциональный инструмент для создания цифровой графики.</p>
<p xml:lang="sk">Krita je plne vybavené digitálne umelecké štúdio.</p>
<p xml:lang="sv">Krita är den fullfjädrade digitala konststudion.</p>
<p xml:lang="uk">Krita — повноцінний комплекс для створення цифрових художніх творів.</p>
......@@ -68,6 +70,7 @@
<p xml:lang="pl">Nadaje się perfekcyjnie do szkicowania i malowania i dostarcza zupełnego rozwiązania dla tworzenia plików malowideł cyfrowych od zalążka.</p>
<p xml:lang="pt">É perfeito para desenhos e pinturas, oferecendo uma solução final para criar ficheiros de pintura digital do zero por mestres.</p>
<p xml:lang="pt-BR">É perfeito para desenhos e pinturas, oferecendo uma solução final para criar arquivos de desenho digital feitos a partir do zero por mestres.</p>
<p xml:lang="ru">Она превосходно подходит для набросков и рисования, предоставляя мастерам самодостаточный инструмент для создания цифровой живописи с нуля.</p>
<p xml:lang="sk">Je ideálna na skicovanie a maľovanie a poskytuje end-to-end riešenie na vytváranie súborov digitálneho maľovania od základu od profesionálov.</p>
<p xml:lang="sv">Den är perfekt för att skissa och måla, samt erbjuder en helomfattande lösning för att skapa digitala målningsfiler från grunden av mästare.</p>
<p xml:lang="uk">Цей комплекс чудово пасує для створення ескізів та художніх зображень і є самодостатнім набором для створення файлів цифрових полотен «з нуля» для справжніх художників.</p>
......@@ -92,6 +95,7 @@
<p xml:lang="pl">Krita jest świetnym wyborem przy tworzeniu koncepcyjnej sztuki, komiksów, tekstur do wyświetlania i kaszet. Krita obsługuje wiele przestrzeni barw takich jak RGB oraz CMYK dla kanałów 8 oraz 16 bitowych wyrażonych w l. całkowitych, a także 16 oraz 32 bitowych wyrażonych w l. zmiennoprzecinkowych.</p>
<p xml:lang="pt">O Krita é uma óptima escolha para criar arte conceptual, banda desenhada, texturas para desenho e pinturas. O Krita suporta diversos espaços de cores como o RGB e o CMYK com canais de cores inteiros a 8 e 16 bits, assim como canais de vírgula flutuante a 16 e a 32 bits.</p>
<p xml:lang="pt-BR">O Krita é uma ótima escolha para criação de arte conceitual, histórias em quadrinhos, texturas para desenhos e pinturas. O Krita tem suporte a diversos espaços de cores como RGB e CMYK com canais de cores inteiros de 8 e 16 bits, assim como canais de ponto flutuante de 16 e 32 bits.</p>
<p xml:lang="ru">Krita - отличный выбор для создания концепт-артов, комиксов, текстур для рендеринга и рисования. Она поддерживает множество цветовых пространств включая RGB и CMYK с 8 и 16 целыми битами на канал, а также 16 и 32 битами с плавающей запятой на канал.</p>
<p xml:lang="sk">Krita je výborná voľba pre vytváranie konceptového umenia, textúr na renderovanie a matné kresby. Krita podporuje mnoho farebných priestorov ako RGB a CMYK na 8 a 16 bitových celočíselných kanáloch ako aj 16 a 32 bitových reálnych kanáloch.</p>
<p xml:lang="sv">Krita är ett utmärkt val för att skapa concept art, serier, strukturer för återgivning och bakgrundsmålningar. Krita stöder många färgrymder som RGB och CMYK med 8- och 16-bitars heltal, samt 16- och 32-bitars flyttal.</p>
<p xml:lang="uk">Krita — чудовий інструмент для створення концептуального живопису, коміксів, текстур для моделей та декорацій. У Krita передбачено підтримку багатьох просторів кольорів, зокрема RGB та CMYK з 8-бітовими та 16-бітовими цілими значеннями, а також 16-бітовими та 32-бітовими значеннями з рухомою крапкою для каналів кольорів.</p>
......@@ -113,6 +117,7 @@
<p xml:lang="pl">Baw się przy malowaniu przy użyciu zaawansowanych silników pędzli, zadziwiających filtrów i wielu innych przydatnych cech, które czynią z Krity bardzo produktywną.</p>
<p xml:lang="pt">Divirta-se a pintar com os motores de pincéis avançados, os filtros espantosos e muitas outras funcionalidades úteis que tornam o Krita altamente produtivo.</p>
<p xml:lang="pt-BR">Divirta-se pintando com os mecanismos de pincéis avançados, filtros maravilhosos e muitas outras funcionalidades úteis que tornam o Krita altamente produtivo.</p>
<p xml:lang="ru">Получайте удовольствие от использования особых кистевых движков, впечатляющих фильтров и множества других функций, делающих Krita сверхпродуктивной.</p>
<p xml:lang="sk">Užívajte si maľovanie s pokročilými kresliacimi enginmi, úžasnými filtrami a mnohými užitočnými funkciami, ktoré robia Kritu veľmi produktívnu.</p>
<p xml:lang="sv">Ha det så kul vid målning med de avancerade penselfunktionerna, fantastiska filtren och många praktiska funktioner som gör Krita så enormt produktiv.</p>
<p xml:lang="uk">Отримуйте задоволення від малювання за допомогою пензлів з найширшими можливостями, чудових фільтрів та багатьох зручних можливостей, які роблять Krita надзвичайно продуктивним засобом малювання.</p>
......
<!DOCTYPE RCC>
<RCC version="1.0">
<qresource>
<RCC>
<qresource prefix="/">
<file>dark_transform_icons_cage.png</file>
<file>dark_transform_icons_liquify_erase.png</file>
<file>dark_transform_icons_liquify_main.png</file>
......@@ -18,7 +17,6 @@
<file>dark_transform_icons_mirror_y.svg</file>
<file>dark_transform_icons_rotate_cw.svg</file>
<file>dark_transform_icons_rotate_ccw.svg</file>
<file>light_transform_icons_cage.png</file>
<file>light_transform_icons_liquify_erase.png</file>
<file>light_transform_icons_liquify_main.png</file>
......@@ -36,5 +34,7 @@
<file>light_transform_icons_mirror_y.svg</file>
<file>light_transform_icons_rotate_cw.svg</file>
<file>light_transform_icons_rotate_ccw.svg</file>
<file>dark_transform_icons_penPressure_locked.png</file>
<file>light_transform_icons_penPressure_locked.png</file>
</qresource>
</RCC>
......@@ -20,6 +20,8 @@
#include <boost/random/taus88.hpp>
#include <boost/random/uniform_smallint.hpp>
#include <boost/random/normal_distribution.hpp>
struct KisRandomSource::Private
{
......@@ -93,3 +95,9 @@ qreal KisRandomSource::generateNormalized() const
return qreal(v) / max;
}
qreal KisRandomSource::generateGaussian(qreal mean, qreal sigma) const
{
boost::normal_distribution<qreal> normal(mean, sigma);
return normal(m_d->uniformSource);
}
......@@ -69,6 +69,11 @@ public:
*/
qreal generateNormalized() const;
/**
* Generates a number from the Gaussian distribution
*/
qreal generateGaussian(qreal mean, qreal sigma) const;
private:
struct Private;
const QScopedPointer<Private> m_d;
......
......@@ -254,14 +254,16 @@ const QBitArray& KisPaintLayer::channelLockFlags() const
QRect KisPaintLayer::extent() const
{
QRect rect = temporaryTarget() ? temporaryTarget()->extent() : QRect();
KisPaintDeviceSP t = temporaryTarget();
QRect rect = t ? t->extent() : QRect();
if (onionSkinEnabled()) rect |= KisOnionSkinCompositor::instance()->calculateExtent(m_d->paintDevice);
return rect | KisLayer::extent();
}
QRect KisPaintLayer::exactBounds() const
{
QRect rect = temporaryTarget() ? temporaryTarget()->exactBounds() : QRect();
KisPaintDeviceSP t = temporaryTarget();
QRect rect = t ? t->extent() : QRect();
if (onionSkinEnabled()) rect |= KisOnionSkinCompositor::instance()->calculateExtent(m_d->paintDevice);
return rect | KisLayer::exactBounds();
}
......@@ -276,7 +278,7 @@ void KisPaintLayer::setAlphaLocked(bool lock)
{
if(m_d->paintChannelFlags.isEmpty())
m_d->paintChannelFlags = colorSpace()->channelFlags(true, true);
if(lock)
m_d->paintChannelFlags &= colorSpace()->channelFlags(true, false);
else
......
......@@ -65,6 +65,8 @@
#include "kis_perspective_math.h"
#include "tiles3/kis_random_accessor.h"
#include <kis_distance_information.h>
#include "kis_lod_transform.h"
// Maximum distance from a Bezier control point to the line through the start
......@@ -1277,8 +1279,11 @@ void KisPainter::fillPainterPath(const QPainterPath& path)
void KisPainter::fillPainterPath(const QPainterPath& path, const QRect &requestedRect)
{
if (d->mirrorHorizontally || d->mirrorVertically) {
QTransform C1 = QTransform::fromTranslate(-d->axesCenter.x(), -d->axesCenter.y());
QTransform C2 = QTransform::fromTranslate(d->axesCenter.x(), d->axesCenter.y());
KisLodTransform lod(d->device);
QPointF effectiveAxesCenter = lod.map(d->axesCenter);
QTransform C1 = QTransform::fromTranslate(-effectiveAxesCenter.x(), -effectiveAxesCenter.y());
QTransform C2 = QTransform::fromTranslate(effectiveAxesCenter.x(), effectiveAxesCenter.y());
QTransform t;
QPainterPath newPath;
......@@ -2691,8 +2696,11 @@ void KisPainter::renderMirrorMask(QRect rc, KisFixedPaintDeviceSP dab)
int x = rc.topLeft().x();
int y = rc.topLeft().y();
int mirrorX = -((x+rc.width()) - d->axesCenter.x()) + d->axesCenter.x();
int mirrorY = -((y+rc.height()) - d->axesCenter.y()) + d->axesCenter.y();
KisLodTransform t(d->device);
QPointF effectiveAxesCenter = t.map(d->axesCenter);
int mirrorX = -((x+rc.width()) - effectiveAxesCenter.x()) + effectiveAxesCenter.x();
int mirrorY = -((y+rc.height()) - effectiveAxesCenter.y()) + effectiveAxesCenter.y();
if (d->mirrorHorizontally && d->mirrorVertically){
dab->mirror(true, false);
......@@ -2719,8 +2727,11 @@ void KisPainter::renderMirrorMask(QRect rc, KisFixedPaintDeviceSP dab, KisFixedP
int x = rc.topLeft().x();
int y = rc.topLeft().y();
int mirrorX = -((x+rc.width()) - d->axesCenter.x()) + d->axesCenter.x();
int mirrorY = -((y+rc.height()) - d->axesCenter.y()) + d->axesCenter.y();
KisLodTransform t(d->device);
QPointF effectiveAxesCenter = t.map(d->axesCenter);
int mirrorX = -((x+rc.width()) - effectiveAxesCenter.x()) + effectiveAxesCenter.x();
int mirrorY = -((y+rc.height()) - effectiveAxesCenter.y()) + effectiveAxesCenter.y();
if (d->mirrorHorizontally && d->mirrorVertically){
dab->mirror(true, false);
......@@ -2780,8 +2791,12 @@ void KisPainter::renderDabWithMirroringNonIncremental(QRect rc, KisPaintDeviceSP
int x = rc.topLeft().x();
int y = rc.topLeft().y();
int mirrorX = -((x+rc.width()) - d->axesCenter.x()) + d->axesCenter.x();
int mirrorY = -((y+rc.height()) - d->axesCenter.y()) + d->axesCenter.y();
KisLodTransform t(d->device);
QPointF effectiveAxesCenter = t.map(d->axesCenter);
int mirrorX = -((x+rc.width()) - effectiveAxesCenter.x()) + effectiveAxesCenter.x();
int mirrorY = -((y+rc.height()) - effectiveAxesCenter.y()) + effectiveAxesCenter.y();
rects << rc;
......
......@@ -34,6 +34,7 @@ struct Q_DECL_HIDDEN KisStrokesQueue::Private {
: openedStrokesCounter(0),
needsExclusiveAccess(false),
wrapAroundModeSupported(false),
currentStrokeLoaded(false),
lodNNeedsSynchronization(true),
desiredLevelOfDetail(0),
nextDesiredLevelOfDetail(0) {}
......@@ -42,6 +43,8 @@ struct Q_DECL_HIDDEN KisStrokesQueue::Private {
int openedStrokesCounter;
bool needsExclusiveAccess;
bool wrapAroundModeSupported;
bool currentStrokeLoaded;
bool lodNNeedsSynchronization;
int desiredLevelOfDetail;
int nextDesiredLevelOfDetail;
......@@ -510,18 +513,32 @@ bool KisStrokesQueue::checkStrokeState(bool hasStrokeJobsRunning,
* jobs present.
*/
if(!stroke->isInitialized() && hasJobs && hasLodCompatibility) {
KIS_SAFE_ASSERT_RECOVER_NOOP(!m_d->currentStrokeLoaded);
m_d->needsExclusiveAccess = stroke->isExclusive();
m_d->wrapAroundModeSupported = stroke->supportsWrapAroundMode();
m_d->currentStrokeLoaded = true;
result = true;
}
else if(hasJobs && hasLodCompatibility) {
/**
* If the stroke has no initialization phase, then it can
* arrive here unloaded.
*/
if (!m_d->currentStrokeLoaded) {
m_d->needsExclusiveAccess = stroke->isExclusive();
m_d->wrapAroundModeSupported = stroke->supportsWrapAroundMode();
m_d->currentStrokeLoaded = true;
}
result = true;
}
else if(stroke->isEnded() && !hasJobs && !hasStrokeJobsRunning) {
m_d->strokesQueue.dequeue(); // deleted by shared pointer
m_d->needsExclusiveAccess = false;
m_d->wrapAroundModeSupported = false;
m_d->currentStrokeLoaded = false;
m_d->switchDesiredLevelOfDetail(false);
......
......@@ -33,7 +33,7 @@ QString KisMimeDatabase::mimeTypeForFile(const QString &file)
fillMimeData();
QFileInfo fi(file);
QString suffix = fi.suffix();
QString suffix = fi.suffix().toLower();
Q_FOREACH(const KisMimeDatabase::KisMimeType &mimeType, s_mimeDatabase) {
if (mimeType.suffixes.contains("*." + suffix)) {
debugPlugin << "mimeTypeForFile(). KisMimeDatabase returned" << mimeType.mimeType << "for" << file;
......@@ -55,7 +55,7 @@ QString KisMimeDatabase::mimeTypeForSuffix(const QString &suffix)
fillMimeData();
QMimeDatabase db;
QString s = suffix;
QString s = suffix.toLower();
if (!s.startsWith("*.")) {
s = "*." + s;
}
......
......@@ -858,6 +858,13 @@ void KisMainWindow::slotSaveCompleted()
}
}
bool KisMainWindow::hackIsSaving() const
{
StdLockableWrapper<QMutex> wrapper(&d->savingEntryMutex);
std::unique_lock<StdLockableWrapper<QMutex>> l(wrapper, std::try_to_lock);
return !l.owns_lock();
}
bool KisMainWindow::saveDocument(KisDocument *document, bool saveas, bool silent, int specialOutputFlag)
{
if (!document) {
......@@ -1749,7 +1756,10 @@ void KisMainWindow::slotProgress(int value)
{
qApp->processEvents();
if (!d->progressMutex.tryLock()) return;
StdLockableWrapper<QMutex> wrapper(&d->progressMutex);
std::unique_lock<StdLockableWrapper<QMutex>> l(wrapper, std::try_to_lock);
if (!l.owns_lock()) return;
dbgUI << "KisMainWindow::slotProgress" << value;
if (value <= -1 || value >= 100) {
......@@ -1764,7 +1774,6 @@ void KisMainWindow::slotProgress(int value)
d->progressCancel = 0;
}
d->firstTime = true;
d->progressMutex.unlock();
return;
}
if (d->firstTime || !d->progress) {
......@@ -1807,8 +1816,6 @@ void KisMainWindow::slotProgress(int value)
d->progress->setValue(value);
}
qApp->processEvents();
d->progressMutex.unlock();
}
void KisMainWindow::slotProgressCanceled()
......
......@@ -142,6 +142,17 @@ public:
QStringList showOpenFileDialog();
/**
* Shows if the main window is saving anything right now. If the
* user presses Ctrl+W too fast, then the document can be close
* before the saving is completed. I'm not sure if it is fixable
* in any way without avoiding using porcessEvents()
* everywhere (DK)
*
* Don't use it unless you have no option.
*/
bool hackIsSaving() const;
Q_SIGNALS:
/**
......
......@@ -269,6 +269,16 @@ void KisPart::removeView(KisView *view)
{
if (!view) return;
/**
* HACK ALERT: we check here explicitly if the document (or main
* window), is saving the stuff. If we close the
* document *before* the saving is completed, a crash
* will happen.
*/
if (view->mainWindow()->hackIsSaving()) {
return;
}
emit sigViewRemoved(view);
QPointer<KisDocument> doc = view->document();
......
......@@ -313,6 +313,11 @@ void KisView::showFloatingMessageImpl(const QString &message, const QIcon& icon,
}
}
bool KisView::canvasIsMirrored() const
{
return d->canvas.xAxisMirrored() || d->canvas.yAxisMirrored();
}
void KisView::setViewManager(KisViewManager *view)
{
d->viewManager = view;
......
......@@ -213,6 +213,8 @@ public:
void setShowFloatingMessage(bool show);
void showFloatingMessageImpl(const QString &message, const QIcon& icon, int timeout, KisFloatingMessage::Priority priority, int alignment);
bool canvasIsMirrored() const;
public Q_SLOTS:
/**
......
......@@ -178,10 +178,6 @@ void KisCanvasController::Private::showMirrorStateOnCanvas()
void KisCanvasController::mirrorCanvas(bool enable)