Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_auto_brush.cpp File Reference
#include "kis_auto_brush.h"
#include <kis_debug.h>
#include <math.h>
#include <QPainterPath>
#include <QRect>
#include <QDomElement>
#include <QBuffer>
#include <QFile>
#include <KoColor.h>
#include <KoColorSpace.h>
#include <KoColorSpaceRegistry.h>
#include <kis_datamanager.h>
#include <kis_fixed_paint_device.h>
#include <kis_paint_device.h>
#include <brushengine/kis_paint_information.h>
#include <kis_mask_generator.h>
#include <kis_boundary.h>
#include <brushengine/kis_paintop_lod_limitations.h>
#include <kis_brush_mask_applicator_base.h>
#include "kis_algebra_2d.h"
#include <KisOptimizedBrushOutline.h>

Go to the source code of this file.

Classes

struct  KisAutoBrush::Private
 

Functions

void fillPixelOptimized_4bytes (quint8 *color, quint8 *buf, int size)
 
void fillPixelOptimized_general (quint8 *color, quint8 *buf, int size, int pixelSize)
 
static KisDabShape lieAboutDabShape (KisDabShape const &shape, int spikes)
 

Function Documentation

◆ fillPixelOptimized_4bytes()

void fillPixelOptimized_4bytes ( quint8 * color,
quint8 * buf,
int size )
inline

This version of filling uses low granularity of data transfers (32-bit chunks) and internal processor's parallelism. It reaches 25% better performance in KisStrokeBenchmark in comparison to per-pixel memcpy version (tested on Sandy Bridge).

Definition at line 200 of file kis_auto_brush.cpp.

201{
209 int block1 = size / 8;
210 int block2 = size % 8;
211
212 quint32 *src = reinterpret_cast<quint32*>(color);
213 quint32 *dst = reinterpret_cast<quint32*>(buf);
214
215 // check whether all buffers are 4 bytes aligned
216 // (uncomment if experience some problems)
217 // Q_ASSERT(((qint64)src & 3) == 0);
218 // Q_ASSERT(((qint64)dst & 3) == 0);
219
220 for (int i = 0; i < block1; i++) {
221 *dst = *src;
222 *(dst + 1) = *src;
223 *(dst + 2) = *src;
224 *(dst + 3) = *src;
225 *(dst + 4) = *src;
226 *(dst + 5) = *src;
227 *(dst + 6) = *src;
228 *(dst + 7) = *src;
229
230 dst += 8;
231 }
232
233 for (int i = 0; i < block2; i++) {
234 *dst = *src;
235 dst++;
236 }
237}
int size(const Forest< T > &forest)
Definition KisForest.h:1232

◆ fillPixelOptimized_general()

void fillPixelOptimized_general ( quint8 * color,
quint8 * buf,
int size,
int pixelSize )
inline

This version uses internal processor's parallelism and gives 20% better performance in KisStrokeBenchmark in comparison to per-pixel memcpy version (tested on Sandy Bridge (+20%) and on Merom (+10%)).

Definition at line 239 of file kis_auto_brush.cpp.

240{
248 int block1 = size / 8;
249 int block2 = size % 8;
250
251 for (int i = 0; i < block1; i++) {
252 quint8 *d1 = buf;
253 quint8 *d2 = buf + pixelSize;
254 quint8 *d3 = buf + 2 * pixelSize;
255 quint8 *d4 = buf + 3 * pixelSize;
256 quint8 *d5 = buf + 4 * pixelSize;
257 quint8 *d6 = buf + 5 * pixelSize;
258 quint8 *d7 = buf + 6 * pixelSize;
259 quint8 *d8 = buf + 7 * pixelSize;
260
261 for (int j = 0; j < pixelSize; j++) {
262 *(d1 + j) = color[j];
263 *(d2 + j) = color[j];
264 *(d3 + j) = color[j];
265 *(d4 + j) = color[j];
266 *(d5 + j) = color[j];
267 *(d6 + j) = color[j];
268 *(d7 + j) = color[j];
269 *(d8 + j) = color[j];
270 }
271
272 buf += 8 * pixelSize;
273 }
274
275 for (int i = 0; i < block2; i++) {
276 memcpy(buf, color, pixelSize);
277 buf += pixelSize;
278 }
279}

◆ lieAboutDabShape()

static KisDabShape lieAboutDabShape ( KisDabShape const & shape,
int spikes )
static

Definition at line 171 of file kis_auto_brush.cpp.

172{
173 return spikes > 2 ? KisDabShape(shape.scale(), 1.0, shape.rotation()) : shape;
174}

References KisDabShape::rotation(), and KisDabShape::scale().