EmbroideryReader/embroideryThumbs/PESThumbnail.cs

203 wiersze
6.4 KiB
C#

/*
Embroidery Reader - an application to view .pes embroidery designs
Copyright (C) 2016 Nathan Crawford
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
02111-1307, USA.
A copy of the full GPL 2 license can be found in the docs directory.
You can contact me at http://www.njcrawford.com/contact/.
*/
using System;
using System.Text;
using System.Runtime.InteropServices;
namespace embroideryThumbs
{
//[Guid("69EA0D51-1BD4-4c6e-9AE0-B13C915A59E3")]
//public interface EmbThumbnailInterface
//{
// //COM visible function go here
//}
[StructLayout(LayoutKind.Sequential)]
public struct SIZE
{
public int cx;
public int cy;
public SIZE(int cx, int cy)
{
this.cx = cx;
this.cy = cy;
}
}
[ComImport, Guid("0000010c-0000-0000-c000-000000000046"),
InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IPersist
{
[PreserveSig]
void GetClassID(out Guid pClassID);
}
[ComImport, Guid("0000010b-0000-0000-C000-000000000046"),
InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IPersistFile : IPersist
{
//new void GetClassID(out Guid pClassID);
[PreserveSig]
int IsDirty();
[PreserveSig]
void Load([In, MarshalAs(UnmanagedType.LPWStr)]
string pszFileName, uint dwMode);
[PreserveSig]
void Save([In, MarshalAs(UnmanagedType.LPWStr)] string pszFileName,
[In, MarshalAs(UnmanagedType.Bool)] bool fRemember);
[PreserveSig]
void SaveCompleted([In, MarshalAs(UnmanagedType.LPWStr)] string pszFileName);
[PreserveSig]
void GetCurFile([In, MarshalAs(UnmanagedType.LPWStr)] string ppszFileName);
}
[ComImportAttribute()]
[GuidAttribute("BB2E617C-0920-11d1-9A0B-00C04FC2D6C1")]
[InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]
interface IExtractImage
{
void GetLocation(
[Out, MarshalAs(UnmanagedType.LPWStr)]
StringBuilder pszPathBuffer,
int cch,
ref int pdwPriority,
ref SIZE prgSize,
int dwRecClrDepth,
ref int pdwFlags);
void Extract(out IntPtr phBmpThumbnail);
}
//[Guid("xxxx"),
//InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
//public interface IExtractImage2
//{
// // from IExtractImage
// void Extract();
// void GetLocation();
// HRESULT GetDateStamp([Out] System.Runtime.InteropServices.ComTypes.FILETIME* pDateStamp);
//}
[Guid("EA7D5329-E9D7-49fb-9F55-A12D1A2ADB5D"),
InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface EmbThumbnailEvents
{
}
[Guid("7E3EF3E8-39D4-4150-9EFF-58C71A1F4F9E"),
ClassInterface(ClassInterfaceType.None),
ComSourceInterfaces(typeof(EmbThumbnailEvents))]
public class EmbThumbnail : IPersistFile, IExtractImage
{
PesFile.PesFile designFile;
public void GetClassID(out Guid pClassID)
{
System.IO.StreamWriter logfile = new System.IO.StreamWriter("C:\thumbs-log.txt", true);
logfile.WriteLine("Called GetClassID");
logfile.Close();
// not implemented, but won't compile without this
pClassID = new Guid("7E3EF3E8-39D4-4150-9EFF-58C71A1F4F9E");
}
public int IsDirty()
{
return 0;
}
public void Load([In, MarshalAs(UnmanagedType.LPWStr)] string pszFileName, uint dwMode)
{
System.IO.StreamWriter logfile = new System.IO.StreamWriter("C:\thumbs-log.txt", true);
logfile.WriteLine("Called Load filename: " + pszFileName);
logfile.Close();
if(pszFileName.Substring(pszFileName.Length - 4).ToLower() == ".pes")
{
designFile = new PesFile.PesFile(pszFileName);
}
}
public void Save([In, MarshalAs(UnmanagedType.LPWStr)] string pszFileName, [In, MarshalAs(UnmanagedType.Bool)] bool fRemember)
{
//not implemented
}
public void SaveCompleted([In, MarshalAs(UnmanagedType.LPWStr)] string pszFileName)
{
//not implemented
}
public void GetCurFile([In, MarshalAs(UnmanagedType.LPWStr)] string ppszFileName)
{
//not implemented
}
public void GetLocation([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszPathBuffer, int cch, ref int pdwPriority, ref SIZE prgSize, int dwRecClrDepth, ref int pdwFlags)
{
//not implemented
}
public unsafe void Extract(out IntPtr phBmpThumbnail)
{
System.IO.StreamWriter logfile = new System.IO.StreamWriter("C:\thumbs-log.txt", true);
logfile.WriteLine("Called Extract");
logfile.Close();
System.Drawing.Bitmap designBitmap = designFile.DesignToBitmap(3, false, 0, 1.0f);
IntPtr hBmp = designBitmap.GetHbitmap();
phBmpThumbnail = new IntPtr();
// Assuming you already have hBmp as the handle to your Bitmap object...
if (IntPtr.Size == 4)
{
int* pBuffer = (int*)phBmpThumbnail.ToPointer();
*pBuffer = hBmp.ToInt32();
// IMO, casting back to (void*) is not necessary.
// I guess just for formality, that pBuffer points
// to an object, not an int. :)
phBmpThumbnail = new IntPtr((void*)pBuffer);
}
else // 8-bytes, or 64-bit
{
long* pBuffer = (long*)phBmpThumbnail.ToPointer();
*pBuffer = hBmp.ToInt64();
phBmpThumbnail = new IntPtr((void*)pBuffer);
}
}
}
}