[calligra] krita/ui: Change selection outline decoration

Dmitry Kazakov dimula73 at gmail.com
Thu Jan 23 05:47:35 UTC 2014


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;
>  };
>
>
>


-- 
Dmitry Kazakov
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.kde.org/pipermail/kimageshop/attachments/20140123/678fd823/attachment.html>


More information about the kimageshop mailing list