📄 fl_file_icon2.cxx
字号:
case 6 :
case 9 :
case 12 :
j /= 3;
val[0] = lineptr[0];
val[1] = lineptr[1];
val[2] = '\0';
red = strtol(val, NULL, 16);
val[0] = lineptr[j + 0];
val[1] = lineptr[j + 1];
val[2] = '\0';
green = strtol(val, NULL, 16);
val[0] = lineptr[2 * j + 0];
val[1] = lineptr[2 * j + 1];
val[2] = '\0';
blue = strtol(val, NULL, 16);
break;
}
colors[ch] = fl_rgb_color((uchar)red, (uchar)green, (uchar)blue);
} else {
// Read a color name...
if (strncasecmp(lineptr + 2, "white", 5) == 0) colors[ch] = FL_WHITE;
else if (strncasecmp(lineptr + 2, "black", 5) == 0) colors[ch] = FL_BLACK;
else if (strncasecmp(lineptr + 2, "none", 4) == 0) {
colors[ch] = FL_BLACK;
bg = ch;
} else colors[ch] = FL_GRAY;
}
}
}
// Read the image data...
for (y = 0; y < img->h(); y ++, ptr ++) {
lineptr = *ptr;
startx = 0;
ch = bg;
for (x = 0; x < img->w(); x ++) {
newch = *lineptr++;
if (chars_per_color > 1) newch = (newch << 8) | *lineptr++;
if (newch != ch) {
if (ch != bg) {
add_color(colors[ch]);
add(POLYGON);
add_vertex(startx * 9000 / img->w() + 1000, 9500 - y * 9000 / img->h());
add_vertex(x * 9000 / img->w() + 1000, 9500 - y * 9000 / img->h());
add_vertex(x * 9000 / img->w() + 1000, 9500 - (y + 1) * 9000 / img->h());
add_vertex(startx * 9000 / img->w() + 1000, 9500 - (y + 1) * 9000 / img->h());
add(END);
}
ch = newch;
startx = x;
}
}
if (ch != bg) {
add_color(colors[ch]);
add(POLYGON);
add_vertex(startx * 9000 / img->w() + 1000, 9500 - y * 9000 / img->h());
add_vertex(x * 9000 / img->w() + 1000, 9500 - y * 9000 / img->h());
add_vertex(x * 9000 / img->w() + 1000, 9500 - (y + 1) * 9000 / img->h());
add_vertex(startx * 9000 / img->w() + 1000, 9500 - (y + 1) * 9000 / img->h());
add(END);
}
}
// Free the colormap...
delete[] colors;
}
img->release();
#ifdef DEBUG
printf("Icon File \"%s\":\n", xpm);
for (i = 0; i < num_data_; i ++)
printf(" %d,\n", data_[i]);
#endif // DEBUG
return 0;
}
//
// 'Fl_File_Icon::load_system_icons()' - Load the standard system icons/filetypes.
void
Fl_File_Icon::load_system_icons(void)
{
Fl_File_Icon *icon; // New icons
char filename[1024]; // Filename
static int init = 0; // Have the icons been initialized?
static short plain[] = // Plain file icon
{
COLOR, -1, -1, OUTLINEPOLYGON, 0, FL_GRAY,
VERTEX, 2000, 1000, VERTEX, 2000, 9000,
VERTEX, 6000, 9000, VERTEX, 8000, 7000,
VERTEX, 8000, 1000, END, OUTLINEPOLYGON, 0, FL_GRAY,
VERTEX, 6000, 9000, VERTEX, 6000, 7000,
VERTEX, 8000, 7000, END,
COLOR, 0, FL_BLACK, LINE, VERTEX, 6000, 7000,
VERTEX, 8000, 7000, VERTEX, 8000, 1000,
VERTEX, 2000, 1000, END, LINE, VERTEX, 3000, 7000,
VERTEX, 5000, 7000, END, LINE, VERTEX, 3000, 6000,
VERTEX, 5000, 6000, END, LINE, VERTEX, 3000, 5000,
VERTEX, 7000, 5000, END, LINE, VERTEX, 3000, 4000,
VERTEX, 7000, 4000, END, LINE, VERTEX, 3000, 3000,
VERTEX, 7000, 3000, END, LINE, VERTEX, 3000, 2000,
VERTEX, 7000, 2000, END,
END
};
static short image[] = // Image file icon
{
COLOR, -1, -1, OUTLINEPOLYGON, 0, FL_GRAY,
VERTEX, 2000, 1000, VERTEX, 2000, 9000,
VERTEX, 6000, 9000, VERTEX, 8000, 7000,
VERTEX, 8000, 1000, END, OUTLINEPOLYGON, 0, FL_GRAY,
VERTEX, 6000, 9000, VERTEX, 6000, 7000,
VERTEX, 8000, 7000, END,
COLOR, 0, FL_BLACK, LINE, VERTEX, 6000, 7000,
VERTEX, 8000, 7000, VERTEX, 8000, 1000,
VERTEX, 2000, 1000, END,
COLOR, 0, FL_RED, POLYGON, VERTEX, 3500, 2500,
VERTEX, 3000, 3000, VERTEX, 3000, 4000,
VERTEX, 3500, 4500, VERTEX, 4500, 4500,
VERTEX, 5000, 4000, VERTEX, 5000, 3000,
VERTEX, 4500, 2500, END,
COLOR, 0, FL_GREEN, POLYGON, VERTEX, 5500, 2500,
VERTEX, 5000, 3000, VERTEX, 5000, 4000,
VERTEX, 5500, 4500, VERTEX, 6500, 4500,
VERTEX, 7000, 4000, VERTEX, 7000, 3000,
VERTEX, 6500, 2500, END,
COLOR, 0, FL_BLUE, POLYGON, VERTEX, 4500, 3500,
VERTEX, 4000, 4000, VERTEX, 4000, 5000,
VERTEX, 4500, 5500, VERTEX, 5500, 5500,
VERTEX, 6000, 5000, VERTEX, 6000, 4000,
VERTEX, 5500, 3500, END,
END
};
static short dir[] = // Directory icon
{
COLOR, -1, -1, POLYGON, VERTEX, 1000, 1000,
VERTEX, 1000, 7500, VERTEX, 9000, 7500,
VERTEX, 9000, 1000, END,
POLYGON, VERTEX, 1000, 7500, VERTEX, 2500, 9000,
VERTEX, 5000, 9000, VERTEX, 6500, 7500, END,
COLOR, 0, FL_WHITE, LINE, VERTEX, 1500, 1500,
VERTEX, 1500, 7000, VERTEX, 9000, 7000, END,
COLOR, 0, FL_BLACK, LINE, VERTEX, 9000, 7500,
VERTEX, 9000, 1000, VERTEX, 1000, 1000, END,
COLOR, 0, FL_GRAY, LINE, VERTEX, 1000, 1000,
VERTEX, 1000, 7500, VERTEX, 2500, 9000,
VERTEX, 5000, 9000, VERTEX, 6500, 7500,
VERTEX, 9000, 7500, END,
END
};
// Add symbols if they haven't been added already...
if (!init)
{
// This method requires the images library...
fl_register_images();
if (!kdedir)
{
// Figure out where KDE is installed...
if ((kdedir = getenv("KDEDIR")) == NULL)
{
if (!access("/opt/kde", F_OK))
kdedir = "/opt/kde";
else if (!access("/usr/local/share/mimelnk", F_OK))
kdedir = "/usr/local";
else
kdedir = "/usr";
}
}
snprintf(filename, sizeof(filename), "%s/share/mimelnk", kdedir);
if (!access(filename, F_OK))
{
// Load KDE icons...
icon = new Fl_File_Icon("*", Fl_File_Icon::PLAIN);
snprintf(filename, sizeof(filename),
"%s/share/icons/hicolor/16x16/mimetypes/unknown.png", kdedir);
if (access(filename, F_OK))
snprintf(filename, sizeof(filename), "%s/share/icons/unknown.xpm",
kdedir);
icon->load_image(filename);
icon = new Fl_File_Icon("*", Fl_File_Icon::LINK);
snprintf(filename, sizeof(filename),
"%s/share/icons/hicolor/16x16/filesystems/link.png", kdedir);
if (!access(filename, F_OK))
icon->load_image(filename);
snprintf(filename, sizeof(filename), "%s/share/mimelnk", kdedir);
load_kde_icons(filename);
}
else if (!access("/usr/share/icons/folder.xpm", F_OK))
{
// Load GNOME icons...
icon = new Fl_File_Icon("*", Fl_File_Icon::PLAIN);
icon->load_image("/usr/share/icons/page.xpm");
icon = new Fl_File_Icon("*", Fl_File_Icon::DIRECTORY);
icon->load_image("/usr/share/icons/folder.xpm");
}
else if (!access("/usr/dt/appconfig/icons", F_OK))
{
// Load CDE icons...
icon = new Fl_File_Icon("*", Fl_File_Icon::PLAIN);
icon->load_image("/usr/dt/appconfig/icons/C/Dtdata.m.pm");
icon = new Fl_File_Icon("*", Fl_File_Icon::DIRECTORY);
icon->load_image("/usr/dt/appconfig/icons/C/DtdirB.m.pm");
icon = new Fl_File_Icon("core", Fl_File_Icon::PLAIN);
icon->load_image("/usr/dt/appconfig/icons/C/Dtcore.m.pm");
icon = new Fl_File_Icon("*.{bmp|bw|gif|jpg|pbm|pcd|pgm|ppm|png|ras|rgb|tif|xbm|xpm}", Fl_File_Icon::PLAIN);
icon->load_image("/usr/dt/appconfig/icons/C/Dtimage.m.pm");
icon = new Fl_File_Icon("*.{eps|pdf|ps}", Fl_File_Icon::PLAIN);
icon->load_image("/usr/dt/appconfig/icons/C/Dtps.m.pm");
icon = new Fl_File_Icon("*.ppd", Fl_File_Icon::PLAIN);
icon->load_image("/usr/dt/appconfig/icons/C/DtPrtpr.m.pm");
}
else if (!access("/usr/lib/filetype", F_OK))
{
// Load SGI icons...
icon = new Fl_File_Icon("*", Fl_File_Icon::PLAIN);
icon->load_fti("/usr/lib/filetype/iconlib/generic.doc.fti");
icon = new Fl_File_Icon("*", Fl_File_Icon::DIRECTORY);
icon->load_fti("/usr/lib/filetype/iconlib/generic.folder.closed.fti");
icon = new Fl_File_Icon("core", Fl_File_Icon::PLAIN);
icon->load_fti("/usr/lib/filetype/default/iconlib/CoreFile.fti");
icon = new Fl_File_Icon("*.{bmp|bw|gif|jpg|pbm|pcd|pgm|ppm|png|ras|rgb|tif|xbm|xpm}", Fl_File_Icon::PLAIN);
icon->load_fti("/usr/lib/filetype/system/iconlib/ImageFile.fti");
if (!access("/usr/lib/filetype/install/iconlib/acroread.doc.fti", F_OK))
{
icon = new Fl_File_Icon("*.{eps|ps}", Fl_File_Icon::PLAIN);
icon->load_fti("/usr/lib/filetype/system/iconlib/PostScriptFile.closed.fti");
icon = new Fl_File_Icon("*.pdf", Fl_File_Icon::PLAIN);
icon->load_fti("/usr/lib/filetype/install/iconlib/acroread.doc.fti");
}
else
{
icon = new Fl_File_Icon("*.{eps|pdf|ps}", Fl_File_Icon::PLAIN);
icon->load_fti("/usr/lib/filetype/system/iconlib/PostScriptFile.closed.fti");
}
if (!access("/usr/lib/filetype/install/iconlib/html.fti", F_OK))
{
icon = new Fl_File_Icon("*.{htm|html|shtml}", Fl_File_Icon::PLAIN);
icon->load_fti("/usr/lib/filetype/iconlib/generic.doc.fti");
icon->load_fti("/usr/lib/filetype/install/iconlib/html.fti");
}
if (!access("/usr/lib/filetype/install/iconlib/color.ps.idle.fti", F_OK))
{
icon = new Fl_File_Icon("*.ppd", Fl_File_Icon::PLAIN);
icon->load_fti("/usr/lib/filetype/install/iconlib/color.ps.idle.fti");
}
}
else
{
// Create the default icons...
new Fl_File_Icon("*", Fl_File_Icon::PLAIN, sizeof(plain) / sizeof(plain[0]), plain);
new Fl_File_Icon("*.{bm|bmp|bw|gif|jpg|pbm|pcd|pgm|ppm|png|ras|rgb|tif|xbm|xpm}", Fl_File_Icon::PLAIN,
sizeof(image) / sizeof(image[0]), image);
new Fl_File_Icon("*", Fl_File_Icon::DIRECTORY, sizeof(dir) / sizeof(dir[0]), dir);
}
// Mark things as initialized...
init = 1;
}
}
//
// 'load_kde_icons()' - Load KDE icon files.
//
static void
load_kde_icons(const char *directory) // I - Directory to load
{
int i; // Looping var
int n; // Number of entries in directory
dirent **entries; // Entries in directory
char full[1024]; // Full name of file
entries = (dirent **)0;
n = fl_filename_list(directory, &entries);
for (i = 0; i < n; i ++)
{
if (entries[i]->d_name[0] != '.')
{
snprintf(full, sizeof(full), "%s/%s", directory, entries[i]->d_name);
if (fl_filename_isdir(full))
load_kde_icons(full);
else
load_kde_mimelnk(full);
}
free((void *)entries[i]);
}
free((void*)entries);
}
//
// 'load_kde_mimelnk()' - Load a KDE "mimelnk" file.
//
static void
load_kde_mimelnk(const char *filename)
{
FILE *fp;
char tmp[1024];
char iconfilename[1024];
char pattern[1024];
char mimetype[1024];
char *val;
char full_iconfilename[1024];
Fl_File_Icon *icon;
mimetype[0] = '\0';
pattern[0] = '\0';
iconfilename[0] = '\0';
if ((fp = fopen(filename, "rb")) != NULL)
{
while (fgets(tmp, sizeof(tmp), fp))
{
if ((val = get_kde_val(tmp, "Icon")) != NULL)
strlcpy(iconfilename, val, sizeof(iconfilename));
else if ((val = get_kde_val(tmp, "MimeType")) != NULL)
strlcpy(mimetype, val, sizeof(mimetype));
else if ((val = get_kde_val(tmp, "Patterns")) != NULL)
strlcpy(pattern, val, sizeof(pattern));
}
fclose(fp);
if (iconfilename[0] && (pattern[0] || strncmp(mimetype, "inode/", 6) == 0))
{
snprintf(tmp, sizeof(tmp), "%s/share/icons/hicolor", kdedir);
if (!access(tmp, F_OK))
{
// KDE 2.x icons
int i; // Looping var
static const char *paths[] = { // Subdirs to look in...
"16x16/actions",
"16x16/apps",
"16x16/devices",
"16x16/filesystems",
"16x16/mimetypes",
"22x22/actions",
"22x22/apps",
"22x22/devices",
"22x22/filesystems",
"22x22/mimetypes",
"32x32/actions",
"32x32/apps",
"32x32/devices",
"32x32/filesystems",
"32x32/mimetypes"
};
for (i = 0; i < (int)(sizeof(paths) / sizeof(paths[0])); i ++) {
snprintf(full_iconfilename, sizeof(full_iconfilename),
"%s/%s/%s.png", tmp, paths[i], iconfilename);
if (!access(full_iconfilename, F_OK)) break;
}
if (i >= (int)(sizeof(paths) / sizeof(paths[0]))) return;
} else {
// KDE 1.x icons
snprintf(full_iconfilename, sizeof(full_iconfilename),
"%s/%s", tmp, iconfilename);
if (access(full_iconfilename, F_OK)) return;
}
if (strncmp(mimetype, "inode/", 6) == 0) {
if (strcmp(mimetype + 6, "directory") == 0)
icon = new Fl_File_Icon("*", Fl_File_Icon::DIRECTORY);
else if (strcmp(mimetype + 6, "blockdevice") == 0)
icon = new Fl_File_Icon("*", Fl_File_Icon::DEVICE);
else if (strcmp(mimetype + 6, "fifo") == 0)
icon = new Fl_File_Icon("*", Fl_File_Icon::FIFO);
else return;
} else
icon = new Fl_File_Icon(kde_to_fltk_pattern(pattern), Fl_File_Icon::PLAIN);
icon->load(full_iconfilename);
}
}
}
//
// 'kde_to_fltk_pattern()' - Convert a KDE pattern to a FLTK pattern.
//
static char *
kde_to_fltk_pattern(const char *kdepattern)
{
char *pattern,
*patptr;
pattern = (char *)malloc(strlen(kdepattern) + 3);
strcpy(pattern, "{");
strcpy(pattern + 1, kdepattern);
if (pattern[strlen(pattern) - 1] == ';')
pattern[strlen(pattern) - 1] = '\0';
strcat(pattern, "}");
for (patptr = pattern; *patptr; patptr ++)
if (*patptr == ';')
*patptr = '|';
return (pattern);
}
//
// 'get_kde_val()' - Get a KDE value.
//
static char *
get_kde_val(char *str,
const char *key)
{
while (*str == *key)
{
str ++;
key ++;
}
if (*key == '\0' && *str == '=')
{
if (str[strlen(str) - 1] == '\n')
str[strlen(str) - 1] = '\0';
return (str + 1);
}
return ((char *)0);
}
//
// End of "$Id: Fl_File_Icon2.cxx,v 1.1.1.1 2003/06/03 22:25:42 agno Exp $".
//
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -