summaryrefslogtreecommitdiff
path: root/print/OEM Printer Customization Plug-in Samples/C++/oemprean/ddihook.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'print/OEM Printer Customization Plug-in Samples/C++/oemprean/ddihook.cpp')
-rw-r--r--print/OEM Printer Customization Plug-in Samples/C++/oemprean/ddihook.cpp2069
1 files changed, 2069 insertions, 0 deletions
diff --git a/print/OEM Printer Customization Plug-in Samples/C++/oemprean/ddihook.cpp b/print/OEM Printer Customization Plug-in Samples/C++/oemprean/ddihook.cpp
new file mode 100644
index 00000000..b3843090
--- /dev/null
+++ b/print/OEM Printer Customization Plug-in Samples/C++/oemprean/ddihook.cpp
@@ -0,0 +1,2069 @@
+// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
+// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
+// PARTICULAR PURPOSE.
+//
+// Copyright 1998 - 2003 Microsoft Corporation. All Rights Reserved.
+//
+// FILE: DDIHook.cpp
+//
+//
+// PURPOSE: DDI Hook routines for User Mode COM Customization DLL.
+//
+// This module implements the following functions defined in printoem.h:
+// OEMCopyBits
+// OEMBitBlt
+// OEMStretchBlt
+// OEMDitherColor
+// OEMStretchBltROP
+// OEMPlgBlt
+// OEMPaint
+// OEMRealizeBrush
+// OEMStrokePath
+// OEMFillPath
+// OEMStrokeAndFillPath
+// OEMLineTo
+// OEMAlphaBlend
+// OEMGradientFill
+// OEMTransparentBlt
+// OEMTextOut
+// OEMQueryFont
+// OEMQueryFontTree
+// OEMQueryFontData
+// OEMFontManagement
+// OEMQueryAdvanceWidths
+// OEMGetGlyphMode
+// OEMStartDoc
+// OEMEndDoc
+// OEMStartPage
+// OEMSendPage
+// OEMStartBanding
+// OEMNextBand
+// OEMEscape
+//
+// History:
+// 06/24/03 xxx created.
+//
+//
+
+#include "precomp.h"
+#include "oemprean.h"
+#include "debug.h"
+
+// This indicates to Prefast that this is a usermode driver file.
+_Analysis_mode_(_Analysis_code_type_user_driver_);
+
+
+BOOL APIENTRY
+OEMCopyBits(
+ SURFOBJ *psoDst,
+ SURFOBJ *psoSrc,
+ CLIPOBJ *pco,
+ XLATEOBJ *pxlo,
+ RECTL *prclDst,
+ POINTL *pptlSrc
+ )
+
+/*++
+
+Routine Description:
+
+ Implementation of DDI hook for DrvCopyBits.
+
+ DrvCopyBits translates between device-managed
+ raster surfaces and GDI standard-format bitmaps.
+ GDI will call DrvCopyBits when it needs to copy from
+ one surface to another and at least one of the
+ surfaces is device-managed.
+
+ Please refer to DDK documentation for more details.
+
+Arguments:
+
+ psoDst - Points to the Dstination surface
+ psoSrc - Points to the source surface
+ pxlo - XLATEOBJ provided by the engine
+ pco - Defines a clipping region on the Dstination surface
+ pxlo - Defines the translation of color indices
+ between the source and target surfaces
+ prclDst - Defines the area to be modified
+ pptlSrc - Defines the upper-left corner of the source rectangle
+
+Return Value:
+
+ TRUE if successful, FALSE if there is an error
+
+--*/
+
+{
+ VERBOSE(L"OEMCopyBits entry.");
+
+ PDEVOBJ pDevObj = (PDEVOBJ)psoDst->dhpdev;
+ POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM;
+
+ if (pOemPDEV->bPreAnalysis)
+ {
+ VERBOSE(TEXT("OEMCopyBits: Begin pre-analysis...\r\n"));
+
+ // Since the bPreAnalysis flag is set, this indicates that the current pass is the pre-analysis pass.
+ // Perform any pre-analysis tasks here. Note that the surface used during pre-analysis might
+ // differ from the surface passed in during the rendering pass.
+
+ // Dump the bounds of the clip window available for pre-analysis.
+ DBG_CLIPOBJ(DBG_VERBOSE, L"pco", pco);
+
+ // Although unidrv calls the hooked drawing functions, it will return before any drawing is done.
+ // So we should not perform any drawing on the surface. But all other pre-analysis tasks should
+ // be performed here. For example, certain printers need to handle black objects differently if
+ // they intersect with any color objects versus being stand alone. Another task could be to halftone
+ // stretchblt objects differently from bitblt objects. Basically, the plug-in can analyze the objects on the page.
+
+ // During the pre-analysis pass, drawing functions should not call back into Unidrv.
+ // So we return here.
+ VERBOSE(TEXT("OEMCopyBits: End pre-analysis...\r\n"));
+
+ return TRUE;
+ }
+
+ // Punt call back to UNIDRV.
+ //
+ return (pOemPDEV->m_pfnDrvCopyBits)(psoDst,
+ psoSrc,
+ pco,
+ pxlo,
+ prclDst,
+ pptlSrc);
+}
+
+BOOL APIENTRY
+OEMBitBlt(
+ SURFOBJ *psoDst,
+ SURFOBJ *psoSrc,
+ SURFOBJ *psoMask,
+ CLIPOBJ *pco,
+ XLATEOBJ *pxlo,
+ RECTL *prclDst,
+ POINTL *pptlSrc,
+ POINTL *pptlMask,
+ BRUSHOBJ *pbo,
+ POINTL *pptlBrush,
+ ROP4 rop4
+ )
+
+/*++
+
+Routine Description:
+
+ Implementation of DDI hook for DrvBitBlt.
+
+ DrvBitBlt provides general bit-block transfer capabilities
+ between device-managed surfaces, between GDI-managed
+ standard-format bitmaps, or between a device-managed
+ surface and a GDI-managed standard-format bitmap.
+
+ Please refer to DDK documentation for more details.
+
+Arguments:
+
+ psoDst - Describes the target surface
+ psoSrc - Describes the source surface
+ psoMask - Describes the mask for rop4
+ pco - Limits the area to be modified
+ pxlo - Specifies how color indices are translated
+ between the source and target surfaces
+ prclDst - Defines the area to be modified
+ pptlSrc - Defines the upper left corner of the source rectangle
+ pptlMask - Defines which pixel in the mask corresponds to
+ the upper left corner of the source rectangle
+ pbo - Defines the pattern for bitblt
+ pptlBrush - Defines the origin of the brush in the Dstination surface
+ rop4 - ROP code that defines how the mask, pattern, source, and
+ Dstination pixels are combined to write to the Dstination surface
+
+Return Value:
+
+ TRUE if successful, FALSE if there is an error
+
+--*/
+
+{
+ VERBOSE(L"OEMBitBlt entry.");
+
+ DBG_SURFOBJ(DBG_VERBOSE, L"psoDst", psoDst);
+ DBG_SURFOBJ(DBG_VERBOSE, L"psoSrc", psoSrc);
+ DBG_SURFOBJ(DBG_VERBOSE, L"psoMask", psoMask);
+ DBG_CLIPOBJ(DBG_VERBOSE, L"pco", pco);
+ DBG_XLATEOBJ(DBG_VERBOSE, L"pxlo", pxlo);
+ DBG_RECTL(DBG_VERBOSE, L"prclDst", prclDst);
+ DBG_POINTL(DBG_VERBOSE, L"pptlSrc", pptlSrc);
+ DBG_POINTL(DBG_VERBOSE, L"pptlMask", pptlMask);
+ DBG_BRUSHOBJ(DBG_VERBOSE, L"pbo", pbo);
+ DBG_POINTL(DBG_VERBOSE, L"pptlBrush", pptlBrush);
+ VERBOSE(TEXT("\nrop4: %#x\r\n\n"), rop4);
+
+ PDEVOBJ pDevObj = (PDEVOBJ)psoDst->dhpdev;
+ POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM;
+
+ if (pOemPDEV->bPreAnalysis)
+ {
+ VERBOSE(TEXT("OEMBitBlt: Begin pre-analysis...\r\n"));
+
+ // Since the bPreAnalysis flag is set, this indicates that the current pass is the pre-analysis pass.
+ // Perform any pre-analysis tasks here. Note that the surface used during pre-analysis might
+ // differ from the surface passed in during the rendering pass.
+
+ // Dump the bounds of the clip window available for pre-analysis.
+ DBG_CLIPOBJ(DBG_VERBOSE, L"pco", pco);
+
+ // Although unidrv calls the hooked drawing functions, it will return before any drawing is done.
+ // So we should not perform any drawing on the surface. But all other pre-analysis tasks should
+ // be performed here. For example, certain printers need to handle black objects differently if
+ // they intersect with any color objects versus being stand alone. Another task could be to halftone
+ // stretchblt objects differently from bitblt objects. Basically, the plug-in can analyze the objects on the page.
+
+ // During the pre-analysis pass, drawing functions should not call back into Unidrv.
+ // So we return here.
+ VERBOSE(TEXT("OEMBitBlt: End pre-analysis...\r\n"));
+
+ return TRUE;
+ }
+
+ // Punt call back to UNIDRV.
+ //
+ return (pOemPDEV->m_pfnDrvBitBlt)(psoDst,
+ psoSrc,
+ psoMask,
+ pco,
+ pxlo,
+ prclDst,
+ pptlSrc,
+ pptlMask,
+ pbo,
+ pptlBrush,
+ rop4);
+}
+
+BOOL APIENTRY
+OEMStretchBlt(
+ SURFOBJ *psoDst,
+ SURFOBJ *psoSrc,
+ SURFOBJ *psoMask,
+ CLIPOBJ *pco,
+ XLATEOBJ *pxlo,
+ COLORADJUSTMENT *pca,
+ POINTL *pptlHTOrg,
+ RECTL *prclDst,
+ RECTL *prclSrc,
+ POINTL *pptlMask,
+ ULONG iMode
+ )
+
+/*++
+
+Routine Description:
+
+ Implementation of DDI hook for DrvStretchBlt.
+
+ DrvStretchBlt provides stretching bit-block transfer
+ capabilities between any combination of device-managed
+ and GDI-managed surfaces. DrvStretchBlt enables the
+ device driver to write to GDI bitmaps, especially when the
+ driver can do halftoning. This function allows the same
+ halftoning algorithm to be applied to GDI bitmaps and
+ device surfaces. This function can be provided to handle
+ only certain forms of stretching, such as by integer multiples.
+
+ Please refer to DDK documentation for more details.
+
+Arguments:
+
+ psoDst - Defines the surface on which to draw
+ psoSrc - Defines the source for blt operation
+ psoMask - Defines a surface that provides a mask for the source
+ pco - Limits the area to be modified on the Dstination
+ pxlo - Specifies how color dwIndexes are to be translated
+ between the source and target surfaces
+ pca - Defines color adjustment values to be applied to the source bitmap
+ pptlHTOrg - Specifies the origin of the halftone brush
+ prclDst - Defines the area to be modified on the Dstination surface
+ prclSrc - Defines the area to be copied from the source surface
+ pptlMask - Specifies which pixel in the given mask corresponds to
+ the upper left pixel in the source rectangle
+ iMode - Specifies how source pixels are combined to get output pixels
+
+Return Value:
+
+ TRUE if successful, FALSE if there is an error
+
+--*/
+
+{
+ VERBOSE(L"OEMStretchBlt entry.");
+
+ DBG_SURFOBJ(DBG_VERBOSE, L"psoDst", psoDst);
+ DBG_SURFOBJ(DBG_VERBOSE, L"psoSrc", psoSrc);
+ DBG_SURFOBJ(DBG_VERBOSE, L"psoMask", psoMask);
+ DBG_CLIPOBJ(DBG_VERBOSE, L"pco", pco);
+ DBG_XLATEOBJ(DBG_VERBOSE, L"pxlo", pxlo);
+ DBG_COLORADJUSTMENT(DBG_VERBOSE, L"pca", pca);
+ DBG_POINTL(DBG_VERBOSE, L"pptlHTOrg", pptlHTOrg);
+ DBG_RECTL(DBG_VERBOSE, L"prclDst", prclDst);
+ DBG_RECTL(DBG_VERBOSE, L"prclSrc", prclSrc);
+ DBG_POINTL(DBG_VERBOSE, L"pptlMask", pptlMask);
+ VERBOSE(TEXT("\niMode: %#x\r\n\n"), iMode);
+
+ PDEVOBJ pDevObj = (PDEVOBJ)psoDst->dhpdev;
+ POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM;
+
+ if (pOemPDEV->bPreAnalysis)
+ {
+ VERBOSE(TEXT("OEMStretchBlt: Begin pre-analysis...\r\n"));
+
+ // Since the bPreAnalysis flag is set, this indicates that the current pass is the pre-analysis pass.
+ // Perform any pre-analysis tasks here. Note that the surface used during pre-analysis might
+ // differ from the surface passed in during the rendering pass.
+
+ // Dump the bounds of the clip window available for pre-analysis.
+ DBG_CLIPOBJ(DBG_VERBOSE, L"pco", pco);
+
+ // Although unidrv calls the hooked drawing functions, it will return before any drawing is done.
+ // So we should not perform any drawing on the surface. But all other pre-analysis tasks should
+ // be performed here. For example, certain printers need to handle black objects differently if
+ // they intersect with any color objects versus being stand alone. Another task could be to halftone
+ // stretchblt objects differently from bitblt objects. Basically, the plug-in can analyze the objects on the page.
+
+ // During the pre-analysis pass, drawing functions should not call back into Unidrv.
+ // So we return here.
+ VERBOSE(TEXT("OEMStretchBlt: End pre-analysis...\r\n"));
+
+ return TRUE;
+ }
+
+ // Punt call back to UNIDRV.
+ //
+ return (pOemPDEV->m_pfnDrvStretchBlt)(psoDst,
+ psoSrc,
+ psoMask,
+ pco,
+ pxlo,
+ pca,
+ pptlHTOrg,
+ prclDst,
+ prclSrc,
+ pptlMask,
+ iMode);
+}
+
+ULONG APIENTRY
+OEMDitherColor(
+ DHPDEV dhpdev,
+ ULONG iMode,
+ ULONG rgbColor,
+ ULONG *pulDither
+ )
+
+/*++
+
+Routine Description:
+
+ Implementation of DDI hook for DrvDitherColor.
+
+ DrvDitherColor requests the device to create a
+ brush dithered against a device palette.
+
+ Please refer to DDK documentation for more details.
+
+Arguments:
+
+ dhpdev - DHPDEV passed, it is our pDEV
+ iMode - Not used
+ rgbColor - Solid rgb color to be used
+ pulDither - buffer to put the halftone brush.
+
+Return Value:
+
+ Returns halftone method.
+
+ DCR_DRIVER if the dither values have been calculated by the driver.
+ DCR_SOLID if the engine should use the best solid color approximation of the color.
+ DCR_HALFTONE if the engine should create a halftone approximation for the driver.
+
+--*/
+
+{
+ VERBOSE(L"OEMDitherColor entry.");
+
+ PDEVOBJ pDevObj = (PDEVOBJ)dhpdev;
+ POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM;
+
+ // Punt call back to UNIDRV.
+ //
+ return (pOemPDEV->m_pfnDrvDitherColor)(dhpdev,
+ iMode,
+ rgbColor,
+ pulDither);
+}
+
+BOOL APIENTRY
+OEMStretchBltROP(
+ SURFOBJ *psoDst,
+ SURFOBJ *psoSrc,
+ SURFOBJ *psoMask,
+ CLIPOBJ *pco,
+ XLATEOBJ *pxlo,
+ COLORADJUSTMENT *pca,
+ POINTL *pptlHTOrg,
+ RECTL *prclDst,
+ RECTL *prclSrc,
+ POINTL *pptlMask,
+ ULONG iMode,
+ BRUSHOBJ *pbo,
+ ROP4 rop4
+ )
+
+/*++
+
+Routine Description:
+
+ Implementation of DDI hook for DrvStretchBltROP.
+
+ DrvStretchBltROP performs a stretching bit-block transfer
+ using a ROP.
+
+ Please refer to DDK documentation for more details.
+
+Arguments:
+
+ psoDst - Specifies the target surface
+ psoSrc - Specifies the source surface
+ psoMask - Specifies the mask surface
+ pco - Limits the area to be modified
+ pxlo - Specifies how color indices are translated
+ between the source and target surfaces
+ pca - Defines color adjustment values to be applied to the source bitmap
+ pptlHTOrg - Specifies the halftone origin
+ prclDst - Area to be modified on the destination surface
+ prclSrc - Rectangle area on the source surface
+ pptlMask - Defines which pixel in the mask corresponds to
+ the upper left corner of the source rectangle
+ iMode - Specifies how source pixels are combined to get output pixels
+ pbo - Defines the pattern for bitblt
+ rop4 - ROP code that defines how the mask, pattern, source, and
+ destination pixels are combined on the destination surface
+
+Return Value:
+
+ TRUE if successful, FALSE if there is an error
+
+--*/
+
+{
+ VERBOSE(L"OEMStretchBltROP entry.");
+
+ PDEVOBJ pDevObj = (PDEVOBJ)psoDst->dhpdev;
+ POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM;
+
+ if (pOemPDEV->bPreAnalysis)
+ {
+ VERBOSE(TEXT("OEMStretchBltROP: Begin pre-analysis...\r\n"));
+
+ // Since the bPreAnalysis flag is set, this indicates that the current pass is the pre-analysis pass.
+ // Perform any pre-analysis tasks here. Note that the surface used during pre-analysis might
+ // differ from the surface passed in during the rendering pass.
+
+ // Dump the bounds of the clip window available for pre-analysis.
+ DBG_CLIPOBJ(DBG_VERBOSE, L"pco", pco);
+
+ // Although unidrv calls the hooked drawing functions, it will return before any drawing is done.
+ // So we should not perform any drawing on the surface. But all other pre-analysis tasks should
+ // be performed here. For example, certain printers need to handle black objects differently if
+ // they intersect with any color objects versus being stand alone. Another task could be to halftone
+ // stretchblt objects differently from bitblt objects. Basically, the plug-in can analyze the objects on the page.
+
+ // During the pre-analysis pass, drawing functions should not call back into Unidrv.
+ // So we return here.
+ VERBOSE(TEXT("OEMStretchBltROP: End pre-analysis...\r\n"));
+
+ return TRUE;
+ }
+
+ // Punt call back to UNIDRV.
+ //
+ return (pOemPDEV->m_pfnDrvStretchBltROP)(psoDst,
+ psoSrc,
+ psoMask,
+ pco,
+ pxlo,
+ pca,
+ pptlHTOrg,
+ prclDst,
+ prclSrc,
+ pptlMask,
+ iMode,
+ pbo,
+ rop4);
+}
+
+BOOL APIENTRY
+OEMPlgBlt(
+ SURFOBJ *psoDst,
+ SURFOBJ *psoSrc,
+ SURFOBJ *psoMask,
+ CLIPOBJ *pco,
+ XLATEOBJ *pxlo,
+ COLORADJUSTMENT *pca,
+ POINTL *pptlBrushOrg,
+ POINTFIX *pptfixDest,
+ RECTL *prclSrc,
+ POINTL *pptlMask,
+ ULONG iMode
+ )
+/*++
+
+Routine Description:
+
+ Implementation of DDI hook for DrvPlgBlt.
+
+ DrvPlgBlt provides rotate bit-block transfer capabilities between
+ combinations of device-managed and GDI-managed surfaces.
+
+ Please refer to DDK documentation for more details.
+
+Arguments:
+
+ psoDst - Defines the surface on which to draw
+ psoSrc - Defines the source for blt operation
+ psoMask - Defines a surface that provides a mask for the source
+ pco - Limits the area to be modified on the Dstination
+ pxlo - Specifies how color dwIndexes are to be translated
+ between the source and target surfaces
+ pca - Defines color adjustment values to be applied to the source bitmap
+ pptlBrushOrg - Specifies the origin of the halftone brush
+ pptfixDest - Defines the area to be modified on the Dstination surface
+ prclSrc - Defines the area to be copied from the source surface
+ pptlMask - Specifies which pixel in the given mask corresponds to
+ the upper left pixel in the source rectangle
+ iMode - Specifies how source pixels are combined to get output pixels
+
+Return Value:
+
+ TRUE if successful, FALSE if there is an error
+
+--*/
+
+{
+ VERBOSE(L"OEMPlgBlt entry.");
+
+ PDEVOBJ pDevObj = (PDEVOBJ)psoDst->dhpdev;
+ POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM;
+
+ if (pOemPDEV->bPreAnalysis)
+ {
+ VERBOSE(TEXT("OEMPlgBlt: Begin pre-analysis...\r\n"));
+
+ // Since the bPreAnalysis flag is set, this indicates that the current pass is the pre-analysis pass.
+ // Perform any pre-analysis tasks here. Note that the surface used during pre-analysis might
+ // differ from the surface passed in during the rendering pass.
+
+ // Dump the bounds of the clip window available for pre-analysis.
+ DBG_CLIPOBJ(DBG_VERBOSE, L"pco", pco);
+
+ // Although unidrv calls the hooked drawing functions, it will return before any drawing is done.
+ // So we should not perform any drawing on the surface. But all other pre-analysis tasks should
+ // be performed here. For example, certain printers need to handle black objects differently if
+ // they intersect with any color objects versus being stand alone. Another task could be to halftone
+ // stretchblt objects differently from bitblt objects. Basically, the plug-in can analyze the objects on the page.
+
+ // During the pre-analysis pass, drawing functions should not call back into Unidrv.
+ // So we return here.
+ VERBOSE(TEXT("OEMPlgBlt: End pre-analysis...\r\n"));
+
+ return TRUE;
+ }
+
+ // Punt call back to UNIDRV.
+ //
+ return (pOemPDEV->m_pfnDrvPlgBlt)(psoDst,
+ psoSrc,
+ psoMask,
+ pco,
+ pxlo,
+ pca,
+ pptlBrushOrg,
+ pptfixDest,
+ prclSrc,
+ pptlMask,
+ iMode);
+}
+
+BOOL APIENTRY
+OEMPaint(
+ SURFOBJ *pso,
+ CLIPOBJ *pco,
+ BRUSHOBJ *pbo,
+ POINTL *pptlBrushOrg,
+ MIX mix
+ )
+/*++
+
+Routine Description:
+
+ Implementation of DDI hook for DrvPaint.
+
+ DrvPaint is an obsolete function.
+
+ Please refer to DDK documentation for more details.
+
+Arguments:
+
+ pso - Defines the surface on which to draw
+ pco - Limits the area to be modified on the Dstination
+ pbo - Points to a BRUSHOBJ which defined the pattern and colors to fill with
+ pptlBrushOrg - Specifies the origin of the halftone brush
+ mix - Defines the foreground and background raster operations to use for
+ the brush
+
+Return Value:
+
+ TRUE if successful, FALSE if there is an error
+
+--*/
+
+{
+ VERBOSE(L"OEMPaint entry.");
+
+ PDEVOBJ pDevObj = (PDEVOBJ)pso->dhpdev;
+ POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM;
+
+ if (pOemPDEV->bPreAnalysis)
+ {
+ VERBOSE(TEXT("OEMPaint: Begin pre-analysis...\r\n"));
+
+ // Since the bPreAnalysis flag is set, this indicates that the current pass is the pre-analysis pass.
+ // Perform any pre-analysis tasks here. Note that the surface used during pre-analysis might
+ // differ from the surface passed in during the rendering pass.
+
+ // Dump the bounds of the clip window available for pre-analysis.
+ DBG_CLIPOBJ(DBG_VERBOSE, L"pco", pco);
+
+ // Although unidrv calls the hooked drawing functions, it will return before any drawing is done.
+ // So we should not perform any drawing on the surface. But all other pre-analysis tasks should
+ // be performed here. For example, certain printers need to handle black objects differently if
+ // they intersect with any color objects versus being stand alone. Another task could be to halftone
+ // stretchblt objects differently from bitblt objects. Basically, the plug-in can analyze the objects on the page.
+
+ // During the pre-analysis pass, drawing functions should not call back into Unidrv.
+ // So we return here.
+ VERBOSE(TEXT("OEMPaint: End pre-analysis...\r\n"));
+
+ return TRUE;
+ }
+
+ // Punt call back to UNIDRV.
+ //
+ return (pOemPDEV->m_pfnDrvPaint)(pso,
+ pco,
+ pbo,
+ pptlBrushOrg,
+ mix);
+}
+
+BOOL APIENTRY
+OEMRealizeBrush(
+ BRUSHOBJ *pbo,
+ SURFOBJ *psoTarget,
+ SURFOBJ *psoPattern,
+ SURFOBJ *psoMask,
+ XLATEOBJ *pxlo,
+ ULONG iHatch
+ )
+
+/*++
+
+Routine Description:
+
+ Implementation of DDI hook for DrvRealizeBrush.
+
+ DrvRealizeBrush requests that the driver realize a specified brush
+ for a specified surface. To realize a brush, the driver converts a
+ GDI brush into a form that can be used internally. A realized brush
+ contains device-specific information needed by the device to
+ accelerate drawing using the brush. The driver's realization of a brush
+ is written into the buffer allocated by a call to BRUSHOBJ_pvAllocRBrush.
+
+ Please refer to DDK documentation for more details.
+
+Arguments:
+
+ pbo - BRUSHOBJ to be realized
+ psoTarget - Defines the surface for which the brush is to be realized
+ psoPattern - Defines the pattern for the brush
+ psoMask - Transparency mask for the brush
+ pxlo - Defines the interpretration of colors in the pattern
+ iHatch - Specifies whether psoPattern is one of the hatch brushes
+
+Return Value:
+
+ TRUE if successful, FALSE if there is an error
+
+--*/
+
+{
+ VERBOSE(L"OEMRealizeBrush entry.");
+
+ PDEVOBJ pDevObj = (PDEVOBJ)psoTarget->dhpdev;
+ POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM;
+
+ // Punt call back to UNIDRV.
+ //
+ return (pOemPDEV->m_pfnDrvRealizeBrush)(pbo,
+ psoTarget,
+ psoPattern,
+ psoMask,
+ pxlo,
+ iHatch);
+}
+
+BOOL APIENTRY
+OEMStrokePath(
+ SURFOBJ *pso,
+ PATHOBJ *ppo,
+ CLIPOBJ *pco,
+ XFORMOBJ *pxo,
+ BRUSHOBJ *pbo,
+ POINTL *pptlBrushOrg,
+ LINEATTRS *plineattrs,
+ MIX mix
+ )
+
+/*++
+
+Routine Description:
+
+ Implementation of DDI hook for DrvStrokePath.
+
+ DrvStrokePath strokes a path when called by GDI.
+
+ Please refer to DDK documentation for more details.
+
+Arguments:
+
+ pso - Identifies the surface on which to draw
+ ppo - Defines the path to be stroked
+ pco - Defines the clipping path
+ pxo - Specifies the world to device coordinate transformation
+ pbo - Specifies the brush to be used when drawing the path
+ pptlBrushOrg - Defines the brush origin
+ plineattrs - Defines the line attributes
+ mix - Specifies how to combine the brush with the destination
+
+Return Value:
+
+ TRUE if successful
+ FALSE if driver cannot handle the path
+ DDI_ERROR if there is an error
+
+--*/
+
+{
+ VERBOSE(L"OEMStrokePath entry.");
+
+ PDEVOBJ pDevObj = (PDEVOBJ)pso->dhpdev;
+ POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM;
+
+ if (pOemPDEV->bPreAnalysis)
+ {
+ VERBOSE(TEXT("OEMStrokePath: Begin pre-analysis...\r\n"));
+
+ // Since the bPreAnalysis flag is set, this indicates that the current pass is the pre-analysis pass.
+ // Perform any pre-analysis tasks here. Note that the surface used during pre-analysis might
+ // differ from the surface passed in during the rendering pass.
+
+ // Dump the bounds of the clip window available for pre-analysis.
+ DBG_CLIPOBJ(DBG_VERBOSE, L"pco", pco);
+
+ // Although unidrv calls the hooked drawing functions, it will return before any drawing is done.
+ // So we should not perform any drawing on the surface. But all other pre-analysis tasks should
+ // be performed here. For example, certain printers need to handle black objects differently if
+ // they intersect with any color objects versus being stand alone. Another task could be to halftone
+ // stretchblt objects differently from bitblt objects. Basically, the plug-in can analyze the objects on the page.
+
+ // During the pre-analysis pass, drawing functions should not call back into Unidrv.
+ // So we return here.
+ VERBOSE(TEXT("OEMStrokePath: End pre-analysis...\r\n"));
+
+ return TRUE;
+ }
+
+ // Punt call back to UNIDRV.
+ //
+ return (pOemPDEV->m_pfnDrvStrokePath)(pso,
+ ppo,
+ pco,
+ pxo,
+ pbo,
+ pptlBrushOrg,
+ plineattrs,
+ mix);
+}
+
+BOOL APIENTRY
+OEMFillPath(
+ SURFOBJ *pso,
+ PATHOBJ *ppo,
+ CLIPOBJ *pco,
+ BRUSHOBJ *pbo,
+ POINTL *pptlBrushOrg,
+ MIX mix,
+ FLONG flOptions
+ )
+
+/*++
+
+Routine Description:
+
+ Implementation of DDI hook for DrvFillPath.
+
+ DrvFillPath is an optional entry point to handle the filling of closed paths.
+ GDI can call DrvFillPath to fill a path on a device-managed surface.
+ When deciding whether to call this function, GDI compares the fill
+ requirements with the following flags in the flGraphicsCaps member of
+ the DEVINFO structure: GCAPS_BEZIERS, GCAPS_ALTERNATEFILL,
+ and GCAPS_WINDINGFILL.
+
+ Please refer to DDK documentation for more details.
+
+Arguments:
+
+ pso - Defines the surface on which to draw.
+ ppo - Defines the path to be filled
+ pco - Defines the clipping path
+ pbo - Defines the pattern and colors to fill with
+ pptlBrushOrg - Defines the brush origin
+ mix - Defines the foreground and background ROPs to use for the brush
+ flOptions - Whether to use zero-winding or odd-even rule
+
+Return Value:
+
+ TRUE if successful
+ FALSE if driver cannot handle the path
+ DDI_ERROR if there is an error
+
+--*/
+
+{
+ VERBOSE(L"OEMFillPath entry.");
+
+ PDEVOBJ pDevObj = (PDEVOBJ)pso->dhpdev;
+ POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM;
+
+ if (pOemPDEV->bPreAnalysis)
+ {
+ VERBOSE(TEXT("OEMFillPath: Begin pre-analysis...\r\n"));
+
+ // Since the bPreAnalysis flag is set, this indicates that the current pass is the pre-analysis pass.
+ // Perform any pre-analysis tasks here. Note that the surface used during pre-analysis might
+ // differ from the surface passed in during the rendering pass.
+
+ // Dump the bounds of the clip window available for pre-analysis.
+ DBG_CLIPOBJ(DBG_VERBOSE, L"pco", pco);
+
+ // Although unidrv calls the hooked drawing functions, it will return before any drawing is done.
+ // So we should not perform any drawing on the surface. But all other pre-analysis tasks should
+ // be performed here. For example, certain printers need to handle black objects differently if
+ // they intersect with any color objects versus being stand alone. Another task could be to halftone
+ // stretchblt objects differently from bitblt objects. Basically, the plug-in can analyze the objects on the page.
+
+ // During the pre-analysis pass, drawing functions should not call back into Unidrv.
+ // So we return here.
+ VERBOSE(TEXT("OEMFillPath: End pre-analysis...\r\n"));
+
+ return TRUE;
+ }
+
+ // Punt call back to UNIDRV.
+ //
+ return (pOemPDEV->m_pfnDrvFillPath)(pso,
+ ppo,
+ pco,
+ pbo,
+ pptlBrushOrg,
+ mix,
+ flOptions);
+}
+
+BOOL APIENTRY
+OEMStrokeAndFillPath(
+ SURFOBJ *pso,
+ PATHOBJ *ppo,
+ CLIPOBJ *pco,
+ XFORMOBJ *pxo,
+ BRUSHOBJ *pboStroke,
+ LINEATTRS *plineattrs,
+ BRUSHOBJ *pboFill,
+ POINTL *pptlBrushOrg,
+ MIX mixFill,
+ FLONG flOptions
+ )
+
+/*++
+
+Routine Description:
+
+ Implementation of DDI hook for DrvStrokeAndFillPath.
+
+ DrvStrokeAndFillPath strokes and fills a path concurrently.
+ The driver can return FALSE if the path or the clipping is too
+ complex for the device to handle; in that case, GDI converts
+ to a simpler call. For example, if the device driver has set the
+ GCAPS_BEZIERS flag in the flGraphicsCaps member of the
+ DEVINFO structure and then receives a path with Bezier curves,
+ it can return FALSE; GDI will then convert the Bezier curves to
+ lines and call DrvStrokeAndFillPath again. If the device driver
+ returns FALSE again, GDI will further simplify the call, making
+ calls to DrvStrokePath and DrvFillPath, or to DrvBitBlt, depending
+ on the mix and width of the lines making up the path.
+
+ Please refer to DDK documentation for more details.
+
+Arguments:
+
+ pso - Describes the surface on which to draw
+ ppo - Describes the path to be filled
+ pco - Defines the clipping path
+ pxo - Specifies the world to device coordinate transformation
+ pboStroke - Specifies the brush to use when stroking the path
+ plineattrs - Specifies the line attributes
+ pboFill - Specifies the brush to use when filling the path
+ pptlBrushOrg - Specifies the brush origin for both brushes
+ mixFill - Specifies the foreground and background ROPs to use
+ for the fill brush
+ flOptions - Whether to use zero-winding or odd-even rule
+
+Return Value:
+
+ TRUE if successful
+ FALSE if driver cannot handle the path
+ DDI_ERROR if there is an error
+
+--*/
+
+{
+ VERBOSE(L"OEMStrokeAndFillPath entry.");
+
+ PDEVOBJ pDevObj = (PDEVOBJ)pso->dhpdev;
+ POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM;
+
+ if (pOemPDEV->bPreAnalysis)
+ {
+ VERBOSE(TEXT("OEMStrokeAndFillPath: Begin pre-analysis...\r\n"));
+
+ // Since the bPreAnalysis flag is set, this indicates that the current pass is the pre-analysis pass.
+ // Perform any pre-analysis tasks here. Note that the surface used during pre-analysis might
+ // differ from the surface passed in during the rendering pass.
+
+ // Dump the bounds of the clip window available for pre-analysis.
+ DBG_CLIPOBJ(DBG_VERBOSE, L"pco", pco);
+
+ // Although unidrv calls the hooked drawing functions, it will return before any drawing is done.
+ // So we should not perform any drawing on the surface. But all other pre-analysis tasks should
+ // be performed here. For example, certain printers need to handle black objects differently if
+ // they intersect with any color objects versus being stand alone. Another task could be to halftone
+ // stretchblt objects differently from bitblt objects. Basically, the plug-in can analyze the objects on the page.
+
+ // During the pre-analysis pass, drawing functions should not call back into Unidrv.
+ // So we return here.
+ VERBOSE(TEXT("OEMStrokeAndFillPath: End pre-analysis...\r\n"));
+
+ return TRUE;
+ }
+
+ // Punt call back to UNIDRV.
+ //
+ return (pOemPDEV->m_pfnDrvStrokeAndFillPath)(pso,
+ ppo,
+ pco,
+ pxo,
+ pboStroke,
+ plineattrs,
+ pboFill,
+ pptlBrushOrg,
+ mixFill,
+ flOptions);
+}
+
+BOOL APIENTRY
+OEMLineTo(
+ SURFOBJ *pso,
+ CLIPOBJ *pco,
+ BRUSHOBJ *pbo,
+ LONG x1,
+ LONG y1,
+ LONG x2,
+ LONG y2,
+ RECTL *prclBounds,
+ MIX mix
+ )
+
+/*++
+
+Routine Description:
+
+ Implementation of DDI hook for DrvLineTo.
+
+ DrvLineTo draws a single, solid, integer-only cosmetic line.
+
+ Please refer to DDK documentation for more details.
+
+Arguments:
+
+ pso - Describes the surface on which to draw
+ pco - Defines the clipping path
+ pbo - Defines the brush used to draw the line
+ x1,y1 - Specifies the line's starting point
+ x2,y2 - Specifies the line's ending point
+ prclBounds - Defines a rectangle that bounds the unclipped line.
+ mix - Specifies the foreground and background ROP
+
+Return Value:
+
+ TRUE if successful
+ FALSE if driver cannot handle the path
+ DDI_ERROR if there is an error
+
+--*/
+
+{
+ VERBOSE(L"OEMLineTo entry.");
+
+ PDEVOBJ pDevObj = (PDEVOBJ)pso->dhpdev;
+ POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM;
+
+ if (pOemPDEV->bPreAnalysis)
+ {
+ VERBOSE(TEXT("OEMLineTo: Begin pre-analysis...\r\n"));
+
+ // Since the bPreAnalysis flag is set, this indicates that the current pass is the pre-analysis pass.
+ // Perform any pre-analysis tasks here. Note that the surface used during pre-analysis might
+ // differ from the surface passed in during the rendering pass.
+
+ // Dump the bounds of the clip window available for pre-analysis.
+ DBG_CLIPOBJ(DBG_VERBOSE, L"pco", pco);
+
+ // Although unidrv calls the hooked drawing functions, it will return before any drawing is done.
+ // So we should not perform any drawing on the surface. But all other pre-analysis tasks should
+ // be performed here. For example, certain printers need to handle black objects differently if
+ // they intersect with any color objects versus being stand alone. Another task could be to halftone
+ // stretchblt objects differently from bitblt objects. Basically, the plug-in can analyze the objects on the page.
+
+ // During the pre-analysis pass, drawing functions should not call back into Unidrv.
+ // So we return here.
+ VERBOSE(TEXT("OEMLineTo: End pre-analysis...\r\n"));
+
+ return TRUE;
+ }
+
+ // Punt call back to UNIDRV.
+ //
+ return (pOemPDEV->m_pfnDrvLineTo)(pso,
+ pco,
+ pbo,
+ x1,
+ y1,
+ x2,
+ y2,
+ prclBounds,
+ mix);
+}
+
+BOOL APIENTRY
+OEMAlphaBlend(
+ SURFOBJ *psoDest,
+ SURFOBJ *psoSrc,
+ CLIPOBJ *pco,
+ XLATEOBJ *pxlo,
+ RECTL *prclDest,
+ RECTL *prclSrc,
+ BLENDOBJ *pBlendObj
+ )
+
+/*++
+
+Routine Description:
+
+ Implementation of DDI hook for DrvAlphaBlend.
+
+ DrvAlphaBlend provides bit-block transfer capabilities with alpha blending.
+
+ Please refer to DDK documentation for more details.
+
+Arguments:
+
+ psoDest - Defines the surface on which to draw
+ psoSrc - Defines the source
+ pco - Limits the area to be modified on the Destination
+ pxlo - Specifies how color dwIndexes are to be translated
+ between the source and target surfaces
+ prclDest - Defines the area to be modified on the Destination surface
+ prclSrc - Defines the area to be copied from the source surface
+ BlendFunction - Specifies the blend function to be used
+
+Return Value:
+
+ TRUE if successful, FALSE if there is an error
+
+--*/
+
+{
+ VERBOSE(L"OEMAlphaBlend entry.");
+
+ PDEVOBJ pDevObj = (PDEVOBJ)psoDest->dhpdev;
+ POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM;
+
+ if (pOemPDEV->bPreAnalysis)
+ {
+ VERBOSE(TEXT("OEMAlphaBlend: Begin pre-analysis...\r\n"));
+
+ // Since the bPreAnalysis flag is set, this indicates that the current pass is the pre-analysis pass.
+ // Perform any pre-analysis tasks here. Note that the surface used during pre-analysis might
+ // differ from the surface passed in during the rendering pass.
+
+ // Dump the bounds of the clip window available for pre-analysis.
+ DBG_CLIPOBJ(DBG_VERBOSE, L"pco", pco);
+
+ // Although unidrv calls the hooked drawing functions, it will return before any drawing is done.
+ // So we should not perform any drawing on the surface. But all other pre-analysis tasks should
+ // be performed here. For example, certain printers need to handle black objects differently if
+ // they intersect with any color objects versus being stand alone. Another task could be to halftone
+ // stretchblt objects differently from bitblt objects. Basically, the plug-in can analyze the objects on the page.
+
+ // During the pre-analysis pass, drawing functions should not call back into Unidrv.
+ // So we return here.
+ VERBOSE(TEXT("OEMAlphaBlend: End pre-analysis...\r\n"));
+
+ return TRUE;
+ }
+
+ // Punt call back to UNIDRV.
+ //
+ return (pOemPDEV->m_pfnDrvAlphaBlend)(psoDest,
+ psoSrc,
+ pco,
+ pxlo,
+ prclDest,
+ prclSrc,
+ pBlendObj);
+}
+
+BOOL APIENTRY
+OEMGradientFill(
+ SURFOBJ *psoDest,
+ CLIPOBJ *pco,
+ XLATEOBJ *pxlo,
+ TRIVERTEX *pVertex,
+ ULONG nVertex,
+ PVOID pMesh,
+ ULONG nMesh,
+ RECTL *prclExtents,
+ POINTL *pptlDitherOrg,
+ ULONG ulMode
+ )
+
+/*++
+
+Routine Description:
+
+ Implementation of DDI hook for DrvGradientFill.
+
+ DrvGradientFill shades the specified primitives.
+
+ Please refer to DDK documentation for more details.
+
+Arguments:
+
+ psoDest - Defines the surface on which to draw
+ pco - Limits the area to be modified on the Destination
+ pxlo - Should be ignored by the driver
+ pVertex - Pointer to an array of TRIVERTEX structures,
+ with each entry containing position and color information
+ nVertex - Specifies the number of TRIVERTEX structures in the
+ array to which pVertex points
+ pMesh - Pointer to an array of structures that define the connectivity
+ of the TRIVERTEX elements to which pVertex points
+ nMesh - Specifies the number of elements in the array to which
+ pMesh points
+ prclExtents - Pointer to a RECTL structure that defines the area in
+ which the gradient drawing is to occur
+ pptlDitherOrg - Pointer to a POINTL structure that defines the origin
+ on the surface for dithering
+ ulMode - Specifies the current drawing mode and how to interpret
+ the array to which pMesh points
+
+Return Value:
+
+ TRUE if successful, FALSE if there is an error
+
+--*/
+
+{
+ VERBOSE(L"OEMGradientFill entry.");
+
+ PDEVOBJ pDevObj = (PDEVOBJ)psoDest->dhpdev;
+ POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM;
+
+ if (pOemPDEV->bPreAnalysis)
+ {
+ VERBOSE(TEXT("OEMGradientFill: Begin pre-analysis...\r\n"));
+
+ // Since the bPreAnalysis flag is set, this indicates that the current pass is the pre-analysis pass.
+ // Perform any pre-analysis tasks here. Note that the surface used during pre-analysis might
+ // differ from the surface passed in during the rendering pass.
+
+ // Dump the bounds of the clip window available for pre-analysis.
+ DBG_CLIPOBJ(DBG_VERBOSE, L"pco", pco);
+
+ // Although unidrv calls the hooked drawing functions, it will return before any drawing is done.
+ // So we should not perform any drawing on the surface. But all other pre-analysis tasks should
+ // be performed here. For example, certain printers need to handle black objects differently if
+ // they intersect with any color objects versus being stand alone. Another task could be to halftone
+ // stretchblt objects differently from bitblt objects. Basically, the plug-in can analyze the objects on the page.
+
+ // During the pre-analysis pass, drawing functions should not call back into Unidrv.
+ // So we return here.
+ VERBOSE(TEXT("OEMGradientFill: End pre-analysis...\r\n"));
+
+ return TRUE;
+ }
+
+ // Punt call back to UNIDRV.
+ //
+ return (pOemPDEV->m_pfnDrvGradientFill)(psoDest,
+ pco,
+ pxlo,
+ pVertex,
+ nVertex,
+ pMesh,
+ nMesh,
+ prclExtents,
+ pptlDitherOrg,
+ ulMode);
+}
+
+BOOL APIENTRY
+OEMTransparentBlt(
+ SURFOBJ *psoDst,
+ SURFOBJ *psoSrc,
+ CLIPOBJ *pco,
+ XLATEOBJ *pxlo,
+ RECTL *prclDst,
+ RECTL *prclSrc,
+ ULONG iTransColor,
+ ULONG ulReserved
+ )
+
+/*++
+
+Routine Description:
+
+ Implementation of DDI hook for DrvTransparentBlt.
+
+ DrvTransparentBlt provides bit-block transfer capabilities with
+ transparency.
+
+ Please refer to DDK documentation for more details.
+
+Arguments:
+
+ psoDst - Defines the surface on which to draw
+ psoSrc - Defines the source
+ pco - Limits the area to be modified on the Destination
+ pxlo - Specifies how color dwIndexes are to be translated
+ between the source and target surfaces
+ prclDst - Defines the area to be modified on the Destination surface
+ prclSrc - Defines the area to be copied from the source surface
+ iTransColor - Specifies the transparent color
+
+Return Value:
+
+ TRUE if successful, FALSE if there is an error
+
+--*/
+
+{
+ VERBOSE(L"OEMTransparentBlt entry.");
+
+ PDEVOBJ pDevObj = (PDEVOBJ)psoDst->dhpdev;
+ POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM;
+
+ if (pOemPDEV->bPreAnalysis)
+ {
+ VERBOSE(TEXT("OEMTransparentBlt: Begin pre-analysis...\r\n"));
+
+ // Since the bPreAnalysis flag is set, this indicates that the current pass is the pre-analysis pass.
+ // Perform any pre-analysis tasks here. Note that the surface used during pre-analysis might
+ // differ from the surface passed in during the rendering pass.
+
+ // Dump the bounds of the clip window available for pre-analysis.
+ DBG_CLIPOBJ(DBG_VERBOSE, L"pco", pco);
+
+ // Although unidrv calls the hooked drawing functions, it will return before any drawing is done.
+ // So we should not perform any drawing on the surface. But all other pre-analysis tasks should
+ // be performed here. For example, certain printers need to handle black objects differently if
+ // they intersect with any color objects versus being stand alone. Another task could be to halftone
+ // stretchblt objects differently from bitblt objects. Basically, the plug-in can analyze the objects on the page.
+
+ // During the pre-analysis pass, drawing functions should not call back into Unidrv.
+ // So we return here.
+ VERBOSE(TEXT("OEMTransparentBlt: End pre-analysis...\r\n"));
+
+ return TRUE;
+ }
+
+ // Punt call back to UNIDRV.
+ //
+ return (pOemPDEV->m_pfnDrvTransparentBlt)(psoDst,
+ psoSrc,
+ pco,
+ pxlo,
+ prclDst,
+ prclSrc,
+ iTransColor,
+ ulReserved);
+}
+
+BOOL APIENTRY
+OEMTextOut(
+ SURFOBJ *pso,
+ STROBJ *pstro,
+ FONTOBJ *pfo,
+ CLIPOBJ *pco,
+ RECTL *prclExtra,
+ RECTL *prclOpaque,
+ BRUSHOBJ *pboFore,
+ BRUSHOBJ *pboOpaque,
+ POINTL *pptlOrg,
+ MIX mix
+ )
+
+/*++
+
+Routine Description:
+
+ Implementation of DDI hook for DrvTextOut.
+
+ DrvTextOut is the entry point from GDI that calls for the
+ driver to render a set of glyphs at specified positions.
+
+ Please refer to DDK documentation for more details.
+
+Arguments:
+
+ pso - Defines the surface on which to be written.
+ pstro - Defines the glyphs to be rendered and their positions
+ pfo - Specifies the font to be used
+ pco - Defines the clipping path
+ prclExtra - A NULL-terminated array of rectangles to be filled
+ prclOpaque - Specifies an opaque rectangle
+ pboFore - Defines the foreground brush
+ pboOpaque - Defines the opaque brush
+ pptlOrg - Pointer to POINT struct , defining th origin
+ mix - Specifies the foreground and background ROPs for pboFore
+
+Return Value:
+
+ TRUE if successful, FALSE if there is an error
+
+--*/
+
+{
+ VERBOSE(L"OEMTextOut entry.");
+
+ PDEVOBJ pDevObj = (PDEVOBJ)pso->dhpdev;
+ POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM;
+
+ DBG_SURFOBJ(DBG_VERBOSE, L"pso", pso);
+ DBG_STROBJ(DBG_VERBOSE, L"pstro", pstro);
+ DBG_FONTOBJ(DBG_VERBOSE, L"pfo", pfo);
+ DBG_CLIPOBJ(DBG_VERBOSE, L"pco", pco);
+ DBG_BRUSHOBJ(DBG_VERBOSE, L"pboFore", pboFore);
+ DBG_BRUSHOBJ(DBG_VERBOSE, L"pboOpaque", pboOpaque);
+
+ if (pOemPDEV->bPreAnalysis)
+ {
+ VERBOSE(TEXT("OEMTextOut: Begin pre-analysis...\r\n"));
+
+ // Since the bPreAnalysis flag is set, this indicates that the current pass is the pre-analysis pass.
+ // Perform any pre-analysis tasks here. Note that the surface used during pre-analysis might
+ // differ from the surface passed in during the rendering pass.
+
+ // Dump the bounds of the clip window available for pre-analysis.
+ DBG_CLIPOBJ(DBG_VERBOSE, L"pco", pco);
+
+ // Although unidrv calls the hooked drawing functions, it will return before any drawing is done.
+ // So we should not perform any drawing on the surface. But all other pre-analysis tasks should
+ // be performed here. For example, certain printers need to handle black objects differently if
+ // they intersect with any color objects versus being stand alone. Another task could be to halftone
+ // stretchblt objects differently from bitblt objects. Basically, the plug-in can analyze the objects on the page.
+
+ // During the pre-analysis pass, drawing functions should not call back into Unidrv.
+ // So we return here.
+ VERBOSE(TEXT("OEMTextOut: End pre-analysis...\r\n"));
+
+ return TRUE;
+ }
+
+ // Punt call back to UNIDRV.
+ //
+ return (pOemPDEV->m_pfnDrvTextOut)(pso,
+ pstro,
+ pfo,
+ pco,
+ prclExtra,
+ prclOpaque,
+ pboFore,
+ pboOpaque,
+ pptlOrg,
+ mix);
+}
+
+PIFIMETRICS APIENTRY
+OEMQueryFont(
+ DHPDEV dhpdev,
+ ULONG_PTR iFile,
+ ULONG iFace,
+ ULONG_PTR *pid
+ )
+
+/*++
+
+Routine Description:
+
+ Implementation of DDI hook for DrvQueryFont.
+
+ DrvQueryFont is used by GDI to get the IFIMETRICS structure
+ for a given font.
+
+ Please refer to DDK documentation for more details.
+
+Arguments:
+
+ dhpdev - Driver device handle
+ iFile - Identifies the driver font file
+ iFace - One-based index of the driver font
+ pid - Points to a LONG variable for returning an identifier
+ which GDI will pass to DrvFree
+
+Return Value:
+
+ Pointer to an IFIMETRICS structure for the given font.
+ NULL if there is an error
+
+--*/
+
+{
+ VERBOSE(L"OEMQueryFont entry.");
+
+ PDEVOBJ pDevObj = (PDEVOBJ)dhpdev;
+ POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM;
+
+ // Punt call back to UNIDRV.
+ //
+ return (pOemPDEV->m_pfnDrvQueryFont)(dhpdev,
+ iFile,
+ iFace,
+ pid);
+}
+
+PVOID APIENTRY
+OEMQueryFontTree(
+ DHPDEV dhpdev,
+ ULONG_PTR iFile,
+ ULONG iFace,
+ ULONG iMode,
+ ULONG_PTR *pid
+ )
+
+/*++
+
+Routine Description:
+
+ Implementation of DDI hook for DrvQueryFontTree.
+
+ DrvQueryFontTree provides GDI with a pointer to a structure that
+ defines one of the following:
+ - A mapping from Unicode to glyph handles, including glyph variants
+ - A mapping of kerning pairs to kerning handles
+
+ Please refer to DDK documentation for more details.
+
+Arguments:
+
+ dhpdev - Driver device handle
+ iFile - Identifies the driver font file
+ iFace - One-based index of the driver font
+ iMode - Specifies the type of information to be provided
+ pid - Points to a LONG variable for returning an identifier
+ which GDI will pass to DrvFree
+
+Return Value:
+
+ Pointer to the structure requested based on iMode.
+ NULL if there is an error
+
+--*/
+
+{
+ VERBOSE(L"OEMQueryFontTree entry.");
+
+ PDEVOBJ pDevObj = (PDEVOBJ)dhpdev;
+ POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM;
+
+ // Punt call back to UNIDRV.
+ //
+ return (pOemPDEV->m_pfnDrvQueryFontTree)(dhpdev,
+ iFile,
+ iFace,
+ iMode,
+ pid);
+}
+
+LONG APIENTRY
+OEMQueryFontData(
+ DHPDEV dhpdev,
+ FONTOBJ *pfo,
+ ULONG iMode,
+ HGLYPH hg,
+ GLYPHDATA *pgd,
+ _Out_writes_bytes_(cjSize) PVOID pv,
+ ULONG cjSize
+ )
+
+/*++
+
+Routine Description:
+
+ Implementation of DDI hook for DrvQueryFontData.
+
+ DrvQueryFontData retrieves information about a realized font.
+ GDI provides a pointer to an array of glyph or kerning handles,
+ and the driver returns information about the glyphs or kerning
+ pairs. The driver can assume that all handles in the array are valid.
+
+ Please refer to DDK documentation for more details.
+
+Arguments:
+
+ dhpdev - Driver device handle
+ pfo - Points to a FONTOBJ structure
+ iMode - Type of information requested
+ hg - A glyph handle
+ pgd - Points to a GLYPHDATA structure
+ pv - Points to output buffer
+ cjSize - Size of output buffer
+
+Return Value:
+
+ Depends on iMode. FD_ERROR if there is an error
+
+--*/
+
+{
+ VERBOSE(L"OEMQueryFontData entry.");
+
+ PDEVOBJ pDevObj = (PDEVOBJ)dhpdev;
+ POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM;
+
+ // Punt call back to UNIDRV.
+ //
+ return (pOemPDEV->m_pfnDrvQueryFontData)(dhpdev,
+ pfo,
+ iMode,
+ hg,
+ pgd,
+ pv,
+ cjSize);
+}
+
+ULONG APIENTRY
+OEMFontManagement(
+ SURFOBJ *pso,
+ FONTOBJ *pfo,
+ ULONG iMode,
+ ULONG cjIn,
+ _In_reads_bytes_(cjIn) PVOID pvIn,
+ ULONG cjOut,
+ _Out_writes_bytes_(cjOut) PVOID pvOut
+ )
+
+/*++
+
+Routine Description:
+
+ Implementation of DDI hook for DrvFontManagement.
+
+ Is this function valid for Unidrv drivers?
+
+ Please refer to DDK documentation for more details.
+
+Arguments:
+
+ pso - Points to a SURFOBJ structure
+ pfo - Points to a FONTOBJ structure
+ iMode - Escape number
+ cjIn - Size of input buffer
+ pvIn - Points to input buffer
+ cjOut - Size of output buffer
+ pvOut - Points to output buffer
+
+Return Value:
+
+ 0x00000001 to 0x7fffffff for success
+ 0x80000000 to 0xffffffff for failure
+ 0 if the specified escape number if not supported
+
+--*/
+
+{
+ VERBOSE(L"OEMFontManagement entry.");
+
+ PDEVOBJ pDevObj = (PDEVOBJ)pso->dhpdev;
+ POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM;
+
+ // Punt call back to UNIDRV.
+ //
+ return (pOemPDEV->m_pfnDrvFontManagement)(pso,
+ pfo,
+ iMode,
+ cjIn,
+ pvIn,
+ cjOut,
+ pvOut);
+}
+
+BOOL APIENTRY
+OEMQueryAdvanceWidths(
+ DHPDEV dhpdev,
+ FONTOBJ *pfo,
+ ULONG iMode,
+ _In_reads_(cGlyphs) HGLYPH *phg,
+ _Out_writes_bytes_(cGlyphs*sizeof(USHORT)) PVOID pvWidths,
+ ULONG cGlyphs
+ )
+
+/*++
+
+Routine Description:
+
+ Implementation of DDI hook for DrvQueryAdvanceWidths.
+
+ DrvQueryAdvanceWidths returns character advance widths
+ for a specified set of glyphs.
+
+ Please refer to DDK documentation for more details.
+
+Arguments:
+
+ dhpdev - Driver device handle
+ pfo - Points to a FONTOBJ structure
+ iMode - Type of information to be provided
+ phg - Points to an array of HGLYPHs for which the driver will
+ provide character advance widths
+ pvWidths - Points to a buffer for returning width data
+ cGlyphs - Number of glyphs in the phg array
+
+Return Value:
+
+ Depends on iMode
+
+--*/
+
+{
+ VERBOSE(L"OEMQueryAdvanceWidths entry.");
+
+ PDEVOBJ pDevObj = (PDEVOBJ)dhpdev;
+ POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM;
+
+ // Punt call back to UNIDRV.
+ //
+ return (pOemPDEV->m_pfnDrvQueryAdvanceWidths)(dhpdev,
+ pfo,
+ iMode,
+ phg,
+ pvWidths,
+ cGlyphs);
+}
+
+ULONG APIENTRY
+OEMGetGlyphMode(
+ DHPDEV dhpdev,
+ FONTOBJ *pfo
+ )
+
+/*++
+
+Routine Description:
+
+ Implementation of DDI hook for DrvGetGlyphMode.
+
+ DrvGetGlyphMode tells GDI how to cache glyph information.
+ GDI calls a driver's DrvGetGlyphMode routine to determine the
+ range of font information that should be cached for a particular
+ font; that is, DrvGetGlyphMode determines what GDI stores in
+ its font cache. A device that caches fonts on its own should return
+ FO_HGLYPHS to minimize the storage requirements for the font.
+ GDI calls DrvGetGlyphMode for each font realization. For example,
+ a driver might want to download outlines for point sizes larger than
+ 12 point, but raster images for smaller fonts. However, GDI reserves
+ the right to refuse this request.
+
+ Please refer to DDK documentation for more details.
+
+Arguments:
+
+ dhpdev - Driver device handle
+ pfo - Points to a FONTOBJ structure
+
+Return Value:
+
+ The glyph mode or FO_GLYPHMODE, which is the default.
+
+--*/
+
+{
+ VERBOSE(L"OEMGetGlyphMode entry.");
+
+ PDEVOBJ pDevObj = (PDEVOBJ)dhpdev;
+ POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM;
+
+ // Punt call back to UNIDRV.
+ //
+ return (pOemPDEV->m_pfnDrvGetGlyphMode)(dhpdev,
+ pfo);
+}
+
+BOOL APIENTRY
+OEMStartDoc(
+ SURFOBJ *pso,
+ _In_ PWSTR pwszDocName,
+ DWORD dwJobId
+ )
+
+/*++
+
+Routine Description:
+
+ Implementation of DDI hook for DrvStartDoc.
+
+ DrvStartDoc is called by GDI when it is ready to
+ start sending a document to the driver for rendering.
+
+ Please refer to DDK documentation for more details.
+
+Arguments:
+
+ pso - Defines the surface object
+ pDocName - Specifies a Unicode document name
+ jobId - Identifies the print job
+
+Return Value:
+
+ TRUE if successful, FALSE if there is an error
+
+--*/
+
+{
+ VERBOSE(L"OEMStartDoc entry.");
+
+ PDEVOBJ pDevObj = (PDEVOBJ)pso->dhpdev;
+ POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM;
+
+ // Punt call back to UNIDRV.
+ //
+ return (pOemPDEV->m_pfnDrvStartDoc)(pso,
+ pwszDocName,
+ dwJobId);
+}
+
+BOOL APIENTRY
+OEMEndDoc(
+ SURFOBJ *pso,
+ FLONG fl
+ )
+
+/*++
+
+Routine Description:
+
+ Implementation of DDI hook for DrvEndDoc.
+
+ DrvEndDoc is called by GDI when it has finished
+ sending a document to the driver for rendering.
+
+ Please refer to DDK documentation for more details.
+
+Arguments:
+
+ pso - Defines the surface object
+ flags - A set of flag bits
+
+Return Value:
+
+ TRUE if successful, FALSE if there is an error
+
+--*/
+
+{
+ VERBOSE(L"OEMEndDoc entry.");
+
+ PDEVOBJ pDevObj = (PDEVOBJ)pso->dhpdev;
+ POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM;
+
+ // Punt call back to UNIDRV.
+ //
+ return (pOemPDEV->m_pfnDrvEndDoc)(pso,
+ fl);
+}
+
+BOOL APIENTRY
+OEMStartPage(
+ SURFOBJ *pso
+ )
+
+/*++
+
+Routine Description:
+
+ Implementation of DDI hook for DrvStartPage.
+
+ DrvStartPage is called by GDI when it is ready to
+ start sending the contents of a physical page to the
+ driver for rendering.
+
+ Please refer to DDK documentation for more details.
+
+Arguments:
+
+ pso - Defines the surface object
+
+Return Value:
+
+ TRUE if successful, FALSE if there is an error
+
+--*/
+
+{
+ VERBOSE(L"OEMStartPage entry.");
+
+ PDEVOBJ pDevObj = (PDEVOBJ)pso->dhpdev;
+ POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM;
+
+ // Punt call back to UNIDRV.
+ //
+ return (pOemPDEV->m_pfnDrvStartPage)(pso);
+}
+
+BOOL APIENTRY
+OEMSendPage(
+ SURFOBJ *pso
+ )
+
+/*++
+
+Routine Description:
+
+ Implementation of DDI hook for DrvSendPage.
+
+ DrvSendPage is called by GDI when it has finished
+ drawing a physical page, so the driver can send
+ the page to the printer.
+
+ Please refer to DDK documentation for more details.
+
+ NOTE: OEMSendPage will not be called in any driver that enables
+ pre-analysis. But the reason we implement this is that the driver
+ might be pushed to a down-level client and thereby have to run
+ without pre-analysis support. In this case, it might have to support
+ OEMSendPage.
+
+Arguments:
+
+ pso - Defines the surface object
+
+Return Value:
+
+ TRUE if successful, FALSE if there is an error
+
+--*/
+
+{
+ VERBOSE(L"OEMSendPage entry.");
+
+ PDEVOBJ pDevObj = (PDEVOBJ)pso->dhpdev;
+ POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM;
+
+ // Punt call back to UNIDRV.
+ //
+ return (pOemPDEV->m_pfnDrvSendPage)(pso);
+}
+
+BOOL APIENTRY
+OEMStartBanding(
+ SURFOBJ *pso,
+ POINTL *pptl
+ )
+
+/*++
+
+Routine Description:
+
+ Implementation of DDI hook for DrvStartBanding.
+
+ DrvStartBanding is called by GDI when it is ready to start
+ sending bands of a physical page to the driver for rendering.
+ Note: DrvStartBanding is called to prepare the driver
+ for banding, call only once per page (not at everyband!!)
+
+ Please refer to DDK documentation for more details.
+
+Arguments:
+
+ pso - Defines the surface object
+ pptl - Pointer to origin of next band (to return to GDI)
+
+Return Value:
+
+ Fill out pptl to contain the origin of the first band
+
+ TRUE if successful, FALSE if there is an error
+
+--*/
+
+{
+ VERBOSE(L"OEMStartBanding entry.");
+
+ PDEVOBJ pDevObj = (PDEVOBJ)pso->dhpdev;
+ POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM;
+
+ DBG_POINTL(DBG_VERBOSE, L"pptl", pptl);
+
+ if (pptl == NULL)
+ {
+ VERBOSE(TEXT("OEMStartBanding: Start of OEM Pre-analysis pass...\r\n"));
+ VERBOSE(TEXT("\tOEM Pre-analysis pass...no drawing on surface in this pass.\r\n"));
+ pOemPDEV->bPreAnalysis = TRUE;
+ }
+
+ // Punt call back to UNIDRV.
+ //
+ return (pOemPDEV->m_pfnDrvStartBanding)(pso,
+ pptl);
+}
+
+BOOL APIENTRY
+OEMNextBand(
+ SURFOBJ *pso,
+ POINTL *pptl
+ )
+
+/*++
+
+Routine Description:
+
+ Implementation of DDI hook for DrvNextBand.
+
+ DrvNextBand is called by GDI when it has finished
+ drawing a band for a physical page, so the driver
+ can send the band to the printer.
+
+ Please refer to DDK documentation for more details.
+
+Arguments:
+
+ pso - Defines the surface object
+ pptl - Pointer to origin of next band (to return to GDI)
+
+Return Value:
+
+ TRUE if successful, FALSE if there is an error
+
+--*/
+
+{
+ VERBOSE(L"OEMNextBand entry.");
+
+ PDEVOBJ pDevObj = (PDEVOBJ)pso->dhpdev;
+ POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM;
+
+ DBG_POINTL(DBG_VERBOSE, L"pptl", pptl);
+
+ if (pOemPDEV->bPreAnalysis)
+ {
+ //
+ // First call into OEMNextBand indicates end of pre-analysis path.
+ //
+ VERBOSE(TEXT("OEMNextBand: End of OEM Pre-analysis pass...\r\n"));
+ pOemPDEV->bPreAnalysis = FALSE;
+ }
+
+ // Punt call back to UNIDRV.
+ //
+ return (pOemPDEV->m_pfnDrvNextBand)(pso,
+ pptl);
+}
+
+ULONG APIENTRY
+OEMEscape(
+ SURFOBJ *pso,
+ ULONG iEsc,
+ ULONG cjIn,
+ _In_reads_bytes_(cjIn) PVOID pvIn,
+ ULONG cjOut,
+ _Out_writes_bytes_(cjOut) PVOID pvOut
+ )
+
+/*++
+
+Routine Description:
+
+ Implementation of DDI entry point DrvEscape.
+
+ DrvEscape is used for retrieving information from a device
+ that is not available in a device-independent device driver
+ interface; the particular query depends on the value of the
+ iEsc parameter.
+
+ Please refer to DDK documentation for more details.
+
+Arguments:
+
+ pso - Describes the surface the call is directed to
+ iEsc - Specifies a query
+ cjIn - Specifies the size in bytes of the buffer pointed to by pvIn
+ pvIn - Points to input data buffer
+ cjOut - Specifies the size in bytes of the buffer pointed to by pvOut
+ pvOut - Points to the output buffer
+
+Return Value:
+
+ Depends on the query specified by iEsc parameter.
+
+ Zero if the function specified by the query is not supported.
+
+--*/
+
+{
+ VERBOSE(L"OEMEscape entry.");
+
+ PDEVOBJ pDevObj = (PDEVOBJ)pso->dhpdev;
+ POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM;
+
+ // Punt call back to UNIDRV.
+ //
+ return (pOemPDEV->m_pfnDrvEscape)(pso,
+ iEsc,
+ cjIn,
+ pvIn,
+ cjOut,
+ pvOut);
+}
+