📄 dx_player.cpp
字号:
winfo->f = 0; // Store the wininfo struct m_windows[name] = winfo; AM_DBG m_logger->debug("windows: %d", m_windows.size()); // Return gui_window return winfo->w;}void gui::dx::dx_player::window_done(const std::string &name) { // called when the window is destructed (wi->w) std::map<std::string, wininfo*>::iterator it = m_windows.find(name); assert(it != m_windows.end()); wininfo *wi = (*it).second; m_windows.erase(it); wi->v->clear(); wi->v->redraw(); delete wi->v; m_hoster.destroy_os_window(wi->h); delete wi; AM_DBG m_logger->debug("windows: %d", m_windows.size());}common::bgrenderer*gui::dx::dx_player::new_background_renderer(const common::region_info *src) { return new dx_bgrenderer(src);}gui::dx::viewport* gui::dx::dx_player::create_viewport(int w, int h, HWND hwnd) { AM_DBG m_logger->debug("dx_player::create_viewport(%d, %d)", w, h); PostMessage(hwnd, WM_SET_CLIENT_RECT, w, h); viewport *v = new gui::dx::viewport(w, h, hwnd); v->redraw(); return v;}gui::dx::dx_player::wininfo*gui::dx::dx_player::get_wininfo(HWND hwnd) { wininfo *winfo = 0; std::map<std::string, wininfo*>::iterator it; for(it=m_windows.begin();it!=m_windows.end();it++) { wininfo *wi = (*it).second; if(wi->h = hwnd) {winfo = wi;break;} } return winfo;}common::gui_window *gui::dx::dx_player::get_window(HWND hwnd) { wininfo *wi = get_wininfo(hwnd); return wi?wi->w:0;}HWNDgui::dx::dx_player::get_main_window() { // XXXX Unsure that this is correct: we just return any window std::map<std::string, wininfo*>::iterator it = m_windows.begin(); if (it == m_windows.end()) return NULL; return (*it).second->h;}////////////////////// common::playable_factory implementationcommon::playable *gui::dx::dx_playable_factory::new_playable( common::playable_notification *context, common::playable_notification::cookie_type cookie, const lib::node *node, lib::event_processor *const evp) { common::playable *p = 0; lib::xml_string tag = node->get_qname().second; AM_DBG m_logger->debug("dx_player::new_playable: %s", tag.c_str()); if(tag == "text") {#ifdef WITH_HTML_WIDGET net::url url = net::url(node->get_url("src")); std::string mimetype = url.guesstype(); if (mimetype == "text/html" || mimetype == "application/xml") { p = new dx_html_renderer(context, cookie, node, evp, m_factory, m_dxplayer); AM_DBG lib::logger::get_logger()->debug("dx_player: node 0x%x: returning dx_html_renderer 0x%x", (void*) node, (void*) p); } else #endif/*WITH_HTML_WIDGET*/ p = new dx_text_renderer(context, cookie, node, evp, m_factory, m_dxplayer); } else if(tag == "img") { p = new dx_img_renderer(context, cookie, node, evp, m_factory, m_dxplayer); } else if(tag == "audio") { p = new dx_audio_renderer(context, cookie, node, evp); } else if(tag == "video") { p = new dx_video_renderer(context, cookie, node, evp, m_dxplayer); } else if(tag == "area") { p = new dx_area(context, cookie, node, evp); } else if(tag == "brush") { p = new dx_brush(context, cookie, node, evp, m_dxplayer); } else { p = new dx_area(context, cookie, node, evp); } return p;}common::playable *gui::dx::dx_playable_factory::new_aux_audio_playable( common::playable_notification *context, common::playable_notification::cookie_type cookie, const lib::node *node, lib::event_processor *evp, net::audio_datasource *src){ return NULL;}void gui::dx::dx_player::set_intransition(common::playable *p, const lib::transition_info *info) { AM_DBG lib::logger::get_logger()->debug("set_intransition : %s", repr(info->m_type).c_str()); dx_transition *tr = set_transition(p, info, false); // XXXX Note by Jack: the next two steps really shouldn't be done for // intransitions, they should be done later (when playback starts). tr->first_step(); if(!m_update_event) schedule_update();}void gui::dx::dx_player::start_outtransition(common::playable *p, const lib::transition_info *info) { lib::logger::get_logger()->debug("start_outtransition : %s", repr(info->m_type).c_str()); dx_transition *tr = set_transition(p, info, true); // XXXX Note by Jack: the next two steps really shouldn't be done for // intransitions, they should be done later (when playback starts). tr->first_step(); if(!m_update_event) schedule_update();}gui::dx::dx_transition *gui::dx::dx_player::set_transition(common::playable *p, const lib::transition_info *info, bool is_outtransition){ assert(m_player); lib::timer_control *timer = new lib::timer_control_impl(m_player->get_timer(), 1.0, false); dx_transition *tr = make_transition(info->m_type, p, timer); m_trmap[p] = tr; common::surface *surf = p->get_renderer()->get_surface(); if (info->m_scope == lib::scope_screen) surf = surf->get_top_surface(); tr->init(surf, is_outtransition, info); return tr;}bool gui::dx::dx_player::has_transitions() const { return !m_trmap.empty();}void gui::dx::dx_player::update_transitions() { m_trmap_cs.enter(); assert(m_player); lib::timer::time_type pt = m_player->get_timer()->elapsed(); //lock_redraw(); AM_DBG lib::logger::get_logger()->debug("update_transitions: updating %d transitions", m_trmap.size()); for(trmap_t::iterator it=m_trmap.begin();it!=m_trmap.end();it++) { if(!(*it).second->next_step(pt)) { delete (*it).second; common::playable *p = (*it).first; it = m_trmap.erase(it); common::renderer *r = p->get_renderer(); if (r) { common::surface *surf = r->get_surface(); if (surf) surf->transition_done(); } } } //unlock_redraw(); m_trmap_cs.leave();}void gui::dx::dx_player::clear_transitions() { m_trmap_cs.enter(); for(trmap_t::iterator it=m_trmap.begin();it!=m_trmap.end();it++) delete (*it).second; m_trmap.clear(); m_trmap_cs.leave();}gui::dx::dx_transition *gui::dx::dx_player::get_transition(common::playable *p) { trmap_t::iterator it = m_trmap.find(p); return (it != m_trmap.end())?(*it).second:0;}void gui::dx::dx_player::stopped(common::playable *p) { m_trmap_cs.enter(); trmap_t::iterator it = m_trmap.find(p); if(it != m_trmap.end()) { delete (*it).second; common::playable *p = (*it).first; it = m_trmap.erase(it); common::renderer *r = p->get_renderer(); if (r) { common::surface *surf = r->get_surface(); if (surf) surf->transition_done(); } } m_trmap_cs.leave();}void gui::dx::dx_player::paused(common::playable *p) { trmap_t::iterator it = m_trmap.find(p); if(it != m_trmap.end()) { (*it).second->pause(); }}void gui::dx::dx_player::resumed(common::playable *p) { trmap_t::iterator it = m_trmap.find(p); if(it != m_trmap.end()) { (*it).second->resume(); }}void gui::dx::dx_player::update_callback() { if(!m_update_event) return; if(has_transitions()) { update_transitions(); schedule_update(); } else { m_update_event = 0; }}void gui::dx::dx_player::schedule_update() { if(!m_player) return; lib::event_processor *evp = m_player->get_evp(); m_update_event = new lib::no_arg_callback_event<dx_player>(this, &dx_player::update_callback); evp->add_event(m_update_event, 50, ep_high);}////////////////////////// Layout helpers with a lot of hackstypedef common::surface_template iregion;typedef common::surface_impl region;static const region* get_top_layout(smil2::smil_layout_manager *layout, const lib::node* n) { iregion *ir = layout->get_region(n); if(!ir) return 0; const region *r = (const region*) ir; while(r->get_parent()) r = r->get_parent(); return r;}static const char*get_top_layout_name(smil2::smil_layout_manager *layout, const lib::node* n) { const region* r = get_top_layout(layout, n); if(!r) return 0; const common::region_info *ri = r->get_info(); return ri?ri->get_name().c_str():0;}#if 0common::gui_window *gui::dx::dx_player::get_window(const lib::node* n) { typedef common::surface_template region; smil2::smil_layout_manager *layout = m_player->get_layout(); const char *tlname = get_top_layout_name(layout, n); if(tlname) { std::map<std::string, wininfo*>::iterator it; it = m_windows.find(tlname); if(it != m_windows.end()) return (*it).second->w; } std::map<std::string, wininfo*>::iterator it = m_windows.begin(); assert(it != m_windows.end()); wininfo* winfo = (*it).second; return winfo->w;}#endifvoid gui::dx::dx_player::show_file(const net::url& href) { ShellExecute(GetDesktopWindow(), text_str("open"), textptr(href.get_url().c_str()), NULL, NULL, SW_SHOWNORMAL); // Or for smil //std::string this_exe = lib::win32::get_module_filename(); //std::string cmd = this_exe + " " + newdoc.get_url(); //if(start) cmd += " /start"; //WinExec(cmd.c_str(), SW_SHOW);}void gui::dx::dx_player::done(common::player *p) { m_update_event = 0; clear_transitions(); if(!m_frames.empty()) { frame *pf = m_frames.top(); m_frames.pop(); m_windows = pf->windows; m_player = pf->player; m_doc = pf->doc; delete pf; assert(0); // resume(); std::map<std::string, wininfo*>::iterator it; for(it=m_windows.begin();it!=m_windows.end();it++) { dx_window *dxwin = (dx_window *)(*it).second->w; dxwin->need_redraw(); } }}void gui::dx::dx_player::close(common::player *p) { PostMessage(get_main_window(), WM_CLOSE, 0, 0);}void gui::dx::dx_player::open(net::url newdoc, bool startnewdoc, common::player *old) { std::string urlstr = newdoc.get_url(); if(old) { // Replace the current document PostMessage(get_main_window(), WM_REPLACE_DOC, startnewdoc?1:0, LPARAM(new std::string(urlstr))); return; } if(!lib::ends_with(urlstr, ".smil") && !lib::ends_with(urlstr, ".smi") && !lib::ends_with(urlstr, ".grins")) { show_file(newdoc); return; } // Parse the document. m_doc = create_document(newdoc); // Push the old frame on the stack if(m_player) { pause(); frame *pf = new frame(); pf->windows = m_windows; pf->player = m_player; pf->doc = m_doc; m_windows.clear(); m_player = 0; m_frames.push(pf); } // Create a player instance AM_DBG m_logger->debug("Creating player instance for: %s", newdoc.get_url().c_str()); m_player = new smil2::smil_player(m_doc, this, m_embedder); if(startnewdoc) play();}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -