xref: /AOO41X/main/vcl/aqua/source/dtrans/PictToBmpFlt.cxx (revision a29d375c28feefee5f66a5e3ed841463d3388e9b)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 /* This is a work-around to prevent 'deprecated' warning for 'KillPicture' API
25    Hopefully we can get rid of this whole code again when the OOo PICT filter
26    are good enough to be used see #i78953 thus this hack would vanish to again.
27  */
28 #include <premac.h>
29 #include <AvailabilityMacros.h>
30 #undef DEPRECATED_ATTRIBUTE
31 #define DEPRECATED_ATTRIBUTE
32 
33 #include <Carbon/Carbon.h>
34 #include <QuickTime/QuickTime.h>
35 #include <postmac.h>
36 
37 #include "PictToBmpFlt.hxx"
38 
39 bool PICTtoPNG( com::sun::star::uno::Sequence<sal_Int8>& rPictData,
40             com::sun::star::uno::Sequence<sal_Int8>& rPngData)
41 {
42 #ifdef MAC_OS_X_VERSION_10_6
43     return false;
44 #else // MAC_OS_X_VERSION_10_6
45     ComponentInstance pngExporter = NULL;
46     if( OpenADefaultComponent( GraphicsExporterComponentType, kQTFileTypePNG, &pngExporter) != noErr)
47         return false;
48 
49     Handle hPict = NULL;
50     if( PtrToHand( rPictData.getArray(), &hPict, rPictData.getLength()) != noErr)
51         hPict = NULL;
52 
53     Handle hPng = NULL;
54     if( hPict && GraphicsExportSetInputPicture( pngExporter, (PicHandle)hPict) == noErr)
55         hPng = NewHandleClear(0);
56 
57     size_t nPngSize = 0;
58     if( hPng
59     && (GraphicsExportSetOutputHandle( pngExporter, hPng) == noErr)
60     && (GraphicsExportDoExport( pngExporter, NULL) == noErr))
61     {
62         nPngSize = GetHandleSize( hPng);
63         rPngData.realloc( nPngSize);
64 
65         HLock( hPng);
66         rtl_copyMemory( rPngData.getArray(), ((sal_Int8*)*hPng), nPngSize);
67         HUnlock( hPng);
68     }
69 
70     if( hPict)
71         DisposeHandle( hPict);
72     if( hPng)
73         DisposeHandle( hPng);
74     if( pngExporter)
75         CloseComponent( pngExporter);
76 
77     return (nPngSize > 0);
78 #endif // MAC_OS_X_VERSION_10_6
79 }
80 
81 
82 bool PNGtoPICT( com::sun::star::uno::Sequence<sal_Int8>& rPngData,
83                com::sun::star::uno::Sequence<sal_Int8>& rPictData)
84 {
85 #ifdef MAC_OS_X_VERSION_10_6
86     return false;
87 #else // MAC_OS_X_VERSION_10_6
88     ComponentInstance pictExporter;
89     if( OpenADefaultComponent( GraphicsImporterComponentType, kQTFileTypePNG, &pictExporter) != noErr)
90         return false;
91 
92     Handle hPng = NULL;
93     if( PtrToHand( rPngData.getArray(), &hPng, rPngData.getLength()) != noErr)
94         hPng = NULL;
95 
96     size_t nPictSize = 0;
97     PicHandle hPict = NULL;
98     if( hPng
99     && (GraphicsImportSetDataHandle( pictExporter, hPng) == noErr)
100     && (GraphicsImportGetAsPicture( pictExporter, &hPict) == noErr))
101     {
102         nPictSize = GetHandleSize( (Handle)hPict);
103         rPictData.realloc( nPictSize);
104 
105         HLock( (Handle)hPict);
106         rtl_copyMemory( rPictData.getArray(), ((sal_Int8*)*hPict), nPictSize);
107         HUnlock( (Handle)hPict);
108 
109 #if __MAC_OS_X_VERSION_MAX_ALLOWED <= 1060
110         // Release the data associated with the picture
111         // Note: This function has been deprecated in OSX 10.4 and removed in OSX 10.7
112         KillPicture( hPict);
113 #endif
114     }
115 
116     if( hPng)
117         DisposeHandle( hPng);
118     if( pictExporter)
119         CloseComponent( pictExporter);
120 
121     return (nPictSize > 512);
122 #endif // MAC_OS_X_VERSION_10_6
123 }
124 
125 bool ImageToPNG( com::sun::star::uno::Sequence<sal_Int8>& rImgData,
126                  com::sun::star::uno::Sequence<sal_Int8>& rPngData,
127                  NSBitmapImageFileType eInFormat)
128 {
129     // short circuit for PNG->PNG request
130     if( eInFormat == NSPNGFileType) {
131         rPngData = rImgData;
132         return true;
133     }
134 
135     // special handling for old PICT images that are not supported by NSBitmapImage
136     if( eInFormat == PICTImageFileType)
137         return PICTtoPNG( rImgData, rPngData);
138 
139     // let Cocoa's NSBitmapImageRep do the conversion
140     NSData* pData = [NSData dataWithBytesNoCopy: (void*)rImgData.getConstArray() length: rImgData.getLength() freeWhenDone: 0];
141     if( !pData)
142         return false;
143 
144     NSBitmapImageRep* pRep =[NSBitmapImageRep imageRepWithData: pData];
145         if( !pRep)
146         return false;
147 
148     NSData* pOut = [pRep representationUsingType: NSPNGFileType properties: nil];
149     if( !pOut)
150         return false;
151 
152     // get the conversion result
153     const size_t nPngSize = [pOut length];
154     rPngData.realloc( nPngSize);
155     [pOut getBytes: rPngData.getArray() length: nPngSize];
156     return (nPngSize > 0);
157 }
158 
159 bool PNGToImage( com::sun::star::uno::Sequence<sal_Int8>& rPngData,
160                  com::sun::star::uno::Sequence<sal_Int8>& rImgData,
161                  NSBitmapImageFileType eOutFormat
162                 )
163 {
164     // short circuit for PNG->PNG request
165     if( eOutFormat == NSPNGFileType) {
166         rImgData = rPngData;
167         return true;
168     }
169 
170     // special handling for old PICT images that are not supported by NSBitmapImage
171     if( eOutFormat == PICTImageFileType)
172         return PNGtoPICT( rPngData, rImgData);
173 
174     // let Cocoa's NSBitmapImageRep do the conversion
175     NSData* pData = [NSData dataWithBytesNoCopy: const_cast<sal_Int8*>(rPngData.getConstArray()) length: rPngData.getLength() freeWhenDone: 0];
176     if( !pData)
177         return false;
178 
179         NSBitmapImageRep* pRep = [NSBitmapImageRep imageRepWithData: pData];
180         if( !pRep)
181         return false;
182 
183     NSData* pOut = [pRep representationUsingType: eOutFormat properties: nil];
184     if( !pOut)
185         return false;
186 
187     // get the conversion result
188     const size_t nImgSize = [pOut length];
189     rImgData.realloc( nImgSize);
190     [pOut getBytes: rImgData.getArray() length: nImgSize];
191     return (nImgSize > 0);
192 }
193 
194