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