/*
 * TTY DC driver
 *
 * Copyright 1999 Patrik Stridvall
 */

#include "config.h"

#include "gdi.h"
#include "bitmap.h"
#include "palette.h"
#include "ttydrv.h"
#include "winbase.h"
#include "debugtools.h"

DEFAULT_DEBUG_CHANNEL(ttydrv);

/**********************************************************************/

static const DC_FUNCTIONS TTYDRV_DC_Driver =
{
  NULL,                /* pAbortDoc */
  NULL,                /* pAbortPath */
  NULL,                /* pAngleArc */
  TTYDRV_DC_Arc,       /* pArc */
  NULL,                /* pArcTo */
  NULL,                /* pBeginPath */
  TTYDRV_DC_BitBlt,    /* pBitBlt */
  TTYDRV_DC_BitmapBits,/* pBitmapBits */
  NULL,                /* pChoosePixelFormat */
  TTYDRV_DC_Chord,     /* pChord */
  NULL,                /* pCloseFigure */
  TTYDRV_DC_CreateBitmap, /* pCreateBitmap */
  TTYDRV_DC_CreateDC,  /* pCreateDC */
  NULL,                /* pCreateDIBSection */
  TTYDRV_DC_DeleteDC,  /* pDeleteDC */
  TTYDRV_DC_DeleteObject, /* pDeleteObject */
  NULL,                /* pDescribePixelFormat */
  NULL,                /* pDeviceCapabilities */
  TTYDRV_DC_Ellipse,   /* pEllipse */
  NULL,                /* pEndDoc */
  NULL,                /* pEndPage */
  NULL,                /* pEndPath */
  NULL,                /* pEnumDeviceFonts */
  TTYDRV_DC_Escape,    /* pEscape */
  NULL,                /* pExcludeClipRect */
  NULL,                /* pExtDeviceMode */
  TTYDRV_DC_ExtFloodFill, /* pExtFloodFill */
  TTYDRV_DC_ExtTextOut, /* pExtTextOut */
  NULL,                /* pFillPath */
  NULL,                /* pFillRgn */
  NULL,                /* pFlattenPath */
  NULL,                /* pFrameRgn */
  TTYDRV_DC_GetCharWidth, /* pGetCharWidth */
  NULL,                /* pGetDCOrgEx */
  NULL,                /* pGetDeviceGammaRamp */
  TTYDRV_DC_GetPixel,  /* pGetPixel */
  NULL,                /* pGetPixelFormat */
  TTYDRV_DC_GetTextExtentPoint, /* pGetTextExtentPoint */
  TTYDRV_DC_GetTextMetrics,  /* pGetTextMetrics */
  NULL,                /* pIntersectClipRect */
  NULL,                /* pIntersectVisRect */
  TTYDRV_DC_LineTo,    /* pLineTo */
  NULL,                /* pMoveTo */
  NULL,                /* pOffsetClipRgn */
  NULL,                /* pOffsetViewportOrg (optional) */
  NULL,                /* pOffsetWindowOrg (optional) */
  TTYDRV_DC_PaintRgn,  /* pPaintRgn */
  TTYDRV_DC_PatBlt,    /* pPatBlt */
  TTYDRV_DC_Pie,       /* pPie */
  NULL,                /* pPolyBezier */
  NULL,                /* pPolyBezierTo */
  NULL,                /* pPolyDraw */
  TTYDRV_DC_PolyPolygon, /* pPolyPolygon */
  TTYDRV_DC_PolyPolyline, /* pPolyPolyline */
  TTYDRV_DC_Polygon,   /* pPolygon */
  TTYDRV_DC_Polyline,  /* pPolyline */
  NULL,                /* pPolylineTo */
  NULL,                /* pRealizePalette */
  TTYDRV_DC_Rectangle, /* pRectangle */
  NULL,                /* pRestoreDC */
  TTYDRV_DC_RoundRect, /* pRoundRect */
  NULL,                /* pSaveDC */
  NULL,                /* pScaleViewportExt (optional) */
  NULL,                /* pScaleWindowExt (optional) */
  NULL,                /* pSelectClipPath */
  NULL,                /* pSelectClipRgn */
  TTYDRV_DC_SelectObject, /* pSelectObject */
  NULL,                /* pSelectPalette */
  TTYDRV_DC_SetBkColor, /* pSetBkColor */
  NULL,                /* pSetBkMode */
  TTYDRV_DC_SetDeviceClipping, /* pSetDeviceClipping */
  NULL,                /* pSetDeviceGammaRamp */
  TTYDRV_DC_SetDIBitsToDevice, /* pSetDIBitsToDevice */
  NULL,                /* pSetMapMode (optional) */
  NULL,                /* pSetMapperFlags */
  TTYDRV_DC_SetPixel,  /* pSetPixel */
  NULL,                /* pSetPixelFormat */
  NULL,                /* pSetPolyFillMode */
  NULL,                /* pSetROP2 */
  NULL,                /* pSetRelAbs */
  NULL,                /* pSetStretchBltMode */
  NULL,                /* pSetTextAlign */
  NULL,                /* pSetTextCharacterExtra */
  TTYDRV_DC_SetTextColor, /* pSetTextColor */
  NULL,                /* pSetTextJustification */
  NULL,                /* pSetViewportExt (optional) */
  NULL,                /* pSetViewportOrg (optional) */
  NULL,                /* pSetWindowExt (optional) */
  NULL,                /* pSetWindowOrg (optional) */
  NULL,                /* pStartDoc */
  NULL,                /* pStartPage */
  TTYDRV_DC_StretchBlt, /* pStretchBlt */
  NULL,                /* pStretchDIBits */
  NULL,                /* pStrokeAndFillPath */
  NULL,                /* pStrokePath */
  NULL,                /* pSwapBuffers */
  NULL                 /* pWidenPath */
};


