diff --git a/android/src/main/java/com/horcrux/svg/GlyphContext.java b/android/src/main/java/com/horcrux/svg/GlyphContext.java index 75591238..68dfa8c5 100644 --- a/android/src/main/java/com/horcrux/svg/GlyphContext.java +++ b/android/src/main/java/com/horcrux/svg/GlyphContext.java @@ -35,6 +35,7 @@ class GlyphContext { private ArrayList> mDeltaYsContext = new ArrayList<>(); private ArrayList mFontContext = new ArrayList<>(); private ArrayList mRotationContext = new ArrayList<>(); + private ArrayList mNodes = new ArrayList<>(); private ArrayList mRotations = new ArrayList<>(); private @Nonnull PointF mCurrentLocation = new PointF(); private ArrayList mDeltaXs = new ArrayList<>(); @@ -55,7 +56,7 @@ class GlyphContext { mScale = scale; } - void pushContext(@Nullable ReadableMap font) { + void pushContext(GroupShadowNode node, @Nullable ReadableMap font) { mRotationsContext.add(mRotations); mRotationContext.add(mRotation); mDeltaXsContext.add(mDeltaXs); @@ -63,11 +64,12 @@ class GlyphContext { mXPositionsContext.add(mXs); mYPositionsContext.add(mYs); mFontContext.add(font); + mNodes.add(node); mContextLength++; top++; } - void pushContext(@Nullable ReadableMap font, @Nullable ReadableArray rotate, @Nullable ReadableArray deltaX, @Nullable ReadableArray deltaY, @Nullable String positionX, @Nullable String positionY) { + void pushContext(TextShadowNode node, @Nullable ReadableMap font, @Nullable ReadableArray rotate, @Nullable ReadableArray deltaX, @Nullable ReadableArray deltaY, @Nullable String positionX, @Nullable String positionY) { if (positionX != null) { mXs = new ArrayList<>(Arrays.asList(positionX.trim().split("\\s+"))); } @@ -99,6 +101,7 @@ class GlyphContext { mXPositionsContext.add(mXs); mYPositionsContext.add(mYs); mFontContext.add(font); + mNodes.add(node); mContextLength++; top++; } @@ -117,6 +120,7 @@ class GlyphContext { mDeltaYsContext.remove(mContextLength); mFontContext.remove(mContextLength); + mNodes.remove(mContextLength); if (mContextLength != 0) { mRotations = mRotationsContext.get(top); @@ -225,6 +229,10 @@ class GlyphContext { } } + if (top > -1) { + return mNodes.get(0).getFontSizeFromParentContext(); + } + return DEFAULT_FONT_SIZE; } diff --git a/android/src/main/java/com/horcrux/svg/GroupShadowNode.java b/android/src/main/java/com/horcrux/svg/GroupShadowNode.java index 24213f02..ef24f843 100644 --- a/android/src/main/java/com/horcrux/svg/GroupShadowNode.java +++ b/android/src/main/java/com/horcrux/svg/GroupShadowNode.java @@ -48,7 +48,7 @@ class GroupShadowNode extends RenderableShadowNode { } protected void pushGlyphContext() { - getTextRoot().getGlyphContext().pushContext(mFont); + getTextRoot().getGlyphContext().pushContext(this, mFont); } protected void popGlyphContext() { diff --git a/android/src/main/java/com/horcrux/svg/TextShadowNode.java b/android/src/main/java/com/horcrux/svg/TextShadowNode.java index 7c69b4c8..bfff1fba 100644 --- a/android/src/main/java/com/horcrux/svg/TextShadowNode.java +++ b/android/src/main/java/com/horcrux/svg/TextShadowNode.java @@ -178,6 +178,6 @@ class TextShadowNode extends GroupShadowNode { @Override protected void pushGlyphContext() { - getTextRoot().getGlyphContext().pushContext(mFont, mRotate, mDeltaX, mDeltaY, mPositionX, mPositionY); + getTextRoot().getGlyphContext().pushContext(this, mFont, mRotate, mDeltaX, mDeltaY, mPositionX, mPositionY); } } diff --git a/android/src/main/java/com/horcrux/svg/VirtualNode.java b/android/src/main/java/com/horcrux/svg/VirtualNode.java index a6c1dd33..fe19d942 100644 --- a/android/src/main/java/com/horcrux/svg/VirtualNode.java +++ b/android/src/main/java/com/horcrux/svg/VirtualNode.java @@ -51,6 +51,7 @@ public abstract class VirtualNode extends LayoutShadowNode { private SvgViewShadowNode mSvgShadowNode; private Path mCachedClipPath; + private GroupShadowNode mParentTextRoot; private GroupShadowNode mTextRoot; public VirtualNode() { @@ -70,6 +71,37 @@ public abstract class VirtualNode extends LayoutShadowNode { return shadowNode; } + GroupShadowNode getParentTextRoot() { + GroupShadowNode shadowNode = getParentShadowNode(GroupShadowNode.class); + if (shadowNode == null) { + return getParentShadowNode(TextShadowNode.class); + } + return shadowNode; + } + + @android.support.annotation.Nullable + private GroupShadowNode getParentShadowNode(Class shadowNodeClass) { + ReactShadowNode node = this.getParent(); + if (mParentTextRoot == null) { + while (node != null) { + if (node.getClass() == shadowNodeClass) { + mParentTextRoot = (GroupShadowNode)node; + break; + } + + ReactShadowNode parent = node.getParent(); + + if (!(parent instanceof VirtualNode)) { + node = null; + } else { + node = parent; + } + } + } + + return mParentTextRoot; + } + @android.support.annotation.Nullable private GroupShadowNode getShadowNode(Class shadowNodeClass) { VirtualNode node = this; @@ -101,6 +133,14 @@ public abstract class VirtualNode extends LayoutShadowNode { return root.getGlyphContext().getFontSize(); } + double getFontSizeFromParentContext() { + GroupShadowNode root = getParentTextRoot(); + if (root == null) { + return DEFAULT_FONT_SIZE; + } + return root.getGlyphContext().getFontSize(); + } + public abstract void draw(Canvas canvas, Paint paint, float opacity); /**