X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Futil%2Fcommon.c;h=f6fa36e32c2c0f8cbbfaeda9f339809c4db1f880;hb=b0daed8dd52ebaa40fa993e5b9f23c823937c120;hp=31c2d2eb2d67cafc67d39777bde97a41f9da5672;hpb=883046095800fc78649d943d2b0da22f8732d31e;p=chaz%2Ftint2 diff --git a/src/util/common.c b/src/util/common.c index 31c2d2e..f6fa36e 100644 --- a/src/util/common.c +++ b/src/util/common.c @@ -3,7 +3,7 @@ * Tint2 : common windows function * * Copyright (C) 2007 PÃ¥l Staurland (staura@gmail.com) -* Modified (C) 2008 thierry lorthiois (lorthiois@bbsoft.fr) +* Modified (C) 2008 thierry lorthiois (lorthiois@bbsoft.fr) from Omega distribution * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License version 2 @@ -21,30 +21,186 @@ #include #include #include +#include #include #include #include - +#include #include "common.h" +#include "../server.h" + + + +void copy_file(const char *pathSrc, const char *pathDest) +{ + FILE *fileSrc, *fileDest; + char line[100]; + int nb; + + fileSrc = fopen(pathSrc, "rb"); + if (fileSrc == NULL) return; + + fileDest = fopen(pathDest, "wb"); + if (fileDest == NULL) return; + + while ((nb = fread(line, 1, 100, fileSrc)) > 0) + if ( nb != fwrite(line, 1, nb, fileDest)) + printf("Error while copying file %s to %s\n", pathSrc, pathDest); + + fclose (fileDest); + fclose (fileSrc); +} + + +int parse_line (const char *line, char **key, char **value) +{ + char *a, *b; + + /* Skip useless lines */ + if ((line[0] == '#') || (line[0] == '\n')) return 0; + if (!(a = strchr (line, '='))) return 0; + /* overwrite '=' with '\0' */ + a[0] = '\0'; + *key = strdup (line); + a++; + + /* overwrite '\n' with '\0' if '\n' present */ + if ((b = strchr (a, '\n'))) b[0] = '\0'; + + *value = strdup (a); + + g_strstrip(*key); + g_strstrip(*value); + return 1; +} -void adjust_hsb(unsigned int *data, int w, int h, float hu, float satur, float bright) +void tint_exec(const char *command) { - unsigned int *pt = data; - int x, y; + if (command) { + pid_t pid; + pid = fork(); + if (pid == 0) { + // change for the fork the signal mask +// sigset_t sigset; +// sigprocmask(SIG_SETMASK, &sigset, 0); +// sigprocmask(SIG_UNBLOCK, &sigset, 0); + execl("/bin/sh", "/bin/sh", "-c", command, NULL); + _exit(0); + } + } +} + + +int hex_char_to_int (char c) +{ + int r; + + if (c >= '0' && c <= '9') r = c - '0'; + else if (c >= 'a' && c <= 'f') r = c - 'a' + 10; + else if (c >= 'A' && c <= 'F') r = c - 'A' + 10; + else r = 0; + + return r; +} + + +int hex_to_rgb (char *hex, int *r, int *g, int *b) +{ + int len; + + if (hex == NULL || hex[0] != '#') return (0); + + len = strlen (hex); + if (len == 3 + 1) { + *r = hex_char_to_int (hex[1]); + *g = hex_char_to_int (hex[2]); + *b = hex_char_to_int (hex[3]); + } + else if (len == 6 + 1) { + *r = hex_char_to_int (hex[1]) * 16 + hex_char_to_int (hex[2]); + *g = hex_char_to_int (hex[3]) * 16 + hex_char_to_int (hex[4]); + *b = hex_char_to_int (hex[5]) * 16 + hex_char_to_int (hex[6]); + } + else if (len == 12 + 1) { + *r = hex_char_to_int (hex[1]) * 16 + hex_char_to_int (hex[2]); + *g = hex_char_to_int (hex[5]) * 16 + hex_char_to_int (hex[6]); + *b = hex_char_to_int (hex[9]) * 16 + hex_char_to_int (hex[10]); + } + else return 0; + + return 1; +} + + +void get_color (char *hex, double *rgb) +{ + int r, g, b; + hex_to_rgb (hex, &r, &g, &b); + + rgb[0] = (r / 255.0); + rgb[1] = (g / 255.0); + rgb[2] = (b / 255.0); +} + + +void extract_values (const char *value, char **value1, char **value2, char **value3) +{ + char *b=0, *c=0; + + if (*value1) free (*value1); + if (*value2) free (*value2); + if (*value3) free (*value3); + + if ((b = strchr (value, ' '))) { + b[0] = '\0'; + b++; + } + else { + *value2 = 0; + *value3 = 0; + } + *value1 = strdup (value); + g_strstrip(*value1); + + if (b) { + if ((c = strchr (b, ' '))) { + c[0] = '\0'; + c++; + } + else { + c = 0; + *value3 = 0; + } + *value2 = strdup (b); + g_strstrip(*value2); + } + + if (c) { + *value3 = strdup (c); + g_strstrip(*value3); + } +} + + +void adjust_asb(DATA32 *data, int w, int h, int alpha, float satur, float bright) +{ + unsigned int x, y; unsigned int a, r, g, b, argb; + unsigned long id; int cmax, cmin; float h2, f, p, q, t; float hue, saturation, brightness; float redc, greenc, bluec; - for(y = 0; y < h; y++) { - for(x = 0; x < w; x++) { - argb = pt[y * h + x]; + for(id = y * w, x = 0; x < w; x++, id++) { + argb = data[id]; a = (argb >> 24) & 0xff; + // transparent => nothing to do. + if (a == 0) continue; r = (argb >> 16) & 0xff; g = (argb >> 8) & 0xff; b = (argb) & 0xff; @@ -83,9 +239,8 @@ void adjust_hsb(unsigned int *data, int w, int h, float hu, float satur, float b brightness += bright; if (brightness < 0.0) brightness = 0.0; if (brightness > 1.0) brightness = 1.0; - hue += hu; - if (hue < 0.0) hue = 0.0; - if (hue > 1.0) hue = 1.0; + if (alpha != 100) + a = (a * alpha)/100; // convert HSB to RGB if (saturation == 0) { @@ -134,9 +289,56 @@ void adjust_hsb(unsigned int *data, int w, int h, float hu, float satur, float b argb = (argb << 8) + r; argb = (argb << 8) + g; argb = (argb << 8) + b; - pt[y * h + x] = argb; + data[id] = argb; } } } +void createHeuristicMask(DATA32* data, int w, int h) +{ + // first we need to find the mask color, therefore we check all 4 edge pixel and take the color which + // appears most often (we only need to check three edges, the 4th is implicitly clear) + unsigned int topLeft = data[0], topRight = data[w-1], bottomLeft = data[w*h-w], bottomRight = data[w*h-1]; + int max = (topLeft == topRight) + (topLeft == bottomLeft) + (topLeft == bottomRight); + int maskPos = 0; + if ( max < (topRight == topLeft) + (topRight == bottomLeft) + (topRight == bottomRight) ) { + max = (topRight == topLeft) + (topRight == bottomLeft) + (topRight == bottomRight); + maskPos = w-1; + } + if ( max < (bottomLeft == topRight) + (bottomLeft == topLeft) + (bottomLeft == bottomRight) ) + maskPos = w*h-w; + + // now mask out every pixel which has the same color as the edge pixels + unsigned char* udata = (unsigned char*)data; + unsigned char b = udata[4*maskPos]; + unsigned char g = udata[4*maskPos+1]; + unsigned char r = udata[4*maskPos+1]; + int i; + for (i=0; i