/*
 * GDI pen objects
 *
 * Copyright 1997 John Harvey
 */

#include "pen.h"
#include "color.h"
#include "win16drv.h"
#include "stddebug.h"
#include "debug.h"

/***********************************************************************
 *           PEN_SelectObject
 */
HPEN32 WIN16DRV_PEN_SelectObject( DC * dc, HPEN32 hpen, PENOBJ * pen )
{
    WIN16DRV_PDEVICE *physDev = (WIN16DRV_PDEVICE *)dc->physDev;
    HPEN32 prevHandle = dc->w.hPen;
    int		 nSize;
    LOGPEN16 	 lPen16;
    dc->w.hPen = hpen;
    printf("In WIN16DRV_PEN_SelectObject\n");
    lPen16.lopnStyle   = pen->logpen.lopnStyle;
    lPen16.lopnWidth.x = pen->logpen.lopnWidth.x;
    lPen16.lopnWidth.y = pen->logpen.lopnWidth.y;
    lPen16.lopnColor   = pen->logpen.lopnColor;
    nSize = PRTDRV_RealizeObject (physDev->segptrPDEVICE, OBJ_PEN,
                                  &lPen16, NULL, 
                                  0); 
    /*  may need to realloc segptrFOntInfo*/
    physDev->segptrPenInfo = WIN16_GlobalLock16(GlobalAlloc16(GHND, nSize));
    nSize = PRTDRV_RealizeObject(physDev->segptrPDEVICE, OBJ_PEN,
                                 &lPen16, 
                                 (LPVOID)physDev->segptrPenInfo, 
                                 0); 
                         

    return prevHandle;
}

