1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 * Copyright 2008 by Sun Microsystems, Inc.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * $RCSfile: g2g.cxx,v $
12 * This file is part of OpenOffice.org.
14 * OpenOffice.org is free software: you can redistribute it and/or modify
15 * it under the terms of the GNU Lesser General Public License version 3
16 * only, as published by the Free Software Foundation.
18 * OpenOffice.org is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU Lesser General Public License version 3 for more details
22 * (a copy is included in the LICENSE file that accompanied this code).
24 * You should have received a copy of the GNU Lesser General Public License
25 * version 3 along with OpenOffice.org. If not, see
26 * <http://www.openoffice.org/license.html>
27 * for a copy of the LGPLv3 License.
29 ************************************************************************/
31 // MARKER(update_precomp.py): autogen include statement, do not remove
32 #include "precompiled_svtools.hxx"
40 #include <tools/fsys.hxx>
41 #include <tools/stream.hxx>
42 #include <vcl/svapp.hxx>
43 #include "svtools/filter.hxx"
45 #define EXIT_NOERROR 0x00000000
46 #define EXIT_COMMONERROR 0x00000001
47 #define EXIT_INVALID_FILE 0x00000002
48 #define EXIT_INVALID_GRAPHICFILTER 0x00000004
49 #define EXIT_INVALID_INPUTGRAPHIC 0x00000008
50 #define EXIT_OUTPUTERROR 0x00000010
52 #define LOWERHEXTONUM( _def_Char ) (((_def_Char)<='9') ? ((_def_Char)-'0') : ((_def_Char)-'a'+10))
65 BOOL
GetCommandOption( const ::std::vector
< String
>& rArgs
, const String
& rSwitch
, String
& rParam
);
66 void SetExitCode( BYTE cExit
) { if( ( EXIT_NOERROR
== cExitCode
) || ( cExit
!= EXIT_NOERROR
) ) cExitCode
= cExit
; }
68 virtual void Message( const String
& rText
, BYTE cExitCode
= EXIT_NOERROR
);
75 int Start( const ::std::vector
< String
>& rArgs
);
78 // -----------------------------------------------------------------------
84 // -----------------------------------------------------------------------
90 // -----------------------------------------------------------------------
92 BOOL
G2GApp::GetCommandOption( const ::std::vector
< String
>& rArgs
, const String
& rSwitch
, String
& rParam
)
96 for( int i
= 0, nCount
= rArgs
.size(); ( i
< nCount
) && !bRet
; i
++ )
98 String
aTestStr( '-' );
100 for( int n
= 0; ( n
< 2 ) && !bRet
; n
++ )
104 if( aTestStr
.CompareIgnoreCaseToAscii( rArgs
[ i
] ) == COMPARE_EQUAL
)
108 if( i
< ( nCount
- 1 ) )
109 rParam
= rArgs
[ i
+ 1 ];
122 // -----------------------------------------------------------------------
124 void G2GApp::Message( const String
& rText
, BYTE nExitCode
)
126 if( EXIT_NOERROR
!= nExitCode
)
127 SetExitCode( nExitCode
);
129 ByteString
aText( rText
, RTL_TEXTENCODING_UTF8
);
130 aText
.Append( "\r\n" );
131 fprintf( stderr
, "%s", aText
.GetBuffer() );
134 // -----------------------------------------------------------------------------
136 void G2GApp::ShowUsage()
138 Message( String( RTL_CONSTASCII_USTRINGPARAM( "Usage:" ) ) );
139 Message( String( RTL_CONSTASCII_USTRINGPARAM( " g2g inputfile outputfile -format exportformat -filterpath path [ -# RRGGBB ]" ) ) );
140 Message( String( RTL_CONSTASCII_USTRINGPARAM( "Options:" ) ) );
141 Message( String( RTL_CONSTASCII_USTRINGPARAM( " -format short name of export filter to use ( e.g. gif, png, jpg, ... )" ) ) );
142 Message( String( RTL_CONSTASCII_USTRINGPARAM( " -filterpath path to externally loaded filter libraries" ) ) );
143 Message( String( RTL_CONSTASCII_USTRINGPARAM( " -# hex value of color to be set transparent in export file (optional)" ) ) );
144 Message( String( RTL_CONSTASCII_USTRINGPARAM( "Examples:" ) ) );
145 Message( String( RTL_CONSTASCII_USTRINGPARAM( " g2g /home/test.bmp /home/test.jpg -format jpg -filterpath /home/filter" ) ) );
146 Message( String( RTL_CONSTASCII_USTRINGPARAM( " g2g /home/test.bmp /home/test.gif -format gif -filterpath /home/filter -# C0C0C0" ) ) );
149 // -----------------------------------------------------------------------------
151 int G2GApp::Start( const ::std::vector
< String
>& rArgs
)
153 int nCmdCount
= rArgs
.size();
156 cExitCode
= EXIT_NOERROR
;
160 GraphicFilter
aFilter( sal_False
);
161 String aInFile
, aOutFile
, aFilterStr
, aFilterPath
, aTransColStr
;
163 aInFile
= rArgs
[ nCurCmd
++ ];
164 aOutFile
= rArgs
[ nCurCmd
++ ];
165 GetCommandOption( rArgs
, String( RTL_CONSTASCII_USTRINGPARAM( "format" ) ), aFilterStr
);
166 GetCommandOption( rArgs
, String( RTL_CONSTASCII_USTRINGPARAM( "filterpath" ) ), aFilterPath
);
167 GetCommandOption( rArgs
, '#', aTransColStr
);
169 aFilter
.SetFilterPath( aFilterPath
);
171 if( aInFile
.Len() && aOutFile
.Len() && aFilterStr
.Len() )
173 const USHORT nExportFilter
= aFilter
.GetExportFormatNumberForShortName( aFilterStr
);
175 if( GRFILTER_FORMAT_NOTFOUND
== nExportFilter
)
176 Message( String( RTL_CONSTASCII_USTRINGPARAM( "invalid graphic filter" ) ), EXIT_INVALID_GRAPHICFILTER
);
179 if( DirEntry( aInFile
).Exists() )
181 SvFileStream
aInStm( aInFile
, STREAM_READ
);
183 const GfxLink aGfxLink
;
185 aGraphic
.SetLink( aGfxLink
);
187 if( aFilter
.ImportGraphic( aGraphic
, aInFile
, aInStm
) == GRFILTER_OK
)
189 SvFileStream
aOutStm( aOutFile
, STREAM_WRITE
| STREAM_TRUNC
);
191 if( ( aTransColStr
.Len() == 6 ) && aFilter
.IsExportPixelFormat( nExportFilter
) )
193 ByteString
aHexStr( aTransColStr
, RTL_TEXTENCODING_ASCII_US
);
194 sal_Bool bHex
= sal_True
;
196 aHexStr
.ToLowerAscii();
198 for( sal_uInt16 i
= 0; ( i
< 6 ) && bHex
; i
++ )
199 if( !isxdigit( aHexStr
.GetChar( i
) ) )
204 const BYTE cTransR
= ( LOWERHEXTONUM( aHexStr
.GetChar( 0 ) ) << 4 ) | LOWERHEXTONUM( aHexStr
.GetChar( 1 ) );
205 const BYTE cTransG
= ( LOWERHEXTONUM( aHexStr
.GetChar( 2 ) ) << 4 ) | LOWERHEXTONUM( aHexStr
.GetChar( 3 ) );
206 const BYTE cTransB
= ( LOWERHEXTONUM( aHexStr
.GetChar( 4 ) ) << 4 ) | LOWERHEXTONUM( aHexStr
.GetChar( 5 ) );
208 BitmapEx
aBmpEx( aGraphic
.GetBitmapEx() );
209 Bitmap
aOldBmp( aBmpEx
.GetBitmap() );
210 Bitmap
aOldMask( aBmpEx
.GetMask() );
211 Bitmap
aNewMask( aOldBmp
.CreateMask( Color( cTransR
, cTransG
, cTransB
) ) );
213 if( !aOldMask
.IsEmpty() )
214 aNewMask
.CombineSimple( aOldMask
, BMP_COMBINE_OR
);
216 aGraphic
= BitmapEx( aOldBmp
, aNewMask
);
220 aFilter
.ExportGraphic( aGraphic
, aOutFile
, aOutStm
, nExportFilter
);
222 if( aOutStm
.GetError() )
223 Message( String( RTL_CONSTASCII_USTRINGPARAM( "could not write output file" ) ), EXIT_OUTPUTERROR
);
226 Message( String( RTL_CONSTASCII_USTRINGPARAM( "could import graphic" ) ), EXIT_INVALID_INPUTGRAPHIC
);
229 Message( String( RTL_CONSTASCII_USTRINGPARAM( "invalid file(s)" ) ), EXIT_INVALID_FILE
);
243 int main( int nArgCount
, char* ppArgs
[] )
245 ::std::vector
< String
> aArgs
;
248 InitVCL( com::sun::star::uno::Reference
< com::sun::star::lang::XMultiServiceFactory
>() );
250 for( int i
= 1; i
< nArgCount
; i
++ )
251 aArgs
.push_back( String( ppArgs
[ i
], RTL_TEXTENCODING_ASCII_US
) );
253 return aG2GApp
.Start( aArgs
);