// Opens the input-device. Parameters (e.g. the device-name) can be given in 'param'. // Returns true if the input-device was opened successfully. ATMO_BOOL CAtmoGdiDisplayCaptureInput::Open() { CAtmoConfig *pAtmoConfig = m_pAtmoDynData->getAtmoConfig(); CAtmoDisplays *pAtmoDisplays = m_pAtmoDynData->getAtmoDisplays(); m_rowsPerFrame = pAtmoConfig->getLiveView_RowsPerFrame(); if(m_rowsPerFrame < 1) m_rowsPerFrame = 1; if(m_rowsPerFrame >= CAP_HEIGHT) m_rowsPerFrame = CAP_HEIGHT - 1; m_CurrentFrame = 0; // halbbild counter // clear temp hsv image memset(&HSV_Img, 0, IMAGE_SIZE * sizeof(tHSVColor) ); #ifndef UseGdiDesktopGetPixel // setup handles and stuff for screen copy ... m_hdcScreen = GetDC(NULL); // used as device context for temporary screenshot bitmap m_hTempBitmapDC = CreateCompatibleDC(m_hdcScreen); #endif int displayNr = pAtmoConfig->getLiveView_DisplayNr(); if(displayNr >= pAtmoDisplays->getCount()) displayNr = 0; // drop back to display 0 ;-) TAtmoDisplayInfo dislayInfo = pAtmoDisplays->getDisplayInfo(displayNr); // here TODO insert Screen! - in the config we have the display number to use // get resolution of this display and its position in the world of the current // windows desktop device context....!!! todo! m_ScreenSourceRect.left = dislayInfo.horz_ScreenPos + pAtmoConfig->getLiveView_HOverscanBorder(); m_ScreenSourceRect.top = dislayInfo.vert_ScreenPos + pAtmoConfig->getLiveView_VOverscanBorder(); m_ScreenSourceRect.right = m_ScreenSourceRect.left + dislayInfo.horz_res - (2 * pAtmoConfig->getLiveView_HOverscanBorder()); m_ScreenSourceRect.bottom = m_ScreenSourceRect.top + dislayInfo.vert_res - (2 * pAtmoConfig->getLiveView_VOverscanBorder()); // calculate lShift and tShift? /* for what? ok ... lets do some basics... our temp picutre has 64 columns? our source (my desktop) is 1600 columns wide? ... so i Have to grab every 64th Pixel? a simple calculation would result into destination column 0: --> source column 0 destincation column 63: --> source column 1575 ... so we will lose 25 pixel to the right? so m_lShift is the value we have to move the "Grab Raster to right" so that destination column 0: --> source column 12 destincation column 63: --> source column 1587 ... so we will lose 12 pixel to the right and 12 to the left.. a nice small ignored Border around... that same happens to the row position... */ // precalculate Pixel Coordinates for Capture to save some cpu time? int capture_area_width = m_ScreenSourceRect.right - m_ScreenSourceRect.left; int capture_area_height = m_ScreenSourceRect.bottom - m_ScreenSourceRect.top; for(int y=1;y<=CAP_HEIGHT;y++) { m_iSrcRows[y-1] = ((y * capture_area_height) / (CAP_HEIGHT+1) ); } for(int x=1;x<=CAP_WIDTH;x++) { m_iSrcCols[x-1] = ((x * capture_area_width) / (CAP_WIDTH+1) ); } // 25.09.2007 Igor: + m_ScreenSourceRect.left +m_ScreenSourceRect.top --> ist falsch // weil die Koordinaten in m_iSrcCols und m_iSrcRows - beziehen sich ja schon auf die mittels m_ScreenSourceRect erzeugte // Kopie des Desktops Device Contexts ... thanks to MacGyver for debugging. #ifndef UseGdiGetPixel // should be enough memory for one row of pixels! in each Color Depth? m_PixelBuffer = (unsigned char *)malloc((capture_area_width+1) * 4); #endif // run this thread this->Run(); return true; }