Skip to content

Commit 3130364

Browse files
authored
Merge pull request #2822 from udifuchs/fix-wx-svg
Fix wx.svg to work with cython 3.1 generated code.
2 parents e56fc57 + 7c7a7ee commit 3130364

File tree

3 files changed

+63
-18
lines changed

3 files changed

+63
-18
lines changed

unittests/test_dcsvg.py

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import unittest
22
from unittests import wtc
33
import wx
4-
import sys
4+
import wx.svg
55
import os
66

77
fileName = 'svgtest.svg'
@@ -15,8 +15,44 @@ def test_SvgDC1(self):
1515
dc.DrawLine(0,0, 50,50)
1616
del dc
1717

18+
self.img = wx.svg.SVGimage.CreateFromFile(fileName)
19+
20+
dc = wx.ClientDC(self.frame)
21+
dc.SetBackground(wx.Brush('white'))
22+
dc.Clear()
23+
24+
dcdim = min(self.frame.Size.width, self.frame.Size.height)
25+
imgdim = min(self.img.width, self.img.height)
26+
scale = dcdim / imgdim
27+
28+
ctx = wx.GraphicsContext.Create(dc)
29+
self.img.RenderToGC(ctx, scale)
30+
1831
os.remove(fileName)
1932

33+
def test_SvgDC2(self):
34+
assert wx.svg.SVGpaintType.SVG_PAINT_NONE == wx.svg.SVG_PAINT_NONE
35+
assert wx.svg.SVGpaintType.SVG_PAINT_COLOR == wx.svg.SVG_PAINT_COLOR
36+
assert wx.svg.SVGpaintType.SVG_PAINT_LINEAR_GRADIENT == wx.svg.SVG_PAINT_LINEAR_GRADIENT
37+
assert wx.svg.SVGpaintType.SVG_PAINT_RADIAL_GRADIENT == wx.svg.SVG_PAINT_RADIAL_GRADIENT
38+
39+
assert wx.svg.SVGspreadType.SVG_SPREAD_PAD == wx.svg.SVG_SPREAD_PAD
40+
assert wx.svg.SVGspreadType.SVG_SPREAD_REFLECT == wx.svg.SVG_SPREAD_REFLECT
41+
assert wx.svg.SVGspreadType.SVG_SPREAD_REPEAT == wx.svg.SVG_SPREAD_REPEAT
42+
43+
assert wx.svg.SVGlineJoin.SVG_JOIN_MITER == wx.svg.SVG_JOIN_MITER
44+
assert wx.svg.SVGlineJoin.SVG_JOIN_ROUND == wx.svg.SVG_JOIN_ROUND
45+
assert wx.svg.SVGlineJoin.SVG_JOIN_BEVEL == wx.svg.SVG_JOIN_BEVEL
46+
47+
assert wx.svg.SVGlineCap.SVG_CAP_BUTT == wx.svg.SVG_CAP_BUTT
48+
assert wx.svg.SVGlineCap.SVG_CAP_ROUND == wx.svg.SVG_CAP_ROUND
49+
assert wx.svg.SVGlineCap.SVG_CAP_SQUARE == wx.svg.SVG_CAP_SQUARE
50+
51+
assert wx.svg.SVGfillRule.SVG_FILLRULE_NONZERO == wx.svg.SVG_FILLRULE_NONZERO
52+
assert wx.svg.SVGfillRule.SVG_FILLRULE_EVENODD == wx.svg.SVG_FILLRULE_EVENODD
53+
54+
assert wx.svg.SVGflags.SVG_FLAGS_VISIBLE == wx.svg.SVG_FLAGS_VISIBLE
55+
2056
#---------------------------------------------------------------------------
2157

2258

wx/svg/__init__.py

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -174,15 +174,15 @@ def RenderToGC(self, ctx, scale=None, size=None):
174174
ctx.Scale(sx, sy)
175175

176176
for shape in self.shapes:
177-
if not shape.flags & SVG_FLAGS_VISIBLE:
177+
if not shape.flags & SVGflags.SVG_FLAGS_VISIBLE:
178178
continue
179179
if shape.opacity != 1.0:
180180
ctx.BeginLayer(shape.opacity)
181181
brush = self._makeBrush(ctx, shape)
182182
pen = self._makePen(ctx, shape)
183183

184-
rule = { SVG_FILLRULE_NONZERO : wx.WINDING_RULE,
185-
SVG_FILLRULE_EVENODD : wx.ODDEVEN_RULE }.get(shape.fillRule, 0)
184+
rule = { SVGfillRule.SVG_FILLRULE_NONZERO : wx.WINDING_RULE,
185+
SVGfillRule.SVG_FILLRULE_EVENODD : wx.ODDEVEN_RULE }.get(shape.fillRule, 0)
186186

187187
# The shape's path is comprised of one or more subpaths, collect
188188
# and accumulate them in a new GraphicsPath
@@ -237,16 +237,16 @@ def _makeBrush(self, ctx, shape):
237237
# set up a brush from the shape.fill (SVGpaint) object
238238

239239
# no brush
240-
if shape.fill.type == SVG_PAINT_NONE:
240+
if shape.fill.type == SVGpaintType.SVG_PAINT_NONE:
241241
brush = wx.NullGraphicsBrush
242242

