Changeset 163509 in webkit
- Timestamp:
- Feb 5, 2014 8:31:46 PM (10 years ago)
- Location:
- trunk/Source
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r163508 r163509 1 2014-02-05 Simon Fraser <simon.fraser@apple.com> 2 3 Support encoding and decoding of Regions 4 https://bugs.webkit.org/show_bug.cgi?id=128284 5 6 Reviewed by Anders Carlsson. 7 8 Region changes to make it encodable: 9 10 Make Region::Span public and give it a default constructor. 11 Allow getting and setting of Shape internals, and a way to update 12 the Region bounds after changing the shape. Also add a way to test 13 for valid spans and segments. 14 15 * platform/graphics/Region.cpp: 16 (WebCore::Region::Shape::isValid): 17 (WebCore::Region::updateBoundsFromShape): 18 * platform/graphics/Region.h: 19 (WebCore::Region::isValid): 20 (WebCore::Region::Span::Span): 21 (WebCore::Region::shapeSegments): 22 (WebCore::Region::shapeSpans): 23 (WebCore::Region::setShapeSegments): 24 (WebCore::Region::setShapeSpans): 25 (WebCore::Region::Shape::segments): 26 (WebCore::Region::Shape::spans): 27 (WebCore::Region::Shape::setSegments): 28 (WebCore::Region::Shape::setSpans): 29 1 30 2014-02-05 Andreas Kling <akling@apple.com> 2 31 -
trunk/Source/WebCore/platform/graphics/Region.cpp
r142434 r163509 320 320 void Region::Shape::dump() const 321 321 { 322 for ( Shape::SpanIteratorspan = spans_begin(), end = spans_end(); span != end; ++span) {322 for (auto span = spans_begin(), end = spans_end(); span != end; ++span) { 323 323 printf("%6d: (", span->y); 324 324 325 for ( Shape::SegmentIteratorsegment = segments_begin(span), end = segments_end(span); segment != end; ++segment)325 for (auto segment = segments_begin(span), end = segments_end(span); segment != end; ++segment) 326 326 printf("%d ", *segment); 327 327 printf(")\n"); … … 331 331 } 332 332 #endif 333 334 bool Region::Shape::isValid() const 335 { 336 for (auto span = spans_begin(), end = spans_end(); span != end && span + 1 != end; ++span) { 337 int y = span->y; 338 int height = (span + 1)->y - y; 339 340 if (height < 0) 341 return false; 342 343 for (auto segment = segments_begin(span), end = segments_end(span); segment != end && segment + 1 != end; segment += 2) { 344 int x = *segment; 345 int width = *(segment + 1) - x; 346 347 if (width < 0) 348 return false; 349 } 350 } 351 352 return true; 353 } 333 354 334 355 IntRect Region::Shape::bounds() const … … 551 572 #endif 552 573 574 void Region::updateBoundsFromShape() 575 { 576 m_bounds = m_shape.bounds(); 577 } 578 553 579 void Region::intersect(const Region& region) 554 580 { -
trunk/Source/WebCore/platform/graphics/Region.h
r163019 r163509 65 65 #endif 66 66 67 private: 67 bool isValid() const { return m_shape.isValid(); } 68 69 // This is internal to Region, but exposed just for encoding. 70 // FIXME: figure out a better way to encode WebCore classes. 68 71 struct Span { 72 Span() 73 : y(0) 74 , segmentIndex(0) 75 { 76 } 77 69 78 Span(int y, size_t segmentIndex) 70 : y(y), segmentIndex(segmentIndex) 79 : y(y) 80 , segmentIndex(segmentIndex) 71 81 { 72 82 } … … 75 85 size_t segmentIndex; 76 86 }; 87 88 // For encoding/decoding only. 89 const Vector<int, 32>& shapeSegments() const { return m_shape.segments(); } 90 const Vector<Span, 16>& shapeSpans() const { return m_shape.spans(); } 91 92 void setShapeSegments(const Vector<int>& segments) { m_shape.setSegments(segments); } 93 void setShapeSpans(const Vector<Span>& spans) { m_shape.setSpans(spans); } 94 void updateBoundsFromShape(); 95 96 private: 77 97 78 98 class Shape { … … 106 126 template<typename CompareOperation> 107 127 static bool compareShapes(const Shape& shape1, const Shape& shape2); 128 129 bool isValid() const; 130 131 // For encoding/decoding only. 132 const Vector<int, 32>& segments() const { return m_segments; } 133 const Vector<Span, 16>& spans() const { return m_spans; } 134 135 void setSegments(const Vector<int>& segments) { m_segments = segments; } 136 void setSpans(const Vector<Span>& spans) { m_spans = spans; } 108 137 109 138 #ifndef NDEBUG -
trunk/Source/WebKit2/ChangeLog
r163506 r163509 1 2014-02-05 Simon Fraser <simon.fraser@apple.com> 2 3 Support encoding and decoding of Regions 4 https://bugs.webkit.org/show_bug.cgi?id=128284 5 6 Reviewed by Anders Carlsson. 7 8 Support encoding and decoding of Region, and its internal 9 struct Region::Span. 10 11 ArgumentCoders had to be taught about how to encode 12 Vectors with inline capacity. 13 14 * Platform/IPC/ArgumentCoders.h: 15 * Shared/WebCoreArgumentCoders.cpp: 16 (IPC::ArgumentCoder<Region::Span>::encode): 17 (IPC::ArgumentCoder<Region::Span>::decode): 18 (IPC::ArgumentCoder<Region>::encode): 19 (IPC::ArgumentCoder<Region>::decode): 20 * Shared/WebCoreArgumentCoders.h: 21 1 22 2014-02-05 Anders Carlsson <andersca@apple.com> 2 23 -
trunk/Source/WebKit2/Platform/IPC/ArgumentCoders.h
r161148 r163509 93 93 }; 94 94 95 template<bool fixedSizeElements, typename T > struct VectorArgumentCoder;96 97 template<typename T > struct VectorArgumentCoder<false, T> {98 static void encode(ArgumentEncoder& encoder, const Vector<T >& vector)95 template<bool fixedSizeElements, typename T, size_t inlineCapacity> struct VectorArgumentCoder; 96 97 template<typename T, size_t inlineCapacity> struct VectorArgumentCoder<false, T, inlineCapacity> { 98 static void encode(ArgumentEncoder& encoder, const Vector<T, inlineCapacity>& vector) 99 99 { 100 100 encoder << static_cast<uint64_t>(vector.size()); … … 103 103 } 104 104 105 static bool decode(ArgumentDecoder& decoder, Vector<T >& vector)105 static bool decode(ArgumentDecoder& decoder, Vector<T, inlineCapacity>& vector) 106 106 { 107 107 uint64_t size; … … 109 109 return false; 110 110 111 Vector<T > tmp;111 Vector<T, inlineCapacity> tmp; 112 112 for (size_t i = 0; i < size; ++i) { 113 113 T element; … … 124 124 }; 125 125 126 template<typename T > struct VectorArgumentCoder<true, T> {127 static void encode(ArgumentEncoder& encoder, const Vector<T >& vector)126 template<typename T, size_t inlineCapacity> struct VectorArgumentCoder<true, T, inlineCapacity> { 127 static void encode(ArgumentEncoder& encoder, const Vector<T, inlineCapacity>& vector) 128 128 { 129 129 encoder << static_cast<uint64_t>(vector.size()); … … 131 131 } 132 132 133 static bool decode(ArgumentDecoder& decoder, Vector<T >& vector)133 static bool decode(ArgumentDecoder& decoder, Vector<T, inlineCapacity>& vector) 134 134 { 135 135 uint64_t size; … … 145 145 } 146 146 147 Vector<T > temp;147 Vector<T, inlineCapacity> temp; 148 148 temp.resize(size); 149 149 … … 155 155 }; 156 156 157 template<typename T > struct ArgumentCoder<Vector<T>> : VectorArgumentCoder<std::is_arithmetic<T>::value, T> { };157 template<typename T, size_t inlineCapacity> struct ArgumentCoder<Vector<T, inlineCapacity>> : VectorArgumentCoder<std::is_arithmetic<T>::value, T, inlineCapacity> { }; 158 158 159 159 template<typename KeyArg, typename MappedArg, typename HashArg, typename KeyTraitsArg, typename MappedTraitsArg> struct ArgumentCoder<HashMap<KeyArg, MappedArg, HashArg, KeyTraitsArg, MappedTraitsArg>> { -
trunk/Source/WebKit2/Shared/WebCoreArgumentCoders.cpp
r163483 r163509 52 52 #include <WebCore/PluginData.h> 53 53 #include <WebCore/ProtectionSpace.h> 54 #include <WebCore/Region.h> 54 55 #include <WebCore/ResourceError.h> 55 56 #include <WebCore/ResourceRequest.h> … … 199 200 } 200 201 202 template<> struct ArgumentCoder<WebCore::Region::Span> { 203 static void encode(ArgumentEncoder&, const WebCore::Region::Span&); 204 static bool decode(ArgumentDecoder&, WebCore::Region::Span&); 205 }; 206 207 void ArgumentCoder<Region::Span>::encode(ArgumentEncoder& encoder, const Region::Span& span) 208 { 209 encoder << span.y; 210 encoder << (uint64_t)span.segmentIndex; 211 } 212 213 bool ArgumentCoder<Region::Span>::decode(ArgumentDecoder& decoder, Region::Span& span) 214 { 215 if (!decoder.decode(span.y)) 216 return false; 217 218 uint64_t segmentIndex; 219 if (!decoder.decode(segmentIndex)) 220 return false; 221 222 span.segmentIndex = segmentIndex; 223 return true; 224 } 225 226 void ArgumentCoder<Region>::encode(ArgumentEncoder& encoder, const Region& region) 227 { 228 encoder.encode(region.shapeSegments()); 229 encoder.encode(region.shapeSpans()); 230 } 231 232 bool ArgumentCoder<Region>::decode(ArgumentDecoder& decoder, Region& region) 233 { 234 Vector<int> segments; 235 if (!decoder.decode(segments)) 236 return false; 237 238 Vector<Region::Span> spans; 239 if (!decoder.decode(spans)) 240 return false; 241 242 region.setShapeSegments(segments); 243 region.setShapeSpans(spans); 244 region.updateBoundsFromShape(); 245 246 if (!region.isValid()) 247 return false; 248 249 return true; 250 } 201 251 202 252 void ArgumentCoder<Length>::encode(ArgumentEncoder& encoder, const Length& length) -
trunk/Source/WebKit2/Shared/WebCoreArgumentCoders.h
r162633 r163509 52 52 class Notification; 53 53 class ProtectionSpace; 54 class Region; 54 55 class ResourceError; 55 56 class ResourceRequest; … … 163 164 }; 164 165 166 template<> struct ArgumentCoder<WebCore::Region> { 167 static void encode(ArgumentEncoder&, const WebCore::Region&); 168 static bool decode(ArgumentDecoder&, WebCore::Region&); 169 }; 170 165 171 template<> struct ArgumentCoder<WebCore::Length> { 166 172 static void encode(ArgumentEncoder&, const WebCore::Length&);
Note: See TracChangeset
for help on using the changeset viewer.