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 (at) antigrain.com 18 // mcseemagg (at) 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" 28 namespace agg 29 { 30 path_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 } 41 path_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 } 50 void 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 } 84 void path_storage::rewind(unsigned path_id) 85 { 86 m_iterator = path_id; 87 } 88 void 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 } 96 void 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