]> git.saurik.com Git - wxWidgets.git/blobdiff - src/html/m_image.cpp
fixed (rare but fatal) bug in wxWindowDisabler
[wxWidgets.git] / src / html / m_image.cpp
index 3d1f375088b775fc02ffce890f5940b62deed3b5..06a78d6b82b0b35d74ed6f04c4aa73ce5300df1a 100644 (file)
@@ -1,5 +1,5 @@
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
-// Name:        mod_image.cpp
+// Name:        m_image.cpp
 // Purpose:     wxHtml module for displaying images
 // Author:      Vaclav Slavik
 // RCS-ID:      $Id$
 // Purpose:     wxHtml module for displaying images
 // Author:      Vaclav Slavik
 // RCS-ID:      $Id$
@@ -34,7 +34,7 @@
 #include <math.h>
 #include <float.h>
 
 #include <math.h>
 #include <float.h>
 
-FORCE_LINK_ME(mod_image)
+FORCE_LINK_ME(m_image)
 
 
 
 
 
 
@@ -57,35 +57,35 @@ class wxHtmlImageMapAreaCell : public wxHtmlCell
     protected:
         CoordArray coords;
         celltype type;
     protected:
         CoordArray coords;
         celltype type;
-        int    radius;
+        int radius;
     public:
     public:
-        wxHtmlImageMapAreaCell( celltype t, wxString &coords );
-        virtual wxString GetLink( int x = 0, int y = 0 ) const;
+        wxHtmlImageMapAreaCell( celltype t, wxString &coords, double pixel_scale = 1.0);
+        virtual wxHtmlLinkInfo *GetLink( int x = 0, int y = 0 ) const;
 };
 
 
 
 
 
 };
 
 
 
 
 
-wxHtmlImageMapAreaCell::wxHtmlImageMapAreaCell( wxHtmlImageMapAreaCell::celltype t, wxString &incoords )
+wxHtmlImageMapAreaCell::wxHtmlImageMapAreaCell( wxHtmlImageMapAreaCell::celltype t, wxString &incoords, double pixel_scale )
 {
 {
-    int        i;
+    int i;
     wxString x = incoords, y;
 
     type = t;
     while ((i = x.Find( ',' )) != -1) {
     wxString x = incoords, y;
 
     type = t;
     while ((i = x.Find( ',' )) != -1) {
-        coords.Add( wxAtoi( x.Left( i ).c_str() ) );
+        coords.Add( (int)(pixel_scale * (double)wxAtoi( x.Left( i ).c_str())) );
         x = x.Mid( i + 1 );
     }
         x = x.Mid( i + 1 );
     }
-    coords.Add( wxAtoi( x.c_str() ) );
+    coords.Add( (int)(pixel_scale * (double)wxAtoi( x.c_str())) );
 }
 
 }
 
-wxString wxHtmlImageMapAreaCell::GetLink( int x, int y ) const
+wxHtmlLinkInfo *wxHtmlImageMapAreaCell::GetLink( int x, int y ) const
 {
     switch (type) {
         case RECT:
             {
 {
     switch (type) {
         case RECT:
             {
-                int    l, t, r, b;
+                int l, t, r, b;
 
                 l = coords[ 0 ];
                 t = coords[ 1 ];
 
                 l = coords[ 0 ];
                 t = coords[ 1 ];
@@ -98,8 +98,8 @@ wxString wxHtmlImageMapAreaCell::GetLink( int x, int y ) const
             }
         case CIRCLE:
             {
             }
         case CIRCLE:
             {
-                int    l, t, r;
-                double d;
+                int l, t, r;
+                double  d;
 
                 l = coords[ 0 ];
                 t = coords[ 1 ];
 
                 l = coords[ 0 ];
                 t = coords[ 1 ];
@@ -113,15 +113,15 @@ wxString wxHtmlImageMapAreaCell::GetLink( int x, int y ) const
         case POLY:
             {
                 if (coords.GetCount() >= 6) {
         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;
+                    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)) {
 
                     if ((yval >= wherey) != (coords[pointer] >= wherey)) {
                         if ((xval >= wherex) == (coords[0] >= wherex)) {
@@ -178,10 +178,10 @@ wxString wxHtmlImageMapAreaCell::GetLink( int x, int y ) const
             break;
     }
     if (m_Next) {
             break;
     }
     if (m_Next) {
-        wxHtmlImageMapAreaCell *a = (wxHtmlImageMapAreaCell*)m_Next;
+        wxHtmlImageMapAreaCell  *a = (wxHtmlImageMapAreaCell*)m_Next;
         return a->GetLink( x, y );
     }
         return a->GetLink( x, y );
     }
-    return wxEmptyString;
+    return NULL;
 }
 
 
 }
 
 
@@ -206,7 +206,7 @@ class wxHtmlImageMapCell : public wxHtmlCell
     protected:
         wxString m_Name;
     public:
     protected:
         wxString m_Name;
     public:
-        virtual wxString GetLink( int x = 0, int y = 0 ) const;
+        virtual wxHtmlLinkInfo *GetLink( int x = 0, int y = 0 ) const;
         virtual const wxHtmlCell *Find( int cond, const void *param ) const;
 };
 
         virtual const wxHtmlCell *Find( int cond, const void *param ) const;
 };
 
@@ -216,9 +216,9 @@ wxHtmlImageMapCell::wxHtmlImageMapCell( wxString &name )
     m_Name = name ;
 }
 
     m_Name = name ;
 }
 
-wxString wxHtmlImageMapCell::GetLink( int x, int y ) const
+wxHtmlLinkInfo *wxHtmlImageMapCell::GetLink( int x, int y ) const
 {
 {
-    wxHtmlImageMapAreaCell     *a = (wxHtmlImageMapAreaCell*)m_Next;
+    wxHtmlImageMapAreaCell  *a = (wxHtmlImageMapAreaCell*)m_Next;
     if (a)
         return a->GetLink( x, y );
     return wxHtmlCell::GetLink( x, y );
     if (a)
         return a->GetLink( x, y );
     return wxHtmlCell::GetLink( x, y );
@@ -249,10 +249,10 @@ class wxHtmlImageCell : public wxHtmlCell
         wxHtmlImageMapCell *m_ImageMap;
         wxString m_MapName;
 
         wxHtmlImageMapCell *m_ImageMap;
         wxString m_MapName;
 
-        wxHtmlImageCell(wxFSFile *input, int w = -1, int h = -1, int align = wxHTML_ALIGN_BOTTOM, wxString mapname = wxEmptyString);
+        wxHtmlImageCell(wxFSFile *input, int w = -1, int h = -1, double scale = 1.0, int align = wxHTML_ALIGN_BOTTOM, wxString mapname = wxEmptyString);
         ~wxHtmlImageCell() {if (m_Image) delete m_Image; }
         void Draw(wxDC& dc, int x, int y, int view_y1, int view_y2);
         ~wxHtmlImageCell() {if (m_Image) delete m_Image; }
         void Draw(wxDC& dc, int x, int y, int view_y1, int view_y2);
-        virtual wxString GetLink( int x = 0, int y = 0 ) const;
+        virtual wxHtmlLinkInfo *GetLink( int x = 0, int y = 0 ) const;
 };
 
 
 };
 
 
@@ -262,7 +262,7 @@ class wxHtmlImageCell : public wxHtmlCell
 // wxHtmlImageCell
 //--------------------------------------------------------------------------------
 
 // wxHtmlImageCell
 //--------------------------------------------------------------------------------
 
-wxHtmlImageCell::wxHtmlImageCell(wxFSFile *input, int w, int h, int align, wxString mapname) : wxHtmlCell()
+wxHtmlImageCell::wxHtmlImageCell(wxFSFile *input, int w, int h, double scale, int align, wxString mapname) : wxHtmlCell()
 {
     wxImage *img;
     int ww, hh;
 {
     wxImage *img;
     int ww, hh;
@@ -276,6 +276,10 @@ wxHtmlImageCell::wxHtmlImageCell(wxFSFile *input, int w, int h, int align, wxStr
         hh = img -> GetHeight();
         if (w != -1) m_Width = w; else m_Width = ww;
         if (h != -1) m_Height = h; else m_Height = hh;
         hh = img -> GetHeight();
         if (w != -1) m_Width = w; else m_Width = ww;
         if (h != -1) m_Height = h; else m_Height = hh;
+
+        m_Width = (int)(scale * (double)m_Width);
+        m_Height = (int)(scale * (double)m_Height);
+
         if ((m_Width != ww) || (m_Height != hh)) {
             wxImage img2 = img -> Scale(m_Width, m_Height);
             m_Image = new wxBitmap(img2.ConvertToBitmap());
         if ((m_Width != ww) || (m_Height != hh)) {
             wxImage img2 = img -> Scale(m_Width, m_Height);
             m_Image = new wxBitmap(img2.ConvertToBitmap());
@@ -306,16 +310,17 @@ wxHtmlImageCell::wxHtmlImageCell(wxFSFile *input, int w, int h, int align, wxStr
 void wxHtmlImageCell::Draw(wxDC& dc, int x, int y, int view_y1, int view_y2)
 {
     if (m_Image)
 void wxHtmlImageCell::Draw(wxDC& dc, int x, int y, int view_y1, int view_y2)
 {
     if (m_Image)
+//        dc.DrawBitmap(*m_Image, x + m_PosX, y + m_PosY, (m_Image->GetMask() != (wxMask*) 0));
         dc.DrawBitmap(*m_Image, x + m_PosX, y + m_PosY, TRUE);
     wxHtmlCell::Draw(dc, x, y, view_y1, view_y2);
 }
 
         dc.DrawBitmap(*m_Image, x + m_PosX, y + m_PosY, TRUE);
     wxHtmlCell::Draw(dc, x, y, view_y1, view_y2);
 }
 
-wxString wxHtmlImageCell::GetLink( int x, int y ) const
+wxHtmlLinkInfo *wxHtmlImageCell::GetLink( int x, int y ) const
 {
     if (m_MapName.IsEmpty())
         return wxHtmlCell::GetLink( x, y );
     if (!m_ImageMap) {
 {
     if (m_MapName.IsEmpty())
         return wxHtmlCell::GetLink( x, y );
     if (!m_ImageMap) {
-        wxHtmlContainerCell    *p, *op;
+        wxHtmlContainerCell *p, *op;
         op = p = GetParent();
         while (p) {
             op = p;
         op = p = GetParent();
         while (p) {
             op = p;
@@ -346,44 +351,44 @@ TAG_HANDLER_BEGIN(IMG, "IMG,MAP,AREA")
 
     TAG_HANDLER_PROC(tag)
     {
 
     TAG_HANDLER_PROC(tag)
     {
-        if (tag.GetName() == "IMG") {
-            if (tag.HasParam("SRC")) {
+        if (tag.GetName() == wxT("IMG")) {
+            if (tag.HasParam(wxT("SRC"))) {
                 int w = -1, h = -1;
                 int al;
                 wxFSFile *str;
                 int w = -1, h = -1;
                 int al;
                 wxFSFile *str;
-                wxString tmp = tag.GetParam("SRC");
+                wxString tmp = tag.GetParam(wxT("SRC"));
                 wxString mn = wxEmptyString;
 
                 str = m_WParser -> GetFS() -> OpenFile(tmp);
                 if (tag.HasParam(wxT("WIDTH"))) tag.ScanParam(wxT("WIDTH"), wxT("%i"), &w);
                 if (tag.HasParam(wxT("HEIGHT"))) tag.ScanParam(wxT("HEIGHT"), wxT("%i"), &h);
                 al = wxHTML_ALIGN_BOTTOM;
                 wxString mn = wxEmptyString;
 
                 str = m_WParser -> GetFS() -> OpenFile(tmp);
                 if (tag.HasParam(wxT("WIDTH"))) tag.ScanParam(wxT("WIDTH"), wxT("%i"), &w);
                 if (tag.HasParam(wxT("HEIGHT"))) tag.ScanParam(wxT("HEIGHT"), wxT("%i"), &h);
                 al = wxHTML_ALIGN_BOTTOM;
-                if (tag.HasParam("ALIGN")) {
-                    wxString alstr = tag.GetParam("ALIGN");
+                if (tag.HasParam(wxT("ALIGN"))) {
+                    wxString alstr = tag.GetParam(wxT("ALIGN"));
                     alstr.MakeUpper();  // for the case alignment was in ".."
                     alstr.MakeUpper();  // for the case alignment was in ".."
-                    if (alstr == "TEXTTOP") al = wxHTML_ALIGN_TOP;
-                    else if ((alstr == "CENTER") || (alstr == "ABSCENTER")) al = wxHTML_ALIGN_CENTER;
+                    if (alstr == wxT("TEXTTOP")) al = wxHTML_ALIGN_TOP;
+                    else if ((alstr == wxT("CENTER")) || (alstr == wxT("ABSCENTER"))) al = wxHTML_ALIGN_CENTER;
                 }
                 }
-                if (tag.HasParam("USEMAP")) {
-                    mn = tag.GetParam( "USEMAP" );
-                    if (mn[ 0 ] == '#') {
+                if (tag.HasParam(wxT("USEMAP"))) {
+                    mn = tag.GetParam( wxT("USEMAP") );
+                    if (mn[ (unsigned int) 0 ] == wxT('#')) {
                         mn = mn.Mid( 1 );
                     }
                 }
                 wxHtmlImageCell *cel = NULL;
                 if (str) {
                         mn = mn.Mid( 1 );
                     }
                 }
                 wxHtmlImageCell *cel = NULL;
                 if (str) {
-                    cel = new wxHtmlImageCell(str, w, h, al, mn);
+                    cel = new wxHtmlImageCell(str, w, h, m_WParser -> GetPixelScale(), al, mn);
                     cel -> SetLink(m_WParser -> GetLink());
                     m_WParser -> GetContainer() -> InsertCell(cel);
                     delete str;
                 }
             }
         }
                     cel -> SetLink(m_WParser -> GetLink());
                     m_WParser -> GetContainer() -> InsertCell(cel);
                     delete str;
                 }
             }
         }
-        if (tag.GetName() == "MAP") {
+        if (tag.GetName() == wxT("MAP")) {
             m_WParser->CloseContainer();
             m_WParser->OpenContainer();
             m_WParser->CloseContainer();
             m_WParser->OpenContainer();
-            if (tag.HasParam("NAME")) {
-                wxString tmp = tag.GetParam("NAME");
+            if (tag.HasParam(wxT("NAME"))) {
+                wxString tmp = tag.GetParam(wxT("NAME"));
                 wxHtmlImageMapCell *cel = new wxHtmlImageMapCell( tmp );
                 m_WParser->GetContainer()->InsertCell( cel );
             }
                 wxHtmlImageMapCell *cel = new wxHtmlImageMapCell( tmp );
                 m_WParser->GetContainer()->InsertCell( cel );
             }
@@ -391,25 +396,27 @@ TAG_HANDLER_BEGIN(IMG, "IMG,MAP,AREA")
             m_WParser->CloseContainer();
             m_WParser->OpenContainer();
         }
             m_WParser->CloseContainer();
             m_WParser->OpenContainer();
         }
-        if (tag.GetName() == "AREA") {
-            if (tag.HasParam("SHAPE")) {
-                wxString tmp = tag.GetParam("SHAPE");
-                wxString coords;
+        if (tag.GetName() == wxT("AREA")) {
+            if (tag.HasParam(wxT("SHAPE"))) {
+                wxString tmp = tag.GetParam(wxT("SHAPE"));
+                wxString coords = wxEmptyString;
                 tmp.MakeUpper();
                 wxHtmlImageMapAreaCell *cel = NULL;
                 tmp.MakeUpper();
                 wxHtmlImageMapAreaCell *cel = NULL;
-                if (tag.HasParam("COORDS")) {
-                    coords = tag.GetParam("COORDS");
+                if (tag.HasParam(wxT("COORDS"))) {
+                    coords = tag.GetParam(wxT("COORDS"));
                 }
                 }
-                if (tmp == "POLY") {
-                    cel = new wxHtmlImageMapAreaCell( wxHtmlImageMapAreaCell::POLY, coords );
-                } else if (tmp == "CIRCLE") {
-                    cel = new wxHtmlImageMapAreaCell( wxHtmlImageMapAreaCell::CIRCLE, coords );
-                } else if (tmp == "RECT") {
-                    cel = new wxHtmlImageMapAreaCell( wxHtmlImageMapAreaCell::RECT, coords );
+                if (tmp == wxT("POLY")) {
+                    cel = new wxHtmlImageMapAreaCell( wxHtmlImageMapAreaCell::POLY, coords, m_WParser -> GetPixelScale() );
+                } else if (tmp == wxT("CIRCLE")) {
+                    cel = new wxHtmlImageMapAreaCell( wxHtmlImageMapAreaCell::CIRCLE, coords, m_WParser -> GetPixelScale() );
+                } else if (tmp == wxT("RECT")) {
+                    cel = new wxHtmlImageMapAreaCell( wxHtmlImageMapAreaCell::RECT, coords, m_WParser -> GetPixelScale() );
                 }
                 }
-                if (cel != NULL && tag.HasParam("HREF")) {
-                    wxString tmp = tag.GetParam("HREF");
-                    cel->SetLink( tmp );
+                if (cel != NULL && tag.HasParam(wxT("HREF"))) {
+                    wxString tmp = tag.GetParam(wxT("HREF"));
+                    wxString target = wxEmptyString;
+                    if (tag.HasParam(wxT("TARGET"))) target = tag.GetParam(wxT("TARGET"));
+                    cel->SetLink( wxHtmlLinkInfo(tmp, target));
                 }
                 if (cel != NULL) m_WParser->GetContainer()->InsertCell( cel );
             }
                 }
                 if (cel != NULL) m_WParser->GetContainer()->InsertCell( cel );
             }