272 lines
6.9 KiB
C
272 lines
6.9 KiB
C
/*
|
|
* TTY bitmap driver
|
|
*
|
|
* Copyright 1999 Patrik Stridvall
|
|
*/
|
|
|
|
#include <string.h>
|
|
#include "bitmap.h"
|
|
#include "gdi.h"
|
|
#include "ttydrv.h"
|
|
#include "winbase.h"
|
|
#include "debugtools.h"
|
|
|
|
DEFAULT_DEBUG_CHANNEL(ttydrv);
|
|
|
|
/**********************************************************************/
|
|
|
|
extern const DC_FUNCTIONS *TTYDRV_DC_Funcs; /* hack */
|
|
|
|
static LONG TTYDRV_DC_GetBitmapBits(BITMAPOBJ *bitmap, void *bits, LONG count);
|
|
static LONG TTYDRV_DC_SetBitmapBits(BITMAPOBJ *bitmap, void *bits, LONG count);
|
|
|
|
/***********************************************************************
|
|
* TTYDRV_DC_AllocBitmap
|
|
*/
|
|
TTYDRV_PHYSBITMAP *TTYDRV_DC_AllocBitmap(BITMAPOBJ *bitmap)
|
|
{
|
|
TTYDRV_PHYSBITMAP *physBitmap;
|
|
|
|
if(!(physBitmap = HeapAlloc(GetProcessHeap(), 0, sizeof(TTYDRV_PHYSBITMAP)))) {
|
|
ERR("Can't alloc TTYDRV_PHYSBITMAP\n");
|
|
return NULL;
|
|
}
|
|
|
|
bitmap->physBitmap = physBitmap;
|
|
bitmap->funcs = TTYDRV_DC_Funcs;
|
|
|
|
return physBitmap;
|
|
}
|
|
|
|
/***********************************************************************
|
|
* TTYDRV_DC_BitmapBits
|
|
*/
|
|
LONG TTYDRV_DC_BitmapBits(HBITMAP hbitmap, void *bits, LONG count, WORD flags)
|
|
{
|
|
BITMAPOBJ *bitmap;
|
|
LONG result;
|
|
|
|
if(!(bitmap = (BITMAPOBJ *) GDI_GetObjPtr(hbitmap, BITMAP_MAGIC)))
|
|
return FALSE;
|
|
|
|
if(flags == DDB_GET)
|
|
result = TTYDRV_DC_GetBitmapBits(bitmap, bits, count);
|
|
else if(flags == DDB_SET)
|
|
result = TTYDRV_DC_SetBitmapBits(bitmap, bits, count);
|
|
else {
|
|
ERR("Unknown flags value %d\n", flags);
|
|
result = 0;
|
|
}
|
|
|
|
GDI_ReleaseObj(hbitmap);
|
|
return result;
|
|
}
|
|
|
|
/***********************************************************************
|
|
* TTYDRV_DC_CreateBitmap
|
|
*/
|
|
BOOL TTYDRV_DC_CreateBitmap(HBITMAP hbitmap)
|
|
{
|
|
TTYDRV_PHYSBITMAP *physBitmap;
|
|
BITMAPOBJ *bitmap;
|
|
|
|
TRACE("(0x%04x)\n", hbitmap);
|
|
|
|
if(!(bitmap = (BITMAPOBJ *) GDI_GetObjPtr(hbitmap, BITMAP_MAGIC)))
|
|
return FALSE;
|
|
|
|
if(!(physBitmap = TTYDRV_DC_AllocBitmap(bitmap))) {
|
|
GDI_ReleaseObj(hbitmap);
|
|
return FALSE;
|
|
}
|
|
|
|
/* Set bitmap bits */
|
|
if(bitmap->bitmap.bmBits) {
|
|
TTYDRV_DC_BitmapBits(hbitmap, bitmap->bitmap.bmBits,
|
|
bitmap->bitmap.bmHeight * bitmap->bitmap.bmWidthBytes,
|
|
DDB_SET );
|
|
}
|
|
|
|
GDI_ReleaseObj(hbitmap);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/***********************************************************************
|
|
* TTYDRV_DC_BITMAP_DeleteObject
|
|
*/
|
|
BOOL TTYDRV_DC_BITMAP_DeleteObject(HBITMAP hbitmap, BITMAPOBJ *bitmap)
|
|
{
|
|
TRACE("(0x%04x, %p)\n", hbitmap, bitmap);
|
|
|
|
HeapFree(GetProcessHeap(), 0, bitmap->physBitmap);
|
|
bitmap->physBitmap = NULL;
|
|
bitmap->funcs = NULL;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/***********************************************************************
|
|
* TTYDRV_DC_GetBitmapBits
|
|
*/
|
|
static LONG TTYDRV_DC_GetBitmapBits(BITMAPOBJ *bitmap, void *bits, LONG count)
|
|
{
|
|
FIXME("(%p, %p, %ld): stub\n", bitmap, bits, count);
|
|
|
|
memset(bits, 0, count);
|
|
|
|
return count;
|
|
}
|
|
|
|
/***********************************************************************
|
|
* TTYDRV_DC_BITMAP_SelectObject
|
|
*/
|
|
HBITMAP TTYDRV_DC_BITMAP_SelectObject(DC *dc, HBITMAP hbitmap, BITMAPOBJ *bitmap)
|
|
{
|
|
HBITMAP hPreviousBitmap;
|
|
|
|
TRACE("(%p, 0x%04x, %p)\n", dc, hbitmap, bitmap);
|
|
|
|
if(!(dc->flags & DC_MEMORY))
|
|
return 0;
|
|
|
|
/* Assure that the bitmap device dependent */
|
|
if(!bitmap->physBitmap && !TTYDRV_DC_CreateBitmap(hbitmap))
|
|
return 0;
|
|
|
|
if(bitmap->funcs != dc->funcs) {
|
|
ERR("Trying to select a non-TTY DDB into a TTY DC\n");
|
|
return 0;
|
|
}
|
|
|
|
dc->totalExtent.left = 0;
|
|
dc->totalExtent.top = 0;
|
|
dc->totalExtent.right = bitmap->bitmap.bmWidth;
|
|
dc->totalExtent.bottom = bitmap->bitmap.bmHeight;
|
|
|
|
/* FIXME: Should be done in the common code instead */
|
|
if(dc->hVisRgn) {
|
|
SetRectRgn(dc->hVisRgn, 0, 0,
|
|
bitmap->bitmap.bmWidth, bitmap->bitmap.bmHeight);
|
|
} else {
|
|
HRGN hrgn;
|
|
|
|
if(!(hrgn = CreateRectRgn(0, 0, bitmap->bitmap.bmWidth, bitmap->bitmap.bmHeight)))
|
|
return 0;
|
|
|
|
dc->hVisRgn = hrgn;
|
|
}
|
|
|
|
hPreviousBitmap = dc->hBitmap;
|
|
dc->hBitmap = hbitmap;
|
|
|
|
return hPreviousBitmap;
|
|
}
|
|
|
|
/***********************************************************************
|
|
* TTYDRV_DC_SetBitmapBits
|
|
*/
|
|
static LONG TTYDRV_DC_SetBitmapBits(BITMAPOBJ *bitmap, void *bits, LONG count)
|
|
{
|
|
FIXME("(%p, %p, %ld): semistub\n", bitmap, bits, count);
|
|
|
|
return count;
|
|
}
|
|
|
|
/***********************************************************************
|
|
* TTYDRV_BITMAP_CreateDIBSection
|
|
*/
|
|
HBITMAP TTYDRV_BITMAP_CreateDIBSection(
|
|
DC *dc, BITMAPINFO *bmi, UINT usage,
|
|
LPVOID *bits, HANDLE section, DWORD offset)
|
|
{
|
|
FIXME("(%p, %p, %u, %p, 0x%04x, %ld): stub\n",
|
|
dc, bmi, usage, bits, section, offset);
|
|
|
|
return (HBITMAP) NULL;
|
|
}
|
|
|
|
/***********************************************************************
|
|
* TTYDRV_BITMAP_DeleteDIBSection
|
|
*/
|
|
void TTYDRV_BITMAP_DeleteDIBSection(BITMAPOBJ *bmp)
|
|
{
|
|
FIXME("(%p): stub\n", bmp);
|
|
}
|
|
|
|
/***********************************************************************
|
|
* TTYDRV_BITMAP_SetDIBColorTable
|
|
*/
|
|
UINT TTYDRV_BITMAP_SetDIBColorTable(BITMAPOBJ *bmp, DC *dc, UINT start, UINT count, const RGBQUAD *colors)
|
|
{
|
|
FIXME("(%p): stub\n", bmp);
|
|
return 0;
|
|
}
|
|
|
|
/***********************************************************************
|
|
* TTYDRV_BITMAP_GetDIBColorTable
|
|
*/
|
|
UINT TTYDRV_BITMAP_GetDIBColorTable(BITMAPOBJ *bmp, DC *dc, UINT start, UINT count, RGBQUAD *colors)
|
|
{
|
|
FIXME("(%p): stub\n", bmp);
|
|
return 0;
|
|
}
|
|
|
|
/***********************************************************************
|
|
* TTYDRV_BITMAP_Lock
|
|
*/
|
|
INT TTYDRV_BITMAP_Lock(BITMAPOBJ *bmp, INT req, BOOL lossy)
|
|
{
|
|
FIXME("(%p): stub\n", bmp);
|
|
return DIB_Status_None;
|
|
}
|
|
|
|
/***********************************************************************
|
|
* TTYDRV_BITMAP_Unlock
|
|
*/
|
|
void TTYDRV_BITMAP_Unlock(BITMAPOBJ *bmp, BOOL commit)
|
|
{
|
|
FIXME("(%p): stub\n", bmp);
|
|
}
|
|
|
|
/***********************************************************************
|
|
* TTYDRV_BITMAP_GetDIBits
|
|
*/
|
|
INT TTYDRV_BITMAP_GetDIBits(
|
|
BITMAPOBJ *bmp, DC *dc, UINT startscan, UINT lines,
|
|
LPVOID bits, BITMAPINFO *info, UINT coloruse, HBITMAP hbitmap)
|
|
{
|
|
FIXME("(%p, %p, %u, %u, %p, %p, %u, 0x%04x): stub\n",
|
|
bmp, dc, startscan, lines, bits, info, coloruse, hbitmap);
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
/***********************************************************************
|
|
* TTYDRV_BITMAP_SetDIBits
|
|
*/
|
|
INT TTYDRV_BITMAP_SetDIBits(
|
|
BITMAPOBJ *bmp, DC *dc, UINT startscan, UINT lines,
|
|
LPCVOID bits, const BITMAPINFO *info, UINT coloruse, HBITMAP hbitmap)
|
|
{
|
|
FIXME("(%p, %p, %u, %u, %p, %p, %u, 0x%04x): stub\n",
|
|
bmp, dc, startscan, lines, bits, info, coloruse, hbitmap);
|
|
|
|
return 0;
|
|
}
|
|
|
|
/***********************************************************************
|
|
* TTYDRV_DC_SetDIBitsToDevice
|
|
*/
|
|
INT TTYDRV_DC_SetDIBitsToDevice(DC *dc, INT xDest, INT yDest, DWORD cx,
|
|
DWORD cy, INT xSrc, INT ySrc,
|
|
UINT startscan, UINT lines, LPCVOID bits,
|
|
const BITMAPINFO *info, UINT coloruse)
|
|
{
|
|
FIXME("(%p, %d, %d, %ld, %ld, %d, %d, %u, %u, %p, %p, %u): stub\n",
|
|
dc, xDest, yDest, cx, cy, xSrc, ySrc, startscan, lines, bits, info, coloruse);
|
|
|
|
return 0;
|
|
}
|