OSDN Git Service

CLSIDの変更
[seraphyscrtools/SeraphyScriptTools.git] / Layer.cpp
1 // Layer.cpp : CLayer \82Ì\83C\83\93\83v\83\8a\83\81\83\93\83e\81[\83V\83\87\83\93
2 #include "stdafx.h"
3 #include "SeraphyScriptTools.h"
4 #include "Layer.h"
5 #include "generic.h"
6
7 /////////////////////////////////////////////////////////////////////////////
8 // CLayer
9
10 void CLayer::Draw(CDC dc)
11 {
12         // \83h\83\8d\81[\83C\83\93\83O\83f\81[\83^\81[\82Ì\95`\89æ
13         if (m_bVisible) {
14                 // \83y\83\93\81A\83u\83\89\83V\82Ì\90Ý\92è
15                 HPEN hPen = CreatePen(PS_SOLID, 0, COLORREF(m_dwColor));
16                 HBRUSH hBrush = CreateSolidBrush(COLORREF(m_dwFillColor));
17                 HPEN hOldPen = (HPEN)SelectObject(dc.m_hDC, hPen);
18                 HBRUSH hOldBrush = (HBRUSH)SelectObject(dc.m_hDC, hBrush);
19                 COLORREF oldColor = SetTextColor(dc.m_hDC, COLORREF(m_dwFontColor));
20                 // \83t\83H\83\93\83g\82Ì\91I\91ð
21                 int fntsiz = m_nFontSize;
22                 if (m_bFontTextMappingMode) {
23                         //DPtoLP(hdc,&fz,1);
24                         HWND hWnd = GetDesktopWindow();
25                         HDC hdc = GetDC(hWnd);
26                         long height_mm = GetDeviceCaps(hdc, VERTSIZE) * 10;
27                         long height_px = GetDeviceCaps(hdc, VERTRES);
28                         fntsiz = MulDiv(fntsiz, height_mm, height_px);
29                         ReleaseDC(hWnd, hdc);
30                 }
31                 HFONT hFont = CreateFont(fntsiz, 0, 0, 0, 0, false, false, false,
32                         SHIFTJIS_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, FF_DONTCARE, m_szFontName);
33                 HFONT hOldFont = NULL;
34                 if (hFont) {
35                         hOldFont = (HFONT)SelectObject(dc.m_hDC, hFont);
36                 }
37                 // \95`\89æ\83f\81[\83^
38                 EnterCriticalSection(&m_objDrawingDataProtection);
39                 std::list<drawdata*>::iterator p = m_lstDraw.begin();
40                 while (p != m_lstDraw.end()) {
41                         (*p)->Draw(dc);
42                         p++;
43                 }
44                 LeaveCriticalSection(&m_objDrawingDataProtection);
45                 // \83I\83u\83W\83F\83N\83g\82Ì\89ð\95ú
46                 SelectObject(dc.m_hDC, hOldPen);
47                 SelectObject(dc.m_hDC, hOldBrush);
48                 DeleteObject(hPen);
49                 DeleteObject(hBrush);
50                 SetTextColor(dc.m_hDC, oldColor);
51                 if (hOldFont) {
52                         SelectObject(dc.m_hDC, hOldFont);
53                         DeleteObject(hFont);
54                 }
55         }
56 }
57
58 void CLayer::FinalRelease()
59 {
60         ATLTRACE("CLeayer::FinalRelease\r\n");
61         // \95`\89æ\83f\81[\83^\81[\82Ì\94j\8aü
62         Clear();
63         // \83N\83\8a\83e\83B\83J\83\8b\83Z\83N\83V\83\87\83\93\82Ì\89ð\95ú
64         DeleteCriticalSection(&m_objDrawingDataProtection);
65 }
66
67 STDMETHODIMP CLayer::Text(VARIANT x, VARIANT y, VARIANT text)
68 {
69         CComVariant str;
70         HRESULT hr = str.ChangeType(VT_BSTR, &text);
71         if (FAILED(hr)) {
72                 return hr;
73         }
74
75         long lx = GetMappedValue(x);
76         long ly = GetMappedValue(y);
77         int len = SysStringByteLen(str.bstrVal);
78
79         ATL::CString buf(str.bstrVal);
80
81         AddDrawData(new textdata(lx, ly, buf, m_bTextMappingMode));
82         return S_OK;
83 }
84
85 STDMETHODIMP CLayer::TextBox(VARIANT sx, VARIANT sy, VARIANT ex, VARIANT ey, VARIANT text, VARIANT fmt)
86 {
87         long lsx = GetMappedValue(sx);
88         long lsy = GetMappedValue(sy);
89         long lex = GetMappedValue(ex);
90         long ley = GetMappedValue(ey);
91
92         UINT ufmt = 0;
93         CComVariant cfmt;
94         if (cfmt.ChangeType(VT_I4, &fmt) == S_OK) {
95                 ufmt = cfmt.lVal;
96         }
97
98         CComVariant str;
99         HRESULT hr = str.ChangeType(VT_BSTR, &text);
100         if (FAILED(hr)) {
101                 return hr;
102         }
103
104         ATL::CString buf(str.bstrVal);
105
106         AddDrawData(new textboxdata(lsx, lsy, lex, ley, buf, ufmt, m_bTextMappingMode));
107         return S_OK;
108 }
109
110 STDMETHODIMP CLayer::Circle(VARIANT x, VARIANT y, VARIANT radius)
111 {
112         long lx = GetMappedValue(x);
113         long ly = GetMappedValue(y);
114         long lr = GetMappedValue(radius);
115         AddDrawData(new circledata(lx, ly, lr, m_bTextMappingMode));
116         return S_OK;
117 }
118
119 STDMETHODIMP CLayer::Line(VARIANT sx, VARIANT sy, VARIANT ex, VARIANT ey)
120 {
121         long lsx = GetMappedValue(sx);
122         long lsy = GetMappedValue(sy);
123         long lex = GetMappedValue(ex);
124         long ley = GetMappedValue(ey);
125         AddDrawData(new linedata(lsx, lsy, lex, ley, m_bTextMappingMode));
126         return S_OK;
127 }
128
129 STDMETHODIMP CLayer::Box(VARIANT sx, VARIANT sy, VARIANT ex, VARIANT ey)
130 {
131         long lsx = GetMappedValue(sx);
132         long lsy = GetMappedValue(sy);
133         long lex = GetMappedValue(ex);
134         long ley = GetMappedValue(ey);
135         AddDrawData(new boxdata(lsx, lsy, lex, ley, m_bTextMappingMode));
136         return S_OK;
137 }
138
139 STDMETHODIMP CLayer::Arc(VARIANT x1, VARIANT y1, VARIANT x2, VARIANT y2, VARIANT sx, VARIANT sy, VARIANT ex, VARIANT ey)
140 {
141         long lx1 = GetMappedValue(x1);
142         long ly1 = GetMappedValue(y1);
143         long lx2 = GetMappedValue(x2);
144         long ly2 = GetMappedValue(y2);
145         long lsx = GetMappedValue(sx);
146         long lsy = GetMappedValue(sy);
147         long lex = GetMappedValue(ex);
148         long ley = GetMappedValue(ey);
149         AddDrawData(new arcdata(lx1, ly1, lx2, ly2, lsx, lsy, lex, ley, m_bTextMappingMode));
150         return S_OK;
151 }
152
153 STDMETHODIMP CLayer::Picture(VARIANT unk, VARIANT x, VARIANT y, VARIANT w, VARIANT h)
154 {
155         CComVariant cUnk;
156         IPicture* pPicture = NULL;
157         if (cUnk.ChangeType(VT_UNKNOWN, &unk) != S_OK ||
158                 cUnk.punkVal->QueryInterface(IID_IPicture, (void**)&pPicture) != S_OK) {
159                 return DISP_E_TYPEMISMATCH;
160         }
161         long lx = GetMappedValue(x);
162         long ly = GetMappedValue(y);
163         int width = -1;
164         if (w.vt != VT_NULL && w.vt != VT_ERROR && w.vt != VT_EMPTY) {
165                 width = GetMappedValue(w, -1);
166         }
167         int height = -1;
168         if (h.vt != VT_NULL && h.vt != VT_ERROR && h.vt != VT_EMPTY) {
169                 height = GetMappedValue(h, -1);
170         }
171         AddDrawData(new picturedata(pPicture, lx, ly, width, height, m_bTextMappingMode));
172         pPicture->Release();
173         return S_OK;
174 }
175
176 STDMETHODIMP CLayer::FillBox(VARIANT sx, VARIANT sy, VARIANT ex, VARIANT ey)
177 {
178         long lsx = GetMappedValue(sx);
179         long lsy = GetMappedValue(sy);
180         long lex = GetMappedValue(ex);
181         long ley = GetMappedValue(ey);
182         AddDrawData(new fillboxdata(lsx, lsy, lex, ley, m_bTextMappingMode));
183         return S_OK;
184 }
185
186 STDMETHODIMP CLayer::FillCircle(VARIANT x, VARIANT y, VARIANT radius)
187 {
188         long lx = GetMappedValue(x);
189         long ly = GetMappedValue(y);
190         long lr = GetMappedValue(radius);
191         AddDrawData(new fillcircledata(lx, ly, lr, m_bTextMappingMode));
192         return S_OK;
193 }
194
195 STDMETHODIMP CLayer::FillArc(VARIANT x1, VARIANT y1, VARIANT x2, VARIANT y2, VARIANT sx, VARIANT sy, VARIANT ex, VARIANT ey)
196 {
197         long lx1 = GetMappedValue(x1);
198         long ly1 = GetMappedValue(y1);
199         long lx2 = GetMappedValue(x2);
200         long ly2 = GetMappedValue(y2);
201         long lsx = GetMappedValue(sx);
202         long lsy = GetMappedValue(sy);
203         long lex = GetMappedValue(ex);
204         long ley = GetMappedValue(ey);
205         AddDrawData(new fillarcdata(lx1, ly1, lx2, ly2, lsx, lsy, lex, ley, m_bTextMappingMode));
206         return S_OK;
207 }
208
209 STDMETHODIMP CLayer::FillRBox(VARIANT sx, VARIANT sy, VARIANT ex, VARIANT ey, VARIANT w, VARIANT h)
210 {
211         long lsx = GetMappedValue(sx);
212         long lsy = GetMappedValue(sy);
213         long lex = GetMappedValue(ex);
214         long ley = GetMappedValue(ey);
215         long lw = GetMappedValue(w);
216         long lh = GetMappedValue(h);
217         AddDrawData(new fillrboxdata(lsx, lsy, lex, ley, lw, lh, m_bTextMappingMode));
218         return S_OK;
219 }
220
221 STDMETHODIMP CLayer::Polygon(VARIANT cx, VARIANT cy, VARIANT arrayPt)
222 {
223         long lx = GetMappedValue(cx);
224         long ly = GetMappedValue(cy);
225         VARTYPE vt = VT_EMPTY;
226         SAFEARRAY* pArray = GetArrayFromVariant(arrayPt, &vt);
227         if (!pArray || vt != VT_VARIANT) {
228                 return DISP_E_TYPEMISMATCH;
229         }
230         POINT* pPt = NULL;
231         long lb = 0;
232         long ub = 0;
233         long lb0 = 0;
234         long ub0 = 0;
235         int dm = SafeArrayGetDim(pArray);
236         SafeArrayGetLBound(pArray, 1, &lb0); // \8d\91¤\82Ì\93Y\82¦\8e\9a
237         SafeArrayGetUBound(pArray, 1, &ub0);
238         SafeArrayGetLBound(pArray, 2, &lb);  // \89E\91¤\82Ì\93Y\82¦\8e\9a
239         SafeArrayGetUBound(pArray, 2, &ub);
240         if (dm == 2 && lb == 0 && lb0 == 0 && ub0 == 2 && ub > lb && ub > 2) {
241                 // \94z\97ñ\82Ì\8e\9f\8c³\81A\94Í\88Í\82ª\97L\8cø\82Å\82 \82é\81B
242                 // \91½\8ap\8c`\82ð\8dì\90¬\82·\82é\82½\82ß\82É\82Í\92¸\93_\82Í3\82Â\88È\8fã\95K\97v\81B
243                 pPt = new POINT[ub + 1];
244                 long idx[2];
245                 for (int cnt = 0; cnt <= ub; cnt++) {
246                         // VARIANT\82Ì\94z\97ñ\82Å\82 \82é
247                         CComVariant tmpX, tmpY;
248                         idx[1] = cnt;
249                         idx[0] = 0;
250                         SafeArrayGetElement(pArray, idx, &tmpX);
251                         idx[0] = 1;
252                         SafeArrayGetElement(pArray, idx, &tmpY);
253                         pPt[cnt].x = GetMappedValue(tmpX) + lx;
254                         pPt[cnt].y = GetMappedValue(tmpY) + ly;
255                 }
256         }
257         if (!pPt) {
258                 // \94z\97ñ\82Ì\8eí\97Þ\82ª\82È\82ñ\82¾\82©\95ª\82©\82ç\82È\82¢\81B
259                 return Error(IDS_ERR_NEED2DIM);
260         }
261         AddDrawData(new polygondata(pPt, ub, m_bTextMappingMode));
262         return S_OK;
263 }
264
265 STDMETHODIMP CLayer::Clear()
266 {
267         // \83h\83\8d\81[\83C\83\93\83O\83f\81[\83^\81[\82Ì\94j\8aü
268         EnterCriticalSection(&m_objDrawingDataProtection);
269         std::list<drawdata*>::iterator p = m_lstDraw.begin();
270         while (p != m_lstDraw.end()) {
271                 (*p)->Destroy();
272                 p = m_lstDraw.erase(p);
273         }
274         LeaveCriticalSection(&m_objDrawingDataProtection);
275         return S_OK;
276 }
277
278 void CLayer::AddDrawData(drawdata *pDrawData)
279 {
280         // \83f\81[\83^\81[\82Ì\92Ç\89Á
281         EnterCriticalSection(&m_objDrawingDataProtection);
282         m_lstDraw.push_back(pDrawData);
283         LeaveCriticalSection(&m_objDrawingDataProtection);
284 }
285
286 STDMETHODIMP CLayer::get_Color(long *pVal)
287 {
288         *pVal = m_dwColor;
289         return S_OK;
290 }
291
292 STDMETHODIMP CLayer::put_Color(long newVal)
293 {
294         m_dwColor = newVal;
295         return S_OK;
296 }
297
298
299 STDMETHODIMP CLayer::get_FontColor(long *pVal)
300 {
301         *pVal = m_dwFontColor;
302         return S_OK;
303 }
304
305 STDMETHODIMP CLayer::put_FontColor(long newVal)
306 {
307         m_dwFontColor = newVal;
308         return S_OK;
309 }
310
311 STDMETHODIMP CLayer::get_Visible(BOOL *pVal)
312 {
313         *pVal = m_bVisible;
314         return S_OK;
315 }
316
317 STDMETHODIMP CLayer::put_Visible(BOOL newVal)
318 {
319         m_bVisible = newVal;
320         return S_OK;
321 }
322
323 STDMETHODIMP CLayer::get_FontName(BSTR *pVal)
324 {
325         CComBSTR ret(m_szFontName);
326         *pVal = ret.Detach();
327         return S_OK;
328 }
329
330 STDMETHODIMP CLayer::put_FontName(BSTR newVal)
331 {
332         m_szFontName = newVal;
333         return S_OK;
334 }
335
336 STDMETHODIMP CLayer::get_FillColor(long *pVal)
337 {
338         *pVal = m_dwFillColor;
339         return S_OK;
340 }
341
342 STDMETHODIMP CLayer::put_FillColor(long newVal)
343 {
344         m_dwFillColor = newVal;
345         return S_OK;
346 }
347
348 STDMETHODIMP CLayer::get_FontSize(short *pVal)
349 {
350         *pVal = (short)m_nFontSize;
351         return S_OK;
352 }
353
354 STDMETHODIMP CLayer::put_FontSize(short newVal)
355 {
356         m_nFontSize = (int)newVal;
357         m_bFontTextMappingMode = m_bTextMappingMode;
358         return S_OK;
359 }
360
361
362 STDMETHODIMP CLayer::SetMappingMode(VARIANT mode)
363 {
364         CComVariant varMode;
365         if (varMode.ChangeType(VT_I2, &mode) == S_OK) {
366                 m_bTextMappingMode = varMode.iVal;
367         }
368         return S_OK;
369 }
370
371 long CLayer::GetMappedValue(VARIANT var, long def)
372 {
373         CComVariant varTmp;
374         if (m_bTextMappingMode) {
375                 // \83s\83N\83Z\83\8b\92P\88Ê\82Ì\8dÀ\95W\8ew\92è
376                 if (varTmp.ChangeType(VT_I4, &var) == S_OK) {
377                         return varTmp.lVal;
378                 }
379         }
380         else {
381                 // \83~\83\8a\92P\88Ê\82Ì\8dÀ\95W\8ew\92è (1\92P\88Ê 0.1mm)
382                 if (varTmp.ChangeType(VT_R8, &var) == S_OK) {
383                         return (long)(varTmp.dblVal * 10);
384                 }
385         }
386         return def;
387 }