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
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
|
#include "./common.h"
#include "./graphicsObject.h"
#include "./graphics.h"
GraphicsObject::GraphicsObject()
: ref(1)
{
}
GraphicsObject::~GraphicsObject()
{
}
HRESULT GraphicsObject::CreateInstance(GraphicsObject **instance)
{
if (NULL == instance) return E_POINTER;
*instance = new GraphicsObject();
if (NULL == *instance) return E_OUTOFMEMORY;
return S_OK;
}
size_t GraphicsObject::AddRef()
{
return InterlockedIncrement((LONG*)&ref);
}
size_t GraphicsObject::Release()
{
if (0 == ref)
return ref;
LONG r = InterlockedDecrement((LONG*)&ref);
if (0 == r)
delete(this);
return r;
}
int GraphicsObject::QueryInterface(GUID interface_guid, void **object)
{
if (NULL == object) return E_POINTER;
if (IsEqualIID(interface_guid, IFC_OmGrpahics))
*object = static_cast<ifc_omgraphics*>(this);
else
{
*object = NULL;
return E_NOINTERFACE;
}
if (NULL == *object)
return E_UNEXPECTED;
AddRef();
return S_OK;
}
HRESULT GraphicsObject::GetDistance(COLORREF rgb1, COLORREF rgb2, int *distance)
{
if (NULL == distance) return E_POINTER;
*distance = GetColorDistance(rgb1, rgb2);
return S_OK;
}
HRESULT GraphicsObject::GetDarker(COLORREF rgb1, COLORREF rgb2, COLORREF *result)
{
if (NULL == result) return E_POINTER;
*result = GetDarkerColor(rgb1, rgb2);
return S_OK;
}
HRESULT GraphicsObject::BlendColor(COLORREF rgbTop, COLORREF rgbBottom, int alpha, COLORREF *result)
{
if (NULL == result) return E_POINTER;
*result = BlendColors(rgbTop, rgbBottom, alpha);
return S_OK;
}
HRESULT GraphicsObject::Colorize(BYTE *pixels, long cx, long cy, WORD bpp, COLORREF rgbBk, COLORREF rgbFg, BOOL removeAlpha)
{
BOOL result = Image_Colorize(pixels, cx, cy, bpp, rgbBk, rgbFg, removeAlpha);
return (FALSE != result) ? S_OK : S_FALSE;
}
HRESULT GraphicsObject::BlendOnColor(HBITMAP hbmp, RECT *prcPart, BOOL premult, COLORREF rgb)
{
BOOL result = Image_BlendOnColor(hbmp, prcPart, premult, rgb);
return (FALSE != result) ? S_OK : S_FALSE;
}
HRESULT GraphicsObject::BlendOnColor2(BYTE *pixels, int bitmapCX, int bitmapCY, long x, long y, long cx, long cy, WORD bpp, BOOL premult, COLORREF rgb)
{
BOOL result = Image_BlendOnColorEx(pixels, bitmapCX, bitmapCY, x, y, cx, cy, bpp, premult, rgb);
return (FALSE != result) ? S_OK : S_FALSE;
}
HRESULT GraphicsObject::Premultiply(BYTE *pixels, long cx, long cy)
{
BOOL result = Image_Premultiply(pixels, cx, cy);
return (FALSE != result) ? S_OK : S_FALSE;
}
HRESULT GraphicsObject::AlphaBlend(HDC hdcDest, const RECT *rectDest, HDC hdcSrc, const RECT *rectSrc, BLENDFUNCTION blendFunction)
{
if (NULL == rectDest || NULL == rectSrc)
return E_INVALIDARG;
BOOL result = Image_AlphaBlend(hdcDest, rectDest->left, rectDest->top, rectDest->right, rectDest->bottom, hdcSrc, rectSrc->left, rectSrc->top, rectSrc->right, rectSrc->bottom, blendFunction);
return (FALSE != result) ? S_OK : S_FALSE;
}
HRESULT GraphicsObject::AnimateRotation(HDC hdc, HBITMAP bitmapFrame, int frameCount, COLORREF rgbBk, BOOL fKeepSize, HBITMAP *result)
{
if (NULL == result) return E_POINTER;
*result = Image_AnimateRotation(hdc, bitmapFrame, frameCount, rgbBk, fKeepSize);
if (NULL == *result) return E_FAIL;
return S_OK;
}
#define CBCLASS GraphicsObject
START_DISPATCH;
CB(ADDREF, AddRef)
CB(RELEASE, Release)
CB(QUERYINTERFACE, QueryInterface)
CB(API_GETDISTANCE, GetDistance)
CB(API_GETDARKER, GetDarker)
CB(API_BLENDCOLOR, BlendColor)
CB(API_COLORIZE, Colorize)
CB(API_BLENDONCOLOR, BlendOnColor)
CB(API_BLENDONCOLOR2, BlendOnColor2)
CB(API_PREMULTIPLY, Premultiply)
CB(API_ALPHABLEND, AlphaBlend)
CB(API_ANIMATEROTATION, AnimateRotation)
END_DISPATCH;
#undef CBCLASS
|