Special Effects with Qt Graphics View

76
Special F/X with Graphics View Ariya Hidayat 09/25/09

description

Graphics View becomes one of the prominent features of Qt these days, it also serves as the backbone for next-generation user-interface developments. This talk highlights several tips and tricks which you can employ to beautify your Graphics View-based application, in order to have much more exciting and interesting user interactions. In addition, a new addition in Qt 4.6, namely the graphics effect feature, will be introduced and demonstrated. Presentation by Ariya Hidayat held during Qt Developer Days 2009. http://qt.nokia.com/developer/learning/elearning

Transcript of Special Effects with Qt Graphics View

Page 1: Special Effects with Qt Graphics View

Special F/X with Graphics ViewAriya Hidayat 09/25/09

Page 2: Special Effects with Qt Graphics View

About Myself

2

Open-source Developer

Ph.D in EE

Page 3: Special Effects with Qt Graphics View

Agenda

Four Dot Five– What you can do already

Four Dot Six– What you can (ab)use soon

3

Page 4: Special Effects with Qt Graphics View

Goals

Provoke ideas!

Incite passion!

Engage creativity!

4

Page 5: Special Effects with Qt Graphics View

A Word of Caution

With great power must come great responsibility.

5

Page 6: Special Effects with Qt Graphics View

Spread the Love

All examples are available from...

6

labs.qt.nokia.com

bit.ly/graphicsdojo

Page 7: Special Effects with Qt Graphics View

Qt 4.5

7

Page 8: Special Effects with Qt Graphics View

Gradients

Transformation

Animation, Kinetic Scrolling

Composition Modes

8

Page 9: Special Effects with Qt Graphics View

Linear Gradient

9

Page 10: Special Effects with Qt Graphics View

Radial Gradient

10

Page 11: Special Effects with Qt Graphics View

Gradients: Quick Recipe

11

Applies to: QAbstractGraphicsShapeItem

QGraphicsEllipseItem, QGraphicsPathItem, QGraphicsPolygonItem, QGraphicsRectItem

or your own subclass(es).

Classes to use:– QLinearGradient– QRadialGradient– QConicalGradient

Page 12: Special Effects with Qt Graphics View

Linear Gradient: The Code

12

QPoint start(0, 0);QPoint end(0, 20);

QLinearGradient g(start, end);g.setColorAt(0, Qt::white);g.setColorAt(1, Qt::black);

item->setBrush(g);

Page 13: Special Effects with Qt Graphics View

Radial Gradient: The Code

13

QRadialGradient gr(100, 100, 100, 60, 60);gr.setColorAt(0.0, QColor(255, 255, 255, 191));gr.setColorAt(0.2, QColor(255, 255, 127, 191));gr.setColorAt(0.9, QColor(150, 150, 200, 63));p.setBrush(gr);p.drawEllipse(0, 0, 200, 200);

Page 14: Special Effects with Qt Graphics View

Shadow with Gradients

14

magnifier

Page 15: Special Effects with Qt Graphics View

Shadow: The Code

15

QRadialGradient g;g.setCenter(radius, radius);g.setFocalPoint(radius, radius);g.setRadius(radius);g.setColorAt(1.0, QColor(255, 255, 255, 0));g.setColorAt(0.5, QColor(128, 128, 128, 255));

QPainter mask(&maskPixmap);mask.setCompositionMode (QPainter::CompositionMode_Source);mask.setBrush(g);mask.drawRect(maskPixmap.rect());mask.setBrush(QColor(Qt::transparent));mask.drawEllipse(g.center(), radius-15, radius-15);mask.end();

Page 16: Special Effects with Qt Graphics View

Translucent Reflection

16

Page 17: Special Effects with Qt Graphics View

Flip Vertically

17

QImage::mirrored()

Page 18: Special Effects with Qt Graphics View

More Natural Look

18

Linear gradient, on the alpha channel

Page 19: Special Effects with Qt Graphics View

Reflection: The Code

19

QPoint start(0, 0);QPoint end(0, img.height());QLinearGradient gradient(start, end);gradient.setColorAt(0.5, Qt::black);gradient.setColorAt(0, Qt::white);

QImage mask = img;QPainter painter(&mask);painter.fillRect(img.rect(), gradient);painter.end();

QImage reflection = img.mirrored();reflection.setAlphaChannel(mask);

Page 20: Special Effects with Qt Graphics View

Opacity

20

QPainter::setOpacity(...)

Page 21: Special Effects with Qt Graphics View

