Commit 023c33f1 authored by Fredrik Söderqvist's avatar Fredrik Söderqvist Committed by Commit Bot

Don't include clip/mask/filter bounds in SVG visual rects during layout

This should bring us closer to how other elements are handled. The
filter bounds are now applied when needed (if needed). The primary
change is removing SVGLayoutSupport::AdjustVisualRectWithResources calls
in the various layout paths.

This restores the tighter visual rects that was previously computed.
Since the visual rects propagated during layout no longer includes
clipping and masking, outlines are no longer clipped for containers.

Since we now no longer need to do any reading of other LayoutObject's
bounds during layout, it should be possible to clean up quite a bit of
hairy code in future CLs.

Bug: 109224, 1028061, 1131068, 1131105
Change-Id: I502d72a5bfb3aa9149306b6c4143c69781709792
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2050382Reviewed-by: default avatarXianzhu Wang <wangxianzhu@chromium.org>
Commit-Queue: Fredrik Söderquist <fs@opera.com>
Cr-Commit-Position: refs/heads/master@{#812109}
parent e649dcd5
...@@ -175,8 +175,6 @@ void LayoutSVGImage::UpdateLayout() { ...@@ -175,8 +175,6 @@ void LayoutSVGImage::UpdateLayout() {
bool update_parent_boundaries = false; bool update_parent_boundaries = false;
if (needs_boundaries_update_) { if (needs_boundaries_update_) {
local_visual_rect_ = object_bounding_box_; local_visual_rect_ = object_bounding_box_;
SVGLayoutSupport::AdjustVisualRectWithResources(*this, object_bounding_box_,
local_visual_rect_);
needs_boundaries_update_ = false; needs_boundaries_update_ = false;
update_parent_boundaries = true; update_parent_boundaries = true;
} }
......
...@@ -81,12 +81,7 @@ FloatRect LayoutSVGInline::VisualRectInLocalSVGCoordinates() const { ...@@ -81,12 +81,7 @@ FloatRect LayoutSVGInline::VisualRectInLocalSVGCoordinates() const {
NOT_DESTROYED(); NOT_DESTROYED();
if (!FirstLineBox()) if (!FirstLineBox())
return FloatRect(); return FloatRect();
const LayoutSVGText* text_root = return SVGLayoutSupport::ComputeVisualRectForText(*this, ObjectBoundingBox());
LayoutSVGText::LocateLayoutSVGTextAncestor(this);
if (!text_root)
return FloatRect();
return SVGLayoutSupport::ComputeVisualRectForText(
*this, ObjectBoundingBox(), text_root->ObjectBoundingBox());
} }
PhysicalRect LayoutSVGInline::VisualRectInDocument( PhysicalRect LayoutSVGInline::VisualRectInDocument(
......
...@@ -91,8 +91,14 @@ void LayoutSVGModelObject::AddOutlineRects(Vector<PhysicalRect>& rects, ...@@ -91,8 +91,14 @@ void LayoutSVGModelObject::AddOutlineRects(Vector<PhysicalRect>& rects,
const PhysicalOffset&, const PhysicalOffset&,
NGOutlineType) const { NGOutlineType) const {
NOT_DESTROYED(); NOT_DESTROYED();
rects.push_back( FloatRect visual_rect = VisualRectInLocalSVGCoordinates();
PhysicalRect::EnclosingRect(VisualRectInLocalSVGCoordinates())); bool was_empty = visual_rect.IsEmpty();
SVGLayoutSupport::AdjustWithClipPathAndMask(*this, ObjectBoundingBox(),
visual_rect);
// If visual rect is clipped away then don't add it.
if (!was_empty && visual_rect.IsEmpty())
return;
rects.push_back(PhysicalRect::EnclosingRect(visual_rect));
} }
FloatRect LayoutSVGModelObject::LocalBoundingBoxRectForAccessibility() const { FloatRect LayoutSVGModelObject::LocalBoundingBoxRectForAccessibility() const {
......
...@@ -291,8 +291,6 @@ void LayoutSVGShape::UpdateLayout() { ...@@ -291,8 +291,6 @@ void LayoutSVGShape::UpdateLayout() {
needs_shape_update_ = false; needs_shape_update_ = false;
local_visual_rect_ = StrokeBoundingBox(); local_visual_rect_ = StrokeBoundingBox();
SVGLayoutSupport::AdjustVisualRectWithResources(*this, ObjectBoundingBox(),
local_visual_rect_);
needs_boundaries_update_ = false; needs_boundaries_update_ = false;
update_parent_boundaries = true; update_parent_boundaries = true;
......
...@@ -383,9 +383,7 @@ FloatRect LayoutSVGText::VisualRectInLocalSVGCoordinates() const { ...@@ -383,9 +383,7 @@ FloatRect LayoutSVGText::VisualRectInLocalSVGCoordinates() const {
NOT_DESTROYED(); NOT_DESTROYED();
if (!FirstRootBox()) if (!FirstRootBox())
return FloatRect(); return FloatRect();
const FloatRect object_bounds = ObjectBoundingBox(); return SVGLayoutSupport::ComputeVisualRectForText(*this, ObjectBoundingBox());
return SVGLayoutSupport::ComputeVisualRectForText(*this, object_bounds,
object_bounds);
} }
void LayoutSVGText::AddOutlineRects(Vector<PhysicalRect>& rects, void LayoutSVGText::AddOutlineRects(Vector<PhysicalRect>& rects,
......
...@@ -31,7 +31,6 @@ ...@@ -31,7 +31,6 @@
#include "third_party/blink/renderer/core/layout/svg/layout_svg_image.h" #include "third_party/blink/renderer/core/layout/svg/layout_svg_image.h"
#include "third_party/blink/renderer/core/layout/svg/layout_svg_inline_text.h" #include "third_party/blink/renderer/core/layout/svg/layout_svg_inline_text.h"
#include "third_party/blink/renderer/core/layout/svg/layout_svg_resource_clipper.h" #include "third_party/blink/renderer/core/layout/svg/layout_svg_resource_clipper.h"
#include "third_party/blink/renderer/core/layout/svg/layout_svg_resource_filter.h"
#include "third_party/blink/renderer/core/layout/svg/layout_svg_resource_masker.h" #include "third_party/blink/renderer/core/layout/svg/layout_svg_resource_masker.h"
#include "third_party/blink/renderer/core/layout/svg/layout_svg_root.h" #include "third_party/blink/renderer/core/layout/svg/layout_svg_root.h"
#include "third_party/blink/renderer/core/layout/svg/layout_svg_shape.h" #include "third_party/blink/renderer/core/layout/svg/layout_svg_shape.h"
...@@ -84,29 +83,36 @@ PhysicalRect SVGLayoutSupport::VisualRectInAncestorSpace( ...@@ -84,29 +83,36 @@ PhysicalRect SVGLayoutSupport::VisualRectInAncestorSpace(
return rect; return rect;
} }
PhysicalRect SVGLayoutSupport::TransformVisualRect( static FloatRect MapToSVGRootIncludingFilter(
const LayoutObject& object, const LayoutObject& object,
const AffineTransform& root_transform, const FloatRect& local_visual_rect) {
const FloatRect& local_rect) { DCHECK(object.IsSVGChild());
FloatRect adjusted_rect = root_transform.MapRect(local_rect);
if (adjusted_rect.IsEmpty()) FloatRect visual_rect = local_visual_rect;
return PhysicalRect(); const LayoutObject* parent = &object;
for (; !parent->IsSVGRoot(); parent = parent->Parent()) {
const ComputedStyle& style = parent->StyleRef();
if (style.HasFilter())
visual_rect = style.Filter().MapRect(visual_rect);
visual_rect = parent->LocalToSVGParentTransform().MapRect(visual_rect);
}
// Use EnclosingIntRect because we cannot properly apply subpixel offset of const LayoutSVGRoot& svg_root = ToLayoutSVGRoot(*parent);
// the SVGRoot since we don't know the desired subpixel accumulation at this return svg_root.LocalToBorderBoxTransform().MapRect(visual_rect);
// point.
return PhysicalRect(EnclosingIntRect(adjusted_rect));
} }
static const LayoutSVGRoot& ComputeTransformToSVGRoot( static const LayoutSVGRoot& ComputeTransformToSVGRoot(
const LayoutObject& object, const LayoutObject& object,
AffineTransform& root_border_box_transform) { AffineTransform& root_border_box_transform,
bool* filter_skipped) {
DCHECK(object.IsSVGChild()); DCHECK(object.IsSVGChild());
const LayoutObject* parent; const LayoutObject* parent = &object;
for (parent = &object; !parent->IsSVGRoot(); parent = parent->Parent()) for (; !parent->IsSVGRoot(); parent = parent->Parent()) {
if (filter_skipped && parent->StyleRef().HasFilter())
*filter_skipped = true;
root_border_box_transform.PreMultiply(parent->LocalToSVGParentTransform()); root_border_box_transform.PreMultiply(parent->LocalToSVGParentTransform());
}
const LayoutSVGRoot& svg_root = ToLayoutSVGRoot(*parent); const LayoutSVGRoot& svg_root = ToLayoutSVGRoot(*parent);
root_border_box_transform.PreMultiply(svg_root.LocalToBorderBoxTransform()); root_border_box_transform.PreMultiply(svg_root.LocalToBorderBoxTransform());
...@@ -120,10 +126,24 @@ bool SVGLayoutSupport::MapToVisualRectInAncestorSpace( ...@@ -120,10 +126,24 @@ bool SVGLayoutSupport::MapToVisualRectInAncestorSpace(
PhysicalRect& result_rect, PhysicalRect& result_rect,
VisualRectFlags visual_rect_flags) { VisualRectFlags visual_rect_flags) {
AffineTransform root_border_box_transform; AffineTransform root_border_box_transform;
const LayoutSVGRoot& svg_root = bool filter_skipped = false;
ComputeTransformToSVGRoot(object, root_border_box_transform); const LayoutSVGRoot& svg_root = ComputeTransformToSVGRoot(
result_rect = object, root_border_box_transform, &filter_skipped);
TransformVisualRect(object, root_border_box_transform, local_visual_rect);
FloatRect adjusted_rect;
if (filter_skipped)
adjusted_rect = MapToSVGRootIncludingFilter(object, local_visual_rect);
else
adjusted_rect = root_border_box_transform.MapRect(local_visual_rect);
if (adjusted_rect.IsEmpty()) {
result_rect = PhysicalRect();
} else {
// Use EnclosingIntRect because we cannot properly apply subpixel offset of
// the SVGRoot since we don't know the desired subpixel accumulation at this
// point.
result_rect = PhysicalRect(EnclosingIntRect(adjusted_rect));
}
// Apply initial viewport clip. // Apply initial viewport clip.
if (svg_root.ShouldApplyViewportClip()) { if (svg_root.ShouldApplyViewportClip()) {
...@@ -172,7 +192,7 @@ void SVGLayoutSupport::MapAncestorToLocal(const LayoutObject& object, ...@@ -172,7 +192,7 @@ void SVGLayoutSupport::MapAncestorToLocal(const LayoutObject& object,
object.IsSVGForeignObject()); object.IsSVGForeignObject());
AffineTransform local_to_svg_root; AffineTransform local_to_svg_root;
const LayoutSVGRoot& svg_root = const LayoutSVGRoot& svg_root =
ComputeTransformToSVGRoot(object, local_to_svg_root); ComputeTransformToSVGRoot(object, local_to_svg_root, nullptr);
svg_root.MapAncestorToLocal(ancestor, transform_state, flags); svg_root.MapAncestorToLocal(ancestor, transform_state, flags);
...@@ -277,8 +297,6 @@ void SVGLayoutSupport::ComputeContainerBoundingBoxes( ...@@ -277,8 +297,6 @@ void SVGLayoutSupport::ComputeContainerBoundingBoxes(
} }
local_visual_rect = stroke_bounding_box; local_visual_rect = stroke_bounding_box;
AdjustVisualRectWithResources(*container, object_bounding_box,
local_visual_rect);
} }
bool SVGLayoutSupport::LayoutSizeOfNearestViewportChanged( bool SVGLayoutSupport::LayoutSizeOfNearestViewportChanged(
...@@ -389,7 +407,7 @@ bool SVGLayoutSupport::IsOverflowHidden(const ComputedStyle& style) { ...@@ -389,7 +407,7 @@ bool SVGLayoutSupport::IsOverflowHidden(const ComputedStyle& style) {
style.OverflowX() == EOverflow::kScroll; style.OverflowX() == EOverflow::kScroll;
} }
void SVGLayoutSupport::AdjustVisualRectWithResources( void SVGLayoutSupport::AdjustWithClipPathAndMask(
const LayoutObject& layout_object, const LayoutObject& layout_object,
const FloatRect& object_bounding_box, const FloatRect& object_bounding_box,
FloatRect& visual_rect) { FloatRect& visual_rect) {
...@@ -397,13 +415,8 @@ void SVGLayoutSupport::AdjustVisualRectWithResources( ...@@ -397,13 +415,8 @@ void SVGLayoutSupport::AdjustVisualRectWithResources(
SVGResourcesCache::CachedResourcesForLayoutObject(layout_object); SVGResourcesCache::CachedResourcesForLayoutObject(layout_object);
if (!resources) if (!resources)
return; return;
if (LayoutSVGResourceFilter* filter = resources->Filter())
visual_rect = filter->ResourceBoundingBox(object_bounding_box);
if (LayoutSVGResourceClipper* clipper = resources->Clipper()) if (LayoutSVGResourceClipper* clipper = resources->Clipper())
visual_rect.Intersect(clipper->ResourceBoundingBox(object_bounding_box)); visual_rect.Intersect(clipper->ResourceBoundingBox(object_bounding_box));
if (LayoutSVGResourceMasker* masker = resources->Masker()) if (LayoutSVGResourceMasker* masker = resources->Masker())
visual_rect.Intersect(masker->ResourceBoundingBox(object_bounding_box, 1)); visual_rect.Intersect(masker->ResourceBoundingBox(object_bounding_box, 1));
} }
...@@ -426,13 +439,11 @@ FloatRect SVGLayoutSupport::ExtendTextBBoxWithStroke( ...@@ -426,13 +439,11 @@ FloatRect SVGLayoutSupport::ExtendTextBBoxWithStroke(
FloatRect SVGLayoutSupport::ComputeVisualRectForText( FloatRect SVGLayoutSupport::ComputeVisualRectForText(
const LayoutObject& layout_object, const LayoutObject& layout_object,
const FloatRect& text_bounds, const FloatRect& text_bounds) {
const FloatRect& reference_box) {
DCHECK(layout_object.IsSVGText() || layout_object.IsSVGInline()); DCHECK(layout_object.IsSVGText() || layout_object.IsSVGInline());
FloatRect visual_rect = ExtendTextBBoxWithStroke(layout_object, text_bounds); FloatRect visual_rect = ExtendTextBBoxWithStroke(layout_object, text_bounds);
if (const ShadowList* text_shadow = layout_object.StyleRef().TextShadow()) if (const ShadowList* text_shadow = layout_object.StyleRef().TextShadow())
text_shadow->AdjustRectForShadow(visual_rect); text_shadow->AdjustRectForShadow(visual_rect);
AdjustVisualRectWithResources(layout_object, reference_box, visual_rect);
return visual_rect; return visual_rect;
} }
......
...@@ -61,12 +61,10 @@ class CORE_EXPORT SVGLayoutSupport { ...@@ -61,12 +61,10 @@ class CORE_EXPORT SVGLayoutSupport {
static bool IsOverflowHidden(const LayoutObject&); static bool IsOverflowHidden(const LayoutObject&);
static bool IsOverflowHidden(const ComputedStyle&); static bool IsOverflowHidden(const ComputedStyle&);
// Adjusts the visualRect in combination with filter, clipper and masker // Adjusts the visual rect with clipper and masker in local coordinates.
// in local coordinates. static void AdjustWithClipPathAndMask(const LayoutObject& layout_object,
static void AdjustVisualRectWithResources( const FloatRect& object_bounding_box,
const LayoutObject&, FloatRect& visual_rect);
const FloatRect& object_bounding_box,
FloatRect&);
// Add any contribution from 'stroke' to a text content bounding rect. // Add any contribution from 'stroke' to a text content bounding rect.
static FloatRect ExtendTextBBoxWithStroke(const LayoutObject&, static FloatRect ExtendTextBBoxWithStroke(const LayoutObject&,
...@@ -74,8 +72,7 @@ class CORE_EXPORT SVGLayoutSupport { ...@@ -74,8 +72,7 @@ class CORE_EXPORT SVGLayoutSupport {
// Compute the visual rect for the a text content LayoutObject. // Compute the visual rect for the a text content LayoutObject.
static FloatRect ComputeVisualRectForText(const LayoutObject&, static FloatRect ComputeVisualRectForText(const LayoutObject&,
const FloatRect& text_bounds, const FloatRect& text_bounds);
const FloatRect& reference_box);
// Determine whether the passed location intersects a clip path referenced by // Determine whether the passed location intersects a clip path referenced by
// the passed LayoutObject. // the passed LayoutObject.
...@@ -105,9 +102,6 @@ class CORE_EXPORT SVGLayoutSupport { ...@@ -105,9 +102,6 @@ class CORE_EXPORT SVGLayoutSupport {
const LayoutObject&, const LayoutObject&,
const LayoutBoxModelObject& ancestor, const LayoutBoxModelObject& ancestor,
VisualRectFlags = kDefaultVisualRectFlags); VisualRectFlags = kDefaultVisualRectFlags);
static PhysicalRect TransformVisualRect(const LayoutObject&,
const AffineTransform&,
const FloatRect&);
static bool MapToVisualRectInAncestorSpace( static bool MapToVisualRectInAncestorSpace(
const LayoutObject&, const LayoutObject&,
const LayoutBoxModelObject* ancestor, const LayoutBoxModelObject* ancestor,
......
...@@ -19,7 +19,6 @@ ...@@ -19,7 +19,6 @@
#include "third_party/blink/renderer/core/layout/ng/legacy_layout_tree_walking.h" #include "third_party/blink/renderer/core/layout/ng/legacy_layout_tree_walking.h"
#include "third_party/blink/renderer/core/layout/ng/ng_fragment_child_iterator.h" #include "third_party/blink/renderer/core/layout/ng/ng_fragment_child_iterator.h"
#include "third_party/blink/renderer/core/layout/ng/ng_physical_box_fragment.h" #include "third_party/blink/renderer/core/layout/ng/ng_physical_box_fragment.h"
#include "third_party/blink/renderer/core/layout/svg/svg_layout_support.h"
#include "third_party/blink/renderer/core/page/link_highlight.h" #include "third_party/blink/renderer/core/page/link_highlight.h"
#include "third_party/blink/renderer/core/page/page.h" #include "third_party/blink/renderer/core/page/page.h"
#include "third_party/blink/renderer/core/paint/clip_path_clipper.h" #include "third_party/blink/renderer/core/paint/clip_path_clipper.h"
......
...@@ -39,6 +39,7 @@ ...@@ -39,6 +39,7 @@
#include "third_party/blink/renderer/core/layout/svg/layout_svg_model_object.h" #include "third_party/blink/renderer/core/layout/svg/layout_svg_model_object.h"
#include "third_party/blink/renderer/core/layout/svg/layout_svg_root.h" #include "third_party/blink/renderer/core/layout/svg/layout_svg_root.h"
#include "third_party/blink/renderer/core/layout/svg/layout_svg_viewport_container.h" #include "third_party/blink/renderer/core/layout/svg/layout_svg_viewport_container.h"
#include "third_party/blink/renderer/core/layout/svg/svg_layout_support.h"
#include "third_party/blink/renderer/core/svg/animation/smil_time_container.h" #include "third_party/blink/renderer/core/svg/animation/smil_time_container.h"
#include "third_party/blink/renderer/core/svg/svg_angle_tear_off.h" #include "third_party/blink/renderer/core/svg/svg_angle_tear_off.h"
#include "third_party/blink/renderer/core/svg/svg_animated_length.h" #include "third_party/blink/renderer/core/svg/svg_animated_length.h"
...@@ -321,8 +322,10 @@ bool SVGSVGElement::CheckIntersectionOrEnclosure( ...@@ -321,8 +322,10 @@ bool SVGSVGElement::CheckIntersectionOrEnclosure(
AffineTransform ctm = AffineTransform ctm =
To<SVGGraphicsElement>(element).ComputeCTM(kAncestorScope, this); To<SVGGraphicsElement>(element).ComputeCTM(kAncestorScope, this);
FloatRect mapped_repaint_rect = FloatRect visual_rect = layout_object->VisualRectInLocalSVGCoordinates();
ctm.MapRect(layout_object->VisualRectInLocalSVGCoordinates()); SVGLayoutSupport::AdjustWithClipPathAndMask(
*layout_object, layout_object->ObjectBoundingBox(), visual_rect);
FloatRect mapped_repaint_rect = ctm.MapRect(visual_rect);
bool result = false; bool result = false;
switch (mode) { switch (mode) {
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
"contentsOpaque": true, "contentsOpaque": true,
"backgroundColor": "#FFFFFF", "backgroundColor": "#FFFFFF",
"invalidations": [ "invalidations": [
[0, 0, 110, 110] [0, 0, 100, 100]
] ]
} }
] ]
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
"contentsOpaque": true, "contentsOpaque": true,
"backgroundColor": "#FFFFFF", "backgroundColor": "#FFFFFF",
"invalidations": [ "invalidations": [
[0, 0, 110, 110] [0, 0, 100, 100]
] ]
} }
] ]
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
"contentsOpaque": true, "contentsOpaque": true,
"backgroundColor": "#FFFFFF", "backgroundColor": "#FFFFFF",
"invalidations": [ "invalidations": [
[0, 0, 110, 110] [0, 0, 100, 100]
] ]
} }
] ]
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
"contentsOpaque": true, "contentsOpaque": true,
"backgroundColor": "#FFFFFF", "backgroundColor": "#FFFFFF",
"invalidations": [ "invalidations": [
[0, 0, 110, 110] [0, 0, 100, 100]
] ]
} }
] ]
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
"contentsOpaque": true, "contentsOpaque": true,
"backgroundColor": "#FFFFFF", "backgroundColor": "#FFFFFF",
"invalidations": [ "invalidations": [
[0, 0, 110, 110] [0, 0, 100, 100]
] ]
} }
] ]
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
"contentsOpaque": true, "contentsOpaque": true,
"backgroundColor": "#FFFFFF", "backgroundColor": "#FFFFFF",
"invalidations": [ "invalidations": [
[8, 8, 110, 110] [8, 8, 100, 100]
] ]
} }
] ]
......
...@@ -6,8 +6,8 @@ ...@@ -6,8 +6,8 @@
"contentsOpaque": true, "contentsOpaque": true,
"backgroundColor": "#FFFFFF", "backgroundColor": "#FFFFFF",
"invalidations": [ "invalidations": [
[140, 140, 36, 36], [140, 140, 30, 30],
[140, 100, 36, 36], [140, 100, 30, 30],
[140, 60, 30, 30], [140, 60, 30, 30],
[90, 170, 30, 30], [90, 170, 30, 30],
[90, 130, 30, 30], [90, 130, 30, 30],
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
"contentsOpaque": true, "contentsOpaque": true,
"backgroundColor": "#FFFFFF", "backgroundColor": "#FFFFFF",
"invalidations": [ "invalidations": [
[0, 240, 230, 120], [0, 240, 222, 120],
[10, 130, 200, 100], [10, 130, 200, 100],
[10, 10, 200, 100] [10, 10, 200, 100]
] ]
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
"contentsOpaque": true, "contentsOpaque": true,
"backgroundColor": "#FFFFFF", "backgroundColor": "#FFFFFF",
"invalidations": [ "invalidations": [
[0, 0, 110, 110] [0, 0, 100, 100]
] ]
} }
] ]
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
"contentsOpaque": true, "contentsOpaque": true,
"backgroundColor": "#FFFFFF", "backgroundColor": "#FFFFFF",
"invalidations": [ "invalidations": [
[0, 0, 110, 110] [0, 0, 100, 100]
] ]
} }
] ]
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
"contentsOpaque": true, "contentsOpaque": true,
"backgroundColor": "#FFFFFF", "backgroundColor": "#FFFFFF",
"invalidations": [ "invalidations": [
[0, 0, 110, 110] [0, 0, 100, 100]
] ]
} }
] ]
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
"contentsOpaque": true, "contentsOpaque": true,
"backgroundColor": "#FFFFFF", "backgroundColor": "#FFFFFF",
"invalidations": [ "invalidations": [
[0, 0, 110, 110] [0, 0, 100, 100]
] ]
} }
] ]
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
"contentsOpaque": true, "contentsOpaque": true,
"backgroundColor": "#FFFFFF", "backgroundColor": "#FFFFFF",
"invalidations": [ "invalidations": [
[0, 0, 110, 110] [0, 0, 100, 100]
] ]
} }
] ]
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
"contentsOpaque": true, "contentsOpaque": true,
"backgroundColor": "#FFFFFF", "backgroundColor": "#FFFFFF",
"invalidations": [ "invalidations": [
[8, 8, 110, 110] [8, 8, 100, 100]
] ]
} }
] ]
......
...@@ -6,8 +6,8 @@ ...@@ -6,8 +6,8 @@
"contentsOpaque": true, "contentsOpaque": true,
"backgroundColor": "#FFFFFF", "backgroundColor": "#FFFFFF",
"invalidations": [ "invalidations": [
[140, 140, 36, 36], [140, 140, 30, 30],
[140, 100, 36, 36], [140, 100, 30, 30],
[140, 60, 30, 30], [140, 60, 30, 30],
[90, 170, 30, 30], [90, 170, 30, 30],
[90, 130, 30, 30], [90, 130, 30, 30],
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
"contentsOpaque": true, "contentsOpaque": true,
"backgroundColor": "#FFFFFF", "backgroundColor": "#FFFFFF",
"invalidations": [ "invalidations": [
[0, 240, 230, 120], [0, 240, 222, 120],
[10, 130, 200, 100], [10, 130, 200, 100],
[10, 10, 200, 100] [10, 10, 200, 100]
] ]
......
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