[calligra] krita/ui: Change selection outline decoration
Boudewijn Rempt
boud at valdyas.org
Thu Jan 23 09:46:37 UTC 2014
Let's backport the first change, but not the option. It's getting really late to add new strings, I'd say.
On Thursday 23 January 2014 Jan 09:47:35 Dmitry Kazakov wrote:
> Hi, Juan!
>
> I checked IRC backlog for 22.01 where you were asking about backporting
> your patches. Your patches are really good! I like the new ants' look!
>
> You can freely backport the first patch to 2.8 right now. About the second
> one (with the option box), I would wait for Boud's/translators' approval,
> because it adds a new string. I'm not sure I know the process of pinging
> translators about new strings.
>
> If you like, I can do the backporting for you today. I have two calligra
> checkouts for that :)
>
>
>
> On Wed, Jan 22, 2014 at 9:50 PM, Juan Palacios <jpalaciosdev at gmail.com>wrote:
>
> > Git commit 436b00539f7a5c94523af6e93bd98d3b72c00d1b by Juan Palacios.
> > Committed on 22/01/2014 at 17:23.
> > Pushed by jpalacios into branch 'master'.
> >
> > Change selection outline decoration
> >
> > The old selection outline draw method was implemented using the
> > technique of Bill Atkinson. This method has the disadvantage of not
> > looking like marching ants with selection borders that aren't parallel
> > to the coordinate axes.
> >
> > The new method uses a QPen with a dash pattern to draw the ants, so they
> > are always displayed as dashes, no matter the angle that borders has.
> > It is draw in two passes. The first one uses a QPen configured
> > to draw the selection outline in white. Then, the selection outline is
> > draw again above the white outline, but this time using other QPen
> > configured to draw the ants in black.
> >
> > Also, the outline is drawed without antialiasing.
> >
> > M +32 -26 krita/ui/kis_selection_decoration.cc
> > M +3 -2 krita/ui/kis_selection_decoration.h
> >
> > http://commits.kde.org/calligra/436b00539f7a5c94523af6e93bd98d3b72c00d1b
> >
> > diff --git a/krita/ui/kis_selection_decoration.cc
> > b/krita/ui/kis_selection_decoration.cc
> > index 78a05d2..902c2a4 100644
> > --- a/krita/ui/kis_selection_decoration.cc
> > +++ b/krita/ui/kis_selection_decoration.cc
> > @@ -35,31 +35,30 @@
> > #include "kis_canvas_resource_provider.h"
> > #include "kis_coordinates_converter.h"
> >
> > +static const unsigned int ANT_LENGTH = 4;
> > +static const unsigned int ANT_SPACE = 4;
> > +static const unsigned int ANT_ADVANCE_WIDTH = ANT_LENGTH + ANT_SPACE;
> > +
> > KisSelectionDecoration::KisSelectionDecoration(KisView2* view)
> > : KisCanvasDecoration("selection", i18n("Selection decoration"),
> > view),
> > m_signalCompressor(500 /*ms*/, KisSignalCompressor::FIRST_INACTIVE),
> > + m_outlinePath(),
> > + m_offset(0),
> > + m_antsPen(Qt::CustomDashLine),
> > + m_outlinePen(Qt::SolidLine),
> > m_mode(Ants)
> > {
> > - m_offset = 0;
> > -
> > - QRgb white = QColor(Qt::white).rgb();
> > - QRgb black = QColor(Qt::black).rgb();
> > -
> > - for (int i = 0; i < 8; i++) {
> > - QImage texture(8, 8, QImage::Format_RGB32);
> > - for (int y = 0; y < 8; y++) {
> > - QRgb *pixel = reinterpret_cast<QRgb *>(texture.scanLine(y));
> > - for (int x = 0; x < 8; x++) {
> > - pixel[x] = ((x + y + i) % 8 < 4) ? black : white;
> > - }
> > - }
> > - QBrush brush;
> > - brush.setTextureImage(texture);
> > - m_brushes << brush;
> > - }
> > + QVector<qreal> antDashPattern;
> > + antDashPattern << ANT_LENGTH << ANT_SPACE;
> > + m_antsPen.setDashPattern(antDashPattern);
> > + m_antsPen.setCosmetic(true);
> > + m_antsPen.setColor(Qt::black);
> > +
> > + m_outlinePen.setCosmetic(true);
> > + m_outlinePen.setColor(Qt::white);
> >
> > m_antsTimer = new QTimer(this);
> > - m_antsTimer->setInterval(300);
> > + m_antsTimer->setInterval(150);
> > m_antsTimer->setSingleShot(false);
> > connect(m_antsTimer, SIGNAL(timeout()), SLOT(antsAttackEvent()));
> >
> > @@ -123,7 +122,8 @@ void KisSelectionDecoration::antsAttackEvent()
> > if (!selection) return;
> >
> > if (selectionIsActive()) {
> > - m_offset = (m_offset + 1) % 8;
> > + m_offset = (m_offset + 1) % ANT_ADVANCE_WIDTH;
> > + m_antsPen.setDashOffset(m_offset);
> > view()->canvasBase()->updateCanvas();
> > }
> > }
> > @@ -135,20 +135,26 @@ void
> > KisSelectionDecoration::drawDecoration(QPainter& gc, const QRectF& updateRe
> > Q_ASSERT_X(m_mode == Ants, "KisSelectionDecoration.cc", "MASK MODE
> > NOT SUPPORTED YET!");
> >
> > if (!selectionIsActive()) return;
> > - KisSelectionSP selection = view()->selection();
> > + if (m_outlinePath.isEmpty()) return;
> >
> > gc.save();
> > gc.setTransform(QTransform(), false);
> > - gc.setRenderHints(0);
> >
> > - QPen pen(m_brushes[m_offset], 0);
> > + // Disable antialiasing. This allow us to draw the selection outline
> > with a consistent look in all zoom levels.
> > + // Reason: The selection outline is 1 pixel width. Antialiasing will
> > produce a fuzzy gray line of 2 pixels in most cases,
> > + // but sometimes can produce a clear line of 1 pixel, while still
> > producing other fuzzy lines at the same time! Thus,
> > + // the overall look is not consistent if antialiasing is enabled for
> > 1 pixel width lines.
> > + gc.setRenderHints(QPainter::Antialiasing |
> > QPainter::HighQualityAntialiasing, false);
> > +
> > QTransform transform = converter->imageToWidgetTransform();
> >
> > - gc.setPen(pen);
> > + // render selection outline in white
> > + gc.setPen(m_outlinePen);
> > + gc.drawPath(transform.map(m_outlinePath));
> >
> > - if (!m_outlinePath.isEmpty()) {
> > - gc.drawPath(transform.map(m_outlinePath));
> > - }
> > + // render marching ants in black (above the white outline)
> > + gc.setPen(m_antsPen);
> > + gc.drawPath(transform.map(m_outlinePath));
> >
> > gc.restore();
> > }
> > diff --git a/krita/ui/kis_selection_decoration.h
> > b/krita/ui/kis_selection_decoration.h
> > index 3e3deca..a65f15a 100644
> > --- a/krita/ui/kis_selection_decoration.h
> > +++ b/krita/ui/kis_selection_decoration.h
> > @@ -20,7 +20,7 @@
> >
> > #include <QTimer>
> > #include <QPolygon>
> > -#include <QBrush>
> > +#include <QPen>
> >
> > #include <kis_signal_compressor.h>
> > #include "canvas/kis_canvas_decoration.h"
> > @@ -58,7 +58,8 @@ private:
> > QTimer* m_antsTimer;
> > int m_offset;
> >
> > - QList<QBrush> m_brushes;
> > + QPen m_antsPen;
> > + QPen m_outlinePen;
> > Mode m_mode;
> > };
> >
> >
> >
>
>
>
--
Boudewijn Rempt
http://www.valdyas.org, http://www.krita.org, http://www.boudewijnrempt.nl
More information about the kimageshop
mailing list