Files correlati : pdflib Ricompilazione Demo : [ ] Commento : Aggiornata pdflib.dll alla versione 7.0.4 git-svn-id: svn://10.65.10.50/trunk@18580 c028cbd2-c16b-5b4b-a496-9718f37d4682
		
			
				
	
	
		
			194 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			194 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
| /*---------------------------------------------------------------------------*
 | |
|  |              PDFlib - A library for generating PDF on the fly             |
 | |
|  +---------------------------------------------------------------------------+
 | |
|  | Copyright (c) 1997-2006 Thomas Merz and PDFlib GmbH. All rights reserved. |
 | |
|  +---------------------------------------------------------------------------+
 | |
|  |                                                                           |
 | |
|  |    This software is subject to the PDFlib license. It is NOT in the       |
 | |
|  |    public domain. Extended versions and commercial licenses are           |
 | |
|  |    available, please check http://www.pdflib.com.                         |
 | |
|  |                                                                           |
 | |
|  *---------------------------------------------------------------------------*/
 | |
| 
 | |
| /* $Id: p_encoding.c,v 1.4 2009-03-23 08:51:17 guy Exp $
 | |
|  *
 | |
|  * PDFlib encoding handling routines
 | |
|  *
 | |
|  */
 | |
| 
 | |
| #include "p_intern.h"
 | |
| #include "p_font.h"
 | |
| 
 | |
| void
 | |
| pdf__encoding_set_char(PDF *p, const char *encoding, int slot,
 | |
|                        const char *glyphname, int uv)
 | |
