]>
git.saurik.com Git - wxWidgets.git/blob - src/html/m_image.cpp
   1 ///////////////////////////////////////////////////////////////////////////// 
   3 // Purpose:     wxHtml module for displaying images 
   4 // Author:      Vaclav Slavik 
   6 // Copyright:   (c) 1999 Vaclav Slavik, Joel Lucsy 
   7 // Licence:     wxWindows Licence 
   8 ///////////////////////////////////////////////////////////////////////////// 
  11 #pragma implementation 
  14 #include "wx/wxprec.h" 
  17 #if wxUSE_HTML && wxUSE_STREAMS 
  27 #include "wx/html/forcelnk.h" 
  28 #include "wx/html/m_templ.h" 
  32 #include "wx/dynarray.h" 
  37 FORCE_LINK_ME(m_image
) 
  42 WX_DECLARE_OBJARRAY(int, CoordArray
); 
  43 #include "wx/arrimpl.cpp" // this is a magic incantation which must be done! 
  44 WX_DEFINE_OBJARRAY(CoordArray
); 
  47 //-------------------------------------------------------------------------------- 
  48 // wxHtmlImageMapAreaCell 
  49 //                  0-width, 0-height cell that represents single area in imagemap 
  50 //                  (it's GetLink is called from wxHtmlImageCell's) 
  51 //-------------------------------------------------------------------------------- 
  53 class wxHtmlImageMapAreaCell 
: public wxHtmlCell
 
  56         enum celltype 
{ CIRCLE
, RECT
, POLY 
}; 
  62         wxHtmlImageMapAreaCell( celltype t
, wxString 
&coords
, double pixel_scale 
= 1.0); 
  63         virtual wxHtmlLinkInfo 
*GetLink( int x 
= 0, int y 
= 0 ) const; 
  70 wxHtmlImageMapAreaCell::wxHtmlImageMapAreaCell( wxHtmlImageMapAreaCell::celltype t
, wxString 
&incoords
, double pixel_scale 
) 
  73     wxString x 
