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
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
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
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)
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_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 _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
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 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)
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
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
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)
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)
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))
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 _roundTransformation(transformation, digits=None): xScale, xyScale, yxScale, yScale, xOffset, yOffset = transformation return (xScale, xyScale, yxScale, yScale, _roundNumber(xOffset, digits), _roundNumber(yOffset, digits))
def asDict(self, returnIntegers=True): if not returnIntegers: return self._kerning kerning = {k: _roundNumber(v) for (k, v) in self._kerning.items()} return kerning
def test_factorAngle(self): f = factorAngle(5, (2, 1.5), mul) self.assertEqual(_roundNumber(f, 2), 3.75)
def _integerFormatter(value): return _roundNumber(value)