| //---------------------------------------------------------------------------- | |
| // 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); | |
| } | |
| } | |
| } | |
| } |