Update OpenVMS compile support
[wxWidgets.git] / src / html / m_image.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: src/html/m_image.cpp
3 // Purpose: wxHtml module for displaying images
4 // Author: Vaclav Slavik
5 // RCS-ID: $Id$
6 // Copyright: (c) 1999 Vaclav Slavik, Joel Lucsy
7 // Licence: wxWindows licence
8 /////////////////////////////////////////////////////////////////////////////
9
10 #include "wx/wxprec.h"
11
12 #ifdef __BORLANDC__
13 #pragma hdrstop
14 #endif
15
16 #if wxUSE_HTML && wxUSE_STREAMS
17
18 #ifndef WX_PRECOMP
19 #include "wx/dynarray.h"
20 #include "wx/dc.h"
21 #include "wx/scrolwin.h"
22 #include "wx/timer.h"
23 #include "wx/dcmemory.h"
24 #include "wx/log.h"
25 #include "wx/math.h"
26 #include "wx/image.h"
27 #include "wx/wxcrtvararg.h"
28 #endif
29
30 #include "wx/html/forcelnk.h"
31 #include "wx/html/m_templ.h"
32 #include "wx/html/htmlwin.h"
33
34 #include "wx/gifdecod.h"
35 #include "wx/artprov.h"
36
37 #include <float.h>
38
39 FORCE_LINK_ME(m_image)
40
41
42
43
44 WX_DECLARE_OBJARRAY(int, CoordArray);
45 #include "wx/arrimpl.cpp" // this is a magic incantation which must be done!
46 WX_DEFINE_OBJARRAY(CoordArray)
47
48
49 // ---------------------------------------------------------------------------
50 // wxHtmlImageMapAreaCell
51 // 0-width, 0-height cell that represents single area in
52 // imagemap (it's GetLink is called from wxHtmlImageCell's)
53 // ---------------------------------------------------------------------------
54
55 class wxHtmlImageMapAreaCell : public wxHtmlCell
56 {
57 public:
58 enum celltype { CIRCLE, RECT, POLY };
59 protected:
60 CoordArray coords;
61 celltype type;
62 int radius;
63 public:
64 wxHtmlImageMapAreaCell( celltype t, wxString &coords, double pixel_scale = 1.0);
65 virtual wxHtmlLinkInfo *GetLink( int x = 0, int y = 0 ) const;
66 void Draw(wxDC& WXUNUSED(dc),
67 int WXUNUSED(x), int WXUNUSED(y),
68 int WXUNUSED(view_y1), int WXUNUSED(view_y2),
69 wxHtmlRenderingInfo& WXUNUSED(info)) {}
70
71
72 wxDECLARE_NO_COPY_CLASS(wxHtmlImageMapAreaCell);
73 };
74
75
76
77
78
79 wxHtmlImageMapAreaCell::wxHtmlImageMapAreaCell( wxHtmlImageMapAreaCell::celltype t, wxString &incoords, double pixel_scale )
80 {
81 int i;
82 wxString x = incoords, y;
83
84 type = t;
85 while ((i = x.Find( ',' )) != wxNOT_FOUND)
86 {
87 coords.Add( (int)(pixel_scale * (double)wxAtoi( x.Left( i ).c_str())) );
88 x = x.Mid( i + 1 );
89 }
90 coords.Add( (int)(pixel_scale * (double)wxAtoi( x.c_str())) );
91 }
92
93 wxHtmlLinkInfo *wxHtmlImageMapAreaCell::GetLink( int x, int y ) const
94 {
95 switch (type)
96 {
97 case RECT:
98 {
99 int l, t, r, b;
100
101 l = coords[ 0 ];
102 t = coords[ 1 ];
103 r = coords[ 2 ];
104 b = coords[ 3 ];
105 if (x >= l && x <= r && y >= t && y <= b)
106 {
107 return m_Link;
108 }
109 break;
110 }
111 case CIRCLE:
112 {
113 int l, t, r;
114 double d;
115
116 l = coords[ 0 ];
117 t = coords[ 1 ];
118 r = coords[ 2 ];
119 d = sqrt( (double) (((x - l) * (x - l)) + ((y - t) * (y - t))) );
120 if (d < (double)r)
121 {
122 return m_Link;
123 }
124 }
125 break;
126 case POLY:
127 {
128 if (coords.GetCount() >= 6)
129 {
130 int intersects = 0;
131 int wherex = x;
132 int wherey = y;
133 int totalv = coords.GetCount() / 2;
134 int totalc = totalv * 2;
135 int xval = coords[totalc - 2];
136 int yval = coords[totalc - 1];
137 int end = totalc;
138 int pointer = 1;
139
140 if ((yval >= wherey) != (coords[pointer] >= wherey))
141 {
142 if ((xval >= wherex) == (coords[0] >= wherex))
143 {
144 intersects += (xval >= wherex) ? 1 : 0;
145 }
146 else
147 {
148 intersects += ((xval - (yval - wherey) *
149 (coords[0] - xval) /
150 (coords[pointer] - yval)) >= wherex) ? 1 : 0;
151 }
152 }
153
154 while (pointer < end)
155 {
156 yval = coords[pointer];
157 pointer += 2;
158 if (yval >= wherey)
159 {
160 while ((pointer < end) && (coords[pointer] >= wherey))
161 {
162 pointer += 2;
163 }
164 if (pointer >= end)
165 {
166 break;
167 }
168 if ((coords[pointer - 3] >= wherex) ==
169 (coords[pointer - 1] >= wherex)) {
170 intersects += (coords[pointer - 3] >= wherex) ? 1 : 0;
171 }
172 else
173 {
174 intersects +=
175 ((coords[pointer - 3] - (coords[pointer - 2] - wherey) *
176 (coords[pointer - 1] - coords[pointer - 3]) /
177 (coords[pointer] - coords[pointer - 2])) >= wherex) ? 1 : 0;
178 }
179 }
180 else
181 {
182 while ((pointer < end) && (coords[pointer] < wherey))
183 {
184 pointer += 2;
185 }
186 if (pointer >= end)
187 {
188 break;
189 }
190 if ((coords[pointer - 3] >= wherex) ==
191 (coords[pointer - 1] >= wherex))
192 {
193 intersects += (coords[pointer - 3] >= wherex) ? 1 : 0;
194 }
195 else
196 {
197 intersects +=
198 ((coords[pointer - 3] - (coords[pointer - 2] - wherey) *
199 (coords[pointer - 1] - coords[pointer - 3]) /
200 (coords[pointer] - coords[pointer - 2])) >= wherex) ? 1 : 0;
201 }
202 }
203 }
204 if ((intersects & 1) != 0)
205 {
206 return m_Link;
207 }
208 }
209 }
210 break;
211 }
212
213 if (m_Next)
214 {
215 wxHtmlImageMapAreaCell *a = (wxHtmlImageMapAreaCell*)m_Next;
216 return a->GetLink( x, y );
217 }
218 return NULL;
219 }
220
221
222
223
224
225
226
227
228 //--------------------------------------------------------------------------------
229 // wxHtmlImageMapCell
230 // 0-width, 0-height cell that represents map from imagemaps
231 // it is always placed before wxHtmlImageMapAreaCells
232 // It responds to Find(wxHTML_COND_ISIMAGEMAP)
233 //--------------------------------------------------------------------------------
234
235
236 class wxHtmlImageMapCell : public wxHtmlCell
237 {
238 public:
239 wxHtmlImageMapCell( wxString &name );
240 protected:
241 wxString m_Name;
242 public:
243 virtual wxHtmlLinkInfo *GetLink( int x = 0, int y = 0 ) const;
244 virtual const wxHtmlCell *Find( int cond, const void *param ) const;
245 void Draw(wxDC& WXUNUSED(dc),
246 int WXUNUSED(x), int WXUNUSED(y),
247 int WXUNUSED(view_y1), int WXUNUSED(view_y2),
248 wxHtmlRenderingInfo& WXUNUSED(info)) {}
249
250 wxDECLARE_NO_COPY_CLASS(wxHtmlImageMapCell);
251 };
252
253
254 wxHtmlImageMapCell::wxHtmlImageMapCell( wxString &name )
255 {
256 m_Name = name ;
257 }
258
259 wxHtmlLinkInfo *wxHtmlImageMapCell::GetLink( int x, int y ) const
260 {
261 wxHtmlImageMapAreaCell *a = (wxHtmlImageMapAreaCell*)m_Next;
262 if (a)
263 return a->GetLink( x, y );
264 return wxHtmlCell::GetLink( x, y );
265 }
266
267 const wxHtmlCell *wxHtmlImageMapCell::Find( int cond, const void *param ) const
268 {
269 if (cond == wxHTML_COND_ISIMAGEMAP)
270 {
271 if (m_Name == *((wxString*)(param)))
272 return this;
273 }
274 return wxHtmlCell::Find(cond, param);
275 }
276
277
278
279
280
281 //--------------------------------------------------------------------------------
282 // wxHtmlImageCell
283 // Image/bitmap
284 //--------------------------------------------------------------------------------
285
286 class wxHtmlImageCell : public wxHtmlCell
287 {
288 public:
289 wxHtmlImageCell(wxHtmlWindowInterface *windowIface,
290 wxFSFile *input,
291 int w = wxDefaultCoord, bool wpercent = false,
292 int h = wxDefaultCoord, bool hpresent = false,
293 double scale = 1.0, int align = wxHTML_ALIGN_BOTTOM,
294 const wxString& mapname = wxEmptyString);
295 virtual ~wxHtmlImageCell();
296 void Draw(wxDC& dc, int x, int y, int view_y1, int view_y2,
297 wxHtmlRenderingInfo& info);
298 virtual wxHtmlLinkInfo *GetLink(int x = 0, int y = 0) const;
299
300 void SetImage(const wxImage& img);
301 #if wxUSE_GIF && wxUSE_TIMER
302 void AdvanceAnimation(wxTimer *timer);
303 virtual void Layout(int w);
304 #endif
305
306 private:
307 wxBitmap *m_bitmap;
308 int m_align;
309 int m_bmpW, m_bmpH;
310 bool m_bmpWpercent:1;
311 bool m_bmpHpresent:1;
312 bool m_showFrame:1;
313 wxHtmlWindowInterface *m_windowIface;
314 #if wxUSE_GIF && wxUSE_TIMER
315 wxGIFDecoder *m_gifDecoder;
316 wxTimer *m_gifTimer;
317 int m_physX, m_physY;
318 size_t m_nCurrFrame;
319 #endif
320 double m_scale;
321 wxHtmlImageMapCell *m_imageMap;
322 wxString m_mapName;
323
324 wxDECLARE_NO_COPY_CLASS(wxHtmlImageCell);
325 };
326
327 #if wxUSE_GIF && wxUSE_TIMER
328 class wxGIFTimer : public wxTimer
329 {
330 public:
331 wxGIFTimer(wxHtmlImageCell *cell) : m_cell(cell) {}
332 virtual void Notify()
333 {
334 m_cell->AdvanceAnimation(this);
335 }
336
337 private:
338 wxHtmlImageCell *m_cell;
339
340 wxDECLARE_NO_COPY_CLASS(wxGIFTimer);
341 };
342 #endif
343
344
345 //----------------------------------------------------------------------------
346 // wxHtmlImageCell
347 //----------------------------------------------------------------------------
348
349
350 wxHtmlImageCell::wxHtmlImageCell(wxHtmlWindowInterface *windowIface,
351 wxFSFile *input,
352 int w, bool wpercent, int h, bool hpresent, double scale, int align,
353 const wxString& mapname) : wxHtmlCell()
354 {
355 m_windowIface = windowIface;
356 m_scale = scale;
357 m_showFrame = false;
358 m_bitmap = NULL;
359 m_bmpW = w;
360 m_bmpH = h;
361 m_align = align;
362 m_bmpWpercent = wpercent;
363 m_bmpHpresent = hpresent;
364 m_imageMap = NULL;
365 m_mapName = mapname;
366 SetCanLiveOnPagebreak(false);
367 #if wxUSE_GIF && wxUSE_TIMER
368 m_gifDecoder = NULL;
369 m_gifTimer = NULL;
370 m_physX = m_physY = wxDefaultCoord;
371 m_nCurrFrame = 0;
372 #endif
373
374 if ( m_bmpW && m_bmpH )
375 {
376 if ( input )
377 {
378 wxInputStream *s = input->GetStream();
379
380 if ( s )
381 {
382 #if wxUSE_GIF && wxUSE_TIMER
383 bool readImg = true;
384 if ( m_windowIface &&
385 (input->GetLocation().Matches(wxT("*.gif")) ||
386 input->GetLocation().Matches(wxT("*.GIF"))) )
387 {
388 m_gifDecoder = new wxGIFDecoder();
389 if ( m_gifDecoder->LoadGIF(*s) == wxGIF_OK )
390 {
391 wxImage img;
392 if ( m_gifDecoder->ConvertToImage(0, &img) )
393 SetImage(img);
394
395 readImg = false;
396
397 if ( m_gifDecoder->IsAnimation() )
398 {
399 m_gifTimer = new wxGIFTimer(this);
400 long delay = m_gifDecoder->GetDelay(0);
401 if ( delay == 0 )
402 delay = 1;
403 m_gifTimer->Start(delay, true);
404 }
405 else
406 {
407 wxDELETE(m_gifDecoder);
408 }
409 }
410 else
411 {
412 wxDELETE(m_gifDecoder);
413 }
414 }
415
416 if ( readImg )
417 #endif // wxUSE_GIF && wxUSE_TIMER
418 {
419 wxImage image(*s, wxBITMAP_TYPE_ANY);
420 if ( image.Ok() )
421 SetImage(image);
422 }
423 }
424 }
425 else // input==NULL, use "broken image" bitmap
426 {
427 if ( m_bmpW == wxDefaultCoord && m_bmpH == wxDefaultCoord )
428 {
429 m_bmpW = 29;
430 m_bmpH = 31;
431 }
432 else
433 {
434 m_showFrame = true;
435 if ( m_bmpW == wxDefaultCoord ) m_bmpW = 31;
436 if ( m_bmpH == wxDefaultCoord ) m_bmpH = 33;
437 }
438 m_bitmap =
439 new wxBitmap(wxArtProvider::GetBitmap(wxART_MISSING_IMAGE));
440 }
441 }
442 //else: ignore the 0-sized images used sometimes on the Web pages
443
444 }
445
446 void wxHtmlImageCell::SetImage(const wxImage& img)
447 {
448 #if !defined(__WXMSW__) || wxUSE_WXDIB
449 if ( img.Ok() )
450 {
451 delete m_bitmap;
452
453 int ww, hh;
454 ww = img.GetWidth();
455 hh = img.GetHeight();
456
457 if ( m_bmpW == wxDefaultCoord)
458 m_bmpW = ww;
459 if ( m_bmpH == wxDefaultCoord)
460 m_bmpH = hh;
461
462 // Only scale the bitmap at the rendering stage,
463 // so we don't lose quality twice
464 /*
465 if ((m_bmpW != ww) || (m_bmpH != hh))
466 {
467 wxImage img2 = img.Scale(m_bmpW, m_bmpH);
468 m_bitmap = new wxBitmap(img2);
469 }
470 else
471 */
472 m_bitmap = new wxBitmap(img);
473 }
474 #endif
475 }
476
477 #if wxUSE_GIF && wxUSE_TIMER
478 void wxHtmlImageCell::AdvanceAnimation(wxTimer *timer)
479 {
480 wxImage img;
481
482 // advance current frame
483 m_nCurrFrame++;
484 if (m_nCurrFrame == m_gifDecoder->GetFrameCount())
485 m_nCurrFrame = 0;
486
487 if ( m_physX == wxDefaultCoord )
488 {
489 m_physX = m_physY = 0;
490 for (wxHtmlCell *cell = this; cell; cell = cell->GetParent())
491 {
492 m_physX += cell->GetPosX();
493 m_physY += cell->GetPosY();
494 }
495 }
496
497 wxWindow *win = m_windowIface->GetHTMLWindow();
498 wxPoint pos =
499 m_windowIface->HTMLCoordsToWindow(this, wxPoint(m_physX, m_physY));
500 wxRect rect(pos, wxSize(m_Width, m_Height));
501
502 if ( win->GetClientRect().Intersects(rect) &&
503 m_gifDecoder->ConvertToImage(m_nCurrFrame, &img) )
504 {
505 #if !defined(__WXMSW__) || wxUSE_WXDIB
506 if ( m_gifDecoder->GetFrameSize(m_nCurrFrame) != wxSize(m_Width, m_Height) ||
507 m_gifDecoder->GetFramePosition(m_nCurrFrame) != wxPoint(0, 0) )
508 {
509 wxBitmap bmp(img);
510 wxMemoryDC dc;
511 dc.SelectObject(*m_bitmap);
512 dc.DrawBitmap(bmp, m_gifDecoder->GetFramePosition(m_nCurrFrame),
513 true /* use mask */);
514 }
515 else
516 #endif
517 SetImage(img);
518 win->Refresh(img.HasMask(), &rect);
519 }
520
521 long delay = m_gifDecoder->GetDelay(m_nCurrFrame);
522 if ( delay == 0 )
523 delay = 1;
524 timer->Start(delay, true);
525 }
526
527 void wxHtmlImageCell::Layout(int w)
528 {
529 if (m_bmpWpercent)
530 {
531
532 m_Width = w*m_bmpW/100;
533
534 if (!m_bmpHpresent && m_bitmap != NULL)
535 m_Height = m_bitmap->GetHeight()*m_Width/m_bitmap->GetWidth();
536 else
537 m_Height = m_scale*m_bmpH;
538 } else
539 {
540 m_Width = m_scale*m_bmpW;
541 m_Height = m_scale*m_bmpH;
542 }
543
544 switch (m_align)
545 {
546 case wxHTML_ALIGN_TOP :
547 m_Descent = m_Height;
548 break;
549 case wxHTML_ALIGN_CENTER :
550 m_Descent = m_Height / 2;
551 break;
552 case wxHTML_ALIGN_BOTTOM :
553 default :
554 m_Descent = 0;
555 break;
556 }
557
558 wxHtmlCell::Layout(w);
559 m_physX = m_physY = wxDefaultCoord;
560 }
561
562 #endif
563
564 wxHtmlImageCell::~wxHtmlImageCell()
565 {
566 delete m_bitmap;
567 #if wxUSE_GIF && wxUSE_TIMER
568 delete m_gifTimer;
569 delete m_gifDecoder;
570 #endif
571 }
572
573
574 void wxHtmlImageCell::Draw(wxDC& dc, int x, int y,
575 int WXUNUSED(view_y1), int WXUNUSED(view_y2),
576 wxHtmlRenderingInfo& WXUNUSED(info))
577 {
578 if ( m_showFrame )
579 {
580 dc.SetBrush(*wxTRANSPARENT_BRUSH);
581 dc.SetPen(*wxBLACK_PEN);
582 dc.DrawRectangle(x + m_PosX, y + m_PosY, m_Width, m_Height);
583 x++, y++;
584 }
585 if ( m_bitmap )
586 {
587 // We add in the scaling from the desired bitmap width
588 // and height, so we only do the scaling once.
589 double imageScaleX = 1.0;
590 double imageScaleY = 1.0;
591 if (m_Width != m_bitmap->GetWidth())
592 imageScaleX = (double) m_Width / (double) m_bitmap->GetWidth();
593 if (m_Height != m_bitmap->GetHeight())
594 imageScaleY = (double) m_Height / (double) m_bitmap->GetHeight();
595
596 double us_x, us_y;
597 dc.GetUserScale(&us_x, &us_y);
598 dc.SetUserScale(us_x * imageScaleX, us_y * imageScaleY);
599
600 dc.DrawBitmap(*m_bitmap, (int) ((x + m_PosX) / (imageScaleX)),
601 (int) ((y + m_PosY) / (imageScaleY)), true);
602 dc.SetUserScale(us_x, us_y);
603 }
604 }
605
606 wxHtmlLinkInfo *wxHtmlImageCell::GetLink( int x, int y ) const
607 {
608 if (m_mapName.empty())
609 return wxHtmlCell::GetLink( x, y );
610 if (!m_imageMap)
611 {
612 wxHtmlContainerCell *p, *op;
613 op = p = GetParent();
614 while (p)
615 {
616 op = p;
617 p = p->GetParent();
618 }
619 p = op;
620 wxHtmlCell *cell = (wxHtmlCell*)p->Find(wxHTML_COND_ISIMAGEMAP,
621 (const void*)(&m_mapName));
622 if (!cell)
623 {
624 ((wxString&)m_mapName).Clear();
625 return wxHtmlCell::GetLink( x, y );
626 }
627 { // dirty hack, ask Joel why he fills m_ImageMap in this place
628 // THE problem is that we're in const method and we can't modify m_ImageMap
629 wxHtmlImageMapCell **cx = (wxHtmlImageMapCell**)(&m_imageMap);
630 *cx = (wxHtmlImageMapCell*)cell;
631 }
632 }
633 return m_imageMap->GetLink(x, y);
634 }
635
636
637
638 //--------------------------------------------------------------------------------
639 // tag handler
640 //--------------------------------------------------------------------------------
641
642 TAG_HANDLER_BEGIN(IMG, "IMG,MAP,AREA")
643 TAG_HANDLER_CONSTR(IMG) { }
644
645 TAG_HANDLER_PROC(tag)
646 {
647 if (tag.GetName() == wxT("IMG"))
648 {
649 if (tag.HasParam(wxT("SRC")))
650 {
651 int w = wxDefaultCoord, h = wxDefaultCoord;
652 bool wpercent = false;
653 bool hpresent = false;
654 int al;
655 wxFSFile *str;
656 wxString tmp = tag.GetParam(wxT("SRC"));
657 wxString mn = wxEmptyString;
658
659 str = m_WParser->OpenURL(wxHTML_URL_IMAGE, tmp);
660
661 if (tag.HasParam(wxT("WIDTH")))
662 {
663 wxString param = tag.GetParam(wxT("WIDTH"));
664 wxSscanf(param.c_str(), wxT("%i"), &w);
665 if (param.EndsWith(wxT("%"))) {
666 if (w < 0)
667 w = 0;
668 else if (w > 100)
669 w = 100;
670 wpercent = true;
671 }
672
673 }
674
675 if (tag.HasParam(wxT("HEIGHT")))
676 {
677 tag.GetParamAsInt(wxT("HEIGHT"), &h);
678 hpresent = true;
679 }
680
681 al = wxHTML_ALIGN_BOTTOM;
682 if (tag.HasParam(wxT("ALIGN")))
683 {
684 wxString alstr = tag.GetParam(wxT("ALIGN"));
685 alstr.MakeUpper(); // for the case alignment was in ".."
686 if (alstr == wxT("TEXTTOP"))
687 al = wxHTML_ALIGN_TOP;
688 else if ((alstr == wxT("CENTER")) || (alstr == wxT("ABSCENTER")))
689 al = wxHTML_ALIGN_CENTER;
690 }
691 if (tag.HasParam(wxT("USEMAP")))
692 {
693 mn = tag.GetParam( wxT("USEMAP") );
694 if ( !mn.empty() && *mn.begin() == '#' )
695 {
696 mn = mn.Mid( 1 );
697 }
698 }
699 wxHtmlImageCell *cel = new wxHtmlImageCell(
700 m_WParser->GetWindowInterface(),
701 str, w, wpercent, h, hpresent,
702 m_WParser->GetPixelScale(),
703 al, mn);
704 m_WParser->ApplyStateToCell(cel);
705 cel->SetId(tag.GetParam(wxT("id"))); // may be empty
706 m_WParser->GetContainer()->InsertCell(cel);
707 if (str)
708 delete str;
709 }
710 }
711 if (tag.GetName() == wxT("MAP"))
712 {
713 m_WParser->CloseContainer();
714 m_WParser->OpenContainer();
715 if (tag.HasParam(wxT("NAME")))
716 {
717 wxString tmp = tag.GetParam(wxT("NAME"));
718 wxHtmlImageMapCell *cel = new wxHtmlImageMapCell( tmp );
719 m_WParser->GetContainer()->InsertCell( cel );
720 }
721 ParseInner( tag );
722 m_WParser->CloseContainer();
723 m_WParser->OpenContainer();
724 }
725 if (tag.GetName() == wxT("AREA"))
726 {
727 if (tag.HasParam(wxT("SHAPE")))
728 {
729 wxString tmp = tag.GetParam(wxT("SHAPE"));
730 wxString coords = wxEmptyString;
731 tmp.MakeUpper();
732 wxHtmlImageMapAreaCell *cel = NULL;
733 if (tag.HasParam(wxT("COORDS")))
734 {
735 coords = tag.GetParam(wxT("COORDS"));
736 }
737 if (tmp == wxT("POLY"))
738 {
739 cel = new wxHtmlImageMapAreaCell( wxHtmlImageMapAreaCell::POLY, coords, m_WParser->GetPixelScale() );
740 }
741 else if (tmp == wxT("CIRCLE"))
742 {
743 cel = new wxHtmlImageMapAreaCell( wxHtmlImageMapAreaCell::CIRCLE, coords, m_WParser->GetPixelScale() );
744 }
745 else if (tmp == wxT("RECT"))
746 {
747 cel = new wxHtmlImageMapAreaCell( wxHtmlImageMapAreaCell::RECT, coords, m_WParser->GetPixelScale() );
748 }
749 if (cel != NULL && tag.HasParam(wxT("HREF")))
750 {
751 wxString target;
752 if (tag.HasParam(wxT("TARGET")))
753 target = tag.GetParam(wxT("TARGET"));
754 cel->SetLink(wxHtmlLinkInfo(tag.GetParam(wxT("HREF")), target));
755 }
756 if (cel != NULL)
757 m_WParser->GetContainer()->InsertCell( cel );
758 }
759 }
760
761 return false;
762 }
763
764 TAG_HANDLER_END(IMG)
765
766
767
768 TAGS_MODULE_BEGIN(Image)
769
770 TAGS_MODULE_ADD(IMG)
771
772 TAGS_MODULE_END(Image)
773
774
775 #endif