From dcd354acb0dfc3b4891a5c2bcd8537f6895680d8 Mon Sep 17 00:00:00 2001 From: "youngtaeck.song" Date: Fri, 17 Aug 2012 19:51:25 +0900 Subject: [PATCH] Fix to do not use transform information when getting caret rect. MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit [Title] Fix to do not use transform information when getting caret rect. [Issue#] N_SE-2904 [Problem] Caret doesn’t blink when layer own this caret is transformed. [Cause] In this case, the rect for invalidation is modified by transform infomation. [Solution] Fix to do not use transform information when getting caret rect. Change-Id: I3ce13e8ee5038d3c967c83319e2f8cbf26eea01b --- Source/WTF/wtf/Platform.h | 1 + Source/WebCore/editing/FrameSelection.cpp | 9 +++++++++ Source/WebCore/rendering/RenderObject.cpp | 10 ++++++++++ Source/WebCore/rendering/RenderObject.h | 12 ++++++++++++ 4 files changed, 32 insertions(+) diff --git a/Source/WTF/wtf/Platform.h b/Source/WTF/wtf/Platform.h index e77b944..866ea75 100644 --- a/Source/WTF/wtf/Platform.h +++ b/Source/WTF/wtf/Platform.h @@ -708,6 +708,7 @@ #if USE(TILED_BACKING_STORE) #define ENABLE_TIZEN_WEBKIT2_TILED_BACKING_STORE 1 /* Youngtaeck Song(youngtaeck.song@samsung.com) : Tiled backing store for Tizen */ #define ENABLE_TIZEN_WEBKIT2_TILED_SCROLLBAR 1 /* Ryuan Choi(ryuan.choi@samsung.com) : Scrollbar implementation for Tiled DrawingArea */ +#define ENABLE_TIZEN_NOT_USE_TRANSFORM_INFO_WHEN_GETTING_CARET_RECT 1 /* Youngtaeck Song(youngtaeck.song@samsung.com) : Patch to do not use transform infomation when getting caret rect */ #endif #define ENABLE_TIZEN_WEBKIT2_TEXT_SELECTION 1 /* Kamil Blank(k.blank@samsung.com), Yuni Jeong(yhnet.jung@samsung.com) : */ #define ENABLE_TIZEN_GSTREAMER_VIDEO 1 /* Kwangyong Choi : Fixed media control display when using gstreamer video */ diff --git a/Source/WebCore/editing/FrameSelection.cpp b/Source/WebCore/editing/FrameSelection.cpp index d7ec281..78d8421 100644 --- a/Source/WebCore/editing/FrameSelection.cpp +++ b/Source/WebCore/editing/FrameSelection.cpp @@ -1254,7 +1254,12 @@ IntRect CaretBase::absoluteBoundsForLocalRect(Node* node, const LayoutRect& rect LayoutRect localRect(rect); if (caretPainter->isBox()) toRenderBox(caretPainter)->flipForWritingMode(localRect); + +#if ENABLE(TIZEN_NOT_USE_TRANSFORM_INFO_WHEN_GETTING_CARET_RECT) + return caretPainter->localToAbsoluteQuad(FloatRect(localRect), false, 0, false).enclosingBoundingBox(); +#else return caretPainter->localToAbsoluteQuad(FloatRect(localRect)).enclosingBoundingBox(); +#endif } IntRect FrameSelection::absoluteCaretBounds() @@ -1938,8 +1943,12 @@ void FrameSelection::revealSelection(const ScrollAlignment& alignment, bool reve case VisibleSelection::NoSelection: return; case VisibleSelection::CaretSelection: +#if ENABLE(TIZEN_NOT_USE_TRANSFORM_INFO_WHEN_GETTING_CARET_RECT) + return; +#else rect = absoluteCaretBounds(); break; +#endif case VisibleSelection::RangeSelection: rect = revealExtent ? VisiblePosition(extent()).absoluteCaretBounds() : enclosingIntRect(bounds(false)); break; diff --git a/Source/WebCore/rendering/RenderObject.cpp b/Source/WebCore/rendering/RenderObject.cpp index e669476..78ad114 100755 --- a/Source/WebCore/rendering/RenderObject.cpp +++ b/Source/WebCore/rendering/RenderObject.cpp @@ -2133,12 +2133,22 @@ void RenderObject::getTransformFromContainer(const RenderObject* containerObject #endif } +#if ENABLE(TIZEN_NOT_USE_TRANSFORM_INFO_WHEN_GETTING_CARET_RECT) +FloatQuad RenderObject::localToContainerQuad(const FloatQuad& localQuad, RenderBoxModelObject* repaintContainer, bool fixed, bool* wasFixed, bool useTransforms) const +#else FloatQuad RenderObject::localToContainerQuad(const FloatQuad& localQuad, RenderBoxModelObject* repaintContainer, bool fixed, bool* wasFixed) const +#endif { // Track the point at the center of the quad's bounding box. As mapLocalToContainer() calls offsetFromContainer(), // it will use that point as the reference point to decide which column's transform to apply in multiple-column blocks. TransformState transformState(TransformState::ApplyTransformDirection, localQuad.boundingBox().center(), localQuad); + +#if ENABLE(TIZEN_NOT_USE_TRANSFORM_INFO_WHEN_GETTING_CARET_RECT) + mapLocalToContainer(repaintContainer, fixed, useTransforms, transformState, ApplyContainerFlip, wasFixed); +#else mapLocalToContainer(repaintContainer, fixed, true, transformState, ApplyContainerFlip, wasFixed); +#endif + transformState.flatten(); return transformState.lastPlanarQuad(); diff --git a/Source/WebCore/rendering/RenderObject.h b/Source/WebCore/rendering/RenderObject.h index 5aa468f..491ef7a 100755 --- a/Source/WebCore/rendering/RenderObject.h +++ b/Source/WebCore/rendering/RenderObject.h @@ -681,13 +681,25 @@ public: FloatPoint absoluteToLocal(const FloatPoint&, bool fixed = false, bool useTransforms = false) const; // Convert a local quad to absolute coordinates, taking transforms into account. +#if ENABLE(TIZEN_NOT_USE_TRANSFORM_INFO_WHEN_GETTING_CARET_RECT) + FloatQuad localToAbsoluteQuad(const FloatQuad& quad, bool fixed = false, bool* wasFixed = 0, bool useTransforms = true) const + { + return localToContainerQuad(quad, 0, fixed, wasFixed, useTransforms); + } +#else FloatQuad localToAbsoluteQuad(const FloatQuad& quad, bool fixed = false, bool* wasFixed = 0) const { return localToContainerQuad(quad, 0, fixed, wasFixed); } +#endif // Convert a local quad into the coordinate system of container, taking transforms into account. +#if ENABLE(TIZEN_NOT_USE_TRANSFORM_INFO_WHEN_GETTING_CARET_RECT) + FloatQuad localToContainerQuad(const FloatQuad&, RenderBoxModelObject* repaintContainer, bool fixed = false, bool* wasFixed = 0, bool useTransforms = true) const; +#else FloatQuad localToContainerQuad(const FloatQuad&, RenderBoxModelObject* repaintContainer, bool fixed = false, bool* wasFixed = 0) const; +#endif + FloatPoint localToContainerPoint(const FloatPoint&, RenderBoxModelObject* repaintContainer, bool fixed = false, bool* wasFixed = 0) const; // Return the offset from the container() renderer (excluding transforms). In multi-column layout, -- 2.7.4