00001
00002
00003
00004
00005
00006 #include "stdafx.h"
00007 #include "vmsImage.h"
00008 #include "vmsAnimatedGIF.h"
00009
00010 #ifdef _DEBUG
00011 #undef THIS_FILE
00012 static char THIS_FILE[]=__FILE__;
00013 #define new DEBUG_NEW
00014 #endif
00015
00016 vmsImage::vmsImage()
00017 {
00018 m_pImage = NULL;
00019 }
00020
00021 vmsImage::~vmsImage()
00022 {
00023 Free ();
00024 }
00025
00026 HRESULT vmsImage::Load(LPCSTR pszFile)
00027 {
00028 Free ();
00029
00030 char szFile [10000];
00031 if (pszFile [1] != ':')
00032 {
00033 GetCurrentDirectory (sizeof (szFile), szFile);
00034 lstrcat (szFile, "\\");
00035 lstrcat (szFile, pszFile);
00036 pszFile = szFile;
00037 }
00038
00039 vmsAnimatedGIF gif;
00040 if (gif.Load (pszFile))
00041 {
00042 char szTemp [MY_MAX_PATH];
00043 strcpy (szTemp, pszFile);
00044 int l = lstrlen (szTemp) - 4 - 1;
00045 strcpy (szTemp + l, "(%d).gif");
00046 int cFrames = gif.SaveGIFFrames (szTemp);
00047 for (int i = 0; i < cFrames; i++)
00048 {
00049 char sz [MY_MAX_PATH];
00050 wsprintf (sz, szTemp, i);
00051 m_vFrames.push_back (LoadImage (sz));
00052 m_vFrameDelays.push_back (gif.get_FrameInfo (i)->m_nDelay);
00053 m_vFrameDisps.push_back (gif.get_FrameInfo (i)->m_nDisposal);
00054 DeleteFile (sz);
00055 }
00056
00057 m_pImage = m_vFrames [0];
00058 }
00059 else
00060 {
00061 m_pImage = LoadImage (pszFile);
00062 }
00063
00064 return S_OK;
00065 }
00066
00067 void vmsImage::Free()
00068 {
00069 if (m_vFrames.size () != 0)
00070 {
00071 m_pImage = NULL;
00072 for (int i = 0; i < (int)m_vFrames.size (); i++)
00073 m_vFrames [i]->Release ();
00074 m_vFrames.clear ();
00075 }
00076 else if (m_pImage)
00077 {
00078 m_pImage->Release ();
00079 m_pImage = NULL;
00080 }
00081 }
00082
00083 CSize vmsImage::get_Size()
00084 {
00085 DWORD dw;
00086 SIZE size;
00087 m_pImage->GetStateInfo (&dw, &size, FALSE);
00088 return size;
00089 }
00090
00091 void vmsImage::Draw(HDC dc, RECT &rc)
00092 {
00093 ULONG lC = IMGCHG_ANIMATE;
00094 lC |= 0x5 << 4;
00095 m_pImage->SelectChanges (lC, 0, FALSE);
00096
00097 m_pImage->Draw (dc, &rc);
00098 }
00099
00100 BOOL vmsImage::is_Loaded()
00101 {
00102 if (m_pImage == NULL)
00103 return FALSE;
00104
00105 DWORD dw;
00106 m_pImage->GetStateInfo (&dw, NULL, FALSE);
00107 return (dw & IMGLOAD_COMPLETE) != 0;
00108 }
00109
00110 IImgCtx* vmsImage::LoadImage(LPCSTR pszFile)
00111 {
00112 IImgCtx* pImage = NULL;
00113
00114 HRESULT hr = CoCreateInstance (CLSID_IImgCtx, NULL, CLSCTX_ALL,
00115 IID_IImgCtx, (void**)&pImage);
00116 if (FAILED (hr))
00117 return NULL;
00118
00119 char szPath [MY_MAX_PATH];
00120 strcpy (szPath, "file://");
00121 strcat (szPath, pszFile);
00122 LPSTR psz = szPath;
00123 while (*psz)
00124 {
00125 if (*psz == '\\')
00126 *psz = '/';
00127 psz++;
00128 }
00129
00130 wchar_t wszPath [MY_MAX_PATH];
00131 MultiByteToWideChar (CP_ACP, 0, szPath, lstrlen (szPath), wszPath, MY_MAX_PATH);
00132 wszPath [lstrlen (szPath)] = 0;
00133
00134 hr = pImage->Load (wszPath, 0);
00135 if (FAILED (hr))
00136 {
00137 pImage->Release ();
00138 return NULL;
00139 }
00140
00141 DWORD dwState;
00142 do {
00143
00144 hr = pImage->GetStateInfo (&dwState, NULL, FALSE);
00145 if (FAILED (hr))
00146 {
00147 pImage->Release ();
00148 return NULL;
00149 }
00150 if (dwState & IMGLOAD_LOADING)
00151 Sleep (10);
00152
00153 } while(IMGLOAD_LOADING & dwState);
00154
00155 if ((dwState & IMGLOAD_COMPLETE) == 0)
00156 {
00157 pImage->Release ();
00158 return NULL;
00159 }
00160
00161 return pImage;
00162 }
00163
00164 int vmsImage::get_FrameCount()
00165 {
00166 return m_vFrames.size ();
00167 }
00168
00169 void vmsImage::set_CurrentFrame(int iIndex)
00170 {
00171 if ((int)m_vFrames.size () > iIndex)
00172 m_pImage = m_vFrames [iIndex];
00173 }
00174
00175 UINT vmsImage::get_FrameDelay (int iIndex)
00176 {
00177 return m_vFrameDelays [iIndex];
00178 }
00179
00180 int vmsImage::get_FrameDisp(int iIndex)
00181 {
00182 return m_vFrameDisps [iIndex];
00183 }