void ui_buildfilesel(const char *f, const char *m, void (*c) (const char *, int)) { if (filevisible) { x_fatalerror("Internal error!"); } pressedbutton = activebutton = active = -1; if (lastdir[0] == 0) getcwd(lastdir, 256); lastdir[255] = 0; currdir = mystrdup(lastdir); callback = c; active = AFILE; filex = 0; filey = 0; filewidth = uih->image->width; fileheight = uih->image->height; namestart = dirstart = 0; mask = m; dir = ui_opentext(filex + 2 * BORDERWIDTH, DIRSTART + BORDERHEIGHT, filewidth - 4 * BORDERWIDTH, lastdir); filename = ui_opentext(filex + 2 * BORDERWIDTH, FILESTART + BORDERHEIGHT, filewidth - 4 * BORDERWIDTH, f); filevisible = 1; ui_buildnames(LISTWIDTH); filew = uih_registerw(uih, filepos, drawfile, 0, DRAWBORDER); }
static void dx_getsize(int *width, int *height) { if (resized) { resized = 0; if (!ResizeDD(directX == DXFULLSCREEN)) { DeInitDD(); x_fatalerror("Failed to resize"); } if (!dx_imgparams()) { DeInitDD(); x_fatalerror("Internal program error #34234"); } } *width = displayX; *height = displayY; CalculateBITMAPINFO(); }
/* Display buffer */ static void PaintDD() { DWORD ddrval; if (!IsWindowVisible(hWnd) || !active || !initialized || !BackSurface[0]) return; IDirectDrawSurface_Unlock(BackSurface[0], surface[0].lpSurface); IDirectDrawSurface_Unlock(BackSurface[1], surface[1].lpSurface); if (directX == DXFULLSCREEN) { if (storeddata) free(storeddata), storeddata = NULL; storeddata = store(currentbuff ? buffer2 : buffer1, bitDepth, lineSize, displayX, displayY, mouseX, mouseY); drawmouse(currentbuff ? buffer2 : buffer1, mousepointer, bitDepth, lineSize, displayX, displayY, mouseX, mouseY); ddrval = IDirectDrawSurface_BltFast(lpSurfaces[0], 0, 0, BackSurface[currentbuff], &rcScreen, FALSE); restore(currentbuff ? buffer2 : buffer1, storeddata, bitDepth, lineSize, displayX, displayY, mouseX, mouseY); oldmouseX = mouseX; oldmouseY = mouseY; } else { ddrval = IDirectDrawSurface_Blt(lpSurfaces[0], &rcScreen, BackSurface[currentbuff], &rcViewport, DDBLT_WAIT, NULL); } if (ddrval != DD_OK) { if ((int) ddrval == (int) DDERR_SURFACELOST) { IDirectDrawSurface_Restore(lpSurfaces[0]); IDirectDrawSurface_Restore(BackSurface[0]); IDirectDrawSurface_Restore(BackSurface[1]); ddrval = IDirectDrawSurface_Blt(lpSurfaces[0], &rcScreen, BackSurface[currentbuff], &rcViewport, DDBLT_WAIT, NULL); //if (ddrval == DDERR_SURFACELOST) resized=1; /*We've lost our fractal*/ } } ddrval = IDirectDrawSurface_Lock(BackSurface[0], NULL, &surface[0], DDLOCK_WAIT, NULL); ddrval = IDirectDrawSurface_Lock(BackSurface[1], NULL, &surface[1], DDLOCK_WAIT, NULL); if (buffer1 != (char *) surface[0].lpSurface || buffer2 != (char *) surface[1].lpSurface) { DeInitDD(); x_fatalerror ("Unexpected event - buffers moved! Please contact authors!"); } needredraw = 0; }
static int dx_imgparams(void) { DDSURFACEDESC s; memset(&s, 0, sizeof(s)); s.dwSize = sizeof(s); if (IDirectDrawSurface_GetSurfaceDesc(lpSurfaces[0], &s) != DD_OK) { DeInitDD(); x_error("Failed to get pixel format"); return 0; } switch (s.ddpfPixelFormat.u1.dwRGBBitCount) { case 8: dxw_driver.imagetype = UI_C256; dxf_driver.imagetype = UI_C256; break; case 16: case 15: dxw_driver.imagetype = UI_TRUECOLOR16; dxf_driver.imagetype = UI_TRUECOLOR16; break; case 24: dxw_driver.imagetype = UI_TRUECOLOR24; dxf_driver.imagetype = UI_TRUECOLOR24; break; case 32: dxw_driver.imagetype = UI_TRUECOLOR; dxf_driver.imagetype = UI_TRUECOLOR; break; default: x_fatalerror ("Unsupported bit depth! Only 8bpp, 16bpp, 24bpp and 32bpp modes supported\n"); return 0; } dxw_driver.rmask = s.ddpfPixelFormat.u2.dwRBitMask; dxw_driver.gmask = s.ddpfPixelFormat.u3.dwGBitMask; dxw_driver.bmask = s.ddpfPixelFormat.u4.dwBBitMask; dxf_driver.rmask = s.ddpfPixelFormat.u2.dwRBitMask; dxf_driver.gmask = s.ddpfPixelFormat.u3.dwGBitMask; dxf_driver.bmask = s.ddpfPixelFormat.u4.dwBBitMask; dxf_driver.textwidth = fontWidth; dxf_driver.textheight = fontHeight; dxw_driver.textwidth = fontWidth; dxw_driver.textheight = fontHeight; return 1; }
static int dx_alloc_buffers(char **b1, char **b2) { DWORD ddrval; DDSURFACEDESC ddsd; int i; currentbuff = 0; memset(surface, 0, sizeof(DDSURFACEDESC) * 2); memset(&ddsd, 0, sizeof(DDSURFACEDESC)); ddsd.dwSize = sizeof(ddsd); if (IDirectDrawSurface_GetSurfaceDesc(lpSurfaces[0], &ddsd) != DD_OK) { DeInitDD(); x_error("Failed to get pixel format"); return 0; } for (i = 0; i < 2; i++) { ddsd.dwFlags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_CAPS; ddsd.dwWidth = displayX; ddsd.dwHeight = displayY; ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY; ddrval = IDirectDraw_CreateSurface(lpDD, &ddsd, &BackSurface[i], NULL); if (ddrval != DD_OK) { DeInitDD(); x_error("Failed to create back surface"); return 0; } } for (i = 0; i < 2; i++) { surface[i].dwSize = sizeof(DDSURFACEDESC); ddrval = IDirectDrawSurface_Lock(BackSurface[i], NULL, surface + i, DDLOCK_WAIT, NULL); if (ddrval != DD_OK) { DeInitDD(); x_fatalerror("Failed to lock offscreen surfaces"); } } buffer1 = *b1 = (char *) surface[0].lpSurface; buffer2 = *b2 = (char *) surface[1].lpSurface; lineSize = surface[0].u1.lPitch; initialized = 1; return lineSize; }
static void draw (uih_context * c, void *data) { int num = (int) data; int flags = 0; int xmax, n, nr, i; int x = 0, y = 0; char *string; int fgcolor = 0, bgcolor = 0; if (c->text[num] == NULL) return; prepare (c, c->text[num], &xmax, &n); nr = n * xtextheight (c->font); switch (c->textcolor[num]) { case 0: fgcolor = FGCOLOR (c); bgcolor = BGCOLOR (c); break; case 1: fgcolor = BGCOLOR (c); bgcolor = BGCOLOR (c); flags = TEXT_PRESSED; break; case 2: fgcolor = SELCOLOR (c); bgcolor = BGCOLOR (c); break; default: x_fatalerror ("playtext:unknown color\n"); } if (c->image->flags & AAIMAGE) fgcolor = BGCOLOR (c); switch (num) { case 0: y = 0; break; case 1: y = (c->image->height - nr) / 2; break; case 2: y = c->image->height - nr; break; } string = c->text[num]; for (i = 0; i < n; i++) { xmax = xtextwidth (c->font, string); switch (c->textpos[num]) { case 0: x = 0; break; case 1: x = (c->image->width - xmax) / 2; break; case 2: x = c->image->width - xmax; break; } string += xprint (c->image, c->font, x, y, string, fgcolor, bgcolor, flags) + 1; y += xtextheight (c->font); } }