/******************************Module*Header**********************************\ * * ******************* * * GDI SAMPLE CODE * * ******************* * * Module Name: lineto.c * * Copyright (c) 1994-1998 3Dlabs Inc. Ltd. All rights reserved. * Copyright (c) 1995-1999 Microsoft Corporation. All rights reserved. *****************************************************************************/ #include "precomp.h" #include "gdi.h" #include "rops.h" #include "log.h" //----------------------------------------------------------------------------- // BOOL DrvLineTo(pso, pco, pbo, x1, y1, x2, y2, prclBounds, mix) // // DrvLineTo() is an optimised, integer co-ordinate, API call that doesn't // support styling. The integer-line code in Strips.c is called to do the // hard work. // // //----------------------------------------------------------------------------- BOOL DrvLineTo( SURFOBJ* pso, CLIPOBJ* pco, BRUSHOBJ* pbo, LONG x1, LONG y1, LONG x2, LONG y2, RECTL* prclBounds, MIX mix) { PDev* ppdev; Surf* psurf; BOOL bResetHW; DWORD logicOp; RECTL* prclClip = (RECTL*)NULL; BOOL retVal; ULONG iSolidColor = pbo->iSolidColor; BOOL bResult; // // PUnt call to engine if not in video memory // psurf = (Surf*)pso->dhsurf; if (psurf->flags & SF_SM) { goto puntIt; } if (pco != NULL) { if( pco->iDComplexity == DC_COMPLEX) { // hardware does not support complex clipping goto puntIt; } else if(pco->iDComplexity == DC_RECT) { prclClip = &(pco->rclBounds); } } ppdev = (PDev*) pso->dhpdev; //@@BEGIN_DDKSPLIT #if MULTITHREADED if(ppdev->ulLockCount) { DBG_GDI((MT_LOG_LEVEL, "DrvLineTo: re-entered! %d", ppdev->ulLockCount)); } EngAcquireSemaphore(ppdev->hsemLock); ppdev->ulLockCount++; #endif //@@END_DDKSPLIT vCheckGdiContext(ppdev); ppdev->psurf = psurf; // Get the logic op. logicOp = ulRop3ToLogicop(gaMix[mix & 0xff]); // Need to set up Permedia2 modes and colors appropriately for the line. bResetHW = bInitializeStrips(ppdev, iSolidColor, logicOp, prclClip); // bFastIntegerLine expects co-ords in 28.4 format bResult = bFastIntegerLine (ppdev, x1 << 4, y1 << 4, x2 << 4, y2 << 4); // If we have to restore the state then... do it. if (bResetHW) vResetStrips(ppdev); InputBufferFlush(ppdev); //@@BEGIN_DDKSPLIT #if MULTITHREADED ppdev->ulLockCount--; EngReleaseSemaphore(ppdev->hsemLock); #endif //@@END_DDKSPLIT if(bResult) return TRUE; // we failed to draw above, fall through thus punting to engine puntIt: //@@BEGIN_DDKSPLIT #if GDI_TEST ULONG flags = vPuntBefore(NULL, pso); #endif //@@END_DDKSPLIT bResult = EngLineTo(pso, pco, pbo, x1, y1, x2, y2, prclBounds, mix); //@@BEGIN_DDKSPLIT #if GDI_TEST vPuntAfter(flags, NULL, pso); vLogPunt(); #endif //@@END_DDKSPLIT return bResult; }// DrvLineTo()