1 /* 2 * PROJECT: Win32 subsystem 3 * LICENSE: See COPYING in the top level directory 4 * FILE: win32ss/gdi/dib/dib4bpp.c 5 * PURPOSE: Device Independant Bitmap functions, 4bpp 6 * PROGRAMMERS: Jason Filby 7 * Doug Lyons 8 */ 9 10 #include <win32k.h> 11 12 #define NDEBUG 13 #include <debug.h> 14 15 #define DEC_OR_INC(var, decTrue, amount) \ 16 ((var) = (decTrue) ? ((var) - (amount)) : ((var) + (amount))) 17 18 VOID 19 DIB_4BPP_PutPixel(SURFOBJ *SurfObj, LONG x, LONG y, ULONG c) 20 { 21 PBYTE addr = (PBYTE)SurfObj->pvScan0 + (x>>1) + y * SurfObj->lDelta; 22 *addr = (*addr & notmask[x&1]) | (BYTE)(c << ((1-(x&1))<<2)); 23 } 24 25 ULONG 26 DIB_4BPP_GetPixel(SURFOBJ *SurfObj, LONG x, LONG y) 27 { 28 PBYTE addr = (PBYTE)SurfObj->pvScan0 + (x>>1) + y * SurfObj->lDelta; 29 return (*addr >> ((1-(x&1))<<2)) & 0x0f; 30 } 31 32 VOID 33 DIB_4BPP_HLine(SURFOBJ *SurfObj, LONG x1, LONG x2, LONG y, ULONG c) 34 { 35 PBYTE addr = (PBYTE)SurfObj->pvScan0 + (x1>>1) + y * SurfObj->lDelta; 36 LONG cx = x1; 37 38 while(cx < x2) 39 { 40 *addr = (*addr & notmask[x1&1]) | (BYTE)(c << ((1-(x1&1))<<2)); 41 if((++x1 & 1) == 0) 42 ++addr; 43 ++cx; 44 } 45 } 46 47 VOID 48 DIB_4BPP_VLine(SURFOBJ *SurfObj, LONG x, LONG y1, LONG y2, ULONG c) 49 { 50 PBYTE addr = SurfObj->pvScan0; 51 int lDelta = SurfObj->lDelta; 52 53 addr += (x>>1) + y1 * lDelta; 54 while(y1++ < y2) 55 { 56 *addr = (*addr & notmask[x&1]) | (BYTE)(c << ((1-(x&1))<<2)); 57 addr += lDelta; 58 } 59 } 60 61 #ifndef _USE_DIBLIB_ 62 BOOLEAN 63 DIB_4BPP_BitBltSrcCopy(PBLTINFO BltInfo) 64 { 65 LONG i, j, sx, sy, f2, xColor; 66 PBYTE SourceBits_24BPP, SourceLine_24BPP; 67 PBYTE DestBits, DestLine, SourceBits_8BPP, SourceLine_8BPP; 68 PBYTE SourceBits, SourceLine; 69 BOOLEAN bTopToBottom, bLeftToRight; 70 71 DPRINT("DIB_4BPP_BitBltSrcCopy: SrcSurf cx/cy (%d/%d), DestSuft cx/cy (%d/%d) dstRect: (%d,%d)-(%d,%d)\n", 72 BltInfo->SourceSurface->sizlBitmap.cx, BltInfo->SourceSurface->sizlBitmap.cy, 73 BltInfo->DestSurface->sizlBitmap.cx, BltInfo->DestSurface->sizlBitmap.cy, 74 BltInfo->DestRect.left, BltInfo->DestRect.top, BltInfo->DestRect.right, BltInfo->DestRect.bottom); 75 76 /* Get back left to right flip here */ 77 bLeftToRight = (BltInfo->DestRect.left > BltInfo->DestRect.right); 78 79 /* Check for top to bottom flip needed. */ 80 bTopToBottom = BltInfo->DestRect.top > BltInfo->DestRect.bottom; 81 82 /* Make WellOrdered with top < bottom and left < right */ 83 RECTL_vMakeWellOrdered(&BltInfo->DestRect); 84 85 DPRINT("BPP is '%d/%d' & BltInfo->SourcePoint.x is '%d' & BltInfo->SourcePoint.y is '%d'.\n", 86 BltInfo->SourceSurface->iBitmapFormat, BltInfo->SourcePoint.x, BltInfo->SourcePoint.y); 87 88 DestBits = (PBYTE)BltInfo->DestSurface->pvScan0 + 89 (BltInfo->DestRect.left >> 1) + 90 BltInfo->DestRect.top * BltInfo->DestSurface->lDelta; 91 92 switch (BltInfo->SourceSurface->iBitmapFormat) 93 { 94 case BMF_1BPP: 95 DPRINT("1BPP Case Selected with DestRect Width of '%d'.\n", 96 BltInfo->DestRect.right - BltInfo->DestRect.left); 97 98 sx = BltInfo->SourcePoint.x; 99 100 /* This sets sy to the top line */ 101 sy = BltInfo->SourcePoint.y; 102 103 if (bTopToBottom) 104 { 105 /* This sets sy to the bottom line */ 106 sy += (BltInfo->DestRect.bottom - BltInfo->DestRect.top - 1) * BltInfo->SourceSurface->lDelta; 107 } 108 109 for (j=BltInfo->DestRect.top; j<BltInfo->DestRect.bottom; j++) 110 { 111 sx = BltInfo->SourcePoint.x; 112 113 if (bLeftToRight) 114 { 115 /* This sets the sx to the rightmost pixel */ 116 sx += (BltInfo->DestRect.right - BltInfo->DestRect.left - 1); 117 } 118 119 for (i=BltInfo->DestRect.left; i<BltInfo->DestRect.right; i++) 120 { 121 if(DIB_1BPP_GetPixel(BltInfo->SourceSurface, sx, sy) == 0) 122 { 123 DIB_4BPP_PutPixel(BltInfo->DestSurface, i, j, XLATEOBJ_iXlate(BltInfo->XlateSourceToDest, 0)); 124 } 125 else 126 { 127 DIB_4BPP_PutPixel(BltInfo->DestSurface, i, j, XLATEOBJ_iXlate(BltInfo->XlateSourceToDest, 1)); 128 } 129 DEC_OR_INC(sx, bLeftToRight, 1); 130 } 131 DEC_OR_INC(sy, bTopToBottom, 1); 132 } 133 break; 134 135 case BMF_4BPP: 136 DPRINT("4BPP Case Selected with DestRect Width of '%d'.\n", 137 BltInfo->DestRect.right - BltInfo->DestRect.left); 138 139 /* This sets sy to the top line */ 140 sy = BltInfo->SourcePoint.y; 141 142 if (bTopToBottom) 143 { 144 /* This sets sy to the bottom line */ 145 sy += (BltInfo->DestRect.bottom - BltInfo->DestRect.top - 1) 146 * BltInfo->SourceSurface->lDelta; 147 } 148 149 for (j=BltInfo->DestRect.top; j<BltInfo->DestRect.bottom; j++) 150 { 151 sx = BltInfo->SourcePoint.x; 152 153 if (bLeftToRight) 154 { 155 /* This sets the sx to the rightmost pixel */ 156 sx += (BltInfo->DestRect.right - BltInfo->DestRect.left - 1); 157 } 158 159 for (i=BltInfo->DestRect.left; i<BltInfo->DestRect.right; i++) 160 { 161 if (NULL != BltInfo->XlateSourceToDest) 162 { 163 DIB_4BPP_PutPixel(BltInfo->DestSurface, i, j, 164 XLATEOBJ_iXlate(BltInfo->XlateSourceToDest, 165 DIB_4BPP_GetPixel(BltInfo->SourceSurface, sx, sy))); 166 } 167 else 168 { 169 DIB_4BPP_PutPixel(BltInfo->DestSurface, i, j, 170 DIB_4BPP_GetPixel(BltInfo->SourceSurface, sx, sy)); 171 } 172 DEC_OR_INC(sx, bLeftToRight, 1); 173 } 174 DEC_OR_INC(sy, bTopToBottom, 1); 175 } 176 break; 177 178 case BMF_8BPP: 179 DPRINT("8BPP-dstRect: (%d,%d)-(%d,%d) and Width of '%d'.\n", 180 BltInfo->DestRect.left, BltInfo->DestRect.top, 181 BltInfo->DestRect.right, BltInfo->DestRect.bottom, 182 BltInfo->DestRect.right - BltInfo->DestRect.left); 183 184 SourceBits_8BPP = (PBYTE)BltInfo->SourceSurface->pvScan0 + 185 (BltInfo->SourcePoint.y * BltInfo->SourceSurface->lDelta) + BltInfo->SourcePoint.x; 186 187 if (bTopToBottom) 188 { 189 /* This sets SourceBits to the bottom line */ 190 SourceBits_8BPP = (PBYTE)((LONG_PTR)SourceBits_8BPP + 191 ((BltInfo->DestRect.bottom - BltInfo->DestRect.top - 1) * 192 BltInfo->SourceSurface->lDelta)); 193 } 194 195 for (j=BltInfo->DestRect.top; j<BltInfo->DestRect.bottom; j++) 196 { 197 SourceLine_8BPP = SourceBits_8BPP; 198 DestLine = DestBits; 199 200 if (bLeftToRight) 201 { 202 /* This sets SourceBits_8BPP to the rightmost pixel */ 203 SourceBits_8BPP += (BltInfo->DestRect.right - BltInfo->DestRect.left - 1); 204 } 205 206 f2 = BltInfo->DestRect.left & 1; 207 208 for (i=BltInfo->DestRect.left; i<BltInfo->DestRect.right; i++) 209 { 210 *DestLine = (*DestLine & notmask[f2]) | 211 (BYTE)((XLATEOBJ_iXlate(BltInfo->XlateSourceToDest, *SourceLine_8BPP)) << ((4 * (1 - f2)))); 212 if (f2 == 1) { DestLine++; f2 = 0; } else { f2 = 1; } 213 DEC_OR_INC(SourceLine_8BPP, bLeftToRight, 1); 214 } 215 DEC_OR_INC(SourceBits_8BPP, bTopToBottom, BltInfo->SourceSurface->lDelta); 216 DestBits += BltInfo->DestSurface->lDelta; 217 } 218 break; 219 220 case BMF_16BPP: 221 DPRINT("16BPP Case Selected with DestRect Width of '%d'.\n", 222 BltInfo->DestRect.right - BltInfo->DestRect.left); 223 224 DPRINT("BMF_16BPP-dstRect: (%d,%d)-(%d,%d) and Width of '%d'.\n", 225 BltInfo->DestRect.left, BltInfo->DestRect.top, 226 BltInfo->DestRect.right, BltInfo->DestRect.bottom, 227 BltInfo->DestRect.right - BltInfo->DestRect.left); 228 229 SourceLine = (PBYTE)BltInfo->SourceSurface->pvScan0 + 230 (BltInfo->SourcePoint.y * BltInfo->SourceSurface->lDelta) + 231 2 * BltInfo->SourcePoint.x; 232 233 if (bTopToBottom) 234 { 235 /* This sets SourceLine to the bottom line */ 236 SourceLine += (BltInfo->DestRect.bottom - BltInfo->DestRect.top - 1) * 237 BltInfo->SourceSurface->lDelta;; 238 } 239 240 DestLine = DestBits; 241 242 for (j = BltInfo->DestRect.top; j < BltInfo->DestRect.bottom; j++) 243 { 244 SourceBits = SourceLine; 245 246 if (bLeftToRight) 247 { 248 /* This sets SourceBits to the rightmost pixel */ 249 SourceBits += (BltInfo->DestRect.right - BltInfo->DestRect.left - 1) * 2; 250 } 251 252 DestBits = DestLine; 253 f2 = BltInfo->DestRect.left & 1; 254 255 for (i = BltInfo->DestRect.left; i < BltInfo->DestRect.right; i++) 256 { 257 xColor = *((PWORD) SourceBits); 258 *DestBits = (*DestBits & notmask[f2]) | 259 (BYTE)((XLATEOBJ_iXlate(BltInfo->XlateSourceToDest, xColor)) << ((4 * (1 - f2)))); 260 if(f2 == 1) { DestBits++; f2 = 0; } else { f2 = 1; } 261 262 DEC_OR_INC(SourceBits, bLeftToRight, 2); 263 } 264 265 DEC_OR_INC(SourceLine, bTopToBottom, BltInfo->SourceSurface->lDelta); 266 DestLine += BltInfo->DestSurface->lDelta; 267 } 268 break; 269 270 case BMF_24BPP: 271 272 DPRINT("24BPP-dstRect: (%d,%d)-(%d,%d) and Width of '%d'.\n", 273 BltInfo->DestRect.left, BltInfo->DestRect.top, 274 BltInfo->DestRect.right, BltInfo->DestRect.bottom, 275 BltInfo->DestRect.right - BltInfo->DestRect.left); 276 277 SourceBits_24BPP = (PBYTE)BltInfo->SourceSurface->pvScan0 + 278 (BltInfo->SourcePoint.y * BltInfo->SourceSurface->lDelta) + 279 BltInfo->SourcePoint.x * 3; 280 281 if (bTopToBottom) 282 { 283 /* This sets SourceLine to the bottom line */ 284 SourceBits_24BPP += BltInfo->SourceSurface->lDelta * 285 (BltInfo->DestRect.bottom - BltInfo->DestRect.top - 1); 286 } 287 288 for (j=BltInfo->DestRect.top; j<BltInfo->DestRect.bottom; j++) 289 { 290 SourceLine_24BPP = SourceBits_24BPP; 291 DestLine = DestBits; 292 f2 = BltInfo->DestRect.left & 1; 293 294 if (bLeftToRight) 295 { 296 /* This sets the SourceBits_24BPP to the rightmost pixel */ 297 SourceLine_24BPP += (BltInfo->DestRect.right - BltInfo->DestRect.left - 1) * 3; 298 } 299 300 for (i=BltInfo->DestRect.left; i<BltInfo->DestRect.right; i++) 301 { 302 xColor = (*(SourceLine_24BPP + 2) << 0x10) + 303 (*(SourceLine_24BPP + 1) << 0x08) + 304 (*(SourceLine_24BPP)); 305 *DestLine = (*DestLine & notmask[f2]) | 306 (BYTE)((XLATEOBJ_iXlate(BltInfo->XlateSourceToDest, xColor)) << ((4 * (1 - f2)))); 307 if(f2 == 1) { DestLine++; f2 = 0; } else { f2 = 1; } 308 DEC_OR_INC(SourceLine_24BPP, bLeftToRight, 3); 309 } 310 DEC_OR_INC(SourceBits_24BPP, bTopToBottom, BltInfo->SourceSurface->lDelta); 311 DestBits += BltInfo->DestSurface->lDelta; 312 } 313 break; 314 315 case BMF_32BPP: 316 DPRINT("32BPP Case Selected with DestRect Width of '%d'.\n", 317 BltInfo->DestRect.right - BltInfo->DestRect.left); 318 319 SourceLine = (PBYTE)BltInfo->SourceSurface->pvScan0 + 320 (BltInfo->SourcePoint.y * BltInfo->SourceSurface->lDelta) + 321 4 * BltInfo->SourcePoint.x; 322 323 if (bTopToBottom) 324 { 325 /* This sets SourceLine to the bottom line */ 326 SourceLine += BltInfo->DestRect.bottom - BltInfo->DestRect.top - 1; 327 } 328 329 DestLine = DestBits; 330 331 for (j = BltInfo->DestRect.top; j < BltInfo->DestRect.bottom; j++) 332 { 333 SourceBits = SourceLine; 334 DestBits = DestLine; 335 336 if (bLeftToRight) 337 { 338 /* This sets SourceBits to the rightmost pixel */ 339 SourceBits += (BltInfo->DestRect.right - BltInfo->DestRect.left - 1) * 4; 340 } 341 342 f2 = BltInfo->DestRect.left & 1; 343 344 for (i = BltInfo->DestRect.left; i < BltInfo->DestRect.right; i++) 345 { 346 xColor = *((PDWORD) SourceBits); 347 *DestBits = (*DestBits & notmask[f2]) | 348 (BYTE)((XLATEOBJ_iXlate(BltInfo->XlateSourceToDest, xColor)) << ((4 * (1 - f2)))); 349 if(f2 == 1) { DestBits++; f2 = 0; } else { f2 = 1; } 350 351 DEC_OR_INC(SourceBits, bLeftToRight, 4); 352 } 353 354 DEC_OR_INC(SourceLine, bTopToBottom, BltInfo->SourceSurface->lDelta); 355 DestLine += BltInfo->DestSurface->lDelta; 356 } 357 break; 358 359 default: 360 DbgPrint("DIB_4BPP_BitBltSrcCopy: Unhandled Source BPP: %u\n", 361 BitsPerFormat(BltInfo->SourceSurface->iBitmapFormat)); 362 return FALSE; 363 } 364 return(TRUE); 365 } 366 367 BOOLEAN 368 DIB_4BPP_BitBlt(PBLTINFO BltInfo) 369 { 370 LONG DestX, DestY; 371 LONG SourceX, SourceY; 372 LONG PatternY = 0; 373 ULONG Dest, Source = 0, Pattern = 0; 374 BOOLEAN UsesSource; 375 BOOLEAN UsesPattern; 376 PULONG DestBits; 377 LONG RoundedRight; 378 static const ULONG ExpandSolidColor[16] = 379 { 380 0x00000000 /* 0 */, 381 0x11111111 /* 1 */, 382 0x22222222 /* 2 */, 383 0x33333333 /* 3 */, 384 0x44444444 /* 4 */, 385 0x55555555 /* 5 */, 386 0x66666666 /* 6 */, 387 0x77777777 /* 7 */, 388 0x88888888 /* 8 */, 389 0x99999999 /* 9 */, 390 0xAAAAAAAA /* 10 */, 391 0xBBBBBBBB /* 11 */, 392 0xCCCCCCCC /* 12 */, 393 0xDDDDDDDD /* 13 */, 394 0xEEEEEEEE /* 14 */, 395 0xFFFFFFFF /* 15 */, 396 }; 397 398 UsesSource = ROP4_USES_SOURCE(BltInfo->Rop4); 399 UsesPattern = ROP4_USES_PATTERN(BltInfo->Rop4); 400 401 SourceY = BltInfo->SourcePoint.y; 402 RoundedRight = BltInfo->DestRect.right - 403 ((BltInfo->DestRect.right - BltInfo->DestRect.left) & 0x7); 404 405 if (UsesPattern) 406 { 407 if (BltInfo->PatternSurface) 408 { 409 PatternY = (BltInfo->DestRect.top + BltInfo->BrushOrigin.y) % 410 BltInfo->PatternSurface->sizlBitmap.cy; 411 } 412 else 413 { 414 if (BltInfo->Brush) 415 Pattern = ExpandSolidColor[BltInfo->Brush->iSolidColor]; 416 } 417 } 418 419 for (DestY = BltInfo->DestRect.top; DestY < BltInfo->DestRect.bottom; DestY++) 420 { 421 DestBits = (PULONG)( 422 (PBYTE)BltInfo->DestSurface->pvScan0 + 423 (BltInfo->DestRect.left >> 1) + 424 DestY * BltInfo->DestSurface->lDelta); 425 SourceX = BltInfo->SourcePoint.x; 426 DestX = BltInfo->DestRect.left; 427 428 if (DestX & 0x1) 429 { 430 Dest = DIB_4BPP_GetPixel(BltInfo->DestSurface, DestX, DestY); 431 432 if (UsesSource) 433 { 434 Source = DIB_GetSource(BltInfo->SourceSurface, SourceX, SourceY, BltInfo->XlateSourceToDest); 435 } 436 437 if (BltInfo->PatternSurface) 438 { 439 Pattern = DIB_GetSourceIndex(BltInfo->PatternSurface, 440 (DestX + BltInfo->BrushOrigin.x) % BltInfo->PatternSurface->sizlBitmap.cx, PatternY); 441 } 442 443 DIB_4BPP_PutPixel(BltInfo->DestSurface, DestX, DestY, DIB_DoRop(BltInfo->Rop4, Dest, Source, Pattern) & 0xF); 444 445 DestX++; 446 SourceX++; 447 DestBits = (PULONG)((ULONG_PTR)DestBits + 1); 448 } 449 450 for (; DestX < RoundedRight; DestX += 8, SourceX += 8, DestBits++) 451 { 452 Dest = *DestBits; 453 if (UsesSource) 454 { 455 Source = 456 (DIB_GetSource(BltInfo->SourceSurface, SourceX + 1, SourceY, BltInfo->XlateSourceToDest)) | 457 (DIB_GetSource(BltInfo->SourceSurface, SourceX + 0, SourceY, BltInfo->XlateSourceToDest) << 4) | 458 (DIB_GetSource(BltInfo->SourceSurface, SourceX + 3, SourceY, BltInfo->XlateSourceToDest) << 8) | 459 (DIB_GetSource(BltInfo->SourceSurface, SourceX + 2, SourceY, BltInfo->XlateSourceToDest) << 12) | 460 (DIB_GetSource(BltInfo->SourceSurface, SourceX + 5, SourceY, BltInfo->XlateSourceToDest) << 16) | 461 (DIB_GetSource(BltInfo->SourceSurface, SourceX + 4, SourceY, BltInfo->XlateSourceToDest) << 20) | 462 (DIB_GetSource(BltInfo->SourceSurface, SourceX + 7, SourceY, BltInfo->XlateSourceToDest) << 24) | 463 (DIB_GetSource(BltInfo->SourceSurface, SourceX + 6, SourceY, BltInfo->XlateSourceToDest) << 28); 464 } 465 if (BltInfo->PatternSurface) 466 { 467 Pattern = DIB_GetSourceIndex(BltInfo->PatternSurface, (DestX + BltInfo->BrushOrigin.x + 1) % BltInfo->PatternSurface->sizlBitmap.cx, PatternY); 468 Pattern |= DIB_GetSourceIndex(BltInfo->PatternSurface, (DestX + BltInfo->BrushOrigin.x + 0) % BltInfo->PatternSurface->sizlBitmap.cx, PatternY) << 4; 469 Pattern |= DIB_GetSourceIndex(BltInfo->PatternSurface, (DestX + BltInfo->BrushOrigin.x + 3) % BltInfo->PatternSurface->sizlBitmap.cx, PatternY) << 8; 470 Pattern |= DIB_GetSourceIndex(BltInfo->PatternSurface, (DestX + BltInfo->BrushOrigin.x + 2) % BltInfo->PatternSurface->sizlBitmap.cx, PatternY) << 12; 471 Pattern |= DIB_GetSourceIndex(BltInfo->PatternSurface, (DestX + BltInfo->BrushOrigin.x + 5) % BltInfo->PatternSurface->sizlBitmap.cx, PatternY) << 16; 472 Pattern |= DIB_GetSourceIndex(BltInfo->PatternSurface, (DestX + BltInfo->BrushOrigin.x + 4) % BltInfo->PatternSurface->sizlBitmap.cx, PatternY) << 20; 473 Pattern |= DIB_GetSourceIndex(BltInfo->PatternSurface, (DestX + BltInfo->BrushOrigin.x + 7) % BltInfo->PatternSurface->sizlBitmap.cx, PatternY) << 24; 474 Pattern |= DIB_GetSourceIndex(BltInfo->PatternSurface, (DestX + BltInfo->BrushOrigin.x + 6) % BltInfo->PatternSurface->sizlBitmap.cx, PatternY) << 28; 475 } 476 *DestBits = DIB_DoRop(BltInfo->Rop4, Dest, Source, Pattern); 477 } 478 479 /* Process the rest of pixel on the line */ 480 for (; DestX < BltInfo->DestRect.right; DestX++, SourceX++) 481 { 482 Dest = DIB_4BPP_GetPixel(BltInfo->DestSurface, DestX, DestY); 483 if (UsesSource) 484 { 485 Source = DIB_GetSource(BltInfo->SourceSurface, SourceX, SourceY, BltInfo->XlateSourceToDest); 486 } 487 if (BltInfo->PatternSurface) 488 { 489 Pattern = DIB_GetSourceIndex(BltInfo->PatternSurface, 490 (DestX + BltInfo->BrushOrigin.x) % BltInfo->PatternSurface->sizlBitmap.cx, PatternY); 491 } 492 DIB_4BPP_PutPixel(BltInfo->DestSurface, DestX, DestY, DIB_DoRop(BltInfo->Rop4, Dest, Source, Pattern) & 0xF); 493 } 494 495 SourceY++; 496 if (BltInfo->PatternSurface) 497 { 498 PatternY++; 499 PatternY %= BltInfo->PatternSurface->sizlBitmap.cy; 500 } 501 } 502 503 return TRUE; 504 } 505 506 /* BitBlt Optimize */ 507 BOOLEAN 508 DIB_4BPP_ColorFill(SURFOBJ* DestSurface, RECTL* DestRect, ULONG color) 509 { 510 LONG DestY; 511 512 /* Make WellOrdered by making top < bottom and left < right */ 513 RECTL_vMakeWellOrdered(DestRect); 514 515 for (DestY = DestRect->top; DestY < DestRect->bottom; DestY++) 516 { 517 DIB_4BPP_HLine(DestSurface, DestRect->left, DestRect->right, DestY, color); 518 } 519 return TRUE; 520 } 521 #endif // !_USE_DIBLIB_ 522 523 BOOLEAN 524 DIB_4BPP_TransparentBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, 525 RECTL* DestRect, RECTL *SourceRect, 526 XLATEOBJ *ColorTranslation, ULONG iTransColor) 527 { 528 return FALSE; 529 } 530 531 /* EOF */ 532