Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | File List | Namespace Members | Class Members | File Members | Related Pages

PageMagick Class Reference

Magick page class. More...

#include <page_magick.h>

Inheritance diagram for PageMagick:

Inheritance graph
[legend]
Collaboration diagram for PageMagick:

Collaboration graph
[legend]
List of all members.

Public Member Functions

 PageMagick (KinoCommon *common)
 Constructor for Page Magick.
virtual ~PageMagick ()
 Destructor for Page Magick.
void newFile ()
void start ()
 Start when entering page.
gulong activate ()
 Activate scene list selection (for Frame sources).
void clean ()
 Clean up when leaving page.
void selectScene (int)
 put the scene begin and end frame numbers into spinners
void videoStartOfMovie ()
void videoBack (int step=-1)
void videoPlay ()
void videoForward (int step=1)
void videoEndOfMovie ()
void videoPause ()
void videoStop ()
void videoPreviousScene ()
void videoNextScene ()
void videoStartOfScene ()
void videoEndOfScene ()
void showFrameInfo (int frame_number)
 Update UI with metadata.
void showFrameInfo (int frame_number, int duration)
void movedToFrame (int frame_number)
void windowMoved ()
void timeFormatChanged ()
gboolean processKeyboard (GdkEventKey *event)
gboolean processCommand (char *cmd)
std::string getHelpPage ()
void PreviewFrame ()
void StartPreview ()
void AudioThread ()
void VideoThread ()
void StartRender ()
 Render the effect.
void Stop ()
 Stop whatever is running (either preview or rendering).
void StopPreview ()
 Stop the preview.
void UpdateProgress (gfloat)
 Update the progress bar for the export process.
void UpdateStatus (int currentFrame, int begin, int end, int every)
void RefreshStatus (bool with_fx_notify=false)
 Refresh the status label to show the current selections.
GDKImageCreateGetImageCreate () const
 Return the currently selected image creator.
GDKImageFilterGetImageFilter () const
 Return the currently selected image filter.
GDKImageTransitionGetImageTransition () const
 Return the currently selected image transition.
GDKAudioFilterGetAudioFilter () const
 Return the currently selected audio filter.
GDKAudioTransitionGetAudioTransition () const
 Return the currently selected audio transition.
GtkWidget * GetWindow () const
bool IsRepainting () const
bool IsPreviewing () const
void SetKeyFrameControllerClient (KeyFrameControllerClient *client)
void ShowCurrentStatus (double position, frame_type type, bool hasPrev, bool hasNext)
double GetCurrentPosition ()
void OnKeyFrameControllerKeyChanged (GtkToggleButton *togglebutton)
void OnTimeRangeChanged ()

Public Attributes

GtkWidget * window

Private Member Functions

void PlayAudio (int16_t *buffers[], int, int, int, bool)
 Play an audio frame.
void ShowImage (GtkWidget *area, uint8_t *pixels, int, int, bool)
 Show an image in the preview drawing area.

Private Attributes

KinoCommoncommon
int last_page
bool rendering
bool paused
bool previewing
bool repainting
GtkProgressBar * progressBar
char status [10240]
int previewPosition
GtkWidget * scrubBar
GtkAdjustment * scrubAdjustment
PluginImageCreateRepository image_creators
PluginImageFilterRepository image_filters
PluginImageTransitionRepository image_transitions
PluginAudioFilterRepository audio_filters
PluginAudioTransitionRepository audio_transitions
kino_sound_taudio_device
dv_audio_t dv_audio
bool audio_device_avail
gint audio_sampling_rate
PluginCollection plugins
string last_fx_file
double startTime
double pauseTime
double nextUpdateTime
KeyFrameControllerClientkeyFrameControllerClient
bool isGuiLocked
bool isPreviousScene
bool isNextScene
double newPosition

Detailed Description

Magick page class.

Definition at line 114 of file page_magick.h.


Constructor & Destructor Documentation

PageMagick::PageMagick KinoCommon common  ) 
 

Constructor for Page Magick.

Definition at line 1482 of file page_magick.cc.

References audio_filters, audio_transitions, PluginCollection::Count(), PluginCollection::Get(), Preferences::getInstance(), KinoCommon::getWidget(), gtk_enhanced_scale_new(), image_creators, image_filters, image_transitions, GDKAudioTransitionRepository::Initialise(), GDKAudioFilterRepository::Initialise(), GDKImageTransitionRepository::Initialise(), GDKImageCreateRepository::Initialise(), GDKImageFilterRepository::Initialise(), PluginCollection::Initialise(), PluginAudioTransitionRepository::InstallPlugins(), PluginAudioFilterRepository::InstallPlugins(), PluginImageTransitionRepository::InstallPlugins(), PluginImageFilterRepository::InstallPlugins(), PluginImageCreateRepository::InstallPlugins(), lookup_widget(), magick_glade, NORM_NTSC, on_drawingarea_refresh_required(), on_notebook_magick_switch_page(), on_notebook_magick_switch_video_page(), on_scrubbar_magick_button_press_event(), on_scrubbar_magick_button_release_event(), on_scrubbar_magick_value_changed_event(), on_spinbutton_magick_limit_value_changed(), on_time_range_changed(), on_togglebutton_key_frame_toggled(), plugins, progressBar, Repaint(), scrubAdjustment, scrubBar, and window.