243243
# brush with a solid color
244-
elif shape.fill.type == SVG_PAINT_COLOR:
244+
elif shape.fill.type == SVGpaintType.SVG_PAINT_COLOR:
245245
r,g,b,a = shape.fill.color_rgba
246246
brush = ctx.CreateBrush(wx.Brush(wx.Colour(r,g,b,a)))
247247

248248
# brush with a linear gradient
249-
elif shape.fill.type == SVG_PAINT_LINEAR_GRADIENT:
249+
elif shape.fill.type == SVGpaintType.SVG_PAINT_LINEAR_GRADIENT:
250250
# NanoSVG gives gradients their own transform which normalizes the
251251
# linear gradients to go from (0, 0) to (0,1) in the transformed
252252
# space. So once we have the transform set we can use those points
@@ -271,7 +271,7 @@ def _makeBrush(self, ctx, shape):
271271
brush = ctx.CreateLinearGradientBrush(x1,y1, x2,y2, stops, matrix)
272272

273273
# brush with a radial gradient
274-
elif shape.fill.type == SVG_PAINT_RADIAL_GRADIENT:
274+
elif shape.fill.type == SVGpaintType.SVG_PAINT_RADIAL_GRADIENT:
275275
# Likewise, NanoSVG normalizes radial gradients with a transform
276276
# that puts the center (cx, cy) at (0,0) and the radius has a length
277277
# of 1.
@@ -299,24 +299,24 @@ def _makeBrush(self, ctx, shape):
299299
def _makePen(self, ctx, shape):
300300
# set up a pen from the shape.stroke (SVGpaint) object
301301
width = shape.strokeWidth
302-
join = { SVG_JOIN_MITER : wx.JOIN_MITER,
303-
SVG_JOIN_ROUND : wx.JOIN_ROUND,
304-
SVG_JOIN_BEVEL : wx.JOIN_BEVEL}.get(shape.strokeLineJoin, 0)
305-
cap = { SVG_CAP_BUTT : wx.CAP_BUTT,
306-
SVG_CAP_ROUND : wx.CAP_ROUND,
307-
SVG_CAP_SQUARE : wx.CAP_PROJECTING}.get(shape.strokeLineCap, 0)
302+
join = { SVGlineJoin.SVG_JOIN_MITER : wx.JOIN_MITER,
303+
SVGlineJoin.SVG_JOIN_ROUND : wx.JOIN_ROUND,
304+
SVGlineJoin.SVG_JOIN_BEVEL : wx.JOIN_BEVEL}.get(shape.strokeLineJoin, 0)
305+
cap = { SVGlineCap.SVG_CAP_BUTT : wx.CAP_BUTT,
306+
SVGlineCap.SVG_CAP_ROUND : wx.CAP_ROUND,
307+
SVGlineCap.SVG_CAP_SQUARE : wx.CAP_PROJECTING}.get(shape.strokeLineCap, 0)
308308
# TODO: handle dashes
309309

310310
info = wx.GraphicsPenInfo(wx.BLACK).Width(width).Join(join).Cap(cap)
311311

312-
if shape.stroke.type == SVG_PAINT_NONE:
312+
if shape.stroke.type == SVGpaintType.SVG_PAINT_NONE:
313313
pen = wx.NullGraphicsPen
314314

315-
elif shape.stroke.type == SVG_PAINT_COLOR:
315+
elif shape.stroke.type == SVGpaintType.SVG_PAINT_COLOR:
316316
info.Colour(shape.stroke.color_rgba)
317317
pen = ctx.CreatePen(info)
318318

319-
elif shape.stroke.type == SVG_PAINT_LINEAR_GRADIENT:
319+
elif shape.stroke.type == SVGpaintType.SVG_PAINT_LINEAR_GRADIENT:
320320
x1, y1, = (0.0, 0.0)
321321
x2, y2, = (0.0, 1.0)
322322
gradient = shape.stroke.gradient
@@ -333,7 +333,7 @@ def _makePen(self, ctx, shape):
333333
info.LinearGradient(x1,y1, x2,y2, stops, matrix)
334334
pen = ctx.CreatePen(info)
335335

336-
elif shape.stroke.type == SVG_PAINT_RADIAL_GRADIENT:
336+
elif shape.stroke.type == SVGpaintType.SVG_PAINT_RADIAL_GRADIENT:
337337
cx, cy = (0.0, 0.0)
338338
radius = 1
339339
gradient = shape.stroke.gradient

wx/svg/_nanosvg.pyx

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,15 @@ cpdef enum SVGfillRule:
7777
cpdef enum SVGflags:
7878
SVG_FLAGS_VISIBLE = NSVG_FLAGS_VISIBLE
7979

80+
# Populate the module namespace with enum values to keep compatibility with packages
81+
# compiled with cython > 3.1 (see https://github.com/cython/cython/issues/4571)
82+
globals().update(getattr(SVGpaintType, "__members__"))
83+
globals().update(getattr(SVGspreadType, "__members__"))
84+
globals().update(getattr(SVGlineJoin, "__members__"))
85+
globals().update(getattr(SVGlineCap, "__members__"))
86+
globals().update(getattr(SVGfillRule, "__members__"))
87+
globals().update(getattr(SVGflags, "__members__"))
88+
8089

8190
#----------------------------------------------------------------------------
8291
# Cython classes for wrapping the nanosvg structs

0 commit comments

Comments
 (0)