1 /*
    2  * << Haru Free PDF Library >> -- hpdf_encoder.h
    3  *
    4  * URL: http://libharu.org
    5  *
    6  * Copyright (c) 1999-2006 Takeshi Kanno <takeshi_kanno@est.hi-ho.ne.jp>
    7  * Copyright (c) 2007-2009 Antony Dovgal <tony@daylessday.org>
    8  *
    9  * Permission to use, copy, modify, distribute and sell this software
   10  * and its documentation for any purpose is hereby granted without fee,
   11  * provided that the above copyright notice appear in all copies and
   12  * that both that copyright notice and this permission notice appear
   13  * in supporting documentation.
   14  * It is provided "as is" without express or implied warranty.
   15  *
   16  */
   17 
   18 #ifndef _HPDF_ENCODER_H
   19 #define _HPDF_ENCODER_H
   20 
   21 #include "hpdf_consts.h"
   22 #include "hpdf_streams.h"
   23 
   24 #ifdef __cplusplus
   25 extern "C" {
   26 #endif
   27 
   28 /*-- HPDF_Encoder ---------------------------------------*/
   29 
   30 #define HPDF_ENCODER_SIG_BYTES 0x454E4344L
   31 
   32 /*----------------------------------------------------------------------------*/
   33 /*------ predefined font encodings -------------------------------------------*/
   34 
   35 #define  HPDF_ENCODING_FONT_SPECIFIC  "FontSpecific"
   36 #define  HPDF_ENCODING_STANDARD       "StandardEncoding"
   37 #define  HPDF_ENCODING_MAC_ROMAN      "MacRomanEncoding"
   38 #define  HPDF_ENCODING_WIN_ANSI       "WinAnsiEncoding"
   39 #define  HPDF_ENCODING_ISO8859_2      "ISO8859-2"
   40 #define  HPDF_ENCODING_ISO8859_3      "ISO8859-3"
   41 #define  HPDF_ENCODING_ISO8859_4      "ISO8859-4"
   42 #define  HPDF_ENCODING_ISO8859_5      "ISO8859-5"
   43 #define  HPDF_ENCODING_ISO8859_6      "ISO8859-6"
   44 #define  HPDF_ENCODING_ISO8859_7      "ISO8859-7"
   45 #define  HPDF_ENCODING_ISO8859_8      "ISO8859-8"
   46 #define  HPDF_ENCODING_ISO8859_9      "ISO8859-9"
   47 #define  HPDF_ENCODING_ISO8859_10     "ISO8859-10"
   48 #define  HPDF_ENCODING_ISO8859_11     "ISO8859-11"
   49 #define  HPDF_ENCODING_ISO8859_13     "ISO8859-13"
   50 #define  HPDF_ENCODING_ISO8859_14     "ISO8859-14"
   51 #define  HPDF_ENCODING_ISO8859_15     "ISO8859-15"
   52 #define  HPDF_ENCODING_ISO8859_16     "ISO8859-16"
   53 #define  HPDF_ENCODING_CP1250         "CP1250"
   54 #define  HPDF_ENCODING_CP1251         "CP1251"
   55 #define  HPDF_ENCODING_CP1252         "CP1252"
   56 #define  HPDF_ENCODING_CP1253         "CP1253"
   57 #define  HPDF_ENCODING_CP1254         "CP1254"
   58 #define  HPDF_ENCODING_CP1255         "CP1255"
   59 #define  HPDF_ENCODING_CP1256         "CP1256"
   60 #define  HPDF_ENCODING_CP1257         "CP1257"
   61 #define  HPDF_ENCODING_CP1258         "CP1258"
   62 #define  HPDF_ENCODING_KOI8_R         "KOI8-R"
   63 
   64 /*----------------------------------------------------------------------------*/
   65 /*----- definition for font encoding -----------------------------------------*/
   66 
   67 #define char_NOTDEF        ".notdef"
   68 
   69 typedef enum _HPDF_EncodingType {
   70     HPDF_STANDARD_ENCODING = 0,
   71     HPDF_MAC_ROMAN_ENCODING,
   72     HPDF_WIN_ANSI_ENCODING,
   73     HPDF_FONT_SPECIFIC,
   74     HPDF_ENCODING_EOF
   75 } HPDF_EncodingType;
   76 
   77 
   78 typedef struct _HPDF_ParseText_Rec {
   79     const HPDF_BYTE  *text;
   80     HPDF_UINT        index;
   81     HPDF_UINT        len;
   82     HPDF_ByteType    byte_type;
   83 } HPDF_ParseText_Rec;
   84 
   85 
   86 typedef struct _HPDF_Encoder_Rec *HPDF_Encoder;
   87 
   88 typedef HPDF_ByteType
   89 (*HPDF_Encoder_ByteType_Func)  (HPDF_Encoder        encoder,
   90                                 HPDF_ParseText_Rec  *state);
   91 
   92 typedef HPDF_UNICODE
   93 (*HPDF_Encoder_ToUnicode_Func)  (HPDF_Encoder   encoder,
   94                                  HPDF_UINT16    code);
   95 
   96 typedef char *
   97 (*HPDF_Encoder_EncodeText_Func)  (HPDF_Encoder  encoder,
   98 				  const char   *text,
   99 				  HPDF_UINT     len,
  100 				  HPDF_UINT    *encoded_length);
  101 
  102 typedef HPDF_STATUS
  103 (*HPDF_Encoder_Write_Func)  (HPDF_Encoder  encoder,
  104                              HPDF_Stream   out);
  105 
  106 
  107 typedef HPDF_STATUS
  108 (*HPDF_Encoder_Init_Func)  (HPDF_Encoder  encoder);
  109 
  110 
  111 typedef void
  112 (*HPDF_Encoder_Free_Func)  (HPDF_Encoder  encoder);
  113 
  114 
  115 typedef struct  _HPDF_Encoder_Rec {
  116     HPDF_UINT32                     sig_bytes;
  117     char                            name[HPDF_LIMIT_MAX_NAME_LEN + 1];
  118     HPDF_MMgr                       mmgr;
  119     HPDF_Error                      error;
  120     HPDF_EncoderType                type;
  121 
  122     HPDF_Encoder_ByteType_Func      byte_type_fn;
  123     HPDF_Encoder_ToUnicode_Func     to_unicode_fn;
  124     HPDF_Encoder_EncodeText_Func    encode_text_fn;
  125     HPDF_Encoder_Write_Func         write_fn;
  126     HPDF_Encoder_Free_Func          free_fn;
  127     HPDF_Encoder_Init_Func          init_fn;
  128     /*
  129     char                         lang_code[3];
  130     char                         country_code[3];
  131     */
  132     void                            *attr;
  133 }  HPDF_Encoder_Rec;
  134 
  135 
  136 typedef enum _HPDF_BaseEncodings {
  137     HPDF_BASE_ENCODING_STANDARD,
  138     HPDF_BASE_ENCODING_WIN_ANSI,
  139     HPDF_BASE_ENCODING_MAC_ROMAN,
  140     HPDF_BASE_ENCODING_FONT_SPECIFIC,
  141     HPDF_BASE_ENCODING_EOF
  142 } HPDF_BaseEncodings;
  143 
  144 HPDF_STATUS
  145 HPDF_Encoder_Validate  (HPDF_Encoder  encoder);
  146 
  147 void
  148 HPDF_Encoder_SetParseText  (HPDF_Encoder        encoder,
  149                             HPDF_ParseText_Rec  *state,
  150                             const HPDF_BYTE     *text,
  151                             HPDF_UINT           len);
  152 
  153 HPDF_ByteType
  154 HPDF_Encoder_ByteType  (HPDF_Encoder        encoder,
  155                         HPDF_ParseText_Rec  *state);
  156 
  157 
  158 
  159 HPDF_UNICODE
  160 HPDF_Encoder_ToUnicode  (HPDF_Encoder     encoder,
  161                          HPDF_UINT16      code);
  162 
  163 
  164 void
  165 HPDF_Encoder_Free  (HPDF_Encoder  encoder);
  166 
  167 /*-- HPDF_BasicEncoder ----------------------------------*/
  168 
  169 
  170 typedef struct _HPDF_BasicEncoderAttr_Rec  *HPDF_BasicEncoderAttr;
  171 
  172 typedef struct  _HPDF_BasicEncoderAttr_Rec {
  173       char           base_encoding[HPDF_LIMIT_MAX_NAME_LEN + 1];
  174       HPDF_BYTE           first_char;
  175       HPDF_BYTE           last_char;
  176       HPDF_UNICODE        unicode_map[256];
  177       HPDF_BOOL           has_differences;
  178       HPDF_BYTE           differences[256];
  179 } HPDF_BasicEncoderAttr_Rec;
  180 
  181 
  182 HPDF_Encoder
  183 HPDF_BasicEncoder_New  (HPDF_MMgr        mmgr,
  184                         const char  *encoding_name);
  185 
  186 
  187 void
  188 HPDF_BasicEncoder_Free  (HPDF_Encoder  encoder);
  189 
  190 
  191 HPDF_STATUS
  192 HPDF_BasicEncoder_Write  (HPDF_Encoder  encoder,
  193                           HPDF_Stream   out);
  194 
  195 
  196 HPDF_UNICODE
  197 HPDF_BasicEncoder_ToUnicode (HPDF_Encoder   encoder,
  198                              HPDF_UINT16    code);
  199 
  200 /*-- HPDF_CMapEncoder ----------------------------------*/
  201 
  202 typedef HPDF_BOOL
  203 (*HPDF_CMapEncoder_ByteType_Func)  (HPDF_Encoder  encoder,
  204                                     HPDF_BYTE     b);
  205 
  206 typedef struct _HPDF_CidRange_Rec {
  207     HPDF_UINT16  from;
  208     HPDF_UINT16  to;
  209     HPDF_UINT16  cid;
  210 } HPDF_CidRange_Rec;
  211 
  212 
  213 typedef struct _HPDF_UnicodeMap_Rec {
  214     HPDF_UINT16  code;
  215     HPDF_UINT16  unicode;
  216 } HPDF_UnicodeMap_Rec;
  217 
  218 typedef struct _HPDF_CMapEncoderAttr_Rec  *HPDF_CMapEncoderAttr;
  219 
  220 typedef struct  _HPDF_CMapEncoderAttr_Rec {
  221       HPDF_UNICODE                     unicode_map[256][256];
  222       HPDF_UINT16                      cid_map[256][256];
  223       HPDF_UINT16                      jww_line_head[HPDF_MAX_JWW_NUM];
  224       HPDF_List                        cmap_range;
  225       HPDF_List                        notdef_range;
  226       HPDF_List                        code_space_range;
  227       HPDF_WritingMode                 writing_mode;
  228       char                             registry[HPDF_LIMIT_MAX_NAME_LEN + 1];
  229       char                             ordering[HPDF_LIMIT_MAX_NAME_LEN + 1];
  230       HPDF_INT                         suppliment;
  231       HPDF_CMapEncoder_ByteType_Func   is_lead_byte_fn;
  232       HPDF_CMapEncoder_ByteType_Func   is_trial_byte_fn;
  233       HPDF_INT                         uid_offset;
  234       HPDF_UINT                        xuid[3];
  235 } HPDF_CMapEncoderAttr_Rec;
  236 
  237 
  238 HPDF_Encoder
  239 HPDF_CMapEncoder_New  (HPDF_MMgr                mmgr,
  240                        char                    *name,
  241                        HPDF_Encoder_Init_Func   init_fn);
  242 
  243 
  244 HPDF_STATUS
  245 HPDF_CMapEncoder_InitAttr  (HPDF_Encoder  encoder);
  246 
  247 
  248 void
  249 HPDF_CMapEncoder_Free  (HPDF_Encoder   encoder);
  250 
  251 
  252 HPDF_STATUS
  253 HPDF_CMapEncoder_Write  (HPDF_Encoder   encoder,
  254                          HPDF_Stream    out);
  255 
  256 
  257 HPDF_UNICODE
  258 HPDF_CMapEncoder_ToUnicode  (HPDF_Encoder   encoder,
  259                              HPDF_UINT16    code);
  260 
  261 HPDF_UINT16
  262 HPDF_CMapEncoder_ToCID  (HPDF_Encoder   encoder,
  263                          HPDF_UINT16    code);
  264 
  265 HPDF_STATUS
  266 HPDF_CMapEncoder_SetParseText  (HPDF_Encoder         encoder,
  267                                 HPDF_ParseText_Rec  *state,
  268                                 const HPDF_BYTE     *text,
  269                                 HPDF_UINT            len);
  270 
  271 HPDF_ByteType
  272 HPDF_CMapEncoder_ByteType  (HPDF_Encoder         encoder,
  273                             HPDF_ParseText_Rec  *state);
  274 
  275 
  276 HPDF_STATUS
  277 HPDF_CMapEncoder_AddCMap  (HPDF_Encoder              encoder,
  278                            const HPDF_CidRange_Rec  *range);
  279 
  280 
  281 HPDF_STATUS
  282 HPDF_CMapEncoder_AddNotDefRange  (HPDF_Encoder        encoder,
  283                                   HPDF_CidRange_Rec   range);
  284 
  285 
  286 HPDF_STATUS
  287 HPDF_CMapEncoder_AddCodeSpaceRange  (HPDF_Encoder        encoder,
  288                                      HPDF_CidRange_Rec   range);
  289 
  290 
  291 void
  292 HPDF_CMapEncoder_SetUnicodeArray  (HPDF_Encoder                 encoder,
  293                                    const HPDF_UnicodeMap_Rec  *array1);
  294 
  295 
  296 HPDF_STATUS
  297 HPDF_CMapEncoder_AddJWWLineHead  (HPDF_Encoder        encoder,
  298                                   const HPDF_UINT16  *code);
  299 
  300 HPDF_BOOL
  301 HPDF_Encoder_CheckJWWLineHead  (HPDF_Encoder        encoder,
  302                                 const HPDF_UINT16   code);
  303 
  304 /*-- utility functions ----------------------------------*/
  305 
  306 const char*
  307 HPDF_UnicodeToGryphName  (HPDF_UNICODE  unicode);
  308 
  309 
  310 HPDF_UNICODE
  311 HPDF_GryphNameToUnicode  (const char  *gryph_name);
  312 
  313 #ifdef __cplusplus
  314 }
  315 #endif /* __cplusplus */
  316 
  317 #endif /* _HPDF_ENCODER_H */
  318