aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/cru/osx/graphics/quartz/Convert.hpp6
-rw-r--r--include/cru/osx/graphics/quartz/Painter.hpp15
-rw-r--r--src/osx/graphics/quartz/Convert.cpp11
-rw-r--r--src/osx/graphics/quartz/Painter.cpp45
-rw-r--r--src/osx/gui/Window.mm14
5 files changed, 84 insertions, 7 deletions
diff --git a/include/cru/osx/graphics/quartz/Convert.hpp b/include/cru/osx/graphics/quartz/Convert.hpp
index f85fc20e..a8cc270e 100644
--- a/include/cru/osx/graphics/quartz/Convert.hpp
+++ b/include/cru/osx/graphics/quartz/Convert.hpp
@@ -12,6 +12,12 @@ String Convert(CFStringRef string);
CGAffineTransform Convert(const Matrix& matrix);
Matrix Convert(const CGAffineTransform& matrix);
+CGPoint Convert(const Point& point);
+Point Convert(const CGPoint& point);
+
+CGSize Convert(const Size& size);
+Size Convert(const CGSize& size);
+
CGRect Convert(const Rect& rect);
Rect Convert(const CGRect& rect);
diff --git a/include/cru/osx/graphics/quartz/Painter.hpp b/include/cru/osx/graphics/quartz/Painter.hpp
index 9a3df187..715cc364 100644
--- a/include/cru/osx/graphics/quartz/Painter.hpp
+++ b/include/cru/osx/graphics/quartz/Painter.hpp
@@ -11,8 +11,12 @@ class QuartzCGContextPainter : public OsxQuartzResource,
public virtual IPainter {
public:
explicit QuartzCGContextPainter(IGraphicsFactory* graphics_factory,
- CGContextRef cg_context)
- : OsxQuartzResource(graphics_factory), cg_context_(cg_context) {}
+ CGContextRef cg_context, bool auto_release,
+ const Size& size)
+ : OsxQuartzResource(graphics_factory),
+ cg_context_(cg_context),
+ auto_release_(auto_release),
+ size_(size) {}
CRU_DELETE_COPY(QuartzCGContextPainter)
CRU_DELETE_MOVE(QuartzCGContextPainter)
@@ -44,6 +48,13 @@ class QuartzCGContextPainter : public OsxQuartzResource,
void EndDraw() override;
private:
+ void Validate();
+
+ private:
CGContextRef cg_context_;
+
+ bool auto_release_;
+
+ Size size_;
};
} // namespace cru::platform::graphics::osx::quartz
diff --git a/src/osx/graphics/quartz/Convert.cpp b/src/osx/graphics/quartz/Convert.cpp
index 9dcb29db..a6892da9 100644
--- a/src/osx/graphics/quartz/Convert.cpp
+++ b/src/osx/graphics/quartz/Convert.cpp
@@ -13,15 +13,20 @@ String Convert(CFStringRef string) {
kCFStringEncodingUTF16, 0);
auto l = CFDataGetLength(d);
- auto s = String::FromUtf16(
- reinterpret_cast<const std::uint16_t*>(CFDataGetBytePtr(d)),
- CFDataGetLength(d) / 2);
+ auto s = String(reinterpret_cast<const std::uint16_t*>(CFDataGetBytePtr(d)),
+ CFDataGetLength(d) / 2);
CFRelease(d);
return s;
}
+CGPoint Convert(const Point& point) { return CGPoint{point.x, point.y}; }
+Point Convert(const CGPoint& point) { return Point(point.x, point.y); }
+
+CGSize Convert(const Size& size) { return CGSize{size.width, size.height}; }
+Size Convert(const CGSize& size) { return Size(size.width, size.height); }
+
CGAffineTransform Convert(const Matrix& matrix) {
return CGAffineTransformMake(matrix.m11, matrix.m12, matrix.m21, matrix.m22,
matrix.m31, matrix.m32);
diff --git a/src/osx/graphics/quartz/Painter.cpp b/src/osx/graphics/quartz/Painter.cpp
index be29310c..6effe9f9 100644
--- a/src/osx/graphics/quartz/Painter.cpp
+++ b/src/osx/graphics/quartz/Painter.cpp
@@ -4,6 +4,7 @@
#include "cru/osx/graphics/quartz/Convert.hpp"
#include "cru/osx/graphics/quartz/Geometry.hpp"
#include "cru/platform/Check.hpp"
+#include "cru/platform/Exception.hpp"
namespace cru::platform::graphics::osx::quartz {
Matrix QuartzCGContextPainter::GetTransform() {
@@ -18,11 +19,21 @@ void QuartzCGContextPainter::SetTransform(const Matrix& matrix) {
}
void QuartzCGContextPainter::Clear(const Color& color) {
- // TODO:
+ Validate();
+
+ CGColorRef c =
+ CGColorCreateGenericRGB(color.GetFloatRed(), color.GetFloatGreen(),
+ color.GetFloatBlue(), color.GetFloatAlpha());
+ CGContextSetFillColorWithColor(cg_context_, c);
+ CGColorRelease(c);
+
+ CGContextFillRect(cg_context_, Convert(Rect{Point{}, size_}));
}
void QuartzCGContextPainter::DrawLine(const Point& start, const Point& end,
IBrush* brush, float width) {
+ Validate();
+
CGContextBeginPath(cg_context_);
CGContextMoveToPoint(cg_context_, start.x, start.y);
CGContextAddLineToPoint(cg_context_, end.x, end.y);
@@ -35,6 +46,8 @@ void QuartzCGContextPainter::DrawLine(const Point& start, const Point& end,
void QuartzCGContextPainter::StrokeRectangle(const Rect& rectangle,
IBrush* brush, float width) {
+ Validate();
+
QuartzBrush* b = CheckPlatform<QuartzBrush>(brush, GetPlatformId());
b->Select(cg_context_);
CGContextStrokeRectWithWidth(cg_context_, Convert(rectangle), width);
@@ -42,6 +55,8 @@ void QuartzCGContextPainter::StrokeRectangle(const Rect& rectangle,
void QuartzCGContextPainter::FillRectangle(const Rect& rectangle,
IBrush* brush) {
+ Validate();
+
QuartzBrush* b = CheckPlatform<QuartzBrush>(brush, GetPlatformId());
b->Select(cg_context_);
CGContextFillRect(cg_context_, Convert(rectangle));
@@ -49,6 +64,8 @@ void QuartzCGContextPainter::FillRectangle(const Rect& rectangle,
void QuartzCGContextPainter::StrokeGeometry(IGeometry* geometry, IBrush* brush,
float width) {
+ Validate();
+
QuartzGeometry* g = CheckPlatform<QuartzGeometry>(geometry, GetPlatformId());
QuartzBrush* b = CheckPlatform<QuartzBrush>(brush, GetPlatformId());
@@ -60,6 +77,8 @@ void QuartzCGContextPainter::StrokeGeometry(IGeometry* geometry, IBrush* brush,
}
void QuartzCGContextPainter::FillGeometry(IGeometry* geometry, IBrush* brush) {
+ Validate();
+
QuartzGeometry* g = CheckPlatform<QuartzGeometry>(geometry, GetPlatformId());
QuartzBrush* b = CheckPlatform<QuartzBrush>(brush, GetPlatformId());
@@ -68,4 +87,28 @@ void QuartzCGContextPainter::FillGeometry(IGeometry* geometry, IBrush* brush) {
CGContextAddPath(cg_context_, g->GetCGPath());
CGContextFillPath(cg_context_);
}
+
+void QuartzCGContextPainter::DrawText(const Point& offset,
+ ITextLayout* text_layout, IBrush* brush) {
+ // TODO: Implement this.
+}
+
+void QuartzCGContextPainter::PushLayer(const Rect& bounds) {
+ // TODO: Implement this.
+}
+
+void QuartzCGContextPainter::PopLayer() {
+ // TODO: Implement this.
+}
+
+void QuartzCGContextPainter::EndDraw() {
+ CGContextRelease(cg_context_);
+ CGContextFlush(cg_context_);
+ cg_context_ = nullptr;
+}
+
+void QuartzCGContextPainter::Validate() {
+ if (cg_context_ == nullptr)
+ throw ReuseException(u"QuartzCGContextPainter has already be released.");
+}
} // namespace cru::platform::graphics::osx::quartz
diff --git a/src/osx/gui/Window.mm b/src/osx/gui/Window.mm
index 52cc3934..239e175a 100644
--- a/src/osx/gui/Window.mm
+++ b/src/osx/gui/Window.mm
@@ -1,9 +1,11 @@
#include "cru/osx/gui/Window.hpp"
+#include "cru/osx/graphics/quartz/Painter.hpp"
#include "cru/osx/gui/UiApplication.hpp"
-#include "cru/platform/gui/Base.hpp"
+#include <AppKit/NSGraphicsContext.h>
#include <AppKit/NSWindow.h>
+#include <memory>
namespace cru::platform::gui::osx {
namespace details {
@@ -112,6 +114,16 @@ void OsxWindow::SetWindowRect(const Rect& rect) {
}
}
+std::unique_ptr<graphics::IPainter> OsxWindow::BeginPaint() {
+ NSGraphicsContext* ns_graphics_context =
+ [NSGraphicsContext graphicsContextWithWindow:p_->window_];
+
+ CGContextRef cg_context = [ns_graphics_context CGContext];
+
+ return std::make_unique<cru::platform::graphics::osx::quartz::QuartzCGContextPainter>(
+ GetUiApplication()->GetGraphicsFactory(), cg_context, true, GetClientSize());
+}
+
void OsxWindow::CreateWindow() {
NSRect content_rect{p_->content_rect_.left, p_->content_rect_.top, p_->content_rect_.width,
p_->content_rect_.height};