diff options
Diffstat (limited to 'Src/omBrowser/graphicsObject.cpp')
-rw-r--r-- | Src/omBrowser/graphicsObject.cpp | 135 |
1 files changed, 135 insertions, 0 deletions
diff --git a/Src/omBrowser/graphicsObject.cpp b/Src/omBrowser/graphicsObject.cpp new file mode 100644 index 00000000..8025921b --- /dev/null +++ b/Src/omBrowser/graphicsObject.cpp @@ -0,0 +1,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 |