Completed
Push — master ( 44ec51...0333f2 )
by Erik
15s queued 11s
created

pypen.drawing.pypen_class.PyPen.reset_style()   A

Complexity

Conditions 1

Size

Total Lines 4
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 4
nop 1
dl 0
loc 4
rs 10
c 0
b 0
f 0
1
import ctypes
2
3
from pypen.drawing.color import Color
4
from pypen.utils.math import TAU
5
from pypen.settings import default_settings 
6
import cairo
7
from pyglet import gl, image
8
9
class PyPen():
10
    def __init__(self, user_sketch):
11
        self.user_sketch = user_sketch
12
13
        self.surface_data = None
14
        self.surface = None
15
        self.context = None
16
17
        self.update_settings()
18
        self._fix_primitive_functions()
19
20
    def _fix_primitive_functions(self):
21
        self.user_sketch.fill_screen = self.fill_screen
22
        self.user_sketch.clear_screen = self.clear_screen
23
        self.user_sketch.clear = self.clear
24
25
        self.user_sketch.rectangle = self.rectangle
26
        self.user_sketch.circle = self.circle
27
        self.user_sketch.ellipse = self.ellipse
28
        self.user_sketch.arc = self.arc
29
30
        self.user_sketch.arc = self.arc
31
32
        self.user_sketch.rotate = self.rotate
33
        self.user_sketch.translate = self.translate
34
        self.user_sketch.scale = self.scale
35
        self.user_sketch.save = self.save
36
        self.user_sketch.restore = self.restore
37
38
        self.user_sketch.reset_style = self.reset_style
39
40
    def _fill(self, unparsed_fill_color):
41
        if unparsed_fill_color != "":
42
            self.user_sketch.settings.fill_color = unparsed_fill_color
43
44
        fill_color = Color.from_user_input(self.user_sketch.settings.fill_color)
45
        self.context.set_source_rgba(*fill_color.rgba())
46
        self.context.fill()
47
48
    def _stroke(self, unparsed_stroke_color, unparsed_stroke_width):
49
        if unparsed_stroke_color != "":
50
            self.user_sketch.settings.stroke_color = unparsed_stroke_color
51
52
        if unparsed_stroke_width >= 0:
53
            self.user_sketch.settings.stroke_width = unparsed_stroke_width
54
55
        stroke_color = Color.from_user_input(self.user_sketch.settings.stroke_color)
56
        stroke_width = self.user_sketch.settings.stroke_width
57
58
        self.context.set_line_width(stroke_width)
59
        self.context.set_source_rgba(*stroke_color.rgba())
60
        self.context.stroke_preserve()
61
62
    def rotate(self, angle=0):
63
        self.context.rotate(angle)
64
65
    def translate(self, x=0, y=0):
66
        self.context.translate(x, y)
67
68
    def scale(self, factor=1):
69
        self.context.scale(factor)
70
71
    def save(self):
72
        self.context.save()
73
74
    def restore(self):
75
        self.context.restore()
76
77
    def reset_style(self):
78
        self.user_sketch.settings.fill_color = default_settings.fill_color
79
        self.user_sketch.settings.stroke_color = default_settings.stroke_color
80
        self.user_sketch.settings.stroke_width = default_settings.stroke_width
81
82
    def update_settings(self):
83
        self.surface_data = (ctypes.c_ubyte * (self.user_sketch.settings.width * self.user_sketch.settings.height * 4))()
84
        self.surface = cairo.ImageSurface.create_for_data(self.surface_data,
85
                                                          cairo.FORMAT_ARGB32,
86
                                                          self.user_sketch.settings.width,
87
                                                          self.user_sketch.settings.height,
88
                                                          self.user_sketch.settings.width * 4)
89
        self.context = cairo.Context(self.surface)
90
        self.texture = image.Texture.create_for_size(gl.GL_TEXTURE_2D, self.user_sketch.settings.width, self.user_sketch.settings.height, gl.GL_RGBA)
91
92
    def clear_screen(self):
93
        self.fill_screen("default_background_color")
94
95
    def clear(self):
96
        self.clear_screen()
97
98
    def fill_screen(self, color="default_background_color"):
99
        background_color = Color.from_user_input(color)
100
        self.context.save()
101
        self.context.scale(self.user_sketch.settings.width, self.user_sketch.settings.height)
102
        self.context.rectangle(0, 0, 1, 1)
103
        self.context.set_source_rgba(*background_color.rgba())
104
        self.context.fill()
105
        self.context.restore()
106
107
    def rectangle(self, x, y, width, height, fill_color="", stroke_color="", stroke_width=-1):
108
        self.context.rectangle(x, y, width, height)
109
        self._stroke(stroke_color, stroke_width)
110
        self._fill(fill_color)
111
112
    def circle(self, x, y, radius, fill_color="", stroke_color="", stroke_width=-1):
113
        self.context.arc(x, y, radius, 0, TAU)
114
        self._stroke(stroke_color, stroke_width)
115
        self._fill(fill_color)
116
117
    def ellipse(self, x, y, width, height, fill_color="", stroke_color="", stroke_width=-1):
118
        ratio = height/width
119
        self.save()
120
        self.context.scale(1, ratio)
121
        self.context.arc(x, y/ratio, width, 0, TAU)
122
        self.restore()
123
        self._stroke(stroke_color, stroke_width)
124
        self._fill(fill_color)
125
126
    def arc(self, x, y, radius, start_angle, stop_angle, fill_color="", stroke_color="", stroke_width=-1):
127
        self.context.arc(x, y, radius, start_angle, stop_angle)
128
        self._stroke(stroke_color, stroke_width)
129
        self._fill(fill_color)
130