Home | History | Annotate | Download | only in agg23
      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