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

📄 agg_scanline_storage_bin.h

📁 这是VCF框架的代码
💻 H
📖 第 1 页 / 共 2 页
字号:
//----------------------------------------------------------------------------// Anti-Grain Geometry - Version 2.4// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)//// Permission to copy, use, modify, sell and distribute this software // is granted provided this copyright notice appears in all copies. // This software is provided "as is" without express or implied// warranty, and with no claim as to its suitability for any purpose.////----------------------------------------------------------------------------// Contact: mcseem@antigrain.com//          mcseemagg@yahoo.com//          http://www.antigrain.com//----------------------------------------------------------------------------//// Adaptation for 32-bit screen coordinates has been sponsored by // Liberty Technology Systems, Inc., visit http://lib-sys.com//// Liberty Technology Systems, Inc. is the provider of// PostScript and PDF technology for software developers.// //----------------------------------------------------------------------------#ifndef AGG_SCANLINE_STORAGE_BIN_INCLUDED#define AGG_SCANLINE_STORAGE_BIN_INCLUDED#include <string.h>#include <stdlib.h>#include <math.h>#include "agg_array.h"namespace agg{    //-----------------------------------------------scanline_storage_bin    class scanline_storage_bin    {    public:        //---------------------------------------------------------------        struct span_data        {            int32 x;            int32 len;        };        //---------------------------------------------------------------        struct scanline_data        {            int      y;            unsigned num_spans;            unsigned start_span;        };        //---------------------------------------------------------------        class embedded_scanline        {        public:            //-----------------------------------------------------------            class const_iterator            {            public:                const_iterator() : m_storage(0) {}                const_iterator(const embedded_scanline& sl) :                    m_storage(sl.m_storage),                    m_span_idx(sl.m_scanline.start_span)                {                    m_span = m_storage->span_by_index(m_span_idx);                }                const span_data& operator*()  const { return m_span;  }                const span_data* operator->() const { return &m_span; }                void operator ++ ()                {                    ++m_span_idx;                    m_span = m_storage->span_by_index(m_span_idx);                }            private:                const scanline_storage_bin* m_storage;                unsigned                    m_span_idx;                span_data                   m_span;            };            friend class const_iterator;            //-----------------------------------------------------------            embedded_scanline(const scanline_storage_bin& storage) :                m_storage(&storage)            {                setup(0);            }            //-----------------------------------------------------------            void     reset(int, int)     {}            unsigned num_spans()   const { return m_scanline.num_spans;  }            int      y()           const { return m_scanline.y;          }            const_iterator begin() const { return const_iterator(*this); }            //-----------------------------------------------------------            void setup(unsigned scanline_idx)            {                m_scanline_idx = scanline_idx;                m_scanline = m_storage->scanline_by_index(m_scanline_idx);            }        private:            const scanline_storage_bin* m_storage;            scanline_data               m_scanline;            unsigned                    m_scanline_idx;        };        //---------------------------------------------------------------        scanline_storage_bin() :            m_spans(256-2),         // Block increment size            m_scanlines(),            m_min_x( 0x7FFFFFFF),            m_min_y( 0x7FFFFFFF),            m_max_x(-0x7FFFFFFF),            m_max_y(-0x7FFFFFFF),            m_cur_scanline(0)        {            m_fake_scanline.y = 0;            m_fake_scanline.num_spans = 0;            m_fake_scanline.start_span = 0;            m_fake_span.x = 0;            m_fake_span.len = 0;        }        // Renderer Interface        //---------------------------------------------------------------        void prepare()        {            m_scanlines.remove_all();            m_spans.remove_all();            m_min_x =  0x7FFFFFFF;            m_min_y =  0x7FFFFFFF;            m_max_x = -0x7FFFFFFF;            m_max_y = -0x7FFFFFFF;            m_cur_scanline = 0;        }        //---------------------------------------------------------------        template<class Scanline> void render(const Scanline& sl)        {            scanline_data sl_this;            int y = sl.y();            if(y < m_min_y) m_min_y = y;            if(y > m_max_y) m_max_y = y;            sl_this.y = y;            sl_this.num_spans = sl.num_spans();            sl_this.start_span = m_spans.size();            typename Scanline::const_iterator span_iterator = sl.begin();            unsigned num_spans = sl_this.num_spans;            for(;;)            {                span_data sp;                sp.x   = span_iterator->x;                sp.len = (int32)abs((int)(span_iterator->len));                m_spans.add(sp);                int x1 = sp.x;                int x2 = sp.x + sp.len - 1;                if(x1 < m_min_x) m_min_x = x1;                if(x2 > m_max_x) m_max_x = x2;                if(--num_spans == 0) break;                ++span_iterator;            }            m_scanlines.add(sl_this);        }        //---------------------------------------------------------------        // Iterate scanlines interface        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; }        //---------------------------------------------------------------        bool rewind_scanlines()        {            m_cur_scanline = 0;            return m_scanlines.size() > 0;        }        //---------------------------------------------------------------        template<class Scanline> bool sweep_scanline(Scanline& sl)        {            sl.reset_spans();            for(;;)            {                if(m_cur_scanline >= m_scanlines.size()) return false;                const scanline_data& sl_this = m_scanlines[m_cur_scanline];                unsigned num_spans = sl_this.num_spans;                unsigned span_idx  = sl_this.start_span;                do                {                    const span_data& sp = m_spans[span_idx++];                    sl.add_span(sp.x, sp.len, cover_full);                }                while(--num_spans);                ++m_cur_scanline;                if(sl.num_spans())                {                    sl.finalize(sl_this.y);                    break;                }            }            return true;        }        //---------------------------------------------------------------        // Specialization for embedded_scanline        bool sweep_scanline(embedded_scanline& sl)        {            do            {                if(m_cur_scanline >= m_scanlines.size()) return false;                sl.setup(m_cur_scanline);                ++m_cur_scanline;            }            while(sl.num_spans() == 0);            return true;        }        //---------------------------------------------------------------        unsigned byte_size() const        {            unsigned i;            unsigned size = sizeof(int32) * 4; // min_x, min_y, max_x, max_y            for(i = 0; i < m_scanlines.size(); ++i)            {                size += sizeof(int32) * 2 + // Y, num_spans                        unsigned(m_scanlines[i].num_spans) * sizeof(int32) * 2; // X, span_len            }            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];                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++];

⌨️ 快捷键说明

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