예제 #1
0
def _roundAnchors(anchors, digits=None):
    result = []
    for anchor in anchors:
        anchor = dict(anchor)
        anchor["x"], anchor["y"] = _roundNumber(anchor["x"], digits), _roundNumber(anchor["y"], digits)
        result.append(anchor)
    return result
예제 #2
0
 def round(self, digits=None):
     """round the geometry."""
     copiedGlyph = self.copyWithoutMathSubObjects()
     # misc
     copiedGlyph.width = _roundNumber(self.width, digits)
     copiedGlyph.height = _roundNumber(self.height, digits)
     # contours
     copiedGlyph.contours = []
     if self.contours:
         copiedGlyph.contours = _roundContours(self.contours, digits)
     # components
     copiedGlyph.components = []
     if self.components:
         copiedGlyph.components = _roundComponents(self.components, digits)
     # guidelines
     copiedGlyph.guidelines = []
     if self.guidelines:
         copiedGlyph.guidelines = _roundGuidelines(self.guidelines, digits)
     # anchors
     copiedGlyph.anchors = []
     if self.anchors:
         copiedGlyph.anchors = _roundAnchors(self.anchors, digits)
     # image
     copiedGlyph.image = None
     if self.image:
         copiedGlyph.image = _roundImage(self.image, digits)
     return copiedGlyph
예제 #3
0
 def round(self, digits=None):
     excludeFromRounding = ['postscriptBlueScale', 'italicAngle']
     copiedInfo = self.copy()
     # basic attributes
     for attr, (formatter, factorIndex) in _infoAttrs.items():
         if attr in excludeFromRounding:
             continue
         if hasattr(copiedInfo, attr):
             v = getattr(copiedInfo, attr)
             if v is not None:
                 if factorIndex == 3:
                     v = int(round(v))
                 else:
                     if isinstance(v, (list, tuple)):
                         v = [_roundNumber(a, digits) for a in v]
                     else:
                         v = _roundNumber(v, digits)
             else:
                 v = None
             setattr(copiedInfo, attr, v)
     # special attributes
     self._processPostscriptWeightName(copiedInfo)
     # guidelines
     copiedInfo.guidelines = []
     if self.guidelines:
         copiedInfo.guidelines = _roundGuidelines(self.guidelines, digits)
     return copiedInfo
예제 #4
0
 def round(self, digits=None):
     """round the geometry."""
     copiedGlyph = self.copyWithoutMathSubObjects()
     # misc
     copiedGlyph.width = _roundNumber(self.width, digits)
     copiedGlyph.height = _roundNumber(self.height, digits)
     # contours
     copiedGlyph.contours = []
     if self.contours:
         copiedGlyph.contours = _roundContours(self.contours, digits)
     # components
     copiedGlyph.components = []
     if self.components:
         copiedGlyph.components = _roundComponents(self.components, digits)
     # guidelines
     copiedGlyph.guidelines = []
     if self.guidelines:
         copiedGlyph.guidelines = _roundGuidelines(self.guidelines, digits)
     # anchors
     copiedGlyph.anchors = []
     if self.anchors:
         copiedGlyph.anchors = _roundAnchors(self.anchors, digits)
     # image
     copiedGlyph.image = None
     if self.image:
         copiedGlyph.image = _roundImage(self.image, digits)
     return copiedGlyph
예제 #5
0
 def test_roundNumber_to_float(self):
     # round to float with specified decimals:
     self.assertEqual(_roundNumber(0.3333, None), 0)
     self.assertEqual(_roundNumber(0.3333, 0), 0.0)
     self.assertEqual(_roundNumber(0.3333, 1), 0.3)
     self.assertEqual(_roundNumber(0.3333, 2), 0.33)
     self.assertEqual(_roundNumber(0.3333, 3), 0.333)
예제 #6
0
 def test_round(self):
     m = _TestInfoObject()
     m.ascender = 699.99
     m.descender = -199.99
     m.xHeight = 399.66
     m.postscriptSlantAngle = None
     m.postscriptStemSnapH = [80.1, 90.2]
     m.guidelines = [{'y': 100.99, 'x': None, 'angle': None, 'name': 'bar'}]
     m.italicAngle = -9.4
     m.postscriptBlueScale = 0.137
     info = MathInfo(m)
     info = info.round()
     self.assertEqual(info.ascender, 700)
     self.assertEqual(info.descender, -200)
     self.assertEqual(info.xHeight, 400)
     self.assertEqual(m.italicAngle, -9.4)
     self.assertEqual(m.postscriptBlueScale, 0.137)
     self.assertIsNone(info.postscriptSlantAngle)
     self.assertEqual(info.postscriptStemSnapH, [80, 90])
     self.assertEqual(
         [sorted(gl.items()) for gl in info.guidelines],
         [[('angle', 0), ('name', 'bar'), ('x', 0), ('y', 101)]]
     )
     written = {}
     expected = {}
     for attr, value in _testData.items():
         if value is None:
             continue
         written[attr] = getattr(info, attr)
         if isinstance(value, list):
             expectedValue = [_roundNumber(v) for v in value]
         else:
             expectedValue = _roundNumber(value)
         expected[attr] = expectedValue
     self.assertEqual(sorted(expected), sorted(written))
 def test_roundNumber_to_float(self):
     # round to float with specified decimals:
     self.assertEqual(_roundNumber(0.3333, None), 0)
     self.assertEqual(_roundNumber(0.3333, 0), 0.0)
     self.assertEqual(_roundNumber(0.3333, 1), 0.3)
     self.assertEqual(_roundNumber(0.3333, 2), 0.33)
     self.assertEqual(_roundNumber(0.3333, 3), 0.333)
