/************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ /* This is a work-around to prevent 'deprecated' warning for 'KillPicture' API Hopefully we can get rid of this whole code again when the OOo PICT filter are good enough to be used see #i78953 thus this hack would vanish to again. */ #include #include #undef DEPRECATED_ATTRIBUTE #define DEPRECATED_ATTRIBUTE #include #include #include #include "PictToBmpFlt.hxx" bool PICTtoPNG( com::sun::star::uno::Sequence& rPictData, com::sun::star::uno::Sequence& rPngData) { #ifdef MAC_OS_X_VERSION_10_6 return false; #else // MAC_OS_X_VERSION_10_6 ComponentInstance pngExporter = NULL; if( OpenADefaultComponent( GraphicsExporterComponentType, kQTFileTypePNG, &pngExporter) != noErr) return false; Handle hPict = NULL; if( PtrToHand( rPictData.getArray(), &hPict, rPictData.getLength()) != noErr) hPict = NULL; Handle hPng = NULL; if( hPict && GraphicsExportSetInputPicture( pngExporter, (PicHandle)hPict) == noErr) hPng = NewHandleClear(0); size_t nPngSize = 0; if( hPng && (GraphicsExportSetOutputHandle( pngExporter, hPng) == noErr) && (GraphicsExportDoExport( pngExporter, NULL) == noErr)) { nPngSize = GetHandleSize( hPng); rPngData.realloc( nPngSize); HLock( hPng); rtl_copyMemory( rPngData.getArray(), ((sal_Int8*)*hPng), nPngSize); HUnlock( hPng); } if( hPict) DisposeHandle( hPict); if( hPng) DisposeHandle( hPng); if( pngExporter) CloseComponent( pngExporter); return (nPngSize > 0); #endif // MAC_OS_X_VERSION_10_6 } bool PNGtoPICT( com::sun::star::uno::Sequence& rPngData, com::sun::star::uno::Sequence& rPictData) { #ifdef MAC_OS_X_VERSION_10_6 return false; #else // MAC_OS_X_VERSION_10_6 ComponentInstance pictExporter; if( OpenADefaultComponent( GraphicsImporterComponentType, kQTFileTypePNG, &pictExporter) != noErr) return false; Handle hPng = NULL; if( PtrToHand( rPngData.getArray(), &hPng, rPngData.getLength()) != noErr) hPng = NULL; size_t nPictSize = 0; PicHandle hPict = NULL; if( hPng && (GraphicsImportSetDataHandle( pictExporter, hPng) == noErr) && (GraphicsImportGetAsPicture( pictExporter, &hPict) == noErr)) { nPictSize = GetHandleSize( (Handle)hPict); rPictData.realloc( nPictSize); HLock( (Handle)hPict); rtl_copyMemory( rPictData.getArray(), ((sal_Int8*)*hPict), nPictSize); HUnlock( (Handle)hPict); #if __MAC_OS_X_VERSION_MAX_ALLOWED <= 1060 // Release the data associated with the picture // Note: This function has been deprecated in OSX 10.4 and removed in OSX 10.7 KillPicture( hPict); #endif } if( hPng) DisposeHandle( hPng); if( pictExporter) CloseComponent( pictExporter); return (nPictSize > 512); #endif // MAC_OS_X_VERSION_10_6 } bool ImageToPNG( com::sun::star::uno::Sequence& rImgData, com::sun::star::uno::Sequence& rPngData, NSBitmapImageFileType eInFormat) { // short circuit for PNG->PNG request if( eInFormat == NSPNGFileType) { rPngData = rImgData; return true; } // special handling for old PICT images that are not supported by NSBitmapImage if( eInFormat == PICTImageFileType) return PICTtoPNG( rImgData, rPngData); // let Cocoa's NSBitmapImageRep do the conversion NSData* pData = [NSData dataWithBytesNoCopy: (void*)rImgData.getConstArray() length: rImgData.getLength() freeWhenDone: 0]; if( !pData) return false; NSBitmapImageRep* pRep =[NSBitmapImageRep imageRepWithData: pData]; if( !pRep) return false; NSData* pOut = [pRep representationUsingType: NSPNGFileType properties: nil]; if( !pOut) return false; // get the conversion result const size_t nPngSize = [pOut length]; rPngData.realloc( nPngSize); [pOut getBytes: rPngData.getArray() length: nPngSize]; return (nPngSize > 0); } bool PNGToImage( com::sun::star::uno::Sequence& rPngData, com::sun::star::uno::Sequence& rImgData, NSBitmapImageFileType eOutFormat ) { // short circuit for PNG->PNG request if( eOutFormat == NSPNGFileType) { rImgData = rPngData; return true; } // special handling for old PICT images that are not supported by NSBitmapImage if( eOutFormat == PICTImageFileType) return PNGtoPICT( rPngData, rImgData); // let Cocoa's NSBitmapImageRep do the conversion NSData* pData = [NSData dataWithBytesNoCopy: const_cast(rPngData.getConstArray()) length: rPngData.getLength() freeWhenDone: 0]; if( !pData) return false; NSBitmapImageRep* pRep = [NSBitmapImageRep imageRepWithData: pData]; if( !pRep) return false; NSData* pOut = [pRep representationUsingType: eOutFormat properties: nil]; if( !pOut) return false; // get the conversion result const size_t nImgSize = [pOut length]; rImgData.realloc( nImgSize); [pOut getBytes: rImgData.getArray() length: nImgSize]; return (nImgSize > 0); }