BITMAP_DRIVER TTYDRV_BITMAP_Driver =
{
  TTYDRV_BITMAP_SetDIBits,
  TTYDRV_BITMAP_GetDIBits,
  TTYDRV_BITMAP_DeleteDIBSection,
  TTYDRV_BITMAP_SetDIBColorTable,
  TTYDRV_BITMAP_GetDIBColorTable,
  TTYDRV_BITMAP_Lock,
  TTYDRV_BITMAP_Unlock
};

PALETTE_DRIVER TTYDRV_PALETTE_Driver = 
{
  TTYDRV_PALETTE_SetMapping,
  TTYDRV_PALETTE_UpdateMapping,
  TTYDRV_PALETTE_IsDark
};

/* FIXME: Adapt to the TTY driver. Copied from the X11 driver */

DeviceCaps TTYDRV_DC_DevCaps = {
/* version */		0, 
/* technology */	DT_RASDISPLAY,
/* size, resolution */	0, 0, 0, 0, 0, 
/* device objects */	1, 16 + 6, 16, 0, 0, 100, 0,	
/* curve caps */	CC_CIRCLES | CC_PIE | CC_CHORD | CC_ELLIPSES |
			CC_WIDE | CC_STYLED | CC_WIDESTYLED | CC_INTERIORS | CC_ROUNDRECT,
/* line caps */		LC_POLYLINE | LC_MARKER | LC_POLYMARKER | LC_WIDE |
			LC_STYLED | LC_WIDESTYLED | LC_INTERIORS,
/* polygon caps */	PC_POLYGON | PC_RECTANGLE | PC_WINDPOLYGON |
			PC_SCANLINE | PC_WIDE | PC_STYLED | PC_WIDESTYLED | PC_INTERIORS,
/* text caps */		0,
/* regions */		CP_REGION,
/* raster caps */	RC_BITBLT | RC_BANDING | RC_SCALING | RC_BITMAP64 |
			RC_DI_BITMAP | RC_DIBTODEV | RC_BIGFONT | RC_STRETCHBLT | RC_STRETCHDIB | RC_DEVBITS,
/* aspects */		36, 36, 51,
/* pad1 */		{ 0 },
/* log pixels */	0, 0, 
/* pad2 */		{ 0 },
/* palette size */	0,
/* ..etc */		0, 0
};

/**********************************************************************
 *	     TTYDRV_GDI_Initialize
 */
