1 # -*- tab-width: 4; indent-tabs-mode: nil; py-indent-offset: 4 -*-
3 # This file is part of the LibreOffice project.
5 # This Source Code Form is subject to the terms of the Mozilla Public
6 # License, v. 2.0. If a copy of the MPL was not distributed with this
7 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
13 from libreoffice
.util
import printing
15 class B2DRangePrinter(object):
16 '''Prints a B2DRange object.'''
18 def __init__(self
, typename
, value
):
19 self
.typename
= typename
21 # inject children() func dynamically
22 if not self
._isEmpty
():
23 self
.children
= self
._children
27 return "empty %s" % (self
.typename
)
29 return "%s" % (self
.typename
)
32 return (self
.value
['maRangeX']['mnMinimum'] > self
.value
['maRangeX']['mnMaximum']
33 or self
.value
['maRangeY']['mnMinimum'] > self
.value
['maRangeY']['mnMaximum'])
36 left
= self
.value
['maRangeX']['mnMinimum']
37 top
= self
.value
['maRangeY']['mnMinimum']
38 right
= self
.value
['maRangeX']['mnMaximum']
39 bottom
= self
.value
['maRangeY']['mnMaximum']
40 children
= [('left', left
), ('top', top
), ('right', right
), ('bottom', bottom
)]
41 return children
.__iter
__()
43 class B2DPolygonPrinter(object):
44 '''Prints a B2DPolygon object.'''
46 def __init__(self
, typename
, value
):
47 self
.typename
= typename
49 # inject children() func dynamically
50 if not self
._isEmpty
():
51 self
.children
= self
._children
55 return "empty %s" % (self
.typename
)
57 return "%s %s" % ('bezier curve' if self
._hasCurves
() else 'straight line',
61 return int(gdb
.parse_and_eval(
62 '((basegfx::B2DPolygon*)%d)->count()' % self
.value
.address
))
65 return self
._count
() == 0
68 return int(gdb
.parse_and_eval(
69 '((basegfx::B2DPolygon*)%d)->areControlPointsUsed()' % self
.value
.address
)) != 0
73 return self
._bezierIterator
(self
._count
(), self
.value
)
75 return self
._plainIterator
(self
._count
(), self
.value
)
77 class _plainIterator(six
.Iterator
):
78 def __init__(self
, count
, value
):
87 if self
.index
>= self
.count
:
89 currPoint
= gdb
.parse_and_eval(
90 '((basegfx::B2DPolygon*)%d)->getB2DPoint(%d)' % (
91 self
.value
.address
, self
.index
))
92 currPoint
= gdb
.parse_and_eval(
93 '((basegfx::B2DPolygon*)%d)->getB2DPoint(%d)' % (
94 self
.value
.address
, self
.index
))
96 return ('point %d' % (self
.index
-1),
97 '(%15f, %15f)' % (currPoint
['mfX'], currPoint
['mfY']))
99 class _bezierIterator(six
.Iterator
):
100 def __init__(self
, count
, value
):
109 if self
.index
>= self
.count
:
110 raise StopIteration()
111 currPoint
= gdb
.parse_and_eval(
112 '((basegfx::B2DPolygon*)%d)->getB2DPoint(%d)' % (
113 self
.value
.address
, self
.index
))
114 prevControl
= gdb
.parse_and_eval(
115 '((basegfx::B2DPolygon*)%d)->getPrevControlPoint(%d)' % (
116 self
.value
.address
, self
.index
))
117 nextControl
= gdb
.parse_and_eval(
118 '((basegfx::B2DPolygon*)%d)->getNextControlPoint(%d)' % (
119 self
.value
.address
, self
.index
))
121 return ('point %d' % (self
.index
-1),
122 'p: (%15f, %15f) c-1: (%15f, %15f) c1: (%15f, %15f)' %
123 (currPoint
['mfX'], currPoint
['mfY'],
124 prevControl
['mfX'], prevControl
['mfY'],
125 nextControl
['mfX'], nextControl
['mfY']))
127 class B2DPolyPolygonPrinter(object):
128 '''Prints a B2DPolyPolygon object.'''
130 def __init__(self
, typename
, value
):
131 self
.typename
= typename
136 return "empty %s" % (self
.typename
)
138 return "%s %s with %d sub-polygon(s)" % ('closed' if self
._isClosed
() else 'open',
143 return int(gdb
.parse_and_eval(
144 '((basegfx::B2DPolyPolygon*)%d)->count()' % self
.value
.address
))
147 return int(gdb
.parse_and_eval(
148 '((basegfx::B2DPolyPolygon*)%d)->isClosed()' % self
.value
.address
)) != 0
151 return self
._count
() == 0
155 def build_pretty_printers():
158 printer
= printing
.Printer('libreoffice/basegfx')
161 printer
.add('basegfx::B2DRange', B2DRangePrinter
)
162 printer
.add('basegfx::B2DPolygon', B2DPolygonPrinter
)
163 printer
.add('basegfx::B2DPolyPolygon', B2DPolyPolygonPrinter
)
165 def register_pretty_printers(obj
):
166 printing
.register_pretty_printer(printer
, obj
)
168 build_pretty_printers()
170 # vim:set shiftwidth=4 softtabstop=4 expandtab: