aboutsummaryrefslogtreecommitdiff
path: root/include/cru/ui/render
diff options
context:
space:
mode:
authorYuqian Yang <crupest@crupest.life>2025-12-11 23:51:58 +0800
committerYuqian Yang <crupest@crupest.life>2025-12-11 23:51:58 +0800
commitc0c0106cf47fdff397756913b8646541f3bb9928 (patch)
tree945d0a3662ac92577c966f49578e46ba743ea84b /include/cru/ui/render
parente833e810aaa324d7de1630c2fb0528564b182742 (diff)
downloadcru-c0c0106cf47fdff397756913b8646541f3bb9928.tar.gz
cru-c0c0106cf47fdff397756913b8646541f3bb9928.tar.bz2
cru-c0c0106cf47fdff397756913b8646541f3bb9928.zip
Add paint invalid area.
Diffstat (limited to 'include/cru/ui/render')
-rw-r--r--include/cru/ui/render/BorderRenderObject.h2
-rw-r--r--include/cru/ui/render/CanvasRenderObject.h3
-rw-r--r--include/cru/ui/render/GeometryRenderObject.h2
-rw-r--r--include/cru/ui/render/LayoutRenderObject.h20
-rw-r--r--include/cru/ui/render/RenderObject.h42
-rw-r--r--include/cru/ui/render/ScrollRenderObject.h3
-rw-r--r--include/cru/ui/render/TextRenderObject.h3
-rw-r--r--include/cru/ui/render/TreeRenderObject.h3
8 files changed, 32 insertions, 46 deletions
diff --git a/include/cru/ui/render/BorderRenderObject.h b/include/cru/ui/render/BorderRenderObject.h
index 73fc85c1..c011cda0 100644
--- a/include/cru/ui/render/BorderRenderObject.h
+++ b/include/cru/ui/render/BorderRenderObject.h
@@ -43,7 +43,6 @@ class CRU_UI_API BorderRenderObject : public SingleChildRenderObject {
void ApplyBorderStyle(const style::ApplyBorderStyleInfo& style);
RenderObject* HitTest(const Point& point) override;
- void Draw(platform::graphics::IPainter* painter) override;
Thickness GetTotalSpaceThickness() override;
Thickness GetInnerSpaceThickness() override;
@@ -53,6 +52,7 @@ class CRU_UI_API BorderRenderObject : public SingleChildRenderObject {
protected:
Size OnMeasureContent(const MeasureRequirement& requirement) override;
void OnLayoutContent(const Rect& content_rect) override;
+ void OnDraw(RenderObjectDrawContext& context) override;
void OnResize(const Size& new_size) override;
diff --git a/include/cru/ui/render/CanvasRenderObject.h b/include/cru/ui/render/CanvasRenderObject.h
index 2e44fcc2..b2da3207 100644
--- a/include/cru/ui/render/CanvasRenderObject.h
+++ b/include/cru/ui/render/CanvasRenderObject.h
@@ -33,12 +33,11 @@ class CRU_UI_API CanvasRenderObject : public RenderObject {
public:
RenderObject* HitTest(const Point& point) override;
- void Draw(platform::graphics::IPainter* painter) override;
-
CRU_DEFINE_EVENT(Paint, const CanvasPaintEventArgs&)
protected:
Size OnMeasureContent(const MeasureRequirement& requirement) override;
void OnLayoutContent(const Rect& content_rect) override;
+ void OnDraw(RenderObjectDrawContext& context) override;
};
} // namespace cru::ui::render
diff --git a/include/cru/ui/render/GeometryRenderObject.h b/include/cru/ui/render/GeometryRenderObject.h
index 1994daf3..455af6b8 100644
--- a/include/cru/ui/render/GeometryRenderObject.h
+++ b/include/cru/ui/render/GeometryRenderObject.h
@@ -15,7 +15,6 @@ class GeometryRenderObject : public RenderObject {
GeometryRenderObject();
public:
- void Draw(platform::graphics::IPainter* painter) override;
RenderObject* HitTest(const Point& point) override;
std::shared_ptr<platform::graphics::IGeometry> GetGeometry();
@@ -37,6 +36,7 @@ class GeometryRenderObject : public RenderObject {
protected:
Size OnMeasureContent(const MeasureRequirement& requirement) override;
void OnLayoutContent(const Rect& content_rect) override;
+ void OnDraw(RenderObjectDrawContext& context) override;
private:
std::shared_ptr<platform::graphics::IGeometry> geometry_ = nullptr;
diff --git a/include/cru/ui/render/LayoutRenderObject.h b/include/cru/ui/render/LayoutRenderObject.h
index 5cb70680..99dd8057 100644
--- a/include/cru/ui/render/LayoutRenderObject.h
+++ b/include/cru/ui/render/LayoutRenderObject.h
@@ -1,8 +1,6 @@
#pragma once
#include "RenderObject.h"
-#include "cru/platform/graphics/Painter.h"
-
namespace cru::ui::render {
template <typename TChildLayoutData>
class LayoutRenderObject : public RenderObject {
@@ -81,16 +79,6 @@ class LayoutRenderObject : public RenderObject {
InvalidateLayout();
}
- void Draw(platform::graphics::IPainter* painter) override {
- for (const auto& child : children_) {
- painter->PushState();
- painter->ConcatTransform(
- Matrix::Translation(child.render_object->GetOffset()));
- child.render_object->Draw(painter);
- painter->PopState();
- }
- }
-
RenderObject* HitTest(const Point& point) override {
const auto child_count = GetChildCount();
for (auto i = child_count - 1; i >= 0; --i) {
@@ -104,6 +92,14 @@ class LayoutRenderObject : public RenderObject {
return GetPaddingRect().IsPointInside(point) ? this : nullptr;
}
+ protected:
+ void OnDraw(RenderObjectDrawContext& context) override {
+ auto painter = context.painter;
+ for (const auto& child : children_) {
+ context.DrawChild(child.render_object);
+ }
+ }
+
private:
std::vector<ChildData> children_;
};
diff --git a/include/cru/ui/render/RenderObject.h b/include/cru/ui/render/RenderObject.h
index e696aefe..85cb7990 100644
--- a/include/cru/ui/render/RenderObject.h
+++ b/include/cru/ui/render/RenderObject.h
@@ -1,33 +1,24 @@
#pragma once
#include "../Base.h"
-
#include "MeasureRequirement.h"
#include <cru/base/Event.h>
#include <cru/platform/graphics/Painter.h>
+
#include <string>
namespace cru::ui::render {
-struct BoxConstraint {
- static const BoxConstraint kNotLimit;
-
- Size max;
- Size min;
+class RenderObject;
- constexpr bool Validate() const {
- return max.width >= min.width && max.height >= min.height &&
- min.width >= 0 && min.height >= 0;
- }
-
- constexpr bool Satisfy(const Size& size) const {
- return size.width <= max.width && size.height <= max.height &&
- size.width >= min.width && size.height >= min.height;
- }
+struct CRU_UI_API RenderObjectDrawContext {
+ /**
+ * Coordinates are related to the render object to be painted. So parent
+ * render object should adjust this before passing to children.
+ */
+ Rect paint_invalid_area;
+ platform::graphics::IPainter* painter;
- constexpr Size Coerce(const Size& size) const {
- return Size{std::min(std::max(size.width, min.width), max.width),
- std::min(std::max(size.height, min.height), max.height)};
- }
+ void DrawChild(RenderObject* render_object);
};
/**
@@ -37,11 +28,11 @@ struct BoxConstraint {
* To write a custom RenderObject, override following methods:
*
* public:
- * void Draw(platform::graphics::IPainter* painter) override;
* RenderObject* HitTest(const Point& point) override;
* protected:
* Size OnMeasureContent(const MeasureRequirement& requirement) override;
* void OnLayoutContent(const Rect& content_rect) override;
+ * void OnDraw(RenderObjectDrawContext& context) override;
*/
class CRU_UI_API RenderObject : public Object {
private:
@@ -124,10 +115,12 @@ class CRU_UI_API RenderObject : public Object {
virtual Rect GetPaddingRect();
virtual Rect GetContentRect();
- virtual void Draw(platform::graphics::IPainter* painter) = 0;
+ virtual Rect GetRenderRect();
- // Param point must be relative the lefttop of render object including margin.
- // Add offset before pass point to children.
+ void Draw(RenderObjectDrawContext& context);
+
+ // Param point must be relative the lefttop of render object including
+ // margin. Add offset before pass point to children.
virtual RenderObject* HitTest(const Point& point) = 0;
public:
@@ -160,13 +153,14 @@ class CRU_UI_API RenderObject : public Object {
// Override this function to measure content and children(Call Measure on
// them). Do not consider margin or padding in this method because they are
// already considered in OnMeasureCore. Returned size must obey requirement.
- // Caller should guarantee preferred_size is corerced into required range.
virtual Size OnMeasureContent(const MeasureRequirement& requirement) = 0;
// Layout all content and children(Call Layout on them).
// Lefttop of content_rect should be added when calculated children's offset.
virtual void OnLayoutContent(const Rect& content_rect) = 0;
+ virtual void OnDraw(RenderObjectDrawContext& context) = 0;
+
virtual void OnAttachedControlChanged(controls::Control* old_control,
controls::Control* new_control) {}
diff --git a/include/cru/ui/render/ScrollRenderObject.h b/include/cru/ui/render/ScrollRenderObject.h
index ae11f361..ed67331d 100644
--- a/include/cru/ui/render/ScrollRenderObject.h
+++ b/include/cru/ui/render/ScrollRenderObject.h
@@ -62,8 +62,6 @@ class CRU_UI_API ScrollRenderObject : public SingleChildRenderObject {
bool VerticalCanScrollUp();
bool VerticalCanScrollDown();
- void Draw(platform::graphics::IPainter* painter) override;
-
protected:
// Logic:
// If available size is bigger than child's preferred size, then child's
@@ -71,6 +69,7 @@ class CRU_UI_API ScrollRenderObject : public SingleChildRenderObject {
// If not, all available size is taken while forming a scroll area.
Size OnMeasureContent(const MeasureRequirement& requirement) override;
void OnLayoutContent(const Rect& content_rect) override;
+ void OnDraw(RenderObjectDrawContext& context) override;
void OnAttachedControlChanged(controls::Control* old_control,
controls::Control* new_control) override;
diff --git a/include/cru/ui/render/TextRenderObject.h b/include/cru/ui/render/TextRenderObject.h
index 0d17853b..eefb3264 100644
--- a/include/cru/ui/render/TextRenderObject.h
+++ b/include/cru/ui/render/TextRenderObject.h
@@ -88,12 +88,11 @@ class CRU_UI_API TextRenderObject : public RenderObject {
RenderObject* HitTest(const Point& point) override;
- void Draw(platform::graphics::IPainter* painter) override;
-
protected:
// See remarks of this class.
Size OnMeasureContent(const MeasureRequirement& requirement) override;
void OnLayoutContent(const Rect& content_rect) override;
+ void OnDraw(RenderObjectDrawContext& context) override;
private:
std::shared_ptr<platform::graphics::IBrush> brush_;
diff --git a/include/cru/ui/render/TreeRenderObject.h b/include/cru/ui/render/TreeRenderObject.h
index 599e0f65..425eee23 100644
--- a/include/cru/ui/render/TreeRenderObject.h
+++ b/include/cru/ui/render/TreeRenderObject.h
@@ -62,11 +62,10 @@ class CRU_UI_API TreeRenderObject : public RenderObject {
RenderObject* HitTest(const Point& point) override;
- void Draw(platform::graphics::IPainter* painter) override;
-
protected:
Size OnMeasureContent(const MeasureRequirement& requirement) override;
void OnLayoutContent(const Rect& content_rect) override;
+ void OnDraw(RenderObjectDrawContext& context) override;
private:
float tab_width_ = 12.f;