xref: /aoo4110/main/svtools/bmpmaker/g2g.cxx (revision b1cdbd2c)
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