LCOV - code coverage report
Current view: top level - svtools/source/filter - filter2.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 0 560 0.0 %
Date: 2012-08-25 Functions: 0 33 0.0 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 0 740 0.0 %

           Branch data     Line data    Source code
       1                 :            : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2                 :            : /*************************************************************************
       3                 :            :  *
       4                 :            :  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
       5                 :            :  *
       6                 :            :  * Copyright 2000, 2010 Oracle and/or its affiliates.
       7                 :            :  *
       8                 :            :  * OpenOffice.org - a multi-platform office productivity suite
       9                 :            :  *
      10                 :            :  * This file is part of OpenOffice.org.
      11                 :            :  *
      12                 :            :  * OpenOffice.org is free software: you can redistribute it and/or modify
      13                 :            :  * it under the terms of the GNU Lesser General Public License version 3
      14                 :            :  * only, as published by the Free Software Foundation.
      15                 :            :  *
      16                 :            :  * OpenOffice.org is distributed in the hope that it will be useful,
      17                 :            :  * but WITHOUT ANY WARRANTY; without even the implied warranty of
      18                 :            :  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      19                 :            :  * GNU Lesser General Public License version 3 for more details
      20                 :            :  * (a copy is included in the LICENSE file that accompanied this code).
      21                 :            :  *
      22                 :            :  * You should have received a copy of the GNU Lesser General Public License
      23                 :            :  * version 3 along with OpenOffice.org.  If not, see
      24                 :            :  * <http://www.openoffice.org/license.html>
      25                 :            :  * for a copy of the LGPLv3 License.
      26                 :            :  *
      27                 :            :  ************************************************************************/
      28                 :            : 
      29                 :            : 
      30                 :            : #include <string.h>
      31                 :            : #include <stdio.h>
      32                 :            : #include <tools/stream.hxx>
      33                 :            : #include <vcl/outdev.hxx>
      34                 :            : #include <svtools/filter.hxx>
      35                 :            : #include "FilterConfigCache.hxx"
      36                 :            : #include <unotools/ucbstreamhelper.hxx>
      37                 :            : 
      38                 :            : #define DATA_SIZE           640
      39                 :            : 
      40                 :            : sal_uInt8* ImplSearchEntry( sal_uInt8* , sal_uInt8* , sal_uLong , sal_uLong  );
      41                 :            : 
      42                 :          0 : GraphicDescriptor::GraphicDescriptor( const INetURLObject& rPath ) :
      43 [ #  # ][ #  # ]:          0 :     pFileStm( ::utl::UcbStreamHelper::CreateStream( rPath.GetMainURL( INetURLObject::NO_DECODE ), STREAM_READ ) ),
                 [ #  # ]
      44                 :            :     aPathExt( rPath.GetFileExtension().toAsciiLowerCase() ),
      45         [ #  # ]:          0 :     bOwnStream( sal_True )
      46                 :            : {
      47         [ #  # ]:          0 :     ImpConstruct();
      48                 :          0 : }
      49                 :            : 
      50                 :          0 : GraphicDescriptor::GraphicDescriptor( SvStream& rInStream, const String* pPath) :
      51                 :            :     pFileStm    ( &rInStream ),
      52                 :          0 :     bOwnStream  ( sal_False )
      53                 :            : {
      54         [ #  # ]:          0 :     ImpConstruct();
      55                 :            : 
      56         [ #  # ]:          0 :     if ( pPath )
      57                 :            :     {
      58 [ #  # ][ #  # ]:          0 :         INetURLObject aURL( *pPath );
      59 [ #  # ][ #  # ]:          0 :         aPathExt = aURL.GetFileExtension().toAsciiLowerCase();
                 [ #  # ]
      60                 :            :     }
      61                 :          0 : }
      62                 :            : 
      63                 :          0 : GraphicDescriptor::~GraphicDescriptor()
      64                 :            : {
      65         [ #  # ]:          0 :     if ( bOwnStream )
      66 [ #  # ][ #  # ]:          0 :         delete pFileStm;
      67         [ #  # ]:          0 : }
      68                 :            : 
      69                 :          0 : sal_Bool GraphicDescriptor::Detect( sal_Bool bExtendedInfo )
      70                 :            : {
      71                 :          0 :     sal_Bool bRet = sal_False;
      72 [ #  # ][ #  # ]:          0 :     if ( pFileStm && !pFileStm->GetError() )
                 [ #  # ]
      73                 :            :     {
      74                 :          0 :         SvStream&   rStm = *pFileStm;
      75                 :          0 :         sal_uInt16      nOldFormat = rStm.GetNumberFormatInt();
      76                 :            : 
      77         [ #  # ]:          0 :         if      ( ImpDetectGIF( rStm, bExtendedInfo ) ) bRet = sal_True;
      78         [ #  # ]:          0 :         else if ( ImpDetectJPG( rStm, bExtendedInfo ) ) bRet = sal_True;
      79         [ #  # ]:          0 :         else if ( ImpDetectBMP( rStm, bExtendedInfo ) ) bRet = sal_True;
      80         [ #  # ]:          0 :         else if ( ImpDetectPNG( rStm, bExtendedInfo ) ) bRet = sal_True;
      81         [ #  # ]:          0 :         else if ( ImpDetectTIF( rStm, bExtendedInfo ) ) bRet = sal_True;
      82         [ #  # ]:          0 :         else if ( ImpDetectPCX( rStm, bExtendedInfo ) ) bRet = sal_True;
      83         [ #  # ]:          0 :         else if ( ImpDetectDXF( rStm, bExtendedInfo ) ) bRet = sal_True;
      84         [ #  # ]:          0 :         else if ( ImpDetectMET( rStm, bExtendedInfo ) ) bRet = sal_True;
      85         [ #  # ]:          0 :         else if ( ImpDetectSGF( rStm, bExtendedInfo ) ) bRet = sal_True;
      86         [ #  # ]:          0 :         else if ( ImpDetectSGV( rStm, bExtendedInfo ) ) bRet = sal_True;
      87         [ #  # ]:          0 :         else if ( ImpDetectSVM( rStm, bExtendedInfo ) ) bRet = sal_True;
      88         [ #  # ]:          0 :         else if ( ImpDetectWMF( rStm, bExtendedInfo ) ) bRet = sal_True;
      89         [ #  # ]:          0 :         else if ( ImpDetectEMF( rStm, bExtendedInfo ) ) bRet = sal_True;
      90         [ #  # ]:          0 :         else if ( ImpDetectSVG( rStm, bExtendedInfo ) ) bRet = sal_True;
      91         [ #  # ]:          0 :         else if ( ImpDetectPCT( rStm, bExtendedInfo ) ) bRet = sal_True;
      92         [ #  # ]:          0 :         else if ( ImpDetectXBM( rStm, bExtendedInfo ) ) bRet = sal_True;
      93         [ #  # ]:          0 :         else if ( ImpDetectXPM( rStm, bExtendedInfo ) ) bRet = sal_True;
      94         [ #  # ]:          0 :         else if ( ImpDetectPBM( rStm, bExtendedInfo ) ) bRet = sal_True;
      95         [ #  # ]:          0 :         else if ( ImpDetectPGM( rStm, bExtendedInfo ) ) bRet = sal_True;
      96         [ #  # ]:          0 :         else if ( ImpDetectPPM( rStm, bExtendedInfo ) ) bRet = sal_True;
      97         [ #  # ]:          0 :         else if ( ImpDetectRAS( rStm, bExtendedInfo ) ) bRet = sal_True;
      98         [ #  # ]:          0 :         else if ( ImpDetectTGA( rStm, bExtendedInfo ) ) bRet = sal_True;
      99         [ #  # ]:          0 :         else if ( ImpDetectPSD( rStm, bExtendedInfo ) ) bRet = sal_True;
     100         [ #  # ]:          0 :         else if ( ImpDetectEPS( rStm, bExtendedInfo ) ) bRet = sal_True;
     101         [ #  # ]:          0 :         else if ( ImpDetectPCD( rStm, bExtendedInfo ) ) bRet = sal_True;
     102                 :            : 
     103                 :          0 :         rStm.SetNumberFormatInt( nOldFormat );
     104                 :            :     }
     105                 :          0 :     return bRet;
     106                 :            : }
     107                 :            : 
     108                 :          0 : void GraphicDescriptor::ImpConstruct()
     109                 :            : {
     110                 :          0 :     nFormat = GFF_NOT;
     111                 :          0 :     nBitsPerPixel = 0;
     112                 :          0 :     nPlanes = 0;
     113                 :          0 :     bCompressed = sal_False;
     114                 :          0 : }
     115                 :            : 
     116                 :          0 : sal_Bool GraphicDescriptor::ImpDetectBMP( SvStream& rStm, sal_Bool bExtendedInfo )
     117                 :            : {
     118                 :            :     sal_uInt16  nTemp16;
     119                 :          0 :     sal_Bool    bRet = sal_False;
     120                 :          0 :     sal_Int32 nStmPos = rStm.Tell();
     121                 :            : 
     122         [ #  # ]:          0 :     rStm.SetNumberFormatInt( NUMBERFORMAT_INT_LITTLEENDIAN );
     123         [ #  # ]:          0 :     rStm >> nTemp16;
     124                 :            : 
     125                 :            :     // OS/2-BitmapArray
     126         [ #  # ]:          0 :     if ( nTemp16 == 0x4142 )
     127                 :            :     {
     128         [ #  # ]:          0 :         rStm.SeekRel( 0x0c );
     129         [ #  # ]:          0 :         rStm >> nTemp16;
     130                 :            :     }
     131                 :            : 
     132                 :            :     // Bitmap
     133         [ #  # ]:          0 :     if ( nTemp16 == 0x4d42 )
     134                 :            :     {
     135                 :          0 :         nFormat = GFF_BMP;
     136                 :          0 :         bRet = sal_True;
     137                 :            : 
     138         [ #  # ]:          0 :         if ( bExtendedInfo )
     139                 :            :         {
     140                 :            :             sal_uInt32  nTemp32;
     141                 :            :             sal_uInt32  nCompression;
     142                 :            : 
     143                 :            :             // bis zur ersten Information
     144         [ #  # ]:          0 :             rStm.SeekRel( 0x10 );
     145                 :            : 
     146                 :            :             // PixelBreite auslesen
     147         [ #  # ]:          0 :             rStm >> nTemp32;
     148                 :          0 :             aPixSize.Width() = nTemp32;
     149                 :            : 
     150                 :            :             // PixelHoehe auslesen
     151         [ #  # ]:          0 :             rStm >> nTemp32;
     152                 :          0 :             aPixSize.Height() = nTemp32;
     153                 :            : 
     154                 :            :             // Planes auslesen
     155         [ #  # ]:          0 :             rStm >> nTemp16;
     156                 :          0 :             nPlanes = nTemp16;
     157                 :            : 
     158                 :            :             // BitCount auslesen
     159         [ #  # ]:          0 :             rStm >> nTemp16;
     160                 :          0 :             nBitsPerPixel = nTemp16;
     161                 :            : 
     162                 :            :             // Compression auslesen
     163         [ #  # ]:          0 :             rStm >> nTemp32;
     164                 :          0 :             bCompressed = ( ( nCompression = nTemp32 ) > 0 );
     165                 :            : 
     166                 :            :             // logische Breite
     167         [ #  # ]:          0 :             rStm.SeekRel( 4 );
     168         [ #  # ]:          0 :             rStm >> nTemp32;
     169         [ #  # ]:          0 :             if ( nTemp32 )
     170                 :          0 :                 aLogSize.Width() = ( aPixSize.Width() * 100000 ) / nTemp32;
     171                 :            : 
     172                 :            :             // logische Hoehe
     173         [ #  # ]:          0 :             rStm >> nTemp32;
     174         [ #  # ]:          0 :             if ( nTemp32 )
     175                 :          0 :                 aLogSize.Height() = ( aPixSize.Height() * 100000 ) / nTemp32;
     176                 :            : 
     177                 :            :             // Wir wollen noch etwas feiner differenzieren und
     178                 :            :             // auf sinnvolle Werte ueberpruefen ( Bug-Id #29001 )
     179 [ #  # ][ #  # ]:          0 :             if ( ( nBitsPerPixel > 24 ) || ( nCompression > 3 ) )
     180                 :            :             {
     181                 :          0 :                 nFormat = GFF_NOT;
     182                 :          0 :                 bRet = sal_False;
     183                 :            :             }
     184                 :            :         }
     185                 :            :     }
     186         [ #  # ]:          0 :     rStm.Seek( nStmPos );
     187                 :          0 :     return bRet;
     188                 :            : }
     189                 :            : 
     190                 :          0 : sal_Bool GraphicDescriptor::ImpDetectGIF( SvStream& rStm, sal_Bool bExtendedInfo )
     191                 :            : {
     192                 :            :     sal_uInt32  n32;
     193                 :            :     sal_uInt16  n16;
     194                 :          0 :     sal_Bool    bRet = sal_False;
     195                 :            :     sal_uInt8   cByte;
     196                 :            : 
     197                 :          0 :     sal_Int32 nStmPos = rStm.Tell();
     198         [ #  # ]:          0 :     rStm.SetNumberFormatInt( NUMBERFORMAT_INT_LITTLEENDIAN );
     199         [ #  # ]:          0 :     rStm >> n32;
     200                 :            : 
     201         [ #  # ]:          0 :     if ( n32 == 0x38464947 )
     202                 :            :     {
     203         [ #  # ]:          0 :         rStm >> n16;
     204 [ #  # ][ #  # ]:          0 :         if ( ( n16 == 0x6137 ) || ( n16 == 0x6139 ) )
     205                 :            :         {
     206                 :          0 :             nFormat = GFF_GIF;
     207                 :          0 :             bRet = sal_True;
     208                 :            : 
     209         [ #  # ]:          0 :             if ( bExtendedInfo )
     210                 :            :             {
     211                 :            :                 sal_uInt16 nTemp16;
     212                 :            : 
     213                 :            :                 // PixelBreite auslesen
     214         [ #  # ]:          0 :                 rStm >> nTemp16;
     215                 :          0 :                 aPixSize.Width() = nTemp16;
     216                 :            : 
     217                 :            :                 // PixelHoehe auslesen
     218         [ #  # ]:          0 :                 rStm >> nTemp16;
     219                 :          0 :                 aPixSize.Height() = nTemp16;
     220                 :            : 
     221                 :            :                 // Bits/Pixel auslesen
     222         [ #  # ]:          0 :                 rStm >> cByte;
     223                 :          0 :                 nBitsPerPixel = ( ( cByte & 112 ) >> 4 ) + 1;
     224                 :            :             }
     225                 :            :         }
     226                 :            :     }
     227         [ #  # ]:          0 :     rStm.Seek( nStmPos );
     228                 :          0 :     return bRet;
     229                 :            : }
     230                 :            : 
     231                 :            : // returns the next jpeg marker, a return value of 0 represents an error
     232                 :          0 : sal_uInt8 ImpDetectJPG_GetNextMarker( SvStream& rStm )
     233                 :            : {
     234                 :            :     sal_uInt8 nByte;
     235         [ #  # ]:          0 :     do
     236                 :            :     {
     237         [ #  # ]:          0 :         do
     238                 :            :         {
     239         [ #  # ]:          0 :             rStm >> nByte;
     240 [ #  # ][ #  # ]:          0 :             if ( rStm.IsEof() || rStm.GetError() )  // as 0 is not allowed as marker,
                 [ #  # ]
     241                 :          0 :                 return 0;                           // we can use it as errorcode
     242                 :            :         }
     243                 :            :         while ( nByte != 0xff );
     244         [ #  # ]:          0 :         do
     245                 :            :         {
     246         [ #  # ]:          0 :             rStm >> nByte;
     247 [ #  # ][ #  # ]:          0 :             if ( rStm.IsEof() || rStm.GetError() )
                 [ #  # ]
     248                 :          0 :                 return 0;
     249                 :            :         }
     250                 :            :         while( nByte == 0xff );
     251                 :            :     }
     252                 :            :     while( nByte == 0 );        // 0xff00 represents 0xff and not a marker,
     253                 :            :                                 // the marker detection has to be restartet.
     254                 :          0 :     return nByte;
     255                 :            : }
     256                 :            : 
     257                 :          0 : sal_Bool GraphicDescriptor::ImpDetectJPG( SvStream& rStm,  sal_Bool bExtendedInfo )
     258                 :            : {
     259                 :            :     sal_uInt32  nTemp32;
     260                 :          0 :     sal_Bool    bRet = sal_False;
     261                 :            : 
     262                 :          0 :     sal_Int32 nStmPos = rStm.Tell();
     263                 :            : 
     264         [ #  # ]:          0 :     rStm.SetNumberFormatInt( NUMBERFORMAT_INT_BIGENDIAN );
     265         [ #  # ]:          0 :     rStm >> nTemp32;
     266                 :            : 
     267                 :            :     // compare upper 24 bits
     268         [ #  # ]:          0 :     if( 0xffd8ff00 == ( nTemp32 & 0xffffff00 ) )
     269                 :            :     {
     270                 :          0 :         nFormat = GFF_JPG;
     271                 :          0 :         bRet = sal_True;
     272                 :            : 
     273         [ #  # ]:          0 :         if ( bExtendedInfo )
     274                 :            :         {
     275         [ #  # ]:          0 :             rStm.SeekRel( -2 );
     276                 :            : 
     277                 :          0 :             sal_uInt32 nError( rStm.GetError() );
     278                 :            : 
     279                 :          0 :             sal_Bool bScanFailure = sal_False;
     280                 :          0 :             sal_Bool bScanFinished = sal_False;
     281                 :            : 
     282 [ #  # ][ #  # ]:          0 :             while( !bScanFailure && !bScanFinished && !rStm.IsEof() && !rStm.GetError() )
         [ #  # ][ #  # ]
                 [ #  # ]
     283                 :            :             {
     284         [ #  # ]:          0 :                 sal_uInt8 nMarker = ImpDetectJPG_GetNextMarker( rStm );
     285   [ #  #  #  # ]:          0 :                 switch( nMarker )
     286                 :            :                 {
     287                 :            :                     // fixed size marker, not having a two byte length parameter
     288                 :            :                     case 0xd0 :     // RST0
     289                 :            :                     case 0xd1 :
     290                 :            :                     case 0xd2 :
     291                 :            :                     case 0xd3 :
     292                 :            :                     case 0xd4 :
     293                 :            :                     case 0xd5 :
     294                 :            :                     case 0xd6 :
     295                 :            :                     case 0xd7 :     // RST7
     296                 :            :                     case 0x01 :     // TEM
     297                 :          0 :                     break;
     298                 :            : 
     299                 :            :                     case 0xd8 :     // SOI (has already been checked, there should not be a second one)
     300                 :            :                     case 0x00 :     // marker is invalid, we should stop now
     301                 :          0 :                         bScanFailure = sal_True;
     302                 :          0 :                     break;
     303                 :            : 
     304                 :            :                     case 0xd9 :     // EOI
     305                 :          0 :                         bScanFinished = sal_True;
     306                 :          0 :                     break;
     307                 :            : 
     308                 :            :                     // per default we assume marker segments conaining a length parameter
     309                 :            :                     default :
     310                 :            :                     {
     311                 :            :                         sal_uInt16 nLength;
     312         [ #  # ]:          0 :                         rStm >> nLength;
     313                 :            : 
     314         [ #  # ]:          0 :                         if ( nLength < 2 )
     315                 :          0 :                             bScanFailure = sal_True;
     316                 :            :                         else
     317                 :            :                         {
     318                 :          0 :                             sal_uInt32 nNextMarkerPos = rStm.Tell() + nLength - 2;
     319      [ #  #  # ]:          0 :                             switch( nMarker )
     320                 :            :                             {
     321                 :            :                                 case 0xe0 : // APP0 Marker
     322                 :            :                                 {
     323         [ #  # ]:          0 :                                     if ( nLength == 16 )
     324                 :            :                                     {
     325                 :            :                                         sal_Int32 nIdentifier;
     326         [ #  # ]:          0 :                                         rStm >> nIdentifier;
     327         [ #  # ]:          0 :                                         if ( nIdentifier == 0x4a464946 )    // JFIF Identifier
     328                 :            :                                         {
     329                 :            :                                             sal_uInt8   nStringTerminator;
     330                 :            :                                             sal_uInt8   nMajorRevision;
     331                 :            :                                             sal_uInt8   nMinorRevision;
     332                 :            :                                             sal_uInt8   nUnits;
     333                 :            :                                             sal_uInt16  nHorizontalResolution;
     334                 :            :                                             sal_uInt16  nVerticalResolution;
     335                 :            :                                             sal_uInt8   nHorzThumbnailPixelCount;
     336                 :            :                                             sal_uInt8   nVertThumbnailPixelCount;
     337                 :            : 
     338         [ #  # ]:          0 :                                             rStm >> nStringTerminator
     339         [ #  # ]:          0 :                                                  >> nMajorRevision
     340         [ #  # ]:          0 :                                                  >> nMinorRevision
     341         [ #  # ]:          0 :                                                  >> nUnits
     342         [ #  # ]:          0 :                                                  >> nHorizontalResolution
     343         [ #  # ]:          0 :                                                  >> nVerticalResolution
     344         [ #  # ]:          0 :                                                  >> nHorzThumbnailPixelCount
     345         [ #  # ]:          0 :                                                  >> nVertThumbnailPixelCount;
     346                 :            : 
     347                 :            :                                             // setting the logical size
     348 [ #  # ][ #  # ]:          0 :                                             if ( nUnits && nHorizontalResolution && nVerticalResolution )
                 [ #  # ]
     349                 :            :                                             {
     350         [ #  # ]:          0 :                                                 MapMode aMap;
     351 [ #  # ][ #  # ]:          0 :                                                 aMap.SetMapUnit( nUnits == 1 ? MAP_INCH : MAP_CM );
     352 [ #  # ][ #  # ]:          0 :                                                 aMap.SetScaleX( Fraction( 1, nHorizontalResolution ) );
     353 [ #  # ][ #  # ]:          0 :                                                 aMap.SetScaleY( Fraction( 1, nVerticalResolution ) );
     354 [ #  # ][ #  # ]:          0 :                                                 aLogSize = OutputDevice::LogicToLogic( aPixSize, aMap, MapMode( MAP_100TH_MM ) );
         [ #  # ][ #  # ]
     355                 :            :                                             }
     356                 :            :                                         }
     357                 :            :                                     }
     358                 :            :                                 }
     359                 :          0 :                                 break;
     360                 :            : 
     361                 :            :                                 // Start of Frame Markers
     362                 :            :                                 case 0xc0 : // SOF0
     363                 :            :                                 case 0xc1 : // SOF1
     364                 :            :                                 case 0xc2 : // SOF2
     365                 :            :                                 case 0xc3 : // SOF3
     366                 :            :                                 case 0xc5 : // SOF5
     367                 :            :                                 case 0xc6 : // SOF6
     368                 :            :                                 case 0xc7 : // SOF7
     369                 :            :                                 case 0xc9 : // SOF9
     370                 :            :                                 case 0xca : // SOF10
     371                 :            :                                 case 0xcb : // SOF11
     372                 :            :                                 case 0xcd : // SOF13
     373                 :            :                                 case 0xce : // SOF14
     374                 :            :                                 case 0xcf : // SOF15
     375                 :            :                                 {
     376                 :            :                                     sal_uInt8   nSamplePrecision;
     377                 :            :                                     sal_uInt16  nNumberOfLines;
     378                 :            :                                     sal_uInt16  nSamplesPerLine;
     379                 :            :                                     sal_uInt8   nNumberOfImageComponents;
     380                 :            :                                     sal_uInt8   nComponentsIdentifier;
     381                 :            :                                     sal_uInt8   nHorizontalSamplingFactor;
     382                 :            :                                     sal_uInt8   nQuantizationTableDestinationSelector;
     383         [ #  # ]:          0 :                                     rStm >> nSamplePrecision
     384         [ #  # ]:          0 :                                          >> nNumberOfLines
     385         [ #  # ]:          0 :                                          >> nSamplesPerLine
     386         [ #  # ]:          0 :                                          >> nNumberOfImageComponents
     387         [ #  # ]:          0 :                                          >> nComponentsIdentifier
     388         [ #  # ]:          0 :                                          >> nHorizontalSamplingFactor
     389         [ #  # ]:          0 :                                          >> nQuantizationTableDestinationSelector;
     390                 :          0 :                                     nHorizontalSamplingFactor >>= 4;
     391                 :            : 
     392                 :          0 :                                     aPixSize.Height() = nNumberOfLines;
     393                 :          0 :                                     aPixSize.Width() = nSamplesPerLine;
     394 [ #  # ][ #  # ]:          0 :                                     nBitsPerPixel = ( nNumberOfImageComponents == 3 ? 24 : nNumberOfImageComponents == 1 ? 8 : 0 );
     395                 :          0 :                                     nPlanes = 1;
     396                 :            : 
     397                 :          0 :                                     bScanFinished = sal_True;
     398                 :            :                                 }
     399                 :          0 :                                 break;
     400                 :            :                             }
     401         [ #  # ]:          0 :                             rStm.Seek( nNextMarkerPos );
     402                 :            :                         }
     403                 :            :                     }
     404                 :          0 :                     break;
     405                 :            :                 }
     406                 :            :             }
     407         [ #  # ]:          0 :             rStm.SetError( nError );
     408                 :            :         }
     409                 :            :     }
     410         [ #  # ]:          0 :     rStm.Seek( nStmPos );
     411                 :          0 :     return bRet;
     412                 :            : }
     413                 :            : 
     414                 :          0 : sal_Bool GraphicDescriptor::ImpDetectPCD( SvStream& rStm, sal_Bool )
     415                 :            : {
     416                 :          0 :     sal_Bool    bRet = sal_False;
     417                 :            : 
     418                 :          0 :     sal_Int32 nStmPos = rStm.Tell();
     419         [ #  # ]:          0 :     rStm.SetNumberFormatInt( NUMBERFORMAT_INT_LITTLEENDIAN );
     420                 :            : 
     421                 :            :     sal_uInt32  nTemp32;
     422                 :            :     sal_uInt16  nTemp16;
     423                 :            :     sal_uInt8   cByte;
     424                 :            : 
     425         [ #  # ]:          0 :     rStm.SeekRel( 2048 );
     426         [ #  # ]:          0 :     rStm >> nTemp32;
     427         [ #  # ]:          0 :     rStm >> nTemp16;
     428         [ #  # ]:          0 :     rStm >> cByte;
     429                 :            : 
     430 [ #  # ][ #  # ]:          0 :     if ( ( nTemp32 == 0x5f444350 ) &&
                 [ #  # ]
     431                 :            :          ( nTemp16 == 0x5049 ) &&
     432                 :            :          ( cByte == 0x49 ) )
     433                 :            :     {
     434                 :          0 :         nFormat = GFF_PCD;
     435                 :          0 :         bRet = sal_True;
     436                 :            :     }
     437         [ #  # ]:          0 :     rStm.Seek( nStmPos );
     438                 :          0 :     return bRet;
     439                 :            : }
     440                 :            : 
     441                 :          0 : sal_Bool GraphicDescriptor::ImpDetectPCX( SvStream& rStm, sal_Bool bExtendedInfo )
     442                 :            : {
     443                 :            :     // ! Because 0x0a can be interpreted as LF too ...
     444                 :            :     // we cant be shure that this special sign represent a PCX file only.
     445                 :            :     // Every Ascii file is possible here :-(
     446                 :            :     // We must detect the whole header.
     447                 :          0 :     bExtendedInfo = sal_True;
     448                 :            : 
     449                 :          0 :     sal_Bool    bRet = sal_False;
     450                 :            :     sal_uInt8   cByte;
     451                 :            : 
     452                 :          0 :     sal_Int32 nStmPos = rStm.Tell();
     453         [ #  # ]:          0 :     rStm.SetNumberFormatInt( NUMBERFORMAT_INT_LITTLEENDIAN );
     454         [ #  # ]:          0 :     rStm >> cByte;
     455                 :            : 
     456         [ #  # ]:          0 :     if ( cByte == 0x0a )
     457                 :            :     {
     458                 :          0 :         nFormat = GFF_PCX;
     459                 :          0 :         bRet = sal_True;
     460                 :            : 
     461         [ #  # ]:          0 :         if ( bExtendedInfo )
     462                 :            :         {
     463                 :            :             sal_uInt16  nTemp16;
     464                 :            :             sal_uInt16  nXmin;
     465                 :            :             sal_uInt16  nXmax;
     466                 :            :             sal_uInt16  nYmin;
     467                 :            :             sal_uInt16  nYmax;
     468                 :            :             sal_uInt16  nDPIx;
     469                 :            :             sal_uInt16  nDPIy;
     470                 :            : 
     471                 :            : 
     472         [ #  # ]:          0 :             rStm.SeekRel( 1 );
     473                 :            : 
     474                 :            :             // Kompression lesen
     475         [ #  # ]:          0 :             rStm >> cByte;
     476                 :          0 :             bCompressed = ( cByte > 0 );
     477                 :            : 
     478 [ #  # ][ #  # ]:          0 :             bRet = (cByte==0 || cByte ==1);
     479                 :            : 
     480                 :            :             // Bits/Pixel lesen
     481         [ #  # ]:          0 :             rStm >> cByte;
     482                 :          0 :             nBitsPerPixel = cByte;
     483                 :            : 
     484                 :            :             // Bildabmessungen
     485         [ #  # ]:          0 :             rStm >> nTemp16;
     486                 :          0 :             nXmin = nTemp16;
     487         [ #  # ]:          0 :             rStm >> nTemp16;
     488                 :          0 :             nYmin = nTemp16;
     489         [ #  # ]:          0 :             rStm >> nTemp16;
     490                 :          0 :             nXmax = nTemp16;
     491         [ #  # ]:          0 :             rStm >> nTemp16;
     492                 :          0 :             nYmax = nTemp16;
     493                 :            : 
     494                 :          0 :             aPixSize.Width() = nXmax - nXmin + 1;
     495                 :          0 :             aPixSize.Height() = nYmax - nYmin + 1;
     496                 :            : 
     497                 :            :             // Aufloesung
     498         [ #  # ]:          0 :             rStm >> nTemp16;
     499                 :          0 :             nDPIx = nTemp16;
     500         [ #  # ]:          0 :             rStm >> nTemp16;
     501                 :          0 :             nDPIy = nTemp16;
     502                 :            : 
     503                 :            :             // logische Groesse setzen
     504                 :            :             MapMode aMap( MAP_INCH, Point(),
     505 [ #  # ][ #  # ]:          0 :                           Fraction( 1, nDPIx ), Fraction( 1, nDPIy ) );
                 [ #  # ]
     506                 :            :             aLogSize = OutputDevice::LogicToLogic( aPixSize, aMap,
     507 [ #  # ][ #  # ]:          0 :                                                    MapMode( MAP_100TH_MM ) );
                 [ #  # ]
     508                 :            : 
     509                 :            : 
     510                 :            :             // Anzahl Farbebenen
     511         [ #  # ]:          0 :             rStm.SeekRel( 49 );
     512         [ #  # ]:          0 :             rStm >> cByte;
     513                 :          0 :             nPlanes = cByte;
     514                 :            : 
     515         [ #  # ]:          0 :             bRet = (nPlanes<=4);
     516                 :            :         }
     517                 :            :     }
     518                 :            : 
     519         [ #  # ]:          0 :     rStm.Seek( nStmPos );
     520                 :          0 :     return bRet;
     521                 :            : }
     522                 :            : 
     523                 :          0 : sal_Bool GraphicDescriptor::ImpDetectPNG( SvStream& rStm, sal_Bool bExtendedInfo )
     524                 :            : {
     525                 :            :     sal_uInt32  nTemp32;
     526                 :          0 :     sal_Bool    bRet = sal_False;
     527                 :            : 
     528                 :          0 :     sal_Int32 nStmPos = rStm.Tell();
     529         [ #  # ]:          0 :     rStm.SetNumberFormatInt( NUMBERFORMAT_INT_BIGENDIAN );
     530         [ #  # ]:          0 :     rStm >> nTemp32;
     531                 :            : 
     532         [ #  # ]:          0 :     if ( nTemp32 == 0x89504e47 )
     533                 :            :     {
     534         [ #  # ]:          0 :         rStm >> nTemp32;
     535         [ #  # ]:          0 :         if ( nTemp32 == 0x0d0a1a0a )
     536                 :            :         {
     537                 :          0 :             nFormat = GFF_PNG;
     538                 :          0 :             bRet = sal_True;
     539                 :            : 
     540         [ #  # ]:          0 :             if ( bExtendedInfo )
     541                 :            :             {
     542                 :            :                 sal_uInt8 cByte;
     543                 :            : 
     544                 :            :                 // IHDR-Chunk
     545         [ #  # ]:          0 :                 rStm.SeekRel( 8 );
     546                 :            : 
     547                 :            :                 // Breite einlesen
     548         [ #  # ]:          0 :                 rStm >> nTemp32;
     549                 :          0 :                 aPixSize.Width() = nTemp32;
     550                 :            : 
     551                 :            :                 // Hoehe einlesen
     552         [ #  # ]:          0 :                 rStm >> nTemp32;
     553                 :          0 :                 aPixSize.Height() = nTemp32;
     554                 :            : 
     555                 :            :                 // Bits/Pixel einlesen
     556         [ #  # ]:          0 :                 rStm >> cByte;
     557                 :          0 :                 nBitsPerPixel = cByte;
     558                 :            : 
     559                 :            :                 // Planes immer 1;
     560                 :            :                 // Kompression immer
     561                 :          0 :                 nPlanes = 1;
     562                 :          0 :                 bCompressed = sal_True;
     563                 :            : 
     564                 :            :                 sal_uInt32  nLen32;
     565                 :            : 
     566         [ #  # ]:          0 :                 rStm.SeekRel( 8 );
     567                 :            : 
     568                 :            :                 // so lange ueberlesen, bis wir den pHYs-Chunk haben oder
     569                 :            :                 // den Anfang der Bilddaten
     570         [ #  # ]:          0 :                 rStm >> nLen32;
     571         [ #  # ]:          0 :                 rStm >> nTemp32;
     572 [ #  # ][ #  # ]:          0 :                 while( ( nTemp32 != 0x70485973 ) && ( nTemp32 != 0x49444154 ) )
                 [ #  # ]
     573                 :            :                 {
     574         [ #  # ]:          0 :                     rStm.SeekRel( 4 + nLen32 );
     575         [ #  # ]:          0 :                     rStm >> nLen32;
     576         [ #  # ]:          0 :                     rStm >> nTemp32;
     577                 :            :                 }
     578                 :            : 
     579         [ #  # ]:          0 :                 if ( nTemp32 == 0x70485973 )
     580                 :            :                 {
     581                 :            :                     sal_uLong   nXRes;
     582                 :            :                     sal_uLong   nYRes;
     583                 :            : 
     584                 :            :                     // horizontale Aufloesung
     585         [ #  # ]:          0 :                     rStm >> nTemp32;
     586                 :          0 :                     nXRes = nTemp32;
     587                 :            : 
     588                 :            :                     // vertikale Aufloesung
     589         [ #  # ]:          0 :                     rStm >> nTemp32;
     590                 :          0 :                     nYRes = nTemp32;
     591                 :            : 
     592                 :            :                     // Unit einlesen
     593         [ #  # ]:          0 :                     rStm >> cByte;
     594                 :            : 
     595         [ #  # ]:          0 :                     if ( cByte )
     596                 :            :                     {
     597         [ #  # ]:          0 :                         if ( nXRes )
     598                 :          0 :                             aLogSize.Width() = ( aPixSize.Width() * 100000 ) /
     599                 :          0 :                                                nTemp32;
     600                 :            : 
     601         [ #  # ]:          0 :                         if ( nYRes )
     602                 :          0 :                             aLogSize.Height() = ( aPixSize.Height() * 100000 ) /
     603                 :          0 :                                                 nTemp32;
     604                 :            :                     }
     605                 :            :                 }
     606                 :            :             }
     607                 :            :         }
     608                 :            :     }
     609         [ #  # ]:          0 :     rStm.Seek( nStmPos );
     610                 :          0 :     return bRet;
     611                 :            : }
     612                 :            : 
     613                 :          0 : sal_Bool GraphicDescriptor::ImpDetectTIF( SvStream& rStm, sal_Bool bExtendedInfo )
     614                 :            : {
     615                 :          0 :     sal_Bool    bDetectOk = sal_False;
     616                 :          0 :     sal_Bool    bRet = sal_False;
     617                 :            :     sal_uInt8   cByte1;
     618                 :            :     sal_uInt8   cByte2;
     619                 :            : 
     620                 :          0 :     sal_Int32 nStmPos = rStm.Tell();
     621         [ #  # ]:          0 :     rStm >> cByte1;
     622         [ #  # ]:          0 :     rStm >> cByte2;
     623         [ #  # ]:          0 :     if ( cByte1 == cByte2 )
     624                 :            :     {
     625         [ #  # ]:          0 :         if ( cByte1 == 0x49 )
     626                 :            :         {
     627         [ #  # ]:          0 :             rStm.SetNumberFormatInt( NUMBERFORMAT_INT_LITTLEENDIAN );
     628                 :          0 :             bDetectOk = sal_True;
     629                 :            :         }
     630         [ #  # ]:          0 :         else if ( cByte1 == 0x4d )
     631                 :            :         {
     632         [ #  # ]:          0 :             rStm.SetNumberFormatInt( NUMBERFORMAT_INT_BIGENDIAN );
     633                 :          0 :             bDetectOk = sal_True;
     634                 :            :         }
     635                 :            : 
     636         [ #  # ]:          0 :         if ( bDetectOk )
     637                 :            :         {
     638                 :            :             sal_uInt16  nTemp16;
     639                 :            : 
     640         [ #  # ]:          0 :             rStm >> nTemp16;
     641         [ #  # ]:          0 :             if ( nTemp16 == 0x2a )
     642                 :            :             {
     643                 :          0 :                 nFormat = GFF_TIF;
     644                 :          0 :                 bRet = sal_True;
     645                 :            : 
     646         [ #  # ]:          0 :                 if ( bExtendedInfo )
     647                 :            :                 {
     648                 :            :                     sal_uLong   nCount;
     649                 :          0 :                     sal_uLong   nMax = DATA_SIZE - 48;
     650                 :            :                     sal_uInt32  nTemp32;
     651                 :          0 :                     sal_Bool    bOk = sal_False;
     652                 :            : 
     653                 :            :                     // Offset des ersten IFD einlesen
     654         [ #  # ]:          0 :                     rStm >> nTemp32;
     655         [ #  # ]:          0 :                     rStm.SeekRel( ( nCount = ( nTemp32 + 2 ) ) - 0x08 );
     656                 :            : 
     657         [ #  # ]:          0 :                     if ( nCount < nMax )
     658                 :            :                     {
     659                 :            :                         // Tag's lesen, bis wir auf Tag256 ( Width ) treffen
     660                 :            :                         // nicht mehr Bytes als DATA_SIZE lesen
     661         [ #  # ]:          0 :                         rStm >> nTemp16;
     662         [ #  # ]:          0 :                         while ( nTemp16 != 256 )
     663                 :            :                         {
     664                 :          0 :                             bOk = nCount < nMax;
     665         [ #  # ]:          0 :                             if ( !bOk )
     666                 :            :                             {
     667                 :          0 :                                 break;
     668                 :            :                             }
     669         [ #  # ]:          0 :                             rStm.SeekRel( 10 );
     670         [ #  # ]:          0 :                             rStm >> nTemp16;
     671                 :          0 :                             nCount += 12;
     672                 :            :                         }
     673                 :            : 
     674         [ #  # ]:          0 :                         if ( bOk )
     675                 :            :                         {
     676                 :            :                             // Breite lesen
     677         [ #  # ]:          0 :                             rStm >> nTemp16;
     678         [ #  # ]:          0 :                             rStm.SeekRel( 4 );
     679         [ #  # ]:          0 :                             if ( nTemp16 == 3 )
     680                 :            :                             {
     681         [ #  # ]:          0 :                                 rStm >> nTemp16;
     682                 :          0 :                                 aPixSize.Width() = nTemp16;
     683         [ #  # ]:          0 :                                 rStm.SeekRel( 2 );
     684                 :            :                             }
     685                 :            :                             else
     686                 :            :                             {
     687         [ #  # ]:          0 :                                 rStm >> nTemp32;
     688                 :          0 :                                 aPixSize.Width() = nTemp32;
     689                 :            :                             }
     690                 :          0 :                             nCount += 12;
     691                 :            : 
     692                 :            :                             // Hoehe lesen
     693         [ #  # ]:          0 :                             rStm.SeekRel( 2 );
     694         [ #  # ]:          0 :                             rStm >> nTemp16;
     695         [ #  # ]:          0 :                             rStm.SeekRel( 4 );
     696         [ #  # ]:          0 :                             if ( nTemp16 == 3 )
     697                 :            :                             {
     698         [ #  # ]:          0 :                                 rStm >> nTemp16;
     699                 :          0 :                                 aPixSize.Height() = nTemp16;
     700         [ #  # ]:          0 :                                 rStm.SeekRel( 2 );
     701                 :            :                             }
     702                 :            :                             else
     703                 :            :                             {
     704         [ #  # ]:          0 :                                 rStm >> nTemp32;
     705                 :          0 :                                 aPixSize.Height() = nTemp32;
     706                 :            :                             }
     707                 :          0 :                             nCount += 12;
     708                 :            : 
     709                 :            :                             // ggf. Bits/Pixel lesen
     710         [ #  # ]:          0 :                             rStm >> nTemp16;
     711         [ #  # ]:          0 :                             if ( nTemp16 == 258 )
     712                 :            :                             {
     713         [ #  # ]:          0 :                                 rStm.SeekRel( 6 );
     714         [ #  # ]:          0 :                                 rStm >> nTemp16;
     715                 :          0 :                                 nBitsPerPixel = nTemp16;
     716         [ #  # ]:          0 :                                 rStm.SeekRel( 2 );
     717                 :          0 :                                 nCount += 12;
     718                 :            :                             }
     719                 :            :                             else
     720         [ #  # ]:          0 :                                 rStm.SeekRel( -2 );
     721                 :            : 
     722                 :            :                             // ggf. Compression lesen
     723         [ #  # ]:          0 :                             rStm >> nTemp16;
     724         [ #  # ]:          0 :                             if ( nTemp16 == 259 )
     725                 :            :                             {
     726         [ #  # ]:          0 :                                 rStm.SeekRel( 6 );
     727         [ #  # ]:          0 :                                 rStm >> nTemp16;
     728                 :          0 :                                 bCompressed = ( nTemp16 > 1 );
     729         [ #  # ]:          0 :                                 rStm.SeekRel( 2 );
     730                 :          0 :                                 nCount += 12;
     731                 :            :                             }
     732                 :            :                             else
     733         [ #  # ]:          0 :                                 rStm.SeekRel( -2 );
     734                 :            :                         }
     735                 :            :                     }
     736                 :            :                 }
     737                 :            :             }
     738                 :            :         }
     739                 :            :     }
     740         [ #  # ]:          0 :     rStm.Seek( nStmPos );
     741                 :          0 :     return bRet;
     742                 :            : }
     743                 :            : 
     744                 :          0 : sal_Bool GraphicDescriptor::ImpDetectXBM( SvStream&, sal_Bool )
     745                 :            : {
     746                 :          0 :     sal_Bool bRet = aPathExt.CompareToAscii( "xbm", 3 ) == COMPARE_EQUAL;
     747         [ #  # ]:          0 :     if (bRet)
     748                 :          0 :         nFormat = GFF_XBM;
     749                 :            : 
     750                 :          0 :     return bRet;
     751                 :            : }
     752                 :            : 
     753                 :          0 : sal_Bool GraphicDescriptor::ImpDetectXPM( SvStream&, sal_Bool )
     754                 :            : {
     755                 :          0 :     sal_Bool bRet = aPathExt.CompareToAscii( "xpm", 3 ) == COMPARE_EQUAL;
     756         [ #  # ]:          0 :     if (bRet)
     757                 :          0 :         nFormat = GFF_XPM;
     758                 :            : 
     759                 :          0 :     return bRet;
     760                 :            : }
     761                 :            : 
     762                 :          0 : sal_Bool GraphicDescriptor::ImpDetectPBM( SvStream& rStm, sal_Bool )
     763                 :            : {
     764                 :          0 :     sal_Bool bRet = sal_False;
     765                 :            : 
     766                 :            :     // erst auf Datei Extension pruefen, da diese aussagekraeftiger ist
     767                 :            :     // als die 2 ID Bytes
     768                 :            : 
     769         [ #  # ]:          0 :     if ( aPathExt.CompareToAscii( "pbm", 3 ) == COMPARE_EQUAL )
     770                 :          0 :         bRet = sal_True;
     771                 :            :     else
     772                 :            :     {
     773                 :          0 :         sal_Int32 nStmPos = rStm.Tell();
     774                 :            :         sal_uInt8   nFirst, nSecond;
     775 [ #  # ][ #  # ]:          0 :         rStm >> nFirst >> nSecond;
     776 [ #  # ][ #  # ]:          0 :         if ( nFirst == 'P' && ( ( nSecond == '1' ) || ( nSecond == '4' ) ) )
                 [ #  # ]
     777                 :          0 :             bRet = sal_True;
     778         [ #  # ]:          0 :         rStm.Seek( nStmPos );
     779                 :            :     }
     780                 :            : 
     781         [ #  # ]:          0 :     if ( bRet )
     782                 :          0 :         nFormat = GFF_PBM;
     783                 :            : 
     784                 :          0 :     return bRet;
     785                 :            : }
     786                 :            : 
     787                 :          0 : sal_Bool GraphicDescriptor::ImpDetectPGM( SvStream& rStm, sal_Bool )
     788                 :            : {
     789                 :          0 :     sal_Bool bRet = sal_False;
     790                 :            : 
     791         [ #  # ]:          0 :     if ( aPathExt.CompareToAscii( "pgm", 3 ) == COMPARE_EQUAL )
     792                 :          0 :         bRet = sal_True;
     793                 :            :     else
     794                 :            :     {
     795                 :            :         sal_uInt8 nFirst, nSecond;
     796                 :          0 :         sal_Int32 nStmPos = rStm.Tell();
     797 [ #  # ][ #  # ]:          0 :         rStm >> nFirst >> nSecond;
     798 [ #  # ][ #  # ]:          0 :         if ( nFirst == 'P' && ( ( nSecond == '2' ) || ( nSecond == '5' ) ) )
                 [ #  # ]
     799                 :          0 :             bRet = sal_True;
     800         [ #  # ]:          0 :         rStm.Seek( nStmPos );
     801                 :            :     }
     802                 :            : 
     803         [ #  # ]:          0 :     if ( bRet )
     804                 :          0 :         nFormat = GFF_PGM;
     805                 :            : 
     806                 :          0 :     return bRet;
     807                 :            : }
     808                 :            : 
     809                 :          0 : sal_Bool GraphicDescriptor::ImpDetectPPM( SvStream& rStm, sal_Bool )
     810                 :            : {
     811                 :          0 :     sal_Bool bRet = sal_False;
     812                 :            : 
     813         [ #  # ]:          0 :     if ( aPathExt.CompareToAscii( "ppm", 3 ) == COMPARE_EQUAL )
     814                 :          0 :         bRet = sal_True;
     815                 :            :     else
     816                 :            :     {
     817                 :            :         sal_uInt8   nFirst, nSecond;
     818                 :          0 :         sal_Int32 nStmPos = rStm.Tell();
     819 [ #  # ][ #  # ]:          0 :         rStm >> nFirst >> nSecond;
     820 [ #  # ][ #  # ]:          0 :         if ( nFirst == 'P' && ( ( nSecond == '3' ) || ( nSecond == '6' ) ) )
                 [ #  # ]
     821                 :          0 :             bRet = sal_True;
     822         [ #  # ]:          0 :         rStm.Seek( nStmPos );
     823                 :            :     }
     824                 :            : 
     825         [ #  # ]:          0 :     if ( bRet )
     826                 :          0 :         nFormat = GFF_PPM;
     827                 :            : 
     828                 :          0 :     return bRet;
     829                 :            : }
     830                 :            : 
     831                 :          0 : sal_Bool GraphicDescriptor::ImpDetectRAS( SvStream& rStm, sal_Bool )
     832                 :            : {
     833                 :            :     sal_uInt32 nMagicNumber;
     834                 :          0 :     sal_Bool bRet = sal_False;
     835                 :          0 :     sal_Int32 nStmPos = rStm.Tell();
     836         [ #  # ]:          0 :     rStm.SetNumberFormatInt( NUMBERFORMAT_INT_BIGENDIAN );
     837         [ #  # ]:          0 :     rStm >> nMagicNumber;
     838         [ #  # ]:          0 :     if ( nMagicNumber == 0x59a66a95 )
     839                 :            :     {
     840                 :          0 :         nFormat = GFF_RAS;
     841                 :          0 :         bRet = sal_True;
     842                 :            :     }
     843         [ #  # ]:          0 :     rStm.Seek( nStmPos );
     844                 :          0 :     return bRet;
     845                 :            : }
     846                 :            : 
     847                 :          0 : sal_Bool GraphicDescriptor::ImpDetectTGA( SvStream&, sal_Bool )
     848                 :            : {
     849                 :          0 :     sal_Bool bRet = aPathExt.CompareToAscii( "tga", 3 ) == COMPARE_EQUAL;
     850         [ #  # ]:          0 :     if (bRet)
     851                 :          0 :         nFormat = GFF_TGA;
     852                 :            : 
     853                 :          0 :     return bRet;
     854                 :            : }
     855                 :            : 
     856                 :          0 : sal_Bool GraphicDescriptor::ImpDetectPSD( SvStream& rStm, sal_Bool bExtendedInfo )
     857                 :            : {
     858                 :          0 :     sal_Bool bRet = sal_False;
     859                 :            : 
     860                 :            :     sal_uInt32  nMagicNumber;
     861                 :          0 :     sal_Int32 nStmPos = rStm.Tell();
     862         [ #  # ]:          0 :     rStm.SetNumberFormatInt( NUMBERFORMAT_INT_BIGENDIAN );
     863         [ #  # ]:          0 :     rStm >> nMagicNumber;
     864         [ #  # ]:          0 :     if ( nMagicNumber == 0x38425053 )
     865                 :            :     {
     866                 :            :         sal_uInt16 nVersion;
     867         [ #  # ]:          0 :         rStm >> nVersion;
     868         [ #  # ]:          0 :         if ( nVersion == 1 )
     869                 :            :         {
     870                 :          0 :             bRet = sal_True;
     871         [ #  # ]:          0 :             if ( bExtendedInfo )
     872                 :            :             {
     873                 :            :                 sal_uInt16 nChannels;
     874                 :            :                 sal_uInt32 nRows;
     875                 :            :                 sal_uInt32 nColumns;
     876                 :            :                 sal_uInt16 nDepth;
     877                 :            :                 sal_uInt16 nMode;
     878         [ #  # ]:          0 :                 rStm.SeekRel( 6 );  // Pad
     879 [ #  # ][ #  # ]:          0 :                 rStm >> nChannels >> nRows >> nColumns >> nDepth >> nMode;
         [ #  # ][ #  # ]
                 [ #  # ]
     880 [ #  # ][ #  # ]:          0 :                 if ( ( nDepth == 1 ) || ( nDepth == 8 ) || ( nDepth == 16 ) )
                 [ #  # ]
     881                 :            :                 {
     882         [ #  # ]:          0 :                     nBitsPerPixel = ( nDepth == 16 ) ? 8 : nDepth;
     883      [ #  #  # ]:          0 :                     switch ( nChannels )
     884                 :            :                     {
     885                 :            :                         case 4 :
     886                 :            :                         case 3 :
     887                 :          0 :                             nBitsPerPixel = 24;
     888                 :            :                         case 2 :
     889                 :            :                         case 1 :
     890                 :          0 :                             aPixSize.Width() = nColumns;
     891                 :          0 :                             aPixSize.Height() = nRows;
     892                 :          0 :                         break;
     893                 :            :                         default:
     894                 :          0 :                             bRet = sal_False;
     895                 :            :                     }
     896                 :            :                 }
     897                 :            :                 else
     898                 :          0 :                     bRet = sal_False;
     899                 :            :             }
     900                 :            :         }
     901                 :            :     }
     902                 :            : 
     903         [ #  # ]:          0 :     if ( bRet )
     904                 :          0 :         nFormat = GFF_PSD;
     905         [ #  # ]:          0 :     rStm.Seek( nStmPos );
     906                 :          0 :     return bRet;
     907                 :            : }
     908                 :            : 
     909                 :          0 : sal_Bool GraphicDescriptor::ImpDetectEPS( SvStream& rStm, sal_Bool )
     910                 :            : {
     911                 :            :     // es wird die EPS mit Vorschaubild Variante und die Extensionuebereinstimmung
     912                 :            :     // geprueft
     913                 :            : 
     914                 :            :     sal_uInt32  nFirstLong;
     915                 :            :     sal_uInt8   nFirstBytes[20];
     916                 :          0 :     sal_Bool        bRet = sal_False;
     917                 :            : 
     918                 :          0 :     sal_Int32 nStmPos = rStm.Tell();
     919         [ #  # ]:          0 :     rStm.SetNumberFormatInt( NUMBERFORMAT_INT_BIGENDIAN );
     920         [ #  # ]:          0 :     rStm >> nFirstLong;
     921         [ #  # ]:          0 :     rStm.SeekRel( -4 );
     922         [ #  # ]:          0 :     rStm.Read( &nFirstBytes, 20 );
     923                 :            : 
     924 [ #  # ][ #  # ]:          0 :     if ( ( nFirstLong == 0xC5D0D3C6 ) || ( aPathExt.CompareToAscii( "eps", 3 ) == COMPARE_EQUAL ) ||
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     925         [ #  # ]:          0 :         ( ImplSearchEntry( nFirstBytes, (sal_uInt8*)"%!PS-Adobe", 10, 10 )
     926         [ #  # ]:          0 :             && ImplSearchEntry( &nFirstBytes[15], (sal_uInt8*)"EPS", 3, 3 ) ) )
     927                 :            :     {
     928                 :          0 :         nFormat = GFF_EPS;
     929                 :          0 :         bRet = sal_True;
     930                 :            :     }
     931         [ #  # ]:          0 :     rStm.Seek( nStmPos );
     932                 :          0 :     return bRet;
     933                 :            : }
     934                 :            : 
     935                 :          0 : sal_Bool GraphicDescriptor::ImpDetectDXF( SvStream&, sal_Bool )
     936                 :            : {
     937                 :          0 :     sal_Bool bRet = aPathExt.CompareToAscii( "dxf", 3 ) == COMPARE_EQUAL;
     938         [ #  # ]:          0 :     if (bRet)
     939                 :          0 :         nFormat = GFF_DXF;
     940                 :            : 
     941                 :          0 :     return bRet;
     942                 :            : }
     943                 :            : 
     944                 :          0 : sal_Bool GraphicDescriptor::ImpDetectMET( SvStream&, sal_Bool )
     945                 :            : {
     946                 :          0 :     sal_Bool bRet = aPathExt.CompareToAscii( "met", 3 ) == COMPARE_EQUAL;
     947         [ #  # ]:          0 :     if (bRet)
     948                 :          0 :         nFormat = GFF_MET;
     949                 :            : 
     950                 :          0 :     return bRet;
     951                 :            : }
     952                 :            : 
     953                 :            : extern bool isPCT(SvStream& rStream, sal_uLong nStreamPos, sal_uLong nStreamLen);
     954                 :            : 
     955                 :          0 : sal_Bool GraphicDescriptor::ImpDetectPCT( SvStream& rStm, sal_Bool )
     956                 :            : {
     957                 :          0 :     sal_Bool bRet = aPathExt.CompareToAscii( "pct", 3 ) == COMPARE_EQUAL;
     958         [ #  # ]:          0 :     if (bRet)
     959                 :          0 :         nFormat = GFF_PCT;
     960                 :            :     else
     961                 :            :     {
     962                 :          0 :         sal_Size nStreamPos = rStm.Tell();
     963                 :          0 :         sal_Size nStreamLen = rStm.remainingSize();
     964         [ #  # ]:          0 :         if (isPCT(rStm, nStreamPos, nStreamLen))
     965                 :            :         {
     966                 :          0 :             bRet = sal_True;
     967                 :          0 :             nFormat = GFF_PCT;
     968                 :            :         }
     969                 :          0 :         rStm.Seek(nStreamPos);
     970                 :            :     }
     971                 :            : 
     972                 :          0 :     return bRet;
     973                 :            : }
     974                 :            : 
     975                 :          0 : sal_Bool GraphicDescriptor::ImpDetectSGF( SvStream& rStm, sal_Bool )
     976                 :            : {
     977                 :          0 :     sal_Bool bRet = sal_False;
     978         [ #  # ]:          0 :     if( aPathExt.CompareToAscii( "sgf", 3 ) == COMPARE_EQUAL )
     979                 :          0 :         bRet = sal_True;
     980                 :            :     else
     981                 :            :     {
     982                 :          0 :         sal_Int32 nStmPos = rStm.Tell();
     983                 :            : 
     984                 :            :         sal_uInt8 nFirst, nSecond;
     985                 :            : 
     986 [ #  # ][ #  # ]:          0 :         rStm >> nFirst >> nSecond;
     987                 :            : 
     988 [ #  # ][ #  # ]:          0 :         if( nFirst == 'J' && nSecond == 'J' )
     989                 :          0 :             bRet = sal_True;
     990                 :            : 
     991         [ #  # ]:          0 :         rStm.Seek( nStmPos );
     992                 :            :     }
     993                 :            : 
     994         [ #  # ]:          0 :     if( bRet )
     995                 :          0 :         nFormat = GFF_SGF;
     996                 :            : 
     997                 :          0 :     return bRet;
     998                 :            : }
     999                 :            : 
    1000                 :          0 : sal_Bool GraphicDescriptor::ImpDetectSGV( SvStream&, sal_Bool )
    1001                 :            : {
    1002                 :          0 :     sal_Bool bRet = aPathExt.CompareToAscii( "sgv", 3 ) == COMPARE_EQUAL;
    1003         [ #  # ]:          0 :     if (bRet)
    1004                 :          0 :         nFormat = GFF_SGV;
    1005                 :            : 
    1006                 :          0 :     return bRet;
    1007                 :            : }
    1008                 :            : 
    1009                 :          0 : sal_Bool GraphicDescriptor::ImpDetectSVM( SvStream& rStm, sal_Bool bExtendedInfo )
    1010                 :            : {
    1011                 :            :     sal_uInt32  n32;
    1012                 :          0 :     sal_Bool    bRet = sal_False;
    1013                 :            :     sal_uInt8   cByte;
    1014                 :            : 
    1015                 :          0 :     sal_Int32 nStmPos = rStm.Tell();
    1016         [ #  # ]:          0 :     rStm.SetNumberFormatInt( NUMBERFORMAT_INT_LITTLEENDIAN );
    1017         [ #  # ]:          0 :     rStm >> n32;
    1018         [ #  # ]:          0 :     if ( n32 == 0x44475653 )
    1019                 :            :     {
    1020         [ #  # ]:          0 :         rStm >> cByte;
    1021         [ #  # ]:          0 :         if ( cByte == 0x49 )
    1022                 :            :         {
    1023                 :          0 :             nFormat = GFF_SVM;
    1024                 :          0 :             bRet = sal_True;
    1025                 :            : 
    1026         [ #  # ]:          0 :             if ( bExtendedInfo )
    1027                 :            :             {
    1028                 :            :                 sal_uInt32  nTemp32;
    1029                 :            :                 sal_uInt16  nTemp16;
    1030                 :            : 
    1031         [ #  # ]:          0 :                 rStm.SeekRel( 0x04 );
    1032                 :            : 
    1033                 :            :                 // Breite auslesen
    1034         [ #  # ]:          0 :                 rStm >> nTemp32;
    1035                 :          0 :                 aLogSize.Width() = nTemp32;
    1036                 :            : 
    1037                 :            :                 // Hoehe auslesen
    1038         [ #  # ]:          0 :                 rStm >> nTemp32;
    1039                 :          0 :                 aLogSize.Height() = nTemp32;
    1040                 :            : 
    1041                 :            :                 // Map-Unit auslesen und PrefSize ermitteln
    1042         [ #  # ]:          0 :                 rStm >> nTemp16;
    1043                 :            :                 aLogSize = OutputDevice::LogicToLogic( aLogSize,
    1044                 :            :                                                        MapMode( (MapUnit) nTemp16 ),
    1045 [ #  # ][ #  # ]:          0 :                                                        MapMode( MAP_100TH_MM ) );
         [ #  # ][ #  # ]
                 [ #  # ]
    1046                 :            :             }
    1047                 :            :         }
    1048                 :            :     }
    1049                 :            :     else
    1050                 :            :     {
    1051         [ #  # ]:          0 :         rStm.SeekRel( -4L );
    1052         [ #  # ]:          0 :         rStm >> n32;
    1053                 :            : 
    1054         [ #  # ]:          0 :         if( n32 == 0x4D4C4356 )
    1055                 :            :         {
    1056                 :            :             sal_uInt16 nTmp16;
    1057                 :            : 
    1058         [ #  # ]:          0 :             rStm >> nTmp16;
    1059                 :            : 
    1060         [ #  # ]:          0 :             if( nTmp16 == 0x4654 )
    1061                 :            :             {
    1062                 :          0 :                 nFormat = GFF_SVM;
    1063                 :          0 :                 bRet = sal_True;
    1064                 :            : 
    1065         [ #  # ]:          0 :                 if( bExtendedInfo )
    1066                 :            :                 {
    1067         [ #  # ]:          0 :                     MapMode aMapMode;
    1068                 :            : 
    1069         [ #  # ]:          0 :                     rStm.SeekRel( 0x06 );
    1070         [ #  # ]:          0 :                     rStm >> aMapMode;
    1071         [ #  # ]:          0 :                     rStm >> aLogSize;
    1072 [ #  # ][ #  # ]:          0 :                     aLogSize = OutputDevice::LogicToLogic( aLogSize, aMapMode, MapMode( MAP_100TH_MM ) );
         [ #  # ][ #  # ]
    1073                 :            :                 }
    1074                 :            :             }
    1075                 :            :         }
    1076                 :            :     }
    1077         [ #  # ]:          0 :     rStm.Seek( nStmPos );
    1078                 :          0 :     return bRet;
    1079                 :            : }
    1080                 :            : 
    1081                 :          0 : sal_Bool GraphicDescriptor::ImpDetectWMF( SvStream&, sal_Bool )
    1082                 :            : {
    1083                 :          0 :     sal_Bool bRet = aPathExt.CompareToAscii( "wmf",3 ) == COMPARE_EQUAL;
    1084         [ #  # ]:          0 :     if (bRet)
    1085                 :          0 :         nFormat = GFF_WMF;
    1086                 :            : 
    1087                 :          0 :     return bRet;
    1088                 :            : }
    1089                 :            : 
    1090                 :          0 : sal_Bool GraphicDescriptor::ImpDetectEMF( SvStream&, sal_Bool )
    1091                 :            : {
    1092                 :          0 :     sal_Bool bRet = aPathExt.CompareToAscii( "emf", 3 ) == COMPARE_EQUAL;
    1093         [ #  # ]:          0 :     if (bRet)
    1094                 :          0 :         nFormat = GFF_EMF;
    1095                 :            : 
    1096                 :          0 :     return bRet;
    1097                 :            : }
    1098                 :            : 
    1099                 :          0 : sal_Bool GraphicDescriptor::ImpDetectSVG( SvStream& /*rStm*/, sal_Bool /*bExtendedInfo*/ )
    1100                 :            : {
    1101                 :          0 :     sal_Bool bRet = aPathExt.CompareToAscii( "svg", 3 ) == COMPARE_EQUAL;
    1102         [ #  # ]:          0 :     if (bRet)
    1103                 :          0 :         nFormat = GFF_SVG;
    1104                 :            : 
    1105                 :          0 :     return bRet;
    1106                 :            : }
    1107                 :            : 
    1108                 :          0 : String GraphicDescriptor::GetImportFormatShortName( sal_uInt16 nFormat )
    1109                 :            : {
    1110                 :          0 :     const char *pKeyName = 0;
    1111                 :            : 
    1112   [ #  #  #  #  :          0 :     switch( nFormat )
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
                   #  # ]
    1113                 :            :     {
    1114                 :          0 :         case( GFF_BMP ) :   pKeyName = "bmp";   break;
    1115                 :          0 :         case( GFF_GIF ) :   pKeyName = "gif";   break;
    1116                 :          0 :         case( GFF_JPG ) :   pKeyName = "jpg";   break;
    1117                 :          0 :         case( GFF_PCD ) :   pKeyName = "pcd";   break;
    1118                 :          0 :         case( GFF_PCX ) :   pKeyName = "pcx";   break;
    1119                 :          0 :         case( GFF_PNG ) :   pKeyName = "png";   break;
    1120                 :          0 :         case( GFF_XBM ) :   pKeyName = "xbm";   break;
    1121                 :          0 :         case( GFF_XPM ) :   pKeyName = "xpm";   break;
    1122                 :          0 :         case( GFF_PBM ) :   pKeyName = "pbm";   break;
    1123                 :          0 :         case( GFF_PGM ) :   pKeyName = "pgm";   break;
    1124                 :          0 :         case( GFF_PPM ) :   pKeyName = "ppm";   break;
    1125                 :          0 :         case( GFF_RAS ) :   pKeyName = "ras";   break;
    1126                 :          0 :         case( GFF_TGA ) :   pKeyName = "tga";   break;
    1127                 :          0 :         case( GFF_PSD ) :   pKeyName = "psd";   break;
    1128                 :          0 :         case( GFF_EPS ) :   pKeyName = "eps";   break;
    1129                 :          0 :         case( GFF_TIF ) :   pKeyName = "tif";   break;
    1130                 :          0 :         case( GFF_DXF ) :   pKeyName = "dxf";   break;
    1131                 :          0 :         case( GFF_MET ) :   pKeyName = "met";   break;
    1132                 :          0 :         case( GFF_PCT ) :   pKeyName = "pct";   break;
    1133                 :          0 :         case( GFF_SGF ) :   pKeyName = "sgf";   break;
    1134                 :          0 :         case( GFF_SGV ) :   pKeyName = "sgv";   break;
    1135                 :          0 :         case( GFF_SVM ) :   pKeyName = "svm";   break;
    1136                 :          0 :         case( GFF_WMF ) :   pKeyName = "wmf";   break;
    1137                 :          0 :         case( GFF_EMF ) :   pKeyName = "emf";   break;
    1138                 :          0 :         case( GFF_SVG ) :   pKeyName = "svg";   break;
    1139                 :            :     }
    1140                 :            : 
    1141         [ #  # ]:          0 :     return rtl::OUString::createFromAscii(pKeyName);
    1142                 :            : }
    1143                 :            : 
    1144                 :            : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10