BOOL vncDesktop::SetPixShifts() { // Sort out the colour shifts, etc. DWORD redMask=0, blueMask=0, greenMask = 0; switch (m_bminfo.bmi.bmiHeader.biBitCount) { case 16: // Standard 16-bit display if (m_bminfo.bmi.bmiHeader.biCompression == BI_RGB) { // each word single pixel 5-5-5 redMask = 0x7c00; greenMask = 0x03e0; blueMask = 0x001f; } else { if (m_bminfo.bmi.bmiHeader.biCompression == BI_BITFIELDS) { redMask = *(DWORD *) &m_bminfo.bmi.bmiColors[0]; greenMask = *(DWORD *) &m_bminfo.bmi.bmiColors[1]; blueMask = *(DWORD *) &m_bminfo.bmi.bmiColors[2]; } } break; case 32: // Standard 24/32 bit displays if (m_bminfo.bmi.bmiHeader.biCompression == BI_RGB) { redMask = 0xff0000; greenMask = 0xff00; blueMask = 0x00ff; } else { if (m_bminfo.bmi.bmiHeader.biCompression == BI_BITFIELDS) { redMask = *(DWORD *) &m_bminfo.bmi.bmiColors[0]; greenMask = *(DWORD *) &m_bminfo.bmi.bmiColors[1]; blueMask = *(DWORD *) &m_bminfo.bmi.bmiColors[2]; } } break; default: // Other pixel formats are only valid if they're palette-based if (m_bminfo.truecolour) { //vnclog.Print(LL_INTERR, "unsupported truecolour pixel format for setpixshifts\n"); return FALSE; } return TRUE; } // Convert the data we just retrieved MaskToMaxAndShift(redMask, m_scrinfo.format.redMax, m_scrinfo.format.redShift); MaskToMaxAndShift(greenMask, m_scrinfo.format.greenMax, m_scrinfo.format.greenShift); MaskToMaxAndShift(blueMask, m_scrinfo.format.blueMax, m_scrinfo.format.blueShift); return TRUE; }
/* Полная инициализация Rfb::INTERNAL_DATA. (на основе UltaVNC). IN memoryDc - DC для работы. Return - Rfb::INTERNAL_DATA, или NULL в случаи ошибки. */ static inline Rfb::INTERNAL_DATA *InitINTERNAL_DATA(HDC memoryDc, POINT *pSize, HANDLE hDIBMap, DWORD mapOffset) { Rfb::INTERNAL_DATA *pid = (Rfb::INTERNAL_DATA *)Mem::alloc(sizeof(Rfb::INTERNAL_DATA)); if(pid == NULL)return NULL; bool ok = false; pid->memoryDc = memoryDc; pid->wWidth = (WORD)pSize->x; pid->wHeight = (WORD)pSize->y; //pid-> dwCurrentEncoder = Rfb:: ENCODER_Raw; //pid-> dwCurrentEncoderSwapped = SWAP_DWORD (Rfb:: ENCODER_Raw); if(hDIBMap != NULL) { BITMAPINFO *pbmi; if((pid->hBitmap = Gdi::_createDibSection(pid->memoryDc, pid->wWidth, pid->wHeight, &pbmi, (void **)&pid->pBmpDIB, hDIBMap, mapOffset)) != NULL) { pid->bLocalPixelSize = pbmi->bmiHeader.biBitCount / 8; pid->dwWidthInBytes = pid->wWidth * pid->bLocalPixelSize; pid->dwWidthInBytes = ALIGN_UP(pid->dwWidthInBytes, sizeof(DWORD)); //The scan lines must be aligned on a DWORD except for RLE compressed bitmaps //Fill The figures in about piksile. pid->pfLocalPixel.bBitsPerPixel = pbmi->bmiHeader.biBitCount; pid->pfLocalPixel.bDepth = pbmi->bmiHeader.biBitCount; pid->pfLocalPixel.bBigEndian = FALSE; pid->pfLocalPixel.bTrueColour = pbmi->bmiHeader.biBitCount == 8 ? FALSE : TRUE; //if (IsValidPIXEL_FORMAT (& pid-> pfLocalPixel, true)) { if(pid->pfLocalPixel.bTrueColour == TRUE) { DWORD dwRedMask, dwBlueMask, dwGreenMask; if(pbmi->bmiHeader.biBitCount == 16) {dwRedMask = 0x7C00; dwGreenMask = 0x03E0; dwBlueMask = 0x001F;} else if(pbmi->bmiHeader.biBitCount == 32){dwRedMask = 0xFF0000; dwGreenMask = 0xFF00; dwBlueMask = 0x00FF;} MaskToMaxAndShift(dwRedMask, &pid->pfLocalPixel.wRedMax, &pid->pfLocalPixel.bRedShift); MaskToMaxAndShift(dwGreenMask, &pid->pfLocalPixel.wGreenMax, &pid->pfLocalPixel.bGreenShift); MaskToMaxAndShift(dwBlueMask, &pid->pfLocalPixel.wBlueMax, &pid->pfLocalPixel.bBlueShift); } //Setting data klietskom pixel by default. Mem::_copy(&pid->pfRemotePixel, &pid->pfLocalPixel, sizeof(Rfb::PIXEL_FORMAT)); pid->pfRemotePixel.bTrueColour = TRUE; pid->bRemotePixelSize = pid->bLocalPixelSize; //Allocate memory for buffer changes. DWORD dwBmpSize = pid->dwWidthInBytes * pid->wHeight; if((pid->pBmpDIBOld = (LPBYTE)Mem::alloc(dwBmpSize)) != NULL) { if((pid->originalBitmap = (HBITMAP)CWA(gdi32, SelectObject)(pid->memoryDc, pid->hBitmap)) != NULL)ok = true; //Mem:: _set (pid-> pBmpDIBOld, 0xFF, dwBmpSize); } } Mem::free(pbmi); if(!ok)CWA(gdi32, DeleteObject)(pid->hBitmap); } } if(ok == false) { Mem::free(pid); pid = NULL; } return pid; }