= incoords
, y
; 
  76     while ((i 
= x
.Find( ',' )) != -1) { 
  77         coords
.Add( (int)(pixel_scale 
* (double)wxAtoi( x
.Left( i 
).c_str())) ); 
  80     coords
.Add( (int)(pixel_scale 
* (double)wxAtoi( x
.c_str())) ); 
  83 wxHtmlLinkInfo 
*wxHtmlImageMapAreaCell::GetLink( int x
, int y 
) const 
  94                 if (x 
>= l 
&& x 
<= r 
&& y 
>= t 
&& y 
<= b
) { 
 107                 d 
= sqrt( (double) (((x 
- l
) * (x 
- l
)) + ((y 
- t
) * (y 
- t
))) ); 
 115                 if (coords
.GetCount() >= 6) { 
 119                     int totalv 
= coords
.GetCount() / 2; 
 120                     int totalc 
= totalv 
* 2; 
 121                     int xval 
= coords
[totalc 
- 2]; 
 122                     int yval 
= coords
[totalc 
- 1]; 
 126                     if ((yval 
>= wherey
) != (coords
[pointer
] >= wherey
)) { 
 127                         if ((xval 
>= wherex
) == (coords
[0] >= wherex
)) { 
 128                             intersects 
+= (xval 
>= wherex
) ? 1 : 0; 
 130                             intersects 
+= ((xval 
- (yval 
- wherey
) * 
 132                                             (coords
[pointer
] - yval
)) >= wherex
) ? 1 : 0; 
 136                     while (pointer 
< end
) { 
 137                         yval 
= coords
[pointer
]; 
 139                         if (yval 
>= wherey
) { 
 140                             while ((pointer 
< end
) && (coords
[pointer
] >= wherey
)) { 
 143                             if (pointer 
>= end
) { 
 146                             if ((coords
[pointer 
- 3] >= wherex
) == 
 147                                     (coords
[pointer 
- 1] >= wherex
)) { 
 148                                 intersects 
+= (coords
[pointer 
- 3] >= wherex
) ? 1 : 0; 
 151                                     ((coords
[pointer 
- 3] - (coords
[pointer 
- 2] - wherey
) * 
 152                                       (coords
[pointer 
- 1] - coords
[pointer 
- 3]) / 
 153                                       (coords
[pointer
] - coords
[pointer 
- 2])) >= wherex
) ? 1 : 0; 
 156                             while ((pointer 
< end
) && (coords
[pointer
] < wherey
)) { 
 159                             if (pointer 
>= end
) { 
 162                             if ((coords
[pointer 
- 3] >= wherex
) == 
 163                                     (coords
[pointer 
- 1] >= wherex
)) { 
 164                                 intersects 
+= (coords
[pointer 
- 3] >= wherex
) ? 1 : 0; 
 167                                     ((coords
[pointer 
- 3] - (coords
[pointer 
- 2] - wherey
) * 
 168                                       (coords
[pointer 
- 1] - coords
[pointer 
- 3]) / 
 169                                       (coords
[pointer
] - coords
[pointer 
- 2])) >= wherex
) ? 1 : 0; 
 173                     if ((intersects 
& 1) != 0) { 
 181         wxHtmlImageMapAreaCell  
*a 
= (wxHtmlImageMapAreaCell
*)m_Next
; 
 182         return a
->GetLink( x
, y 
); 
 194 //-------------------------------------------------------------------------------- 
 195 // wxHtmlImageMapCell 
 196 //                  0-width, 0-height cell that represents map from imagemaps 
 197 //                  it is always placed before wxHtmlImageMapAreaCells 
 198 //                  It responds to Find(wxHTML_COND_ISIMAGEMAP) 
 199 //-------------------------------------------------------------------------------- 
 202 class wxHtmlImageMapCell 
: public wxHtmlCell
 
 205         wxHtmlImageMapCell( wxString 
&name 
); 
 209         virtual wxHtmlLinkInfo 
*GetLink( int x 
= 0, int y 
= 0 ) const; 
 210         virtual const wxHtmlCell 
*Find( int cond
, const void *param 
) const; 
 214 wxHtmlImageMapCell::wxHtmlImageMapCell( wxString 
&name 
) 
 219 wxHtmlLinkInfo 
*wxHtmlImageMapCell::GetLink( int x
, int y 
) const 
 221     wxHtmlImageMapAreaCell  
*a 
= (wxHtmlImageMapAreaCell
*)m_Next
; 
 223         return a
->GetLink( x
, y 
); 
 224     return wxHtmlCell::GetLink( x
, y 
); 
 227 const wxHtmlCell 
*wxHtmlImageMapCell::Find( int cond
, const void *param 
) const 
 229     if (cond 
== wxHTML_COND_ISIMAGEMAP
) { 
 230         if (m_Name 
== *((wxString
*)(param
))) 
 233     return wxHtmlCell::Find(cond
, param
); 
 240 //-------------------------------------------------------------------------------- 
 243 //-------------------------------------------------------------------------------- 
 245 class wxHtmlImageCell 
: public wxHtmlCell
 
 249         wxHtmlImageMapCell 
*m_ImageMap
; 
 252         wxHtmlImageCell(wxFSFile 
*input
, int w 
= -1, int h 
= -1, double scale 
= 1.0, int align 
= wxHTML_ALIGN_BOTTOM
, wxString mapname 
= wxEmptyString
); 
 253         ~wxHtmlImageCell() {if (m_Image
) delete m_Image
; } 
 254         void Draw(wxDC
& dc
, int x
, int y
, int view_y1
, int view_y2
); 
 255         virtual wxHtmlLinkInfo 
*GetLink( int x 
= 0, int y 
= 0 ) const; 
 261 //-------------------------------------------------------------------------------- 
 263 //-------------------------------------------------------------------------------- 
 265 wxHtmlImageCell::wxHtmlImageCell(wxFSFile 
*input
, int w
, int h
, double scale
, int align
, wxString mapname
) : wxHtmlCell() 
 269     wxInputStream 
*s 
= input 
-> GetStream(); 
 271     img 
= new wxImage(*s
, wxBITMAP_TYPE_ANY
); 
 274     if (img 
&& (img 
-> Ok())) { 
 275         ww 
= img 
-> GetWidth(); 
 276         hh 
= img 
-> GetHeight(); 
 277         if (w 
!= -1) m_Width 
= w
; else m_Width 
= ww
; 
 278         if (h 
!= -1) m_Height 
= h
; else m_Height 
= hh
; 
 280         m_Width 
= (int)(scale 
* (double)m_Width
); 
 281         m_Height 
= (int)(scale 
* (double)m_Height
); 
 283         if ((m_Width 
!= ww
) || (m_Height 
!= hh
)) { 
 284             wxImage img2 
= img 
-> Scale(m_Width
, m_Height
); 
 285             m_Image 
= new wxBitmap(img2
.ConvertToBitmap()); 
 287             m_Image 
= new wxBitmap(img 
-> ConvertToBitmap()); 
 291         case wxHTML_ALIGN_TOP 
: 
 292             m_Descent 
= m_Height
; 
 294         case wxHTML_ALIGN_CENTER 
: 
 295             m_Descent 
= m_Height 
/ 2; 
 297         case wxHTML_ALIGN_BOTTOM 
: 
 305     SetCanLiveOnPagebreak(FALSE
); 
 310 void wxHtmlImageCell::Draw(wxDC
& dc
, int x
, int y
, int view_y1
, int view_y2
) 
 313 //        dc.DrawBitmap(*m_Image, x + m_PosX, y + m_PosY, (m_Image->GetMask() != (wxMask*) 0)); 
 314         dc
.DrawBitmap(*m_Image
, x 
+ m_PosX
, y 
+ m_PosY
, TRUE
); 
 315     wxHtmlCell::Draw(dc
, x
, y
, view_y1
, view_y2
); 
 318 wxHtmlLinkInfo 
*wxHtmlImageCell::GetLink( int x
, int y 
) const 
 320     if (m_MapName
.IsEmpty()) 
 321         return wxHtmlCell::GetLink( x
, y 
); 
 323         wxHtmlContainerCell 
*p
, *op
; 
 324         op 
= p 
= GetParent(); 
 330         wxHtmlCell 
*cell 
= (wxHtmlCell
*)p
->Find( wxHTML_COND_ISIMAGEMAP
, (const void*)(&m_MapName
)); 
 332             ((wxString
&)m_MapName
).Clear(); 
 333             return wxHtmlCell::GetLink( x
, y 
); 
 335         { // dirty hack, ask Joel why he fills m_ImageMap in this place 
 336             // THE problem is that we're in const method and we can't modify m_ImageMap 
 337             wxHtmlImageMapCell 
**cx 
= (wxHtmlImageMapCell
**)(&m_ImageMap
); 
 338             *cx 
= (wxHtmlImageMapCell
*)cell
; 
 341     return m_ImageMap
->GetLink( x
, y 
); 
 346 //-------------------------------------------------------------------------------- 
 348 //-------------------------------------------------------------------------------- 
 350 TAG_HANDLER_BEGIN(IMG
, "IMG,MAP,AREA") 
 352     TAG_HANDLER_PROC(tag
) 
 354         if (tag
.GetName() == wxT("IMG")) { 
 355             if (tag
.HasParam(wxT("SRC"))) { 
 359                 wxString tmp 
= tag
.GetParam(wxT("SRC")); 
 360                 wxString mn 
= wxEmptyString
; 
 362                 str 
= m_WParser 
-> GetFS() -> OpenFile(tmp
); 
 363                 if (tag
.HasParam(wxT("WIDTH"))) tag
.ScanParam(wxT("WIDTH"), wxT("%i"), &w
); 
 364                 if (tag
.HasParam(wxT("HEIGHT"))) tag
.ScanParam(wxT("HEIGHT"), wxT("%i"), &h
); 
 365                 al 
= wxHTML_ALIGN_BOTTOM
; 
 366                 if (tag
.HasParam(wxT("ALIGN"))) { 
 367                     wxString alstr 
= tag
.GetParam(wxT("ALIGN")); 
 368                     alstr
.MakeUpper();  // for the case alignment was in ".." 
 369                     if (alstr 
== wxT("TEXTTOP")) al 
= wxHTML_ALIGN_TOP
; 
 370                     else if ((alstr 
== wxT("CENTER")) || (alstr 
== wxT("ABSCENTER"))) al 
= wxHTML_ALIGN_CENTER
; 
 372                 if (tag
.HasParam(wxT("USEMAP"))) { 
 373                     mn 
= tag
.GetParam( wxT("USEMAP") ); 
 374                     if (mn
[ (unsigned int) 0 ] == wxT('#')) { 
 378                 wxHtmlImageCell 
*cel 
= NULL
; 
 380                     cel 
= new wxHtmlImageCell(str
, w
, h
, m_WParser 
-> GetPixelScale(), al
, mn
); 
 381                     cel 
-> SetLink(m_WParser 
-> GetLink()); 
 382                     m_WParser 
-> GetContainer() -> InsertCell(cel
); 
 387         if (tag
.GetName() == wxT("MAP")) { 
 388             m_WParser
->CloseContainer(); 
 389             m_WParser
->OpenContainer(); 
 390             if (tag
.HasParam(wxT("NAME"))) { 
 391                 wxString tmp 
= tag
.GetParam(wxT("NAME")); 
 392                 wxHtmlImageMapCell 
*cel 
= new wxHtmlImageMapCell( tmp 
); 
 393                 m_WParser
->GetContainer()->InsertCell( cel 
); 
 396             m_WParser
->CloseContainer(); 
 397             m_WParser
->OpenContainer(); 
 399         if (tag
.GetName() == wxT("AREA")) { 
 400             if (tag
.HasParam(wxT("SHAPE"))) { 
 401                 wxString tmp 
= tag
.GetParam(wxT("SHAPE")); 
 402                 wxString coords 
= wxEmptyString
; 
 404                 wxHtmlImageMapAreaCell 
*cel 
= NULL
; 
 405                 if (tag
.HasParam(wxT("COORDS"))) { 
 406                     coords 
= tag
.GetParam(wxT("COORDS")); 
 408                 if (tmp 
== wxT("POLY")) { 
 409                     cel 
= new wxHtmlImageMapAreaCell( wxHtmlImageMapAreaCell::POLY
, coords
, m_WParser 
-> GetPixelScale() ); 
 410                 } else if (tmp 
== wxT("CIRCLE")) { 
 411                     cel 
= new wxHtmlImageMapAreaCell( wxHtmlImageMapAreaCell::CIRCLE
, coords
, m_WParser 
-> GetPixelScale() ); 
 412                 } else if (tmp 
== wxT("RECT")) { 
 413                     cel 
= new wxHtmlImageMapAreaCell( wxHtmlImageMapAreaCell::RECT
, coords
, m_WParser 
-> GetPixelScale() ); 
 415                 if (cel 
!= NULL 
&& tag
.HasParam(wxT("HREF"))) { 
 416                     wxString tmp 
= tag
.GetParam(wxT("HREF")); 
 417                     wxString target 
= wxEmptyString
; 
 418                     if (tag
.HasParam(wxT("TARGET"))) target 
= tag
.GetParam(wxT("TARGET")); 
 419                     cel
->SetLink( wxHtmlLinkInfo(tmp
, target
)); 
 421                 if (cel 
!= NULL
) m_WParser
->GetContainer()->InsertCell( cel 
); 
 432 TAGS_MODULE_BEGIN(Image
) 
 436 TAGS_MODULE_END(Image
)