⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dx_player.cpp

📁 彩信浏览器
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	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 + -