Fixed (lazy) initialization of CairoGraphicsContext
A CairoGraphicsContext may exist without a GC / Cairo created. Once
GC and Cairo is initialized for given drawable, all properties like
font, linewidth, colors and so on has to be set in Cairo. Like with
native GC, this is done in #initCR.
SimleView>>cairoify now cairoifies view and all its children.
"{ Package: 'stx:goodies/libcairo' }"!
!DeviceGraphicsContext methodsFor:'accessing'!
cairo
"Return a Cairo context for drawing onto this GC"
| cr |
cr := Cairo::GraphicsContext onSurface: self cairoSurface.
transformation notNil ifTrue:[
cr transformation: transformation
].
^ cr
"Created: / 26-12-2014 / 23:28:49 / Jan Vrany <jan.vrany@fit.cvut.cz>"
"Modified: / 13-02-2016 / 15:59:05 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !
!DeviceGraphicsContext methodsFor:'accessing'!
cairoSurface
| view surface |
view := device viewFromId:drawableId.
surface := Cairo::Surface onView: view.
^ surface
"Modified: / 14-02-2016 / 00:10:01 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !
!DeviceGraphicsContext methodsFor:'cairo support'!
drawableId
^drawableId
"Created: / 10-07-2008 / 10:20:04 / Jan Vrany <vranyj1@fel.cvut.cz>"
! !
!GraphicsContext methodsFor:'drawing in device coordinates'!
displayDeviceLineFromX:x1 y:y1 toX:x2 y:y2
"draw a line in device coordinates"
|sav|
sav := transformation.
self transformation: nil.
self displayLineFromX:x1 y:y1 toX:x2 y:y2.
self transformation: sav
"Created: / 01-01-2015 / 22:50:49 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !
!GraphicsContext methodsFor:'drawing in device coordinates'!
displayDeviceRectangleX:x y:y width:w height:h
"draw a rectangle in device coordinates"
|sav|
sav := transformation.
self transformation: nil.
self displayRectangleX:x y:y width:w height:h.
self transformation: sav
"Created: / 01-01-2015 / 22:51:09 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !
!GraphicsContext methodsFor:'drawing in device coordinates'!
fillDeviceRectangleX:x y:y width:w height:h
"fill a rectangle with current paint color (device coordinates)"
|sav|
sav := transformation.
self transformation: nil.
self fillRectangleX:x y:y width:w height:h.
self transformation: sav
"Created: / 01-01-2015 / 22:51:22 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !
!GraphicsDevice methodsFor:'cairo support'!
cairoSurfaceFor: view
self error:'Graphics device not supported'
"Created: / 10-07-2008 / 10:16:21 / Jan Vrany <vranyj1@fel.cvut.cz>"
! !
!GraphicsDevice methodsFor:'accessing'!
displayId
^ displayId
"Created: / 04-07-2008 / 12:58:56 / Jan Vrany <vranyj1@fel.cvut.cz>"
! !
!GraphicsMedium methodsFor:'misc'!
cairoify
"Change to use Cairo for rendering"
gc := CairoGraphicsContext onDeviceGraphicsContext:gc.
"Created: / 15-02-2016 / 21:24:41 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !
!Image methodsFor:'accessing'!
bitsARGB32Into: buffer stride: stride fg: fg bg: bg
| aOffset rOffset gOffset bOffset |
UninterpretedBytes isBigEndian ifTrue:[
aOffset := 1.
rOffset := 2.
gOffset := 3.
bOffset := 4.
] ifFalse:[
aOffset := 4.
rOffset := 3.
gOffset := 2.
bOffset := 1.
].
0 to: height - 1 do:[:y |
| base |
base := y * stride.
0 to: width - 1 do:[:x |
| pixel color offset |
offset := base + (x * 4).
(mask isNil or:[ (mask pixelAtX: x y:y) == 1 ]) ifTrue:[
pixel := self pixelAtX: x y: y.
color := self colorFromValue: pixel.
buffer at: (offset + rOffset) put: color redByte.
buffer at: (offset + gOffset) put: color greenByte.
buffer at: (offset + bOffset) put: color blueByte.
buffer at: (offset + aOffset) put: 16rFF.
] ifFalse:[
buffer at: (offset + rOffset) put: 0.
buffer at: (offset + gOffset) put: 0.
buffer at: (offset + bOffset) put: 0.
buffer at: (offset + aOffset) put: 0.
].
]
]
"Created: / 31-12-2014 / 13:08:46 / Jan Vrany <jan.vrany@fit.cvut.cz>"
"Modified: / 01-01-2015 / 11:41:31 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !
!Image methodsFor:'inspecting'!
inspector2TabImageCairo
<inspector2Tab>
| view |
view := PluggableView new.
view redrawAction:[
| cr |
cr := view cairo.
[
self displayOn: cr
] ensure:[
cr release.
].
].
^self newInspector2Tab
label: 'Image (Cairo)';
priority: 49;
view: (HVScrollableView forView: view);
yourself
"Created: / 31-12-2014 / 12:01:07 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !
!SimpleView methodsFor:'accessing - cairo'!
cairo
"Return a Cairo context for drawing onto this view"
^ gc cairo
"Created: / 10-09-2008 / 18:23:11 / Jan Vrany <vranyj1@fel.cvut.cz>"
"Modified (comment): / 26-12-2014 / 23:29:09 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !
!SimpleView methodsFor:'misc'!
cairoify
super cairoify.
self subViews do:[:each | each cairoify ].
"Created: / 18-02-2016 / 22:43:04 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !
!SimpleView methodsFor:'redrawing - cairo'!
redrawWithCairo
| cr |
cr := self cairo.
[
self redrawWithCairo: cr
] ensure:[
cr ~~ gc ifTrue:[ cr release ].
].
"Created: / 27-12-2014 / 00:30:15 / Jan Vrany <jan.vrany@fit.cvut.cz>"
"Modified: / 12-02-2016 / 16:38:36 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !
!SimpleView methodsFor:'redrawing - cairo'!
redrawWithCairo: cr x: x y: y width: w height: h
cr rectangleX: x y: y width: w height: h.
cr clip.
self redrawWithCairo: cr
"Created: / 27-12-2014 / 00:29:03 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !
!SimpleView methodsFor:'redrawing - cairo'!
redrawWithCairoBuffered
| cr |
cr := self cairo.
[
self redrawWithCairoBuffered: cr
] ensure:[
cr ~~ gc ifTrue:[ cr release ].
].
"Created: / 27-12-2014 / 00:30:27 / Jan Vrany <jan.vrany@fit.cvut.cz>"
"Modified: / 12-02-2016 / 16:38:44 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !
!SimpleView methodsFor:'redrawing - cairo'!
redrawWithCairoBuffered: view_cr
| image_surface image_cr |
[
image_surface := Cairo::Surface newImageWithFormatARGB32width:self width
height:self height.
image_cr := Cairo::GraphicsContext onSurface: image_surface.
self redrawWithCairo: image_cr.
view_cr setSourceSurface: image_surface.
view_cr draw.
] ensure:[
image_surface notNil ifTrue:[ image_surface release ].
image_cr notNil ifTrue:[ image_cr release ]
].
"Created: / 27-12-2014 / 00:13:29 / Jan Vrany <jan.vrany@fit.cvut.cz>"
"Modified: / 14-02-2016 / 00:13:11 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !
!SimpleView methodsFor:'redrawing - cairo'!
redrawWithCairoBuffered: view_cr x: x y: y width: w height: h
| image_surface image_cr |
[
image_surface := Cairo::Surface newImageWithFormatARGB32width:self width
height:self height.
image_cr := Cairo::GraphicsContext onSurface: image_surface.
image_cr rectangleX: x y: y width: w height: h.
image_cr clip.
self redrawWithCairo: image_cr x: x y: y width: w height: h.
view_cr rectangleX: x y: y width: w height: h.
view_cr clip.
view_cr setSourceSurface: image_surface.
view_cr paint.
] ensure:[
image_surface notNil ifTrue:[ image_surface release ].
image_cr notNil ifTrue:[ image_cr release ]
].
"Created: / 27-12-2014 / 00:28:37 / Jan Vrany <jan.vrany@fit.cvut.cz>"
"Modified: / 14-02-2016 / 00:12:03 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !
!SimpleView methodsFor:'redrawing - cairo'!
redrawWithCairoBufferedX: x y: y width: w height: h
| cr |
cr := self cairo.
[
self redrawWithCairoBuffered: cr x: x y: y width: w height: h
] ensure:[
cr ~~ gc ifTrue:[ cr release ].
].
"Created: / 27-12-2014 / 00:31:33 / Jan Vrany <jan.vrany@fit.cvut.cz>"
"Modified: / 12-02-2016 / 16:38:10 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !
!SimpleView methodsFor:'redrawing - cairo'!
redrawWithCairoX: x y: y width: w height: h
| cr |
cr := self cairo.
[
self redrawWithCairo: cr x: x y: y width: w height: h
] ensure:[
cr ~~ gc ifTrue:[ cr release ].
].
"Created: / 27-12-2014 / 00:31:22 / Jan Vrany <jan.vrany@fit.cvut.cz>"
"Modified: / 12-02-2016 / 16:38:58 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !
!stx_goodies_libcairo class methodsFor:'documentation'!
extensionsVersion_HG
^ '$Changeset: <not expanded> $'
! !