[GDI32] Allow functions to access printing support.

Reapplying lost committed code.
This commit is contained in:
jimtabor 2019-07-27 14:15:42 -05:00
parent 4563ca28d3
commit 665871527b
5 changed files with 96 additions and 2 deletions

View file

@ -740,4 +740,6 @@ METADC_GetAndSetDCDWord(
_In_ USHORT usMF16Id, _In_ USHORT usMF16Id,
_In_ DWORD dwError); _In_ DWORD dwError);
HDC WINAPI GdiConvertAndCheckDC(HDC hdc);
/* EOF */ /* EOF */

View file

@ -26,6 +26,8 @@ Arc(
xEndArc, xEndArc,
yEndArc); yEndArc);
if ( GdiConvertAndCheckDC(hdc) == NULL ) return FALSE;
return NtGdiArcInternal(GdiTypeArc, return NtGdiArcInternal(GdiTypeArc,
hdc, hdc,
xLeft, xLeft,
@ -62,6 +64,8 @@ AngleArc(
RCAST(DWORD, eStartAngle), RCAST(DWORD, eStartAngle),
RCAST(DWORD, eSweepAngle)); RCAST(DWORD, eSweepAngle));
if ( GdiConvertAndCheckDC(hdc) == NULL ) return FALSE;
return NtGdiAngleArc(hdc, return NtGdiAngleArc(hdc,
x, x,
y, y,
@ -96,6 +100,8 @@ ArcTo(
xRadial2, xRadial2,
yRadial2); yRadial2);
if ( GdiConvertAndCheckDC(hdc) == NULL ) return FALSE;
return NtGdiArcInternal(GdiTypeArcTo, return NtGdiArcInternal(GdiTypeArcTo,
hdc, hdc,
xLeft, xLeft,
@ -134,6 +140,8 @@ Chord(
xRadial2, xRadial2,
yRadial2); yRadial2);
if ( GdiConvertAndCheckDC(hdc) == NULL ) return FALSE;
return NtGdiArcInternal(GdiTypeChord, return NtGdiArcInternal(GdiTypeChord,
hdc, hdc,
xLeft, xLeft,
@ -176,6 +184,8 @@ Pie(
xRadial2, xRadial2,
yRadial2); yRadial2);
if ( GdiConvertAndCheckDC(hdc) == NULL ) return FALSE;
return NtGdiArcInternal(GdiTypePie, return NtGdiArcInternal(GdiTypePie,
hdc, hdc,
xLeft, xLeft,

View file

@ -691,6 +691,34 @@ SetDIBitsToDevice(
lpbmi, lpbmi,
ColorUse); ColorUse);
// Handle the "Special Case"!
{
PLDC pldc;
ULONG hType = GDI_HANDLE_GET_TYPE(hdc);
if (hType != GDILoObjType_LO_DC_TYPE && hType != GDILoObjType_LO_METADC16_TYPE)
{
pldc = GdiGetLDC(hdc);
if (pldc)
{
if (pldc->Flags & LDC_STARTPAGE) StartPage(hdc);
if (pldc->Flags & LDC_SAPCALLBACK) GdiSAPCallback(pldc);
if (pldc->Flags & LDC_KILL_DOCUMENT)
{
LinesCopied = 0;
goto Exit;
}
}
else
{
SetLastError(ERROR_INVALID_HANDLE);
LinesCopied = 0;
goto Exit;
}
}
}
if ((pConvertedInfo->bmiHeader.biCompression == BI_RLE8) || if ((pConvertedInfo->bmiHeader.biCompression == BI_RLE8) ||
(pConvertedInfo->bmiHeader.biCompression == BI_RLE4)) (pConvertedInfo->bmiHeader.biCompression == BI_RLE4))
{ {
@ -742,6 +770,7 @@ SetDIBitsToDevice(
TRUE, TRUE,
NULL); NULL);
} }
Exit:
if (Bits != pvSafeBits) if (Bits != pvSafeBits)
RtlFreeHeap(RtlGetProcessHeap(), 0, pvSafeBits); RtlFreeHeap(RtlGetProcessHeap(), 0, pvSafeBits);
if (lpbmi != pConvertedInfo) if (lpbmi != pConvertedInfo)
@ -826,6 +855,9 @@ StretchDIBits(
} }
} }
#endif #endif
if ( GdiConvertAndCheckDC(hdc) == NULL ) return 0;
pConvertedInfo = ConvertBitmapInfo(lpBitsInfo, iUsage, &ConvertedInfoSize, pConvertedInfo = ConvertBitmapInfo(lpBitsInfo, iUsage, &ConvertedInfoSize,
FALSE); FALSE);
if (!pConvertedInfo) if (!pConvertedInfo)

View file

@ -13,6 +13,8 @@ LineTo(
{ {
HANDLE_METADC(BOOL, LineTo, FALSE, hdc, x, y); HANDLE_METADC(BOOL, LineTo, FALSE, hdc, x, y);
if ( GdiConvertAndCheckDC(hdc) == NULL ) return FALSE;
return NtGdiLineTo(hdc, x, y); return NtGdiLineTo(hdc, x, y);
} }
@ -75,6 +77,8 @@ Ellipse(
{ {
HANDLE_METADC(BOOL, Ellipse, FALSE, hdc, left, top, right, bottom); HANDLE_METADC(BOOL, Ellipse, FALSE, hdc, left, top, right, bottom);
if ( GdiConvertAndCheckDC(hdc) == NULL ) return FALSE;
return NtGdiEllipse(hdc, left, top, right, bottom); return NtGdiEllipse(hdc, left, top, right, bottom);
} }
@ -93,6 +97,8 @@ Rectangle(
{ {
HANDLE_METADC(BOOL, Rectangle, FALSE, hdc, left, top, right, bottom); HANDLE_METADC(BOOL, Rectangle, FALSE, hdc, left, top, right, bottom);
if ( GdiConvertAndCheckDC(hdc) == NULL ) return FALSE;
return NtGdiRectangle(hdc, left, top, right, bottom); return NtGdiRectangle(hdc, left, top, right, bottom);
} }
@ -113,6 +119,8 @@ RoundRect(
{ {
HANDLE_METADC(BOOL, RoundRect, FALSE, hdc, left, top, right, bottom, width, height); HANDLE_METADC(BOOL, RoundRect, FALSE, hdc, left, top, right, bottom, width, height);
if ( GdiConvertAndCheckDC(hdc) == NULL ) return FALSE;
return NtGdiRoundRect(hdc, left, top, right, bottom, width, height); return NtGdiRoundRect(hdc, left, top, right, bottom, width, height);
} }
@ -146,6 +154,8 @@ SetPixel(
{ {
HANDLE_METADC(COLORREF, SetPixel, CLR_INVALID, hdc, x, y, crColor); HANDLE_METADC(COLORREF, SetPixel, CLR_INVALID, hdc, x, y, crColor);
if ( GdiConvertAndCheckDC(hdc) == NULL ) return FALSE;
return NtGdiSetPixel(hdc, x, y, crColor); return NtGdiSetPixel(hdc, x, y, crColor);
} }
@ -181,6 +191,8 @@ FillRgn(
HANDLE_METADC(BOOL, FillRgn, FALSE, hdc, hrgn, hbr); HANDLE_METADC(BOOL, FillRgn, FALSE, hdc, hrgn, hbr);
if ( GdiConvertAndCheckDC(hdc) == NULL ) return FALSE;
return NtGdiFillRgn(hdc, hrgn, hbr); return NtGdiFillRgn(hdc, hrgn, hbr);
} }
@ -203,6 +215,8 @@ FrameRgn(
HANDLE_METADC(BOOL, FrameRgn, FALSE, hdc, hrgn, hbr, nWidth, nHeight); HANDLE_METADC(BOOL, FrameRgn, FALSE, hdc, hrgn, hbr, nWidth, nHeight);
if ( GdiConvertAndCheckDC(hdc) == NULL ) return FALSE;
return NtGdiFrameRgn(hdc, hrgn, hbr, nWidth, nHeight); return NtGdiFrameRgn(hdc, hrgn, hbr, nWidth, nHeight);
} }
@ -222,6 +236,8 @@ InvertRgn(
HANDLE_METADC(BOOL, InvertRgn, FALSE, hdc, hrgn); HANDLE_METADC(BOOL, InvertRgn, FALSE, hdc, hrgn);
if ( GdiConvertAndCheckDC(hdc) == NULL ) return FALSE;
return NtGdiInvertRgn(hdc, hrgn); return NtGdiInvertRgn(hdc, hrgn);
} }
@ -251,6 +267,8 @@ PolyBezier(
{ {
HANDLE_METADC(BOOL, PolyBezier, FALSE, hdc, apt, cpt); HANDLE_METADC(BOOL, PolyBezier, FALSE, hdc, apt, cpt);
if ( GdiConvertAndCheckDC(hdc) == NULL ) return FALSE;
return NtGdiPolyPolyDraw(hdc ,(PPOINT)apt, &cpt, 1, GdiPolyBezier); return NtGdiPolyPolyDraw(hdc ,(PPOINT)apt, &cpt, 1, GdiPolyBezier);
} }
@ -267,6 +285,8 @@ PolyBezierTo(
{ {
HANDLE_METADC(BOOL, PolyBezierTo, FALSE, hdc, apt, cpt); HANDLE_METADC(BOOL, PolyBezierTo, FALSE, hdc, apt, cpt);
if ( GdiConvertAndCheckDC(hdc) == NULL ) return FALSE;
return NtGdiPolyPolyDraw(hdc , (PPOINT)apt, &cpt, 1, GdiPolyBezierTo); return NtGdiPolyPolyDraw(hdc , (PPOINT)apt, &cpt, 1, GdiPolyBezierTo);
} }
@ -284,6 +304,8 @@ PolyDraw(
{ {
HANDLE_METADC(BOOL, PolyDraw, FALSE, hdc, apt, aj, cpt); HANDLE_METADC(BOOL, PolyDraw, FALSE, hdc, apt, aj, cpt);
if ( GdiConvertAndCheckDC(hdc) == NULL ) return FALSE;
return NtGdiPolyDraw(hdc, (PPOINT)apt, (PBYTE)aj, cpt); return NtGdiPolyDraw(hdc, (PPOINT)apt, (PBYTE)aj, cpt);
} }
@ -300,6 +322,8 @@ Polygon(
{ {
HANDLE_METADC(BOOL, Polygon, FALSE, hdc, apt, cpt); HANDLE_METADC(BOOL, Polygon, FALSE, hdc, apt, cpt);
if ( GdiConvertAndCheckDC(hdc) == NULL ) return FALSE;
return NtGdiPolyPolyDraw(hdc , (PPOINT)apt, (PULONG)&cpt, 1, GdiPolyPolygon); return NtGdiPolyPolyDraw(hdc , (PPOINT)apt, (PULONG)&cpt, 1, GdiPolyPolygon);
} }
@ -316,6 +340,8 @@ Polyline(
{ {
HANDLE_METADC(BOOL, Polyline, FALSE, hdc, apt, cpt); HANDLE_METADC(BOOL, Polyline, FALSE, hdc, apt, cpt);
if ( GdiConvertAndCheckDC(hdc) == NULL ) return FALSE;
return NtGdiPolyPolyDraw(hdc, (PPOINT)apt, (PULONG)&cpt, 1, GdiPolyPolyLine); return NtGdiPolyPolyDraw(hdc, (PPOINT)apt, (PULONG)&cpt, 1, GdiPolyPolyLine);
} }
@ -332,6 +358,8 @@ PolylineTo(
{ {
HANDLE_METADC(BOOL, PolylineTo, FALSE, hdc, apt, cpt); HANDLE_METADC(BOOL, PolylineTo, FALSE, hdc, apt, cpt);
if ( GdiConvertAndCheckDC(hdc) == NULL ) return FALSE;
return NtGdiPolyPolyDraw(hdc , (PPOINT)apt, &cpt, 1, GdiPolyLineTo); return NtGdiPolyPolyDraw(hdc , (PPOINT)apt, &cpt, 1, GdiPolyLineTo);
} }
@ -349,6 +377,8 @@ PolyPolygon(
{ {
HANDLE_METADC(BOOL, PolyPolygon, FALSE, hdc, apt, asz, csz); HANDLE_METADC(BOOL, PolyPolygon, FALSE, hdc, apt, asz, csz);
if ( GdiConvertAndCheckDC(hdc) == NULL ) return FALSE;
return NtGdiPolyPolyDraw(hdc, (PPOINT)apt, (PULONG)asz, csz, GdiPolyPolygon); return NtGdiPolyPolyDraw(hdc, (PPOINT)apt, (PULONG)asz, csz, GdiPolyPolygon);
} }
@ -369,6 +399,8 @@ PolyPolyline(
HANDLE_METADC(BOOL, PolyPolyline, FALSE, hdc, apt, asz, csz); HANDLE_METADC(BOOL, PolyPolyline, FALSE, hdc, apt, asz, csz);
if ( GdiConvertAndCheckDC(hdc) == NULL ) return FALSE;
return NtGdiPolyPolyDraw(hdc , (PPOINT)apt, (PULONG)asz, csz, GdiPolyPolyLine); return NtGdiPolyPolyDraw(hdc , (PPOINT)apt, (PULONG)asz, csz, GdiPolyPolyLine);
} }
@ -387,6 +419,8 @@ ExtFloodFill(
{ {
HANDLE_METADC(BOOL, ExtFloodFill, FALSE, hdc, xStart, yStart, crFill, fuFillType); HANDLE_METADC(BOOL, ExtFloodFill, FALSE, hdc, xStart, yStart, crFill, fuFillType);
if ( GdiConvertAndCheckDC(hdc) == NULL ) return FALSE;
return NtGdiExtFloodFill(hdc, xStart, yStart, crFill, fuFillType); return NtGdiExtFloodFill(hdc, xStart, yStart, crFill, fuFillType);
} }
@ -443,6 +477,8 @@ BitBlt(
cx, cx,
dwRop); dwRop);
if ( GdiConvertAndCheckDC(hdcDest) == NULL ) return FALSE;
return NtGdiBitBlt(hdcDest, xDest, yDest, cx, cy, hdcSrc, xSrc, ySrc, dwRop, 0, 0); return NtGdiBitBlt(hdcDest, xDest, yDest, cx, cy, hdcSrc, xSrc, ySrc, dwRop, 0, 0);
} }
@ -460,6 +496,8 @@ PatBlt(
HANDLE_METADC(BOOL, PatBlt, FALSE, hdc, nXLeft, nYLeft, nWidth, nHeight, dwRop); HANDLE_METADC(BOOL, PatBlt, FALSE, hdc, nXLeft, nYLeft, nWidth, nHeight, dwRop);
if ( GdiConvertAndCheckDC(hdc) == NULL ) return FALSE;
/* Get the DC attribute */ /* Get the DC attribute */
pdcattr = GdiGetDcAttr(hdc); pdcattr = GdiGetDcAttr(hdc);
if (pdcattr && !(pdcattr->ulDirty_ & DC_DIBSECTION)) if (pdcattr && !(pdcattr->ulDirty_ & DC_DIBSECTION))
@ -612,6 +650,8 @@ StretchBlt(
cySrc, cySrc,
dwRop); dwRop);
if ( GdiConvertAndCheckDC(hdcDest) == NULL ) return FALSE;
return NtGdiStretchBlt(hdcDest, return NtGdiStretchBlt(hdcDest,
xDest, xDest,
yDest, yDest,
@ -662,6 +702,8 @@ MaskBlt(
yMask, yMask,
dwRop); dwRop);
if ( GdiConvertAndCheckDC(hdcDest) == NULL ) return FALSE;
return NtGdiMaskBlt(hdcDest, return NtGdiMaskBlt(hdcDest,
xDest, xDest,
yDest, yDest,
@ -709,6 +751,8 @@ PlgBlt(
xMask, xMask,
yMask); yMask);
if ( GdiConvertAndCheckDC(hdcDest) == NULL ) return FALSE;
return NtGdiPlgBlt(hdcDest, return NtGdiPlgBlt(hdcDest,
(LPPOINT)ppt, (LPPOINT)ppt,
hdcSrc, hdcSrc,
@ -756,6 +800,8 @@ GdiAlphaBlend(
cySrc, cySrc,
blendfn); blendfn);
if ( GdiConvertAndCheckDC(hdcDst) == NULL ) return FALSE;
return NtGdiAlphaBlend(hdcDst, return NtGdiAlphaBlend(hdcDst,
xDst, xDst,
yDst, yDst,
@ -804,7 +850,8 @@ GdiTransparentBlt(
cySrc, cySrc,
crTransparent); crTransparent);
/* FIXME some part need be done in user mode */ if ( GdiConvertAndCheckDC(hdcDst) == NULL ) return FALSE;
return NtGdiTransparentBlt(hdcDst, xDst, yDst, cxDst, cyDst, hdcSrc, xSrc, ySrc, cxSrc, cySrc, crTransparent); return NtGdiTransparentBlt(hdcDst, xDst, yDst, cxDst, cyDst, hdcSrc, xSrc, ySrc, cxSrc, cySrc, crTransparent);
} }
@ -823,6 +870,7 @@ GdiGradientFill(
{ {
HANDLE_METADC(BOOL, GradientFill, FALSE, hdc, pVertex, nVertex, pMesh, nCount, ulMode); HANDLE_METADC(BOOL, GradientFill, FALSE, hdc, pVertex, nVertex, pMesh, nCount, ulMode);
/* FIXME some part need be done in user mode */ if ( GdiConvertAndCheckDC(hdc) == NULL ) return FALSE;
return NtGdiGradientFill(hdc, pVertex, nVertex, pMesh, nCount, ulMode); return NtGdiGradientFill(hdc, pVertex, nVertex, pMesh, nCount, ulMode);
} }

View file

@ -505,6 +505,8 @@ ExtTextOutW(
cwc, cwc,
lpDx); lpDx);
if ( GdiConvertAndCheckDC(hdc) == NULL ) return FALSE;
if (!(fuOptions & (ETO_GLYPH_INDEX | ETO_IGNORELANGUAGE))) if (!(fuOptions & (ETO_GLYPH_INDEX | ETO_IGNORELANGUAGE)))
{ {
if (LoadLPK(LPK_ETO)) if (LoadLPK(LPK_ETO))