17 #include "canvasrenderer.h"
19 #include "layerbitmap.h"
20 #include "layervector.h"
21 #include "bitmapimage.h"
22 #include "layercamera.h"
23 #include "vectorimage.h"
28 CanvasRenderer::CanvasRenderer( QObject* parent ) : QObject( parent )
29 , mLog(
"CanvasRenderer" )
31 ENABLE_DEBUG_LOG( mLog,
false );
34 CanvasRenderer::~CanvasRenderer()
38 void CanvasRenderer::setCanvas( QPixmap* canvas )
44 void CanvasRenderer::setViewTransform( QTransform viewTransform )
46 mViewTransform = viewTransform;
49 void CanvasRenderer::setTransformedSelection(QRect selection, QTransform transform)
53 if (selection.width() > 0 && selection.height() > 0) {
55 mSelection = selection;
56 mSelectionTransform = transform;
57 mRenderTransform =
true;
63 ignoreTransformedSelection();
67 void CanvasRenderer::ignoreTransformedSelection()
69 mRenderTransform =
false;
72 void CanvasRenderer::paint(
Object*
object,
int layer,
int frame, QRect rect )
80 QPainter painter( mCanvas );
82 painter.setWorldTransform( mViewTransform );
83 painter.setRenderHint( QPainter::SmoothPixmapTransform, mOptions.bAntiAlias );
84 painter.setRenderHint( QPainter::Antialiasing,
true );
91 painter.setWorldMatrixEnabled(
true );
94 paintOnionSkin( painter );
96 paintCurrentFrame( painter );
97 paintCameraBorder( painter );
100 if ( mOptions.bAxis )
102 paintAxis( painter );
106 void CanvasRenderer::paintBackground()
108 mCanvas->fill( Qt::transparent );
111 void CanvasRenderer::paintOnionSkin( QPainter& painter )
113 Layer* layer = mObject->getLayer( mLayerIndex );
115 if ( layer->keyFrameCount() == 0 )
120 qreal minOpacity = mOptions.fOnionSkinMinOpacity / 100;
121 qreal maxOpacity = mOptions.fOnionSkinMaxOpacity / 100;
123 if ( mOptions.bPrevOnionSkin && mFrameNumber > 1 )
127 qreal prevOpacityIncrement = (maxOpacity - minOpacity) / mOptions.nPrevOnionSkinCount;
128 qreal opacity = maxOpacity;
130 int onionFrameNumber = layer->getPreviousFrameNumber(mFrameNumber, mOptions.bIsOnionAbsolute);
131 int onionPosition = 0;
133 while (onionPosition < mOptions.nPrevOnionSkinCount && onionFrameNumber > 0)
135 painter.setOpacity( opacity );
137 switch ( layer->type() )
139 case Layer::BITMAP: { paintBitmapFrame( painter, mLayerIndex, onionFrameNumber, mOptions.bColorizePrevOnion,
false );
break; }
140 case Layer::VECTOR: { paintVectorFrame( painter, mLayerIndex, onionFrameNumber, mOptions.bColorizePrevOnion,
false );
break; }
141 case Layer::CAMERA:
break;
142 case Layer::SOUND:
break;
143 default: Q_ASSERT(
false );
break;
145 opacity = opacity - prevOpacityIncrement;
148 onionFrameNumber = layer->getPreviousFrameNumber(onionFrameNumber, mOptions.bIsOnionAbsolute);
153 if ( mOptions.bNextOnionSkin )
157 qreal nextOpacityIncrement = (maxOpacity - minOpacity) / mOptions.nNextOnionSkinCount;
158 qreal opacity = maxOpacity;
160 int onionFrameNumber = layer->getNextFrameNumber(mFrameNumber, mOptions.bIsOnionAbsolute);
161 int onionPosition = 0;
163 while (onionPosition < mOptions.nNextOnionSkinCount && onionFrameNumber > 0)
165 painter.setOpacity( opacity );
167 switch ( layer->type() )
169 case Layer::BITMAP: { paintBitmapFrame( painter, mLayerIndex, onionFrameNumber, mOptions.bColorizeNextOnion,
false );
break; }
170 case Layer::VECTOR: { paintVectorFrame( painter, mLayerIndex, onionFrameNumber, mOptions.bColorizeNextOnion,
false );
break; }
171 case Layer::CAMERA:
break;
172 case Layer::SOUND:
break;
173 default: Q_ASSERT(
false );
break;
176 opacity = opacity - nextOpacityIncrement;
178 onionFrameNumber = layer->getNextFrameNumber(onionFrameNumber, mOptions.bIsOnionAbsolute);
184 void CanvasRenderer::paintBitmapFrame( QPainter& painter,
188 bool useLastKeyFrame )
190 Layer* layer = mObject->getLayer( layerId );
192 if ( !layer->visible() )
198 if ( bitmapLayer ==
nullptr )
200 Q_ASSERT( bitmapLayer );
204 qCDebug( mLog ) <<
"Paint Onion skin bitmap, Frame = " << nFrame;
206 if (useLastKeyFrame) {
207 bitmapImage = bitmapLayer->getLastBitmapImageAtFrame( nFrame, 0 );
210 bitmapImage = bitmapLayer->getBitmapImageAtFrame( nFrame );
213 if ( bitmapImage ==
nullptr )
219 tempBitmapImage->paste(bitmapImage);
223 QBrush colorBrush = QBrush(Qt::transparent);
225 if (nFrame < mFrameNumber)
227 colorBrush = QBrush(Qt::red);
229 else if (nFrame > mFrameNumber)
231 colorBrush = QBrush(Qt::blue);
234 tempBitmapImage->drawRect( bitmapImage->bounds(),
237 QPainter::CompositionMode_SourceIn,
243 if (mRenderTransform && nFrame == mFrameNumber && layerId == mLayerIndex ) {
244 tempBitmapImage->clear(mSelection);
245 paintTransformedSelection(painter);
248 painter.setWorldMatrixEnabled(
true );
250 if (mRenderTransform && nFrame) {
251 painter.setOpacity( bitmapLayer->getOpacity() );
254 tempBitmapImage->paintImage( painter );
256 delete tempBitmapImage;
259 void CanvasRenderer::paintVectorFrame( QPainter& painter,
263 bool useLastKeyFrame )
265 Layer* layer = mObject->getLayer( layerId );
267 if ( !layer->visible() )
273 if ( vectorLayer ==
nullptr )
275 Q_ASSERT( vectorLayer );
279 qCDebug( mLog ) <<
"Paint Onion skin vector, Frame = " << nFrame;
283 vectorImage = vectorLayer->getLastVectorImageAtFrame( nFrame, 0 );
287 vectorImage = vectorLayer->getVectorImageAtFrame( nFrame );
289 if ( vectorImage ==
nullptr )
294 QImage* pImage =
new QImage( mCanvas->size(), QImage::Format_ARGB32_Premultiplied );
295 vectorImage->outputImage( pImage, mViewTransform, mOptions.bOutlines, mOptions.bThinLines, mOptions.bAntiAlias );
303 tempBitmapImage->setImage(pImage);
307 QBrush colorBrush = QBrush(Qt::transparent);
309 if (nFrame < mFrameNumber)
311 colorBrush = QBrush(Qt::red);
313 else if (nFrame > mFrameNumber)
315 colorBrush = QBrush(Qt::blue);
318 tempBitmapImage->drawRect( pImage->rect(),
321 QPainter::CompositionMode_SourceIn,
325 painter.setWorldMatrixEnabled(
false );
326 tempBitmapImage->paintImage( painter );
328 delete tempBitmapImage;
331 void CanvasRenderer::paintTransformedSelection( QPainter& painter )
335 if (mSelection.width() == 0 || mSelection.height() == 0) {
339 Layer* layer = mObject->getLayer( mLayerIndex );
341 if (layer->type() == Layer::BITMAP) {
345 BitmapImage* bitmapImage =
dynamic_cast< LayerBitmap*
>( layer )->getLastBitmapImageAtFrame( mFrameNumber, 0 );
347 BitmapImage transformedImage = bitmapImage->transformed(mSelection, mSelectionTransform, mOptions.bAntiAlias);
352 painter.setWorldMatrixEnabled(
true );
353 transformedImage.paintImage(painter);
357 void CanvasRenderer::paintCurrentFrame( QPainter& painter )
359 bool isCamera = mObject->getLayer(mLayerIndex)->type() == Layer::CAMERA;
360 for (
int i = 0; i < mObject->getLayerCount(); ++i )
362 Layer* layer = mObject->getLayer( i );
363 if ( i == mLayerIndex || mOptions.nShowAllLayers != 1 )
365 painter.setOpacity( 1.0 );
366 }
else if ( isCamera !=
true ) {
368 painter.setOpacity( 0.8 );
371 if ( i == mLayerIndex || mOptions.nShowAllLayers > 0 ) {
372 switch ( layer->type() )
374 case Layer::BITMAP: { paintBitmapFrame( painter, i, mFrameNumber );
break; }
375 case Layer::VECTOR: { paintVectorFrame( painter, i, mFrameNumber );
break; }
376 case Layer::CAMERA:
break;
377 case Layer::SOUND:
break;
378 default: Q_ASSERT(
false );
break;
384 void CanvasRenderer::paintAxis( QPainter& painter )
386 painter.setPen( Qt::green );
387 painter.drawLine( QLineF( 0, -500, 0, 500 ) );
389 painter.setPen( Qt::red );
390 painter.drawLine( QLineF( -500, 0, 500, 0 ) );
393 int round100(
double f,
int gridSize )
395 return static_cast< int >( f ) / gridSize * gridSize;
398 void CanvasRenderer::paintGrid( QPainter& painter )
400 int gridSize = mOptions.nGridSize;
402 QRectF rect = painter.viewport();
403 QRectF boundingRect = mViewTransform.inverted().mapRect( rect );
408 int left = round100( boundingRect.left(), gridSize ) - gridSize;
409 int right = round100( boundingRect.right(), gridSize ) + gridSize;
410 int top = round100( boundingRect.top(), gridSize ) - gridSize;
411 int bottom = round100( boundingRect.bottom(), gridSize ) + gridSize;
413 QPen pen( Qt::lightGray );
414 pen.setCosmetic(
true );
415 painter.setPen( pen );
416 painter.setWorldMatrixEnabled(
true );
417 painter.setBrush( Qt::NoBrush );
418 QPainter::RenderHints previous_renderhints = painter.renderHints();
419 painter.setRenderHint( QPainter::Antialiasing,
false );
420 for (
int x = left; x < right; x += gridSize )
422 painter.drawLine( x, top, x, bottom );
425 for (
int y = top; y < bottom; y += gridSize )
427 painter.drawLine( left, y, right, y );
429 painter.setRenderHints(previous_renderhints);
432 void CanvasRenderer::renderGrid(QPainter& painter)
434 if ( mOptions.bGrid )
436 painter.setWorldTransform( mViewTransform );
437 paintGrid( painter );
441 void CanvasRenderer::paintCameraBorder(QPainter &painter)
444 for (
int i = 0; i < mObject->getLayerCount(); ++i )
446 Layer* layer = mObject->getLayer( i );
448 if ( layer->type() == Layer::CAMERA && (i == mLayerIndex || mOptions.nShowAllLayers > 0) && layer->visible() ) {
450 if ( i == mLayerIndex || mOptions.nShowAllLayers != 1 )
452 painter.setOpacity( 1.0 );
455 painter.setOpacity( 0.8 );
458 QRectF viewRect = painter.viewport();
459 QRect boundingRect = mViewTransform.inverted().mapRect( viewRect ).toRect();
464 mCameraRect = cameraLayer->getViewRect();
466 painter.setWorldMatrixEnabled(
true );
467 painter.setPen( Qt::NoPen );
468 painter.setBrush( QColor( 0, 0, 0, 160 ) );
470 QRegion rg1(boundingRect);
471 QRegion rg2(mCameraRect);
472 QRegion rg3=rg1.subtracted(rg2);
474 painter.setClipRegion(rg3);
476 painter.drawRect( boundingRect );
478 painter.setClipping(
false);
485 painter.setPen( pen );
486 painter.setBrush( Qt::NoBrush );
487 painter.drawRect( mCameraRect.adjusted( -1, -1, 1, 1) );
492 QRect CanvasRenderer::getCameraRect()