⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 graphics.cpp

📁 MONA是为数不多的C++语言编写的一个很小的操作系统
💻 CPP
字号:
// This file is in the public domain.// There are no restrictions on any sort of usage of this file.#ifdef MONA#include <monapi.h>#endif#include <gui/System/Drawing/Graphics.h>#include <gui/System/Drawing/Font.h>#include <gui/System/Math.h>using namespace System;namespace System { namespace Drawing{	Graphics::Graphics(_P<Bitmap> image)	{		this->image = image;	}		void Graphics::SetPixel(int x, int y, Color c)	{		int w = this->clientRectangle.Width, h = this->clientRectangle.Height;		if ((w != 0 || h != 0) && (x >= w || y >= h)) return;		this->image->SetPixel(x + this->clientRectangle.X, y + this->clientRectangle.Y, c);	}		_P<Graphics> Graphics::FromImage(_P<Bitmap> image)	{		return new Graphics(image);	}		Graphics::~Graphics()	{		this->Dispose();	}		void Graphics::Dispose()	{		this->image = NULL;	}		void Graphics::DrawLine(Color c, int x1, int y1, int x2, int y2)	{		int dx = Math::Abs(x1 - x2), dy = Math::Abs(y1 - y2);		if (dx == 0 && dy == 0)		{			this->SetPixel(x1, y1, c);		}		else if (dx >= dy)		{			if (x1 > x2)			{				int tx = x1; x1 = x2; x2 = tx;				int ty = y1; y1 = y2; y2 = ty;			}			for (int x = x1; x <= x2; x++)			{				this->SetPixel(x, ((2 * y1 + 2 * (y2 - y1) * (x - x1) / (x2 - x1)) + 1) / 2, c);			}		}		else		{			if (y1 > y2)			{				int tx = x1; x1 = x2; x2 = tx;				int ty = y1; y1 = y2; y2 = ty;			}			for (int y = y1; y <= y2; y++)			{				this->SetPixel((2 * x1 + 2 * (x2 - x1) * (y - y1) / (y2 - y1) + 1) / 2, y, c);			}		}	}		void Graphics::DrawRectangle(Color c, int x, int y, int width, int height)	{		if (width  < 0) { x += width ; width  = -width ; }		if (height < 0) { y += height; height = -height; }		int xw = x + width - 1, yh = y + height - 1;		for (int xx = x; xx <= xw; xx++)		{			this->SetPixel(xx, y , c);			this->SetPixel(xx, yh, c);		}		for (int yy = y + 1; yy <= yh - 1; yy++)		{			this->SetPixel(x , yy, c);			this->SetPixel(xw, yy, c);		}	}		void Graphics::FillRectangle(Color c, int x, int y, int width, int height)	{		if (width  < 0) { x += width ; width  = -width ; }		if (height < 0) { y += height; height = -height; }		int xw = x + width, yh = y + height;		for (int yy = y; yy < yh; yy++)		{			for (int xx = x; xx < xw; xx++)			{				this->SetPixel(xx, yy, c);			}		}	}		/// buggy	void Graphics::DrawEllipse(Color c, int x, int y, int width, int height)	{		if (width  < 0) { x += width ; width  = -width ; }		if (height < 0) { y += height; height = -height; }		int xw = x + width, yh = y + height;		int r1 = (width - 1) * (height - 1) * (width - 1) * (height - 1);		int r2 = width * height * width * height;		for (int yy = y; yy < yh; yy++)		{			for (int xx = x; xx < xw; xx++)			{				int _x = ((xx - x) * 2 + 1 - width) * height, _y = ((yy - y) * 2 + 1 - height) * width;				int d = _x * _x + _y * _y;				if (r1 < d && d <= r2) this->SetPixel(xx, yy, c);			}		}	}		void Graphics::FillEllipse(Color c, int x, int y, int width, int height)	{		if (width  < 0) { x += width ; width  = -width ; }		if (height < 0) { y += height; height = -height; }		int xw = x + width, yh = y + height;		int r2 = width * height * width * height;		for (int yy = y; yy < yh; yy++)		{			for (int xx = x; xx < xw; xx++)			{				int _x = ((xx - x) * 2 + 1 - width) * height, _y = ((yy - y) * 2 + 1 - height) * width;				int d = _x * _x + _y * _y;				if (d <= r2) this->SetPixel(xx, yy, c);			}		}	}		void Graphics::DrawString(String text, _P<Font> font, Color c, int x, int y)	{		font->Draw(this, text, c, x, y);	}		Size Graphics::MeasureString(String text, _P<Font> font)	{		return font->GetSize(text);	}		void Graphics::DrawImage(_P<Bitmap> image, int x, int y)	{		this->DrawImage(image, x, y, Rectangle(0, 0, image->get_Width(), image->get_Height()));	}		void Graphics::DrawImage(_P<Bitmap> image, int x, int y, Rectangle r)	{		int dw = this->clientRectangle.Width, dh = this->clientRectangle.Height;		int x1 = x, y1 = y, x2 = x + r.Width, y2 = y + r.Height;		if (x1 < 0) x1 = 0;		if (y1 < 0) y1 = 0;		if (x2 > dw) x2 = dw;		if (y2 > dh) y2 = dh;		x1 += r.X - x;		y1 += r.Y - y;		x2 += r.X - x;		y2 += r.Y - y;		if (x1 < 0) x1 = 0;		if (y1 < 0) y1 = 0;		if (x2 > image->get_Width ()) x2 = image->get_Width ();		if (y2 > image->get_Height()) y2 = image->get_Height();		x1 -= r.X;		y1 -= r.Y;		x2 -= r.X;		y2 -= r.Y;		for (int yy = y1, y3 = y + y1, y4 = r.Y + y1; yy < y2; yy++, y3++, y4++)		{			for (int xx = x1, x3 = x + x1, x4 = r.X + x1; xx < x2; xx++, x3++, x4++)			{				this->SetPixel(x3, y3, image->GetPixel(x4, y4));			}		}	}}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -