Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
/*
  Полная инициализация 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;
}