
//----------------------------------------------------------------------------
// XYQ: 2006-01-22 Copied from AGG project.
// TODO: This file uses intensive floating point operations, so it's NOT suitable
// for platforms like Symbian OS. We need to change to FIX format.
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
// Anti-Grain Geometry - Version 2.3
// 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
//----------------------------------------------------------------------------
//
// Class path_storage
//
//----------------------------------------------------------------------------

#include "agg_path_storage.h"

#include "agg_math.h"
#include "core/fxcrt/fx_memory.h"

namespace agg
{
path_storage::~path_storage()
{
    if(m_total_blocks) {
        float** coord_blk = m_coord_blocks + m_total_blocks - 1;
        while(m_total_blocks--) {
            FX_Free(*coord_blk);
            --coord_blk;
        }
        FX_Free(m_coord_blocks);
    }
}
path_storage::path_storage() :
    m_total_vertices(0),
    m_total_blocks(0),
    m_max_blocks(0),
    m_coord_blocks(0),
    m_cmd_blocks(0),
    m_iterator(0)
{
}
void path_storage::allocate_block(unsigned nb)
{
    if(nb >= m_max_blocks) {
        float** new_coords =
            FX_Alloc2D(float*, m_max_blocks + block_pool, 2);
        unsigned char** new_cmds =
            (unsigned char**)(new_coords + m_max_blocks + block_pool);
        if(m_coord_blocks) {
          memcpy(new_coords, m_coord_blocks, m_max_blocks * sizeof(float*));
          memcpy(new_cmds, m_cmd_blocks, m_max_blocks * sizeof(unsigned char*));
          FX_Free(m_coord_blocks);
        }
        m_coord_blocks = new_coords;
        m_cmd_blocks = new_cmds;
        m_max_blocks += block_pool;
    }
    m_coord_blocks[nb] =
        FX_Alloc( float, block_size * 2 +
                  block_size /
                  (sizeof(float) / sizeof(unsigned char)));
    m_cmd_blocks[nb]  =
        (unsigned char*)(m_coord_blocks[nb] + block_size * 2);
    m_total_blocks++;
}
void path_storage::rewind(unsigned path_id)
{
    m_iterator = path_id;
}
void path_storage::curve4(float x_ctrl1, float y_ctrl1,
                          float x_ctrl2, float y_ctrl2,
                          float x_to,    float y_to)
{
    add_vertex(x_ctrl1, y_ctrl1, path_cmd_curve4);
    add_vertex(x_ctrl2, y_ctrl2, path_cmd_curve4);
    add_vertex(x_to,    y_to,    path_cmd_curve4);
}
void path_storage::end_poly()
{
    if(m_total_vertices) {
        if(is_vertex(command(m_total_vertices - 1))) {
            add_vertex(0, 0, path_cmd_end_poly | path_flags_close);
        }
    }
}
}
