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;
}
예제 #2
0
파일: canvas.cpp 프로젝트: paud/d2x-xl
CCanvas *CCanvas::Create (int w, int h)
{
	CCanvas *canvP;

if ((canvP = new CCanvas)) 
	canvP->Setup (w, h);
return canvP;
}
예제 #3
0
파일: main.cpp 프로젝트: Lokdemok/OOP
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);
		}
	}
}
예제 #4
0
파일: main.cpp 프로젝트: knyazsergei/OOP
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);
		}
	}
}
예제 #5
0
파일: Canvas.cpp 프로젝트: licar/lab3
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);
		}
	}
}
예제 #6
0
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 );
}
예제 #7
0
//--------------------------------------------------------------------------
// 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);

}
예제 #8
0
/*
 * 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
		);
	}
}
예제 #9
0
파일: canvas.CPP 프로젝트: auralius/Azolla
void CCanvas::timeout_cb(void *userdata)
{
    CCanvas *o = (CCanvas*)userdata;
    o->redraw();
    Fl::repeat_timeout(o->m_cfg->SCREEN_TIMEOUT, timeout_cb, userdata);
}
예제 #10
0
/*
 * 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;
}
예제 #11
0
/*
 * 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;
}
예제 #12
0
/*
 * 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;
}
예제 #13
0
/*
 * 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;
}