You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

250 lines
6.1 KiB
C++

// XTPMarkupImage.cpp: implementation of the CXTPMarkupImage class.
//
// This file is a part of the XTREME TOOLKIT PRO MFC class library.
// (c)1998-2012 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 "Common/XTPImageManager.h"
#include "XTPMarkupObject.h"
#include "XTPMarkupInputElement.h"
#include "XTPMarkupUIElement.h"
#include "XTPMarkupFrameworkElement.h"
#include "XTPMarkupShape.h"
#include "XTPMarkupImage.h"
#include "XTPMarkupDrawingContext.h"
#include "XTPMarkupContext.h"
#include "XTPMarkupBuilder.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
CXTPMarkupDependencyProperty* CXTPMarkupImage::m_pSourceProperty = NULL;
CXTPMarkupDependencyProperty* CXTPMarkupImage::m_pStretchProperty = NULL;
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
IMPLEMENT_MARKUPCLASS(L"Image", CXTPMarkupImage, CXTPMarkupFrameworkElement)
void CXTPMarkupImage::RegisterMarkupClass()
{
m_pSourceProperty = CXTPMarkupDependencyProperty::Register(L"Source", MARKUP_TYPE(CXTPMarkupString), MARKUP_TYPE(CXTPMarkupImage),
new CXTPMarkupPropertyMetadata(NULL, CXTPMarkupPropertyMetadata::flagAffectsMeasure));
m_pStretchProperty = CXTPMarkupDependencyProperty::Register(L"Stretch", MARKUP_TYPE(CXTPMarkupEnum), MARKUP_TYPE(CXTPMarkupImage),
new CXTPMarkupPropertyMetadata(CXTPMarkupEnum::CreateValue(xtpMarkupStretchNone), &CXTPMarkupBuilder::ConvertStretch, CXTPMarkupPropertyMetadata::flagAffectsMeasure));
}
CXTPMarkupImage::CXTPMarkupImage()
{
m_pImageManager = NULL;
m_pImage = NULL;
}
CXTPMarkupImage::~CXTPMarkupImage()
{
CMDTARGET_RELEASE(m_pImage);
CMDTARGET_RELEASE(m_pImageManager);
}
CString CXTPMarkupImage::GetSource()
{
CXTPMarkupString* pSource = MARKUP_STATICCAST(CXTPMarkupString, GetValue(m_pSourceProperty));
if (!pSource)
return _T("");
return CString(*pSource);
}
void CXTPMarkupImage::SetSource(LPCTSTR lpszSource)
{
SetValue(m_pSourceProperty, new CXTPMarkupString(lpszSource));
}
void CXTPMarkupImage::LoadImage(int cx)
{
CXTPMarkupString* pSource = MARKUP_STATICCAST(CXTPMarkupString, GetValue(m_pSourceProperty));
if (!pSource)
return;
CMDTARGET_RELEASE(m_pImageManager);
CMDTARGET_RELEASE(m_pImage);
LPCWSTR lpszSource = (*pSource);
if (wcsncmp(lpszSource, L"file://", 7) == 0)
{
CString strFileName(lpszSource + 7);
m_pImageManager = new CXTPImageManager();
m_pImageManager->SetMaskColor(0x00FF00);
if (strFileName.Right(3).CompareNoCase(_T("ico")) == 0)
{
m_pImageManager->SetIconFromIcoFile(strFileName, 0, 0,xtpImageNormal);
}
else
{
BOOL bAlphaBitmap = FALSE;
HBITMAP hBitmap = CXTPImageManagerIcon::LoadBitmapFromFile(strFileName, &bAlphaBitmap);
if (hBitmap)
{
CBitmap bmp;
bmp.Attach(hBitmap);
m_pImageManager->SetIcons(bmp, 0, 1, 0, xtpImageNormal, bAlphaBitmap);
}
}
m_pImage = m_pImageManager->GetImage(0, cx);
CMDTARGET_ADDREF(m_pImage);
}
else if (wcsncmp(lpszSource, L"res://", 6) == 0)
{
CString strResourceName(lpszSource + 6);
LPCTSTR lpszResource = (LPCTSTR)strResourceName;
if (lpszResource[0] == _T('#'))
{
lpszResource = MAKEINTRESOURCE(_ttoi(lpszResource + 1));
}
m_pImageManager = new CXTPImageManager();
m_pImageManager->SetMaskColor(0x00FF00);
BOOL bAlphaBitmap = FALSE;
HBITMAP hBitmap = CXTPImageManagerIcon::LoadBitmapFromResource(AfxGetResourceHandle(), lpszResource, &bAlphaBitmap);
if (!hBitmap)
{
hBitmap = CXTPImageManagerIcon::LoadBitmapFromResource(lpszResource, &bAlphaBitmap);
}
if (hBitmap)
{
CBitmap bmp;
bmp.Attach(hBitmap),
m_pImageManager->SetIcons(bmp, 0, 1, 0, xtpImageNormal, bAlphaBitmap);
}
else
{
m_pImageManager->SetIcon(strResourceName, 0);
}
m_pImage = m_pImageManager->GetImage(0, cx);
CMDTARGET_ADDREF(m_pImage);
}
else
{
int nIndex = _wtoi(lpszSource);
if (nIndex > 0)
{
m_pImageManager = m_pMarkupContext->GetImageManager();
CMDTARGET_ADDREF(m_pImageManager);
m_pImage = m_pImageManager->GetImage(nIndex, cx);
CMDTARGET_ADDREF(m_pImage);
}
}
}
AFX_INLINE BOOL IsPositiveInfinity(int size) {
return size > 32000;
}
CSize CXTPMarkupImage::MeasureArrangeHelper(CSize availableSize)
{
if (!m_pImage)
return CSize(0, 0);
CSize szContent(m_pImage->GetWidth(), m_pImage->GetHeight());
if (szContent.cx == 0 || szContent.cy == 0)
return szContent;
XTPMarkupStretch stretch = GetStretch();
BOOL bWidth = !IsPositiveInfinity(availableSize.cx);
BOOL bHeight = !IsPositiveInfinity(availableSize.cy);
if ((stretch == xtpMarkupStretchNone) || (!bWidth && !bHeight))
{
return szContent;
}
double cx = (double)availableSize.cx / szContent.cx;
double cy = (double)availableSize.cy / szContent.cy;
if (!bWidth)
{
cx = cy;
}
else if (!bHeight)
{
cy = cx;
}
else
{
switch (stretch)
{
case xtpMarkupStretchUniform:
cx = cy = min(cx, cy);
break;
case xtpMarkupStretchUniformToFill:
cx = cy = max(cx, cy);
break;
}
}
return CSize(int(szContent.cx * cx), int(szContent.cy * cy));
}
CSize CXTPMarkupImage::MeasureOverride(CXTPMarkupDrawingContext* /*pDC*/, CSize constraint)
{
LoadImage(constraint.cx);
return MeasureArrangeHelper(constraint);
}
CSize CXTPMarkupImage::ArrangeOverride(CSize arrangeSize)
{
return MeasureArrangeHelper(arrangeSize);
}
void CXTPMarkupImage::OnRender(CXTPMarkupDrawingContext* pDC)
{
CSize szRender = GetRenderSize();
if (!m_pImage)
return;
HDC hDC = pDC->GetDC();
m_pImage->Draw(CDC::FromHandle(hDC), CPoint(0, 0), szRender);
pDC->ReleaseDC(hDC);
}