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