void* iupdrvImageCreateImageRaw(int width, int height, int bpp, iupColor* colors, int colors_count, unsigned char *imgdata) { int y, x; Pixmap pixmap; GC gc; pixmap = XCreatePixmap(iupmot_display, RootWindow(iupmot_display,iupmot_screen), width, height, iupdrvGetScreenDepth()); if (!pixmap) return NULL; gc = XCreateGC(iupmot_display,pixmap,0,NULL); /* Pixmap is top-bottom */ /* imgdata is bottom up */ if (bpp == 8) { Pixel color2pixel[256]; int i; for (i=0;i<colors_count;i++) color2pixel[i] = iupmotColorGetPixel(colors[i].r, colors[i].g, colors[i].b); for (y=0;y<height;y++) { int lineoffset = (height-1 - y)*width; /* imgdata is bottom up */ for(x=0;x<width;x++) { unsigned long p = color2pixel[imgdata[lineoffset+x]]; XSetForeground(iupmot_display,gc,p); XDrawPoint(iupmot_display,pixmap,gc,x,y); } } } else { /* planes are separated in imgdata */ int planesize = width*height; unsigned char *r = imgdata, *g = imgdata+planesize, *b = imgdata+2*planesize; for (y=0;y<height;y++) { int lineoffset = (height-1 - y)*width; /* imgdata is bottom up */ for(x=0;x<width;x++) { unsigned long p = iupmotColorGetPixel(r[lineoffset+x], g[lineoffset+x], b[lineoffset+x]); XSetForeground(iupmot_display,gc,p); XDrawPoint(iupmot_display,pixmap,gc,x,y); } } } XFreeGC(iupmot_display,gc); return (void*)pixmap; }
char* iupdrvGetGlobal(const char *name) { if (iupStrEqual(name, "CURSORPOS")) { int x, y; char* str = iupStrGetMemory(50); iupdrvGetCursorPos(&x, &y); sprintf(str, "%dx%d", x, y); return str; } if (iupStrEqual(name, "SHIFTKEY")) { char key[5]; iupdrvGetKeyState(key); if (key[0] == 'S') return "ON"; return "OFF"; } if (iupStrEqual(name, "CONTROLKEY")) { char key[5]; iupdrvGetKeyState(key); if (key[1] == 'C') return "ON"; return "OFF"; } if (iupStrEqual(name, "MODKEYSTATE")) { char *str = iupStrGetMemory(5); iupdrvGetKeyState(str); return str; } if (iupStrEqual(name, "SCREENSIZE")) { char *str = iupStrGetMemory(50); int w, h; iupdrvGetScreenSize(&w, &h); sprintf(str, "%dx%d", w, h); return str; } if (iupStrEqual(name, "FULLSIZE")) { char *str = iupStrGetMemory(50); int w, h; iupdrvGetFullSize(&w, &h); sprintf(str, "%dx%d", w, h); return str; } if (iupStrEqual(name, "SCREENDEPTH")) { char *str = iupStrGetMemory(50); int bpp = iupdrvGetScreenDepth(); sprintf(str, "%d", bpp); return str; } return NULL; }
char* iupdrvGetGlobal(const char* name) { if (iupStrEqual(name, "VIRTUALSCREEN")) { int x = GetSystemMetrics(SM_XVIRTUALSCREEN); int y = GetSystemMetrics(SM_YVIRTUALSCREEN); int w = GetSystemMetrics(SM_CXVIRTUALSCREEN); int h = GetSystemMetrics(SM_CYVIRTUALSCREEN); return iupStrReturnStrf("%d %d %d %d", x, y, w, h); } if (iupStrEqual(name, "MONITORSINFO")) { int i; int monitors_count = GetSystemMetrics(SM_CMONITORS); RECT* monitors_rect = malloc(monitors_count*sizeof(RECT)); char* str = iupStrGetMemory(monitors_count*50); char* pstr = str; win_monitor_index = 0; EnumDisplayMonitors(NULL, NULL, winGlobalMonitorInfoEnum, (LPARAM)monitors_rect); for (i=0; i < monitors_count; i++) pstr += sprintf(pstr, "%d %d %d %d\n", (int)monitors_rect[i].left, (int)monitors_rect[i].top, (int)(monitors_rect[i].right-monitors_rect[i].left), (int)(monitors_rect[i].bottom-monitors_rect[i].top)); free(monitors_rect); return str; } if (iupStrEqual(name, "TRUECOLORCANVAS")) { return iupStrReturnBoolean(iupdrvGetScreenDepth() > 8); } if (iupStrEqual(name, "UTF8MODE")) { return iupStrReturnBoolean(iupwinStrGetUTF8Mode()); } if (iupStrEqual(name, "UTF8MODE_FILE")) { return iupStrReturnBoolean(iupwinStrGetUTF8ModeFile()); } if (iupStrEqual(name, "DLL_HINSTANCE")) { return (char*)iupwin_dll_hinstance; } if (iupStrEqual(name, "COMCTL32VER6")) { return iupStrReturnBoolean(iupwin_comctl32ver6); } if (iupStrEqual(name, "SYSTEMCODEPAGE")) { CPINFOEX info; GetCPInfoEx(CP_ACP, 0, &info); return iupStrReturnInt(info.CodePage); } if (iupStrEqual(name, "LASTERROR")) { DWORD error = GetLastError(); if (error) { LPTSTR lpMsgBuf = NULL; FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER| FORMAT_MESSAGE_FROM_SYSTEM| FORMAT_MESSAGE_IGNORE_INSERTS, NULL, error, 0, (LPTSTR)&lpMsgBuf, /* weird but that's correct */ 0, NULL); if (lpMsgBuf) { char* str = iupStrReturnStr(iupwinStrFromSystem(lpMsgBuf)); LocalFree(lpMsgBuf); return str; } else return "Unknown Error"; } } if (iupStrEqual(name, "DWM_COMPOSITION")) { typedef HRESULT(STDAPICALLTYPE *PtrDwmIsCompositionEnabled)(BOOL*); static PtrDwmIsCompositionEnabled dwmIsCompositionEnabled = NULL; if (dwmIsCompositionEnabled == NULL) { HMODULE dwmLibrary = LoadLibrary(TEXT("dwmapi.dll")); if (dwmLibrary) dwmIsCompositionEnabled = (PtrDwmIsCompositionEnabled)GetProcAddress(dwmLibrary, "DwmIsCompositionEnabled"); } if (dwmIsCompositionEnabled != NULL) { /* windows vista or higher (has aero): see if disabled */ BOOL enabled; dwmIsCompositionEnabled(&enabled); return iupStrReturnBoolean(enabled); } else return NULL; } return NULL; }
void* iupdrvImageCreateImage(Ihandle *ih, const char* bgcolor, int make_inactive) { int y, x, bpp, bgcolor_depend = 0, width = ih->currentwidth, height = ih->currentheight; unsigned char *imgdata = (unsigned char*)iupAttribGetStr(ih, "WID"); Pixmap pixmap; unsigned char bg_r=0, bg_g=0, bg_b=0; GC gc; Pixel color2pixel[256]; bpp = iupAttribGetInt(ih, "BPP"); iupStrToRGB(bgcolor, &bg_r, &bg_g, &bg_b); if (bpp == 8) { int i, colors_count = 0; iupColor colors[256]; iupImageInitColorTable(ih, colors, &colors_count); for (i=0;i<colors_count;i++) { if (colors[i].a == 0) { colors[i].r = bg_r; colors[i].g = bg_g; colors[i].b = bg_b; colors[i].a = 255; bgcolor_depend = 1; } if (make_inactive) iupImageColorMakeInactive(&(colors[i].r), &(colors[i].g), &(colors[i].b), bg_r, bg_g, bg_b); color2pixel[i] = iupmotColorGetPixel(colors[i].r, colors[i].g, colors[i].b); } } pixmap = XCreatePixmap(iupmot_display, RootWindow(iupmot_display,iupmot_screen), width, height, iupdrvGetScreenDepth()); if (!pixmap) return NULL; gc = XCreateGC(iupmot_display,pixmap,0,NULL); for (y=0;y<height;y++) { for(x=0;x<width;x++) { unsigned long p; if (bpp == 8) p = color2pixel[imgdata[y*width+x]]; else { int channels = (bpp==24)? 3: 4; unsigned char *pixel_data = imgdata + y*width*channels + x*channels; unsigned char r = *(pixel_data), g = *(pixel_data+1), b = *(pixel_data+2); if (bpp == 32) { unsigned char a = *(pixel_data+3); if (a != 255) { /* flat alpha */ r = iupALPHABLEND(r, bg_r, a); g = iupALPHABLEND(g, bg_g, a); b = iupALPHABLEND(b, bg_b, a); bgcolor_depend = 1; } } if (make_inactive) iupImageColorMakeInactive(&r, &g, &b, bg_r, bg_g, bg_b); p = iupmotColorGetPixel(r, g, b); } XSetForeground(iupmot_display,gc,p); XDrawPoint(iupmot_display,pixmap,gc,x,y); } } XFreeGC(iupmot_display,gc); if (bgcolor_depend || make_inactive) iupAttribSet(ih, "_IUP_BGCOLOR_DEPEND", "1"); return (void*)pixmap; }
char* IupGetGlobal(const char *name) { char* value; iupASSERT(name!=NULL); if (!name) return NULL; if (iupStrEqual(name, "DEFAULTFONTSIZE")) return iupGetDefaultFontSizeGlobalAttrib(); if (iupStrEqual(name, "DEFAULTFONTSTYLE")) return iupGetDefaultFontStyleGlobalAttrib(); if (iupStrEqual(name, "DEFAULTFONTFACE")) return iupGetDefaultFontFaceGlobalAttrib(); if (iupStrEqual(name, "CURSORPOS")) { int x, y; iupdrvGetCursorPos(&x, &y); return iupStrReturnIntInt(x, y, 'x'); } if (iupStrEqual(name, "SHIFTKEY")) { char key[5]; iupdrvGetKeyState(key); return iupStrReturnChecked(key[0] == 'S'); } if (iupStrEqual(name, "CONTROLKEY")) { char key[5]; iupdrvGetKeyState(key); return iupStrReturnChecked(key[1] == 'C'); } if (iupStrEqual(name, "MODKEYSTATE")) { char *str = iupStrGetMemory(5); iupdrvGetKeyState(str); return str; } if (iupStrEqual(name, "SCREENSIZE")) { int w, h; iupdrvGetScreenSize(&w, &h); return iupStrReturnIntInt(w, h, 'x'); } if (iupStrEqual(name, "FULLSIZE")) { int w, h; iupdrvGetFullSize(&w, &h); return iupStrReturnIntInt(w, h, 'x'); } if (iupStrEqual(name, "SCREENDEPTH")) { int bpp = iupdrvGetScreenDepth(); return iupStrReturnInt(bpp); } if (iupStrEqual(name, "SCREENDPI")) { double dpi = iupdrvGetScreenDpi(); return iupStrReturnDouble(dpi); } if (iupStrEqual(name, "SYSTEMLOCALE")) return iupdrvLocaleInfo(); if (iupStrEqual(name, "SCROLLBARSIZE")) return iupStrReturnInt(iupdrvGetScrollbarSize()); value = iupdrvGetGlobal(name); if (!value) value = (char*)iupTableGet(iglobal_table, name); return value; }