skin_t* loadskin(char* skindir, int desktopbpp) { FILE *fp; int reachedendofwindow = 0; int linenumber = 0; skin_t *skin = calloc(1, sizeof(skin_t)); char *filename; char *tmp = calloc(1, MAX_LINESIZE); char *desc = calloc(1, MAX_LINESIZE); window* mywindow = NULL; /* setup funcs */ skin->freeskin = freeskin; skin->pngRead = pngRead; skin->addwidget = addwidget; skin->removewidget = removewidget; skin->geteventname = geteventname; skin->desktopbpp = desktopbpp; skin->skindir = strdup(skindir); filename = calloc(1, strlen(skin->skindir) + strlen("skin") + 2); sprintf(filename, "%s\\skin", skin->skindir); if(!(fp = fopen(filename, "rb"))) { mp_msg(MSGT_GPLAYER, MSGL_FATAL, "[SKIN LOAD] Skin \"%s\" not found\n", skindir); skin->freeskin(skin); free(tmp); free(desc); free(filename); return NULL; } while(!feof(fp)) { int pos = 0; unsigned int i; int insidequote = 0; fgets(tmp, MAX_LINESIZE, fp); linenumber++; memset(desc, 0, MAX_LINESIZE); for (i=0; i<strlen(tmp); i++) { if((tmp[i] == '"') && !insidequote) { insidequote=1; continue; } else if((tmp[i] == '"') && insidequote) { insidequote=0 ; continue; } /* remove spaces and linebreaks */ if((!insidequote && (tmp[i] == ' ')) || (tmp[i] == '\n') || (tmp[i] == '\r')) continue; /* remove comments */ else if(tmp[i] == ';') { #ifdef DEBUG mp_msg(MSGT_GPLAYER, MSGL_DBG4, "[SKIN LOAD] Comment: %s", tmp + i + 1); #endif break; } desc[pos] = tmp[i]; pos++; } if(!strlen(desc)) continue; /* now we have "readable" output -> parse it */ /* parse window specific info */ if(!strncmp(desc, "section", 7)) { #ifdef DEBUG mp_msg(MSGT_GPLAYER, MSGL_DBG4, "[SKIN] [SECTION] \"%s\"\n", desc + 8); #endif } else if(!strncmp(desc, "window", 6)) { #ifdef DEBUG mp_msg(MSGT_GPLAYER, MSGL_DBG4, "[SKIN] [WINDOW] \"%s\"\n", desc + 7); #endif reachedendofwindow = 0; (skin->windowcount)++; skin->windows = realloc(skin->windows, sizeof(window *) * skin->windowcount); mywindow = skin->windows[(skin->windowcount) - 1] = calloc(1, sizeof(window)); mywindow->name = strdup(desc + 7); if(!strncmp(desc + 7, "main", 4)) mywindow->type = wiMain; else if(!strncmp(desc+7, "sub", 3)) { mywindow->type = wiSub; mywindow->decoration = 1; } else if(!strncmp(desc + 7, "menu", 4)) mywindow->type = wiMenu; else if(!strncmp(desc + 7, "playbar", 7)) mywindow->type = wiPlaybar; else mp_msg(MSGT_GPLAYER, MSGL_V, "[SKIN] warning found unknown windowtype"); } else if(!strncmp(desc, "decoration", 10) && !strncmp(desc + 11, "enable", 6)) { mywindow->decoration = 1; #ifdef DEBUG mp_msg(MSGT_GPLAYER, MSGL_DBG4, "[SKIN] [DECORATION] enabled decoration for window \"%s\"\n", mywindow->name); #endif } else if(!strncmp(desc, "background", 10)) { int base = counttonextchar(desc, '=') + 1; char temp[MAX_LINESIZE]; mywindow->backgroundcolor[0] = atoi(findnextstring(temp, desc, &base)); mywindow->backgroundcolor[1] = atoi(findnextstring(temp, desc, &base)); mywindow->backgroundcolor[2] = atoi(findnextstring(temp, desc, &base)); #ifdef DEBUG mp_msg(MSGT_GPLAYER, MSGL_DBG4, "[SKIN] [BACKGROUND] window \"%s\" has backgroundcolor (%i,%i,%i)\n", mywindow->name, mywindow->backgroundcolor[0], mywindow->backgroundcolor[1], mywindow->backgroundcolor[2]); #endif } else if(!strncmp(desc, "end", 3)) { if(reachedendofwindow) { #ifdef DEBUG mp_msg(MSGT_GPLAYER, MSGL_DBG4, "[SKIN] [END] of section\n"); #endif } else { reachedendofwindow = 1; #ifdef DEBUG mp_msg(MSGT_GPLAYER, MSGL_DBG4, "[SKIN] [END] of window \"%s\"\n", mywindow->name); #endif } } else if(!strncmp(desc, "font", 4)) { unsigned int i; int id = 0; char temp[MAX_LINESIZE]; int base = counttonextchar(desc, '=')+1; findnextstring(temp, desc, &base); findnextstring(temp, desc, &base); for (i=0; i<skin->fontcount; i++) if(!strcmp(skin->fonts[i]->id, temp)) { id = i; break; } if(!id) { int base = counttonextchar(desc, '=') + 1; findnextstring(temp, desc, &base); id = skin->fontcount; (skin->fontcount)++; skin->fonts = realloc(skin->fonts, sizeof(font_t *) * skin->fontcount); skin->fonts[id]=calloc(1, sizeof(font_t)); skin->fonts[id]->name = strdup(temp); skin->fonts[id]->id = strdup(findnextstring(temp, desc, &base)); } #ifdef DEBUG mp_msg(MSGT_GPLAYER, MSGL_DBG4, "[SKIN] [FONT] id \"%s\" name \"%s\"\n", skin->fonts[id]->name, skin->fonts[id]->id); #endif } else skin->addwidget(skin, mywindow, desc); } free(desc); free(filename); free(tmp); fclose(fp); loadfonts(skin); mp_msg(MSGT_GPLAYER, MSGL_V, "[SKIN LOAD] loaded skin \"%s\"\n", skin->skindir); /* dumpwidgets(skin); */ return skin; }
_Bool gl_init(void) { GLuint vertshader, fragshader; GLint status; const GLchar *data; vertshader = glCreateShader(GL_VERTEX_SHADER); if(!vertshader) { debug("glCreateShader() failed (vert)\n"); return 0; } data = &vertex_shader[0]; glShaderSource(vertshader, 1, &data, NULL); glCompileShader(vertshader); glGetShaderiv(vertshader, GL_COMPILE_STATUS, &status); if(!status) { #ifdef DEBUG debug("glCompileShader() failed (vert):\n%s\n", data); GLint infologsize = 0; glGetShaderiv(vertshader, GL_INFO_LOG_LENGTH, &infologsize); if(infologsize) { char* infolog = malloc(infologsize); glGetShaderInfoLog(vertshader, infologsize, NULL, (GLbyte*)infolog); debug("Infolog: %s\n", infolog); free(infolog); } #endif return 0; } fragshader = glCreateShader(GL_FRAGMENT_SHADER); if(!fragshader) { return 0; } data = &fragment_shader[0]; glShaderSource(fragshader, 1, &data, NULL); glCompileShader(fragshader); glGetShaderiv(fragshader, GL_COMPILE_STATUS, &status); if(!status) { #ifdef DEBUG debug("glCompileShader failed (frag):\n%s\n", data); GLint infologsize = 0; glGetShaderiv(fragshader, GL_INFO_LOG_LENGTH, &infologsize); if(infologsize) { char* infolog = malloc(infologsize); glGetShaderInfoLog(fragshader, infologsize, NULL, (GLbyte*)infolog); debug("Infolog: %s\n", infolog); free(infolog); } #endif return 0; } prog = glCreateProgram(); glAttachShader(prog, vertshader); glAttachShader(prog, fragshader); glBindAttribLocation(prog, 0, "pos"); glBindAttribLocation(prog, 1, "tex"); glLinkProgram(prog); glGetProgramiv(prog, GL_LINK_STATUS, &status); if(!status) { #ifdef DEBUG debug("glLinkProgram failed\n"); GLint infologsize = 0; glGetShaderiv(prog, GL_INFO_LOG_LENGTH, &infologsize); if(infologsize) { char* infolog = malloc(infologsize); glGetShaderInfoLog(prog, infologsize, NULL, (GLbyte*)infolog); debug("Infolog: %s\n", infolog); free(infolog); } #endif return 0; } glUseProgram(prog); matrix = glGetUniformLocation(prog, "matrix"); k = glGetUniformLocation(prog, "k"); k2 = glGetUniformLocation(prog, "k2"); samp = glGetUniformLocation(prog, "samp"); debug("uniforms: %i %i %i\n", matrix, k, samp); GLint zero = 0; float one[] = {1.0, 1.0, 1.0}; glUniform1iv(samp, 1, &zero); glUniform3fv(k2, 1, one); uint8_t wh = {255}; glGenTextures(1, &white); glBindTexture(GL_TEXTURE_2D, white); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, 1, 1, 0, GL_ALPHA, GL_UNSIGNED_BYTE, &wh); // glVertexAttribPointer(0, 2, GL_SHORT, GL_FALSE, sizeof(VERTEX2D), &quads[0]); glVertexAttribPointer(1, 2, GL_UNSIGNED_SHORT, GL_FALSE, sizeof(VERTEX2D), &quads[0].vertex[0].tx); glEnableVertexAttribArray(0); glEnableVertexAttribArray(1); //Alpha blending glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); // glPixelStorei(GL_UNPACK_ALIGNMENT, 1); #ifndef NO_OPENGL_ES uint8_t i = 0; uint16_t ii = 0; do { quad_indices[ii] = i + 0; quad_indices[ii + 1] = i + 1; quad_indices[ii + 2] = i + 3; quad_indices[ii + 3] = i + 3; quad_indices[ii + 4] = i + 1; quad_indices[ii + 5] = i + 2; i += 4; ii += 6; } while(i); #endif glGenTextures(countof(bitmap), bitmap); svg_draw(0); loadfonts(); float vec[4]; vec[0] = -(float)utox_window_width / 2.0; vec[1] = -(float)utox_window_height / 2.0; vec[2] = 2.0 / (float)utox_window_width; vec[3] = -2.0 / (float)utox_window_height; glUniform4fv(matrix, 1, vec); ui_size(utox_window_width, utox_window_height); glViewport(0, 0, utox_window_width, utox_window_height); redraw(); return 1; }
void main(int argc, char **argv) { char *mtpt, *srvname; mtpt = nil; srvname = "font"; ARGBEGIN{ case 'D': chatty9p++; break; case 'F': chattyfuse++; break; case 'm': mtpt = EARGF(usage()); break; case 's': srvname = EARGF(usage()); break; case 'p': pflag++; break; default: usage(); }ARGEND xsrv.attach = xattach; xsrv.open = xopen; xsrv.read = xread; xsrv.stat = xstat; xsrv.walk1 = xwalk1; xsrv.destroyfid = xdestroyfid; fmtinstall('R', Rfmt); fmtinstall('P', Pfmt); memimageinit(); defont = getmemdefont(); loadfonts(); qsort(xfont, nxfont, sizeof xfont[0], fontcmp); if(pflag) { if(argc != 1 || chatty9p || chattyfuse) usage(); dump(argv[0]); exits(0); } if(pflag || argc != 0) usage(); /* * Check twice -- if there is an exited instance * mounted there, the first access will fail but unmount it. */ if(mtpt && access(mtpt, AEXIST) < 0 && access(mtpt, AEXIST) < 0) sysfatal("mountpoint %s does not exist", mtpt); xsrv.foreground = 1; threadpostmountsrv(&xsrv, srvname, mtpt, 0); }