xref: /AOO41X/main/vcl/aqua/source/dtrans/PictToBmpFlt.cxx (revision 5980243063f6840bf3a2e60b2243db5da5e78fa6)
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     ComponentInstance pngExporter = NULL;
43     if( OpenADefaultComponent( GraphicsExporterComponentType, kQTFileTypePNG, &pngExporter) != noErr)
44         return false;
45 
46     Handle hPict = NULL;
47     if( PtrToHand( rPictData.getArray(), &hPict, rPictData.getLength()) != noErr)
48         hPict = NULL;
49 
50     Handle hPng = NULL;
51     if( hPict && GraphicsExportSetInputPicture( pngExporter, (PicHandle)hPict) == noErr)
52         hPng = NewHandleClear(0);
53 
54     size_t nPngSize = 0;
55     if( hPng
56     && (GraphicsExportSetOutputHandle( pngExporter, hPng) == noErr)
57     && (GraphicsExportDoExport( pngExporter, NULL) == noErr))
58     {
59         nPngSize = GetHandleSize( hPng);
60         rPngData.realloc( nPngSize);
61 
62         HLock( hPng);
63         rtl_copyMemory( rPngData.getArray(), ((sal_Int8*)*hPng), nPngSize);
64         HUnlock( hPng);
65     }
66 
67     if( hPict)
68         DisposeHandle( hPict);
69     if( hPng)
70         DisposeHandle( hPng);
71     if( pngExporter)
72         CloseComponent( pngExporter);
73 
74     return (nPngSize > 0);
75 }
76 
77 
78 bool PNGtoPICT( com::sun::star::uno::Sequence<sal_Int8>& rPngData,
79                com::sun::star::uno::Sequence<sal_Int8>& rPictData)
80 {
81     ComponentInstance pictExporter;
82     if( OpenADefaultComponent( GraphicsImporterComponentType, kQTFileTypePNG, &pictExporter) != noErr)
83         return false;
84 
85     Handle hPng = NULL;
86     if( PtrToHand( rPngData.getArray(), &hPng, rPngData.getLength()) != noErr)
87         hPng = NULL;
88 
89     size_t nPictSize = 0;
90     PicHandle hPict = NULL;
91     if( hPng
92     && (GraphicsImportSetDataHandle( pictExporter, hPng) == noErr)
93     && (GraphicsImportGetAsPicture( pictExporter, &hPict) == noErr))
94     {
95         nPictSize = GetHandleSize( (Handle)hPict);
96         rPictData.realloc( nPictSize);
97 
98         HLock( (Handle)hPict);
99         rtl_copyMemory( rPictData.getArray(), ((sal_Int8*)*hPict), nPictSize);
100         HUnlock( (Handle)hPict);
101 
102         // Release the data associated with the picture
103         // Note: This function is deprecated in Mac OSX 10.4
104         KillPicture( hPict);
105     }
106 
107     if( hPng)
108         DisposeHandle( hPng);
109     if( pictExporter)
110         CloseComponent( pictExporter);
111 
112     return (nPictSize > 512);
113 }
114 
115 bool ImageToPNG( com::sun::star::uno::Sequence<sal_Int8>& rImgData,
116                  com::sun::star::uno::Sequence<sal_Int8>& rPngData,
117                  NSBitmapImageFileType eInFormat)
118 {
119     if( eInFormat == PICTImageFileType)
120         return PICTtoPNG( rImgData, rPngData);
121 
122     NSData* pData = [NSData dataWithBytesNoCopy: (void*)rImgData.getConstArray() length: rImgData.getLength() freeWhenDone: 0];
123     if( !pData)
124         return false;
125 
126     NSBitmapImageRep* pRep =[NSBitmapImageRep imageRepWithData: pData];
127         if( !pRep)
128         return false;
129 
130     NSData* pOut = [pRep representationUsingType: NSPNGFileType properties: nil];
131     if( !pOut)
132         return false;
133 
134     const size_t nPngSize = [pOut length];
135     rPngData.realloc( nPngSize);
136     [pOut getBytes: rPngData.getArray() length: nPngSize];
137     return (nPngSize > 0);
138 }
139 
140 bool PNGToImage( com::sun::star::uno::Sequence<sal_Int8>& rPngData,
141                  com::sun::star::uno::Sequence<sal_Int8>& rImgData,
142                  NSBitmapImageFileType eOutFormat
143                 )
144 {
145     if( eOutFormat == PICTImageFileType)
146         return PNGtoPICT( rPngData, rImgData);
147 
148     NSData* pData = [NSData dataWithBytesNoCopy: const_cast<sal_Int8*>(rPngData.getConstArray()) length: rPngData.getLength() freeWhenDone: 0];
149     if( !pData)
150         return false;
151 
152         NSBitmapImageRep* pRep = [NSBitmapImageRep imageRepWithData: pData];
153         if( !pRep)
154         return false;
155 
156     NSData* pOut = [pRep representationUsingType: eOutFormat properties: nil];
157     if( !pOut)
158         return false;
159 
160     const size_t nImgSize = [pOut length];
161     rImgData.realloc( nImgSize);
162     [pOut getBytes: rImgData.getArray() length: nImgSize];
163     return (nImgSize > 0);
164 }
165 
166