|
|
1.1 ! root 1: /******************************Module*Header*******************************\ ! 2: * Module Name: dibmp.c ! 3: * ! 4: * Contains functions that manipulate the DIB color ! 5: * ! 6: * Created: 30-Jan-1992 21:21:05 ! 7: * Author: Petrus Wong ! 8: * ! 9: * Copyright (c) 1990 Microsoft Corporation ! 10: * ! 11: * These functions will be called from the ChildWndProc() as it processes ! 12: * the corresponding WM_COMMAND message for changing the color of the bitmap. ! 13: * ! 14: * iCreatePenFrPal() is called by InitializeApp() for creating pens based on ! 15: * either system or custom palette. ! 16: * ! 17: * Dependencies: ! 18: * none ! 19: * ! 20: \**************************************************************************/ ! 21: #include <windows.h> ! 22: #include <stdio.h> ! 23: #include "jtypes.h" ! 24: #include "dibmp.h" ! 25: ! 26: //#define CYCLETHRD ! 27: ! 28: //#define DEBUG ! 29: ! 30: #ifndef DEBUG ! 31: #undef OutputDebugString ! 32: #define OutputDebugString(LPCSTR) ! 33: #endif ! 34: ! 35: ! 36: extern HWND ghwndMain; ! 37: extern HWND ghwndClient; ! 38: extern HANDLE hQuitEvent; ! 39: extern char gtext[256]; ! 40: extern HANDLE ghAccel; ! 41: BOOL bValidMode(INT); ! 42: BOOL bColor2BW(PBITMAPINFO); ! 43: BOOL bChangeDIBColor(HDC, PINFO, INT); ! 44: BOOL bColorShift(PBITMAPINFO); ! 45: BOOL bColorReplace(PBITMAPINFO); ! 46: BOOL bColorCycle(HDC, RECT, PBYTE, PBITMAPINFO, PINFO); ! 47: BOOL bCycle(HWND); ! 48: BOOL bColor2Mono(HDC, PINFO, PBITMAPINFO); ! 49: INT iCreatePenFrPal(HDC, PVOID *); ! 50: extern PINFO pGetInfoData(HWND); ! 51: extern BOOL bReleaseInfoData(HWND); ! 52: ! 53: ! 54: /******************************Public*Routine******************************\ ! 55: * ! 56: * bChangeDIBColor ! 57: * ! 58: * Effects: Main entry point for the color changing operations. It ! 59: * 1. validates the operation ! 60: * 2. retrieves the bitmap info from the graphics engine ! 61: * 3. dispatches the call to the right function ! 62: * 4. saves the resulting bitmap ! 63: * 5. updates the screen ! 64: * ! 65: * Warnings: ! 66: * ! 67: * History: ! 68: * 30-Jan-1992 -by- Petrus Wong ! 69: * Wrote it. ! 70: \**************************************************************************/ ! 71: BOOL bChangeDIBColor(HDC hDC, PINFO pInfo, INT iMode) ! 72: { ! 73: BOOL bSuccess; ! 74: HBITMAP hTmpBmp, hBmpOld; ! 75: PBITMAPINFO pbmi; ! 76: PBYTE pBits; ! 77: BITMAPINFO bmi; ! 78: PBYTE pjTmp, pjTmpBmi; ! 79: ULONG sizBMI; ! 80: RECT rc; ! 81: BOOL bCycle; ! 82: ! 83: ! 84: bSuccess = TRUE; ! 85: if (!pInfo->hBmpSaved) { ! 86: MessageBox(ghwndMain, "There's no Bitmap to change!", "Error", MB_OK); ! 87: return FALSE; ! 88: } ! 89: ! 90: if (!bValidMode(iMode)) { ! 91: MessageBox(ghwndMain, "bChangeDIBColor: invalid mode!", "Error", MB_OK); ! 92: return FALSE; ! 93: } ! 94: ! 95: // ! 96: // Let the graphics engine to retrieve the dimension of the bitmap for us ! 97: // GetDIBits uses the size to determine if it's BITMAPCOREINFO or BITMAPINFO ! 98: // if BitCount != 0, color table will be retrieved ! 99: // ! 100: bmi.bmiHeader.biSize = 0x28; // GDI need this to work ! 101: bmi.bmiHeader.biBitCount = 0; // don't get the color table ! 102: if ((GetDIBits(hDC, pInfo->hBmpSaved, 0, 0, (LPSTR)NULL, &bmi, DIB_RGB_COLORS)) == 0) { ! 103: MessageBox(ghwndMain, "GetDIBits failed!", "Error", MB_OK); ! 104: return FALSE; ! 105: } ! 106: ! 107: // ! 108: // Now that we know the size of the image, alloc enough memory to retrieve ! 109: // the actual bits ! 110: // ! 111: if ((pBits = (PBYTE)GlobalAlloc(GMEM_FIXED | GMEM_ZEROINIT, ! 112: bmi.bmiHeader.biSizeImage)) == NULL) { ! 113: MessageBox(ghwndMain, "Failed in Memory Allocation for pBits!", "Error", MB_OK); ! 114: return FALSE; ! 115: } ! 116: ! 117: // ! 118: // Note: 24 bits per pixel has no color table. So, we don't have to ! 119: // allocate memory for retrieving that. Otherwise, we do. ! 120: // ! 121: pbmi = &bmi; // assume no color table ! 122: if (bmi.bmiHeader.biBitCount != 24) { // has color table ! 123: sizBMI = sizeof(BITMAPINFO)+sizeof(RGBQUAD)*(1<<bmi.bmiHeader.biBitCount); ! 124: // ! 125: // I need more memory for the color table ! 126: // ! 127: if ((pbmi = (PBITMAPINFO)GlobalAlloc(GMEM_FIXED | GMEM_ZEROINIT, sizBMI )) == NULL) { ! 128: MessageBox(ghwndMain, "Failed in Memory Allocation for pbmi!", "Error", MB_OK); ! 129: bSuccess = FALSE; ! 130: goto ErrExit1; ! 131: } ! 132: ! 133: // ! 134: // Now that we've a bigger chunk of memory, let's copy the Bitmap ! 135: // info header data over ! 136: // ! 137: pjTmp = (PBYTE)pbmi; ! 138: pjTmpBmi = (PBYTE)&bmi; ! 139: sizBMI = sizeof(BITMAPINFOHEADER); ! 140: ! 141: while(sizBMI--) ! 142: { ! 143: *(((PBYTE)pjTmp)++) = *((pjTmpBmi)++); ! 144: } ! 145: ! 146: } ! 147: ! 148: // ! 149: // Bitmap can't be selected into a DC when calling GetDIBits ! 150: // Assume that the hDC is the DC where the bitmap would have been selected ! 151: // if indeed it has been selected ! 152: // ! 153: if (hTmpBmp = CreateCompatibleBitmap(hDC, pbmi->bmiHeader.biWidth, pbmi->bmiHeader.biHeight)) { ! 154: hBmpOld = SelectObject(hDC, hTmpBmp); ! 155: if ((GetDIBits(hDC, pInfo->hBmpSaved, 0, pbmi->bmiHeader.biHeight, (LPSTR)pBits, pbmi, DIB_RGB_COLORS))==0){ ! 156: MessageBox(ghwndMain, "Failed in GetDIBits!", "Error", MB_OK); ! 157: bSuccess = FALSE; ! 158: goto ErrExit4; ! 159: } ! 160: } else { ! 161: MessageBox(ghwndMain, "Failed in creating bitmap!", "Error", MB_OK); ! 162: bSuccess = FALSE; ! 163: goto ErrExit3; ! 164: } ! 165: ! 166: bCycle = FALSE; ! 167: switch (iMode) { ! 168: case MM_BW: ! 169: if ((!bColor2Mono(hDC, pInfo, pbmi)) || ! 170: (pInfo->hBmpMono == NULL)) { ! 171: MessageBox(ghwndMain, "Failed in Color2Mono!", "Error", MB_OK); ! 172: bSuccess = FALSE; ! 173: goto ErrExit4; ! 174: } ! 175: pInfo->bUseMono = TRUE; ! 176: break; ! 177: case MM_SHIFT: ! 178: if (!bColorShift(pbmi)) { ! 179: MessageBox(ghwndMain, "Failed in ColorShift!", "Error", MB_OK); ! 180: bSuccess = FALSE; ! 181: goto ErrExit4; ! 182: } ! 183: break; ! 184: case MM_CUSTOM: ! 185: bColorReplace(pbmi); ! 186: break; ! 187: ! 188: case MM_CYCLE: ! 189: bCycle = TRUE; ! 190: break; ! 191: ! 192: default: ! 193: bSuccess = FALSE; ! 194: break; ! 195: } ! 196: ! 197: if (SetDIBits(hDC, pInfo->hBmpSaved, 0, pbmi->bmiHeader.biHeight, (LPSTR)pBits, ! 198: pbmi, DIB_RGB_COLORS) == 0) { ! 199: MessageBox(ghwndMain, "Failed in SetDIBits!", "Error", MB_OK); ! 200: bSuccess = FALSE; ! 201: goto ErrExit4; ! 202: } ! 203: ! 204: if (bCycle) ! 205: pInfo->bSetDIBsToDevice = TRUE; ! 206: ! 207: if (pInfo->bSetDIBsToDevice && !pInfo->bUseMono) { ! 208: //GetWindowRect(pInfo->hwnd, &rc); ! 209: GetClientRect(pInfo->hwnd, &rc); ! 210: //SetMapMode(hDC, MM_TEXT); ! 211: ! 212: if (SetDIBitsToDevice(hDC, 0, 0, rc.right-rc.left, rc.bottom-rc.top, ! 213: 0, 0, 0, pbmi->bmiHeader.biHeight, (LPSTR)pBits, pbmi, DIB_RGB_COLORS) == 0) { ! 214: MessageBox(ghwndMain, "Failed in SetDIBitsToDevice!", "Error", MB_OK); ! 215: bSuccess = FALSE; ! 216: goto ErrExit4; ! 217: } ! 218: } else { ! 219: InvalidateRect(pInfo->hwnd, NULL, FALSE); ! 220: ! 221: } ! 222: ! 223: if (bCycle) { ! 224: //SetSystemPaletteUse(hDC, SYSPAL_NOSTATIC); ! 225: bColorCycle(hDC, rc, pBits, pbmi, pInfo); ! 226: //SetSystemPaletteUse(hDC, SYSPAL_STATIC); ! 227: } ! 228: ! 229: ErrExit4: ! 230: SelectObject(hDC, hBmpOld); ! 231: DeleteObject(hTmpBmp); ! 232: ErrExit3: ! 233: GlobalFree(pbmi); ! 234: ErrExit1: ! 235: GlobalFree(pBits); ! 236: return bSuccess; ! 237: } ! 238: ! 239: ! 240: /******************************Public*Routine******************************\ ! 241: * ! 242: * bValidMode ! 243: * ! 244: * Effects: validates the change mode for ChangeDIBColor function ! 245: * returns TRUE if mode is valid. Otherwise, FALSE ! 246: * ! 247: * Warnings: ! 248: * ! 249: * History: ! 250: * 30-Jan-1992 -by- Petrus Wong ! 251: * Wrote it. ! 252: \**************************************************************************/ ! 253: BOOL bValidMode(INT iMode) ! 254: { ! 255: if ((iMode == MM_BW) || (iMode == MM_SHIFT) || ! 256: (iMode == MM_CUSTOM) || (iMode == MM_CYCLE)) ! 257: return TRUE; ! 258: else ! 259: return FALSE; ! 260: } ! 261: ! 262: /******************************Public*Routine******************************\ ! 263: * ! 264: * bColor2BW ! 265: * ! 266: * Effects: changes the color table in the bitmapinfo to black and white ! 267: * ! 268: * Warnings: doesn't check if pbmi is valid or not ! 269: * ! 270: * History: ! 271: * 30-Jan-1992 -by- Petrus Wong ! 272: * Wrote it. ! 273: \**************************************************************************/ ! 274: BOOL bColor2BW(PBITMAPINFO pbmi) ! 275: { ! 276: INT iEntry; ! 277: ! 278: // ! 279: // CR! What's the right behavior? Maybe I should convert this to a ! 280: // monochrome bitmap. This will be very useful in MaskBlt(). ! 281: // ! 282: iEntry = 1<<pbmi->bmiHeader.biBitCount; ! 283: while (--iEntry >= 0) { ! 284: if (iEntry <= iEntry / 2) { ! 285: pbmi->bmiColors[iEntry].rgbBlue = 0x00; ! 286: pbmi->bmiColors[iEntry].rgbGreen = 0x00; ! 287: pbmi->bmiColors[iEntry].rgbRed = 0x00; ! 288: pbmi->bmiColors[iEntry].rgbReserved = 0x00; ! 289: } else { ! 290: pbmi->bmiColors[iEntry].rgbBlue = 0xFF; ! 291: pbmi->bmiColors[iEntry].rgbGreen = 0xFF; ! 292: pbmi->bmiColors[iEntry].rgbRed = 0xFF; ! 293: pbmi->bmiColors[iEntry].rgbReserved = 0x00; ! 294: } ! 295: } ! 296: return TRUE; ! 297: } ! 298: ! 299: ! 300: /******************************Public*Routine******************************\ ! 301: * ! 302: * bColorShift ! 303: * ! 304: * Effects: Shifting entries of the color table ! 305: * ! 306: * Warnings: ! 307: * ! 308: * History: ! 309: * 30-Jan-1992 -by- Petrus Wong ! 310: * Wrote it. ! 311: \**************************************************************************/ ! 312: ! 313: BOOL bColorShift(PBITMAPINFO pbmi) ! 314: { ! 315: INT iEntry; ! 316: RGBQUAD Tmp; ! 317: ! 318: iEntry = 1<<pbmi->bmiHeader.biBitCount; ! 319: ! 320: Tmp.rgbBlue = pbmi->bmiColors[iEntry-1].rgbBlue; ! 321: Tmp.rgbGreen = pbmi->bmiColors[iEntry-1].rgbGreen; ! 322: Tmp.rgbRed = pbmi->bmiColors[iEntry-1].rgbRed; ! 323: Tmp.rgbReserved = pbmi->bmiColors[iEntry-1].rgbReserved; ! 324: ! 325: while (--iEntry > 0) { ! 326: pbmi->bmiColors[iEntry].rgbBlue = ! 327: pbmi->bmiColors[iEntry-1].rgbBlue; ! 328: pbmi->bmiColors[iEntry].rgbGreen = ! 329: pbmi->bmiColors[iEntry-1].rgbGreen; ! 330: pbmi->bmiColors[iEntry].rgbRed = ! 331: pbmi->bmiColors[iEntry-1].rgbRed; ! 332: pbmi->bmiColors[iEntry].rgbReserved = ! 333: pbmi->bmiColors[iEntry-1].rgbReserved; ! 334: } ! 335: pbmi->bmiColors[0].rgbBlue = Tmp.rgbBlue; ! 336: pbmi->bmiColors[0].rgbGreen = Tmp.rgbGreen; ! 337: pbmi->bmiColors[0].rgbRed = Tmp.rgbRed; ! 338: pbmi->bmiColors[0].rgbReserved = Tmp.rgbReserved; ! 339: return TRUE; ! 340: ! 341: } ! 342: ! 343: BOOL bColorReplace(PBITMAPINFO pbmi) ! 344: { ! 345: return FALSE; ! 346: UNREFERENCED_PARAMETER(pbmi); ! 347: } ! 348: ! 349: /******************************Public*Routine******************************\ ! 350: * ! 351: * bColorCycle ! 352: * ! 353: * Effects: Create a logical palette with a good spread of color ! 354: * Animate the palette, shift the palette entries and animate ! 355: * again for 256 times altogether. ! 356: * This creates the color cycling effect. ! 357: * ! 358: * Warnings: Only works in device that support palette. ! 359: * ! 360: * History: ! 361: * 31-May-1992 Petrus Wong Check if drawing window is gone or not ! 362: * 24-Apr-1992 -by- Petrus Wong ! 363: * Wrote it. ! 364: \**************************************************************************/ ! 365: ! 366: BOOL bColorCycle(HDC hDC, RECT rc, PBYTE pBits, PBITMAPINFO pbmi, PINFO pInfo) ! 367: { ! 368: INT iEntry, i; ! 369: PLOGPALETTE plogPat; ! 370: ULONG ulSize; ! 371: BOOL bSuccess; ! 372: HPALETTE hPal, hPalOld; ! 373: PALETTEENTRY peTemp; ! 374: BYTE red, green, blue; ! 375: #ifdef CYCLETHRD ! 376: DWORD dwWait; ! 377: #endif ! 378: MSG msg; ! 379: BOOL bQuit; ! 380: ! 381: UINT uRC; ! 382: ! 383: bSuccess = TRUE; ! 384: iEntry = 1<<pbmi->bmiHeader.biBitCount; ! 385: ulSize = sizeof(LOGPALETTE)+sizeof(PALETTEENTRY)*256; ! 386: ! 387: if ((plogPat = (PLOGPALETTE) GlobalAlloc(GMEM_FIXED | GMEM_ZEROINIT, ulSize)) == NULL) { ! 388: MessageBox(ghwndMain, "Failed in Memory Allocation for plogPat!", "Error", MB_OK); ! 389: bSuccess = FALSE; ! 390: goto ErrExit1; ! 391: } ! 392: ! 393: plogPat->palVersion = 0x300; ! 394: plogPat->palNumEntries = (WORD) 256; ! 395: #if 0 ! 396: for (i = 0; i < iEntry; i++) { ! 397: plogPat->palPalEntry[i].peBlue = pbmi->bmiColors[i].rgbBlue; ! 398: plogPat->palPalEntry[i].peGreen = pbmi->bmiColors[i].rgbGreen; ! 399: plogPat->palPalEntry[i].peRed = pbmi->bmiColors[i].rgbRed; ! 400: plogPat->palPalEntry[i].peFlags = PC_RESERVED; ! 401: } ! 402: #endif ! 403: for (i = 0; i < 256; i++) { ! 404: plogPat->palPalEntry[i].peBlue = blue; ! 405: plogPat->palPalEntry[i].peGreen = green; ! 406: plogPat->palPalEntry[i].peRed = red; ! 407: plogPat->palPalEntry[i].peFlags = PC_RESERVED; ! 408: ! 409: if (!(red += 32)) ! 410: if (!(green += 32)) ! 411: blue += 64; ! 412: } ! 413: ! 414: if ((hPal = CreatePalette(plogPat)) == (HPALETTE) NULL) { ! 415: MessageBox(ghwndMain, "Failed in creating palette!", "Error", MB_OK); ! 416: bSuccess = FALSE; ! 417: goto ErrExit2; ! 418: } ! 419: ! 420: hPalOld = SelectPalette(hDC, hPal, FALSE); ! 421: RealizePalette(hDC); ! 422: ! 423: #ifndef CYCLETHRD ! 424: ! 425: bQuit = FALSE; ! 426: while (TRUE && !bQuit) { ! 427: ! 428: if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { ! 429: //sprintf( gtext,"msg = %lx\n", msg.message); ! 430: //OutputDebugString( gtext ); ! 431: ! 432: if ((msg.message == WM_QUIT) || (msg.message == WM_CLOSE) || ! 433: ((msg.message == WM_SYSCOMMAND) && (msg.wParam == SC_CLOSE))) { ! 434: sprintf( gtext,"msg = %lx, wPram = %lx\n", msg.message, msg.wParam); ! 435: OutputDebugString( gtext ); ! 436: bQuit = TRUE; ! 437: PostMessage(msg.hwnd, msg.message, msg.wParam, msg.lParam); ! 438: } else { ! 439: if (!TranslateAccelerator( ghwndMain, ghAccel, &msg) && ! 440: !TranslateMDISysAccel( ghwndClient, &msg) ) { ! 441: TranslateMessage(&msg); ! 442: DispatchMessage(&msg); ! 443: } ! 444: } ! 445: } ! 446: ! 447: #else ! 448: bQuit = FALSE; ! 449: while (TRUE) { ! 450: // ! 451: // If parent gets a WM_CLOSE, we will return ! 452: // ! 453: dwWait = WaitForSingleObject(pInfo->hQuitEvent, 0); ! 454: if (dwWait == WAIT_TIMEOUT) { ! 455: MessageBox(ghwndMain, "Cycle Thread Quitting!", "CYCLE Thread", MB_OK); ! 456: break; ! 457: } ! 458: #endif ! 459: if (!pInfo->bClrCycle) { ! 460: sprintf( gtext,"NOT to animate palette\n"); ! 461: OutputDebugString( gtext ); ! 462: bQuit = TRUE; ! 463: } ! 464: ! 465: if (!bQuit) { ! 466: sprintf( gtext,"About to animate palette\n"); ! 467: OutputDebugString( gtext ); ! 468: ! 469: ! 470: peTemp = plogPat->palPalEntry[0]; ! 471: for (i = 0; i < 255; i++) { ! 472: plogPat->palPalEntry[i] = plogPat->palPalEntry[i+1]; ! 473: } ! 474: plogPat->palPalEntry[i] = peTemp; ! 475: ! 476: if (!AnimatePalette(hPal, 0, 256, plogPat->palPalEntry)) { ! 477: sprintf( gtext,"Anmiate palette failed\n"); ! 478: OutputDebugString( gtext ); ! 479: } ! 480: ! 481: if ((uRC = RealizePalette(hDC)) == -1) { ! 482: sprintf( gtext,"Realize palette failed\n"); ! 483: OutputDebugString( gtext ); ! 484: } ! 485: sprintf( gtext,"Realize palette = %d\n", uRC); ! 486: OutputDebugString( gtext ); ! 487: ! 488: if (!UpdateColors(hDC)) { ! 489: sprintf( gtext,"Update Colors failed\n"); ! 490: OutputDebugString( gtext ); ! 491: } ! 492: ! 493: if (SetDIBitsToDevice(hDC, 0, 0, rc.right-rc.left, rc.bottom-rc.top, ! 494: 0, 0, 0, pbmi->bmiHeader.biHeight, (LPSTR)pBits, pbmi, DIB_PAL_COLORS) == 0) { ! 495: MessageBox(ghwndMain, "Failed in SetDIBitsToDevice!", "Error", MB_OK); ! 496: } ! 497: } ! 498: ! 499: } ! 500: ! 501: SelectPalette(hDC, hPalOld, 0); ! 502: DeleteObject(hPal); ! 503: ErrExit2: ! 504: GlobalFree(plogPat); ! 505: ErrExit1: ! 506: return bSuccess; ! 507: ! 508: } ! 509: ! 510: ! 511: /******************************Public*Routine******************************\ ! 512: * ! 513: * bCycle ! 514: * ! 515: * Effects: Wrapper for doing color cycling in a separate thread ! 516: * Called from MM_CYCLE ! 517: * ! 518: * Warnings: presents problem when the MDI child is closed if this thread ! 519: * is not done yet. We will have to wait until DeleteDC is ! 520: * fully functional. ! 521: * ! 522: * History: ! 523: * 28-May-1992 -by- Petrus Wong ! 524: * Wrote it. ! 525: \**************************************************************************/ ! 526: BOOL bCycle(HWND hwnd) ! 527: { ! 528: HDC hDC; ! 529: PINFO pInfo; ! 530: ! 531: if ((pInfo = pGetInfoData(hwnd)) == NULL) { ! 532: return 0L; ! 533: } ! 534: ! 535: hDC = GetDC(pInfo->hwnd); ! 536: bChangeDIBColor(hDC, pInfo, MM_CYCLE); ! 537: ReleaseDC(pInfo->hwnd, hDC); ! 538: ! 539: bReleaseInfoData(hwnd); ! 540: ! 541: ExitThread(0); ! 542: return TRUE; ! 543: } ! 544: ! 545: ! 546: /******************************Public*Routine******************************\ ! 547: * ! 548: * bColor2Mono ! 549: * ! 550: * Effects: Create a monochrome bitmap out of the colored one ! 551: * Using a different a source background clr every time it is called ! 552: * Saving the Monochrome bitmap in pInfo ! 553: * ! 554: * Warnings: It's more straight forward to use GetDIBits than this but ! 555: * that means some big changes to the bChangeDIBColor. ! 556: * ! 557: * History: ! 558: * 31-May-1992 -by- Petrus Wong ! 559: * Wrote it. ! 560: \**************************************************************************/ ! 561: ! 562: BOOL bColor2Mono(HDC hDC, PINFO pInfo, PBITMAPINFO pbmi) { ! 563: HDC hDCMemDest, hDCMemSrc; ! 564: HBITMAP hOldBmpDest, hOldBmpSrc; ! 565: INT iWidth, iHeight, iEntry; ! 566: static INT iCount=0; ! 567: ! 568: ! 569: iWidth = pbmi->bmiHeader.biWidth; ! 570: iHeight = pbmi->bmiHeader.biHeight; ! 571: ! 572: if (pInfo->hBmpMono) ! 573: DeleteObject(pInfo->hBmpMono); ! 574: ! 575: pInfo->hBmpMono = CreateBitmap(iWidth, iHeight, pbmi->bmiHeader.biPlanes, 1, NULL); ! 576: if (pInfo->hBmpMono == NULL) { ! 577: return(FALSE); ! 578: } ! 579: ! 580: hDCMemDest = CreateCompatibleDC(hDC); ! 581: hDCMemSrc = CreateCompatibleDC(hDC); ! 582: iEntry = 1<<pbmi->bmiHeader.biBitCount; ! 583: SetBkColor(hDCMemSrc, RGB( pbmi->bmiColors[iCount].rgbRed, ! 584: pbmi->bmiColors[iCount].rgbGreen, ! 585: pbmi->bmiColors[iCount].rgbBlue) ); ! 586: //SetBkColor(hDCMemDest, RGB( 0, 0, 0)); ! 587: //SetTextColor(hDCMemDest, RGB( 255, 255, 255)); ! 588: ! 589: iCount++; ! 590: if (iCount >= iEntry) ! 591: iCount = 0; ! 592: ! 593: hOldBmpDest = SelectObject(hDCMemDest, pInfo->hBmpMono); ! 594: hOldBmpSrc = SelectObject(hDCMemSrc, pInfo->hBmpSaved); ! 595: BitBlt(hDCMemDest, 0, 0, iWidth, iHeight, hDCMemSrc, 0, 0, SRCCOPY); ! 596: ! 597: SelectObject(hDCMemDest, hOldBmpDest); ! 598: SelectObject(hDCMemSrc, hOldBmpSrc); ! 599: ! 600: DeleteDC(hDCMemDest); ! 601: DeleteDC(hDCMemSrc); ! 602: ! 603: return(TRUE); ! 604: ! 605: } ! 606: ! 607: ! 608: /******************************Public*Routine******************************\ ! 609: * ! 610: * iCreatePenFrPal ! 611: * ! 612: * Effects: Create an array of pens from palette. ! 613: * If device supports palette, then first creates a logical palette ! 614: * with a good spread of color. Then select the logical palette into ! 615: * the DC. Create pen that corresponds to each palette entry. ! 616: * If system does not support palette, then use the system palette. ! 617: * ! 618: * prghPen pointer to an array of hPen ! 619: * If this is NULL, the required size of the array is ! 620: * returned. If this is not NULL, the array will be filled ! 621: * with hPens. ! 622: * ! 623: * returns the number of hPens created. ! 624: * ! 625: * Warnings: ! 626: * ! 627: * History: ! 628: * 13-Jun-1992 -by- Petrus Wong ! 629: * Wrote it. ! 630: \**************************************************************************/ ! 631: ! 632: INT iCreatePenFrPal(HDC hDC, PVOID *prghPen) ! 633: { ! 634: INT iNumClr, iResult, i; ! 635: PLOGPALETTE plogPat; ! 636: ULONG ulSize; ! 637: HPALETTE hPal, hPalOld; ! 638: BYTE red, green, blue; ! 639: ! 640: iResult = 0; ! 641: ! 642: if (!((GetDeviceCaps(hDC, RASTERCAPS)) & RC_PALETTE)) { ! 643: ! 644: iNumClr = GetSystemPaletteEntries(hDC, 0, 0, NULL); ! 645: if (prghPen == NULL) { ! 646: return (iNumClr); ! 647: } ! 648: ! 649: for (i = 0; i < iNumClr; i++) { ! 650: prghPen[i] = (PVOID) CreatePen(PS_SOLID, 0, PALETTEINDEX(i)); ! 651: iResult = i; ! 652: } ! 653: ! 654: return iResult; ! 655: } ! 656: ! 657: iNumClr = GetDeviceCaps(hDC, NUMCOLORS); ! 658: ! 659: if (prghPen == NULL) ! 660: return iNumClr; ! 661: ! 662: ulSize = sizeof(LOGPALETTE)+sizeof(PALETTEENTRY)*iNumClr; ! 663: ! 664: if ((plogPat = (PLOGPALETTE) GlobalAlloc(GMEM_FIXED | GMEM_ZEROINIT, ulSize)) == NULL) { ! 665: MessageBox(ghwndMain, "Failed in Memory Allocation for plogPat!", "Error", MB_OK); ! 666: goto ErrExit1; ! 667: } ! 668: ! 669: plogPat->palVersion = 0x300; ! 670: plogPat->palNumEntries = (WORD) iNumClr; ! 671: for (i = 0; i < iNumClr; i++) { ! 672: plogPat->palPalEntry[i].peBlue = blue; ! 673: plogPat->palPalEntry[i].peGreen = green; ! 674: plogPat->palPalEntry[i].peRed = red; ! 675: plogPat->palPalEntry[i].peFlags = PC_RESERVED; ! 676: ! 677: if (!(red += 32)) ! 678: if (!(green += 32)) ! 679: blue += 64; ! 680: } ! 681: ! 682: if ((hPal = CreatePalette(plogPat)) == (HPALETTE) NULL) { ! 683: MessageBox(ghwndMain, "Failed in creating palette!", "Error", MB_OK); ! 684: goto ErrExit2; ! 685: } ! 686: ! 687: hPalOld = SelectPalette(hDC, hPal, FALSE); ! 688: RealizePalette(hDC); ! 689: ! 690: for (i = 0; i < iNumClr; i++) { ! 691: prghPen[i] = (PVOID) CreatePen(PS_SOLID, 0, PALETTEINDEX(i)); ! 692: iResult = i; ! 693: } ! 694: ! 695: SelectPalette(hDC, hPalOld, 0); ! 696: DeleteObject(hPal); ! 697: ErrExit2: ! 698: GlobalFree(plogPat); ! 699: ErrExit1: ! 700: return iResult; ! 701: ! 702: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.