cdesktopenv/cde/programs/dtudcexch/udcimp.c

211 lines
5.3 KiB
C

/*
* CDE - Common Desktop Environment
*
* Copyright (c) 1993-2012, The Open Group. All rights reserved.
*
* These libraries and programs are free software; you can
* redistribute them and/or modify them under the terms of the GNU
* Lesser General Public License as published by the Free Software
* Foundation; either version 2 of the License, or (at your option)
* any later version.
*
* These libraries and programs are distributed in the hope that
* they will be useful, but WITHOUT ANY WARRANTY; without even the
* implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU Lesser General Public License for more
* details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with these libraries and programs; if not, write
* to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
* Floor, Boston, MA 02110-1301 USA
*/
/* $XConsortium: udcimp.c /main/4 1996/09/02 18:51:02 cde-fuj $ */
/*
* (c) Copyright 1995 FUJITSU LIMITED
* This is source code modified by FUJITSU LIMITED under the Joint
* Development Agreement for the CDEnext PST.
* This is unpublished proprietary source code of FUJITSU LIMITED
*/
#include "excutil.h"
#include "FaLib.h"
void addcharptn();
void setcodelists();
extern ListData *ld;
extern int num_gr;
extern FalGlyphRegion *gr;
extern FalFontData fullFontData;
void udcimp(Exc_data * ed)
{
ed->function = IMPORT;
strcpy(ed->bdfmode,"r");
getbdffn(ed);
}
int checkcode(int code)
{
int i, j;
int code1, code2;
for (i = 0; i < num_gr; i++) {
code1 = smaller(gr[i].start, gr[i].end);
code2 = bigger(gr[i].start, gr[i].end);
if ((code >= code1) && (code <= code2)) { /*in udc area */
for (j = 0; j < ld->existcode_num; j++) {
if (code == ld->existcode[j])
return (1); /* the font has same glyph index */
}
return (0);
}
}
return (-1); /* out of udc area */
}
int checkcodes(int code_num, int * code_list)
{
int *codep;
int i, ans;
int exist = 0;
codep = code_list;
for (i = 0; i < code_num; i++) {
ans = checkcode(*codep);
if (ans == -1) {
return (-1);
} else if (ans == 1) {
exist = 1;
}
codep++;
}
return (exist);
}
void getcharcd(Exc_data * ed)
{
int code_num;
int *code_list;
int i;
char *msg;
char *msg2;
char *msg3;
int ans, ans2;
msg = GETMESSAGE(12, 2, "Glyph images in this BDF file can't be added to the font.");
msg2 = GETMESSAGE(12, 4, "Failed to open the selected BDF font. You have no right to access for the font file, or the format of the file is not consistent.");
msg3 = GETMESSAGE(12, 6, "There are one or more glyph images being overwritten. Overwrite?");
i = ImpBDFCodeList(ed->bdffile, &code_num, &code_list);
if (i != 0) { /* bad BDF format */
AskUser(ed->toplevel, ed, msg2, &ans, "error");
freeld(ld);
excterminate(ed);
}
ans2 = checkcodes(code_num, code_list);
if (ans2 == -1) { /* out of UDC code exists */
AskUser(ed->toplevel, ed, msg, &ans, "error");
freeld(ld);
excterminate(ed);
} else if (ans2 == 1) { /* font file has same glyph index */
AskUser(ed->toplevel, ed, msg3, &ans, "warning");
if (ans != 1) {
freeld(ld);
excterminate(ed);
}
}
/* set twe codelists */
setcodelists(ld, code_num, code_list);
if (ImpBDFCodeListFree(&code_list) != 0) {
fprintf(stderr,"error in ImpBDFCodeListFree\n");
}
/* add gryph images to font */
addcharptn(ed);
}
void addcharptn(Exc_data * ed)
{
int i;
int ans;
char *msg;
char *msg2;
char *msg3;
int mask;
FalFontDataList *fulllist = NULL;
FalFontID fontid;
msg = GETMESSAGE(12, 8, "Failed to open the selected font. You have no right to access for the font file, or the format of the file is not consistent.");
msg2 = GETMESSAGE(12, 10, "Glyph images in this BDF file can't be added to the font.");
msg3 = GETMESSAGE(12, 12, "Failed in the registration of the font file.");
mask = FAL_FONT_MASK_XLFDNAME | FAL_FONT_MASK_GLYPH_INDEX |
FAL_FONT_MASK_DEFINED | FAL_FONT_MASK_UPDATE |
FAL_FONT_MASK_UNDEFINED | FAL_FONT_MASK_CODE_SET;
i = ImpBDFCheck(ed->bdffile, ed->fontfile);
if (i != 0) {
AskUser(ed->toplevel, ed, msg2, &ans, "error");
excterminate(ed);
}
fontid = FalOpenSysFont(&fullFontData, mask, &fulllist);
if (fontid == 0) {
AskUser(ld->ed->toplevel, ld->ed, msg, &ans, "error");
excterminate(ed);
}
i = 0;
i = ImpBDFtoGpf(ed->bdffile, ed->fontfile,
ed->code_num, ed->bdf_code_list);
FalCloseFont( fontid );
if (i != 0) {
AskUser(ed->toplevel, ed, msg3, &ans, "error");
}
excterminate(ed);
}
void setcodelists(ListData *ld, int code_num, int *code_list)
{
int *c1, *c2;
int i;
Exc_data *ed;
ld->ed->code_num = code_num;
if ((c1 = (int *) calloc(code_num, sizeof(int))) == NULL) {
ed = ld->ed;
freeld(ld);
excerror(ed, EXCERRMALLOC, "setcodelists", "exit");
}
ld->ed->bdf_code_list = c1;
c2 = code_list;
for (i = 0; i < code_num; i++)
{
*c1 = *c2;
c1++;
c2++;
}
if ((c1 = (int *) calloc(code_num, sizeof(int))) == NULL) {
ed = ld->ed;
freeld(ld);
excerror(ed, EXCERRMALLOC, "setcodelists", "exit");
}
ld->ed->gpf_code_list = c1;
c2 = code_list;
for (i = 0; i < code_num; i++)
{
*c1 = *c2;
c1++;
c2++;
}
}