Changeset 163509 in webkit


Ignore:
Timestamp:
Feb 5, 2014 8:31:46 PM (10 years ago)
Author:
Simon Fraser
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:
Location:
trunk/Source
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r163508 r163509  
     12014-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
    1302014-02-05  Andreas Kling  <akling@apple.com>
    231
  • trunk/Source/WebCore/platform/graphics/Region.cpp

    r142434 r163509  
    320320void Region::Shape::dump() const
    321321{
    322     for (Shape::SpanIterator span = spans_begin(), end = spans_end(); span != end; ++span) {
     322    for (auto span = spans_begin(), end = spans_end(); span != end; ++span) {
    323323        printf("%6d: (", span->y);
    324324
    325         for (Shape::SegmentIterator segment = segments_begin(span), end = segments_end(span); segment != end; ++segment)
     325        for (auto segment = segments_begin(span), end = segments_end(span); segment != end; ++segment)
    326326            printf("%d ", *segment);
    327327        printf(")\n");
     
    331331}
    332332#endif
     333
     334bool 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}
    333354
    334355IntRect Region::Shape::bounds() const
     
    551572#endif
    552573
     574void Region::updateBoundsFromShape()
     575{
     576    m_bounds = m_shape.bounds();
     577}
     578
    553579void Region::intersect(const Region& region)
    554580{
  • trunk/Source/WebCore/platform/graphics/Region.h

    r163019 r163509  
    6565#endif
    6666
    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.
    6871    struct Span {
     72        Span()
     73            : y(0)
     74            , segmentIndex(0)
     75        {
     76        }
     77
    6978        Span(int y, size_t segmentIndex)
    70             : y(y), segmentIndex(segmentIndex)
     79            : y(y)
     80            , segmentIndex(segmentIndex)
    7181        {
    7282        }
     
    7585        size_t segmentIndex;
    7686    };
     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
     96private:
    7797
    7898    class Shape {
     
    106126        template<typename CompareOperation>
    107127        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; }
    108137
    109138#ifndef NDEBUG
  • trunk/Source/WebKit2/ChangeLog

    r163506 r163509  
     12014-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
    1222014-02-05  Anders Carlsson  <andersca@apple.com>
    223
  • trunk/Source/WebKit2/Platform/IPC/ArgumentCoders.h

    r161148 r163509  
    9393};
    9494
    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)
     95template<bool fixedSizeElements, typename T, size_t inlineCapacity> struct VectorArgumentCoder;
     96
     97template<typename T, size_t inlineCapacity> struct VectorArgumentCoder<false, T, inlineCapacity> {
     98    static void encode(ArgumentEncoder& encoder, const Vector<T, inlineCapacity>& vector)
    9999    {
    100100        encoder << static_cast<uint64_t>(vector.size());
     
    103103    }
    104104
    105     static bool decode(ArgumentDecoder& decoder, Vector<T>& vector)
     105    static bool decode(ArgumentDecoder& decoder, Vector<T, inlineCapacity>& vector)
    106106    {
    107107        uint64_t size;
     
    109109            return false;
    110110
    111         Vector<T> tmp;
     111        Vector<T, inlineCapacity> tmp;
    112112        for (size_t i = 0; i < size; ++i) {
    113113            T element;
     
    124124};
    125125
    126 template<typename T> struct VectorArgumentCoder<true, T> {
    127     static void encode(ArgumentEncoder& encoder, const Vector<T>& vector)
     126template<typename T, size_t inlineCapacity> struct VectorArgumentCoder<true, T, inlineCapacity> {
     127    static void encode(ArgumentEncoder& encoder, const Vector<T, inlineCapacity>& vector)
    128128    {
    129129        encoder << static_cast<uint64_t>(vector.size());
     
    131131    }
    132132   
    133     static bool decode(ArgumentDecoder& decoder, Vector<T>& vector)
     133    static bool decode(ArgumentDecoder& decoder, Vector<T, inlineCapacity>& vector)
    134134    {
    135135        uint64_t size;
     
    145145        }
    146146
    147         Vector<T> temp;
     147        Vector<T, inlineCapacity> temp;
    148148        temp.resize(size);
    149149
     
    155155};
    156156
    157 template<typename T> struct ArgumentCoder<Vector<T>> : VectorArgumentCoder<std::is_arithmetic<T>::value, T> { };
     157template<typename T, size_t inlineCapacity> struct ArgumentCoder<Vector<T, inlineCapacity>> : VectorArgumentCoder<std::is_arithmetic<T>::value, T, inlineCapacity> { };
    158158
    159159template<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  
    5252#include <WebCore/PluginData.h>
    5353#include <WebCore/ProtectionSpace.h>
     54#include <WebCore/Region.h>
    5455#include <WebCore/ResourceError.h>
    5556#include <WebCore/ResourceRequest.h>
     
    199200}
    200201
     202template<> struct ArgumentCoder<WebCore::Region::Span> {
     203    static void encode(ArgumentEncoder&, const WebCore::Region::Span&);
     204    static bool decode(ArgumentDecoder&, WebCore::Region::Span&);
     205};
     206
     207void ArgumentCoder<Region::Span>::encode(ArgumentEncoder& encoder, const Region::Span& span)
     208{
     209    encoder << span.y;
     210    encoder << (uint64_t)span.segmentIndex;
     211}
     212
     213bool 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
     226void ArgumentCoder<Region>::encode(ArgumentEncoder& encoder, const Region& region)
     227{
     228    encoder.encode(region.shapeSegments());
     229    encoder.encode(region.shapeSpans());
     230}
     231
     232bool 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}
    201251
    202252void ArgumentCoder<Length>::encode(ArgumentEncoder& encoder, const Length& length)
  • trunk/Source/WebKit2/Shared/WebCoreArgumentCoders.h

    r162633 r163509  
    5252class Notification;
    5353class ProtectionSpace;
     54class Region;
    5455class ResourceError;
    5556class ResourceRequest;
     
    163164};
    164165
     166template<> struct ArgumentCoder<WebCore::Region> {
     167    static void encode(ArgumentEncoder&, const WebCore::Region&);
     168    static bool decode(ArgumentDecoder&, WebCore::Region&);
     169};
     170
    165171template<> struct ArgumentCoder<WebCore::Length> {
    166172    static void encode(ArgumentEncoder&, const WebCore::Length&);
Note: See TracChangeset for help on using the changeset viewer.