+/* XPM */
+static const char * broken_image_xpm[] = {
+"29 31 7 1",
+" c None",
+". c #808080",
+"+ c #FFFFFF",
+"@ c #C0C0C0",
+"# c #000000",
+"$ c #333366",
+"% c #B2B2B2",
+"..................... ",
+".+++++++++++++++++++.. ",
+".+++++++++++++++++++.@. ",
+".++@@@@@@@@@@@@@@@@@.+@. ",
+".++@@@@@@@@@@@@@@@@@.++@. ",
+".++@@@@@.@@@@.@@@@@@.+++@. ",
+".++@@@@@@@@@@@@@@@@@.++++@. ",
+".++@@@@@@@@@@@@@@@@@.+++++@. ",
+".++@@.@@@@@@@@@@.@@@######## ",
+".++@@@@@@@@@@@@@@@@@@$$$$$$#.",
+".######@@@@@@@@@@@@@@@.....#.",
+" ###@@@@@@@@@@@@@@@++#.",
+" #####@@@@@@@@@@++#.",
+" #@.@@@@@@@@++#.",
+".. ###@@@@@@@++#.",
+".+.... #@@@@@@++#.",
+".++@@@... ####@@++#.",
+".++@@@@@@.. #####.",
+".++@@@@@@@@... ",
+".++@@@@@@%%%%@. ",
+".++@@@@@@%%%%@@.... ",
+".++@@@@@@%%%%@@@@@@.... ",
+".++@@@@@@%%%%@@@@@@@@@@.... ",
+".++@@@@@@@@@@@@@@@@@@@@@@++#.",
+".++@@@@@@@@@@@@@@@@@@@@@@++#.",
+".++@@@@@@@@@@@@@@@@@@@@@@++#.",
+".++@@@@@@@@@@@@@@@@@@@@@@++#.",
+".++@@@@@@@@@@@@@@@@@@@@@@++#.",
+".++++++++++++++++++++++++++#.",
+".++++++++++++++++++++++++++#.",
+"############################."};
+
+wxHtmlImageCell::wxHtmlImageCell(wxWindow *window, wxFSFile *input,
+ int w, int h, double scale, int align,
+ const wxString& mapname) : wxHtmlCell()
+{
+ m_window = window ? wxStaticCast(window, wxScrolledWindow) : NULL;
+ m_scale = scale;
+ m_showFrame = FALSE;
+ m_bitmap = NULL;
+ m_bmpW = w;
+ m_bmpH = h;
+ m_imageMap = NULL;
+ m_mapName = mapname;
+ SetCanLiveOnPagebreak(FALSE);
+#if wxUSE_GIF && wxUSE_TIMER
+ m_gifDecoder = NULL;
+ m_gifTimer = NULL;
+ m_physX = m_physY = -1;
+#endif
+
+ if ( input )
+ {
+ wxInputStream *s = input->GetStream();
+
+ if ( s )
+ {
+ bool readImg = TRUE;
+
+#if wxUSE_GIF && wxUSE_TIMER
+ if ( (input->GetLocation().Matches(wxT("*.gif")) ||
+ input->GetLocation().Matches(wxT("*.GIF"))) && m_window )
+ {
+ m_gifDecoder = new wxGIFDecoder(s, TRUE);
+ if ( m_gifDecoder->ReadGIF() == wxGIF_OK )
+ {
+ wxImage img;
+ if ( m_gifDecoder->ConvertToImage(&img) )
+ SetImage(img);
+
+ readImg = FALSE;
+
+ if ( m_gifDecoder->IsAnimation() )
+ {
+ m_gifTimer = new wxGIFTimer(this);
+ m_gifTimer->Start(m_gifDecoder->GetDelay(), TRUE);
+ }
+ else
+ {
+ wxDELETE(m_gifDecoder);
+ }
+ }
+ else
+ {
+ wxDELETE(m_gifDecoder);
+ }
+ }
+
+ if ( readImg )
+#endif // wxUSE_GIF && wxUSE_TIMER
+ {
+ SetImage(wxImage(*s, wxBITMAP_TYPE_ANY));
+ }
+ }
+ }
+ else // input==NULL, use "broken image" bitmap
+ {
+ if ( m_bmpW == -1 && m_bmpH == -1 )
+ {
+ m_bmpW = 29;
+ m_bmpH = 31;
+ }
+ else
+ {
+ m_showFrame = TRUE;
+ if ( m_bmpW == -1 ) m_bmpW = 31;
+ if ( m_bmpH == -1 ) m_bmpH = 33;
+ }
+ m_bitmap = new wxBitmap(broken_image_xpm);
+ }
+
+ m_Width = (int)(scale * (double)m_bmpW);
+ m_Height = (int)(scale * (double)m_bmpH);
+
+ switch (align)
+ {
+ case wxHTML_ALIGN_TOP :
+ m_Descent = m_Height;
+ break;
+ case wxHTML_ALIGN_CENTER :
+ m_Descent = m_Height / 2;
+ break;
+ case wxHTML_ALIGN_BOTTOM :
+ default :
+ m_Descent = 0;
+ break;
+ }
+ }
+
+void wxHtmlImageCell::SetImage(const wxImage& img)