예제 #8
0
 def test_round(self):
     m = _TestInfoObject()
     m.ascender = 699.99
     m.descender = -199.99
     m.xHeight = 399.66
     m.postscriptSlantAngle = None
     m.postscriptStemSnapH = [80.1, 90.2]
     m.guidelines = [{'y': 100.99, 'x': None, 'angle': None, 'name': 'bar'}]
     m.italicAngle = -9.4
     m.postscriptBlueScale = 0.137
     info = MathInfo(m)
     info = info.round()
     self.assertEqual(info.ascender, 700)
     self.assertEqual(info.descender, -200)
     self.assertEqual(info.xHeight, 400)
     self.assertEqual(m.italicAngle, -9.4)
     self.assertEqual(m.postscriptBlueScale, 0.137)
     self.assertIsNone(info.postscriptSlantAngle)
     self.assertEqual(info.postscriptStemSnapH, [80, 90])
     self.assertEqual([sorted(gl.items()) for gl in info.guidelines],
                      [[('angle', 0), ('name', 'bar'), ('x', 0),
                        ('y', 101)]])
     written = {}
     expected = {}
     for attr, value in _testData.items():
         if value is None:
             continue
         written[attr] = getattr(info, attr)
         if isinstance(value, list):
             expectedValue = [_roundNumber(v) for v in value]
         else:
             expectedValue = _roundNumber(value)
         expected[attr] = expectedValue
     self.assertEqual(sorted(expected), sorted(written))
예제 #9
0
def _roundAnchors(anchors, digits=None):
    result = []
    for anchor in anchors:
        anchor = dict(anchor)
        anchor["x"], anchor["y"] = _roundNumber(anchor["x"], digits), _roundNumber(anchor["y"], digits)
        result.append(anchor)
    return result
예제 #10
0
def _roundGuidelines(guidelines, digits=None):
    results = []
    for guideline in guidelines:
        guideline = dict(guideline)
        guideline['x'] = _roundNumber(guideline['x'], digits)
        guideline['y'] = _roundNumber(guideline['y'], digits)
        results.append(guideline)
    return results
예제 #11
0
 def test_set_custom_round_float_func(self):
     default = _ROUND_FLOAT_FUNC
     try:
         setRoundFloatFunction(round2)
         self.assertEqual(_roundNumber(0.55, 1), 0.6)
         self.assertEqual(_roundNumber(-1.555, 2), -1.55)
     finally:
         setRoundIntegerFunction(default)
def _roundGuidelines(guidelines, digits=None):
    results = []
    for guideline in guidelines:
        guideline = dict(guideline)
        guideline['x'] = _roundNumber(guideline['x'], digits)
        guideline['y'] = _roundNumber(guideline['y'], digits)
        results.append(guideline)
    return results
예제 #13
0
 def test_set_custom_round_integer_func(self):
     default = _ROUND_INTEGER_FUNC
     try:
         setRoundIntegerFunction(otRound)
         self.assertEqual(_roundNumber(0.5), 1)
         self.assertEqual(_roundNumber(-1.5), -1)
     finally:
         setRoundIntegerFunction(default)
예제 #14
0
def _roundContours(contours, digits=None):
    results = []
    for contour in contours:
        contour = dict(contour)
        roundedPoints = []
        for segmentType, pt, smooth, name, identifier in contour["points"]:
            roundedPt = (_roundNumber(pt[0], digits), _roundNumber(pt[1], digits))
            roundedPoints.append((segmentType, roundedPt, smooth, name, identifier))
        contour["points"] = roundedPoints
        results.append(contour)
    return results
예제 #15
0
def _roundContours(contours, digits=None):
    results = []
    for contour in contours:
        contour = dict(contour)
        roundedPoints = []
        for segmentType, pt, smooth, name, identifier in contour["points"]:
            roundedPt = (_roundNumber(pt[0],digits), _roundNumber(pt[1],digits))
            roundedPoints.append((segmentType, roundedPt, smooth, name, identifier))
        contour["points"] = roundedPoints
        results.append(contour)
    return results
