• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1from fontTools.pens.basePen import BasePen, OpenContourError
2try:
3	import cython
4except ImportError:
5	# if cython not installed, use mock module with no-op decorators and types
6	from fontTools.misc import cython
7
8if cython.compiled:
9	# Yep, I'm compiled.
10	COMPILED = True
11else:
12	# Just a lowly interpreted script.
13	COMPILED = False
14
15
16__all__ = ["MomentsPen"]
17
18class MomentsPen(BasePen):
19
20	def __init__(self, glyphset=None):
21		BasePen.__init__(self, glyphset)
22
23		self.area = 0
24		self.momentX = 0
25		self.momentY = 0
26		self.momentXX = 0
27		self.momentXY = 0
28		self.momentYY = 0
29
30	def _moveTo(self, p0):
31		self.__startPoint = p0
32
33	def _closePath(self):
34		p0 = self._getCurrentPoint()
35		if p0 != self.__startPoint:
36			self._lineTo(self.__startPoint)
37
38	def _endPath(self):
39		p0 = self._getCurrentPoint()
40		if p0 != self.__startPoint:
41			# Green theorem is not defined on open contours.
42			raise OpenContourError(
43							"Green theorem is not defined on open contours."
44			)
45
46	@cython.locals(r0=cython.double)
47	@cython.locals(r1=cython.double)
48	@cython.locals(r2=cython.double)
49	@cython.locals(r3=cython.double)
50	@cython.locals(r4=cython.double)
51	@cython.locals(r5=cython.double)
52	@cython.locals(r6=cython.double)
53	@cython.locals(r7=cython.double)
54	@cython.locals(r8=cython.double)
55	@cython.locals(r9=cython.double)
56	@cython.locals(r10=cython.double)
57	@cython.locals(r11=cython.double)
58	@cython.locals(r12=cython.double)
59	@cython.locals(x0=cython.double, y0=cython.double)
60	@cython.locals(x1=cython.double, y1=cython.double)
61	def _lineTo(self, p1):
62		x0,y0 = self._getCurrentPoint()
63		x1,y1 = p1
64
65		r0 = x1*y0
66		r1 = x1*y1
67		r2 = x1**2
68		r3 = r2*y1
69		r4 = y0 - y1
70		r5 = r4*x0
71		r6 = x0**2
72		r7 = 2*y0
73		r8 = y0**2
74		r9 = y1**2
75		r10 = x1**3
76		r11 = y0**3
77		r12 = y1**3
78
79		self.area += -r0/2 - r1/2 + x0*(y0 + y1)/2
80		self.momentX += -r2*y0/6 - r3/3 - r5*x1/6 + r6*(r7 + y1)/6
81		self.momentY += -r0*y1/6 - r8*x1/6 - r9*x1/6 + x0*(r8 + r9 + y0*y1)/6
82		self.momentXX += -r10*y0/12 - r10*y1/4 - r2*r5/12 - r4*r6*x1/12 + x0**3*(3*y0 + y1)/12
83		self.momentXY += -r2*r8/24 - r2*r9/8 - r3*r7/24 + r6*(r7*y1 + 3*r8 + r9)/24 - x0*x1*(r8 - r9)/12
84		self.momentYY += -r0*r9/12 - r1*r8/12 - r11*x1/12 - r12*x1/12 + x0*(r11 + r12 + r8*y1 + r9*y0)/12
85
86	@cython.locals(r0=cython.double)
87	@cython.locals(r1=cython.double)
88	@cython.locals(r2=cython.double)
89	@cython.locals(r3=cython.double)
90	@cython.locals(r4=cython.double)
91	@cython.locals(r5=cython.double)
92	@cython.locals(r6=cython.double)
93	@cython.locals(r7=cython.double)
94	@cython.locals(r8=cython.double)
95	@cython.locals(r9=cython.double)
96	@cython.locals(r10=cython.double)
97	@cython.locals(r11=cython.double)
98	@cython.locals(r12=cython.double)
99	@cython.locals(r13=cython.double)
100	@cython.locals(r14=cython.double)
101	@cython.locals(r15=cython.double)
102	@cython.locals(r16=cython.double)
103	@cython.locals(r17=cython.double)
104	@cython.locals(r18=cython.double)
105	@cython.locals(r19=cython.double)
106	@cython.locals(r20=cython.double)
107	@cython.locals(r21=cython.double)
108	@cython.locals(r22=cython.double)
109	@cython.locals(r23=cython.double)
110	@cython.locals(r24=cython.double)
111	@cython.locals(r25=cython.double)
112	@cython.locals(r26=cython.double)
113	@cython.locals(r27=cython.double)
114	@cython.locals(r28=cython.double)
115	@cython.locals(r29=cython.double)
116	@cython.locals(r30=cython.double)
117	@cython.locals(r31=cython.double)
118	@cython.locals(r32=cython.double)
119	@cython.locals(r33=cython.double)
120	@cython.locals(r34=cython.double)
121	@cython.locals(r35=cython.double)
122	@cython.locals(r36=cython.double)
123	@cython.locals(r37=cython.double)
124	@cython.locals(r38=cython.double)
125	@cython.locals(r39=cython.double)
126	@cython.locals(r40=cython.double)
127	@cython.locals(r41=cython.double)
128	@cython.locals(r42=cython.double)
129	@cython.locals(r43=cython.double)
130	@cython.locals(r44=cython.double)
131	@cython.locals(r45=cython.double)
132	@cython.locals(r46=cython.double)
133	@cython.locals(r47=cython.double)
134	@cython.locals(r48=cython.double)
135	@cython.locals(r49=cython.double)
136	@cython.locals(r50=cython.double)
137	@cython.locals(r51=cython.double)
138	@cython.locals(r52=cython.double)
139	@cython.locals(r53=cython.double)
140	@cython.locals(x0=cython.double, y0=cython.double)
141	@cython.locals(x1=cython.double, y1=cython.double)
142	@cython.locals(x2=cython.double, y2=cython.double)
143	def _qCurveToOne(self, p1, p2):
144		x0,y0 = self._getCurrentPoint()
145		x1,y1 = p1
146		x2,y2 = p2
147
148		r0 = 2*y1
149		r1 = r0*x2
150		r2 = x2*y2
151		r3 = 3*r2
152		r4 = 2*x1
153		r5 = 3*y0
154		r6 = x1**2
155		r7 = x2**2
156		r8 = 4*y1
157		r9 = 10*y2
158		r10 = 2*y2
159		r11 = r4*x2
160		r12 = x0**2
161		r13 = 10*y0
162		r14 = r4*y2
163		r15 = x2*y0
164		r16 = 4*x1
165		r17 = r0*x1 + r2
166		r18 = r2*r8
167		r19 = y1**2
168		r20 = 2*r19
169		r21 = y2**2
170		r22 = r21*x2
171		r23 = 5*r22
172		r24 = y0**2
173		r25 = y0*y2
174		r26 = 5*r24
175		r27 = x1**3
176		r28 = x2**3
177		r29 = 30*y1
178		r30 = 6*y1
179		r31 = 10*r7*x1
180		r32 = 5*y2
181		r33 = 12*r6
182		r34 = 30*x1
183		r35 = x1*y1
184		r36 = r3 + 20*r35
185		r37 = 12*x1
186		r38 = 20*r6
187		r39 = 8*r6*y1
188		r40 = r32*r7
189		r41 = 60*y1
190		r42 = 20*r19
191		r43 = 4*r19
192		r44 = 15*r21
193		r45 = 12*x2
194		r46 = 12*y2
195		r47 = 6*x1
196		r48 = 8*r19*x1 + r23
197		r49 = 8*y1**3
198		r50 = y2**3
199		r51 = y0**3
200		r52 = 10*y1
201		r53 = 12*y1
202
203		self.area += -r1/6 - r3/6 + x0*(r0 + r5 + y2)/6 + x1*y2/3 - y0*(r4 + x2)/6
204		self.momentX += -r11*(-r10 + y1)/30 + r12*(r13 + r8 + y2)/30 + r6*y2/15 - r7*r8/30 - r7*r9/30 + x0*(r14 - r15 - r16*y0 + r17)/30 - y0*(r11 + 2*r6 + r7)/30
205		self.momentY += -r18/30 - r20*x2/30 - r23/30 - r24*(r16 + x2)/30 + x0*(r0*y2 + r20 + r21 + r25 + r26 + r8*y0)/30 + x1*y2*(r10 + y1)/15 - y0*(r1 + r17)/30
206		self.momentXX += r12*(r1 - 5*r15 - r34*y0 + r36 + r9*x1)/420 + 2*r27*y2/105 - r28*r29/420 - r28*y2/4 - r31*(r0 - 3*y2)/420 - r6*x2*(r0 - r32)/105 + x0**3*(r30 + 21*y0 + y2)/84 - x0*(r0*r7 + r15*r37 - r2*r37 - r33*y2 + r38*y0 - r39 - r40 + r5*r7)/420 - y0*(8*r27 + 5*r28 + r31 + r33*x2)/420
207		self.momentXY += r12*(r13*y2 + 3*r21 + 105*r24 + r41*y0 + r42 + r46*y1)/840 - r16*x2*(r43 - r44)/840 - r21*r7/8 - r24*(r38 + r45*x1 + 3*r7)/840 - r41*r7*y2/840 - r42*r7/840 + r6*y2*(r32 + r8)/210 + x0*(-r15*r8 + r16*r25 + r18 + r21*r47 - r24*r34 - r26*x2 + r35*r46 + r48)/420 - y0*(r16*r2 + r30*r7 + r35*r45 + r39 + r40)/420
208		self.momentYY += -r2*r42/420 - r22*r29/420 - r24*(r14 + r36 + r52*x2)/420 - r49*x2/420 - r50*x2/12 - r51*(r47 + x2)/84 + x0*(r19*r46 + r21*r5 + r21*r52 + r24*r29 + r25*r53 + r26*y2 + r42*y0 + r49 + 5*r50 + 35*r51)/420 + x1*y2*(r43 + r44 + r9*y1)/210 - y0*(r19*r45 + r2*r53 - r21*r4 + r48)/420
209
210	@cython.locals(r0=cython.double)
211	@cython.locals(r1=cython.double)
212	@cython.locals(r2=cython.double)
213	@cython.locals(r3=cython.double)
214	@cython.locals(r4=cython.double)
215	@cython.locals(r5=cython.double)
216	@cython.locals(r6=cython.double)
217	@cython.locals(r7=cython.double)
218	@cython.locals(r8=cython.double)
219	@cython.locals(r9=cython.double)
220	@cython.locals(r10=cython.double)
221	@cython.locals(r11=cython.double)
222	@cython.locals(r12=cython.double)
223	@cython.locals(r13=cython.double)
224	@cython.locals(r14=cython.double)
225	@cython.locals(r15=cython.double)
226	@cython.locals(r16=cython.double)
227	@cython.locals(r17=cython.double)
228	@cython.locals(r18=cython.double)
229	@cython.locals(r19=cython.double)
230	@cython.locals(r20=cython.double)
231	@cython.locals(r21=cython.double)
232	@cython.locals(r22=cython.double)
233	@cython.locals(r23=cython.double)
234	@cython.locals(r24=cython.double)
235	@cython.locals(r25=cython.double)
236	@cython.locals(r26=cython.double)
237	@cython.locals(r27=cython.double)
238	@cython.locals(r28=cython.double)
239	@cython.locals(r29=cython.double)
240	@cython.locals(r30=cython.double)
241	@cython.locals(r31=cython.double)
242	@cython.locals(r32=cython.double)
243	@cython.locals(r33=cython.double)
244	@cython.locals(r34=cython.double)
245	@cython.locals(r35=cython.double)
246	@cython.locals(r36=cython.double)
247	@cython.locals(r37=cython.double)
248	@cython.locals(r38=cython.double)
249	@cython.locals(r39=cython.double)
250	@cython.locals(r40=cython.double)
251	@cython.locals(r41=cython.double)
252	@cython.locals(r42=cython.double)
253	@cython.locals(r43=cython.double)
254	@cython.locals(r44=cython.double)
255	@cython.locals(r45=cython.double)
256	@cython.locals(r46=cython.double)
257	@cython.locals(r47=cython.double)
258	@cython.locals(r48=cython.double)
259	@cython.locals(r49=cython.double)
260	@cython.locals(r50=cython.double)
261	@cython.locals(r51=cython.double)
262	@cython.locals(r52=cython.double)
263	@cython.locals(r53=cython.double)
264	@cython.locals(r54=cython.double)
265	@cython.locals(r55=cython.double)
266	@cython.locals(r56=cython.double)
267	@cython.locals(r57=cython.double)
268	@cython.locals(r58=cython.double)
269	@cython.locals(r59=cython.double)
270	@cython.locals(r60=cython.double)
271	@cython.locals(r61=cython.double)
272	@cython.locals(r62=cython.double)
273	@cython.locals(r63=cython.double)
274	@cython.locals(r64=cython.double)
275	@cython.locals(r65=cython.double)
276	@cython.locals(r66=cython.double)
277	@cython.locals(r67=cython.double)
278	@cython.locals(r68=cython.double)
279	@cython.locals(r69=cython.double)
280	@cython.locals(r70=cython.double)
281	@cython.locals(r71=cython.double)
282	@cython.locals(r72=cython.double)
283	@cython.locals(r73=cython.double)
284	@cython.locals(r74=cython.double)
285	@cython.locals(r75=cython.double)
286	@cython.locals(r76=cython.double)
287	@cython.locals(r77=cython.double)
288	@cython.locals(r78=cython.double)
289	@cython.locals(r79=cython.double)
290	@cython.locals(r80=cython.double)
291	@cython.locals(r81=cython.double)
292	@cython.locals(r82=cython.double)
293	@cython.locals(r83=cython.double)
294	@cython.locals(r84=cython.double)
295	@cython.locals(r85=cython.double)
296	@cython.locals(r86=cython.double)
297	@cython.locals(r87=cython.double)
298	@cython.locals(r88=cython.double)
299	@cython.locals(r89=cython.double)
300	@cython.locals(r90=cython.double)
301	@cython.locals(r91=cython.double)
302	@cython.locals(r92=cython.double)
303	@cython.locals(r93=cython.double)
304	@cython.locals(r94=cython.double)
305	@cython.locals(r95=cython.double)
306	@cython.locals(r96=cython.double)
307	@cython.locals(r97=cython.double)
308	@cython.locals(r98=cython.double)
309	@cython.locals(r99=cython.double)
310	@cython.locals(r100=cython.double)
311	@cython.locals(r101=cython.double)
312	@cython.locals(r102=cython.double)
313	@cython.locals(r103=cython.double)
314	@cython.locals(r104=cython.double)
315	@cython.locals(r105=cython.double)
316	@cython.locals(r106=cython.double)
317	@cython.locals(r107=cython.double)
318	@cython.locals(r108=cython.double)
319	@cython.locals(r109=cython.double)
320	@cython.locals(r110=cython.double)
321	@cython.locals(r111=cython.double)
322	@cython.locals(r112=cython.double)
323	@cython.locals(r113=cython.double)
324	@cython.locals(r114=cython.double)
325	@cython.locals(r115=cython.double)
326	@cython.locals(r116=cython.double)
327	@cython.locals(r117=cython.double)
328	@cython.locals(r118=cython.double)
329	@cython.locals(r119=cython.double)
330	@cython.locals(r120=cython.double)
331	@cython.locals(r121=cython.double)
332	@cython.locals(r122=cython.double)
333	@cython.locals(r123=cython.double)
334	@cython.locals(r124=cython.double)
335	@cython.locals(r125=cython.double)
336	@cython.locals(r126=cython.double)
337	@cython.locals(r127=cython.double)
338	@cython.locals(r128=cython.double)
339	@cython.locals(r129=cython.double)
340	@cython.locals(r130=cython.double)
341	@cython.locals(r131=cython.double)
342	@cython.locals(r132=cython.double)
343	@cython.locals(x0=cython.double, y0=cython.double)
344	@cython.locals(x1=cython.double, y1=cython.double)
345	@cython.locals(x2=cython.double, y2=cython.double)
346	@cython.locals(x3=cython.double, y3=cython.double)
347	def _curveToOne(self, p1, p2, p3):
348		x0,y0 = self._getCurrentPoint()
349		x1,y1 = p1
350		x2,y2 = p2
351		x3,y3 = p3
352
353		r0 = 6*y2
354		r1 = r0*x3
355		r2 = 10*y3
356		r3 = r2*x3
357		r4 = 3*y1
358		r5 = 6*x1
359		r6 = 3*x2
360		r7 = 6*y1
361		r8 = 3*y2
362		r9 = x2**2
363		r10 = 45*r9
364		r11 = r10*y3
365		r12 = x3**2
366		r13 = r12*y2
367		r14 = r12*y3
368		r15 = 7*y3
369		r16 = 15*x3
370		r17 = r16*x2
371		r18 = x1**2
372		r19 = 9*r18
373		r20 = x0**2
374		r21 = 21*y1
375		r22 = 9*r9
376		r23 = r7*x3
377		r24 = 9*y2
378		r25 = r24*x2 + r3
379		r26 = 9*x2
380		r27 = x2*y3
381		r28 = -r26*y1 + 15*r27
382		r29 = 3*x1
383		r30 = 45*x1
384		r31 = 12*x3
385		r32 = 45*r18
386		r33 = 5*r12
387		r34 = r8*x3
388		r35 = 105*y0
389		r36 = 30*y0
390		r37 = r36*x2
391		r38 = 5*x3
392		r39 = 15*y3
393		r40 = 5*y3
394		r41 = r40*x3
395		r42 = x2*y2
396		r43 = 18*r42
397		r44 = 45*y1
398		r45 = r41 + r43 + r44*x1
399		r46 = y2*y3
400		r47 = r46*x3
401		r48 = y2**2
402		r49 = 45*r48
403		r50 = r49*x3
404		r51 = y3**2
405		r52 = r51*x3
406		r53 = y1**2
407		r54 = 9*r53
408		r55 = y0**2
409		r56 = 21*x1
410		r57 = 6*x2
411		r58 = r16*y2
412		r59 = r39*y2
413		r60 = 9*r48
414		r61 = r6*y3
415		r62 = 3*y3
416		r63 = r36*y2
417		r64 = y1*y3
418		r65 = 45*r53
419		r66 = 5*r51
420		r67 = x2**3
421		r68 = x3**3
422		r69 = 630*y2
423		r70 = 126*x3
424		r71 = x1**3
425		r72 = 126*x2
426		r73 = 63*r9
427		r74 = r73*x3
428		r75 = r15*x3 + 15*r42
429		r76 = 630*x1
430		r77 = 14*x3
431		r78 = 21*r27
432		r79 = 42*x1
433		r80 = 42*x2
434		r81 = x1*y2
435		r82 = 63*r42
436		r83 = x1*y1
437		r84 = r41 + r82 + 378*r83
438		r85 = x2*x3
439		r86 = r85*y1
440		r87 = r27*x3
441		r88 = 27*r9
442		r89 = r88*y2
443		r90 = 42*r14
444		r91 = 90*x1
445		r92 = 189*r18
446		r93 = 378*r18
447		r94 = r12*y1
448		r95 = 252*x1*x2
449		r96 = r79*x3
450		r97 = 30*r85
451		r98 = r83*x3
452		r99 = 30*x3
453		r100 = 42*x3
454		r101 = r42*x1
455		r102 = r10*y2 + 14*r14 + 126*r18*y1 + r81*r99
456		r103 = 378*r48
457		r104 = 18*y1
458		r105 = r104*y2
459		r106 = y0*y1
460		r107 = 252*y2
461		r108 = r107*y0
462		r109 = y0*y3
463		r110 = 42*r64
464		r111 = 378*r53
465		r112 = 63*r48
466		r113 = 27*x2
467		r114 = r27*y2
468		r115 = r113*r48 + 42*r52
469		r116 = x3*y3
470		r117 = 54*r42
471		r118 = r51*x1
472		r119 = r51*x2
473		r120 = r48*x1
474		r121 = 21*x3
475		r122 = r64*x1
476		r123 = r81*y3
477		r124 = 30*r27*y1 + r49*x2 + 14*r52 + 126*r53*x1
478		r125 = y2**3
479		r126 = y3**3
480		r127 = y1**3
481		r128 = y0**3
482		r129 = r51*y2
483		r130 = r112*y3 + r21*r51
484		r131 = 189*r53
485		r132 = 90*y2
486
487		self.area += -r1/20 - r3/20 - r4*(x2 + x3)/20 + x0*(r7 + r8 + 10*y0 + y3)/20 + 3*x1*(y2 + y3)/20 + 3*x2*y3/10 - y0*(r5 + r6 + x3)/20
488		self.momentX += r11/840 - r13/8 - r14/3 - r17*(-r15 + r8)/840 + r19*(r8 + 2*y3)/840 + r20*(r0 + r21 + 56*y0 + y3)/168 + r29*(-r23 + r25 + r28)/840 - r4*(10*r12 + r17 + r22)/840 + x0*(12*r27 + r30*y2 + r34 - r35*x1 - r37 - r38*y0 + r39*x1 - r4*x3 + r45)/840 - y0*(r17 + r30*x2 + r31*x1 + r32 + r33 + 18*r9)/840
489		self.momentY += -r4*(r25 + r58)/840 - r47/8 - r50/840 - r52/6 - r54*(r6 + 2*x3)/840 - r55*(r56 + r57 + x3)/168 + x0*(r35*y1 + r40*y0 + r44*y2 + 18*r48 + 140*r55 + r59 + r63 + 12*r64 + r65 + r66)/840 + x1*(r24*y1 + 10*r51 + r59 + r60 + r7*y3)/280 + x2*y3*(r15 + r8)/56 - y0*(r16*y1 + r31*y2 + r44*x2 + r45 + r61 - r62*x1)/840
490		self.momentXX += -r12*r72*(-r40 + r8)/9240 + 3*r18*(r28 + r34 - r38*y1 + r75)/3080 + r20*(r24*x3 - r72*y0 - r76*y0 - r77*y0 + r78 + r79*y3 + r80*y1 + 210*r81 + r84)/9240 - r29*(r12*r21 + 14*r13 + r44*r9 - r73*y3 + 54*r86 - 84*r87 - r89 - r90)/9240 - r4*(70*r12*x2 + 27*r67 + 42*r68 + r74)/9240 + 3*r67*y3/220 - r68*r69/9240 - r68*y3/4 - r70*r9*(-r62 + y2)/9240 + 3*r71*(r24 + r40)/3080 + x0**3*(r24 + r44 + 165*y0 + y3)/660 + x0*(r100*r27 + 162*r101 + r102 + r11 + 63*r18*y3 + r27*r91 - r33*y0 - r37*x3 + r43*x3 - r73*y0 - r88*y1 + r92*y2 - r93*y0 - 9*r94 - r95*y0 - r96*y0 - r97*y1 - 18*r98 + r99*x1*y3)/9240 - y0*(r12*r56 + r12*r80 + r32*x3 + 45*r67 + 14*r68 + 126*r71 + r74 + r85*r91 + 135*r9*x1 + r92*x2)/9240
491		self.momentXY += -r103*r12/18480 - r12*r51/8 - 3*r14*y2/44 + 3*r18*(r105 + r2*y1 + 18*r46 + 15*r48 + 7*r51)/6160 + r20*(1260*r106 + r107*y1 + r108 + 28*r109 + r110 + r111 + r112 + 30*r46 + 2310*r55 + r66)/18480 - r54*(7*r12 + 18*r85 + 15*r9)/18480 - r55*(r33 + r73 + r93 + r95 + r96 + r97)/18480 - r7*(42*r13 + r82*x3 + 28*r87 + r89 + r90)/18480 - 3*r85*(r48 - r66)/220 + 3*r9*y3*(r62 + 2*y2)/440 + x0*(-r1*y0 - 84*r106*x2 + r109*r56 + 54*r114 + r117*y1 + 15*r118 + 21*r119 + 81*r120 + r121*r46 + 54*r122 + 60*r123 + r124 - r21*x3*y0 + r23*y3 - r54*x3 - r55*r72 - r55*r76 - r55*r77 + r57*y0*y3 + r60*x3 + 84*r81*y0 + 189*r81*y1)/9240 + x1*(r104*r27 - r105*x3 - r113*r53 + 63*r114 + r115 - r16*r53 + 28*r47 + r51*r80)/3080 - y0*(54*r101 + r102 + r116*r5 + r117*x3 + 21*r13 - r19*y3 + r22*y3 + r78*x3 + 189*r83*x2 + 60*r86 + 81*r9*y1 + 15*r94 + 54*r98)/9240
492		self.momentYY += -r103*r116/9240 - r125*r70/9240 - r126*x3/12 - 3*r127*(r26 + r38)/3080 - r128*(r26 + r30 + x3)/660 - r4*(r112*x3 + r115 - 14*r119 + 84*r47)/9240 - r52*r69/9240 - r54*(r58 + r61 + r75)/9240 - r55*(r100*y1 + r121*y2 + r26*y3 + r79*y2 + r84 + 210*x2*y1)/9240 + x0*(r108*y1 + r110*y0 + r111*y0 + r112*y0 + 45*r125 + 14*r126 + 126*r127 + 770*r128 + 42*r129 + r130 + r131*y2 + r132*r64 + 135*r48*y1 + 630*r55*y1 + 126*r55*y2 + 14*r55*y3 + r63*y3 + r65*y3 + r66*y0)/9240 + x1*(27*r125 + 42*r126 + 70*r129 + r130 + r39*r53 + r44*r48 + 27*r53*y2 + 54*r64*y2)/3080 + 3*x2*y3*(r48 + r66 + r8*y3)/220 - y0*(r100*r46 + 18*r114 - 9*r118 - 27*r120 - 18*r122 - 30*r123 + r124 + r131*x2 + r132*x3*y1 + 162*r42*y1 + r50 + 63*r53*x3 + r64*r99)/9240
493
494if __name__ == '__main__':
495	from fontTools.misc.symfont import x, y, printGreenPen
496	printGreenPen('MomentsPen', [
497		      ('area', 1),
498		      ('momentX', x),
499		      ('momentY', y),
500		      ('momentXX', x**2),
501		      ('momentXY', x*y),
502		      ('momentYY', y**2),
503		     ])
504