1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_vcl.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #include <string.h>
28*b1cdbd2cSJim Jagielski 
29*b1cdbd2cSJim Jagielski #include "psputil.hxx"
30*b1cdbd2cSJim Jagielski 
31*b1cdbd2cSJim Jagielski #include "tools/debug.hxx"
32*b1cdbd2cSJim Jagielski 
33*b1cdbd2cSJim Jagielski namespace psp {
34*b1cdbd2cSJim Jagielski 
35*b1cdbd2cSJim Jagielski /*
36*b1cdbd2cSJim Jagielski  * string convenience routines
37*b1cdbd2cSJim Jagielski  */
38*b1cdbd2cSJim Jagielski 
39*b1cdbd2cSJim Jagielski sal_Int32
getHexValueOf(sal_Int32 nValue,sal_Char * pBuffer)40*b1cdbd2cSJim Jagielski getHexValueOf (sal_Int32 nValue, sal_Char* pBuffer)
41*b1cdbd2cSJim Jagielski {
42*b1cdbd2cSJim Jagielski     const static sal_Char pHex [0x10] = {
43*b1cdbd2cSJim Jagielski         '0', '1', '2', '3', '4', '5', '6', '7',
44*b1cdbd2cSJim Jagielski         '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
45*b1cdbd2cSJim Jagielski 
46*b1cdbd2cSJim Jagielski     pBuffer[0] = pHex [(nValue & 0xF0) >> 4];
47*b1cdbd2cSJim Jagielski     pBuffer[1] = pHex [(nValue & 0x0F)     ];
48*b1cdbd2cSJim Jagielski 
49*b1cdbd2cSJim Jagielski     return 2;
50*b1cdbd2cSJim Jagielski }
51*b1cdbd2cSJim Jagielski 
52*b1cdbd2cSJim Jagielski sal_Int32
getAlignedHexValueOf(sal_Int32 nValue,sal_Char * pBuffer)53*b1cdbd2cSJim Jagielski getAlignedHexValueOf (sal_Int32 nValue, sal_Char* pBuffer)
54*b1cdbd2cSJim Jagielski {
55*b1cdbd2cSJim Jagielski     // get sign
56*b1cdbd2cSJim Jagielski     sal_Bool bNegative = nValue < 0;
57*b1cdbd2cSJim Jagielski     nValue = bNegative ? -nValue : nValue;
58*b1cdbd2cSJim Jagielski 
59*b1cdbd2cSJim Jagielski     // get required buffer size, must be a multiple of two
60*b1cdbd2cSJim Jagielski     sal_Int32 nPrecision;
61*b1cdbd2cSJim Jagielski     if (nValue < 0x80)
62*b1cdbd2cSJim Jagielski         nPrecision = 2;
63*b1cdbd2cSJim Jagielski     else
64*b1cdbd2cSJim Jagielski         if (nValue < 0x8000)
65*b1cdbd2cSJim Jagielski             nPrecision = 4;
66*b1cdbd2cSJim Jagielski         else
67*b1cdbd2cSJim Jagielski             if (nValue < 0x800000)
68*b1cdbd2cSJim Jagielski                 nPrecision = 6;
69*b1cdbd2cSJim Jagielski             else
70*b1cdbd2cSJim Jagielski                 nPrecision = 8;
71*b1cdbd2cSJim Jagielski 
72*b1cdbd2cSJim Jagielski     // convert the int into its hex representation, write it into the buffer
73*b1cdbd2cSJim Jagielski     sal_Int32 nRet = nPrecision;
74*b1cdbd2cSJim Jagielski     while (nPrecision)
75*b1cdbd2cSJim Jagielski     {
76*b1cdbd2cSJim Jagielski         nPrecision -= getHexValueOf (nValue % 256, pBuffer + nPrecision - 2 );
77*b1cdbd2cSJim Jagielski         nValue /= 256;
78*b1cdbd2cSJim Jagielski     }
79*b1cdbd2cSJim Jagielski 
80*b1cdbd2cSJim Jagielski     // set sign bit
81*b1cdbd2cSJim Jagielski     if (bNegative)
82*b1cdbd2cSJim Jagielski     {
83*b1cdbd2cSJim Jagielski         switch (pBuffer[0])
84*b1cdbd2cSJim Jagielski         {
85*b1cdbd2cSJim Jagielski             case '0' : pBuffer[0] = '8'; break;
86*b1cdbd2cSJim Jagielski             case '1' : pBuffer[0] = '9'; break;
87*b1cdbd2cSJim Jagielski             case '2' : pBuffer[0] = 'A'; break;
88*b1cdbd2cSJim Jagielski             case '3' : pBuffer[0] = 'B'; break;
89*b1cdbd2cSJim Jagielski             case '4' : pBuffer[0] = 'C'; break;
90*b1cdbd2cSJim Jagielski             case '5' : pBuffer[0] = 'D'; break;
91*b1cdbd2cSJim Jagielski             case '6' : pBuffer[0] = 'E'; break;
92*b1cdbd2cSJim Jagielski             case '7' : pBuffer[0] = 'F'; break;
93*b1cdbd2cSJim Jagielski             default: DBG_ERROR("Already a signed value");
94*b1cdbd2cSJim Jagielski         }
95*b1cdbd2cSJim Jagielski     }
96*b1cdbd2cSJim Jagielski 
97*b1cdbd2cSJim Jagielski     // report precision
98*b1cdbd2cSJim Jagielski     return nRet;
99*b1cdbd2cSJim Jagielski }
100*b1cdbd2cSJim Jagielski 
101*b1cdbd2cSJim Jagielski 
102*b1cdbd2cSJim Jagielski sal_Int32
getValueOf(sal_Int32 nValue,sal_Char * pBuffer)103*b1cdbd2cSJim Jagielski getValueOf (sal_Int32 nValue, sal_Char* pBuffer)
104*b1cdbd2cSJim Jagielski {
105*b1cdbd2cSJim Jagielski     sal_Int32 nChar = 0;
106*b1cdbd2cSJim Jagielski     if (nValue < 0)
107*b1cdbd2cSJim Jagielski     {
108*b1cdbd2cSJim Jagielski         pBuffer [nChar++] = '-';
109*b1cdbd2cSJim Jagielski         nValue *= -1;
110*b1cdbd2cSJim Jagielski     }
111*b1cdbd2cSJim Jagielski     else
112*b1cdbd2cSJim Jagielski         if (nValue == 0)
113*b1cdbd2cSJim Jagielski         {
114*b1cdbd2cSJim Jagielski             pBuffer [nChar++] = '0';
115*b1cdbd2cSJim Jagielski             return nChar;
116*b1cdbd2cSJim Jagielski         }
117*b1cdbd2cSJim Jagielski 
118*b1cdbd2cSJim Jagielski     sal_Char  pInvBuffer [32];
119*b1cdbd2cSJim Jagielski     sal_Int32 nInvChar = 0;
120*b1cdbd2cSJim Jagielski     while (nValue > 0)
121*b1cdbd2cSJim Jagielski     {
122*b1cdbd2cSJim Jagielski         pInvBuffer [nInvChar++] = '0' + nValue % 10;
123*b1cdbd2cSJim Jagielski         nValue /= 10;
124*b1cdbd2cSJim Jagielski     }
125*b1cdbd2cSJim Jagielski     while (nInvChar > 0)
126*b1cdbd2cSJim Jagielski     {
127*b1cdbd2cSJim Jagielski         pBuffer [nChar++] = pInvBuffer [--nInvChar];
128*b1cdbd2cSJim Jagielski     }
129*b1cdbd2cSJim Jagielski 
130*b1cdbd2cSJim Jagielski     return nChar;
131*b1cdbd2cSJim Jagielski }
132*b1cdbd2cSJim Jagielski 
133*b1cdbd2cSJim Jagielski sal_Int32
appendStr(const sal_Char * pSrc,sal_Char * pDst)134*b1cdbd2cSJim Jagielski appendStr (const sal_Char* pSrc, sal_Char* pDst)
135*b1cdbd2cSJim Jagielski {
136*b1cdbd2cSJim Jagielski     sal_Int32 nBytes = strlen (pSrc);
137*b1cdbd2cSJim Jagielski     strncpy (pDst, pSrc, nBytes + 1);
138*b1cdbd2cSJim Jagielski 
139*b1cdbd2cSJim Jagielski     return nBytes;
140*b1cdbd2cSJim Jagielski }
141*b1cdbd2cSJim Jagielski 
142*b1cdbd2cSJim Jagielski sal_Int32
appendStr(const sal_Char * pSrc,sal_Char * pDst,sal_Int32 nBytes)143*b1cdbd2cSJim Jagielski appendStr (const sal_Char* pSrc, sal_Char* pDst, sal_Int32 nBytes)
144*b1cdbd2cSJim Jagielski {
145*b1cdbd2cSJim Jagielski     strncpy (pDst, pSrc, nBytes);
146*b1cdbd2cSJim Jagielski     pDst [nBytes] = '\0';
147*b1cdbd2cSJim Jagielski     return nBytes;
148*b1cdbd2cSJim Jagielski }
149*b1cdbd2cSJim Jagielski 
150*b1cdbd2cSJim Jagielski /*
151*b1cdbd2cSJim Jagielski  * copy strings to file
152*b1cdbd2cSJim Jagielski  */
153*b1cdbd2cSJim Jagielski 
154*b1cdbd2cSJim Jagielski sal_Bool
WritePS(osl::File * pFile,const sal_Char * pString)155*b1cdbd2cSJim Jagielski WritePS (osl::File* pFile, const sal_Char* pString)
156*b1cdbd2cSJim Jagielski {
157*b1cdbd2cSJim Jagielski     sal_uInt64 nInLength = rtl_str_getLength (pString);
158*b1cdbd2cSJim Jagielski     sal_uInt64 nOutLength = 0;
159*b1cdbd2cSJim Jagielski 
160*b1cdbd2cSJim Jagielski     if (nInLength > 0 && pFile)
161*b1cdbd2cSJim Jagielski         pFile->write (pString, nInLength, nOutLength);
162*b1cdbd2cSJim Jagielski 
163*b1cdbd2cSJim Jagielski     return nInLength == nOutLength;
164*b1cdbd2cSJim Jagielski }
165*b1cdbd2cSJim Jagielski 
166*b1cdbd2cSJim Jagielski sal_Bool
WritePS(osl::File * pFile,const sal_Char * pString,sal_uInt64 nInLength)167*b1cdbd2cSJim Jagielski WritePS (osl::File* pFile, const sal_Char* pString, sal_uInt64 nInLength)
168*b1cdbd2cSJim Jagielski {
169*b1cdbd2cSJim Jagielski     sal_uInt64 nOutLength = 0;
170*b1cdbd2cSJim Jagielski 
171*b1cdbd2cSJim Jagielski     if (nInLength > 0 && pFile)
172*b1cdbd2cSJim Jagielski         pFile->write (pString, nInLength, nOutLength);
173*b1cdbd2cSJim Jagielski 
174*b1cdbd2cSJim Jagielski     return nInLength == nOutLength;
175*b1cdbd2cSJim Jagielski }
176*b1cdbd2cSJim Jagielski 
177*b1cdbd2cSJim Jagielski sal_Bool
WritePS(osl::File * pFile,const rtl::OString & rString)178*b1cdbd2cSJim Jagielski WritePS (osl::File* pFile, const rtl::OString &rString)
179*b1cdbd2cSJim Jagielski {
180*b1cdbd2cSJim Jagielski     sal_uInt64 nInLength = rString.getLength();
181*b1cdbd2cSJim Jagielski     sal_uInt64 nOutLength = 0;
182*b1cdbd2cSJim Jagielski 
183*b1cdbd2cSJim Jagielski     if (nInLength > 0 && pFile)
184*b1cdbd2cSJim Jagielski         pFile->write( rString.getStr(), nInLength, nOutLength);
185*b1cdbd2cSJim Jagielski 
186*b1cdbd2cSJim Jagielski     return nInLength == nOutLength;
187*b1cdbd2cSJim Jagielski }
188*b1cdbd2cSJim Jagielski 
189*b1cdbd2cSJim Jagielski sal_Bool
WritePS(osl::File * pFile,const rtl::OUString & rString)190*b1cdbd2cSJim Jagielski WritePS (osl::File* pFile, const rtl::OUString &rString)
191*b1cdbd2cSJim Jagielski {
192*b1cdbd2cSJim Jagielski     return WritePS (pFile, rtl::OUStringToOString(rString, RTL_TEXTENCODING_ASCII_US));
193*b1cdbd2cSJim Jagielski }
194*b1cdbd2cSJim Jagielski 
195*b1cdbd2cSJim Jagielski /*
196*b1cdbd2cSJim Jagielski  * cache converter for use in postscript drawing routines
197*b1cdbd2cSJim Jagielski  */
198*b1cdbd2cSJim Jagielski 
ConverterFactory()199*b1cdbd2cSJim Jagielski ConverterFactory::ConverterFactory()
200*b1cdbd2cSJim Jagielski {
201*b1cdbd2cSJim Jagielski }
202*b1cdbd2cSJim Jagielski 
~ConverterFactory()203*b1cdbd2cSJim Jagielski ConverterFactory::~ConverterFactory ()
204*b1cdbd2cSJim Jagielski {
205*b1cdbd2cSJim Jagielski     for( std::map< rtl_TextEncoding, rtl_UnicodeToTextConverter >::const_iterator it = m_aConverters.begin(); it != m_aConverters.end(); ++it )
206*b1cdbd2cSJim Jagielski             rtl_destroyUnicodeToTextConverter (it->second);
207*b1cdbd2cSJim Jagielski }
208*b1cdbd2cSJim Jagielski 
209*b1cdbd2cSJim Jagielski rtl_UnicodeToTextConverter
Get(rtl_TextEncoding nEncoding)210*b1cdbd2cSJim Jagielski ConverterFactory::Get (rtl_TextEncoding nEncoding)
211*b1cdbd2cSJim Jagielski {
212*b1cdbd2cSJim Jagielski     if (rtl_isOctetTextEncoding( nEncoding ))
213*b1cdbd2cSJim Jagielski     {
214*b1cdbd2cSJim Jagielski         std::map< rtl_TextEncoding, rtl_UnicodeToTextConverter >::const_iterator it =
215*b1cdbd2cSJim Jagielski             m_aConverters.find( nEncoding );
216*b1cdbd2cSJim Jagielski         rtl_UnicodeToTextConverter aConverter;
217*b1cdbd2cSJim Jagielski         if (it == m_aConverters.end())
218*b1cdbd2cSJim Jagielski         {
219*b1cdbd2cSJim Jagielski             aConverter = rtl_createUnicodeToTextConverter (nEncoding);
220*b1cdbd2cSJim Jagielski             m_aConverters[nEncoding] = aConverter;
221*b1cdbd2cSJim Jagielski         }
222*b1cdbd2cSJim Jagielski         else
223*b1cdbd2cSJim Jagielski             aConverter = it->second;
224*b1cdbd2cSJim Jagielski         return aConverter;
225*b1cdbd2cSJim Jagielski     }
226*b1cdbd2cSJim Jagielski     return NULL;
227*b1cdbd2cSJim Jagielski }
228*b1cdbd2cSJim Jagielski 
229*b1cdbd2cSJim Jagielski // wrapper for rtl_convertUnicodeToText that handles the usual cases for
230*b1cdbd2cSJim Jagielski // textconversion in drawtext
231*b1cdbd2cSJim Jagielski sal_Size
Convert(const sal_Unicode * pText,int nTextLen,sal_uChar * pBuffer,sal_Size nBufferSize,rtl_TextEncoding nEncoding)232*b1cdbd2cSJim Jagielski ConverterFactory::Convert (const sal_Unicode *pText, int nTextLen,
233*b1cdbd2cSJim Jagielski                            sal_uChar *pBuffer, sal_Size nBufferSize, rtl_TextEncoding nEncoding)
234*b1cdbd2cSJim Jagielski {
235*b1cdbd2cSJim Jagielski     const sal_uInt32 nCvtFlags =  RTL_UNICODETOTEXT_FLAGS_UNDEFINED_QUESTIONMARK
236*b1cdbd2cSJim Jagielski         | RTL_UNICODETOTEXT_FLAGS_INVALID_QUESTIONMARK ;
237*b1cdbd2cSJim Jagielski     sal_uInt32  nCvtInfo;
238*b1cdbd2cSJim Jagielski     sal_Size    nCvtChars;
239*b1cdbd2cSJim Jagielski 
240*b1cdbd2cSJim Jagielski     rtl_UnicodeToTextConverter aConverter = Get (nEncoding);
241*b1cdbd2cSJim Jagielski     rtl_UnicodeToTextContext   aContext   = rtl_createUnicodeToTextContext (aConverter);
242*b1cdbd2cSJim Jagielski 
243*b1cdbd2cSJim Jagielski     sal_Size nSize = rtl_convertUnicodeToText (aConverter, aContext,
244*b1cdbd2cSJim Jagielski                                                pText, nTextLen, (sal_Char*)pBuffer, nBufferSize,
245*b1cdbd2cSJim Jagielski                                                nCvtFlags, &nCvtInfo, &nCvtChars);
246*b1cdbd2cSJim Jagielski 
247*b1cdbd2cSJim Jagielski     rtl_destroyUnicodeToTextContext (aConverter, aContext);
248*b1cdbd2cSJim Jagielski 
249*b1cdbd2cSJim Jagielski     return nSize;
250*b1cdbd2cSJim Jagielski }
251*b1cdbd2cSJim Jagielski 
252*b1cdbd2cSJim Jagielski ConverterFactory*
GetConverterFactory()253*b1cdbd2cSJim Jagielski GetConverterFactory ()
254*b1cdbd2cSJim Jagielski {
255*b1cdbd2cSJim Jagielski     static ConverterFactory* pCvt = NULL;
256*b1cdbd2cSJim Jagielski 
257*b1cdbd2cSJim Jagielski     if (pCvt == NULL)
258*b1cdbd2cSJim Jagielski         pCvt = new ConverterFactory;
259*b1cdbd2cSJim Jagielski 
260*b1cdbd2cSJim Jagielski     return pCvt;
261*b1cdbd2cSJim Jagielski }
262*b1cdbd2cSJim Jagielski 
263*b1cdbd2cSJim Jagielski 
264*b1cdbd2cSJim Jagielski } /* namespace psp */
265