01482                                            : 
01483     last_page( 0 ),
01484     rendering( false ),
01485     previewing( false ),
01486     previewPosition( 0 ),
01487     keyFrameControllerClient( 0 ),
01488     isGuiLocked( false ),
01489     isPreviousScene( false ),
01490     isNextScene( false )
01491 {
01492     cerr << "> Creating Magick Page" << endl;
01493 
01494     window = glade_xml_get_widget( magick_glade, "window_magick" );
01495     GtkWidget *bin = lookup_widget( common->getWidget(), "frame_magick" );
01496     gtk_widget_reparent( gtk_bin_get_child( GTK_BIN( window ) ), bin );
01497 
01498     this->common = common;
01499 
01500     progressBar = GTK_PROGRESS_BAR( lookup_widget( common->getWidget(), "progressbar" ) );
01501     cerr << ">> Searching " << KINO_PLUGINDIR << " for plugins" << endl;
01502     plugins.Initialise( KINO_PLUGINDIR );
01503 
01504     for ( unsigned int index = 0; index < plugins.Count(); index ++ )
01505     {
01506         image_creators.InstallPlugins( plugins.Get( index ) );
01507         image_filters.InstallPlugins( plugins.Get( index ) );
01508         image_transitions.InstallPlugins( plugins.Get( index ) );
01509         audio_filters.InstallPlugins( plugins.Get( index ) );
01510         audio_transitions.InstallPlugins( plugins.Get( index ) );
01511     }
01512 
01513     GtkOptionMenu *menu = GTK_OPTION_MENU( lookup_widget( window, "optionmenu_magick_filter" ) );
01514     GtkBin *container = GTK_BIN( lookup_widget( window, "frame_magick_image_filter" ) );
01515     image_filters.Initialise( menu, container );
01516     
01517     menu = GTK_OPTION_MENU( lookup_widget( window, "optionmenu_magick_frames_create" ) );
01518     container = GTK_BIN( lookup_widget( window, "frame_magick_frames_create" ) );
01519     image_creators.Initialise( menu, container );
01520 
01521     menu = GTK_OPTION_MENU( lookup_widget( window, "optionmenu_magick_transition" ) );
01522     container = GTK_BIN( lookup_widget( window, "frame_magick_image_transition" ) );
01523     image_transitions.Initialise( menu, container );
01524 
01525     menu = GTK_OPTION_MENU( lookup_widget( window, "optionmenu_magick_audio_filter" ) );
01526     container = GTK_BIN( lookup_widget( window, "frame_magick_audio_filter" ) );
01527     audio_filters.Initialise( menu, container );
01528 
01529     menu = GTK_OPTION_MENU( lookup_widget( window, "optionmenu_magick_audio_transition" ) );
01530     container = GTK_BIN( lookup_widget( window, "frame_magick_audio_transition" ) );
01531     audio_transitions.Initialise( menu, container );
01532 
01533     GtkWidget *drawing_area = lookup_widget( window, "drawingarea_magick_preview" );
01534     g_signal_connect( G_OBJECT( drawing_area ), "expose_event", G_CALLBACK( on_drawingarea_refresh_required ), this );
01535     gtk_widget_set_double_buffered( drawing_area, FALSE );
01536 
01537     GtkWidget *widget = lookup_widget( window, "notebook_magick_frames" );
01538     g_signal_connect_after( G_OBJECT( widget ), "switch_page", G_CALLBACK( on_notebook_magick_switch_page ), this );
01539     widget = lookup_widget( window, "notebook_magick_video" );
01540     g_signal_connect_after( G_OBJECT( widget ), "switch_page", G_CALLBACK( on_notebook_magick_switch_video_page ), NULL );
01541     widget = lookup_widget( window, "notebook_magick_audio" );
01542     g_signal_connect_after( G_OBJECT( widget ), "switch_page", G_CALLBACK( on_notebook_magick_switch_page ), NULL );
01543 
01544     widget = lookup_widget( window, "checkbutton_magick_frame_limit" );
01545     g_signal_connect( G_OBJECT( widget ), "clicked", G_CALLBACK( on_time_range_changed ), NULL );
01546     widget = lookup_widget( window, "spinbutton_magick_limit" );
01547     gtk_spin_button_set_value( GTK_SPIN_BUTTON( widget ), Preferences::getInstance().defaultNormalisation == NORM_NTSC ? 30 : 25 );
01548     g_signal_connect( G_OBJECT( widget ), "value-changed", G_CALLBACK( on_spinbutton_magick_limit_value_changed ), NULL );
01549     widget = lookup_widget( window, "optionmenu_magick_frame_offset" );
01550     g_signal_connect( G_OBJECT( widget ), "changed", G_CALLBACK( on_time_range_changed ), NULL );
01551 
01552     // Attach the scrub bar
01553     scrubAdjustment = GTK_ADJUSTMENT( gtk_adjustment_new( 0, 0, 0, 1, 10, 0 ) );
01554     scrubBar = gtk_enhanced_scale_new( ( GtkObject** ) & scrubAdjustment, 1 );
01555     gtk_widget_set_name( scrubBar, "scrubmar_magick" );
01556     gtk_widget_ref( scrubBar );
01557     gtk_object_set_data_full( GTK_OBJECT( window ), "scrubbar_magick", scrubBar,
01558                               ( GtkDestroyNotify ) gtk_widget_unref );
01559     GtkWidget *vbox_scrub = lookup_widget( window, "vbox_scrub" );
01560     gtk_widget_show( scrubBar );
01561     gtk_box_pack_start( GTK_BOX( vbox_scrub ), scrubBar, FALSE, TRUE, 0 );
01562     g_signal_connect( G_OBJECT( scrubAdjustment ), "value_changed",
01563                       G_CALLBACK( on_scrubbar_magick_value_changed_event ), NULL );
01564     g_signal_connect( G_OBJECT( scrubBar ), "button_press_event",
01565                       G_CALLBACK( on_scrubbar_magick_button_press_event ), NULL );
01566     g_signal_connect( G_OBJECT( scrubBar ), "button_release_event",
01567                       G_CALLBACK( on_scrubbar_magick_button_release_event ), NULL );
01568     widget = lookup_widget( window, "togglebutton_key_frame" );
01569     g_signal_connect( G_OBJECT( widget ), "toggled", G_CALLBACK( on_togglebutton_key_frame_toggled ), this );
01570     widget = lookup_widget( window, "optionmenu_direction" );
01571     g_signal_connect( G_OBJECT( widget ), "changed", G_CALLBACK( Repaint ), this );
01572     widget = lookup_widget( window, "radiobutton_magick_transition_frame" );
01573     g_signal_connect( G_OBJECT( widget ), "toggled", G_CALLBACK( Repaint ), this );
01574     widget = lookup_widget( window, "optionmenu_magick_transition_frame" );
01575     g_signal_connect( G_OBJECT( widget ), "changed", G_CALLBACK( Repaint ), this );
01576     widget = lookup_widget( window, "radiobutton_magick_transition_colour" );
01577     g_signal_connect( G_OBJECT( widget ), "toggled", G_CALLBACK( Repaint ), this );
01578     widget = lookup_widget( window, "colorpicker_magick_transition" );
01579     g_signal_connect( G_OBJECT( widget ), "color-set", G_CALLBACK( Repaint ), this );
01580     widget = lookup_widget( window, "hscale_transition_start" );
01581     g_signal_connect( G_OBJECT( widget ), "value-changed", G_CALLBACK( Repaint ), this );
01582     widget = lookup_widget( window, "hscale_transition_end" );
01583     g_signal_connect( G_OBJECT( widget ), "value-changed", G_CALLBACK( Repaint ), this );
01584 }

