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 26 #include "agg_math.h" 27 #include "agg_path_storage.h" 28 #include "core/include/fxcrt/fx_basic.h" 29 30 namespace agg 31 { 32 path_storage::~path_storage() 33 { 34 if(m_total_blocks) { 35 FX_FLOAT** coord_blk = m_coord_blocks + m_total_blocks - 1; 36 while(m_total_blocks--) { 37 FX_Free(*coord_blk); 38 --coord_blk; 39 } 40 FX_Free(m_coord_blocks); 41 } 42 } 43 path_storage::path_storage() : 44 m_total_vertices(0), 45 m_total_blocks(0), 46 m_max_blocks(0), 47 m_coord_blocks(0), 48 m_cmd_blocks(0), 49 m_iterator(0) 50 { 51 } 52 void path_storage::allocate_block(unsigned nb) 53 { 54 if(nb >= m_max_blocks) { 55 FX_FLOAT** new_coords = 56 FX_Alloc2D(FX_FLOAT*, m_max_blocks + block_pool, 2); 57 unsigned char** new_cmds = 58 (unsigned char**)(new_coords + m_max_blocks + block_pool); 59 if(m_coord_blocks) { 60 FXSYS_memcpy(new_coords, 61 m_coord_blocks, 62 m_max_blocks * sizeof(FX_FLOAT*)); 63 FXSYS_memcpy(new_cmds, 64 m_cmd_blocks, 65 m_max_blocks * sizeof(unsigned char*)); 66 FX_Free(m_coord_blocks); 67 } 68 m_coord_blocks = new_coords; 69 m_cmd_blocks = new_cmds; 70 m_max_blocks += block_pool; 71 } 72 m_coord_blocks[nb] = 73 FX_Alloc( FX_FLOAT, block_size * 2 + 74 block_size / 75 (sizeof(FX_FLOAT) / sizeof(unsigned char))); 76 m_cmd_blocks[nb] = 77 (unsigned char*)(m_coord_blocks[nb] + block_size * 2); 78 m_total_blocks++; 79 } 80 void path_storage::rewind(unsigned path_id) 81 { 82 m_iterator = path_id; 83 } 84 void path_storage::curve4(FX_FLOAT x_ctrl1, FX_FLOAT y_ctrl1, 85 FX_FLOAT x_ctrl2, FX_FLOAT y_ctrl2, 86 FX_FLOAT x_to, FX_FLOAT y_to) 87 { 88 add_vertex(x_ctrl1, y_ctrl1, path_cmd_curve4); 89 add_vertex(x_ctrl2, y_ctrl2, path_cmd_curve4); 90 add_vertex(x_to, y_to, path_cmd_curve4); 91 } 92 void path_storage::end_poly() 93 { 94 if(m_total_vertices) { 95 if(is_vertex(command(m_total_vertices - 1))) { 96 add_vertex(0, 0, path_cmd_end_poly | path_flags_close); 97 } 98 } 99 } 100 } 101