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:
@@ -526,7 +526,7 @@ H5
|
||||
H6
|
||||
I
|
||||
IMG SRC=[url]
|
||||
WIDTH=[pixels]
|
||||
WIDTH=[percent|pixels]
|
||||
HEIGHT=[pixels]
|
||||
ALIGN=TEXTTOP
|
||||
ALIGN=CENTER
|
||||
|
@@ -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);
|
||||
|
Reference in New Issue
Block a user