#pragma once #include "resource.h" #include #include "TextFormat.h" #include "TextToPath.h" #include #include [object, uuid("D7DC8BC9-3F5A-4de4-BFB1-F92930AF14EE"), dual, helpstring("IImageTextStatic3 Interface"), pointer_default(unique)] __interface IImageTextStatic3 : IDispatch { // general [id(1)] HRESULT Draw([in,out, satype(BYTE)] SAFEARRAY ** Image, [in] BSTR Text, [in] long Left, [in] long Top, [in] long Right, [in] long Bottom); [id(2)] HRESULT DrawMedia([in, out] IUnknown** Image, [in] BSTR Text, [in] long Left, [in] long Top, [in] long Right, [in] long Bottom); [id(3)] HRESULT DrawEllipse([in,out, satype(BYTE)] SAFEARRAY ** Image, [in] BSTR Text, [in] long Left, [in] long Top, [in] long Right, [in] long Bottom, [in] double StartAngle, [in] double SweepAngle); [id(4)] HRESULT DrawMediaEllipse([in, out] IUnknown** Image, [in] BSTR Text, [in] long Left, [in] long Top, [in] long Right, [in] long Bottom, [in] double StartAngle, [in] double SweepAngle); [id(5)] HRESULT DrawPolyline([in,out, satype(BYTE)] SAFEARRAY ** Image, [in, satype("double")] SAFEARRAY** Array, [in] BSTR Text); [id(6)] HRESULT DrawMediaPolyline([in, out] IUnknown** Image, [in, satype("double")] SAFEARRAY** Array, [in] BSTR Text); // font [id(101), propget] HRESULT fontName([out, retval] BSTR* pVal); [id(101), propput] HRESULT fontName([in] BSTR newVal); [id(102), propget] HRESULT fontSize([out, retval] double* pVal); [id(102), propput] HRESULT fontSize([in] double newVal); [id(103), propget] HRESULT fontBold([out, retval] VARIANT_BOOL* pVal); [id(103), propput] HRESULT fontBold([in] VARIANT_BOOL newVal); [id(104), propget] HRESULT fontItalic([out, retval] VARIANT_BOOL* pVal); [id(104), propput] HRESULT fontItalic([in] VARIANT_BOOL newVal); [id(105), propget] HRESULT fontUnderline([out, retval] VARIANT_BOOL* pVal); [id(105), propput] HRESULT fontUnderline([in] VARIANT_BOOL newVal); [id(106), propget] HRESULT fontStrikeout([out, retval] VARIANT_BOOL* pVal); [id(106), propput] HRESULT fontStrikeout([in] VARIANT_BOOL newVal); // brush [id(203), propget] HRESULT brushType([out, retval] long* pVal); [id(203), propput] HRESULT brushType([in] long newVal); [id(204), propget] HRESULT brushColor1([out, retval] long* pVal); [id(204), propput] HRESULT brushColor1([in] long newVal); [id(205), propget] HRESULT brushColor2([out, retval] long* pVal); [id(205), propput] HRESULT brushColor2([in] long newVal); [id(206), propget] HRESULT brushAlpha1([out, retval] long* pVal); [id(206), propput] HRESULT brushAlpha1([in] long newVal); [id(207), propget] HRESULT brushAlpha2([out, retval] long* pVal); [id(207), propput] HRESULT brushAlpha2([in] long newVal); [id(208), propget] HRESULT brushTexturePath([out, retval] BSTR* val); [id(208), propput] HRESULT brushTexturePath([in] BSTR val); [id(209), propget] HRESULT brushTextureAlpha([out, retval] long* val); [id(209), propput] HRESULT brushTextureAlpha([in] long val); [id(210), propget] HRESULT brushTextureMode([out, retval] long* val); [id(210), propput] HRESULT brushTextureMode([in] long val); [id(211), propput] HRESULT brushTexture([in] BSTR Name, [in, satype("BYTE")] SAFEARRAY** Image); // formatting [id(301), propget] HRESULT formatAlignVertical([out, retval] long* pVal); [id(301), propput] HRESULT formatAlignVertical([in] long newVal); [id(302), propget] HRESULT formatAlignHorizontal([out, retval] long* pVal); [id(302), propput] HRESULT formatAlignHorizontal([in] long newVal); [id(303), propget] HRESULT formatRotate([out, retval] long* pVal); [id(303), propput] HRESULT formatRotate([in] long newVal); // shadow [id(401), propget] HRESULT shadowVisible([out, retval] VARIANT_BOOL* pVal); [id(401), propput] HRESULT shadowVisible([in] VARIANT_BOOL newVal); [id(402), propget] HRESULT shadowDistanceX([out, retval] long* pVal); [id(402), propput] HRESULT shadowDistanceX([in] long newVal); [id(403), propget] HRESULT shadowDistanceY([out, retval] long* pVal); [id(403), propput] HRESULT shadowDistanceY([in] long newVal); [id(404), propget] HRESULT shadowColor([out, retval] long* pVal); [id(404), propput] HRESULT shadowColor([in] long newVal); [id(405), propget] HRESULT shadowAlpha([out, retval] long* pVal); [id(405), propput] HRESULT shadowAlpha([in] long newVal); [id(406), propget] HRESULT shadowBlur([out, retval] long* pVal); [id(406), propput] HRESULT shadowBlur([in] long newVal); // edge [id(501), propget] HRESULT edgeVisible([out, retval] long* pVal); [id(501), propput] HRESULT edgeVisible([in] long newVal); [id(502), propget] HRESULT edgeDistance([out, retval] long* pVal); [id(502), propput] HRESULT edgeDistance([in] long newVal); [id(503), propget] HRESULT edgeColor([out, retval] long* pVal); [id(503), propput] HRESULT edgeColor([in] long newVal); [id(504), propget] HRESULT edgeAlpha([out, retval] long* pVal); [id(504), propput] HRESULT edgeAlpha([in] long newVal); // presets [id(601), propget] HRESULT currentPresetName([out, retval] BSTR* pVal); [id(601), propput] HRESULT currentPresetName([in] BSTR newVal); [id(602), propget] HRESULT currentPresetIndex([out, retval] long* pVal); [id(602), propput] HRESULT currentPresetIndex([in] long newVal); [id(651)] HRESULT SavePresets([in] BSTR path); [id(652)] HRESULT LoadPresets([in] BSTR path, VARIANT_BOOL append); [id(653)] HRESULT GetPresetCount([out,retval] long* count); [id(654)] HRESULT GetPresetName([in] long index, [out] BSTR* name); [id(655)] HRESULT DeletePreset([in] BSTR path, [in] long index); [id(656)] HRESULT SetFormat([in, satype("BYTE")] SAFEARRAY** Array); [id(657)] HRESULT GetFormat([out, retval, satype("BYTE")] SAFEARRAY** Array); }; [ coclass, uuid("188CF510-A263-45e2-B786-76D4C1427533"), threading(apartment), vi_progid("AVSImagePaint3.ImageTextStatic3"), progid("AVSImagePaint3.ImageTextStatic3.1"), version(1.0), helpstring("ImageTextStatic3 Class")] class ATL_NO_VTABLE ImageTextStatic3 : public IImageTextStatic3 { protected: // general CGdiPlusInit initGdiPlus; // painting formats Painter::CBrush m_brush; Painter::CFont m_font; Painter::CFormat m_format; Painter::CShadow m_shadow; Painter::CEdgeText m_edge; Painter::CTextureManager m_textures; ImageStudio::Core::MediaData m_oMediaData; // primary settings long m_nRotateAngle; // presets CString m_sCurrentPresetName; long m_nCurentPresetIndex; CAtlArray m_arrFormats; protected: ImageTextStatic3() { initGdiPlus.Init(); m_nRotateAngle = 0; m_nCurentPresetIndex = 0; m_sCurrentPresetName = "Preset"; } ~ImageTextStatic3() { Clear(); m_arrFormats.RemoveAll(); } void Clear() { m_brush.Clear(); m_font.Clear(); m_format.Clear(); m_shadow.Clear(); m_edge.Clear(); m_textures.Clear(); } Gdiplus::Brush* CreateBrush(GraphicsPath& path, Gdiplus::Color& color1, Gdiplus::Color& color2, int index, RectF& rectCharacter) { Brush* brush = NULL; int k = 4; if (Painter::c_BrushTypePathGradient1 == m_brush.Type) { Color colors[] = {color1, color1, color1, color1}; PathGradientBrush* pBrush = new PathGradientBrush(&path); pBrush->SetSurroundColors(colors, &k); pBrush->SetCenterColor(color2); // pBrush->SetCenterPoint(PointF(rectCharacter.X + rectCharacter.Width - 1, rectCharacter.Y + rectCharacter.Height/2.)); brush = pBrush; } if (Painter::c_BrushTypePathGradient2 == m_brush.Type) { /* // beg variant 1 PathGradientBrush* pBrush = new PathGradientBrush(&path); Color colors1[] = {color1, color2, color2, color1}; Color colors2[] = {color2, color1, color1, color2}; if (index%2 == 0) { pBrush->SetSurroundColors(colors1, &k); pBrush->SetCenterColor(color1); } if (index%2 == 1) { pBrush->SetSurroundColors(colors2, &k); pBrush->SetCenterColor(color2); } // end variant 1 // beg variant 2 // LinearGradientBrush* pBrush = new Gdiplus::LinearGradientBrush(rectCharacter, color1, color2, LinearGradientModeHorizontal); // Status s = pBrush->SetWrapMode(WrapModeClamp); // end variant 2 // beg variant 3 // LinearGradientBrush* pBrush = new Gdiplus::LinearGradientBrush(rectCharacter, brushColor1, brushColor2, -180.F); // pBrush->SetBlendBellShape(0.50f); // Status s = pBrush->SetWrapMode(WrapModeClamp); // end variant 3 // beg variant 4 gradient horizontal Color colors[] = {color1, color2, color2, color1}; PathGradientBrush* pBrush = new PathGradientBrush(&path); pBrush->SetSurroundColors(colors, &k); pBrush->SetCenterColor(color1); pBrush->SetCenterPoint(PointF(rectCharacter.X, rectCharacter.Y + rectCharacter.Height/2.)); // end variant 4 */ // beg variant 5 LinearGradientBrush* pBrush = new Gdiplus::LinearGradientBrush(rectCharacter, color1, color2, LinearGradientModeHorizontal); Status s = pBrush->SetWrapMode(WrapModeTileFlipX); // end variant 5 /* Color colors[] = {color2, color2, color2, color2}; PathGradientBrush* pBrush = new PathGradientBrush(&path); pBrush->SetSurroundColors(colors, &k); pBrush->SetCenterColor(color1); */ brush = pBrush; } return brush; } void DrawPathGradientText(Graphics* graph, BSTR Text, int length, RectF& rectDraw, RectF& StringBox) { Font* myFont = m_font.GetFont(); StringFormat* myStringFormat = m_format.GetStringFormat(); Gdiplus::Color color1((BYTE)m_brush.Alpha1, GetRValue(m_brush.Color1), GetGValue(m_brush.Color1), GetBValue(m_brush.Color1)); Gdiplus::Color color2((BYTE)m_brush.Alpha2, GetRValue(m_brush.Color2), GetGValue(m_brush.Color2), GetBValue(m_brush.Color2)); GraphicsPath path; for(int index = 0; index < length; index++) { // get rect of current(index) character RectF rectCharacter; Painter::GetRectCurrentCharacter(graph, myStringFormat, myFont, Text, length, index, StringBox, rectCharacter); // create path for rect and brush path.AddRectangle(rectCharacter); Brush* pBrush = CreateBrush(path, color1, color2, index, rectCharacter); // draw text // rectCharacter.Height = rectDraw.Height; // rectCharacter.Y = rectDraw.Y; // graph->DrawString(Text+index, 1, myFont, rectCharacter, myStringFormat, pBrush); graph->DrawString(Text, length, myFont, rectDraw, myStringFormat, pBrush); // graph->FillRectangle(pBrush, rectDraw); // Pen blackPen(Color(255, 0, 0, 0), 3); // graph->DrawRectangle(&blackPen, rectCharacter); // graph->FillRectangle(myBrush, rectCharacter); // delete brush and reset path if (pBrush) delete pBrush; path.Reset(); } } Bitmap* CreateBitmap(int nWidth, int nHeight, BYTE* pPixels) { if (!pPixels || nWidth < 2 || nHeight < 2) return NULL; // variables BITMAPINFO info; // prepare header for the image info.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); info.bmiHeader.biWidth = nWidth; info.bmiHeader.biHeight = nHeight; info.bmiHeader.biBitCount = 32; info.bmiHeader.biPlanes = 1; info.bmiHeader.biClrImportant = 0; info.bmiHeader.biClrUsed = 0; info.bmiHeader.biCompression = 0; info.bmiHeader.biXPelsPerMeter = 0; info.bmiHeader.biYPelsPerMeter = 0; info.bmiHeader.biSizeImage = 0; return new Bitmap(&info, pPixels); } Bitmap* CreateBitmap(void** Image, BOOL bArray, ImageStudio::Core::MediaData& oMediaData) { if (!Image || !*Image) return NULL; // create bitmap int nWidth = 0; int nHeight = 0; BYTE* pPixels = 0; if (bArray) { int nChannels = 0; pPixels = ImageStudioUtils::ExtractImage((SAFEARRAY**)Image, nWidth, nHeight, nChannels); if (nChannels != 4) return NULL; } else { if (!oMediaData.Create(*(IUnknown**)Image, FALSE) || !oMediaData.IsValidBGRA()) return NULL; nWidth = oMediaData.GetWidth(); nHeight = oMediaData.GetHeight(); pPixels = oMediaData.GetBuffer(); *Image = oMediaData.GetMediaData(TRUE); } if (!pPixels) return NULL; return CreateBitmap(nWidth, nHeight, pPixels); } void Draw(void** Image, BSTR Text, long Left, long Top, long Right, long Bottom, BOOL bArray = TRUE) { // create bitmap ImageStudio::Core::MediaData oMediaData; Bitmap* pBitmap = CreateBitmap(Image, bArray, oMediaData); if (!pBitmap) return; // create graphics Graphics* Gr = new Graphics(pBitmap); Gr->SetTextRenderingHint(TextRenderingHintAntiAlias); Gr->SetSmoothingMode(SmoothingModeAntiAlias); RectF rectDraw((REAL)Left, (REAL)Top, (REAL)(Right - Left), (REAL)(Bottom - Top)); // get lenght of string CString sText; sText = Text; int len = sText.GetLength(); // get bound rect for string RectF StringBox; Font* myFont = m_font.GetFont(); StringFormat* myStringFormat = m_format.GetStringFormat(); Gr->MeasureString(Text, len, myFont, rectDraw, myStringFormat, &StringBox); // apply rotation of the image around center ponit Matrix oTransform; oTransform.Reset(); PointF oTransformCenterPoint(StringBox.X + StringBox.Width/2, StringBox.Y + StringBox.Height/2); oTransform.RotateAt(m_nRotateAngle, oTransformCenterPoint); Gr->SetTransform(&oTransform); // draw shadow m_shadow.Draw(Gr, myFont, myStringFormat, Text, len, rectDraw); // draw edge m_edge.Draw(Gr, myFont, myStringFormat, Text, len, rectDraw); // draw the text if ((Painter::c_BrushTypePathGradient1 != m_brush.Type) && (Painter::c_BrushTypePathGradient2 != m_brush.Type)) { Brush* myBrush = m_brush.GetBrush(&m_textures, &StringBox); Gr->DrawString(Text, len, myFont, rectDraw, myStringFormat, myBrush); } else DrawPathGradientText(Gr, Text, len, rectDraw, StringBox); // delete bitmap if (Gr) delete Gr; if (pBitmap) delete pBitmap; } void DrawEllipse(void** Image, BSTR Text, long Left, long Top, long Right, long Bottom, double StartAngle, double SweepAngle, BOOL bArray = TRUE) { // create bitmap ImageStudio::Core::MediaData oMediaData; Bitmap* pBitmap = CreateBitmap(Image, bArray, oMediaData); if (!pBitmap) return; // create graphics Graphics* Gr = new Graphics(pBitmap); Gr->SetTextRenderingHint(TextRenderingHintAntiAlias); Gr->SetSmoothingMode(SmoothingModeAntiAlias); // get lenght of string CString sText; sText = Text; int len = sText.GetLength(); // create ellipse path GraphicsPath path; path.AddArc((REAL)Left, (REAL)Top, (REAL)(Right - Left), (REAL)(Bottom - Top), (REAL)StartAngle, (REAL)SweepAngle); // draw ellipse text Font* font = m_font.GetFont(); CTextToPath tp(path); tp.SetAlignmentVertical(m_format.StringAlignmentVertical); tp.SetAlignmentHorizontal(m_format.StringAlignmentHorizontal); // tp.SetKerning(0.5); tp.DrawText(Gr, font, &m_brush, &m_textures, &m_edge, &m_shadow, Text, len); // tp.DrawLine(Gr); // delete bitmap if (Gr) delete Gr; if (pBitmap) delete pBitmap; } void DrawPolyline(void** Image, SAFEARRAY** Array, BSTR Text, BOOL bArray = TRUE) { // check Polyline if (!Array || !*Array) return; int nCount = (*Array)->rgsabound[0].cElements; if (nCount % 2 || nCount < 4) return; nCount /= 2; // create bitmap ImageStudio::Core::MediaData oMediaData; Bitmap* pBitmap = CreateBitmap(Image, bArray, oMediaData); if (!pBitmap) return; // create graphics Graphics* Gr = new Graphics(pBitmap); Gr->SetTextRenderingHint(TextRenderingHintAntiAlias); Gr->SetSmoothingMode(SmoothingModeAntiAlias); // get lenght of string CString sText; sText = Text; int len = sText.GetLength(); // variables PointF* pPoints = new PointF[nCount]; double* pDoubles = (double*)((*Array)->pvData); // compose array of points to draw for (int nIndex = 0; nIndex < nCount; ++nIndex, pDoubles += 2) { pPoints[nIndex].X = (REAL)pDoubles[0]; pPoints[nIndex].Y = (REAL)pDoubles[1]; } // create polyline path GraphicsPath path; path.AddCurve(pPoints, nCount); // draw polyline text Font* font = m_font.GetFont(); CTextToPath tp(path); tp.SetAlignmentVertical(m_format.StringAlignmentVertical); tp.SetAlignmentHorizontal(m_format.StringAlignmentHorizontal); // tp.SetKerning(0.5); tp.DrawText(Gr, font, &m_brush, &m_textures, &m_edge, &m_shadow, Text, len); // tp.DrawLine(Gr); // delete bitmap and points if (Gr) delete Gr; if (pBitmap) delete pBitmap; if (pPoints) delete pPoints; } // get font style void GetFontStyle(long fontStyle) { m_font.Bold = (fontStyle&1)? TRUE:FALSE; m_font.Italic = (fontStyle&2)? TRUE:FALSE; m_font.Underline = (fontStyle&4)? TRUE:FALSE; m_font.Strikeout = (fontStyle&8)? TRUE:FALSE; } public: // general STDMETHOD(Draw)(SAFEARRAY** Image, BSTR Text, long Left, long Top, long Right, long Bottom) { Draw((void**)Image, Text, Left, Top, Right, Bottom, TRUE); return S_OK; } STDMETHOD(DrawMedia)(IUnknown** Image, BSTR Text, long Left, long Top, long Right, long Bottom) { Draw((void**)Image, Text, Left, Top, Right, Bottom, FALSE); return S_OK; } STDMETHOD(DrawEllipse)(SAFEARRAY** Image, BSTR Text, long Left, long Top, long Right, long Bottom, double StartAngle, double SweepAngle) { DrawEllipse((void**)Image, Text, Left, Top, Right, Bottom, StartAngle, SweepAngle, TRUE); return S_OK; } STDMETHOD(DrawMediaEllipse)(IUnknown** Image, BSTR Text, long Left, long Top, long Right, long Bottom, double StartAngle, double SweepAngle) { DrawEllipse((void**)Image, Text, Left, Top, Right, Bottom, StartAngle, SweepAngle, FALSE); return S_OK; } STDMETHOD(DrawPolyline)(SAFEARRAY** Image, SAFEARRAY** Array, BSTR Text) { DrawPolyline((void**)Image, Array, Text, TRUE); return S_OK; } STDMETHOD(DrawMediaPolyline)(IUnknown** Image, SAFEARRAY** Array, BSTR Text) { DrawPolyline((void**)Image, Array, Text, FALSE); return S_OK; } STDMETHOD(SavePresets)(BSTR path) { try { // store current preset int nLastIndex = m_arrFormats.GetCount(); m_arrFormats.Add(); Gdiplus::Color brushColor1((BYTE)m_brush.Alpha1, GetRValue(m_brush.Color1), GetGValue(m_brush.Color1), GetBValue(m_brush.Color1)); Gdiplus::Color brushColor2((BYTE)m_brush.Alpha2, GetRValue(m_brush.Color2), GetGValue(m_brush.Color2), GetBValue(m_brush.Color2)); m_arrFormats[nLastIndex].m_nTextureAlpha = (BYTE)m_brush.TextureAlpha; m_arrFormats[nLastIndex].m_cShadowColor = Gdiplus::Color((BYTE)m_shadow.Alpha, GetRValue(m_shadow.Color), GetGValue(m_shadow.Color), GetBValue(m_shadow.Color)); m_arrFormats[nLastIndex].m_nShadowBlur = m_shadow.BlurSize; m_arrFormats[nLastIndex].m_nRotateAngle = m_nRotateAngle; m_arrFormats[nLastIndex].m_sTextureFilePath = m_brush.TexturePath; m_arrFormats[nLastIndex].m_bShadowVisible = m_shadow.Visible; m_arrFormats[nLastIndex].m_nEdgeVisible = m_edge.Visible; m_arrFormats[nLastIndex].m_nHatchType = m_brush.Type - Painter::c_BrushTypeHatch1; m_arrFormats[nLastIndex].m_cFontHatchColor2 = brushColor2; m_arrFormats[nLastIndex].m_cFontHatchColor1 = brushColor1; m_arrFormats[nLastIndex].m_cFontGradColor2 = brushColor2; m_arrFormats[nLastIndex].m_cFontGradColor1 = brushColor1; m_arrFormats[nLastIndex].m_cFontColor = brushColor1; m_arrFormats[nLastIndex].m_nEdgeDist = m_edge.Dist; m_arrFormats[nLastIndex].m_cEdgeColor = Gdiplus::Color((BYTE)m_edge.Alpha, GetRValue(m_edge.Color), GetGValue(m_edge.Color), GetBValue(m_edge.Color)); m_arrFormats[nLastIndex].m_nShadowDistanceY = m_shadow.DistanceY; m_arrFormats[nLastIndex].m_nShadowDistanceX = m_shadow.DistanceX; m_arrFormats[nLastIndex].m_nBrushFaceColorType = m_brush.Type; m_arrFormats[nLastIndex].m_nBrushFaceColorMode = m_brush.Type - Painter::c_BrushTypeHorizontal; m_arrFormats[nLastIndex].m_nAlignVertical = m_format.StringAlignmentVertical; m_arrFormats[nLastIndex].m_nAlignHorizontal = m_format.StringAlignmentHorizontal; m_arrFormats[nLastIndex].m_sCurrentPresetName = m_sCurrentPresetName; // add font Font* myFont = m_font.GetFont(); m_arrFormats[nLastIndex].m_sFontName = m_font.Name; m_arrFormats[nLastIndex].m_nFontSize = myFont->GetSize(); m_arrFormats[nLastIndex].m_nFontStyle = myFont->GetStyle(); // save all presets to file XmlUtils::CXmlWriter oXmlWriter; // open presets section oXmlWriter.WriteNodeBegin("presets"); // write presets for (int nIndex = 0; nIndex < m_arrFormats.GetCount(); nIndex++) oXmlWriter.WriteString(m_arrFormats[nIndex].ToXmlString()); // close presets section oXmlWriter.WriteNodeEnd("presets"); // write composed xml string to the file CString sFileXml(path); oXmlWriter.SaveToFile(sFileXml, TRUE); } catch (...) { return S_FALSE; } return S_OK; } STDMETHOD(LoadPresets)(BSTR path, VARIANT_BOOL append) { try { if (append == VARIANT_FALSE) m_arrFormats.RemoveAll(); XmlUtils::CXmlReader oXmlReader; if (!oXmlReader.OpenFromFile(CString(path))) return S_FALSE; oXmlReader.ReadRootNode("presets"); // all presets oXmlReader.ReadNodeList("preset"); for (int nIndex = 0; nIndex < oXmlReader.GetLengthList(); nIndex++) { m_arrFormats.Add(); int r = m_arrFormats.GetCount(); m_arrFormats[r - 1].FromXmlString(oXmlReader.ReadNodeXml(nIndex)); } } catch (...) { return S_FALSE; } return S_OK; } STDMETHOD(GetPresetCount)(LONG* count) { *count = m_arrFormats.GetCount(); return S_OK; } STDMETHOD(GetPresetName)(long index, BSTR* name) { if (index >= 0 && index < m_arrFormats.GetCount()) *name = m_arrFormats[index].m_sCurrentPresetName.AllocSysString(); else *name = L"error"; return S_OK; } STDMETHOD(DeletePreset)(BSTR path, long index) { try { XML::IXMLDOMDocumentPtr pDocument; pDocument.CreateInstance(CLSID_DOMDocument); if (NULL == pDocument) return S_FALSE; if (VARIANT_FALSE == pDocument->load(path)) return S_FALSE; XML::IXMLDOMElementPtr pRootNode = pDocument->selectSingleNode("presets"); if (NULL == pRootNode) return S_FALSE; XML::IXMLDOMNodeListPtr pNodeList = pRootNode->selectNodes("preset"); if (NULL == pNodeList || index < 0 || index >= pNodeList->Getlength()) return S_FALSE; XML::IXMLDOMNodePtr pNode = pNodeList->item[index]; if (NULL == pNode) return S_FALSE; pRootNode->removeChild(pNode); pDocument->save(path); } catch(...) { return S_FALSE; } return S_OK; } STDMETHOD(get_currentPresetName)(BSTR* pVal) { *pVal = m_sCurrentPresetName.AllocSysString(); return S_OK; } STDMETHOD(put_currentPresetName)(BSTR newVal) { m_sCurrentPresetName = newVal; return S_OK; } STDMETHOD(get_currentPresetIndex)(long* pVal) { *pVal = m_nCurentPresetIndex; return S_OK; } STDMETHOD(put_currentPresetIndex)(long newVal) { if (newVal < 0 || newVal >= m_arrFormats.GetCount()) return S_FALSE; m_nCurentPresetIndex = newVal; m_brush.TextureAlpha = m_arrFormats[m_nCurentPresetIndex].m_nTextureAlpha; Color shadowColor = m_arrFormats[m_nCurentPresetIndex].m_cShadowColor; m_shadow.Alpha = shadowColor.GetA(); m_shadow.Color = RGB(shadowColor.GetR(), shadowColor.GetG(), shadowColor.GetB()); m_shadow.BlurSize = m_arrFormats[m_nCurentPresetIndex].m_nShadowBlur; m_nRotateAngle = m_arrFormats[m_nCurentPresetIndex].m_nRotateAngle; m_brush.TexturePath = m_arrFormats[m_nCurentPresetIndex].m_sTextureFilePath; m_shadow.Visible = m_arrFormats[m_nCurentPresetIndex].m_bShadowVisible; m_edge.Visible = m_arrFormats[m_nCurentPresetIndex].m_nEdgeVisible; m_edge.Dist = m_arrFormats[m_nCurentPresetIndex].m_nEdgeDist; Color edgeColor = m_arrFormats[m_nCurentPresetIndex].m_cEdgeColor; m_edge.Alpha = edgeColor.GetA(); m_edge.Color = RGB(edgeColor.GetR(), edgeColor.GetG(), edgeColor.GetB()); m_shadow.DistanceY = m_arrFormats[m_nCurentPresetIndex].m_nShadowDistanceY; m_shadow.DistanceX = m_arrFormats[m_nCurentPresetIndex].m_nShadowDistanceX; m_brush.Type = Painter::ConstantCompatible(m_arrFormats[m_nCurentPresetIndex].m_nBrushFaceColorType); // int hatchType = m_arrFormats[m_nCurentPresetIndex].hatchType; // int brushFaceColorMode = m_arrFormats[m_nCurentPresetIndex].brushFaceColorMode; m_format.StringAlignmentVertical = m_arrFormats[m_nCurentPresetIndex].m_nAlignVertical; m_format.StringAlignmentHorizontal = m_arrFormats[m_nCurentPresetIndex].m_nAlignHorizontal; m_sCurrentPresetName = m_arrFormats[m_nCurentPresetIndex].m_sCurrentPresetName; // add font m_font.Name = m_arrFormats[m_nCurentPresetIndex].m_sFontName; m_font.Size = m_arrFormats[m_nCurentPresetIndex].m_nFontSize; GetFontStyle(m_arrFormats[m_nCurentPresetIndex].m_nFontStyle); // retrieve brush color if ((m_brush.Type >= Painter::c_BrushTypeHorizontal && m_brush.Type <= Painter::c_BrushTypeDiagonal2) || (m_brush.Type == Painter::c_BrushTypeCenter)) { m_brush.Color1 = RGB(m_arrFormats[m_nCurentPresetIndex].m_cFontGradColor1.GetR(), m_arrFormats[m_nCurentPresetIndex].m_cFontGradColor1.GetG(), m_arrFormats[m_nCurentPresetIndex].m_cFontGradColor1.GetB()); m_brush.Alpha1 = m_arrFormats[m_nCurentPresetIndex].m_cFontGradColor1.GetA(); m_brush.Color2 = RGB(m_arrFormats[m_nCurentPresetIndex].m_cFontGradColor2.GetR(), m_arrFormats[m_nCurentPresetIndex].m_cFontGradColor2.GetG(), m_arrFormats[m_nCurentPresetIndex].m_cFontGradColor2.GetB()); m_brush.Alpha2 = m_arrFormats[m_nCurentPresetIndex].m_cFontGradColor2.GetA(); } else if (m_brush.Type >= Painter::c_BrushTypeHatch1 && m_brush.Type <= Painter::c_BrushTypeHatch53) { m_brush.Color1 = RGB(m_arrFormats[m_nCurentPresetIndex].m_cFontHatchColor1.GetR(), m_arrFormats[m_nCurentPresetIndex].m_cFontHatchColor1.GetG(), m_arrFormats[m_nCurentPresetIndex].m_cFontHatchColor1.GetB()); m_brush.Alpha1 = m_arrFormats[m_nCurentPresetIndex].m_cFontHatchColor1.GetA(); m_brush.Color2 = RGB(m_arrFormats[m_nCurentPresetIndex].m_cFontHatchColor2.GetR(), m_arrFormats[m_nCurentPresetIndex].m_cFontHatchColor2.GetG(), m_arrFormats[m_nCurentPresetIndex].m_cFontHatchColor2.GetB()); m_brush.Alpha2 = m_arrFormats[m_nCurentPresetIndex].m_cFontHatchColor2.GetA(); } else // if (m_brush.Type == Painter::c_BrushTypeSolid) { m_brush.Color1 = RGB(m_arrFormats[m_nCurentPresetIndex].m_cFontColor.GetR(), m_arrFormats[m_nCurentPresetIndex].m_cFontColor.GetG(), m_arrFormats[m_nCurentPresetIndex].m_cFontColor.GetB()); m_brush.Alpha1 = m_arrFormats[m_nCurentPresetIndex].m_cFontColor.GetA(); m_brush.Color2 = RGB(m_arrFormats[m_nCurentPresetIndex].m_cFontColor.GetR(), m_arrFormats[m_nCurentPresetIndex].m_cFontColor.GetG(), m_arrFormats[m_nCurentPresetIndex].m_cFontColor.GetB()); m_brush.Alpha2 = m_arrFormats[m_nCurentPresetIndex].m_cFontColor.GetA(); } Clear(); return S_OK; } // brush 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)(long* pVal) { *pVal = m_brush.Alpha1; return S_OK; } STDMETHOD(put_brushAlpha1)(long newVal) { m_brush.Alpha1 = newVal; m_brush.Update(); return S_OK; } STDMETHOD(get_brushAlpha2)(long* pVal) { *pVal = m_brush.Alpha2; return S_OK; } STDMETHOD(put_brushAlpha2)(long newVal) { m_brush.Alpha2 = newVal; m_brush.Update(); return S_OK; } STDMETHOD(get_brushTexturePath)(BSTR* val) { *val = m_brush.TexturePath.AllocSysString(); return S_OK; } STDMETHOD(put_brushTexturePath)(BSTR val) { CString path(val); 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)(long* val) { *val = m_brush.TextureAlpha; return S_OK; } STDMETHOD(put_brushTextureAlpha)(long val) { m_brush.TextureAlpha = val; 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; } STDMETHOD(put_brushTexture)(BSTR bstrName, SAFEARRAY** Image) { CString Name(bstrName); Name.MakeLower(); int index = m_textures.Add(Name, *Image); if (index < 0) return S_OK; m_brush.TexturePath = Name; m_brush.Update(); return S_OK; } // font 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)(DOUBLE* pVal) { *pVal = m_font.Size; return S_OK; } STDMETHOD(put_fontSize)(DOUBLE newVal) { m_font.Size = newVal; m_font.Update(); 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; } // formats STDMETHOD(get_formatAlignVertical)(long* pVal) { *pVal = m_format.StringAlignmentVertical; return S_OK; } STDMETHOD(put_formatAlignVertical)(long newVal) { m_format.StringAlignmentVertical = newVal; m_format.Update(); return S_OK; } STDMETHOD(get_formatAlignHorizontal)(long* pVal) { *pVal = m_format.StringAlignmentHorizontal; return S_OK; } STDMETHOD(put_formatAlignHorizontal)(long newVal) { m_format.StringAlignmentHorizontal = newVal; m_format.Update(); return S_OK; } STDMETHOD(get_formatRotate)(long* pVal) { *pVal = m_nRotateAngle; return S_OK; } STDMETHOD(put_formatRotate)(long newVal) { m_nRotateAngle = newVal; return S_OK; } // shadows 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)(long* pVal) { *pVal = m_shadow.Alpha; return S_OK; } STDMETHOD(put_shadowAlpha)(long 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; } // edges 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)(long* pVal) { *pVal = m_edge.Alpha; return S_OK; } STDMETHOD(put_edgeAlpha)(long newVal) { m_edge.Alpha = newVal; m_edge.Update(); 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_format.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_format.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_format.Write(stream); m_shadow.Write(stream); m_edge.Write(stream); return S_OK; } };