Magic_Game/core/Node/Canvas.cpp

245 lines
4.2 KiB
C++

#include "..\e2dnode.h"
e2d::Canvas::Canvas(float width, float height)
: _renderer(nullptr)
, _renderTarget(nullptr)
, _fillBrush(nullptr)
, _lineBrush(nullptr)
, _strokeStyle(nullptr)
, _strokeWidth(1.0f)
, _stroke(Stroke::Miter)
{
_renderer = Game::instance()->renderer();
_renderTarget = _renderer->renderTarget();
_renderTarget->AddRef();
ThrowIfFailed(
_renderTarget->CreateSolidColorBrush(
D2D1::ColorF(D2D1::ColorF::White),
&_fillBrush
)
);
ThrowIfFailed(
_renderTarget->CreateSolidColorBrush(
D2D1::ColorF(D2D1::ColorF::White),
&_lineBrush
)
);
this->clipEnabled(true);
this->width(width);
this->height(height);
this->strokeStyle(_stroke);
}
e2d::Canvas::~Canvas()
{
SafeRelease(_lineBrush);
SafeRelease(_fillBrush);
SafeRelease(_renderTarget);
}
e2d::Canvas& e2d::Canvas::lineColor(const Color & color)
{
_lineBrush->SetColor(D2D_COLOR_F(color));
return *this;
}
e2d::Canvas& e2d::Canvas::fillColor(const Color & color)
{
_fillBrush->SetColor(D2D_COLOR_F(color));
return *this;
}
e2d::Canvas& e2d::Canvas::strokeWidth(float width)
{
_strokeWidth = std::max(width, 0.f);
return *this;
}
e2d::Canvas& e2d::Canvas::strokeStyle(Stroke strokeStyle)
{
switch (strokeStyle)
{
case e2d::Stroke::Miter:
_strokeStyle = _renderer->miterStrokeStyle();
break;
case e2d::Stroke::Bevel:
_strokeStyle = _renderer->bevelStrokeStyle();
break;
case e2d::Stroke::Round:
_strokeStyle = _renderer->roundStrokeStyle();
break;
}
return *this;
}
e2d::Color e2d::Canvas::lineColor() const
{
return _lineBrush->GetColor();
}
e2d::Color e2d::Canvas::fillColor() const
{
return _fillBrush->GetColor();
}
float e2d::Canvas::strokeWidth() const
{
return _strokeWidth;
}
e2d::Stroke e2d::Canvas::strokeStyle() const
{
return _stroke;
}
e2d::Canvas& e2d::Canvas::drawLine(const Point & begin, const Point & end)
{
_renderTarget->DrawLine(
D2D1::Point2F(begin.x, begin.y),
D2D1::Point2F(end.x, end.y),
_lineBrush,
_strokeWidth,
_strokeStyle
);
return *this;
}
e2d::Canvas& e2d::Canvas::drawCircle(const Point & center, float radius)
{
_renderTarget->DrawEllipse(
D2D1::Ellipse(
D2D1::Point2F(
center.x,
center.y
),
radius,
radius
),
_lineBrush,
_strokeWidth,
_strokeStyle
);
return *this;
}
e2d::Canvas& e2d::Canvas::drawEllipse(const Point & center, float radiusX, float radiusY)
{
_renderTarget->DrawEllipse(
D2D1::Ellipse(
D2D1::Point2F(
center.x,
center.y
),
radiusX,
radiusY
),
_lineBrush,
_strokeWidth,
_strokeStyle
);
return *this;
}
e2d::Canvas& e2d::Canvas::drawRect(const Rect & rect)
{
_renderTarget->DrawRectangle(
D2D1::RectF(
rect.origin.x,
rect.origin.y,
rect.origin.x + rect.size.width,
rect.origin.y + rect.size.height
),
_lineBrush,
_strokeWidth,
_strokeStyle
);
return *this;
}
e2d::Canvas& e2d::Canvas::drawRoundedRect(const Rect & rect, float radiusX, float radiusY)
{
_renderTarget->DrawRoundedRectangle(
D2D1::RoundedRect(
D2D1::RectF(
rect.origin.x,
rect.origin.y,
rect.origin.x + rect.size.width,
rect.origin.y + rect.size.height
),
radiusX,
radiusY
),
_lineBrush,
_strokeWidth,
_strokeStyle
);
return *this;
}
e2d::Canvas& e2d::Canvas::fillCircle(const Point & center, float radius)
{
_renderTarget->FillEllipse(
D2D1::Ellipse(
D2D1::Point2F(
center.x,
center.y
),
radius,
radius
),
_fillBrush
);
return *this;
}
e2d::Canvas& e2d::Canvas::fillEllipse(const Point & center, float radiusX, float radiusY)
{
_renderTarget->FillEllipse(
D2D1::Ellipse(
D2D1::Point2F(
center.x,
center.y
),
radiusX,
radiusY
),
_fillBrush
);
return *this;
}
e2d::Canvas& e2d::Canvas::fillRect(const Rect & rect)
{
_renderTarget->FillRectangle(
D2D1::RectF(
rect.origin.x,
rect.origin.y,
rect.origin.x + rect.size.width,
rect.origin.y + rect.size.height
),
_fillBrush
);
return *this;
}
e2d::Canvas& e2d::Canvas::fillRoundedRect(const Rect & rect, float radiusX, float radiusY)
{
_renderTarget->FillRoundedRectangle(
D2D1::RoundedRect(
D2D1::RectF(
rect.origin.x,
rect.origin.y,
rect.origin.x + rect.size.width,
rect.origin.y + rect.size.height
),
radiusX,
radiusY
),
_fillBrush
);
return *this;
}