]> git.saurik.com Git - wxWidgets.git/blobdiff - src/html/m_image.cpp
Fix another crash when conversion fails in Unix PostScript code.
[wxWidgets.git] / src / html / m_image.cpp
index 60fee4e25ea099eb14f91a70ccdb1e9a9ab2f099..d1f550212e571f72b688092b94558381e305ab59 100644 (file)
@@ -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
 /////////////////////////////////////////////////////////////////////////////
@@ -95,6 +94,7 @@ wxHtmlLinkInfo *wxHtmlImageMapAreaCell::GetLink( int x, int y ) const
     switch (type)
     {
         case RECT:
+            if ( coords.GetCount() == 4 )
             {
                 int l, t, r, b;
 
@@ -106,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;
@@ -124,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;
     }
@@ -298,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);
@@ -320,6 +324,7 @@ private:
     double              m_scale;
     wxHtmlImageMapCell *m_imageMap;
     wxString            m_mapName;
+    wxString            m_alt;
 
     wxDECLARE_NO_COPY_CLASS(wxHtmlImageCell);
 };
@@ -474,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)
 {
@@ -660,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")))
@@ -702,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;