PageMagick::~PageMagick  )  [virtual]
 

Destructor for Page Magick.

Definition at line 1589 of file page_magick.cc.

References common, KinoCommon::getWidget(), lookup_widget(), and window.

01590 {
01591     GtkBin * bin = GTK_BIN( lookup_widget( common->getWidget(), "frame_magick" ) );
01592     gtk_widget_reparent( ( GTK_BIN( bin ) ) ->child, GTK_WIDGET( window ) );
01593     gtk_widget_destroy( window );
01594 }


Member Function Documentation

gulong PageMagick::activate  )  [virtual]
 

Activate scene list selection (for Frame sources).

Reimplemented from Page.

Definition at line 1650 of file page_magick.cc.

References isNextScene, isPreviousScene, rendering, SCENE_LIST, VIDEO_BACK, VIDEO_END_OF_MOVIE, VIDEO_FORWARD, VIDEO_NEXT_SCENE, VIDEO_PAUSE, VIDEO_PLAY, VIDEO_START_OF_MOVIE, VIDEO_START_OF_SCENE, and VIDEO_STOP.

01651 {
01652     if ( rendering )
01653         return VIDEO_PLAY | VIDEO_STOP;
01654     else
01655         return SCENE_LIST |
01656             VIDEO_START_OF_MOVIE |
01657             VIDEO_BACK |
01658             VIDEO_PLAY |
01659             VIDEO_PAUSE |
01660             VIDEO_STOP |
01661             VIDEO_FORWARD |
01662             VIDEO_END_OF_MOVIE |
01663             ( isPreviousScene ? VIDEO_START_OF_SCENE : 0 ) |
01664             ( isNextScene ? VIDEO_NEXT_SCENE : 0 );
01665 }

void PageMagick::AudioThread  ) 
 

Definition at line 1890 of file page_magick.cc.

References audio_device, audio_device_avail, audio_sampling_rate, PageMagickInfo::begin, PageMagickInfo::channels, common, DV_AUDIO_MAX_SAMPLES, PageMagickInfo::end, Frame::ExtractAudio(), FRAME_MAX_HEIGHT, FRAME_MAX_WIDTH, PageMagickInfo::frequency, PageMagickInfo::GetAudioManipulator(), PageMagickImage::GetFrame(), PageMagickAudio::GetFrame(), PageMagickFrames::GetFrame(), GetFramePool(), PageMagickInfo::GetFrameSource(), PageMagickInfo::GetImageManipulator(), Preferences::getInstance(), KinoCommon::getPlayList(), PageMagickInfo::height, PageMagickInfo::increment, info, PageMagickInfo::Initialise(), PageMagickInfo::isPAL, PageMagickInfo::isWide, kino_sound_close(), kino_sound_new(), lookup_widget(), modal_message(), pixels, PlayAudio(), PageMagickInfo::postFrame, PageMagickImage::PreGetFrame(), previewing, previewPosition, rendering, PageMagickInfo::reverse, PageMagickInfo::samples_this_frame, PageMagickInfo::SetLowQuality(), showFrameInfo(), ShowImage(), TriggerAction(), PageMagickInfo::width, and window.