Transformation

21

Scaling Rotation Perspective

Page 22: Special Effects with Qt Graphics View

Rotation

22

transform.rotate(30, Qt::ZAxis)

Page 23: Special Effects with Qt Graphics View

Perspective Transformation: The Recipe

23

transform.rotate(60, Qt::YAxis)

transform.rotate(60, Qt::XAxis)

Page 24: Special Effects with Qt Graphics View

Reflection & Transformation

24

Page 25: Special Effects with Qt Graphics View

Timeline-based Animation

25

acceleration

deacceleration

Page 26: Special Effects with Qt Graphics View

Linear Motion vs Non-linear Motion

2626

EaseInOutLinear

acceleration

deacceleration

Page 27: Special Effects with Qt Graphics View

Flick List (or Kinetic Scrolling)

27

Page 28: Special Effects with Qt Graphics View

Using FlickCharm

28

QGraphicsView canvas;

FlickCharm charm;charm.activateOn(&canvas);

Page 29: Special Effects with Qt Graphics View

Flick Charm & Event Filtering

29

Steady

Pressed

Manual Scroll

Auto Scroll

Stop

Mouse release

Mouse move

Mouse release

Mouse press

Mousemove

Timer tick

Mouse press

Page 30: Special Effects with Qt Graphics View

Parallax Effect

30

Page 31: Special Effects with Qt Graphics View

Composition Modes

31

Page 32: Special Effects with Qt Graphics View

Colorize (or Tint Effect)

32

Page 33: Special Effects with Qt Graphics View

Grayscale Conversion

33

int pixels = img.width() * img.height();unsigned int *data = (unsigned int *)img.bits();for (int i = 0; i < pixels; ++i) { int val = qGray(data[i]); data[i] = qRgb(val, val, val);}

Page 34: Special Effects with Qt Graphics View

Overlay with Color

34

QPainter painter(&resultImage);painter.drawImage(0, 0, grayscaled(image));painter.setCompositionMode (QPainter::CompositionMode_Overlay);painter.fillRect(resultImage.rect(), color);painter.end();

Page 35: Special Effects with Qt Graphics View

Glow Effect

35

Page 36: Special Effects with Qt Graphics View

Night Mode

36

Page 37: Special Effects with Qt Graphics View

Night Mode with Color Inversion

37

QPainter p(this);p.setCompositionMode (QPainter::CompositionMode_Difference);p.fillRect(event->rect(), Qt::white);p.end();

red = 255 – red

green = 255 – green

blue = 255 - blue

Page 38: Special Effects with Qt Graphics View

A Friendly Advice: Fast Prototyping

38

– avoid long edit-compile-debug cycle– use JavaScript, e.g. with Qt Script– use Python, e.g. with PyQt or PySide– use <insert your favorite dynamic language>

Page 39: Special Effects with Qt Graphics View

Qt 4.6

39

Page 40: Special Effects with Qt Graphics View

Animation Framework

State Machine

Graphics Effects

40

Page 41: Special Effects with Qt Graphics View

Animation Framework

41

Page 42: Special Effects with Qt Graphics View

What People Want

42

– (soft) drop shadow– blur– colorize– some other random stuff

Page 43: Special Effects with Qt Graphics View

Graphics F/X

43

QGraphicsEffect

QGraphicsColorizeEffect

QGraphicsGrayscaleEffect

QGraphicsPixelizeEffect

QGraphicsBlurEffect

QGraphicsDropShadowEffect

QGraphicsOpacityEffect

Page 44: Special Effects with Qt Graphics View

Challenges

44

– software vs hardware– good API

Page 45: Special Effects with Qt Graphics View

Software vs Hardware

45

– software implementation• consistent and reliable• easy to test• cumbersome, (dog)slow

– hardware acceleration• blazing fast• custom effects are easy• silicon/driver dependent

Page 46: Special Effects with Qt Graphics View

API

One API to rule them all, ...

46

Page 47: Special Effects with Qt Graphics View

Simple API

47

– Effect is a QObject• might have property, e.g. Color• property change emits a signal• can be animated easily

– Effect applies to QGraphicsItem & QWidget– Custom effect? Subclass QGraphicsEffect

Page 48: Special Effects with Qt Graphics View

As Simple As...

48

QGraphicsGrayscaleEffect *effect;effect = new QGraphicsGrayscaleEffect;item->setGraphicsEffect(effect);

Effect is applied to the itemand its children!

