コード例 #1
0
ファイル: fx_ge_font.cpp プロジェクト: ioctaptceb/node-pdfium
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
}
コード例 #2
0
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
}
コード例 #3
0
ファイル: fx_ge_font.cpp プロジェクト: andoma/pdfium
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
}
コード例 #4
0
ファイル: EpaPolyhedron.cpp プロジェクト: Belxjander/Asuna
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 );
}
コード例 #5
0
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
}
コード例 #7
0
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;
}