11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Convert a logo in ASCII PNM format to C source suitable for inclusion in 41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * the Linux kernel 51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * (C) Copyright 2001-2003 by Geert Uytterhoeven <geert@linux-m68k.org> 71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * -------------------------------------------------------------------------- 91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This file is subject to the terms and conditions of the GNU General Public 111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * License. See the file COPYING in the main directory of the Linux 121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * distribution for more details. 131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <ctype.h> 161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <errno.h> 171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <stdarg.h> 181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <stdio.h> 191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <stdlib.h> 201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <string.h> 211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <unistd.h> 221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic const char *programname; 251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic const char *filename; 261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic const char *logoname = "linux_logo"; 271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic const char *outputname; 281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic FILE *out; 291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define LINUX_LOGO_MONO 1 /* monochrome black/white */ 321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define LINUX_LOGO_VGA16 2 /* 16 colors VGA text palette */ 331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define LINUX_LOGO_CLUT224 3 /* 224 colors */ 341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define LINUX_LOGO_GRAY256 4 /* 256 levels grayscale */ 351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic const char *logo_types[LINUX_LOGO_GRAY256+1] = { 371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds [LINUX_LOGO_MONO] = "LINUX_LOGO_MONO", 381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds [LINUX_LOGO_VGA16] = "LINUX_LOGO_VGA16", 391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds [LINUX_LOGO_CLUT224] = "LINUX_LOGO_CLUT224", 401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds [LINUX_LOGO_GRAY256] = "LINUX_LOGO_GRAY256" 411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MAX_LINUX_LOGO_COLORS 224 441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct color { 461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned char red; 471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned char green; 481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned char blue; 491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic const struct color clut_vga16[16] = { 521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 0x00, 0x00, 0x00 }, 531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 0x00, 0x00, 0xaa }, 541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 0x00, 0xaa, 0x00 }, 551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 0x00, 0xaa, 0xaa }, 561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 0xaa, 0x00, 0x00 }, 571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 0xaa, 0x00, 0xaa }, 581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 0xaa, 0x55, 0x00 }, 591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 0xaa, 0xaa, 0xaa }, 601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 0x55, 0x55, 0x55 }, 611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 0x55, 0x55, 0xff }, 621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 0x55, 0xff, 0x55 }, 631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 0x55, 0xff, 0xff }, 641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 0xff, 0x55, 0x55 }, 651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 0xff, 0x55, 0xff }, 661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 0xff, 0xff, 0x55 }, 671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 0xff, 0xff, 0xff }, 681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int logo_type = LINUX_LOGO_CLUT224; 721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic unsigned int logo_width; 731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic unsigned int logo_height; 741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct color **logo_data; 751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct color logo_clut[MAX_LINUX_LOGO_COLORS]; 761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic unsigned int logo_clutsize; 77fc96b211bc6fa917bfb07a8db4cd898663e5f2c6Andreas Bießmannstatic int is_plain_pbm = 0; 781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void die(const char *fmt, ...) 801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds __attribute__ ((noreturn)) __attribute ((format (printf, 1, 2))); 811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void usage(void) __attribute ((noreturn)); 821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic unsigned int get_number(FILE *fp) 851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int c, val; 871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Skip leading whitespace */ 891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds do { 901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds c = fgetc(fp); 911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (c == EOF) 921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds die("%s: end of file\n", filename); 931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (c == '#') { 941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Ignore comments 'till end of line */ 951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds do { 961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds c = fgetc(fp); 971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (c == EOF) 981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds die("%s: end of file\n", filename); 991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } while (c != '\n'); 1001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } while (isspace(c)); 1021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Parse decimal number */ 1041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds val = 0; 1051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds while (isdigit(c)) { 1061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds val = 10*val+c-'0'; 107fc96b211bc6fa917bfb07a8db4cd898663e5f2c6Andreas Bießmann /* some PBM are 'broken'; GiMP for example exports a PBM without space 108fc96b211bc6fa917bfb07a8db4cd898663e5f2c6Andreas Bießmann * between the digits. This is Ok cause we know a PBM can only have a '1' 109fc96b211bc6fa917bfb07a8db4cd898663e5f2c6Andreas Bießmann * or a '0' for the digit. */ 110fc96b211bc6fa917bfb07a8db4cd898663e5f2c6Andreas Bießmann if (is_plain_pbm) 111fc96b211bc6fa917bfb07a8db4cd898663e5f2c6Andreas Bießmann break; 1121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds c = fgetc(fp); 1131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (c == EOF) 1141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds die("%s: end of file\n", filename); 1151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return val; 1171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 1181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic unsigned int get_number255(FILE *fp, unsigned int maxval) 1201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 1211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned int val = get_number(fp); 1221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return (255*val+maxval/2)/maxval; 1231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 1241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void read_image(void) 1261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 1271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds FILE *fp; 1281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned int i, j; 1291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int magic; 1301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned int maxval; 1311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* open image file */ 1331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds fp = fopen(filename, "r"); 1341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!fp) 1351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds die("Cannot open file %s: %s\n", filename, strerror(errno)); 1361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* check file type and read file header */ 1381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds magic = fgetc(fp); 1391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (magic != 'P') 1401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds die("%s is not a PNM file\n", filename); 1411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds magic = fgetc(fp); 1421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds switch (magic) { 1431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case '1': 1441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case '2': 1451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case '3': 1461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Plain PBM/PGM/PPM */ 1471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 1481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case '4': 1501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case '5': 1511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case '6': 1521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Binary PBM/PGM/PPM */ 1531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds die("%s: Binary PNM is not supported\n" 1541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds "Use pnmnoraw(1) to convert it to ASCII PNM\n", filename); 1551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds default: 1571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds die("%s is not a PNM file\n", filename); 1581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds logo_width = get_number(fp); 1601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds logo_height = get_number(fp); 1611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* allocate image data */ 1631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds logo_data = (struct color **)malloc(logo_height*sizeof(struct color *)); 1641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!logo_data) 1651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds die("%s\n", strerror(errno)); 1661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds for (i = 0; i < logo_height; i++) { 1671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds logo_data[i] = malloc(logo_width*sizeof(struct color)); 1681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!logo_data[i]) 1691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds die("%s\n", strerror(errno)); 1701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* read image data */ 1731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds switch (magic) { 1741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case '1': 1751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Plain PBM */ 176fc96b211bc6fa917bfb07a8db4cd898663e5f2c6Andreas Bießmann is_plain_pbm = 1; 1771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds for (i = 0; i < logo_height; i++) 1781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds for (j = 0; j < logo_width; j++) 1791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds logo_data[i][j].red = logo_data[i][j].green = 1801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds logo_data[i][j].blue = 255*(1-get_number(fp)); 1811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 1821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case '2': 1841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Plain PGM */ 1851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds maxval = get_number(fp); 1861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds for (i = 0; i < logo_height; i++) 1871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds for (j = 0; j < logo_width; j++) 1881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds logo_data[i][j].red = logo_data[i][j].green = 1891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds logo_data[i][j].blue = get_number255(fp, maxval); 1901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 1911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case '3': 1931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Plain PPM */ 1941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds maxval = get_number(fp); 1951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds for (i = 0; i < logo_height; i++) 1961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds for (j = 0; j < logo_width; j++) { 1971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds logo_data[i][j].red = get_number255(fp, maxval); 1981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds logo_data[i][j].green = get_number255(fp, maxval); 1991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds logo_data[i][j].blue = get_number255(fp, maxval); 2001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 2011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 2021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 2031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* close file */ 2051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds fclose(fp); 2061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 2071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline int is_black(struct color c) 2091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 2101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return c.red == 0 && c.green == 0 && c.blue == 0; 2111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 2121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline int is_white(struct color c) 2141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 2151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return c.red == 255 && c.green == 255 && c.blue == 255; 2161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 2171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline int is_gray(struct color c) 2191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 2201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return c.red == c.green && c.red == c.blue; 2211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 2221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline int is_equal(struct color c1, struct color c2) 2241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 2251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return c1.red == c2.red && c1.green == c2.green && c1.blue == c2.blue; 2261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 2271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void write_header(void) 2291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 2301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* open logo file */ 2311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (outputname) { 2321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds out = fopen(outputname, "w"); 2331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!out) 2341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds die("Cannot create file %s: %s\n", outputname, strerror(errno)); 2351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } else { 2361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds out = stdout; 2371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 2381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds fputs("/*\n", out); 2401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds fputs(" * DO NOT EDIT THIS FILE!\n", out); 2411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds fputs(" *\n", out); 2421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds fprintf(out, " * It was automatically generated from %s\n", filename); 2431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds fputs(" *\n", out); 2441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds fprintf(out, " * Linux logo %s\n", logoname); 2451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds fputs(" */\n\n", out); 2461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds fputs("#include <linux/linux_logo.h>\n\n", out); 24715e3252464432a29c5461325cb5243471bd2a219Stephen Rothwell fprintf(out, "static unsigned char %s_data[] __initdata = {\n", 2481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds logoname); 2491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 2501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void write_footer(void) 2521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 2531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds fputs("\n};\n\n", out); 254ae52bb2384f721562f15f719de1acb8e934733cbGeert Uytterhoeven fprintf(out, "const struct linux_logo %s __initconst = {\n", logoname); 255ae52bb2384f721562f15f719de1acb8e934733cbGeert Uytterhoeven fprintf(out, "\t.type\t\t= %s,\n", logo_types[logo_type]); 256ae52bb2384f721562f15f719de1acb8e934733cbGeert Uytterhoeven fprintf(out, "\t.width\t\t= %d,\n", logo_width); 257ae52bb2384f721562f15f719de1acb8e934733cbGeert Uytterhoeven fprintf(out, "\t.height\t\t= %d,\n", logo_height); 2581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (logo_type == LINUX_LOGO_CLUT224) { 259ae52bb2384f721562f15f719de1acb8e934733cbGeert Uytterhoeven fprintf(out, "\t.clutsize\t= %d,\n", logo_clutsize); 260ae52bb2384f721562f15f719de1acb8e934733cbGeert Uytterhoeven fprintf(out, "\t.clut\t\t= %s_clut,\n", logoname); 2611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 262ae52bb2384f721562f15f719de1acb8e934733cbGeert Uytterhoeven fprintf(out, "\t.data\t\t= %s_data\n", logoname); 2631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds fputs("};\n\n", out); 2641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* close logo file */ 2661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (outputname) 2671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds fclose(out); 2681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 2691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int write_hex_cnt; 2711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void write_hex(unsigned char byte) 2731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 2741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (write_hex_cnt % 12) 2751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds fprintf(out, ", 0x%02x", byte); 2761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds else if (write_hex_cnt) 2771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds fprintf(out, ",\n\t0x%02x", byte); 2781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds else 2791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds fprintf(out, "\t0x%02x", byte); 2801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds write_hex_cnt++; 2811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 2821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void write_logo_mono(void) 2841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 2851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned int i, j; 2861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned char val, bit; 2871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* validate image */ 2891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds for (i = 0; i < logo_height; i++) 2901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds for (j = 0; j < logo_width; j++) 2911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!is_black(logo_data[i][j]) && !is_white(logo_data[i][j])) 2921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds die("Image must be monochrome\n"); 2931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* write file header */ 2951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds write_header(); 2961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* write logo data */ 2981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds for (i = 0; i < logo_height; i++) { 2991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds for (j = 0; j < logo_width;) { 3001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds for (val = 0, bit = 0x80; bit && j < logo_width; j++, bit >>= 1) 3011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (logo_data[i][j].red) 3021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds val |= bit; 3031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds write_hex(val); 3041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 3051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 3061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* write logo structure and file footer */ 3081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds write_footer(); 3091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 3101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void write_logo_vga16(void) 3121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 3131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned int i, j, k; 3141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned char val; 3151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* validate image */ 3171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds for (i = 0; i < logo_height; i++) 3181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds for (j = 0; j < logo_width; j++) { 3191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds for (k = 0; k < 16; k++) 3201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (is_equal(logo_data[i][j], clut_vga16[k])) 3211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 3221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (k == 16) 3231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds die("Image must use the 16 console colors only\n" 3241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds "Use ppmquant(1) -map clut_vga16.ppm to reduce the number " 3251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds "of colors\n"); 3261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 3271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* write file header */ 3291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds write_header(); 3301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* write logo data */ 3321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds for (i = 0; i < logo_height; i++) 3331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds for (j = 0; j < logo_width; j++) { 3341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds for (k = 0; k < 16; k++) 3351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (is_equal(logo_data[i][j], clut_vga16[k])) 3361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 3371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds val = k<<4; 3381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (++j < logo_width) { 3391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds for (k = 0; k < 16; k++) 3401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (is_equal(logo_data[i][j], clut_vga16[k])) 3411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 3421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds val |= k; 3431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 3441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds write_hex(val); 3451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 3461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* write logo structure and file footer */ 3481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds write_footer(); 3491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 3501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void write_logo_clut224(void) 3521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 3531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned int i, j, k; 3541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* validate image */ 3561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds for (i = 0; i < logo_height; i++) 3571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds for (j = 0; j < logo_width; j++) { 3581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds for (k = 0; k < logo_clutsize; k++) 3591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (is_equal(logo_data[i][j], logo_clut[k])) 3601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 3611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (k == logo_clutsize) { 3621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (logo_clutsize == MAX_LINUX_LOGO_COLORS) 3631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds die("Image has more than %d colors\n" 3641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds "Use ppmquant(1) to reduce the number of colors\n", 3651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds MAX_LINUX_LOGO_COLORS); 3661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds logo_clut[logo_clutsize++] = logo_data[i][j]; 3671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 3681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 3691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* write file header */ 3711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds write_header(); 3721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* write logo data */ 3741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds for (i = 0; i < logo_height; i++) 3751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds for (j = 0; j < logo_width; j++) { 3761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds for (k = 0; k < logo_clutsize; k++) 3771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (is_equal(logo_data[i][j], logo_clut[k])) 3781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 3791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds write_hex(k+32); 3801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 3811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds fputs("\n};\n\n", out); 3821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* write logo clut */ 38415e3252464432a29c5461325cb5243471bd2a219Stephen Rothwell fprintf(out, "static unsigned char %s_clut[] __initdata = {\n", 3851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds logoname); 3861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds write_hex_cnt = 0; 3871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds for (i = 0; i < logo_clutsize; i++) { 3881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds write_hex(logo_clut[i].red); 3891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds write_hex(logo_clut[i].green); 3901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds write_hex(logo_clut[i].blue); 3911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 3921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* write logo structure and file footer */ 3941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds write_footer(); 3951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 3961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void write_logo_gray256(void) 3981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 3991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned int i, j; 4001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* validate image */ 4021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds for (i = 0; i < logo_height; i++) 4031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds for (j = 0; j < logo_width; j++) 4041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!is_gray(logo_data[i][j])) 4051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds die("Image must be grayscale\n"); 4061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* write file header */ 4081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds write_header(); 4091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* write logo data */ 4111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds for (i = 0; i < logo_height; i++) 4121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds for (j = 0; j < logo_width; j++) 4131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds write_hex(logo_data[i][j].red); 4141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* write logo structure and file footer */ 4161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds write_footer(); 4171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 4181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void die(const char *fmt, ...) 4201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 4211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds va_list ap; 4221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds va_start(ap, fmt); 4241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds vfprintf(stderr, fmt, ap); 4251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds va_end(ap); 4261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds exit(1); 4281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 4291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void usage(void) 4311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 4321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds die("\n" 4331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds "Usage: %s [options] <filename>\n" 4341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds "\n" 4351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds "Valid options:\n" 4361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds " -h : display this usage information\n" 4371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds " -n <name> : specify logo name (default: linux_logo)\n" 4381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds " -o <output> : output to file <output> instead of stdout\n" 4391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds " -t <type> : specify logo type, one of\n" 4401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds " mono : monochrome black/white\n" 4411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds " vga16 : 16 colors VGA text palette\n" 4421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds " clut224 : 224 colors (default)\n" 4431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds " gray256 : 256 levels grayscale\n" 4441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds "\n", programname); 4451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 4461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint main(int argc, char *argv[]) 4481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 4491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int opt; 4501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds programname = argv[0]; 4521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds opterr = 0; 4541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds while (1) { 4551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds opt = getopt(argc, argv, "hn:o:t:"); 4561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (opt == -1) 4571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 4581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds switch (opt) { 4601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case 'h': 4611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds usage(); 4621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 4631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case 'n': 4651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds logoname = optarg; 4661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 4671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case 'o': 4691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds outputname = optarg; 4701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 4711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case 't': 4731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!strcmp(optarg, "mono")) 4741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds logo_type = LINUX_LOGO_MONO; 4751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds else if (!strcmp(optarg, "vga16")) 4761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds logo_type = LINUX_LOGO_VGA16; 4771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds else if (!strcmp(optarg, "clut224")) 4781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds logo_type = LINUX_LOGO_CLUT224; 4791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds else if (!strcmp(optarg, "gray256")) 4801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds logo_type = LINUX_LOGO_GRAY256; 4811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds else 4821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds usage(); 4831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 4841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds default: 4861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds usage(); 4871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 4881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 4891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 4901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (optind != argc-1) 4911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds usage(); 4921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds filename = argv[optind]; 4941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds read_image(); 4961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds switch (logo_type) { 4971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case LINUX_LOGO_MONO: 4981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds write_logo_mono(); 4991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 5001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case LINUX_LOGO_VGA16: 5021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds write_logo_vga16(); 5031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 5041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case LINUX_LOGO_CLUT224: 5061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds write_logo_clut224(); 5071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 5081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case LINUX_LOGO_GRAY256: 5101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds write_logo_gray256(); 5111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 5121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 5131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds exit(0); 5141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 515