1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski *
3*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski * or more contributor license agreements. See the NOTICE file
5*b1cdbd2cSJim Jagielski * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski * regarding copyright ownership. The ASF licenses this file
7*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski * with the License. You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski *
11*b1cdbd2cSJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski *
13*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski * KIND, either express or implied. See the License for the
17*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski * under the License.
19*b1cdbd2cSJim Jagielski *
20*b1cdbd2cSJim Jagielski *************************************************************/
21*b1cdbd2cSJim Jagielski
22*b1cdbd2cSJim Jagielski
23*b1cdbd2cSJim Jagielski
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_svtools.hxx"
26*b1cdbd2cSJim Jagielski
27*b1cdbd2cSJim Jagielski #include <stdio.h>
28*b1cdbd2cSJim Jagielski #include <signal.h>
29*b1cdbd2cSJim Jagielski #include <ctype.h>
30*b1cdbd2cSJim Jagielski
31*b1cdbd2cSJim Jagielski #include <sal/main.h>
32*b1cdbd2cSJim Jagielski
33*b1cdbd2cSJim Jagielski #include <tools/fsys.hxx>
34*b1cdbd2cSJim Jagielski #include <tools/stream.hxx>
35*b1cdbd2cSJim Jagielski #include <vcl/svapp.hxx>
36*b1cdbd2cSJim Jagielski #include "svtools/filter.hxx"
37*b1cdbd2cSJim Jagielski
38*b1cdbd2cSJim Jagielski #define EXIT_NOERROR 0x00000000
39*b1cdbd2cSJim Jagielski #define EXIT_COMMONERROR 0x00000001
40*b1cdbd2cSJim Jagielski #define EXIT_INVALID_FILE 0x00000002
41*b1cdbd2cSJim Jagielski #define EXIT_INVALID_GRAPHICFILTER 0x00000004
42*b1cdbd2cSJim Jagielski #define EXIT_INVALID_INPUTGRAPHIC 0x00000008
43*b1cdbd2cSJim Jagielski #define EXIT_OUTPUTERROR 0x00000010
44*b1cdbd2cSJim Jagielski
45*b1cdbd2cSJim Jagielski #define LOWERHEXTONUM( _def_Char ) (((_def_Char)<='9') ? ((_def_Char)-'0') : ((_def_Char)-'a'+10))
46*b1cdbd2cSJim Jagielski
47*b1cdbd2cSJim Jagielski // ----------
48*b1cdbd2cSJim Jagielski // - G2GApp -
49*b1cdbd2cSJim Jagielski // ----------
50*b1cdbd2cSJim Jagielski
51*b1cdbd2cSJim Jagielski class G2GApp
52*b1cdbd2cSJim Jagielski {
53*b1cdbd2cSJim Jagielski private:
54*b1cdbd2cSJim Jagielski
55*b1cdbd2cSJim Jagielski sal_uInt8 cExitCode;
56*b1cdbd2cSJim Jagielski
57*b1cdbd2cSJim Jagielski void ShowUsage();
58*b1cdbd2cSJim Jagielski sal_Bool GetCommandOption( const ::std::vector< String >& rArgs, const String& rSwitch, String& rParam );
SetExitCode(sal_uInt8 cExit)59*b1cdbd2cSJim Jagielski void SetExitCode( sal_uInt8 cExit ) { if( ( EXIT_NOERROR == cExitCode ) || ( cExit != EXIT_NOERROR ) ) cExitCode = cExit; }
60*b1cdbd2cSJim Jagielski
61*b1cdbd2cSJim Jagielski virtual void Message( const String& rText, sal_uInt8 cExitCode = EXIT_NOERROR );
62*b1cdbd2cSJim Jagielski
63*b1cdbd2cSJim Jagielski public:
64*b1cdbd2cSJim Jagielski
65*b1cdbd2cSJim Jagielski G2GApp();
66*b1cdbd2cSJim Jagielski virtual ~G2GApp();
67*b1cdbd2cSJim Jagielski
68*b1cdbd2cSJim Jagielski int Start( const ::std::vector< String >& rArgs );
69*b1cdbd2cSJim Jagielski };
70*b1cdbd2cSJim Jagielski
71*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
72*b1cdbd2cSJim Jagielski
G2GApp()73*b1cdbd2cSJim Jagielski G2GApp::G2GApp()
74*b1cdbd2cSJim Jagielski {
75*b1cdbd2cSJim Jagielski }
76*b1cdbd2cSJim Jagielski
77*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
78*b1cdbd2cSJim Jagielski
~G2GApp()79*b1cdbd2cSJim Jagielski G2GApp::~G2GApp()
80*b1cdbd2cSJim Jagielski {
81*b1cdbd2cSJim Jagielski }
82*b1cdbd2cSJim Jagielski
83*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
84*b1cdbd2cSJim Jagielski
GetCommandOption(const::std::vector<String> & rArgs,const String & rSwitch,String & rParam)85*b1cdbd2cSJim Jagielski sal_Bool G2GApp::GetCommandOption( const ::std::vector< String >& rArgs, const String& rSwitch, String& rParam )
86*b1cdbd2cSJim Jagielski {
87*b1cdbd2cSJim Jagielski sal_Bool bRet = sal_False;
88*b1cdbd2cSJim Jagielski
89*b1cdbd2cSJim Jagielski for( int i = 0, nCount = rArgs.size(); ( i < nCount ) && !bRet; i++ )
90*b1cdbd2cSJim Jagielski {
91*b1cdbd2cSJim Jagielski String aTestStr( '-' );
92*b1cdbd2cSJim Jagielski
93*b1cdbd2cSJim Jagielski for( int n = 0; ( n < 2 ) && !bRet; n++ )
94*b1cdbd2cSJim Jagielski {
95*b1cdbd2cSJim Jagielski aTestStr += rSwitch;
96*b1cdbd2cSJim Jagielski
97*b1cdbd2cSJim Jagielski if( aTestStr.CompareIgnoreCaseToAscii( rArgs[ i ] ) == COMPARE_EQUAL )
98*b1cdbd2cSJim Jagielski {
99*b1cdbd2cSJim Jagielski bRet = sal_True;
100*b1cdbd2cSJim Jagielski
101*b1cdbd2cSJim Jagielski if( i < ( nCount - 1 ) )
102*b1cdbd2cSJim Jagielski rParam = rArgs[ i + 1 ];
103*b1cdbd2cSJim Jagielski else
104*b1cdbd2cSJim Jagielski rParam = String();
105*b1cdbd2cSJim Jagielski }
106*b1cdbd2cSJim Jagielski
107*b1cdbd2cSJim Jagielski if( 0 == n )
108*b1cdbd2cSJim Jagielski aTestStr = '/';
109*b1cdbd2cSJim Jagielski }
110*b1cdbd2cSJim Jagielski }
111*b1cdbd2cSJim Jagielski
112*b1cdbd2cSJim Jagielski return bRet;
113*b1cdbd2cSJim Jagielski }
114*b1cdbd2cSJim Jagielski
115*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
116*b1cdbd2cSJim Jagielski
Message(const String & rText,sal_uInt8 nExitCode)117*b1cdbd2cSJim Jagielski void G2GApp::Message( const String& rText, sal_uInt8 nExitCode )
118*b1cdbd2cSJim Jagielski {
119*b1cdbd2cSJim Jagielski if( EXIT_NOERROR != nExitCode )
120*b1cdbd2cSJim Jagielski SetExitCode( nExitCode );
121*b1cdbd2cSJim Jagielski
122*b1cdbd2cSJim Jagielski ByteString aText( rText, RTL_TEXTENCODING_UTF8 );
123*b1cdbd2cSJim Jagielski aText.Append( "\r\n" );
124*b1cdbd2cSJim Jagielski fprintf( stderr, aText.GetBuffer() );
125*b1cdbd2cSJim Jagielski }
126*b1cdbd2cSJim Jagielski
127*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
128*b1cdbd2cSJim Jagielski
ShowUsage()129*b1cdbd2cSJim Jagielski void G2GApp::ShowUsage()
130*b1cdbd2cSJim Jagielski {
131*b1cdbd2cSJim Jagielski Message( String( RTL_CONSTASCII_USTRINGPARAM( "Usage:" ) ) );
132*b1cdbd2cSJim Jagielski Message( String( RTL_CONSTASCII_USTRINGPARAM( " g2g inputfile outputfile -format exportformat -filterpath path [ -# RRGGBB ]" ) ) );
133*b1cdbd2cSJim Jagielski Message( String( RTL_CONSTASCII_USTRINGPARAM( "Options:" ) ) );
134*b1cdbd2cSJim Jagielski Message( String( RTL_CONSTASCII_USTRINGPARAM( " -format short name of export filter to use ( e.g. gif, png, jpg, ... )" ) ) );
135*b1cdbd2cSJim Jagielski Message( String( RTL_CONSTASCII_USTRINGPARAM( " -filterpath path to externally loaded filter libraries" ) ) );
136*b1cdbd2cSJim Jagielski Message( String( RTL_CONSTASCII_USTRINGPARAM( " -# hex value of color to be set transparent in export file (optional)" ) ) );
137*b1cdbd2cSJim Jagielski Message( String( RTL_CONSTASCII_USTRINGPARAM( "Examples:" ) ) );
138*b1cdbd2cSJim Jagielski Message( String( RTL_CONSTASCII_USTRINGPARAM( " g2g /home/test.bmp /home/test.jpg -format jpg -filterpath /home/filter" ) ) );
139*b1cdbd2cSJim Jagielski Message( String( RTL_CONSTASCII_USTRINGPARAM( " g2g /home/test.bmp /home/test.gif -format gif -filterpath /home/filter -# C0C0C0" ) ) );
140*b1cdbd2cSJim Jagielski }
141*b1cdbd2cSJim Jagielski
142*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
143*b1cdbd2cSJim Jagielski
Start(const::std::vector<String> & rArgs)144*b1cdbd2cSJim Jagielski int G2GApp::Start( const ::std::vector< String >& rArgs )
145*b1cdbd2cSJim Jagielski {
146*b1cdbd2cSJim Jagielski int nCmdCount = rArgs.size();
147*b1cdbd2cSJim Jagielski sal_uInt16 nCurCmd = 0;
148*b1cdbd2cSJim Jagielski
149*b1cdbd2cSJim Jagielski cExitCode = EXIT_NOERROR;
150*b1cdbd2cSJim Jagielski
151*b1cdbd2cSJim Jagielski if( nCmdCount >= 6 )
152*b1cdbd2cSJim Jagielski {
153*b1cdbd2cSJim Jagielski GraphicFilter aFilter( sal_False );
154*b1cdbd2cSJim Jagielski String aInFile, aOutFile, aFilterStr, aFilterPath, aTransColStr;
155*b1cdbd2cSJim Jagielski
156*b1cdbd2cSJim Jagielski aInFile = rArgs[ nCurCmd++ ];
157*b1cdbd2cSJim Jagielski aOutFile = rArgs[ nCurCmd++ ];
158*b1cdbd2cSJim Jagielski GetCommandOption( rArgs, String( RTL_CONSTASCII_USTRINGPARAM( "format" ) ), aFilterStr );
159*b1cdbd2cSJim Jagielski GetCommandOption( rArgs, String( RTL_CONSTASCII_USTRINGPARAM( "filterpath" ) ), aFilterPath );
160*b1cdbd2cSJim Jagielski GetCommandOption( rArgs, '#', aTransColStr );
161*b1cdbd2cSJim Jagielski
162*b1cdbd2cSJim Jagielski aFilter.SetFilterPath( aFilterPath );
163*b1cdbd2cSJim Jagielski
164*b1cdbd2cSJim Jagielski if( aInFile.Len() && aOutFile.Len() && aFilterStr.Len() )
165*b1cdbd2cSJim Jagielski {
166*b1cdbd2cSJim Jagielski const sal_uInt16 nExportFilter = aFilter.GetExportFormatNumberForShortName( aFilterStr );
167*b1cdbd2cSJim Jagielski
168*b1cdbd2cSJim Jagielski if( GRFILTER_FORMAT_NOTFOUND == nExportFilter )
169*b1cdbd2cSJim Jagielski Message( String( RTL_CONSTASCII_USTRINGPARAM( "invalid graphic filter" ) ), EXIT_INVALID_GRAPHICFILTER );
170*b1cdbd2cSJim Jagielski else
171*b1cdbd2cSJim Jagielski {
172*b1cdbd2cSJim Jagielski if( DirEntry( aInFile ).Exists() )
173*b1cdbd2cSJim Jagielski {
174*b1cdbd2cSJim Jagielski SvFileStream aInStm( aInFile, STREAM_READ );
175*b1cdbd2cSJim Jagielski Graphic aGraphic;
176*b1cdbd2cSJim Jagielski const GfxLink aGfxLink;
177*b1cdbd2cSJim Jagielski
178*b1cdbd2cSJim Jagielski aGraphic.SetLink( aGfxLink );
179*b1cdbd2cSJim Jagielski
180*b1cdbd2cSJim Jagielski if( aFilter.ImportGraphic( aGraphic, aInFile, aInStm ) == GRFILTER_OK )
181*b1cdbd2cSJim Jagielski {
182*b1cdbd2cSJim Jagielski SvFileStream aOutStm( aOutFile, STREAM_WRITE | STREAM_TRUNC );
183*b1cdbd2cSJim Jagielski
184*b1cdbd2cSJim Jagielski if( ( aTransColStr.Len() == 6 ) && aFilter.IsExportPixelFormat( nExportFilter ) )
185*b1cdbd2cSJim Jagielski {
186*b1cdbd2cSJim Jagielski ByteString aHexStr( aTransColStr, RTL_TEXTENCODING_ASCII_US );
187*b1cdbd2cSJim Jagielski sal_Bool bHex = sal_True;
188*b1cdbd2cSJim Jagielski
189*b1cdbd2cSJim Jagielski aHexStr.ToLowerAscii();
190*b1cdbd2cSJim Jagielski
191*b1cdbd2cSJim Jagielski for( sal_uInt16 i = 0; ( i < 6 ) && bHex; i++ )
192*b1cdbd2cSJim Jagielski if( !isxdigit( aHexStr.GetChar( i ) ) )
193*b1cdbd2cSJim Jagielski bHex = sal_False;
194*b1cdbd2cSJim Jagielski
195*b1cdbd2cSJim Jagielski if( bHex )
196*b1cdbd2cSJim Jagielski {
197*b1cdbd2cSJim Jagielski const sal_uInt8 cTransR = ( LOWERHEXTONUM( aHexStr.GetChar( 0 ) ) << 4 ) | LOWERHEXTONUM( aHexStr.GetChar( 1 ) );
198*b1cdbd2cSJim Jagielski const sal_uInt8 cTransG = ( LOWERHEXTONUM( aHexStr.GetChar( 2 ) ) << 4 ) | LOWERHEXTONUM( aHexStr.GetChar( 3 ) );
199*b1cdbd2cSJim Jagielski const sal_uInt8 cTransB = ( LOWERHEXTONUM( aHexStr.GetChar( 4 ) ) << 4 ) | LOWERHEXTONUM( aHexStr.GetChar( 5 ) );
200*b1cdbd2cSJim Jagielski
201*b1cdbd2cSJim Jagielski BitmapEx aBmpEx( aGraphic.GetBitmapEx() );
202*b1cdbd2cSJim Jagielski Bitmap aOldBmp( aBmpEx.GetBitmap() );
203*b1cdbd2cSJim Jagielski Bitmap aOldMask( aBmpEx.GetMask() );
204*b1cdbd2cSJim Jagielski Bitmap aNewMask( aOldBmp.CreateMask( Color( cTransR, cTransG, cTransB ) ) );
205*b1cdbd2cSJim Jagielski
206*b1cdbd2cSJim Jagielski if( !aOldMask.IsEmpty() )
207*b1cdbd2cSJim Jagielski aNewMask.CombineSimple( aOldMask, BMP_COMBINE_OR );
208*b1cdbd2cSJim Jagielski
209*b1cdbd2cSJim Jagielski aGraphic = BitmapEx( aOldBmp, aNewMask );
210*b1cdbd2cSJim Jagielski }
211*b1cdbd2cSJim Jagielski }
212*b1cdbd2cSJim Jagielski
213*b1cdbd2cSJim Jagielski aFilter.ExportGraphic( aGraphic, aOutFile, aOutStm, nExportFilter );
214*b1cdbd2cSJim Jagielski
215*b1cdbd2cSJim Jagielski if( aOutStm.GetError() )
216*b1cdbd2cSJim Jagielski Message( String( RTL_CONSTASCII_USTRINGPARAM( "could not write output file" ) ), EXIT_OUTPUTERROR );
217*b1cdbd2cSJim Jagielski }
218*b1cdbd2cSJim Jagielski else
219*b1cdbd2cSJim Jagielski Message( String( RTL_CONSTASCII_USTRINGPARAM( "could import graphic" ) ), EXIT_INVALID_INPUTGRAPHIC );
220*b1cdbd2cSJim Jagielski }
221*b1cdbd2cSJim Jagielski else
222*b1cdbd2cSJim Jagielski Message( String( RTL_CONSTASCII_USTRINGPARAM( "invalid file(s)" ) ), EXIT_INVALID_FILE );
223*b1cdbd2cSJim Jagielski }
224*b1cdbd2cSJim Jagielski }
225*b1cdbd2cSJim Jagielski }
226*b1cdbd2cSJim Jagielski else
227*b1cdbd2cSJim Jagielski ShowUsage();
228*b1cdbd2cSJim Jagielski
229*b1cdbd2cSJim Jagielski return cExitCode;
230*b1cdbd2cSJim Jagielski }
231*b1cdbd2cSJim Jagielski
232*b1cdbd2cSJim Jagielski // --------
233*b1cdbd2cSJim Jagielski // - Main -
234*b1cdbd2cSJim Jagielski // --------
235*b1cdbd2cSJim Jagielski
main(int nArgCount,char * ppArgs[])236*b1cdbd2cSJim Jagielski int main( int nArgCount, char* ppArgs[] )
237*b1cdbd2cSJim Jagielski {
238*b1cdbd2cSJim Jagielski ::std::vector< String > aArgs;
239*b1cdbd2cSJim Jagielski G2GApp aG2GApp;
240*b1cdbd2cSJim Jagielski
241*b1cdbd2cSJim Jagielski InitVCL( com::sun::star::uno::Reference< com::sun::star::lang::XMultiServiceFactory >() );
242*b1cdbd2cSJim Jagielski
243*b1cdbd2cSJim Jagielski for( int i = 1; i < nArgCount; i++ )
244*b1cdbd2cSJim Jagielski aArgs.push_back( String( ppArgs[ i ], RTL_TEXTENCODING_ASCII_US ) );
245*b1cdbd2cSJim Jagielski
246*b1cdbd2cSJim Jagielski return aG2GApp.Start( aArgs );
247*b1cdbd2cSJim Jagielski }
248