mirror of
https://github.com/ONLYOFFICE/core.git
synced 2026-07-11 05:24:10 +08:00
1442 lines
46 KiB
C++
1442 lines
46 KiB
C++
#pragma once
|
|
|
|
#include "resource.h"
|
|
#include <PaintStruct.h>
|
|
#include <ImageColors.h>
|
|
#include <ImageCore.h>
|
|
#include "Effects.h"
|
|
|
|
[object, uuid("543D4C9D-4EE1-4f88-93BC-8445B788ECCB"), dual, helpstring("IImageTextDynamic3 Interface"), pointer_default(unique)]
|
|
__interface IImageTextDynamic3 : IDispatch
|
|
{
|
|
// effects
|
|
[id(10)] HRESULT GetCategoriesCount([out, retval] long* Categories);
|
|
[id(11)] HRESULT GetCategoryName([in] long Category, [out, retval] BSTR* Name);
|
|
[id(12)] HRESULT GetEffectsCount([in] long Category, [out, retval] long* Count);
|
|
[id(13)] HRESULT GetEffectName([in] long Category, [in] long Effect, [out, retval] BSTR* Name);
|
|
[id(14)] HRESULT GetEffectAt([in] long Category, [in] long Effect, [out, retval] long* ID);
|
|
[id(15)] HRESULT GetCategotyIndex([in] long Effect, [out, retval] long* Index);
|
|
|
|
// painting
|
|
[id(20)] HRESULT Start([in] BSTR String, [in] long Category, [in] long Effect, [in] long EffectID, [in] long CoorX, [in] long CoorY, [in] long Step);
|
|
[id(21)] HRESULT Stop();
|
|
[id(22)] HRESULT Render([in, out, satype("BYTE")] SAFEARRAY** pSafeArray, [in] double Frame);
|
|
[id(23)] HRESULT RenderMedia([in] IUnknown* pInterfaceInput, [out] IUnknown** pInterfaceOutput, [in] double Frame);
|
|
|
|
// font
|
|
[propget, id(301)] HRESULT fontName([out, retval] BSTR* pVal);
|
|
[propput, id(301)] HRESULT fontName([in] BSTR newVal);
|
|
[propget, id(302)] HRESULT fontSize([out, retval] long* pVal);
|
|
[propput, id(302)] HRESULT fontSize([in] long newVal);
|
|
[propget, id(303)] HRESULT fontBold([out, retval] VARIANT_BOOL* pVal);
|
|
[propput, id(303)] HRESULT fontBold([in] VARIANT_BOOL newVal);
|
|
[propget, id(304)] HRESULT fontItalic([out, retval] VARIANT_BOOL* pVal);
|
|
[propput, id(304)] HRESULT fontItalic([in] VARIANT_BOOL newVal);
|
|
[propget, id(305)] HRESULT fontUnderline([out, retval] VARIANT_BOOL* pVal);
|
|
[propput, id(305)] HRESULT fontUnderline([in] VARIANT_BOOL newVal);
|
|
[propget, id(306)] HRESULT fontStrikeout([out, retval] VARIANT_BOOL* pVal);
|
|
[propput, id(306)] HRESULT fontStrikeout([in] VARIANT_BOOL newVal);
|
|
|
|
// formatting
|
|
[propget, id(351)] HRESULT formatRotate([out, retval] long* pVal);
|
|
[propput, id(351)] HRESULT formatRotate([in] long newVal);
|
|
|
|
// brush
|
|
[propget, id(403)] HRESULT brushType([out, retval] long* pVal);
|
|
[propput, id(403)] HRESULT brushType([in] long newVal);
|
|
[propget, id(404)] HRESULT brushColor1([out, retval] long* pVal);
|
|
[propput, id(404)] HRESULT brushColor1([in] long newVal);
|
|
[propget, id(405)] HRESULT brushColor2([out, retval] long* pVal);
|
|
[propput, id(405)] HRESULT brushColor2([in] long newVal);
|
|
[propget, id(406)] HRESULT brushAlpha1([out, retval] BYTE* pVal);
|
|
[propput, id(406)] HRESULT brushAlpha1([in] BYTE newVal);
|
|
[propget, id(407)] HRESULT brushAlpha2([out, retval] BYTE* pVal);
|
|
[propput, id(407)] HRESULT brushAlpha2([in] BYTE newVal);
|
|
[propget, id(412)] HRESULT brushTextureLoad([out, retval] BSTR* pVal);
|
|
[propput, id(412)] HRESULT brushTextureLoad([in] BSTR newVal);
|
|
[propget, id(413)] HRESULT brushTextureAlpha([out, retval] BYTE* pVal);
|
|
[propput, id(413)] HRESULT brushTextureAlpha([in] BYTE newVal);
|
|
[propget, id(414)] HRESULT brushTextureMode([out, retval] long* val);
|
|
[propput, id(414)] HRESULT brushTextureMode([in] long val);
|
|
|
|
// edge
|
|
[propget, id(501)] HRESULT edgeVisible([out, retval] long* pVal);
|
|
[propput, id(501)] HRESULT edgeVisible([in] long newVal);
|
|
[propget, id(502)] HRESULT edgeDistance([out, retval] long* pVal);
|
|
[propput, id(502)] HRESULT edgeDistance([in] long newVal);
|
|
[propget, id(503)] HRESULT edgeColor([out, retval] long* pVal);
|
|
[propput, id(503)] HRESULT edgeColor([in] long newVal);
|
|
[propget, id(504)] HRESULT edgeAlpha([out, retval] BYTE* pVal);
|
|
[propput, id(504)] HRESULT edgeAlpha([in] BYTE newVal);
|
|
|
|
// shadow
|
|
[propget, id(601)] HRESULT shadowVisible([out, retval] VARIANT_BOOL* pVal);
|
|
[propput, id(601)] HRESULT shadowVisible([in] VARIANT_BOOL newVal);
|
|
[propget, id(602)] HRESULT shadowDistanceX([out, retval] long* pVal);
|
|
[propput, id(602)] HRESULT shadowDistanceX([in] long newVal);
|
|
[propget, id(603)] HRESULT shadowDistanceY([out, retval] long* pVal);
|
|
[propput, id(603)] HRESULT shadowDistanceY([in] long newVal);
|
|
[propget, id(604)] HRESULT shadowColor([out, retval] long* pVal);
|
|
[propput, id(604)] HRESULT shadowColor([in] long newVal);
|
|
[propget, id(605)] HRESULT shadowAlpha([out, retval] BYTE* pVal);
|
|
[propput, id(605)] HRESULT shadowAlpha([in] BYTE newVal);
|
|
[propget, id(606)] HRESULT shadowBlur([out, retval] long* pVal);
|
|
[propput, id(606)] HRESULT shadowBlur([in] long newVal);
|
|
|
|
[id(701)] HRESULT SetFormat([in, satype("BYTE")] SAFEARRAY** Array);
|
|
[id(702)] HRESULT GetFormat([out, retval, satype("BYTE")] SAFEARRAY** Array);
|
|
};
|
|
|
|
[coclass, uuid("E832BC32-2A62-464e-A833-4DE451D29274"), threading(apartment), vi_progid("AVSImagePaint3.ImageTextDynamic3"), progid("AVSImagePaint3.ImageTextDynamic3.1"), version(1.0), helpstring("ImageTextDynamic3 Class")]
|
|
class ATL_NO_VTABLE ImageTextDynamic3 : public IImageTextDynamic3
|
|
{
|
|
// Interface
|
|
public:
|
|
|
|
// effects
|
|
STDMETHOD(GetCategoriesCount)(long* Categories)
|
|
{
|
|
*Categories = m_categories.GetSize();
|
|
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(GetCategoryName)(long Category, BSTR* Name)
|
|
{
|
|
CString _name = "";
|
|
|
|
if (Category >= 0 && Category < m_categories.GetSize())
|
|
_name = m_categories[Category].Name;
|
|
|
|
*Name = _name.AllocSysString();
|
|
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(GetEffectsCount)(long Category, long* Count)
|
|
{
|
|
if (Category < 0)
|
|
*Count = m_effects.GetSize();
|
|
else if (Category >=0 && Category < m_categories.GetSize())
|
|
*Count = m_categories[Category].Effects.GetSize();
|
|
else
|
|
*Count = 0;
|
|
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(GetEffectName)(long Category, long Effect, BSTR* Name)
|
|
{
|
|
CString _name = "";
|
|
|
|
if (Category < 0)
|
|
{
|
|
if (Effect >= 0 && Effect < m_effects.GetSize())
|
|
_name = m_effects[Effect].Name2;
|
|
}
|
|
else if (Category >=0 && Category < m_categories.GetSize())
|
|
{
|
|
if (Effect >= 0 && Effect < m_categories[Category].Effects.GetSize())
|
|
_name = m_effects[m_categories[Category].Effects[Effect]].Name2;
|
|
}
|
|
|
|
*Name = _name.AllocSysString();
|
|
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(GetEffectAt)(long Category, long Effect, long* ID)
|
|
{
|
|
int _id = -1;
|
|
|
|
if (Category < 0)
|
|
{
|
|
if (Effect >= 0 && Effect < m_effects.GetSize())
|
|
_id = m_effects[Effect].ID;
|
|
}
|
|
else if (Category >=0 && Category < m_categories.GetSize())
|
|
{
|
|
if (Effect >= 0 && Effect < m_categories[Category].Effects.GetSize())
|
|
_id = m_effects[m_categories[Category].Effects[Effect]].ID;
|
|
}
|
|
|
|
*ID = _id;
|
|
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(GetCategotyIndex)(long Effect, long* Index)
|
|
{
|
|
long nEffectsInCategory = 0;
|
|
long nEffectsFound = 0;
|
|
long nEffectsTotal = 0;
|
|
|
|
for(int i = 0; i < m_categories.GetSize(); i++)
|
|
nEffectsTotal += m_categories[i].Effects.GetSize();
|
|
|
|
if (Effect >= 0 && Effect < nEffectsTotal)
|
|
{
|
|
for(int i = 0; i < m_categories.GetSize(); i++)
|
|
{
|
|
GetEffectsCount(i, &nEffectsInCategory);
|
|
|
|
nEffectsFound += nEffectsInCategory;
|
|
|
|
if (Effect < nEffectsFound)
|
|
{
|
|
*Index = i;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
*Index = -1;
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
// painting
|
|
STDMETHOD(Start)(BSTR String, long Category, long Effect, long EffectID, long CoorX, long CoorY, long Step)
|
|
{
|
|
EffectStart(String, Category, Effect, EffectID, CoorX, CoorY, Step);
|
|
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(Stop)()
|
|
{
|
|
EffectStop();
|
|
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(Render)(SAFEARRAY** pSafeArray, double Frame)
|
|
{
|
|
if (!pSafeArray || !*pSafeArray)
|
|
return S_FALSE;
|
|
|
|
|
|
int nChannels = 0;
|
|
|
|
m_pixels = ImageStudioUtils::ExtractImage(pSafeArray, m_width, m_height, nChannels);
|
|
|
|
if (!m_pixels || nChannels != 4)
|
|
return S_FALSE;
|
|
|
|
EffectRenderEnd();
|
|
EffectRender(Frame);
|
|
EffectRenderEnd();
|
|
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(RenderMedia)(IUnknown* pInterfaceInput, IUnknown** pInterfaceOutput, double Frame)
|
|
{
|
|
if (!pInterfaceInput || !pInterfaceOutput)
|
|
return S_FALSE;
|
|
|
|
*pInterfaceOutput = NULL;
|
|
|
|
|
|
if (!m_oMediaData.Create(pInterfaceInput, FALSE) || !m_oMediaData.IsValidBGRA())
|
|
return S_FALSE;
|
|
|
|
m_pixels = m_oMediaData.GetBuffer();
|
|
m_width = m_oMediaData.GetWidth();
|
|
m_height = m_oMediaData.GetHeight();
|
|
|
|
EffectRenderEnd();
|
|
EffectRender(Frame);
|
|
EffectRenderEnd();
|
|
|
|
// save pointer to new interface (if it was transformed to BGRA32 format)
|
|
*pInterfaceOutput = m_oMediaData.GetMediaData(TRUE);
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
// font property
|
|
STDMETHOD(get_fontName)(BSTR* pVal)
|
|
{
|
|
*pVal = m_font.Name.AllocSysString();
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(put_fontName)(BSTR newVal)
|
|
{
|
|
m_font.Name = CString(newVal);
|
|
m_font.Update();
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(get_fontSize)(long* pVal)
|
|
{
|
|
*pVal = m_font.Size;
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(put_fontSize)(long newVal)
|
|
{
|
|
m_font.Size = newVal;
|
|
m_font.Update();
|
|
|
|
letter_rect.X = letter_rect.Y = -newVal*0.8;
|
|
letter_rect.Width = letter_rect.Height = newVal*1.6;
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHOD(get_fontBold)(VARIANT_BOOL* pVal)
|
|
{
|
|
*pVal = m_font.Bold ? VARIANT_TRUE : VARIANT_FALSE;
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(put_fontBold)(VARIANT_BOOL newVal)
|
|
{
|
|
m_font.Bold = (newVal != VARIANT_FALSE);
|
|
m_font.Update();
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHOD(get_fontItalic)(VARIANT_BOOL* pVal)
|
|
{
|
|
*pVal = m_font.Italic ? VARIANT_TRUE : VARIANT_FALSE;
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(put_fontItalic)(VARIANT_BOOL newVal)
|
|
{
|
|
m_font.Italic = (newVal != VARIANT_FALSE);
|
|
m_font.Update();
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHOD(get_fontUnderline)(VARIANT_BOOL* pVal)
|
|
{
|
|
*pVal = m_font.Underline ? VARIANT_TRUE : VARIANT_FALSE;
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(put_fontUnderline)(VARIANT_BOOL newVal)
|
|
{
|
|
m_font.Underline = (newVal != VARIANT_FALSE);
|
|
m_font.Update();
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHOD(get_fontStrikeout)(VARIANT_BOOL* pVal)
|
|
{
|
|
*pVal = m_font.Strikeout ? VARIANT_TRUE : VARIANT_FALSE;
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(put_fontStrikeout)(VARIANT_BOOL newVal)
|
|
{
|
|
m_font.Strikeout = (newVal != VARIANT_FALSE);
|
|
m_font.Update();
|
|
return S_OK;
|
|
}
|
|
|
|
// formatting
|
|
STDMETHOD(get_formatRotate)(long* pVal)
|
|
{
|
|
*pVal = m_nAngle;
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(put_formatRotate)(long newVal)
|
|
{
|
|
m_nAngle = newVal;
|
|
return S_OK;
|
|
}
|
|
|
|
// brush property
|
|
STDMETHOD(get_brushType)(long* pVal)
|
|
{
|
|
*pVal = m_brush.Type;
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(put_brushType)(long newVal)
|
|
{
|
|
m_brush.Type = Painter::ConstantCompatible(newVal);
|
|
m_brush.Update();
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHOD(get_brushColor1)(long* pVal)
|
|
{
|
|
*pVal = m_brush.Color1;
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(put_brushColor1)(long newVal)
|
|
{
|
|
m_brush.Color1 = newVal;
|
|
m_brush.Update();
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHOD(get_brushColor2)(long* pVal)
|
|
{
|
|
*pVal = m_brush.Color2;
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(put_brushColor2)(long newVal)
|
|
{
|
|
m_brush.Color2 = newVal;
|
|
m_brush.Update();
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHOD(get_brushAlpha1)(BYTE* pVal)
|
|
{
|
|
*pVal = m_brush.Alpha1;
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(put_brushAlpha1)(BYTE newVal)
|
|
{
|
|
m_brush.Alpha1 = newVal;
|
|
m_brush.Update();
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHOD(get_brushAlpha2)(BYTE* pVal)
|
|
{
|
|
*pVal = m_brush.Alpha2;
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(put_brushAlpha2)(BYTE newVal)
|
|
{
|
|
m_brush.Alpha2 = newVal;
|
|
m_brush.Update();
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHOD(get_brushTextureLoad)(BSTR* pVal)
|
|
{
|
|
*pVal = m_brush.TexturePath.AllocSysString();
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(put_brushTextureLoad)(BSTR newVal)
|
|
{
|
|
CString path(newVal);
|
|
path.MakeLower();
|
|
int index = m_textures.Add(path);
|
|
if (index < 0)
|
|
return S_OK;
|
|
|
|
m_brush.TexturePath = path;
|
|
m_brush.Update();
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHOD(get_brushTextureAlpha)(BYTE* pVal)
|
|
{
|
|
*pVal = m_brush.TextureAlpha;
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(put_brushTextureAlpha)(BYTE newVal)
|
|
{
|
|
m_brush.TextureAlpha = newVal;
|
|
m_brush.Update();
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHOD(get_brushTextureMode)(long* pVal)
|
|
{
|
|
*pVal = m_brush.TextureMode;
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(put_brushTextureMode)(long newVal)
|
|
{
|
|
m_brush.TextureMode = newVal;
|
|
m_brush.Update();
|
|
return S_OK;
|
|
}
|
|
|
|
// edge property
|
|
STDMETHOD(get_edgeVisible)(long* pVal)
|
|
{
|
|
*pVal = m_edge.Visible;
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(put_edgeVisible)(long newVal)
|
|
{
|
|
m_edge.Visible = newVal;
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(get_edgeDistance)(long* pVal)
|
|
{
|
|
*pVal = m_edge.Dist;
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(put_edgeDistance)(long newVal)
|
|
{
|
|
m_edge.Dist = newVal;
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(get_edgeColor)(long* pVal)
|
|
{
|
|
*pVal = m_edge.Color;
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(put_edgeColor)(long newVal)
|
|
{
|
|
m_edge.Color = newVal;
|
|
m_edge.Update();
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(get_edgeAlpha)(BYTE* pVal)
|
|
{
|
|
*pVal = m_edge.Alpha;
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(put_edgeAlpha)(BYTE newVal)
|
|
{
|
|
m_edge.Alpha = newVal;
|
|
m_edge.Update();
|
|
return S_OK;
|
|
}
|
|
|
|
// shadow property
|
|
STDMETHOD(get_shadowVisible)(VARIANT_BOOL* pVal)
|
|
{
|
|
*pVal = m_shadow.Visible ? VARIANT_TRUE : VARIANT_FALSE;
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(put_shadowVisible)(VARIANT_BOOL newVal)
|
|
{
|
|
m_shadow.Visible = (newVal == VARIANT_TRUE);
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(get_shadowDistanceX)(long* pVal)
|
|
{
|
|
*pVal = m_shadow.DistanceX;
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(put_shadowDistanceX)(long newVal)
|
|
{
|
|
m_shadow.DistanceX = newVal;
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(get_shadowDistanceY)(long* pVal)
|
|
{
|
|
*pVal = m_shadow.DistanceY;
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(put_shadowDistanceY)(long newVal)
|
|
{
|
|
m_shadow.DistanceY = newVal;
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(get_shadowColor)(long* pVal)
|
|
{
|
|
*pVal = m_shadow.Color;
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(put_shadowColor)(long newVal)
|
|
{
|
|
m_shadow.Color = newVal;
|
|
m_shadow.Update();
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(get_shadowAlpha)(BYTE* pVal)
|
|
{
|
|
*pVal = m_shadow.Alpha;
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(put_shadowAlpha)(BYTE newVal)
|
|
{
|
|
m_shadow.Alpha = newVal;
|
|
m_shadow.Update();
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(get_shadowBlur)(long* pVal)
|
|
{
|
|
*pVal = m_shadow.BlurSize;
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(put_shadowBlur)(long newVal)
|
|
{
|
|
m_shadow.BlurSize = newVal;
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(SetFormat)(SAFEARRAY** Array)
|
|
{
|
|
if (!Array || !*Array)
|
|
return S_OK;
|
|
|
|
BYTE* buffer = (BYTE*)((*Array)->pvData);
|
|
|
|
if (!buffer)
|
|
return S_OK;
|
|
|
|
Painter::CStream stream;
|
|
|
|
stream.SetBuffer(buffer);
|
|
|
|
m_brush.Read(stream);
|
|
m_font.Read(stream);
|
|
m_shadow.Read(stream);
|
|
m_edge.Read(stream);
|
|
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(GetFormat)(SAFEARRAY** Array)
|
|
{
|
|
long size = m_brush.GetSize() + m_font.GetSize() + m_shadow.GetSize() + m_edge.GetSize();
|
|
|
|
SAFEARRAYBOUND bound;
|
|
|
|
bound.lLbound = 0;
|
|
bound.cElements = size;
|
|
|
|
*Array = SafeArrayCreate(VT_UI1, 1, &bound);
|
|
|
|
if (!*Array)
|
|
return S_OK;
|
|
|
|
BYTE* buffer = (BYTE*)((*Array)->pvData);
|
|
|
|
if (!buffer)
|
|
return S_OK;
|
|
|
|
Painter::CStream stream;
|
|
|
|
stream.SetBuffer(buffer);
|
|
|
|
m_brush.Write(stream);
|
|
m_font.Write(stream);
|
|
m_shadow.Write(stream);
|
|
m_edge.Write(stream);
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
// Members
|
|
protected:
|
|
|
|
// painting formats
|
|
Painter::CBrush m_brush;
|
|
Painter::CFont m_font;
|
|
Painter::CShadow m_shadow;
|
|
Painter::CEdgeText m_edge;
|
|
Painter::CTextureManager m_textures;
|
|
|
|
// painting
|
|
int m_width;
|
|
int m_height;
|
|
RectF letter_rect;
|
|
BYTE* m_pixels;
|
|
Bitmap* m_bitmap;
|
|
CString m_string;
|
|
int m_effect;
|
|
long m_nAngle;
|
|
long m_nStartX;
|
|
long m_nStartY;
|
|
|
|
ImageStudio::Core::MediaData m_oMediaData;
|
|
|
|
// effects
|
|
CSimpleArray<Category> m_categories;
|
|
CSimpleArray<Effect> m_effects;
|
|
CSimpleArray<float> m_finish;
|
|
|
|
// painting
|
|
CSimpleArray<Letter> m_letters;
|
|
|
|
// gdi+
|
|
CGdiPlusInit initGdiPlus;
|
|
|
|
// Methods
|
|
protected:
|
|
|
|
// construction
|
|
ImageTextDynamic3()
|
|
{
|
|
initGdiPlus.Init();
|
|
m_width = 0;
|
|
m_height = 0;
|
|
m_pixels = 0;
|
|
m_bitmap = 0;
|
|
m_effect = -1;
|
|
letter_rect.X = -12.8f;
|
|
letter_rect.Y = -12.8f;
|
|
letter_rect.Width = 25.6f;
|
|
letter_rect.Height = 25.6f;
|
|
|
|
m_nAngle = 0;
|
|
m_nStartX = 0;
|
|
m_nStartY = 0;
|
|
|
|
// create effects list
|
|
AddCategory("Appear Displace");
|
|
AddEffect("Displace Random Movements", "Random\nMovements", 1);
|
|
AddEffect("Displace Fade","Displace\nFade", 2);
|
|
AddEffect("Displace Shade","Displace\nShade", 3);
|
|
AddEffect("Displace Rotate","Displace\nRotate", 4);
|
|
AddEffect("Displace Random","Displace\nRandom", 5);
|
|
AddEffect("Displace Airport","Displace\nAirport", 6);
|
|
AddEffect("Displace Shake","Displace\nShake", 7);
|
|
AddEffect("Displace Wedge","Displace\nWedge", 8);
|
|
AddEffect("Displace Stream","Displace\nStream", 9);
|
|
AddCategory("Appear Waves");
|
|
AddEffect("Wave Simple","Wave\nSimple", 101);
|
|
AddEffect("Wave Zoom","Wave\nZoom", 102);
|
|
AddEffect("Wave Fall","Wave\nFall", 103);
|
|
AddEffect("Wave Run Shift","Wave\nRun Shift", 104);
|
|
AddEffect("Wave Swing","Wave\nSwing", 105);
|
|
AddEffect("Wave Run","Wave\nRun", 106);
|
|
AddEffect("Wave Zoom Vertical","Wave\nZoom Vertical", 107);
|
|
AddEffect("Wave Shift","Wave\nShift", 108);
|
|
AddEffect("Wave Pulse","Wave\nPulse", 109);
|
|
AddCategory("Appear Alternate");
|
|
AddEffect("Alternate Ejection","Alternate\nEjection", 402);
|
|
AddEffect("Alternate Ellipse","Alternate\nEllipse", 403);
|
|
AddEffect("Alternate Wheel","Alternate\nWheel", 404);
|
|
AddEffect("Alternate Miscarry","Alternate\nMiscarry", 405);
|
|
AddEffect("Alternate Rotation","Alternate\nRotation", 406);
|
|
AddEffect("Alternate Increase","Alternate\nIncrease", 407);
|
|
AddEffect("Alternate TwoString","Alternate\nTwoString", 408);
|
|
AddEffect("Alternate Tumbling","Alternate\nTumbling", 409);
|
|
AddEffect("Alternate Leave","Alternate\nLeave", 410);
|
|
AddEffect("Alternate Unfold","Alternate\nUnfold", 411);
|
|
AddEffect("Alternate Centrifuge","Alternate\nCentrifuge", 412);
|
|
AddEffect("Alternate HorizontalRotation","Alternate Horizontal\nRotation", 413);
|
|
AddEffect("Alternate HorizontalRotation3D","Alternate Horizontal\nRotation3D", 414);
|
|
AddEffect("Alternate VerticalRotation","Alternate Vertical\nRotation", 415);
|
|
AddEffect("Alternate CheChe","Alternate\nCheChe", 416);
|
|
AddCategory("Appear Transform");
|
|
AddEffect("Transform Boomerang","Transform\nBoomerang", 601);
|
|
AddEffect("Transform Flash","Transform\nFlash", 602);
|
|
AddEffect("Transform Flight","Transform\nFlight", 603);
|
|
AddEffect("Transform Jump","Transform\nJump", 604);
|
|
AddEffect("Transform Compress","Transform\nCompress", 605);
|
|
AddEffect("Transform Motion","Transform\nMotion", 606);
|
|
AddEffect("Transform Manifestation","Transform\nManifestation", 607);
|
|
AddEffect("Transform Shot","Transform\nShot", 608);
|
|
AddEffect("Transform Reduction","Transform\nReduction", 609);
|
|
AddEffect("Transform VHRotation","Transform\nVHRotation", 610);
|
|
AddEffect("Transform Rotate3D","Transform\nRotate3D", 611);
|
|
AddEffect("Transform Spiral","Transform\nSpiral", 612);
|
|
AddEffect("Transform Flag","Transform\nFlag", 613);
|
|
AddEffect("Transform Perpendicular","Transform\nPerpendicular", 614);
|
|
AddEffect("Transform Clock","Transform\nClock", 615);
|
|
AddCategory("Appear Animation");
|
|
AddEffect("Animation Galaxy","Animation\nGalaxy", 801);
|
|
AddEffect("Animation WaveRotate3D","Animation Wave\nRotate3D", 802);
|
|
AddEffect("Animation RandomJump","Animation\nRandom Jump", 803);
|
|
AddEffect("Animation Galaxy2","Animation\nGalaxy2", 804);
|
|
AddEffect("Animation Roll","Animation\nRoll", 805);
|
|
AddEffect("Animation Conga","Animation\nConga", 806);
|
|
AddEffect("Animation Matrix","Animation\nMatrix", 807);
|
|
AddEffect("Animation HotPinkSpin","Animation Hot\nPink Spin", 808);
|
|
AddEffect("Animation HopInJumpOut","Animation Hop\nIn Jump Out", 809);
|
|
AddEffect("Animation ConJoin","Animation\nConJoin", 810);
|
|
AddEffect("Animation HopsCotch","Animation\nHopsCotch", 811);
|
|
AddEffect("Animation Twist","Animation\nTwist", 812);
|
|
AddEffect("Animation StarWars","Animation\nStarWars", 813);
|
|
AddEffect("Animation Squeeze","Animation\nSqueeze", 814);
|
|
AddEffect("Animation Terminator","Animation\nTerminator", 815);
|
|
|
|
AddCategory("Erase Displace");
|
|
AddEffect("Displace Random Movements", "Displace Random\nMovements", 201);
|
|
AddEffect("Displace Fade","Displace\nFade", 202);
|
|
AddEffect("Displace Shade","Displace\nShade", 203);
|
|
AddEffect("Displace Rotate","Displace\nRotate", 204);
|
|
AddEffect("Displace Random","Displace\nRandom", 205);
|
|
AddEffect("Displace Airport","Displace\nAirport", 206);
|
|
AddEffect("Displace Shake","Displace\nShake", 207);
|
|
AddEffect("Displace Wedge","Displace\nWedge", 208);
|
|
AddEffect("Displace Stream","Displace\nStream", 209);
|
|
AddCategory("Erase Waves");
|
|
AddEffect("Wave Simple","Wave\nSimple", 301);
|
|
AddEffect("Wave Zoom","Wave\nZoom", 302);
|
|
AddEffect("Wave Fall","Wave\nFall", 303);
|
|
AddEffect("Wave Run Shift","Wave\nRun Shift", 304);
|
|
AddEffect("Wave Swing","Wave\nSwing", 305);
|
|
AddEffect("Wave Run","Wave\nRun", 306);
|
|
AddEffect("Wave Zoom Vertical","Wave\nZoom Vertical", 307);
|
|
AddEffect("Wave Shift","Wave\nShift", 308);
|
|
AddEffect("Wave Pulse","Wave\nPulse", 309);
|
|
AddCategory("Erase Alternate");
|
|
AddEffect("Alternate Ejection","Alternate\nEjection", 502);
|
|
AddEffect("Alternate Ellipse","Alternate\nEllipse", 503);
|
|
AddEffect("Alternate Wheel","Alternate\nWheel", 504);
|
|
AddEffect("Alternate Miscarry","Alternate\nMiscarry", 505);
|
|
AddEffect("Alternate Rotation","Alternate\nRotation", 506);
|
|
AddEffect("Alternate Increase","Alternate\nIncrease", 507);
|
|
AddEffect("Alternate TwoString","Alternate\nTwoString", 508);
|
|
AddEffect("Alternate Tumbling","Alternate\nTumbling", 509);
|
|
AddEffect("Alternate Leave","Alternate\nLeave", 510);
|
|
AddEffect("Alternate Unfold","Alternate\nUnfold", 511);
|
|
AddEffect("Alternate Centrifuge","Alternate\nCentrifuge", 512);
|
|
AddEffect("Alternate HorizontalRotation","Alternate Horizontal\nRotation", 513);
|
|
AddEffect("Alternate HorizontalRotation3D","Alternate Horizontal\nRotation3D", 514);
|
|
AddEffect("Alternate VerticalRotation","Alternate Vertical\nRotation", 515);
|
|
AddEffect("Alternate CheChe","Alternate\nCheChe", 516);
|
|
AddCategory("Erase Transform");
|
|
AddEffect("Transform Boomerang","Transform\nBoomerang", 701);
|
|
AddEffect("Transform Flash","Transform\nFlash", 702);
|
|
AddEffect("Transform Flight","Transform\nFlight", 703);
|
|
AddEffect("Transform Jump","Transform\nJump", 704);
|
|
AddEffect("Transform Compress","Transform\nCompress", 705);
|
|
AddEffect("Transform Motion","Transform\nMotion", 706);
|
|
AddEffect("Transform Manifestation","Transform\nManifestation", 707);
|
|
AddEffect("Transform Shot","Transform\nShot", 708);
|
|
AddEffect("Transform Reduction","Transform\nReduction", 709);
|
|
AddEffect("Transform VHRotation","Transform\nVHRotation", 710);
|
|
AddEffect("Transform Rotate3D","Transform\nRotate3D", 711);
|
|
AddEffect("Transform Spiral","Transform\nSpiral", 712);
|
|
AddEffect("Transform Flag","Transform\nFlag", 713);
|
|
AddEffect("Transform Perpendicular","Transform\nPerpendicular", 714);
|
|
AddEffect("Transform Clock","Transform\nClock", 715);
|
|
AddCategory("Erase Animation");
|
|
AddEffect("Animation Galaxy","Galaxy", 901);
|
|
AddEffect("Animation WaveRotate3D","Animation Wave\nRotate3D", 902);
|
|
AddEffect("Animation RandomJump","Animation\nRandom Jump", 903);
|
|
AddEffect("Animation Galaxy2","Animation\nGalaxy2", 904);
|
|
AddEffect("Animation Roll","Animation\nRoll", 905);
|
|
AddEffect("Animation Conga","Animation\nConga", 906);
|
|
AddEffect("Animation Matrix","Animation\nMatrix", 907);
|
|
AddEffect("Animation HotPinkSpin","Animation Hot\nPink Spin", 908);
|
|
AddEffect("Animation HopInJumpOut","Animation Hop\nIn Jump Out", 909);
|
|
AddEffect("Animation ConJoin","Animation\nConJoin", 910);
|
|
AddEffect("Animation HopsCotch","Animation\nHopsCotch", 911);
|
|
AddEffect("Animation Twist","Animation\nTwist", 912);
|
|
AddEffect("Animation StarWars","Animation\nStarWars", 913);
|
|
AddEffect("Animation Squeeze","Animation\nSqueeze", 914);
|
|
AddEffect("Animation Terminator","Animation\nTerminator", 915);
|
|
}
|
|
~ImageTextDynamic3()
|
|
{
|
|
Clear();
|
|
}
|
|
void Clear()
|
|
{
|
|
m_brush.Clear();
|
|
m_font.Clear();
|
|
m_shadow.Clear();
|
|
m_edge.Clear();
|
|
m_textures.Clear();
|
|
}
|
|
|
|
// helpers
|
|
Brush* GetBrush(Painter::CTextureManager* pManager, RectF* pRect, BYTE Alpha)
|
|
{
|
|
Brush* pBrush = NULL;
|
|
|
|
// create texture brush
|
|
if (Painter::c_BrushTypeTexture == m_brush.Type && pManager)
|
|
{
|
|
int index = pManager->Find(m_brush.TexturePath);
|
|
if (index >= 0)
|
|
{
|
|
Gdiplus::TextureBrush* brush = GetTexureBrush(index, pManager, pRect, (BYTE)(m_brush.TextureAlpha*Alpha/255), m_brush.TextureMode);
|
|
|
|
pBrush = brush;
|
|
|
|
return pBrush;
|
|
}
|
|
}
|
|
// create hatch brush
|
|
else if (m_brush.Type >= Painter::c_BrushTypeHatch1 && m_brush.Type <= Painter::c_BrushTypeHatch53)
|
|
{
|
|
Gdiplus::Color color1((BYTE)(m_brush.Alpha1*Alpha/255), GetRValue(m_brush.Color1), GetGValue(m_brush.Color1), GetBValue(m_brush.Color1));
|
|
Gdiplus::Color color2((BYTE)(m_brush.Alpha2*Alpha/255), GetRValue(m_brush.Color2), GetGValue(m_brush.Color2), GetBValue(m_brush.Color2));
|
|
Gdiplus::HatchBrush* brush = new HatchBrush((HatchStyle)(m_brush.Type - Painter::c_BrushTypeHatch1), color1, color2);
|
|
|
|
pBrush = brush;
|
|
|
|
return pBrush;
|
|
}
|
|
// create gradient brush (Horizontal, Vertical, Diagonals)
|
|
else if (m_brush.Type >= Painter::c_BrushTypeHorizontal && m_brush.Type <= Painter::c_BrushTypeDiagonal2 && pRect)
|
|
{
|
|
Gdiplus::Color color1((BYTE)(m_brush.Alpha1*Alpha/255), GetRValue(m_brush.Color1), GetGValue(m_brush.Color1), GetBValue(m_brush.Color1));
|
|
Gdiplus::Color color2((BYTE)(m_brush.Alpha2*Alpha/255), GetRValue(m_brush.Color2), GetGValue(m_brush.Color2), GetBValue(m_brush.Color2));
|
|
Gdiplus::LinearGradientBrush* brush = new Gdiplus::LinearGradientBrush(*pRect, color1, color2, (LinearGradientMode)(m_brush.Type - Painter::c_BrushTypeHorizontal));
|
|
|
|
pBrush = brush;
|
|
|
|
return pBrush;
|
|
}
|
|
// create gradient brush (rect with center)
|
|
else if (Painter::c_BrushTypeCenter == m_brush.Type && pRect)
|
|
{
|
|
Gdiplus::Color color1((BYTE)(m_brush.Alpha1*Alpha/255), GetRValue(m_brush.Color1), GetGValue(m_brush.Color1), GetBValue(m_brush.Color1));
|
|
Gdiplus::Color color2((BYTE)(m_brush.Alpha2*Alpha/255), GetRValue(m_brush.Color2), GetGValue(m_brush.Color2), GetBValue(m_brush.Color2));
|
|
Gdiplus::GraphicsPath path; path.AddRectangle(*pRect);
|
|
PathGradientBrush* brush = new PathGradientBrush(&path);
|
|
Color colors[] = {color1};
|
|
int count = 1;
|
|
brush->SetSurroundColors(colors, &count);
|
|
brush->SetCenterColor(color2);
|
|
|
|
pBrush = brush;
|
|
|
|
return pBrush;
|
|
}
|
|
// create gradient brush (Cylinder Horizontal, Cylinder Vertical)
|
|
else if (m_brush.Type >= Painter::c_BrushTypeCylinderHor && m_brush.Type <= Painter::c_BrushTypeCylinderVer && pRect)
|
|
{
|
|
Gdiplus::Color color1((BYTE)(m_brush.Alpha1*Alpha/255), GetRValue(m_brush.Color1), GetGValue(m_brush.Color1), GetBValue(m_brush.Color1));
|
|
Gdiplus::Color color2((BYTE)(m_brush.Alpha2*Alpha/255), GetRValue(m_brush.Color2), GetGValue(m_brush.Color2), GetBValue(m_brush.Color2));
|
|
Gdiplus::LinearGradientBrush* brush = NULL;
|
|
switch(m_brush.Type - Painter::c_BrushTypeCylinderHor)
|
|
{
|
|
case 0:
|
|
brush = new Gdiplus::LinearGradientBrush(*pRect, color1, color2, -90.F);
|
|
brush->SetBlendBellShape(0.70f);
|
|
break;
|
|
case 1:
|
|
brush = new Gdiplus::LinearGradientBrush(*pRect, color1, color2, -180.F);
|
|
brush->SetBlendBellShape(0.70f);
|
|
break;
|
|
}
|
|
|
|
pBrush = brush;
|
|
|
|
return pBrush;
|
|
}
|
|
// create solid brush
|
|
// if (Painter::c_BrushTypeSolid == m_brush.Type)
|
|
Gdiplus::Color color((BYTE)(m_brush.Alpha1*Alpha/255), GetRValue(m_brush.Color1), GetGValue(m_brush.Color1), GetBValue(m_brush.Color1));
|
|
Gdiplus::SolidBrush* brush = new Gdiplus::SolidBrush(color);
|
|
|
|
pBrush = brush;
|
|
|
|
return pBrush;
|
|
}
|
|
void DrawPathGradientText(Graphics* graph, StringFormat* format, int i, BSTR Text, BYTE Alpha)
|
|
{
|
|
Font* myFont = m_font.GetFont();
|
|
Gdiplus::Color color1((BYTE)(m_brush.Alpha1*Alpha/255), GetRValue(m_brush.Color1), GetGValue(m_brush.Color1), GetBValue(m_brush.Color1));
|
|
Gdiplus::Color color2((BYTE)(m_brush.Alpha2*Alpha/255), GetRValue(m_brush.Color2), GetGValue(m_brush.Color2), GetBValue(m_brush.Color2));
|
|
GraphicsPath path;
|
|
int colorsCount = 4;
|
|
if (Painter::c_BrushTypePathGradient1 == m_brush.Type)
|
|
{
|
|
// get rect of current(0) character
|
|
RectF rectCharacter;
|
|
Painter::GetRectCurrentCharacter(graph, format, myFont, Text, 1, 0, letter_rect, rectCharacter);
|
|
|
|
// create path and brush
|
|
path.AddRectangle(rectCharacter);
|
|
PathGradientBrush* pBrush = new PathGradientBrush(&path);
|
|
Color colors[] = {color1, color1, color1, color1};
|
|
pBrush->SetSurroundColors(colors, &colorsCount);
|
|
pBrush->SetCenterColor(color2);
|
|
|
|
// draw text
|
|
graph->DrawString(Text, 1, myFont, letter_rect, format, pBrush);
|
|
|
|
// delete brush and reset path
|
|
if (pBrush)
|
|
delete pBrush;
|
|
path.Reset();
|
|
}
|
|
|
|
if (Painter::c_BrushTypePathGradient2 == m_brush.Type)
|
|
{
|
|
// get rect of current(0) character
|
|
RectF rectCharacter;
|
|
Painter::GetRectCurrentCharacter(graph, format, myFont, Text, 1, 0, letter_rect, rectCharacter);
|
|
|
|
// create path and brush
|
|
path.AddRectangle(rectCharacter);
|
|
PathGradientBrush* pBrush = new PathGradientBrush(&path);
|
|
Color colors1[] = {color1, color2, color2, color1};
|
|
Color colors2[] = {color2, color1, color1, color2};
|
|
if (i%2 == 0)
|
|
{
|
|
pBrush->SetSurroundColors(colors1, &colorsCount);
|
|
pBrush->SetCenterColor(color1);
|
|
}
|
|
if (i%2 == 1)
|
|
{
|
|
pBrush->SetSurroundColors(colors2, &colorsCount);
|
|
pBrush->SetCenterColor(color2);
|
|
}
|
|
|
|
// draw text
|
|
graph->DrawString(Text, 1, myFont, letter_rect, format, pBrush);
|
|
|
|
// delete brush and reset path
|
|
if (pBrush)
|
|
delete pBrush;
|
|
path.Reset();
|
|
}
|
|
}
|
|
|
|
// appendix
|
|
Gdiplus::ImageAttributes* GetImageAttributes(BYTE Alpha)
|
|
{
|
|
// alh >=0 && alph <= 1
|
|
REAL alph = (REAL)(Alpha)/255.0F;
|
|
ColorMatrix colorMatrix = { 1.0f, 0.0f, 0.0f, 0.0f, 0.0f,
|
|
0.0f, 1.0f, 0.0f, 0.0f, 0.0f,
|
|
0.0f, 0.0f, 1.0f, 0.0f, 0.0f,
|
|
0.0f, 0.0f, 0.0f, alph, 0.0f,
|
|
0.0f, 0.0f, 0.0f, 0.0f, 1.0f};
|
|
ImageAttributes* pImageAtt = new ImageAttributes();
|
|
pImageAtt->SetColorMatrix(&colorMatrix, ColorMatrixFlagsDefault, ColorAdjustTypeBitmap);
|
|
return pImageAtt;
|
|
}
|
|
Gdiplus::TextureBrush* GetTexureBrush(int index, Painter::CTextureManager* manager, RectF* pRect, BYTE Alpha, int TextureMode)
|
|
{
|
|
// get texture bounds
|
|
RectF boundsRect;
|
|
Unit unit;
|
|
Gdiplus::Bitmap* pTextureBitmap = manager->GetAt(index)->Bitmap;
|
|
pTextureBitmap->GetBounds(&boundsRect, &unit);
|
|
|
|
// create texture brush with textureAlpha
|
|
ImageAttributes* pImageAtt = GetImageAttributes(Alpha);
|
|
Gdiplus::TextureBrush* brush = new Gdiplus::TextureBrush(pTextureBitmap, boundsRect, pImageAtt);
|
|
if (pImageAtt)
|
|
delete pImageAtt;
|
|
|
|
// choice texture mode
|
|
switch(TextureMode)
|
|
{
|
|
// tile texture
|
|
case Painter::c_BrushTextureModeTile:
|
|
brush->SetWrapMode(WrapModeTile);
|
|
break;
|
|
// stretch texture
|
|
case Painter::c_BrushTextureModeStretch:
|
|
if (pRect)
|
|
{
|
|
brush->TranslateTransform(pRect->X, pRect->Y);
|
|
brush->ScaleTransform(pRect->Width/boundsRect.Width, pRect->Height/boundsRect.Height);
|
|
}
|
|
break;
|
|
}
|
|
|
|
return brush;
|
|
}
|
|
|
|
// categories
|
|
void AddCategory(const CString& name)
|
|
{
|
|
int count = m_categories.GetSize();
|
|
|
|
Category category(name);
|
|
|
|
m_categories.Add(category);
|
|
}
|
|
void AddEffect(const CString& name, const CString& name2, int id)
|
|
{
|
|
int count = m_effects.GetSize();
|
|
|
|
m_categories[m_categories.GetSize() - 1].Effects.Add(count);
|
|
|
|
Effect effect(name, name2, id);
|
|
|
|
m_effects.Add(effect);
|
|
}
|
|
|
|
// painting
|
|
void EffectStart(BSTR String, long Category, long Effect, long EffectID, long CoorX, long CoorY, long Step)
|
|
{
|
|
int effect = -1;
|
|
|
|
if (EffectID >= 0)
|
|
effect = EffectID;
|
|
else
|
|
{
|
|
if (Category < 0)
|
|
{
|
|
if (Effect >= 0 && Effect < m_effects.GetSize())
|
|
effect = m_effects[Effect].ID;
|
|
}
|
|
else if (Category >=0 && Category < m_categories.GetSize())
|
|
{
|
|
if (Effect >= 0 && Effect < m_categories[Category].Effects.GetSize())
|
|
effect = m_effects[m_categories[Category].Effects[Effect]].ID;
|
|
}
|
|
}
|
|
|
|
if (m_effect != effect)
|
|
EffectStop();
|
|
|
|
m_effect = effect;
|
|
m_string = String;
|
|
|
|
if (effect < 0)
|
|
return;
|
|
|
|
// create letters array
|
|
m_letters.RemoveAll();
|
|
Gdiplus::Color brushColor1((BYTE)m_brush.Alpha1, GetRValue(m_brush.Color1), GetGValue(m_brush.Color1), GetBValue(m_brush.Color1));
|
|
ApplyEffect(brushColor1, 255, CoorX, CoorY, Step);
|
|
}
|
|
void EffectStop()
|
|
{
|
|
// TODO: clear effect resources here if necessary
|
|
}
|
|
void EffectRender(double Frame)
|
|
{
|
|
m_bitmap = new Bitmap(m_width, m_height, m_width*4, PixelFormat32bppRGB, m_pixels);
|
|
|
|
if (Frame < 0.001)
|
|
return;
|
|
|
|
if (!m_bitmap)
|
|
return;
|
|
|
|
Graphics* graphics = new Graphics(m_bitmap);
|
|
|
|
if (!graphics)
|
|
return;
|
|
|
|
graphics->SetTextRenderingHint(TextRenderingHintAntiAlias);
|
|
|
|
// variables
|
|
Waypoint point;
|
|
|
|
// setup painting format
|
|
StringFormat format;
|
|
format.SetFormatFlags(StringFormatFlagsNoWrap);
|
|
format.SetAlignment(StringAlignmentCenter);
|
|
format.SetLineAlignment(StringAlignmentCenter);
|
|
format.SetTrimming(StringTrimmingNone);
|
|
|
|
Font* myFont = m_font.GetFont();
|
|
Matrix oMatrix;
|
|
oMatrix.Reset();
|
|
oMatrix.RotateAt(m_nAngle, PointF(m_nStartX, m_nStartY + myFont->GetHeight(graphics)/2));
|
|
graphics->SetTransform(&oMatrix);
|
|
|
|
// draw shadow for all letters
|
|
if (m_shadow.Visible)
|
|
{
|
|
for (int index = 0; index < m_letters.GetSize(); ++index)
|
|
{
|
|
if (!m_letters[index].GetWaypoint(Frame, point))
|
|
continue;
|
|
if (!point.Visible)
|
|
continue;
|
|
|
|
// reset transformation sequence
|
|
graphics->ResetTransform();
|
|
|
|
// apply transform to the graphics
|
|
graphics->SetTransform(&oMatrix);
|
|
point.Render(graphics);
|
|
|
|
// draw shadow
|
|
m_shadow.Draw(graphics, myFont, &format, &(point.Name), 1, letter_rect, point.Alpha);
|
|
}
|
|
}
|
|
|
|
// draw all letters
|
|
for (int index = 0; index < m_letters.GetSize(); ++index)
|
|
{
|
|
if (!m_letters[index].GetWaypoint(Frame, point))
|
|
continue;
|
|
if (!point.Visible)
|
|
continue;
|
|
|
|
// reset transformation sequence
|
|
graphics->ResetTransform();
|
|
|
|
// apply transform to the graphics
|
|
graphics->SetTransform(&oMatrix);
|
|
point.Render(graphics);
|
|
|
|
// draw edge
|
|
m_edge.Draw(graphics, myFont, &format, &(point.Name), 1, letter_rect, point.Alpha);
|
|
|
|
// draw letter at (0,0) position
|
|
if((Painter::c_BrushTypePathGradient1 != m_brush.Type) && (Painter::c_BrushTypePathGradient2 != m_brush.Type))
|
|
{
|
|
Brush* myBrush = GetBrush(&m_textures, &letter_rect, point.Alpha);
|
|
graphics->DrawString(&(point.Name), 1, myFont, letter_rect, &format, myBrush);
|
|
|
|
// delete brush
|
|
if (myBrush)
|
|
delete myBrush;
|
|
}
|
|
else
|
|
DrawPathGradientText(graphics, &format, index, &(point.Name), point.Alpha);
|
|
|
|
// stop painting
|
|
graphics->Flush();
|
|
}
|
|
|
|
graphics->ResetTransform();
|
|
|
|
// delete bitmap
|
|
if (graphics)
|
|
delete graphics;
|
|
if (m_bitmap)
|
|
delete m_bitmap;
|
|
}
|
|
BOOL EffectRenderEnd()
|
|
{
|
|
// variables
|
|
int nIndex = 0;
|
|
int nLineSize = 4*m_width;
|
|
int nIndexFlip = nLineSize*(m_height - 1);
|
|
BYTE* pLine = new BYTE[nLineSize];
|
|
|
|
// flip image vertically
|
|
for (int nY = 0; nY < m_height/2; ++nY, nIndex += nLineSize, nIndexFlip -= nLineSize)
|
|
{
|
|
memcpy(pLine, (BYTE*)(m_pixels + nIndex), nLineSize);
|
|
memcpy((BYTE*)(m_pixels + nIndex), (BYTE*)(m_pixels + nIndexFlip), nLineSize);
|
|
memcpy((BYTE*)(m_pixels + nIndexFlip), pLine, nLineSize);
|
|
}
|
|
|
|
// clear memory
|
|
delete[] pLine;
|
|
|
|
// all ok
|
|
return TRUE;
|
|
}
|
|
|
|
// effect
|
|
void ApplyEffect(Color Color, long Alpha, long CoorX, long CoorY, long Step)
|
|
{
|
|
int length = m_string.GetLength();
|
|
|
|
if (length < 1)
|
|
return;
|
|
|
|
BSTR bstr = m_string.AllocSysString();
|
|
|
|
Font* myFont = m_font.GetFont();
|
|
|
|
// TODO: step == 0 situation currently is under investigation
|
|
if (Step == 0)
|
|
{
|
|
long newCoorX = CoorX + myFont->GetSize()/2;
|
|
long nDistance = 0;
|
|
|
|
Gdiplus::Bitmap* pBitmap = NULL;
|
|
|
|
if (m_pixels == NULL)
|
|
pBitmap = new Bitmap(640, 480, 640*4, PixelFormat32bppRGB, m_pixels);
|
|
else
|
|
pBitmap = new Bitmap(m_width, m_height, m_width*4, PixelFormat32bppRGB, m_pixels);
|
|
|
|
Gdiplus::Graphics* pGraphics = new Gdiplus::Graphics(pBitmap);
|
|
|
|
if(!pGraphics || !pBitmap)
|
|
return;
|
|
|
|
|
|
StringFormat format;
|
|
format.SetFormatFlags(StringFormatFlagsNoWrap);
|
|
format.SetAlignment(StringAlignmentCenter);
|
|
format.SetLineAlignment(StringAlignmentCenter);
|
|
format.SetTrimming(StringTrimmingNone);
|
|
|
|
for (int index = 0; index < length; ++index)
|
|
{
|
|
Letter letter;
|
|
letter.Initialize(Color.GetValue(), (long)myFont->GetSize());
|
|
letter.Name = bstr[index];
|
|
|
|
PointF pointOrigin(CoorX, CoorY);
|
|
RectF StringBox;
|
|
|
|
pGraphics->MeasureString(&bstr[index], 1, myFont, pointOrigin, &format, &StringBox);
|
|
|
|
/*WCHAR* mas = new WCHAR[2];
|
|
|
|
mas[0] = bstr[index];
|
|
mas[1] = bstr[index];
|
|
|
|
RectF rect;
|
|
pGraphics->MeasureString(mas, 2, myFont, PointF(0, 0), &format, &rect);
|
|
int len1 = rect.Width;
|
|
pGraphics->MeasureString(mas, 1, myFont, PointF(0, 0), &format, &rect);
|
|
int len2 = rect.Width;
|
|
int nDist = len1 - len2;*/
|
|
|
|
m_finish.Add(newCoorX / 2);
|
|
m_finish.Add(CoorY + myFont->GetSize()/2);
|
|
newCoorX += (StringBox.Width + myFont->GetSize()/4);
|
|
//newCoorX += nDist;
|
|
//newCoorX -= nDist;
|
|
|
|
m_letters.Add(letter);
|
|
}
|
|
|
|
delete pBitmap;
|
|
delete pGraphics;
|
|
}
|
|
|
|
else
|
|
{
|
|
for (int index = 0; index < length; ++index)
|
|
{
|
|
// initialize letter
|
|
Letter letter;
|
|
letter.Initialize(Color.GetValue(), (long)myFont->GetSize());
|
|
letter.Name = bstr[index];
|
|
|
|
// fill finish point X
|
|
m_finish.Add(Step*index + CoorX + myFont->GetSize()/2);
|
|
|
|
// fill finish point Y
|
|
m_finish.Add(CoorY + myFont->GetSize()/2);
|
|
|
|
m_letters.Add(letter);
|
|
}
|
|
}
|
|
|
|
|
|
// draw letters with specified effecta
|
|
switch (m_effect)
|
|
{
|
|
// Appear Displace
|
|
case 1: RandomMovements(m_letters, m_finish, Alpha); break;
|
|
case 2: AppearFade(m_letters, m_finish, Alpha); break;
|
|
case 3: AppearShade(m_letters, m_finish, Alpha); break;
|
|
case 4: AppearRotate(m_letters, m_finish, Alpha); break;
|
|
case 5: AppearRandom(m_letters, m_finish, Alpha); break;
|
|
case 6: Airport(m_letters, m_finish, Alpha); break;
|
|
case 7: AppearShake(m_letters, m_finish, Alpha); break;
|
|
case 8: AppearWedge(m_letters, m_finish, Alpha); break;
|
|
case 9: AppearStream(m_letters, m_finish, Alpha); break;
|
|
|
|
// Appear Waves
|
|
case 101: WaveSimple(m_letters, m_finish, Alpha); break;
|
|
case 102: WaveZoom(m_letters, m_finish, Alpha); break;
|
|
case 103: WaveFall(m_letters, m_finish, Alpha); break;
|
|
case 104: WaveRunShift(m_letters, m_finish, Alpha); break;
|
|
case 105: WaveSwing(m_letters, m_finish, Alpha); break;
|
|
case 106: WaveRun(m_letters, m_finish, Alpha); break;
|
|
case 107: WaveZoomVertical(m_letters, m_finish, Alpha); break;
|
|
case 108: WaveShift(m_letters, m_finish, Alpha); break;
|
|
case 109: WavePulse(m_letters, m_finish, Alpha); break;
|
|
|
|
// Erase Displace
|
|
case 201: RandomMovementsBack(m_letters, m_finish, Alpha); break;
|
|
case 202: AppearFadeBack(m_letters, m_finish, Alpha); break;
|
|
case 203: AppearShadeBack(m_letters, m_finish, Alpha); break;
|
|
case 204: AppearRotateBack(m_letters, m_finish, Alpha); break;
|
|
case 205: AppearRandomBack(m_letters, m_finish, Alpha); break;
|
|
case 206: AirportBack(m_letters, m_finish, Alpha); break;
|
|
case 207: AppearShakeBack(m_letters, m_finish, Alpha); break;
|
|
case 208: AppearWedgeBack(m_letters, m_finish, Alpha); break;
|
|
case 209: AppearStreamBack(m_letters, m_finish, Alpha); break;
|
|
|
|
// Erase Waves
|
|
case 301: WaveSimpleBack(m_letters, m_finish, Alpha);break;
|
|
case 302: WaveZoomBack(m_letters, m_finish, Alpha); break;
|
|
case 303: WaveFallBack(m_letters, m_finish, Alpha); break;
|
|
case 304: WaveRunShiftBack(m_letters, m_finish, Alpha); break;
|
|
case 305: WaveSwingBack(m_letters, m_finish, Alpha); break;
|
|
case 306: WaveRunBack(m_letters, m_finish, Alpha); break;
|
|
case 307: WaveZoomVerticalBack(m_letters, m_finish, Alpha); break;
|
|
case 308: WaveShiftBack(m_letters, m_finish, Alpha); break;
|
|
case 309: WavePulseBack(m_letters, m_finish, Alpha); break;
|
|
|
|
// New
|
|
case 402: Ejection(m_letters, m_finish, Alpha); break;
|
|
case 403: Ellipse(m_letters, m_finish, Alpha); break;
|
|
case 404: Wheel(m_letters, m_finish, Alpha); break;
|
|
case 405: Miscarry(m_letters, m_finish, Alpha); break;
|
|
case 406: Rotation(m_letters, m_finish, Alpha); break;
|
|
case 407: Increase(m_letters, m_finish, Alpha); break;
|
|
case 408: TwoString(m_letters, m_finish, Alpha); break;
|
|
case 409: Tumbling(m_letters, m_finish, Alpha); break;
|
|
case 410: Leave(m_letters, m_finish, Alpha); break;
|
|
case 411: Unfold(m_letters, m_finish, Alpha); break;
|
|
case 412: Centrifuge(m_letters, m_finish, Alpha); break;
|
|
case 413: HorizontalRotation(m_letters, m_finish, Alpha); break;
|
|
case 414: HorizontalRotation3D(m_letters, m_finish, Alpha); break;
|
|
case 415: VerticalRotation(m_letters, m_finish, Alpha); break;
|
|
case 416: CheChe(m_letters, m_finish, Alpha); break;
|
|
|
|
|
|
// Erase New
|
|
case 502: EjectionBack(m_letters, m_finish, Alpha); break;
|
|
case 503: EllipseBack(m_letters, m_finish, Alpha); break;
|
|
case 504: WheelBack(m_letters, m_finish, Alpha); break;
|
|
case 505: MiscarryBack(m_letters, m_finish, Alpha); break;
|
|
case 506: RotationBack(m_letters, m_finish, Alpha); break;
|
|
case 507: IncreaseBack(m_letters, m_finish, Alpha); break;
|
|
case 508: TwoStringBack(m_letters, m_finish, Alpha); break;
|
|
case 509: TumblingBack(m_letters, m_finish, Alpha); break;
|
|
case 510: LeaveBack(m_letters, m_finish, Alpha); break;
|
|
case 511: UnfoldBack(m_letters, m_finish, Alpha); break;
|
|
case 512: CentrifugeBack(m_letters, m_finish, Alpha); break;
|
|
case 513: HorizontalRotationBack(m_letters, m_finish, Alpha); break;
|
|
case 514: HorizontalRotation3DBack(m_letters, m_finish, Alpha); break;
|
|
case 515: VerticalRotationBack(m_letters, m_finish, Alpha); break;
|
|
case 516: CheCheBack(m_letters, m_finish, Alpha); break;
|
|
|
|
// New2
|
|
case 601: Boomerang(m_letters, m_finish, Alpha); break;
|
|
case 602: Flash(m_letters, m_finish, Alpha); break;
|
|
case 603: Flight(m_letters, m_finish, Alpha); break;
|
|
case 604: Jump(m_letters, m_finish, Alpha); break;
|
|
case 605: Compress(m_letters, m_finish, Alpha); break;
|
|
case 606: Motion(m_letters, m_finish, Alpha); break;
|
|
case 607: Manifestation(m_letters, m_finish, Alpha); break;
|
|
case 608: Shot(m_letters, m_finish, Alpha); break;
|
|
case 609: Reduction(m_letters, m_finish, Alpha); break;
|
|
case 610: VHRotation(m_letters, m_finish, Alpha); break;
|
|
case 611: Rotate3D(m_letters, m_finish, Alpha); break;
|
|
case 612: Spiral(m_letters, m_finish, Alpha); break;
|
|
case 613: Flag(m_letters, m_finish, Alpha); break;
|
|
case 614: Perpendicular(m_letters, m_finish, Alpha); break;
|
|
case 615: Clock(m_letters, m_finish, Alpha); break;
|
|
|
|
// Erase New2
|
|
case 701: BoomerangBack(m_letters, m_finish, Alpha); break;
|
|
case 702: FlashBack(m_letters, m_finish, Alpha); break;
|
|
case 703: FlightBack(m_letters, m_finish, Alpha); break;
|
|
case 704: JumpBack(m_letters, m_finish, Alpha); break;
|
|
case 705: CompressBack(m_letters, m_finish, Alpha); break;
|
|
case 706: MotionBack(m_letters, m_finish, Alpha); break;
|
|
case 707: ManifestationBack(m_letters, m_finish, Alpha); break;
|
|
case 708: ShotBack(m_letters, m_finish, Alpha); break;
|
|
case 709: ReductionBack(m_letters, m_finish, Alpha); break;
|
|
case 710: VHRotationBack(m_letters, m_finish, Alpha); break;
|
|
case 711: Rotate3DBack(m_letters, m_finish, Alpha); break;
|
|
case 712: SpiralBack(m_letters, m_finish, Alpha); break;
|
|
case 713: FlagBack(m_letters, m_finish, Alpha); break;
|
|
case 714: PerpendicularBack(m_letters, m_finish, Alpha); break;
|
|
case 715: ClockBack(m_letters, m_finish, Alpha); break;
|
|
|
|
// New3
|
|
case 801: Galaxy(m_letters, m_finish, Alpha); break;
|
|
case 802: WaveRotate3D(m_letters, m_finish, Alpha); break;
|
|
case 803: RandomJump(m_letters, m_finish, Alpha); break;
|
|
case 804: Galaxy2(m_letters, m_finish, Alpha); break;
|
|
case 805: Roll(m_letters, m_finish, Alpha); break;
|
|
case 806: Conga(m_letters, m_finish, Alpha); break;
|
|
case 807: _Matrix(m_letters, m_finish, Alpha); break;
|
|
case 808: HotPinkSpin(m_letters, m_finish, Alpha); break;
|
|
case 809: HopInJumpOut(m_letters, m_finish, Alpha); break;
|
|
case 810: ConJoin(m_letters, m_finish, Alpha); break;
|
|
case 811: HopsCotch(m_letters, m_finish, Alpha); break;
|
|
case 812: Twist(m_letters, m_finish, Alpha); break;
|
|
case 813: StarWars(m_letters, m_finish, Alpha); break;
|
|
case 814: Squeeze(m_letters, m_finish, Alpha); break;
|
|
case 815: Terminator(m_letters, m_finish, Alpha); break;
|
|
|
|
// Erase new3
|
|
case 901: GalaxyBack(m_letters, m_finish, Alpha); break;
|
|
case 902: WaveRotate3DBack(m_letters, m_finish, Alpha); break;
|
|
case 903: RandomJumpBack(m_letters, m_finish, Alpha); break;
|
|
case 904: Galaxy2Back(m_letters, m_finish, Alpha); break;
|
|
case 905: RollBack(m_letters, m_finish, Alpha); break;
|
|
case 906: CongaBack(m_letters, m_finish, Alpha); break;
|
|
case 907: _MatrixBack(m_letters, m_finish, Alpha); break;
|
|
case 908: HotPinkSpinBack(m_letters, m_finish, Alpha); break;
|
|
case 909: HopInJumpOutBack(m_letters, m_finish, Alpha); break;
|
|
case 910: ConJoinBack(m_letters, m_finish, Alpha); break;
|
|
case 911: HopsCotchBack(m_letters, m_finish, Alpha); break;
|
|
case 912: TwistBack(m_letters, m_finish, Alpha); break;
|
|
case 913: StarWarsBack(m_letters, m_finish, Alpha); break;
|
|
case 914: SqueezeBack(m_letters, m_finish, Alpha); break;
|
|
case 915: TerminatorBack(m_letters, m_finish, Alpha); break;
|
|
|
|
}
|
|
|
|
if (m_finish.GetSize() >= 2)
|
|
{
|
|
m_nStartX = m_finish[0];
|
|
m_nStartY = m_finish[1];
|
|
}
|
|
|
|
m_finish.RemoveAll();
|
|
|
|
SysFreeString(bstr);
|
|
}
|
|
};
|
|
|