clsCrSurf.cpp
2.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
#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;
}
}