19
19
#include "kis_boundary.h"
21
20
#include <QPainter>
24
23
#include "KoColorSpace.h"
25
24
#include "kis_fixed_paint_device.h"
26
#include "kis_iterators_pixel.h"
25
#include "kis_outline_generator.h"
28
27
struct KisBoundary::Private {
29
bool isDark(quint8 val);
30
28
KisFixedPaintDeviceSP m_device;
33
PointPairListList m_horSegments;
34
PointPairListList m_vertSegments;
29
QVector<QPolygon> m_boundary;
38
32
KisBoundary::KisBoundary(KisFixedPaintDeviceSP dev) : d(new Private)
41
d->m_fuzzyness = 255 / 2;
44
37
KisBoundary::~KisBoundary()
48
bool KisBoundary::Private::isDark(quint8 val)
50
return val < m_fuzzyness;
53
void KisBoundary::generateBoundary(int w, int h)
41
void KisBoundary::generateBoundary()
58
const KoColorSpace* cs = d->m_device->colorSpace();
59
int pixelSize = d->m_device->pixelSize();
61
// Yes, we start looking before the begin of the data. There we return the default pixel,
62
// which is transparent.
63
quint8* dataPointer = d->m_device->data();
64
quint8* dataPointerTop = d->m_device->data() - w * pixelSize;
65
quint8* dataPointerBot = d->m_device->data();
67
for (int currentY = -1; currentY < h; currentY++) {
69
d->m_horSegments.append(QList<PointPair>());
71
for (int currentX = 0; currentX < w; currentX++) {
76
if (dataPointerTop < dataPointer) {
77
darkTop = OPACITY_TRANSPARENT;
79
darkTop = cs->alpha(dataPointerTop);
81
darkBot = cs->alpha(dataPointerBot);
83
if (darkTop != darkBot) {
85
d->m_horSegments.back().append(qMakePair(QPointF(currentX, currentY + 1), 1));
94
for (int currentX = - 1; currentX < w; currentX++) {
99
d->m_vertSegments.append(QList<PointPair>());
101
for (int currentY = 0; currentY < h; currentY++) {
103
quint8* dataPointerLeft = d->m_device->data() + (h * pixelSize) + (currentX * pixelSize);
104
quint8* dataPointerRight = dataPointerTop - pixelSize;
106
darkLeft = cs->alpha(dataPointerLeft);
107
darkRight = cs->alpha(dataPointerRight);
109
if (darkLeft != darkRight) {
111
d->m_vertSegments.back().append(qMakePair(QPointF(currentX, currentY), 1));
118
const KisBoundary::PointPairListList& KisBoundary::horizontalSegment() const
120
return d->m_horSegments;
123
const KisBoundary::PointPairListList& KisBoundary::verticalSegment() const
125
return d->m_vertSegments;
46
KisOutlineGenerator generator(d->m_device->colorSpace(), OPACITY_TRANSPARENT_U8);
47
d->m_boundary = generator.outline(d->m_device->data(), 0, 0, d->m_device->bounds().width(), d->m_device->bounds().height());
50
void KisBoundary::paint(QPainter& painter) const
54
pen.setBrush(Qt::black);
57
foreach(const QPolygon & polygon, d->m_boundary) {
58
painter.drawPolygon(polygon);