2007-04-16 06:26:42 +02:00
// Copyright (c) 2007, Rodrigo Braz Monteiro
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// * Redistributions of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
// * Neither the name of the Aegisub Group nor the names of its contributors
// may be used to endorse or promote products derived from this software
// without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.
//
// -----------------------------------------------------------------------------
//
// AEGISUB
//
// Website: http://aegisub.cellosoft.com
// Contact: mailto:zeratul@cellosoft.com
//
# pragma once
////////////
// Includes
2007-04-17 01:41:06 +02:00
# include "ass_style.h"
2007-04-16 06:26:42 +02:00
# include "subs_preview.h"
# include "video_provider_dummy.h"
# include "subtitles_provider.h"
# include "ass_file.h"
///////////////
// Constructor
2007-04-17 01:41:06 +02:00
SubtitlesPreview : : SubtitlesPreview ( wxWindow * parent , int id , wxPoint pos , wxSize size , int winStyle )
: wxWindow ( parent , id , pos , size , winStyle )
2007-04-16 06:26:42 +02:00
{
AssStyle temp ;
2007-04-17 01:41:06 +02:00
bmp = NULL ;
style = NULL ;
2007-04-17 01:59:38 +02:00
vid = NULL ;
2007-04-16 06:26:42 +02:00
SetStyle ( & temp ) ;
2007-04-17 01:41:06 +02:00
SetText ( _T ( " preview " ) ) ;
SetSizeHints ( size . GetWidth ( ) , size . GetHeight ( ) , - 1 , - 1 ) ;
2007-04-16 06:26:42 +02:00
}
//////////////
// Destructor
SubtitlesPreview : : ~ SubtitlesPreview ( ) {
delete bmp ;
2007-04-17 01:41:06 +02:00
delete style ;
2007-04-17 01:59:38 +02:00
delete vid ;
2007-04-16 06:26:42 +02:00
}
/////////////
// Set style
void SubtitlesPreview : : SetStyle ( AssStyle * _style ) {
2007-04-17 01:41:06 +02:00
// Prepare style
AssStyle * tmpStyle = AssEntry : : GetAsStyle ( _style - > Clone ( ) ) ;
tmpStyle - > name = _T ( " Preview " ) ;
tmpStyle - > alignment = 5 ;
for ( int i = 0 ; i < 4 ; i + + ) tmpStyle - > Margin [ i ] = 0 ;
tmpStyle - > UpdateData ( ) ;
// See if it's any different from the current
if ( style ) {
if ( tmpStyle - > IsEqualTo ( style ) ) {
delete tmpStyle ;
return ;
}
}
// Update
delete style ;
style = tmpStyle ;
2007-04-16 06:26:42 +02:00
UpdateBitmap ( ) ;
}
////////////
// Set text
void SubtitlesPreview : : SetText ( wxString text ) {
2007-04-17 01:41:06 +02:00
if ( text ! = showText ) {
showText = text ;
UpdateBitmap ( ) ;
}
2007-04-16 06:26:42 +02:00
}
////////////////
// Update image
void SubtitlesPreview : : UpdateBitmap ( int w , int h ) {
// Visible?
if ( ! IsShownOnScreen ( ) ) return ;
// Get size
if ( w = = - 1 ) {
w = GetClientSize ( ) . GetWidth ( ) ;
h = GetClientSize ( ) . GetHeight ( ) ;
}
// Delete old bmp if needed
if ( bmp ) {
if ( bmp - > GetWidth ( ) ! = w | | bmp - > GetHeight ( ) ! = h ) {
delete bmp ;
bmp = NULL ;
}
}
// Create bitmap
if ( ! bmp ) {
bmp = new wxBitmap ( w , h , - 1 ) ;
}
// Get AegiVideoFrame
2007-04-17 01:59:38 +02:00
if ( ! vid ) vid = new DummyVideoProvider ( 0.0 , 10 , w , h , wxColour ( 125 , 153 , 176 ) , true ) ;
AegiVideoFrame frame ;
frame . CopyFrom ( vid - > GetFrame ( 0 ) ) ;
2007-04-16 06:26:42 +02:00
2007-04-18 01:00:30 +02:00
// Try to get subtitles provider
SubtitlesProvider * provider = NULL ;
try {
provider = SubtitlesProviderFactory : : GetProvider ( ) ;
}
catch ( . . . ) {
wxMessageBox ( _T ( " Could not get any subtitles provider for the preview box. Make sure that you have a provider installed. " ) , _T ( " No subtitles provider " ) , wxICON_ERROR ) ;
}
// Provider OK
2007-04-16 06:26:42 +02:00
if ( provider ) {
2007-04-18 01:00:30 +02:00
// Generate subtitles
AssFile * subs = new AssFile ( ) ;
subs - > LoadDefault ( ) ;
int ver = 1 ;
wxString outGroup ;
subs - > InsertStyle ( style ) ;
subs - > SetScriptInfo ( _T ( " PlayResX " ) , wxString : : Format ( _T ( " %i " ) , w ) ) ;
subs - > SetScriptInfo ( _T ( " PlayResY " ) , wxString : : Format ( _T ( " %i " ) , h ) ) ;
subs - > AddLine ( _T ( " Dialogue: 0,0:00:00.00,0:00:05.00,Preview,,0000,0000,0000,,{ \\ q2} " ) + showText , _T ( " [Events] " ) , 0 , ver , & outGroup ) ;
// Apply subtitles
2007-04-16 06:26:42 +02:00
provider - > LoadSubtitles ( subs ) ;
provider - > DrawSubtitles ( frame , 0.1 ) ;
delete provider ;
}
// Convert frame to bitmap
wxMemoryDC dc ( * bmp ) ;
wxBitmap tempBmp ( frame . GetImage ( ) ) ;
2007-04-16 17:08:09 +02:00
frame . Clear ( ) ;
2007-04-16 06:26:42 +02:00
dc . DrawBitmap ( tempBmp , 0 , 0 ) ;
Refresh ( ) ;
}
///////////////
// Event table
BEGIN_EVENT_TABLE ( SubtitlesPreview , wxWindow )
EVT_PAINT ( SubtitlesPreview : : OnPaint )
EVT_SIZE ( SubtitlesPreview : : OnSize )
END_EVENT_TABLE ( )
///////////////
// Paint event
void SubtitlesPreview : : OnPaint ( wxPaintEvent & event ) {
wxPaintDC dc ( this ) ;
if ( ! bmp ) UpdateBitmap ( ) ;
if ( bmp ) dc . DrawBitmap ( * bmp , 0 , 0 ) ;
}
//////////////
// Size event
void SubtitlesPreview : : OnSize ( wxSizeEvent & event ) {
2007-04-17 01:59:38 +02:00
delete vid ;
vid = NULL ;
2007-04-16 06:26:42 +02:00
UpdateBitmap ( event . GetSize ( ) . GetWidth ( ) , event . GetSize ( ) . GetHeight ( ) ) ;
}