15
15
from .transforms import (Bbox , IdentityTransform , TransformedBbox ,
16
16
TransformedPatchPath , TransformedPath , Transform )
17
17
from .path import Path
18
-
18
+ from functools import wraps
19
+ from contextlib import contextmanager
19
20
# Note, matplotlib artists use the doc strings for set and get
20
21
# methods to enable the introspection methods of setp and getp. Every
21
22
# set_* method should have a docstring containing the line
@@ -42,31 +43,30 @@ def allow_rasterization(draw):
42
43
other setup function calls, such as starting and flushing a mixed-mode
43
44
renderer.
44
45
"""
45
- def before (artist , renderer ):
46
+ @contextmanager
47
+ def with_rasterized (artist , renderer ):
48
+
46
49
if artist .get_rasterized ():
47
50
renderer .start_rasterizing ()
48
51
49
52
if artist .get_agg_filter () is not None :
50
53
renderer .start_filter ()
51
54
52
- def after (artist , renderer ):
53
-
54
- if artist .get_agg_filter () is not None :
55
- renderer .stop_filter (artist .get_agg_filter ())
55
+ try :
56
+ yield
57
+ finally :
58
+ if artist .get_agg_filter () is not None :
59
+ renderer .stop_filter (artist .get_agg_filter ())
56
60
57
- if artist .get_rasterized ():
58
- renderer .stop_rasterizing ()
61
+ if artist .get_rasterized ():
62
+ renderer .stop_rasterizing ()
59
63
60
64
# the axes class has a second argument inframe for its draw method.
65
+ @wraps (draw )
61
66
def draw_wrapper (artist , renderer , * args , ** kwargs ):
62
- before (artist , renderer )
63
- draw (artist , renderer , * args , ** kwargs )
64
- after (artist , renderer )
65
-
66
- # "safe wrapping" to exactly replicate anything we haven't overridden above
67
- draw_wrapper .__name__ = draw .__name__
68
- draw_wrapper .__dict__ = draw .__dict__
69
- draw_wrapper .__doc__ = draw .__doc__
67
+ with with_rasterized (artist , renderer ):
68
+ return draw (artist , renderer , * args , ** kwargs )
69
+
70
70
draw_wrapper ._supports_rasterization = True
71
71
return draw_wrapper
72
72
0 commit comments