XTPOffice2007Image.cpp
上传用户:szled88
上传日期:2015-04-09
资源大小:43957k
文件大小:27k
源码类别:

对话框与窗口

开发平台:

Visual C++

  1. // XTPOffice2007Image.cpp: implementation of the CXTPOffice2007Image class.
  2. //
  3. // This file is a part of the XTREME TOOLKIT PRO MFC class library.
  4. // (c)1998-2008 Codejock Software, All Rights Reserved.
  5. //
  6. // THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
  7. // RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
  8. // CONSENT OF CODEJOCK SOFTWARE.
  9. //
  10. // THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
  11. // IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
  12. // YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
  13. // SINGLE COMPUTER.
  14. //
  15. // CONTACT INFORMATION:
  16. // support@codejock.com
  17. // http://www.codejock.com
  18. //
  19. /////////////////////////////////////////////////////////////////////////////
  20. #include "stdafx.h"
  21. #include "XTPImageManager.h"
  22. #include "XTPColorManager.h"
  23. #include "XTPResourceManager.h"
  24. #include "XTPDrawHelpers.h"
  25. #include "XTPVC50Helpers.h"
  26. #include "XTPVC80Helpers.h"
  27. #include "XTPOffice2007Image.h"
  28. #include "XTPNotifyConnection.h"
  29. #ifdef _DEBUG
  30. #undef THIS_FILE
  31. static char THIS_FILE[]=__FILE__;
  32. #define new DEBUG_NEW
  33. #endif
  34. #define TILE_VERTICAL     1
  35. #define TILE_HORIZONTAL   2
  36. #define TILE_ALL          3
  37. //---------------------------------------------------------------------------
  38. //    Should be a prime number:
  39. // 37, 53, 79 , 101, 127, 199, 503, 1021, 1511, 2003, 3001, 4001, 5003, 6007, 8009, 12007, 16001, 32003, 48017, 64007
  40. #define XTP_OFFICE2007_IMAGES_HASH_TABLE_SIZE 199
  41. IMPLEMENT_DYNCREATE(CXTPOffice2007ImageList, CCmdTarget)
  42. //////////////////////////////////////////////////////////////////////
  43. // Construction/Destruction
  44. //////////////////////////////////////////////////////////////////////
  45. CXTPOffice2007Image::CXTPOffice2007Image(CXTPOffice2007Images* pImages)
  46. {
  47. m_bAlpha = FALSE;
  48. m_bInvert = FALSE;
  49. m_bMultiply = FALSE;
  50. m_szExtent = CSize(0, 0);
  51. m_bImageOrientaionPreserved = FALSE;
  52. m_pImages = pImages;
  53. m_pBits = NULL;
  54. }
  55. CXTPOffice2007Image::~CXTPOffice2007Image()
  56. {
  57. if (m_pBits != NULL)
  58. {
  59. free(m_pBits);
  60. }
  61. }
  62. BOOL CXTPOffice2007Image::ConvertToBits(HBITMAP hBitmap)
  63. {
  64. CDC dcSrc;
  65. dcSrc.CreateCompatibleDC(NULL);
  66. LPVOID pBits = NULL;
  67. if (m_bAlpha)
  68. {
  69. BITMAPINFO  bmi;
  70. memset(&bmi, 0, sizeof(bmi));
  71. bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
  72. if (GetDIBits(dcSrc, hBitmap, 0, 0, NULL, (BITMAPINFO*)&bmi, DIB_RGB_COLORS) == 0)
  73. return FALSE;
  74. if (bmi.bmiHeader.biBitCount != 32)
  75. return FALSE;
  76. int nSize = bmi.bmiHeader.biHeight * bmi.bmiHeader.biWidth * 4;
  77. pBits = malloc(nSize);
  78. if (pBits == NULL)
  79. return FALSE;
  80. PBITMAPINFO pBitmapInfo = (PBITMAPINFO)malloc(sizeof(BITMAPINFOHEADER) + 3 * sizeof(COLORREF));
  81. if (pBitmapInfo == NULL)
  82. {
  83. free(pBits);
  84. return FALSE;
  85. }
  86. MEMCPY_S(pBitmapInfo, &bmi, sizeof(BITMAPINFOHEADER));
  87. if (GetDIBits(dcSrc, hBitmap, 0, bmi.bmiHeader.biHeight, pBits, pBitmapInfo, DIB_RGB_COLORS) == NULL)
  88. {
  89. free(pBits);
  90. free(pBitmapInfo);
  91. return FALSE;
  92. }
  93. free(pBitmapInfo);
  94. }
  95. else
  96. {
  97. LPDWORD lpBits = NULL;
  98. HBITMAP hDCBitmap = CXTPImageManager::Create32BPPDIBSection(NULL, m_szExtent.cx, m_szExtent.cy, (LPBYTE*)&lpBits);
  99. if (!lpBits)
  100. return FALSE;
  101. HBITMAP hOldBitmap = (HBITMAP)::SelectObject(dcSrc, hDCBitmap);
  102. dcSrc.DrawState(CPoint(0, 0), m_szExtent, hBitmap, DSS_NORMAL, 0);
  103. ::SelectObject(dcSrc, hOldBitmap);
  104. int nSize = m_szExtent.cx * m_szExtent.cy * 4;
  105. pBits = malloc(nSize);
  106. if (!pBits)
  107. return FALSE;
  108. MEMCPY_S(pBits, lpBits, nSize);
  109. DeleteObject(hDCBitmap);
  110. }
  111. ASSERT(pBits);
  112. m_pBits = pBits;
  113. return TRUE;
  114. }
  115. void CXTPOffice2007Image::SetBitmap(HBITMAP hBitmap, BOOL bAlpha /*= FALSE*/)
  116. {
  117. ASSERT(m_pBits == NULL);
  118. m_bAlpha = bAlpha;
  119. m_bInvert = FALSE;
  120. m_bMultiply = FALSE;
  121. BITMAP bmpInfo;
  122. if (!GetObject(hBitmap, sizeof(BITMAP), &bmpInfo))
  123. return;
  124. m_szExtent = CSize(bmpInfo.bmWidth, bmpInfo.bmHeight);
  125. VERIFY(ConvertToBits(hBitmap));
  126. DeleteObject(hBitmap);
  127. }
  128. BOOL CXTPOffice2007Image::LoadFile(HMODULE hModule, LPCTSTR lpszBitmapFileName)
  129. {
  130. m_bMultiply = FALSE;
  131. m_bInvert = FALSE;
  132. m_bAlpha = FALSE;
  133. if (m_pBits)
  134. {
  135. free(m_pBits);
  136. m_pBits = NULL;
  137. }
  138. if (!hModule)
  139. return FALSE;
  140. BOOL bAlpha = FALSE;
  141. HBITMAP hBmp = CXTPImageManagerIcon::LoadBitmapFromResource(hModule, lpszBitmapFileName, &bAlpha);
  142. if (!hBmp)
  143. return FALSE;
  144. SetBitmap(hBmp, bAlpha);
  145. return TRUE;
  146. }
  147. void CXTPOffice2007Image::Premultiply()
  148. {
  149. if (!m_bAlpha || !m_pBits || m_bMultiply)
  150. return;
  151. RGBQUAD* lprgbBitmap = (RGBQUAD*)m_pBits;
  152. int nCount = m_szExtent.cx * m_szExtent.cy;
  153. for (int i = 0; i < nCount; i++)
  154. {
  155. int nAlpha = lprgbBitmap->rgbReserved;
  156. lprgbBitmap->rgbBlue = BYTE(lprgbBitmap->rgbBlue * nAlpha / 255);
  157. lprgbBitmap->rgbGreen = BYTE(lprgbBitmap->rgbGreen * nAlpha / 255);
  158. lprgbBitmap->rgbRed = BYTE(lprgbBitmap->rgbRed * nAlpha / 255);
  159. lprgbBitmap++;
  160. }
  161. m_bMultiply = TRUE;
  162. }
  163. void CXTPOffice2007Image::InvertBitmap()
  164. {
  165. if (!m_bAlpha || !m_pBits)
  166. return;
  167. DWORD* pDest = (DWORD*)malloc(m_szExtent.cx * m_szExtent.cy * 4);
  168. DWORD* pDestOrig = pDest;
  169. DWORD* pBits = (DWORD*)m_pBits;
  170. for (int y = 0; y < m_szExtent.cy; y++)
  171. {
  172. DWORD* pBitsRow = &pBits[y * m_szExtent.cx + m_szExtent.cx - 1];
  173. for (int x = 0; x < m_szExtent.cx; x++)
  174. {
  175. *pDest++ = *pBitsRow--;
  176. }
  177. }
  178. free(m_pBits);
  179. m_pBits = pDestOrig;
  180. m_bInvert = !m_bInvert;
  181. }
  182. BOOL CXTPOffice2007Image::DrawImagePart(CDC* pDCDest, CRect rcDest, CDC* pDCSrc, CRect rcSrc) const
  183. {
  184. if (rcDest.Width() <= 0 || rcDest.Height() <= 0 || rcSrc.Width() <= 0 || rcSrc.Height() <= 0)
  185. return TRUE;
  186. BOOL bResult = TRUE;
  187. if (m_bAlpha)
  188. {
  189. bResult = XTPImageManager()->AlphaBlend(pDCDest->GetSafeHdc(), rcDest, pDCSrc->GetSafeHdc(), rcSrc);
  190. }
  191. else if ((rcSrc.Width() == rcDest.Width()) && (rcSrc.Height() == rcDest.Height()))
  192. {
  193. bResult = pDCDest->BitBlt(rcDest.left, rcDest.top, rcDest.Width(), rcDest.Height(),
  194. pDCSrc, rcSrc.left, rcSrc.top, SRCCOPY);
  195. }
  196. else
  197. {
  198. bResult = pDCDest->StretchBlt(rcDest.left, rcDest.top, rcDest.Width(), rcDest.Height(),
  199. pDCSrc, rcSrc.left, rcSrc.top, rcSrc.Width(), rcSrc.Height(), SRCCOPY);
  200. }
  201. return bResult;
  202. }
  203. void CXTPOffice2007Image::DrawImage(CDC* pDC, const CRect& rcDest, CRect rcSrc, const CRect& rcSizingMargins, COLORREF clrTransparent, DWORD dwFlags)
  204. {
  205. if (this == NULL)
  206. return;
  207. if (m_pBits == NULL)
  208. return;
  209. if (rcSizingMargins.top + rcSizingMargins.bottom > rcSrc.Height())
  210. return;
  211. if ((dwFlags & XTP_DI_COMPOSITE) == 0)
  212. {
  213. DrawImage(pDC, rcDest, rcSrc, rcSizingMargins, clrTransparent);
  214. return;
  215. }
  216. if (m_bAlpha)
  217. {
  218. DrawImage(pDC, rcDest, rcSrc, rcSizingMargins);
  219. return;
  220. }
  221. CSize sz(rcDest.Width(), rcDest.Height());
  222. CBitmap bmp;
  223. LPDWORD lpBits;
  224. bmp.Attach(CXTPImageManager::Create32BPPDIBSection(pDC->GetSafeHdc(), sz.cx, sz.cy, (LPBYTE*)&lpBits));
  225. CXTPCompatibleDC dc(pDC, &bmp);
  226. CRect rcDestOrig(0, 0, sz.cx, sz.cy);
  227. if (clrTransparent != COLORREF_NULL) dc.FillSolidRect(rcDestOrig, clrTransparent);
  228. DrawImage(&dc, rcDestOrig, rcSrc, rcSizingMargins);
  229. for (int i = 0; i < sz.cx * sz.cy; i++)
  230. {
  231. if (clrTransparent != COLORREF_NULL && lpBits[0] == clrTransparent)
  232. {
  233. lpBits[0] = 0;
  234. }
  235. else
  236. {
  237. lpBits[0] |= 0xFF000000;
  238. }
  239. lpBits++;
  240. }
  241. XTPImageManager()->AlphaBlend(*pDC, rcDest, dc, rcDestOrig);
  242. }
  243. void CXTPOffice2007Image::DrawImage(CDC* pDC, const CRect& rcDest, CRect rcSrc, const CRect& rcSizingMargins, COLORREF clrTransparent)
  244. {
  245. if (this == NULL)
  246. return;
  247. if (m_pBits == NULL)
  248. return;
  249. if (rcSizingMargins.top + rcSizingMargins.bottom > rcSrc.Height())
  250. return;
  251. if (clrTransparent == COLORREF_NULL || m_bAlpha)
  252. {
  253. DrawImage(pDC, rcDest, rcSrc, rcSizingMargins);
  254. return;
  255. }
  256. CBitmap bmp;
  257. bmp.CreateCompatibleBitmap(pDC, rcDest.Width(), rcDest.Height());
  258. CXTPCompatibleDC dc(pDC, &bmp);
  259. //dc.SetLayout(0);
  260. CRect rcDestOrig(0, 0, rcDest.Width(), rcDest.Height());
  261. dc.FillSolidRect(rcDestOrig, clrTransparent);
  262. DrawImage(&dc, rcDestOrig, rcSrc, rcSizingMargins);
  263. XTPImageManager()->TransparentBlt(*pDC, rcDest, dc, rcDestOrig, clrTransparent);
  264. }
  265. void CXTPOffice2007Image::DrawImage(CDC* pDC, const CRect& rcDest, CRect rcSrc)
  266. {
  267. DrawImage(pDC, rcDest, rcSrc, CRect(0, 0, 0, 0));
  268. }
  269. BOOL CXTPOffice2007Image::GetBitmapPixel(CPoint pt, COLORREF& clrPixel)
  270. {
  271. if (pt.x < 0 || pt.x >= m_szExtent.cx ||
  272. pt.y < 0 || pt.y >= m_szExtent.cy)
  273. return FALSE;
  274. // Initialize the surface pointers.
  275. LPDWORD lprgbBitmap = (LPDWORD)m_pBits + m_szExtent.cx * (m_szExtent.cy - pt.y - 1);
  276. clrPixel = lprgbBitmap[pt.x];
  277. return TRUE;
  278. }
  279. void CXTPOffice2007Image::DrawImage(CDC* pDC, const CRect& rcDest, CRect rcSrc, CRect rcSizingMargins)
  280. {
  281. if (this == NULL)
  282. return;
  283. if (m_pBits == NULL)
  284. return;
  285. if (rcSizingMargins.top + rcSizingMargins.bottom > rcSrc.Height())
  286. return;
  287. ASSERT(m_pImages);
  288. if (!m_pImages)
  289. return;
  290. CXTPLockGuard lock(m_pImages->m_cs);
  291. if (rcDest.Width() == rcSrc.Width())
  292. {
  293. rcSizingMargins.left = 0;
  294. rcSizingMargins.right = 0;
  295. }
  296. if (rcDest.Height() == rcSrc.Height())
  297. {
  298. rcSizingMargins.top = 0;
  299. rcSizingMargins.bottom = 0;
  300. }
  301. pDC->SetStretchBltMode(COLORONCOLOR);
  302. CRect rcDestSizingMargins = rcSizingMargins;
  303. if (rcDest.left >= rcDest.right || rcDest.top >= rcDest.bottom)
  304. return;
  305. BOOL bRtl = CXTPDrawHelpers::IsContextRTL(pDC);
  306. if (m_bAlpha && m_bImageOrientaionPreserved)
  307. {
  308. if ((bRtl && !m_bInvert) || (!bRtl && m_bInvert))
  309. {
  310. InvertBitmap();
  311. }
  312. }
  313. if (m_szExtent.cx > 512 || m_szExtent.cy > 512)
  314. {
  315. ASSERT(FALSE);
  316. return;
  317. }
  318. CXTPOffice2007Images::CBitmapDC& dcSrc = m_pImages->m_dc;
  319. if (!dcSrc.GetSafeHdc() || ! m_pImages->m_pLayerBits)
  320. return;
  321. LPDWORD lpBitsSrc = ((LPDWORD)m_pBits) + (m_szExtent.cy - rcSrc.bottom) * m_szExtent.cx;
  322. LPDWORD lpBitsDest = m_pImages->m_pLayerBits + 512 * (512 - rcSrc.Height());
  323. rcSrc.OffsetRect(0, -rcSrc.top);
  324. for (int y = 0; y < rcSrc.bottom; y++)
  325. {
  326. MEMCPY_S(lpBitsDest, lpBitsSrc, m_szExtent.cx * 4);
  327. lpBitsSrc += m_szExtent.cx;
  328. lpBitsDest += 512;
  329. }
  330. dcSrc.SetBitmap(m_pImages->m_hbmLayer);
  331. if ((rcDest.Height() <= rcSizingMargins.top + rcSizingMargins.bottom) || (rcSrc.Height() == rcSizingMargins.top + rcSizingMargins.bottom))
  332. {
  333. rcDestSizingMargins.top = MulDiv(rcDest.Height(), rcSizingMargins.top, (rcSizingMargins.top + rcSizingMargins.bottom));
  334. rcDestSizingMargins.bottom = rcDest.Height() - rcDestSizingMargins.top;
  335. if (rcDestSizingMargins.bottom > 0 && (rcDestSizingMargins.bottom % 2 != rcSizingMargins.bottom % 2))
  336. rcDestSizingMargins.bottom++;
  337. }
  338. if ((rcDest.Width() <= rcSizingMargins.left + rcSizingMargins.right) || (rcSrc.Width() == rcSizingMargins.left + rcSizingMargins.right))
  339. {
  340. rcDestSizingMargins.left= rcDest.Width() * rcSizingMargins.left / (rcSizingMargins.left + rcSizingMargins.right);
  341. rcDestSizingMargins.right = rcDest.Width() - rcDestSizingMargins.left;
  342. }
  343. if (rcSizingMargins.IsRectNull())
  344. {
  345. DrawImagePart(pDC, rcDest, &dcSrc, rcSrc);
  346. }
  347. else if (bRtl && m_bAlpha)
  348. {
  349. DrawImagePart(pDC, CRect(rcDest.right - rcDestSizingMargins.left, rcDest.top, rcDest.right, rcDest.top + rcDestSizingMargins.top),
  350. &dcSrc, CRect(rcSrc.left, rcSrc.top, rcSrc.left + rcSizingMargins.left, rcSrc.top + rcSizingMargins.top ));
  351. DrawImagePart(pDC, CRect(rcDest.left + rcDestSizingMargins.right, rcDest.top, rcDest.right - rcDestSizingMargins.left, rcDest.top + rcDestSizingMargins.top),
  352. &dcSrc, CRect(rcSrc.left + rcSizingMargins.left, rcSrc.top, rcSrc.right - rcSizingMargins.right, rcSrc.top + rcSizingMargins.top ));
  353. DrawImagePart(pDC, CRect(rcDest.left, rcDest.top, rcDest.left + rcDestSizingMargins.right, rcDest.top + rcDestSizingMargins.top),
  354. &dcSrc, CRect(rcSrc.right - rcSizingMargins.right, rcSrc.top , rcSrc.right, rcSrc.top + rcSizingMargins.top ));
  355. DrawImagePart(pDC, CRect(rcDest.right - rcDestSizingMargins.left, rcDest.top + rcDestSizingMargins.top, rcDest.right, rcDest.bottom - rcDestSizingMargins.bottom),
  356. &dcSrc, CRect(rcSrc.left, rcSrc.top + rcSizingMargins.top , rcSrc.left + rcSizingMargins.left, rcSrc.bottom - rcSizingMargins.bottom ));
  357. DrawImagePart(pDC, CRect(rcDest.left + rcDestSizingMargins.right, rcDest.top + rcDestSizingMargins.top, rcDest.right - rcDestSizingMargins.left, rcDest.bottom - rcDestSizingMargins.bottom),
  358. &dcSrc, CRect(rcSrc.left + rcSizingMargins.left, rcSrc.top + rcSizingMargins.top , rcSrc.right - rcSizingMargins.right, rcSrc.bottom - rcSizingMargins.bottom ));
  359. DrawImagePart(pDC, CRect(rcDest.left, rcDest.top + rcDestSizingMargins.top, rcDest.left + rcDestSizingMargins.right , rcDest.bottom - rcDestSizingMargins.bottom),
  360. &dcSrc, CRect(rcSrc.right - rcSizingMargins.right, rcSrc.top + rcSizingMargins.top , rcSrc.right, rcSrc.bottom - rcSizingMargins.bottom));
  361. DrawImagePart(pDC, CRect(rcDest.right - rcDestSizingMargins.left, rcDest.bottom - rcDestSizingMargins.bottom, rcDest.right, rcDest.bottom),
  362. &dcSrc, CRect(rcSrc.left, rcSrc.bottom - rcSizingMargins.bottom , rcSrc.left + rcSizingMargins.left, rcSrc.bottom ));
  363. DrawImagePart(pDC, CRect(rcDest.left + rcDestSizingMargins.right, rcDest.bottom - rcDestSizingMargins.bottom, rcDest.right - rcDestSizingMargins.left, rcDest.bottom),
  364. &dcSrc, CRect(rcSrc.left + rcSizingMargins.left, rcSrc.bottom - rcSizingMargins.bottom  , rcSrc.right - rcSizingMargins.right, rcSrc.bottom ));
  365. DrawImagePart(pDC, CRect(rcDest.left, rcDest.bottom - rcDestSizingMargins.bottom, rcDest.left + rcDestSizingMargins.right, rcDest.bottom),
  366. &dcSrc, CRect(rcSrc.right - rcSizingMargins.right, rcSrc.bottom - rcSizingMargins.bottom , rcSrc.right, rcSrc.bottom));
  367. }
  368. else
  369. {
  370. DrawImagePart(pDC, CRect(rcDest.left, rcDest.top, rcDest.left + rcDestSizingMargins.left, rcDest.top + rcDestSizingMargins.top),
  371. &dcSrc, CRect(rcSrc.left, rcSrc.top, rcSrc.left + rcSizingMargins.left, rcSrc.top + rcSizingMargins.top ));
  372. DrawImagePart(pDC, CRect(rcDest.left + rcDestSizingMargins.left, rcDest.top, rcDest.right - rcDestSizingMargins.right, rcDest.top + rcDestSizingMargins.top),
  373. &dcSrc, CRect(rcSrc.left + rcSizingMargins.left, rcSrc.top, rcSrc.right - rcSizingMargins.right, rcSrc.top + rcSizingMargins.top ));
  374. DrawImagePart(pDC, CRect(rcDest.right - rcDestSizingMargins.right, rcDest.top, rcDest.right, rcDest.top + rcDestSizingMargins.top),
  375. &dcSrc, CRect(rcSrc.right - rcSizingMargins.right, rcSrc.top , rcSrc.right, rcSrc.top + rcSizingMargins.top ));
  376. DrawImagePart(pDC, CRect(rcDest.left, rcDest.top + rcDestSizingMargins.top, rcDest.left + rcDestSizingMargins.left, rcDest.bottom - rcDestSizingMargins.bottom),
  377. &dcSrc, CRect(rcSrc.left, rcSrc.top + rcSizingMargins.top , rcSrc.left + rcSizingMargins.left, rcSrc.bottom - rcSizingMargins.bottom ));
  378. DrawImagePart(pDC, CRect(rcDest.left + rcDestSizingMargins.left, rcDest.top + rcDestSizingMargins.top, rcDest.right - rcDestSizingMargins.right, rcDest.bottom - rcDestSizingMargins.bottom),
  379. &dcSrc, CRect(rcSrc.left + rcSizingMargins.left, rcSrc.top + rcSizingMargins.top , rcSrc.right - rcSizingMargins.right, rcSrc.bottom - rcSizingMargins.bottom ));
  380. DrawImagePart(pDC, CRect(rcDest.right - rcDestSizingMargins.right , rcDest.top + rcDestSizingMargins.top, rcDest.right, rcDest.bottom - rcDestSizingMargins.bottom),
  381. &dcSrc, CRect(rcSrc.right - rcSizingMargins.right, rcSrc.top + rcSizingMargins.top , rcSrc.right, rcSrc.bottom - rcSizingMargins.bottom));
  382. DrawImagePart(pDC, CRect(rcDest.left, rcDest.bottom - rcDestSizingMargins.bottom, rcDest.left + rcDestSizingMargins.left, rcDest.bottom),
  383. &dcSrc, CRect(rcSrc.left, rcSrc.bottom - rcSizingMargins.bottom , rcSrc.left + rcSizingMargins.left, rcSrc.bottom ));
  384. DrawImagePart(pDC, CRect(rcDest.left + rcDestSizingMargins.left, rcDest.bottom - rcDestSizingMargins.bottom, rcDest.right - rcDestSizingMargins.right, rcDest.bottom),
  385. &dcSrc, CRect(rcSrc.left + rcSizingMargins.left, rcSrc.bottom - rcSizingMargins.bottom  , rcSrc.right - rcSizingMargins.right, rcSrc.bottom ));
  386. DrawImagePart(pDC, CRect(rcDest.right - rcDestSizingMargins.right, rcDest.bottom - rcDestSizingMargins.bottom, rcDest.right, rcDest.bottom),
  387. &dcSrc, CRect(rcSrc.right - rcSizingMargins.right, rcSrc.bottom - rcSizingMargins.bottom , rcSrc.right, rcSrc.bottom));
  388. }
  389. dcSrc.SetBitmap(NULL);
  390. }
  391. CSize CXTPOffice2007Image::GetExtent() const
  392. {
  393. return m_szExtent;
  394. }
  395. CRect CXTPOffice2007Image::GetSource(int nState, int nCount) const
  396. {
  397. if (this == NULL)
  398. return CRect(0, 0, 0, 0);
  399. CRect rcImage(0, 0, m_szExtent.cx, m_szExtent.cy / nCount);
  400. rcImage.OffsetRect(0, nState * rcImage.Height());
  401. return rcImage;
  402. }
  403. int CXTPOffice2007Image::GetHeight() const
  404. {
  405. return m_szExtent.cy;
  406. }
  407. int CXTPOffice2007Image::GetWidth() const
  408. {
  409. return m_szExtent.cx;
  410. }
  411. BOOL CXTPOffice2007Image::IsAlphaImage() const
  412. {
  413. return m_bAlpha;
  414. }
  415. //////////////////////////////////////////////////////////////////////////
  416. //
  417. CXTPOffice2007Images::CXTPOffice2007Images()
  418. {
  419. m_mapImages.InitHashTable(XTP_OFFICE2007_IMAGES_HASH_TABLE_SIZE, FALSE);
  420. m_bFreeOnRelease = FALSE;
  421. m_hResource = 0;
  422. m_lpTextFile = 0;
  423. m_lpTextFileEnd = 0;
  424. m_pConnection = NULL;
  425. SetHandle(AfxGetInstanceHandle());
  426. m_pLayerBits = NULL;
  427. m_hbmLayer = CXTPImageManager::Create32BPPDIBSection(NULL, 512, 512, (LPBYTE*)&m_pLayerBits);
  428. HDC hdcScreen = ::GetDC(HWND_DESKTOP);
  429. m_dc.Attach(::CreateCompatibleDC(hdcScreen));
  430. ReleaseDC(HWND_DESKTOP, hdcScreen);
  431. ::InitializeCriticalSection(&m_cs);
  432. }
  433. CXTPOffice2007Images* AFX_CDECL XTPOffice2007Images()
  434. {
  435. static CXTPOffice2007Images images;
  436. return &images;
  437. }
  438. CXTPOffice2007Images::~CXTPOffice2007Images()
  439. {
  440. CMDTARGET_RELEASE(m_pConnection);
  441. RemoveAll();
  442. if (m_hResource && m_bFreeOnRelease)
  443. {
  444. FreeLibrary(m_hResource);
  445. }
  446. if (m_hbmLayer)
  447. {
  448. DeleteObject(m_hbmLayer);
  449. }
  450. ::DeleteCriticalSection(&m_cs);
  451. }
  452. CXTPNotifyConnection* CXTPOffice2007Images::GetConnection()
  453. {
  454. if (!m_pConnection)
  455. m_pConnection = new CXTPNotifyConnection();
  456. return m_pConnection;
  457. }
  458. void CXTPOffice2007Images::RemoveAll()
  459. {
  460. CString strImageFile;
  461. CXTPOffice2007Image* pImage;
  462. POSITION pos = m_mapImages.GetStartPosition();
  463. while (pos != NULL)
  464. {
  465. m_mapImages.GetNextAssoc( pos, strImageFile, (void*&)pImage);
  466. CMDTARGET_RELEASE(pImage);
  467. }
  468. m_mapImages.RemoveAll();
  469. }
  470. CString CXTPOffice2007Images::_ImageNameToResourceName(CString strImageFile)
  471. {
  472. CString strImage = GetImageString(_T("Images"), strImageFile);
  473. if (!strImage.IsEmpty())
  474. {
  475. strImageFile = strImage;
  476. }
  477. REPLACE_S(strImageFile, _T('.'), _T('_'));
  478. REPLACE_S(strImageFile, _T('\'), _T('_'));
  479. return strImageFile;
  480. }
  481. CXTPOffice2007Image* CXTPOffice2007Images::LoadImage(CString strImageFile)
  482. {
  483. strImageFile = _ImageNameToResourceName(strImageFile);
  484. CXTPOffice2007Image* pImage = new CXTPOffice2007Image(this);
  485. if (!pImage->LoadFile(m_hResource, strImageFile))
  486. {
  487. delete pImage;
  488. return NULL;
  489. }
  490. return pImage;
  491. }
  492. CXTPOffice2007Image* CXTPOffice2007Images::LoadFile(LPCTSTR lpszImageFile)
  493. {
  494. CXTPLockGuard lock(m_cs);
  495. if (!m_hResource)
  496. return NULL;
  497. if (lpszImageFile == NULL)
  498. return NULL;
  499. CXTPOffice2007Image* pImage = 0;
  500. if (m_mapImages.Lookup(lpszImageFile, (void*&)pImage))
  501. return pImage;
  502. pImage = LoadImage(lpszImageFile);
  503. if (!pImage)
  504. return NULL;
  505. m_mapImages.SetAt(lpszImageFile, pImage);
  506. return pImage;
  507. }
  508. BOOL CXTPOffice2007Images::SetHandle(LPCTSTR lpszFile, LPCTSTR lpszIniFileName)
  509. {
  510. HMODULE hModule = LoadLibrary(lpszFile);
  511. if (hModule)
  512. {
  513. m_strHandle = lpszFile;
  514. return SetHandle(hModule, lpszIniFileName, TRUE);
  515. }
  516. return SetHandle(AfxGetInstanceHandle(), lpszIniFileName);
  517. }
  518. BOOL CXTPOffice2007Images::IsValid() const
  519. {
  520. return m_lpTextFile != NULL;
  521. }
  522. BOOL CALLBACK CXTPOffice2007Images::EnumResNameProc(HMODULE /*hModule*/,
  523. LPCTSTR /*lpszType*/, LPTSTR lpszName, LONG_PTR lParam)
  524. {
  525. CString* pIniFileName = (CString*)lParam;
  526. *pIniFileName = lpszName;
  527. return FALSE;
  528. }
  529. HRSRC CXTPOffice2007Images::FindResourceIniFile(HMODULE hResource)
  530. {
  531. CString strIniFileName;
  532. EnumResourceNames(hResource, _T("TEXTFILE"), &CXTPOffice2007Images::EnumResNameProc, (LONG_PTR)&strIniFileName);
  533. if (strIniFileName.IsEmpty())
  534. return 0;
  535. return FindResource(m_hResource, strIniFileName, _T("TEXTFILE"));
  536. }
  537. BOOL CXTPOffice2007Images::SetHandle(HMODULE hResource, LPCTSTR lpszIniFileName, BOOL bFreeOnRelease)
  538. {
  539. if (m_hResource && m_bFreeOnRelease)
  540. {
  541. FreeLibrary(m_hResource);
  542. }
  543. CString strIniFileName(lpszIniFileName);
  544. if (strIniFileName.IsEmpty())
  545. strIniFileName = _T("OFFICE2007BLUE_INI");
  546. REPLACE_S(strIniFileName, _T('.'), _T('_'));
  547. m_hResource = hResource;
  548. m_bFreeOnRelease = bFreeOnRelease;
  549. m_lpTextFile = m_lpTextFileEnd = NULL;
  550. RemoveAll();
  551. HRSRC hRsrc = FindResource(m_hResource, strIniFileName, _T("TEXTFILE"));
  552. if (!hRsrc && lpszIniFileName == NULL)
  553. {
  554. hRsrc = FindResourceIniFile(hResource);
  555. }
  556. BOOL bResult = FALSE;
  557. if (hRsrc)
  558. {
  559. HGLOBAL hResData = LoadResource(m_hResource, hRsrc);
  560. if (hResData)
  561. {
  562. m_lpTextFile = (LPSTR)LockResource(hResData);
  563. m_lpTextFileEnd = m_lpTextFile + SizeofResource(m_hResource, hRsrc);
  564. bResult = TRUE;
  565. }
  566. }
  567. if (m_pConnection)
  568. m_pConnection->SendEvent(XTP_NC_COMMON_OFFICE2007IMAGES_CHANGED, 0, 0);
  569. return bResult;
  570. }
  571. BOOL CXTPOffice2007Images::InitResourceHandle(LPCTSTR lpszTestImageFile, LPCTSTR lpResType)
  572. {
  573. CString strResourceName = _ImageNameToResourceName(lpszTestImageFile);
  574. HMODULE hResource = XTPResourceManager()->GetResourceHandle();
  575. if (hResource == 0)
  576. hResource = AfxGetInstanceHandle();
  577. if (!::FindResource(hResource, strResourceName, lpResType))
  578. {
  579. hResource = AfxFindResourceHandle(strResourceName, lpResType);
  580. if (!hResource)
  581. return FALSE;
  582. }
  583. SetHandle(hResource);
  584. return TRUE;
  585. }
  586. BOOL CXTPOffice2007Images::ReadString(CString& str, LPSTR& lpTextFile)
  587. {
  588. ASSERT(lpTextFile);
  589. if (!lpTextFile)
  590. return FALSE;
  591. LPSTR pNextLine = strchr(lpTextFile, 'r');
  592. if (pNextLine == NULL || pNextLine > m_lpTextFileEnd)
  593. return FALSE;
  594. str = CONSTRUCT_S(lpTextFile, (int)(pNextLine - lpTextFile));
  595. lpTextFile = pNextLine + 1;
  596. if (lpTextFile[0] == 'n') lpTextFile = lpTextFile + 1;
  597. return TRUE;
  598. }
  599. COLORREF CXTPOffice2007Images::GetImageColor(CString strSectionName, CString strKeyName)
  600. {
  601. CString strValue = GetImageValue(strSectionName, strKeyName);
  602. if (strValue.IsEmpty())
  603. return COLORREF_NULL;
  604. int r = 0, g = 0, b = 0;
  605. SCANF_S(strValue, _T("%i %i %i"), &r, &g, &b);
  606. COLORREF clrVal = RGB(r, g, b);
  607. return clrVal;
  608. }
  609. CString CXTPOffice2007Images::GetImageString(CString strSectionName, CString strKeyName)
  610. {
  611. return GetImageValue(strSectionName, strKeyName);
  612. }
  613. CString CXTPOffice2007Images::GetImageValue(CString strSectionName, CString strKeyName)
  614. {
  615. if (m_lpTextFile == NULL)
  616. return _T("");
  617. strSectionName.MakeUpper();
  618. strKeyName.MakeUpper();
  619. LPSTR lpTextFile = m_lpTextFile;
  620. CString str;
  621. BOOL bSectionFound = FALSE;
  622. while (ReadString(str, lpTextFile))
  623. {
  624. str.TrimLeft();
  625. int nCommentIndex = str.Find(_T(';'));
  626. if (nCommentIndex == 0)
  627. continue;
  628. if (nCommentIndex > 0)
  629. {
  630. str = str.Left(nCommentIndex);
  631. }
  632. if (str.IsEmpty())
  633. continue;
  634. str.MakeUpper();
  635. if (str[0] == _T('['))
  636. {
  637. if (bSectionFound)
  638. {
  639. return _T("");
  640. }
  641. CString strSchemaPart = str.Mid(1, str.GetLength() - 2);
  642. if (strSchemaPart == strSectionName)
  643. {
  644. bSectionFound = TRUE;
  645. }
  646. }
  647. else if (bSectionFound)
  648. {
  649. int nPos = str.Find(_T('='));
  650. if (nPos <= 0)
  651. continue;
  652. CString strProperty = str.Left(nPos);
  653. strProperty.TrimRight();
  654. if (strProperty != strKeyName)
  655. continue;
  656. CString strValue = str.Mid(nPos + 1);
  657. strValue.TrimLeft();
  658. strValue.TrimRight();
  659. return strValue;
  660. }
  661. }
  662. return _T("");
  663. }
  664. void CXTPOffice2007Images::RefreshSettings()
  665. {
  666. CString str;
  667. LPSTR lpTextFile = m_lpTextFile;
  668. while (ReadString(str, lpTextFile))
  669. {
  670. str.TrimLeft();
  671. int nCommentIndex = str.Find(_T(';'));
  672. if (nCommentIndex == 0)
  673. continue;
  674. if (nCommentIndex > 0)
  675. {
  676. str = str.Left(nCommentIndex);
  677. }
  678. if (str.IsEmpty())
  679. continue;
  680. str.MakeUpper();
  681. }
  682. }
  683. //////////////////////////////////////////////////////////////////////////
  684. CXTPOffice2007ImageList::CXTPOffice2007ImageList()
  685. {
  686. }
  687. CXTPOffice2007ImageList::~CXTPOffice2007ImageList()
  688. {
  689. RemoveAll();
  690. }
  691. CXTPOffice2007Image* CXTPOffice2007ImageList::SetBitmap(HBITMAP hBitmap, UINT nID, BOOL bAlptha, BOOL bCopyBitmap)
  692. {
  693. ASSERT(hBitmap);
  694. if (!hBitmap)
  695. return NULL;
  696. HBITMAP hBmp2 = hBitmap;
  697. if (bCopyBitmap)
  698. {
  699. // HBITMAP CXTPImageManagerIcon::CopyAlphaBitmap(HBITMAP hBitmap)
  700. hBmp2 = (HBITMAP)::CopyImage(hBitmap, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION);
  701. ASSERT(hBmp2);
  702. if (!hBmp2)
  703. return NULL;
  704. }
  705. BITMAP bmpinfo;
  706. if (!::GetObject(hBmp2, sizeof(bmpinfo), &bmpinfo))
  707. {
  708. ASSERT(FALSE);
  709. ::DeleteObject(hBmp2);
  710. return NULL;
  711. }
  712. CXTPOffice2007Image* pImage = new CXTPOffice2007Image(this);
  713. if (!pImage)
  714. return NULL;
  715. pImage->SetBitmap(hBmp2, bAlptha);
  716. SetBitmap(pImage, nID, FALSE);
  717. return pImage;
  718. }
  719. BOOL CXTPOffice2007ImageList::SetBitmap(CXTPOffice2007Image* pImage, UINT nID, BOOL bCallAddRef)
  720. {
  721. ASSERT(pImage);
  722. if (!pImage)
  723. return FALSE;
  724. if (bCallAddRef)
  725. CMDTARGET_ADDREF(pImage);
  726. // free prev. image if such exists
  727. CXTPOffice2007Image* pImage_old = GetBitmap(nID);
  728. CMDTARGET_RELEASE(pImage_old);
  729. m_mapID2Image.SetAt(nID, pImage);
  730. return TRUE;
  731. }
  732. CXTPOffice2007Image* CXTPOffice2007ImageList::GetBitmap(UINT nID)
  733. {
  734. CXTPOffice2007Image* pImage = NULL;
  735. if (!m_mapID2Image.Lookup(nID, pImage))
  736. return NULL;
  737. return pImage;
  738. }
  739. BOOL CXTPOffice2007ImageList::Remove(UINT nID)
  740. {
  741. CString strImageFile;
  742. CXTPOffice2007Image* pImage = NULL;
  743. //-------------------------------------------------
  744. if (!m_mapID2Image.Lookup(nID, pImage))
  745. return FALSE;
  746. m_mapID2Image.RemoveKey(nID);
  747. CMDTARGET_RELEASE(pImage);
  748. return TRUE;
  749. }
  750. void CXTPOffice2007ImageList::RemoveAll()
  751. {
  752. UINT nID;
  753. CXTPOffice2007Image* pImage;
  754. POSITION pos = m_mapID2Image.GetStartPosition();
  755. while (pos != NULL)
  756. {
  757. m_mapID2Image.GetNextAssoc( pos, nID, pImage);
  758. CMDTARGET_RELEASE(pImage);
  759. }
  760. m_mapID2Image.RemoveAll();
  761. }
  762. BOOL CXTPOffice2007ImageList::LoadBitmap(LPCTSTR lpcszPath, UINT nID)
  763. {
  764. BOOL bAlphaBitmap = FALSE;
  765. HBITMAP hBmp = CXTPImageManagerIcon::LoadBitmapFromFile(lpcszPath, &bAlphaBitmap);
  766. CXTPOffice2007Image* pImage = NULL;
  767. if (hBmp)
  768. {
  769. pImage = SetBitmap(hBmp, nID, bAlphaBitmap, FALSE);
  770. }
  771. return !!pImage;
  772. }
  773. /////////////////////////////////////////////////////////////////////////////