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
|
H6
|
||||||
I
|
I
|
||||||
IMG SRC=[url]
|
IMG SRC=[url]
|
||||||
WIDTH=[pixels]
|
WIDTH=[percent|pixels]
|
||||||
HEIGHT=[pixels]
|
HEIGHT=[pixels]
|
||||||
ALIGN=TEXTTOP
|
ALIGN=TEXTTOP
|
||||||
ALIGN=CENTER
|
ALIGN=CENTER
|
||||||
|
@@ -286,7 +286,9 @@ class wxHtmlImageCell : public wxHtmlCell
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
wxHtmlImageCell(wxHtmlWindowInterface *windowIface,
|
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,
|
double scale = 1.0, int align = wxHTML_ALIGN_BOTTOM,
|
||||||
const wxString& mapname = wxEmptyString);
|
const wxString& mapname = wxEmptyString);
|
||||||
virtual ~wxHtmlImageCell();
|
virtual ~wxHtmlImageCell();
|
||||||
@@ -302,7 +304,10 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
wxBitmap *m_bitmap;
|
wxBitmap *m_bitmap;
|
||||||
|
int m_align;
|
||||||
int m_bmpW, m_bmpH;
|
int m_bmpW, m_bmpH;
|
||||||
|
bool m_bmpWpercent:1;
|
||||||
|
bool m_bmpHpresent:1;
|
||||||
bool m_showFrame:1;
|
bool m_showFrame:1;
|
||||||
wxHtmlWindowInterface *m_windowIface;
|
wxHtmlWindowInterface *m_windowIface;
|
||||||
#if wxUSE_GIF && wxUSE_TIMER
|
#if wxUSE_GIF && wxUSE_TIMER
|
||||||
@@ -343,15 +348,18 @@ class wxGIFTimer : public wxTimer
|
|||||||
|
|
||||||
wxHtmlImageCell::wxHtmlImageCell(wxHtmlWindowInterface *windowIface,
|
wxHtmlImageCell::wxHtmlImageCell(wxHtmlWindowInterface *windowIface,
|
||||||
wxFSFile *input,
|
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()
|
const wxString& mapname) : wxHtmlCell()
|
||||||
{
|
{
|
||||||
m_windowIface = windowIface;
|
m_windowIface = windowIface;
|
||||||
m_scale = scale;
|
m_scale = scale;
|
||||||
m_showFrame = false;
|
m_showFrame = false;
|
||||||
m_bitmap = NULL;
|
m_bitmap = NULL;
|
||||||
m_bmpW = w;
|
m_bmpW = w;
|
||||||
m_bmpH = h;
|
m_bmpH = h;
|
||||||
|
m_align = align;
|
||||||
|
m_bmpWpercent = wpercent;
|
||||||
|
m_bmpHpresent = hpresent;
|
||||||
m_imageMap = NULL;
|
m_imageMap = NULL;
|
||||||
m_mapName = mapname;
|
m_mapName = mapname;
|
||||||
SetCanLiveOnPagebreak(false);
|
SetCanLiveOnPagebreak(false);
|
||||||
@@ -432,22 +440,6 @@ wxHtmlImageCell::wxHtmlImageCell(wxHtmlWindowInterface *windowIface,
|
|||||||
}
|
}
|
||||||
//else: ignore the 0-sized images used sometimes on the Web pages
|
//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)
|
void wxHtmlImageCell::SetImage(const wxImage& img)
|
||||||
@@ -461,9 +453,9 @@ void wxHtmlImageCell::SetImage(const wxImage& img)
|
|||||||
ww = img.GetWidth();
|
ww = img.GetWidth();
|
||||||
hh = img.GetHeight();
|
hh = img.GetHeight();
|
||||||
|
|
||||||
if ( m_bmpW == wxDefaultCoord )
|
if ( m_bmpW == wxDefaultCoord)
|
||||||
m_bmpW = ww;
|
m_bmpW = ww;
|
||||||
if ( m_bmpH == wxDefaultCoord )
|
if ( m_bmpH == wxDefaultCoord)
|
||||||
m_bmpH = hh;
|
m_bmpH = hh;
|
||||||
|
|
||||||
// Only scale the bitmap at the rendering stage,
|
// Only scale the bitmap at the rendering stage,
|
||||||
@@ -533,6 +525,35 @@ void wxHtmlImageCell::AdvanceAnimation(wxTimer *timer)
|
|||||||
|
|
||||||
void wxHtmlImageCell::Layout(int w)
|
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);
|
wxHtmlCell::Layout(w);
|
||||||
m_physX = m_physY = wxDefaultCoord;
|
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.
|
// and height, so we only do the scaling once.
|
||||||
double imageScaleX = 1.0;
|
double imageScaleX = 1.0;
|
||||||
double imageScaleY = 1.0;
|
double imageScaleY = 1.0;
|
||||||
if (m_bmpW != m_bitmap->GetWidth())
|
if (m_Width != m_bitmap->GetWidth())
|
||||||
imageScaleX = (double) m_bmpW / (double) m_bitmap->GetWidth();
|
imageScaleX = (double) m_Width / (double) m_bitmap->GetWidth();
|
||||||
if (m_bmpH != m_bitmap->GetHeight())
|
if (m_Height != m_bitmap->GetHeight())
|
||||||
imageScaleY = (double) m_bmpH / (double) m_bitmap->GetHeight();
|
imageScaleY = (double) m_Height / (double) m_bitmap->GetHeight();
|
||||||
|
|
||||||
double us_x, us_y;
|
double us_x, us_y;
|
||||||
dc.GetUserScale(&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)),
|
dc.DrawBitmap(*m_bitmap, (int) ((x + m_PosX) / (imageScaleX)),
|
||||||
(int) ((y + m_PosY) / (m_scale*imageScaleY)), true);
|
(int) ((y + m_PosY) / (imageScaleY)), true);
|
||||||
dc.SetUserScale(us_x, us_y);
|
dc.SetUserScale(us_x, us_y);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -627,6 +648,8 @@ TAG_HANDLER_BEGIN(IMG, "IMG,MAP,AREA")
|
|||||||
if (tag.HasParam(wxT("SRC")))
|
if (tag.HasParam(wxT("SRC")))
|
||||||
{
|
{
|
||||||
int w = wxDefaultCoord, h = wxDefaultCoord;
|
int w = wxDefaultCoord, h = wxDefaultCoord;
|
||||||
|
bool wpercent = false;
|
||||||
|
bool hpresent = false;
|
||||||
int al;
|
int al;
|
||||||
wxFSFile *str;
|
wxFSFile *str;
|
||||||
wxString tmp = tag.GetParam(wxT("SRC"));
|
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);
|
str = m_WParser->OpenURL(wxHTML_URL_IMAGE, tmp);
|
||||||
|
|
||||||
if (tag.HasParam(wxT("WIDTH")))
|
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")))
|
if (tag.HasParam(wxT("HEIGHT")))
|
||||||
|
{
|
||||||
tag.GetParamAsInt(wxT("HEIGHT"), &h);
|
tag.GetParamAsInt(wxT("HEIGHT"), &h);
|
||||||
|
hpresent = true;
|
||||||
|
}
|
||||||
|
|
||||||
al = wxHTML_ALIGN_BOTTOM;
|
al = wxHTML_ALIGN_BOTTOM;
|
||||||
if (tag.HasParam(wxT("ALIGN")))
|
if (tag.HasParam(wxT("ALIGN")))
|
||||||
{
|
{
|
||||||
@@ -658,7 +697,7 @@ TAG_HANDLER_BEGIN(IMG, "IMG,MAP,AREA")
|
|||||||
}
|
}
|
||||||
wxHtmlImageCell *cel = new wxHtmlImageCell(
|
wxHtmlImageCell *cel = new wxHtmlImageCell(
|
||||||
m_WParser->GetWindowInterface(),
|
m_WParser->GetWindowInterface(),
|
||||||
str, w, h,
|
str, w, wpercent, h, hpresent,
|
||||||
m_WParser->GetPixelScale(),
|
m_WParser->GetPixelScale(),
|
||||||
al, mn);
|
al, mn);
|
||||||
m_WParser->ApplyStateToCell(cel);
|
m_WParser->ApplyStateToCell(cel);
|
||||||
|
Reference in New Issue
Block a user