From 904b4096efaa1a0de9d5618f84c5221e48772289 Mon Sep 17 00:00:00 2001 From: Mikael Sand Date: Sun, 23 Jul 2017 04:31:14 +0300 Subject: [PATCH] Optimize pushNodeAndFont, use parent font map as shortcut if current is null. Keep all font map values as Strings until use (except font size, which needs to be absolute, for computing relative size values in inheritance). --- .../java/com/horcrux/svg/GlyphContext.java | 65 ++++++++----------- .../java/com/horcrux/svg/TSpanShadowNode.java | 4 +- 2 files changed, 28 insertions(+), 41 deletions(-) diff --git a/android/src/main/java/com/horcrux/svg/GlyphContext.java b/android/src/main/java/com/horcrux/svg/GlyphContext.java index 62736d30..21980de1 100644 --- a/android/src/main/java/com/horcrux/svg/GlyphContext.java +++ b/android/src/main/java/com/horcrux/svg/GlyphContext.java @@ -181,66 +181,49 @@ class GlyphContext { private void pushNodeAndFont(GroupShadowNode node, @Nullable ReadableMap font) { ReadableMap parent = getTopOrParentFont(node); - WritableMap map = Arguments.createMap(); - mFontContext.add(map); - topFont = map; mTop++; - if (parent.hasKey(LETTER_SPACING)) { - map.putDouble(LETTER_SPACING, parent.getDouble(LETTER_SPACING)); - } - - if (parent.hasKey(FONT_FAMILY)) { - map.putString(FONT_FAMILY, parent.getString(FONT_FAMILY)); - } - - if (parent.hasKey(FONT_WEIGHT)) { - map.putString(FONT_WEIGHT, parent.getString(FONT_WEIGHT)); - } - - if (parent.hasKey(FONT_STYLE)) { - map.putString(FONT_STYLE, parent.getString(FONT_STYLE)); - } - - if (parent.hasKey(KERNING)) { - map.putDouble(KERNING, parent.getDouble(KERNING)); - } - - float parentFontSize = (float) parent.getDouble(FONT_SIZE); - map.putDouble(FONT_SIZE, parentFontSize); - mFontSize = parentFontSize; - if (font == null) { + mFontContext.add(parent); return; } + WritableMap map = Arguments.createMap(); + mFontContext.add(map); + topFont = map; + if (font.hasKey(LETTER_SPACING)) { - String letterSpacingString = font.getString(LETTER_SPACING); - float letterSpacing = Float.valueOf(letterSpacingString); - map.putDouble(LETTER_SPACING, letterSpacing); + map.putString(LETTER_SPACING, font.getString(LETTER_SPACING)); + } else if (parent.hasKey(LETTER_SPACING)) { + map.putString(LETTER_SPACING, parent.getString(LETTER_SPACING)); } if (font.hasKey(FONT_FAMILY)) { - String fontFamily = font.getString(FONT_FAMILY); - map.putString(FONT_FAMILY, fontFamily); + map.putString(FONT_FAMILY, font.getString(FONT_FAMILY)); + } else if (parent.hasKey(FONT_FAMILY)) { + map.putString(FONT_FAMILY, parent.getString(FONT_FAMILY)); } if (font.hasKey(FONT_WEIGHT)) { - String fontWeight = font.getString(FONT_WEIGHT); - map.putString(FONT_WEIGHT, fontWeight); + map.putString(FONT_WEIGHT, font.getString(FONT_WEIGHT)); + } else if (parent.hasKey(FONT_WEIGHT)) { + map.putString(FONT_WEIGHT, parent.getString(FONT_WEIGHT)); } if (font.hasKey(FONT_STYLE)) { - String fontStyle = font.getString(FONT_STYLE); - map.putString(FONT_STYLE, fontStyle); + map.putString(FONT_STYLE, font.getString(FONT_STYLE)); + } else if (parent.hasKey(FONT_STYLE)) { + map.putString(FONT_STYLE, parent.getString(FONT_STYLE)); } if (font.hasKey(KERNING)) { - String kerningString = font.getString(KERNING); - float kerning = Float.valueOf(kerningString); - map.putDouble(KERNING, kerning); + map.putString(KERNING, font.getString(KERNING)); + } else if (parent.hasKey(KERNING)) { + map.putString(KERNING, parent.getString(KERNING)); } + float parentFontSize = (float) parent.getDouble(FONT_SIZE); + if (font.hasKey(FONT_SIZE)) { String string = font.getString(FONT_SIZE); float value = PropHelper.fromRelativeToFloat( @@ -252,7 +235,11 @@ class GlyphContext { ); map.putDouble(FONT_SIZE, value); mFontSize = value; + } else { + mFontSize = parentFontSize; } + + map.putDouble(FONT_SIZE, mFontSize); } void pushContext(GroupShadowNode node, @Nullable ReadableMap font) { diff --git a/android/src/main/java/com/horcrux/svg/TSpanShadowNode.java b/android/src/main/java/com/horcrux/svg/TSpanShadowNode.java index a22c8cb4..26a471eb 100644 --- a/android/src/main/java/com/horcrux/svg/TSpanShadowNode.java +++ b/android/src/main/java/com/horcrux/svg/TSpanShadowNode.java @@ -161,7 +161,7 @@ class TSpanShadowNode extends TextShadowNode { boolean autoKerning = true; float kerning = DEFAULT_KERNING; if (font.hasKey(PROP_KERNING)) { - kerning = (float) (font.getDouble(PROP_KERNING) * mScale); + kerning = Float.valueOf(font.getString(PROP_KERNING)) * mScale; autoKerning = false; } @@ -222,7 +222,7 @@ class TSpanShadowNode extends TextShadowNode { float fontSize = (float) font.getDouble(PROP_FONT_SIZE) * mScale; float letterSpacing = font.hasKey(PROP_LETTER_SPACING) ? - (float) font.getDouble(PROP_LETTER_SPACING) * mScale + Float.valueOf(font.getString(PROP_LETTER_SPACING)) * mScale : DEFAULT_LETTER_SPACING; boolean isBold = font.hasKey(PROP_FONT_WEIGHT) &&