// // aegis - project change supervisor // Copyright (C) 1998, 2000, 2002-2006, 2008 Peter Miller // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // This program 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 General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see // . // #include #include #include static int color[3] = { -1, -1, -1 }; static int bevel = -1; static int mime = -1; void rect_color(int r, int g, int b) { if (r < 0) r = 0; if (r > 255) r = 255; if (g < 0) g = 0; if (g > 255) g = 255; if (b < 0) b = 0; if (b > 255) b = 255; color[0] = r; color[1] = g; color[2] = b; } static void rect_color_default(int width, int height) { int n, n1, n2; int r, g, b; r = g = b = 0; n = ((width + height) * 107) % (6 * 256); n1 = n / 256; n2 = n % 256; switch (n1) { case 0: r = 255; g = n2; b = 0; break; case 1: r = 255 - n2; g = 255; b = 0; break; case 2: r = 0; g = 255; b = n2; break; case 3: r = 0; g = 255 - n2; b = 255; break; case 4: r = n2; g = 0; b = 255; break; case 5: r = 255; g = 0; b = 255 - n2; break; } rect_color(r, g, b); } void rect_bevel(int n) { if (n < 0) n = 0; if (n > 10) n = 10; bevel = n; } static void rect_bevel_default(int width, int height) { int n; n = (width < height ? width : height) / 10 + 1; if (n > 3) n = 3; rect_bevel(n); } void rect_mime(int n) { mime = !!n; } void rect(const char *fn, int width, int height, const char *label) { gif_ty *fp; int j; // // correct the size // if (width < 3) width = 3; if (height < 3) height = 3; // // generate a random color, // if the color was not set // if (color[0] < 0 && color[1] < 0 && color[2] < 0) rect_color_default(width, height); // // open the file // fp = gif_create(fn, width, height); if (mime) gif_mime(fp); // // there are two forms, // the 3D beveled form, // and the black outline form // if (bevel < 0) rect_bevel_default(width, height); if (bevel * 2 >= width) bevel = width / 3; if (bevel * 2 >= height) bevel = height / 3; if (bevel) { gif_colormap_set ( fp, 1, (color[0] + 2 * 255) / 3, (color[1] + 2 * 255) / 3, (color[2] + 2 * 255) / 3 ); gif_colormap_set ( fp, 2, color[0], color[1], color[2] ); gif_colormap_set ( fp, 3, color[0] * 2 / 3, color[1] * 2 / 3, color[2] * 2 / 3 ); for (j = 0; j < bevel; ++j) { // top gif_line(fp, j, j, width - 1 - j, j, 1); // left gif_line(fp, j, j, j, height - 1 - j, 1); // bottom gif_line ( fp, j + 1, height - 1 - j, width - 1 - j, height - 1 - j, 3 ); // right gif_line ( fp, width - 1 - j, j + 1, width - 1 - j, height - 1 - j, 3 ); } gif_rect(fp, bevel, bevel, width - bevel, height - bevel, 2); } else { gif_colormap_set ( fp, 1, (color[0] < 128 ? 255 : 0), (color[1] < 128 ? 255 : 0), (color[1] < 128 ? 255 : 0) ); gif_colormap_set ( fp, 2, color[0], color[1], color[2] ); gif_line(fp, 0, 0, width, 0, 1); gif_line(fp, width, 0, width, height, 1); gif_line(fp, width, height - 1, 0, height - 1, 1); gif_line(fp, 0, height - 1, 0, 0, 1); gif_rect(fp, 1, 1, width - 1, height - 1, 2); } if (label) { int gray = 255; int x, y; if (color[0] * 2 + color[1] * 5 + color[2] > 4*255) gray = 0; gif_colormap_set(fp, 4, gray, gray, gray); x = (width - 7 * (int)strlen(label)) / 2; y = (height + 8) / 2; gif_text(fp, x, y, label, 4); } // // finish up // gif_close(fp); }