Referenced by audioThreadProxy().

01891 {
01892     // Avoid reentrancy, interrupt rendering, and empty project
01893     if ( rendering )
01894         return;
01895 
01896     GtkWidget *area = GTK_WIDGET( lookup_widget( window, "drawingarea_magick_preview" ) );
01897 
01898     // Create the temporary space
01899     uint8_t *pixels = new uint8_t[ FRAME_MAX_WIDTH * FRAME_MAX_HEIGHT * 4 ];
01900     int16_t *audio_buffers[ 4 ];
01901     for ( int n = 0; n < 4; n++ )
01902         audio_buffers[ n ] = new int16_t [ 2 * DV_AUDIO_MAX_SAMPLES ];
01903 
01904     // Generate the info
01905     PageMagickInfo *info = new PageMagickInfo( common );
01906 
01907     audio_device = kino_sound_new();
01908     audio_device_avail = false;
01909     audio_sampling_rate = 0;
01910     int audio_number = 0;
01911     Frame* infoFrame = GetFramePool()->GetFrame();
01912 
01913     GtkToggleButton *audioButton = GTK_TOGGLE_BUTTON( lookup_widget( window, "checkbutton_magick_preview_audio" ) );
01914     GtkToggleButton *everyButton = GTK_TOGGLE_BUTTON( lookup_widget( window, "checkbutton_magick_preview_every" ) );
01915     GtkToggleButton *loopButton = GTK_TOGGLE_BUTTON( lookup_widget( window, "checkbutton_magick_preview_loop" ) );
01916     GtkToggleButton *contextButton = GTK_TOGGLE_BUTTON( lookup_widget( window, "checkbutton_magick_preview_context" ) );
01917     GtkToggleButton *qualityButton = GTK_TOGGLE_BUTTON( lookup_widget( window, "checkbutton_low_quality" ) );
01918     GtkEntry *contextSpin = GTK_ENTRY( lookup_widget( window, "spinbutton_magick_preview_context" ) );
01919 
01920     try
01921     {
01922         pthread_mutex_lock( &init_mutex );
01923         info->Initialise();
01924         info->SetLowQuality( gtk_toggle_button_get_active( qualityButton ) );
01925         do
01926         {
01927             PageMagickFrames *frames = info->GetFrameSource();
01928             PageMagickImage *image = info->GetImageManipulator();
01929             PageMagickAudio *sound = info->GetAudioManipulator();
01930             pthread_mutex_unlock( &init_mutex );
01931 
01932             if ( info->begin > info->end )
01933                 throw _( "Invalid frame range specified." );
01934 
01935             if ( previewPosition <= 1 )
01936             for ( frameNumber = info->begin - atoi( gtk_entry_get_text( contextSpin ) );
01937                 frameNumber < info->begin &&
01938                 gtk_toggle_button_get_active( contextButton ) &&
01939                 previewing;
01940                 frameNumber++ )
01941             {
01942                 if ( frameNumber >= 0 )
01943                 {
01944                     TriggerAction();
01945                     common->getPlayList()->GetFrame( frameNumber, *( infoFrame ) );
01946                     if ( !gtk_toggle_button_get_active( audioButton ) &&
01947                             Preferences::getInstance().enableAudio )
01948                     {
01949                         if ( infoFrame->ExtractAudio( audio_buffers ) )
01950                             PlayAudio( audio_buffers, info->samples_this_frame, info->frequency, info->channels, info->isPAL );
01951                     }
01952                     if ( !gtk_toggle_button_get_active( everyButton ) || gtk_toggle_button_get_active( audioButton ) )
01953                     {
01954                         infoFrame->ExtractPreviewRGB( pixels );
01955                         gdk_threads_enter();
01956                         ShowImage( area, pixels, infoFrame->GetWidth(), infoFrame->GetHeight(), infoFrame->IsWide() );
01957                         gdk_flush();
01958                         gdk_threads_leave();
01959                     }
01960                 }
01961             }
01962 
01963             int frame_number = info->begin + previewPosition;
01964             for ( double i = ( double ) info->begin + previewPosition;
01965                 frame_number <= info->end && previewing;
01966                 frame_number = ( int )( ( i += info->increment ) + 0.5 ) )
01967             {
01968                 previewPosition = frame_number - info->begin;
01969                 gdk_threads_enter();
01970                 showFrameInfo( frame_number, info->end - info->begin + 1 );
01971                 gdk_threads_leave();
01972                 if ( info->reverse )
01973                     frame_number = info->end - ( ( int ) i - info->begin );
01974 
01975                 frameNumber = frame_number;
01976                 TriggerAction();
01977                 if ( !gtk_toggle_button_get_active( audioButton ) &&
01978                     Preferences::getInstance().enableAudio )
01979                 {
01980                     int samples = info->samples_this_frame;
01981                     int locked_samples = infoFrame->CalculateNumberSamples( info->frequency, audio_number ++ );
01982                     if ( samples == 0 )
01983                         samples = locked_samples;
01984                     frames->GetFrame( NULL, 0, 0, audio_buffers, frame_number );
01985                     if ( gtk_toggle_button_get_active( everyButton ) )
01986                         image->PreGetFrame( );
01987                     sound->GetFrame( audio_buffers, frame_number, samples, locked_samples );
01988                     PlayAudio( audio_buffers, samples, info->frequency, info->channels, info->isPAL );
01989                 }
01990                 if ( !gtk_toggle_button_get_active( everyButton ) || gtk_toggle_button_get_active( audioButton ) )
01991                 {
01992                     frames->GetFrame( pixels, info->width, info->height, NULL, frame_number );
01993                     image->PreGetFrame( );
01994                     image->GetFrame( pixels, frame_number );
01995                     gdk_threads_enter();
01996                     ShowImage( area, pixels, info->width, info->height, info->isWide );
01997                     gdk_flush();
01998                     gdk_threads_leave();
01999                 }
02000             }
02001 
02002             for ( frameNumber = info->postFrame;
02003                 frameNumber < info->postFrame + atoi( gtk_entry_get_text( contextSpin ) ) &&
02004                 gtk_toggle_button_get_active( contextButton ) &&
02005                 previewing;
02006                 frameNumber++ )
02007             {
02008                 if ( frameNumber < common->getPlayList()->GetNumFrames() )
02009                 {
02010                     TriggerAction();
02011                     common->getPlayList()->GetFrame( frameNumber, *( infoFrame ) );
02012                     if ( !gtk_toggle_button_get_active( audioButton ) &&
02013                             Preferences::getInstance().enableAudio )
02014                     {
02015                         if ( infoFrame->ExtractAudio( audio_buffers ) )
02016                             PlayAudio( audio_buffers, info->samples_this_frame, info->frequency, info->channels, info->isPAL );
02017                     }
02018                     if ( !gtk_toggle_button_get_active( everyButton ) || gtk_toggle_button_get_active( audioButton ) )
02019                     {
02020                         infoFrame->ExtractPreviewRGB( pixels );
02021                         gdk_threads_enter();
02022                         ShowImage( area, pixels, infoFrame->GetWidth(), infoFrame->GetHeight(), infoFrame->IsWide() );
02023                         gdk_flush();
02024                         gdk_threads_leave();
02025                     }
02026                 }
02027             }
02028             if ( previewing )
02029                 previewPosition = 0;
02030             pthread_mutex_lock( &init_mutex );
02031         }
02032         while ( previewing && gtk_toggle_button_get_active( loopButton ) );
02033     }
02034     catch ( const char * exc )
02035     {
02036         modal_message( ( char * ) exc );
02037     }
02038     pthread_mutex_unlock( &init_mutex );
02039 
02040     kino_sound_close( audio_device );
02041     previewing = false;
02042     delete info;
02043     delete[] pixels;
02044     for ( int n = 0; n < 4; n++ )
02045         delete[] audio_buffers[ n ];
02046     GetFramePool()->DoneWithFrame( infoFrame );
02047     TriggerAction();
02048 }

void PageMagick::clean  )  [virtual]
 

Clean up when leaving page.

Reimplemented from Page.

Definition at line 1670 of file page_magick.cc.

References status, and StopPreview().

01671 {
01672     StopPreview();
01673     strcpy( status, "" );
01674 }

GDKAudioFilter * PageMagick::GetAudioFilter  )  const
 

Return the currently selected audio filter.

Definition at line 2682 of file page_magick.cc.

References audio_filters, and GDKAudioFilterRepository::Get().

Referenced by RefreshStatus().

02683 {
02684     return audio_filters.Get( );
02685 }

GDKAudioTransition * PageMagick::GetAudioTransition  )  const
 

Return the currently selected audio transition.

Definition at line 2690 of file page_magick.cc.

References audio_transitions, and GDKAudioTransitionRepository::Get().

Referenced by RefreshStatus().

02691 {
02692     return audio_transitions.Get( );
02693 }

double PageMagick::GetCurrentPosition  )  [virtual]
 

Implements KeyFrameController.

Definition at line 3345 of file page_magick.cc.

References PageMagickInfo::begin, common, PageMagickInfo::GetFrameSource(), info, and previewPosition.

Referenced by on_notebook_magick_switch_video_page(), OnKeyFrameControllerKeyChanged(), RefreshStatus(), videoNextScene(), and videoPreviousScene().

03346 {
03347     try
03348     {
03349         PageMagickInfo info( common );
03350         info.GetFrameSource();
03351         return time_info( info, info.begin + previewPosition ).position();
03352     }
03353     catch( const char * exc )
03354     {
03355         return 0;
03356     }
03357 }

std::string PageMagick::getHelpPage  )  [inline, virtual]
 

Reimplemented from Page.

Definition at line 146 of file page_magick.h.

00147     {
00148         return "FX";
00149     }

GDKImageCreate * PageMagick::GetImageCreate  )  const
 

Return the currently selected image creator.

Definition at line 2698 of file page_magick.cc.

References GDKImageCreateRepository::Get(), and image_creators.

Referenced by RefreshStatus().

02699 {
02700     return image_creators.Get( );
02701 }

