Title: [163509] trunk/Source
Revision
163509
Author
[email protected]
Date
2014-02-05 20:31:46 -0800 (Wed, 05 Feb 2014)

Log Message

Support encoding and decoding of Regions
https://bugs.webkit.org/show_bug.cgi?id=128284

Source/WebCore:

Reviewed by Anders Carlsson.

Region changes to make it encodable:

Make Region::Span public and give it a default constructor.
Allow getting and setting of Shape internals, and a way to update
the Region bounds after changing the shape. Also add a way to test
for valid spans and segments.

* platform/graphics/Region.cpp:
(WebCore::Region::Shape::isValid):
(WebCore::Region::updateBoundsFromShape):
* platform/graphics/Region.h:
(WebCore::Region::isValid):
(WebCore::Region::Span::Span):
(WebCore::Region::shapeSegments):
(WebCore::Region::shapeSpans):
(WebCore::Region::setShapeSegments):
(WebCore::Region::setShapeSpans):
(WebCore::Region::Shape::segments):
(WebCore::Region::Shape::spans):
(WebCore::Region::Shape::setSegments):
(WebCore::Region::Shape::setSpans):

Source/WebKit2:

Reviewed by Anders Carlsson.

Support encoding and decoding of Region, and its internal
struct Region::Span.

ArgumentCoders had to be taught about how to encode
Vectors with inline capacity.

* Platform/IPC/ArgumentCoders.h:
* Shared/WebCoreArgumentCoders.cpp:
(IPC::ArgumentCoder<Region::Span>::encode):
(IPC::ArgumentCoder<Region::Span>::decode):
(IPC::ArgumentCoder<Region>::encode):
(IPC::ArgumentCoder<Region>::decode):
* Shared/WebCoreArgumentCoders.h:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (163508 => 163509)


--- trunk/Source/WebCore/ChangeLog	2014-02-06 04:10:47 UTC (rev 163508)
+++ trunk/Source/WebCore/ChangeLog	2014-02-06 04:31:46 UTC (rev 163509)
@@ -1,3 +1,32 @@
+2014-02-05  Simon Fraser  <[email protected]>
+
+        Support encoding and decoding of Regions
+        https://bugs.webkit.org/show_bug.cgi?id=128284
+
+        Reviewed by Anders Carlsson.
+
+        Region changes to make it encodable:
+        
+        Make Region::Span public and give it a default constructor.
+        Allow getting and setting of Shape internals, and a way to update
+        the Region bounds after changing the shape. Also add a way to test
+        for valid spans and segments.
+
+        * platform/graphics/Region.cpp:
+        (WebCore::Region::Shape::isValid):
+        (WebCore::Region::updateBoundsFromShape):
+        * platform/graphics/Region.h:
+        (WebCore::Region::isValid):
+        (WebCore::Region::Span::Span):
+        (WebCore::Region::shapeSegments):
+        (WebCore::Region::shapeSpans):
+        (WebCore::Region::setShapeSegments):
+        (WebCore::Region::setShapeSpans):
+        (WebCore::Region::Shape::segments):
+        (WebCore::Region::Shape::spans):
+        (WebCore::Region::Shape::setSegments):
+        (WebCore::Region::Shape::setSpans):
+
 2014-02-05  Andreas Kling  <[email protected]>
 
         Rebaseline the bindings tests after Oliver's hackery.

Modified: trunk/Source/WebCore/platform/graphics/Region.cpp (163508 => 163509)


