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 #include "../../../../include/fxcrt/fx_basic.h"
     26 #include "agg_path_storage.h"
     27 #include "agg_math.h"
     28 namespace agg
     29 {
     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 }
     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 }
     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 }
     84 void path_storage::rewind(unsigned path_id)
     85 {
     86     m_iterator = path_id;
     87 }
     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 }
     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