GDKImageFilter * PageMagick::GetImageFilter  )  const
 

Return the currently selected image filter.

Definition at line 2666 of file page_magick.cc.

References GDKImageFilterRepository::Get(), and image_filters.

Referenced by RefreshStatus().

02667 {
02668     return image_filters.Get( );
02669 }

GDKImageTransition * PageMagick::GetImageTransition  )  const
 

Return the currently selected image transition.

Definition at line 2674 of file page_magick.cc.

References GDKImageTransitionRepository::Get(), and image_transitions.

Referenced by RefreshStatus().

02675 {
02676     return image_transitions.Get( );
02677 }

GtkWidget* PageMagick::GetWindow  )  const [inline]
 

Definition at line 169 of file page_magick.h.

References window.

00170     {
00171         return window;
00172     }

bool PageMagick::IsPreviewing  )  const [inline]
 

Definition at line 177 of file page_magick.h.

References previewing.

Referenced by FXSelectedFrames::IsPreviewing(), GDKImageTransitionRepository::SelectionChange(), GDKImageFilterRepository::SelectionChange(), GDKAudioTransitionRepository::SelectionChange(), and GDKAudioFilterRepository::SelectionChange().

00178     {
00179         return previewing;
00180     }

bool PageMagick::IsRepainting  )  const [inline]
 

Definition at line 173 of file page_magick.h.

References repainting.

Referenced by FXSelectedFrames::IsRepainting().

00174     {
00175         return repainting;
00176     }

void PageMagick::movedToFrame int  frame_number  )  [virtual]
 

Reimplemented from Page.

Definition at line 1752 of file page_magick.cc.

References common, KinoCommon::getPageEditor(), KinoCommon::getPlayList(), KinoCommon::hasListChanged, lookup_widget(), PreviewFrame(), previewPosition, scenes, selectScene(), StopPreview(), and window.

Referenced by selectScene(), and windowMoved().

01753 {
01754     if ( common->hasListChanged == TRUE )
01755     {
01756         common->getPageEditor()->ResetBar();
01757         common->hasListChanged = FALSE;
01758         if ( common->getPlayList() ->GetNumFrames() > 0 )
01759         {
01760             std::vector<int> scenes = common->getPageEditor()->GetScene();
01761             int i = 0;
01762             for ( i = 0; i < int( scenes.size() ) && frame_number >= scenes[ i ]; i++ );
01763             selectScene( i );
01764         }
01765         GtkSpinButton *startSpin = GTK_SPIN_BUTTON( lookup_widget( window, "spinbutton_magick_start" ) );
01766         GtkSpinButton *endSpin = GTK_SPIN_BUTTON( lookup_widget( window, "spinbutton_magick_end" ) );
01767         gtk_spin_button_set_range( startSpin, 0, gtk_spin_button_get_value( endSpin ) );
01768         gtk_spin_button_set_range( endSpin, gtk_spin_button_get_value( startSpin ),
01769             common->getPlayList() ->GetNumFrames() - 1 );
01770     }
01771     else
01772     {
01773         try {
01774             StopPreview();
01775             previewPosition = frame_number;
01776             PreviewFrame();
01777         } catch ( const char * exc )
01778         { }
01779     }
01780 }

void PageMagick::newFile  )  [virtual]
 

Reimplemented from Page.

Definition at line 1596 of file page_magick.cc.

References last_fx_file.

01597 {
01598     last_fx_file = "";
01599 }

void PageMagick::OnKeyFrameControllerKeyChanged GtkToggleButton *  togglebutton  ) 
 

Definition at line 3389 of file page_magick.cc.

References GetCurrentPosition(), isGuiLocked, keyFrameControllerClient, and KeyFrameControllerClient::OnControllerKeyChanged().

Referenced by on_togglebutton_key_frame_toggled().

03390 {
03391     if ( !isGuiLocked && keyFrameControllerClient )
03392     {
03393         double position = GetCurrentPosition( );
03394         keyFrameControllerClient->OnControllerKeyChanged( position,
03395             gtk_toggle_button_get_active( togglebutton ) );
03396     }
03397 }

void PageMagick::OnTimeRangeChanged  ) 
 

Definition at line 2896 of file page_magick.cc.

References PageMagickInfo::begin, common, PageMagickInfo::end, PageMagickInfo::GetFrameSource(), info, PreviewFrame(), previewPosition, and scrubAdjustment.

Referenced by on_notebook_magick_switch_page(), and on_notebook_magick_switch_video_page().

02897 {
02898     try
02899     {
02900         PageMagickInfo *info = new PageMagickInfo( common );
02901 
02902         info->GetFrameSource();
02903         scrubAdjustment->upper = info->end - info->begin + 1;
02904         if ( gtk_adjustment_get_value( scrubAdjustment ) >= scrubAdjustment->upper )
02905             previewPosition = info->end - info->begin;
02906         delete info;
02907         PreviewFrame();
02908         g_signal_emit_by_name( scrubAdjustment, "changed" );
02909     }
02910     catch ( const char * exc )
02911     {
02912     }
02913 }

void PageMagick::PlayAudio int16_t *  buffers[],
int  ,
int  ,
int  ,
bool 
[private]
 

Play an audio frame.

Definition at line 1679 of file page_magick.cc.

