⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 agg_scanline_storage_aa.h

📁 这是VCF框架的代码
💻 H
📖 第 1 页 / 共 2 页
字号:
                do                {                    const span_data& sp = m_spans[span_idx++];                    size += sizeof(int32) * 2;                // X, span_len                    if(sp.len < 0)                    {                        size += sizeof(T);                    // cover                    }                    else                    {                        size += sizeof(T) * unsigned(sp.len); // covers                    }                }                while(--num_spans);            }            return size;        }        //---------------------------------------------------------------        static void write_int32(int8u* dst, int32 val)        {            dst[0] = ((const int8u*)&val)[0];            dst[1] = ((const int8u*)&val)[1];            dst[2] = ((const int8u*)&val)[2];            dst[3] = ((const int8u*)&val)[3];        }        //---------------------------------------------------------------        void serialize(int8u* data) const        {            unsigned i;            write_int32(data, min_x()); // min_x            data += sizeof(int32);            write_int32(data, min_y()); // min_y            data += sizeof(int32);            write_int32(data, max_x()); // max_x            data += sizeof(int32);            write_int32(data, max_y()); // max_y            data += sizeof(int32);            for(i = 0; i < m_scanlines.size(); ++i)            {                const scanline_data& sl_this = m_scanlines[i];                                int8u* size_ptr = data;                data += sizeof(int32);  // Reserve space for scanline size in bytes                write_int32(data, sl_this.y);            // Y                data += sizeof(int32);                write_int32(data, sl_this.num_spans);    // num_spans                data += sizeof(int32);                unsigned num_spans = sl_this.num_spans;                unsigned span_idx  = sl_this.start_span;                do                {                    const span_data& sp = m_spans[span_idx++];                    const T* covers = covers_by_index(sp.covers_id);                    write_int32(data, sp.x);            // X                    data += sizeof(int32);                    write_int32(data, sp.len);          // span_len                    data += sizeof(int32);                    if(sp.len < 0)                    {                        memcpy(data, covers, sizeof(T));                        data += sizeof(T);                    }                    else                    {                        memcpy(data, covers, unsigned(sp.len) * sizeof(T));                        data += sizeof(T) * unsigned(sp.len);                    }                }                while(--num_spans);                write_int32(size_ptr, int32(unsigned(data - size_ptr)));            }        }        //---------------------------------------------------------------        const scanline_data& scanline_by_index(unsigned i) const        {            return (i < m_scanlines.size()) ? m_scanlines[i] : m_fake_scanline;        }        //---------------------------------------------------------------        const span_data& span_by_index(unsigned i) const        {            return (i < m_spans.size()) ? m_spans[i] : m_fake_span;        }        //---------------------------------------------------------------        const T* covers_by_index(int i) const        {            return m_covers[i];        }    private:        scanline_cell_storage<T>      m_covers;        pod_bvector<span_data, 10>    m_spans;        pod_bvector<scanline_data, 8> m_scanlines;        span_data     m_fake_span;        scanline_data m_fake_scanline;        int           m_min_x;        int           m_min_y;        int           m_max_x;        int           m_max_y;        unsigned      m_cur_scanline;    };    typedef scanline_storage_aa<int8u>  scanline_storage_aa8;  //--------scanline_storage_aa8    typedef scanline_storage_aa<int16u> scanline_storage_aa16; //--------scanline_storage_aa16    typedef scanline_storage_aa<int32u> scanline_storage_aa32; //--------scanline_storage_aa32    //------------------------------------------serialized_scanlines_adaptor_aa    template<class T> class serialized_scanlines_adaptor_aa    {    public:        typedef T cover_type;        //---------------------------------------------------------------------        class embedded_scanline        {        public:            typedef T cover_type;            //-----------------------------------------------------------------            class const_iterator            {            public:                struct span                {                    int32    x;                    int32    len; // If negative, it's a solid span, "covers" is valid                    const T* covers;                 };                const_iterator() : m_ptr(0) {}                const_iterator(const embedded_scanline& sl) :                    m_ptr(sl.m_ptr),                    m_dx(sl.m_dx)                {                    init_span();                }                const span& operator*()  const { return m_span;  }                const span* operator->() const { return &m_span; }                void operator ++ ()                {                    if(m_span.len < 0)                     {                        m_ptr += sizeof(T);                    }                    else                     {                        m_ptr += m_span.len * sizeof(T);                    }                    init_span();                }            private:                int read_int32()                {                    int32 val;                    ((int8u*)&val)[0] = *m_ptr++;                    ((int8u*)&val)[1] = *m_ptr++;                    ((int8u*)&val)[2] = *m_ptr++;                    ((int8u*)&val)[3] = *m_ptr++;                    return val;                }                void init_span()                {                    m_span.x      = read_int32() + m_dx;                    m_span.len    = read_int32();                    m_span.covers = m_ptr;                }                const int8u* m_ptr;                span         m_span;                int          m_dx;            };            friend class const_iterator;            //-----------------------------------------------------------------            embedded_scanline() : m_ptr(0), m_y(0), m_num_spans(0) {}            //-----------------------------------------------------------------            void     reset(int, int)     {}            unsigned num_spans()   const { return m_num_spans;  }            int      y()           const { return m_y;          }            const_iterator begin() const { return const_iterator(*this); }        private:            //-----------------------------------------------------------------            int read_int32()            {                int32 val;                ((int8u*)&val)[0] = *m_ptr++;                ((int8u*)&val)[1] = *m_ptr++;                ((int8u*)&val)[2] = *m_ptr++;                ((int8u*)&val)[3] = *m_ptr++;                return val;            }        public:            //-----------------------------------------------------------------            void init(const int8u* ptr, int dx, int dy)            {                m_ptr       = ptr;                m_y         = read_int32() + dy;                m_num_spans = unsigned(read_int32());                m_dx        = dx;            }        private:            const int8u* m_ptr;            int          m_y;            unsigned     m_num_spans;            int          m_dx;        };    public:        //--------------------------------------------------------------------        serialized_scanlines_adaptor_aa() :            m_data(0),            m_end(0),            m_ptr(0),            m_dx(0),            m_dy(0),            m_min_x(0x7FFFFFFF),            m_min_y(0x7FFFFFFF),            m_max_x(-0x7FFFFFFF),            m_max_y(-0x7FFFFFFF)        {}        //--------------------------------------------------------------------        serialized_scanlines_adaptor_aa(const int8u* data, unsigned size,                                        double dx, double dy) :            m_data(data),            m_end(data + size),            m_ptr(data),            m_dx(iround(dx)),            m_dy(iround(dy)),            m_min_x(0x7FFFFFFF),            m_min_y(0x7FFFFFFF),            m_max_x(-0x7FFFFFFF),            m_max_y(-0x7FFFFFFF)        {}        //--------------------------------------------------------------------        void init(const int8u* data, unsigned size, double dx, double dy)        {            m_data  = data;            m_end   = data + size;            m_ptr   = data;            m_dx    = iround(dx);            m_dy    = iround(dy);            m_min_x = 0x7FFFFFFF;            m_min_y = 0x7FFFFFFF;            m_max_x = -0x7FFFFFFF;            m_max_y = -0x7FFFFFFF;        }    private:        //--------------------------------------------------------------------        int read_int32()        {            int32 val;            ((int8u*)&val)[0] = *m_ptr++;            ((int8u*)&val)[1] = *m_ptr++;            ((int8u*)&val)[2] = *m_ptr++;            ((int8u*)&val)[3] = *m_ptr++;            return val;        }        //--------------------------------------------------------------------        unsigned read_int32u()        {            int32u val;            ((int8u*)&val)[0] = *m_ptr++;            ((int8u*)&val)[1] = *m_ptr++;            ((int8u*)&val)[2] = *m_ptr++;            ((int8u*)&val)[3] = *m_ptr++;            return val;        }            public:        // Iterate scanlines interface        //--------------------------------------------------------------------        bool rewind_scanlines()        {            m_ptr = m_data;            if(m_ptr < m_end)            {                m_min_x = read_int32() + m_dx;                 m_min_y = read_int32() + m_dy;                m_max_x = read_int32() + m_dx;                m_max_y = read_int32() + m_dy;            }            return m_ptr < m_end;        }        //--------------------------------------------------------------------        int min_x() const { return m_min_x; }        int min_y() const { return m_min_y; }        int max_x() const { return m_max_x; }        int max_y() const { return m_max_y; }        //--------------------------------------------------------------------        template<class Scanline> bool sweep_scanline(Scanline& sl)        {            sl.reset_spans();            for(;;)            {                if(m_ptr >= m_end) return false;                read_int32();      // Skip scanline size in bytes                int y = read_int32() + m_dy;                unsigned num_spans = read_int32();                do                {                    int x = read_int32() + m_dx;                    int len = read_int32();                    if(len < 0)                    {                        sl.add_span(x, unsigned(-len), *m_ptr);                        m_ptr += sizeof(T);                    }                    else                    {                        sl.add_cells(x, len, m_ptr);                        m_ptr += len * sizeof(T);                    }                }                while(--num_spans);                if(sl.num_spans())                {                    sl.finalize(y);                    break;                }            }            return true;        }        //--------------------------------------------------------------------        // Specialization for embedded_scanline        bool sweep_scanline(embedded_scanline& sl)        {            do            {                if(m_ptr >= m_end) return false;                unsigned byte_size = read_int32u();                sl.init(m_ptr, m_dx, m_dy);                m_ptr += byte_size - sizeof(int32);            }            while(sl.num_spans() == 0);            return true;        }    private:        const int8u* m_data;        const int8u* m_end;        const int8u* m_ptr;        int          m_dx;        int          m_dy;        int          m_min_x;        int          m_min_y;        int          m_max_x;        int          m_max_y;    };    typedef serialized_scanlines_adaptor_aa<int8u>  serialized_scanlines_adaptor_aa8;  //----serialized_scanlines_adaptor_aa8    typedef serialized_scanlines_adaptor_aa<int16u> serialized_scanlines_adaptor_aa16; //----serialized_scanlines_adaptor_aa16    typedef serialized_scanlines_adaptor_aa<int32u> serialized_scanlines_adaptor_aa32; //----serialized_scanlines_adaptor_aa32}#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -