clsCrSurf.cpp 2.2 KB

#include "clsCrSurf.h"
#include <malloc.h>
#include <string.h>
namespace DmapCore_30
{
	clsCrSurf::clsCrSurf(cairo_surface_t* surface)
	{
		m_pSurf = surface;
		m_pCr = cairo_create(m_pSurf);
		cairo_set_antialias(m_pCr,cairo_antialias_t::CAIRO_ANTIALIAS_BEST);
		m_iN = 1;
		m_iW = cairo_image_surface_get_width(surface);
		m_iH = cairo_image_surface_get_height(surface);
		m_iBGColor = 0Xffffffff;
		m_pFlag = 0;
		m_isImage = true;
	}

	clsCrSurf::clsCrSurf(cairo_surface_t* surface,int w,int h,bool isImage)
	{
		m_pSurf = surface;
		m_pCr = cairo_create(m_pSurf);
		cairo_set_antialias(m_pCr,cairo_antialias_t::CAIRO_ANTIALIAS_BEST);
		m_iN = 1;
		m_iW = w;
		m_iH = h;
		m_iBGColor = 0Xffffffff;
		m_pFlag = 0;
		m_isImage = isImage;
	}




	clsCrSurf::~clsCrSurf()
	{
		this->DestroyCr();
		this->DestroySurf();
		if (m_pFlag)
		{
			free(m_pFlag);
			m_pFlag = 0;
		}
	}

	bool clsCrSurf::Release()
	{
		m_iN--;
		if (m_iN < 0)
			return false;
		if (!m_iN)
			delete this;
		return true;
	}

	bool clsCrSurf::SetSurf(cairo_surface_t* surface)
	{
		if (surface == m_pSurf)
			return true;
		this->~clsCrSurf();

		m_pSurf = surface;
		m_pCr = cairo_create(m_pSurf);
		m_iW = cairo_image_surface_get_width(m_pSurf);
		m_iH = cairo_image_surface_get_height(m_pSurf);

		return true;
	}


	void clsCrSurf::DestroyCr()
	{
		if (m_pCr)
		{
			cairo_destroy(m_pCr);
			//free(m_pCr);
			m_pCr = NULL;
		}
	}
	//0x68E06B52 (libcairo - 2.dll) (DMap.exe 中)处有未经处理的异常:  0xC0000005 : 读取位置 0xFEEEFEFE 时发生访问冲突。
	//0x68E06B52 (libcairo - 2.dll) (DMap.exe 中)处有未经处理的异常:  0xC0000005 : 读取位置 0xCDCDCDDD 时发生访问冲突。
	void clsCrSurf::DestroySurf()
	{
		if (m_pSurf)
		{
			cairo_surface_destroy(m_pSurf);
			//free(m_pSurf);
			m_pSurf = NULL;
		}
	}

	bool  clsCrSurf::InitFlag()
	{
		if (m_pFlag)
		{
			memset(m_pFlag, 0, m_iFlagW*m_iFlagH);
			return true;
		}
		m_iFlagW = m_iW / gridsize;
		m_iFlagH = m_iH / gridsize;
		if (m_iW != (m_iFlagW*gridsize))
			m_iFlagW++;
		if (m_iH != (m_iFlagH*gridsize))
			m_iFlagH++;

		m_pFlag = (char*)malloc(m_iFlagW*m_iFlagH);

		if (m_pFlag == 0)
			return false;
		memset(m_pFlag, 0, m_iFlagW*m_iFlagH);
		return true;
	}
}