• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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"
28 namespace agg
29 {
~path_storage()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 }
path_storage()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 }
allocate_block(unsigned nb)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 }
rewind(unsigned path_id)84 void path_storage::rewind(unsigned path_id)
85 {
86     m_iterator = path_id;
87 }
curve4(FX_FLOAT x_ctrl1,FX_FLOAT y_ctrl1,FX_FLOAT x_ctrl2,FX_FLOAT y_ctrl2,FX_FLOAT x_to,FX_FLOAT y_to)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 }
end_poly()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