HANDLE CNCaptureView::CopyRectToHandle(const CRect& rect) { HANDLE hMem = NULL; if (m_pImage) { BOOL bRet = FALSE; CRect rcImage(0, 0, m_pImage->GetWidth(), m_pImage->GetHeight()); CRect rcRealSrc; rcRealSrc.IntersectRect(&rect, rcImage); if (!rcRealSrc.IsRectEmpty()) { CCanvas canvas; bRet = canvas.Create(NULL, rcRealSrc.Width(), rcRealSrc.Height()); if (bRet) { for (DrawObjectList::iterator iter = m_allObjects.begin(); iter != m_allObjects.end(); ++iter) { CDrawObject* pObj = *iter; if(pObj) { pObj->Draw(m_canvasImage, FALSE); } } BitBlt(canvas.GetMemoryDC(), 0, 0, rcRealSrc.Width(), rcRealSrc.Height(), m_canvasImage.GetMemoryDC(), rcRealSrc.left, rcRealSrc.top, SRCCOPY); hMem = canvas.CopyToHandle(); } } } return hMem; }
CCanvas *CCanvas::Create (int w, int h) { CCanvas *canvP; if ((canvP = new CCanvas)) canvP->Setup (w, h); return canvP; }
void FillRectangle(CRectangle & rect, char symForDraw, CCanvas & canvas) { for (int x = rect.GetPos().x; x < rect.GetPos().x + rect.GetSize().x; x++) { for (int y = rect.GetPos().y; y < rect.GetSize().y + rect.GetPos().y; y++) { canvas.SetPixel(y, x, symForDraw); } } }
void FillRectangle(CRectangle & rect, char code, CCanvas & canvas) { for (int x = rect.GetPosition().x; x < rect.GetPosition().x + rect.GetSize().x; ++x) { for (int y = rect.GetPosition().y; y < rect.GetPosition().y + rect.GetSize().y; ++y) { canvas.SetPixel(x, y, code); } } }
void FillRectangle(CRectangle const &rect, char code, CCanvas &canvas) { for (size_t y = rect.GetTop(); y != (size_t)rect.GetBottom(); ++y) { for (size_t x = rect.GetLeft(); x != (size_t)rect.GetRight(); ++x) { canvas.SetPixel(x, y, code); } } }
void CPaintEngineTool::DrawCursorInCanvas( CCanvas& inCanvas, CPoint& outHotSpot ) { inCanvas.BeginDrawing(); CRect box = inCanvas.GetRect(); CGraphicsState state; state.SetLineColor( GetPaintEngine()->GetLineColor() ); TCoordinate lineThickness = GetPaintEngine()->GetLineThickness(); if( lineThickness > (box.GetWidth() / 2) ) lineThickness = (box.GetWidth() / 2); state.SetLineThickness( lineThickness ); box.Offset( -0.5, -0.5 ); inCanvas.StrokeLineFromPointToPoint( CPoint(box.GetH(),box.GetVCenter()), CPoint(box.GetMaxH(),box.GetVCenter()), state ); inCanvas.StrokeLineFromPointToPoint( CPoint(box.GetHCenter(),box.GetV()), CPoint(box.GetHCenter(),box.GetMaxV()), state ); inCanvas.EndDrawing(); box = inCanvas.GetRect(); outHotSpot = CPoint( box.GetHCenter() -0.5, box.GetVCenter() -0.5 ); }
//-------------------------------------------------------------------------- // Create a canvas //-------------------------------------------------------------------------- CNV_HANDLE APIENTRY CNVCreate( CONST INT hdcCompatable, CONST INT nWidth, CONST INT nHeight, CONST INT nUseDX ) { // Allocate a new canvas CCanvas *cnv = new CCanvas(); // Create the canvas cnv->CreateBlank(HDC(hdcCompatable), nWidth, nHeight, nUseDX); // Push the canvas onto the list m_canvases.push_back(cnv); // Return the canvas' address return reinterpret_cast<CNV_HANDLE>(cnv); }
/* * Animate to the rpgcode screen (for RPGCode functions). */ void CAnimation::animate(const int x, const int y) { extern CCanvas *g_cnvRpgCode; extern void processEvent(); // Copy the screen. const CCanvas cnvScr = *g_cnvRpgCode; std::vector<CCanvas *>::iterator i = m_canvases.begin(), start = i; for (; i != m_canvases.end(); ++i) { if (!*i) { *i = new CCanvas(); (*i)->CreateBlank(NULL, m_data.pxWidth, m_data.pxHeight, TRUE); if (!(this->*renderFrame)(*i, i - start)) continue; } // Place on g_cnvRpgCode. (*i)->BltTransparent(g_cnvRpgCode, x, y, TRANSP_COLOR); // Refresh the screen. processEvent(); renderRpgCodeScreen(); // Play the frame's sound. playFrameSound(i - start); Sleep(DWORD(m_data.delay * MILLISECONDS)); // Replace g_cnvRpgCode with the original. cnvScr.BltPart( g_cnvRpgCode, x, y, x, y, m_data.pxWidth, m_data.pxHeight, SRCCOPY ); } }
void CCanvas::timeout_cb(void *userdata) { CCanvas *o = (CCanvas*)userdata; o->redraw(); Fl::repeat_timeout(o->m_cfg->SCREEN_TIMEOUT, timeout_cb, userdata); }
/* * Run the cursor map and return the chose option, * with zero as the first index. */ int CCursorMap::run() { extern int g_resX, g_resY; extern CDirectDraw *g_pDirectDraw; extern CCanvas *g_cnvCursor; extern void closeSystems(); CCanvas cnv; cnv.CreateBlank(NULL, g_resX, g_resY, TRUE); g_pDirectDraw->CopyScreenToCanvas(&cnv); int toRet = 0, pos = -1; MSG message; while (true) { const DWORD time = GetTickCount() + 50; while (GetTickCount() < time) { if (PeekMessage(&message, NULL, 0, 0, PM_REMOVE)) { if (message.message == WM_QUIT) { closeSystems(); exit(message.wParam); } else { TranslateMessage(&message); DispatchMessage(&message); } } } BYTE keys[256]; extern IDirectInputDevice8A *g_lpdiKeyboard; if (FAILED(g_lpdiKeyboard->GetDeviceState(256, keys))) { continue; } if ((keys[DIK_UP] & 0x80) || (keys[DIK_LEFT] & 0x80)) { if (toRet) --toRet; else toRet = m_points.size() - 1; } else if ((keys[DIK_DOWN] & 0x80) || (keys[DIK_RIGHT] & 0x80)) { if (toRet != (m_points.size() - 1)) ++toRet; else toRet = 0; } else if ((keys[DIK_RETURN] & 0x80) || (keys[DIK_SPACE] & 0x80)) { break; } if (toRet != pos) { g_pDirectDraw->DrawCanvas(&cnv, 0, 0); g_pDirectDraw->DrawCanvasTransparent(g_cnvCursor, m_points[toRet].x - 40, m_points[toRet].y - 10, RGB(255, 0, 0)); g_pDirectDraw->Refresh(); Sleep(80); } pos = toRet; } g_pDirectDraw->DrawCanvas(&cnv, 0, 0); g_pDirectDraw->Refresh(); return toRet; }
/* * Render a particular frame to a canvas (not gif specific). */ bool CAnimation::renderFileFrame(CCanvas *cnv, unsigned int frame) { extern STRING g_projectPath; cnv->ClearScreen(TRANSP_COLOR); // Wrap around. frame %= m_data.frameCount; if (m_data.filename.empty()) return false; const STRING file = resolve(g_projectPath + MISC_PATH + m_data.filename); FIMULTIBITMAP *mbmp = FreeImage_OpenMultiBitmap( FreeImage_GetFileType(getAsciiString(file).c_str(), 16), getAsciiString(file).c_str(), FALSE, TRUE, TRUE ); if (!mbmp) return false; CCanvas cnvImg; cnvImg.CreateBlank(NULL, m_data.pxWidth, m_data.pxHeight, TRUE); const int pageCount = FreeImage_GetPageCount(mbmp); if (frame < pageCount) { CONST HDC hdc = cnvImg.OpenDC(); FIBITMAP *bmp = FreeImage_LockPage(mbmp, frame); SetDIBitsToDevice( hdc, 0, 0, m_data.pxWidth, m_data.pxHeight, 0, 0, 0, FreeImage_GetHeight(bmp), FreeImage_GetBits(bmp), FreeImage_GetInfo(bmp), DIB_RGB_COLORS ); /* No need to stretch gif. StretchDIBits( hdc, 0, 0, m_data.pxWidth, m_data.pxHeight, 0, 0, FreeImage_GetWidth(bmp), FreeImage_GetHeight(bmp), FreeImage_GetBits(bmp), FreeImage_GetInfo(bmp), DIB_RGB_COLORS, SRCCOPY );*/ FreeImage_UnlockPage(mbmp, bmp, FALSE); cnvImg.CloseDC(hdc); } FreeImage_CloseMultiBitmap(mbmp, 0); // Apply ambient level. extern AMBIENT_LEVEL g_ambientLevel; if (g_ambientLevel.color) { CCanvas cnvAl; cnvAl.CreateBlank(NULL, m_data.pxWidth, m_data.pxHeight, TRUE); cnvAl.ClearScreen(g_ambientLevel.color); cnvAl.BltAdditivePart(cnvImg.GetDXSurface(), 0, 0, 0, 0, m_data.pxWidth, m_data.pxHeight, g_ambientLevel.sgn, -1, m_data.transpColors[frame]); } cnvImg.BltTransparent(cnv, 0, 0, m_data.transpColors[frame]); return true; }
/* * Render all frames of a file (not gif specific). */ bool CAnimation::renderFileFrame(CCanvas *, unsigned int) { extern STRING g_projectPath; if (m_data.filename.empty()) return false; const STRING file = resolve(g_projectPath + MISC_PATH + m_data.filename); FIMULTIBITMAP *mbmp = FreeImage_OpenMultiBitmap( FreeImage_GetFileType(getAsciiString(file).c_str(), 16), getAsciiString(file).c_str(), FALSE, TRUE, TRUE ); if (!mbmp) return false; // Create ambient level canvas. extern AMBIENT_LEVEL g_ambientLevel; CCanvas cnvAl; if (g_ambientLevel.color) { cnvAl.CreateBlank(NULL, m_data.pxWidth, m_data.pxHeight, TRUE); cnvAl.ClearScreen(g_ambientLevel.color); } // Intermediate canvas. CCanvas cnv; cnv.CreateBlank(NULL, m_data.pxWidth, m_data.pxHeight, TRUE); freeCanvases(); m_canvases.clear(); for (int i = 0; i != m_data.frameCount; ++i) { CONST HDC hdc = cnv.OpenDC(); FIBITMAP *bmp = FreeImage_LockPage(mbmp, i); SetDIBitsToDevice( hdc, 0, 0, m_data.pxWidth, m_data.pxHeight, 0, 0, 0, FreeImage_GetHeight(bmp), FreeImage_GetBits(bmp), FreeImage_GetInfo(bmp), DIB_RGB_COLORS ); /* No need to stretch gif. StretchDIBits( hdc, 0, 0, 0, 0, FreeImage_GetWidth(bmp), FreeImage_GetHeight(bmp), FreeImage_GetBits(bmp), FreeImage_GetInfo(bmp), DIB_RGB_COLORS, SRCCOPY );*/ FreeImage_UnlockPage(mbmp, bmp, FALSE); cnv.CloseDC(hdc); // Apply ambient level. if (g_ambientLevel.color) { cnvAl.BltAdditivePart(cnv.GetDXSurface(), 0, 0, 0, 0, m_data.pxWidth, m_data.pxHeight, g_ambientLevel.sgn, -1, m_data.transpColors[i]); } // Blt to the member canvas. CCanvas *pCnv = new CCanvas(); pCnv->CreateBlank(NULL, m_data.pxWidth, m_data.pxHeight, TRUE); pCnv->ClearScreen(TRANSP_COLOR); cnv.BltTransparent(pCnv, 0, 0, m_data.transpColors[i]); m_canvases.push_back(pCnv); } FreeImage_CloseMultiBitmap(mbmp, 0); return true; }
/* * Render a particular frame to a canvas. */ bool CAnimation::renderAnmFrame(CCanvas *cnv, unsigned int frame) { extern STRING g_projectPath; cnv->ClearScreen(TRANSP_COLOR); // Wrap around. frame %= m_data.frameCount; const STRING frameFile = m_data.frameFiles[frame]; if (frameFile.empty()) return false; const STRING ext = parser::uppercase(getExtension(frameFile)); if (ext == _T("TBM") || ext.substr(0, 3) == _T("TST") || ext == _T("GPH")) { TILE_BITMAP tbm; if (ext == _T("TBM")) { if (!tbm.open(g_projectPath + BMP_PATH + frameFile)) return false; } else { // Set up a 1x1 tile bitmap. tbm.resize(1, 1); tbm.tiles[0][0] = frameFile; } // Draw the tilebitmap and mask to new canvases. const int w = tbm.width * 32, h = tbm.height * 32; CCanvas cnvTbm, cnvMaskTbm; cnvTbm.CreateBlank(NULL, w, h, TRUE); cnvMaskTbm.CreateBlank(NULL, w, h, TRUE); if (tbm.draw(&cnvTbm, &cnvMaskTbm, 0, 0)) { // Stretch the canvas and mask to an intermediate canvas. CCanvas cnvInt; cnvInt.CreateBlank(NULL, w, h, TRUE); cnvInt.ClearScreen(m_data.transpColors[frame]); cnvTbm.BltStretchMask( &cnvMaskTbm, &cnvInt, 0, 0, 0, 0, w, h, m_data.pxWidth, m_data.pxHeight ); // Blt to the target canvas. cnvInt.BltTransparent(cnv, 0, 0, m_data.transpColors[frame]); } } else { // Image file. const STRING strFile = resolve(g_projectPath + BMP_PATH + frameFile); FIBITMAP *bmp = FreeImage_Load( FreeImage_GetFileType(getAsciiString(strFile).c_str(), 16), getAsciiString(strFile).c_str() ); CCanvas cnvImg; cnvImg.CreateBlank(NULL, m_data.pxWidth, m_data.pxHeight, TRUE); CONST HDC hdc = cnvImg.OpenDC(); StretchDIBits( hdc, 0, 0, m_data.pxWidth, m_data.pxHeight, 0, 0, FreeImage_GetWidth(bmp), FreeImage_GetHeight(bmp), FreeImage_GetBits(bmp), FreeImage_GetInfo(bmp), DIB_RGB_COLORS, SRCCOPY ); FreeImage_Unload(bmp); cnvImg.CloseDC(hdc); // Apply ambient level. extern AMBIENT_LEVEL g_ambientLevel; if (g_ambientLevel.color) { CCanvas cnvAl; cnvAl.CreateBlank(NULL, m_data.pxWidth, m_data.pxHeight, TRUE); cnvAl.ClearScreen(g_ambientLevel.color); cnvAl.BltAdditivePart(cnvImg.GetDXSurface(), 0, 0, 0, 0, m_data.pxWidth, m_data.pxHeight, g_ambientLevel.sgn, -1, m_data.transpColors[frame]); } cnvImg.BltTransparent(cnv, 0, 0, m_data.transpColors[frame]); } // if (ext == TBM) return true; }