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&);