예제 #16
0
 def test_roundNumber(self):
     # round to integer:
     self.assertEqual(_roundNumber(0), 0)
     self.assertEqual(_roundNumber(0.1), 0)
     self.assertEqual(_roundNumber(0.99), 1)
     self.assertEqual(_roundNumber(0.499), 0)
     self.assertEqual(_roundNumber(0.5), 0)
     self.assertEqual(_roundNumber(-0.499), 0)
     self.assertEqual(_roundNumber(-0.5), 0)
     self.assertEqual(_roundNumber(1.5), 2)
     self.assertEqual(_roundNumber(-1.5), -2)
예제 #17
0
 def test_roundNumber(self):
     # round to integer:
     self.assertEqual(_roundNumber(0), 0)
     self.assertEqual(_roundNumber(0.1), 0)
     self.assertEqual(_roundNumber(0.99), 1)
     self.assertEqual(_roundNumber(0.499), 0)
     self.assertEqual(_roundNumber(0.5), 0)
     self.assertEqual(_roundNumber(-0.499), 0)
     self.assertEqual(_roundNumber(-0.5), 0)
     self.assertEqual(_roundNumber(1.5), 2)
     self.assertEqual(_roundNumber(-1.5), -2)
예제 #18
0
 def test_processMathTwoGuidelines(self):
     guidelines = [
         dict(x=2, y=3, angle=5, name="test", identifier="1", color="0,0,0,0")
     ]
     expected = [
         dict(x=4, y=4.5, angle=3.75, name="test", identifier="1", color="0,0,0,0")
     ]
     result = _processMathTwoGuidelines(guidelines, (2, 1.5), mul)
     result[0]["angle"] = _roundNumber(result[0]["angle"], 2)
     self.assertEqual(result, expected)
예제 #19
0
    def _wrapUnWrap(self, precision=12):
        """
        Wrap and unwrap a matrix with random values to establish rounding error
        """
        t1 = []
        for i in range(6):
            t1.append(random())
        m = matrixToMathTransform(t1)
        t2 = mathTransformToMatrix(m)

        if not sum([_roundNumber(t1[i] - t2[i], precision)
                    for i in range(len(t1))]) == 0:
            raise FontMathWarning(
                "Matrix round-tripping failed for precision value %s."
                % (precision))
예제 #20
0
def _openTypeOS2WeightClassFormatter(value):
    """
    >>> _openTypeOS2WeightClassFormatter(-20)
    0
    >>> _openTypeOS2WeightClassFormatter(0)
    0
    >>> _openTypeOS2WeightClassFormatter(50.4)
    50
    >>> _openTypeOS2WeightClassFormatter(90.6)
    91
    >>> _openTypeOS2WeightClassFormatter(120)
    120
    """
    value = _roundNumber(value)
    if value < 0:
        value = 0
    return value
예제 #21
0
def _openTypeOS2WeightClassFormatter(value):
    """
    >>> _openTypeOS2WeightClassFormatter(-20)
    0
    >>> _openTypeOS2WeightClassFormatter(0)
    0
    >>> _openTypeOS2WeightClassFormatter(50.4)
    50
    >>> _openTypeOS2WeightClassFormatter(90.6)
    91
    >>> _openTypeOS2WeightClassFormatter(120)
    120
    """
    value = _roundNumber(value)
    if value < 0:
        value = 0
    return value
 def test_processMathTwoGuidelines(self):
     guidelines = [
         dict(x=2,
              y=3,
              angle=5,
              name="test",
              identifier="1",
              color="0,0,0,0")
     ]
     expected = [
         dict(x=4,
              y=4.5,
              angle=3.75,
              name="test",
              identifier="1",
              color="0,0,0,0")
     ]
     result = _processMathTwoGuidelines(guidelines, (2, 1.5), mul)
     result[0]["angle"] = _roundNumber(result[0]["angle"], 2)
     self.assertEqual(result, expected)
예제 #23
0
def _roundTransformation(transformation, digits=None):
    xScale, xyScale, yxScale, yScale, xOffset, yOffset = transformation
    return (xScale, xyScale, yxScale, yScale, _roundNumber(xOffset, digits), _roundNumber(yOffset, digits))
예제 #24
0
def _roundTransformation(transformation, digits=None):
    xScale, xyScale, yxScale, yScale, xOffset, yOffset = transformation
    return (xScale, xyScale, yxScale, yScale, _roundNumber(xOffset, digits),
            _roundNumber(yOffset, digits))
예제 #25
0
 def asDict(self, returnIntegers=True):
     if not returnIntegers:
         return self._kerning
     kerning = {k: _roundNumber(v) for (k, v) in self._kerning.items()}
     return kerning
예제 #26
0
 def test_factorAngle(self):
     f = factorAngle(5, (2, 1.5), mul)
     self.assertEqual(_roundNumber(f, 2), 3.75)
예제 #27
0
def _integerFormatter(value):
    return _roundNumber(value)
예제 #28
0
def _integerFormatter(value):
    return _roundNumber(value)
예제 #29
0
 def test_factorAngle(self):
     f = factorAngle(5, (2, 1.5), mul)
     self.assertEqual(_roundNumber(f, 2), 3.75)