这是indexloc提供的服务,不要输入任何密码
Skip to content
433 changes: 190 additions & 243 deletions core_lib/src/canvaspainter.cpp

Large diffs are not rendered by default.

46 changes: 24 additions & 22 deletions core_lib/src/canvaspainter.h
Original file line number Diff line number Diff line change
Expand Up @@ -50,10 +50,10 @@ class CanvasPainter
{
Q_DECLARE_TR_FUNCTIONS(CanvasPainter)
public:
explicit CanvasPainter();
explicit CanvasPainter(QPixmap& canvas);
virtual ~CanvasPainter();

void setCanvas(QPixmap* canvas);
void reset();
void setViewTransform(const QTransform view, const QTransform viewInverse);

void setOnionSkinOptions(const OnionSkinPainterOptions& onionSkinOptions) { mOnionSkinPainterOptions = onionSkinOptions;}
Expand All @@ -62,8 +62,8 @@ class CanvasPainter
void ignoreTransformedSelection();

void setPaintSettings(const Object* object, int currentLayer, int frame, QRect rect, BitmapImage* buffer);
void paint();
void paintCached();
void paint(const QRect& blitRect);
void paintCached(const QRect& blitRect);
void resetLayerCache();

private:
Expand All @@ -73,34 +73,30 @@ class CanvasPainter
* Enriches the painter with a context and sets it's initial matrix.
* @param painter The in/out painter
* @param pixmap The paint device ie. a pixmap
* @param blitRect The rect where the blitting will occur
*/
void initializePainter(QPainter& painter, QPixmap& pixmap);
void initializePainter(QPainter& painter, QPaintDevice& device, const QRect& blitRect);

void renderPreLayers(QPainter& painter);
void renderCurLayer(QPainter& painter);
void renderPostLayers(QPainter& painter);
void paintOnionSkin(QPainter& painter, const QRect& blitRect);

void paintBackground();
void paintOnionSkin(QPainter& painter);
void renderPostLayers(QPainter& painter, const QRect& blitRect);
void renderPreLayers(QPainter& painter, const QRect& blitRect);

void renderPostLayers(QPixmap* pixmap);
void renderCurLayer(QPixmap* pixmap);
void renderPreLayers(QPixmap* pixmap);
void paintCurrentFrame(QPainter& painter, const QRect& blitRect, int startLayer, int endLayer);

void paintCurrentFrame(QPainter& painter, int startLayer, int endLayer);
void paintTransformedSelection(QPainter& painter, BitmapImage* bitmapImage, const QRect& selection) const;

void paintBitmapFrame(QPainter&, Layer* layer, int nFrame, bool colorize, bool useLastKeyFrame, bool isCurrentFrame);
void paintVectorFrame(QPainter&, Layer* layer, int nFrame, bool colorize, bool useLastKeyFrame, bool isCurrentFrame);
void paintBitmapOnionSkinFrame(QPainter& painter, const QRect& blitRect, Layer* layer, int nFrame, bool colorize);
void paintVectorOnionSkinFrame(QPainter& painter, const QRect& blitRect, Layer* layer, int nFrame, bool colorize);
void paintOnionSkinFrame(QPainter& painter, QPainter& onionSkinPainter, const QRect& blitRect, int nFrame, bool colorize, qreal frameOpacity);

void paintTransformedSelection(QPainter& painter) const;
void prescale(BitmapImage* bitmapImage);

private:
void paintCurrentBitmapFrame(QPainter& painter, const QRect& blitRect, Layer* layer, bool isCurrentLayer);
void paintCurrentVectorFrame(QPainter& painter, const QRect& blitRect, Layer* layer, bool isCurrentLayer);

CanvasPainterOptions mOptions;

const Object* mObject = nullptr;
QPixmap* mCanvas = nullptr;
QPixmap& mCanvas;
QTransform mViewTransform;
QTransform mViewInverse;

Expand All @@ -116,7 +112,13 @@ class CanvasPainter
QTransform mSelectionTransform;

// Caches specifically for when drawing on the canvas
std::unique_ptr<QPixmap> mPreLayersCache, mPostLayersCache;
QPixmap mPostLayersPixmap;
QPixmap mPreLayersPixmap;
QPixmap mCurrentLayerPixmap;
QPixmap mOnionSkinPixmap;
bool mPreLayersPixmapCacheValid = false;
bool mPostLayersPixmapCacheValid = false;


OnionSkinSubPainter mOnionSkinSubPainter;
OnionSkinPainterOptions mOnionSkinPainterOptions;
Expand Down
5 changes: 3 additions & 2 deletions core_lib/src/graphics/vector/beziercurve.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -279,7 +279,7 @@ void BezierCurve::setFilled(bool YesOrNo)
mFilled = YesOrNo;
}

BezierCurve BezierCurve::transformed(QTransform transformation)
BezierCurve BezierCurve::transformed(QTransform transformation) const
{
BezierCurve transformedCurve = *this; // copy the curve
if (isSelected(-1)) { transformedCurve.setOrigin(transformation.map(origin)); }
Expand Down Expand Up @@ -621,7 +621,8 @@ QPainterPath BezierCurve::getStrokedPath(qreal width, bool usePressure)

QRectF BezierCurve::getBoundingRect()
{
return getSimplePath().boundingRect();
qreal radius = getWidth() / 2;
return getSimplePath().boundingRect().adjusted(-radius, -radius, radius, radius);
}

void BezierCurve::createCurve(const QList<QPointF>& pointList, const QList<qreal>& pressureList, bool smooth)
Expand Down
2 changes: 1 addition & 1 deletion core_lib/src/graphics/vector/beziercurve.h
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ class BezierCurve
void setSelected(int i, bool YesOrNo);
void setFilled(bool yesOrNo);

BezierCurve transformed(QTransform transformation);
BezierCurve transformed(QTransform transformation) const;
void transform(QTransform transformation);

void appendCubic(const QPointF& c1Point, const QPointF& c2Point, const QPointF& vertexPoint, qreal pressureValue);
Expand Down
35 changes: 15 additions & 20 deletions core_lib/src/graphics/vector/vectorimage.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -863,6 +863,21 @@ void VectorImage::setSelectionRect(QRectF rectangle)
select(rectangle);
}

QRectF VectorImage::getBoundsOfTransformedCurves() const
{
QRectF bounds;
for (int i = 0; i < mCurves.size(); i++)
{
BezierCurve curve;
if (mCurves.at(i).isPartlySelected())
{
curve = mCurves[i].transformed(mSelectionTransformation);
bounds |= curve.getBoundingRect();
}
}
return bounds;
}

/**
* @brief VectorImage::calculateSelectionRect
*/
Expand Down Expand Up @@ -1235,26 +1250,6 @@ void VectorImage::paintImage(QPainter& painter,
}
}

/**
* @brief VectorImage::outputImage
* @param image: QImage*
* @param myView: QTransform
* @param simplified: bool
* @param showThinCurves: bool
* @param antialiasing: bool
*/
void VectorImage::outputImage(QImage* image,
QTransform myView,
bool simplified,
bool showThinCurves,
bool antialiasing)
{
image->fill(qRgba(0, 0, 0, 0));
QPainter painter(image);
painter.setTransform(myView);
paintImage(painter, simplified, showThinCurves, antialiasing);
}

/**
* @brief VectorImage::clear
*/
Expand Down
4 changes: 2 additions & 2 deletions core_lib/src/graphics/vector/vectorimage.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@ class Object;
class QPainter;
class QImage;


class VectorImage : public KeyFrame
{
public:
Expand Down Expand Up @@ -80,6 +79,8 @@ class VectorImage : public KeyFrame
void deleteSelectedPoints();
void removeVertex(int curve, int vertex);

QRectF getBoundsOfTransformedCurves() const;

bool isEmpty() const { return mCurves.isEmpty(); }

void paste(VectorImage&);
Expand All @@ -93,7 +94,6 @@ class VectorImage : public KeyFrame
void moveColor(int start, int end);

void paintImage(QPainter& painter, bool simplified, bool showThinCurves, bool antialiasing);
void outputImage(QImage* image, QTransform myView, bool simplified, bool showThinCurves, bool antialiasing); // uses paintImage

void clear();
void clean();
Expand Down
Loading