Commit 85fad441 authored by Cyril Deguet's avatar Cyril Deguet

* winamp2.xml: added the Equalizer and Playlist windows.

 Now it starts to really look cool ;-)
* builder.cpp: look for fonts in the resource path if the
 font file cannot be found in the theme itself
* ctrl_slider.cpp: fixed the hack for winamp: the bar images
 are separated by 2 rows, not 3...
parent 0e6a1c1e
...@@ -387,9 +387,9 @@ void CtrlSliderBg::draw( OSGraphics &rImage, int xDest, int yDest ) ...@@ -387,9 +387,9 @@ void CtrlSliderBg::draw( OSGraphics &rImage, int xDest, int yDest )
if( m_pImgSeq ) if( m_pImgSeq )
{ {
// Draw the background image // Draw the background image
// XXX the "-3" is a hack for winamp skins... // XXX the "-2" is a hack for winamp skins...
rImage.drawGraphics( *m_pImgSeq, 0, m_position * m_bgHeight, rImage.drawGraphics( *m_pImgSeq, 0, m_position * m_bgHeight,
xDest, yDest, m_bgWidth, m_bgHeight - 3); xDest, yDest, m_bgWidth, m_bgHeight - 2);
} }
} }
......
...@@ -52,8 +52,9 @@ ...@@ -52,8 +52,9 @@
#include "vlc_image.h" #include "vlc_image.h"
Builder::Builder( intf_thread_t *pIntf, const BuilderData &rData ): Builder::Builder( intf_thread_t *pIntf, const BuilderData &rData,
SkinObject( pIntf ), m_rData( rData ), m_pTheme( NULL ) const string &rPath ):
SkinObject( pIntf ), m_rData( rData ), m_path( rPath ), m_pTheme( NULL )
{ {
m_pImageHandler = image_HandlerCreate( pIntf ); m_pImageHandler = image_HandlerCreate( pIntf );
} }
...@@ -145,7 +146,7 @@ void Builder::addBitmap( const BuilderData::Bitmap &rData ) ...@@ -145,7 +146,7 @@ void Builder::addBitmap( const BuilderData::Bitmap &rData )
{ {
GenericBitmap *pBmp = GenericBitmap *pBmp =
new FileBitmap( getIntf(), m_pImageHandler, new FileBitmap( getIntf(), m_pImageHandler,
rData.m_fileName, rData.m_alphaColor ); getFilePath( rData.m_fileName ), rData.m_alphaColor );
if( !pBmp->getData() ) if( !pBmp->getData() )
{ {
// Invalid bitmap // Invalid bitmap
...@@ -181,7 +182,8 @@ void Builder::addSubBitmap( const BuilderData::SubBitmap &rData ) ...@@ -181,7 +182,8 @@ void Builder::addSubBitmap( const BuilderData::SubBitmap &rData )
void Builder::addBitmapFont( const BuilderData::BitmapFont &rData ) void Builder::addBitmapFont( const BuilderData::BitmapFont &rData )
{ {
GenericBitmap *pBmp = GenericBitmap *pBmp =
new FileBitmap( getIntf(), m_pImageHandler, rData.m_file, 0 ); new FileBitmap( getIntf(), m_pImageHandler,
getFilePath( rData.m_file ), 0 );
if( !pBmp->getData() ) if( !pBmp->getData() )
{ {
// Invalid bitmap // Invalid bitmap
...@@ -205,7 +207,9 @@ void Builder::addBitmapFont( const BuilderData::BitmapFont &rData ) ...@@ -205,7 +207,9 @@ void Builder::addBitmapFont( const BuilderData::BitmapFont &rData )
void Builder::addFont( const BuilderData::Font &rData ) void Builder::addFont( const BuilderData::Font &rData )
{ {
GenericFont *pFont = new FT2Font( getIntf(), rData.m_fontFile, // Try to load the font from the theme directory
GenericFont *pFont = new FT2Font( getIntf(),
getFilePath( rData.m_fontFile ),
rData.m_size ); rData.m_size );
if( pFont->init() ) if( pFont->init() )
{ {
...@@ -214,6 +218,28 @@ void Builder::addFont( const BuilderData::Font &rData ) ...@@ -214,6 +218,28 @@ void Builder::addFont( const BuilderData::Font &rData )
else else
{ {
delete pFont; delete pFont;
// Font not found; try in the resource path
OSFactory *pOSFactory = OSFactory::instance( getIntf() );
const list<string> &resPath = pOSFactory->getResourcePath();
const string &sep = pOSFactory->getDirSeparator();
list<string>::const_iterator it;
for( it = resPath.begin(); it != resPath.end(); it++ )
{
string path = (*it) + sep + "fonts" + sep + rData.m_fontFile;
pFont = new FT2Font( getIntf(), path, rData.m_size );
if( pFont->init() )
{
// Font loaded successfully
m_pTheme->m_fonts[rData.m_id] = GenericFontPtr( pFont );
break;
}
else
{
delete pFont;
}
}
} }
} }
...@@ -865,6 +891,14 @@ GenericFont *Builder::getFont( const string &fontId ) ...@@ -865,6 +891,14 @@ GenericFont *Builder::getFont( const string &fontId )
} }
string Builder::getFilePath( const string &rFileName ) const
{
OSFactory *pFactory = OSFactory::instance( getIntf() );
return m_path + pFactory->getDirSeparator() + rFileName;
}
Bezier *Builder::getPoints( const char *pTag ) const Bezier *Builder::getPoints( const char *pTag ) const
{ {
vector<float> xBez, yBez; vector<float> xBez, yBez;
......
...@@ -46,7 +46,8 @@ class Theme; ...@@ -46,7 +46,8 @@ class Theme;
class Builder: public SkinObject class Builder: public SkinObject
{ {
public: public:
Builder( intf_thread_t *pIntf, const BuilderData &rData ); Builder( intf_thread_t *pIntf, const BuilderData &rData,
const string &rPath );
virtual ~Builder(); virtual ~Builder();
/// Create a Theme object, ready to use. /// Create a Theme object, ready to use.
...@@ -59,6 +60,8 @@ class Builder: public SkinObject ...@@ -59,6 +60,8 @@ class Builder: public SkinObject
private: private:
/// Data from the XML /// Data from the XML
const BuilderData &m_rData; const BuilderData &m_rData;
/// Path of the theme
const string m_path;
/// Theme under construction /// Theme under construction
Theme *m_pTheme; Theme *m_pTheme;
...@@ -87,6 +90,9 @@ class Builder: public SkinObject ...@@ -87,6 +90,9 @@ class Builder: public SkinObject
int xPos, int yPos, int width, int height, int xPos, int yPos, int width, int height,
const Box &rBox ) const; const Box &rBox ) const;
// Build the full path of a file
string getFilePath( const string &fileName ) const;
/// Get a font from its id /// Get a font from its id
GenericFont *getFont( const string &fontId ); GenericFont *getFont( const string &fontId );
......
...@@ -27,8 +27,8 @@ ...@@ -27,8 +27,8 @@
SkinParser::SkinParser( intf_thread_t *pIntf, const string &rFileName, SkinParser::SkinParser( intf_thread_t *pIntf, const string &rFileName,
const string &rPath, bool useDTD, BuilderData *pData ): const string &rPath, bool useDTD, BuilderData *pData ):
XMLParser( pIntf, rFileName, useDTD ), m_pData(pData), XMLParser( pIntf, rFileName, useDTD ), m_path( rPath), m_pData(pData),
m_ownData(pData == NULL), m_xOffset( 0 ), m_yOffset( 0 ), m_path( rPath ) m_ownData(pData == NULL), m_xOffset( 0 ), m_yOffset( 0 )
{ {
// Make sure the data is allocated // Make sure the data is allocated
if( m_pData == NULL ) if( m_pData == NULL )
...@@ -62,12 +62,13 @@ void SkinParser::handleBeginElement( const string &rName, AttrList_t &attr ) ...@@ -62,12 +62,13 @@ void SkinParser::handleBeginElement( const string &rName, AttrList_t &attr )
if( rName == "Include" ) if( rName == "Include" )
{ {
RequireDefault( "file" ); RequireDefault( "file" );
msg_Dbg( getIntf(), "Opening included XML file: %s",
convertFileName( attr["file"] ).c_str() ); OSFactory *pFactory = OSFactory::instance( getIntf() );
string fullPath = m_path + pFactory->getDirSeparator() + attr["file"];
msg_Dbg( getIntf(), "Opening included XML file: %s", fullPath.c_str() );
// FIXME: We do not use the DTD to validate the included XML file, // FIXME: We do not use the DTD to validate the included XML file,
// as the parser seems to dislike it otherwise... // as the parser seems to dislike it otherwise...
SkinParser subParser( getIntf(), convertFileName( attr["file"] ), SkinParser subParser( getIntf(), fullPath.c_str(), false, m_pData );
m_path, false, m_pData );
subParser.parse(); subParser.parse();
} }
...@@ -93,8 +94,7 @@ void SkinParser::handleBeginElement( const string &rName, AttrList_t &attr ) ...@@ -93,8 +94,7 @@ void SkinParser::handleBeginElement( const string &rName, AttrList_t &attr )
m_curBitmapId = uniqueId( attr["id"] ); m_curBitmapId = uniqueId( attr["id"] );
const BuilderData::Bitmap bitmap( m_curBitmapId, const BuilderData::Bitmap bitmap( m_curBitmapId,
convertFileName( attr["file"] ), attr["file"], convertColor( attr["alphacolor"] ) );
convertColor( attr["alphacolor"] ) );
m_pData->m_listBitmap.push_back( bitmap ); m_pData->m_listBitmap.push_back( bitmap );
} }
...@@ -119,8 +119,7 @@ void SkinParser::handleBeginElement( const string &rName, AttrList_t &attr ) ...@@ -119,8 +119,7 @@ void SkinParser::handleBeginElement( const string &rName, AttrList_t &attr )
CheckDefault( "type", "digits" ); CheckDefault( "type", "digits" );
const BuilderData::BitmapFont font( attr["id"], const BuilderData::BitmapFont font( attr["id"],
convertFileName( attr["file"] ), attr["file"], attr["type"] );
attr["type"] );
m_pData->m_listBitmapFont.push_back( font ); m_pData->m_listBitmapFont.push_back( font );
} }
...@@ -189,8 +188,7 @@ void SkinParser::handleBeginElement( const string &rName, AttrList_t &attr ) ...@@ -189,8 +188,7 @@ void SkinParser::handleBeginElement( const string &rName, AttrList_t &attr )
CheckDefault( "size", "12" ); CheckDefault( "size", "12" );
const BuilderData::Font fontData( uniqueId( attr["id"] ), const BuilderData::Font fontData( uniqueId( attr["id"] ),
convertFileName( attr["file"] ), attr["file"], atoi( attr["size"] ) );
atoi( attr["size"] ) );
m_pData->m_listFont.push_back( fontData ); m_pData->m_listFont.push_back( fontData );
} }
...@@ -525,13 +523,6 @@ int SkinParser::convertColor( const char *transcolor ) const ...@@ -525,13 +523,6 @@ int SkinParser::convertColor( const char *transcolor ) const
} }
string SkinParser::convertFileName( const char *fileName ) const
{
OSFactory *pFactory = OSFactory::instance( getIntf() );
return m_path + pFactory->getDirSeparator() + string( fileName );
}
int SkinParser::convertInRange( const char *value, int minValue, int maxValue, int SkinParser::convertInRange( const char *value, int minValue, int maxValue,
const string &rAttribute ) const const string &rAttribute ) const
{ {
......
...@@ -41,6 +41,8 @@ class SkinParser: public XMLParser ...@@ -41,6 +41,8 @@ class SkinParser: public XMLParser
const BuilderData &getData() const { return *m_pData; } const BuilderData &getData() const { return *m_pData; }
private: private:
/// Path of the theme
const string m_path;
/// Container for mapping data from the XML /// Container for mapping data from the XML
BuilderData *m_pData; BuilderData *m_pData;
/// Indicate whether the class owns the data /// Indicate whether the class owns the data
...@@ -58,8 +60,6 @@ class SkinParser: public XMLParser ...@@ -58,8 +60,6 @@ class SkinParser: public XMLParser
int m_curLayer; int m_curLayer;
/// Set of used id /// Set of used id
set<string> m_idSet; set<string> m_idSet;
/// Path of the XML file being parsed
const string m_path;
/// Callbacks /// Callbacks
virtual void handleBeginElement( const string &rName, virtual void handleBeginElement( const string &rName,
...@@ -70,7 +70,6 @@ class SkinParser: public XMLParser ...@@ -70,7 +70,6 @@ class SkinParser: public XMLParser
//@{ //@{
bool convertBoolean( const char *value ) const; bool convertBoolean( const char *value ) const;
int convertColor( const char *transcolor ) const; int convertColor( const char *transcolor ) const;
string convertFileName( const char *fileName ) const;
/// Transform to int, and check that it is in the given range (if not, /// Transform to int, and check that it is in the given range (if not,
/// the closest range boundary will be used) /// the closest range boundary will be used)
int convertInRange( const char *value, int minValue, int maxValue, int convertInRange( const char *value, int minValue, int maxValue,
......
...@@ -200,7 +200,7 @@ bool ThemeLoader::extractFileInZip( unzFile file, const string &rootDir ) ...@@ -200,7 +200,7 @@ bool ThemeLoader::extractFileInZip( unzFile file, const string &rootDir )
// Convert the file name to lower case, because some winamp skins // Convert the file name to lower case, because some winamp skins
// use the wrong case... // use the wrong case...
for( int i=0; i< strlen( filenameInZip ); i++) for( size_t i=0; i< strlen( filenameInZip ); i++)
{ {
filenameInZip[i] = tolower( filenameInZip[i] ); filenameInZip[i] = tolower( filenameInZip[i] );
} }
...@@ -359,7 +359,7 @@ bool ThemeLoader::parse( const string &path, const string &xmlFile ) ...@@ -359,7 +359,7 @@ bool ThemeLoader::parse( const string &path, const string &xmlFile )
} }
// Build and store the theme // Build and store the theme
Builder builder( getIntf(), parser.getData() ); Builder builder( getIntf(), parser.getData(), path );
getIntf()->p_sys->p_theme = builder.build(); getIntf()->p_sys->p_theme = builder.build();
return true; return true;
......
...@@ -78,6 +78,7 @@ DIST_skins2 = \ ...@@ -78,6 +78,7 @@ DIST_skins2 = \
skins2/default.vlt \ skins2/default.vlt \
\ \
skins2/fonts/FreeSans.ttf \ skins2/fonts/FreeSans.ttf \
skins2/fonts/FreeSansBold.ttf \
skins2/skin.dtd \ skins2/skin.dtd \
skins2/skin.catalog \ skins2/skin.catalog \
skins2/winamp2.xml \ skins2/winamp2.xml \
......
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment