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