Page 49: Special Effects with Qt Graphics View

Grayscale Effect

49

Page 50: Special Effects with Qt Graphics View

Grayscale Effect with Strength=0.8

50

Page 51: Special Effects with Qt Graphics View

Colorize Effect

51

Page 52: Special Effects with Qt Graphics View

Colorize Effect with Strength=0.8

52

Page 53: Special Effects with Qt Graphics View

Pixelize Effect

53

Page 54: Special Effects with Qt Graphics View

Blur Effect

54

Page 55: Special Effects with Qt Graphics View

Drop Shadow Effect

55

Page 56: Special Effects with Qt Graphics View

Lighting Example

56

Page 57: Special Effects with Qt Graphics View

Blur Picker Example

57

sharp

blurry

Page 58: Special Effects with Qt Graphics View

Fade Message Example

58

Something will happen

Page 59: Special Effects with Qt Graphics View

Scale Effect

59

Page 60: Special Effects with Qt Graphics View

Scale Effect Implementation

60

void draw(QPainter *painter, QGraphicsEffectSource *source) {

QPixmap pixmap; pixmap = source->pixmap(Qt::DeviceCoordinates);

painter->save(); painter->setBrush(Qt::NoBrush); painter->setPen(Qt::red); painter->drawRect(pixmap.rect());

painter->scale(0.5, 0.5); painter->translate(pixmap.rect().bottomRight()/2); painter->drawPixmap(0, 0, pixmap);

painter->restore();}

Page 61: Special Effects with Qt Graphics View

Night Mode Effect

61

Page 62: Special Effects with Qt Graphics View

Night Mode Effect Implementation

62

void draw(QPainter *painter, QGraphicsEffectSource *source) {

QPixmap pixmap; pixmap = source->pixmap(Qt::DeviceCoordinates);

QPainter p(&pixmap); p.setCompositionMode (QPainter::CompositionMode_Difference); p.fillRect(pixmap.rect(), Qt::white); p.end(); painter->drawPixmap(0, 0, pixmap);}

Page 63: Special Effects with Qt Graphics View

Frame Effect

63

Page 64: Special Effects with Qt Graphics View

Extending the Bounding Box

64

QRectF boundingRectFor(const QRectF &rect) const { return rect.adjusted(-5, -5, 5, 5);}

item bounding box

“effective” bounding box

Page 65: Special Effects with Qt Graphics View

Frame Effect Implementation

65

void draw(QPainter *painter, QGraphicsEffectSource *source) {

QPixmap pixmap; pixmap = source->pixmap(Qt::DeviceCoordinates); QRectF bound = boundingRectFor(pixmap.rect());

painter->save(); painter->setPen(Qt::NoPen); painter->setBrush(Qt::green); painter->drawRoundedRect(bound, 15, 15); painter->drawPixmap(0, 0, pixmap); painter->restore();}

Page 66: Special Effects with Qt Graphics View

Reflection Effect

66

Page 67: Special Effects with Qt Graphics View

Enlarging the Bounding Box (Again)

67

QRectF boundingRectFor(const QRectF &rect) const { return rect.adjusted(0, 0, 0, rect.height());}

item bounding box

“effective” bounding box

Page 68: Special Effects with Qt Graphics View

Reflection Effect Implementation

68

void draw(QPainter *painter, QGraphicsEffectSource *source) {

QPixmap pixmap; pixmap = source->pixmap(Qt::DeviceCoordinates);

painter->save(); painter->drawPixmap(0, 0, pixmap); painter->setOpacity(0.2); painter->scale(1, -1); painter->translate(0, -pixmap.height()); painter->drawPixmap(0, 0, pixmap); painter->restore();}

Page 69: Special Effects with Qt Graphics View

Qt 4.7?

Future?

69

Page 70: Special Effects with Qt Graphics View

Declarative UI

70

Page 71: Special Effects with Qt Graphics View

Further Directions

71

– Optimization!– Composite effects– Geometry deformation– Morphing– More physics: force, gravity, ...– Bitmap vs vector

Page 72: Special Effects with Qt Graphics View

Genie Effect

72

Page 73: Special Effects with Qt Graphics View

Deformation

73

Page 74: Special Effects with Qt Graphics View

Underwater Effect

74

Page 75: Special Effects with Qt Graphics View

Thank You!

75

That's all, folks...

Page 76: Special Effects with Qt Graphics View

Bleeding-Edge

76

labs.qt.nokia.com

bit.ly/graphicsdojo