wxHTML: Support percentage width in IMG tag.

(Patch #11800 by lpoujoulat) Fixes #11800.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@63766 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Václav Slavík
2010-03-28 17:55:51 +00:00
parent b37dacdca6
commit fa79415135
2 changed files with 71 additions and 32 deletions

View File

@@ -526,7 +526,7 @@ H5
H6
I
IMG SRC=[url]
WIDTH=[pixels]
WIDTH=[percent|pixels]
HEIGHT=[pixels]
ALIGN=TEXTTOP
ALIGN=CENTER

View File

@@ -286,7 +286,9 @@ class wxHtmlImageCell : public wxHtmlCell
{
public:
wxHtmlImageCell(wxHtmlWindowInterface *windowIface,
wxFSFile *input, int w = wxDefaultCoord, int h = wxDefaultCoord,
wxFSFile *input,
int w = wxDefaultCoord, bool wpercent = false,
int h = wxDefaultCoord, bool hpresent = false,
double scale = 1.0, int align = wxHTML_ALIGN_BOTTOM,
const wxString& mapname = wxEmptyString);
virtual ~wxHtmlImageCell();
@@ -302,7 +304,10 @@ public:
private:
wxBitmap *m_bitmap;
int m_align;
int m_bmpW, m_bmpH;
bool m_bmpWpercent:1;
bool m_bmpHpresent:1;
bool m_showFrame:1;
wxHtmlWindowInterface *m_windowIface;
#if wxUSE_GIF && wxUSE_TIMER
@@ -343,7 +348,7 @@ class wxGIFTimer : public wxTimer
wxHtmlImageCell::wxHtmlImageCell(wxHtmlWindowInterface *windowIface,
wxFSFile *input,
int w, int h, double scale, int align,
int w, bool wpercent, int h, bool hpresent, double scale, int align,
const wxString& mapname) : wxHtmlCell()
{
m_windowIface = windowIface;
@@ -352,6 +357,9 @@ wxHtmlImageCell::wxHtmlImageCell(wxHtmlWindowInterface *windowIface,
m_bitmap = NULL;
m_bmpW = w;
m_bmpH = h;
m_align = align;
m_bmpWpercent = wpercent;
m_bmpHpresent = hpresent;
m_imageMap = NULL;
m_mapName = mapname;
SetCanLiveOnPagebreak(false);
@@ -432,22 +440,6 @@ wxHtmlImageCell::wxHtmlImageCell(wxHtmlWindowInterface *windowIface,
}
//else: ignore the 0-sized images used sometimes on the Web pages
m_Width = (int)(scale * (double)m_bmpW);
m_Height = (int)(scale * (double)m_bmpH);
switch (align)
{
case wxHTML_ALIGN_TOP :
m_Descent = m_Height;
break;
case wxHTML_ALIGN_CENTER :
m_Descent = m_Height / 2;
break;
case wxHTML_ALIGN_BOTTOM :
default :
m_Descent = 0;
break;
}
}
void wxHtmlImageCell::SetImage(const wxImage& img)
@@ -461,9 +453,9 @@ void wxHtmlImageCell::SetImage(const wxImage& img)
ww = img.GetWidth();
hh = img.GetHeight();
if ( m_bmpW == wxDefaultCoord )
if ( m_bmpW == wxDefaultCoord)
m_bmpW = ww;
if ( m_bmpH == wxDefaultCoord )
if ( m_bmpH == wxDefaultCoord)
m_bmpH = hh;
// Only scale the bitmap at the rendering stage,
@@ -533,6 +525,35 @@ void wxHtmlImageCell::AdvanceAnimation(wxTimer *timer)
void wxHtmlImageCell::Layout(int w)
{
if (m_bmpWpercent)
{
m_Width = w*m_bmpW/100;
if (!m_bmpHpresent && m_bitmap != NULL)
m_Height = m_bitmap->GetHeight()*m_Width/m_bitmap->GetWidth();
else
m_Height = m_scale*m_bmpH;
} else
{
m_Width = m_scale*m_bmpW;
m_Height = m_scale*m_bmpH;
}
switch (m_align)
{
case wxHTML_ALIGN_TOP :
m_Descent = m_Height;
break;
case wxHTML_ALIGN_CENTER :
m_Descent = m_Height / 2;
break;
case wxHTML_ALIGN_BOTTOM :
default :
m_Descent = 0;
break;
}
wxHtmlCell::Layout(w);
m_physX = m_physY = wxDefaultCoord;
}
@@ -566,17 +587,17 @@ void wxHtmlImageCell::Draw(wxDC& dc, int x, int y,
// and height, so we only do the scaling once.
double imageScaleX = 1.0;
double imageScaleY = 1.0;
if (m_bmpW != m_bitmap->GetWidth())
imageScaleX = (double) m_bmpW / (double) m_bitmap->GetWidth();
if (m_bmpH != m_bitmap->GetHeight())
imageScaleY = (double) m_bmpH / (double) m_bitmap->GetHeight();
if (m_Width != m_bitmap->GetWidth())
imageScaleX = (double) m_Width / (double) m_bitmap->GetWidth();
if (m_Height != m_bitmap->GetHeight())
imageScaleY = (double) m_Height / (double) m_bitmap->GetHeight();
double us_x, us_y;
dc.GetUserScale(&us_x, &us_y);
dc.SetUserScale(us_x * m_scale * imageScaleX, us_y * m_scale * imageScaleY);
dc.SetUserScale(us_x * imageScaleX, us_y * imageScaleY);
dc.DrawBitmap(*m_bitmap, (int) ((x + m_PosX) / (m_scale*imageScaleX)),
(int) ((y + m_PosY) / (m_scale*imageScaleY)), true);
dc.DrawBitmap(*m_bitmap, (int) ((x + m_PosX) / (imageScaleX)),
(int) ((y + m_PosY) / (imageScaleY)), true);
dc.SetUserScale(us_x, us_y);
}
}
@@ -627,6 +648,8 @@ TAG_HANDLER_BEGIN(IMG, "IMG,MAP,AREA")
if (tag.HasParam(wxT("SRC")))
{
int w = wxDefaultCoord, h = wxDefaultCoord;
bool wpercent = false;
bool hpresent = false;
int al;
wxFSFile *str;
wxString tmp = tag.GetParam(wxT("SRC"));
@@ -635,9 +658,25 @@ TAG_HANDLER_BEGIN(IMG, "IMG,MAP,AREA")
str = m_WParser->OpenURL(wxHTML_URL_IMAGE, tmp);
if (tag.HasParam(wxT("WIDTH")))
tag.GetParamAsInt(wxT("WIDTH"), &w);
{
wxString param = tag.GetParam(wxT("WIDTH"));
wxSscanf(param.c_str(), wxT("%i"), &w);
if (param.EndsWith(wxT("%"))) {
if (w < 0)
w = 0;
else if (w > 100)
w = 100;
wpercent = true;
}
}
if (tag.HasParam(wxT("HEIGHT")))
{
tag.GetParamAsInt(wxT("HEIGHT"), &h);
hpresent = true;
}
al = wxHTML_ALIGN_BOTTOM;
if (tag.HasParam(wxT("ALIGN")))
{
@@ -658,7 +697,7 @@ TAG_HANDLER_BEGIN(IMG, "IMG,MAP,AREA")
}
wxHtmlImageCell *cel = new wxHtmlImageCell(
m_WParser->GetWindowInterface(),
str, w, h,
str, w, wpercent, h, hpresent,
m_WParser->GetPixelScale(),
al, mn);
m_WParser->ApplyStateToCell(cel);