winamp/Src/omBrowser/graphicsObject.cpp
2024-09-24 14:54:57 +02:00

136 lines
3.6 KiB
C++

#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