/* * TTY DC graphics * * Copyright 1999 Patrik Stridvall */ #include "config.h" #include "winnls.h" #include "gdi.h" #include "heap.h" #include "debugtools.h" #include "ttydrv.h" DEFAULT_DEBUG_CHANNEL(ttydrv); /*********************************************************************** * TTYDRV_DC_Arc */ BOOL TTYDRV_DC_Arc(DC *dc, INT left, INT top, INT right, INT bottom, INT xstart, INT ystart, INT xend, INT yend) { FIXME("(%p, %d, %d, %d, %d, %d, %d, %d, %d): stub\n", dc, left, top, right, bottom, xstart, ystart, xend, yend); return TRUE; } /*********************************************************************** * TTYDRV_DC_Chord */ BOOL TTYDRV_DC_Chord(DC *dc, INT left, INT top, INT right, INT bottom, INT xstart, INT ystart, INT xend, INT yend) { FIXME("(%p, %d, %d, %d, %d, %d, %d, %d, %d): stub\n", dc, left, top, right, bottom, xstart, ystart, xend, yend); return TRUE; } /*********************************************************************** * TTYDRV_DC_Ellipse */ BOOL TTYDRV_DC_Ellipse(DC *dc, INT left, INT top, INT right, INT bottom) { FIXME("(%p, %d, %d, %d, %d): stub\n", dc, left, top, right, bottom); return TRUE; } /*********************************************************************** * TTYDRV_DC_ExtFloodFill */ BOOL TTYDRV_DC_ExtFloodFill(DC *dc, INT x, INT y, COLORREF color, UINT fillType) { FIXME("(%p, %d, %d, 0x%08lx, %u): stub\n", dc, x, y, color, fillType); return TRUE; } /*********************************************************************** * TTYDRV_DC_GetPixel */ COLORREF TTYDRV_DC_GetPixel(DC *dc, INT x, INT y) { FIXME("(%p, %d, %d): stub\n", dc, x, y); return RGB(0,0,0); /* FIXME: Always returns black */ } /*********************************************************************** * TTYDRV_DC_LineTo */ BOOL TTYDRV_DC_LineTo(DC *dc, INT x, INT y) { #ifdef WINE_CURSES TTYDRV_PDEVICE *physDev = (TTYDRV_PDEVICE *) dc->physDev; INT row1, col1, row2, col2; TRACE("(%p, %d, %d)\n", dc, x, y); if(!physDev->window) return FALSE; row1 = (dc->DCOrgY + XLPTODP(dc, dc->CursPosY)) / physDev->cellHeight; col1 = (dc->DCOrgX + XLPTODP(dc, dc->CursPosX)) / physDev->cellWidth; row2 = (dc->DCOrgY + XLPTODP(dc, y)) / physDev->cellHeight; col2 = (dc->DCOrgX + XLPTODP(dc, x)) / physDev->cellWidth; if(row1 > row2) { INT tmp = row1; row1 = row2; row2 = tmp; } if(col1 > col2) { INT tmp = col1; col1 = col2; col2 = tmp; } wmove(physDev->window, row1, col1); if(col1 == col2) { wvline(physDev->window, ACS_VLINE, row2-row1); } else if(row1 == row2) { whline(physDev->window, ACS_HLINE, col2-col1); } else { FIXME("Diagonal line drawing not yet supported\n"); } wrefresh(physDev->window); return TRUE; #else /* defined(WINE_CURSES) */ FIXME("(%p, %d, %d): stub\n", dc, x, y); return TRUE; #endif /* defined(WINE_CURSES) */ } /*********************************************************************** * TTYDRV_DC_PaintRgn */ BOOL TTYDRV_DC_PaintRgn(DC *dc, HRGN hrgn) { FIXME("(%p, 0x%04x): stub\n", dc, hrgn); return TRUE; } /*********************************************************************** * TTYDRV_DC_Pie */ BOOL TTYDRV_DC_Pie(DC *dc, INT left, INT top, INT right, INT bottom, INT xstart, INT ystart, INT xend, INT yend) { FIXME("(%p, %d, %d, %d, %d, %d, %d, %d, %d): stub\n", dc, left, top, right, bottom, xstart, ystart, xend, yend); return TRUE; } /*********************************************************************** * TTYDRV_DC_Polygon */ BOOL TTYDRV_DC_Polygon(DC *dc, const POINT* pt, INT count) { FIXME("(%p, %p, %d): stub\n", dc, pt, count); return TRUE; } /*********************************************************************** * TTYDRV_DC_Polyline */ BOOL TTYDRV_DC_Polyline(DC *dc, const POINT* pt, INT count) { FIXME("(%p, %p, %d): stub\n", dc, pt, count); return TRUE; } /*********************************************************************** * TTYDRV_DC_PolyPolygon */ BOOL TTYDRV_DC_PolyPolygon(DC *dc, const POINT* pt, const INT* counts, UINT polygons) { FIXME("(%p, %p, %p, %u): stub\n", dc, pt, counts, polygons); return TRUE; } /*********************************************************************** * TTYDRV_DC_PolyPolyline */ BOOL TTYDRV_DC_PolyPolyline(DC *dc, const POINT* pt, const DWORD* counts, DWORD polylines) { FIXME("(%p, %p, %p, %lu): stub\n", dc, pt, counts, polylines); return TRUE; } /*********************************************************************** * TTYDRV_DC_Rectangle */ BOOL TTYDRV_DC_Rectangle(DC *dc, INT left, INT top, INT right, INT bottom) { #ifdef WINE_CURSES TTYDRV_PDEVICE *physDev = (TTYDRV_PDEVICE *) dc->physDev; INT row1, col1, row2, col2; TRACE("(%p, %d, %d, %d, %d)\n", dc, left, top, right, bottom); if(!physDev->window) return FALSE; row1 = (dc->DCOrgY + XLPTODP(dc, top)) / physDev->cellHeight; col1 = (dc->DCOrgX + XLPTODP(dc, left)) / physDev->cellWidth; row2 = (dc->DCOrgY + XLPTODP(dc, bottom)) / physDev->cellHeight; col2 = (dc->DCOrgX + XLPTODP(dc, right)) / physDev->cellWidth; if(row1 > row2) { INT tmp = row1; row1 = row2; row2 = tmp; } if(col1 > col2) { INT tmp = col1; col1 = col2; col2 = tmp; } wmove(physDev->window, row1, col1); whline(physDev->window, ACS_HLINE, col2-col1); wmove(physDev->window, row1, col2); wvline(physDev->window, ACS_VLINE, row2-row1); wmove(physDev->window, row2, col1); whline(physDev->window, ACS_HLINE, col2-col1); wmove(physDev->window, row1, col1); wvline(physDev->window, ACS_VLINE, row2-row1); mvwaddch(physDev->window, row1, col1, ACS_ULCORNER); mvwaddch(physDev->window, row1, col2, ACS_URCORNER); mvwaddch(physDev->window, row2, col2, ACS_LRCORNER); mvwaddch(physDev->window, row2, col1, ACS_LLCORNER); wrefresh(physDev->window); return TRUE; #else /* defined(WINE_CURSES) */ FIXME("(%p, %d, %d, %d, %d): stub\n", dc, left, top, right, bottom); return TRUE; #endif /* defined(WINE_CURSES) */ } /*********************************************************************** * TTYDRV_DC_RoundRect */ BOOL TTYDRV_DC_RoundRect(DC *dc, INT left, INT top, INT right, INT bottom, INT ell_width, INT ell_height) { FIXME("(%p, %d, %d, %d, %d, %d, %d): stub\n", dc, left, top, right, bottom, ell_width, ell_height); return TRUE; } /*********************************************************************** * TTYDRV_DC_SetBkColor */ COLORREF TTYDRV_DC_SetBkColor(DC *dc, COLORREF color) { COLORREF oldColor; TRACE("(%p, 0x%08lx)\n", dc, color); oldColor = dc->backgroundColor; dc->backgroundColor = color; return oldColor; } /*********************************************************************** * TTYDRV_DC_SetPixel */ COLORREF TTYDRV_DC_SetPixel(DC *dc, INT x, INT y, COLORREF color) { #ifdef WINE_CURSES TTYDRV_PDEVICE *physDev = (TTYDRV_PDEVICE *) dc->physDev; INT row, col; TRACE("(%p, %d, %d, 0x%08lx)\n", dc, x, y, color); if(!physDev->window) return FALSE; row = (dc->DCOrgY + XLPTODP(dc, y)) / physDev->cellHeight; col = (dc->DCOrgX + XLPTODP(dc, x)) / physDev->cellWidth; mvwaddch(physDev->window, row, col, ACS_BULLET); wrefresh(physDev->window); return RGB(0,0,0); /* FIXME: Always returns black */ #else /* defined(WINE_CURSES) */ FIXME("(%p, %d, %d, 0x%08lx): stub\n", dc, x, y, color); return RGB(0,0,0); /* FIXME: Always returns black */ #endif /* defined(WINE_CURSES) */ } /*********************************************************************** * TTYDRV_DC_SetTextColor */ COLORREF TTYDRV_DC_SetTextColor(DC *dc, COLORREF color) { COLORREF oldColor; TRACE("(%p, 0x%08lx)\n", dc, color); oldColor = dc->textColor; dc->textColor = color; return oldColor; } /*********************************************************************** * TTYDRV_DC_BitBlt */ BOOL TTYDRV_DC_BitBlt(DC *dcDst, INT xDst, INT yDst, INT width, INT height, DC *dcSrc, INT xSrc, INT ySrc, DWORD rop) { FIXME("(%p, %d, %d, %d, %d, %p, %d, %d, %lu): stub\n", dcDst, xDst, yDst, width, height, dcSrc, xSrc, ySrc, rop ); return TRUE; } /*********************************************************************** * TTYDRV_DC_PatBlt */ BOOL TTYDRV_DC_PatBlt(DC *dc, INT left, INT top, INT width, INT height, DWORD rop) { FIXME("(%p, %d, %d, %d, %d, %lu): stub\n", dc, left, top, width, height, rop ); return TRUE; } /*********************************************************************** * TTYDRV_DC_StretchBlt */ BOOL TTYDRV_DC_StretchBlt(DC *dcDst, INT xDst, INT yDst, INT widthDst, INT heightDst, DC *dcSrc, INT xSrc, INT ySrc, INT widthSrc, INT heightSrc, DWORD rop) { FIXME("(%p, %d, %d, %d, %d, %p, %d, %d, %d, %d, %lu): stub\n", dcDst, xDst, yDst, widthDst, heightDst, dcSrc, xSrc, ySrc, widthSrc, heightSrc, rop ); return TRUE; } /*********************************************************************** * TTYDRV_DC_ExtTextOut */ BOOL TTYDRV_DC_ExtTextOut(DC *dc, INT x, INT y, UINT flags, const RECT *lpRect, LPCWSTR str, UINT count, const INT *lpDx) { #ifdef WINE_CURSES TTYDRV_PDEVICE *physDev = (TTYDRV_PDEVICE *) dc->physDev; INT row, col; LPSTR ascii; DWORD len; TRACE("(%p, %d, %d, 0x%08x, %p, %s, %d, %p)\n", dc, x, y, flags, lpRect, debugstr_wn(str, count), count, lpDx); if(!physDev->window) return FALSE; /* FIXME: Is this really correct? */ if(dc->textAlign & TA_UPDATECP) { x = dc->CursPosX; y = dc->CursPosY; } x = XLPTODP(dc, x); y = YLPTODP(dc, y); row = (dc->DCOrgY + y) / physDev->cellHeight; col = (dc->DCOrgX + x) / physDev->cellWidth; len = WideCharToMultiByte( CP_ACP, 0, str, count, NULL, 0, NULL, NULL ); ascii = HeapAlloc( GetProcessHeap(), 0, len ); WideCharToMultiByte( CP_ACP, 0, str, count, ascii, len, NULL, NULL ); mvwaddnstr(physDev->window, row, col, ascii, len); HeapFree( GetProcessHeap(), 0, ascii ); wrefresh(physDev->window); if(dc->textAlign & TA_UPDATECP) { dc->CursPosX += count * physDev->cellWidth; dc->CursPosY += physDev->cellHeight; } return TRUE; #else /* defined(WINE_CURSES) */ FIXME("(%p, %d, %d, 0x%08x, %p, %s, %d, %p): stub\n", dc, x, y, flags, lpRect, debugstr_wn(str,count), count, lpDx); return TRUE; #endif /* defined(WINE_CURSES) */ } /*********************************************************************** * TTYDRV_DC_GetCharWidth */ BOOL TTYDRV_DC_GetCharWidth(DC *dc, UINT firstChar, UINT lastChar, LPINT buffer) { UINT c; TTYDRV_PDEVICE *physDev = (TTYDRV_PDEVICE *) dc->physDev; FIXME("(%p, %u, %u, %p): semistub\n", dc, firstChar, lastChar, buffer); for(c=firstChar; c<=lastChar; c++) { buffer[c-firstChar] = physDev->cellWidth; } return TRUE; } /*********************************************************************** * TTYDRV_DC_GetTextExtentPoint */ BOOL TTYDRV_DC_GetTextExtentPoint(DC *dc, LPCWSTR str, INT count, LPSIZE size) { TTYDRV_PDEVICE *physDev = (TTYDRV_PDEVICE *) dc->physDev; TRACE("(%p, %s, %d, %p)\n", dc, debugstr_wn(str, count), count, size); size->cx = count * physDev->cellWidth; size->cy = physDev->cellHeight; return TRUE; } /*********************************************************************** * TTYDRV_DC_GetTextMetrics */ BOOL TTYDRV_DC_GetTextMetrics(DC *dc, LPTEXTMETRICA lptm) { TTYDRV_PDEVICE *physDev = (TTYDRV_PDEVICE *) dc->physDev; TRACE("(%p, %p)\n", dc, lptm); lptm->tmHeight = physDev->cellHeight; lptm->tmAscent = 0; lptm->tmDescent = 0; lptm->tmInternalLeading = 0; lptm->tmExternalLeading = 0; lptm->tmAveCharWidth = physDev->cellWidth; lptm->tmMaxCharWidth = physDev->cellWidth; lptm->tmWeight = FW_MEDIUM; lptm->tmOverhang = 0; lptm->tmDigitizedAspectX = physDev->cellWidth; lptm->tmDigitizedAspectY = physDev->cellHeight; lptm->tmFirstChar = 32; lptm->tmLastChar = 255; lptm->tmDefaultChar = 0; lptm->tmBreakChar = 32; lptm->tmItalic = FALSE; lptm->tmUnderlined = FALSE; lptm->tmStruckOut = FALSE; lptm->tmPitchAndFamily = TMPF_FIXED_PITCH|TMPF_DEVICE; lptm->tmCharSet = ANSI_CHARSET; return TRUE; }