References audio_device, audio_device_avail, audio_sampling_rate, dv_audio, Preferences::getInstance(), kino_sound_init(), and kino_sound_play().

Referenced by AudioThread().

01680 {
01681     dv_audio.frequency = frequency;
01682     dv_audio.samples_this_frame = samples;
01683     dv_audio.num_channels = channels;
01684 
01685     if ( !audio_device_avail && ( audio_sampling_rate = kino_sound_init( 
01686             &dv_audio, audio_device, Preferences::getInstance().audioDevice ) ) != 0 )
01687         audio_device_avail = true;
01688     if ( audio_device_avail )
01689         kino_sound_play( &dv_audio, audio_device, buffers );
01690 }

void PageMagick::PreviewFrame  ) 
 

Definition at line 1788 of file page_magick.cc.

References PageMagickInfo::begin, common, PageMagickInfo::end, FRAME_MAX_HEIGHT, FRAME_MAX_WIDTH, PageMagickImage::GetFrame(), PageMagickFrames::GetFrame(), PageMagickInfo::GetFrameSource(), PageMagickInfo::GetImageManipulator(), PageMagickInfo::height, PageMagickInfo::increment, info, PageMagickInfo::Initialise(), PageMagickInfo::isWide, magick_glade, modal_message(), pixels, PageMagickImage::PreGetFrame(), previewing, previewPosition, rendering, repainting, PageMagickInfo::reverse, PageMagickInfo::SetLowQuality(), showFrameInfo(), ShowImage(), and PageMagickInfo::width.

Referenced by movedToFrame(), OnTimeRangeChanged(), RefreshStatus(), FXSelectedFrames::Repaint(), videoBack(), videoEndOfMovie(), videoForward(), videoNextScene(), videoPreviousScene(), and videoStartOfMovie().

01789 {
01790     // Make sure we're not already previewing.
01791     // Do not interrupt rendering
01792     if ( rendering || previewing || repainting )
01793         return;
01794     repainting = true;
01795 
01796     PageMagickInfo *info = new PageMagickInfo( common );
01797     info->Initialise();
01798     PageMagickFrames *frames = info->GetFrameSource();
01799     GtkWidget *area = glade_xml_get_widget( magick_glade, "drawingarea_magick_preview" );
01800     if ( previewPosition > info->end - info->begin )
01801         previewPosition = info->end - info->begin;
01802 
01803     try
01804     {
01805         if ( GDK_IS_DRAWABLE(area->window) && ( info->begin <= info->end ) )
01806         {
01807             GtkWidget *qualityButton = glade_xml_get_widget( magick_glade, "checkbutton_low_quality" );
01808             info->SetLowQuality( gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( qualityButton ) ) );
01809             PageMagickImage *image = info->GetImageManipulator();
01810             double i = double( info->begin ) + previewPosition * info->increment;
01811             int frame_number = int( i + 0.5 );
01812             uint8_t *pixels = new uint8_t[ FRAME_MAX_WIDTH * FRAME_MAX_HEIGHT * 4 ];
01813 
01814             showFrameInfo( frame_number, info->end - info->begin + 1 );
01815 
01816             // Apply the filter and show image
01817             if ( info->reverse )
01818                 frame_number = int( double( info->end ) - ( i - info->begin ) + 0.5 );
01819             if ( frame_number > info->end )
01820                 frame_number = info->end;
01821             frames->GetFrame( pixels, info->width, info->height, NULL, frame_number );
01822             image->PreGetFrame( frame_number - info->begin );
01823             image->GetFrame( pixels, frame_number );
01824             ShowImage( area, pixels, info->width, info->height, info->isWide );
01825             delete[] pixels;
01826         }
01827         else
01828         {
01829             showFrameInfo( 0, 0 );
01830         }
01831     }
01832     catch ( const char * exc )
01833     {
01834         modal_message( ( char * ) exc );
01835     }
01836 
01837     repainting = false;
01838     delete info;
01839 }

gboolean PageMagick::processCommand char *  cmd  )  [virtual]
 

Reimplemented from Page.

Definition at line 2727 of file page_magick.cc.

References _getOneSecond(), KinoCommon::changePageRequest(), common, KinoCommon::getWidget(), KinoCommon::keyboardFeedback(), kinoDeactivate(), KinoCommon::moveByFrames(), PAGE_EDITOR, PAGE_TIMELINE, PAGE_TRIM, previewing, KinoCommon::savePlayList(), KinoCommon::videoEndOfMovie(), KinoCommon::videoEndOfScene(), KinoCommon::videoNextScene(), KinoCommon::videoPause(), KinoCommon::videoPlay(), KinoCommon::videoPreviousScene(), KinoCommon::videoStartOfMovie(), KinoCommon::videoStartOfScene(), and KinoCommon::videoStop().

