Alexandre Julliard | 75d86e1 | 1996-11-17 18:59:11 +0000 | [diff] [blame] | 1 | /* |
| 2 | * GDI bit-blit operations |
| 3 | * |
| 4 | * Copyright 1993, 1994 Alexandre Julliard |
Alexandre Julliard | 0799c1a | 2002-03-09 23:29:33 +0000 | [diff] [blame] | 5 | * |
| 6 | * This library is free software; you can redistribute it and/or |
| 7 | * modify it under the terms of the GNU Lesser General Public |
| 8 | * License as published by the Free Software Foundation; either |
| 9 | * version 2.1 of the License, or (at your option) any later version. |
| 10 | * |
| 11 | * This library is distributed in the hope that it will be useful, |
| 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| 14 | * Lesser General Public License for more details. |
| 15 | * |
| 16 | * You should have received a copy of the GNU Lesser General Public |
| 17 | * License along with this library; if not, write to the Free Software |
| 18 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
Alexandre Julliard | 75d86e1 | 1996-11-17 18:59:11 +0000 | [diff] [blame] | 19 | */ |
| 20 | |
Alexandre Julliard | 2239abb | 2000-11-05 02:05:07 +0000 | [diff] [blame] | 21 | #include "gdi.h" |
Alexandre Julliard | 0799c1a | 2002-03-09 23:29:33 +0000 | [diff] [blame] | 22 | #include "wine/debug.h" |
Alexandre Julliard | 75d86e1 | 1996-11-17 18:59:11 +0000 | [diff] [blame] | 23 | |
Alexandre Julliard | 0799c1a | 2002-03-09 23:29:33 +0000 | [diff] [blame] | 24 | WINE_DEFAULT_DEBUG_CHANNEL(bitblt); |
Patrik Stridvall | b4b9fae | 1999-04-19 14:56:29 +0000 | [diff] [blame] | 25 | |
Alexandre Julliard | 75d86e1 | 1996-11-17 18:59:11 +0000 | [diff] [blame] | 26 | |
| 27 | /*********************************************************************** |
Patrik Stridvall | 01d5e5b | 2001-07-02 19:59:40 +0000 | [diff] [blame] | 28 | * PatBlt (GDI.29) |
Alexandre Julliard | 75d86e1 | 1996-11-17 18:59:11 +0000 | [diff] [blame] | 29 | */ |
Alexandre Julliard | 670cdc4 | 1997-08-24 16:00:30 +0000 | [diff] [blame] | 30 | BOOL16 WINAPI PatBlt16( HDC16 hdc, INT16 left, INT16 top, |
| 31 | INT16 width, INT16 height, DWORD rop) |
Alexandre Julliard | 75d86e1 | 1996-11-17 18:59:11 +0000 | [diff] [blame] | 32 | { |
Alexandre Julliard | 2a2321b | 2000-08-19 21:38:55 +0000 | [diff] [blame] | 33 | return PatBlt( hdc, left, top, width, height, rop ); |
Alexandre Julliard | 75d86e1 | 1996-11-17 18:59:11 +0000 | [diff] [blame] | 34 | } |
| 35 | |
| 36 | |
| 37 | /*********************************************************************** |
Patrik Stridvall | d0a4177 | 2001-02-14 23:11:17 +0000 | [diff] [blame] | 38 | * PatBlt (GDI32.@) |
Alexandre Julliard | 75d86e1 | 1996-11-17 18:59:11 +0000 | [diff] [blame] | 39 | */ |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 40 | BOOL WINAPI PatBlt( HDC hdc, INT left, INT top, |
| 41 | INT width, INT height, DWORD rop) |
Alexandre Julliard | 75d86e1 | 1996-11-17 18:59:11 +0000 | [diff] [blame] | 42 | { |
Alexandre Julliard | 0baa4e0 | 2000-08-22 20:01:47 +0000 | [diff] [blame] | 43 | DC * dc = DC_GetDCUpdate( hdc ); |
Alexandre Julliard | 2a2321b | 2000-08-19 21:38:55 +0000 | [diff] [blame] | 44 | BOOL bRet = FALSE; |
Alexandre Julliard | 75d86e1 | 1996-11-17 18:59:11 +0000 | [diff] [blame] | 45 | |
Alexandre Julliard | 2a2321b | 2000-08-19 21:38:55 +0000 | [diff] [blame] | 46 | if (!dc) return FALSE; |
| 47 | |
| 48 | if (dc->funcs->pPatBlt) |
| 49 | { |
| 50 | TRACE("%04x %d,%d %dx%d %06lx\n", hdc, left, top, width, height, rop ); |
Alexandre Julliard | e21c15e | 2002-03-28 22:22:05 +0000 | [diff] [blame] | 51 | bRet = dc->funcs->pPatBlt( dc->physDev, left, top, width, height, rop ); |
Alexandre Julliard | 2a2321b | 2000-08-19 21:38:55 +0000 | [diff] [blame] | 52 | } |
| 53 | GDI_ReleaseObj( hdc ); |
| 54 | return bRet; |
Alexandre Julliard | 75d86e1 | 1996-11-17 18:59:11 +0000 | [diff] [blame] | 55 | } |
| 56 | |
| 57 | |
| 58 | /*********************************************************************** |
Patrik Stridvall | 01d5e5b | 2001-07-02 19:59:40 +0000 | [diff] [blame] | 59 | * BitBlt (GDI.34) |
Alexandre Julliard | 75d86e1 | 1996-11-17 18:59:11 +0000 | [diff] [blame] | 60 | */ |
Alexandre Julliard | 670cdc4 | 1997-08-24 16:00:30 +0000 | [diff] [blame] | 61 | BOOL16 WINAPI BitBlt16( HDC16 hdcDst, INT16 xDst, INT16 yDst, INT16 width, |
| 62 | INT16 height, HDC16 hdcSrc, INT16 xSrc, INT16 ySrc, |
| 63 | DWORD rop ) |
Alexandre Julliard | 75d86e1 | 1996-11-17 18:59:11 +0000 | [diff] [blame] | 64 | { |
Alexandre Julliard | 2a2321b | 2000-08-19 21:38:55 +0000 | [diff] [blame] | 65 | return BitBlt( hdcDst, xDst, yDst, width, height, hdcSrc, xSrc, ySrc, rop ); |
Alexandre Julliard | 75d86e1 | 1996-11-17 18:59:11 +0000 | [diff] [blame] | 66 | } |
| 67 | |
| 68 | |
| 69 | /*********************************************************************** |
Patrik Stridvall | d0a4177 | 2001-02-14 23:11:17 +0000 | [diff] [blame] | 70 | * BitBlt (GDI32.@) |
Alexandre Julliard | 75d86e1 | 1996-11-17 18:59:11 +0000 | [diff] [blame] | 71 | */ |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 72 | BOOL WINAPI BitBlt( HDC hdcDst, INT xDst, INT yDst, INT width, |
Alexandre Julliard | 2a2321b | 2000-08-19 21:38:55 +0000 | [diff] [blame] | 73 | INT height, HDC hdcSrc, INT xSrc, INT ySrc, DWORD rop ) |
Alexandre Julliard | 75d86e1 | 1996-11-17 18:59:11 +0000 | [diff] [blame] | 74 | { |
Alexandre Julliard | 2a2321b | 2000-08-19 21:38:55 +0000 | [diff] [blame] | 75 | BOOL ret = FALSE; |
Alexandre Julliard | 75d86e1 | 1996-11-17 18:59:11 +0000 | [diff] [blame] | 76 | DC *dcDst, *dcSrc; |
| 77 | |
Alexandre Julliard | 2a2321b | 2000-08-19 21:38:55 +0000 | [diff] [blame] | 78 | if ((dcSrc = DC_GetDCUpdate( hdcSrc ))) GDI_ReleaseObj( hdcSrc ); |
| 79 | /* FIXME: there is a race condition here */ |
| 80 | if ((dcDst = DC_GetDCUpdate( hdcDst ))) |
| 81 | { |
| 82 | dcSrc = DC_GetDCPtr( hdcSrc ); |
| 83 | TRACE("hdcSrc=%04x %d,%d %d bpp->hdcDest=%04x %d,%d %dx%dx%d rop=%06lx\n", |
Alexandre Julliard | 2239abb | 2000-11-05 02:05:07 +0000 | [diff] [blame] | 84 | hdcSrc, xSrc, ySrc, dcSrc ? dcSrc->bitsPerPixel : 0, |
| 85 | hdcDst, xDst, yDst, width, height, dcDst->bitsPerPixel, rop); |
Alexandre Julliard | 2a2321b | 2000-08-19 21:38:55 +0000 | [diff] [blame] | 86 | if (dcDst->funcs->pBitBlt) |
Alexandre Julliard | e21c15e | 2002-03-28 22:22:05 +0000 | [diff] [blame] | 87 | ret = dcDst->funcs->pBitBlt( dcDst->physDev, xDst, yDst, width, height, |
Alexandre Julliard | c71417c | 2002-04-02 03:00:00 +0000 | [diff] [blame] | 88 | dcSrc ? dcSrc->physDev : NULL, xSrc, ySrc, rop ); |
Alexandre Julliard | 2a2321b | 2000-08-19 21:38:55 +0000 | [diff] [blame] | 89 | if (dcSrc) GDI_ReleaseObj( hdcSrc ); |
| 90 | GDI_ReleaseObj( hdcDst ); |
| 91 | } |
| 92 | return ret; |
Alexandre Julliard | 75d86e1 | 1996-11-17 18:59:11 +0000 | [diff] [blame] | 93 | } |
| 94 | |
| 95 | |
| 96 | /*********************************************************************** |
Patrik Stridvall | 01d5e5b | 2001-07-02 19:59:40 +0000 | [diff] [blame] | 97 | * StretchBlt (GDI.35) |
Alexandre Julliard | 75d86e1 | 1996-11-17 18:59:11 +0000 | [diff] [blame] | 98 | */ |
Alexandre Julliard | 670cdc4 | 1997-08-24 16:00:30 +0000 | [diff] [blame] | 99 | BOOL16 WINAPI StretchBlt16( HDC16 hdcDst, INT16 xDst, INT16 yDst, |
| 100 | INT16 widthDst, INT16 heightDst, |
| 101 | HDC16 hdcSrc, INT16 xSrc, INT16 ySrc, |
| 102 | INT16 widthSrc, INT16 heightSrc, DWORD rop ) |
Alexandre Julliard | 75d86e1 | 1996-11-17 18:59:11 +0000 | [diff] [blame] | 103 | { |
Alexandre Julliard | 2a2321b | 2000-08-19 21:38:55 +0000 | [diff] [blame] | 104 | return StretchBlt( hdcDst, xDst, yDst, widthDst, heightDst, |
| 105 | hdcSrc, xSrc, ySrc, widthSrc, heightSrc, rop ); |
Alexandre Julliard | 75d86e1 | 1996-11-17 18:59:11 +0000 | [diff] [blame] | 106 | } |
| 107 | |
| 108 | |
| 109 | /*********************************************************************** |
Patrik Stridvall | d0a4177 | 2001-02-14 23:11:17 +0000 | [diff] [blame] | 110 | * StretchBlt (GDI32.@) |
Alexandre Julliard | 75d86e1 | 1996-11-17 18:59:11 +0000 | [diff] [blame] | 111 | */ |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 112 | BOOL WINAPI StretchBlt( HDC hdcDst, INT xDst, INT yDst, |
| 113 | INT widthDst, INT heightDst, |
| 114 | HDC hdcSrc, INT xSrc, INT ySrc, |
Alexandre Julliard | 2a2321b | 2000-08-19 21:38:55 +0000 | [diff] [blame] | 115 | INT widthSrc, INT heightSrc, |
| 116 | DWORD rop ) |
Alexandre Julliard | 75d86e1 | 1996-11-17 18:59:11 +0000 | [diff] [blame] | 117 | { |
Alexandre Julliard | 2a2321b | 2000-08-19 21:38:55 +0000 | [diff] [blame] | 118 | BOOL ret = FALSE; |
Alexandre Julliard | 75d86e1 | 1996-11-17 18:59:11 +0000 | [diff] [blame] | 119 | DC *dcDst, *dcSrc; |
| 120 | |
Alexandre Julliard | 2a2321b | 2000-08-19 21:38:55 +0000 | [diff] [blame] | 121 | if ((dcSrc = DC_GetDCUpdate( hdcSrc ))) GDI_ReleaseObj( hdcSrc ); |
| 122 | /* FIXME: there is a race condition here */ |
| 123 | if ((dcDst = DC_GetDCUpdate( hdcDst ))) |
| 124 | { |
| 125 | dcSrc = DC_GetDCPtr( hdcSrc ); |
Alexandre Julliard | 7ebe1a4 | 1996-12-22 18:27:48 +0000 | [diff] [blame] | 126 | |
Alexandre Julliard | 2a2321b | 2000-08-19 21:38:55 +0000 | [diff] [blame] | 127 | TRACE("%04x %d,%d %dx%dx%d -> %04x %d,%d %dx%dx%d rop=%06lx\n", |
| 128 | hdcSrc, xSrc, ySrc, widthSrc, heightSrc, |
Alexandre Julliard | 2239abb | 2000-11-05 02:05:07 +0000 | [diff] [blame] | 129 | dcSrc ? dcSrc->bitsPerPixel : 0, hdcDst, xDst, yDst, |
| 130 | widthDst, heightDst, dcDst->bitsPerPixel, rop ); |
Alexandre Julliard | 2a2321b | 2000-08-19 21:38:55 +0000 | [diff] [blame] | 131 | |
| 132 | if (dcSrc) { |
| 133 | if (dcDst->funcs->pStretchBlt) |
Alexandre Julliard | e21c15e | 2002-03-28 22:22:05 +0000 | [diff] [blame] | 134 | ret = dcDst->funcs->pStretchBlt( dcDst->physDev, xDst, yDst, widthDst, heightDst, |
| 135 | dcSrc->physDev, xSrc, ySrc, widthSrc, heightSrc, |
| 136 | rop ); |
Alexandre Julliard | 2a2321b | 2000-08-19 21:38:55 +0000 | [diff] [blame] | 137 | GDI_ReleaseObj( hdcSrc ); |
| 138 | } |
| 139 | GDI_ReleaseObj( hdcDst ); |
| 140 | } |
| 141 | return ret; |
Alexandre Julliard | 75d86e1 | 1996-11-17 18:59:11 +0000 | [diff] [blame] | 142 | } |
| 143 | |
| 144 | |
| 145 | /*********************************************************************** |
| 146 | * FastWindowFrame (GDI.400) |
| 147 | */ |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 148 | BOOL16 WINAPI FastWindowFrame16( HDC16 hdc, const RECT16 *rect, |
Alexandre Julliard | 670cdc4 | 1997-08-24 16:00:30 +0000 | [diff] [blame] | 149 | INT16 width, INT16 height, DWORD rop ) |
Alexandre Julliard | 75d86e1 | 1996-11-17 18:59:11 +0000 | [diff] [blame] | 150 | { |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 151 | HBRUSH hbrush = SelectObject( hdc, GetStockObject( GRAY_BRUSH ) ); |
| 152 | PatBlt( hdc, rect->left, rect->top, |
Alexandre Julliard | 75d86e1 | 1996-11-17 18:59:11 +0000 | [diff] [blame] | 153 | rect->right - rect->left - width, height, rop ); |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 154 | PatBlt( hdc, rect->left, rect->top + height, width, |
Alexandre Julliard | 75d86e1 | 1996-11-17 18:59:11 +0000 | [diff] [blame] | 155 | rect->bottom - rect->top - height, rop ); |
Noomen Hamza | b309b37 | 1999-09-04 14:25:55 +0000 | [diff] [blame] | 156 | PatBlt( hdc, rect->left + width, rect->bottom - 1, |
Alexandre Julliard | 75d86e1 | 1996-11-17 18:59:11 +0000 | [diff] [blame] | 157 | rect->right - rect->left - width, -height, rop ); |
Noomen Hamza | b309b37 | 1999-09-04 14:25:55 +0000 | [diff] [blame] | 158 | PatBlt( hdc, rect->right - 1, rect->top, -width, |
Alexandre Julliard | 75d86e1 | 1996-11-17 18:59:11 +0000 | [diff] [blame] | 159 | rect->bottom - rect->top - height, rop ); |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 160 | SelectObject( hdc, hbrush ); |
Alexandre Julliard | 75d86e1 | 1996-11-17 18:59:11 +0000 | [diff] [blame] | 161 | return TRUE; |
Alexandre Julliard | 2a2321b | 2000-08-19 21:38:55 +0000 | [diff] [blame] | 162 | |
Alexandre Julliard | 75d86e1 | 1996-11-17 18:59:11 +0000 | [diff] [blame] | 163 | } |
Alexandre Julliard | 2a2321b | 2000-08-19 21:38:55 +0000 | [diff] [blame] | 164 | |
| 165 | |
Paul Quinn | 1beaae5 | 1998-12-15 15:38:36 +0000 | [diff] [blame] | 166 | /*********************************************************************** |
Patrik Stridvall | d0a4177 | 2001-02-14 23:11:17 +0000 | [diff] [blame] | 167 | * MaskBlt [GDI32.@] |
Paul Quinn | 1beaae5 | 1998-12-15 15:38:36 +0000 | [diff] [blame] | 168 | */ |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 169 | BOOL WINAPI MaskBlt(HDC hdcDest, INT nXDest, INT nYDest, |
| 170 | INT nWidth, INT nHeight, HDC hdcSource, |
| 171 | INT nXSrc, INT nYSrc, HBITMAP hbmMask, |
| 172 | INT xMask, INT yMask, DWORD dwRop) |
Paul Quinn | 1beaae5 | 1998-12-15 15:38:36 +0000 | [diff] [blame] | 173 | { |
Alexandre Julliard | 2a2321b | 2000-08-19 21:38:55 +0000 | [diff] [blame] | 174 | FIXME("(%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%ld): stub\n", |
Paul Quinn | 1beaae5 | 1998-12-15 15:38:36 +0000 | [diff] [blame] | 175 | hdcDest,nXDest,nYDest,nWidth,nHeight,hdcSource,nXSrc,nYSrc, |
| 176 | hbmMask,xMask,yMask,dwRop); |
| 177 | return 1; |
| 178 | } |
| 179 | |
| 180 | /********************************************************************* |
Patrik Stridvall | d0a4177 | 2001-02-14 23:11:17 +0000 | [diff] [blame] | 181 | * PlgBlt [GDI32.@] |
Paul Quinn | 1beaae5 | 1998-12-15 15:38:36 +0000 | [diff] [blame] | 182 | * |
| 183 | */ |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 184 | BOOL WINAPI PlgBlt( HDC hdcDest, const POINT *lpPoint, |
| 185 | HDC hdcSrc, INT nXDest, INT nYDest, INT nWidth, |
| 186 | INT nHeight, HBITMAP hbmMask, INT xMask, INT yMask) |
Paul Quinn | 1beaae5 | 1998-12-15 15:38:36 +0000 | [diff] [blame] | 187 | { |
Alexandre Julliard | 2a2321b | 2000-08-19 21:38:55 +0000 | [diff] [blame] | 188 | FIXME("PlgBlt, stub\n"); |
Paul Quinn | 1beaae5 | 1998-12-15 15:38:36 +0000 | [diff] [blame] | 189 | return 1; |
| 190 | } |
| 191 | |