Commit 0eee3399 authored by Wolthera van Hövell's avatar Wolthera van Hövell 🛍

Merge branch 'master' into krita-testing-wolthera

parents 0c201bc0 d07cdb63
......@@ -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 ]
......
......@@ -622,8 +622,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>
......
......@@ -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;
......
......@@ -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
// and end points for the curve to be considered flat.
......@@ -1276,8 +1278,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;
......@@ -2690,8 +2695,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);
......@@ -2718,8 +2726,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);
......@@ -2779,8 +2790,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;
......
......@@ -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)
{
KisCanvasDecorationSP decorator = dynamic_cast<KisCanvas2*>(this->canvas())->decoration("mirror_axis");
KIS_ASSERT_RECOVER_RETURN(decorator);
decorator->setVisible(enable);
QPoint newOffset = m_d->coordinatesConverter->mirror(m_d->coordinatesConverter->widgetCenterPoint(), enable, false);
m_d->updateDocumentSizeAfterTransform();
setScrollBarValue(newOffset);
......@@ -192,8 +188,6 @@ void KisCanvasController::mirrorCanvas(bool enable)
void KisCanvasController::Private::showRotationValueOnCanvas()
{
qreal rotationAngle = coordinatesConverter->rotationAngle();
view->viewManager()->
showFloatingMessage(
i18nc("floating message about rotation", "Rotation: %1° ",
......
......@@ -31,15 +31,15 @@
struct KisCoordinatesConverter::Private {
Private():
isXAxisMirrored(false), isYAxisMirrored(false), rotationAngle(0.0) { }
KisImageWSP image;
bool isXAxisMirrored;
bool isYAxisMirrored;
qreal rotationAngle;
QSizeF canvasWidgetSize;
QPointF documentOffset;
QTransform flakeToWidget;
QTransform imageToDocument;
QTransform documentToFlake;
......@@ -159,7 +159,7 @@ void KisCoordinatesConverter::setImage(KisImageWSP image)
void KisCoordinatesConverter::setDocumentOffset(const QPoint& offset)
{
QPointF diff = m_d->documentOffset - offset;
m_d->documentOffset = offset;
m_d->flakeToWidget *= QTransform::fromTranslate(diff.x(), diff.y());
recalculateTransformations();
......@@ -210,32 +210,38 @@ QPoint KisCoordinatesConverter::rotate(QPointF center, qreal angle)
return m_d->documentOffset.toPoint();
}
QPoint KisCoordinatesConverter::mirror(QPointF center, bool mirrorXAxis, bool mirrorYAxis, bool keepOrientation)
QPoint KisCoordinatesConverter::mirror(QPointF center, bool mirrorXAxis, bool mirrorYAxis)
{
bool keepOrientation = false; // XXX: Keep here for now, maybe some day we can restore the parameter again.
bool doXMirroring = m_d->isXAxisMirrored ^ mirrorXAxis;
bool doYMirroring = m_d->isYAxisMirrored ^ mirrorYAxis;
qreal scaleX = doXMirroring ? -1.0 : 1.0;
qreal scaleY = doYMirroring ? -1.0 : 1.0;
QTransform mirror = QTransform::fromScale(scaleX, scaleY);
QTransform rot;
rot.rotate(m_d->rotationAngle);
m_d->flakeToWidget *= QTransform::fromTranslate(-center.x(),-center.y());
if(keepOrientation)
if (keepOrientation) {
m_d->flakeToWidget *= rot.inverted();
}
m_d->flakeToWidget *= mirror;
if(keepOrientation)
if (keepOrientation) {
m_d->flakeToWidget *= rot;
}
m_d->flakeToWidget *= QTransform::fromTranslate(center.x(),center.y());
if(!keepOrientation && (doXMirroring ^ doYMirroring))
if (!keepOrientation && (doXMirroring ^ doYMirroring)) {
m_d->rotationAngle = -m_d->rotationAngle;
}
m_d->isXAxisMirrored = mirrorXAxis;
m_d->isYAxisMirrored = mirrorYAxis;
......@@ -259,7 +265,7 @@ QPoint KisCoordinatesConverter::resetRotation(QPointF center)
{
QTransform rot;
rot.rotate(-m_d->rotationAngle);
m_d->flakeToWidget *= QTransform::fromTranslate(-center.x(), -center.y());
m_d->flakeToWidget *= rot;
m_d->flakeToWidget *= QTransform::fromTranslate(center.x(), center.y());
......@@ -353,7 +359,7 @@ QPointF KisCoordinatesConverter::imageCenterInWidgetPixel() const
{
if(!m_d->image)
return QPointF();
QPolygonF poly = imageToWidget(QPolygon(m_d->image->bounds()));
return (poly[0] + poly[1] + poly[2] + poly[3]) / 4.0;
}
......
......@@ -46,7 +46,7 @@ namespace _Private
typedef QRectF Result;
static QRectF map(const QTransform& transform, const QRectF& rc) { return transform.mapRect(rc); }
};
template<> struct Traits<QRect>: public Traits<QRectF> { };
template<> struct Traits<QPoint>: public Traits<QPointF> { };
template<> struct Traits<QPolygon>: public Traits<QPolygonF> { };
......@@ -65,13 +65,13 @@ public:
QPoint documentOffset() const;
qreal rotationAngle() const;
QPoint rotate(QPointF center, qreal angle);
QPoint mirror(QPointF center, bool mirrorXAxis, bool mirrorYAxis, bool keepOrientation=false);
QPoint mirror(QPointF center, bool mirrorXAxis, bool mirrorYAxis);
bool xAxisMirrored() const;
bool yAxisMirrored() const;
QPoint resetRotation(QPointF center);
virtual void setZoom(qreal zoom);
/**
......@@ -83,22 +83,22 @@ public:
imageToViewport(const T& obj) const { return _Private::Traits<T>::map(imageToViewportTransform(), obj); }
template<class T> typename _Private::Traits<T>::Result
viewportToImage(const T& obj) const { return _Private::Traits<T>::map(imageToViewportTransform().inverted(), obj); }
template<class T> typename _Private::Traits<T>::Result
flakeToWidget(const T& obj) const { return _Private::Traits<T>::map(flakeToWidgetTransform(), obj); }
template<class T> typename _Private::Traits<T>::Result
widgetToFlake(const T& obj) const { return _Private::Traits<T>::map(flakeToWidgetTransform().inverted(), obj); }
template<class T> typename _Private::Traits<T>::Result
widgetToViewport(const T& obj) const { return _Private::Traits<T>::map(viewportToWidgetTransform().inverted(), obj); }
template<class T> typename _Private::Traits<T>::Result
viewportToWidget(const T& obj) const { return _Private::Traits<T>::map(viewportToWidgetTransform(), obj); }
template<class T> typename _Private::Traits<T>::Result
documentToWidget(const T& obj) const { return _Private::Traits<T>::map(documentToWidgetTransform(), obj); }
template<class T> typename _Private::Traits<T>::Result
widgetToDocument(const T& obj) const { return _Private::Traits<T>::map(documentToWidgetTransform().inverted(), obj); }
template<class T> typename _Private::Traits<T>::Result
imageToDocument(const T& obj) const { return _Private::Traits<T>::map(imageToDocumentTransform(), obj); }
template<class T> typename _Private::Traits<T>::Result
......@@ -108,7 +108,7 @@ public:
documentToFlake(const T& obj) const { return _Private::Traits<T>::map(documentToFlakeTransform(), obj); }
template<class T> typename _Private::Traits<T>::Result
flakeToDocument(const T& obj) const { return _Private::Traits<T>::map(documentToFlakeTransform().inverted(), obj); }
template<class T> typename _Private::Traits<T>::Result
imageToWidget(const T& obj) const { return _Private::Traits<T>::map(imageToWidgetTransform(), obj); }
template<class T> typename _Private::Traits<T>::Result
......
......@@ -626,7 +626,7 @@ BevelAndEmboss::BevelAndEmboss(Contour *contour, Texture *texture, QWidget *pare
connect(ui.intOpacity2, SIGNAL(valueChanged(int)), SIGNAL(configChanged()));;
// Contour
m_contour->ui.intRange->setRange(0, 100);
m_contour->ui.intRange->setRange(1, 100);
m_contour->ui.intRange->setSuffix(i18n(" %"));
connect(m_contour->ui.cmbContour, SIGNAL(currentIndexChanged(int)), SIGNAL(configChanged()));
......
......@@ -152,8 +152,6 @@ public:
void mirrorVerticalMoveCanvasToCenter();
void mirrorHorizontalMoveCanvasToCenter();
void setOpacity(qreal opacity);
qreal opacity() const;
......
......@@ -350,8 +350,8 @@ void KisLayerManager::convertNodeToPaintLayer(KisNodeSP source)
if (!image) return;
KisGroupLayer *srcLayer = dynamic_cast<KisGroupLayer*>(source.data());
if (srcLayer) {
KisLayer *srcLayer = dynamic_cast<KisLayer*>(source.data());
if (srcLayer && (srcLayer->inherits("KisGroupLayer") || srcLayer->layerStyle())) {
image->flattenLayer(srcLayer);
return;
}
......
......@@ -33,19 +33,16 @@
KisMirrorManager::KisMirrorManager(KisViewManager* view) : QObject(view)
, m_imageView(0)
{
}
KisMirrorManager::~KisMirrorManager()
{
}
void KisMirrorManager::setup(KActionCollection * collection)
{
m_mirrorCanvas = new KToggleAction(i18n("Mirror View"), this);
m_mirrorCanvas->setChecked(false);
//m_mirrorCanvas->setShortcut(QKeySequence(Qt::Key_M));
collection->addAction("mirror_canvas", m_mirrorCanvas);
collection->setDefaultShortcut(m_mirrorCanvas, QKeySequence(Qt::Key_M));
......@@ -59,11 +56,7 @@ void KisMirrorManager::setView(QPointer<KisView> imageView)
m_mirrorCanvas->disconnect();
}
m_imageView = imageView;
if (m_imageView && !decoration()) {
m_imageView->canvasBase()->addDecoration(new KisMirrorAxis(m_imageView->viewManager()->resourceProvider(), m_imageView));
}
if (m_imageView && decoration()) {
if (m_imageView) {
connect(m_mirrorCanvas, SIGNAL(toggled(bool)), dynamic_cast<KisCanvasController*>(m_imageView->canvasController()), SLOT(mirrorCanvas(bool)));
}
updateAction();
......@@ -71,19 +64,12 @@ void KisMirrorManager::setView(QPointer<KisView> imageView)
void KisMirrorManager::updateAction()
{
if (decoration()) {
m_mirrorCanvas->setChecked(decoration()->visible());
if (m_imageView) {
m_mirrorCanvas->setEnabled(true);
} else {
m_mirrorCanvas->setEnabled(false);
m_mirrorCanvas->setChecked(m_imageView->canvasIsMirrored());
}
}
KisMirrorAxis* KisMirrorManager::decoration()
{
if (m_imageView && m_imageView->canvasBase()) {
return dynamic_cast<KisMirrorAxis*>(m_imageView->canvasBase()->decoration("mirror_axis").data());
else {
m_mirrorCanvas->setEnabled(false);
m_mirrorCanvas->setChecked(false);
}
return 0;
}
......@@ -46,8 +46,7 @@ private Q_SLOTS:
void updateAction();
private:
KisMirrorAxis* decoration();
QPointer<KisView> m_imageView;
QAction *m_mirrorCanvas;
};
......
......@@ -35,7 +35,7 @@ void initImage(KisImageSP *image, KoZoomHandler *zoomHandler)
const KoColorSpace *cs = KoColorSpaceRegistry::instance()->rgb8();
*image = new KisImage(0, 1000, 1000, cs, "projection test");
(*image)->setResolution(100, 100);
zoomHandler->setResolution(100, 100);
}
......@@ -49,7 +49,7 @@ void KisCoordinatesConverterTest::testConversion()
converter.setDocumentOffset(QPoint(20,20));
converter.setCanvasWidgetSize(QSize(500,500));
converter.setZoom(1.);
QRectF testRect(100,100,100,100);
QCOMPARE(converter.imageToViewport(testRect), QRectF(80,80,100,100));
......@@ -210,17 +210,17 @@ void KisCoordinatesConverterTest::testMirroring()
initImage(&image, &converter);
QSize widgetSize(500,400);
QSize flakeSize(1000,1000);
// QSize flakeSize(1000,1000);
QRectF testRect(300, 100, 200, 200);
converter.setImage(image);
converter.setDocumentOffset(QPoint(200,100));
converter.setCanvasWidgetSize(widgetSize);
QTransform imageToWidget;
QTransform documentToWidget;
QTransform flakeToWidget;
QTransform viewportToWidget;
// QTransform imageToWidget;
// QTransform documentToWidget;
// QTransform flakeToWidget;
// QTransform viewportToWidget;
converter.mirror(converter.imageCenterInWidgetPixel(), true, false);
converter.setZoom(1.);
......@@ -244,17 +244,17 @@ void KisCoordinatesConverterTest::testMirroringCanvasBiggerThanImage()
initImage(&image, &converter);
QSize widgetSize(2000,2000);
QSize flakeSize(1000,1000);
// QSize flakeSize(1000,1000);
QRectF testRect(300, 100, 200, 200);
converter.setImage(image);
converter.setDocumentOffset(QPoint(-50,-50));
converter.setCanvasWidgetSize(widgetSize);
QTransform imageToWidget;
QTransform documentToWidget;
QTransform flakeToWidget;
QTransform viewportToWidget;
// QTransform imageToWidget;
// QTransform documentToWidget;
// QTransform flakeToWidget;
// QTransform viewportToWidget;
converter.mirror(converter.imageCenterInWidgetPixel(), true, false);
converter.setZoom(1.);
......
......@@ -42,7 +42,7 @@ public:
SelectionMode selectionMode() const;
SelectionAction selectionAction() const;
int action() const { return selectionAction(); };
int action() const { return selectionAction(); }
bool processKeyPressEvent(QKeyEvent *event);
......
......@@ -116,12 +116,51 @@ void KisColorSpaceSelector::fillCmbDepths(const KoID& id)
KoID activeDepth = d->colorSpaceSelector->cmbColorDepth->currentItem();
d->colorSpaceSelector->cmbColorDepth->clear();
QList<KoID> depths = KoColorSpaceRegistry::instance()->colorDepthList(id, KoColorSpaceRegistry::OnlyUserVisible);
// order the depth by name
qSort(depths.begin(), depths.end(), sortBitDepthsComparer);
d->colorSpaceSelector->cmbColorDepth->setIDList(depths);
if (depths.contains(activeDepth)) {
d->colorSpaceSelector->cmbColorDepth->setCurrent(activeDepth);
}
}
bool KisColorSpaceSelector::sortBitDepthsComparer(KoID depthOne, KoID depthTwo) {
// to order these right, we need to first order by bit depth, then by if it is floating or not
QString bitDepthOne = depthOne.name().split(" ")[0];
QString bitDepthTwo = depthTwo.name().split(" ")[0];
if (bitDepthOne.toInt() > bitDepthTwo.toInt()) {
return false;
}
if (bitDepthOne.toInt() == bitDepthTwo.toInt()) {
// bit depth number is the same, so now we need to compare if it is a floating type or not
// the second value [1], just says 'bits', so that is why we look for [2] which has the float word
QString bitDepthOneType = "";
QString bitDepthTwoType = "";
if (depthOne.name().split(" ").length() > 2) {
bitDepthOneType = depthOne.name().split(" ")[2];
}
if (depthTwo.name().split(" ").length() > 2) {
bitDepthTwoType = depthTwo.name().split(" ")[2];
}
if (bitDepthOneType.length() > bitDepthTwoType.length()) {
return false;
}
}
return true;
}
const KoColorSpace* KisColorSpaceSelector::currentColorSpace()
{
QString profilenamestring = d->colorSpaceSelector->cmbProfile->itemHighlighted();
......
......@@ -57,7 +57,9 @@ private Q_SLOTS:
private:
struct Private;
KisAdvancedColorSpaceSelector *m_advancedSelector;
static bool sortBitDepthsComparer(KoID depthOne, KoID depthTwo);
Private * const d;
};
......
......@@ -106,6 +106,7 @@ Comment[it]=Programma di manipolazione delle immagini basato su pixel per Callig
Comment[nl]=Afbeeldingsbewerkingsprogramma gebaseerd op pixels voor de Calligra Suite
Comment[pl]=Program do obróbki obrazów na poziomie pikseli dla Pakietu Calligra
Comment[pt]='Plugin' de manipulação de imagens em pixels para o Calligra Stage
Comment[ru]=Программа редактирования пиксельной анимации для the Calligra Suite
Comment[sk]=Program na manipuláciu s pixelmi pre Calligra Suite
Comment[sv]=Bildpunktsbaserat bildbehandlingsprogram för Calligra-sviten
Comment[uk]=Програма для роботи із растровими зображеннями для комплексу програм Calligra
......
......@@ -54,9 +54,7 @@ void ColorSliderDock::setCanvas(KoCanvasBase * canvas)
m_canvas->disconnectCanvasObserver(this);
}
if (m_view) {