1 2//---------------------------------------------------------------------------- 3// XYQ: 2006-01-22 Copied from AGG project. 4// TODO: This file uses intensive floating point operations, so it's NOT suitable 5// for platforms like Symbian OS. We need to change to FIX format. 6//---------------------------------------------------------------------------- 7//---------------------------------------------------------------------------- 8// Anti-Grain Geometry - Version 2.3 9// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) 10// 11// Permission to copy, use, modify, sell and distribute this software 12// is granted provided this copyright notice appears in all copies. 13// This software is provided "as is" without express or implied 14// warranty, and with no claim as to its suitability for any purpose. 15// 16//---------------------------------------------------------------------------- 17// Contact: mcseem@antigrain.com 18// mcseemagg@yahoo.com 19// http://www.antigrain.com 20//---------------------------------------------------------------------------- 21// 22// Class path_storage 23// 24//---------------------------------------------------------------------------- 25#include "../../../../include/fxcrt/fx_basic.h" 26#include "agg_path_storage.h" 27#include "agg_math.h" 28namespace agg 29{ 30path_storage::~path_storage() 31{ 32 if(m_total_blocks) { 33 FX_FLOAT** coord_blk = m_coord_blocks + m_total_blocks - 1; 34 while(m_total_blocks--) { 35 FX_Free(*coord_blk); 36 --coord_blk; 37 } 38 FX_Free(m_coord_blocks); 39 } 40} 41path_storage::path_storage() : 42 m_total_vertices(0), 43 m_total_blocks(0), 44 m_max_blocks(0), 45 m_coord_blocks(0), 46 m_cmd_blocks(0), 47 m_iterator(0) 48{ 49} 50void path_storage::allocate_block(unsigned nb) 51{ 52 if(nb >= m_max_blocks) { 53 FX_FLOAT** new_coords = 54 FX_Alloc( FX_FLOAT*, (m_max_blocks + block_pool) * 2); 55 if (!new_coords) { 56 return; 57 } 58 unsigned char** new_cmds = 59 (unsigned char**)(new_coords + m_max_blocks + block_pool); 60 if(m_coord_blocks) { 61 FXSYS_memcpy32(new_coords, 62 m_coord_blocks, 63 m_max_blocks * sizeof(FX_FLOAT*)); 64 FXSYS_memcpy32(new_cmds, 65 m_cmd_blocks, 66 m_max_blocks * sizeof(unsigned char*)); 67 FX_Free(m_coord_blocks); 68 } 69 m_coord_blocks = new_coords; 70 m_cmd_blocks = new_cmds; 71 m_max_blocks += block_pool; 72 } 73 m_coord_blocks[nb] = 74 FX_Alloc( FX_FLOAT, block_size * 2 + 75 block_size / 76 (sizeof(FX_FLOAT) / sizeof(unsigned char))); 77 if (!m_coord_blocks[nb]) { 78 return; 79 } 80 m_cmd_blocks[nb] = 81 (unsigned char*)(m_coord_blocks[nb] + block_size * 2); 82 m_total_blocks++; 83} 84void path_storage::rewind(unsigned path_id) 85{ 86 m_iterator = path_id; 87} 88void path_storage::curve4(FX_FLOAT x_ctrl1, FX_FLOAT y_ctrl1, 89 FX_FLOAT x_ctrl2, FX_FLOAT y_ctrl2, 90 FX_FLOAT x_to, FX_FLOAT y_to) 91{ 92 add_vertex(x_ctrl1, y_ctrl1, path_cmd_curve4); 93 add_vertex(x_ctrl2, y_ctrl2, path_cmd_curve4); 94 add_vertex(x_to, y_to, path_cmd_curve4); 95} 96void path_storage::end_poly() 97{ 98 if(m_total_vertices) { 99 if(is_vertex(command(m_total_vertices - 1))) { 100 add_vertex(0, 0, path_cmd_end_poly | path_flags_close); 101 } 102 } 103} 104} 105