blob: aeeb18221d1ab93203bac33319bd1621a4dd520b [file] [log] [blame]
/**************************************************************
*
* 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 <premac.h>
#include <AvailabilityMacros.h>
#undef DEPRECATED_ATTRIBUTE
#define DEPRECATED_ATTRIBUTE
#include <Carbon/Carbon.h>
#include <QuickTime/QuickTime.h>
#include <postmac.h>
#include "PictToBmpFlt.hxx"
bool PICTtoPNG( com::sun::star::uno::Sequence<sal_Int8>& rPictData,
com::sun::star::uno::Sequence<sal_Int8>& 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<sal_Int8>& rPngData,
com::sun::star::uno::Sequence<sal_Int8>& 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<sal_Int8>& rImgData,
com::sun::star::uno::Sequence<sal_Int8>& 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<sal_Int8>& rPngData,
com::sun::star::uno::Sequence<sal_Int8>& 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<sal_Int8*>(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);
}