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

Special Effects with Qt Graphics View

May 10, 2015

Download

Technology

Qt Project

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
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
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