DragonNest/Third/XTToolkitPro/Source/Common/XTPOffice2007Image.cpp

1020 lines
26 KiB
C++
Raw Normal View History

2024-12-19 09:48:26 +08:00
// XTPOffice2007Image.cpp: implementation of the CXTPOffice2007Image class.
//
// This file is a part of the XTREME TOOLKIT PRO MFC class library.
// (c)1998-2008 Codejock Software, All Rights Reserved.
//
// THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
// RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
// CONSENT OF CODEJOCK SOFTWARE.
//
// THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
// IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
// YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
// SINGLE COMPUTER.
//
// CONTACT INFORMATION:
// support@codejock.com
// http://www.codejock.com
//
/////////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "XTPImageManager.h"
#include "XTPColorManager.h"
#include "XTPResourceManager.h"
#include "XTPDrawHelpers.h"
#include "XTPVC50Helpers.h"
#include "XTPVC80Helpers.h"
#include "XTPOffice2007Image.h"
#include "XTPNotifyConnection.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
#define TILE_VERTICAL 1
#define TILE_HORIZONTAL 2
#define TILE_ALL 3
//---------------------------------------------------------------------------
// Should be a prime number:
// 37, 53, 79 , 101, 127, 199, 503, 1021, 1511, 2003, 3001, 4001, 5003, 6007, 8009, 12007, 16001, 32003, 48017, 64007
#define XTP_OFFICE2007_IMAGES_HASH_TABLE_SIZE 199
IMPLEMENT_DYNCREATE(CXTPOffice2007ImageList, CCmdTarget)
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CXTPOffice2007Image::CXTPOffice2007Image(CXTPOffice2007Images* pImages)
{
m_bAlpha = FALSE;
m_bInvert = FALSE;
m_bMultiply = FALSE;
m_szExtent = CSize(0, 0);
m_bImageOrientaionPreserved = FALSE;
m_pImages = pImages;
m_pBits = NULL;
}
CXTPOffice2007Image::~CXTPOffice2007Image()
{
if (m_pBits != NULL)
{
free(m_pBits);
}
}
BOOL CXTPOffice2007Image::ConvertToBits(HBITMAP hBitmap)
{
CDC dcSrc;
dcSrc.CreateCompatibleDC(NULL);
LPVOID pBits = NULL;
if (m_bAlpha)
{
BITMAPINFO bmi;
memset(&bmi, 0, sizeof(bmi));
bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
if (GetDIBits(dcSrc, hBitmap, 0, 0, NULL, (BITMAPINFO*)&bmi, DIB_RGB_COLORS) == 0)
return FALSE;
if (bmi.bmiHeader.biBitCount != 32)
return FALSE;
int nSize = bmi.bmiHeader.biHeight * bmi.bmiHeader.biWidth * 4;
pBits = malloc(nSize);
if (pBits == NULL)
return FALSE;
PBITMAPINFO pBitmapInfo = (PBITMAPINFO)malloc(sizeof(BITMAPINFOHEADER) + 3 * sizeof(COLORREF));
if (pBitmapInfo == NULL)
{
free(pBits);
return FALSE;
}
MEMCPY_S(pBitmapInfo, &bmi, sizeof(BITMAPINFOHEADER));
if (GetDIBits(dcSrc, hBitmap, 0, bmi.bmiHeader.biHeight, pBits, pBitmapInfo, DIB_RGB_COLORS) == NULL)
{
free(pBits);
free(pBitmapInfo);
return FALSE;
}
free(pBitmapInfo);
}
else
{
LPDWORD lpBits = NULL;
HBITMAP hDCBitmap = CXTPImageManager::Create32BPPDIBSection(NULL, m_szExtent.cx, m_szExtent.cy, (LPBYTE*)&lpBits);
if (!lpBits)
return FALSE;
HBITMAP hOldBitmap = (HBITMAP)::SelectObject(dcSrc, hDCBitmap);
dcSrc.DrawState(CPoint(0, 0), m_szExtent, hBitmap, DSS_NORMAL, 0);
::SelectObject(dcSrc, hOldBitmap);
int nSize = m_szExtent.cx * m_szExtent.cy * 4;
pBits = malloc(nSize);
if (!pBits)
return FALSE;
MEMCPY_S(pBits, lpBits, nSize);
DeleteObject(hDCBitmap);
}
ASSERT(pBits);
m_pBits = pBits;
return TRUE;
}
void CXTPOffice2007Image::SetBitmap(HBITMAP hBitmap, BOOL bAlpha /*= FALSE*/)
{
ASSERT(m_pBits == NULL);
m_bAlpha = bAlpha;
m_bInvert = FALSE;
m_bMultiply = FALSE;
BITMAP bmpInfo;
if (!GetObject(hBitmap, sizeof(BITMAP), &bmpInfo))
return;
m_szExtent = CSize(bmpInfo.bmWidth, bmpInfo.bmHeight);
VERIFY(ConvertToBits(hBitmap));
DeleteObject(hBitmap);
}
BOOL CXTPOffice2007Image::LoadFile(HMODULE hModule, LPCTSTR lpszBitmapFileName)
{
m_bMultiply = FALSE;
m_bInvert = FALSE;
m_bAlpha = FALSE;
if (m_pBits)
{
free(m_pBits);
m_pBits = NULL;
}
if (!hModule)
return FALSE;
BOOL bAlpha = FALSE;
HBITMAP hBmp = CXTPImageManagerIcon::LoadBitmapFromResource(hModule, lpszBitmapFileName, &bAlpha);
if (!hBmp)
return FALSE;
SetBitmap(hBmp, bAlpha);
return TRUE;
}
void CXTPOffice2007Image::Premultiply()
{
if (!m_bAlpha || !m_pBits || m_bMultiply)
return;
RGBQUAD* lprgbBitmap = (RGBQUAD*)m_pBits;
int nCount = m_szExtent.cx * m_szExtent.cy;
for (int i = 0; i < nCount; i++)
{
int nAlpha = lprgbBitmap->rgbReserved;
lprgbBitmap->rgbBlue = BYTE(lprgbBitmap->rgbBlue * nAlpha / 255);
lprgbBitmap->rgbGreen = BYTE(lprgbBitmap->rgbGreen * nAlpha / 255);
lprgbBitmap->rgbRed = BYTE(lprgbBitmap->rgbRed * nAlpha / 255);
lprgbBitmap++;
}
m_bMultiply = TRUE;
}
void CXTPOffice2007Image::InvertBitmap()
{
if (!m_bAlpha || !m_pBits)
return;
DWORD* pDest = (DWORD*)malloc(m_szExtent.cx * m_szExtent.cy * 4);
DWORD* pDestOrig = pDest;
DWORD* pBits = (DWORD*)m_pBits;
for (int y = 0; y < m_szExtent.cy; y++)
{
DWORD* pBitsRow = &pBits[y * m_szExtent.cx + m_szExtent.cx - 1];
for (int x = 0; x < m_szExtent.cx; x++)
{
*pDest++ = *pBitsRow--;
}
}
free(m_pBits);
m_pBits = pDestOrig;
m_bInvert = !m_bInvert;
}
BOOL CXTPOffice2007Image::DrawImagePart(CDC* pDCDest, CRect rcDest, CDC* pDCSrc, CRect rcSrc) const
{
if (rcDest.Width() <= 0 || rcDest.Height() <= 0 || rcSrc.Width() <= 0 || rcSrc.Height() <= 0)
return TRUE;
BOOL bResult = TRUE;
if (m_bAlpha)
{
bResult = XTPImageManager()->AlphaBlend(pDCDest->GetSafeHdc(), rcDest, pDCSrc->GetSafeHdc(), rcSrc);
}
else if ((rcSrc.Width() == rcDest.Width()) && (rcSrc.Height() == rcDest.Height()))
{
bResult = pDCDest->BitBlt(rcDest.left, rcDest.top, rcDest.Width(), rcDest.Height(),
pDCSrc, rcSrc.left, rcSrc.top, SRCCOPY);
}
else
{
bResult = pDCDest->StretchBlt(rcDest.left, rcDest.top, rcDest.Width(), rcDest.Height(),
pDCSrc, rcSrc.left, rcSrc.top, rcSrc.Width(), rcSrc.Height(), SRCCOPY);
}
return bResult;
}
void CXTPOffice2007Image::DrawImage(CDC* pDC, const CRect& rcDest, CRect rcSrc, const CRect& rcSizingMargins, COLORREF clrTransparent, DWORD dwFlags)
{
if (this == NULL)
return;
if (m_pBits == NULL)
return;
if (rcSizingMargins.top + rcSizingMargins.bottom > rcSrc.Height())
return;
if ((dwFlags & XTP_DI_COMPOSITE) == 0)
{
DrawImage(pDC, rcDest, rcSrc, rcSizingMargins, clrTransparent);
return;
}
if (m_bAlpha)
{
DrawImage(pDC, rcDest, rcSrc, rcSizingMargins);
return;
}
CSize sz(rcDest.Width(), rcDest.Height());
CBitmap bmp;
LPDWORD lpBits;
bmp.Attach(CXTPImageManager::Create32BPPDIBSection(pDC->GetSafeHdc(), sz.cx, sz.cy, (LPBYTE*)&lpBits));
CXTPCompatibleDC dc(pDC, &bmp);
CRect rcDestOrig(0, 0, sz.cx, sz.cy);
if (clrTransparent != COLORREF_NULL) dc.FillSolidRect(rcDestOrig, clrTransparent);
DrawImage(&dc, rcDestOrig, rcSrc, rcSizingMargins);
for (int i = 0; i < sz.cx * sz.cy; i++)
{
if (clrTransparent != COLORREF_NULL && lpBits[0] == clrTransparent)
{
lpBits[0] = 0;
}
else
{
lpBits[0] |= 0xFF000000;
}
lpBits++;
}
XTPImageManager()->AlphaBlend(*pDC, rcDest, dc, rcDestOrig);
}
void CXTPOffice2007Image::DrawImage(CDC* pDC, const CRect& rcDest, CRect rcSrc, const CRect& rcSizingMargins, COLORREF clrTransparent)
{
if (this == NULL)
return;
if (m_pBits == NULL)
return;
if (rcSizingMargins.top + rcSizingMargins.bottom > rcSrc.Height())
return;
if (clrTransparent == COLORREF_NULL || m_bAlpha)
{
DrawImage(pDC, rcDest, rcSrc, rcSizingMargins);
return;
}
CBitmap bmp;
bmp.CreateCompatibleBitmap(pDC, rcDest.Width(), rcDest.Height());
CXTPCompatibleDC dc(pDC, &bmp);
//dc.SetLayout(0);
CRect rcDestOrig(0, 0, rcDest.Width(), rcDest.Height());
dc.FillSolidRect(rcDestOrig, clrTransparent);
DrawImage(&dc, rcDestOrig, rcSrc, rcSizingMargins);
XTPImageManager()->TransparentBlt(*pDC, rcDest, dc, rcDestOrig, clrTransparent);
}
void CXTPOffice2007Image::DrawImage(CDC* pDC, const CRect& rcDest, CRect rcSrc)
{
DrawImage(pDC, rcDest, rcSrc, CRect(0, 0, 0, 0));
}
BOOL CXTPOffice2007Image::GetBitmapPixel(CPoint pt, COLORREF& clrPixel)
{
if (pt.x < 0 || pt.x >= m_szExtent.cx ||
pt.y < 0 || pt.y >= m_szExtent.cy)
return FALSE;
// Initialize the surface pointers.
LPDWORD lprgbBitmap = (LPDWORD)m_pBits + m_szExtent.cx * (m_szExtent.cy - pt.y - 1);
clrPixel = lprgbBitmap[pt.x];
return TRUE;
}
void CXTPOffice2007Image::DrawImage(CDC* pDC, const CRect& rcDest, CRect rcSrc, CRect rcSizingMargins)
{
if (this == NULL)
return;
if (m_pBits == NULL)
return;
if (rcSizingMargins.top + rcSizingMargins.bottom > rcSrc.Height())
return;
ASSERT(m_pImages);
if (!m_pImages)
return;
CXTPLockGuard lock(m_pImages->m_cs);
if (rcDest.Width() == rcSrc.Width())
{
rcSizingMargins.left = 0;
rcSizingMargins.right = 0;
}
if (rcDest.Height() == rcSrc.Height())
{
rcSizingMargins.top = 0;
rcSizingMargins.bottom = 0;
}
pDC->SetStretchBltMode(COLORONCOLOR);
CRect rcDestSizingMargins = rcSizingMargins;
if (rcDest.left >= rcDest.right || rcDest.top >= rcDest.bottom)
return;
BOOL bRtl = CXTPDrawHelpers::IsContextRTL(pDC);
if (m_bAlpha && m_bImageOrientaionPreserved)
{
if ((bRtl && !m_bInvert) || (!bRtl && m_bInvert))
{
InvertBitmap();
}
}
if (m_szExtent.cx > 512 || m_szExtent.cy > 512)
{
ASSERT(FALSE);
return;
}
CXTPOffice2007Images::CBitmapDC& dcSrc = m_pImages->m_dc;
if (!dcSrc.GetSafeHdc() || ! m_pImages->m_pLayerBits)
return;
LPDWORD lpBitsSrc = ((LPDWORD)m_pBits) + (m_szExtent.cy - rcSrc.bottom) * m_szExtent.cx;
LPDWORD lpBitsDest = m_pImages->m_pLayerBits + 512 * (512 - rcSrc.Height());
rcSrc.OffsetRect(0, -rcSrc.top);
for (int y = 0; y < rcSrc.bottom; y++)
{
MEMCPY_S(lpBitsDest, lpBitsSrc, m_szExtent.cx * 4);
lpBitsSrc += m_szExtent.cx;
lpBitsDest += 512;
}
dcSrc.SetBitmap(m_pImages->m_hbmLayer);
if ((rcDest.Height() <= rcSizingMargins.top + rcSizingMargins.bottom) || (rcSrc.Height() == rcSizingMargins.top + rcSizingMargins.bottom))
{
rcDestSizingMargins.top = MulDiv(rcDest.Height(), rcSizingMargins.top, (rcSizingMargins.top + rcSizingMargins.bottom));
rcDestSizingMargins.bottom = rcDest.Height() - rcDestSizingMargins.top;
if (rcDestSizingMargins.bottom > 0 && (rcDestSizingMargins.bottom % 2 != rcSizingMargins.bottom % 2))
rcDestSizingMargins.bottom++;
}
if ((rcDest.Width() <= rcSizingMargins.left + rcSizingMargins.right) || (rcSrc.Width() == rcSizingMargins.left + rcSizingMargins.right))
{
rcDestSizingMargins.left= rcDest.Width() * rcSizingMargins.left / (rcSizingMargins.left + rcSizingMargins.right);
rcDestSizingMargins.right = rcDest.Width() - rcDestSizingMargins.left;
}
if (rcSizingMargins.IsRectNull())
{
DrawImagePart(pDC, rcDest, &dcSrc, rcSrc);
}
else if (bRtl && m_bAlpha)
{
DrawImagePart(pDC, CRect(rcDest.right - rcDestSizingMargins.left, rcDest.top, rcDest.right, rcDest.top + rcDestSizingMargins.top),
&dcSrc, CRect(rcSrc.left, rcSrc.top, rcSrc.left + rcSizingMargins.left, rcSrc.top + rcSizingMargins.top ));
DrawImagePart(pDC, CRect(rcDest.left + rcDestSizingMargins.right, rcDest.top, rcDest.right - rcDestSizingMargins.left, rcDest.top + rcDestSizingMargins.top),
&dcSrc, CRect(rcSrc.left + rcSizingMargins.left, rcSrc.top, rcSrc.right - rcSizingMargins.right, rcSrc.top + rcSizingMargins.top ));
DrawImagePart(pDC, CRect(rcDest.left, rcDest.top, rcDest.left + rcDestSizingMargins.right, rcDest.top + rcDestSizingMargins.top),
&dcSrc, CRect(rcSrc.right - rcSizingMargins.right, rcSrc.top , rcSrc.right, rcSrc.top + rcSizingMargins.top ));
DrawImagePart(pDC, CRect(rcDest.right - rcDestSizingMargins.left, rcDest.top + rcDestSizingMargins.top, rcDest.right, rcDest.bottom - rcDestSizingMargins.bottom),
&dcSrc, CRect(rcSrc.left, rcSrc.top + rcSizingMargins.top , rcSrc.left + rcSizingMargins.left, rcSrc.bottom - rcSizingMargins.bottom ));
DrawImagePart(pDC, CRect(rcDest.left + rcDestSizingMargins.right, rcDest.top + rcDestSizingMargins.top, rcDest.right - rcDestSizingMargins.left, rcDest.bottom - rcDestSizingMargins.bottom),
&dcSrc, CRect(rcSrc.left + rcSizingMargins.left, rcSrc.top + rcSizingMargins.top , rcSrc.right - rcSizingMargins.right, rcSrc.bottom - rcSizingMargins.bottom ));
DrawImagePart(pDC, CRect(rcDest.left, rcDest.top + rcDestSizingMargins.top, rcDest.left + rcDestSizingMargins.right , rcDest.bottom - rcDestSizingMargins.bottom),
&dcSrc, CRect(rcSrc.right - rcSizingMargins.right, rcSrc.top + rcSizingMargins.top , rcSrc.right, rcSrc.bottom - rcSizingMargins.bottom));
DrawImagePart(pDC, CRect(rcDest.right - rcDestSizingMargins.left, rcDest.bottom - rcDestSizingMargins.bottom, rcDest.right, rcDest.bottom),
&dcSrc, CRect(rcSrc.left, rcSrc.bottom - rcSizingMargins.bottom , rcSrc.left + rcSizingMargins.left, rcSrc.bottom ));
DrawImagePart(pDC, CRect(rcDest.left + rcDestSizingMargins.right, rcDest.bottom - rcDestSizingMargins.bottom, rcDest.right - rcDestSizingMargins.left, rcDest.bottom),
&dcSrc, CRect(rcSrc.left + rcSizingMargins.left, rcSrc.bottom - rcSizingMargins.bottom , rcSrc.right - rcSizingMargins.right, rcSrc.bottom ));
DrawImagePart(pDC, CRect(rcDest.left, rcDest.bottom - rcDestSizingMargins.bottom, rcDest.left + rcDestSizingMargins.right, rcDest.bottom),
&dcSrc, CRect(rcSrc.right - rcSizingMargins.right, rcSrc.bottom - rcSizingMargins.bottom , rcSrc.right, rcSrc.bottom));
}
else
{
DrawImagePart(pDC, CRect(rcDest.left, rcDest.top, rcDest.left + rcDestSizingMargins.left, rcDest.top + rcDestSizingMargins.top),
&dcSrc, CRect(rcSrc.left, rcSrc.top, rcSrc.left + rcSizingMargins.left, rcSrc.top + rcSizingMargins.top ));
DrawImagePart(pDC, CRect(rcDest.left + rcDestSizingMargins.left, rcDest.top, rcDest.right - rcDestSizingMargins.right, rcDest.top + rcDestSizingMargins.top),
&dcSrc, CRect(rcSrc.left + rcSizingMargins.left, rcSrc.top, rcSrc.right - rcSizingMargins.right, rcSrc.top + rcSizingMargins.top ));
DrawImagePart(pDC, CRect(rcDest.right - rcDestSizingMargins.right, rcDest.top, rcDest.right, rcDest.top + rcDestSizingMargins.top),
&dcSrc, CRect(rcSrc.right - rcSizingMargins.right, rcSrc.top , rcSrc.right, rcSrc.top + rcSizingMargins.top ));
DrawImagePart(pDC, CRect(rcDest.left, rcDest.top + rcDestSizingMargins.top, rcDest.left + rcDestSizingMargins.left, rcDest.bottom - rcDestSizingMargins.bottom),
&dcSrc, CRect(rcSrc.left, rcSrc.top + rcSizingMargins.top , rcSrc.left + rcSizingMargins.left, rcSrc.bottom - rcSizingMargins.bottom ));
DrawImagePart(pDC, CRect(rcDest.left + rcDestSizingMargins.left, rcDest.top + rcDestSizingMargins.top, rcDest.right - rcDestSizingMargins.right, rcDest.bottom - rcDestSizingMargins.bottom),
&dcSrc, CRect(rcSrc.left + rcSizingMargins.left, rcSrc.top + rcSizingMargins.top , rcSrc.right - rcSizingMargins.right, rcSrc.bottom - rcSizingMargins.bottom ));
DrawImagePart(pDC, CRect(rcDest.right - rcDestSizingMargins.right , rcDest.top + rcDestSizingMargins.top, rcDest.right, rcDest.bottom - rcDestSizingMargins.bottom),
&dcSrc, CRect(rcSrc.right - rcSizingMargins.right, rcSrc.top + rcSizingMargins.top , rcSrc.right, rcSrc.bottom - rcSizingMargins.bottom));
DrawImagePart(pDC, CRect(rcDest.left, rcDest.bottom - rcDestSizingMargins.bottom, rcDest.left + rcDestSizingMargins.left, rcDest.bottom),
&dcSrc, CRect(rcSrc.left, rcSrc.bottom - rcSizingMargins.bottom , rcSrc.left + rcSizingMargins.left, rcSrc.bottom ));
DrawImagePart(pDC, CRect(rcDest.left + rcDestSizingMargins.left, rcDest.bottom - rcDestSizingMargins.bottom, rcDest.right - rcDestSizingMargins.right, rcDest.bottom),
&dcSrc, CRect(rcSrc.left + rcSizingMargins.left, rcSrc.bottom - rcSizingMargins.bottom , rcSrc.right - rcSizingMargins.right, rcSrc.bottom ));
DrawImagePart(pDC, CRect(rcDest.right - rcDestSizingMargins.right, rcDest.bottom - rcDestSizingMargins.bottom, rcDest.right, rcDest.bottom),
&dcSrc, CRect(rcSrc.right - rcSizingMargins.right, rcSrc.bottom - rcSizingMargins.bottom , rcSrc.right, rcSrc.bottom));
}
dcSrc.SetBitmap(NULL);
}
CSize CXTPOffice2007Image::GetExtent() const
{
return m_szExtent;
}
CRect CXTPOffice2007Image::GetSource(int nState, int nCount) const
{
if (this == NULL)
return CRect(0, 0, 0, 0);
CRect rcImage(0, 0, m_szExtent.cx, m_szExtent.cy / nCount);
rcImage.OffsetRect(0, nState * rcImage.Height());
return rcImage;
}
int CXTPOffice2007Image::GetHeight() const
{
return m_szExtent.cy;
}
int CXTPOffice2007Image::GetWidth() const
{
return m_szExtent.cx;
}
BOOL CXTPOffice2007Image::IsAlphaImage() const
{
return m_bAlpha;
}
//////////////////////////////////////////////////////////////////////////
//
CXTPOffice2007Images::CXTPOffice2007Images()
{
m_mapImages.InitHashTable(XTP_OFFICE2007_IMAGES_HASH_TABLE_SIZE, FALSE);
m_bFreeOnRelease = FALSE;
m_hResource = 0;
m_lpTextFile = 0;
m_lpTextFileEnd = 0;
m_pConnection = NULL;
SetHandle(AfxGetInstanceHandle());
m_pLayerBits = NULL;
m_hbmLayer = CXTPImageManager::Create32BPPDIBSection(NULL, 512, 512, (LPBYTE*)&m_pLayerBits);
HDC hdcScreen = ::GetDC(HWND_DESKTOP);
m_dc.Attach(::CreateCompatibleDC(hdcScreen));
ReleaseDC(HWND_DESKTOP, hdcScreen);
::InitializeCriticalSection(&m_cs);
}
CXTPOffice2007Images* AFX_CDECL XTPOffice2007Images()
{
static CXTPOffice2007Images images;
return &images;
}
CXTPOffice2007Images::~CXTPOffice2007Images()
{
CMDTARGET_RELEASE(m_pConnection);
RemoveAll();
if (m_hResource && m_bFreeOnRelease)
{
FreeLibrary(m_hResource);
}
if (m_hbmLayer)
{
DeleteObject(m_hbmLayer);
}
::DeleteCriticalSection(&m_cs);
}
CXTPNotifyConnection* CXTPOffice2007Images::GetConnection()
{
if (!m_pConnection)
m_pConnection = new CXTPNotifyConnection();
return m_pConnection;
}
void CXTPOffice2007Images::RemoveAll()
{
CString strImageFile;
CXTPOffice2007Image* pImage;
POSITION pos = m_mapImages.GetStartPosition();
while (pos != NULL)
{
m_mapImages.GetNextAssoc( pos, strImageFile, (void*&)pImage);
CMDTARGET_RELEASE(pImage);
}
m_mapImages.RemoveAll();
}
CString CXTPOffice2007Images::_ImageNameToResourceName(CString strImageFile)
{
CString strImage = GetImageString(_T("Images"), strImageFile);
if (!strImage.IsEmpty())
{
strImageFile = strImage;
}
REPLACE_S(strImageFile, _T('.'), _T('_'));
REPLACE_S(strImageFile, _T('\\'), _T('_'));
return strImageFile;
}
CXTPOffice2007Image* CXTPOffice2007Images::LoadImage(CString strImageFile)
{
strImageFile = _ImageNameToResourceName(strImageFile);
CXTPOffice2007Image* pImage = new CXTPOffice2007Image(this);
if (!pImage->LoadFile(m_hResource, strImageFile))
{
delete pImage;
return NULL;
}
return pImage;
}
CXTPOffice2007Image* CXTPOffice2007Images::LoadFile(LPCTSTR lpszImageFile)
{
CXTPLockGuard lock(m_cs);
if (!m_hResource)
return NULL;
if (lpszImageFile == NULL)
return NULL;
CXTPOffice2007Image* pImage = 0;
if (m_mapImages.Lookup(lpszImageFile, (void*&)pImage))
return pImage;
pImage = LoadImage(lpszImageFile);
if (!pImage)
return NULL;
m_mapImages.SetAt(lpszImageFile, pImage);
return pImage;
}
BOOL CXTPOffice2007Images::SetHandle(LPCTSTR lpszFile, LPCTSTR lpszIniFileName)
{
HMODULE hModule = LoadLibrary(lpszFile);
if (hModule)
{
m_strHandle = lpszFile;
return SetHandle(hModule, lpszIniFileName, TRUE);
}
return SetHandle(AfxGetInstanceHandle(), lpszIniFileName);
}
BOOL CXTPOffice2007Images::IsValid() const
{
return m_lpTextFile != NULL;
}
BOOL CALLBACK CXTPOffice2007Images::EnumResNameProc(HMODULE /*hModule*/,
LPCTSTR /*lpszType*/, LPTSTR lpszName, LONG_PTR lParam)
{
CString* pIniFileName = (CString*)lParam;
*pIniFileName = lpszName;
return FALSE;
}
HRSRC CXTPOffice2007Images::FindResourceIniFile(HMODULE hResource)
{
CString strIniFileName;
EnumResourceNames(hResource, _T("TEXTFILE"), &CXTPOffice2007Images::EnumResNameProc, (LONG_PTR)&strIniFileName);
if (strIniFileName.IsEmpty())
return 0;
return FindResource(m_hResource, strIniFileName, _T("TEXTFILE"));
}
BOOL CXTPOffice2007Images::SetHandle(HMODULE hResource, LPCTSTR lpszIniFileName, BOOL bFreeOnRelease)
{
if (m_hResource && m_bFreeOnRelease)
{
FreeLibrary(m_hResource);
}
CString strIniFileName(lpszIniFileName);
if (strIniFileName.IsEmpty())
strIniFileName = _T("OFFICE2007BLUE_INI");
REPLACE_S(strIniFileName, _T('.'), _T('_'));
m_hResource = hResource;
m_bFreeOnRelease = bFreeOnRelease;
m_lpTextFile = m_lpTextFileEnd = NULL;
RemoveAll();
HRSRC hRsrc = FindResource(m_hResource, strIniFileName, _T("TEXTFILE"));
if (!hRsrc && lpszIniFileName == NULL)
{
hRsrc = FindResourceIniFile(hResource);
}
BOOL bResult = FALSE;
if (hRsrc)
{
HGLOBAL hResData = LoadResource(m_hResource, hRsrc);
if (hResData)
{
m_lpTextFile = (LPSTR)LockResource(hResData);
m_lpTextFileEnd = m_lpTextFile + SizeofResource(m_hResource, hRsrc);
bResult = TRUE;
}
}
if (m_pConnection)
m_pConnection->SendEvent(XTP_NC_COMMON_OFFICE2007IMAGES_CHANGED, 0, 0);
return bResult;
}
BOOL CXTPOffice2007Images::InitResourceHandle(LPCTSTR lpszTestImageFile, LPCTSTR lpResType)
{
CString strResourceName = _ImageNameToResourceName(lpszTestImageFile);
HMODULE hResource = XTPResourceManager()->GetResourceHandle();
if (hResource == 0)
hResource = AfxGetInstanceHandle();
if (!::FindResource(hResource, strResourceName, lpResType))
{
hResource = AfxFindResourceHandle(strResourceName, lpResType);
if (!hResource)
return FALSE;
}
SetHandle(hResource);
return TRUE;
}
BOOL CXTPOffice2007Images::ReadString(CString& str, LPSTR& lpTextFile)
{
ASSERT(lpTextFile);
if (!lpTextFile)
return FALSE;
LPSTR pNextLine = strchr(lpTextFile, '\r');
if (pNextLine == NULL || pNextLine > m_lpTextFileEnd)
return FALSE;
str = CONSTRUCT_S(lpTextFile, (int)(pNextLine - lpTextFile));
lpTextFile = pNextLine + 1;
if (lpTextFile[0] == '\n') lpTextFile = lpTextFile + 1;
return TRUE;
}
COLORREF CXTPOffice2007Images::GetImageColor(CString strSectionName, CString strKeyName)
{
CString strValue = GetImageValue(strSectionName, strKeyName);
if (strValue.IsEmpty())
return COLORREF_NULL;
int r = 0, g = 0, b = 0;
SCANF_S(strValue, _T("%i %i %i"), &r, &g, &b);
COLORREF clrVal = RGB(r, g, b);
return clrVal;
}
CString CXTPOffice2007Images::GetImageString(CString strSectionName, CString strKeyName)
{
return GetImageValue(strSectionName, strKeyName);
}
CString CXTPOffice2007Images::GetImageValue(CString strSectionName, CString strKeyName)
{
if (m_lpTextFile == NULL)
return _T("");
strSectionName.MakeUpper();
strKeyName.MakeUpper();
LPSTR lpTextFile = m_lpTextFile;
CString str;
BOOL bSectionFound = FALSE;
while (ReadString(str, lpTextFile))
{
str.TrimLeft();
int nCommentIndex = str.Find(_T(';'));
if (nCommentIndex == 0)
continue;
if (nCommentIndex > 0)
{
str = str.Left(nCommentIndex);
}
if (str.IsEmpty())
continue;
str.MakeUpper();
if (str[0] == _T('['))
{
if (bSectionFound)
{
return _T("");
}
CString strSchemaPart = str.Mid(1, str.GetLength() - 2);
if (strSchemaPart == strSectionName)
{
bSectionFound = TRUE;
}
}
else if (bSectionFound)
{
int nPos = str.Find(_T('='));
if (nPos <= 0)
continue;
CString strProperty = str.Left(nPos);
strProperty.TrimRight();
if (strProperty != strKeyName)
continue;
CString strValue = str.Mid(nPos + 1);
strValue.TrimLeft();
strValue.TrimRight();
return strValue;
}
}
return _T("");
}
void CXTPOffice2007Images::RefreshSettings()
{
CString str;
LPSTR lpTextFile = m_lpTextFile;
while (ReadString(str, lpTextFile))
{
str.TrimLeft();
int nCommentIndex = str.Find(_T(';'));
if (nCommentIndex == 0)
continue;
if (nCommentIndex > 0)
{
str = str.Left(nCommentIndex);
}
if (str.IsEmpty())
continue;
str.MakeUpper();
}
}
//////////////////////////////////////////////////////////////////////////
CXTPOffice2007ImageList::CXTPOffice2007ImageList()
{
}
CXTPOffice2007ImageList::~CXTPOffice2007ImageList()
{
RemoveAll();
}
CXTPOffice2007Image* CXTPOffice2007ImageList::SetBitmap(HBITMAP hBitmap, UINT nID, BOOL bAlptha, BOOL bCopyBitmap)
{
ASSERT(hBitmap);
if (!hBitmap)
return NULL;
HBITMAP hBmp2 = hBitmap;
if (bCopyBitmap)
{
// HBITMAP CXTPImageManagerIcon::CopyAlphaBitmap(HBITMAP hBitmap)
hBmp2 = (HBITMAP)::CopyImage(hBitmap, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION);
ASSERT(hBmp2);
if (!hBmp2)
return NULL;
}
BITMAP bmpinfo;
if (!::GetObject(hBmp2, sizeof(bmpinfo), &bmpinfo))
{
ASSERT(FALSE);
::DeleteObject(hBmp2);
return NULL;
}
CXTPOffice2007Image* pImage = new CXTPOffice2007Image(this);
if (!pImage)
return NULL;
pImage->SetBitmap(hBmp2, bAlptha);
SetBitmap(pImage, nID, FALSE);
return pImage;
}
BOOL CXTPOffice2007ImageList::SetBitmap(CXTPOffice2007Image* pImage, UINT nID, BOOL bCallAddRef)
{
ASSERT(pImage);
if (!pImage)
return FALSE;
if (bCallAddRef)
CMDTARGET_ADDREF(pImage);
// free prev. image if such exists
CXTPOffice2007Image* pImage_old = GetBitmap(nID);
CMDTARGET_RELEASE(pImage_old);
m_mapID2Image.SetAt(nID, pImage);
return TRUE;
}
CXTPOffice2007Image* CXTPOffice2007ImageList::GetBitmap(UINT nID)
{
CXTPOffice2007Image* pImage = NULL;
if (!m_mapID2Image.Lookup(nID, pImage))
return NULL;
return pImage;
}
BOOL CXTPOffice2007ImageList::Remove(UINT nID)
{
CString strImageFile;
CXTPOffice2007Image* pImage = NULL;
//-------------------------------------------------
if (!m_mapID2Image.Lookup(nID, pImage))
return FALSE;
m_mapID2Image.RemoveKey(nID);
CMDTARGET_RELEASE(pImage);
return TRUE;
}
void CXTPOffice2007ImageList::RemoveAll()
{
UINT nID;
CXTPOffice2007Image* pImage;
POSITION pos = m_mapID2Image.GetStartPosition();
while (pos != NULL)
{
m_mapID2Image.GetNextAssoc( pos, nID, pImage);
CMDTARGET_RELEASE(pImage);
}
m_mapID2Image.RemoveAll();
}
BOOL CXTPOffice2007ImageList::LoadBitmap(LPCTSTR lpcszPath, UINT nID)
{
BOOL bAlphaBitmap = FALSE;
HBITMAP hBmp = CXTPImageManagerIcon::LoadBitmapFromFile(lpcszPath, &bAlphaBitmap);
CXTPOffice2007Image* pImage = NULL;
if (hBmp)
{
pImage = SetBitmap(hBmp, nID, bAlphaBitmap, FALSE);
}
return !!pImage;
}
/////////////////////////////////////////////////////////////////////////////