diff options
author | John Abd-El-Malek <jabdelmalek@google.com> | 2014-05-17 22:33:34 -0700 |
---|---|---|
committer | John Abd-El-Malek <jabdelmalek@google.com> | 2014-05-17 22:33:34 -0700 |
commit | 5110c4743751145c4ae1934cd1d83bc6c55bb43f (patch) | |
tree | b141608096b73163182764c25b895d3df4b2c182 /core/src/fxge/agg/agg23/fx_agg_path_storage.cpp | |
parent | 76b563d2feed92ed328afb1f15e3466a9536b11b (diff) | |
download | pdfium-5110c4743751145c4ae1934cd1d83bc6c55bb43f.tar.xz |
Initial commit.
Diffstat (limited to 'core/src/fxge/agg/agg23/fx_agg_path_storage.cpp')
-rw-r--r-- | core/src/fxge/agg/agg23/fx_agg_path_storage.cpp | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/core/src/fxge/agg/agg23/fx_agg_path_storage.cpp b/core/src/fxge/agg/agg23/fx_agg_path_storage.cpp new file mode 100644 index 0000000000..8c4b701ebe --- /dev/null +++ b/core/src/fxge/agg/agg23/fx_agg_path_storage.cpp @@ -0,0 +1,104 @@ + +//---------------------------------------------------------------------------- +// XYQ: 2006-01-22 Copied from AGG project. +// TODO: This file uses intensive floating point operations, so it's NOT suitable +// for platforms like Symbian OS. We need to change to FIX format. +//---------------------------------------------------------------------------- +//---------------------------------------------------------------------------- +// Anti-Grain Geometry - Version 2.3 +// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) +// +// Permission to copy, use, modify, sell and distribute this software +// is granted provided this copyright notice appears in all copies. +// This software is provided "as is" without express or implied +// warranty, and with no claim as to its suitability for any purpose. +// +//---------------------------------------------------------------------------- +// Contact: mcseem@antigrain.com +// mcseemagg@yahoo.com +// http://www.antigrain.com +//---------------------------------------------------------------------------- +// +// Class path_storage +// +//---------------------------------------------------------------------------- +#include "../../../../include/fxcrt/fx_basic.h" +#include "agg_path_storage.h" +#include "agg_math.h" +namespace agg +{ +path_storage::~path_storage() +{ + if(m_total_blocks) { + FX_FLOAT** coord_blk = m_coord_blocks + m_total_blocks - 1; + while(m_total_blocks--) { + FX_Free(*coord_blk); + --coord_blk; + } + FX_Free(m_coord_blocks); + } +} +path_storage::path_storage() : + m_total_vertices(0), + m_total_blocks(0), + m_max_blocks(0), + m_coord_blocks(0), + m_cmd_blocks(0), + m_iterator(0) +{ +} +void path_storage::allocate_block(unsigned nb) +{ + if(nb >= m_max_blocks) { + FX_FLOAT** new_coords = + FX_Alloc( FX_FLOAT*, (m_max_blocks + block_pool) * 2); + if (!new_coords) { + return; + } + unsigned char** new_cmds = + (unsigned char**)(new_coords + m_max_blocks + block_pool); + if(m_coord_blocks) { + FXSYS_memcpy32(new_coords, + m_coord_blocks, + m_max_blocks * sizeof(FX_FLOAT*)); + FXSYS_memcpy32(new_cmds, + m_cmd_blocks, + m_max_blocks * sizeof(unsigned char*)); + FX_Free(m_coord_blocks); + } + m_coord_blocks = new_coords; + m_cmd_blocks = new_cmds; + m_max_blocks += block_pool; + } + m_coord_blocks[nb] = + FX_Alloc( FX_FLOAT, block_size * 2 + + block_size / + (sizeof(FX_FLOAT) / sizeof(unsigned char))); + if (!m_coord_blocks[nb]) { + return; + } + m_cmd_blocks[nb] = + (unsigned char*)(m_coord_blocks[nb] + block_size * 2); + m_total_blocks++; +} +void path_storage::rewind(unsigned path_id) +{ + m_iterator = path_id; +} +void path_storage::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) +{ + add_vertex(x_ctrl1, y_ctrl1, path_cmd_curve4); + add_vertex(x_ctrl2, y_ctrl2, path_cmd_curve4); + add_vertex(x_to, y_to, path_cmd_curve4); +} +void path_storage::end_poly() +{ + if(m_total_vertices) { + if(is_vertex(command(m_total_vertices - 1))) { + add_vertex(0, 0, path_cmd_end_poly | path_flags_close); + } + } +} +} |