/************************************************************************* * * OpenOffice.org - a multi-platform office productivity suite * * $RCSfile: himgutil.cpp,v $ * * $Revision: 1.3 $ * * last change: $Author: rt $ $Date: 2005-09-07 16:35:01 $ * * The Contents of this file are made available subject to * the terms of GNU Lesser General Public License Version 2.1. * * * GNU Lesser General Public License Version 2.1 * ============================================= * Copyright 2005 by Sun Microsystems, Inc. * 901 San Antonio Road, Palo Alto, CA 94303, USA * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License version 2.1, as published by the Free Software Foundation. * * This library is distributed in the hope that it 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 this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, * MA 02111-1307 USA * ************************************************************************/ #include "precompile.h" #include #include #include #include "hwplib.h" #include "htags.h" #include "himgutil.h" const char *GetPictureFilename(const char *picname) { #ifdef _WIN32 return picname; #else /* UNIX */ static char fname[256], *ptr; if (picname[1] == ':') ptr = strcpy(fname, picname + 3); else ptr = strcpy(fname, picname); while (*ptr) { if (*ptr == '\\') *ptr = DIRSEP; ptr++; } if (access(fname, 0) != -1) return fname; else if ((ptr = strrchr(fname, DIRSEP)) && access(ptr + 1, 0) != -1) return ptr + 1; /* ¼Ò¹®ÀÚ·Î */ ptr = fname; while (*ptr) { *ptr = tolower(*ptr); ptr++; } if (access(fname, 0) != -1) return fname; else if ((ptr = strrchr(fname, '/')) && access(ptr + 1, 0) != -1) return ptr + 1; return 0; #endif /* !_WIN32 */ } static int ImageMagicType(const uchar * magicno) { int rv = RFT_UNKNOWN; if (strncmp((char *) magicno, "GIF87a", 6) == 0 || strncmp((char *) magicno, "GIF89a", 6) == 0) rv = RFT_GIF; else if (strncmp((char *) magicno, "VIEW", 4) == 0 || strncmp((char *) magicno, "WEIV", 4) == 0) rv = RFT_PM; else if (magicno[0] == 'P' && magicno[1] >= '1' && magicno[1] <= '6') rv = RFT_PBM; /* note: have to check XPM before XBM, as first 2 chars are the same */ else if (strncmp((char *) magicno, "/* XPM */", 9) == 0) rv = RFT_XPM; else if (strncmp((char *) magicno, "#define", 7) == 0 || (magicno[0] == '/' && magicno[1] == '*')) rv = RFT_XBM; else if (magicno[0] == 0x59 && (magicno[1] & 0x7f) == 0x26 && magicno[2] == 0x6a && (magicno[3] & 0x7f) == 0x15) rv = RFT_SUNRAS; else if (magicno[0] == 'B' && magicno[1] == 'M') rv = RFT_BMP; else if (magicno[0] == 0x52 && magicno[1] == 0xcc) rv = RFT_UTAHRLE; else if ((magicno[0] == 0x01 && magicno[1] == 0xda) || (magicno[0] == 0xda && magicno[1] == 0x01)) rv = RFT_IRIS; else if (magicno[0] == 0x1f && magicno[1] == 0x9d) rv = RFT_COMPRESS; else if (magicno[0] == 0x0a && magicno[1] <= 5) rv = RFT_PCX; else if (strncmp((char *) magicno, "FORM", 4) == 0 && strncmp((char *) magicno + 8, "ILBM", 4) == 0) rv = RFT_IFF; else if (magicno[0] == 0 && magicno[1] == 0 && magicno[2] == 2 && magicno[3] == 0 && magicno[4] == 0 && magicno[5] == 0 && magicno[6] == 0 && magicno[7] == 0) rv = RFT_TARGA; else if (magicno[4] == 0x00 && magicno[5] == 0x00 && magicno[6] == 0x00 && magicno[7] == 0x07) rv = RFT_XWD; else if (strncmp((char *) magicno, "SIMPLE ", 8) == 0 && magicno[29] == 'T') rv = RFT_FITS; else if (magicno[0] == 0xff && magicno[1] == 0xd8 && magicno[2] == 0xff) rv = RFT_JFIF; else if ((magicno[0] == 'M' && magicno[1] == 'M') || (magicno[0] == 'I' && magicno[1] == 'I')) rv = RFT_TIFF; else if (strncmp((char *) magicno, "%!", 2) == 0 || strncmp((char *) magicno, "\004%!", 3) == 0) rv = RFT_PS; else if (strncmp((char *) magicno, "\xd7\xcd\xc6\x9a", 4) == 0 || strncmp((char *) magicno, "\x01\x00\x09\x00\x00\x03", 6) == 0) rv = RFT_WMF; return rv; } int ReadFileType(const char *fname) { FILE *fp; uchar magicno[30]; /* first 30 bytes of file */ int n; if (!fname) return RFT_ERROR; /* shouldn't happen */ fp = fopen(fname, "rb"); if (!fp) return RFT_ERROR; n = fread(magicno, 1, 30, fp); fclose(fp); if (n < 30) return RFT_UNKNOWN; /* files less than 30 bytes long... */ return ImageMagicType(magicno); } const char *GetEmbImgname(const EmPicture * empic) { static char fname[256]; char *ptr, *ext; tmpnam(fname); if (!empic || !empic->name[0] || !(ptr = strrchr(fname, DIRSEP))) return NULL; switch (ImageMagicType((uchar *) empic->data)) { case RFT_GIF: ext = "gif"; break; case RFT_PM: ext = "pm"; break; case RFT_PBM: ext = "pbm"; break; case RFT_XBM: ext = "xbm"; break; case RFT_SUNRAS: ext = "ras"; break; case RFT_BMP: ext = "bmp"; break; case RFT_UTAHRLE: ext = "rle"; break; case RFT_PCX: ext = "pcx"; break; case RFT_JFIF: ext = "jpg"; break; case RFT_TIFF: ext = "tif"; break; case RFT_PDSVICAR: ext = "pds"; break; case RFT_PS: ext = "ps"; break; case RFT_IFF: ext = "iff"; break; case RFT_TARGA: ext = "tga"; break; case RFT_XPM: ext = "xpm"; break; case RFT_XWD: ext = "xwd"; break; case RFT_WMF: ext = "wmf"; break; default: ext = "666"; break; }; sprintf(ptr + 1, "mz_%s.%s", empic->name, ext); return fname; }