aboutsummaryrefslogtreecommitdiff
path: root/Src/omBrowser/graphicsObject.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Src/omBrowser/graphicsObject.cpp')
-rw-r--r--Src/omBrowser/graphicsObject.cpp135
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