コード例 #1
0
ファイル: cmap_write.c プロジェクト: shirat74/dvipdfm-x
static CMap *
invert_cmap (CMap *cmap, unsigned char *used_slot)
{
  CMap *icmap;
  unsigned char *codestr;
  unsigned char  range_min[2] = {0x00, 0x00}; /* CID */
  unsigned char  range_max[2] = {0xff, 0xfe}; /* CID */

  cmap = flatten_cmap(cmap);
  ASSERT(cmap);

  icmap = CMap_new();
  CMap_set_type(icmap, CMAP_TYPE_CID_TO_CODE);
  CMap_add_codespacerange(icmap, range_min, range_max, 2);

  if (cmap->mapTbl) {
    codestr = NEW(cmap->profile.maxBytesIn, unsigned char);
    memset(codestr, 0, cmap->profile.maxBytesIn);
    add_inverse_map(icmap, cmap->mapTbl,
		    codestr, 0, used_slot); /* top node */
    RELEASE(codestr);
  }
コード例 #2
0
ファイル: cmap_read.c プロジェクト: Nathan22Miles/sile-0.9.1
int
CMap_parse (CMap *cmap, FILE *fp)
{
  pst_obj  *tok1, *tok2;
  ifreader *input;
  int       status = 0, tmpint = -1;

  ASSERT(cmap && fp);

  input = ifreader_create(fp, file_size(fp), INPUT_BUF_SIZE-1);

  while (status >= 0) {
    tok1 = tok2 = NULL;
    ifreader_read(input, INPUT_BUF_SIZE/2);
    tok1 = pst_get_token(&(input->cursor), input->endptr);
    if (tok1 == NULL)
      break;
    else if (MATCH_NAME(tok1, "CMapName")) {
      if ((tok2 = pst_get_token(&(input->cursor), input->endptr)) == NULL ||
	  !(PST_NAMETYPE(tok2) || PST_STRINGTYPE(tok2)) ||
	  check_next_token(input, "def") < 0)
	status = -1;
      else
	CMap_set_name(cmap, pst_data_ptr(tok2));
    } else if (MATCH_NAME(tok1, "CMapType")) {
      if ((tok2 = pst_get_token(&(input->cursor), input->endptr)) == NULL ||
	  !PST_INTEGERTYPE(tok2) ||
	  check_next_token(input, "def") < 0)
	status = -1;
      else
	CMap_set_type(cmap, pst_getIV(tok2));
    } else if (MATCH_NAME(tok1, "WMode")) {
      if ((tok2 = pst_get_token(&(input->cursor), input->endptr)) == NULL ||
	  !PST_INTEGERTYPE(tok2) ||
	  check_next_token(input, "def") < 0)
	status = -1;
      else
	CMap_set_wmode(cmap, pst_getIV(tok2));
    } else if (MATCH_NAME(tok1, "CIDSystemInfo")) {
      status = do_cidsysteminfo(cmap, input);
    } else if (MATCH_NAME(tok1, "Version") ||
	       MATCH_NAME(tok1, "UIDOffset") ||
	       MATCH_NAME(tok1, "XUID")) {
	/* Ignore */
    } else if (PST_NAMETYPE(tok1)) {
      /* Possibly usecmap comes next */
      if ((tok2 = pst_get_token(&(input->cursor), input->endptr)) != NULL &&
	  MATCH_OP(tok2, "usecmap")) {
	int   id;
	CMap *ucmap;
	id = texpdf_CMap_cache_find(pst_data_ptr(tok1));
	if (id < 0)
	  status = -1;
	else {
	  ucmap = texpdf_CMap_cache_get(id);
	  CMap_set_usecmap(cmap, ucmap);
	}
      }
    } else if (MATCH_OP(tok1, "begincodespacerange")) {
      status = do_codespacerange(cmap, input, tmpint);
    } else if (MATCH_OP(tok1, "beginnotdefrange")) {
      status = do_notdefrange(cmap, input, tmpint);
    } else if (MATCH_OP(tok1, "beginnotdefchar")) {
      status = do_notdefchar(cmap, input, tmpint);
    } else if (MATCH_OP(tok1, "beginbfrange")) {
      status = do_bfrange(cmap, input, tmpint);
    } else if (MATCH_OP(tok1, "beginbfchar")) {
      status =  do_bfchar(cmap, input, tmpint);
    } else if (MATCH_OP(tok1, "begincidrange")) {
      status = do_cidrange(cmap, input, tmpint);
    } else if (MATCH_OP(tok1, "begincidchar")) {
      status =  do_cidchar(cmap, input, tmpint);
    } else if (PST_INTEGERTYPE(tok1)) {
      tmpint = pst_getIV(tok1);
    } /* else Simply ignore */
    if (tok1)
      pst_release_obj(tok1);
    if (tok2)
      pst_release_obj(tok2);
  }

  ifreader_destroy(input);

  return (status < 0) ? -1 : CMap_is_valid(cmap);
}