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

📄 agg_scanline_storage_bin.h

📁 这是VCF框架的代码
💻 H
📖 第 1 页 / 共 2 页
字号:
                    write_int32(data, sp.x);             // X                    data += sizeof(int32);                    write_int32(data, sp.len);           // len                    data += sizeof(int32);                }                while(--num_spans);            }        }        //---------------------------------------------------------------        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;        }    private:        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;    };    //---------------------------------------serialized_scanlines_adaptor_bin    class serialized_scanlines_adaptor_bin    {    public:        typedef bool cover_type;        //--------------------------------------------------------------------        class embedded_scanline        {        public:            //----------------------------------------------------------------            class const_iterator            {            public:                struct span                {                    int32 x;                    int32 len;                };                const_iterator() : m_ptr(0) {}                const_iterator(const embedded_scanline& sl) :                    m_ptr(sl.m_ptr),                    m_dx(sl.m_dx)                {                    m_span.x   = read_int32() + m_dx;                    m_span.len = read_int32();                }                const span& operator*()  const { return m_span;  }                const span* operator->() const { return &m_span; }                void operator ++ ()                {                    m_span.x   = read_int32() + m_dx;                    m_span.len = read_int32();                }            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;                }                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_bin() :            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_bin(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;        }           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;                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) len = -len;                    sl.add_span(x, unsigned(len), cover_full);                }                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;                sl.init(m_ptr, m_dx, m_dy);                // Jump to the next scanline                //--------------------------                read_int32();                    // Y                int num_spans = read_int32();    // num_spans                m_ptr += num_spans * sizeof(int32) * 2;            }            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;    };}#endif

⌨️ 快捷键说明

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