{
rectangle result;
+ // Start with this element's bounding box
nsCOMPtr<nsIBoxObject> box;
check(ns_doc->GetBoxObjectFor(elem, getter_AddRefs(box)));
int width, height;
result.right = result.left + width;
result.bottom = result.top + height;
+ // Merge bounding boxes of all child elements
for (ChildIterator it = ChildIterator(elem), end; it != end; ++it)
{
nsCOMPtr<nsIDOMNode> child_node(*it);
void add_video(const std::string & uri);
void load_next_page();
void on_net_state_change(const char * uri, gint flags, guint status);
+ bool process_page();
void save_screenshot();
void process_links(nsIPresShell * pres_shell,
nsIPresContext * pres_context,
bool pending_window_update_;
int pending_req_count_;
std::auto_ptr<temp_file> background_temp_;
- struct link_state;
- std::auto_ptr<link_state> link_state_;
+ struct page_state;
+ std::auto_ptr<page_state> page_state_;
std::vector<boost::shared_ptr<temp_file> > page_temp_files_;
};
if (flags & GTK_MOZ_EMBED_FLAG_STOP
&& flags & GTK_MOZ_EMBED_FLAG_IS_WINDOW)
+ {
+ // Check whether the load was successful, ignoring this
+ // pseudo-error.
+ if (status != NS_IMAGELIB_ERROR_LOAD_ABORTED)
+ check(status);
+
pending_window_update_ = false;
+ }
if (pending_req_count_ == 0 && !pending_window_update_)
{
- assert(!page_queue_.empty());
-
try
{
- // Check whether the load was successful, ignoring this
- // pseudo-error.
- if (status != NS_IMAGELIB_ERROR_LOAD_ABORTED)
- check(status);
-
- nsCOMPtr<nsIWebBrowser> browser(
- browser_widget_.get_browser());
- nsCOMPtr<nsIDocShell> doc_shell(do_GetInterface(browser));
- assert(doc_shell);
- nsCOMPtr<nsIPresShell> pres_shell;
- check(doc_shell->GetPresShell(getter_AddRefs(pres_shell)));
- nsCOMPtr<nsIPresContext> pres_context;
- check(doc_shell->GetPresContext(
- getter_AddRefs(pres_context)));
- nsCOMPtr<nsIDOMWindow> dom_window;
- check(browser->GetContentDOMWindow(
- getter_AddRefs(dom_window)));
-
- if (output_dir_.empty())
- {
- apply_style_sheet(stylesheet_, pres_shell);
- }
- else
- {
- if (!link_state_.get())
- {
- apply_style_sheet(stylesheet_, pres_shell);
- save_screenshot();
- }
-
- process_links(pres_shell, pres_context, dom_window);
-
- if (!link_state_.get())
- {
- page_queue_.pop();
- if (page_queue_.empty())
- {
- generate_dvd();
- Gtk::Main::quit();
- }
- else
- {
- load_next_page();
- }
- }
- }
+ if (!process_page())
+ Gtk::Main::quit();
}
catch (std::exception & e)
{
}
}
+ bool WebDvdWindow::process_page()
+ {
+ assert(!page_queue_.empty());
+
+ nsCOMPtr<nsIWebBrowser> browser(browser_widget_.get_browser());
+ nsCOMPtr<nsIDocShell> doc_shell(do_GetInterface(browser));
+ assert(doc_shell);
+ nsCOMPtr<nsIPresShell> pres_shell;
+ check(doc_shell->GetPresShell(getter_AddRefs(pres_shell)));
+ nsCOMPtr<nsIPresContext> pres_context;
+ check(doc_shell->GetPresContext(getter_AddRefs(pres_context)));
+ nsCOMPtr<nsIDOMWindow> dom_window;
+ check(browser->GetContentDOMWindow(getter_AddRefs(dom_window)));
+
+ if (output_dir_.empty())
+ {
+ // In preview mode, just apply the stylesheet and let the
+ // user select links.
+ apply_style_sheet(stylesheet_, pres_shell);
+ }
+ else
+ {
+ // If we haven't already started work on this page, apply
+ // the stylesheet and save a screenshot of its normal
+ // appearance.
+ if (!page_state_.get())
+ {
+ apply_style_sheet(stylesheet_, pres_shell);
+ save_screenshot();
+ }
+
+ // Start or continue processing links.
+ process_links(pres_shell, pres_context, dom_window);
+
+ // If we've finished work on the links, move on to the
+ // next page, if any, or else generate the DVD filesystem.
+ if (!page_state_.get())
+ {
+ page_queue_.pop();
+ if (page_queue_.empty())
+ {
+ generate_dvd();
+ return false;
+ }
+ else
+ {
+ load_next_page();
+ }
+ }
+ }
+
+ return true;
+ }
+
void WebDvdWindow::save_screenshot()
{
Glib::RefPtr<Gdk::Window> window(get_window());
->save(background_temp_->get_name(), "png");
}
- struct WebDvdWindow::link_state
+ struct WebDvdWindow::page_state
{
+ page_state(nsIDOMDocument * doc, int width, int height)
+ : diff_pixbuf(Gdk::Pixbuf::create(
+ Gdk::COLORSPACE_RGB,
+ true, 8, // has_alpha, bits_per_sample
+ width, height)),
+ spumux_temp("webdvd-spumux-"),
+ links_temp("webdvd-links-"),
+ link_num(0),
+ links_it(doc),
+ link_changing(false)
+ {
+ spumux_temp.close();
+ links_temp.close();
+ }
+
Glib::RefPtr<Gdk::Pixbuf> diff_pixbuf;
- std::auto_ptr<temp_file> spumux_temp;
+ temp_file spumux_temp;
std::ofstream spumux_file;
- std::auto_ptr<temp_file> links_temp;
+ temp_file links_temp;
int link_num;
LinkIterator links_it, links_end;
check(doc_view->GetDefaultView(getter_AddRefs(view)));
// Set up or recover our iteration state.
- std::auto_ptr<link_state> state(link_state_);
+ std::auto_ptr<page_state> state(page_state_);
if (!state.get())
{
- state.reset(new link_state);
-
- state->diff_pixbuf = Gdk::Pixbuf::create(
- Gdk::COLORSPACE_RGB,
- true, 8, // has_alpha, bits_per_sample
- frame_params_.width, frame_params_.height);
-
- state->spumux_temp.reset(new temp_file("webdvd-spumux-"));
- state->spumux_temp->close();
-
- state->links_temp.reset(new temp_file("webdvd-links-"));
- state->links_temp->close();
+ state.reset(
+ new page_state(
+ basic_doc, frame_params_.width, frame_params_.height));
- state->spumux_file.open(state->spumux_temp->get_name().c_str());
+ state->spumux_file.open(state->spumux_temp.get_name().c_str());
state->spumux_file <<
"<subpictures>\n"
" <stream>\n"
" <spu force='yes' start='00:00:00.00'\n"
- " highlight='" << state->links_temp->get_name()
- << "'\n"
- " select='" << state->links_temp->get_name()
- << "'>\n";
-
- state->link_num = 0;
- state->links_it = LinkIterator(basic_doc);
- state->link_changing = false;
+ " highlight='" << state->links_temp.get_name() << "'\n"
+ " select='" << state->links_temp.get_name() << "'>\n";
}
-
+
rectangle window_rect = {
0, 0, frame_params_.width, frame_params_.height
};
if (pending_req_count_ > 0)
{
state->link_changing = true;
- link_state_ = state;
+ page_state_ = state;
return;
}
}
quantise_rgba_pixbuf(state->diff_pixbuf, dvd::button_n_colours);
- std::cout << "saving " << state->links_temp->get_name()
+ std::cout << "saving " << state->links_temp.get_name()
<< std::endl;
- state->diff_pixbuf->save(state->links_temp->get_name(), "png");
+ state->diff_pixbuf->save(state->links_temp.get_name(), "png");
state->spumux_file <<
" </spu>\n"
" | mpeg2enc -v0 -f8 -a2 -o/dev/stdout"
" | mplex -v0 -f8 -o/dev/stdout /dev/stdin"
" | spumux -v0 -mdvd ")
- << state->spumux_temp->get_name()
+ << state->spumux_temp.get_name()
<< " > " << vob_temp->get_name();
std::string command(command_stream.str());
const char * argv[] = {