//---------------------------------------------------------------------------- // 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 "agg_path_storage.h" #include #include "agg_math.h" #include "core/fxcrt/fx_memory.h" namespace pdfium { namespace agg { path_storage::~path_storage() { if(m_total_blocks) { 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() = default; path_storage::path_storage(path_storage&& other) { m_total_vertices = other.m_total_vertices; m_total_blocks = other.m_total_blocks; m_max_blocks = other.m_max_blocks; m_coord_blocks = other.m_coord_blocks; m_cmd_blocks = other.m_cmd_blocks; m_iterator = other.m_iterator; other.m_total_vertices = 0; other.m_total_blocks = 0; other.m_max_blocks = 0; other.m_coord_blocks = nullptr; other.m_cmd_blocks = nullptr; other.m_iterator = 0; } void path_storage::allocate_block(unsigned nb) { if(nb >= m_max_blocks) { float** new_coords = FX_Alloc2D(float*, m_max_blocks + block_pool, 2); unsigned char** new_cmds = (unsigned char**)(new_coords + m_max_blocks + block_pool); if(m_coord_blocks) { memcpy(new_coords, m_coord_blocks, m_max_blocks * sizeof(float*)); memcpy(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( float, block_size * 2 + block_size / (sizeof(float) / sizeof(unsigned char))); 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(float x_ctrl1, float y_ctrl1, float x_ctrl2, float y_ctrl2, float x_to, 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, unsigned{path_cmd_end_poly} | path_flags_close); } } } } } // namespace pdfium