CFX_Font::~CFX_Font() { if (m_pSubstFont) { delete m_pSubstFont; m_pSubstFont = NULL; } if (m_pFontDataAllocation) { FX_Free(m_pFontDataAllocation); m_pFontDataAllocation = NULL; } if (m_Face) { if (FXFT_Get_Face_External_Stream(m_Face)) { FXFT_Clear_Face_External_Stream(m_Face); } if(m_bEmbedded) { DeleteFace(); } else { CFX_GEModule::Get()->GetFontMgr()->ReleaseFace(m_Face); } } if (m_pOwnedStream) { FX_Free(m_pOwnedStream); m_pOwnedStream = NULL; } if (m_pGsubData) { FX_Free(m_pGsubData); m_pGsubData = NULL; } #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ ReleasePlatformResource(); #endif }
void dgDelaunayTetrahedralization::RemoveUpperHull() { #ifdef _WIN32 dgUnsigned32 controlWorld = dgControlFP (0xffffffff, 0); dgControlFP(_PC_53, _MCW_PC); #endif dgListNode* nextNode = NULL; // const dgHullVector* const points = &m_points[0]; for (dgListNode* node = GetFirst(); node; node = nextNode) { nextNode = node->GetNext(); dgConvexHull4dTetraherum* const tetra = &node->GetInfo(); tetra->SetMark(0); // const dgBigVector &p0 = points[tetra->m_faces[0].m_index[0]]; // const dgBigVector &p1 = points[tetra->m_faces[0].m_index[1]]; // const dgBigVector &p2 = points[tetra->m_faces[0].m_index[2]]; // const dgBigVector &p3 = points[tetra->m_faces[0].m_otherVertex]; // dgFloat64 w = GetTetraVolume (p0, p1, p2, p3); dgFloat64 w = GetTetraVolume(tetra); if (w >= dgFloat64(0.0f)) { DeleteFace(node); } } #ifdef _WIN32 dgControlFP(controlWorld, _MCW_PC); #endif }
CFX_Font::~CFX_Font() { delete m_pSubstFont; FX_Free(m_pFontDataAllocation); #ifdef PDF_ENABLE_XFA if (m_bLogic) { m_OtfFontData.DetachBuffer(); return; } #endif // PDF_ENABLE_XFA if (m_Face) { #ifndef PDF_ENABLE_XFA if (FXFT_Get_Face_External_Stream(m_Face)) { FXFT_Clear_Face_External_Stream(m_Face); } #endif // PDF_ENABLE_XFA if (m_bEmbedded) { DeleteFace(); } else { CFX_GEModule::Get()->GetFontMgr()->ReleaseFace(m_Face); } } #ifdef PDF_ENABLE_XFA FX_Free(m_pOwnedStream); #endif // PDF_ENABLE_XFA FX_Free(m_pGsubData); #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ ReleasePlatformResource(); #endif }
void EpaPolyhedron::DeleteVisibleFaces( const btPoint3& point, EpaFace* pFace, std::list< EpaHalfEdge* >& coneBaseTwinHalfEdges ) { EPA_DEBUG_ASSERT( !pFace->m_deleted ,"Face is already deleted!" ); DeleteFace( pFace ); EpaHalfEdge* pCurrentHalfEdge = pFace->m_pHalfEdge; do { EPA_DEBUG_ASSERT( pCurrentHalfEdge->m_pTwin ,"Half-edge without a twin!" ); EpaFace* pAdjacentFace = pCurrentHalfEdge->m_pTwin->m_pFace; EPA_DEBUG_ASSERT( pAdjacentFace ,"Invalid adjacent face!" ); if ( !pAdjacentFace->m_deleted ) { #ifdef EPA_POLYHEDRON_USE_PLANES EPA_DEBUG_ASSERT( ( pAdjacentFace->m_planeNormal.length2() > 0 ) ,"Invalid plane!" ); btScalar pointDist = pAdjacentFace->m_planeNormal.dot( point ) + pAdjacentFace->m_planeDistance; if ( pointDist > PLANE_THICKNESS ) #else btScalar dot = pAdjacentFace->m_v.dot( point ); if ( dot >= pAdjacentFace->m_vSqrd ) #endif { DeleteVisibleFaces( point, pAdjacentFace, coneBaseTwinHalfEdges ); } else { coneBaseTwinHalfEdges.push_back( pCurrentHalfEdge->m_pTwin ); } } pCurrentHalfEdge = pCurrentHalfEdge->m_pNextCCW; } while( pCurrentHalfEdge != pFace->m_pHalfEdge ); }
dgInt32 dgConvexHull4d::AddVertex (const dgBigVector& vertex) { dgSetPrecisionDouble precision; dgInt32 index = -1; dgListNode* const faceNode = FindFacingNode(vertex); if (faceNode) { index = m_count; m_points[index] = vertex; m_points[index].m_index = index; m_count ++; dgList<dgListNode*> newFaces(GetAllocator()); dgList<dgListNode*> deleteList(GetAllocator()); InsertNewVertex(index, faceNode, deleteList, newFaces); for (dgList<dgListNode*>::dgListNode* deleteNode = deleteList.GetFirst(); deleteNode; deleteNode = deleteNode->GetNext()) { dgListNode* const node = deleteNode->GetInfo(); DeleteFace (node); } } return index; }
CFX_Font::~CFX_Font() { if (m_pSubstFont) { delete m_pSubstFont; m_pSubstFont = NULL; } #ifdef FOXIT_CHROME_BUILD if (m_pFontDataAllocation) { FX_Free(m_pFontDataAllocation); m_pFontDataAllocation = NULL; } #endif if (m_Face) { #ifdef FOXIT_CHROME_BUILD FXFT_Library library = FXFT_Get_Face_FreeType(m_Face); if (FXFT_Get_Face_External_Stream(m_Face)) { FXFT_Clear_Face_External_Stream(m_Face); } #endif if(m_bEmbedded) { DeleteFace(); } else { CFX_GEModule::Get()->GetFontMgr()->ReleaseFace(m_Face); } } if (m_pOwnedStream) { FX_Free(m_pOwnedStream); m_pOwnedStream = NULL; } if (m_pGsubData) { FX_Free(m_pGsubData); m_pGsubData = NULL; } #if (_FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ && (!defined(_FPDFAPI_MINI_))) ReleasePlatformResource(); #endif }
SSHANDLE * CSSolid::MergeSameVertices(int& nDeleted) { int nMerged = 0; nDeleted = 0; static SSHANDLE hDeletedList[128]; DoVertices: for(int v1 = 0; v1 < m_nVertices; v1++) { for(int v2 = 0; v2 < m_nVertices; v2++) { if(v1 == v2) continue; // no! if(!VectorCompare(m_Vertices[v1].pos, m_Vertices[v2].pos)) { // no match continue; } ++nMerged; // same vertices - kill v1, set edge refs to use v2. SSHANDLE hV1 = m_Vertices[v1].id; SSHANDLE hV2 = m_Vertices[v2].id; hDeletedList[nDeleted++] = hV1; DeleteVertex(v1); int nAffected; CSSEdge **ppEdges = FindAffectedEdges(&hV1, 1, nAffected); // run through edges and change references for(int e = 0; e < nAffected; e++) { if(ppEdges[e]->hvStart == hV1) ppEdges[e]->hvStart = hV2; if(ppEdges[e]->hvEnd == hV1) ppEdges[e]->hvEnd = hV2; CalcEdgeCenter(ppEdges[e]); } goto DoVertices; } } if(!nMerged) return NULL; int e; // kill edges that have same vertices for(e = 0; e < m_nEdges; e++) { CSSEdge &edge = m_Edges[e]; if(edge.hvStart != edge.hvEnd) continue; // edge is OK hDeletedList[nDeleted++] = edge.id; DeleteEdge(e); --e; } // kill similar edges (replace in faces too) DoEdges: for(e = 0; e < m_nEdges; e++) { CSSEdge &edge = m_Edges[e]; for(int e2 = 0; e2 < m_nEdges; e2++) { if(e == e2) continue; CSSEdge &edge2 = m_Edges[e2]; if(!((edge2.hvStart == edge.hvStart && edge2.hvEnd == edge.hvEnd) || (edge2.hvEnd == edge.hvStart && edge2.hvStart == edge.hvEnd))) continue; // we're going to delete edge2. SSHANDLE id2 = edge2.id; SSHANDLE id1 = edge.id; for(int f = 0; f < m_nFaces; f++) { CSSFace& face = m_Faces[f]; for(int ef = 0; ef < face.nEdges; ef++) { if(face.Edges[ef] == id2) { face.Edges[ef] = id1; break; } } } hDeletedList[nDeleted++] = id2; DeleteEdge(e2); goto DoEdges; } } // delete concurrent edge references in face for(int f = 0; f < m_nFaces; f++) { CSSFace& face = m_Faces[f]; DoConcurrentEdges: for(int ef1 = 0; ef1 < face.nEdges; ef1++) { for(int ef2 = 0; ef2 < face.nEdges; ef2++) { if(ef2 == ef1) continue; if(face.Edges[ef1] != face.Edges[ef2]) continue; // delete this ref memcpy(&face.Edges[ef2], &face.Edges[ef2+1], (face.nEdges-ef2) * sizeof(face.Edges[0])); --face.nEdges; goto DoConcurrentEdges; } } if(face.nEdges < 3) { // kill this face hDeletedList[nDeleted++] = face.id; DeleteFace(f); --f; } } return hDeletedList; }