BOOL TTYDRV_GDI_Initialize(void)
{
  BITMAP_Driver = &TTYDRV_BITMAP_Driver;
  PALETTE_Driver = &TTYDRV_PALETTE_Driver;

  TTYDRV_DC_DevCaps.version = 0x300;
  TTYDRV_DC_DevCaps.horzSize = 0;    /* FIXME: Screen width in mm */
  TTYDRV_DC_DevCaps.vertSize = 0;    /* FIXME: Screen height in mm */
  TTYDRV_DC_DevCaps.horzRes = 640;   /* FIXME: Screen width in pixel */
  TTYDRV_DC_DevCaps.vertRes = 480;   /* FIXME: Screen height in pixel */
  TTYDRV_DC_DevCaps.bitsPixel = 1;   /* FIXME: Bits per pixel */
  TTYDRV_DC_DevCaps.sizePalette = 256; /* FIXME: ??? */
  
  /* Resolution will be adjusted during the font init */
  
  TTYDRV_DC_DevCaps.logPixelsX = (int) (TTYDRV_DC_DevCaps.horzRes * 25.4 / TTYDRV_DC_DevCaps.horzSize);
  TTYDRV_DC_DevCaps.logPixelsY = (int) (TTYDRV_DC_DevCaps.vertRes * 25.4 / TTYDRV_DC_DevCaps.vertSize);
 
  if(!TTYDRV_PALETTE_Initialize())
    return FALSE;

  return DRIVER_RegisterDriver( "DISPLAY", &TTYDRV_DC_Driver );
}

/**********************************************************************
 *	     TTYDRV_GDI_Finalize
 */
void TTYDRV_GDI_Finalize(void)
{
    TTYDRV_PALETTE_Finalize();
}

/***********************************************************************
 *	     TTYDRV_DC_CreateDC
 */
BOOL TTYDRV_DC_CreateDC(DC *dc, LPCSTR driver, LPCSTR device,
			LPCSTR output, const DEVMODEA *initData)
{
  TTYDRV_PDEVICE *physDev;
  BITMAPOBJ *bmp;

  TRACE("(%p, %s, %s, %s, %p)\n",
    dc, debugstr_a(driver), debugstr_a(device), 
    debugstr_a(output), initData);

  dc->physDev = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
			  sizeof(TTYDRV_PDEVICE));  
  if(!dc->physDev) {
    ERR("Can't allocate physDev\n");
    return FALSE;
  }
  physDev = (TTYDRV_PDEVICE *) dc->physDev;
  
  dc->devCaps = &TTYDRV_DC_DevCaps;

  if(dc->flags & DC_MEMORY){
    physDev->window = NULL;
    physDev->cellWidth = 1;
    physDev->cellHeight = 1;

    TTYDRV_DC_CreateBitmap(dc->hBitmap);
    bmp = (BITMAPOBJ *) GDI_GetObjPtr(dc->hBitmap, BITMAP_MAGIC);
				   
    dc->bitsPerPixel = bmp->bitmap.bmBitsPixel;
    
    dc->totalExtent.left   = 0;
    dc->totalExtent.top    = 0;
    dc->totalExtent.right  = bmp->bitmap.bmWidth;
    dc->totalExtent.bottom = bmp->bitmap.bmHeight;
    dc->hVisRgn            = CreateRectRgnIndirect( &dc->totalExtent );
    
    GDI_ReleaseObj( dc->hBitmap );
  } else {
    physDev->window = root_window;
    physDev->cellWidth = cell_width;
    physDev->cellHeight = cell_height;
    
    dc->bitsPerPixel       = 1;
    dc->totalExtent.left   = 0;
    dc->totalExtent.top    = 0;
    dc->totalExtent.right  = cell_width * screen_cols;
    dc->totalExtent.bottom = cell_height * screen_rows;
    dc->hVisRgn            = CreateRectRgnIndirect( &dc->totalExtent );    
  }

  return TRUE;
}

/***********************************************************************
 *	     TTYDRV_DC_DeleteDC
 */
BOOL TTYDRV_DC_DeleteDC(DC *dc)
{
  TRACE("(%p)\n", dc);

  HeapFree( GetProcessHeap(), 0, dc->physDev );
  dc->physDev = NULL;
  
  return TRUE;
}

/***********************************************************************
 *           TTYDRV_DC_Escape
 */
INT TTYDRV_DC_Escape(DC *dc, INT nEscape, INT cbInput,
		     SEGPTR lpInData, SEGPTR lpOutData)
{
  return 0;
}

/***********************************************************************
 *		TTYDRV_DC_SetDeviceClipping
 */
void TTYDRV_DC_SetDeviceClipping(DC *dc)
{
  TRACE("(%p)\n", dc);
}