02728 {
02729     /* play, pause */
02730 
02731     if ( strcmp( cmd, " " ) == 0 )
02732     {
02733         if ( !previewing )
02734         {
02735             common->keyboardFeedback( cmd, _( "Play" ) );
02736             common->videoPlay( );
02737         }
02738         else
02739         {
02740             common->keyboardFeedback( cmd, _( "Pause" ) );
02741             common->videoPause( );
02742         }
02743     }
02744 
02745     /* advance one frame */
02746 
02747     else if ( strcmp( cmd, "l" ) == 0 )
02748     {
02749         common->keyboardFeedback( cmd, _( "Move forward" ) );
02750         common->moveByFrames( 1 );
02751     }
02752 
02753     /* backspace one frame */
02754 
02755     else if ( strcmp( cmd, "h" ) == 0 )
02756     {
02757         common->keyboardFeedback( cmd, _( "Move backward" ) );
02758         common->moveByFrames( -1 );
02759     }
02760 
02761     /* advance one second */
02762 
02763     else if ( strcmp( cmd, "w" ) == 0 || strcmp( cmd, "W" ) == 0 ||
02764               strcmp( cmd, "e" ) == 0 || strcmp( cmd, "E" ) == 0 )
02765     {
02766         common->keyboardFeedback( cmd, _( "Move forward second" ) );
02767         common->moveByFrames( _getOneSecond() );
02768     }
02769 
02770     /* backspace one second */
02771 
02772     else if ( ( strcmp( cmd, "b" ) == 0 ) || ( strcmp( cmd, "B" ) == 0 ) )
02773     {
02774         common->keyboardFeedback( cmd, _( "Move backwards one second" ) );
02775         common->moveByFrames( -1 * _getOneSecond() );
02776     }
02777 
02778     /* start of scene */
02779 
02780     else if ( ( strcmp( cmd, "0" ) == 0 ) || ( strcmp( cmd, "^" ) == 0 ) )
02781     {
02782         common->videoStartOfScene( );
02783         common->keyboardFeedback( cmd, _( "Move to start of scene" ) );
02784     }
02785 
02786     /* end of scene */
02787 
02788     else if ( strcmp( cmd, "$" ) == 0 )
02789     {
02790         common->videoEndOfScene( );
02791         common->keyboardFeedback( cmd, _( "Move to end of scene" ) );
02792     }
02793 
02794     /* start of next scene */
02795 
02796     else if ( ( strcmp( cmd, "j" ) == 0 ) || strcmp( cmd, "+" ) == 0 )
02797     {
02798         common->videoNextScene( );
02799         common->keyboardFeedback( cmd, _( "Move to start of next scene" ) );
02800     }
02801 
02802     /* start of previous scene */
02803 
02804     else if ( ( strcmp( cmd, "k" ) == 0 ) || ( strcmp( cmd, "-" ) == 0 ) )
02805     {
02806         common->videoPreviousScene( );
02807         common->keyboardFeedback( cmd, _( "Move to start of previous scene" ) );
02808     }
02809 
02810     /* first frame */
02811 
02812     else if ( strcmp( cmd, "gg" ) == 0 )
02813     {
02814         common->videoStartOfMovie( );
02815         common->keyboardFeedback( cmd, _( "Move to first frame" ) );
02816     }
02817 
02818     /* last frame */
02819 
02820     else if ( strcmp( cmd, "G" ) == 0 )
02821     {
02822         common->videoEndOfMovie( );
02823         common->keyboardFeedback( cmd, _( "Move to last frame" ) );
02824     }
02825 
02826     /* write PlayList */
02827 
02828     else if ( strcmp( cmd, ":w" ) == 0 )
02829     {
02830         common->keyboardFeedback( cmd, _( "Write playlist" ) );
02831         common->savePlayList( );
02832     }
02833 
02834     else if ( strcmp( cmd, "Enter" ) == 0 )
02835     {
02836         common->keyboardFeedback( cmd, _( "Start Render" ) );
02837         GdkEvent ev;
02838         ev.key.type = GDK_KEY_PRESS;
02839         ev.key.window = common->getWidget()->window;
02840         ev.key.send_event = TRUE;
02841         ev.key.state = 0;
02842         ev.key.length = 0;
02843         ev.key.string = "";
02844         ev.key.keyval = GDK_Return;
02845         ev.key.group = 0;
02846         gdk_event_put( &ev );
02847     }
02848 
02849     else if ( strcmp( cmd, "Esc" ) == 0 )
02850     {
02851         common->keyboardFeedback( cmd, _( "Stop" ) );
02852         common->videoStop();
02853     }
02854 
02855     else if ( strcmp( cmd, "F2" ) == 0 )
02856     {
02857         common->keyboardFeedback( cmd, _( "Edit" ) );
02858         common->changePageRequest( PAGE_EDITOR );
02859     }
02860 
02861     else if ( strcmp( cmd, "A" ) == 0 )
02862     {
02863         common->keyboardFeedback( cmd, _( "Capture, append to movie" ) );
02864         common->changePageRequest( PAGE_EDITOR );
02865     }
02866 
02867     else if ( strcmp( cmd, "v" ) == 0 )
02868     {
02869         common->keyboardFeedback( cmd, _( "Timeline" ) );
02870         common->changePageRequest( PAGE_TIMELINE );
02871     }
02872 
02873     else if ( strcmp( cmd, "t" ) == 0 )
02874     {
02875         common->keyboardFeedback( cmd, _( "Trim" ) );
02876         common->changePageRequest( PAGE_TRIM );
02877     }
02878 
02879     else if ( strcmp( cmd, ":W" ) == 0 )
02880     {
02881         common->keyboardFeedback( cmd, _( "Export" ) );
02882