diff options
| author | LaureFR38 <63351363+LaureFR38@users.noreply.github.com> | 2021-02-04 16:40:02 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-02-04 16:40:02 +0100 |
| commit | 1cb501986f9c1135c861472366737563ebe79681 (patch) | |
| tree | 00f62bc52928e48100b9b5dab2384d09aedf4034 /lib/lettering | |
| parent | dac312f01fe83f6ade1b0b1845c92106587ff89e (diff) | |
Update font.py (#848)
* Add new fonts
* Update old fonts
* Update lettering gui
Co-authored-by: Lex Neva
Co-authored-by: kalleen
Diffstat (limited to 'lib/lettering')
| -rw-r--r-- | lib/lettering/font.py | 73 | ||||
| -rw-r--r-- | lib/lettering/font_variant.py | 5 | ||||
| -rw-r--r-- | lib/lettering/glyph.py | 10 |
3 files changed, 71 insertions, 17 deletions
diff --git a/lib/lettering/font.py b/lib/lettering/font.py index e8c81019..0974a1cf 100644 --- a/lib/lettering/font.py +++ b/lib/lettering/font.py @@ -1,8 +1,8 @@ # -*- coding: UTF-8 -*- -from copy import deepcopy import json import os +from copy import deepcopy import inkex @@ -11,7 +11,7 @@ from ..exceptions import InkstitchException from ..i18n import _, get_languages from ..stitches.auto_satin import auto_satin from ..svg import PIXELS_PER_MM -from ..svg.tags import SVG_GROUP_TAG, SVG_PATH_TAG, INKSCAPE_LABEL +from ..svg.tags import INKSCAPE_LABEL, SVG_GROUP_TAG, SVG_PATH_TAG from ..utils import Point from .font_variant import FontVariant @@ -44,7 +44,11 @@ def localized_font_metadata(name, default=None): # This may be a font packaged with Ink/Stitch, in which case the # text will have been sent to CrowdIn for community translation. # Try to fetch the translated version. - return _(self.metadata.get(name)) + original_metadata = self.metadata.get(name) + localized_metadata = "" + if original_metadata != "": + localized_metadata = _(original_metadata) + return localized_metadata else: return default @@ -103,20 +107,54 @@ class Font(object): name = localized_font_metadata('name', '') description = localized_font_metadata('description', '') - default_variant = font_metadata('default_variant', FontVariant.LEFT_TO_RIGHT) - default_glyph = font_metadata('defalt_glyph', u"�") - letter_spacing = font_metadata('letter_spacing', 1.5, multiplier=PIXELS_PER_MM) + default_glyph = font_metadata('default_glyph', u"�") leading = font_metadata('leading', 5, multiplier=PIXELS_PER_MM) - word_spacing = font_metadata('word_spacing', 3, multiplier=PIXELS_PER_MM) kerning_pairs = font_metadata('kerning_pairs', {}) auto_satin = font_metadata('auto_satin', True) min_scale = font_metadata('min_scale', 1.0) max_scale = font_metadata('max_scale', 1.0) + # use values from SVG Font, exemple: + # <font horiz-adv-x="45" ... <glyph .... horiz-adv-x="49" glyph-name="A" /> ... <hkern ... k="3"g1="A" g2="B" /> .... /> + + # Example font.json : "horiz_adv_x": {"A":49}, + horiz_adv_x = font_metadata('horiz_adv_x', {}) + + # Example font.json : "horiz_adv_x_default" : 45, + horiz_adv_x_default = font_metadata('horiz_adv_x_default') + + # Define by <glyph glyph-name="space" unicode=" " horiz-adv-x="22" />, Example font.json : "horiz_adv_x_space":22, + word_spacing = font_metadata('horiz_adv_x_space', 0) + + reversible = font_metadata('reversible', True) + @property def id(self): return os.path.basename(self.path) + @property + def default_variant(self): + # Set default variant to any existing variant if default font file is missing + default_variant = font_metadata('default_variant', FontVariant.LEFT_TO_RIGHT) + font_variants = self.has_variants() + if default_variant not in font_variants and len(font_variants) > 0: + default_variant = font_variants[0] + return default_variant + + @property + def preview_image(self): + preview_image_path = os.path.join(self.path, "preview.png") + if os.path.isfile(preview_image_path): + return preview_image_path + return None + + def has_variants(self): + font_variants = [] + for variant in FontVariant.VARIANT_TYPES: + if os.path.isfile(os.path.join(self.path, "%s.svg" % variant)): + font_variants.append(variant) + return font_variants + def render_text(self, text, destination_group, variant=None, back_and_forth=True, trim=False): """Render text into an SVG group element.""" self._load_variants() @@ -124,7 +162,7 @@ class Font(object): if variant is None: variant = self.default_variant - if back_and_forth: + if back_and_forth and self.reversible: glyph_sets = [self.get_variant(variant), self.get_variant(FontVariant.reversed_variant(variant))] else: glyph_sets = [self.get_variant(variant)] * 2 @@ -135,7 +173,7 @@ class Font(object): line = line.strip() letter_group = self._render_line(line, position, glyph_set) - if glyph_set.variant == FontVariant.RIGHT_TO_LEFT: + if back_and_forth and self.reversible and i % 2 == 1: letter_group[:] = reversed(letter_group) destination_group.append(letter_group) @@ -205,14 +243,25 @@ class Font(object): we're at the start of the line or a word. """ - node = deepcopy(glyph.node) + # Concerning min_x: I add it before moving the letter because it is to + # take into account the margin in the drawing of the letter. With respect + # to point 0 the letter can start at 5 or -5. The letters have a defined + # place in the drawing that's important. + # Then to calculate the position of x for the next letter I have to remove + # the min_x margin because the horizontal adv is calculated from point 0 of the drawing. + node = deepcopy(glyph.node) if last_character is not None: - position.x += self.letter_spacing + self.kerning_pairs.get(last_character + character, 0) * PIXELS_PER_MM + position.x += glyph.min_x - self.kerning_pairs.get(last_character + character, 0) transform = "translate(%s, %s)" % position.as_tuple() node.set('transform', transform) - position.x += glyph.width + + horiz_adv_x_default = self.horiz_adv_x_default + if horiz_adv_x_default is None: + horiz_adv_x_default = glyph.width + glyph.min_x + + position.x += self.horiz_adv_x.get(character, horiz_adv_x_default) - glyph.min_x return node diff --git a/lib/lettering/font_variant.py b/lib/lettering/font_variant.py index d826dca6..7c9fa1c0 100644 --- a/lib/lettering/font_variant.py +++ b/lib/lettering/font_variant.py @@ -1,6 +1,7 @@ # -*- coding: UTF-8 -*- import os + import inkex import simplestyle @@ -45,6 +46,10 @@ class FontVariant(object): return None def __init__(self, font_path, variant, default_glyph=None): + # If the font variant file does not exist, this constructor will + # raise an exception. The caller should catch it and decide + # what to do. + self.path = font_path self.variant = variant self.default_glyph = default_glyph diff --git a/lib/lettering/glyph.py b/lib/lettering/glyph.py index bb1a971c..061a930c 100644 --- a/lib/lettering/glyph.py +++ b/lib/lettering/glyph.py @@ -64,21 +64,21 @@ class Glyph(object): def _process_baseline(self, svg): for guide in get_guides(svg): if guide.label == "baseline": - self._baseline = guide.position.y + self.baseline = guide.position.y break else: # no baseline guide found, assume 0 for lack of anything better to use... - self._baseline = 0 + self.baseline = 0 def _process_bbox(self): left, right, top, bottom = simpletransform.computeBBox(self.node.iterdescendants()) self.width = right - left - self._min_x = left + self.min_x = left def _move_to_origin(self): - translate_x = -self._min_x - translate_y = -self._baseline + translate_x = -self.min_x + translate_y = -self.baseline transform = "translate(%s, %s)" % (translate_x, translate_y) for node in self.node.iter(SVG_PATH_TAG): |