--- trunk/Source/WebCore/platform/graphics/Region.cpp	2014-02-06 04:10:47 UTC (rev 163508)
+++ trunk/Source/WebCore/platform/graphics/Region.cpp	2014-02-06 04:31:46 UTC (rev 163509)
@@ -319,10 +319,10 @@
 #ifndef NDEBUG
 void Region::Shape::dump() const
 {
-    for (Shape::SpanIterator span = spans_begin(), end = spans_end(); span != end; ++span) {
+    for (auto span = spans_begin(), end = spans_end(); span != end; ++span) {
         printf("%6d: (", span->y);
 
-        for (Shape::SegmentIterator segment = segments_begin(span), end = segments_end(span); segment != end; ++segment)
+        for (auto segment = segments_begin(span), end = segments_end(span); segment != end; ++segment)
             printf("%d ", *segment);
         printf(")\n");
     }
@@ -331,6 +331,27 @@
 }
 #endif
 
+bool Region::Shape::isValid() const
+{
+    for (auto span = spans_begin(), end = spans_end(); span != end && span + 1 != end; ++span) {
+        int y = span->y;
+        int height = (span + 1)->y - y;
+        
+        if (height < 0)
+            return false;
+
+        for (auto segment = segments_begin(span), end = segments_end(span); segment != end && segment + 1 != end; segment += 2) {
+            int x = *segment;
+            int width = *(segment + 1) - x;
+            
+            if (width < 0)
+                return false;
+        }
+    }
+
+    return true;
+}
+
 IntRect Region::Shape::bounds() const
 {
     if (isEmpty())
@@ -550,6 +571,11 @@
 }
 #endif
 
+void Region::updateBoundsFromShape()
+{
+    m_bounds = m_shape.bounds();
+}
+
 void Region::intersect(const Region& region)
 {
     if (m_bounds.isEmpty())

Modified: trunk/Source/WebCore/platform/graphics/Region.h (163508 => 163509)


--- trunk/Source/WebCore/platform/graphics/Region.h	2014-02-06 04:10:47 UTC (rev 163508)
+++ trunk/Source/WebCore/platform/graphics/Region.h	2014-02-06 04:31:46 UTC (rev 163509)
@@ -64,10 +64,20 @@
     void dump() const;
 #endif
 
-private:
+    bool isValid() const { return m_shape.isValid(); }
+
+    // This is internal to Region, but exposed just for encoding.
+    // FIXME: figure out a better way to encode WebCore classes.
     struct Span {
+        Span()
+            : y(0)
+            , segmentIndex(0)
+        {
+        }
+
         Span(int y, size_t segmentIndex)
-            : y(y), segmentIndex(segmentIndex)
+            : y(y)
+            , segmentIndex(segmentIndex)
         {
         }
 
@@ -75,6 +85,16 @@
         size_t segmentIndex;
     };
 
+    // For encoding/decoding only.
+    const Vector<int, 32>& shapeSegments() const { return m_shape.segments(); }
+    const Vector<Span, 16>& shapeSpans() const { return m_shape.spans(); }
+
+    void setShapeSegments(const Vector<int>& segments) { m_shape.setSegments(segments); }
+    void setShapeSpans(const Vector<Span>& spans) { m_shape.setSpans(spans); }
+    void updateBoundsFromShape();
+
+private:
+
     class Shape {
     public:
         Shape();
@@ -105,7 +125,16 @@
 
         template<typename CompareOperation>
         static bool compareShapes(const Shape& shape1, const Shape& shape2);
+        
+        bool isValid() const;
 
+        // For encoding/decoding only.
+        const Vector<int, 32>& segments() const { return m_segments; }
+        const Vector<Span, 16>& spans() const { return m_spans; }
+
+        void setSegments(const Vector<int>& segments) { m_segments = segments; }
+        void setSpans(const Vector<Span>& spans) { m_spans = spans; }
+
 #ifndef NDEBUG
         void dump() const;
 #endif

Modified: trunk/Source/WebKit2/ChangeLog (163508 => 163509)


--- trunk/Source/WebKit2/ChangeLog	2014-02-06 04:10:47 UTC (rev 163508)
+++ trunk/Source/WebKit2/ChangeLog	2014-02-06 04:31:46 UTC (rev 163509)
@@ -1,3 +1,24 @@
+2014-02-05  Simon Fraser  <[email protected]>
+
+        Support encoding and decoding of Regions
+        https://bugs.webkit.org/show_bug.cgi?id=128284
+
+        Reviewed by Anders Carlsson.
+        
+        Support encoding and decoding of Region, and its internal
+        struct Region::Span.
+        
+        ArgumentCoders had to be taught about how to encode
+        Vectors with inline capacity.
+
+        * Platform/IPC/ArgumentCoders.h:
+        * Shared/WebCoreArgumentCoders.cpp:
+        (IPC::ArgumentCoder<Region::Span>::encode):
+        (IPC::ArgumentCoder<Region::Span>::decode):
+        (IPC::ArgumentCoder<Region>::encode):
+        (IPC::ArgumentCoder<Region>::decode):
+        * Shared/WebCoreArgumentCoders.h:
+
 2014-02-05  Anders Carlsson  <[email protected]>
 
         Add -[WKNavigationAction request]

Modified: trunk/Source/WebKit2/Platform/IPC/ArgumentCoders.h (163508 => 163509)


--- trunk/Source/WebKit2/Platform/IPC/ArgumentCoders.h	2014-02-06 04:10:47 UTC (rev 163508)
+++ trunk/Source/WebKit2/Platform/IPC/ArgumentCoders.h	2014-02-06 04:31:46 UTC (rev 163509)
@@ -92,23 +92,23 @@
     }
 };
 
-template<bool fixedSizeElements, typename T> struct VectorArgumentCoder;
+template<bool fixedSizeElements, typename T, size_t inlineCapacity> struct VectorArgumentCoder;
 
-template<typename T> struct VectorArgumentCoder<false, T> {
-    static void encode(ArgumentEncoder& encoder, const Vector<T>& vector)
+template<typename T, size_t inlineCapacity> struct VectorArgumentCoder<false, T, inlineCapacity> {
+    static void encode(ArgumentEncoder& encoder, const Vector<T, inlineCapacity>& vector)
     {
         encoder << static_cast<uint64_t>(vector.size());
         for (size_t i = 0; i < vector.size(); ++i)
             encoder << vector[i];
     }
 
-    static bool decode(ArgumentDecoder& decoder, Vector<T>& vector)
+    static bool decode(ArgumentDecoder& decoder, Vector<T, inlineCapacity>& vector)
     {
         uint64_t size;
         if (!decoder.decode(size))
             return false;
 
-        Vector<T> tmp;
+        Vector<T, inlineCapacity> tmp;
         for (size_t i = 0; i < size; ++i) {
             T element;
             if (!decoder.decode(element))
@@ -123,14 +123,14 @@
     }
 };
 
-template<typename T> struct VectorArgumentCoder<true, T> {
-    static void encode(ArgumentEncoder& encoder, const Vector<T>& vector)
+template<typename T, size_t inlineCapacity> struct VectorArgumentCoder<true, T, inlineCapacity> {
+    static void encode(ArgumentEncoder& encoder, const Vector<T, inlineCapacity>& vector)
     {
         encoder << static_cast<uint64_t>(vector.size());
         encoder.encodeFixedLengthData(reinterpret_cast<const uint8_t*>(vector.data()), vector.size() * sizeof(T), alignof(T));
     }
     
-    static bool decode(ArgumentDecoder& decoder, Vector<T>& vector)
+    static bool decode(ArgumentDecoder& decoder, Vector<T, inlineCapacity>& vector)
     {
         uint64_t size;
         if (!decoder.decode(size))
@@ -144,7 +144,7 @@
             return false;
         }
 
-        Vector<T> temp;
+        Vector<T, inlineCapacity> temp;
         temp.resize(size);
 
         decoder.decodeFixedLengthData(reinterpret_cast<uint8_t*>(temp.data()), size * sizeof(T), alignof(T));
@@ -154,7 +154,7 @@
     }
 };
 
-template<typename T> struct ArgumentCoder<Vector<T>> : VectorArgumentCoder<std::is_arithmetic<T>::value, T> { };
+template<typename T, size_t inlineCapacity> struct ArgumentCoder<Vector<T, inlineCapacity>> : VectorArgumentCoder<std::is_arithmetic<T>::value, T, inlineCapacity> { };
 
 template<typename KeyArg, typename MappedArg, typename HashArg, typename KeyTraitsArg, typename MappedTraitsArg> struct ArgumentCoder<HashMap<KeyArg, MappedArg, HashArg, KeyTraitsArg, MappedTraitsArg>> {
     typedef HashMap<KeyArg, MappedArg, HashArg, KeyTraitsArg, MappedTraitsArg> HashMapType;

Modified: trunk/Source/WebKit2/Shared/WebCoreArgumentCoders.cpp (163508 => 163509)


--- trunk/Source/WebKit2/Shared/WebCoreArgumentCoders.cpp	2014-02-06 04:10:47 UTC (rev 163508)
+++ trunk/Source/WebKit2/Shared/WebCoreArgumentCoders.cpp	2014-02-06 04:31:46 UTC (rev 163509)
@@ -51,6 +51,7 @@
 #include <WebCore/Length.h>
 #include <WebCore/PluginData.h>
 #include <WebCore/ProtectionSpace.h>
+#include <WebCore/Region.h>
 #include <WebCore/ResourceError.h>
 #include <WebCore/ResourceRequest.h>
 #include <WebCore/ResourceResponse.h>
@@ -198,7 +199,56 @@
     return SimpleArgumentCoder<IntSize>::decode(decoder, intSize);
 }
 
+template<> struct ArgumentCoder<WebCore::Region::Span> {
+    static void encode(ArgumentEncoder&, const WebCore::Region::Span&);
+    static bool decode(ArgumentDecoder&, WebCore::Region::Span&);
+};
 
+void ArgumentCoder<Region::Span>::encode(ArgumentEncoder& encoder, const Region::Span& span)
+{
+    encoder << span.y;
+    encoder << (uint64_t)span.segmentIndex;
+}
+
+bool ArgumentCoder<Region::Span>::decode(ArgumentDecoder& decoder, Region::Span& span)
+{
+    if (!decoder.decode(span.y))
+        return false;
+    
+    uint64_t segmentIndex;
+    if (!decoder.decode(segmentIndex))
+        return false;
+    
+    span.segmentIndex = segmentIndex;
+    return true;
+}
+
+void ArgumentCoder<Region>::encode(ArgumentEncoder& encoder, const Region& region)
+{
+    encoder.encode(region.shapeSegments());
+    encoder.encode(region.shapeSpans());
+}
+
+bool ArgumentCoder<Region>::decode(ArgumentDecoder& decoder, Region& region)
+{
+    Vector<int> segments;
+    if (!decoder.decode(segments))
+        return false;
+
+    Vector<Region::Span> spans;
+    if (!decoder.decode(spans))
+        return false;
+    
+    region.setShapeSegments(segments);
+    region.setShapeSpans(spans);
+    region.updateBoundsFromShape();
+    
+    if (!region.isValid())
+        return false;
+
+    return true;
+}
+
 void ArgumentCoder<Length>::encode(ArgumentEncoder& encoder, const Length& length)
 {
     SimpleArgumentCoder<Length>::encode(encoder, length);

Modified: trunk/Source/WebKit2/Shared/WebCoreArgumentCoders.h (163508 => 163509)


--- trunk/Source/WebKit2/Shared/WebCoreArgumentCoders.h	2014-02-06 04:10:47 UTC (rev 163508)
+++ trunk/Source/WebKit2/Shared/WebCoreArgumentCoders.h	2014-02-06 04:31:46 UTC (rev 163509)
@@ -51,6 +51,7 @@
 class URL;
 class Notification;
 class ProtectionSpace;
+class Region;
 class ResourceError;
 class ResourceRequest;
 class ResourceResponse;
@@ -162,6 +163,11 @@
     static bool decode(ArgumentDecoder&, WebCore::IntSize&);
 };
 
+template<> struct ArgumentCoder<WebCore::Region> {
+    static void encode(ArgumentEncoder&, const WebCore::Region&);
+    static bool decode(ArgumentDecoder&, WebCore::Region&);
+};
+
 template<> struct ArgumentCoder<WebCore::Length> {
     static void encode(ArgumentEncoder&, const WebCore::Length&);
     static bool decode(ArgumentDecoder&, WebCore::Length&);
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to