| {
 | |
|     int enc;
 | |
|     pdc_encodingvector *ev;
 | |
|     char given;
 | |
| 
 | |
|     if (!encoding || !*encoding)
 | |
|         pdc_error(p->pdc, PDC_E_ILLARG_EMPTY, "encoding", 0, 0, 0);
 | |
| 
 | |
|     if (slot < 0 || slot > 255)
 | |
|         pdc_error(p->pdc, PDC_E_ILLARG_INT,
 | |
|             "slot", pdc_errprintf(p->pdc, "%d", slot), 0, 0);
 | |
| 
 | |
|     if (uv < 0 || uv >= PDC_NUM_BMPVAL)
 | |
|         pdc_error(p->pdc, PDC_E_ILLARG_INT,
 | |
|             "uv", pdc_errprintf(p->pdc, "%d", uv), 0, 0);
 | |
| 
 | |
|     if (!glyphname || !*glyphname)
 | |
|     {
 | |
|         if (uv == 0)
 | |
|             pdc_error(p->pdc, PDF_E_ENC_GLYPHORCODE, 0, 0, 0, 0);
 | |
|     }
 | |
| 
 | |
|     for (enc = (int) pdc_invalidenc + 1; enc < (int) pdc_firstvarenc; enc++)
 | |
|     {
 | |
|         if (!strcmp(encoding, pdc_get_fixed_encoding_name((pdc_encoding) enc)))
 | |
|             pdc_error(p->pdc, PDF_E_ENC_CANTCHANGE, encoding, 0, 0, 0);
 | |
|     }
 | |
| 
 | |
|     if (uv == 0)
 | |
|     {
 | |
|         given = 1;
 | |
|         uv = (int) pdc_insert_glyphname(p->pdc, glyphname);
 | |
|     }
 | |
|     else if (!glyphname || !*glyphname)
 | |
|     {
 | |
|         given = 0;
 | |
|         glyphname = pdc_insert_unicode(p->pdc, (pdc_ushort) uv);
 | |
|     }
 | |
|     else
 | |
|     {
 | |
|         const char *reg_glyphname;
 | |
|         pdc_ushort reg_uv;
 | |
|         int retval;
 | |
| 
 | |
|         given = 1;
 | |
|         reg_glyphname = pdc_unicode2glyphname(p->pdc, (pdc_ushort) uv);
 | |
|         if (reg_glyphname)
 | |
|         {
 | |
|             if (strcmp(reg_glyphname, glyphname))
 | |
|             {
 | |
|                 pdc_warning(p->pdc, PDF_E_ENC_BADGLYPH,
 | |
|                     glyphname,
 | |
|                     pdc_errprintf(p->pdc, "%04X", uv),
 | |
|                     reg_glyphname, 0);
 | |
|             }
 | |
| 
 | |
|             /* We take the registered name */
 | |
|         }
 | |
|         else
 | |
|         {
 | |
|             retval = pdc_glyphname2unicode(p->pdc, glyphname);
 | |
|             if (retval > -1)
 | |
|             {
 | |
|                 reg_uv = (pdc_ushort) retval;
 | |
|                 if (reg_uv && reg_uv != (pdc_ushort) uv)
 | |
|                 {
 | |
|                     pdc_error(p->pdc, PDF_E_ENC_BADUNICODE,
 | |
|                         pdc_errprintf(p->pdc, "%04X", uv), glyphname,
 | |
|                         pdc_errprintf(p->pdc, "%04X", reg_uv), 0);
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             /* We register the new glyph name and unicode value */
 | |
|             pdc_register_glyphname(p->pdc, glyphname, (pdc_ushort) uv,
 | |
|                                    pdc_false);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     /* search for a registered encoding */
 | |
|     enc = pdc_find_encoding(p->pdc, encoding);
 | |
| 
 | |
|     /* not found */
 | |
|     if (enc == pdc_invalidenc)
 | |
|     {
 | |
|         ev = pdc_new_encoding(p->pdc, encoding);
 | |
|         ev->flags |= PDC_ENC_USER;
 | |
|         ev->flags |= PDC_ENC_SETNAMES;
 | |
|         ev->flags |= PDC_ENC_ALLOCCHARS;
 | |
| 
 | |
|         enc = pdc_insert_encoding_vector(p->pdc, ev);
 | |
|     }
 | |
| 
 | |
|     /* encoding vector */
 | |
|     ev = pdc_get_encoding_vector(p->pdc, (pdc_encoding)enc);
 | |
|     if (!(ev->flags & PDC_ENC_USER))
 | |
|     {
 | |
| 	pdc_error(p->pdc, PDF_E_ENC_CANTCHANGE, encoding, 0, 0, 0);
 | |
|     }
 | |
|     else if (ev->flags & PDC_ENC_USED)
 | |
|     {
 | |
| 	pdc_error(p->pdc, PDF_E_ENC_INUSE, encoding, 0, 0, 0);
 | |
|     }
 | |
| 
 | |
|     /* Free character name */
 | |
|     if (ev->chars[slot] != NULL)
 | |
|         pdc_free(p->pdc, ev->chars[slot]);
 | |
| 
 | |
|     /* Saving */
 | |
|     ev->codes[slot] = (pdc_ushort) uv;
 | |
|     if (glyphname != NULL)
 | |
|         ev->chars[slot] = pdc_strdup(p->pdc, glyphname);
 | |
|     ev->given[slot] = given;
 | |
| 
 | |
|     pdc_encoding_logg_protocol(p->pdc, ev);
 | |
| }
 | |
| 
 | |
| pdc_encoding
 | |
| pdf_get_hypertextencoding_param(PDF *p, int *codepage)
 | |
| {
 | |
|     if (p->hypertextencoding == pdc_invalidenc)
 | |
|     {
 | |
|         p->hypertextencoding = pdf_get_hypertextencoding(p, "auto",
 | |
|             &p->hypertextcodepage, pdc_true);
 | |
| 
 | |
|         if (p->hypertextencoding == pdc_invalidenc)
 | |
|             pdc_error(p->pdc, -1, 0, 0, 0, 0);
 | |
|     }
 | |
| 
 | |
|     if (codepage)
 | |
|         *codepage = p->hypertextcodepage;
 | |
| 
 | |
|     pdc_logg_cond(p->pdc, 3, trc_encoding,
 | |
|                   "\t\thypertextformat=%d\n"
 | |
|                   "\t\thypertextencoding=%s\n"
 | |
|                   "\t\thypertextcodepage=%d\n",
 | |
|                   p->hypertextformat,
 | |
|                   pdc_get_user_encoding(p->pdc, p->hypertextencoding),
 | |
|                   p->hypertextcodepage);
 | |
| 
 | |
|     return p->hypertextencoding;
 | |
| }
 | |
| 
 | |
| pdc_encoding
 | |
| pdf_get_hypertextencoding(PDF *p, const char *encoding, int *codepage,
 | |
|                           pdc_bool verbose)
 | |
| {
 | |
|     pdc_encoding enc = pdc_invalidenc;
 | |
| 
 | |
|     *codepage = 0;
 | |
| 
 | |
|     if (!*encoding)
 | |
|     {
 | |
|         enc = pdc_unicode;
 | |
|     }
 | |
|     else
 | |
|     {
 | |
|         {
 | |
|             enc = pdc_get_encoding(p->pdc, encoding, codepage, verbose);
 | |
|             if (enc < 0 && enc != pdc_invalidenc && enc != pdc_unicode)
 | |
|             {
 | |
|                 pdc_set_errmsg(p->pdc, PDF_E_ENC_BADHYPTEXTENC, encoding,
 | |
|                                0, 0, 0);
 | |
|                 enc = pdc_invalidenc;
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     return enc;
 | |
| }
 |