X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/fa794151356cb766c72fd691ab470be1ecefc544..486a0fa75f8ae4ef12968ef0eee8b54b066d11af:/src/html/m_image.cpp diff --git a/src/html/m_image.cpp b/src/html/m_image.cpp index b8ffb83c8d..d1f550212e 100644 --- a/src/html/m_image.cpp +++ b/src/html/m_image.cpp @@ -2,7 +2,6 @@ // Name: src/html/m_image.cpp // Purpose: wxHtml module for displaying images // Author: Vaclav Slavik -// RCS-ID: $Id$ // Copyright: (c) 1999 Vaclav Slavik, Joel Lucsy // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -24,6 +23,7 @@ #include "wx/log.h" #include "wx/math.h" #include "wx/image.h" + #include "wx/wxcrtvararg.h" #endif #include "wx/html/forcelnk.h" @@ -94,6 +94,7 @@ wxHtmlLinkInfo *wxHtmlImageMapAreaCell::GetLink( int x, int y ) const switch (type) { case RECT: + if ( coords.GetCount() == 4 ) { int l, t, r, b; @@ -105,9 +106,10 @@ wxHtmlLinkInfo *wxHtmlImageMapAreaCell::GetLink( int x, int y ) const { return m_Link; } - break; } + break; case CIRCLE: + if ( coords.GetCount() == 3 ) { int l, t, r; double d; @@ -123,88 +125,86 @@ wxHtmlLinkInfo *wxHtmlImageMapAreaCell::GetLink( int x, int y ) const } break; case POLY: - { - if (coords.GetCount() >= 6) - { - int intersects = 0; - int wherex = x; - int wherey = y; - int totalv = coords.GetCount() / 2; - int totalc = totalv * 2; - int xval = coords[totalc - 2]; - int yval = coords[totalc - 1]; - int end = totalc; - int pointer = 1; - - if ((yval >= wherey) != (coords[pointer] >= wherey)) - { - if ((xval >= wherex) == (coords[0] >= wherex)) - { - intersects += (xval >= wherex) ? 1 : 0; - } - else - { - intersects += ((xval - (yval - wherey) * - (coords[0] - xval) / - (coords[pointer] - yval)) >= wherex) ? 1 : 0; - } - } - - while (pointer < end) - { - yval = coords[pointer]; - pointer += 2; - if (yval >= wherey) - { - while ((pointer < end) && (coords[pointer] >= wherey)) - { - pointer += 2; - } - if (pointer >= end) - { - break; - } - if ((coords[pointer - 3] >= wherex) == - (coords[pointer - 1] >= wherex)) { - intersects += (coords[pointer - 3] >= wherex) ? 1 : 0; - } - else - { - intersects += - ((coords[pointer - 3] - (coords[pointer - 2] - wherey) * - (coords[pointer - 1] - coords[pointer - 3]) / - (coords[pointer] - coords[pointer - 2])) >= wherex) ? 1 : 0; - } - } - else - { - while ((pointer < end) && (coords[pointer] < wherey)) - { - pointer += 2; - } - if (pointer >= end) - { - break; - } - if ((coords[pointer - 3] >= wherex) == - (coords[pointer - 1] >= wherex)) - { - intersects += (coords[pointer - 3] >= wherex) ? 1 : 0; - } - else - { - intersects += - ((coords[pointer - 3] - (coords[pointer - 2] - wherey) * - (coords[pointer - 1] - coords[pointer - 3]) / - (coords[pointer] - coords[pointer - 2])) >= wherex) ? 1 : 0; - } - } - } - if ((intersects & 1) != 0) - { - return m_Link; - } - } + if (coords.GetCount() >= 6) + { + int intersects = 0; + int wherex = x; + int wherey = y; + int totalv = coords.GetCount() / 2; + int totalc = totalv * 2; + int xval = coords[totalc - 2]; + int yval = coords[totalc - 1]; + int end = totalc; + int pointer = 1; + + if ((yval >= wherey) != (coords[pointer] >= wherey)) + { + if ((xval >= wherex) == (coords[0] >= wherex)) + { + intersects += (xval >= wherex) ? 1 : 0; + } + else + { + intersects += ((xval - (yval - wherey) * + (coords[0] - xval) / + (coords[pointer] - yval)) >= wherex) ? 1 : 0; + } + } + + while (pointer < end) + { + yval = coords[pointer]; + pointer += 2; + if (yval >= wherey) + { + while ((pointer < end) && (coords[pointer] >= wherey)) + { + pointer += 2; + } + if (pointer >= end) + { + break; + } + if ((coords[pointer - 3] >= wherex) == + (coords[pointer - 1] >= wherex)) { + intersects += (coords[pointer - 3] >= wherex) ? 1 : 0; + } + else + { + intersects += + ((coords[pointer - 3] - (coords[pointer - 2] - wherey) * + (coords[pointer - 1] - coords[pointer - 3]) / + (coords[pointer] - coords[pointer - 2])) >= wherex) ? 1 : 0; + } + } + else + { + while ((pointer < end) && (coords[pointer] < wherey)) + { + pointer += 2; + } + if (pointer >= end) + { + break; + } + if ((coords[pointer - 3] >= wherex) == + (coords[pointer - 1] >= wherex)) + { + intersects += (coords[pointer - 3] >= wherex) ? 1 : 0; + } + else + { + intersects += + ((coords[pointer - 3] - (coords[pointer - 2] - wherey) * + (coords[pointer - 1] - coords[pointer - 3]) / + (coords[pointer] - coords[pointer - 2])) >= wherex) ? 1 : 0; + } + } + } + if ((intersects & 1) != 0) + { + return m_Link; + } } break; } @@ -297,6 +297,11 @@ public: virtual wxHtmlLinkInfo *GetLink(int x = 0, int y = 0) const; void SetImage(const wxImage& img); + + // If "alt" text is set, it will be used when converting this cell to text. + void SetAlt(const wxString& alt); + virtual wxString ConvertToText(wxHtmlSelection *sel) const; + #if wxUSE_GIF && wxUSE_TIMER void AdvanceAnimation(wxTimer *timer); virtual void Layout(int w); @@ -319,6 +324,7 @@ private: double m_scale; wxHtmlImageMapCell *m_imageMap; wxString m_mapName; + wxString m_alt; wxDECLARE_NO_COPY_CLASS(wxHtmlImageCell); }; @@ -416,7 +422,7 @@ wxHtmlImageCell::wxHtmlImageCell(wxHtmlWindowInterface *windowIface, #endif // wxUSE_GIF && wxUSE_TIMER { wxImage image(*s, wxBITMAP_TYPE_ANY); - if ( image.Ok() ) + if ( image.IsOk() ) SetImage(image); } } @@ -445,7 +451,7 @@ wxHtmlImageCell::wxHtmlImageCell(wxHtmlWindowInterface *windowIface, void wxHtmlImageCell::SetImage(const wxImage& img) { #if !defined(__WXMSW__) || wxUSE_WXDIB - if ( img.Ok() ) + if ( img.IsOk() ) { delete m_bitmap; @@ -473,6 +479,16 @@ void wxHtmlImageCell::SetImage(const wxImage& img) #endif } +void wxHtmlImageCell::SetAlt(const wxString& alt) +{ + m_alt = alt; +} + +wxString wxHtmlImageCell::ConvertToText(wxHtmlSelection* WXUNUSED(sel)) const +{ + return m_alt; +} + #if wxUSE_GIF && wxUSE_TIMER void wxHtmlImageCell::AdvanceAnimation(wxTimer *timer) { @@ -533,11 +549,11 @@ void wxHtmlImageCell::Layout(int w) if (!m_bmpHpresent && m_bitmap != NULL) m_Height = m_bitmap->GetHeight()*m_Width/m_bitmap->GetWidth(); else - m_Height = m_scale*m_bmpH; + m_Height = static_cast(m_scale*m_bmpH); } else { - m_Width = m_scale*m_bmpW; - m_Height = m_scale*m_bmpH; + m_Width = static_cast(m_scale*m_bmpW); + m_Height = static_cast(m_scale*m_bmpH); } switch (m_align) @@ -659,16 +675,16 @@ TAG_HANDLER_BEGIN(IMG, "IMG,MAP,AREA") if (tag.HasParam(wxT("WIDTH"))) { - 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.GetParamAsIntOrPercent(wxT("WIDTH"), &w, wpercent)) + { + if (wpercent) + { + if (w < 0) + w = 0; + else if (w > 100) + w = 100; + } } - } if (tag.HasParam(wxT("HEIGHT"))) @@ -701,7 +717,9 @@ TAG_HANDLER_BEGIN(IMG, "IMG,MAP,AREA") m_WParser->GetPixelScale(), al, mn); m_WParser->ApplyStateToCell(cel); + m_WParser->StopCollapsingSpaces(); cel->SetId(tag.GetParam(wxT("id"))); // may be empty + cel->SetAlt(tag.GetParam(wxT("alt"))); m_WParser->GetContainer()->InsertCell(cel); if (str) delete str;