Commit 875cca87 authored by Aleks Totic's avatar Aleks Totic Committed by Commit Bot

[LayoutNG] Avoid creating NGPhysicalTextFragment::RareData

I am trying to figure out why laying out a large table takes up twice
as much memory in NG.

My test case is a 100K cells table (attached to bug).

When profiling, I've noticed that
NGPhysicalTextFragment had rare data 96340 times.
NGPaintFragment NGInkOverflowModel was being created 88360 times

This patch is my attempt to improve this. With the patch:
NGPhysicalTextFragment rare data is down to 82084
NGInkOverflowModel is down to 74080

The reason RareData was being created was that

ink_overflow.ExpandEdgesToPixelBoundaries()
local_ink_overflow = ConvertToLocal(ink_overflow)

local_rect.Contains(local_ink_overflow) was false whenever ink_overflow
was fractional (because it expanded).

Expanding edges only if local_rect does not contain local_ink_overflow
without expansion reduced the number of RareData created > 15%.

There is another problem with ascents/location that causes more cache
misses. I'll need @kojii's help with it.

Bug: 931663
Change-Id: I586ca26024338a97263f9d324d62a4a50d53895a
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1535294
Commit-Queue: Aleks Totic <atotic@chromium.org>
Reviewed-by: default avatarEmil A Eklund <eae@chromium.org>
Reviewed-by: default avatarKoji Ishii <kojii@chromium.org>
Cr-Commit-Position: refs/heads/master@{#649745}
parent a269bc04
...@@ -73,6 +73,17 @@ void NGPhysicalOffsetRect::Expand(const NGPhysicalBoxStrut& strut) { ...@@ -73,6 +73,17 @@ void NGPhysicalOffsetRect::Expand(const NGPhysicalBoxStrut& strut) {
} }
} }
void NGPhysicalOffsetRect::ExpandEdgesToPixelBoundaries() {
int left = FloorToInt(offset.left);
int top = FloorToInt(offset.top);
int max_right = (offset.left + size.width).Ceil();
int max_bottom = (offset.top + size.height).Ceil();
offset.left = LayoutUnit(left);
offset.top = LayoutUnit(top);
size.width = LayoutUnit(max_right - left);
size.height = LayoutUnit(max_bottom - top);
}
NGPhysicalOffsetRect::NGPhysicalOffsetRect(const LayoutRect& source) NGPhysicalOffsetRect::NGPhysicalOffsetRect(const LayoutRect& source)
: NGPhysicalOffsetRect({source.X(), source.Y()}, : NGPhysicalOffsetRect({source.X(), source.Y()},
{source.Width(), source.Height()}) {} {source.Width(), source.Height()}) {}
......
...@@ -43,6 +43,7 @@ struct CORE_EXPORT NGPhysicalOffsetRect { ...@@ -43,6 +43,7 @@ struct CORE_EXPORT NGPhysicalOffsetRect {
void UniteEvenIfEmpty(const NGPhysicalOffsetRect&); void UniteEvenIfEmpty(const NGPhysicalOffsetRect&);
void Expand(const NGPhysicalBoxStrut&); void Expand(const NGPhysicalBoxStrut&);
void ExpandEdgesToPixelBoundaries();
// Conversions from/to existing code. New code prefers type safety for // Conversions from/to existing code. New code prefers type safety for
// logical/physical distinctions. // logical/physical distinctions.
......
...@@ -267,8 +267,6 @@ void NGPhysicalTextFragment::UpdateSelfInkOverflow() { ...@@ -267,8 +267,6 @@ void NGPhysicalTextFragment::UpdateSelfInkOverflow() {
ink_overflow.Expand(text_shadow_logical_outsets); ink_overflow.Expand(text_shadow_logical_outsets);
} }
ink_overflow.ExpandEdgesToPixelBoundaries();
// Uniting the frame rect ensures that non-ink spaces such side bearings, or // Uniting the frame rect ensures that non-ink spaces such side bearings, or
// even space characters, are included in the visual rect for decorations. // even space characters, are included in the visual rect for decorations.
NGPhysicalOffsetRect local_ink_overflow = ConvertToLocal(ink_overflow); NGPhysicalOffsetRect local_ink_overflow = ConvertToLocal(ink_overflow);
...@@ -278,6 +276,7 @@ void NGPhysicalTextFragment::UpdateSelfInkOverflow() { ...@@ -278,6 +276,7 @@ void NGPhysicalTextFragment::UpdateSelfInkOverflow() {
return; return;
} }
local_ink_overflow.Unite(local_rect); local_ink_overflow.Unite(local_rect);
local_ink_overflow.ExpandEdgesToPixelBoundaries();
EnsureRareData()->self_ink_overflow_ = local_ink_overflow; EnsureRareData()->self_ink_overflow_ = local_ink_overflow;
} }
......
...@@ -144,6 +144,9 @@ class CORE_EXPORT NGPhysicalTextFragment final : public NGPhysicalFragment { ...@@ -144,6 +144,9 @@ class CORE_EXPORT NGPhysicalTextFragment final : public NGPhysicalFragment {
scoped_refptr<const ShapeResultView> shape_result); scoped_refptr<const ShapeResultView> shape_result);
struct RareData { struct RareData {
USING_FAST_MALLOC(RareData);
public:
NGPhysicalOffsetRect self_ink_overflow_; NGPhysicalOffsetRect self_ink_overflow_;
scoped_refptr<const ComputedStyle> style_; // Used only for ellipsis. scoped_refptr<const ComputedStyle> style_; // Used only for ellipsis.
}; };
......
...@@ -348,6 +348,9 @@ class CORE_EXPORT NGPaintFragment : public RefCounted<NGPaintFragment>, ...@@ -348,6 +348,9 @@ class CORE_EXPORT NGPaintFragment : public RefCounted<NGPaintFragment>,
// The ink overflow storage for when |InkOverflowOwnerBox()| is nullptr. // The ink overflow storage for when |InkOverflowOwnerBox()| is nullptr.
struct NGInkOverflowModel { struct NGInkOverflowModel {
USING_FAST_MALLOC(NGInkOverflowModel);
public:
NGInkOverflowModel(const NGPhysicalOffsetRect& self_ink_overflow, NGInkOverflowModel(const NGPhysicalOffsetRect& self_ink_overflow,
const NGPhysicalOffsetRect& contents_ink_overflow); const NGPhysicalOffsetRect& contents_ink_overflow);
......
...@@ -133,33 +133,33 @@ ...@@ -133,33 +133,33 @@
"reason": "geometry" "reason": "geometry"
}, },
{ {
"object": "NGPhysicalTextFragment 'for the hedgehogs; and in a very short time '", "object": "NGPhysicalTextFragment 'about once in a minute.'",
"rect": [14, 420, 356, 39], "rect": [14, 460, 355, 59],
"reason": "geometry" "reason": "geometry"
}, },
{ {
"object": "NGPhysicalTextFragment 'for turns, quarrelling all the while, and fighting'", "object": "NGPhysicalTextFragment 'shouting \u2018Off with his head!\u2019 or \u2018Off with her head!\u2019'",
"rect": [14, 420, 356, 39], "rect": [14, 460, 355, 59],
"reason": "geometry" "reason": "geometry"
}, },
{ {
"object": "NGPhysicalTextFragment 'about once in a minute.'", "object": "NGPhysicalTextFragment 'was in a furious passion, and went stamping about, and'",
"rect": [14, 460, 355, 59], "rect": [14, 460, 355, 59],
"reason": "geometry" "reason": "geometry"
}, },
{ {
"object": "NGPhysicalTextFragment 'shouting \u2018Off with his head!\u2019 or \u2018Off with her head!\u2019'", "object": "NGPhysicalTextFragment 'for the hedgehogs; and in a very short time '",
"rect": [14, 460, 355, 59], "rect": [14, 420, 355, 39],
"reason": "geometry" "reason": "geometry"
}, },
{ {
"object": "NGPhysicalTextFragment 'was in a furious passion, and went stamping about, and'", "object": "NGPhysicalTextFragment 'for turns, quarrelling all the while, and fighting'",
"rect": [14, 460, 355, 59], "rect": [14, 420, 355, 39],
"reason": "geometry" "reason": "geometry"
}, },
{ {
"object": "NGPhysicalTextFragment 'The players all played at once without waiting'", "object": "NGPhysicalTextFragment 'The players all played at once without waiting'",
"rect": [65, 400, 305, 19], "rect": [65, 400, 304, 19],
"reason": "geometry" "reason": "geometry"
}, },
{ {
...@@ -169,7 +169,7 @@ ...@@ -169,7 +169,7 @@
}, },
{ {
"object": "NGPhysicalTextFragment 'the Queen'", "object": "NGPhysicalTextFragment 'the Queen'",
"rect": [302, 440, 68, 19], "rect": [302, 440, 67, 19],
"reason": "geometry" "reason": "geometry"
}, },
{ {
......
...@@ -102,16 +102,6 @@ ...@@ -102,16 +102,6 @@
"rect": [65, 360, 356, 39], "rect": [65, 360, 356, 39],
"reason": "geometry" "reason": "geometry"
}, },
{
"object": "NGPhysicalTextFragment 'for the hedgehogs; and in a very short time '",
"rect": [14, 420, 356, 39],
"reason": "geometry"
},
{
"object": "NGPhysicalTextFragment 'for turns, quarrelling all the while, and fighting'",
"rect": [14, 420, 356, 39],
"reason": "geometry"
},
{ {
"object": "NGPhysicalTextFragment ' was in a furious passion, and went stamping'", "object": "NGPhysicalTextFragment ' was in a furious passion, and went stamping'",
"rect": [14, 460, 355, 59], "rect": [14, 460, 355, 59],
...@@ -142,6 +132,16 @@ ...@@ -142,6 +132,16 @@
"rect": [14, 440, 355, 39], "rect": [14, 440, 355, 39],
"reason": "geometry" "reason": "geometry"
}, },
{
"object": "NGPhysicalTextFragment 'for the hedgehogs; and in a very short time '",
"rect": [14, 420, 355, 39],
"reason": "geometry"
},
{
"object": "NGPhysicalTextFragment 'for turns, quarrelling all the while, and fighting'",
"rect": [14, 420, 355, 39],
"reason": "geometry"
},
{ {
"object": "NGPhysicalTextFragment 'The chief difficulty Alice found at first was in managing'", "object": "NGPhysicalTextFragment 'The chief difficulty Alice found at first was in managing'",
"rect": [14, 80, 354, 119], "rect": [14, 80, 354, 119],
...@@ -174,12 +174,7 @@ ...@@ -174,12 +174,7 @@
}, },
{ {
"object": "NGPhysicalTextFragment 'The players all played at once without waiting'", "object": "NGPhysicalTextFragment 'The players all played at once without waiting'",
"rect": [65, 400, 305, 19], "rect": [65, 400, 304, 19],
"reason": "geometry"
},
{
"object": "NGPhysicalTextFragment 'the'",
"rect": [302, 440, 68, 19],
"reason": "geometry" "reason": "geometry"
}, },
{ {
......
...@@ -192,26 +192,6 @@ ...@@ -192,26 +192,6 @@
"rect": [65, 360, 356, 39], "rect": [65, 360, 356, 39],
"reason": "geometry" "reason": "geometry"
}, },
{
"object": "NGPhysicalTextFragment 'for the hedgehogs; and in a very short time '",
"rect": [14, 421, 356, 39],
"reason": "geometry"
},
{
"object": "NGPhysicalTextFragment 'for turns, quarrelling all the while, and fighting'",
"rect": [14, 421, 356, 39],
"reason": "geometry"
},
{
"object": "NGPhysicalTextFragment 'for the hedgehogs; and in a very short time '",
"rect": [14, 420, 356, 39],
"reason": "geometry"
},
{
"object": "NGPhysicalTextFragment 'for turns, quarrelling all the while, and fighting'",
"rect": [14, 420, 356, 39],
"reason": "geometry"
},
{ {
"object": "NGPhysicalTextFragment 'about once in a minute.'", "object": "NGPhysicalTextFragment 'about once in a minute.'",
"rect": [14, 461, 355, 59], "rect": [14, 461, 355, 59],
...@@ -242,6 +222,26 @@ ...@@ -242,6 +222,26 @@
"rect": [14, 460, 355, 59], "rect": [14, 460, 355, 59],
"reason": "geometry" "reason": "geometry"
}, },
{
"object": "NGPhysicalTextFragment 'for the hedgehogs; and in a very short time '",
"rect": [14, 421, 355, 39],
"reason": "geometry"
},
{
"object": "NGPhysicalTextFragment 'for turns, quarrelling all the while, and fighting'",
"rect": [14, 421, 355, 39],
"reason": "geometry"
},
{
"object": "NGPhysicalTextFragment 'for the hedgehogs; and in a very short time '",
"rect": [14, 420, 355, 39],
"reason": "geometry"
},
{
"object": "NGPhysicalTextFragment 'for turns, quarrelling all the while, and fighting'",
"rect": [14, 420, 355, 39],
"reason": "geometry"
},
{ {
"object": "NGPhysicalTextFragment 'The chief difficulty Alice found at first was in managing'", "object": "NGPhysicalTextFragment 'The chief difficulty Alice found at first was in managing'",
"rect": [14, 80, 354, 120], "rect": [14, 80, 354, 120],
...@@ -274,22 +274,22 @@ ...@@ -274,22 +274,22 @@
}, },
{ {
"object": "NGPhysicalTextFragment 'The players all played at once without waiting'", "object": "NGPhysicalTextFragment 'The players all played at once without waiting'",
"rect": [65, 401, 305, 19], "rect": [65, 401, 304, 19],
"reason": "geometry" "reason": "geometry"
}, },
{ {
"object": "NGPhysicalTextFragment 'The players all played at once without waiting'", "object": "NGPhysicalTextFragment 'The players all played at once without waiting'",
"rect": [65, 400, 305, 19], "rect": [65, 400, 304, 19],
"reason": "geometry" "reason": "geometry"
}, },
{ {
"object": "NGPhysicalTextFragment 'the Queen'", "object": "NGPhysicalTextFragment 'the Queen'",
"rect": [302, 441, 68, 19], "rect": [302, 441, 67, 19],
"reason": "geometry" "reason": "geometry"
}, },
{ {
"object": "NGPhysicalTextFragment 'the Queen'", "object": "NGPhysicalTextFragment 'the Queen'",
"rect": [302, 440, 68, 19], "rect": [302, 440, 67, 19],
"reason": "geometry" "reason": "geometry"
}, },
{ {
......
...@@ -164,37 +164,37 @@ ...@@ -164,37 +164,37 @@
}, },
{ {
"object": "NGPhysicalTextFragment ' was in'", "object": "NGPhysicalTextFragment ' was in'",
"rect": [14, 440, 340, 79], "rect": [14, 440, 339, 79],
"reason": "appeared" "reason": "appeared"
}, },
{ {
"object": "NGPhysicalTextFragment 'a furious passion, and went stamping about, and'", "object": "NGPhysicalTextFragment 'a furious passion, and went stamping about, and'",
"rect": [14, 440, 340, 79], "rect": [14, 440, 339, 79],
"reason": "geometry" "reason": "geometry"
}, },
{ {
"object": "NGPhysicalTextFragment 'about once in a minute.'", "object": "NGPhysicalTextFragment 'about once in a minute.'",
"rect": [14, 440, 340, 79], "rect": [14, 440, 339, 79],
"reason": "geometry" "reason": "geometry"
}, },
{ {
"object": "NGPhysicalTextFragment 'shouting \u2018Off with his head!\u2019 or \u2018Off with her head!\u2019'", "object": "NGPhysicalTextFragment 'shouting \u2018Off with his head!\u2019 or \u2018Off with her head!\u2019'",
"rect": [14, 440, 340, 79], "rect": [14, 440, 339, 79],
"reason": "geometry" "reason": "geometry"
}, },
{ {
"object": "NGPhysicalTextFragment 'The players all played at once without waiting '", "object": "NGPhysicalTextFragment 'The players all played at once without waiting '",
"rect": [65, 400, 305, 19], "rect": [65, 400, 304, 19],
"reason": "geometry" "reason": "geometry"
}, },
{ {
"object": "NGPhysicalTextFragment 'the Queen'", "object": "NGPhysicalTextFragment 'the Queen'",
"rect": [302, 440, 68, 19], "rect": [302, 440, 67, 19],
"reason": "geometry" "reason": "geometry"
}, },
{ {
"object": "NGPhysicalTextFragment 'the Queen'", "object": "NGPhysicalTextFragment 'the Queen'",
"rect": [242, 440, 67, 19], "rect": [242, 440, 66, 19],
"reason": "geometry" "reason": "geometry"
}, },
{ {
......
...@@ -119,12 +119,12 @@ ...@@ -119,12 +119,12 @@
}, },
{ {
"object": "NGPhysicalTextFragment 'for the hedgehogs; and in a very short time '", "object": "NGPhysicalTextFragment 'for the hedgehogs; and in a very short time '",
"rect": [14, 420, 356, 39], "rect": [14, 420, 355, 39],
"reason": "geometry" "reason": "geometry"
}, },
{ {
"object": "NGPhysicalTextFragment 'for turns, quarrelling all the while, and fighting'", "object": "NGPhysicalTextFragment 'for turns, quarrelling all the while, and fighting'",
"rect": [14, 420, 356, 39], "rect": [14, 420, 355, 39],
"reason": "geometry" "reason": "geometry"
}, },
{ {
...@@ -159,12 +159,12 @@ ...@@ -159,12 +159,12 @@
}, },
{ {
"object": "NGPhysicalTextFragment 'The players all played at once without waiting'", "object": "NGPhysicalTextFragment 'The players all played at once without waiting'",
"rect": [65, 400, 305, 19], "rect": [65, 400, 304, 19],
"reason": "geometry" "reason": "geometry"
}, },
{ {
"object": "NGPhysicalTextFragment 'the Queen'", "object": "NGPhysicalTextFragment 'the Queen'",
"rect": [302, 440, 68, 19], "rect": [302, 440, 67, 19],
"reason": "geometry" "reason": "geometry"
}, },
{ {
......
...@@ -103,38 +103,38 @@ ...@@ -103,38 +103,38 @@
"reason": "geometry" "reason": "geometry"
}, },
{ {
"object": "NGPhysicalTextFragment ' was in a'", "object": "NGPhysicalTextFragment 'for'",
"rect": [14, 440, 356, 79], "rect": [14, 400, 356, 59],
"reason": "appeared" "reason": "appeared"
}, },
{ {
"object": "NGPhysicalTextFragment 'furious passion, and went stamping about, and shouting'", "object": "NGPhysicalTextFragment 'hedgehogs; and in a very short time '",
"rect": [14, 440, 356, 79], "rect": [14, 400, 356, 59],
"reason": "geometry" "reason": "geometry"
}, },
{ {
"object": "NGPhysicalTextFragment 'in a minute.'", "object": "NGPhysicalTextFragment 'turns, quarrelling all the while, and fighting for the'",
"rect": [14, 440, 356, 79], "rect": [14, 400, 356, 59],
"reason": "geometry" "reason": "geometry"
}, },
{ {
"object": "NGPhysicalTextFragment '\u2018Off with his head!\u2019 or \u2018Off with her head!\u2019 about once'", "object": "NGPhysicalTextFragment ' was in a'",
"rect": [14, 440, 356, 79], "rect": [14, 440, 355, 79],
"reason": "geometry" "reason": "appeared"
}, },
{ {
"object": "NGPhysicalTextFragment 'for'", "object": "NGPhysicalTextFragment 'furious passion, and went stamping about, and shouting'",
"rect": [14, 400, 356, 59], "rect": [14, 440, 355, 79],
"reason": "appeared" "reason": "geometry"
}, },
{ {
"object": "NGPhysicalTextFragment 'hedgehogs; and in a very short time '", "object": "NGPhysicalTextFragment 'in a minute.'",
"rect": [14, 400, 356, 59], "rect": [14, 440, 355, 79],
"reason": "geometry" "reason": "geometry"
}, },
{ {
"object": "NGPhysicalTextFragment 'turns, quarrelling all the while, and fighting for the'", "object": "NGPhysicalTextFragment '\u2018Off with his head!\u2019 or \u2018Off with her head!\u2019 about once'",
"rect": [14, 400, 356, 59], "rect": [14, 440, 355, 79],
"reason": "geometry" "reason": "geometry"
}, },
{ {
...@@ -169,7 +169,7 @@ ...@@ -169,7 +169,7 @@
}, },
{ {
"object": "NGPhysicalTextFragment 'The players all played at once without waiting '", "object": "NGPhysicalTextFragment 'The players all played at once without waiting '",
"rect": [65, 400, 305, 19], "rect": [65, 400, 304, 19],
"reason": "geometry" "reason": "geometry"
}, },
{ {
...@@ -179,7 +179,7 @@ ...@@ -179,7 +179,7 @@
}, },
{ {
"object": "NGPhysicalTextFragment 'the Queen'", "object": "NGPhysicalTextFragment 'the Queen'",
"rect": [302, 440, 68, 19], "rect": [302, 440, 67, 19],
"reason": "geometry" "reason": "geometry"
}, },
{ {
......
...@@ -103,28 +103,28 @@ ...@@ -103,28 +103,28 @@
"reason": "geometry" "reason": "geometry"
}, },
{ {
"object": "NGPhysicalTextFragment 'for the hedgehogs; and in a very short time '", "object": "NGPhysicalTextFragment 'about once in a minute.'",
"rect": [14, 420, 356, 39], "rect": [14, 460, 355, 59],
"reason": "geometry" "reason": "geometry"
}, },
{ {
"object": "NGPhysicalTextFragment 'for turns, quarrelling all the while, and fighting'", "object": "NGPhysicalTextFragment 'shouting \u2018Off with his head!\u2019 or \u2018Off with her head!\u2019'",
"rect": [14, 420, 356, 39], "rect": [14, 460, 355, 59],
"reason": "geometry" "reason": "geometry"
}, },
{ {
"object": "NGPhysicalTextFragment 'about once in a minute.'", "object": "NGPhysicalTextFragment 'was in a furious passion, and went stamping about, and'",
"rect": [14, 460, 355, 59], "rect": [14, 460, 355, 59],
"reason": "geometry" "reason": "geometry"
}, },
{ {
"object": "NGPhysicalTextFragment 'shouting \u2018Off with his head!\u2019 or \u2018Off with her head!\u2019'", "object": "NGPhysicalTextFragment 'for the hedgehogs; and in a very short time '",
"rect": [14, 460, 355, 59], "rect": [14, 420, 355, 39],
"reason": "geometry" "reason": "geometry"
}, },
{ {
"object": "NGPhysicalTextFragment 'was in a furious passion, and went stamping about, and'", "object": "NGPhysicalTextFragment 'for turns, quarrelling all the while, and fighting'",
"rect": [14, 460, 355, 59], "rect": [14, 420, 355, 39],
"reason": "geometry" "reason": "geometry"
}, },
{ {
...@@ -159,12 +159,12 @@ ...@@ -159,12 +159,12 @@
}, },
{ {
"object": "NGPhysicalTextFragment 'The players all played at once without waiting'", "object": "NGPhysicalTextFragment 'The players all played at once without waiting'",
"rect": [65, 400, 305, 19], "rect": [65, 400, 304, 19],
"reason": "geometry" "reason": "geometry"
}, },
{ {
"object": "NGPhysicalTextFragment 'the Queen'", "object": "NGPhysicalTextFragment 'the Queen'",
"rect": [302, 440, 68, 19], "rect": [302, 440, 67, 19],
"reason": "geometry" "reason": "geometry"
}, },
{ {
......
...@@ -103,28 +103,28 @@ ...@@ -103,28 +103,28 @@
"reason": "geometry" "reason": "geometry"
}, },
{ {
"object": "NGPhysicalTextFragment 'for the hedgehogs; and in a very short time '", "object": "NGPhysicalTextFragment 'about once in a minute.'",
"rect": [14, 420, 356, 39], "rect": [14, 460, 355, 59],
"reason": "geometry" "reason": "geometry"
}, },
{ {
"object": "NGPhysicalTextFragment 'for turns, quarrelling all the while, and fighting'", "object": "NGPhysicalTextFragment 'shouting \u2018Off with his head!\u2019 or \u2018Off with her head!\u2019'",
"rect": [14, 420, 356, 39], "rect": [14, 460, 355, 59],
"reason": "geometry" "reason": "geometry"
}, },
{ {
"object": "NGPhysicalTextFragment 'about once in a minute.'", "object": "NGPhysicalTextFragment 'was in a furious passion, and went stamping about, and'",
"rect": [14, 460, 355, 59], "rect": [14, 460, 355, 59],
"reason": "geometry" "reason": "geometry"
}, },
{ {
"object": "NGPhysicalTextFragment 'shouting \u2018Off with his head!\u2019 or \u2018Off with her head!\u2019'", "object": "NGPhysicalTextFragment 'for the hedgehogs; and in a very short time '",
"rect": [14, 460, 355, 59], "rect": [14, 420, 355, 39],
"reason": "geometry" "reason": "geometry"
}, },
{ {
"object": "NGPhysicalTextFragment 'was in a furious passion, and went stamping about, and'", "object": "NGPhysicalTextFragment 'for turns, quarrelling all the while, and fighting'",
"rect": [14, 460, 355, 59], "rect": [14, 420, 355, 39],
"reason": "geometry" "reason": "geometry"
}, },
{ {
...@@ -159,12 +159,12 @@ ...@@ -159,12 +159,12 @@
}, },
{ {
"object": "NGPhysicalTextFragment 'The players all played at once without waiting'", "object": "NGPhysicalTextFragment 'The players all played at once without waiting'",
"rect": [65, 400, 305, 19], "rect": [65, 400, 304, 19],
"reason": "geometry" "reason": "geometry"
}, },
{ {
"object": "NGPhysicalTextFragment 'the Queen'", "object": "NGPhysicalTextFragment 'the Queen'",
"rect": [298, 440, 72, 19], "rect": [298, 440, 71, 19],
"reason": "style change" "reason": "style change"
}, },
{ {
......
...@@ -127,16 +127,6 @@ ...@@ -127,16 +127,6 @@
"rect": [65, 360, 356, 39], "rect": [65, 360, 356, 39],
"reason": "disappeared" "reason": "disappeared"
}, },
{
"object": "NGPhysicalTextFragment 'and in a very short time '",
"rect": [14, 420, 356, 39],
"reason": "geometry"
},
{
"object": "NGPhysicalTextFragment 'quarrelling all the while, and fighting for the hedgehogs;'",
"rect": [14, 420, 356, 39],
"reason": "geometry"
},
{ {
"object": "NGPhysicalTextFragment 'and in a very short time '", "object": "NGPhysicalTextFragment 'and in a very short time '",
"rect": [14, 400, 355, 59], "rect": [14, 400, 355, 59],
...@@ -184,7 +174,7 @@ ...@@ -184,7 +174,7 @@
}, },
{ {
"object": "NGPhysicalTextFragment 'The players all played at once without waiting '", "object": "NGPhysicalTextFragment 'The players all played at once without waiting '",
"rect": [65, 400, 305, 19], "rect": [65, 400, 304, 19],
"reason": "geometry" "reason": "geometry"
}, },
{ {
...@@ -194,12 +184,12 @@ ...@@ -194,12 +184,12 @@
}, },
{ {
"object": "NGPhysicalTextFragment 'the Queen'", "object": "NGPhysicalTextFragment 'the Queen'",
"rect": [184, 440, 70, 19], "rect": [184, 440, 69, 19],
"reason": "geometry" "reason": "geometry"
}, },
{ {
"object": "NGPhysicalTextFragment 'the Queen'", "object": "NGPhysicalTextFragment 'the Queen'",
"rect": [302, 440, 68, 19], "rect": [302, 440, 67, 19],
"reason": "geometry" "reason": "geometry"
}, },
{ {
......
...@@ -107,16 +107,6 @@ ...@@ -107,16 +107,6 @@
"rect": [65, 360, 356, 39], "rect": [65, 360, 356, 39],
"reason": "disappeared" "reason": "disappeared"
}, },
{
"object": "NGPhysicalTextFragment 'for the hedgehogs; and in a very short time '",
"rect": [14, 420, 356, 39],
"reason": "geometry"
},
{
"object": "NGPhysicalTextFragment 'for turns, quarrelling all the while, and fighting'",
"rect": [14, 420, 356, 39],
"reason": "geometry"
},
{ {
"object": "NGPhysicalTextFragment ' was in a furious passion, and went stamping'", "object": "NGPhysicalTextFragment ' was in a furious passion, and went stamping'",
"rect": [14, 460, 355, 59], "rect": [14, 460, 355, 59],
...@@ -147,6 +137,16 @@ ...@@ -147,6 +137,16 @@
"rect": [14, 440, 355, 39], "rect": [14, 440, 355, 39],
"reason": "geometry" "reason": "geometry"
}, },
{
"object": "NGPhysicalTextFragment 'for the hedgehogs; and in a very short time '",
"rect": [14, 420, 355, 39],
"reason": "geometry"
},
{
"object": "NGPhysicalTextFragment 'for turns, quarrelling all the while, and fighting'",
"rect": [14, 420, 355, 39],
"reason": "geometry"
},
{ {
"object": "NGPhysicalTextFragment 'The chief difficulty Alice found at first was in managing'", "object": "NGPhysicalTextFragment 'The chief difficulty Alice found at first was in managing'",
"rect": [14, 80, 354, 119], "rect": [14, 80, 354, 119],
...@@ -179,12 +179,7 @@ ...@@ -179,12 +179,7 @@
}, },
{ {
"object": "NGPhysicalTextFragment 'The players all played at once without waiting'", "object": "NGPhysicalTextFragment 'The players all played at once without waiting'",
"rect": [65, 400, 305, 19], "rect": [65, 400, 304, 19],
"reason": "geometry"
},
{
"object": "NGPhysicalTextFragment 'the'",
"rect": [302, 440, 68, 19],
"reason": "geometry" "reason": "geometry"
}, },
{ {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment